pull_interacting for edges/edges and edges/regions, some enhancements and bug fixes

Bug fixes:
- use dist 1 to cover touching case properly in local processor
- handling of raw mode and is_merged state

Additional tests
This commit is contained in:
Matthias Koefferlein 2019-10-03 13:08:37 +02:00
parent 76b8bd3279
commit e1d77a1476
14 changed files with 362 additions and 39 deletions

View File

@ -1114,6 +1114,12 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
// touching is sufficient
return 1;
}
virtual void compute_local (db::Layout * /*layout*/, const shape_interactions<db::Edge, db::Edge> &interactions, std::unordered_set<db::Edge> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
db::box_scanner<db::Edge, size_t> scanner;
@ -1183,6 +1189,12 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
// touching is sufficient
return 1;
}
virtual void compute_local (db::Layout * /*layout*/, const shape_interactions<db::Edge, db::Edge> &interactions, std::unordered_set<db::Edge> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
db::box_scanner<db::Edge, size_t> scanner;
@ -1229,6 +1241,12 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
// touching is sufficient
return 1;
}
virtual void compute_local (db::Layout * /*layout*/, const shape_interactions<db::Edge, db::PolygonRef> &interactions, std::unordered_set<db::Edge> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
db::box_scanner2<db::Edge, size_t, db::Polygon, size_t> scanner;
@ -1319,6 +1337,12 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
// touching is sufficient
return 1;
}
virtual void compute_local (db::Layout *layout, const shape_interactions<db::Edge, db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
db::box_scanner2<db::Edge, size_t, db::Polygon, size_t> scanner;
@ -1448,7 +1472,7 @@ EdgesDelegate *DeepEdges::pull_generic (const Edges &other) const
}
const db::DeepLayer &edges = deep_layer ();
const db::DeepLayer &other_edges = merged_deep_layer ();
const db::DeepLayer &other_edges = other_deep->merged_deep_layer ();
DeepLayer dl_out (other_edges.derived ());

View File

