Edges#in/in_and_out: tests added

This commit is contained in:
Matthias Koefferlein 2022-11-27 15:31:25 +01:00
parent 0304930136
commit f6f4dbeb67
5 changed files with 159 additions and 1 deletions

View File

@ -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 <db::Edge> 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<EdgesDelegate *, EdgesDelegate *>
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 <db::Edge> op;
for (EdgesIterator o (other.begin_merged ()); ! o.at_end (); ++o) {
op.insert (*o);

View File

@ -925,7 +925,7 @@ contained_local_operation<TS, TI, TR>::contained_local_operation (InteractingOut
template <class TS, class TI, class TR>
db::Coord contained_local_operation<TS, TI, TR>::dist () const
{
return 0;
return 1; // touching included for degenerated polygons and edges
}
template <class TS, class TI, class TR>

View File

@ -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");
}

View File

@ -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)
{

BIN
testdata/algo/deep_edges_au20.gds vendored Normal file

Binary file not shown.