From 3cbbe041aa1a87c8bad2bc92f4ccc1eb61fc114d Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 22 Sep 2018 23:37:23 +0200 Subject: [PATCH] WIP: some bugfixes, new tests (up/down, down/up interactions) --- .../tools/netx/db_plugin/dbHierProcessor.cc | 48 +++++++++++------- src/plugins/tools/netx/testdata/hlp2.oas | Bin 0 -> 827 bytes .../netx/unit_tests/dbHierProcessorTests.cc | 10 ++++ 3 files changed, 40 insertions(+), 18 deletions(-) create mode 100644 src/plugins/tools/netx/testdata/hlp2.oas diff --git a/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc b/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc index c84e9fae0..76ae117c2 100644 --- a/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc +++ b/src/plugins/tools/netx/db_plugin/dbHierProcessor.cc @@ -268,7 +268,7 @@ struct InteractionRegistrationShape2Inst { public: InteractionRegistrationShape2Inst (db::Layout *layout, unsigned int intruder_layer, std::map > *result) - : mp_layout (layout), m_intruder_layer (intruder_layer), m_inst_bc (*layout, intruder_layer), mp_result (result) + : mp_layout (layout), m_intruder_layer (intruder_layer), mp_result (result) { // nothing yet .. } @@ -276,30 +276,37 @@ public: void add (const db::PolygonRef *ref, int, const db::CellInstArray *inst, int) { const db::Cell &intruder_cell = mp_layout->cell (inst->object ().cell_index ()); - db::Box region = ref->box () & m_inst_bc (*inst); - if (! region.empty ()) { - // @@@ TODO: should be lighter, cache, handle arrays .. - db::RecursiveShapeIterator si (*mp_layout, intruder_cell, m_intruder_layer, region); - si.shape_flags (polygon_ref_flags ()); - while (! si.at_end ()) { + for (db::CellInstArray::iterator n = inst->begin (); !n.at_end (); ++n) { - // @@@ should be easier to transform references - const db::PolygonRef *ref2 = si.shape ().basic_ptr (db::PolygonRef::tag ()); - db::Polygon poly = ref2->obj ().transformed (si.trans () * db::ICplxTrans (ref->trans ())); - (*mp_result)[*ref].push_back (db::PolygonRef (poly, mp_layout->shape_repository())); + db::ICplxTrans tn = inst->complex_trans (*n); - ++si; + db::Box region = ref->box ().transformed (tn.inverted ()) & intruder_cell.bbox (m_intruder_layer); + if (! region.empty ()) { + + // @@@ TODO: should be lighter, cache, handle arrays .. + db::RecursiveShapeIterator si (*mp_layout, intruder_cell, m_intruder_layer, region); + si.shape_flags (polygon_ref_flags ()); + while (! si.at_end ()) { + + // @@@ should be easier to transform references + const db::PolygonRef *ref2 = si.shape ().basic_ptr (db::PolygonRef::tag ()); + db::Polygon poly = ref2->obj ().transformed (tn * si.trans () * db::ICplxTrans (ref2->trans ())); + (*mp_result)[*ref].push_back (db::PolygonRef (poly, mp_layout->shape_repository())); + + ++si; + + } } } + } private: db::Layout *mp_layout; unsigned int m_intruder_layer; - db::box_convert m_inst_bc; std::map > *mp_result; }; @@ -444,20 +451,25 @@ void LocalProcessor::compute_contexts (db::LocalProcessorCellContext *parent_con for (std::map, std::set > >::const_iterator i = interactions.begin (); i != interactions.end (); ++i) { - std::pair, std::set > intruders_below; - intruders_below.second = i->second.second; - db::Cell &child_cell = mp_layout->cell (i->first->object ().cell_index ()); for (db::CellInstArray::iterator n = i->first->begin (); ! n.at_end (); ++n) { db::ICplxTrans tn = i->first->complex_trans (*n); db::ICplxTrans tni = tn.inverted (); - db::Box nbox = tn * child_cell.bbox (m_intruder_layer); + db::Box nbox = tn * child_cell.bbox (m_scope_layer); if (! nbox.empty ()) { - intruders_below.first.clear (); + std::pair, std::set > intruders_below; + + // @@@ transformation of polygon refs - can this be done more efficiently? + for (std::set::const_iterator p = i->second.second.begin (); p != i->second.second.end (); ++p) { + if (nbox.overlaps (p->box ())) { + db::Polygon poly = p->obj ().transformed (tni * db::ICplxTrans (p->trans ())); + intruders_below.second.insert (db::PolygonRef (poly, mp_layout->shape_repository ())); + } + } // @@@ TODO: in some cases, it may be possible to optimize this for arrays diff --git a/src/plugins/tools/netx/testdata/hlp2.oas b/src/plugins/tools/netx/testdata/hlp2.oas new file mode 100644 index 0000000000000000000000000000000000000000..65b25366b7a8eecb71d9b478800a339743ba661b GIT binary patch literal 827 zcmd^5F-rq67|oX}RkSBo5=-SeC=?57u}%sur9J9Ft>RS_ms@laq>~g>IB-?yP(cTw zi`cPa-A>TW;RKP6hf{|NadQwcxmfMsKQKf1$oJmMdoOP4%f`$~+B8gc0F+d67Pb3O z@6qU(X)UKWEz`&q^sHqRih538vo?%uaj8F`shV7`7ybfhbilNVE2~yU&*wu5p911S zfna9I$Y)dVJ8yCE&$wHB3OJ!RTG5<1qcpWG7Oj|j1#})T7f1?uF*_kfQ7tH` zPRNO?D9oUuHLDP2O6M8e1UZlwr*Q21^!8gZ-zQn%zcr4reI)BZ zvJB4p