@ -919,7 +919,7 @@ DeepRegion::edges (const EdgeFilterBase *filter) const
}
res->set_is_merged (true);
res->set_is_merged (merged_semantics () || is_merged ());
return res.release ();
}
@ -1282,7 +1282,7 @@ DeepRegion::sized (coord_type d, unsigned int mode) const
// in case of negative sizing the output polygons will still be merged (on positive sizing they might
// overlap after size and are not necessarily merged)
if (d < 0) {
if (d < 0 && (merged_semantics () || is_merged ())) {
res->set_is_merged (true);
}
@ -1367,7 +1367,7 @@ DeepRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const
// in case of negative sizing the output polygons will still be merged (on positive sizing they might
// overlap after size and are not necessarily merged)
if (dx < 0 && dy < 0) {
if (dx < 0 && dy < 0 && (merged_semantics () || is_merged ())) {
res->set_is_merged (true);
}
@ -1563,6 +1563,11 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
return m_touching ? 1 : 0;
}
virtual void compute_local (db::Layout * /*layout*/, const shape_interactions<db::PolygonRef, db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
m_ep.clear ();
@ -1641,6 +1646,11 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
return m_touching ? 1 : 0;
}
virtual void compute_local (db::Layout * /*layout*/, const shape_interactions<db::PolygonRef, db::PolygonRef> &interactions, std::unordered_set<db::PolygonRef> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
m_ep.clear ();
@ -1752,6 +1762,12 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
// touching is sufficient
return 1;
}
virtual void compute_local (db::Layout *layout, const shape_interactions<db::PolygonRef, db::Edge> &interactions, std::unordered_set<db::PolygonRef> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
m_scanner.clear ();
@ -1812,6 +1828,12 @@ public:
// .. nothing yet ..
}
virtual db::Coord dist () const
{
// touching is sufficient
return 1;
}
virtual void compute_local (db::Layout *, const shape_interactions<db::PolygonRef, db::Edge> &interactions, std::unordered_set<db::Edge> &result, size_t /*max_vertex_count*/, double /*area_ratio*/) const
{
m_scanner.clear ();
@ -1887,7 +1909,7 @@ DeepRegion::selected_interacting_generic (const Region &other, int mode, bool to
proc.run (&op, polygons.layer (), other_polygons.layer (), dl_out.layer ());
db::DeepRegion *res = new db::DeepRegion (dl_out);
if (! split_after) {
if (! split_after && ((mode < 0 && other.merged_semantics ()) || other.is_merged ()) && (merged_semantics () || is_merged ())) {
res->set_is_merged (true);
}
return res;
@ -1925,7 +1947,7 @@ DeepRegion::selected_interacting_generic (const Edges &other, bool inverse) cons
db::DeepRegion *res = new db::DeepRegion (dl_out);
if (! split_after) {
res->set_is_merged (true);
res->set_is_merged (other.is_merged () && (merged_semantics () || is_merged ()));
}
return res;
}
@ -1963,7 +1985,7 @@ DeepRegion::pull_generic (const Region &other, int mode, bool touching) const
proc.run (&op, polygons.layer (), other_polygons.layer (), dl_out.layer ());
db::DeepRegion *res = new db::DeepRegion (dl_out);
if (! split_after) {
if (! split_after && ((mode < 0 && merged_semantics ()) || is_merged ()) && (other.merged_semantics () || other.is_merged ())) {
res->set_is_merged (true);
}
return res;
@ -1994,7 +2016,7 @@ DeepRegion::pull_generic (const Edges &other) const
proc.run (&op, polygons.layer (), other_edges.layer (), dl_out.layer ());
db::DeepEdges *res = new db::DeepEdges (dl_out);
res->set_is_merged (true);
res->set_is_merged (is_merged () && (other.merged_semantics () || other.is_merged ()));
return res;
}

View File

@ -1620,6 +1620,7 @@ template class DB_PUBLIC local_processor<db::PolygonRef, db::Edge, db::Edge>;
template class DB_PUBLIC local_processor<db::PolygonRef, db::PolygonRef, db::EdgePair>;
template class DB_PUBLIC local_processor<db::Edge, db::Edge, db::Edge>;
template class DB_PUBLIC local_processor<db::Edge, db::PolygonRef, db::Edge>;
template class DB_PUBLIC local_processor<db::Edge, db::PolygonRef, db::PolygonRef>;
template class DB_PUBLIC local_processor<db::Edge, db::Edge, db::EdgePair>;
}

View File

@ -367,6 +367,20 @@ TEST(8_SelectInteracting)
db::Edges e2 = r2.edges ();
db::Edges e3 = r3.edges ();
db::Region r2f (db::RecursiveShapeIterator (ly, top_cell, l2));
db::Region r3f (db::RecursiveShapeIterator (ly, top_cell, l3));
db::Edges e2f = r2f.edges ();
db::Edges e3f = r3f.edges ();
db::Region r2r = r2;
r2r.set_merged_semantics (false);
db::Region r3r = r3;
r3r.set_merged_semantics (false);
db::Edges e2r = r2r.edges ();
e2r.set_merged_semantics (false);
db::Edges e3r = r3r.edges ();
e3r.set_merged_semantics (false);
db::Layout target;
unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));
@ -383,6 +397,46 @@ TEST(8_SelectInteracting)
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), e3.selected_interacting (r2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (23, 0)), e3.selected_not_interacting (r2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), e2.selected_interacting (e3f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), e2.selected_not_interacting (e3f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), e3.selected_interacting (e2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (33, 0)), e3.selected_not_interacting (e2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), e2.selected_interacting (r3f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), e2.selected_not_interacting (r3f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), e3.selected_interacting (r2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (43, 0)), e3.selected_not_interacting (r2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (50, 0)), e2r.selected_interacting (e3));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (51, 0)), e2r.selected_not_interacting (e3));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (52, 0)), e3r.selected_interacting (e2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (53, 0)), e3r.selected_not_interacting (e2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (60, 0)), e2r.selected_interacting (r3));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (61, 0)), e2r.selected_not_interacting (r3));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (62, 0)), e3r.selected_interacting (r2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (63, 0)), e3r.selected_not_interacting (r2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (70, 0)), e2.selected_interacting (e3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (71, 0)), e2.selected_not_interacting (e3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (72, 0)), e3.selected_interacting (e2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (73, 0)), e3.selected_not_interacting (e2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (80, 0)), e2.selected_interacting (r3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (81, 0)), e2.selected_not_interacting (r3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (82, 0)), e3.selected_interacting (r2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (83, 0)), e3.selected_not_interacting (r2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (90, 0)), e2r.selected_interacting (e3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (91, 0)), e2r.selected_not_interacting (e3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (92, 0)), e3r.selected_interacting (e2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (93, 0)), e3r.selected_not_interacting (e2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (100, 0)), e2r.selected_interacting (r3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (101, 0)), e2r.selected_not_interacting (r3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (102, 0)), e3r.selected_interacting (r2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (103, 0)), e3r.selected_not_interacting (r2r));
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_edges_au8.gds");
}
@ -435,3 +489,82 @@ TEST(9_DRCChecks)
}
}
TEST(10_PullInteracting)
{
db::Layout ly;
{
std::string fn (tl::testsrc ());
fn += "/testdata/algo/deep_region_l1.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 l2 = ly.get_layer (db::LayerProperties (2, 0));
unsigned int l3 = ly.get_layer (db::LayerProperties (3, 0));
db::Region r2 (db::RecursiveShapeIterator (ly, top_cell, l2), dss);
db::Region r2r = r2;
r2r.set_merged_semantics (false);
db::Region r2f (db::RecursiveShapeIterator (ly, top_cell, l2));
db::Region r3 (db::RecursiveShapeIterator (ly, top_cell, l3), dss);
db::Region r3r = r3;
r3r.set_merged_semantics (false);
db::Region r3f (db::RecursiveShapeIterator (ly, top_cell, l3));
db::Edges e2 = r2.edges ();
db::Edges e2r = r2r.edges ();
e2r.set_merged_semantics (false);
db::Edges e2f = r2f.edges ();
db::Edges e3 = r3.edges ();
db::Edges e3r = r3r.edges ();
e3r.set_merged_semantics (false);
db::Edges e3f = r3f.edges ();
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 (2, 0)), r2);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (3, 0)), r3);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), e2.pull_interacting (e3));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), e3.pull_interacting (e2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), e2.pull_interacting (e3f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), e3.pull_interacting (e2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), e2.pull_interacting (e3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (15, 0)), e3.pull_interacting (e2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (16, 0)), e2r.pull_interacting (e3));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (17, 0)), e3r.pull_interacting (e2));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (18, 0)), e2r.pull_interacting (e3r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (19, 0)), e3r.pull_interacting (e2r));
db::Region o;
e2.pull_interacting (o, r3);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), o);
e3.pull_interacting (o, r2);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), o);
e2.pull_interacting (o, r3f);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), o);
e3.pull_interacting (o, r2f);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (23, 0)), o);
e2.pull_interacting (o, r3r);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (24, 0)), o);
e3.pull_interacting (o, r2r);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (25, 0)), o);
e2r.pull_interacting (o, r3);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (26, 0)), o);
e3r.pull_interacting (o, r2);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (27, 0)), o);
e2r.pull_interacting (o, r3r);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (28, 0)), o);
e3r.pull_interacting (o, r2r);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (29, 0)), o);
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_edges_au10.gds");
}

