mirror of https://github.com/KLayout/klayout.git
Robustification of Region
- Tests for merge - Locking the layout when writing back the data for performance improvement
This commit is contained in:
parent
7c043dbb99
commit
decc5ede13
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 ());
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue