Proper setting of merged status after interacting/inside etc.

This commit is contained in:
Matthias Koefferlein 2022-11-27 19:43:53 +01:00
parent d76eef10af
commit 5db45d7aee
3 changed files with 21 additions and 25 deletions

View File

@ -434,7 +434,7 @@ AsIfFlatRegion::in_and_out_generic (const Region &other, InteractingOutputMode o
std::pair<RegionDelegate *, RegionDelegate *>
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<RegionDelegate *, RegionDelegate *>
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<RegionDelegate *, RegionDelegate *>
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<generic_shape_iterator<db::Edge> > others;
others.push_back (other.begin_merged ());
std::unique_ptr<FlatEdges> output (new FlatEdges (merged_semantics ()));
std::unique_ptr<FlatEdges> output (new FlatEdges (other.merged_semantics () || other.is_merged ()));
std::vector<db::Shapes *> results;
results.push_back (&output->raw_edges ());
@ -720,7 +720,7 @@ AsIfFlatRegion::pull_generic (const Region &other, int mode, bool touching) cons
std::vector<generic_shape_iterator<db::Polygon> > others;
others.push_back (other.begin_merged ());
std::unique_ptr<FlatRegion> output (new FlatRegion (merged_semantics ()));
std::unique_ptr<FlatRegion> output (new FlatRegion (other.merged_semantics () || other.is_merged ()));
std::vector<db::Shapes *> results;
results.push_back (&output->raw_polygons ());

View File

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

View File

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