From 5597ee8960a8ad3f92fe9839cc822f483c1f5344 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 27 Nov 2022 21:59:06 +0100 Subject: [PATCH] DeepRegion performance: take fast path for DeepRegion::edges if merged polygons are available. --- src/db/db/dbDeepRegion.cc | 8 ++++++- src/db/db/dbDeepRegion.h | 1 + src/db/unit_tests/dbDeepRegionTests.cc | 30 +++++++++++++------------- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index 5a46e4e8d..e7e29ea12 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -555,6 +555,12 @@ DeepRegion::merged_deep_layer () const } } +bool +DeepRegion::merged_polygons_available () const +{ + return m_is_merged || m_merged_polygons_valid; +} + void DeepRegion::ensure_merged_polygons_valid () const { @@ -1169,7 +1175,7 @@ public: EdgesDelegate * DeepRegion::edges (const EdgeFilterBase *filter) const { - if (! filter && merged_semantics ()) { + if (! filter && merged_semantics () && ! merged_polygons_available ()) { // Hierarchical edge detector - no pre-merge required diff --git a/src/db/db/dbDeepRegion.h b/src/db/db/dbDeepRegion.h index e47cfae95..a45895bfd 100644 --- a/src/db/db/dbDeepRegion.h +++ b/src/db/db/dbDeepRegion.h @@ -142,6 +142,7 @@ public: void set_is_merged (bool f); + bool merged_polygons_available () const; const DeepLayer &merged_deep_layer () const; protected: diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index 74590d2d0..972b06614 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -887,6 +887,11 @@ TEST(14_Interacting) db::Region r6r = r6; r6r.set_merged_semantics (false); + db::Edges r1e = r1.edges (); + db::Edges r1ef = r1f.edges (); + db::Edges r1er = r1r.edges (); + r1er.set_merged_semantics (false); + { db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); @@ -957,11 +962,6 @@ TEST(14_Interacting) db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au14a.gds"); } - db::Edges r1e = r1.edges (); - db::Edges r1ef = r1f.edges (); - db::Edges r1er = r1r.edges (); - r1er.set_merged_semantics (false); - { db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); @@ -1469,6 +1469,16 @@ TEST(25_Pull) db::Region r6r = r6; r6r.set_merged_semantics (false); + db::Edges r1e = r1.edges (); + db::Edges r1ef = r1f.edges (); + db::Edges r1er = r1r.edges (); + r1er.set_merged_semantics (false); + + db::Edges r6e = r6.edges (); + db::Edges r6ef = r6f.edges (); + db::Edges r6er = r6r.edges (); + r6er.set_merged_semantics (false); + { db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); @@ -1507,16 +1517,6 @@ TEST(25_Pull) db::compare_layouts (_this, target, tl::testdata () + "/algo/deep_region_au25a.gds"); } - db::Edges r1e = r1.edges (); - db::Edges r1ef = r1f.edges (); - db::Edges r1er = r1r.edges (); - r1er.set_merged_semantics (false); - - db::Edges r6e = r6.edges (); - db::Edges r6ef = r6f.edges (); - db::Edges r6er = r6r.edges (); - r6er.set_merged_semantics (false); - { db::Layout target; unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index));