From 7d8825a9fbae5ab819218a2fe48153c566a61b3a Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 24 Apr 2021 21:30:03 +0200 Subject: [PATCH] Ghost cells are not renamed in blend mode 'rename' --- src/db/db/dbCommonReader.cc | 6 +- .../streamers/gds2/unit_tests/dbGDS2Reader.cc | 72 ++++++++++++++++++ testdata/gds/collect_basic_a.gds | Bin 0 -> 484 bytes testdata/gds/collect_basic_ag.gds | Bin 0 -> 176 bytes testdata/gds/collect_basic_b.gds | Bin 0 -> 564 bytes testdata/gds/collect_basic_bg.gds | Bin 0 -> 270 bytes testdata/gds/collect_rename_au2.gds | Bin 0 -> 646 bytes testdata/gds/collect_rename_au3.gds | Bin 0 -> 630 bytes testdata/gds/collect_rename_au4.gds | Bin 0 -> 352 bytes 9 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 testdata/gds/collect_basic_a.gds create mode 100644 testdata/gds/collect_basic_ag.gds create mode 100644 testdata/gds/collect_basic_b.gds create mode 100644 testdata/gds/collect_basic_bg.gds create mode 100644 testdata/gds/collect_rename_au2.gds create mode 100644 testdata/gds/collect_rename_au3.gds create mode 100644 testdata/gds/collect_rename_au4.gds diff --git a/src/db/db/dbCommonReader.cc b/src/db/db/dbCommonReader.cc index 172a56213..e74b7a105 100644 --- a/src/db/db/dbCommonReader.cc +++ b/src/db/db/dbCommonReader.cc @@ -239,6 +239,7 @@ CommonReader::merge_cell (db::Layout &layout, db::cell_index_type target_cell_in { const db::Cell &src_cell = layout.cell (src_cell_index); db::Cell &target_cell = layout.cell (target_cell_index); + target_cell.set_ghost_cell (src_cell.is_ghost_cell () && target_cell.is_ghost_cell ()); // copy over the instances for (db::Cell::const_iterator i = src_cell.begin (); ! i.at_end (); ++i) { @@ -347,7 +348,7 @@ CommonReader::finish (db::Layout &layout) // no conflict - plain rename - for (std::map >::const_iterator i = m_name_map.begin (); i != m_name_map.end () && ! has_conflict; ++i) { + for (std::map >::const_iterator i = m_name_map.begin (); i != m_name_map.end (); ++i) { layout.rename_cell (i->second.second, i->first.c_str ()); } @@ -379,7 +380,8 @@ CommonReader::finish (db::Layout &layout) db::cell_index_type ci_org = c2n.second; // NOTE: proxy cells are never resolved. "RenameCell" is a plain and simple case. - if (c2n.first && m_cc_resolution != RenameCell && ! layout.cell (ci_org).is_proxy ()) { + // Ghost cells are merged rendering the new cell a non-ghost cell. + if (c2n.first && (m_cc_resolution != RenameCell || layout.cell (ci_org).is_ghost_cell () || layout.cell (ci_new).is_ghost_cell ()) && ! layout.cell (ci_org).is_proxy ()) { cells_with_conflict.push_back (std::make_pair (ci_new, ci_org)); } else { layout.rename_cell (ci_new, layout.uniquify_cell_name (i->second.c_str ()).c_str ()); diff --git a/src/plugins/streamers/gds2/unit_tests/dbGDS2Reader.cc b/src/plugins/streamers/gds2/unit_tests/dbGDS2Reader.cc index 757192281..6447871f6 100644 --- a/src/plugins/streamers/gds2/unit_tests/dbGDS2Reader.cc +++ b/src/plugins/streamers/gds2/unit_tests/dbGDS2Reader.cc @@ -541,6 +541,78 @@ TEST(4_CollectModeRename) db::compare_layouts (_this, layout, fn_au, db::WriteGDS2, 1); } +TEST(4_CollectModeRenameWithGhost) +{ + db::Manager m (false); + db::Layout layout (&m); + + db::LoadLayoutOptions options; + options.get_options ().cell_conflict_resolution = db::RenameCell; + + { + tl::InputStream file (tl::testsrc () + "/testdata/gds/collect_basic_ag.gds"); + db::Reader reader (file); + reader.read (layout, options); + } + + { + tl::InputStream file (tl::testsrc () + "/testdata/gds/collect_basic_b.gds"); + db::Reader reader (file); + reader.read (layout, options); + } + + std::string fn_au (tl::testsrc () + "/testdata/gds/collect_rename_au2.gds"); + db::compare_layouts (_this, layout, fn_au, db::WriteGDS2, 1); +} + +TEST(4_CollectModeRenameWithGhostReverse) +{ + db::Manager m (false); + db::Layout layout (&m); + + db::LoadLayoutOptions options; + options.get_options ().cell_conflict_resolution = db::RenameCell; + + { + tl::InputStream file (tl::testsrc () + "/testdata/gds/collect_basic_a.gds"); + db::Reader reader (file); + reader.read (layout, options); + } + + { + tl::InputStream file (tl::testsrc () + "/testdata/gds/collect_basic_bg.gds"); + db::Reader reader (file); + reader.read (layout, options); + } + + std::string fn_au (tl::testsrc () + "/testdata/gds/collect_rename_au3.gds"); + db::compare_layouts (_this, layout, fn_au, db::WriteGDS2, 1); +} + +TEST(4_CollectModeRenameWithGhostBoth) +{ + db::Manager m (false); + db::Layout layout (&m); + + db::LoadLayoutOptions options; + options.get_options ().cell_conflict_resolution = db::RenameCell; + + { + tl::InputStream file (tl::testsrc () + "/testdata/gds/collect_basic_ag.gds"); + db::Reader reader (file); + reader.read (layout, options); + } + + { + tl::InputStream file (tl::testsrc () + "/testdata/gds/collect_basic_bg.gds"); + db::Reader reader (file); + reader.read (layout, options); + } + + std::string fn_au (tl::testsrc () + "/testdata/gds/collect_rename_au4.gds"); + db::compare_layouts (_this, layout, fn_au, db::WriteGDS2, 1); +} + TEST(4_CollectModeOverwrite) { db::Manager m (false); diff --git a/testdata/gds/collect_basic_a.gds b/testdata/gds/collect_basic_a.gds new file mode 100644 index 0000000000000000000000000000000000000000..d8fe0f2d7333207eec05f915da89d069d7dc2726 GIT binary patch literal 484 zcmZQzV_;&6V31*CVt>lO!XUvQ3dAzVYz7V{HXlzX1_lvkRy)T|bMIrzKUli#&|fe+ zDuh9X6}LV%Ha15F1{Mwm1~y(M21W)pJ|+eR1|0!rAc+K+wHO$f_AoHOXe22XL4+L4(8@ zCqUG}^Z`QzY%Yif*#lA!qZ!Sh=0ItfJAgFUz3dElLxqElEyOlO!XUvQ${@uciOgo;U}E#}bYfr-VP>^+>@@d2w)}&o%MSeo zv!g;7WLWX&V`B^P4`5(m;bLH56Jm2@VBis8W`F?}L1Y;=DMp|Kj|{6*6jT9NEwdH_ P19Kk(SS>qHJqrT>#Eudm literal 0 HcmV?d00001 diff --git a/testdata/gds/collect_basic_b.gds b/testdata/gds/collect_basic_b.gds new file mode 100644 index 0000000000000000000000000000000000000000..e9eb3e975ec3e41f7e748cae416e40e6b7e9ba13 GIT binary patch literal 564 zcmaKpze)r#5XQeu{@fy`oT4D-K7k%+r3fPKVIvA!Tp?GAg|A{G7FOEW+4uk!Ru&?M zPa)V}AtE;Gmu$iXK?B*}Wb)1I%mfZ1$0(Jw-eIta1$42J+bF~x?Dc_pZMUoQjs54l z@#gNs>g~;NfYSaQ=bWnmQvhySpx|Z%K(C|u&6ZvUcB>pZ`5Ctf%ADpJ;XzGVCr*=vXwl73IG!#E@J1b<|ziwyO* z@b8og=LUyI>~o59n)4HLUB!&;C0lh!zuKkU35K_``Gx$y<4W5fMsd*kx$29imiQKF bmflO!XUvQ${@|ah0JE)U}E#}bYfr-VP>^+>@@d2w)}&o%MSeo zv!g;7WLWX&V`B^P4`5(m;bLH56Jm1&l2VKe3=BNdtd0Ue8U%P`SRKF&5LXgV(w0}}%q9}`fG4#+I#Q~&?}{|2Igk{Lh)AHist OIG6_8#SWBaVE_P>IwWWS literal 0 HcmV?d00001 diff --git a/testdata/gds/collect_rename_au2.gds b/testdata/gds/collect_rename_au2.gds new file mode 100644 index 0000000000000000000000000000000000000000..6b48a1f4adf67b0c8fab53529f110120e92a9394 GIT binary patch literal 646 zcmb`DKT8BL5XE06*}3I7MMXh$ODj42(}>o17FHG_ zho3^Qzd}T8)|c$YOQTpA$o@7nZ!(hyg~%ZaBaK%$%wh)fSW5qqi|*}ofoYpm+jq;?SN$G}?B_aF?Eo$ZbWC8N;{u>PVfjs#T?FJFh)hy$a#SyM{cWf}rfQR$ zlq2$!`~b{DMZPG+J-yDnjcC?*e&&w6tn#L&tnhr!`U|pM5lZlClkXuWs#tm;?$9sLS^+d)~D b@6-&~;)JbUB4a%8FZ1SM-hZ2x?l^}pxW7qs literal 0 HcmV?d00001 diff --git a/testdata/gds/collect_rename_au3.gds b/testdata/gds/collect_rename_au3.gds new file mode 100644 index 0000000000000000000000000000000000000000..c4b6cda40d219c0262805f08b48d139a2c9b104b GIT binary patch literal 630 zcmb`Dy-EW?6ot>+nY~#;6cq!aTZ)AQe;R`zLPDCLphXHvDHgtpjaXQzg`KZpVPzqb z#}Mo-M8sxuW_HJHqgXgF`|Zx0d(Yhig~$;yBehpJETD-ctX1EUithKjz`RX%J7?{^ zr@Oc9-u?RR^>BbJ`MFM2JAg|8oe~)6v;b($SUxMut^)D^L{_fc?4(}G`kPRHLe&m8 zDaYg&`3acEg0ezh^1D?K&*TPmq`BgLpU|J1i$WLcm`LdB>3zID(rlG|O2#?JFmDaN zrczfO92_oh^3Uo_X3l5SsALj)eBbDzp<5$MxlO!XUvQ${@|4hs^+>@@d2w)}&o%MSeo zv!g;7WLRhA@efcjWME+7VqjnsVsm6*;1OVEfB_akWEnOoMxX?b469QVQ~_8m zvlasba~}g(EeFsPUM2=61~xt>pc);JS5 literal 0 HcmV?d00001