From 988b1e563fde94756b9ffbcc2784bf8c65ff68fe Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Thu, 7 Nov 2019 23:11:34 +0100 Subject: [PATCH] Added unit test for DeepRegion::snap --- src/db/unit_tests/dbDeepRegionTests.cc | 55 +++++++++++++++++++++++++ testdata/algo/deep_region_au27.gds | Bin 0 -> 126570 bytes 2 files changed, 55 insertions(+) create mode 100644 testdata/algo/deep_region_au27.gds diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index 83b6be3fd..e8e012b42 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -1490,6 +1490,61 @@ TEST(26_BreakoutCells) db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/algo/deep_region_au26.gds"); } +TEST(27_snap) +{ + { + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/scale_and_snap.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::DeepShapeStore dss; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + r1.set_merged_semantics (false); + db::Region r2 = r1.snapped (19, 19); + + r2.insert_into (&ly, top_cell_index, ly.get_layer (db::LayerProperties (100, 0))); + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/algo/deep_region_au27.gds"); + } + + { + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/scale_and_snap.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::DeepShapeStore dss; + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + r1.set_merged_semantics (false); + r1.snap (19, 19); + + r1.insert_into (&ly, top_cell_index, ly.get_layer (db::LayerProperties (100, 0))); + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/algo/deep_region_au27.gds"); + } +} + TEST(100_Integration) { db::Layout ly; diff --git a/testdata/algo/deep_region_au27.gds b/testdata/algo/deep_region_au27.gds new file mode 100644 index 0000000000000000000000000000000000000000..aded77e85079244be8ef3216be16a4e4e672b1a0 GIT binary patch literal 126570 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 literal 0 HcmV?d00001