mirror of https://github.com/KLayout/klayout.git
WIP: deep mode implementation of enhanced 2-layer check, tests
This commit is contained in:
parent
a75f1d77e3
commit
484ab91850
|
|
@ -1185,6 +1185,7 @@ EdgePairsDelegate *
|
||||||
AsIfFlatRegion::space_or_isolated_check (db::Coord d, const RegionCheckOptions &options, bool isolated) const
|
AsIfFlatRegion::space_or_isolated_check (db::Coord d, const RegionCheckOptions &options, bool isolated) const
|
||||||
{
|
{
|
||||||
// NOTE: we have to use "foreign" to make sure every subject sees neighboring subjects
|
// NOTE: we have to use "foreign" to make sure every subject sees neighboring subjects
|
||||||
|
// @@@ use null ptr instead of foreign_regionptr
|
||||||
return run_check (db::SpaceRelation, isolated, foreign_regionptr (), d, options);
|
return run_check (db::SpaceRelation, isolated, foreign_regionptr (), d, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2368,48 +2368,57 @@ DeepRegion::cop_to_edges (db::CompoundRegionOperationNode &node, db::PropertyCon
|
||||||
EdgePairsDelegate *
|
EdgePairsDelegate *
|
||||||
DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, const Region *other, db::Coord d, const RegionCheckOptions &options) const
|
DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, const Region *other, db::Coord d, const RegionCheckOptions &options) const
|
||||||
{
|
{
|
||||||
// @@@
|
|
||||||
if (empty ()) {
|
if (empty ()) {
|
||||||
return new db::DeepEdgePairs (deep_layer ().derived ());
|
return new db::DeepEdgePairs (deep_layer ().derived ());
|
||||||
} else if (other && ! is_subject_regionptr (other) && other->empty () && ! options.negative) {
|
} else if (other && ! is_subject_regionptr (other) && other->empty () && ! options.negative) {
|
||||||
return new db::DeepEdgePairs (deep_layer ().derived ());
|
return new db::DeepEdgePairs (deep_layer ().derived ());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool has_other = other && other != subject_regionptr () && other != foreign_regionptr ();
|
||||||
|
|
||||||
// force different polygons in the different properties case to skip intra-polygon checks
|
// force different polygons in the different properties case to skip intra-polygon checks
|
||||||
if (pc_always_different (options.prop_constraint)) {
|
if (! has_other && pc_always_different (options.prop_constraint)) {
|
||||||
// TODO: this forces merged primaries, so maybe that is not a good optimization?
|
// TODO: this forces merged primaries, so maybe that is not a good optimization?
|
||||||
different_polygons = true;
|
different_polygons = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
const db::DeepRegion *other_deep = 0;
|
const db::DeepRegion *other_deep = 0;
|
||||||
unsigned int other_layer = 0;
|
|
||||||
bool other_is_merged = true;
|
bool other_is_merged = true;
|
||||||
|
|
||||||
bool needs_merged_primary = different_polygons || options.needs_merged ();
|
bool needs_merged_primary = (! has_other && different_polygons) || options.needs_merged ();
|
||||||
bool primary_is_merged = ! merged_semantics () || needs_merged_primary || is_merged ();
|
bool primary_is_merged = ! merged_semantics () || needs_merged_primary || is_merged ();
|
||||||
|
|
||||||
if (other == subject_regionptr ()) {
|
std::vector<unsigned int> other_layers;
|
||||||
other_layer = subject_idlayer ();
|
|
||||||
other_is_merged = primary_is_merged;
|
if (! has_other) {
|
||||||
} else if (other == foreign_regionptr ()) {
|
|
||||||
other_layer = foreign_idlayer ();
|
other_layers.push_back (other == foreign_regionptr () ? foreign_idlayer () : subject_idlayer ());
|
||||||
other_is_merged = primary_is_merged;
|
other_is_merged = primary_is_merged;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
other_deep = dynamic_cast<const db::DeepRegion *> (other->delegate ());
|
other_deep = dynamic_cast<const db::DeepRegion *> (other->delegate ());
|
||||||
if (! other_deep) {
|
if (! other_deep) {
|
||||||
return db::AsIfFlatRegion::run_check (rel, different_polygons, other, d, options);
|
return db::AsIfFlatRegion::run_check (rel, different_polygons, other, d, options);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! other->merged_semantics ()) {
|
if (! other->merged_semantics ()) {
|
||||||
other_layer = other_deep->deep_layer ().layer ();
|
other_layers.push_back (other_deep->deep_layer ().layer ());
|
||||||
other_is_merged = true;
|
other_is_merged = true;
|
||||||
} else if (options.whole_edges) {
|
} else if (options.whole_edges) {
|
||||||
// NOTE: whole edges needs both inputs merged
|
// NOTE: whole edges needs both inputs merged
|
||||||
other_layer = other_deep->merged_deep_layer ().layer ();
|
other_layers.push_back (other_deep->merged_deep_layer ().layer ());
|
||||||
other_is_merged = true;
|
other_is_merged = true;
|
||||||
} else {
|
} else {
|
||||||
other_layer = other_deep->deep_layer ().layer ();
|
other_layers.push_back (other_deep->deep_layer ().layer ());
|
||||||
other_is_merged = other->is_merged ();
|
other_is_merged = other->is_merged ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// adds another intruder section to implement subject merging ("primary_intruders")
|
||||||
|
if (! primary_is_merged) {
|
||||||
|
other_layers.push_back (foreign_idlayer ());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const db::DeepLayer &polygons = needs_merged_primary ? merged_deep_layer () : deep_layer ();
|
const db::DeepLayer &polygons = needs_merged_primary ? merged_deep_layer () : deep_layer ();
|
||||||
|
|
@ -2427,7 +2436,7 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
|
||||||
|
|
||||||
if (options.prop_constraint == db::IgnoreProperties) {
|
if (options.prop_constraint == db::IgnoreProperties) {
|
||||||
|
|
||||||
db::CheckLocalOperation op (check, different_polygons, primary_is_merged, other_deep != 0, other_is_merged, options);
|
db::CheckLocalOperation op (check, different_polygons, primary_is_merged, has_other, other_is_merged, options);
|
||||||
|
|
||||||
db::local_processor<db::PolygonRef, db::PolygonRef, db::EdgePair> proc (subject_layout, subject_top,
|
db::local_processor<db::PolygonRef, db::PolygonRef, db::EdgePair> proc (subject_layout, subject_top,
|
||||||
intruder_layout, intruder_top,
|
intruder_layout, intruder_top,
|
||||||
|
|
@ -2436,7 +2445,7 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
|
||||||
configure_proc (proc);
|
configure_proc (proc);
|
||||||
proc.set_threads (polygons.store ()->threads ());
|
proc.set_threads (polygons.store ()->threads ());
|
||||||
|
|
||||||
proc.run (&op, polygons.layer (), other_layer, res->deep_layer ().layer ());
|
proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ());
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|
@ -2449,7 +2458,7 @@ DeepRegion::run_check (db::edge_relation_type rel, bool different_polygons, cons
|
||||||
configure_proc (proc);
|
configure_proc (proc);
|
||||||
proc.set_threads (polygons.store ()->threads ());
|
proc.set_threads (polygons.store ()->threads ());
|
||||||
|
|
||||||
proc.run (&op, polygons.layer (), other_layer, res->deep_layer ().layer ());
|
proc.run (&op, polygons.layer (), other_layers, res->deep_layer ().layer ());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2123,3 +2123,13 @@ TEST(149d_compound_drc_with_mag)
|
||||||
{
|
{
|
||||||
run_test (_this, "149", true);
|
run_test (_this, "149", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(150_optimized_separation)
|
||||||
|
{
|
||||||
|
run_test (_this, "150", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(150d_optimized_separation)
|
||||||
|
{
|
||||||
|
run_test (_this, "150", true);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,20 @@
|
||||||
|
source $drc_test_source
|
||||||
|
target $drc_test_target
|
||||||
|
|
||||||
|
if $drc_test_deep
|
||||||
|
deep
|
||||||
|
end
|
||||||
|
|
||||||
|
deep
|
||||||
|
|
||||||
|
l1 = input(1, 0)
|
||||||
|
l2 = input(2, 0)
|
||||||
|
|
||||||
|
l1.output(1, 0)
|
||||||
|
l2.output(2, 0)
|
||||||
|
|
||||||
|
l1.space(1.um).output(100, 0)
|
||||||
|
l1.sep(l2, 1.um).output(101, 0)
|
||||||
|
(l1 + l2).space(1.um, transparent).output(102, 0)
|
||||||
|
(l1 + l2).space(1.um).output(103, 0)
|
||||||
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in New Issue