Clarification of negative edge output for two-layer DRC's.

This commit is contained in:
Matthias Koefferlein 2021-05-26 01:12:35 +02:00
parent 660b723678
commit 5e04ea6156
7 changed files with 99 additions and 17 deletions

View File

@ -269,6 +269,7 @@ gen = Gen::new
run_demo gen, "input1.separation(input2, 1.2, euclidian)", "drc_separation1.png"
run_demo gen, "input1.drc(separation(input2, euclidian) < 1.2)", "drc_separation1u.png"
run_demo gen, "input1.drc((separation(input2) >= 1.2).first_edges)", "drc_separation1un.png"
class Gen
def produce(s1, s2)

View File

@ -1024,7 +1024,7 @@ CODE
#
# With a lower and upper limit, the results are edges marking the positions on the
# primary shape where the condition is met.
# With a lower limit alone, these markers are formed by two, identical but opposite edges attached to
# With a lower limit alone, the results are edge pairs which are formed by two identical, but opposite edges attached to
# the primary shape. Without an upper limit only, the first edge of the marker is attached to the
# primary shape while the second edge is attached to the shape of the "other" layer.
#
@ -1034,6 +1034,12 @@ CODE
# @td @img(/images/drc_enc2u.png) @/td
# @/tr
# @/table
#
# When "larger than" constraints are used, this function will produce the edges from the
# first layer only. The result will still be edge pairs for consistency, but each edge pair holds one edge from
# the original polygon plus a reverse copy of that edge in the second member. Use "first_edges" to extract the
# actual edges from the first input (see \separation for an example).
#
# %DRC%
# @name separation
@ -1049,10 +1055,6 @@ CODE
# opposite and rectangle filtering. See \Layer#separation for details about opposite and
# rectangle error filtering.
#
# When "larger than" constraints are used, this function will produce the edges from the
# first layer. The result will still be edge pairs for consistency, but each edge pair holds one edge from
# the original polygon plus a reverse copy of that edge in the second member.
#
# @h3 Classic mode @/h3
#
# Like \enclosing, this function is available as a classic DRC function with a layer as the first
@ -1085,6 +1087,23 @@ CODE
# @td @img(/images/drc_separation1u.png) @/td
# @/tr
# @/table
#
# When "larger than" constraints are used, this function will produce the edges from the
# first layer only. The result will still be edge pairs for consistency, but each edge pair holds one edge from
# the original polygon plus a reverse copy of that edge in the second member. Use "first_edges" to extract the
# actual edges from the first input:
#
# @code
# l1_edges_without_l2 = l1.drc((separation(l2) >= 1.0).first_edges)
# @/code
#
# The following image shows the effect of such a negative-output separation check:
#
# @table
# @tr
# @td @img(/images/drc_separation1un.png) @/td
# @/tr
# @/table
# %DRC%
# @name overlap
@ -1128,6 +1147,12 @@ CODE
# @td @img(/images/drc_overlap2u.png) @/td
# @/tr
# @/table
#
# When "larger than" constraints are used, this function will produce the edges from the
# first layer only. The result will still be edge pairs for consistency, but each edge pair holds one edge from
# the original polygon plus a reverse copy of that edge in the second member. Use "first_edges" to extract the
# actual edges from the first input (see \separation for an example).
#
# %DRC%
# @name width
@ -1184,7 +1209,7 @@ CODE
#
# With a lower and upper limit or with the "equal" condition, the results are edges marking the positions on the
# primary shape where the condition is met.
# With a lower limit alone, these markers are formed by two, identical but opposite edges attached to
# With a lower limit alone, the results are edge pairs which are formed by two identical, but opposite edges attached to
# the primary shape. Without an upper limit only, both edges are attached to different sides of the primary
# shape.
#

View File

