From 62d9941c4a65cea01bc31eaf1414dcc2b060aa0d Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 3 Jan 2019 22:09:19 +0100 Subject: [PATCH] WIP: Bugfix - hierarchy was dropping instances. --- src/db/db/dbHierarchyBuilder.cc | 11 ++++++- src/db/db/dbHierarchyBuilder.h | 1 + src/db/unit_tests/dbHierarchyBuilderTests.cc | 31 +++++++++++++++++++ testdata/algo/hierarchy_builder_au_l4.gds | Bin 0 -> 3566 bytes testdata/algo/hierarchy_builder_l4.gds | Bin 0 -> 3566 bytes 5 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 testdata/algo/hierarchy_builder_au_l4.gds create mode 100644 testdata/algo/hierarchy_builder_l4.gds diff --git a/src/db/db/dbHierarchyBuilder.cc b/src/db/db/dbHierarchyBuilder.cc index 0d9465d04..88039a4b4 100644 --- a/src/db/db/dbHierarchyBuilder.cc +++ b/src/db/db/dbHierarchyBuilder.cc @@ -154,6 +154,7 @@ HierarchyBuilder::reset () m_initial_pass = true; mp_initial_cell = 0; + m_cells_to_be_filled.clear (); m_cell_map.clear (); m_cells_seen.clear (); m_cell_stack.clear (); @@ -206,9 +207,15 @@ void HierarchyBuilder::enter_cell (const RecursiveShapeIterator * /*iter*/, const db::Cell * /*cell*/, const db::Box & /*region*/, const box_tree_type * /*complex_region*/) { tl_assert (m_cm_entry != m_cell_map.end () && m_cm_entry != cell_map_type::const_iterator ()); + m_cells_seen.insert (m_cm_entry->first); - m_cell_stack.push_back (std::make_pair (m_cm_new_entry, &mp_target->cell (m_cm_entry->second))); + bool new_cell = (m_cells_to_be_filled.find (m_cm_entry->second) != m_cells_to_be_filled.end ()); + if (new_cell) { + m_cells_to_be_filled.erase (m_cm_entry->second); + } + + m_cell_stack.push_back (std::make_pair (new_cell, &mp_target->cell (m_cm_entry->second))); } void @@ -230,6 +237,7 @@ HierarchyBuilder::new_inst (const RecursiveShapeIterator *iter, const db::CellIn db::cell_index_type new_cell = mp_target->add_cell (iter->layout ()->cell_name (inst.object ().cell_index ())); m_cm_entry = m_cell_map.insert (std::make_pair (key, new_cell)).first; m_cm_new_entry = true; + m_cells_to_be_filled.insert (new_cell); } // for new cells, create this instance @@ -277,6 +285,7 @@ HierarchyBuilder::new_inst_member (const RecursiveShapeIterator *iter, const db: db::cell_index_type new_cell = mp_target->add_cell ((std::string (iter->layout ()->cell_name (inst.object ().cell_index ())) + suffix).c_str ()); m_cm_entry = m_cell_map.insert (std::make_pair (key, new_cell)).first; m_cm_new_entry = true; + m_cells_to_be_filled.insert (new_cell); } // for a new cell, create this instance diff --git a/src/db/db/dbHierarchyBuilder.h b/src/db/db/dbHierarchyBuilder.h index 7a2c23f84..5e0da406f 100644 --- a/src/db/db/dbHierarchyBuilder.h +++ b/src/db/db/dbHierarchyBuilder.h @@ -248,6 +248,7 @@ private: db::RecursiveShapeIterator m_source; cell_map_type m_cell_map; std::set m_cells_seen; + std::set m_cells_to_be_filled; cell_map_type::const_iterator m_cm_entry; bool m_cm_new_entry; unsigned int m_target_layer; diff --git a/src/db/unit_tests/dbHierarchyBuilderTests.cc b/src/db/unit_tests/dbHierarchyBuilderTests.cc index 55e0d6e76..317b5883f 100644 --- a/src/db/unit_tests/dbHierarchyBuilderTests.cc +++ b/src/db/unit_tests/dbHierarchyBuilderTests.cc @@ -467,3 +467,34 @@ TEST(5_CompareRecursiveShapeIterators) } } +TEST(6_DisjunctLayersPerHierarchyBranch) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/hierarchy_builder_l4.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::Layout target; + db::HierarchyBuilder builder (&target); + + for (db::Layout::layer_iterator li = ly.begin_layers (); li != ly.end_layers (); ++li) { + + unsigned int li1 = (*li).first; + unsigned int target_layer = target.insert_layer (*(*li).second); + builder.set_target_layer (target_layer); + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::RecursiveShapeIterator iter (ly, ly.cell (top_cell_index), li1); + + iter.push (&builder); + + } + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/hierarchy_builder_au_l4.gds"); +} + diff --git a/testdata/algo/hierarchy_builder_au_l4.gds b/testdata/algo/hierarchy_builder_au_l4.gds new file mode 100644 index 0000000000000000000000000000000000000000..ecabac16a26d037eda78e9b70ed50d87f6ec4c3a GIT binary patch literal 3566 zcma)8QD_ub6umn;`(}0%qtzf-Lb1}83aOP^l_E;q#@3LMNOlcv2qd5V5el`Xh!sHv zs|W!Lg8Css?T3G2LC~)vrOlV0LQ4tsuOI~Sl|^?vcka78?@h9^S=c?xz4yHP-o59( z88Q?EU(!%1i2kDzm1#Q}de8k&abUg}s}l{DD@Tt0ba4ESUza}_ee~g-TQf}>s&wbo zjA>3CooEn+F_GC6P(WrNAfn+d0=9EvjAf zSEYVsdw%maS25mP#&3%Tw=hzYyj)@=D({qCN3@~-)I0q#Zhc=p!TBztKToi)vpCy3 zifU){>f`XSjek-T$SE2>#ozuqAOS}YcE90E2xh_tya($*5nICwKICPa`@Qcw$u+~9%{8oQSHTi zu5tNe><}2BS{E(sA zqgeR;9W8GUaO0%)W#z(ecA(D^)k6`uTUZfw9M|c3T~_O&i8}Sx#G06OG~r}XP1yNV z{X6qn`kHUMbS8=Z#CGSwv4|7%tn$fIte*BNtgEF8dpV4*%wooeiK?few4W8#&RD=- zVui>Zp~_HHdrl$fM|NAcE@S;8(&5tY(qTchGkW=ReC&6R@cSPKUs3JVJs!W3<;R5V z!v4<)hSNaYmWpZzx(avrQ1)HO?xtXbCr|4f>TXf(=BCGwviz973pn3n!Q?me@JIZ& zsP^{bB0f0d%*Wo3F+W4K(|9qzdSCdpUxcry_Uip&e%~SC_wN_JqT2fo3ExgA^rsWr z(P_NHOrC6_^!!xrJ)=`&6Q57w`64rFCl(Wr{PIcHS?jHxNZnn$gLjI&Z!H&jcaIc# z_pNzSxO+alRKz{Lx5ztnzQ{ZKEc4nYTWdz!J!{p?NO>T$%4K>ff7 zxn^)bE2`a$cTL3FR1n+{@l01XJp>|sSKHK{i)up`f>hD{d3ERkBQaa_|&R@y*TcoJjXtR z>Ul=GMIjKYO*a}nR>Sj$<3>kq+y-Y3(U_`utGqX@H*uaXH*cOVH*KCTH*20RH))

