From 3fd99407a3da44ec4ae5d5b6d8626b3799f3ac4e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 3 Jan 2019 23:25:28 +0100 Subject: [PATCH] WIP: bugfix - hierarchical net extractor wasn't considering self-interactions between instance array elements. --- src/db/db/dbHierNetworkProcessor.cc | 73 ++++++++++++++++++ .../unit_tests/dbHierNetworkProcessorTests.cc | 14 +++- testdata/algo/hc_test_au11b.gds | Bin 0 -> 14196 bytes testdata/algo/hc_test_au12.gds | Bin 0 -> 16598 bytes testdata/algo/hc_test_au12b.gds | Bin 0 -> 14128 bytes testdata/algo/hc_test_au13.gds | Bin 0 -> 17636 bytes testdata/algo/hc_test_au13b.gds | Bin 0 -> 14996 bytes testdata/algo/hc_test_l12.gds | Bin 0 -> 1008 bytes testdata/algo/hc_test_l13.gds | Bin 0 -> 916 bytes 9 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 testdata/algo/hc_test_au11b.gds create mode 100644 testdata/algo/hc_test_au12.gds create mode 100644 testdata/algo/hc_test_au12b.gds create mode 100644 testdata/algo/hc_test_au13.gds create mode 100644 testdata/algo/hc_test_au13b.gds create mode 100644 testdata/algo/hc_test_l12.gds create mode 100644 testdata/algo/hc_test_l13.gds diff --git a/src/db/db/dbHierNetworkProcessor.cc b/src/db/db/dbHierNetworkProcessor.cc index 77f33297e..6a87619f4 100644 --- a/src/db/db/dbHierNetworkProcessor.cc +++ b/src/db/db/dbHierNetworkProcessor.cc @@ -885,6 +885,16 @@ public: add_pair (*i1, p, t, *i2, p, t); } + /** + * @brief Single-instance treatment - may be required because of interactions between array members + */ + void finish (const db::Instance *i, unsigned int /*p1*/) + { + if (i->size () > 1) { + add_single_inst (*i); + } + } + /** * @brief Receiver main event for local-to-instance interactions */ @@ -1076,6 +1086,69 @@ private: } + /** + * @brief Single instance treatment + */ + void add_single_inst (const db::Instance &i) + { + box_type bb = (*mp_cbc) (i.cell_index ()); + const db::Cell &cell = mp_layout->cell (i.cell_index ()); + + for (db::CellInstArray::iterator ii = i.begin (); ! ii.at_end (); ++ii) { + + db::ICplxTrans tt = i.complex_trans (*ii); + box_type ib = bb.transformed (tt); + + std::vector pp; + pp.push_back (db::InstElement (i, ii)); + + bool any = false; + bool first = true; + + for (db::CellInstArray::iterator ii2 = i.begin_touching (ib, mp_layout); ! ii2.at_end (); ++ii2) { + + db::ICplxTrans tt2 = i.complex_trans (*ii2); + if (tt.equal (tt2)) { + // skip the initial instance + continue; + } + + box_type ib2 = bb.transformed (tt2); + + if (ib.touches (ib2)) { + + std::vector pp2; + pp2.push_back (db::InstElement (i, ii2)); + + box_type common = (ib & ib2); + add_single_pair (common, i.cell_index (), pp, tt, i.cell_index (), pp2, tt2); + + // dive into cell of ii2 - this is a self-interaction of a cell with parts of itself + // as these self-interactions are expected to be the same always (regular array), we can skip this test the next times. + if (first) { + for (db::Cell::touching_iterator jj2 = cell.begin_touching (common.transformed (tt2.inverted ())); ! jj2.at_end (); ++jj2) { + std::vector p; + db::ICplxTrans t; + add_pair (i, p, t, *jj2, pp2, tt2); + } + } + + any = true; + + } + + } + + first = false; + + // we don't expect more to happen on the next instance + if (! any) { + break; + } + + } + } + /** * @brief Handles a local clusters vs. the clusters of a specific child instance or instance array * @param c1 The local cluster diff --git a/src/db/unit_tests/dbHierNetworkProcessorTests.cc b/src/db/unit_tests/dbHierNetworkProcessorTests.cc index b58f0460a..bb05fe3c4 100644 --- a/src/db/unit_tests/dbHierNetworkProcessorTests.cc +++ b/src/db/unit_tests/dbHierNetworkProcessorTests.cc @@ -1006,6 +1006,18 @@ TEST(110_HierClusters) TEST(111_HierClusters) { run_hc_test (_this, "hc_test_l11.gds", "hc_test_au11.gds"); - run_hc_test_with_backannotation (_this, "hc_test_l4.gds", "hc_test_au4b.gds"); + run_hc_test_with_backannotation (_this, "hc_test_l11.gds", "hc_test_au11b.gds"); +} + +TEST(112_HierClusters) +{ + run_hc_test (_this, "hc_test_l12.gds", "hc_test_au12.gds"); + run_hc_test_with_backannotation (_this, "hc_test_l12.gds", "hc_test_au12b.gds"); +} + +TEST(113_HierClusters) +{ + run_hc_test (_this, "hc_test_l13.gds", "hc_test_au13.gds"); + run_hc_test_with_backannotation (_this, "hc_test_l13.gds", "hc_test_au13b.gds"); } diff --git a/testdata/algo/hc_test_au11b.gds b/testdata/algo/hc_test_au11b.gds new file mode 100644 index 0000000000000000000000000000000000000000..ee96f084217f7ba4acbbd6b073b37d9971d65889 GIT binary patch literal 14196 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 Dyt1%4 literal 0 HcmV?d00001 diff --git a/testdata/algo/hc_test_au12.gds b/testdata/algo/hc_test_au12.gds new file mode 100644 index 0000000000000000000000000000000000000000..72d2f1097a12a4ed1ab773620b17f30edb3b7f45 GIT binary patch literal 16598 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 literal 0 HcmV?d00001 diff --git a/testdata/algo/hc_test_au12b.gds b/testdata/algo/hc_test_au12b.gds new file mode 100644 index 0000000000000000000000000000000000000000..e70c9617785f1ca6f4efc7bbb01f8f2e015f8d5e GIT binary patch literal 14128 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 Ue~33g~$6m_q$x1(B?*(58Uy5 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 K{_cj_+Vp?>N=F+2 literal 0 HcmV?d00001 diff --git a/testdata/algo/hc_test_au13b.gds b/testdata/algo/hc_test_au13b.gds new file mode 100644 index 0000000000000000000000000000000000000000..f14dfeaa9f78c00cb3173bb1fef46a7adc46c0df GIT binary patch literal 14996 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 qUH`E3#dRRp2vQ-{=as0b?Lvsm=pT| literal 0 HcmV?d00001 diff --git a/testdata/algo/hc_test_l12.gds b/testdata/algo/hc_test_l12.gds new file mode 100644 index 0000000000000000000000000000000000000000..17c1a90df13d271d4d751050f4ec46a145d30aa2 GIT binary patch literal 1008 zcmaizJ4gdT5QhJIZBCMik6IR$pE{AAeOBB8>7oOCs7Q`pgIcX9)0eO4WtQ{-+J1MnEL| z*dl7RBC6g9lKn52?5`0CpRR$f)rhJ$YCrsTyvoi!*K&<>X1a^)KZ~e3Grs?rpQt%U z^!6a++BJz@PnD_*ll(x+=lNkFz^4r9vQqVs@%T=ZKhblc-Gk?X-fo2rMsN%S}C z(l5@R>F-MYBdX4QP4IKSZ@At)ZN47^8SbT0b!O=Q=al-!l$Vxy8)?1`eR5*WpvB$E z1YWVil*jLvTarV-H^i!DfNWh!bhRFi!&tnA&uhr-5|76&@nEwG3>?9lx}?VQFb;kyh{z5KLibV_{)o zX(3h?A_x{1f{lfRkVK;f$JtAUyTbKg`Q5$a?as~{D7fwhwBu%;;lRTvMlhLvN9d~Z zN(m@Y+w9WC)bUZZ0v*_WN~y(Z_#vQjF7K@dTmZ$qN7Q+e1vtg@65SB~ zApZ7Ko#-bbqB`J>13^J3x}n|Q+9hgeBE!xeQM;W`^oF+kKW^AxBQk6~0DW5tMQ_w> zejsy8ba&R}JvXTTfJi7hGkt$I=^x+qg*&<3rC;Xrueeb?iq5q7iJHqqU$2JT`zF!n zrBHN3o1g0r`Tv9=z|(_lMJRgA^!Z*=KhgV~${&MV*L_c;)0BBAKa*q_0_QywZ+SzG68WO>eq%*3lPhtr94P^vP`6AqjC XFF@x#IGYiWI~8*7JMp)i<@@*rB9s$( literal 0 HcmV?d00001