View File

@ -784,6 +784,15 @@ TEST(14_Interacting)
db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss);
db::Region r2 (db::RecursiveShapeIterator (ly, top_cell, l2), dss);
db::Region r6 (db::RecursiveShapeIterator (ly, top_cell, l6), dss);
db::Region r1f (db::RecursiveShapeIterator (ly, top_cell, l1));
db::Region r2f (db::RecursiveShapeIterator (ly, top_cell, l2));
db::Region r6f (db::RecursiveShapeIterator (ly, top_cell, l6));
db::Region r1r = r1;
r1r.set_merged_semantics (false);
db::Region r2r = r2;
r2r.set_merged_semantics (false);
db::Region r6r = r6;
r6r.set_merged_semantics (false);
{
db::Layout target;
@ -807,13 +816,57 @@ TEST(14_Interacting)
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (26, 0)), r6.selected_overlapping (r1));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (27, 0)), r6.selected_not_overlapping (r1));
EXPECT_EQ (r2.selected_interacting (r1).is_merged (), true);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), r2.selected_interacting (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), r2.selected_not_interacting (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r2.selected_inside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (33, 0)), r2.selected_not_inside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (34, 0)), r2.selected_outside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (35, 0)), r2.selected_not_outside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (36, 0)), r2.selected_overlapping (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (37, 0)), r2.selected_not_overlapping (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), r6.selected_interacting (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), r6.selected_not_interacting (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), r6.selected_inside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (43, 0)), r6.selected_not_inside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (44, 0)), r6.selected_outside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (45, 0)), r6.selected_not_outside (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (46, 0)), r6.selected_overlapping (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (47, 0)), r6.selected_not_overlapping (r1f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (50, 0)), r2r.selected_interacting (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (51, 0)), r2r.selected_not_interacting (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (52, 0)), r2r.selected_inside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (53, 0)), r2r.selected_not_inside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (54, 0)), r2r.selected_outside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (55, 0)), r2r.selected_not_outside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (56, 0)), r2r.selected_overlapping (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (57, 0)), r2r.selected_not_overlapping (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (60, 0)), r6r.selected_interacting (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (61, 0)), r6r.selected_not_interacting (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (62, 0)), r6r.selected_inside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (63, 0)), r6r.selected_not_inside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (64, 0)), r6r.selected_outside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (65, 0)), r6r.selected_not_outside (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (66, 0)), r6r.selected_overlapping (r1r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (67, 0)), r6r.selected_not_overlapping (r1r));
EXPECT_EQ (r2.selected_interacting (r1).is_merged (), false);
EXPECT_EQ (r2.selected_interacting (r1.merged ()).is_merged (), true);
EXPECT_EQ (r2.selected_inside (r1).is_merged (), true);
EXPECT_EQ (r2r.selected_interacting (r1).is_merged (), false);
EXPECT_EQ (r2.selected_interacting (r1r).is_merged (), false);
EXPECT_EQ (r2r.selected_interacting (r1r).is_merged (), false);
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au14a.gds");
}
db::Edges r1e = r1.edges ();
db::Edges r1ef = r1f.edges ();
db::Edges r1er = r1r.edges ();
r1er.set_merged_semantics (false);
{
db::Layout target;
@ -823,8 +876,15 @@ TEST(14_Interacting)
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r1e);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r6.selected_interacting (r1e));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), r6.selected_not_interacting (r1e));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r6.selected_interacting (r1ef));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (23, 0)), r6.selected_not_interacting (r1ef));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r6r.selected_interacting (r1er));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (33, 0)), r6r.selected_not_interacting (r1er));
EXPECT_EQ (r6.selected_interacting (r1e).is_merged (), true);
EXPECT_EQ (r6.selected_interacting (r1er).is_merged (), false);
EXPECT_EQ (r6r.selected_interacting (r1e).is_merged (), false);
EXPECT_EQ (r6r.selected_interacting (r1er).is_merged (), false);
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au14b.gds");
@ -857,7 +917,6 @@ TEST(15_Filtered)
EXPECT_EQ (af1_filtered.is_merged (), true);
EXPECT_EQ (af1_else.is_merged (), true);
{
db::Layout target;
unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));
@ -1306,6 +1365,15 @@ TEST(25_Pull)
db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss);
db::Region r2 (db::RecursiveShapeIterator (ly, top_cell, l2), dss);
db::Region r6 (db::RecursiveShapeIterator (ly, top_cell, l6), dss);
db::Region r1f (db::RecursiveShapeIterator (ly, top_cell, l1));
db::Region r2f (db::RecursiveShapeIterator (ly, top_cell, l2));
db::Region r6f (db::RecursiveShapeIterator (ly, top_cell, l6));
db::Region r1r = r1;
r1r.set_merged_semantics (false);
db::Region r2r = r2;
r2r.set_merged_semantics (false);
db::Region r6r = r6;
r6r.set_merged_semantics (false);
{
db::Layout target;
@ -1319,13 +1387,41 @@ TEST(25_Pull)
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), r2.pull_inside (r6));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r2.pull_overlapping (r6));
EXPECT_EQ (r2.pull_interacting (r6).is_merged (), true);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), r1.pull_interacting (r2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), r1.pull_inside (r2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), r1.pull_overlapping (r2f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), r2.pull_interacting (r6f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), r2.pull_inside (r6f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), r2.pull_overlapping (r6f));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (50, 0)), r1r.pull_interacting (r2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (51, 0)), r1r.pull_inside (r2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (52, 0)), r1r.pull_overlapping (r2r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (60, 0)), r2r.pull_interacting (r6r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (61, 0)), r2r.pull_inside (r6r));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (62, 0)), r2r.pull_overlapping (r6r));
EXPECT_EQ (r2.pull_inside (r6).is_merged (), true);
EXPECT_EQ (r2.pull_interacting (r6).is_merged (), false);
EXPECT_EQ (r2r.pull_interacting (r6).is_merged (), false);
EXPECT_EQ (r2.pull_interacting (r6r).is_merged (), false);
EXPECT_EQ (r2r.pull_interacting (r6r).is_merged (), false);
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au25a.gds");
}
db::Edges r1e = r1.edges ();
db::Edges r1ef = r1f.edges ();
db::Edges r1er = r1r.edges ();
r1er.set_merged_semantics (false);
db::Edges r6e = r6.edges ();
db::Edges r6ef = r6f.edges ();
db::Edges r6er = r6r.edges ();
r6er.set_merged_semantics (false);
{
db::Layout target;
@ -1334,8 +1430,22 @@ TEST(25_Pull)
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r6);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r1e);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r6.pull_interacting (r1e));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), r6.pull_interacting (r1ef));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), r6r.pull_interacting (r1e));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (15, 0)), r6.pull_interacting (r1er));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (16, 0)), r6r.pull_interacting (r1er));
EXPECT_EQ (r6.pull_interacting (r1e).is_merged (), true);
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r1.pull_interacting (r6e));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (23, 0)), r1.pull_interacting (r6ef));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (24, 0)), r1r.pull_interacting (r6e));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (25, 0)), r1.pull_interacting (r6er));
target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (26, 0)), r1r.pull_interacting (r6er));
EXPECT_EQ (r6.pull_interacting (r1e).is_merged (), false);
EXPECT_EQ (r6.merged ().pull_interacting (r1e).is_merged (), true);
EXPECT_EQ (r6r.pull_interacting (r1er).is_merged (), false);
EXPECT_EQ (r6r.pull_interacting (r1e).is_merged (), false);
EXPECT_EQ (r6.pull_interacting (r1er).is_merged (), false);
CHECKPOINT();
db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au25b.gds");

