Bugfix: Region#flatten and Edges#flatten did not update the merged cache to flat and Region#flatten did not produce PolygonRefs

This commit is contained in:
Matthias Koefferlein 2021-05-29 19:28:56 +02:00
parent 5ceeafc0ff
commit eeaab8a417
4 changed files with 34 additions and 14 deletions

View File

@ -273,24 +273,33 @@ void DeepEdges::reserve (size_t)
// Not implemented for deep regions // 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 ()) { if (layout.begin_top_down () != layout.end_top_down ()) {
db::Cell &top_cell = layout.cell (*layout.begin_top_down ()); db::Cell &top_cell = layout.cell (*layout.begin_top_down ());
db::Shapes flat_shapes (layout.is_editable ()); 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 ())); flat_shapes.insert (iter->edge ().transformed (iter.trans ()));
} }
layout.clear_layer (deep_layer ().layer ()); layout.clear_layer (deep_layer.layer ());
top_cell.shapes (deep_layer ().layer ()).swap (flat_shapes); 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<db::DeepLayer &> (merged_deep_layer ()));
}
}
EdgesIteratorDelegate * EdgesIteratorDelegate *
DeepEdges::begin () const DeepEdges::begin () const
{ {

View File

@ -284,26 +284,37 @@ void DeepRegion::reserve (size_t)
// Not implemented for deep regions // 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 ()) { if (layout.begin_top_down () != layout.end_top_down ()) {
db::Cell &top_cell = layout.cell (*layout.begin_top_down ()); db::Cell &top_cell = layout.cell (*layout.begin_top_down ());
db::Shapes flat_shapes (layout.is_editable ()); 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) {
if (iter->is_polygon ()) {
db::Polygon poly; db::Polygon poly;
iter->polygon (poly); iter->polygon (poly);
flat_shapes.insert (poly.transformed (iter.trans ())); flat_shapes.insert (db::PolygonRef (poly.transformed (iter.trans ()), layout.shape_repository ()));
}
} }
layout.clear_layer (deep_layer ().layer ()); layout.clear_layer (deep_layer.layer ());
top_cell.shapes (deep_layer ().layer ()).swap (flat_shapes); 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<db::DeepLayer &> (merged_deep_layer ()));
}
}
RegionIteratorDelegate * RegionIteratorDelegate *
DeepRegion::begin () const DeepRegion::begin () const
{ {

View File

@ -85,6 +85,6 @@ expect_count(l1, 15, 15, "l1 after flatten")
r = l1.space(0.5) r = l1.space(0.5)
r.output(1011, 0) r.output(1011, 0)
r.extents.output(1111, 0) r.extents.output(1111, 0)
expect_count(r, 3, 1, "r on l1.flatten") expect_count(r, 3, 3, "r on l1.flatten")

Binary file not shown.