From eeaab8a417ad1a9eefb6b35736582b1122a935a2 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 29 May 2021 19:28:56 +0200 Subject: [PATCH] Bugfix: Region#flatten and Edges#flatten did not update the merged cache to flat and Region#flatten did not produce PolygonRefs --- src/db/db/dbDeepEdges.cc | 19 ++++++++++++++----- src/db/db/dbDeepRegion.cc | 27 +++++++++++++++++++-------- testdata/drc/drcSimpleTests_4.drc | 2 +- testdata/drc/drcSimpleTests_au4.gds | Bin 10196 -> 10452 bytes 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/db/db/dbDeepEdges.cc b/src/db/db/dbDeepEdges.cc index 709d29b04..3d9504a9f 100644 --- a/src/db/db/dbDeepEdges.cc +++ b/src/db/db/dbDeepEdges.cc @@ -273,24 +273,33 @@ void DeepEdges::reserve (size_t) // Not implemented for deep regions } -void DeepEdges::flatten () +static +void flatten_layer (db::DeepLayer &deep_layer) { - db::Layout &layout = deep_layer ().layout (); + db::Layout &layout = deep_layer.layout (); if (layout.begin_top_down () != layout.end_top_down ()) { db::Cell &top_cell = layout.cell (*layout.begin_top_down ()); db::Shapes flat_shapes (layout.is_editable ()); - for (db::RecursiveShapeIterator iter (layout, top_cell, deep_layer ().layer ()); !iter.at_end (); ++iter) { + for (db::RecursiveShapeIterator iter (layout, top_cell, deep_layer.layer ()); !iter.at_end (); ++iter) { flat_shapes.insert (iter->edge ().transformed (iter.trans ())); } - layout.clear_layer (deep_layer ().layer ()); - top_cell.shapes (deep_layer ().layer ()).swap (flat_shapes); + layout.clear_layer (deep_layer.layer ()); + top_cell.shapes (deep_layer.layer ()).swap (flat_shapes); } } +void DeepEdges::flatten () +{ + flatten_layer (deep_layer ()); + if (m_merged_edges_valid) { + flatten_layer (const_cast (merged_deep_layer ())); + } +} + EdgesIteratorDelegate * DeepEdges::begin () const { diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index 21284422c..b412fedf5 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -284,26 +284,37 @@ void DeepRegion::reserve (size_t) // Not implemented for deep regions } -void DeepRegion::flatten () +static void +flatten_layer (db::DeepLayer &deep_layer) { - db::Layout &layout = deep_layer ().layout (); + db::Layout &layout = deep_layer.layout (); if (layout.begin_top_down () != layout.end_top_down ()) { db::Cell &top_cell = layout.cell (*layout.begin_top_down ()); db::Shapes flat_shapes (layout.is_editable ()); - for (db::RecursiveShapeIterator iter (layout, top_cell, deep_layer ().layer ()); !iter.at_end (); ++iter) { - db::Polygon poly; - iter->polygon (poly); - flat_shapes.insert (poly.transformed (iter.trans ())); + for (db::RecursiveShapeIterator iter (layout, top_cell, deep_layer.layer ()); !iter.at_end (); ++iter) { + if (iter->is_polygon ()) { + db::Polygon poly; + iter->polygon (poly); + flat_shapes.insert (db::PolygonRef (poly.transformed (iter.trans ()), layout.shape_repository ())); + } } - layout.clear_layer (deep_layer ().layer ()); - top_cell.shapes (deep_layer ().layer ()).swap (flat_shapes); + layout.clear_layer (deep_layer.layer ()); + top_cell.shapes (deep_layer.layer ()).swap (flat_shapes); } } +void DeepRegion::flatten () +{ + flatten_layer (deep_layer ()); + if (m_merged_polygons_valid) { + flatten_layer (const_cast (merged_deep_layer ())); + } +} + RegionIteratorDelegate * DeepRegion::begin () const { diff --git a/testdata/drc/drcSimpleTests_4.drc b/testdata/drc/drcSimpleTests_4.drc index b05ecdcdc..37f2e53f5 100644 --- a/testdata/drc/drcSimpleTests_4.drc +++ b/testdata/drc/drcSimpleTests_4.drc @@ -85,6 +85,6 @@ expect_count(l1, 15, 15, "l1 after flatten") r = l1.space(0.5) r.output(1011, 0) r.extents.output(1111, 0) -expect_count(r, 3, 1, "r on l1.flatten") +expect_count(r, 3, 3, "r on l1.flatten") diff --git a/testdata/drc/drcSimpleTests_au4.gds b/testdata/drc/drcSimpleTests_au4.gds index 6920b9a33203d8bff74f49374c7f3a9c6241fead..5f409014828d0df576641d3df7746f81d81f2cf9 100644 GIT binary patch delta 490 zcmZvYu}%U(7=*{=ygd?6AaFt8j07p^ppu6`D-DU^5!5HR&_O4m^cA20YF~khUM)7LM^ihk7J`A!aSJizr;%E}w_l>ttSF`G6} z9vSm96n@`|EqLQ*GR*8*KD(oB_3=C|%Ow6Ar cv$5MVhEH~5cf_uE^Bnd~@@(u33@j`R06`ZKMF0Q*