diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index 239d74313..0d4fd72de 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -2151,14 +2151,19 @@ TEST(40_BoolWithProperties) db::RecursiveShapeIterator si1 (ly, top_cell, l1); si1.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r1 (si1, dss); + EXPECT_EQ (r1.join_properties_on_merge (), true); + r1.set_join_properties_on_merge (false); + EXPECT_EQ (r1.join_properties_on_merge (), false); db::RecursiveShapeIterator si2 (ly, top_cell, l2); si2.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r2 (si2, dss); + r2.set_join_properties_on_merge (false); db::RecursiveShapeIterator si3 (ly, top_cell, l3); si3.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r3 (si3, dss); + r3.set_join_properties_on_merge (false); db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); @@ -2169,6 +2174,9 @@ TEST(40_BoolWithProperties) target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r1.merged ()); target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r2.merged ()); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r1.merged (false, 0, true)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), r2.merged (false, 0, true)); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (20, 0)), r1 & r2); target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (21, 0)), r1.bool_and (r2, db::NoPropertyConstraint)); target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (22, 0)), r1.bool_and (r2, db::SamePropertiesConstraint)); @@ -2307,12 +2315,14 @@ TEST(42_DRCWithProperties) db::RecursiveShapeIterator si1 (ly, top_cell, l1); si1.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r1 (si1, dss); + r1.set_join_properties_on_merge (false); db::Region r1_nomerge (r1); r1_nomerge.set_merged_semantics (false); db::RecursiveShapeIterator si2 (ly, top_cell, l2); si2.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r2 (si2, dss); + r2.set_join_properties_on_merge (false); db::Region r2_nomerge (r2); r2_nomerge.set_merged_semantics (false); @@ -2465,10 +2475,12 @@ TEST(44_SizeWithProperties) db::RecursiveShapeIterator si1 (ly, top_cell, l1); si1.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r1 (si1, dss); + r1.set_join_properties_on_merge (false); db::RecursiveShapeIterator si2 (ly, top_cell, l2); si2.apply_property_translator (db::PropertiesTranslator::make_pass_all ()); db::Region r2 (si2, dss); + r2.set_join_properties_on_merge (false); db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); diff --git a/src/db/unit_tests/dbRegionTests.cc b/src/db/unit_tests/dbRegionTests.cc index 6f1b1df49..da2c12249 100644 --- a/src/db/unit_tests/dbRegionTests.cc +++ b/src/db/unit_tests/dbRegionTests.cc @@ -2214,6 +2214,7 @@ TEST(52_PropertiesDeep) ++s; EXPECT_EQ (s.at_end (), true); + r.set_join_properties_on_merge (false); s = r.begin_merged (); EXPECT_EQ (s.at_end (), false); EXPECT_EQ (s.prop_id (), db::properties_id_type (0)); @@ -2234,6 +2235,16 @@ TEST(52_PropertiesDeep) ++s; EXPECT_EQ (s.at_end (), true); + + r.set_join_properties_on_merge (true); + s = r.begin_merged (); + EXPECT_EQ (s.at_end (), false); + + // polygons are merged with "maximum" property value + EXPECT_EQ (db::PolygonWithProperties (*s, s.prop_id ()).to_string (), "(0,0;0,200;1,200;1,202;10,202;10,220;110,220;110,212;111,212;111,12;101,12;101,2;100,2;100,0) props={id=>42}"); + ++s; + + EXPECT_EQ (s.at_end (), true); } TEST(53_PropertiesDeepFromLayout) @@ -2345,6 +2356,7 @@ TEST(53_PropertiesDeepFromLayout) ++s; EXPECT_EQ (s.at_end (), true); + r.set_join_properties_on_merge (false); s = r.begin_merged (); EXPECT_EQ (s.at_end (), false); EXPECT_EQ (s.prop_id (), db::properties_id_type (0)); @@ -2365,6 +2377,16 @@ TEST(53_PropertiesDeepFromLayout) ++s; EXPECT_EQ (s.at_end (), true); + + r.set_join_properties_on_merge (true); + s = r.begin_merged (); + EXPECT_EQ (s.at_end (), false); + + // polygons are merged with "maximum" property value + EXPECT_EQ (db::PolygonWithProperties (*s, s.prop_id ()).to_string (), "(0,0;0,200;1,200;1,202;10,202;10,220;110,220;110,212;111,212;111,12;101,12;101,2;100,2;100,0) props={VALUE=>42}"); + ++s; + + EXPECT_EQ (s.at_end (), true); } TEST(54_PropertiesFilterDeep) diff --git a/testdata/algo/deep_region_au40.gds b/testdata/algo/deep_region_au40.gds index 84d6d4969..22a5519b0 100644 Binary files a/testdata/algo/deep_region_au40.gds and b/testdata/algo/deep_region_au40.gds differ diff --git a/testdata/ruby/dbRegionTest.rb b/testdata/ruby/dbRegionTest.rb index 88d7c8d4d..f5dc08881 100644 --- a/testdata/ruby/dbRegionTest.rb +++ b/testdata/ruby/dbRegionTest.rb @@ -1679,6 +1679,8 @@ class DBRegion_TestClass < TestBase iter = top.begin_shapes_rec(l1) iter.enable_properties() r = RBA::Region::new(iter, dss) + r.join_properties_on_merge = false + assert_equal(r.join_properties_on_merge, false) assert_equal(r.filtered(RBA::PolygonFilter::property_filter("one", 11)).to_s, "") assert_equal(r.filtered(RBA::PolygonFilter::property_filter("two", 17)).to_s, "") @@ -1695,6 +1697,10 @@ class DBRegion_TestClass < TestBase rr.filter(RBA::PolygonFilter::property_filter("one", 17)) assert_equal(csort(rr.to_s), csort("(1,1;1,201;101,201;101,1){one=>17}")) + r.join_properties_on_merge = true + assert_equal(r.join_properties_on_merge, true) + assert_equal(csort(r.filtered(RBA::PolygonFilter::property_filter("one", 42)).to_s), csort("(0,0;0,200;1,200;1,201;2,201;2,202;102,202;102,2;101,2;101,1;100,1;100,0){one=>42}")) + dss._destroy end