From 32928b583c459b78add9f9215e602df423095055 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Tue, 30 Aug 2022 22:12:30 +0200 Subject: [PATCH] Bug fixes (border cases), tests --- src/db/db/dbAsIfFlatEdges.cc | 6 +- src/db/db/dbDeepEdges.cc | 74 ++---- src/db/unit_tests/dbDeepEdgesTests.cc | 336 +++++++++++++++++++++++++- 3 files changed, 362 insertions(+), 54 deletions(-) diff --git a/src/db/db/dbAsIfFlatEdges.cc b/src/db/db/dbAsIfFlatEdges.cc index 0928e3fcb..e42d5c29b 100644 --- a/src/db/db/dbAsIfFlatEdges.cc +++ b/src/db/db/dbAsIfFlatEdges.cc @@ -803,10 +803,12 @@ AsIfFlatEdges::edge_region_op (const Region &other, db::EdgePolygonOp::mode_t mo { // shortcuts if (other.empty () || empty ()) { - if (mode != db::EdgePolygonOp::Outside) { + if (mode == db::EdgePolygonOp::Both) { return std::make_pair (new EmptyEdges (), clone ()); + } else if (mode == db::EdgePolygonOp::Inside) { + return std::make_pair (new EmptyEdges (), (EdgesDelegate *) 0); } else { - return std::make_pair (clone (), new EmptyEdges ()); + return std::make_pair (clone (), (EdgesDelegate *) 0); } } diff --git a/src/db/db/dbDeepEdges.cc b/src/db/db/dbDeepEdges.cc index f76a2d2b2..c1ca6f78b 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -830,8 +830,7 @@ EdgesDelegate *DeepEdges::intersections (const Edges &other) const if (empty () || other.empty ()) { - // Nothing to do - return new EmptyEdges (); + return clone (); } else if (! other_deep) { @@ -848,10 +847,14 @@ EdgesDelegate *DeepEdges::and_with (const Edges &other) const { const DeepEdges *other_deep = dynamic_cast (other.delegate ()); - if (empty () || other.empty ()) { + if (empty ()) { - // Nothing to do - return new EmptyEdges (); + return clone (); + + } else if (other.empty ()) { + + // NOTE: we do not use "EmptyEdges" as we want to maintain + return new DeepEdges (deep_layer ().derived ()); } else if (! other_deep) { @@ -868,14 +871,8 @@ EdgesDelegate *DeepEdges::not_with (const Edges &other) const { const DeepEdges *other_deep = dynamic_cast (other.delegate ()); - if (empty ()) { + if (empty () || other.empty ()) { - // Nothing to do - return new EmptyEdges (); - - } else if (other.empty ()) { - - // Nothing to do return clone (); } else if (! other_deep) { @@ -895,13 +892,12 @@ EdgesDelegate *DeepEdges::and_with (const Region &other) const if (empty ()) { - // Nothing to do - return new EmptyEdges (); + return clone (); } else if (other.empty ()) { - // Nothing to do - return clone (); + // NOTE: we do not use "EmptyEdges" as we want to maintain + return new DeepEdges (deep_layer ().derived ()); } else if (! other_deep) { @@ -920,13 +916,12 @@ std::pair DeepEdges::andnot_with (const Region if (empty ()) { - // Nothing to do - return std::make_pair (new EmptyEdges (), new EmptyEdges ()); + return std::make_pair (clone (), clone ()); } else if (other.empty ()) { - // Nothing to do - return std::make_pair (new EmptyEdges (), clone ()); + // NOTE: we do not use "EmptyEdges" as we want to maintain "deepness" + return std::make_pair (new DeepEdges (deep_layer ().derived ()), clone ()); } else if (! other_deep) { @@ -944,14 +939,8 @@ EdgesDelegate *DeepEdges::not_with (const Region &other) const { const DeepRegion *other_deep = dynamic_cast (other.delegate ()); - if (empty ()) { + if (empty () || other.empty ()) { - // Nothing to do - return new EmptyEdges (); - - } else if (other.empty ()) { - - // Nothing to do return clone (); } else if (! other_deep) { @@ -972,13 +961,12 @@ DeepEdges::andnot_with (const Edges &other) const if (empty ()) { - // Nothing to do - return std::make_pair (new EmptyEdges (), new EmptyEdges ()); + return std::make_pair (clone (), clone ()); } else if (other.empty ()) { - // Nothing to do - return std::make_pair (new EmptyEdges (), clone ()); + // NOTE: we do not use "EmptyEdges" as we want to maintain + return std::make_pair (new DeepEdges (deep_layer ().derived ()), clone ()); } else if (! other_deep) { @@ -998,12 +986,10 @@ EdgesDelegate *DeepEdges::xor_with (const Edges &other) const if (empty ()) { - // Nothing to do return other.delegate ()->clone (); } else if (other.empty ()) { - // Nothing to do return clone (); } else if (! other_deep) { @@ -1075,13 +1061,12 @@ EdgesDelegate *DeepEdges::inside_part (const Region &other) const if (empty ()) { - // Nothing to do - return new EmptyEdges (); + return clone (); } else if (other.empty ()) { - // Nothing to do - return clone (); + // NOTE: we do not use "EmptyEdges" as we want to maintain + return new DeepEdges (deep_layer ().derived ()); } else if (! other_deep) { @@ -1098,14 +1083,8 @@ EdgesDelegate *DeepEdges::outside_part (const Region &other) const { const DeepRegion *other_deep = dynamic_cast (other.delegate ()); - if (empty ()) { + if (empty () || other.empty ()) { - // Nothing to do - return new EmptyEdges (); - - } else if (other.empty ()) { - - // Nothing to do return clone (); } else if (! other_deep) { @@ -1125,13 +1104,12 @@ std::pair DeepEdges::inside_outside_part_pair if (empty ()) { - // Nothing to do - return std::make_pair (new EmptyEdges (), new EmptyEdges ()); + return std::make_pair (clone (), clone ()); } else if (other.empty ()) { - // Nothing to do - return std::make_pair (new EmptyEdges (), clone ()); + // NOTE: we do not use "EmptyEdges" as we want to maintain "deepness" + return std::make_pair (new DeepEdges (deep_layer ().derived ()), clone ()); } else if (! other_deep) { diff --git a/src/db/unit_tests/dbDeepEdgesTests.cc b/src/db/unit_tests/dbDeepEdgesTests.cc index 94ddbf425..05695fb03 100644 --- a/src/db/unit_tests/dbDeepEdgesTests.cc +++ b/src/db/unit_tests/dbDeepEdgesTests.cc @@ -616,7 +616,7 @@ TEST(11_SelectedInsideWithRegion) db::DeepShapeStore dss; - db::Layout ly (0.001); + db::Layout ly; ly.add_cell ("TOP"); unsigned int l1 = ly.insert_layer (); unsigned int l2 = ly.insert_layer (); @@ -684,7 +684,7 @@ TEST(12_SelectedInsideWithEdges) db::DeepShapeStore dss; - db::Layout ly (0.001); + db::Layout ly; ly.add_cell ("TOP"); unsigned int l1 = ly.insert_layer (); unsigned int l2 = ly.insert_layer (); @@ -748,7 +748,7 @@ TEST(13_SelectedOutsideWithRegion) db::DeepShapeStore dss; - db::Layout ly (0.001); + db::Layout ly; ly.add_cell ("TOP"); unsigned int l1 = ly.insert_layer (); unsigned int l2 = ly.insert_layer (); @@ -816,7 +816,7 @@ TEST(14_SelectedOutsideWithEdges) db::DeepShapeStore dss; - db::Layout ly (0.001); + db::Layout ly; ly.add_cell ("TOP"); unsigned int l1 = ly.insert_layer (); unsigned int l2 = ly.insert_layer (); @@ -854,3 +854,331 @@ TEST(14_SelectedOutsideWithEdges) EXPECT_EQ (db::compare (eflat.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); } +TEST(15_SelectedInteractingWithRegion) +{ + 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 (1900, 1000, 1900, 2000)); + e.insert (db::Edge (-1500, 0, -1500, 1000)); + + db::Region r; + r.insert (db::Box (0, -1000, 2000, 0)); + r.insert (db::Box (1000, 1000, 2000, 1500)); + r.insert (db::Box (1000, 1500, 2000, 2000)); + + // make deep + + db::DeepShapeStore dss; + + db::Layout ly; + 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); + + e.insert_into (&ly, top_cell.cell_index (), l1); + db::Edges eflat = e; + e = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + + r.insert_into (&ly, top_cell.cell_index (), l2); + db::Region rflat = r; + r = db::Region (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + + EXPECT_EQ (db::compare (e.selected_interacting (db::Region ()), ""), true); + EXPECT_EQ (db::compare (e.selected_not_interacting (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);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (db::Region ()).first, ""), true); + EXPECT_EQ (db::compare (e.selected_interacting_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);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (db::Edges ().selected_interacting (r), ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_not_interacting (r), ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_interacting_differential (r).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_interacting_differential (r).second, ""), true); + EXPECT_EQ (db::compare (e.selected_interacting (r), "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting (rflat), "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (eflat.selected_interacting (r), "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_not_interacting (r), "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_not_interacting (rflat), "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.selected_not_interacting (r), "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (r).first, "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (rflat).first, "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (eflat.selected_interacting_differential (r).first, "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (r).second, "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (rflat).second, "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.selected_interacting_differential (r).second, "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); +} + +TEST(16_SelectedInteractingWithEdges) +{ + 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 (1900, 1000, 1900, 2000)); + e.insert (db::Edge (-1500, 0, -1500, 1000)); + + db::Edges ee; + for (int i = 0; i <= 2000; i += 100) { + ee.insert (db::Edge (i, -1000, i, 0)); + } + for (int i = 1000; i <= 2000; i += 100) { + ee.insert (db::Edge (i, 1000, i, 1500)); + ee.insert (db::Edge (i, 1500, i, 2000)); + } + + // make deep + + db::DeepShapeStore dss; + + db::Layout ly; + 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); + + e.insert_into (&ly, top_cell.cell_index (), l1); + db::Edges eflat = e; + e = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + + ee.insert_into (&ly, top_cell.cell_index (), l2); + db::Edges eeflat = ee; + ee = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + + EXPECT_EQ (db::compare (e.selected_interacting (db::Edges ()), ""), true); + EXPECT_EQ (db::compare (e.selected_not_interacting (db::Edges ()), "(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);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (db::Edges ()).first, ""), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (db::Edges ()).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);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (db::Edges ().selected_interacting (ee), ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_not_interacting (ee), ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_interacting_differential (ee).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().selected_interacting_differential (ee).second, ""), true); + EXPECT_EQ (db::compare (e.selected_interacting (ee), "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting (eeflat), "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (eflat.selected_interacting (ee), "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_not_interacting (ee), "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_not_interacting (eeflat), "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.selected_not_interacting (ee), "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (ee).first, "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (eeflat).first, "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (eflat.selected_interacting_differential (ee).first, "(0,0;0,1000);(1100,-1000;1100,2000);(1300,-800;1300,-200);(1200,-1000;1200,0);(1400,1000;1400,1100);(1600,-800;1600,-200);(100,0;100,3000);(1500,1000;1500,2100);(1700,1500;1600,2500);(1900,1000;1900,2000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (ee).second, "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.selected_interacting_differential (eeflat).second, "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.selected_interacting_differential (ee).second, "(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); +} + +TEST(17_InsideOutside) +{ + 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 (1900, 1000, 1900, 2000)); + e.insert (db::Edge (-1500, 0, -1500, 1000)); + + db::Region r; + r.insert (db::Box (0, -1000, 2000, 0)); + r.insert (db::Box (1000, 1000, 2000, 1500)); + r.insert (db::Box (1000, 1500, 2000, 2000)); + + // make deep + + db::DeepShapeStore dss; + + db::Layout ly; + 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); + + e.insert_into (&ly, top_cell.cell_index (), l1); + db::Edges eflat = e; + e = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + + r.insert_into (&ly, top_cell.cell_index (), l2); + db::Region rflat = r; + r = db::Region (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + + EXPECT_EQ (db::compare (e.inside_part (db::Region ()), ""), true); + EXPECT_EQ (db::compare (e.outside_part (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,-400);(1600,-400;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.inside_outside_part (db::Region ()).first, ""), true); + EXPECT_EQ (db::compare (e.inside_outside_part (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,-400);(1600,-400;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (db::Edges ().inside_part (r), ""), true); + EXPECT_EQ (db::compare (db::Edges ().outside_part (r), ""), true); + EXPECT_EQ (db::compare (db::Edges ().inside_outside_part (r).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().inside_outside_part (r).second, ""), true); + EXPECT_EQ (db::compare (e.inside_part (r), "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.inside_part (rflat), "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (eflat.inside_part (r), "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.outside_part (r), "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.outside_part (rflat), "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.outside_part (r), "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.inside_outside_part (r).first, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.inside_outside_part (rflat).first, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (eflat.inside_outside_part (r).first, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.inside_outside_part (r).second, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.inside_outside_part (rflat).second, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.inside_outside_part (r).second, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); +} + +TEST(18_AndNotWithRegion) +{ + 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 (1900, 1000, 1900, 2000)); + e.insert (db::Edge (-1500, 0, -1500, 1000)); + + db::Region r; + r.insert (db::Box (0, -1000, 2000, 0)); + r.insert (db::Box (1000, 1000, 2000, 1500)); + r.insert (db::Box (1000, 1500, 2000, 2000)); + + // make deep + + db::DeepShapeStore dss; + + db::Layout ly; + 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); + + e.insert_into (&ly, top_cell.cell_index (), l1); + db::Edges eflat = e; + e = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + + r.insert_into (&ly, top_cell.cell_index (), l2); + db::Region rflat = r; + r = db::Region (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + + EXPECT_EQ (db::compare (e & db::Region (), ""), true); + EXPECT_EQ (db::compare (e - 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,-400);(1600,-400;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.andnot (db::Region ()).first, ""), true); + EXPECT_EQ (db::compare (e.andnot (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,-400);(1600,-400;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (db::Edges () & r, ""), true); + EXPECT_EQ (db::compare (db::Edges () - r, ""), true); + EXPECT_EQ (db::compare (db::Edges ().andnot (r).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().andnot (r).second, ""), true); + EXPECT_EQ (db::compare (e & r, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e & rflat, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (eflat & r, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e - r, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e - rflat, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat - r, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.andnot (r).first, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.andnot (rflat).first, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (eflat.andnot (r).first, "(1500,1500;1500,2000);(1100,1500;1100,2000);(1900,1000;1900,1500);(1900,1500;1900,2000);(1600,-800;1600,-400);(1500,1000;1500,1500);(1100,1000;1100,1500);(1600,-400;1600,-200);(1300,-800;1300,-200);(1700,1500;1650,2000);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.andnot (r).second, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.andnot (rflat).second, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (eflat.andnot (r).second, "(1650,2000;1600,2500);(1500,2000;1500,2100);(1100,0;1100,1000);(0,0;0,1000);(100,0;100,3000);(1800,2500;1800,3500);(-1500,0;-1500,1000)"), true); +} + +TEST(19_AndNotWithEdges) +{ + 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 (1900, 1000, 1900, 2000)); + e.insert (db::Edge (-1500, 0, -1500, 1000)); + + db::Edges ee; + for (int i = 0; i <= 2000; i += 100) { + ee.insert (db::Edge (i, -1000, i, 0)); + } + for (int i = 1000; i <= 2000; i += 100) { + ee.insert (db::Edge (i, 1000, i, 1500)); + ee.insert (db::Edge (i, 1500, i, 2000)); + } + + // make deep + + db::DeepShapeStore dss; + + db::Layout ly; + 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); + + e.insert_into (&ly, top_cell.cell_index (), l1); + db::Edges eflat = e; + e = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + + ee.insert_into (&ly, top_cell.cell_index (), l2); + db::Edges eeflat = ee; + ee = db::Edges (db::RecursiveShapeIterator (ly, top_cell, l2), dss); + + EXPECT_EQ (db::compare (e & db::Edges (), ""), true); + EXPECT_EQ (db::compare (e - db::Edges (), "(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,-400);(1600,-400;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (e.andnot (db::Edges ()).first, ""), true); + EXPECT_EQ (db::compare (e.andnot (db::Edges ()).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,-400);(1600,-400;1600,-200);(1700,1500;1600,2500);(1800,2500;1800,3500);(1900,1000;1900,2000);(-1500,0;-1500,1000)"), true); + EXPECT_EQ (db::compare (db::Edges () & ee, ""), true); + EXPECT_EQ (db::compare (db::Edges () - ee, ""), true); + EXPECT_EQ (db::compare (db::Edges ().andnot (ee).first, ""), true); + EXPECT_EQ (db::compare (db::Edges ().andnot (ee).second, ""), true); + EXPECT_EQ (db::compare (e & ee, "(1500,1000;1500,2000);(1900,1000;1900,2000);(1600,-800;1600,-200);(1100,1000;1100,2000);(1300,-800;1300,-200);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e & eeflat, "(1500,1000;1500,2000);(1900,1000;1900,2000);(1600,-800;1600,-200);(1100,1000;1100,2000);(1300,-800;1300,-200);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (eflat & ee, "(1500,1000;1500,2000);(1900,1000;1900,2000);(1600,-800;1600,-200);(1100,1000;1100,2000);(1300,-800;1300,-200);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e - ee, "(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); + EXPECT_EQ (db::compare (e - eeflat, "(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); + EXPECT_EQ (db::compare (eflat - ee, "(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); + EXPECT_EQ (db::compare (e.andnot (ee).first, "(1500,1000;1500,2000);(1900,1000;1900,2000);(1600,-800;1600,-200);(1100,1000;1100,2000);(1300,-800;1300,-200);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.andnot (eeflat).first, "(1500,1000;1500,2000);(1900,1000;1900,2000);(1600,-800;1600,-200);(1100,1000;1100,2000);(1300,-800;1300,-200);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (eflat.andnot (ee).first, "(1500,1000;1500,2000);(1900,1000;1900,2000);(1600,-800;1600,-200);(1100,1000;1100,2000);(1300,-800;1300,-200);(1100,-1000;1100,0);(1200,-1000;1200,0);(1400,1000;1400,1100)"), true); + EXPECT_EQ (db::compare (e.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); + EXPECT_EQ (db::compare (e.andnot (eeflat).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); + 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); +} +