diff --git a/src/db/db/dbAsIfFlatRegion.cc b/src/db/db/dbAsIfFlatRegion.cc index 3e97ea64d..20be32979 100644 --- a/src/db/db/dbAsIfFlatRegion.cc +++ b/src/db/db/dbAsIfFlatRegion.cc @@ -458,9 +458,7 @@ RegionDelegate * AsIfFlatRegion::selected_interacting_generic (const Region &other, int mode, bool touching, bool inverse) const { db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // shortcut if (empty ()) { @@ -1058,9 +1056,7 @@ AsIfFlatRegion::merged (bool min_coherence, unsigned int min_wc) const } else { db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -1138,9 +1134,7 @@ AsIfFlatRegion::sized (coord_type dx, coord_type dy, unsigned int mode) const // Generic case - the size operation will merge first db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -1222,9 +1216,7 @@ AsIfFlatRegion::and_with (const Region &other) const // Generic case db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -1279,9 +1271,7 @@ AsIfFlatRegion::not_with (const Region &other) const // Generic case db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -1334,9 +1324,7 @@ AsIfFlatRegion::xor_with (const Region &other) const // Generic case db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -1390,9 +1378,7 @@ AsIfFlatRegion::or_with (const Region &other) const // Generic case db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -1468,6 +1454,9 @@ AsIfFlatRegion::add (const Region &other) const void AsIfFlatRegion::insert_into (Layout *layout, db::cell_index_type into_cell, unsigned int into_layer) const { + // improves performance when inserting an original layout into the same layout + db::LayoutLocker locker (layout); + db::Shapes &shapes = layout->cell (into_cell).shapes (into_layer); for (RegionIterator p (begin ()); ! p.at_end (); ++p) { shapes.insert (*p); diff --git a/src/db/db/dbDeepRegion.cc b/src/db/db/dbDeepRegion.cc index a3d606325..61b0fbec5 100644 --- a/src/db/db/dbDeepRegion.cc +++ b/src/db/db/dbDeepRegion.cc @@ -380,9 +380,7 @@ DeepRegion::ensure_merged_polygons_valid () const // hopefully more efficient that collecting everything and will lead to reuse of parts. ClusterMerger cm (m_deep_layer.layer (), hc, min_coherence (), report_progress (), progress_desc ()); - if (base_verbosity ()) { - cm.set_base_verbosity (base_verbosity ()); - } + cm.set_base_verbosity (base_verbosity ()); // @@@ iterate only over the called cells? for (db::Layout::iterator c = layout.begin (); c != layout.end (); ++c) { @@ -390,7 +388,8 @@ DeepRegion::ensure_merged_polygons_valid () const for (db::connected_clusters::all_iterator cl = cc.begin_all (); ! cl.at_end (); ++cl) { if (cc.is_root (*cl)) { db::Shapes &s = cm.merged (*cl, c->cell_index ()); - c->shapes (m_merged_polygons.layer ()).swap (s); + c->shapes (m_merged_polygons.layer ()).insert (s); + s.clear (); // not needed anymore } } } @@ -461,9 +460,7 @@ DeepRegion::and_or_not_with (const DeepRegion *other, bool and_op) const db::BoolAndOrNotLocalOperation op (and_op); db::LocalProcessor proc (const_cast (&m_deep_layer.layout ()), const_cast (&m_deep_layer.initial_cell ()), &other->deep_layer ().layout (), &other->deep_layer ().initial_cell ()); - if (base_verbosity ()) { - proc.set_base_verbosity (base_verbosity ()); - } + proc.set_base_verbosity (base_verbosity ()); proc.set_threads (m_deep_layer.store ()->threads ()); proc.set_area_ratio (m_deep_layer.store ()->max_area_ratio ()); proc.set_max_vertex_count (m_deep_layer.store ()->max_vertex_count ()); diff --git a/src/db/db/dbDeepShapeStore.cc b/src/db/db/dbDeepShapeStore.cc index b6b1af6bd..97a35de83 100644 --- a/src/db/db/dbDeepShapeStore.cc +++ b/src/db/db/dbDeepShapeStore.cc @@ -468,6 +468,8 @@ DeepShapeStore::cell_mapping_to_original (unsigned int layout_index, db::Layout void DeepShapeStore::insert (const DeepLayer &deep_layer, db::Layout *into_layout, db::cell_index_type into_cell, unsigned int into_layer) { + db::LayoutLocker locker (into_layout); + const db::Layout &source_layout = deep_layer.layout (); if (source_layout.begin_top_down () == source_layout.end_top_cells ()) { // empty source - nothing to do. diff --git a/src/db/db/dbFlatRegion.cc b/src/db/db/dbFlatRegion.cc index d3eb99105..c4c8d51b3 100644 --- a/src/db/db/dbFlatRegion.cc +++ b/src/db/db/dbFlatRegion.cc @@ -107,9 +107,7 @@ FlatRegion::ensure_merged_polygons_valid () const m_merged_polygons.clear (); db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; @@ -246,9 +244,7 @@ RegionDelegate *FlatRegion::merged_in_place (bool min_coherence, unsigned int mi invalidate_cache (); db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; diff --git a/src/db/db/dbOriginalLayerRegion.cc b/src/db/db/dbOriginalLayerRegion.cc index 45812d34d..d481c5500 100644 --- a/src/db/db/dbOriginalLayerRegion.cc +++ b/src/db/db/dbOriginalLayerRegion.cc @@ -253,9 +253,7 @@ OriginalLayerRegion::ensure_merged_polygons_valid () const m_merged_polygons.clear (); db::EdgeProcessor ep (report_progress (), progress_desc ()); - if (base_verbosity ()) { - ep.set_base_verbosity (base_verbosity ()); - } + ep.set_base_verbosity (base_verbosity ()); // count edges and reserve memory size_t n = 0; diff --git a/src/db/db/dbRegionDelegate.cc b/src/db/db/dbRegionDelegate.cc index fc8381ca9..0e6328ce7 100644 --- a/src/db/db/dbRegionDelegate.cc +++ b/src/db/db/dbRegionDelegate.cc @@ -30,7 +30,7 @@ namespace db RegionDelegate::RegionDelegate () { - m_base_verbosity = 0; + m_base_verbosity = 30; m_report_progress = false; m_merged_semantics = true; m_strict_handling = false; diff --git a/src/db/unit_tests/dbDeepRegionTests.cc b/src/db/unit_tests/dbDeepRegionTests.cc index 720708876..4a202c90d 100644 --- a/src/db/unit_tests/dbDeepRegionTests.cc +++ b/src/db/unit_tests/dbDeepRegionTests.cc @@ -339,3 +339,132 @@ TEST(6_Reduction) db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au6.gds"); } +TEST(7_Merge) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/deep_region_l1.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; + dss.set_max_vertex_count (4); + dss.set_threads (0); + + unsigned int l6 = ly.get_layer (db::LayerProperties (6, 0)); + + db::Region r6 (db::RecursiveShapeIterator (ly, top_cell, l6), dss); + + db::Region r6_merged = r6.merged (); + db::Region r6_merged_minwc = r6.merged (false, 1); + + db::Region r6_minwc = r6; + r6_minwc.merge (false, 1); + + r6.merge (); + + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r6); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r6_minwc); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (12, 0)), r6_merged); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (13, 0)), r6_merged_minwc); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au7.gds"); +} + + + +TEST(100_Integration) +{ + db::Layout ly; + { + std::string fn (tl::testsrc ()); + fn += "/testdata/algo/vexriscv_clocked_r.oas.gz"; + 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; + dss.set_max_vertex_count (4); + dss.set_threads (0); + + unsigned int l1 = ly.get_layer (db::LayerProperties (1, 0)); + unsigned int l3 = ly.get_layer (db::LayerProperties (3, 0)); + unsigned int l4 = ly.get_layer (db::LayerProperties (4, 0)); + unsigned int l5 = ly.get_layer (db::LayerProperties (5, 0)); + unsigned int l6 = ly.get_layer (db::LayerProperties (6, 0)); + unsigned int l7 = ly.get_layer (db::LayerProperties (7, 0)); + unsigned int l10 = ly.get_layer (db::LayerProperties (10, 0)); + unsigned int l11 = ly.get_layer (db::LayerProperties (11, 0)); + unsigned int l14 = ly.get_layer (db::LayerProperties (14, 0)); + unsigned int l16 = ly.get_layer (db::LayerProperties (16, 0)); + unsigned int l18 = ly.get_layer (db::LayerProperties (18, 0)); + + db::Region r1 (db::RecursiveShapeIterator (ly, top_cell, l1), dss); + db::Region r3 (db::RecursiveShapeIterator (ly, top_cell, l3), dss); + db::Region r4 (db::RecursiveShapeIterator (ly, top_cell, l4), dss); + db::Region r5 (db::RecursiveShapeIterator (ly, top_cell, l5), dss); + db::Region r6 (db::RecursiveShapeIterator (ly, top_cell, l6), dss); + db::Region r7 (db::RecursiveShapeIterator (ly, top_cell, l7), dss); + db::Region r10 (db::RecursiveShapeIterator (ly, top_cell, l10), dss); + db::Region r11 (db::RecursiveShapeIterator (ly, top_cell, l11), dss); + db::Region r14 (db::RecursiveShapeIterator (ly, top_cell, l14), dss); + db::Region r16 (db::RecursiveShapeIterator (ly, top_cell, l16), dss); + db::Region r18 (db::RecursiveShapeIterator (ly, top_cell, l18), dss); + + db::Region psd = r4 - r7; + db::Region nsd = r3 - r7; + db::Region pgate = r4 & r7; + db::Region ngate = r3 & r7; + db::Region poly_cont = r10 & r7; + db::Region diff_cont = r10 - r7; + + r1.merge (); + r3.merge (); + r4.merge (); + r5.merge (); + r6.merge (); + r7.merge (); + r10.merge (); + r11.merge (); + r14.merge (); + r16.merge (); + r18.merge (); + + db::Layout target; + unsigned int target_top_cell_index = target.add_cell (ly.cell_name (top_cell_index)); + + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (1, 0)), r1); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (3, 0)), r3); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (4, 0)), r4); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (5, 0)), r5); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (6, 0)), r6); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (7, 0)), r7); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (10, 0)), r10); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (11, 0)), r11); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (14, 0)), r14); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (16, 0)), r16); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (18, 0)), r18); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (100, 0)), psd); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (101, 0)), nsd); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (102, 0)), pgate); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (103, 0)), ngate); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (104, 0)), poly_cont); + target.insert (target_top_cell_index, target.get_layer (db::LayerProperties (105, 0)), diff_cont); + + CHECKPOINT(); + db::compare_layouts (_this, target, tl::testsrc () + "/testdata/algo/deep_region_au100.gds"); +} diff --git a/testdata/algo/deep_region_au7.gds b/testdata/algo/deep_region_au7.gds new file mode 100644 index 000000000..2c7a8f312 Binary files /dev/null and b/testdata/algo/deep_region_au7.gds differ diff --git a/testdata/algo/vexriscv_clocked_r.oas.gz b/testdata/algo/vexriscv_clocked_r.oas.gz new file mode 100644 index 000000000..0ecd4f4f2 Binary files /dev/null and b/testdata/algo/vexriscv_clocked_r.oas.gz differ