diff --git a/src/db/db/dbAsIfFlatEdges.cc b/src/db/db/dbAsIfFlatEdges.cc index fc505a457..fc8cab428 100644 --- a/src/db/db/dbAsIfFlatEdges.cc +++ b/src/db/db/dbAsIfFlatEdges.cc @@ -514,6 +514,12 @@ AsIfFlatEdges::extended (coord_type ext_b, coord_type ext_e, coord_type ext_o, c EdgesDelegate * AsIfFlatEdges::in (const Edges &other, bool invert) const { + if (other.empty ()) { + return invert ? clone () : new EmptyEdges (); + } else if (empty ()) { + return new EmptyEdges (); + } + std::set op; for (EdgesIterator o (other.begin_merged ()); ! o.at_end (); ++o) { op.insert (*o); @@ -533,6 +539,12 @@ AsIfFlatEdges::in (const Edges &other, bool invert) const std::pair AsIfFlatEdges::in_and_out (const Edges &other) const { + if (other.empty ()) { + return std::make_pair (new EmptyEdges (), clone ()); + } else if (empty ()) { + return std::make_pair (new EmptyEdges (), new EmptyEdges ()); + } + std::set op; for (EdgesIterator o (other.begin_merged ()); ! o.at_end (); ++o) { op.insert (*o); diff --git a/src/db/db/dbRegionLocalOperations.cc b/src/db/db/dbRegionLocalOperations.cc index 501d534f5..f1d543a62 100644 --- a/src/db/db/dbRegionLocalOperations.cc +++ b/src/db/db/dbRegionLocalOperations.cc @@ -925,7 +925,7 @@ contained_local_operation::contained_local_operation (InteractingOut template db::Coord contained_local_operation::dist () const { - return 0; + return 1; // touching included for degenerated polygons and edges } template diff --git a/src/db/unit_tests/dbDeepEdgesTests.cc b/src/db/unit_tests/dbDeepEdgesTests.cc index 05695fb03..5149ce316 100644 --- a/src/db/unit_tests/dbDeepEdgesTests.cc +++ b/src/db/unit_tests/dbDeepEdgesTests.cc @@ -1182,3 +1182,113 @@ TEST(19_AndNotWithEdges) EXPECT_EQ (db::compare (eflat.andnot (ee).second, "(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000);(1700,1500;1600,2500)"), true); } +TEST(20_in) +{ + db::Layout ly; + { + std::string fn (tl::testdata ()); + fn += "/algo/deep_region_l31.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::DeepShapeStore dss; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + unsigned int l3 = ly.get_layer (db::LayerProperties (3, 0)); // empty + + db::Edges e1 = db::Edges ((db::Region (db::RecursiveShapeIterator (ly, top_cell, l1), dss)).edges ()); + db::Edges e2 = db::Edges ((db::Region (db::RecursiveShapeIterator (ly, top_cell, l2), dss)).edges ()); + db::Edges e3 = db::Edges ((db::Region (db::RecursiveShapeIterator (ly, top_cell, l3), dss)).edges ()); + + db::Edges e1r = e1; + e1r.set_merged_semantics (false); + db::Edges e2r = e2; + e2r.set_merged_semantics (false); + + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), e1); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), e2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), e2.in (e1)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), e2.in (e1, true)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), e2.in (e3)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), e2.in (e3, true)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), e3.in (e1)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (15, 0)), e3.in (e1, true)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), e2r.in (e1)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), e2r.in (e1, true)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), e2.in (e1r)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), e2.in (e1r, true)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), e2r.in (e1r)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), e2r.in (e1r, true)); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_edges_au20.gds"); +} + +TEST(20_in_and_out) +{ + db::Layout ly; + { + std::string fn (tl::testdata ()); + fn += "/algo/deep_region_l31.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::DeepShapeStore dss; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + unsigned int l3 = ly.get_layer (db::LayerProperties (3, 0)); // empty + + db::Edges e1 = db::Edges ((db::Region (db::RecursiveShapeIterator (ly, top_cell, l1), dss)).edges ()); + db::Edges e2 = db::Edges ((db::Region (db::RecursiveShapeIterator (ly, top_cell, l2), dss)).edges ()); + db::Edges e3 = db::Edges ((db::Region (db::RecursiveShapeIterator (ly, top_cell, l3), dss)).edges ()); + + db::Edges e1r = e1; + e1r.set_merged_semantics (false); + db::Edges e2r = e2; + e2r.set_merged_semantics (false); + + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), e1); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (2, 0)), e2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), e2.in_and_out (e1).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), e2.in_and_out (e1).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), e2.in_and_out (e3).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), e2.in_and_out (e3).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), e3.in_and_out (e1).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (15, 0)), e3.in_and_out (e1).second); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), e2r.in_and_out (e1).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), e2r.in_and_out (e1).second); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), e2.in_and_out (e1r).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), e2.in_and_out (e1r).second); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), e2r.in_and_out (e1r).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), e2r.in_and_out (e1r).second); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_edges_au20.gds"); +} + diff --git a/src/db/unit_tests/dbEdgesTests.cc b/src/db/unit_tests/dbEdgesTests.cc index 96d2d4068..7f7fac46b 100644 --- a/src/db/unit_tests/dbEdgesTests.cc +++ b/src/db/unit_tests/dbEdgesTests.cc @@ -1121,6 +1121,42 @@ TEST(27) EXPECT_EQ (db::compare (e.selected_outside_differential (ee).second, "(1100,-1000;1100,2000);(1200,-1000;1200,0);(1300,-800;1300,-200);(1400,1000;1400,1100);(1500,1000;1500,2100);(1600,-800;1600,-200);(1900,1000;1900,2000)"), true); } +// Edges::in and Edges:in_and_out +TEST(28) +{ + db::Edges e; + e.insert (db::Edge (0, 0, 0, 1000)); + e.insert (db::Edge (0, 1000, 0, 2000)); + e.insert (db::Edge (100, 0, 100, 1000)); + + db::Edges ee; + ee.insert (db::Edge (0, 0, 0, 2000)); + ee.insert (db::Edge (100, 1000, 0, 2000)); + ee.insert (db::Edge (100, 0, 100, 1000)); + + EXPECT_EQ (db::compare (e.in (db::Edges ()), ""), true); + EXPECT_EQ (db::compare (e.in (db::Edges (), true), "(0,0;0,1000);(0,1000;0,2000);(100,0;100,1000)"), true); + EXPECT_EQ (db::compare (e.in_and_out (db::Edges ()).first, ""), true); + EXPECT_EQ (db::compare (e.in_and_out (db::Edges ()).second, "(0,0;0,1000);(0,1000;0,2000);(100,0;100,1000)"), true); + EXPECT_EQ (db::compare (db::Edges ().in (ee), ""), true); + EXPECT_EQ (db::compare (db::Edges ().in (ee, true), ""), true); + EXPECT_EQ (db::compare (db::Edges ().in_and_out (ee).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().in_and_out (ee).second, ""), true); + EXPECT_EQ (db::compare (e.in (ee), "(0,0;0,2000);(100,0;100,1000)"), true); + EXPECT_EQ (db::compare (e.in (ee, true), ""), true); + EXPECT_EQ (db::compare (e.in_and_out (ee).first, "(0,0;0,2000);(100,0;100,1000)"), true); + EXPECT_EQ (db::compare (e.in_and_out (ee).second, ""), true); + EXPECT_EQ (db::compare (ee.in (e, true), "(100,1000;0,2000)"), true); + EXPECT_EQ (db::compare (ee.in_and_out (e).second, "(100,1000;0,2000)"), true); + + e.set_merged_semantics (false); + ee.set_merged_semantics (false); + + EXPECT_EQ (db::compare (e.in (ee), "(100,0;100,1000)"), true); + EXPECT_EQ (db::compare (e.in (ee, true), "(0,0;0,1000);(0,1000;0,2000)"), true); + EXPECT_EQ (db::compare (ee.in (e, true), "(0,0;0,2000);(100,1000;0,2000)"), true); +} + // GitHub issue #72 (Edges/Region NOT issue) TEST(100) { diff --git a/testdata/algo/deep_edges_au20.gds b/testdata/algo/deep_edges_au20.gds new file mode 100644 index 000000000..45fee953f Binary files /dev/null and b/testdata/algo/deep_edges_au20.gds differ