From ad444c55525b671700543178768ff36b875caa0f Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 28 May 2025 18:58:28 +0200 Subject: [PATCH] Don't error out on missing MACRO in LEF, but create a dummy macro with size 0,0 instead and issue a warning. This will place nicely with N, but not with other orientations. --- .../lefdef/db_plugin/dbDEFImporter.cc | 30 ++++++++++++++---- .../lefdef/db_plugin/dbLEFImporter.h | 10 +++++- .../lefdef/unit_tests/dbLEFDEFImportTests.cc | 3 ++ .../lefdef/foreigncell/au_no_macros.oas.gz | Bin 0 -> 1242 bytes testdata/lefdef/foreigncell/macros.gds | Bin 0 -> 3718 bytes 5 files changed, 36 insertions(+), 7 deletions(-) create mode 100644 testdata/lefdef/foreigncell/au_no_macros.oas.gz create mode 100644 testdata/lefdef/foreigncell/macros.gds 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 0000000000000000000000000000000000000000..98458d212ca3c5a581a8d6692d4a5d5196e68acb GIT binary patch literal 1242 zcmY!lcJ=kt^>+;R4CduxWH!_@V0gjKC?n3q!6L)YEF;ds&!EIm7M^>?kgLIf$L*n^ z!iwD$Gn0~auPrkXEdBMqp4&D2`TLJ6LVe~4rOcb!YvuZ(D`;uK)^4_=&-^lYX4)p1 z@x>Ind~wRnEGcr^Il9=>}tN-`TE11|qHHhe}yW6K1d% zOx$sCo0XE2xtHj|3;}WG<|z`wyh~P^xX#^fzBN=Jc5boVyYr2+Jc9JT&njHX6Owf5 z(h=RO+FRKL&K>_ZL+a#%<_Bw+EPJ~>ith?%+B1)tSAH{@a6EHzc~j6WoBl)L`6QkN zkrQI0gq}aQTk_6XFN9O9^IT5ZgWVq{E;G#keIjMI#(9nS$-j;SCvRMEs^EuG#KrnN z|NnPOu6*CM*Y{qq?bkJeGM5jP$NW&Scr5;#$9MYb1iR=RC&Xs3B)(YReE;k1)%Tv2 zo^=jaVvrJgoc5ic_v6Pe#i`fQ(jGWIV_@KARAT64ddcW|Zm-wj0EuIT^S__Gg#Z%9HIMFPbo>AH- zXGQ%)x@j@YSQL}f~9!)LUvZrma`|Tx` z&m%5u%Y69g`MUH+GGG25Kc~+NOhGf4-Z8rNZv=W+r0wtdlfBoM%oCfv`zJ$h@ImpF zO0HgotKMI9oMSabK~_ek#akoj6Hm~Rj>-KBvQ5p-6E6ks*?8gH^WQ)A7w-xz{pixE z-@fRn2NUN~wd0qj>@rcABwSqQHqW!7%P{``g702`*SWT7+U-2hl3wwku5aO~kI!ar zOP@FK=j~*^?$cg7!p-%cJlXpBSd7*4+s3&pfd(9lr*Y;t$CqX0t_-#*RDUS4beqSI ziR+90JBPmEU@jKi?juva@5I52LHwbO)>{?Cr!Cxms44A**o_6Rs@1zEg%@NL&o@cz zwtPGL*_40(4T@yG@xtB9O@>c!8M#%wiNt)&^$33;aq9;SR}ZoQ1s{69v;BRGc|kbv42!uU{+dHTv3*vpP|PaQ=eADj^hjrOpMdm85tOr8S5DD NFflSTj4Z&w006azIpqKV literal 0 HcmV?d00001 diff --git a/testdata/lefdef/foreigncell/macros.gds b/testdata/lefdef/foreigncell/macros.gds new file mode 100644 index 0000000000000000000000000000000000000000..6bf27d07297c1d02d47d91344d8d79f537f21f8d GIT binary patch literal 3718 zcmeH~y-!n77{=dwZ@JVe6_uE1hzlfGMJe_Bqb7o2hy;x3K>TWIDT*o8&_-}|GdeiS z(!s=NjEfEo#=$`sCkOuo6E_DZ7kr*`&Z}3f5{(fxp5*X5_x(QS-20MBD84@??VjKK zR+^+;*2*sFj;gCB5gs_p~Khr9D9EE-M%C9J@vVhIcabDw%__N?Ck99A05dJ zjOFq}BZH%OlvqL}zBZ&xR<#DABi!msQj*=_@&19~;jGb9)*|a6+gvNn)>7H7!O;@~ zLq|t4T|(U|X{Bzea6Xmo=tytxHPV&RMrpZvxlo*}Sd|z}LN*#r;c96*l|5A^_wUT~ zWX@Rq3hOypxl)?0mQvY?Lb+Npo^ffX=ftH-Eng{2LDyBSjpzB?Wqq4X?ZyJdq>Wc- zGUoeDfZc`s9w8Gyda{v;Jo%4jc+x@ulMZPGded} zs2UHOLs%_tHQQIHP8LOCYcO#$341f0y+409y}$NucKp8^-c7T7_gjmH_KS+ealb9T zY>_bOi!Y}mUzq*U27wHw@*vi@cu{V~dK0FSYwDF)x?$d#Mfo0>e2mSZF-cC!ImaC< zAmwBSCgsXKSm!aRKjuhZ%E{H3l(RP4k@Tlr<7iw`^;jBz_s%b>|FNlmmPQyPbJZR1 zgRJLTggmD?OtOx-&5?CdPJ8tu)sE*`$J~HPIqN1l>gKOy0_&TYv}ax=mZrYO`zV`z zJf;x_$$h+ukaa!9RI;vDm`diMUdcM>uf)>C{a*eB8ex#|^I{P)FXc+q=dHuD5^^tT z^@jAPUWujgZ=C-L_wVhd5!j7C^dlLUa^}f7o^^5(--eMZagW}p(;sl8KjkFu&7++0 zX-6_HoJc~?ICjYHu|n=W^+Hcz8E?77~75$#CEc?jaW^1i3$w=R`Tr{gET>DJPkiag?;9ob}V6 zd<{}gG7sg<%Xpf<4bSxBdD2darHSv}lO_6S!uC=8|NF9&2EVzJ2J&}z(m?)=P8!Ja zc2dp1T%9zKf2)%Q@@I5Xts~k=*|Fwb=OWn=+2P20AUi7Um6X$t9r9U(+WC}F{a6Q_ rDio(LWfuQZTUc1Qh)^HwZ-u4%sEL9;iZT}cs_@<;*4|HXVlnv$B$a~F literal 0 HcmV?d00001