From f6140055d653944bb5fa36da95524672578b54a9 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 24 Apr 2020 23:21:27 +0200 Subject: [PATCH] Modified reader scheme for FOREIGNCELL --- src/laybasic/laybasic/layLayerProperties.cc | 13 +++-- .../lefdef/db_plugin/dbDEFImporter.cc | 6 +-- .../lefdef/db_plugin/dbLEFImporter.cc | 47 ++++++++++++------ .../lefdef/db_plugin/dbLEFImporter.h | 4 +- .../lefdef/unit_tests/dbLEFDEFImportTests.cc | 9 ++-- testdata/lefdef/foreigncell/au.oas.gz | Bin 859 -> 811 bytes .../foreigncell/au_lefpins_mapped.oas.gz | Bin 859 -> 0 bytes .../lefdef/foreigncell/au_no_lefpins.oas.gz | Bin 796 -> 0 bytes testdata/lefdef/foreigncell/foreign.gds | Bin 3484 -> 3722 bytes testdata/lefdef/foreigncell/in.def | 17 +++++++ .../lefdef/lefpins/au_lefpins_mapped.oas.gz | Bin 0 -> 335 bytes testdata/lefdef/lefpins/au_no_lefpins.oas.gz | Bin 0 -> 269 bytes testdata/lefdef/lefpins/in.def | 15 ++++++ testdata/lefdef/lefpins/in.lef | 15 ++++++ testdata/lefdef/lefpins/in_tech.lef | 36 ++++++++++++++ 15 files changed, 135 insertions(+), 27 deletions(-) delete mode 100644 testdata/lefdef/foreigncell/au_lefpins_mapped.oas.gz delete mode 100644 testdata/lefdef/foreigncell/au_no_lefpins.oas.gz create mode 100644 testdata/lefdef/foreigncell/in.def create mode 100644 testdata/lefdef/lefpins/au_lefpins_mapped.oas.gz create mode 100644 testdata/lefdef/lefpins/au_no_lefpins.oas.gz create mode 100644 testdata/lefdef/lefpins/in.def create mode 100644 testdata/lefdef/lefpins/in.lef create mode 100644 testdata/lefdef/lefpins/in_tech.lef diff --git a/src/laybasic/laybasic/layLayerProperties.cc b/src/laybasic/laybasic/layLayerProperties.cc index 53a4e88be..e150fa401 100644 --- a/src/laybasic/laybasic/layLayerProperties.cc +++ b/src/laybasic/laybasic/layLayerProperties.cc @@ -1839,10 +1839,15 @@ LayerPropertiesList::load (tl::XMLSource &stream, std::vector > std::string inst_name = get (); std::string model = get (); - db::Cell *cell = m_lef_importer.macro_by_name (model); + std::pair ct = m_lef_importer.macro_by_name (model); while (test ("+")) { @@ -1158,8 +1158,8 @@ DEFImporter::read_components (std::list > db::FTrans ft = get_orient (false /*mandatory*/); db::Vector d = pt - m_lef_importer.macro_bbox_by_name (model).transformed (ft).lower_left (); - if (cell) { - db::CellInstArray inst (db::CellInst (cell->cell_index ()), db::Trans (ft.rot (), d)); + 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)); } else { warn (tl::to_string (tr ("Macro not found in LEF file: ")) + model); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc index 090fdfae8..1f8d4b942 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.cc @@ -105,14 +105,14 @@ LEFImporter::layer_width (const std::string &layer, const std::string &nondefaul } } -db::Cell * +std::pair LEFImporter::macro_by_name (const std::string &name) const { - std::map::const_iterator m = m_macros_by_name.find (name); + std::map >::const_iterator m = m_macros_by_name.find (name); if (m != m_macros_by_name.end ()) { return m->second; } else { - return 0; + return std::make_pair ((db::Cell *) 0, db::Trans ()); } } @@ -726,9 +726,9 @@ LEFImporter::read_macro (Layout &layout) std::string mn = get (); set_cellname (mn); - db::Cell &cell = layout.cell (layout.add_cell (mn.c_str ())); - - m_macros_by_name.insert (std::make_pair (mn, &cell)); + db::Cell &cell = layout.cell (layout.add_cell ()); + db::Cell *foreign_cell = 0; + db::Trans foreign_trans; db::Point origin; db::Vector size; @@ -811,13 +811,12 @@ LEFImporter::read_macro (Layout &layout) } else if (test ("FOREIGN")) { - std::string cn = get (); - - if (cn == mn) { - // rename out macro placeholder cell so we don't create a recursive hierarchy - layout.rename_cell (cell.cell_index (), ("LEF_" + mn).c_str ()); + if (foreign_cell) { + error ("Duplicate FOREIGN definition"); } + std::string cn = get (); + db::cell_index_type ci; std::pair c = layout.cell_by_name (cn.c_str ()); if (c.first) { @@ -836,7 +835,8 @@ LEFImporter::read_macro (Layout &layout) expect (";"); - cell.insert (db::CellInstArray (db::CellInst (ci), (db::Trans (origin - db::Point ()) * db::Trans (ft)).inverted ())); + foreign_cell = &layout.cell (ci); + foreign_trans = (db::Trans (origin - db::Point ()) * db::Trans (ft)).inverted (); } else if (test ("OBS")) { @@ -851,9 +851,26 @@ LEFImporter::read_macro (Layout &layout) } - std::pair dl = open_layer (layout, std::string (), Outline); - if (dl.first) { - cell.shapes (dl.second).insert (db::Box (-origin, -origin + size)); + if (! foreign_cell) { + + // actually implement the real cell + + layout.rename_cell (cell.cell_index (), mn.c_str ()); + + std::pair dl = open_layer (layout, std::string (), Outline); + if (dl.first) { + cell.shapes (dl.second).insert (db::Box (-origin, -origin + size)); + } + + m_macros_by_name.insert (std::make_pair (mn, std::make_pair (&cell, db::Trans ()))); + + } else { + + // use FOREIGN cell instead of new one + + layout.delete_cell (cell.cell_index ()); + m_macros_by_name.insert (std::make_pair (mn, std::make_pair (foreign_cell, foreign_trans))); + } m_macro_bboxes_by_name.insert (std::make_pair (mn, db::Box (-origin, -origin + size))); diff --git a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h index f52133996..859ceef54 100644 --- a/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h +++ b/src/plugins/streamers/lefdef/db_plugin/dbLEFImporter.h @@ -63,7 +63,7 @@ public: * Returns 0 if the name is not a valid macro name. Otherwise it returns the pointer * to the corresponding db::Cell object. */ - db::Cell *macro_by_name (const std::string ¯o_name) const; + std::pair macro_by_name (const std::string ¯o_name) const; /** * @brief Get the cell bbox for the given macro name @@ -125,7 +125,7 @@ private: std::map > m_default_widths; std::map m_default_ext; std::map > m_min_widths; - std::map m_macros_by_name; + std::map > m_macros_by_name; std::map m_macro_bboxes_by_name; std::map m_vias; std::set m_routing_layers, m_cut_layers; diff --git a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc index cdd6bf28c..30090da2b 100644 --- a/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc +++ b/src/plugins/streamers/lefdef/unit_tests/dbLEFDEFImportTests.cc @@ -334,15 +334,18 @@ TEST(108_scanchain) TEST(109_foreigncell) { - run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef", "au.oas.gz", default_options (), false); + run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef+def:in.def", "au.oas.gz", default_options (), false); +} +TEST(110_lefpins) +{ db::LEFDEFReaderOptions options = default_options (); options.set_produce_lef_pins (false); - run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef", "au_no_lefpins.oas.gz", options, false); + run_test (_this, "lefpins", "lef:in_tech.lef+lef:in.lef+def:in.def", "au_no_lefpins.oas.gz", options, false); options.set_produce_lef_pins (true); options.set_lef_pins_datatype (10); options.set_lef_pins_suffix (".LEFPIN"); - run_test (_this, "foreigncell", "gds:foreign.gds+lef:in_tech.lef+lef:in.lef", "au_lefpins_mapped.oas.gz", options, false); + run_test (_this, "lefpins", "lef:in_tech.lef+lef:in.lef+def:in.def", "au_lefpins_mapped.oas.gz", options, false); } diff --git a/testdata/lefdef/foreigncell/au.oas.gz b/testdata/lefdef/foreigncell/au.oas.gz index a46321b03e36bc56c9ec2e5bd21b35ef0920623e..fec13c35bc49f6cff4b3e934555e6673cff62a79 100644 GIT binary patch literal 811 zcmV+`1JwK zIqQt4$Af0IEDyWJQuy;yGClH5p=h&qtP%OFYg88NOMX3A2-!t*Y0mHEBeL!qwcwYq zkxbt{h*!T#T^gH}Ro7Su=9B63=gm<|9&(Lp{Xy7hGHoTOHA7i(jUTE(^PoVEx<mXMx+BSJ5HZUK?{&yhj{Xkl{fQ3&ZTSt2K%PF6_HbPJfroH{@XVL}rN zJ?;o8C}&}jG5x3rIcwB)@(d&O7*-^Pvzc)_%Q8?;WQxeXf~=Fb@dajdJkcPr4^fIK zp*$6+NF^%M2vw*`HA-oe4$+uC_9Z523%1ZB-fM%`f*rI5+u|15fE__M$(i4vCA@++ zcoUxEb$E?#{ekZM%74FwreCwl=eP||fYqsQr8Rho-Br8>d(t|r;uqN45O#Up1nCLP z>E9*|J;|}k_*-e2--O5fHd?{cEx6T%ZPbRTP1uKZXu+Ro9rkdSnL=bBOu8M^BjS-c zC2r_S82JY?Fa2Y88%$jM*xcXno_Vd{J=WkmqH+CI46{|7`PWq-qOamtOvU6qtEpZ; zN5i+_8NRat%lv<9GdR|Tj`$R7DAwhENAIyF$9ARNXkvtuAc|u9cm;RF#5tC5u`X(} pih~5=UJ97c%BK*UC8N1@n@7#X9F)6qtw-*)0!e4r_>Lft>4PZFk5_rQ|@$Jnv3<`O0)W z5|X(c)ZaldzU%u`ax^>axICqW64u_>yCqnO^a@ ztrw@uGj7?ND$qi8X597jUQx64N$+-{5>5QL6VD9ve;vOn%C>w}&L0 zjuD~SSf6cWD8}+WED02+l7nW7W*{HPB%XeJ%F3AJG!@#PC=h9(E)}VuVwI?j z%Bq~otAZ-30aa3ERZ&$feu^;NE3m{pgEwRq9+PEQ!()HqpYF0h|A9x=aE)?xxDT4a z$eTh97K#0c)L=_khDYQHah`I2ahd_beHhn%i0WDt(N1Xv*7zE-Yf~S%R@9tm8UdUWFDc!xC)ZW!NGO+6vrkG(4_F?=ji{1Um9j`xPUh zvq1&5-E~oS!B4uwM{)O-)doK0u7M@ggrIN#IkSP^K@Fb5M|e+nr3T?|{DPTh|F>Zi zB-Fq`%CMB`7~IKxDiT!AgOlG`|V<3I>mWYJ`iMHWFA6M|8_=%RF4OfbQOt_$6S z5R8^0q#}z_`o@+OE5zV^-{#(P?!D*T^WG&^Rx>OvwK zR=C}4xSPfKz6hrJC?6E2uIkswSEiBMXo z7R$4hcsCm+(zu=SYTy6hSBs?c;+;rq?|!DkC0Lk}nT+Y=2uqOC&18nkn1lSNiL#i94^c(O&Qd5Ty-*ecm>RXx6oJx%WS)M1+Rj?!B$Yb|REV}wpN2HhutqdS zV>M3WH9-?KNs~22Q#DObd`g&sby($|zzebg56Bv9;;E-mK*Z?PZm>uB_tV08qR3`ElixgFj+~guRd6k4)=x6+fs5sn$ zCV!8peE2O>XaAu4{09BumVi)XnU_AUWi7h`r53mQSJ;@`50w la=nA3f&V5)9A$e(+w{+x{Lx17%K!Nw^dGl~vHvIr0059ru(ALE diff --git a/testdata/lefdef/foreigncell/au_no_lefpins.oas.gz b/testdata/lefdef/foreigncell/au_no_lefpins.oas.gz deleted file mode 100644 index f0e21a2099c706a17290cee957a3e57c28b1237f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 796 zcmV+%1LOQ3iwFowH=JGo19WY0E^lFT0OgTQXcIvc$LG!LXEwV{G>ag)Rp~}iH%%20 zbEvwl!8BQ$txf$})-k**DI(%o@FGP@j-k}x zNt|tyXvKne=knhC{%_vQ|INXa(HA?C>`ui}vIj``sE(>U`h5k}{VBVzJ8h?8y$R!- z9ZOh7uhDN0#?D#i1tus5x8;Gv-wJ}NCuLhn(>`m&<6ckP=&{F~OmRFC^n1Cjth1Gc z`L+x3?xEy>WuHybCTU9)yGPN6dr?gcdwwYR{bj!))3nMKsx&zP#*<8-f+}rM`pJNZ(Z5ZG ziw&Y57d_iPD9~x{jw-rke{ajPHE1NPp=84NySL73gmX_Eh!Dn&M97U7v-y!ixRrGh z&!t$mUAle8DP~Dy;*ChPUq91e5sB&3%_Lz7^0qRGp*?iMxvZH_iM0ek%oPOsoHWfgb?s?K=VgfcuQ<}4}0x-bv3;1TBs~Y0Yp{wdaA_IpFb{L^9?!!%snSy5 zCPRT?HS~~CyTH?GA2L5N5<2aZQNvvub?4jF9sU=0Us<(lH+NMmp&IyH`!AXIcmv9? z06*Y6eJeExAMh(?iv8n-HIPsh`zURA(3(AD_mVniF2XXH?qJr1O;~~oOv+5)GmE^k z9GK<;)4WXlHS_{+5*hnzQ01QxnfHHZ%Irt_p4YI)UlR}tWDcV#@`cFUPKi|TH_{T> a9b%o%y~;O5JoP^>gnk0f#ioIg1poj>IfOO< diff --git a/testdata/lefdef/foreigncell/foreign.gds b/testdata/lefdef/foreigncell/foreign.gds index d8558194ee5591e8bad6602b2b1263b2351e5532..dce50b5e8bc9622937007a8af423587446394e30 100644 GIT binary patch literal 3722 zcmeH~yH8V59LIn6-g2oG@I`!uxX=Vt6sQWmYNA*Skx*k8h_9wXi#4?x+W1)Aj1JDS zbTBa*<01otad6PZ$-%$CI6FAG;P-pZ`RNrAqb8!plN>(h{@&-Ddw--7itmp}o98#a zk(jKPbm5?8s%Bg*K0J1&zkXbPP5x+mPIt`(`Phst0`A6<;P2v zN#kYnG+NF0*P2jPvVyavd^KXYXNHc9q&iGa z;i=+Q(}(ia(zr-$6((*bVQ(hc`~Pl!;%;{Q+THXnayN~#=(iRR?H3h` zOv;u0Sm!XQKk7(d%E=X&l(RP4k@Tlr<7iw`^;jBz_s-9&f5y~*l|~pObJZOmfUM_w zggmEdOtOx-&5?CdPJ8tu)sE*`$J~HPIqN1l>gKOy0_$6tv}ax=mZrXi_fauf)>CT`d0`jW9^~d9etYmvSZQ^VZ;53Axu|^@jAP zUWujgUpW60?%(U95!i)4^dlLUa^@LzJmcgfz6~Q+;vT)M)9-VnKjkFu&7++0X-6_H z=Se#ymL|S?PrlPf6Sj}y|KFFLH2BS(G?2f$lLqo{bkabUwv%f9 zrRt=C{9BzgkUyi7Y8}x|%8oVbIv2@~$PP!|2iZ|+ucVxI?2ykQ)Xt}b>IXVtQy3O6 sP8CX%mDK#-YIAdQ=Mn6K{k8C&PWm|xdMQeo_shb2k7&C;MT*7bBdwc(4gdfE literal 3484 zcmeH~J#17*5Xa}eJ3n6>V+^qni7Xe`lFgSf$A_ILMtq$mgLRJ3A)JJ8I_x`q=s1wi z0wSeK5rk-{D4=nHgoF?cE~wlfkrdR>P*6k^sVGuWVE+Hv9rD1B7?2PRYmI)pGqW@M z_G4^IBw;uqok7_Ax1{AOX~oZ~cwaJMG&Z_dq$Aa|YtO~OgZFPd`*#1`Epyj?DoAJ3 z+vlx`qMn|fedGB;ZlX{e&5w*@DCriFmemn;J=>(UJtfwnjiIzj+otG;eYvr*VR{I4 zD^%B4IbEM!KioZ_x>i{OzrJ#%QkpG#^9W=u zJ!Z@2v2(qJBe{Ix$MJm5TZQ|IlO5h$YE&mh(yJgios2u3&u8-iXS3}+&PH#rKbw*9 z!-opFT)tOxCZ0^Q{O@aPiR?|KGdTSfp=^+-EtF8k^o@1+XGVVS`^FKBvk)WoT@WL> z;^ylec_aRB8sB1(j1!lY7$1a?haq1>ihev5Bj?m1Ms(GWTD;G&{O}eM#$g`*S7Tu0e*S~85$`20$?NqjB}esrA=ayg_34{1Vtw3uz2_v>r*GMa^{L&6p>Ip~ zB_(>lxCh$evDv4dGUdtoMLmgorFtXok=8TXSr2VK^^9S4l51vtBpH`_l5s39X?Aq| z`jXbK=c@ILeyoR_XLXTvj=4$Zxd5U4n&%uyJxRZtG16}i!p8YYbtonCiS_U?yczE) zg!`}%BhTp(gruL*xr03vo0i0@Fl5#OovjTSfgoLv5CX2(2|d0EGd%*#4x zWZpk8HZm{mM&`9TNTO-nvOT_DOga7~l diff --git a/testdata/lefdef/foreigncell/in.def b/testdata/lefdef/foreigncell/in.def new file mode 100644 index 000000000..04045ef5f --- /dev/null +++ b/testdata/lefdef/foreigncell/in.def @@ -0,0 +1,17 @@ + +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN foreigncells ; +UNITS DISTANCE MICRONS 1000 ; + +DIEAREA ( 0 0 ) ( 1000 2000 ) ; + +COMPONENTS 3 ; + - macro1 macro1 + PLACED ( 0 0 ) N ; + - macro2 macro2 + PLACED ( 0 500 ) N ; + - macro3 macro3 + PLACED ( 0 1000 ) N ; +END COMPONENTS + +END DESIGN + diff --git a/testdata/lefdef/lefpins/au_lefpins_mapped.oas.gz b/testdata/lefdef/lefpins/au_lefpins_mapped.oas.gz new file mode 100644 index 0000000000000000000000000000000000000000..80c578b58c1ab2d050ebe49837ecad8425204e8f GIT binary patch literal 335 zcmV-V0kHlbiwFq7R-;}319WY0E^lFT08Z@2gEzO`uOnh zq~#Z-W~S#Qr{?4ov-1VVySoI(2L$;CxCVtpar|lmL?XZGQ-4B zbh0u=akKau1o$(vGBfbNS==l@jRwqYATbz=o5|OZnH?wsrMWqM4fT9n-2y!QfLtyf zR4z9Mi0kO&>I394@}Tgz+5JO9d_4VJnK^*QA#->cL~gS(@bL1AG_r{_vhy+u{$N!p hj5-4cBR_*kG6ygYF7PuojAX#T004gq;E|gG001U{oqqrT literal 0 HcmV?d00001 diff --git a/testdata/lefdef/lefpins/au_no_lefpins.oas.gz b/testdata/lefdef/lefpins/au_no_lefpins.oas.gz new file mode 100644 index 0000000000000000000000000000000000000000..099aeed882a461a3d5e5ce06c40c89cda1901a4f GIT binary patch literal 269 zcmV+o0rLJIiwFoaSEF7419WY0E^lFT08Z@2gEzO`uOnh zq~#Z-W~S#Qr{?4ov-1VVySoI(2L$;CxCVtpar|lmL?XZGQ-4B zbaJ!!8U*+=vobUAz**cZKwSpRY#=chi<`;UkeMAQ0;Rdx{X;{1JpEjmIe>!599{;I z+pG*cyu2cfY$A>9yo`cB7#6UeW8!Am!6+n>%)!vW{D7I4N$>!pj5-4cBR>O3>;?M; Tex`X*yvPFKbKmq^&5KMfG literal 0 HcmV?d00001 diff --git a/testdata/lefdef/lefpins/in.def b/testdata/lefdef/lefpins/in.def new file mode 100644 index 000000000..58d6e328b --- /dev/null +++ b/testdata/lefdef/lefpins/in.def @@ -0,0 +1,15 @@ + +VERSION 5.8 ; +DIVIDERCHAR "/" ; +BUSBITCHARS "[]" ; +DESIGN foreigncells ; +UNITS DISTANCE MICRONS 1000 ; + +DIEAREA ( 0 0 ) ( 1000 2000 ) ; + +COMPONENTS 3 ; + - macro1 macro1 + PLACED ( 0 0 ) N ; +END COMPONENTS + +END DESIGN + diff --git a/testdata/lefdef/lefpins/in.lef b/testdata/lefdef/lefpins/in.lef new file mode 100644 index 000000000..e2751e688 --- /dev/null +++ b/testdata/lefdef/lefpins/in.lef @@ -0,0 +1,15 @@ +MACRO macro1 + CLASS CORE ; + ORIGIN 0.000 0.000 ; + SIZE 0.384 BY 0.480 ; + PIN Z + PORT + LAYER M1 ; + RECT 0.306 0.357 0.318 0.403 ; + RECT 0.318 0.115 0.352 0.403 ; + VIA 0.336 0.167 square ; + VIA 0.336 0.351 square ; + END + END Z +END macro1 + diff --git a/testdata/lefdef/lefpins/in_tech.lef b/testdata/lefdef/lefpins/in_tech.lef new file mode 100644 index 000000000..eb0e75b0b --- /dev/null +++ b/testdata/lefdef/lefpins/in_tech.lef @@ -0,0 +1,36 @@ +LAYER OD + TYPE IMPLANT ; +END OD +LAYER VTS_N + TYPE IMPLANT ; +END VTS_N +LAYER VTS_P + TYPE IMPLANT ; +END VTS_P +LAYER M0OD + TYPE IMPLANT ; +END M0OD +LAYER M0PO + TYPE MASTERSLICE ; +END M0PO +LAYER VIA0 + TYPE CUT ; +END VIA0 +LAYER M1 + TYPE MASTERSLICE ; +END M1 +LAYER VIA1 + TYPE CUT ; +END VIA1 +LAYER M2 + TYPE MASTERSLICE ; +END M2 + +VIA square + LAYER M0PO ; + RECT -0.006 -0.006 0.006 0.006 ; + LAYER VIA0 ; + RECT -0.006 -0.006 0.006 0.006 ; + LAYER M1 ; + RECT -0.006 -0.006 0.006 0.006 ; +END square