diff --git a/src/db/db/dbLocalOperation.cc b/src/db/db/dbLocalOperation.cc index bb28dda7f..aec94c438 100644 --- a/src/db/db/dbLocalOperation.cc +++ b/src/db/db/dbLocalOperation.cc @@ -430,7 +430,7 @@ EdgeToPolygonLocalOperation::EdgeToPolygonLocalOperation (EdgePolygonOp::mode_t OnEmptyIntruderHint EdgeToPolygonLocalOperation::on_empty_intruder_hint () const { - return (m_op == EdgePolygonOp::Inside) ? Copy : Drop; + return (m_op != EdgePolygonOp::Inside) ? Copy : Drop; } std::string @@ -493,7 +493,12 @@ EdgeToPolygonLocalOperation::do_compute_local (db::Layout * /*layout*/, const sh } } - db::EdgeToEdgeSetGenerator cc (result); + std::unique_ptr cc_second; + if (result2) { + cc_second.reset (new db::EdgeToEdgeSetGenerator (*result2, 2 /*second tag*/)); + } + + db::EdgeToEdgeSetGenerator cc (result, 1 /*first tag*/, cc_second.get ()); db::EdgePolygonOp op (m_op, m_include_borders); ep.process (cc, op); diff --git a/src/db/db/dbLocalOperationUtils.cc b/src/db/db/dbLocalOperationUtils.cc index 5ef58385f..f9fac5311 100644 --- a/src/db/db/dbLocalOperationUtils.cc +++ b/src/db/db/dbLocalOperationUtils.cc @@ -30,8 +30,8 @@ namespace db // ----------------------------------------------------------------------------------------------- // class EdgeToEdgeSetGenerator -EdgeToEdgeSetGenerator::EdgeToEdgeSetGenerator (std::unordered_set &edges) - : mp_edges (&edges) +EdgeToEdgeSetGenerator::EdgeToEdgeSetGenerator (std::unordered_set &edges, int tag, EdgeToEdgeSetGenerator *chained) + : mp_edges (&edges), m_tag (tag), mp_chained (chained) { // .. nothing yet .. } @@ -39,6 +39,19 @@ EdgeToEdgeSetGenerator::EdgeToEdgeSetGenerator (std::unordered_set &ed void EdgeToEdgeSetGenerator::put (const db::Edge &edge) { mp_edges->insert (edge); + if (mp_chained) { + mp_chained->put (edge); + } +} + +void EdgeToEdgeSetGenerator::put (const db::Edge &edge, int tag) +{ + if (m_tag == 0 || m_tag == tag) { + mp_edges->insert (edge); + } + if (mp_chained) { + mp_chained->put (edge, tag); + } } // ----------------------------------------------------------------------------------------------- diff --git a/src/db/db/dbLocalOperationUtils.h b/src/db/db/dbLocalOperationUtils.h index 4c9768271..c0cf44622 100644 --- a/src/db/db/dbLocalOperationUtils.h +++ b/src/db/db/dbLocalOperationUtils.h @@ -130,15 +130,22 @@ public: /** * @brief Constructor */ - EdgeToEdgeSetGenerator (std::unordered_set &edges); + EdgeToEdgeSetGenerator (std::unordered_set &edges, int tag = 0, EdgeToEdgeSetGenerator *chained = 0); /** * @brief Implementation of the PolygonSink interface */ virtual void put (const db::Edge &edge); + /** + * @brief Implementation of the PolygonSink interface + */ + virtual void put (const db::Edge &edge, int tag); + private: std::unordered_set *mp_edges; + int m_tag; + EdgeToEdgeSetGenerator *mp_chained; }; class DB_PUBLIC PolygonRefToShapesGenerator diff --git a/src/db/unit_tests/dbDeepEdgesTests.cc b/src/db/unit_tests/dbDeepEdgesTests.cc index 5c3ef9078..1faa78b88 100644 --- a/src/db/unit_tests/dbDeepEdgesTests.cc +++ b/src/db/unit_tests/dbDeepEdgesTests.cc @@ -590,3 +590,56 @@ TEST(10_PullInteracting) db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_edges_au10.gds"); } +TEST(11_SelectedInside) +{ + db::DeepShapeStore dss; + + db::Layout ly (0.001); + ly.add_cell ("TOP"); + unsigned int l1 = ly.insert_layer (); + unsigned int l2 = ly.insert_layer (); + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::Edges e; + e.insert (db::Edge (0, 0, 0, 1000)); + e.insert (db::Edge (100, 0, 100, 3000)); + e.insert (db::Edge (1100, -1000, 1100, 2000)); + e.insert (db::Edge (1200, -1000, 1200, 0)); + e.insert (db::Edge (1300, -800, 1300, -200)); + e.insert (db::Edge (1400, 1000, 1400, 1100)); + e.insert (db::Edge (1500, 1000, 1500, 2100)); + e.insert (db::Edge (1600, -800, 1600, -400)); + e.insert (db::Edge (1600, -400, 1600, -200)); + e.insert (db::Edge (1700, 1500, 1600, 2500)); + e.insert (db::Edge (1800, 2500, 1800, 3500)); + e.insert (db::Edge (-1500, 0, -1500, 1000)); + + // make deep + e.insert_into (&ly, top_cell.cell_index (), l1); + e = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + + db::Region r; + r.insert (db::Box (0, -1000, 2000, 0)); + r.insert (db::Box (1000, 1000, 2000, 2000)); + + // make deep + r.insert_into (&ly, top_cell.cell_index (), l2); + r = db::Region (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + + EXPECT_EQ (db::compare (e.selected_inside (db::Region ()), ""), true); + EXPECT_EQ (db::compare (e.selected_not_inside (db::Region ()), "(0,0;0,1000);(100,0;100,3000);(1100,-1000;1100,2000);(1200,-1000;1200,0);(1300,-800;1300,-200);(1400,1000;1400,1100);(1500,1000;1500,2100);(1600,-800;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_inside_differential (db::Region ()).first, ""), true); + EXPECT_EQ (db::compare (e.selected_inside_differential (db::Region ()).second, "(0,0;0,1000);(100,0;100,3000);(1100,-1000;1100,2000);(1200,-1000;1200,0);(1300,-800;1300,-200);(1400,1000;1400,1100);(1500,1000;1500,2100);(1600,-800;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (db::Edges ().selected_inside (r), ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_not_inside (r), ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_inside_differential (r).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_inside_differential (r).second, ""), true); + EXPECT_EQ (db::compare (e.selected_inside (r), "(1200,-1000;1200,0);(1300,-800;1300,-200);(1400,1000;1400,1100);(1600,-800;1600,-200)"), true); + EXPECT_EQ (db::compare (e.selected_not_inside (r), "(0,0;0,1000);(100,0;100,3000);(1100,-1000;1100,2000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_inside_differential (r).first, "(1200,-1000;1200,0);(1300,-800;1300,-200);(1400,1000;1400,1100);(1600,-800;1600,-200)"), true); + EXPECT_EQ (db::compare (e.selected_inside_differential (r).second, "(0,0;0,1000);(100,0;100,3000);(1100,-1000;1100,2000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); +} + +