From 4924d0269c65782a164b95407c59b3700dcfff2b Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Wed, 6 Nov 2019 23:28:16 +0100 Subject: [PATCH] Fixed #400, added tests. --- src/db/unit_tests/dbDeepRegionTests.cc | 102 +++++++++++++++++++++++++ testdata/algo/deep_region_au400a.gds | Bin 0 -> 35920 bytes testdata/algo/deep_region_au400b.gds | Bin 0 -> 35920 bytes testdata/algo/deep_region_au400c.gds | Bin 0 -> 15040 bytes 4 files changed, 102 insertions(+) create mode 100644 testdata/algo/deep_region_au400a.gds create mode 100644 testdata/algo/deep_region_au400b.gds create mode 100644 testdata/algo/deep_region_au400c.gds diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index a9f2c84dd..83b6be3fd 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -1641,3 +1641,105 @@ TEST(issue_277) EXPECT_EQ (r.sized (1).merged (false, 1).to_string (), ""); } +TEST(issue_400) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/gds/t10.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; + // keeps a reference to the DSS + db::Region rr (db::RecursiveShapeIterator (ly, top_cell, (*ly.begin_layers ()).first), dss); + + for (db::Layout::layer_iterator l = ly.begin_layers (); l != ly.end_layers (); ++l) { + + unsigned int li = (*l).first; + db::Region r (db::RecursiveShapeIterator (ly, top_cell, li), dss); + + r.set_merged_semantics (false); + r.snap (19, 19); + + ly.clear_layer (li); + r.insert_into (&ly, top_cell_index, li); + + } + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/algo/deep_region_au400a.gds"); +} + +TEST(issue_400_dont_keep_regions) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/gds/t10.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; + + for (db::Layout::layer_iterator l = ly.begin_layers (); l != ly.end_layers (); ++l) { + + unsigned int li = (*l).first; + db::Region r (db::RecursiveShapeIterator (ly, top_cell, li), dss); + + r.set_merged_semantics (false); + r.snap (19, 19); + + ly.clear_layer (li); + r.insert_into (&ly, top_cell_index, li); + + } + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/algo/deep_region_au400b.gds"); +} + +TEST(issue_400_with_region) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/gds/t10.gds"; + tl::InputStream stream (fn); + db::Reader reader (stream); + reader.read (ly); + } + + db::DBox rbox (2.61, -1.6, 12.76, 4.7); + + db::cell_index_type top_cell_index = *ly.begin_top_down (); + db::Cell &top_cell = ly.cell (top_cell_index); + + db::DeepShapeStore dss; + + for (db::Layout::layer_iterator l = ly.begin_layers (); l != ly.end_layers (); ++l) { + + unsigned int li = (*l).first; + db::Region r (db::RecursiveShapeIterator (ly, top_cell, li, rbox.transformed (db::CplxTrans (ly.dbu ()).inverted ())), dss); + + r.set_merged_semantics (false); + r.snap (19, 19); + + ly.clear_layer (li); + r.insert_into (&ly, top_cell_index, li); + + } + + CHECKPOINT(); + db::compare_layouts (_this, ly, tl::testsrc () + "/testdata/algo/deep_region_au400c.gds"); +} diff --git a/testdata/algo/deep_region_au400a.gds b/testdata/algo/deep_region_au400a.gds new file mode 100644 index 0000000000000000000000000000000000000000..5aa551f074125f38a6f989a5d90f554a065a2eac GIT binary patch literal 35920 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 literal 0 HcmV?d00001 diff --git a/testdata/algo/deep_region_au400b.gds b/testdata/algo/deep_region_au400b.gds new file mode 100644 index 0000000000000000000000000000000000000000..5aa551f074125f38a6f989a5d90f554a065a2eac GIT binary patch literal 35920 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 literal 0 HcmV?d00001 diff --git a/testdata/algo/deep_region_au400c.gds b/testdata/algo/deep_region_au400c.gds new file mode 100644 index 0000000000000000000000000000000000000000..9351934903f88f362161b12832e7fd14507aecfd GIT binary patch literal 15040 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 F^j{xddHw(Z literal 0 HcmV?d00001