WIP: Doc updates, doc bug fixes

This commit is contained in:
Matthias Koefferlein 2023-01-21 21:37:40 +01:00
parent 30ee5e183f
commit dea1ca6451
7 changed files with 532 additions and 41 deletions

View File

@ -984,7 +984,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"@brief Gets a flag indicating whether minimum coherence is selected\n"
"See \\min_coherence= for a description of this attribute.\n"
) +
method_ext ("complex_op", &complex_op, gsi::arg ("node"), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("complex_op", &complex_op, gsi::arg ("node"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Executes a complex operation (see \\CompoundRegionOperationNode for details)\n"
"\n"
"This method has been introduced in version 0.27."
@ -1616,7 +1616,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"\n"
"Merged semantics applies for this method (see \\merged_semantics= for a description of this concept)\n"
) +
method_ext ("andnot", &andnot, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("andnot", &andnot, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Returns the boolean AND and NOT between self and the other region\n"
"\n"
"@return A two-element array of regions with the first one being the AND result and the second one being the NOT result\n"
@ -1634,7 +1634,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"This method will compute the boolean AND (intersection) between two regions. "
"The result is often but not necessarily always merged.\n"
) +
method ("and", &db::Region::bool_and, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties),
method ("and", &db::Region::bool_and, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Returns the boolean AND between self and the other region\n"
"\n"
"@return The result of the boolean AND operation\n"
@ -1654,7 +1654,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"This method will compute the boolean AND (intersection) between two regions. "
"The result is often but not necessarily always merged.\n"
) +
method ("and_with", &db::Region::bool_and_with, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties),
method ("and_with", &db::Region::bool_and_with, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs the boolean AND between self and the other region\n"
"\n"
"@return The region after modification (self)\n"
@ -1674,7 +1674,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"This method will compute the boolean NOT (intersection) between two regions. "
"The result is often but not necessarily always merged.\n"
) +
method ("not", &db::Region::bool_not, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties),
method ("not", &db::Region::bool_not, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Returns the boolean NOT between self and the other region\n"
"\n"
"@return The result of the boolean NOT operation\n"
@ -1694,7 +1694,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"This method will compute the boolean NOT (intersection) between two regions. "
"The result is often but not necessarily always merged.\n"
) +
method ("not_with", &db::Region::bool_not_with, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties),
method ("not_with", &db::Region::bool_not_with, gsi::arg ("other"), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs the boolean NOT between self and the other region\n"
"\n"
"@return The region after modification (self)\n"
@ -2515,7 +2515,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"\n"
"This variant was introduced in version 0.27.\n"
) +
method_ext ("width_check", &width2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("width_check", &width2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs a width check with options\n"
"@param d The minimum width for which the polygons are checked\n"
"@param whole_edges If true, deliver the whole edges\n"
@ -2525,7 +2525,8 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"@param max_projection The upper limit of the projected length of one edge onto another\n"
"@param shielded Enables shielding\n"
"@param negative If true, edges not violation the condition will be output as pseudo-edge pairs\n"
"@param property_constraint Only \\IgnoreProperties and \\NoPropertyConstraint are allowed - in the last case, properties are copied from the original shapes to the output"
"@param property_constraint Only \\IgnoreProperties and \\NoPropertyConstraint are allowed - in the last case, properties are copied from the original shapes to the output. "
"Other than 'width' allow more options here.\n"
"\n"
"This version is similar to the simple version with one parameter. In addition, it allows "
"to specify many more options.\n"
@ -2557,7 +2558,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The 'shielded' and 'negative' options have been introduced in version 0.27. "
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("space_check", &space2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("space_check", &space2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs a space check with options\n"
"@param d The minimum space for which the polygons are checked\n"
"@param whole_edges If true, deliver the whole edges\n"
@ -2600,7 +2601,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The 'shielded', 'negative', 'not_opposite' and 'rect_sides' options have been introduced in version 0.27.\n"
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("notch_check", &notch2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("notch_check", &notch2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs a space check between edges of the same polygon with options\n"
"@param d The minimum space for which the polygons are checked\n"
"@param whole_edges If true, deliver the whole edges\n"
@ -2643,7 +2644,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The 'shielded' and 'negative' options have been introduced in version 0.27.\n"
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("isolated_check", &isolated2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("isolated_check", &isolated2, gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs a space check between edges of different polygons with options\n"
"@param d The minimum space for which the polygons are checked\n"
"@param whole_edges If true, deliver the whole edges\n"
@ -2686,7 +2687,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The 'shielded', 'negative', 'not_opposite' and 'rect_sides' options have been introduced in version 0.27.\n"
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("inside_check|enclosed_check", &inside2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("inside_check|enclosed_check", &inside2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs an inside check with options\n"
"@param d The minimum distance for which the polygons are checked\n"
"@param other The other region against which to check\n"
@ -2737,7 +2738,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The 'enclosed_check' alias was introduced in version 0.27.5.\n"
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("overlap_check", &overlap2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("overlap_check", &overlap2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs an overlap check with options\n"
"@param d The minimum overlap for which the polygons are checked\n"
"@param other The other region against which to check\n"
@ -2787,7 +2788,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The interpretation of the 'negative' flag has been restriced to first-layout only output in 0.27.1.\n"
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("enclosing_check", &enclosing2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("enclosing_check", &enclosing2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs an enclosing check with options\n"
"@param d The minimum enclosing distance for which the polygons are checked\n"
"@param other The other region against which to check\n"
@ -2837,7 +2838,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"The interpretation of the 'negative' flag has been restriced to first-layout only output in 0.27.1.\n"
"'property_constraint' has been added in version 0.28.4."
) +
method_ext ("separation_check", &separation2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties),
method_ext ("separation_check", &separation2, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::metrics_type::Euclidian, "Euclidian"), gsi::arg ("ignore_angle", tl::Variant (), "default"), gsi::arg ("min_projection", tl::Variant (), "0"), gsi::arg ("max_projection", tl::Variant (), "max"), gsi::arg ("shielded", true), gsi::arg ("opposite_filter", db::NoOppositeFilter, "NoOppositeFilter"), gsi::arg ("rect_filter", db::NoRectFilter, "NoRectFilter"), gsi::arg ("negative", false), gsi::arg ("property_constraint", db::IgnoreProperties, "IgnoreProperties"),
"@brief Performs a separation check with options\n"
"@param d The minimum separation for which the polygons are checked\n"
"@param other The other region against which to check\n"
@ -3067,15 +3068,22 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
) +
gsi::method_ext ("nets", &nets, gsi::arg ("extracted"), gsi::arg ("net_prop_name", tl::Variant (), "nil"), gsi::arg ("net_filter", (const std::vector<const db::Net *> *) (0), "nil"),
"@brief Pulls the net shapes from a LayoutToNetlist database\n"
"This method will pull the net shapes from the LayoutToNetlist database, provided that this "
"region was an input to the netlist extraction.\n"
"This method will create a new layer with the net shapes from the LayoutToNetlist database, provided that this "
"region was an input to the netlist extraction on this database.\n"
"\n"
"A (net name, net id) tuple will be attached as properties to the shapes if 'net_prop_name' is given and not nil. "
"This allows generating unique properties per shape flagging the net the shape is on. This feature is good for "
"A (circuit name, net name) tuple will be attached as properties to the shapes if 'net_prop_name' is given and not nil. "
"This allows generating unique properties per shape, flagging the net the shape is on. This feature is good for "
"performing net-dependent booleans and DRC checks.\n"
"\n"
"A net filter can be provided with the 'net_filter' argument. If given, only nets from this "
"set are produced.\n"
"set are produced. Example:\n"
"\n"
"@code\n"
"connect(metal1, via1)\n"
"connect(via1, metal2)\n"
"\n"
"metal1_all_nets = metal1.nets\n"
"@/code\n"
"\n"
"This method was introduced in version 0.28.4"
) +
@ -3117,7 +3125,7 @@ Class<db::Region> decl_Region (decl_dbShapeCollection, "db", "Region",
"This class has been introduced in version 0.23.\n"
);
gsi::EnumIn<db::Region, db::metrics_type> decl_Region_Metrics ("db", "Metrics",
gsi::Enum<db::metrics_type> decl_Metrics ("db", "Metrics",
gsi::enum_const ("Euclidian", db::Euclidian,
"@brief Specifies Euclidian metrics for the check functions\n"
"This value can be used for the metrics parameter in the check functions, i.e. \\width_check. "
@ -3154,10 +3162,10 @@ gsi::EnumIn<db::Region, db::metrics_type> decl_Region_Metrics ("db", "Metrics",
// Inject the Region::Metrics declarations into Region and Edges:
// (Edges injection has to be done here because only here defs() is available)
gsi::ClassExt<db::Region> inject_Metrics_in_parent (decl_Region_Metrics.defs ());
gsi::ClassExt<db::Edges> inject_Metrics_in_Edges (decl_Region_Metrics.defs ());
gsi::ClassExt<db::Region> inject_Metrics_in_Region (decl_Metrics.defs ());
gsi::ClassExt<db::Edges> inject_Metrics_in_Edges (decl_Metrics.defs ());
gsi::EnumIn<db::Region, db::PropertyConstraint> decl_Region_PropertyConstraint ("db", "PropertyConstraint",
gsi::Enum<db::PropertyConstraint> decl_PropertyConstraint ("db", "PropertyConstraint",
gsi::enum_const ("IgnoreProperties", db::IgnoreProperties,
"@brief Specifies to ignore properties\n"
"When using this constraint - for example on a boolean operation - properties are ignored and are not generated in the output."
@ -3194,10 +3202,10 @@ gsi::EnumIn<db::Region, db::PropertyConstraint> decl_Region_PropertyConstraint (
// Inject the Region::PropertyConstraint declarations into Region and Edges:
// (Edges injection has to be done here because only here defs() is available)
gsi::ClassExt<db::Region> inject_PropertyConstraint_in_parent (decl_Region_PropertyConstraint.defs ());
gsi::ClassExt<db::Edges> inject_PropertyConstraint_in_Edges (decl_Region_PropertyConstraint.defs ());
gsi::ClassExt<db::Region> inject_PropertyConstraint_in_Region (decl_PropertyConstraint.defs ());
gsi::ClassExt<db::Edges> inject_PropertyConstraint_in_Edges (decl_PropertyConstraint.defs ());
gsi::EnumIn<db::Region, db::RectFilter> decl_Region_RectFilter ("db", "RectFilter",
gsi::EnumIn<db::Region, db::RectFilter> decl_RectFilter ("db", "RectFilter",
gsi::enum_const ("NoRectFilter", db::RectFilter::NoRectFilter,
"@brief Specifies no filtering"
) +
@ -3225,9 +3233,9 @@ gsi::EnumIn<db::Region, db::RectFilter> decl_Region_RectFilter ("db", "RectFilte
);
// Inject the Region::RectFilter declarations into Region:
gsi::ClassExt<db::Region> inject_RectFilter_in_parent (decl_Region_RectFilter.defs ());
gsi::ClassExt<db::Region> inject_RectFilter_in_Region (decl_RectFilter.defs ());
gsi::EnumIn<db::Region, db::OppositeFilter> decl_Region_OppositeFilter ("db", "OppositeFilter",
gsi::EnumIn<db::Region, db::OppositeFilter> decl_OppositeFilter ("db", "OppositeFilter",
gsi::enum_const ("NoOppositeFilter", db::OppositeFilter::NoOppositeFilter,
"@brief No opposite filtering\n"
) +
@ -3243,6 +3251,6 @@ gsi::EnumIn<db::Region, db::OppositeFilter> decl_Region_OppositeFilter ("db", "O
);
// Inject the Region::OppositeFilter declarations into Region:
gsi::ClassExt<db::Region> inject_OppositeFilter_in_parent (decl_Region_OppositeFilter.defs ());
gsi::ClassExt<db::Region> inject_OppositeFilter_in_Region (decl_OppositeFilter.defs ());
}

View File

@ -1413,6 +1413,72 @@ See <a href="/about/drc_ref_source.xml#polygons">Source#polygons</a> for a descr
The primary input of the universal DRC function is the layer the <a href="/about/drc_ref_layer.xml#drc">Layer#drc</a> function
is called on.
</p>
<a name="props_copy"/><h2>"props_copy" - Specifies "copy properties" on operations supporting user properties constraints</h2>
<keyword name="props_copy"/>
<p>
This properties constraint does not constrain the operation, but instructs it to
attach the properties from the primary input to the output objects.
</p><p>
See also <a href="#props_ne">props_ne</a> and <a href="#props_eq">props_eq</a>.
</p>
<a name="props_eq"/><h2>"props_eq" - Specifies "same properties" for operations supporting user properties constraints</h2>
<keyword name="props_eq"/>
<p>
Some operations such as boolean AND support properties constraints. By giving
a "props_eq" constraint, the operation is performed only on shapes with the same
properties, where "properties" stands for the full set of key/value pairs.
</p><p>
Note that you have to enable properties explicitly or generate properties (e.g.
with the <a href="/about/drc_ref_drclayer.xml#nets">DRCLayer#nets</a> method).
</p><p>
Example:
</p><p>
<pre>
connect(metal1, via1)
connect(via1, metal2)
... further connect statements
m1m2_overlap_connected = metal1.nets.and(metal2, props_eq)
</pre>
</p><p>
"props_eq" can be combined with <a href="#props_copy">props_copy</a>. In this case, properties
are transferred to the output shapes and can be used in further processing:
</p><p>
<pre>
m1m2_overlap_connected = metal1.nets.and(metal2, props_eq + props_copy)
</pre>
</p><p>
See also <a href="#props_ne">props_ne</a>.
</p>
<a name="props_ne"/><h2>"props_ne" - Specifies "different properties" for operations supporting user properties constraints</h2>
<keyword name="props_ne"/>
<p>
Some operations such as boolean AND support properties constraints. By giving
a "props_ne" constraint, the operation is performed only on shapes with different
properties, where "properties" stands for the full set of key/value pairs.
</p><p>
Note that you have to enable properties explicitly or generate properties (e.g.
with the <a href="/about/drc_ref_drclayer.xml#nets">DRCLayer#nets</a> method).
</p><p>
Example:
</p><p>
<pre>
connect(metal1, via1)
connect(via1, metal2)
... further connect statements
m1m2_overlap_not_connected = metal1.nets.and(metal2, props_ne)
</pre>
</p><p>
"props_ne" can be combined with <a href="#props_copy">props_copy</a>. In this case, properties
are transferred to the output shapes and can be used in further processing:
</p><p>
<pre>
m1m2_overlap_connected = metal1.nets.and(metal2, props_ne + props_copy)
</pre>
</p><p>
See also <a href="#props_eq">props_eq</a>.
</p>
<a name="rectangles"/><h2>"rectangles" - Selects all polygons which are rectangles</h2>
<keyword name="rectangles"/>
<p>Usage:</p>

View File

@ -61,11 +61,12 @@ is "<a href="#xor">xor</a>". See there for a description of the function.
<keyword name="and"/>
<p>Usage:</p>
<ul>
<li><tt>layer.and(other)</tt></li>
<li><tt>layer.and(other [, prop_constraint ])</tt></li>
</ul>
<p>
The method computes a boolean AND between self and other.
It is an alias for the "&amp;" operator.
It is an alias for the "&amp;" operator which lacks the ability
to specify a properties constraint.
</p><p>
This method is available for polygon and edge layers.
If the first operand is an edge layer and the second is a polygon layer, the
@ -92,6 +93,14 @@ polygons will be written to the output (labels: red, input2: blue):
<td><img src="/images/drc_textpoly1.png"/></td>
</tr>
</table>
</p><p>
When a properties constraint is given, the operation is performed
only between shapes with the given relation. Together with the
ability to provide net-annotated shapes through the <a href="#nets">nets</a> method, this
allows constraining the boolean operation to shapes from the same or
from different nets.
</p><p>
See <a href="/about/drc_ref_global.xml#prop_eq">prop_eq</a>, <a href="/about/drc_ref_global.xml#prop_ne">prop_ne</a> and <a href="/about/drc_ref_global.xml#prop_copy">prop_copy</a> for details.
</p>
<a name="andnot"/><h2>"andnot" - Computes Boolean AND and NOT results at the same time</h2>
<keyword name="andnot"/>
@ -343,7 +352,7 @@ of the layer's data.
<keyword name="drc"/>
<p>Usage:</p>
<ul>
<li><tt>layer.drc(expression)</tt></li>
<li><tt>layer.drc(expression [, prop_constraint ])</tt></li>
</ul>
<p>
This method implements the universal DRC which offers enhanced abilities,
@ -710,6 +719,24 @@ Note that the first line prepares the operation, but does not execute the area c
or the boolean operation. But when the "drc" function executes the loop over the primaries it will
only compute the area once per primary as it is represented by the same Ruby object.
</p><p>
<h3>Properties constraints </h3>
</p><p>
The method can be given a properties constraint so that it is only performed
between shapes with the same or different user properties. Note that properties
have to be enabled or generated (e.g. through the <a href="/about/drc_ref_drclayer.xml#nets">DRCLayer#nets</a> method) before they can
be used.
</p><p>
Example:
</p><p>
<pre>
connect(metal1, via1)
...
space_not_connected = metal1.nets.drc(space &lt; 0.4.um, props_ne)
</pre>
</p><p>
See <a href="/about/drc_ref_global.xml#props_eq">props_eq</a>, <a href="/about/drc_ref_global.xml#props_ne">props_ne</a> and <a href="/about/drc_ref_global.xml#props_copy">props_copy</a> for details.
</p><p>
<h3>Outlook </h3>
</p><p>
DRC expressions are quite rich and powerful. They provide a more intuitive way of
@ -1639,6 +1666,32 @@ i.e. before computing the length, the edges are merged unless
raw mode is chosen (see <a href="#raw">raw</a>). Hence in clean mode (see <a href="#clean">clean</a>), overlapping
edges are not counted twice.
</p>
<a name="map_props"/><h2>"map_props" - Selects properties with certain keys and allows key mapping</h2>
<keyword name="map_props"/>
<p>Usage:</p>
<ul>
<li><tt>layer.map_props({ key =&gt; key_new, .. })</tt></li>
</ul>
<p>
Similar to <a href="#select_props">select_props</a>, this method will map or filter properties and
and take the values from certain keys. In addition, this method allows
mapping keys to new keys. Specify a hash argument with old to new keys.
</p><p>
Property values with keys not listed in the hash are removed.
</p><p>
Note that this method returns a new layer with the new properties. The
original layer will not be touched.
</p><p>
For example to map key 2 to 1 (integer name keys) and ignore other keys,
use:
</p><p>
<pre>
layer1 = input(1, 0, enable_properties)
layer1_mapped = layer1.map_props({ 2 =&gt; 1 })
</pre>
</p><p>
See also <a href="#select_props">select_props</a> and <a href="#remove_props">remove_props</a>.
</p>
<a name="merge"/><h2>"merge" - Merges the layer (modifies the layer)</h2>
<keyword name="merge"/>
<p>Usage:</p>
@ -1740,6 +1793,53 @@ The following images shows the effect of the "moved" method:
</tr>
</table>
</p>
<a name="nets"/><h2>"nets" - Pulls net shapes from selected or all nets, optionally annotating nets with properties</h2>
<keyword name="nets"/>
<p>Usage:</p>
<ul>
<li><tt>layer.nets</tt></li>
<li><tt>layer.nets(net_filter)</tt></li>
<li><tt>layer.nets(circuit_filter, net_filter)</tt></li>
<li><tt>layer.nets(netter, ...)</tt></li>
<li><tt>layer.nets(prop(key), ...)</tt></li>
<li><tt>layer.nets(prop(key), ...)</tt></li>
</ul>
<p>
This method needs a layer that has been used in a connect statement.
It will take the shapes corresponding to this layer for all or selected nets
and attach the net identity in form of a user property.
</p><p>
This way, the resulting shapes can be used in property-constrained boolean operations
or DRC checks to implement operations in connected or non-connected mode.
</p><p>
A glob-style name pattern can be supplied to filter nets. Nets are always
complete - subnets from subcircuits are not selected. The net name is taken from
the net's home circuit (to topmost location where all net connections are formed).
You can specify a circuit filter to select nets from certain circuits only or
give a <class_doc href="Circuit">Circuit</class_doc> object explicitly.
</p><p>
<pre>
connect(metal1, via1)
connect(via1, metal2)
metal1_all_nets = metal1.nets
metal1_vdd = metal1.nets("VDD")
metal1_vdd = metal1.nets("TOPLEVEL", "VDD")
</pre>
</p><p>
By default, the property key used for the net identity is numerical 0 (integer). You
can change the key by giving a property key with the "prop" qualifier. Using "nil" for the key
will disable properties:
</p><p>
<pre>
metal1_vdd = metal1.nets("VDD", prop(1))
# disables properties:
metal1_vdd = metal1.nets("VDD", prop(nil))
</pre>
</p><p>
If a custom netter object has been used for the construction of the
connectivity, pass it to the "nets" method among the other arguments.
</p>
<a name="non_rectangles"/><h2>"non_rectangles" - Selects all polygons from the input which are not rectangles</h2>
<keyword name="non_rectangles"/>
<p>Usage:</p>
@ -1785,7 +1885,7 @@ This feature has been introduced in version 0.23.2.
<keyword name="not"/>
<p>Usage:</p>
<ul>
<li><tt>layer.not(other)</tt></li>
<li><tt>layer.not(other [, prop_constraint ])</tt></li>
</ul>
<p>
The method computes a boolean NOT between self and other.
@ -1816,6 +1916,14 @@ written to the output (labels: red, input2: blue):
<td><img src="/images/drc_textpoly2.png"/></td>
</tr>
</table>
</p><p>
When a properties constraint is given, the operation is performed
only between shapes with the given relation. Together with the
ability to provide net-annotated shapes through the <a href="#nets">nets</a> method, this
allows constraining the boolean operation to shapes from the same or
from different nets.
</p><p>
See <a href="/about/drc_ref_global.xml#prop_eq">prop_eq</a>, <a href="/about/drc_ref_global.xml#prop_ne">prop_ne</a> and <a href="/about/drc_ref_global.xml#prop_copy">prop_copy</a> for details.
</p>
<a name="not_covering"/><h2>"not_covering" - Selects shapes or regions of self which do not cover (enclose) one or more shapes from the other region</h2>
<keyword name="not_covering"/>
@ -2390,6 +2498,19 @@ This method is available for polygon layers. By default "merged" semantics appli
i.e. all polygons are merged before rectilinear polygons are selected (see <a href="#clean">clean</a> and <a href="#raw">raw</a>).
<a href="#non_rectilinear">non_rectilinear</a> will select all non-rectangles.
</p>
<a name="remove_props"/><h2>"remove_props" - Returns a new layer with all properties removed</h2>
<keyword name="remove_props"/>
<p>Usage:</p>
<ul>
<li><tt>layer.remove_props</tt></li>
</ul>
<p>
This method will drop all user properties from the layer.
Note that a new layer without properties is returned. The
original layer stays untouched.
</p><p>
See also <a href="#select_props">select_props</a> and <a href="#map_props">map_props</a>.
</p>
<a name="rotate"/><h2>"rotate" - Rotates a layer (modifies the layer)</h2>
<keyword name="rotate"/>
<p>Usage:</p>
@ -2672,6 +2793,42 @@ is <a href="#overlapping">overlapping</a>.
</p><p>
This method is available for polygons only.
</p>
<a name="select_props"/><h2>"select_props" - Enables or selects properties from a property-annotated layer</h2>
<keyword name="select_props"/>
<p>Usage:</p>
<ul>
<li><tt>layer.select_props(keys)</tt></li>
</ul>
<p>
This method will select specific property keys
from layers. It returns a new layer with the new properties. The
original layer is not modified.
</p><p>
You can specify the user property keys (names) to use. As user properties
in general are a set of key/value pairs and may carry multiple values
under different keys, this feature can be handy to filter out a specific
aspect. To get only the values from key 1 (integer), use:
</p><p>
<pre>
layer1 = input(1, 0, enable_properties)
layer1_filtered = layer1.select_props(1)
</pre>
</p><p>
To get the combined key 1 and 2 properties, use:
</p><p>
<pre>
layer1 = input(1, 0, enable_properties)
layer1_filtered = layer1.select_props(1, 2)
</pre>
</p><p>
Without any arguments, this method will remove all properties.
Note that you can directly filter or map properties on input
which is more efficient than first loading all and then selecting some
properties. See <a href="/about/drc_ref_drcsource.xml#input">DRCSource#input</a> for details.
</p><p>
<a href="#map_props">map_props</a> is a way to change property keys and <a href="#remove_props">remove_props</a>
will entirely remove all user properties.
</p>
<a name="sep"/><h2>"sep" - An alias for "separation"</h2>
<keyword name="sep"/>
<p>Usage:</p>
@ -3230,6 +3387,8 @@ but is more intuitive, as "projecting" is written with a condition, like
Double-bounded ranges are also available, like: "0.5 &lt;= projecting &lt; 2.0". </li>
<li><b>transparent </b>: performs the check without shielding (polygon layers only) </li>
<li><b>shielded </b>: performs the check with shielding (polygon layers only) </li>
<li><b>props_eq </b>, <b>props_ne </b>, <b>props_copy </b>: (only props_copy applies to width check) -
see "Properties constraints" below. </li>
</ul>
</p><p>
Note that without the angle_limit, acute corners will always be reported, since two
@ -3292,6 +3451,44 @@ you try to check the distance between features of B vs. A, you cannot use shield
because B features which are identical to A features will shield those entirely.
</p><p>
Shielding is enabled by default, but can be switched off with the "transparent" option.
</p><p>
<h3>Properties constraints (available on intra-polygon checks such as <a href="#space">space</a>, <a href="#sep">sep</a> etc.) </h3>
</p><p>
This feature is listed here, because this documentation is generic and used for other checks
as well. <a href="#props_eq">props_eq</a> and <a href="#props_ne">props_ne</a> are not available on 'width' or 'notch' as these apply to intra-polygon checks - when
pairs of different polygons are involved - something that 'width' or 'notch' does need.
</p><p>
With properties constraints, the check is performed between shapes with the same
or different properties. "properties" refers to the full set of key/value pairs
attached to a shape.
</p><p>
Property constraints are specified by adding <a href="#props_eq">props_eq</a> or <a href="#props_ne">props_ne</a> to the arguments.
If these literals are present, only shapes with same of different properties are
involved in the check. In connection with the net annotation feature this allows
checking space between connected or disconnected shapes for example:
</p><p>
<pre>
connect(metal1, via1)
...
# attaches net identity as properties
metal1_nets = metal1.nets
space_not_connected = metal1_nets.space(0.4.um, props_ne)
space_connected = metal1_nets.space(0.4.um, props_eq)
</pre>
</p><p>
<a href="#props_copy">props_copy</a> is a special properties constraint that does not alter the behaviour of
the checks, but copies the primary shape's properties to the output markers.
This constraint is applicable to <a href="#width">width</a> and <a href="#notch">notch</a> checks too. The effect is that
the original polygon's properties are copied to the error markers.
<a href="#props_copy">props_copy</a> can be combined with <a href="#props_eq">props_eq</a> and <a href="#props_ne">props_ne</a> to copy the original
shape's properties to the output too:
</p><p>
<pre>
space_not_connected = metal1_nets.space(0.4.um, props_ne + props_copy)
space_connected = metal1_nets.space(0.4.um, props_eq + props_copy)
</pre>
</p>
<a name="with_angle"/><h2>"with_angle" - Selects edges by their angle</h2>
<keyword name="with_angle"/>

View File

@ -171,6 +171,7 @@ source.global_transform(shift(0, 100.um), rotate(90.0))
<li><tt>source.input(layer, datatype)</tt></li>
<li><tt>source.input(layer_into)</tt></li>
<li><tt>source.input(filter, ...)</tt></li>
<li><tt>source.input(props_spec, ...)</tt></li>
</ul>
<p>
Creates a layer with the shapes from the given layer of the source.
@ -209,6 +210,21 @@ is required.
</p><p>
"input" without any arguments will create a new, empty original layer.
</p><p>
If you want to use user properties - for example with properties constraints in DRC checks -
you need to enable properties on input:
</p><p>
<pre>
input1_with_props = input(1, 0, enable_props)
</pre>
</p><p>
You can also filter or map property keys, similar to the functions available on
layers (<a href="/about/drc_ref_drclayer.xml#map_props">DRCLayer#map_props</a>, <a href="/about/drc_ref_drclayer.xml#select_props">DRCLayer#select_props</a>). For example to select
property values with key 17 (numerical) only, use:
</p><p>
<pre>
input1_with_props = input(1, 0, select_props(17))
</pre>
</p><p>
Use the global version of "input" without a source object to address the default source.
</p>
<a name="labels"/><h2>"labels" - Gets the labels (texts) from an input layer</h2>

View File

@ -6,6 +6,10 @@
<title>DRC Runsets</title>
<keyword name="DRC"/>
<keyword name="DRC runset"/>
<keyword name="DRC user properties"/>
<keyword name="DRC connected"/>
<keyword name="DRC unconnected"/>
<keyword name="DRC nets"/>
<h2-index/>
@ -1137,5 +1141,205 @@ puts poly.is_deep? # -&gt; false
case this will lead to flattening of the layout and loss of hierarchy.
</p>
<h2>DRC and user properties</h2>
<p>
The DRC feature has some support for user properties. User properties are sets of
key/value pairs attached to shapes. This is a standard feature of KLayout and GDS/OASIS.
The GDS format supports numerical (positive integer) keys and string values while OASIS
supports more types of keys and values - specifically string keys.
</p>
<p>
For DRC, the property set attached to a shape is regarded as a whole.
The DRC can act on these properties in specific ways:
</p>
<ul>
<li><b>Ignore properties</b>: this is the default mode</li>
<li><b>Use properties</b>: configure operations such as checks and some boolean operations to
only consider shapes with the same or different properties</li>
<li><b>Map/filter</b>: change property keys/sets or remove them</li>
<li><b>Transfer properties</b>: through operations, e.g. "size" or "with_..." selectors</li>
</ul>
<p>
Specifically, DRC functions can also <b>generate</b> properties. Currently there is
only the "nets" method which attaches net identity information to shapes
involved in a "connect" statement.
This feature opens a path to implementing "connected" or "unconnected" mode
boolean operations and DRC checks.
</p>
<p>
As of this writing, user property support is somewhat experimental.
User properties support has a huge potential, so there is more to come.
</p>
<p>
Currently, the following operations can be conditioned to act on shapes with same
or different properties:
</p>
<ul>
<li>Polygon boolean operations: "and", "not" and "andnot"</li>
<li>Polygon-mode DRC checks such as "separation", "space", "isolated" etc.</li>
</ul>
<p>
A variety of operations can transfer properties, i.e. edge-pair-to-polygon, edge-pair-to-edges,
polygon-to-edges, edge-to-polygon, some filters, the "size" function. It is planned
to enable most features to transfer properties where applicable.
</p>
<p>
Property generation is supported currently by:
</p>
<ul>
<li>Reading properties from input layouts</li>
<li>Using the "nets" feature to generate net identity properties.</li>
</ul>
<p>
Property manipulation is supported in a very basic way: properties can be removed
entirely from a layer or certain property keys can be selected and optionally
mapped to a different key.
Property values cannot be manipulated currently.
</p>
<p>
In general, once a layer has properties, shapes with different properties are
regarded as non-interacting. When shapes are merged, only groups of shapes
with the same properties are merged into bigger chunks. This applies to polygons
and edges. This can have the strange consequence that after merge, still
polygons may overlap. Note that this only applies to the case with properties.
The normal behavior is not changed.
</p>
<h3>Reading user properties</h3>
<p>
By default, user properties are not read into the shape containers.
You need to enable them explicitly:
</p>
<pre>l1 = input(1, 0, enable_props)</pre>
<p>
At this point you can select certain keys from the set of properties. For example
to select only values with key 17 and 18 (numerical), use:
</p>
<pre>l1 = input(1, 0, select_props(17, 18))</pre>
<p>
You can also select and map keys to other keys, like this:
</p>
<pre>l1 = input(1, 0, map_props({ 17 => 1, 18 => 18 }))</pre>
<p>
This will map values with key 17 to 1 and read those from 18 while
maintaining the key. Values with other keys are ignored.
See <a href="/about/drc_ref_global.xml#input">input function documentation</a>
for more details.
</p>
<h3>Manipulating properties</h3>
<p>
Once you have a layer with properties, you can remove them:
</p>
<pre>layer_without_properties = layer.remove_props</pre>
<p>
You can also apply <a href="/about/drc_ref_layer.xml#select_props">select_props</a> or <a href="/about/drc_ref_layer.xml#map_props">map_props</a> to filter values
with certain keys or map keys:
</p>
<pre>reduced_layer = layer.select_props(17, 18)
reduced_layer = layer.map_props({ 17 => 1, 18 => 18 })</pre>
<h3>Generating properties as net identities</h3>
<p>
The most important application is to use the <a href="/about/drc_ref_layer.xml#nets">nets</a> method to
generate net identity properties:
</p>
<pre>connect(metal1, via1)
connect(via1, metal2)
metal1_nets = metal1.nets</pre>
<p>
By default, a unique net identifier (a tuple of circuit and net name) is generated
on property key 0. You can specify the key as well:
</p>
<pre>metal1_nets = metal1.nets(prop(17))</pre>
<p>
The "nets" function has a number of options, specifically you can filter certain
nets (by name or circuit + name). This makes the "nets" function useful for other
purposes too. If you do not need properties then, specify "nil" as the property key:
</p>
<pre>metal1_vdd_net = metal1.nets(prop(nil), "VDD")</pre>
<h3>Using properties in checks and boolean operations</h3>
<p>
The main purpose of properties is to use them in operations.
To confine a boolean operation to shapes with different properties,
use the <a href="/about/drc_ref_global.xml#props_ne">props_ne</a> keyword. To confine a boolean operation to shapes
with the same properties, use <a href="/about/drc_ref_global.xml#props_eq">props_eq</a>:
</p>
<pre>connect(metal1, via1)
connect(via1, metal2)
metal1_nets = metal1.nets
metal2_nets = metal2.nets
metal1_over_metal2_connected = metal1_nets.and(metal2_nets, props_eq)
metal1_over_metal2_unconnected = metal1_nets.and(metal2_nets, props_ne)</pre>
<p>
You can also instruct this operation to emit the original properties
on the output with <a href="/about/drc_ref_global.xml#props_eq">props_copy</a>:
</p>
<pre>result_with_props = metal1_nets.and(metal2_nets, props_eq + props_copy)</pre>
<p>
Similarly, properties can participate in checks:
</p>
<pre>connect(metal1, via1)
connect(via1, metal2)
metal1_nets = metal1.nets
metal2_nets = metal2.nets
metal1_space_connected = metal1_nets.space(0.4.um, props_eq)
metal1_space_unconnected = metal1_nets.space(1.um, props_ne)</pre>
<p>
"props_eq", "props_ne" and "props_copy" are also available on the
generic DRC function (<a href="/about/drc_ref_layer.xml#drc">drc</a>), which opens new options, e.g.
detecting potential short locations ("critical area") between unconnected nets:
</p>
<pre>connect(metal1, via1)
connect(via1, metal2)
metal1_nets = metal1.nets
metal2_nets = metal2.nets
critical_area = l1_nets.drc(primary.sized(0.2.um) &amp; foreign.sized(0.2.um), props_ne)</pre>
</doc>

View File

@ -382,7 +382,7 @@ module DRC
#
# The method can be given a properties constraint so that it is only performed
# between shapes with the same or different user properties. Note that properties
# have to be enabled or generated (e.g. through the \nets method) before they can
# have to be enabled or generated (e.g. through the \DRCLayer#nets method) before they can
# be used.
#
# Example:
@ -392,9 +392,9 @@ module DRC
# ...
#
# space_not_connected = metal1.nets.drc(space < 0.4.um, props_ne)
# @code
# @/code
#
# See \global#prop_eq, \global#prop_ne and \global#prop_copy for details.
# See \global#props_eq, \global#props_ne and \global#props_copy for details.
#
# @h3 Outlook @/h3
#

View File

@ -3690,7 +3690,7 @@ CODE
# @li @b transparent @/b: performs the check without shielding (polygon layers only) @/li
# @li @b shielded @/b: performs the check with shielding (polygon layers only) @/li
# @li @b props_eq @/b, @b props_ne @/b, @b props_copy @/b: (only props_copy applies to width check) -
# see "Properties constraints" below.
# see "Properties constraints" below. @/li
# @/ul
#
# Note that without the angle_limit, acute corners will always be reported, since two
@ -3778,7 +3778,7 @@ CODE
#
# space_not_connected = metal1_nets.space(0.4.um, props_ne)
# space_connected = metal1_nets.space(0.4.um, props_eq)
# @code
# @/code
#
# \props_copy is a special properties constraint that does not alter the behaviour of
# the checks, but copies the primary shape's properties to the output markers.
@ -3790,7 +3790,7 @@ CODE
# @code
# space_not_connected = metal1_nets.space(0.4.um, props_ne + props_copy)
# space_connected = metal1_nets.space(0.4.um, props_eq + props_copy)
# @code
# @/code
#
# %DRC%
@ -4882,7 +4882,7 @@ CODE
end
# %DRC%
# @name net
# @name nets
# @brief Pulls net shapes from selected or all nets, optionally annotating nets with properties
# @synopsis layer.nets
# @synopsis layer.nets(net_filter)