Debugging, added tests for new recursive shape iterator.

This commit is contained in:
Matthias Koefferlein 2024-10-25 23:13:40 +02:00
parent bea707a9df
commit 049c0b73b0
4 changed files with 95 additions and 24 deletions

View File

@ -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 &region)
{
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 &region)
{
init_region (region);
m_needs_reinit = true;
reset ();
}
void
@ -382,7 +382,7 @@ RecursiveShapeIterator::confine_region (const box_type &region)
} else {
init_region (m_region & region);
}
m_needs_reinit = true;
reset ();
}
void
@ -395,7 +395,7 @@ RecursiveShapeIterator::confine_region (const region_type &region)
} 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<unsigned int> &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<db::Layout *> (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<db::cell_index_type> &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<db::cell_index_type> &cells)
{
@ -564,7 +571,7 @@ RecursiveShapeIterator::select_cells (const std::set<db::cell_index_type> &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 ();
}
}

View File

@ -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 ();
}
}

View File

@ -789,3 +789,4 @@ TEST(6)
"CHILD_CELL_3_1_1@r0 *1 120000,0"
);
}

View File

@ -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);
}