Also provide layout locking for recursive instance iterator

This commit is contained in:
Matthias Koefferlein
2024-10-26 21:40:41 +02:00
parent 57e98d17ac
commit 1407ae13a7
4 changed files with 111 additions and 26 deletions
@@ -790,3 +790,69 @@ TEST(6)
);
}
// layout locking
TEST(7_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::RecursiveInstanceIterator iter (layout, c0);
EXPECT_EQ (layout.under_construction (), false);
EXPECT_EQ (iter.at_end (), false);
EXPECT_EQ (layout.under_construction (), true);
EXPECT_EQ (iter.instance ().to_string (), "cell_index=1 r0 *1 0,0");
EXPECT_EQ (layout.under_construction (), true);
++iter;
EXPECT_EQ (iter.at_end (), false);
EXPECT_EQ (iter.instance ().to_string (), "cell_index=1 r0 *1 2000,-2000");
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::RecursiveInstanceIterator iter_copy = iter;
while (! iter.at_end ()) {
++iter;
}
EXPECT_EQ (layout.under_construction (), true);
iter_copy = db::RecursiveInstanceIterator ();
EXPECT_EQ (layout.under_construction (), false);
}