From 5db45d7aeef8988260d48026aa84a5c2146fe8bf Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 27 Nov 2022 19:43:53 +0100 Subject: [PATCH] Proper setting of merged status after interacting/inside etc. --- src/db/db/dbAsIfFlatRegion.cc | 10 +++++----- src/db/db/dbDeepRegion.cc | 15 ++++++--------- src/db/unit_tests/dbDeepRegionTests.cc | 21 ++++++++++----------- 3 files changed, 21 insertions(+), 25 deletions(-) diff --git a/src/db/db/dbAsIfFlatRegion.cc b/src/db/db/dbAsIfFlatRegion.cc index c0a2896bc..842e55eba 100644 --- a/src/db/db/dbAsIfFlatRegion.cc +++ b/src/db/db/dbAsIfFlatRegion.cc @@ -434,7 +434,7 @@ AsIfFlatRegion::in_and_out_generic (const Region &other, InteractingOutputMode o std::pair AsIfFlatRegion::selected_interacting_generic (const Edges &other, InteractingOutputMode output_mode, size_t min_count, size_t max_count) const { - OutputPairHolder oph (output_mode, merged_semantics ()); + OutputPairHolder oph (output_mode, merged_semantics () || is_merged ()); if (output_mode == None) { return oph.region_pair (); @@ -485,7 +485,7 @@ AsIfFlatRegion::selected_interacting_generic (const Edges &other, InteractingOut std::pair AsIfFlatRegion::selected_interacting_generic (const Texts &other, InteractingOutputMode output_mode, size_t min_count, size_t max_count) const { - OutputPairHolder oph (output_mode, merged_semantics ()); + OutputPairHolder oph (output_mode, merged_semantics () || is_merged ()); if (output_mode == None) { return oph.region_pair (); @@ -531,7 +531,7 @@ AsIfFlatRegion::selected_interacting_generic (const Texts &other, InteractingOut std::pair AsIfFlatRegion::selected_interacting_generic (const Region &other, int mode, bool touching, InteractingOutputMode output_mode, size_t min_count, size_t max_count) const { - OutputPairHolder oph (output_mode, merged_semantics ()); + OutputPairHolder oph (output_mode, merged_semantics () || is_merged ()); if (output_mode == None) { return oph.region_pair (); @@ -611,7 +611,7 @@ AsIfFlatRegion::pull_generic (const Edges &other) const std::vector > others; others.push_back (other.begin_merged ()); - std::unique_ptr output (new FlatEdges (merged_semantics ())); + std::unique_ptr output (new FlatEdges (other.merged_semantics () || other.is_merged ())); std::vector results; results.push_back (&output->raw_edges ()); @@ -720,7 +720,7 @@ AsIfFlatRegion::pull_generic (const Region &other, int mode, bool touching) cons std::vector > others; others.push_back (other.begin_merged ()); - std::unique_ptr output (new FlatRegion (merged_semantics ())); + std::unique_ptr output (new FlatRegion (other.merged_semantics () || other.is_merged ())); std::vector results; results.push_back (&output->raw_polygons ()); diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index 3aae6b595..5a46e4e8d 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -1840,7 +1840,8 @@ DeepRegion::selected_interacting_generic (const Region &other, int mode, bool to const db::DeepLayer &polygons = merged_deep_layer (); // NOTE: on "inside" or with counting, the other polygons must be merged - const db::DeepLayer &other_polygons = (mode < 0 || counting) ? other_deep->merged_deep_layer () : other_deep->deep_layer (); + bool other_needs_merged = (mode < 0 || counting); + const db::DeepLayer &other_polygons = other_needs_merged ? other_deep->merged_deep_layer () : other_deep->deep_layer (); db::InteractingLocalOperation op (mode, touching, output_mode, min_count, max_count, true); @@ -1854,7 +1855,7 @@ DeepRegion::selected_interacting_generic (const Region &other, int mode, bool to proc.set_max_vertex_count (polygons.store ()->max_vertex_count ()); } - bool result_is_merged = (! split_after && ((mode < 0 && other.merged_semantics ()) || other.is_merged ()) && (merged_semantics () || is_merged ())); + bool result_is_merged = (! split_after && (merged_semantics () || is_merged ())); InteractingResultHolder orh (output_mode, result_is_merged, polygons); proc.run (&op, polygons.layer (), other_polygons.layer (), orh.layers ()); @@ -1892,7 +1893,7 @@ DeepRegion::selected_interacting_generic (const Edges &other, InteractingOutputM proc.set_max_vertex_count (polygons.store ()->max_vertex_count ()); } - bool result_is_merged = (! split_after && other.is_merged () && (merged_semantics () || is_merged ())); + bool result_is_merged = (! split_after && (merged_semantics () || is_merged ())); InteractingResultHolder orh (output_mode, result_is_merged, polygons); proc.run (&op, polygons.layer (), counting ? other_deep->merged_deep_layer ().layer () : other_deep->deep_layer ().layer (), orh.layers ()); @@ -1935,9 +1936,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 && ((mode < 0 && merged_semantics ()) || is_merged ()) && (other.merged_semantics () || other.is_merged ())) { - res->set_is_merged (true); - } + res->set_is_merged (! split_after && (other.merged_semantics () || other.is_merged ())); return res; } @@ -1998,9 +1997,7 @@ DeepRegion::pull_generic (const Texts &other) const proc.set_threads (polygons.store ()->threads ()); proc.run (&op, polygons.layer (), other_texts.layer (), dl_out.layer ()); - db::DeepTexts *res = new db::DeepTexts (dl_out); - res->set_is_merged (is_merged ()); - return res; + return new db::DeepTexts (dl_out); } diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index dfff18bf6..74590d2d0 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -880,8 +880,6 @@ TEST(14_Interacting) 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; @@ -947,12 +945,13 @@ TEST(14_Interacting) 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 (r2.selected_interacting (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); + EXPECT_EQ (r2r.selected_interacting (r1.merged ()).is_merged (), false); + EXPECT_EQ (r2.selected_interacting (r1r).is_merged (), true); + EXPECT_EQ (r2.selected_inside (r1).is_merged (), true); + EXPECT_EQ (r2r.selected_inside (r1).is_merged (), false); + EXPECT_EQ (r2.selected_inside (r1).is_merged (), true); CHECKPOINT(); db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au14a.gds"); @@ -976,8 +975,8 @@ TEST(14_Interacting) 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 (), false); - EXPECT_EQ (r6.selected_interacting (r1er).is_merged (), false); + EXPECT_EQ (r6.selected_interacting (r1e).is_merged (), true); + EXPECT_EQ (r6.selected_interacting (r1er).is_merged (), true); EXPECT_EQ (r6r.selected_interacting (r1e).is_merged (), false); EXPECT_EQ (r6r.selected_interacting (r1er).is_merged (), false); @@ -1499,8 +1498,8 @@ TEST(25_Pull) 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 (r6).is_merged (), true); + EXPECT_EQ (r2r.pull_interacting (r6).is_merged (), true); EXPECT_EQ (r2.pull_interacting (r6r).is_merged (), false); EXPECT_EQ (r2r.pull_interacting (r6r).is_merged (), false);