diff --git a/src/db/db/dbAsIfFlatRegion.cc b/src/db/db/dbAsIfFlatRegion.cc index d6fe3b6b9..e2041ea13 100644 --- a/src/db/db/dbAsIfFlatRegion.cc +++ b/src/db/db/dbAsIfFlatRegion.cc @@ -364,6 +364,7 @@ AsIfFlatRegion::filtered (const PolygonFilterBase &filter) const } } + new_region->set_is_merged (true); return new_region.release (); } @@ -1017,7 +1018,7 @@ AsIfFlatRegion::snapped (db::Coord gx, db::Coord gy) throw tl::Exception (tl::to_string (tr ("Grid snap requires a positive grid value"))); } - std::unique_ptr new_region (new FlatRegion (merged_semantics ())); + std::unique_ptr new_region (new FlatRegion ()); gx = std::max (db::Coord (1), gx); gy = std::max (db::Coord (1), gy); @@ -1386,7 +1387,7 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const } else if (! merged_semantics () || is_merged ()) { // Generic case - std::unique_ptr new_region (new FlatRegion (false /*output isn't merged*/)); + std::unique_ptr new_region (new FlatRegion ()); db::ShapeGenerator pc (new_region->raw_polygons (), false); db::PolygonGenerator pg (pc, false, true); @@ -1395,6 +1396,12 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const sf.put (*p); } + // 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 && is_merged ()) { + new_region->set_is_merged (true); + } + return new_region.release (); } else { @@ -1416,7 +1423,7 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const ep.insert (*p, n); } - std::unique_ptr new_region (new FlatRegion (false /*output isn't merged*/)); + std::unique_ptr new_region (new FlatRegion ()); db::ShapeGenerator pc (new_region->raw_polygons (), true /*clear*/); db::PolygonGenerator pg2 (pc, false /*don't resolve holes*/, true /*min. coherence*/); db::SizingPolygonFilter siz (pg2, dx, dy, mode); @@ -1424,6 +1431,12 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const db::BooleanOp op (db::BooleanOp::Or); ep.process (pg, op); + // 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 && merged_semantics ()) { + new_region->set_is_merged (true); + } + return new_region.release (); } diff --git a/src/db/unit_tests/dbAsIfFlatRegionTests.cc b/src/db/unit_tests/dbAsIfFlatRegionTests.cc index 8cabfa716..cc9b8b1bf 100644 --- a/src/db/unit_tests/dbAsIfFlatRegionTests.cc +++ b/src/db/unit_tests/dbAsIfFlatRegionTests.cc @@ -350,7 +350,7 @@ TEST(5_BoolXOR) db::Region r42xor3 = r42 ^ r3; db::Region r42xor42 = r42 ^ r42; - EXPECT_EQ (r2xor3.is_merged (), false); + EXPECT_EQ (r2xor3.is_merged (), true); db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); diff --git a/testdata/algo/flat_region_au1.gds b/testdata/algo/flat_region_au1.gds new file mode 100644 index 000000000..901038c3a Binary files /dev/null and b/testdata/algo/flat_region_au1.gds differ diff --git a/testdata/algo/flat_region_au10.gds b/testdata/algo/flat_region_au10.gds new file mode 100644 index 000000000..df975aa83 Binary files /dev/null and b/testdata/algo/flat_region_au10.gds differ diff --git a/testdata/algo/flat_region_au11.gds b/testdata/algo/flat_region_au11.gds new file mode 100644 index 000000000..ebe4a8f6e Binary files /dev/null and b/testdata/algo/flat_region_au11.gds differ diff --git a/testdata/algo/flat_region_au12.gds b/testdata/algo/flat_region_au12.gds new file mode 100644 index 000000000..38fa85056 Binary files /dev/null and b/testdata/algo/flat_region_au12.gds differ diff --git a/testdata/algo/flat_region_au13.gds b/testdata/algo/flat_region_au13.gds new file mode 100644 index 000000000..0fc690ca9 Binary files /dev/null and b/testdata/algo/flat_region_au13.gds differ diff --git a/testdata/algo/flat_region_au13b.gds b/testdata/algo/flat_region_au13b.gds new file mode 100644 index 000000000..8a1030982 Binary files /dev/null and b/testdata/algo/flat_region_au13b.gds differ diff --git a/testdata/algo/flat_region_au14a.gds b/testdata/algo/flat_region_au14a.gds new file mode 100644 index 000000000..7c054c06a Binary files /dev/null and b/testdata/algo/flat_region_au14a.gds differ diff --git a/testdata/algo/flat_region_au14b.gds b/testdata/algo/flat_region_au14b.gds new file mode 100644 index 000000000..1c712e0f5 Binary files /dev/null and b/testdata/algo/flat_region_au14b.gds differ diff --git a/testdata/algo/flat_region_au15a.gds b/testdata/algo/flat_region_au15a.gds new file mode 100644 index 000000000..1ac9891c0 Binary files /dev/null and b/testdata/algo/flat_region_au15a.gds differ diff --git a/testdata/algo/flat_region_au15b.gds b/testdata/algo/flat_region_au15b.gds new file mode 100644 index 000000000..c8ab962d2 Binary files /dev/null and b/testdata/algo/flat_region_au15b.gds differ diff --git a/testdata/algo/flat_region_au16.gds b/testdata/algo/flat_region_au16.gds new file mode 100644 index 000000000..683b753c9 Binary files /dev/null and b/testdata/algo/flat_region_au16.gds differ diff --git a/testdata/algo/flat_region_au17.gds b/testdata/algo/flat_region_au17.gds new file mode 100644 index 000000000..ef1f6d3ab Binary files /dev/null and b/testdata/algo/flat_region_au17.gds differ diff --git a/testdata/algo/flat_region_au18.gds b/testdata/algo/flat_region_au18.gds new file mode 100644 index 000000000..8c7800243 Binary files /dev/null and b/testdata/algo/flat_region_au18.gds differ diff --git a/testdata/algo/flat_region_au19.gds b/testdata/algo/flat_region_au19.gds new file mode 100644 index 000000000..4edc940ea Binary files /dev/null and b/testdata/algo/flat_region_au19.gds differ diff --git a/testdata/algo/flat_region_au2.gds b/testdata/algo/flat_region_au2.gds new file mode 100644 index 000000000..3d16c088c Binary files /dev/null and b/testdata/algo/flat_region_au2.gds differ diff --git a/testdata/algo/flat_region_au20.gds b/testdata/algo/flat_region_au20.gds new file mode 100644 index 000000000..88e0eadf5 Binary files /dev/null and b/testdata/algo/flat_region_au20.gds differ diff --git a/testdata/algo/flat_region_au21.gds b/testdata/algo/flat_region_au21.gds new file mode 100644 index 000000000..61c1aa54d Binary files /dev/null and b/testdata/algo/flat_region_au21.gds differ diff --git a/testdata/algo/flat_region_au22.gds b/testdata/algo/flat_region_au22.gds new file mode 100644 index 000000000..539fea98e Binary files /dev/null and b/testdata/algo/flat_region_au22.gds differ diff --git a/testdata/algo/flat_region_au27.gds b/testdata/algo/flat_region_au27.gds new file mode 100644 index 000000000..f4550fe05 Binary files /dev/null and b/testdata/algo/flat_region_au27.gds differ diff --git a/testdata/algo/flat_region_au28.gds b/testdata/algo/flat_region_au28.gds new file mode 100644 index 000000000..e0d20453b Binary files /dev/null and b/testdata/algo/flat_region_au28.gds differ diff --git a/testdata/algo/flat_region_au29.gds b/testdata/algo/flat_region_au29.gds new file mode 100644 index 000000000..049fba6e7 Binary files /dev/null and b/testdata/algo/flat_region_au29.gds differ diff --git a/testdata/algo/flat_region_au3.gds b/testdata/algo/flat_region_au3.gds new file mode 100644 index 000000000..7587aef1b Binary files /dev/null and b/testdata/algo/flat_region_au3.gds differ diff --git a/testdata/algo/flat_region_au31.gds b/testdata/algo/flat_region_au31.gds new file mode 100644 index 000000000..efabd4c28 Binary files /dev/null and b/testdata/algo/flat_region_au31.gds differ diff --git a/testdata/algo/flat_region_au3b.gds b/testdata/algo/flat_region_au3b.gds new file mode 100644 index 000000000..3d2db2130 Binary files /dev/null and b/testdata/algo/flat_region_au3b.gds differ diff --git a/testdata/algo/flat_region_au40.gds b/testdata/algo/flat_region_au40.gds new file mode 100644 index 000000000..9fc94ae5e Binary files /dev/null and b/testdata/algo/flat_region_au40.gds differ diff --git a/testdata/algo/flat_region_au4a.gds b/testdata/algo/flat_region_au4a.gds new file mode 100644 index 000000000..436ba9999 Binary files /dev/null and b/testdata/algo/flat_region_au4a.gds differ diff --git a/testdata/algo/flat_region_au4b.gds b/testdata/algo/flat_region_au4b.gds new file mode 100644 index 000000000..84f875778 Binary files /dev/null and b/testdata/algo/flat_region_au4b.gds differ diff --git a/testdata/algo/flat_region_au5.gds b/testdata/algo/flat_region_au5.gds new file mode 100644 index 000000000..3bcd0e308 Binary files /dev/null and b/testdata/algo/flat_region_au5.gds differ diff --git a/testdata/algo/flat_region_au7.gds b/testdata/algo/flat_region_au7.gds new file mode 100644 index 000000000..12f5c63ea Binary files /dev/null and b/testdata/algo/flat_region_au7.gds differ diff --git a/testdata/algo/flat_region_au9a.gds b/testdata/algo/flat_region_au9a.gds new file mode 100644 index 000000000..72b317c86 Binary files /dev/null and b/testdata/algo/flat_region_au9a.gds differ