From f6f4dbeb671697bb4180aa347f51cb028ec8f5c1 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 27 Nov 2022 15:31:25 +0100 Subject: [PATCH] Edges#in/in_and_out: tests added --- src/db/db/dbAsIfFlatEdges.cc | 12 +++ src/db/db/dbRegionLocalOperations.cc | 2 +- src/db/unit_tests/dbDeepEdgesTests.cc | 110 ++++++++++++++++++++++++++ src/db/unit_tests/dbEdgesTests.cc | 36 +++++++++ testdata/algo/deep_edges_au20.gds | Bin 0 -> 29050 bytes 5 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 testdata/algo/deep_edges_au20.gds 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 0000000000000000000000000000000000000000..45fee953f694f1a2748ef8fb0729e3bfd3234b35 GIT binary patch literal 29050 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 literal 0 HcmV?d00001