Fixed #805 - introducing layer.count and layout.hier_count for DRC

This commit is contained in:
Matthias Koefferlein 2021-05-26 22:11:47 +02:00
parent 5e04ea6156
commit 2e63628ddd
5 changed files with 94 additions and 7 deletions

View File

@ -276,16 +276,37 @@ module DRC
end end
# %DRC% # %DRC%
# @name size # @name count
# @brief Returns the number of objects on the layer # @brief Returns the number of objects on the layer
# @synopsis layer.size # @synopsis layer.count
# #
# The number of objects is the number of raw objects, not merged # The count is the number of raw objects, not merged
# regions or edges. It is more efficent to call this method on output layers than # regions or edges. This is the flat count - the number of polygons,
# on input layers. # edges or edge pairs seen from the top cell.
# "count" can be computationally expensive for original layers with
# clip regions or cell tree filters.
#
# See \hier_count for a hierarchical (each cell counts once) count.
def size def count
self.data.size self.data.count
end
# %DRC%
# @name hier_count
# @brief Returns the hierarchical number of objects on the layer
# @synopsis layer.hier_count
#
# The hier_count is the number of raw objects, not merged
# regions or edges, with each cell counting once.
# A high \count to hier_count (flat to hierarchical) ratio is an indication
# of a good hierarchical compression.
# "hier_count" applies only to original layers without clip regions or
# cell filters and to layers in \deep mode. Otherwise, hier_count gives
# the same value than \count.
def hier_count
self.data.hier_count
end end
# %DRC% # %DRC%

View File

@ -275,6 +275,21 @@ The following images show the effect of this method:
</tr> </tr>
</table> </table>
</p> </p>
<a name="count"/><h2>"count" - Returns the number of objects on the layer</h2>
<keyword name="count"/>
<p>Usage:</p>
<ul>
<li><tt>layer.count</tt></li>
</ul>
<p>
The count is the number of raw objects, not merged
regions or edges. This is the flat count - the number of polygons,
edges or edge pairs seen from the top cell.
"count" can be computationally expensive for original layers with
clip regions or cell tree filters.
</p><p>
See <a href="#hier_count">hier_count</a> for a hierarchical (each cell counts once) count.
</p>
<a name="covering"/><h2>"covering" - Selects shapes or regions of self which completely cover (enclose) one or more shapes from the other region</h2> <a name="covering"/><h2>"covering" - Selects shapes or regions of self which completely cover (enclose) one or more shapes from the other region</h2>
<keyword name="covering"/> <keyword name="covering"/>
<p>Usage:</p> <p>Usage:</p>
@ -1187,6 +1202,21 @@ l = nil
</p><p> </p><p>
By setting the layer to nil, it is ensured that it can no longer be accessed. By setting the layer to nil, it is ensured that it can no longer be accessed.
</p> </p>
<a name="hier_count"/><h2>"hier_count" - Returns the hierarchical number of objects on the layer</h2>
<keyword name="hier_count"/>
<p>Usage:</p>
<ul>
<li><tt>layer.hier_count</tt></li>
</ul>
<p>
The hier_count is the number of raw objects, not merged
regions or edges, with each cell counting once.
A high <a href="#count">count</a> to hier_count (flat to hierarchical) ratio is an indication
of a good hierarchical compression.
"hier_count" applies only to original layers without clip regions or
cell filters and to layers in <a href="#deep">deep</a> mode. Otherwise, hier_count gives
the same value than <a href="#count">count</a>.
</p>
<a name="holes"/><h2>"holes" - Selects all polygon holes from the input</h2> <a name="holes"/><h2>"holes" - Selects all polygon holes from the input</h2>
<keyword name="holes"/> <keyword name="holes"/>
<p>Usage:</p> <p>Usage:</p>

View File

@ -3,7 +3,17 @@ dbu 0.001
target($drc_test_target, "TOP") target($drc_test_target, "TOP")
def self.expect_count(layer, c, hc, where)
if layer.count != c
raise(where + ": Layer count #{layer.count} does not equal #{c}")
end
if layer.hier_count != hc
raise(where + ": Layer hier count #{layer.hier_count} does not equal #{c}")
end
end
x = polygon_layer x = polygon_layer
expect_count(x, 0, 0, "empty layer")
x.is_empty? == true || raise("unexpected value") x.is_empty? == true || raise("unexpected value")
x.is_box? == false || raise("unexpected value") x.is_box? == false || raise("unexpected value")
x.insert(box(4.0, 0, 4.7, 0.7)) x.insert(box(4.0, 0, 4.7, 0.7))
@ -12,6 +22,7 @@ x.is_box? == true || raise("unexpected value")
x.insert(polygon([ p(0, 0), p(2.0, 0), p(1.0, 1.0) ])) x.insert(polygon([ p(0, 0), p(2.0, 0), p(1.0, 1.0) ]))
x.insert(polygon([ p(0, -5.0), p(2.0, -5.0), p(1.0, -6.0) ])) x.insert(polygon([ p(0, -5.0), p(2.0, -5.0), p(1.0, -6.0) ]))
x.insert(path([ p(0, -2), p(2.0, -2) ], 0.2)) x.insert(path([ p(0, -2), p(2.0, -2) ], 0.2))
expect_count(x, 4, 4, "after 3x insert")
x.is_box? == false || raise("unexpected value") x.is_box? == false || raise("unexpected value")
x.output(10, 0) x.output(10, 0)

View File

@ -2,6 +2,15 @@
target($drc_test_target, "TOP") target($drc_test_target, "TOP")
source($drc_test_source, "TOP") source($drc_test_source, "TOP")
def self.expect_count(layer, c, hc, where)
if layer.count != c
raise(where + ": Layer count #{layer.count} does not equal #{c}")
end
if layer.hier_count != hc
raise(where + ": Layer hier count #{layer.hier_count} does not equal #{c}")
end
end
a1 = input(1) a1 = input(1)
b1 = input(2) b1 = input(2)
c1 = input(3) c1 = input(3)
@ -89,3 +98,6 @@ a1.edges.collect_to_region { |p| p.length < 0.8 && p.bbox.transformed(RBA::VCplx
a1.width(1.5).collect { |p| p.transformed(RBA::VCplxTrans::new(1000.0)) }.output(1120, 0) a1.width(1.5).collect { |p| p.transformed(RBA::VCplxTrans::new(1000.0)) }.output(1120, 0)
a1.width(1.5).collect_to_edge_pairs { |p| p.transformed(RBA::VCplxTrans::new(1000.0)) }.output(1121, 0) a1.width(1.5).collect_to_edge_pairs { |p| p.transformed(RBA::VCplxTrans::new(1000.0)) }.output(1121, 0)
expect_count(a1.edges, 9, 9, "a1.edges")
expect_count(a1.width(1.5), 5, 5, "a1.width(1.5)")

View File

@ -4,6 +4,15 @@
source($drc_test_source, "TOPTOP_SMALL") source($drc_test_source, "TOPTOP_SMALL")
target($drc_test_target) target($drc_test_target)
def self.expect_count(layer, c, hc, where)
if layer.count != c
raise(where + ": Layer count #{layer.count} does not equal #{c}")
end
if layer.hier_count != hc
raise(where + ": Layer hier count #{layer.hier_count} does not equal #{c}")
end
end
cell("TOPTOP_SMALL") cell("TOPTOP_SMALL")
l1_flat = input(1) l1_flat = input(1)
@ -66,12 +75,16 @@ r.output(1023, 0)
r.extents.output(1123, 0) r.extents.output(1123, 0)
r = l1.space(0.5) r = l1.space(0.5)
expect_count(r, 3, 1, "r on l1")
r.output(1010, 0) r.output(1010, 0)
r.extents.output(1110, 0) r.extents.output(1110, 0)
expect_count(l1, 15, 5, "l1 before flatten")
l1.flatten l1.flatten
expect_count(l1, 15, 15, "l1 after flatten")
r = l1.space(0.5) r = l1.space(0.5)
r.output(1011, 0) r.output(1011, 0)
r.extents.output(1111, 0) r.extents.output(1111, 0)
expect_count(r, 3, 1, "r on l1.flatten")