@ -586,7 +586,7 @@ These markers indicate the presence of the specified condition.
</p><p>
With a lower and upper limit, the results are edges marking the positions on the
primary shape where the condition is met.
With a lower limit alone, these markers are formed by two, identical but opposite edges attached to
With a lower limit alone, the results are edge pairs which are formed by two identical, but opposite edges attached to
the primary shape. Without an upper limit only, the first edge of the marker is attached to the
primary shape while the second edge is attached to the shape of the "other" layer.
</p><p>
@ -596,6 +596,11 @@ primary shape while the second edge is attached to the shape of the "other" laye
<td><img src="/images/drc_enc2u.png"/></td>
</tr>
</table>
</p><p>
When "larger than" constraints are used, this function will produce the edges from the
first layer only. The result will still be edge pairs for consistency, but each edge pair holds one edge from
the original polygon plus a reverse copy of that edge in the second member. Use "first_edges" to extract the
actual edges from the first input (see <a href="#separation">separation</a> for an example).
</p>
<a name="error"/><h2>"error" - Prints an error</h2>
<keyword name="error"/>
@ -1216,6 +1221,11 @@ errors = in.drc(overlap(other) &lt; 0.2.um)
<td><img src="/images/drc_overlap2u.png"/></td>
</tr>
</table>
</p><p>
When "larger than" constraints are used, this function will produce the edges from the
first layer only. The result will still be edge pairs for consistency, but each edge pair holds one edge from
the original polygon plus a reverse copy of that edge in the second member. Use "first_edges" to extract the
actual edges from the first input (see <a href="#separation">separation</a> for an example).
</p>
<a name="overlapping"/><h2>"overlapping" - Selects shapes overlapping with other shapes</h2>
<keyword name="overlapping"/>
@ -1511,6 +1521,23 @@ work in generating error markers.
<td><img src="/images/drc_separation1u.png"/></td>
</tr>
</table>
</p><p>
When "larger than" constraints are used, this function will produce the edges from the
first layer only. The result will still be edge pairs for consistency, but each edge pair holds one edge from
the original polygon plus a reverse copy of that edge in the second member. Use "first_edges" to extract the
actual edges from the first input:
</p><p>
<pre>
l1_edges_without_l2 = l1.drc((separation(l2) &gt;= 1.0).first_edges)
</pre>
</p><p>
The following image shows the effect of such a negative-output separation check:
</p><p>
<table>
<tr>
<td><img src="/images/drc_separation1un.png"/></td>
</tr>
</table>
</p>
<a name="silent"/><h2>"silent" - Resets verbose mode</h2>
<keyword name="silent"/>
@ -1863,7 +1890,7 @@ errors = in.drc(0.1.um &lt;= width &lt; 0.2.um)
</p><p>
With a lower and upper limit or with the "equal" condition, the results are edges marking the positions on the
primary shape where the condition is met.
With a lower limit alone, these markers are formed by two, identical but opposite edges attached to
With a lower limit alone, the results are edge pairs which are formed by two identical, but opposite edges attached to
the primary shape. Without an upper limit only, both edges are attached to different sides of the primary
shape.
</p><p>

View File