oiT@QdB!5RbHcRe5~?!<_9v5 zC>mE(d(Mw(O*_pqVXw|k&tj#wvD352@E0;&Q&c;nx6_Kt??mt~;uo0S0sfPt+B=IO zK2AH!eB|B7{2bLzv%UC;-2u*`V0s7G;rxPX@137{oL{iCk9qjDsCLa?lS-HE`OTYL z?_@(6f7>*)k&)8$`4S^h`3>21|N2Z!&3w>6ed~J(II~yE+ny&neHoPGiL%r<_xOa++=r!B5z-X zu8QfRP$vsc>h^?Ap-fXRp5ZsP=*;z5TDu;WAq2X<*E6CvH_y?WX1JzvT8bYdKCtlk5K!O)9D#vnjhj+Y`vI zJt4CMezO&ImZ&}*f%kuUV(RE|y#F$D?F`R44EMl4S+>>Q`lli9(5;Yn`*O&;b1dZD zvk>xrv=s6l+a2;wUkrKY{>Z&}CRTkb6>HyqBDH7iQG0KmuN*_%7sY5@`G)06`#=B9OT`^lLtnVzYU6>8mUXJK s&hHCib@8j+vW`qeJ3;MB>8z90lzA6MR>j+|-qTNreq0bQPF<