Added documentation for new DRC feature

This commit is contained in:
Matthias Koefferlein 2024-06-25 22:20:48 +02:00
parent 58d53636cb
commit 10880e078b
8 changed files with 125 additions and 30 deletions

View File

@ -914,6 +914,36 @@ run_demo gen, "input.sized(1.um, octagon_limit)", "drc_sized4.png"
run_demo gen, "input.sized(1.um, square_limit)", "drc_sized5.png"
run_demo gen, "input.sized(1.um, acute_limit)", "drc_sized6.png"
class Gen
def produce(s1, s2)
pts = [
RBA::Point::new(1000, 1000),
RBA::Point::new(1000, 2000),
RBA::Point::new(2000, 2000),
RBA::Point::new(2000, 1000)
];
s1.insert(RBA::Polygon::new(pts))
pts = [
RBA::Point::new(1000, 1000),
RBA::Point::new(1000, 7000),
RBA::Point::new(6000, 7000),
RBA::Point::new(6000, 1000),
RBA::Point::new(5000, 1000),
RBA::Point::new(5000, 6000),
RBA::Point::new(2000, 6000),
RBA::Point::new(2000, 1000)
];
s2.insert(RBA::Polygon::new(pts))
end
end
gen = Gen::new
run_demo gen, "input1.sized(1.um, steps(1), inside(input2))", "drc_sized_inside1.png"
run_demo gen, "input1.sized(2.um, steps(2), inside(input2))", "drc_sized_inside2.png"
run_demo gen, "input1.sized(3.um, steps(3), inside(input2))", "drc_sized_inside3.png"
run_demo gen, "input1.sized(10.um, steps(10), inside(input2))", "drc_sized_inside4.png"
class Gen
def produce(s1, s2)
pts = [

View File

@ -3056,18 +3056,27 @@ The following images shows the effect of some rectangle filter modes:
<p>Usage:</p>
<ul>
<li><tt>layer.size(d [, mode])</tt></li>
<li><tt>layer.size(dx, dy [, mode]))</tt></li>
<li><tt>layer.size(d, inside(l) [, steps(n)] [, mode])</tt></li>
<li><tt>layer.size(d, outside(l) [, steps(n)] [, mode])</tt></li>
<li><tt>layer.size(dx, dy [, mode])</tt></li>
<li><tt>layer.size(dx, dy, inside(l) [, steps(n)] [, mode])</tt></li>
<li><tt>layer.size(dx, dy, outside(l) [, steps(n)] [, mode])</tt></li>
</ul>
<p>
See <a href="#sized">sized</a>. The size method basically does the same but modifies the layer
See <a href="#sized">sized</a> for a description of the options.
The size method basically does the same but modifies the layer
it is called on. The input layer is returned and available for further processing.
</p>
<a name="sized"/><h2>"sized" - Polygon sizing (per-edge biasing)</h2>
<keyword name="sized"/>
<p>Usage:</p>
<ul>
<li><tt>layer.sized(d [, mode])</tt></li>
<li><tt>layer.sized(dx, dy [, mode]))</tt></li>
<li><tt>layer.sized(d [, mode] [, inside(l) [, steps(n)]])</tt></li>
<li><tt>layer.sized(d, inside(l) [, steps(n)] [, mode])</tt></li>
<li><tt>layer.sized(d, outside(l) [, steps(n)] [, mode])</tt></li>
<li><tt>layer.sized(dx, dy [, mode])</tt></li>
<li><tt>layer.sized(dx, dy, inside(l) [, steps(n)] [, mode])</tt></li>
<li><tt>layer.sized(dx, dy, outside(l) [, steps(n)] [, mode])</tt></li>
</ul>
<p>
This method requires a polygon layer. It will apply a bias per edge of the polygons
@ -3100,6 +3109,30 @@ layer.sized(300.nm).raw.merged(2)
Bias values can be given as floating-point values (in micron) or integer values (in
database units). To explicitly specify the unit, use the unit denominators.
</p><p>
The "inside" option and the "steps" option implement incremental size. Incremental
size means that the sizing value is applied in n steps. Between the steps, the sized
shape is confined to the "inside" layer by means of a boolean "AND" operation.
</p><p>
This scheme is used to implement latch-up rules where a device active region has to
be close to a well tap. By using the well layer as the "inside" layer, the size function
follows the well contours. The steps have to selected such that the per-step size value
is smaller than the minimum space of the well shapes. With that, the sized shapes will
not cross over to neighbor well regions. Specifically, the per-step size has to be less
than about 70% of the minimum space to account for the minimum corner-to-corner case
with Euclidian space measurements.
</p><p>
"inside" and "steps" can be used with positive sizing values only.
</p><p>
"outside" acts like "inside", but instead of confining the sized region to the
inside of the given layer, it is confined to be outside of that layer. Technically,
a boolean "NOT" is performed instead of a boolean "AND".
</p><p>
An example for the "inside" option is this:
</p><p>
<pre>
ntap.sized(30.um, inside(nwell), steps(100))
</pre>
</p><p>
<a href="#size">size</a> is working like <a href="#sized">sized</a> but modifies the layer it is called on.
</p><p>
The following images show the effect of various forms of the "sized" method:
@ -3118,6 +3151,19 @@ The following images show the effect of various forms of the "sized" method:
<td><img src="/images/drc_sized6.png"/></td>
</tr>
</table>
</p><p>
The effect of the "inside" option is shown here:
</p><p>
<table>
<tr>
<td><img src="/images/drc_sized_inside1.png"/></td>
<td><img src="/images/drc_sized_inside2.png"/></td>
</tr>
<tr>
<td><img src="/images/drc_sized_inside3.png"/></td>
<td><img src="/images/drc_sized_inside4.png"/></td>
</tr>
</table>
</p>
<a name="smoothed"/><h2>"smoothed" - Smoothes the polygons of the region</h2>
<keyword name="smoothed"/>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -125,6 +125,10 @@
<file alias="drc_sized4.png">doc/images/drc_sized4.png</file>
<file alias="drc_sized5.png">doc/images/drc_sized5.png</file>
<file alias="drc_sized6.png">doc/images/drc_sized6.png</file>
<file alias="drc_sized_inside1.png">doc/images/drc_sized_inside1.png</file>
<file alias="drc_sized_inside2.png">doc/images/drc_sized_inside2.png</file>
<file alias="drc_sized_inside3.png">doc/images/drc_sized_inside3.png</file>
<file alias="drc_sized_inside4.png">doc/images/drc_sized_inside4.png</file>
<file alias="drc_with_angle1.png">doc/images/drc_with_angle1.png</file>
<file alias="drc_with_angle2.png">doc/images/drc_with_angle2.png</file>
<file alias="drc_with_angle3.png">doc/images/drc_with_angle3.png</file>

