Stepwise sizing: had to rename options
"inside" and "outside" was already taken. Now it is called "size_inside" and "size_outside".
|
|
@ -939,10 +939,10 @@ end
|
||||||
|
|
||||||
gen = Gen::new
|
gen = Gen::new
|
||||||
|
|
||||||
run_demo gen, "input1.sized(1.um, steps(1), inside(input2))", "drc_sized_inside1.png"
|
run_demo gen, "input1.sized(1.um, steps(1), size_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(2.um, steps(2), size_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(3.um, steps(3), size_inside(input2))", "drc_sized_inside3.png"
|
||||||
run_demo gen, "input1.sized(10.um, steps(10), inside(input2))", "drc_sized_inside4.png"
|
run_demo gen, "input1.sized(10.um, steps(10), size_inside(input2))", "drc_sized_inside4.png"
|
||||||
|
|
||||||
class Gen
|
class Gen
|
||||||
def produce(s1, s2)
|
def produce(s1, s2)
|
||||||
|
|
|
||||||
|
|
@ -3056,11 +3056,11 @@ The following images shows the effect of some rectangle filter modes:
|
||||||
<p>Usage:</p>
|
<p>Usage:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><tt>layer.size(d [, mode])</tt></li>
|
<li><tt>layer.size(d [, mode])</tt></li>
|
||||||
<li><tt>layer.size(d, inside(l) [, steps(n)] [, mode])</tt></li>
|
<li><tt>layer.size(d, size_inside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
<li><tt>layer.size(d, outside(l) [, steps(n)] [, mode])</tt></li>
|
<li><tt>layer.size(d, size_outside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
<li><tt>layer.size(dx, dy [, 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, size_inside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
<li><tt>layer.size(dx, dy, outside(l) [, steps(n)] [, mode])</tt></li>
|
<li><tt>layer.size(dx, dy, size_outside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
See <a href="#sized">sized</a> for a description of the options.
|
See <a href="#sized">sized</a> for a description of the options.
|
||||||
|
|
@ -3071,12 +3071,12 @@ it is called on. The input layer is returned and available for further processin
|
||||||
<keyword name="sized"/>
|
<keyword name="sized"/>
|
||||||
<p>Usage:</p>
|
<p>Usage:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><tt>layer.sized(d [, mode] [, inside(l) [, steps(n)]])</tt></li>
|
<li><tt>layer.sized(d [, mode] [, size_inside(l) [, steps(n)]])</tt></li>
|
||||||
<li><tt>layer.sized(d, inside(l) [, steps(n)] [, mode])</tt></li>
|
<li><tt>layer.sized(d, size_inside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
<li><tt>layer.sized(d, outside(l) [, steps(n)] [, mode])</tt></li>
|
<li><tt>layer.sized(d, size_outside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
<li><tt>layer.sized(dx, dy [, 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, size_inside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
<li><tt>layer.sized(dx, dy, outside(l) [, steps(n)] [, mode])</tt></li>
|
<li><tt>layer.sized(dx, dy, size_outside(l) [, steps(n)] [, mode])</tt></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
This method requires a polygon layer. It will apply a bias per edge of the polygons
|
This method requires a polygon layer. It will apply a bias per edge of the polygons
|
||||||
|
|
@ -3128,32 +3128,32 @@ The following images show the effect of various forms of the "sized" method:
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
</p><p>
|
</p><p>
|
||||||
The "inside" option and the "steps" option implement incremental size. Incremental
|
The "size_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
|
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.
|
shape is confined to the "size_inside" layer by means of a boolean "AND" operation.
|
||||||
</p><p>
|
</p><p>
|
||||||
This scheme is used to implement latch-up rules where a device active region has to
|
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
|
be close to a well tap. By using the well layer as the "size_inside" layer, the size function
|
||||||
follows the well contours. The steps have to selected such that the per-step size value
|
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
|
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
|
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
|
than about 70% of the minimum space to account for the minimum corner-to-corner case
|
||||||
with Euclidian space measurements.
|
with Euclidian space measurements.
|
||||||
</p><p>
|
</p><p>
|
||||||
"inside" and "steps" can be used with positive sizing values only.
|
"size_inside" and "steps" can be used with positive sizing values only.
|
||||||
A steps value of 0 will not execute any sizing at all.
|
A steps value of 0 will not execute any sizing at all.
|
||||||
</p><p>
|
</p><p>
|
||||||
"outside" acts like "inside", but instead of confining the sized region to the
|
"size_outside" acts like "size_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,
|
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".
|
a boolean "NOT" is performed instead of a boolean "AND".
|
||||||
</p><p>
|
</p><p>
|
||||||
An example for the "inside" option is this:
|
An example for the "size_inside" option is this:
|
||||||
</p><p>
|
</p><p>
|
||||||
<pre>
|
<pre>
|
||||||
ntap.sized(30.um, inside(nwell), steps(100))
|
ntap.sized(30.um, size_inside(nwell), steps(100))
|
||||||
</pre>
|
</pre>
|
||||||
</p><p>
|
</p><p>
|
||||||
The effect of the "inside" option is shown here:
|
The effect of the "size_inside" option is shown here:
|
||||||
</p><p>
|
</p><p>
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
|
|
|
||||||
|
|
@ -427,6 +427,8 @@ the netter object.
|
||||||
<p>Usage:</p>
|
<p>Usage:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><tt>name(layer, name)</tt></li>
|
<li><tt>name(layer, name)</tt></li>
|
||||||
|
<li><tt>name(layer, name, layer_number, datatype_number)</tt></li>
|
||||||
|
<li><tt>name(layer, name, layer_info)</tt></li>
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
Layer names are listed in the LayoutToNetlist (L2N) or LVS database. They
|
Layer names are listed in the LayoutToNetlist (L2N) or LVS database. They
|
||||||
|
|
@ -455,6 +457,12 @@ first time.
|
||||||
</p><p>
|
</p><p>
|
||||||
<a href="#name">name</a> can only be used once on a layer and the layer names must be
|
<a href="#name">name</a> can only be used once on a layer and the layer names must be
|
||||||
unique (not taken by another layer).
|
unique (not taken by another layer).
|
||||||
|
</p><p>
|
||||||
|
The layer/datatype or LayerInfo specification is optional and will
|
||||||
|
be used to configure the internal layout. This information is also
|
||||||
|
persisted inside database files. Specifying a layer/datatype information
|
||||||
|
is useful, if a layer is not an original layer, but is to be restored
|
||||||
|
to an actual layout layer later.
|
||||||
</p>
|
</p>
|
||||||
<a name="name_prefix"/><h2>"name_prefix" - Specifies the name prefix for auto-generated layer names</h2>
|
<a name="name_prefix"/><h2>"name_prefix" - Specifies the name prefix for auto-generated layer names</h2>
|
||||||
<keyword name="name_prefix"/>
|
<keyword name="name_prefix"/>
|
||||||
|
|
|
||||||
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.6 KiB |
|
Before Width: | Height: | Size: 6.7 KiB After Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 6.9 KiB After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.6 KiB |
|
|
@ -317,11 +317,11 @@ module DRC
|
||||||
DRCSizingSteps::new(arg)
|
DRCSizingSteps::new(arg)
|
||||||
end
|
end
|
||||||
|
|
||||||
def inside(arg)
|
def size_inside(arg)
|
||||||
DRCSizingInside::new(arg)
|
DRCSizingInside::new(arg)
|
||||||
end
|
end
|
||||||
|
|
||||||
def outside(arg)
|
def size_outside(arg)
|
||||||
DRCSizingOutside::new(arg)
|
DRCSizingOutside::new(arg)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -4678,12 +4678,12 @@ TP_SCRIPT
|
||||||
# %DRC%
|
# %DRC%
|
||||||
# @name sized
|
# @name sized
|
||||||
# @brief Polygon sizing (per-edge biasing)
|
# @brief Polygon sizing (per-edge biasing)
|
||||||
# @synopsis layer.sized(d [, mode] [, inside(l) [, steps(n)]])
|
# @synopsis layer.sized(d [, mode] [, size_inside(l) [, steps(n)]])
|
||||||
# @synopsis layer.sized(d, inside(l) [, steps(n)] [, mode])
|
# @synopsis layer.sized(d, size_inside(l) [, steps(n)] [, mode])
|
||||||
# @synopsis layer.sized(d, outside(l) [, steps(n)] [, mode])
|
# @synopsis layer.sized(d, size_outside(l) [, steps(n)] [, mode])
|
||||||
# @synopsis layer.sized(dx, dy [, mode])
|
# @synopsis layer.sized(dx, dy [, mode])
|
||||||
# @synopsis layer.sized(dx, dy, inside(l) [, steps(n)] [, mode])
|
# @synopsis layer.sized(dx, dy, size_inside(l) [, steps(n)] [, mode])
|
||||||
# @synopsis layer.sized(dx, dy, outside(l) [, steps(n)] [, mode])
|
# @synopsis layer.sized(dx, dy, size_outside(l) [, steps(n)] [, mode])
|
||||||
#
|
#
|
||||||
# This method requires a polygon layer. It will apply a bias per edge of the polygons
|
# 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.
|
# and return the biased layer. The layer that this method is called on is not modified.
|
||||||
|
|
@ -4734,32 +4734,32 @@ TP_SCRIPT
|
||||||
# @/tr
|
# @/tr
|
||||||
# @/table
|
# @/table
|
||||||
#
|
#
|
||||||
# The "inside" option and the "steps" option implement incremental size. Incremental
|
# The "size_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
|
# 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.
|
# shape is confined to the "size_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
|
# 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
|
# be close to a well tap. By using the well layer as the "size_inside" layer, the size function
|
||||||
# follows the well contours. The steps have to selected such that the per-step size value
|
# 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
|
# 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
|
# 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
|
# than about 70% of the minimum space to account for the minimum corner-to-corner case
|
||||||
# with Euclidian space measurements.
|
# with Euclidian space measurements.
|
||||||
#
|
#
|
||||||
# "inside" and "steps" can be used with positive sizing values only.
|
# "size_inside" and "steps" can be used with positive sizing values only.
|
||||||
# A steps value of 0 will not execute any sizing at all.
|
# 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
|
# "size_outside" acts like "size_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,
|
# 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".
|
# a boolean "NOT" is performed instead of a boolean "AND".
|
||||||
#
|
#
|
||||||
# An example for the "inside" option is this:
|
# An example for the "size_inside" option is this:
|
||||||
#
|
#
|
||||||
# @code
|
# @code
|
||||||
# ntap.sized(30.um, inside(nwell), steps(100))
|
# ntap.sized(30.um, size_inside(nwell), steps(100))
|
||||||
# @/code
|
# @/code
|
||||||
#
|
#
|
||||||
# The effect of the "inside" option is shown here:
|
# The effect of the "size_inside" option is shown here:
|
||||||
#
|
#
|
||||||
# @table
|
# @table
|
||||||
# @tr
|
# @tr
|
||||||
|
|
@ -4777,11 +4777,11 @@ TP_SCRIPT
|
||||||
# @name size
|
# @name size
|
||||||
# @brief Polygon sizing (per-edge biasing, modifies the layer)
|
# @brief Polygon sizing (per-edge biasing, modifies the layer)
|
||||||
# @synopsis layer.size(d [, mode])
|
# @synopsis layer.size(d [, mode])
|
||||||
# @synopsis layer.size(d, inside(l) [, steps(n)] [, mode])
|
# @synopsis layer.size(d, size_inside(l) [, steps(n)] [, mode])
|
||||||
# @synopsis layer.size(d, outside(l) [, steps(n)] [, mode])
|
# @synopsis layer.size(d, size_outside(l) [, steps(n)] [, mode])
|
||||||
# @synopsis layer.size(dx, dy [, mode])
|
# @synopsis layer.size(dx, dy [, mode])
|
||||||
# @synopsis layer.size(dx, dy, inside(l) [, steps(n)] [, mode])
|
# @synopsis layer.size(dx, dy, size_inside(l) [, steps(n)] [, mode])
|
||||||
# @synopsis layer.size(dx, dy, outside(l) [, steps(n)] [, mode])
|
# @synopsis layer.size(dx, dy, size_outside(l) [, steps(n)] [, mode])
|
||||||
#
|
#
|
||||||
# See \sized for a description of the options.
|
# See \sized for a description of the options.
|
||||||
# The size method basically does the same but modifies the layer
|
# The size method basically does the same but modifies the layer
|
||||||
|
|
|
||||||
|
|
@ -12,26 +12,26 @@ l2 = input(2, 0)
|
||||||
l1.output(1, 0)
|
l1.output(1, 0)
|
||||||
l2.output(2, 0)
|
l2.output(2, 0)
|
||||||
|
|
||||||
l1.sized(0.0, steps(50), inside(l2)).output(100, 0)
|
l1.sized(0.0, steps(50), size_inside(l2)).output(100, 0)
|
||||||
l1.sized(20.0, steps(0), inside(l2)).output(101, 0)
|
l1.sized(20.0, steps(0), size_inside(l2)).output(101, 0)
|
||||||
|
|
||||||
l1.sized(20.0, steps(50), inside(l2)).output(110, 0)
|
l1.sized(20.0, steps(50), size_inside(l2)).output(110, 0)
|
||||||
l1.sized(50.0, steps(50), outside(l2)).output(111, 0)
|
l1.sized(50.0, steps(50), size_outside(l2)).output(111, 0)
|
||||||
|
|
||||||
l1d = l1.dup
|
l1d = l1.dup
|
||||||
l1d.size(20.0, steps(50), inside(l2))
|
l1d.size(20.0, steps(50), size_inside(l2))
|
||||||
l1d.output(120, 0)
|
l1d.output(120, 0)
|
||||||
|
|
||||||
l1d = l1.dup
|
l1d = l1.dup
|
||||||
l1d.size(50.0, steps(50), outside(l2))
|
l1d.size(50.0, steps(50), size_outside(l2))
|
||||||
l1d.output(121, 0)
|
l1d.output(121, 0)
|
||||||
|
|
||||||
l1.sized(10.0, 20.0, steps(50), inside(l2)).output(130, 0)
|
l1.sized(10.0, 20.0, steps(50), size_inside(l2)).output(130, 0)
|
||||||
l1.sized(25.0, 50.0, steps(50), outside(l2)).output(131, 0)
|
l1.sized(25.0, 50.0, steps(50), size_outside(l2)).output(131, 0)
|
||||||
|
|
||||||
error = nil
|
error = nil
|
||||||
begin
|
begin
|
||||||
l2.sized(-1.0, steps(50), outside(l2))
|
l2.sized(-1.0, steps(50), size_outside(l2))
|
||||||
rescue
|
rescue
|
||||||
error = true
|
error = true
|
||||||
end
|
end
|
||||||
|
|
@ -41,7 +41,7 @@ end
|
||||||
|
|
||||||
error = nil
|
error = nil
|
||||||
begin
|
begin
|
||||||
l2.sized(-1.0, 2.0, steps(50), outside(l2))
|
l2.sized(-1.0, 2.0, steps(50), size_outside(l2))
|
||||||
rescue
|
rescue
|
||||||
error = true
|
error = true
|
||||||
end
|
end
|
||||||
|
|
|
||||||