Check that whiteboxes are synthesisable
authorEddie Hung <eddie@fpgeh.com>
Fri, 14 Jun 2019 20:08:38 +0000 (13:08 -0700)
committerEddie Hung <eddie@fpgeh.com>
Fri, 14 Jun 2019 20:08:38 +0000 (13:08 -0700)
backends/aiger/xaiger.cc

index 3f7edc627702ce5dbab22b71c4d13cb613e9f030..bc722e4920cd11e47129d5be5d75ee2f2aa75f01 100644 (file)
@@ -722,7 +722,7 @@ struct XAigerWriter
                        write_h_buffer(box_list.size());
 
                        RTLIL::Module *holes_module = nullptr;
-                       holes_module = module->design->addModule("\\__holes__");
+                       holes_module = module->design->addModule("$__holes__");
                        log_assert(holes_module);
 
                        int port_id = 1;
@@ -822,17 +822,21 @@ struct XAigerWriter
 
                                Pass::call(holes_module->design, "flatten -wb");
 
-                               // TODO: Should techmap all lib_whitebox-es once
+                               // TODO: Should techmap/AIG all lib_whitebox-es once
                                Pass::call(holes_module->design, "techmap");
                                Pass::call(holes_module->design, "aigmap");
-                               Pass::call(holes_module->design, "clean -purge");
+                               for (auto cell : holes_module->cells())
+                                       if (!cell->type.in("$_NOT_", "$_AND_"))
+                                               log_error("Whitebox contents cannot be represented as AIG. Please verify whiteboxes are synthesisable.\n");
 
-                               holes_module->design->selection_stack.pop_back();
+                               Pass::call(holes_module->design, "clean -purge");
 
                                std::stringstream a_buffer;
                                XAigerWriter writer(holes_module, false /*zinit_mode*/, true /* holes_mode */);
                                writer.write_aiger(a_buffer, false /*ascii_mode*/);
 
+                               holes_module->design->selection_stack.pop_back();
+
                                f << "a";
                                std::string buffer_str = a_buffer.str();
                                int32_t buffer_size_be = to_big_endian(buffer_str.size());