From f86f8149eb2da25e0d8286602832e40f3030755e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 5 Jan 2019 22:40:53 +0100 Subject: [PATCH] Fixed a bug that caused a segfault in the Layout2Netlist object (array repo references to original layout rather than to the working layout) --- src/db/db/dbHierarchyBuilder.cc | 2 +- src/db/unit_tests/dbHierarchyBuilderTests.cc | 37 +++++++++++++++++++ testdata/algo/hierarchy_builder_au_l5.gds | Bin 0 -> 3566 bytes testdata/algo/hierarchy_builder_l5.gds | Bin 0 -> 3566 bytes testdata/algo/hierarchy_builder_l5.oas.gz | Bin 0 -> 497 bytes 5 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 testdata/algo/hierarchy_builder_au_l5.gds create mode 100644 testdata/algo/hierarchy_builder_l5.gds create mode 100644 testdata/algo/hierarchy_builder_l5.oas.gz diff --git a/src/db/db/dbHierarchyBuilder.cc b/src/db/db/dbHierarchyBuilder.cc index 88039a4b4..5dc23833d 100644 --- a/src/db/db/dbHierarchyBuilder.cc +++ b/src/db/db/dbHierarchyBuilder.cc @@ -242,7 +242,7 @@ HierarchyBuilder::new_inst (const RecursiveShapeIterator *iter, const db::CellIn // for new cells, create this instance if (m_cell_stack.back ().first) { - db::CellInstArray new_inst = inst; + db::CellInstArray new_inst (inst, &mp_target->array_repository ()); new_inst.object () = db::CellInst (m_cm_entry->second); m_cell_stack.back ().second->insert (new_inst); } diff --git a/src/db/unit_tests/dbHierarchyBuilderTests.cc b/src/db/unit_tests/dbHierarchyBuilderTests.cc index 317b5883f..54bc333d0 100644 --- a/src/db/unit_tests/dbHierarchyBuilderTests.cc +++ b/src/db/unit_tests/dbHierarchyBuilderTests.cc @@ -498,3 +498,40 @@ TEST(6_DisjunctLayersPerHierarchyBranch) db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/hierarchy_builder_au_l4.gds"); } +TEST(7_DetachFromOriginalLayout) +{ + // using OASIS means we create a lot of references to array + // and shape repo - we check here whether these references get + // translated or resolved in the hierarchy builder. + std::auto_ptr ly (new db::Layout (false)); + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/hierarchy_builder_l5.oas.gz"; + 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); + + } + + // make sure there is no connection to original layout + ly.reset (0); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/hierarchy_builder_au_l5.gds"); +} + diff --git a/testdata/algo/hierarchy_builder_au_l5.gds b/testdata/algo/hierarchy_builder_au_l5.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<IA>JDE3ugjsasN-Tc-f~1LYpq-Sw zNp&~iN^#>d5{nTO6gRU_5!{R$(VYviE*t40-DMeRBVD+dO(6k=ekeLg6)N}-dKUNG z_wL~w&KX%<_RrNz(wCMFcwyl@NmX(Zo?DdBa_L$m{aR41M1BxfYt=?{)vttCG{v*L z<8w3kpTKi<8HM$gXtBDqWb%d|)anv>*eC_EjBLut{9yHB8I=j)u_n7s`Oi}_>IV$# z%`h8sk#7(kJMdH8Qw$p8yg}#l2e`%nIt9`-Eh6r5 zlG1(lc;uVO$H8Zz0 zZR9>s$L>Rwh#}j7P34=F<-sLg4Anz8f+uWJCU-sOw1LCMB#qfUG_<~$`wL64d-R_l zu|26et?^llvHyd13S#BmCm0u}zT1W8MFSFuodld)s6p1|Hr@S2ot8p~bA#=kwYc45 nsErovJtcX~5wop1*hhQB9<5{YMWLP33_^Yb_KVA$Kmz~({b=-y literal 0 HcmV?d00001