From ee55a4ca21016a75f4545bc5100f513562802fe0 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 6 Oct 2018 21:56:13 +0200 Subject: [PATCH] Fixed hier processor in case of self-interactions --- .../tools/netx/db_plugin/dbHierProcessor.cc | 24 ++++++++++++------ src/plugins/tools/netx/testdata/hlp10.oas | Bin 560 -> 584 bytes src/plugins/tools/netx/testdata/hlp9.oas | Bin 845 -> 936 bytes .../netx/unit_tests/dbHierProcessorTests.cc | 2 +- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc b/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc index 39405385f..0828d72f0 100644 --- a/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc +++ b/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc @@ -155,21 +155,24 @@ void SelfOverlapMergeLocalOperation::compute_local (db::Layout *layout, const Sh db::EdgeProcessor ep; size_t p1 = 0, p2 = 1; - std::set seen2; + std::set seen; for (ShapeInteractions::iterator i = interactions.begin (); i != interactions.end (); ++i) { - const db::PolygonRef &subject = interactions.shape (i->first); - for (db::PolygonRef::polygon_edge_iterator e = subject.begin_edge (); ! e.at_end(); ++e) { - ep.insert (*e, p1); + if (seen.find (i->first) == seen.end ()) { + seen.insert (i->first); + const db::PolygonRef &subject = interactions.shape (i->first); + for (db::PolygonRef::polygon_edge_iterator e = subject.begin_edge (); ! e.at_end(); ++e) { + ep.insert (*e, p1); + } + p1 += 2; } - p1 += 2; for (db::ShapeInteractions::iterator2 o = i->second.begin (); o != i->second.end (); ++o) { // don't take the same (really the same, not an identical one) shape twice - the interaction // set does not take care to list just one copy of the same item on the intruder side. - if (seen2.find (*o) == seen2.end ()) { - seen2.insert (*o); + if (seen.find (*o) == seen.end ()) { + seen.insert (*o); const db::PolygonRef &intruder = interactions.shape (*o); for (db::PolygonRef::polygon_edge_iterator e = intruder.begin_edge (); ! e.at_end(); ++e) { ep.insert (*e, p2); @@ -414,6 +417,7 @@ public: } else { mp_result->add_shape (id2, *ref2); } + mp_result->add_interaction (id1, id2); } @@ -863,7 +867,11 @@ void LocalProcessor::compute_contexts (LocalProcessorContexts &contexts, for (std::set::const_iterator j = i->second.first.begin (); j != i->second.first.end (); ++j) { for (db::CellInstArray::iterator k = (*j)->begin_touching (nbox.enlarged (db::Vector (-1, -1)), inst_bcii); ! k.at_end (); ++k) { - intruders_below.first.insert (db::CellInstArray (db::CellInst ((*j)->object ().cell_index ()), tni * (*j)->complex_trans (*k))); + db::ICplxTrans tk = (*j)->complex_trans (*k); + // NOTE: no self-interactions + if (i->first != *j || tn != tk) { + intruders_below.first.insert (db::CellInstArray (db::CellInst ((*j)->object ().cell_index ()), tni * tk)); + } } } diff --git a/src/plugins/tools/netx/testdata/hlp10.oas b/src/plugins/tools/netx/testdata/hlp10.oas index 9a51e38d1fcd01415bcf7b967b0002862843d52f..53aba0a970ea5a6af50942d9d27c9113478eec56 100644 GIT binary patch delta 36 pcmdnMa)M=p0i%SdVICt>hx!M$1MRG$CLrbx-i9|U42umI83Dt@3MT*n delta 20 bcmX@XvVmoT0V5;R3uULPG^T diff --git a/src/plugins/tools/netx/testdata/hlp9.oas b/src/plugins/tools/netx/testdata/hlp9.oas index c12644748b66b69ebad38ca37f68a1b1c604bb16..16d63a4f8704786db6ac1025095c4ea6a2ee8f30 100644 GIT binary patch delta 149 zcmX@hwt{`aN*z(#JVve;3Jc_40(mSi*ntd%h4L@hC$3~+U|M8t5POCoH^UqWfz7;34vYZR6fcPY delta 56 zcmZ3%ewJ;*%86HNCQoNHpB%vGHu)T*(qwri14+|VMy3X%8G;vHF>^D_kq{77OalpA LaNL~1