@ -214,7 +214,7 @@ new_layer = layer.collect { |polygon| polygon.transformed(t) }
<keyword name="collect_to_edge_pairs"/>
<p>Usage:</p>
<ul>
<li><tt>layer.collect { |object| ... }</tt></li>
<li><tt>layer.collect_to_edge_pairs { |object| ... }</tt></li>
</ul>
<p>
This method is similar to <a href="#collect">collect</a>, but creates an edge pair layer. It expects the block to
@ -224,7 +224,7 @@ deliver <class_doc href="EdgePair">EdgePair</class_doc>, <class_doc href="DEdgeP
<keyword name="collect_to_edges"/>
<p>Usage:</p>
<ul>
<li><tt>layer.collect { |object| ... }</tt></li>
<li><tt>layer.collect_to_edges { |object| ... }</tt></li>
</ul>
<p>
This method is similar to <a href="#collect">collect</a>, but creates an edge layer. It expects the block to
@ -235,7 +235,7 @@ contours will be turned into edge sequences.
<keyword name="collect_to_region"/>
<p>Usage:</p>
<ul>
<li><tt>layer.collect { |object| ... }</tt></li>
<li><tt>layer.collect_to_region { |object| ... }</tt></li>
</ul>
<p>
This method is similar to <a href="#collect">collect</a>, but creates a polygon layer. It expects the block to
@ -1438,7 +1438,7 @@ See <a href="#clean">clean</a> for a discussion of the raw state.
<p>
See <a href="#isolated">isolated</a> for a description of that method
</p>
<a name="isolated"/><h2>"isolated" - An isolation check</h2>
<a name="isolated"/><h2>"isolated" - An inter-polygon isolation check</h2>
<keyword name="isolated"/>
<p>Usage:</p>
<ul>
@ -1449,8 +1449,8 @@ See <a href="#isolated">isolated</a> for a description of that method
<b>Note: </b>"isolated" and "iso" are available as operators for the "universal DRC" function <a href="/about/drc_ref_layer.xml#drc">Layer#drc</a> within
the <a href="#DRC">DRC</a> framework. These variants have more options and are more intuitive to use. See <a href="/about/drc_ref_global.xml#isolated">isolated</a> for more details.
</p><p>
See <a href="#space">space</a> for a description of this method.
In contrast to <a href="#space">space</a>, this
See <a href="#space">space</a> for a description of this method. "isolated" is the space check variant which checks different polygons only.
In contrast to <a href="#space">space</a>, the "isolated"
method is available for polygon layers only, since only on such layers
different polygons can be identified.
</p><p>
@ -1845,7 +1845,7 @@ This method is available for polygons only.
It returns a new layer containing the selected shapes. A version which modifies self
is <a href="#select_not_overlapping">select_not_overlapping</a>.
</p>
<a name="notch"/><h2>"notch" - An intra-region spacing check</h2>
<a name="notch"/><h2>"notch" - An intra-polygon spacing check</h2>
<keyword name="notch"/>
<p>Usage:</p>
<ul>
@ -1855,8 +1855,9 @@ is <a href="#select_not_overlapping">select_not_overlapping</a>.
<b>Note: </b>"notch" is available as an operator for the "universal DRC" function <a href="/about/drc_ref_layer.xml#drc">Layer#drc</a> within
the <a href="#DRC">DRC</a> framework. This variant has more options and is more intuitive to use. See <a href="/about/drc_ref_global.xml#notch">notch</a> for more details.
</p><p>
See <a href="#space">space</a> for a description of this method.
In contrast to <a href="#space">space</a>, this
See <a href="#space">space</a> for a description of this method.
"notch" is the space check variant which finds space violations within a single polygon, but not against other polygons.
In contrast to <a href="#space">space</a>, the "notch"
method is available for polygon layers only, since only on such layers
different polygons can be identified. Also, opposite and rectangle error
filtering is not available for this method.
@ -1918,6 +1919,9 @@ on polygons and edges (input1: red, input2: blue):
<td><img src="/images/drc_or2.png"/></td>
</tr>
</table>
</p><p>
In deep mode, "or" or "|" does not imply merging. In deep mode,
"or" is an alias for "+" ("add").
</p>
<a name="output"/><h2>"output" - Outputs the content of the layer</h2>
<keyword name="output"/>
@ -2688,12 +2692,17 @@ The following images show the effect of various forms of the "sized" method:
<p>Usage:</p>
<ul>
<li><tt>layer.smoothed(d)</tt></li>
<li><tt>layer.smoothed(d, hv_keep)</tt></li>
</ul>
<p>
"Smoothing" returns a simplified version of the polygons. Simplification is
achieved by removing vertices unless the resulting polygon deviates by more
than the given distance d from the original polygon.
</p><p>
"hv_keep" is a boolean parameter which makes the smoothing function maintain
horizontal or vertical edges. The default is false, meaning horizontal or
vertical edges may be changed into tilted ones.
</p><p>
This method return a layer wit the modified polygons. Merged semantics applies for this
method (see <a href="#raw">raw</a> and <a href="#clean">clean</a>).
</p>

View File

@ -99,6 +99,25 @@ connect(contact, metal1)
errors = antenna_check(gate, metal1, 50.0)
</pre>
</p><p>
Usually antenna checks apply to multiple metal layers. In this case,
the connectivity needs to be extended after the first check to include
the next metal layers. This can be achieved with incremental connects:
</p><p>
<pre>
# provide connections up to metal1
connect(gate, poly)
connect(poly, contact)
connect(contact, metal1)
metal1_errors = antenna_check(gate, metal1, 50.0)
# now *add* connections up to metal2
connect(metal1, via1)
connect(via1, metal2)
metal2_errors = antenna_check(gate, metal2, 50.0)
... continue this scheme with further metal layers ...
</pre>
</p><p>
Plasma induced damage can be rectified by including diodes
which create a safe current path for discharging the metal
islands. Such diodes can be identified with a recognition layer

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

View File

@ -18,6 +18,7 @@
<file alias="drc_space3u.png">doc/images/drc_space3u.png</file>
<file alias="drc_separation1.png">doc/images/drc_separation1.png</file>
<file alias="drc_separation1u.png">doc/images/drc_separation1u.png</file>
<file alias="drc_separation1un.png">doc/images/drc_separation1un.png</file>
<file alias="drc_separation2.png">doc/images/drc_separation2.png</file>
<file alias="drc_separation3.png">doc/images/drc_separation3.png</file>
<file alias="drc_separation4.png">doc/images/drc_separation4.png</file>