From 8edaf8a62b83333549aa300dffeeed5a42d8df60 Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 15 Feb 2017 21:23:32 +0100 Subject: [PATCH] Added more unit tests for recursive shape iter with complex regions. --- src/unit_tests/dbRecursiveShapeIterator.cc | 148 +++++++++++++++++++++ 1 file changed, 148 insertions(+) diff --git a/src/unit_tests/dbRecursiveShapeIterator.cc b/src/unit_tests/dbRecursiveShapeIterator.cc index 974376932..ce35e60cc 100644 --- a/src/unit_tests/dbRecursiveShapeIterator.cc +++ b/src/unit_tests/dbRecursiveShapeIterator.cc @@ -23,9 +23,12 @@ #include "dbRecursiveShapeIterator.h" #include "dbRegion.h" +#include "dbLayoutDiff.h" #include "tlString.h" #include "utHead.h" +#include + std::string collect(db::RecursiveShapeIterator &s, const db::Layout &layout, bool with_layer = false) { std::string res; @@ -539,3 +542,148 @@ TEST(3) EXPECT_EQ (x, "[$3](4000,2500;5000,3500)/[$3](7000,5500;8000,6500)/[$3](7000,7500;8000,8500)"); } +static db::Layout boxes2layout (const std::set &boxes) +{ + db::Layout l; + l.insert_layer(0, db::LayerProperties (1, 0)); + db::Cell &top (l.cell (l.add_cell ())); + + for (std::set::const_iterator b = boxes.begin (); b != boxes.end (); ++b) { + top.shapes (0).insert (*b); + } + + return l; +} + +TEST(4) +{ + // Big fun + + db::Manager m; + db::Layout g (&m); + g.insert_layer(0); + + db::Cell &c0 (g.cell (g.add_cell ())); + + std::set boxes; + + for (int i = 0; i < 100000; ++i) { + + int x = rand () % 10000; + int y = rand () % 10000; + db::Box box (x, y, x + 10, y + 10); + + boxes.insert (box); + + c0.shapes (0).insert (box); + + } + + db::Box search_box (2500, 2500, 7500, 7500); + + std::set selected_boxes; + std::set selected_boxes2; + + for (db::RecursiveShapeIterator iter = db::RecursiveShapeIterator (g, c0, 0, search_box, true); !iter.at_end (); ++iter) { + selected_boxes.insert (iter->bbox ()); + } + + for (std::set::const_iterator b = boxes.begin (); b != boxes.end (); ++b) { + if (search_box.overlaps (*b)) { + selected_boxes2.insert (*b); + } + } + + EXPECT_EQ (selected_boxes.size () > 100, true); + EXPECT_EQ (db::compare_layouts (boxes2layout (selected_boxes), boxes2layout (selected_boxes2), db::layout_diff::f_verbose, 0, 100 /*max diff lines*/), true); + + db::Box search_box2 (500, 500, 1000, 1000); + + selected_boxes.clear (); + selected_boxes2.clear (); + + db::Region reg; + reg.insert (search_box); + reg.insert (search_box2); + + for (db::RecursiveShapeIterator iter = db::RecursiveShapeIterator (g, c0, 0, reg, true); !iter.at_end (); ++iter) { + selected_boxes.insert (iter->bbox ()); + } + + for (std::set::const_iterator b = boxes.begin (); b != boxes.end (); ++b) { + if (search_box.overlaps (*b) || search_box2.overlaps (*b)) { + selected_boxes2.insert (*b); + } + } + + EXPECT_EQ (selected_boxes.size () > 100, true); + EXPECT_EQ (db::compare_layouts (boxes2layout (selected_boxes), boxes2layout (selected_boxes2), db::layout_diff::f_verbose, 0, 100 /*max diff lines*/), true); +} + +TEST(5) +{ + // Big fun with cells + + db::Manager m; + db::Layout g (&m); + g.insert_layer(0); + + db::Cell &c0 (g.cell (g.add_cell ())); + db::Cell &c1 (g.cell (g.add_cell ())); + + db::Box basic_box (0, 0, 10, 10); + c1.shapes (0).insert (basic_box); + + std::set boxes; + + for (int i = 0; i < 100000; ++i) { + + int x = rand () % 10000; + int y = rand () % 10000; + + boxes.insert (basic_box.moved (db::Vector (x, y))); + + c0.insert (db::CellInstArray (db::CellInst (c1.cell_index ()), db::Trans (db::Vector (x, y)))); + + } + + db::Box search_box (2500, 2500, 7500, 7500); + + std::set selected_boxes; + std::set selected_boxes2; + + for (db::RecursiveShapeIterator iter = db::RecursiveShapeIterator (g, c0, 0, search_box, true); !iter.at_end (); ++iter) { + selected_boxes.insert (iter.trans () * iter->bbox ()); + } + + for (std::set::const_iterator b = boxes.begin (); b != boxes.end (); ++b) { + if (search_box.overlaps (*b)) { + selected_boxes2.insert (*b); + } + } + + EXPECT_EQ (selected_boxes.size () > 100, true); + EXPECT_EQ (db::compare_layouts (boxes2layout (selected_boxes), boxes2layout (selected_boxes2), db::layout_diff::f_verbose, 0, 100 /*max diff lines*/), true); + + db::Box search_box2 (500, 500, 1000, 1000); + + selected_boxes.clear (); + selected_boxes2.clear (); + + db::Region reg; + reg.insert (search_box); + reg.insert (search_box2); + + for (db::RecursiveShapeIterator iter = db::RecursiveShapeIterator (g, c0, 0, reg, true); !iter.at_end (); ++iter) { + selected_boxes.insert (iter.trans () * iter->bbox ()); + } + + for (std::set::const_iterator b = boxes.begin (); b != boxes.end (); ++b) { + if (search_box.overlaps (*b) || search_box2.overlaps (*b)) { + selected_boxes2.insert (*b); + } + } + + EXPECT_EQ (selected_boxes.size () > 100, true); + EXPECT_EQ (db::compare_layouts (boxes2layout (selected_boxes), boxes2layout (selected_boxes2), db::layout_diff::f_verbose, 0, 100 /*max diff lines*/), true); +}