diff --git a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc index b07a347b0..ed3856e6e 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbDEFImporter.cc @@ -1594,6 +1594,7 @@ DEFImporter::read_styles (double scale) } } + void DEFImporter::read_components (db::Layout &layout, std::list > &instances, double scale) { @@ -1607,9 +1608,26 @@ DEFImporter::read_components (db::Layout &layout, std::list::const_iterator m = reader_state ()->lef_importer ().macros ().find (model); - if (m == reader_state ()->lef_importer ().macros ().end ()) { - error (tl::to_string (tr ("Macro not found in LEF file: ")) + model); + const MacroDesc *m = 0; + + std::map::const_iterator im = reader_state ()->lef_importer ().macros ().find (model); + if (im == reader_state ()->lef_importer ().macros ().end ()) { + + warn (tl::sprintf (tl::to_string (tr ("Macro not found in LEF file: %s - creating dummy macro")), model)); + + // create a dummy macro definition (no FOREIGN, size 0x0 etc.) + GeometryBasedLayoutGenerator *mg = new GeometryBasedLayoutGenerator (); + reader_state ()->register_macro_cell (model, mg); + + MacroDesc macro_desc; + macro_desc.bbox = db::Box (db::Point (), db::Point ()); + + m = reader_state ()->lef_importer ().insert_macro (model, macro_desc); + + } else { + + m = &im->second; + } while (test ("+")) { @@ -1621,7 +1639,7 @@ DEFImporter::read_components (db::Layout &layout, std::listsecond.bbox.transformed (ft).lower_left (); + d = pt - m->bbox.transformed (ft).lower_left (); is_placed = true; } else if (test ("UNPLACED")) { @@ -1633,7 +1651,7 @@ DEFImporter::read_components (db::Layout &layout, std::listsecond.bbox.transformed (ft).lower_left (); + d = pt - m->bbox.transformed (ft).lower_left (); is_placed = true; } @@ -1654,7 +1672,7 @@ DEFImporter::read_components (db::Layout &layout, std::list ct = reader_state ()->macro_cell (model, layout, m_component_maskshift, string2masks (maskshift), m->second, &reader_state ()->lef_importer ()); + std::pair ct = reader_state ()->macro_cell (model, layout, m_component_maskshift, string2masks (maskshift), *m, &reader_state ()->lef_importer ()); if (ct.first) { db::CellInstArray inst (db::CellInst (ct.first->cell_index ()), db::Trans (ft.rot (), d) * ct.second); instances.push_back (std::make_pair (inst_name, inst)); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h index 94721a5fe..38c953194 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h @@ -122,7 +122,7 @@ public: } /** - * @brief Gets the + * @brief Gets the macros map * * The map maps the macro name to the macro description. */ @@ -131,6 +131,14 @@ public: return m_macros; } + /** + * @brief Inserts a macro description for a name + */ + const MacroDesc *insert_macro (const std::string &mn, const MacroDesc &m) + { + return &m_macros.insert (std::make_pair (mn, m)).first->second; + } + /** * @brief Finishes reading a LEF file * diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index f430e4829..8f27111a6 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -521,6 +521,9 @@ TEST(109_foreigncell) options.set_macro_resolution_mode (2); run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef+def:in.def", "au_always_foreign.oas.gz", options, false); + + // no macros -> warning + run_test (_this, "foreigncell", "gds:macros.gds+lef:in_tech.lef+def:in.def", "au_no_macros.oas.gz", options, false); } TEST(110_lefpins) diff --git a/testdata/lefdef/foreigncell/au_no_macros.oas.gz b/testdata/lefdef/foreigncell/au_no_macros.oas.gz new file mode 100644 index 000000000..98458d212 Binary files /dev/null and b/testdata/lefdef/foreigncell/au_no_macros.oas.gz differ diff --git a/testdata/lefdef/foreigncell/macros.gds b/testdata/lefdef/foreigncell/macros.gds new file mode 100644 index 000000000..6bf27d072 Binary files /dev/null and b/testdata/lefdef/foreigncell/macros.gds differ