From a0367c15303c7632a05dc2b01a552204d4d229c1 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Mon, 1 Nov 2021 17:27:52 +0100 Subject: [PATCH] More specific clip variants after bounding boxes have been reduced in RecursiveShapeIterator --- src/db/db/dbHierarchyBuilder.cc | 8 +++++--- src/db/db/dbRecursiveShapeIterator.cc | 4 ++-- src/db/db/dbRecursiveShapeIterator.h | 10 ++++++++++ testdata/algo/hierarchy_builder_au2a.gds | Bin 11526 -> 10512 bytes testdata/algo/hierarchy_builder_au2b.gds | Bin 11614 -> 10522 bytes testdata/algo/hierarchy_builder_au2c.gds | Bin 11902 -> 10810 bytes testdata/algo/hierarchy_builder_au2d.gds | Bin 11536 -> 10522 bytes testdata/algo/hierarchy_builder_au2f.gds | Bin 11978 -> 10886 bytes testdata/algo/hierarchy_builder_au4a.gds | Bin 82618 -> 65416 bytes 9 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/db/db/dbHierarchyBuilder.cc b/src/db/db/dbHierarchyBuilder.cc index 838e93243..fe48fd086 100644 --- a/src/db/db/dbHierarchyBuilder.cc +++ b/src/db/db/dbHierarchyBuilder.cc @@ -381,14 +381,16 @@ HierarchyBuilder::new_inst_member (const RecursiveShapeIterator *iter, const db: } else { - db::Box cell_bbox = iter->layout ()->cell (inst.object ().cell_index ()).bbox (); + db::cell_index_type inst_cell = inst.object ().cell_index (); + + db::Box cell_bbox = iter->cell_bbox (inst_cell); std::pair > clip_variant = compute_clip_variant (cell_bbox, trans, region, complex_region); if (! clip_variant.first) { return false; } - CellMapKey key (inst.object ().cell_index (), iter->is_child_inactive (inst.object ().cell_index ()), clip_variant.second); - db::cell_index_type new_cell = make_cell_variant (key, iter->layout ()->cell_name (inst.object ().cell_index ())); + CellMapKey key (inst.object ().cell_index (), iter->is_child_inactive (inst_cell), clip_variant.second); + db::cell_index_type new_cell = make_cell_variant (key, iter->layout ()->cell_name (inst_cell)); // for a new cell, create this instance if (m_cell_stack.back ().first) { diff --git a/src/db/db/dbRecursiveShapeIterator.cc b/src/db/db/dbRecursiveShapeIterator.cc index 6c89c76f3..df95d9201 100644 --- a/src/db/db/dbRecursiveShapeIterator.cc +++ b/src/db/db/dbRecursiveShapeIterator.cc @@ -775,7 +775,7 @@ RecursiveShapeIterator::down (RecursiveShapeReceiver *receiver) const // compute the region inside the new cell if (new_region != m_region) { new_region = m_trans.inverted () * m_region; - new_region &= m_box_convert (db::CellInst (cell ()->cell_index ())); + new_region &= cell_bbox (cell_index ()); } m_local_region_stack.push_back (new_region); @@ -969,7 +969,7 @@ RecursiveShapeIterator::new_inst_member (RecursiveShapeReceiver *receiver) const // skip instance array members not part of the complex region while (! m_inst_array.at_end ()) { - db::Box ia_box = m_inst->complex_trans (*m_inst_array) * m_box_convert (m_inst->cell_inst ().object ()); + db::Box ia_box = m_inst->complex_trans (*m_inst_array) * cell_bbox (m_inst->cell_index ()); if (! is_outside_complex_region (ia_box)) { break; } else { diff --git a/src/db/db/dbRecursiveShapeIterator.h b/src/db/db/dbRecursiveShapeIterator.h index 5537619c6..ee70e8538 100644 --- a/src/db/db/dbRecursiveShapeIterator.h +++ b/src/db/db/dbRecursiveShapeIterator.h @@ -665,6 +665,16 @@ public: return reinterpret_cast (c - (c & size_t (3))); } + /** + * @brief Gets the current cell's bounding box + * + * The returned box is limited to the selected layer if applicable. + */ + box_type cell_bbox (db::cell_index_type cell_index) const + { + return m_box_convert (db::CellInst (cell_index)); + } + /** * @brief Increments the iterator (operator version) */ diff --git a/testdata/algo/hierarchy_builder_au2a.gds b/testdata/algo/hierarchy_builder_au2a.gds index 9d556aed68022a0a7ef97c024d1f7caf7f78fbac..0f6afd622a5fd0fa6ce463856be38a4444d9a2c8 100644 GIT binary patch literal 10512 zcmeHMO=w(I6h8BlH#5n!HZc?`MXJPw5ZcV-pJGY0Vna$&(lJOV=+dQ&Qbbe)T~t>t zTvZoEur9h21fi~6h-BqbP$V0dLZGXJHqY<=oVoYi`|f*hruh@Pm^s5e_uPBF^LNj^ zLlKqBZ_(LOx%LkYQHh4>G+nTNQ@tErU3!&hv@&pM@$=c`U%%g;zx>mMyI*f~=6_~QRWV# zyu)i(m#)3NzPL6ve`q_+QMIlxMHc+cOfH~aYV`>LxSJu_)KAMl>j-94*z9PO21^G$p} z<9ncg8_MH*n<|d9og8`Sy&>e`%NZeWD38-dpK&;K^g8>Pf$v4&+*CBa2f8P0rYMhx zZ6@S|%@i%o2swN-*hhr)8b3`<=FVw*SX!*xoqe0 z<6F@ACDgrJ(Em@=)-RayxS)OJVe7#69MmVQiQ+K$JY<%IJfib;A#W&;({i?ahI+R9v7tO3 z-Ra3Yrqi-^Ld@X=u6&?qbsZEZFjF1}mAReb>-?@RR z+d)kOt%+9!=);u9qfSo|h58;sQWU8pA3az41hy0XQt3-!u2g$DvkuN`(BfHXRZwAV z^xG$x@_3fjp+DY0DpQJ9zkxj7LYVS6sC@z@yuOcK^CA^jQQ^N)j?`{jI4?ZlMQr9g z_Q6wsN`DtQDLsFnQBC*9Y(alm^DKY(ew!mFgRDF&Fq_xb9aG}H^3gcr<_7L2<2b)= zqFQ~$l*a{4#CuYHOW04{Z8%Su@;K*9PWQu|JNhg;D)Ew-7Tw)?ZSxtaBOkV&y^1r7 z*U~T7jM{p+F1<^r^uT`({`d{S@Q$JAzW4?yY2#*w4UdlxyckC*Opo!IRIm8aXw74b z{?EL#wQmvbSy%is0&DnIn<{8sYo29Yf4%9RDu_3m*DjdBxV6|m#v5p62HSkz$&q(* z6M5$KWmv_T#cSng?RiD~caiFq$y6M^wXJ!q!%^aaWzzAq3gWTmS$KThZPx>qp9;+8 zwR8McSFd6c)1dB!(jzQ|%X`2dhU>(QrFC!)ual!IUNsXpdgX}`w}VUdL&hxL{g6=L z-;A}Tl{Z$$TDY<2Anwi;H*KY#w1DhUQR?o(y5J0_a-ZMM;=a6)#hpyvKj1lg-&eMb zY*7T_Hftf66J8<;=%~2?9W^(gqvqN=`ukp)=pBK++p;ZWzZvv_<_7R-ZUCR=2JmUF zgAWxUksD)p-If;a2dTLmIcv7nnt`~J-AT}=nj65ZxdF_Yn~PbV6-51DHunz)^F$`* z>C8CR+yG|H4Pe&XT+H%3=?}B%N0XS5t1@;1e%6r{h;7XcVAk9KX3fpRjB4n`w!V)g zUiWscpp99;s}E@Hcl;fVmtCej9xbT)S+tIsE;DH}$bYuo>rnv!|X>Pz~nww`c zR4>nFMKPNmE{PfOlZ9DVivVWL4Pe&X0A|h2!;GBn8*@vYS6*FJH{@X5*V!1rthoWq znj65Zxp|lopS@znTY>CI6k>Er2`{JnxUOcYy&SX&o`W^PbC4!@c{t&pUU8zElCON7 z)oa{~Xxwro*%817!^#eL&Cq?C-YLZAhzRl7BOyL#QHak`9O8533Gq4eLwv6GAwE~z P5FdT4XFpVyYL)&2JiC#e literal 11526 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 diff --git a/testdata/algo/hierarchy_builder_au2c.gds b/testdata/algo/hierarchy_builder_au2c.gds index 85f5d60828ff1e721f426cbfab24f4ec7f4d4abb..d822f9a7aba70dfe46788411d482f1f6c85edf20 100644 GIT binary patch delta 1812 zcmaixO=uHQ6oucL{7hPtXeN_PCCN-DnQ4;#P-rD>T!<~AR!gaEln|}xR&mp%NR6)Q zLa-bZp|+is3PKIcCMa}SM4`Cq&YeQti7P=7$4Nyu_qls;&iU@S_x-%|s@7m(CP{Uc z<&yk~9blX#Segz0`(_a-JUunZm>LKjo47Z2cKg|v>WTKSv)ZV!Y>3RQG|p=Ta%Fpg zl5mvM+9qGi6G#>fhih{aGxOF6xRk;!pTp@ufgBSL&|~ff)~K9Y3FbH{UJIp25s$(o z6=!6+&6d1iQcHL5FU@dSws0k4Q`PV!a`C!=GBtBy#HzBO%tT+xym`KJ{C`fj)g`#o z$L=J3r+8GjuRp(nB5ob-z$bl$o~rq$dAslCm0$fN!})^!Cf zO~txyl8IgYccO$lp3g`txNrPz;=ct=^1Tm9?oMwRS3PFgRDAXgbDH$NH&dkc!+b$% zTX|Y*7GC3Ap@+;aTQ=TVj?mM#ZG5-Ip1nRB14Rd)i*<5Vy<}sxB<3uay*_2Jr`_-M U=@)zU222zOAB*;KqeF}Q7e=)?KmY&$ literal 11902 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 T^2$4tC300iib39q8V&I;d^qVc diff --git a/testdata/algo/hierarchy_builder_au4a.gds b/testdata/algo/hierarchy_builder_au4a.gds index 504df9920758aaa48972b806e6876bb7b4ac31b5..8c9f4d9cea29e8d1d5fe3b7d14b94797126f8318 100644 GIT binary patch literal 65416 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 P`N+7yJy5sq?-&0EytkuK literal 82618 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