From 049c0b73b0897cfa472f89c113a6bab5a581f289 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Fri, 25 Oct 2024 23:13:40 +0200 Subject: [PATCH] Debugging, added tests for new recursive shape iterator. --- src/db/db/dbRecursiveShapeIterator.cc | 33 ++++++---- src/db/db/dbRecursiveShapeIterator.h | 19 +++--- .../dbRecursiveInstanceIteratorTests.cc | 1 + .../dbRecursiveShapeIteratorTests.cc | 66 +++++++++++++++++++ 4 files changed, 95 insertions(+), 24 deletions(-) diff --git a/src/db/db/dbRecursiveShapeIterator.cc b/src/db/db/dbRecursiveShapeIterator.cc index e3872f485..1361983ca 100644 --- a/src/db/db/dbRecursiveShapeIterator.cc +++ b/src/db/db/dbRecursiveShapeIterator.cc @@ -341,7 +341,7 @@ RecursiveShapeIterator::set_global_trans (const cplx_trans_type &tr) { if (m_global_trans != tr) { m_global_trans = tr; - m_needs_reinit = true; + reset (); } } @@ -361,7 +361,7 @@ RecursiveShapeIterator::set_region (const box_type ®ion) { if (m_region != region || mp_complex_region.get () != 0) { init_region (region); - m_needs_reinit = true; + reset (); } } @@ -369,7 +369,7 @@ void RecursiveShapeIterator::set_region (const region_type ®ion) { init_region (region); - m_needs_reinit = true; + reset (); } void @@ -382,7 +382,7 @@ RecursiveShapeIterator::confine_region (const box_type ®ion) } else { init_region (m_region & region); } - m_needs_reinit = true; + reset (); } void @@ -395,7 +395,7 @@ RecursiveShapeIterator::confine_region (const region_type ®ion) } else { init_region (region & region_type (m_region)); } - m_needs_reinit = true; + reset (); } void @@ -405,7 +405,7 @@ RecursiveShapeIterator::set_layer (unsigned int layer) m_has_layers = false; m_layers.clear (); m_layer = layer; - m_needs_reinit = true; + reset (); } } @@ -416,7 +416,7 @@ RecursiveShapeIterator::set_layers (const std::vector &layers) m_has_layers = true; m_layers = layers; m_layer = 0; - m_needs_reinit = true; + reset (); } } @@ -506,7 +506,7 @@ RecursiveShapeIterator::validate (RecursiveShapeReceiver *receiver) const next_shape (receiver); } - if (mp_layout) { + if (mp_layout && ! at_end ()) { m_locker = db::LayoutLocker (const_cast (mp_layout.get ()), true); } } @@ -519,7 +519,7 @@ RecursiveShapeIterator::reset_selection () m_start.clear (); m_stop.clear (); - m_needs_reinit = true; + reset (); } } @@ -534,7 +534,7 @@ RecursiveShapeIterator::unselect_cells (const std::set &cel m_start.erase (*c); } - m_needs_reinit = true; + reset (); } } @@ -549,11 +549,18 @@ RecursiveShapeIterator::unselect_all_cells () m_stop.insert (c->cell_index ()); } - m_needs_reinit = true; + reset (); } } +void +RecursiveShapeIterator::reset () +{ + m_needs_reinit = true; + m_locker = db::LayoutLocker (); +} + void RecursiveShapeIterator::select_cells (const std::set &cells) { @@ -564,7 +571,7 @@ RecursiveShapeIterator::select_cells (const std::set &cells m_stop.erase (*c); } - m_needs_reinit = true; + reset (); } } @@ -579,7 +586,7 @@ RecursiveShapeIterator::select_all_cells () m_start.insert (c->cell_index ()); } - m_needs_reinit = true; + reset (); } } diff --git a/src/db/db/dbRecursiveShapeIterator.h b/src/db/db/dbRecursiveShapeIterator.h index cf893be88..69e79fb1f 100644 --- a/src/db/db/dbRecursiveShapeIterator.h +++ b/src/db/db/dbRecursiveShapeIterator.h @@ -265,7 +265,7 @@ public: { if (m_max_depth != depth) { m_max_depth = depth; - m_needs_reinit = true; + reset (); } } @@ -288,7 +288,7 @@ public: { if (m_min_depth != depth) { m_min_depth = depth; - m_needs_reinit = true; + reset (); } } @@ -433,7 +433,7 @@ public: { if (m_overlapping != f) { m_overlapping = f; - m_needs_reinit = true; + reset (); } } @@ -452,7 +452,7 @@ public: { if (m_for_merged_input != f) { m_for_merged_input = f; - m_needs_reinit = true; + reset (); } } @@ -483,10 +483,7 @@ public: /** * @brief Reset the iterator */ - void reset () - { - m_needs_reinit = true; - } + void reset (); /** * @brief Select cells @@ -559,7 +556,7 @@ public: { if (m_shape_flags != flags) { m_shape_flags = flags; - m_needs_reinit = true; + reset (); } } @@ -596,7 +593,7 @@ public: { if (mp_shape_prop_sel != prop_sel) { mp_shape_prop_sel = prop_sel; - m_needs_reinit = true; + reset (); } } @@ -610,7 +607,7 @@ public: { if (m_shape_inv_prop_sel != inv) { m_shape_inv_prop_sel = inv; - m_needs_reinit = true; + reset (); } } diff --git a/src/db/unit_tests/dbRecursiveInstanceIteratorTests.cc b/src/db/unit_tests/dbRecursiveInstanceIteratorTests.cc index 9671e5a3c..eb06a6967 100644 --- a/src/db/unit_tests/dbRecursiveInstanceIteratorTests.cc +++ b/src/db/unit_tests/dbRecursiveInstanceIteratorTests.cc @@ -789,3 +789,4 @@ TEST(6) "CHILD_CELL_3_1_1@r0 *1 120000,0" ); } + diff --git a/src/db/unit_tests/dbRecursiveShapeIteratorTests.cc b/src/db/unit_tests/dbRecursiveShapeIteratorTests.cc index 6184176db..b143dbee4 100644 --- a/src/db/unit_tests/dbRecursiveShapeIteratorTests.cc +++ b/src/db/unit_tests/dbRecursiveShapeIteratorTests.cc @@ -1780,3 +1780,69 @@ TEST(13_ForMergedPerformance) } } +// layout locking +TEST(14_LayoutLocking) +{ + db::Layout layout; + + layout.insert_layer (0); + + db::Cell &c0 (layout.cell (layout.add_cell ())); + db::Cell &c1 (layout.cell (layout.add_cell ())); + + db::Box b (0, 100, 1000, 1200); + c1.shapes (0).insert (b); + + db::Trans tt; + c0.insert (db::CellInstArray (db::CellInst (c1.cell_index ()), tt)); + c0.insert (db::CellInstArray (db::CellInst (c1.cell_index ()), db::Trans (db::Vector (2000, -2000)))); + + EXPECT_EQ (layout.under_construction (), false); + + db::RecursiveShapeIterator iter (layout, c0, 0); + + EXPECT_EQ (layout.under_construction (), false); + + EXPECT_EQ (iter.at_end (), false); + EXPECT_EQ (layout.under_construction (), true); + + EXPECT_EQ (iter.shape ().to_string (), "box (0,100;1000,1200)"); + EXPECT_EQ (layout.under_construction (), true); + ++iter; + + EXPECT_EQ (iter.at_end (), false); + + EXPECT_EQ (iter.shape ().to_string (), "box (0,100;1000,1200)"); + EXPECT_EQ (layout.under_construction (), true); + ++iter; + + EXPECT_EQ (layout.under_construction (), false); + EXPECT_EQ (iter.at_end (), true); + + // reset will restart + iter.reset (); + + EXPECT_EQ (layout.under_construction (), false); + + EXPECT_EQ (iter.at_end (), false); + EXPECT_EQ (layout.under_construction (), true); + + // a copy will hold the lock + iter.reset (); + + EXPECT_EQ (layout.under_construction (), false); + EXPECT_EQ (iter.at_end (), false); + + EXPECT_EQ (layout.under_construction (), true); + db::RecursiveShapeIterator iter_copy = iter; + + while (! iter.at_end ()) { + ++iter; + } + + EXPECT_EQ (layout.under_construction (), true); + iter_copy = db::RecursiveShapeIterator (); + + EXPECT_EQ (layout.under_construction (), false); +} +