diff --git a/src/db/db/dbRegion.cc b/src/db/db/dbRegion.cc index 9377d1f3a..d80c205c0 100644 --- a/src/db/db/dbRegion.cc +++ b/src/db/db/dbRegion.cc @@ -828,8 +828,13 @@ Region::selected_interacting_generic (const Region &other, int mode, bool touchi db::EdgeProcessor ep (m_report_progress, m_progress_desc); // shortcut - if (empty () || other.empty ()) { - if (mode <= 0) { + if (empty ()) { + return *this; + } else if (other.empty ()) { + // clear, if b is empty and + // * mode is inside or interacting and inverse is false ("inside" or "interacting") + // * mode is outside and inverse is true ("not outside") + if ((mode <= 0) != inverse) { return Region (); } else { return *this; @@ -879,8 +884,13 @@ void Region::select_interacting_generic (const Region &other, int mode, bool touching, bool inverse) { // shortcut - if (empty () || other.empty ()) { - if (mode <= 0) { + if (empty ()) { + return; + } else if (other.empty ()) { + // clear, if b is empty and + // * mode is inside or interacting and inverse is false ("inside" or "interacting") + // * mode is outside and inverse is true ("not outside") + if ((mode <= 0) != inverse) { clear (); } return; diff --git a/testdata/drc/drcSuiteTests.drc b/testdata/drc/drcSuiteTests.drc index 3602a6ca4..58aed5e23 100644 --- a/testdata/drc/drcSuiteTests.drc +++ b/testdata/drc/drcSuiteTests.drc @@ -13,6 +13,7 @@ def run_testsuite(dm, ic, tiled = false) c = input(3) x = input(10) y = input(11) + empty = input(1000) h = {} layers.each { |l| h[l] = true } @@ -123,6 +124,9 @@ def run_testsuite(dm, ic, tiled = false) message "--- interacting, in, not_in #{lb}" b.interacting(a).output(lb, dm) + b.not_interacting(a).output(lb, dm + 1) + b.interacting(empty).output(lb, dm + 2) + b.not_interacting(empty).output(lb, dm + 3) b.interacting(a).in(b).output(lb + 1, dm) (b|a).not_in(b).output(lb + 2, dm) x.in(b).output(lb + 3, dm) @@ -132,21 +136,73 @@ def run_testsuite(dm, ic, tiled = false) message "--- inside, outside, overlapping, interacting #{lb}" b.inside(c).output(lb, dm) + b.not_inside(c).output(lb, dm + 1) + b.inside(empty).output(lb, dm + 2) + b.not_inside(empty).output(lb, dm + 3) b.outside(c).output(lb + 1, dm) + b.not_outside(c).output(lb + 1, dm + 1) + b.outside(empty).output(lb + 1, dm + 2) + b.not_outside(empty).output(lb + 1, dm + 3) b.overlapping(c).output(lb + 2, dm) + b.not_overlapping(c).output(lb + 2, dm + 1) + b.overlapping(empty).output(lb + 2, dm + 2) + b.not_overlapping(empty).output(lb + 2, dm + 3) b.interacting(c).output(lb + 3, dm) + b.not_interacting(c).output(lb + 3, dm + 1) + b.interacting(empty).output(lb + 3, dm + 2) + b.not_interacting(empty).output(lb + 3, dm + 3) bdup = b.dup bdup.select_inside(c) bdup.xor(b.inside(c)).output(lb + 4, dm) bdup = b.dup + bdup.select_not_inside(c) + bdup.output(lb + 4, dm + 1) + bdup = b.dup + bdup.select_inside(empty) + bdup.output(lb + 4, dm + 2) + bdup = b.dup + bdup.select_not_inside(empty) + bdup.output(lb + 4, dm + 3) + bdup = b.dup bdup.select_outside(c) bdup.xor(b.outside(c)).output(lb + 5, dm) bdup = b.dup + bdup.select_not_outside(c) + bdup.output(lb + 5, dm + 1) + bdup = b.dup + bdup.select_outside(empty) + bdup.output(lb + 5, dm + 2) + bdup = b.dup + bdup.select_not_outside(empty) + bdup.output(lb + 5, dm + 3) + bdup = b.dup bdup.select_overlapping(c) bdup.xor(b.overlapping(c)).output(lb + 6, dm) bdup = b.dup + bdup.select_not_overlapping(c) + bdup.output(lb + 6, dm + 1) + bdup = b.dup + bdup.select_overlapping(empty) + bdup.output(lb + 6, dm + 2) + bdup = b.dup + bdup.select_not_overlapping(empty) + bdup.output(lb + 6, dm + 3) + bdup = b.dup bdup.select_interacting(c) bdup.xor(b.interacting(c)).output(lb + 7, dm) + bdup = b.dup + bdup.select_not_interacting(c) + bdup.output(lb + 7, dm + 1) + bdup = b.dup + bdup.select_interacting(empty) + bdup.output(lb + 7, dm + 2) + bdup = b.dup + bdup.select_not_interacting(empty) + bdup.output(lb + 7, dm + 3) + b.inside(empty).output(lb + 8, dm) + b.not_inside(empty).output(lb + 8, dm + 1) + b.outside(empty).output(lb + 9, dm) + b.not_outside(empty).output(lb + 9, dm + 1) lb += 10 message "--- merge #{lb}" diff --git a/testdata/drc/drcSuiteTests_au1.gds b/testdata/drc/drcSuiteTests_au1.gds index 5cb92178e..6af797867 100644 Binary files a/testdata/drc/drcSuiteTests_au1.gds and b/testdata/drc/drcSuiteTests_au1.gds differ diff --git a/testdata/drc/drcSuiteTests_au2.gds b/testdata/drc/drcSuiteTests_au2.gds index e59e510e5..116c6b98b 100644 Binary files a/testdata/drc/drcSuiteTests_au2.gds and b/testdata/drc/drcSuiteTests_au2.gds differ diff --git a/testdata/drc/drcSuiteTests_au3.gds b/testdata/drc/drcSuiteTests_au3.gds index 9a4beda7e..fa691b142 100644 Binary files a/testdata/drc/drcSuiteTests_au3.gds and b/testdata/drc/drcSuiteTests_au3.gds differ diff --git a/testdata/drc/drcSuiteTests_au4.gds b/testdata/drc/drcSuiteTests_au4.gds index e59e510e5..f0fbe7be3 100644 Binary files a/testdata/drc/drcSuiteTests_au4.gds and b/testdata/drc/drcSuiteTests_au4.gds differ