Robustification of Region

- Tests for merge
- Locking the layout when writing back the data for
  performance improvement
This commit is contained in:
Matthias Koefferlein 2019-02-05 23:39:31 +01:00
parent 7c043dbb99
commit decc5ede13
9 changed files with 149 additions and 38 deletions

View File

@ -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);

View File

@ -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<db::PolygonRef>::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<db::Layout *> (&m_deep_layer.layout ()), const_cast<db::Cell *> (&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 ());

View File

@ -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.

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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");
}

BIN
testdata/algo/deep_region_au7.gds vendored Normal file

Binary file not shown.

BIN
testdata/algo/vexriscv_clocked_r.oas.gz vendored Normal file

Binary file not shown.