View File

@ -854,8 +854,40 @@ TEST(22)
EXPECT_EQ ((e & ee).to_string (), "(400,0;-2000,0);(500,-174;400,0);(1000,0;900,-173);(4000,0;1000,0)");
}
// GitHub issue #72 (Edges/Region NOT issue)
TEST(23)
{
db::Edges e;
e.insert (db::Edge (db::Point (0, 0), db::Point (0, 200)));
e.insert (db::Edge (db::Point (250, 200), db::Point (300, 0)));
db::Edges e2;
e2.insert (db::Edge (db::Point (0, 100), db::Point (100, 100)));
EXPECT_EQ (e2.pull_interacting (e).to_string (), "(0,0;0,200)");
e2.clear ();
e2.insert (db::Edge (db::Point (0, 100), db::Point (0, 100)));
EXPECT_EQ (e2.pull_interacting (e).to_string (), "(0,0;0,200)");
e2.clear ();
e2.insert (db::Edge (db::Point (100, 0), db::Point (0, 0)));
EXPECT_EQ (e2.pull_interacting (e).to_string (), "(0,0;0,200)");
e2.clear ();
e2.insert (db::Edge (db::Point (-100, -1), db::Point (100, -1)));
EXPECT_EQ (e2.pull_interacting (e).to_string (), "");
e2.clear ();
e2.insert (db::Edge (db::Point (-100, 0), db::Point (100, 0)));
EXPECT_EQ (e2.pull_interacting (e).to_string (), "(0,0;0,200)");
}
// GitHub issue #72 (Edges/Region NOT issue)
TEST(100)
{
db::Edges e;
e.insert (db::Edge (0, 0, 0, 1000));

View File

@ -391,30 +391,6 @@ TEST(10c)
EXPECT_EQ (r.to_string (), "(-100,-100;-100,0;0,0;0,200;100,200;100,0;0,0;0,-100)");
}
TEST(10d)
{
db::Region r;
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (20, 20), db::Point (30, 30)))).to_string (), "");
r.insert (db::Box (db::Point (0, 0), db::Point (100, 200)));
r.insert (db::Box (db::Point (-100, -100), db::Point (0, 0)));
r.set_merged_semantics (true);
r.set_min_coherence (false);
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (20, 20), db::Point (30, 30)))).to_string (), "(20,20;20,30;30,30;30,20)");
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (-20, -20), db::Point (30, 30)))).to_string (), "(-20,-20;-20,30;30,30;30,-20)");
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (-200, -200), db::Point (-190, -190)))).to_string (), "");
r.clear ();
r.insert(db::Box (db::Point (1000, 0), db::Point (6000, 4000)));
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 4000), db::Point (2000, 6000)))).to_string (), "");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 4000), db::Point (2000, 6000))).pull_overlapping (r).to_string (), "");
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 4000), db::Point (1000, 6000)))).to_string (), "");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 4000), db::Point (1000, 6000))).pull_overlapping (r).to_string (), "");
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 4001), db::Point (2000, 6000)))).to_string (), "");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 4001), db::Point (2000, 6000))).pull_overlapping (r).to_string (), "");
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 3999), db::Point (1001, 6000)))).to_string (), "(0,3999;0,6000;1001,6000;1001,3999)");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 3999), db::Point (1001, 6000))).pull_overlapping (r).to_string (), "(1000,0;1000,4000;6000,4000;6000,0)");
}
TEST(11)
{
db::Box bb[3] = { db::Box (db::Point (0, 0), db::Point (10, 10)), db::Box (), db::Box (db::Point (20, 20), db::Point (40, 50)) };
@ -1391,6 +1367,30 @@ TEST(30c)
EXPECT_EQ (r.to_string (), "(-100,-100;-100,0;0,0;0,200;100,200;100,0;0,0;0,-100)");
}
TEST(31)
{
db::Region r;
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (20, 20), db::Point (30, 30)))).to_string (), "");
r.insert (db::Box (db::Point (0, 0), db::Point (100, 200)));
r.insert (db::Box (db::Point (-100, -100), db::Point (0, 0)));
r.set_merged_semantics (true);
r.set_min_coherence (false);
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (20, 20), db::Point (30, 30)))).to_string (), "(20,20;20,30;30,30;30,20)");
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (-20, -20), db::Point (30, 30)))).to_string (), "(-20,-20;-20,30;30,30;30,-20)");
EXPECT_EQ (r.pull_interacting (db::Region (db::Box (db::Point (-200, -200), db::Point (-190, -190)))).to_string (), "");
r.clear ();
r.insert(db::Box (db::Point (1000, 0), db::Point (6000, 4000)));
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 4000), db::Point (2000, 6000)))).to_string (), "");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 4000), db::Point (2000, 6000))).pull_overlapping (r).to_string (), "");
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 4000), db::Point (1000, 6000)))).to_string (), "");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 4000), db::Point (1000, 6000))).pull_overlapping (r).to_string (), "");
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 4001), db::Point (2000, 6000)))).to_string (), "");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 4001), db::Point (2000, 6000))).pull_overlapping (r).to_string (), "");
EXPECT_EQ (r.pull_overlapping (db::Region (db::Box (db::Point (0, 3999), db::Point (1001, 6000)))).to_string (), "(0,3999;0,6000;1001,6000;1001,3999)");
EXPECT_EQ (db::Region (db::Box (db::Point (0, 3999), db::Point (1001, 6000))).pull_overlapping (r).to_string (), "(1000,0;1000,4000;6000,4000;6000,0)");
}
TEST(100_Processors)
{
db::Region r;

View File

@ -1681,10 +1681,11 @@ CODE
%w(pull_interacting pull_overlapping pull_inside).each do |f|
eval <<"CODE"
def #{f}(other)
requires_region("#{f}")
if :#{f} != :pull_interacting
requires_same_type(other, "#{f}")
requires_region("#{f}")
other.requires_region("#{f}")
else
requires_edges_or_region("#{f}")
other.requires_edges_or_region("#{f}")
end
DRCLayer::new(@engine, @engine._tcmd(@data, 0, @data.class, :#{f}, other.data))

BIN
testdata/algo/deep_edges_au10.gds vendored Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
testdata/algo/deep_region_au25a.gds vendored Normal file

Binary file not shown.

BIN
testdata/algo/deep_region_au25b.gds vendored Normal file

Binary file not shown.