From fc787b19e39692828aa72d7425893f72deb6c54f Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 6 Mar 2024 18:46:52 +0100 Subject: [PATCH] Flat edge booleans enhancements - Basic support for dots (only dots-vs.-dots) - Some shortcuts for efficiency --- src/db/db/dbAsIfFlatEdges.cc | 172 +++++++++++++++++++++++++- src/db/db/dbAsIfFlatEdges.h | 50 ++------ src/db/db/dbEdgeBoolean.h | 7 -- src/db/unit_tests/dbEdgesTests.cc | 97 +++++++++++++++ testdata/algo/deep_edges_au3_flat.gds | Bin 0 -> 294668 bytes 5 files changed, 277 insertions(+), 49 deletions(-) create mode 100644 testdata/algo/deep_edges_au3_flat.gds diff --git a/src/db/db/dbAsIfFlatEdges.cc b/src/db/db/dbAsIfFlatEdges.cc index 797ca73d2..57b3fc2a7 100644 --- a/src/db/db/dbAsIfFlatEdges.cc +++ b/src/db/db/dbAsIfFlatEdges.cc @@ -757,9 +757,123 @@ AsIfFlatEdges::run_check (db::edge_relation_type rel, const Edges *other, db::Co return result.release (); } +EdgesDelegate * +AsIfFlatEdges::merged () const +{ + if (empty ()) { + return new db::EmptyEdges (); + } else { + return boolean (0, EdgeOr); + } +} + +EdgesDelegate * +AsIfFlatEdges::and_with (const Edges &other) const +{ + if (empty () || other.empty ()) { + return new db::EmptyEdges (); + } else { + return boolean (&other, EdgeAnd); + } +} + +EdgesDelegate * +AsIfFlatEdges::not_with (const Edges &other) const +{ + if (empty ()) { + return new db::EmptyEdges (); + } else if (other.empty ()) { + return clone (); + } else { + return boolean (&other, EdgeNot); + } +} + +std::pair +AsIfFlatEdges::andnot_with (const Edges &other) const +{ + if (empty ()) { + return std::make_pair (new db::EmptyEdges (), new db::EmptyEdges ()); + } else if (other.empty ()) { + return std::make_pair (new db::EmptyEdges (), clone ()); + } else { + return boolean_andnot (&other); + } +} + +EdgesDelegate * +AsIfFlatEdges::and_with (const Region &other) const +{ + if (empty () || other.empty ()) { + return new db::EmptyEdges (); + } else { + return edge_region_op (other, db::EdgePolygonOp::Inside, true /*include borders*/).first; + } +} + +EdgesDelegate * +AsIfFlatEdges::not_with (const Region &other) const +{ + if (empty ()) { + return new db::EmptyEdges (); + } else if (other.empty ()) { + return clone (); + } else { + return edge_region_op (other, db::EdgePolygonOp::Outside, true /*include borders*/).first; + } +} + +std::pair +AsIfFlatEdges::andnot_with (const Region &other) const +{ + if (empty ()) { + return std::make_pair (new db::EmptyEdges (), new db::EmptyEdges ()); + } else if (other.empty ()) { + return std::make_pair (new db::EmptyEdges (), clone ()); + } else { + return edge_region_op (other, db::EdgePolygonOp::Both, true /*include borders*/); + } +} + +EdgesDelegate * +AsIfFlatEdges::xor_with (const Edges &other) const +{ + if (empty ()) { + return other.delegate ()->clone (); + } else if (other.empty ()) { + return clone (); + } else { + return boolean (&other, EdgeXor); + } +} + +EdgesDelegate * +AsIfFlatEdges::or_with (const Edges &other) const +{ + if (empty ()) { + return other.delegate ()->clone (); + } else if (other.empty ()) { + return clone (); + } else { + return boolean (&other, EdgeOr); + } +} + +EdgesDelegate * +AsIfFlatEdges::intersections (const Edges &other) const +{ + if (empty () || other.empty ()) { + return new db::EmptyEdges (); + } else { + return boolean (&other, EdgeIntersections); + } +} + EdgesDelegate * AsIfFlatEdges::boolean (const Edges *other, EdgeBoolOp op) const { + std::set dots, other_dots; + std::unique_ptr output (new FlatEdges (true)); EdgeBooleanClusterCollectorToShapes cluster_collector (&output->raw_edges (), op); @@ -769,8 +883,10 @@ AsIfFlatEdges::boolean (const Edges *other, EdgeBoolOp op) const AddressableEdgeDelivery e (begin ()); for ( ; ! e.at_end (); ++e) { - if (! e->is_degenerate ()) { + if (op == EdgeIntersections || ! e->is_degenerate ()) { scanner.insert (e.operator-> (), 0); + } else if (op != EdgeOr) { + dots.insert (*e); } } @@ -779,20 +895,58 @@ AsIfFlatEdges::boolean (const Edges *other, EdgeBoolOp op) const if (other) { ee = other->addressable_edges (); for ( ; ! ee.at_end (); ++ee) { - if (! ee->is_degenerate ()) { + if (op == EdgeIntersections || ! ee->is_degenerate ()) { scanner.insert (ee.operator-> (), 1); + } else if (op != EdgeOr) { + other_dots.insert (*ee); } } } scanner.process (cluster_collector, 1, db::box_convert ()); + // process dots + // NOTE: currently, dots vs. dots is supported, but not dots vs. edges + if (op == EdgeOr) { + for (auto i = dots.begin (); i != dots.end (); ++i) { + output->insert (*i); + } + for (auto i = other_dots.begin (); i != other_dots.end (); ++i) { + output->insert (*i); + } + } else if (op == EdgeNot) { + for (auto i = dots.begin (); i != dots.end (); ++i) { + if (other_dots.find (*i) == other_dots.end ()) { + output->insert (*i); + } + } + } else if (op == EdgeXor) { + for (auto i = dots.begin (); i != dots.end (); ++i) { + if (other_dots.find (*i) == other_dots.end ()) { + output->insert (*i); + } + } + for (auto i = other_dots.begin (); i != other_dots.end (); ++i) { + if (dots.find (*i) == dots.end ()) { + output->insert (*i); + } + } + } else if (op == EdgeAnd) { + for (auto i = dots.begin (); i != dots.end (); ++i) { + if (other_dots.find (*i) != other_dots.end ()) { + output->insert (*i); + } + } + } + return output.release (); } std::pair AsIfFlatEdges::boolean_andnot (const Edges *other) const { + std::set dots, other_dots; + std::unique_ptr output (new FlatEdges (true)); std::unique_ptr output2 (new FlatEdges (true)); EdgeBooleanClusterCollectorToShapes cluster_collector (&output->raw_edges (), EdgeAndNot, &output2->raw_edges ()); @@ -805,6 +959,8 @@ AsIfFlatEdges::boolean_andnot (const Edges *other) const for ( ; ! e.at_end (); ++e) { if (! e->is_degenerate ()) { scanner.insert (e.operator-> (), 0); + } else { + dots.insert (*e); } } @@ -815,12 +971,24 @@ AsIfFlatEdges::boolean_andnot (const Edges *other) const for ( ; ! ee.at_end (); ++ee) { if (! ee->is_degenerate ()) { scanner.insert (ee.operator-> (), 1); + } else { + other_dots.insert (*ee); } } } scanner.process (cluster_collector, 1, db::box_convert ()); + // process dots + // NOTE: currently, dots vs. dots is supported, but not dots vs. edges + for (auto i = dots.begin (); i != dots.end (); ++i) { + if (other_dots.find (*i) == other_dots.end ()) { + output2->insert (*i); + } else { + output->insert (*i); + } + } + return std::make_pair (output.release (), output2.release ()); } diff --git a/src/db/db/dbAsIfFlatEdges.h b/src/db/db/dbAsIfFlatEdges.h index fbdd7064e..fd07227ef 100644 --- a/src/db/db/dbAsIfFlatEdges.h +++ b/src/db/db/dbAsIfFlatEdges.h @@ -107,55 +107,25 @@ public: return merged (); } - virtual EdgesDelegate *merged () const - { - return boolean (0, EdgeOr); - } + virtual EdgesDelegate *merged () const; - virtual EdgesDelegate *and_with (const Edges &other) const - { - return boolean (&other, EdgeAnd); - } + virtual EdgesDelegate *and_with (const Edges &other) const; - virtual EdgesDelegate *not_with (const Edges &other) const - { - return boolean (&other, EdgeNot); - } + virtual EdgesDelegate *not_with (const Edges &other) const; - virtual std::pair andnot_with (const Edges &other) const - { - return boolean_andnot (&other); - } + virtual std::pair andnot_with (const Edges &other) const; - virtual EdgesDelegate *and_with (const Region &other) const - { - return edge_region_op (other, db::EdgePolygonOp::Inside, true /*include borders*/).first; - } + virtual EdgesDelegate *and_with (const Region &other) const; - virtual EdgesDelegate *not_with (const Region &other) const - { - return edge_region_op (other, db::EdgePolygonOp::Outside, true /*include borders*/).first; - } + virtual EdgesDelegate *not_with (const Region &other) const; - virtual std::pair andnot_with (const Region &other) const - { - return edge_region_op (other, db::EdgePolygonOp::Both, true /*include borders*/); - } + virtual std::pair andnot_with (const Region &other) const; - virtual EdgesDelegate *xor_with (const Edges &other) const - { - return boolean (&other, EdgeXor); - } + virtual EdgesDelegate *xor_with (const Edges &other) const; - virtual EdgesDelegate *or_with (const Edges &other) const - { - return boolean (&other, EdgeOr); - } + virtual EdgesDelegate *or_with (const Edges &other) const; - virtual EdgesDelegate *intersections (const Edges &other) const - { - return boolean (&other, EdgeIntersections); - } + virtual EdgesDelegate *intersections (const Edges &other) const; virtual EdgesDelegate *add_in_place (const Edges &other) { diff --git a/src/db/db/dbEdgeBoolean.h b/src/db/db/dbEdgeBoolean.h index 0c35670c4..1a7050c07 100644 --- a/src/db/db/dbEdgeBoolean.h +++ b/src/db/db/dbEdgeBoolean.h @@ -272,13 +272,6 @@ struct EdgeBooleanClusterCollector // .. nothing yet .. } - EdgeBooleanClusterCollector (OutputContainer *output, OutputContainer *intersections, EdgeBoolOp op) - : db::cluster_collector > (EdgeBooleanCluster (output, op), op != EdgeAnd /*report single*/), - mp_output (output), mp_intersections (intersections) - { - // .. nothing yet .. - } - void add (const db::Edge *o1, size_t p1, const db::Edge *o2, size_t p2) { // Select edges which are: diff --git a/src/db/unit_tests/dbEdgesTests.cc b/src/db/unit_tests/dbEdgesTests.cc index 8b6d5e509..c5e0754cf 100644 --- a/src/db/unit_tests/dbEdgesTests.cc +++ b/src/db/unit_tests/dbEdgesTests.cc @@ -22,12 +22,14 @@ #include "tlUnitTest.h" +#include "tlStream.h" #include "dbEdges.h" #include "dbEdgesUtils.h" #include "dbPolygonTools.h" #include "dbRegion.h" #include "dbTestSupport.h" +#include "dbReader.h" #include @@ -1255,6 +1257,101 @@ TEST(30) EXPECT_EQ (e.selected_interacting_differential (r2, size_t (2), size_t(3)).second.to_string (), "(0,0;200,0)"); } +// borrowed from deep edges tests +TEST(31) +{ + db::Layout ly; + { + std::string fn (tl::testdata ()); + fn += "/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); + + unsigned int l2 = ly.get_layer (db::LayerProperties (2, 0)); + unsigned int l3 = ly.get_layer (db::LayerProperties (3, 0)); + unsigned int lempty = ly.insert_layer (); + + db::Region r2 (db::RecursiveShapeIterator (ly, top_cell, l2)); + db::Region r3 (db::RecursiveShapeIterator (ly, top_cell, l3)); + db::Region r2and3 = r2 & r3; + + db::Edges e2 = r2.edges (); + db::Edges e3 = r3.edges (); + db::Edges e3copy = r3.edges (); + db::Edges e2and3 = r2and3.edges (); + db::Edges eempty (db::RecursiveShapeIterator (ly, top_cell, lempty)); + db::Edges edots = e2and3.processed (db::EdgeSegmentSelector (-1, 0, 0)); + db::Edges edotscopy = e2and3.processed (db::EdgeSegmentSelector (-1, 0, 0)); + + 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)), e3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), edots); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), edots.merged ()); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), e3 & e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), e3 & edots); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), e3 & eempty); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (23, 0)), e3 & e3copy); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (24, 0)), eempty & e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (25, 0)), edots & edotscopy); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (26, 0)), edots & e2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (30, 0)), e3 - e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (31, 0)), e3 - edots); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (32, 0)), e3 - eempty); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (33, 0)), e3 - e3copy); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (34, 0)), eempty - e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (35, 0)), edots - edotscopy); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (36, 0)), edots - e2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (40, 0)), e3 ^ e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (41, 0)), e3 ^ edots); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (42, 0)), e3 ^ eempty); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (43, 0)), e3 ^ e3copy); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (44, 0)), eempty ^ e2and3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (45, 0)), edots ^ edotscopy); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (46, 0)), edots ^ e2); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (50, 0)), e3.andnot(e2and3).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (51, 0)), e3.andnot(edots).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (52, 0)), e3.andnot(eempty).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (53, 0)), e3.andnot(e3copy).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (54, 0)), eempty.andnot(e2and3).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (55, 0)), edots.andnot(edotscopy).first); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (56, 0)), edots.andnot(e2).first); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (60, 0)), e3.andnot(e2and3).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (61, 0)), e3.andnot(edots).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (62, 0)), e3.andnot(eempty).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (63, 0)), e3.andnot(e3copy).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (64, 0)), eempty.andnot(e2and3).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (65, 0)), edots.andnot(edotscopy).second); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (66, 0)), edots.andnot(e2).second); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (70, 0)), e3.intersections(e2and3)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (71, 0)), e3.intersections(edots)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (72, 0)), e3.intersections(eempty)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (73, 0)), e3.intersections(e3copy)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (74, 0)), eempty.intersections(e2and3)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (75, 0)), edots.intersections(edotscopy)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (76, 0)), edots.intersections(e2)); + // test, whether dots are not merged + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (77, 0)), edots.intersections(e2).select_interacting(e2)); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_edges_au3_flat.gds"); +} + // GitHub issue #72 (Edges/Region NOT issue) TEST(100) { diff --git a/testdata/algo/deep_edges_au3_flat.gds b/testdata/algo/deep_edges_au3_flat.gds new file mode 100644 index 0000000000000000000000000000000000000000..b2e385c13147cc8d1422701555843a4a31d83070 GIT binary patch literal 294668 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 literal 0 HcmV?d00001