View File

@ -4688,6 +4688,8 @@ TP_SCRIPT
# This method requires a polygon layer. It will apply a bias per edge of the polygons
# and return the biased layer. The layer that this method is called on is not modified.
#
# The alternative method \size works like \sized but modifies the layer it is called on.
#
# In the single-value form, that bias is applied both in horizontal or vertical direction.
# In the two-value form, the horizontal and vertical bias can be specified separately.
#
@ -4715,32 +4717,6 @@ TP_SCRIPT
# Bias values can be given as floating-point values (in micron) or integer values (in
# database units). To explicitly specify the unit, use the unit denominators.
#
# The "inside" option and the "steps" option implement incremental size. Incremental
# size means that the sizing value is applied in n steps. Between the steps, the sized
# shape is confined to the "inside" layer by means of a boolean "AND" operation.
#
# This scheme is used to implement latch-up rules where a device active region has to
# be close to a well tap. By using the well layer as the "inside" layer, the size function
# follows the well contours. The steps have to selected such that the per-step size value
# is smaller than the minimum space of the well shapes. With that, the sized shapes will
# not cross over to neighbor well regions. Specifically, the per-step size has to be less
# than about 70% of the minimum space to account for the minimum corner-to-corner case
# with Euclidian space measurements.
#
# "inside" and "steps" can be used with positive sizing values only.
#
# "outside" acts like "inside", but instead of confining the sized region to the
# inside of the given layer, it is confined to be outside of that layer. Technically,
# a boolean "NOT" is performed instead of a boolean "AND".
#
# An example for the "inside" option is this:
#
# @code
# ntap.sized(30.um, inside(nwell), steps(100))
# @/code
#
# \size is working like \sized but modifies the layer it is called on.
#
# The following images show the effect of various forms of the "sized" method:
#
# @table
@ -4757,6 +4733,45 @@ TP_SCRIPT
# @td @img(/images/drc_sized6.png) @/td
# @/tr
# @/table
#
# The "inside" option and the "steps" option implement incremental size. Incremental
# size means that the sizing value is applied in n steps. Between the steps, the sized
# shape is confined to the "inside" layer by means of a boolean "AND" operation.
#
# This scheme is used to implement latch-up rules where a device active region has to
# be close to a well tap. By using the well layer as the "inside" layer, the size function
# follows the well contours. The steps have to selected such that the per-step size value
# is smaller than the minimum space of the well shapes. With that, the sized shapes will
# not cross over to neighbor well regions. Specifically, the per-step size has to be less
# than about 70% of the minimum space to account for the minimum corner-to-corner case
# with Euclidian space measurements.
#
# "inside" and "steps" can be used with positive sizing values only.
# A steps value of 0 will not execute any sizing at all.
#
# "outside" acts like "inside", but instead of confining the sized region to the
# inside of the given layer, it is confined to be outside of that layer. Technically,
# a boolean "NOT" is performed instead of a boolean "AND".
#
# An example for the "inside" option is this:
#
# @code
# ntap.sized(30.um, inside(nwell), steps(100))
# @/code
#
# The effect of the "inside" option is shown here:
#
# @table
# @tr
# @td @img(/images/drc_sized_inside1.png) @/td
# @td @img(/images/drc_sized_inside2.png) @/td
# @/tr
# @tr
# @td @img(/images/drc_sized_inside3.png) @/td
# @td @img(/images/drc_sized_inside4.png) @/td
# @/tr
# @/table
#
# %DRC%
# @name size