From 4460c294b0090ae8738f6d2d3012128bb5ddb39d Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sat, 16 Jan 2021 00:32:06 +0100 Subject: [PATCH] Some bug fixes, doc update, test updates. --- scripts/create_drc_samples.rb | 13 + src/db/db/gsiDeclDbCompoundOperation.cc | 8 +- .../drc/built-in-macros/_drc_complex_ops.rb | 19 +- .../built-in-macros/_drc_cop_integration.rb | 327 +++++++++++++++--- src/drc/drc/built-in-macros/_drc_layer.rb | 33 +- src/lay/lay/doc/about/drc_ref_global.xml | 319 +++++++++++++++-- src/lay/lay/doc/about/drc_ref_layer.xml | 33 +- src/lay/lay/doc/images/drc_enc1u.png | Bin 0 -> 8823 bytes src/lay/lay/doc/images/drc_enc2u.png | Bin 0 -> 8965 bytes src/lay/lay/doc/images/drc_overlap1u.png | Bin 0 -> 9480 bytes src/lay/lay/doc/images/drc_overlap2u.png | Bin 0 -> 9577 bytes src/lay/lay/doc/images/drc_separation1u.png | Bin 0 -> 8551 bytes src/lay/lay/doc/images/drc_space1u.png | Bin 0 -> 7395 bytes src/lay/lay/doc/images/drc_space2u.png | Bin 0 -> 7317 bytes src/lay/lay/doc/images/drc_space3u.png | Bin 0 -> 7374 bytes src/lay/lay/layDRCLVSHelpResources.qrc | 8 + testdata/drc/drcGenericTests_11.drc | 1 - testdata/drc/drcGenericTests_11.gds | Bin 458 -> 458 bytes testdata/drc/drcGenericTests_2.drc | 2 +- testdata/drc/drcGenericTests_au11.gds | Bin 1402 -> 1346 bytes testdata/drc/drcGenericTests_au2.gds | Bin 5866 -> 5994 bytes testdata/drc/drcGenericTests_au2d.gds | Bin 5470 -> 5598 bytes testdata/drc/drcGenericTests_au4.gds | Bin 13994 -> 8618 bytes testdata/drc/drcGenericTests_au4d.gds | Bin 8446 -> 8222 bytes 24 files changed, 648 insertions(+), 115 deletions(-) create mode 100644 src/lay/lay/doc/images/drc_enc1u.png create mode 100644 src/lay/lay/doc/images/drc_enc2u.png create mode 100644 src/lay/lay/doc/images/drc_overlap1u.png create mode 100644 src/lay/lay/doc/images/drc_overlap2u.png create mode 100644 src/lay/lay/doc/images/drc_separation1u.png create mode 100644 src/lay/lay/doc/images/drc_space1u.png create mode 100644 src/lay/lay/doc/images/drc_space2u.png create mode 100644 src/lay/lay/doc/images/drc_space3u.png diff --git a/scripts/create_drc_samples.rb b/scripts/create_drc_samples.rb index 4eac57da5..02be4140d 100644 --- a/scripts/create_drc_samples.rb +++ b/scripts/create_drc_samples.rb @@ -231,6 +231,10 @@ run_demo gen, "input.space(1.2, euclidian)", "drc_space1.png" run_demo gen, "input.notch(1.2, euclidian)", "drc_space2.png" run_demo gen, "input.isolated(1.2, euclidian)", "drc_space3.png" +run_demo gen, "input.drc(space(euclidian) < 1.2)", "drc_space1u.png" +run_demo gen, "input.drc(notch(euclidian) < 1.2)", "drc_space2u.png" +run_demo gen, "input.drc(isolated(euclidian) < 1.2)", "drc_space3u.png" + class Gen def produce(s1, s2) pts = [ @@ -264,6 +268,7 @@ end 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" class Gen def produce(s1, s2) @@ -442,6 +447,10 @@ gen = Gen::new run_demo gen, "input1.enclosing(input2, 2.0.um)", "drc_enc1.png" run_demo gen, "input1.enclosing(input2, 2.0.um, projection)", "drc_enc2.png" +run_demo gen, "input1.drc(enclosing(input2) < 2.0.um)", "drc_enc1u.png" +run_demo gen, "input1.drc(enclosing(input2,\n"+ + " projection) < 2.0.um)", "drc_enc2u.png" + class Gen def produce(s1, s2) @@ -473,6 +482,10 @@ gen = Gen::new run_demo gen, "input1.overlap(input2, 2.0.um)", "drc_overlap1.png" run_demo gen, "input1.overlap(input2, 2.0.um, projection)", "drc_overlap2.png" +run_demo gen, "input1.drc(overlap(input2) < 2.0.um)", "drc_overlap1u.png" +run_demo gen, "input1.drc(overlap(input2,\n"+ + " projection) < 2.0.um)", "drc_overlap2u.png" + class Gen def produce(s1, s2) diff --git a/src/db/db/gsiDeclDbCompoundOperation.cc b/src/db/db/gsiDeclDbCompoundOperation.cc index 5fb0fa3b6..0ad1f0176 100644 --- a/src/db/db/gsiDeclDbCompoundOperation.cc +++ b/src/db/db/gsiDeclDbCompoundOperation.cc @@ -464,12 +464,12 @@ static db::CompoundRegionOperationNode *new_separation_check (db::CompoundRegion static db::CompoundRegionOperationNode *new_overlap_check (db::CompoundRegionOperationNode *other, db::Coord d, bool whole_edges, db::metrics_type metrics, const tl::Variant &ignore_angle, const tl::Variant &min_projection, const tl::Variant &max_projection, bool shielded, db::OppositeFilter opposite_filter, db::RectFilter rect_filter, bool negative) { - return new_check_node (other, db::OverlapRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded, opposite_filter, rect_filter, negative); + return new_check_node (other, db::WidthRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded, opposite_filter, rect_filter, negative); } -static db::CompoundRegionOperationNode *new_inside_check (db::CompoundRegionOperationNode *other, db::Coord d, bool whole_edges, db::metrics_type metrics, const tl::Variant &ignore_angle, const tl::Variant &min_projection, const tl::Variant &max_projection, bool shielded, db::OppositeFilter opposite_filter, db::RectFilter rect_filter, bool negative) +static db::CompoundRegionOperationNode *new_enclosing_check (db::CompoundRegionOperationNode *other, db::Coord d, bool whole_edges, db::metrics_type metrics, const tl::Variant &ignore_angle, const tl::Variant &min_projection, const tl::Variant &max_projection, bool shielded, db::OppositeFilter opposite_filter, db::RectFilter rect_filter, bool negative) { - return new_check_node (other, db::InsideRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded, opposite_filter, rect_filter, negative); + return new_check_node (other, db::OverlapRelation, true, d, whole_edges, metrics, ignore_angle, min_projection, max_projection, shielded, opposite_filter, rect_filter, negative); } static db::CompoundRegionOperationNode *new_perimeter_filter (db::CompoundRegionOperationNode *input, bool inverse, db::coord_traits::perimeter_type pmin, db::coord_traits::perimeter_type pmax) @@ -669,7 +669,7 @@ Class decl_CompoundRegionOperationNode ("db", " gsi::constructor ("new_overlap_check", &new_overlap_check, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::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::NoSideAllowed, "NoSideAllowed"), gsi::arg ("negative", false), "@brief Creates a node providing an overlap check.\n" ) + - gsi::constructor ("new_inside_check", &new_inside_check, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::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::NoSideAllowed, "NoSideAllowed"), gsi::arg ("negative", false), + gsi::constructor ("new_enclosing_check", &new_enclosing_check, gsi::arg ("other"), gsi::arg ("d"), gsi::arg ("whole_edges", false), gsi::arg ("metrics", db::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::NoSideAllowed, "NoSideAllowed"), gsi::arg ("negative", false), "@brief Creates a node providing an inside (enclosure) check.\n" ) + gsi::constructor ("new_perimeter_filter", &new_perimeter_filter, gsi::arg ("input"), gsi::arg ("inverse", false), gsi::arg ("pmin", 0), gsi::arg ("pmax", std::numeric_limits::perimeter_type>::max (), "max"), diff --git a/src/drc/drc/built-in-macros/_drc_complex_ops.rb b/src/drc/drc/built-in-macros/_drc_complex_ops.rb index 99ec74641..30eb64908 100644 --- a/src/drc/drc/built-in-macros/_drc_complex_ops.rb +++ b/src/drc/drc/built-in-macros/_drc_complex_ops.rb @@ -54,7 +54,6 @@ module DRC # @li \global#length @/li # @li \global#middle @/li # @li \global#notch @/li -# @li \global#odd_polygons @/li # @li \global#outside @/li # @li \global#overlap @/li # @li \global#overlapping @/li @@ -887,22 +886,6 @@ CODE CODE end - # %DRC% - # @name odd_polygons - # @brief Selects all polygons which are non-orientable - # @synopsis expression.odd_polygons - # - # Non-orientable polygons are for example "8"-shape polygons. Such polygons are - # usually considered harmful as their definition of covered area is depending on the - # wrap count rule in place. - # - # This operation can be used as a plain function in which case it acts on primary - # shapes or can be used as method on another DRC expression. - - def odd_polygons - return DRCOpNodeFilter::new(@engine, self, :new_strange_polygons_filter, "odd_polygon") - end - # %DRC% # @name rectangles # @brief Selects all polygons which are rectangles @@ -1874,7 +1857,7 @@ class DRCOpNodeCheck < DRCOpNodeWithCompare factory = { :width => :new_width_check, :space => :new_space_check, :notch => :new_notch_check, :separation => :new_separation_check, :isolated => :new_isolated_check, :overlap => :new_overlap_check, - :enclosing => :new_inside_check }[self.check] + :enclosing => :new_enclosing_check }[self.check] oargs = [] if self.other diff --git a/src/drc/drc/built-in-macros/_drc_cop_integration.rb b/src/drc/drc/built-in-macros/_drc_cop_integration.rb index 9e3a3fe2f..c596e0cde 100644 --- a/src/drc/drc/built-in-macros/_drc_cop_integration.rb +++ b/src/drc/drc/built-in-macros/_drc_cop_integration.rb @@ -664,7 +664,7 @@ CODE # @synopsis area (in condition) # @synopsis area(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.area" (see \Layer#area) and returns the total area of the # polygons in the layer. # @@ -677,7 +677,7 @@ CODE # @synopsis hulls # @synopsis hulls(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.hulls" (see \Layer#hulls). Without a layer # argument, "hulls" represents a hull contour extractor for primary shapes in # \DRC# expressions (see \Layer#drc and \DRC#hulls for more details). @@ -688,29 +688,18 @@ CODE # @synopsis holes # @synopsis holes(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.holes" (see \Layer#hulls). Without a layer # argument, "holes" represents a hole extractor for primary shapes in # \DRC# expressions (see \Layer#drc and \DRC#hulls for more details). - # %DRC% - # @name odd_polygons - # @brief Selects all polygons which are non-orientable - # @synopsis odd_polygons - # @synopsis odd_polygons(layer) - # - # This function can be used with a layer argument in which case it - # is equivalent to "layer.odd_polygons" (see \Layer#odd_polygons). Without a layer - # argument, "odd_polygons" represents an odd polygon filter for primary shapes in - # \DRC# expressions (see \Layer#drc and \DRC#odd_polygons for more details). - # %DRC% # @name perimeter # @brief Computes the total perimeter or in universal DRC context: selects the primary shape if the perimeter is meeting the condition # @synopsis perimeter (in condition) # @synopsis perimeter(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.perimeter" (see \Layer#perimeter) and returns the # total perimeter of all polygons in the layer. # @@ -723,7 +712,7 @@ CODE # @synopsis rectangles # @synopsis rectangles(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.rectangles" (see \Layer#rectangles). Without a layer # argument, "rectangles" represents the rectangles filter for primary shapes in # \DRC# expressions (see \Layer#drc and \DRC#rectangles for more details). @@ -734,7 +723,7 @@ CODE # @synopsis squares # @synopsis squares(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.squares" (see \Layer#squares). Without a layer # argument, "squares" represents the rectangles filter for primary shapes in # \DRC# expressions (see \Layer#drc and \DRC#squares for more details). @@ -745,7 +734,7 @@ CODE # @synopsis rectilinear # @synopsis rectilinear(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.rectilinear" (see \Layer#rectilinear). Without a layer # argument, "rectilinear" represents the rectilinear polygons filter for primary shapes in # \DRC# expressions (see \Layer#drc and \DRC#rectilinear for more details). @@ -756,7 +745,7 @@ CODE # @synopsis length (in condition) # @synopsis length(layer) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.length" (see \Layer#length). Without a layer # argument, "length" represents the edge length filter on the primary shape edges in # \DRC# expressions (see \Layer#drc and \DRC#length for more details). In this context, @@ -777,7 +766,6 @@ CODE holes hulls length - odd_polygons perimeter rectangles rectilinear @@ -797,7 +785,7 @@ CODE # @synopsis corners([ options ]) (in condition) # @synopsis corners(layer [, options ]) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.corners" (see \Layer#corners). Without a layer # argument, "corners" represents the corner generator/filter in primary shapes for # \DRC# expressions (see \Layer#drc and \DRC#corners for more details). @@ -820,7 +808,7 @@ CODE # @synopsis extent_refs([ options ]) # @synopsis extent_refs(layer, [ options ]) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.extent_refs" (see \Layer#extent_refs). Without a layer # argument, "extent_refs" represents the partial extents extractor on primary shapes within # \DRC# expressions (see \Layer#drc and \DRC#extent_refs for more details). @@ -831,7 +819,7 @@ CODE # @synopsis extents([ enlargement ]) # @synopsis extents(layer, [ enlargement ]) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.extents" (see \Layer#extents). Without a layer # argument, "extents" represents the extents generator on primary shapes within # \DRC# expressions (see \Layer#drc and \DRC#extents for more details). @@ -842,7 +830,7 @@ CODE # @synopsis middle([ options ]) # @synopsis middle(layer, [ options ]) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.middle" (see \Layer#middle). Without a layer # argument, "middle" represents the bounding box center marker generator on primary shapes within # \DRC# expressions (see \Layer#drc and \DRC#middle for more details). @@ -853,7 +841,7 @@ CODE # @synopsis rounded_corners(inner, outer, n) # @synopsis rounded_corners(layer, inner, outer, n) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.rounded_corners" (see \Layer#rounded_corners). Without a layer # argument, "rounded_corners" represents the corner rounding algorithm on primary shapes within # \DRC# expressions (see \Layer#drc and \DRC#rounded_corners for more details). @@ -866,7 +854,7 @@ CODE # @synopsis sized(layer, d [, mode]) # @synopsis sized(layer, dx, dy [, mode])) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.sized" (see \Layer#sized). Without a layer # argument, "sized" represents the polygon sizer on primary shapes within # \DRC# expressions (see \Layer#drc and \DRC#sized for more details). @@ -877,7 +865,7 @@ CODE # @synopsis smoothed(d) # @synopsis smoothed(layer, d) # - # This function can be used with a layer argument in which case it + # This function can be used with a layer argument. In this case it # is equivalent to "layer.smoothed" (see \Layer#smoothed). Without a layer # argument, "smoothed" represents the polygon smoother on primary shapes within # \DRC# expressions (see \Layer#drc and \DRC#smoothed for more details). @@ -971,14 +959,39 @@ CODE # @synopsis enclosing(other [, options ]) (in conditions) # @synopsis enclosing(layer, other [, options ]) # - # This function can be used with a layer argument in which case it + # This check verifies if the polygons of the input layer are enclosing the shapes + # of the other input layer by a certain distance. + # It has manifold options. See \Layer#width for the basic options such + # as metrics, projection and angle constraints etc. This check also features + # opposite and rectangle filtering. See \Layer#separation for details about opposite and + # rectangle error filtering. + # + # @h3 Classic mode @/h3 + # + # This function can be used in classic mode with a layer argument. In this case it # is equivalent to "layer.enclosing" (see \Layer#enclosing). # - # The version without the first layer is intended for use within \DRC# expressions - # together with the \Layer#drc method. In this case, this function needs to be + # @code + # # classic "enclosing" check for < 0.2 um + # in = layer(1, 0) + # other = layer(2, 0) + # errors = enclosing(in, other, 0.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # + # The version without a first layer is intended for use within \DRC# expressions + # together with the "universal DRC" method \Layer#drc. In this case, this function needs to be # put into a condition to specify the check constraints. The other options # of \Layer#enclosing (e.g. metrics, projection constraints, angle limits etc.) - # apply to this version too. + # apply to this version too: + # + # @code + # # universal DRC "enclosing" check for < 0.2 um + # in = layer(1, 0) + # other = layer(2, 0) + # errors = in.drc(enclosing(other) < 0.2.um) + # @/code # # The conditions may involve an upper and lower limit. The following examples # illustrate the use of this function with conditions: @@ -1001,6 +1014,13 @@ CODE # With a lower limit alone, these markers 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. + # + # @table + # @tr + # @td @img(/images/drc_enc1u.png) @/td + # @td @img(/images/drc_enc2u.png) @/td + # @/tr + # @/table # %DRC% # @name separation @@ -1009,7 +1029,45 @@ CODE # @synopsis separation(layer, other [, options ]) # # Provides a separation check (primary layer vs. another layer). Like \enclosing this - # function provides a two-layer check. See there for details how to use this function. + # function provides a two-layer check, but checking the distance rather than the + # overlap. + # This check has manifold options. See \Layer#width for the basic options such + # as metrics, projection and angle constraints etc. This check also features + # opposite and rectangle filtering. See \Layer#separation for details about opposite and + # rectangle error filtering. + # + # @h3 Classic mode @/h3 + # + # Like \enclosing, this function is available as a classic DRC function with a layer as the first + # argument and as an \DRC expression operator for use with \Layer#drc. + # + # @code + # # classic "separation" check for distance < 0.2 um + # in = layer(1, 0) + # other = layer(2, 0) + # errors = separation(in, other, 0.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # + # For use with the "universal DRC" put the separation expression into the "drc" + # function call and use a condition to specify the constraint: + # + # @code + # # universal DRC "separation" check for distance < 0.2 um + # in = layer(1, 0) + # other = layer(2, 0) + # errors = in.drc(separation(other) < 0.2.um) + # @/code + # + # \enclosing explains the constraints and how the + # work in generating error markers. + # + # @table + # @tr + # @td @img(/images/drc_separation1u.png) @/td + # @/tr + # @/table # %DRC% # @name overlap @@ -1017,8 +1075,42 @@ CODE # @synopsis overlap(other [, options ]) (in conditions) # @synopsis overlap(layer, other [, options ]) # - # Provides an overlap check (primary layer vs. another layer). Like \enclosing this - # function provides a two-layer check. See there for details how to use this function. + # Provides an overlap check (primary layer vs. another layer). + # This check has manifold options. See \Layer#width for the basic options such + # as metrics, projection and angle constraints etc. This check also features + # opposite and rectangle filtering. See \Layer#separation for details about opposite and + # rectangle error filtering. + # + # @h3 Classic mode @/h3 + # + # Like other checks, this function is available as a classic DRC function with a layer as the first + # argument and as an \DRC expression operator for use with \Layer#drc. + # + # @code + # # classic "overlap" check for < 0.2 um + # in = layer(1, 0) + # other = layer(2, 0) + # errors = overlap(in, other, 0.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # + # For use with the "unversal DRC" put the separation expression into the "drc" + # function call and use a condition to specify the constraint: + # + # @code + # # universal DRC "overlap" check for < 0.2 um + # in = layer(1, 0) + # other = layer(2, 0) + # errors = in.drc(overlap(other) < 0.2.um) + # @/code + # + # @table + # @tr + # @td @img(/images/drc_overlap1u.png) @/td + # @td @img(/images/drc_overlap2u.png) @/td + # @/tr + # @/table # %DRC% # @name width @@ -1026,26 +1118,44 @@ CODE # @synopsis width([ options ]) (in conditions) # @synopsis width(layer [, options ]) # - # This function can be used with a layer argument in which case it + # A width check is a check for the distance of edges of the same polygon. + # + # @h3 Classic mode @/h3 + # + # This function can be used in classic mode with a layer argument. In this case it # is equivalent to "layer.width" (see \Layer#width). # + # @code + # # classic "width" check for width < 2 um + # in = layer(1, 0) + # errors = width(in, 0.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # # The version without a layer is intended for use within \DRC# expressions - # together with the \Layer#drc method. In this case, this function needs to be + # together with the "universal DRC" method \Layer#drc. In this case, this function needs to be # put into a condition to specify the check constraints. The other options # of \Layer#width (e.g. metrics, projection constraints, angle limits etc.) - # apply to this version too. + # apply to this version too: + # + # @code + # # universal DRC check for width < 2 um + # in = layer(1, 0) + # errors = in.drc(width < 0.2.um) + # @/code # # The conditions may involve an upper and lower limit. The following examples # illustrate the use of this function with conditions: # # @code - # out = in.drc(width < 0.2.um) - # out = in.drc(width <= 0.2.um) - # out = in.drc(width > 0.2.um) - # out = in.drc(width >= 0.2.um) - # out = in.drc(width == 0.2.um) - # out = in.drc(width != 0.2.um) - # out = in.drc(0.1.um <= width < 0.2.um) + # errors = in.drc(width < 0.2.um) + # errors = in.drc(width <= 0.2.um) + # errors = in.drc(width > 0.2.um) + # errors = in.drc(width >= 0.2.um) + # errors = in.drc(width == 0.2.um) + # errors = in.drc(width != 0.2.um) + # errors = in.drc(0.1.um <= width < 0.2.um) # @/code # # @table @@ -1079,8 +1189,46 @@ CODE # @synopsis space([ options ]) (in conditions) # @synopsis space(layer [, options ]) # - # Provides a space check on the primary layer. Like \width this - # function provides a single-layer check. See there for details how to use this function. + # "space" looks for spacing violations between edges of the same polygon (intra-polygon checks) + # and between different polygons (inter-polygon checks). + # \notch is similar function that provides only intra-polygon space checks. \isolated + # is the version checking inter-polygon distance only. + # The check has manifold options. See \Layer#width for the basic options such + # as metrics, projection and angle constraints etc. + # + # @h3 Classic mode @/h3 + # + # This function can be used in classic mode with a layer argument. In this case it + # is equivalent to "layer.space" (see \Layer#space). In this mode, "space" is applicable to edge + # layers too. + # + # @code + # # classic "space" check for space < 0.2 um + # in = layer(1, 0) + # errors = space(in, 0.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # + # The version without a layer is intended for use within \DRC# expressions + # together with the "universal DRC" method \Layer#drc. In this case, this function needs to be + # put into a condition to specify the check constraints. The other options + # of \Layer#space (e.g. metrics, projection constraints, angle limits etc.) + # apply to this version too: + # + # @code + # # universal DRC check for space < 0.2.um + # in = layer(1, 0) + # errors = in.drc(space < 0.2.um) + # @/code + # + # See \enclosing for more details about the various ways to specify conditions. + # + # @table + # @tr + # @td @img(/images/drc_space1u.png) @/td + # @/tr + # @/table # %DRC% # @name notch @@ -1088,8 +1236,91 @@ CODE # @synopsis notch([ options ]) (in conditions) # @synopsis notch(layer [, options ]) # - # Provides a intra-polygon space check for polygons from the primary layer. Like \width this - # function provides a single-layer check. See there for details how to use this function. + # Provides a intra-polygon space check for polygons. It is similar to + # \space, but checks intra-polygon space only. + # It has manifold options. See \Layer#width for the basic options such + # as metrics, projection and angle constraints etc. + # + # @h3 Classic mode @/h3 + # + # This function can be used in classic mode with a layer argument. In this case it + # is equivalent to "layer.notch" (see \Layer#notch). + # + # @code + # # classic "notch" check for space < 1.2 um + # in = layer(1, 0) + # errors = notch(in, 1.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # + # The version without a layer is intended for use within \DRC# expressions + # together with the "universal DRC" method \Layer#drc. In this case, this function needs to be + # put into a condition to specify the check constraints. The other options + # of \Layer#notch (e.g. metrics, projection constraints, angle limits etc.) + # apply to this version too: + # + # @code + # # universal DRC "notch" check for space < 1.2.um + # in = layer(1, 0) + # errors = in.drc(notch < 1.2.um) + # @/code + # + # See \enclosing for more details about the various ways to specify conditions. + # + # @table + # @tr + # @td @img(/images/drc_space2u.png) @/td + # @/tr + # @/table + + # %DRC% + # @name isolated + # @brief Performs an isolation (inter-polygon space) check + # @synopsis isolated([ options ]) (in conditions) + # @synopsis iso([ options ]) (in conditions) + # @synopsis isolated(layer [, options ]) + # @synopsis iso(layer [, options ]) + # + # Provides a intra-polygon space check for polygons. It is similar to + # \space, but checks inter-polygon space only. "iso" is a synonym for "isolated". + # This check has manifold options. See \Layer#width for the basic options such + # as metrics, projection and angle constraints etc. This check also features + # opposite and rectangle filtering. See \Layer#separation for details about opposite and + # rectangle error filtering. + # + # @h3 Classic mode @/h3 + # + # This function can be used in classic mode with a layer argument. In this case it + # is equivalent to "layer.isolated" (see \Layer#isolated). + # + # @code + # # classic "isolated" check for space < 1.2 um + # in = layer(1, 0) + # errors = isolated(in, 1.2.um) + # @/code + # + # @h3 Universal DRC @/h3 + # + # The version without a layer is intended for use within \DRC# expressions + # together with the "universal DRC" method \Layer#drc. In this case, this function needs to be + # put into a condition to specify the check constraints. The other options + # of \Layer#isolated (e.g. metrics, projection constraints, angle limits etc.) + # apply to this version too: + # + # @code + # # universal DRC "isolated" check for space < 1.2.um + # in = layer(1, 0) + # errors = in.drc(isolated < 1.2.um) + # @/code + # + # See \enclosing for more details about the various ways to specify conditions. + # + # @table + # @tr + # @td @img(/images/drc_space3u.png) @/td + # @/tr + # @/table %w( enclosing diff --git a/src/drc/drc/built-in-macros/_drc_layer.rb b/src/drc/drc/built-in-macros/_drc_layer.rb index 6b083d325..d0e9e5d3e 100644 --- a/src/drc/drc/built-in-macros/_drc_layer.rb +++ b/src/drc/drc/built-in-macros/_drc_layer.rb @@ -2975,6 +2975,9 @@ CODE # @brief A width check # @synopsis layer.width(value [, options]) # + # @b Note: @/b "width" is available as an operator for the "universal DRC" function \Layer#drc within + # the \DRC framework. This variant has more options and is more intuitive to use. See \global#width for more details. + # # This method performs a width check and returns a collection of edge pairs. # A width check can be performed on polygon and edge layers. On edge layers, all # edges are checked against all other edges. If two edges form a "back to back" relation @@ -3050,7 +3053,7 @@ CODE # # There is an alternative notation for the check using the "universal DRC" function ("\Layer#drc"). # This notation is more intuitive and allows checking for widths bigger than a certain value - # or within a certain range. + # or within a certain range. See "\global#width" for details. # # Apart from that it provides the same options than the plain width check. # Follow this link for the documentation of this feature: \global#width. @@ -3074,6 +3077,9 @@ CODE # @brief A space check # @synopsis layer.space(value [, options]) # + # @b Note: @/b "space" is available as an operator for the "universal DRC" function \Layer#drc within + # the \DRC framework. This variant has more options and is more intuitive to use. See \global#space for more details. + # # This method performs a space check and returns a collection of edge pairs. # A space check can be performed on polygon and edge layers. On edge layers, all # edges are checked against all other edges. If two edges form a "face to face" relation @@ -3094,6 +3100,8 @@ CODE # Distance 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. # + # For the manifold options of this function see the \width method description. + # # The following image shows the effect of the space check: # # @table @@ -3109,6 +3117,9 @@ CODE # @synopsis layer.isolated(value [, options]) # @synopsis layer.iso(value [, options]) # + # @b Note: @/b "isolated" and "iso" are available as operators for the "universal DRC" function \Layer#drc within + # the \DRC framework. These variants have more options and are more intuitive to use. See \global#isolated for more details. + # # See \space for a description of this method. # In contrast to \space, this # method is available for polygon layers only, since only on such layers @@ -3129,6 +3140,9 @@ CODE # @brief An intra-region spacing check # @synopsis layer.notch(value [, options]) # + # @b Note: @/b "notch" is available as an operator for the "universal DRC" function \Layer#drc within + # the \DRC framework. This variant has more options and is more intuitive to use. See \global#notch for more details. + # # See \space for a description of this method. # In contrast to \space, this # method is available for polygon layers only, since only on such layers @@ -3149,6 +3163,10 @@ CODE # @synopsis layer.separation(other_layer, value [, options]) # @synopsis layer.sep(other_layer, value [, options]) # + # @b Note: @/b "separation" and "sep" are available as operators for the "universal DRC" function \drc within + # the \DRC framework. These variants have more options and are more intuitive to use. + # See \global#separation for more details. + # # This method performs a two-layer spacing check. Like \space, this method # can be applied to edge or polygon layers. Locations where edges of the layer # are closer than the specified distance to the other layer are reported @@ -3160,8 +3178,7 @@ CODE # layers touch are also reported. More specifically, the case of zero spacing # will also trigger an error while for \space it will not. # - # As for the other DRC methods, merged semantics applies. The options available - # are the same than for \width. + # As for the other DRC methods, merged semantics applies. # Distance 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. # @@ -3173,6 +3190,8 @@ CODE # @/tr # @/table # + # @h3 opposite and rectangle error filtering @/h3 + # # The options for the separation check are those available for the \width or \space # method plus opposite and rectangle error filtering. # @@ -3244,6 +3263,10 @@ CODE # @brief An overlap check # @synopsis layer.overlap(other_layer, value [, options]) # + # @b Note: @/b "overlap" is available as an operator for the "universal DRC" function \drc within + # the \DRC framework. This variant has more options and is more intuitive to use. + # See \global#overlap for more details. + # # This method checks whether layer and other_layer overlap by at least the # given length. Locations, where this is not the case will be reported in form # of edge pair error markers. @@ -3283,6 +3306,10 @@ CODE # @synopsis layer.enclosing(other_layer, value [, options]) # @synopsis layer.enc(other_layer, value [, options]) # + # @b Note: @/b "enclosing" and "enc" are available as operators for the "universal DRC" function \drc within + # the \DRC framework. These variants have more options and are more intuitive to use. + # See \global#enclosing for more details. + # # This method checks whether layer encloses (is bigger than) other_layer by the # given dimension. Locations, where this is not the case will be reported in form # of edge pair error markers. diff --git a/src/lay/lay/doc/about/drc_ref_global.xml b/src/lay/lay/doc/about/drc_ref_global.xml index 56a9ebb8c..6400aa092 100644 --- a/src/lay/lay/doc/about/drc_ref_global.xml +++ b/src/lay/lay/doc/about/drc_ref_global.xml @@ -36,7 +36,7 @@ See Netter#antenna_check f
  • area(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.area" (see Layer#area) and returns the total area of the polygons in the layer.

    @@ -339,7 +339,7 @@ See Netter#connect_implicit

  • corners(layer [, options ])
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.corners" (see Layer#corners). Without a layer argument, "corners" represents the corner generator/filter in primary shapes for DRC expressions (see Layer#drc and DRC#corners for more details). @@ -523,14 +523,39 @@ See Source#edges for a description

  • enclosing(layer, other [, options ])
  • -This function can be used with a layer argument in which case it +This check verifies if the polygons of the input layer are enclosing the shapes +of the other input layer by a certain distance. +It has manifold options. See Layer#width for the basic options such +as metrics, projection and angle constraints etc. This check also features +opposite and rectangle filtering. See Layer#separation for details about opposite and +rectangle error filtering. +

    +

    Classic mode

    +

    +This function can be used in classic mode with a layer argument. In this case it is equivalent to "layer.enclosing" (see Layer#enclosing).

    -The version without the first layer is intended for use within DRC expressions -together with the Layer#drc method. In this case, this function needs to be +

    +# classic "enclosing" check for < 0.2 um
    +in = layer(1, 0)
    +other = layer(2, 0)
    +errors = enclosing(in, other, 0.2.um)
    +
    +

    +

    Universal DRC

    +

    +The version without a first layer is intended for use within DRC expressions +together with the "universal DRC" method Layer#drc. In this case, this function needs to be put into a condition to specify the check constraints. The other options of Layer#enclosing (e.g. metrics, projection constraints, angle limits etc.) -apply to this version too. +apply to this version too: +

    +

    +# universal DRC "enclosing" check for < 0.2 um
    +in = layer(1, 0)
    +other = layer(2, 0)
    +errors = in.drc(enclosing(other) < 0.2.um)
    +

    The conditions may involve an upper and lower limit. The following examples illustrate the use of this function with conditions: @@ -553,6 +578,13 @@ primary shape where the condition is met. With a lower limit alone, these markers 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. +

    + + + + + +

    "error" - Prints an error

    @@ -580,7 +612,7 @@ See
    Source#extent for a descripti
  • extent_refs(layer, [ options ])
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.extent_refs" (see Layer#extent_refs). Without a layer argument, "extent_refs" represents the partial extents extractor on primary shapes within DRC expressions (see Layer#drc and DRC#extent_refs for more details). @@ -593,7 +625,7 @@ argument, "extent_refs" represents the partial extents extractor on primary shap

  • extents(layer, [ enlargement ])
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.extents" (see Layer#extents). Without a layer argument, "extents" represents the extents generator on primary shapes within DRC expressions (see Layer#drc and DRC#extents for more details). @@ -648,7 +680,7 @@ out = in.drc(primary & foreign.sized(0.5.um))

  • holes(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.holes" (see Layer#hulls). Without a layer argument, "holes" represents a hole extractor for primary shapes in DRC expressions (see Layer#drc and DRC#hulls for more details). @@ -661,7 +693,7 @@ argument, "holes" represents a hole extractor for primary shapes in

  • hulls(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.hulls" (see Layer#hulls). Without a layer argument, "hulls" represents a hull contour extractor for primary shapes in DRC expressions (see Layer#drc and DRC#hulls for more details). @@ -775,6 +807,56 @@ as method to an expression. See there for more details: isolated.

    +

    "isolated" - Performs an isolation (inter-polygon space) check

    + +

    Usage:

    +
      +
    • isolated([ options ]) (in conditions)
    • +
    • iso([ options ]) (in conditions)
    • +
    • isolated(layer [, options ])
    • +
    • iso(layer [, options ])
    • +
    +

    +Provides a intra-polygon space check for polygons. It is similar to +space, but checks inter-polygon space only. "iso" is a synonym for "isolated". +This check has manifold options. See Layer#width for the basic options such +as metrics, projection and angle constraints etc. This check also features +opposite and rectangle filtering. See Layer#separation for details about opposite and +rectangle error filtering. +

    +

    Classic mode

    +

    +This function can be used in classic mode with a layer argument. In this case it +is equivalent to "layer.isolated" (see Layer#isolated). +

    +

    +# classic "isolated" check for space < 1.2 um
    +in = layer(1, 0)
    +errors = isolated(in, 1.2.um)
    +
    +

    +

    Universal DRC

    +

    +The version without a layer is intended for use within DRC expressions +together with the "universal DRC" method Layer#drc. In this case, this function needs to be +put into a condition to specify the check constraints. The other options +of Layer#isolated (e.g. metrics, projection constraints, angle limits etc.) +apply to this version too: +

    +

    +# universal DRC "isolated" check for space < 1.2.um
    +in = layer(1, 0)
    +errors = in.drc(isolated < 1.2.um)
    +
    +

    +See enclosing for more details about the various ways to specify conditions. +

    + + + + +
    +

    "l2n_data" - Gets the internal LayoutToNetlist object for the default Netter

    Usage:

    @@ -847,7 +929,7 @@ For further methods on the source object see Source.
  • length(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.length" (see Layer#length). Without a layer argument, "length" represents the edge length filter on the primary shape edges in DRC expressions (see Layer#drc and DRC#length for more details). In this context, @@ -934,7 +1016,7 @@ See also max_area_ratio for the other option affec

  • middle(layer, [ options ])
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.middle" (see Layer#middle). Without a layer argument, "middle" represents the bounding box center marker generator on primary shapes within DRC expressions (see Layer#drc and DRC#middle for more details). @@ -998,8 +1080,43 @@ Resets the tile borders - see tile_borders for a des

  • notch(layer [, options ])
  • -Provides a intra-polygon space check for polygons from the primary layer. Like width this -function provides a single-layer check. See there for details how to use this function. +Provides a intra-polygon space check for polygons. It is similar to +space, but checks intra-polygon space only. +It has manifold options. See Layer#width for the basic options such +as metrics, projection and angle constraints etc. +

    +

    Classic mode

    +

    +This function can be used in classic mode with a layer argument. In this case it +is equivalent to "layer.notch" (see Layer#notch). +

    +

    +# classic "notch" check for space < 1.2 um
    +in = layer(1, 0)
    +errors = notch(in, 1.2.um)
    +
    +

    +

    Universal DRC

    +

    +The version without a layer is intended for use within DRC expressions +together with the "universal DRC" method Layer#drc. In this case, this function needs to be +put into a condition to specify the check constraints. The other options +of Layer#notch (e.g. metrics, projection constraints, angle limits etc.) +apply to this version too: +

    +

    +# universal DRC "notch" check for space < 1.2.um
    +in = layer(1, 0)
    +errors = in.drc(notch < 1.2.um)
    +
    +

    +See enclosing for more details about the various ways to specify conditions. +

    + + + + +

    "odd_polygons" - Selects all polygons which are non-orientable

    @@ -1009,7 +1126,7 @@ function provides a single-layer check. See there for details how to use this fu
  • odd_polygons(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.odd_polygons" (see Layer#odd_polygons). Without a layer argument, "odd_polygons" represents an odd polygon filter for primary shapes in DRC expressions (see Layer#drc and DRC#odd_polygons for more details). @@ -1054,8 +1171,42 @@ as method to an expression. See there for more details: enclosing this -function provides a two-layer check. See there for details how to use this function. +Provides an overlap check (primary layer vs. another layer). +This check has manifold options. See Layer#width for the basic options such +as metrics, projection and angle constraints etc. This check also features +opposite and rectangle filtering. See Layer#separation for details about opposite and +rectangle error filtering. +

    +

    Classic mode

    +

    +Like other checks, this function is available as a classic DRC function with a layer as the first +argument and as an DRC expression operator for use with Layer#drc. +

    +

    +# classic "overlap" check for < 0.2 um
    +in = layer(1, 0)
    +other = layer(2, 0)
    +errors = overlap(in, other, 0.2.um)
    +
    +

    +

    Universal DRC

    +

    +For use with the "unversal DRC" put the separation expression into the "drc" +function call and use a condition to specify the constraint: +

    +

    +# universal DRC "overlap" check for < 0.2 um
    +in = layer(1, 0)
    +other = layer(2, 0)
    +errors = in.drc(overlap(other) < 0.2.um)
    +
    +

    + + + + + +

    "overlapping" - Selects shapes overlapping with other shapes

    @@ -1103,7 +1254,7 @@ This function creates a path object. The arguments are the same than for the
  • perimeter(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.perimeter" (see Layer#perimeter) and returns the total perimeter of all polygons in the layer.

    @@ -1159,7 +1310,7 @@ is called on.

  • rectangles(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.rectangles" (see Layer#rectangles). Without a layer argument, "rectangles" represents the rectangles filter for primary shapes in DRC expressions (see Layer#drc and DRC#rectangles for more details). @@ -1172,7 +1323,7 @@ argument, "rectangles" represents the rectangles filter for primary shapes in

  • rectilinear(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.rectilinear" (see Layer#rectilinear). Without a layer argument, "rectilinear" represents the rectilinear polygons filter for primary shapes in DRC expressions (see Layer#drc and DRC#rectilinear for more details). @@ -1263,7 +1414,7 @@ about this extractor.

  • rounded_corners(layer, inner, outer, n)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.rounded_corners" (see Layer#rounded_corners). Without a layer argument, "rounded_corners" represents the corner rounding algorithm on primary shapes within DRC expressions (see Layer#drc and DRC#rounded_corners for more details). @@ -1312,7 +1463,45 @@ See Source#select for a descripti

    Provides a separation check (primary layer vs. another layer). Like enclosing this -function provides a two-layer check. See there for details how to use this function. +function provides a two-layer check, but checking the distance rather than the +overlap. +This check has manifold options. See Layer#width for the basic options such +as metrics, projection and angle constraints etc. This check also features +opposite and rectangle filtering. See Layer#separation for details about opposite and +rectangle error filtering. +

    +

    Classic mode

    +

    +Like enclosing, this function is available as a classic DRC function with a layer as the first +argument and as an DRC expression operator for use with Layer#drc. +

    +

    +# classic "separation" check for distance < 0.2 um
    +in = layer(1, 0)
    +other = layer(2, 0)
    +errors = separation(in, other, 0.2.um)
    +
    +

    +

    Universal DRC

    +

    +For use with the "universal DRC" put the separation expression into the "drc" +function call and use a condition to specify the constraint: +

    +

    +# universal DRC "separation" check for distance < 0.2 um
    +in = layer(1, 0)
    +other = layer(2, 0)
    +errors = in.drc(separation(other) < 0.2.um)
    +
    +

    +enclosing explains the constraints and how the +work in generating error markers. +

    + + + + +

    "silent" - Resets verbose mode

    @@ -1333,7 +1522,7 @@ This function is equivalent to "verbose(false)" (see
    verbose<
  • sized(layer, dx, dy [, mode]))
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.sized" (see Layer#sized). Without a layer argument, "sized" represents the polygon sizer on primary shapes within DRC expressions (see Layer#drc and DRC#sized for more details). @@ -1346,7 +1535,7 @@ argument, "sized" represents the polygon sizer on primary shapes within

  • smoothed(layer, d)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.smoothed" (see Layer#smoothed). Without a layer argument, "smoothed" represents the polygon smoother on primary shapes within DRC expressions (see Layer#drc and DRC#smoothed for more details). @@ -1396,8 +1585,46 @@ For further methods on the source object see Source.

  • space(layer [, options ])
  • -Provides a space check on the primary layer. Like width this -function provides a single-layer check. See there for details how to use this function. +"space" looks for spacing violations between edges of the same polygon (intra-polygon checks) +and between different polygons (inter-polygon checks). +notch is similar function that provides only intra-polygon space checks. isolated +is the version checking inter-polygon distance only. +The check has manifold options. See Layer#width for the basic options such +as metrics, projection and angle constraints etc. +

    +

    Classic mode

    +

    +This function can be used in classic mode with a layer argument. In this case it +is equivalent to "layer.space" (see Layer#space). In this mode, "space" is applicable to edge +layers too. +

    +

    +# classic "space" check for space < 0.2 um
    +in = layer(1, 0)
    +errors = space(in, 0.2.um)
    +
    +

    +

    Universal DRC

    +

    +The version without a layer is intended for use within DRC expressions +together with the "universal DRC" method Layer#drc. In this case, this function needs to be +put into a condition to specify the check constraints. The other options +of Layer#space (e.g. metrics, projection constraints, angle limits etc.) +apply to this version too: +

    +

    +# universal DRC check for space < 0.2.um
    +in = layer(1, 0)
    +errors = in.drc(space < 0.2.um)
    +
    +

    +See enclosing for more details about the various ways to specify conditions. +

    + + + + +

    "squares" - Selects all polygons which are squares

    @@ -1407,7 +1634,7 @@ function provides a single-layer check. See there for details how to use this fu
  • squares(layer)
  • -This function can be used with a layer argument in which case it +This function can be used with a layer argument. In this case it is equivalent to "layer.squares" (see Layer#squares). Without a layer argument, "squares" represents the rectangles filter for primary shapes in DRC expressions (see Layer#drc and DRC#squares for more details). @@ -1569,26 +1796,44 @@ In verbose mode, more output is generated in the log file

  • width(layer [, options ])
  • -This function can be used with a layer argument in which case it +A width check is a check for the distance of edges of the same polygon. +

    +

    Classic mode

    +

    +This function can be used in classic mode with a layer argument. In this case it is equivalent to "layer.width" (see Layer#width).

    +

    +# classic "width" check for width < 2 um
    +in = layer(1, 0)
    +errors = width(in, 0.2.um)
    +
    +

    +

    Universal DRC

    +

    The version without a layer is intended for use within DRC expressions -together with the Layer#drc method. In this case, this function needs to be +together with the "universal DRC" method Layer#drc. In this case, this function needs to be put into a condition to specify the check constraints. The other options of Layer#width (e.g. metrics, projection constraints, angle limits etc.) -apply to this version too. +apply to this version too: +

    +

    +# universal DRC check for width < 2 um
    +in = layer(1, 0)
    +errors = in.drc(width < 0.2.um)
    +

    The conditions may involve an upper and lower limit. The following examples illustrate the use of this function with conditions:

    -out = in.drc(width < 0.2.um)
    -out = in.drc(width <= 0.2.um)
    -out = in.drc(width > 0.2.um)
    -out = in.drc(width >= 0.2.um)
    -out = in.drc(width == 0.2.um)
    -out = in.drc(width != 0.2.um)
    -out = in.drc(0.1.um <= width < 0.2.um)
    +errors = in.drc(width < 0.2.um)
    +errors = in.drc(width <= 0.2.um)
    +errors = in.drc(width > 0.2.um)
    +errors = in.drc(width >= 0.2.um)
    +errors = in.drc(width == 0.2.um)
    +errors = in.drc(width != 0.2.um)
    +errors = in.drc(0.1.um <= width < 0.2.um)
     

    diff --git a/src/lay/lay/doc/about/drc_ref_layer.xml b/src/lay/lay/doc/about/drc_ref_layer.xml index 16206d347..c15dd08b9 100644 --- a/src/lay/lay/doc/about/drc_ref_layer.xml +++ b/src/lay/lay/doc/about/drc_ref_layer.xml @@ -769,6 +769,10 @@ See enclosing for a description of that method
  • layer.enc(other_layer, value [, options])
  • +Note: "enclosing" and "enc" are available as operators for the "universal DRC" function drc within +the DRC framework. These variants have more options and are more intuitive to use. +See enclosing for more details. +

    This method checks whether layer encloses (is bigger than) other_layer by the given dimension. Locations, where this is not the case will be reported in form of edge pair error markers. @@ -1332,6 +1336,9 @@ See isolated for a description of that method

  • layer.iso(value [, options])
  • +Note: "isolated" and "iso" are available as operators for the "universal DRC" function Layer#drc within +the DRC framework. These variants have more options and are more intuitive to use. See isolated for more details. +

    See space for a description of this method. In contrast to space, this method is available for polygon layers only, since only on such layers @@ -1735,6 +1742,9 @@ is select_not_overlapping.

  • layer.notch(value [, options])
  • +Note: "notch" is available as an operator for the "universal DRC" function Layer#drc within +the DRC framework. This variant has more options and is more intuitive to use. See notch for more details. +

    See space for a description of this method. In contrast to space, this method is available for polygon layers only, since only on such layers @@ -1870,6 +1880,10 @@ This method is available for edge layers. The argument must be a polygon layer.

  • layer.overlap(other_layer, value [, options])
  • +Note: "overlap" is available as an operator for the "universal DRC" function drc within +the DRC framework. This variant has more options and is more intuitive to use. +See overlap for more details. +

    This method checks whether layer and other_layer overlap by at least the given length. Locations, where this is not the case will be reported in form of edge pair error markers. @@ -2392,6 +2406,10 @@ See separation for a description of that method

  • layer.sep(other_layer, value [, options])
  • +Note: "separation" and "sep" are available as operators for the "universal DRC" function drc within +the DRC framework. These variants have more options and are more intuitive to use. +See separation for more details. +

    This method performs a two-layer spacing check. Like space, this method can be applied to edge or polygon layers. Locations where edges of the layer are closer than the specified distance to the other layer are reported @@ -2403,8 +2421,7 @@ In contrast to the space and related methods, locations whe layers touch are also reported. More specifically, the case of zero spacing will also trigger an error while for space it will not.

    -As for the other DRC methods, merged semantics applies. The options available -are the same than for width. +As for the other DRC methods, merged semantics applies. Distance 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.

    @@ -2416,6 +2433,8 @@ The following image shows the effect of the separation check (input1: red, input

    +

    opposite and rectangle error filtering

    +

    The options for the separation check are those available for the width or space method plus opposite and rectangle error filtering.

    @@ -2600,6 +2619,9 @@ not modify the layer but returns a snapped copy.

  • layer.space(value [, options])
  • +Note: "space" is available as an operator for the "universal DRC" function Layer#drc within +the DRC framework. This variant has more options and is more intuitive to use. See space for more details. +

    This method performs a space check and returns a collection of edge pairs. A space check can be performed on polygon and edge layers. On edge layers, all edges are checked against all other edges. If two edges form a "face to face" relation @@ -2620,6 +2642,8 @@ Like for the width method, merged semantics applies. Distance 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.

    +For the manifold options of this function see the width method description. +

    The following image shows the effect of the space check:

    @@ -2796,6 +2820,9 @@ The following image shows the effect of the "moved" method:
  • layer.width(value [, options])
  • +Note: "width" is available as an operator for the "universal DRC" function Layer#drc within +the DRC framework. This variant has more options and is more intuitive to use. See width for more details. +

    This method performs a width check and returns a collection of edge pairs. A width check can be performed on polygon and edge layers. On edge layers, all edges are checked against all other edges. If two edges form a "back to back" relation @@ -2871,7 +2898,7 @@ The following images show the effect of various forms of the width check:

    There is an alternative notation for the check using the "universal DRC" function ("Layer#drc"). This notation is more intuitive and allows checking for widths bigger than a certain value -or within a certain range. +or within a certain range. See "width" for details.

    Apart from that it provides the same options than the plain width check. Follow this link for the documentation of this feature: width. diff --git a/src/lay/lay/doc/images/drc_enc1u.png b/src/lay/lay/doc/images/drc_enc1u.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6e58bb92b4d33cf257aad69d578cbffa8fb79e GIT binary patch literal 8823 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 I+jjK-051Cx2LJ#7 literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_overlap1u.png b/src/lay/lay/doc/images/drc_overlap1u.png new file mode 100644 index 0000000000000000000000000000000000000000..72401d229d2f13bc7d948de99f8b4d9549c0cef2 GIT binary patch literal 9480 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 literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_separation1u.png b/src/lay/lay/doc/images/drc_separation1u.png new file mode 100644 index 0000000000000000000000000000000000000000..c3bbe1416a0b1b3bcbebdc91f25ba07075891b63 GIT binary patch literal 8551 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 jHUc9}K0JoWp2E4ko}Xo|b`TYoel{ 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 y&dsAN06Gh2kX$j1>^6ACCeNSXPz1p4KJ+ literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_space2u.png b/src/lay/lay/doc/images/drc_space2u.png new file mode 100644 index 0000000000000000000000000000000000000000..0f330331435996bfd930ae5e6c56ba75c3503084 GIT binary patch literal 7317 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 ZoSFEjuIJo_HDDC|eFJ?;H-7cae*-Qf_NV{= literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_space3u.png b/src/lay/lay/doc/images/drc_space3u.png new file mode 100644 index 0000000000000000000000000000000000000000..2d304de7ca42c9a9f71e1242cba085a498ef2f4e GIT binary patch literal 7374 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 Lda(Gw`S1S;fBUis literal 0 HcmV?d00001 diff --git a/src/lay/lay/layDRCLVSHelpResources.qrc b/src/lay/lay/layDRCLVSHelpResources.qrc index 0166f4b13..cdc914da3 100644 --- a/src/lay/lay/layDRCLVSHelpResources.qrc +++ b/src/lay/lay/layDRCLVSHelpResources.qrc @@ -13,7 +13,11 @@ doc/images/drc_space1.png doc/images/drc_space2.png doc/images/drc_space3.png + doc/images/drc_space1u.png + doc/images/drc_space2u.png + doc/images/drc_space3u.png doc/images/drc_separation1.png + doc/images/drc_separation1u.png doc/images/drc_separation2.png doc/images/drc_separation3.png doc/images/drc_separation4.png @@ -29,8 +33,12 @@ doc/images/drc_raw3.png doc/images/drc_enc1.png doc/images/drc_enc2.png + doc/images/drc_enc1u.png + doc/images/drc_enc2u.png doc/images/drc_overlap1.png doc/images/drc_overlap2.png + doc/images/drc_overlap1u.png + doc/images/drc_overlap2u.png doc/images/drc_start_segments1.png doc/images/drc_start_segments2.png doc/images/drc_end_segments1.png diff --git a/testdata/drc/drcGenericTests_11.drc b/testdata/drc/drcGenericTests_11.drc index 89c21c24c..cbf2c9380 100644 --- a/testdata/drc/drcGenericTests_11.drc +++ b/testdata/drc/drcGenericTests_11.drc @@ -35,6 +35,5 @@ l1.output(1, 0) l1.odd_polygons.output(10, 0) l1.drc(smoothed(0.5)).output(100, 0) -l1.drc(odd_polygons).output(101, 0) l1.drc(rounded_corners(1.0, 0.5, 8)).output(102, 0) diff --git a/testdata/drc/drcGenericTests_11.gds b/testdata/drc/drcGenericTests_11.gds index b4f292e1ac33eb1c823fd405686d6e9bd8e68dbf..1f455ce41778e721868de97018a84dc1127d9949 100644 GIT binary patch delta 66 ucmX@be2Q6#fsKKQDS|nPGxIY60A`>H AUH||9 delta 77 zcmX@a^@~f1fsKKQDS|E6m*d~JRBt- zpdUaSM3=-_GWonSKGVVB_&xsbfB(D7kMiRISYQ}u&~F&_J2YSi0J^ZX`Mw$)`2WcF z=MxJ{D@I9`+9x=&W4yH!j9O#-r1wSZ2~!bcBu?>Bd|}xpFPB4JXNDs;!P22#cZQL- z!orPLh3A8vq08Op?3w#Os z`v8tq>h+;+&<3qL5+}b#faWtB0qk{6M^^feu{YfO3Z?+w9S^Tqw^C+h6cwAuZ4Xl?*P&}L>eYr zfUu~Y1_J}@o&WzoBtYm-Aq))c7ykc;(J=8336t-M$*BDQ|Eh(7fp-l=1OEa94HJLW zGI^e;%w#KOKCve&K<51a529bS{Qv)G3y7X9CoVDBj9Cb`w3Hgi0+@jy7vQi+PFzk8 X=0KQ(VKht}NV5nsFtD%#F$)6#Ii$EW diff --git a/testdata/drc/drcGenericTests_au2d.gds b/testdata/drc/drcGenericTests_au2d.gds index 43961a21111f6005d4e2b4a8ece8d521166c1cfb..3fb8e4e503d6c83fd5df1f7b56705a8531041dde 100644 GIT binary patch delta 784 zcmZ{hF-yZh6vtn#Y0@;NO^w|Iq2N-pb(bK11wmZu2e?7#;!sQnhb|8CK*u^t4T996 zgH!2R@B>H%(M2-&4bFQ#jwDit<9GMJd;gdJ%d)-PYk>uf9mBT4>@P6D2Y@Z8<@eXE z-C&)3a zCBte5cd8yHP7k})1t#tUNAk>FdFOT}-Hj`TVOG9t^>30GJg3%VSWe z|9A#)r$P|3_sUP}?lfN?=M4bLZ)Bh-8-e{wMv7W58WijE@0)!9FQEX6+NTg8E+kNm zoO#xe45%?t>yrOYfF|h7v&1w(N>0>zzCJFFP&LvG>5J=kY63*9|CzvT_6uopLVRB; T{+yDZ5Sm(-Tm`TJN~Q_F(wD$r delta 655 zcmbV|y-LGS6vt1l`D~izqu?Y61(z5^$SNU-k5EBe;se~R50DP74st+89i?WG_yE#f z@ByR+(M2+pzQFZfE};ozP=~|s-aqI3&&Oha5sp9yLe5}EA;uRd{I?B&Kf`!LB_&iBOFUF-WO?Crm zk_8UZA#V^&@*B_x1OOs$3qX5kY;_^I9s?L}jMc1lPSpocO#s~?(5iO|#=b8B1Vz4k zzhSL&HtO@H0b?J}!a#C8X6*Ap3?NzSZ3DR7Ebx!|oHPyOntCRvedoAdsu%zGz z5Nm$`6~TlUV+b*ZSg^kD=00}!-P`kSxFaVC`N-`1X6Mb$H@k0FK<@TL-Hy(cZbaeCH&h^a?PiwMJX~U~lYmXj_43CObCrg?4 z>ZMZV|JrofxnK81X6uUcE6$xPiV$g^t;_J`1pns?k-1gpfZ)L&k@mUO6klZIt8>RS z#oxC?rZ$};(w<>*{y$eWe&GCyNcqqs;@9ys|M0!Y_>ObHnGNTDta+q;d?&@ne9nDe zS46yspGbR#$@otvz;_Oa+>3amJ#5 z!<M%^X!%6RMWpYE6H zzqo&Be~I@8)mpp#2l429h40(gKULpaLq+?Cj;Hvh{>^+e<~P(|#5d?K;`G{sO*9e=U6Oa~+<4bNsIL`?9IOhF);q#W@QYf4_BhUQ~W`zM}tL zop0&yjo`(M_F@mkks zt+_td{u}X8TeznH7Ja|yc%-j@Z|dIx-`64Ql6`=ELF+UF%Joys zTe%sEpTm`F1u^16p_D<0_uLoIf(utC=jFV6fA8ky>e!#F<)ie`cOKImEQQTb7V|Pxb zaZK-dk7TjlNY@*VqC{16omrc?sOYb6Y=ex$NG(`(=X(VoD-0wVWP0+eo@&}Fcsi|U+W zznnBxfUu?2w#h+zc?6d)$zpK0`z zemV=;0}wry#(89UWDA#;65xvj1QsAB5)fDb#A60vHRD%gCKkd>%b$roAaYhfKmnoe xJ)uvNQ<(<#03x2+?vh2lsX*bi{7e&pfCWT85eTseqX?_!BD?8Xt*(^os^3xW*Af5# diff --git a/testdata/drc/drcGenericTests_au4d.gds b/testdata/drc/drcGenericTests_au4d.gds index 96a5d5aaf5a2efbec2e2638073e32154c8d3111c..e5149aed9b2cda368c19207879cc2ff1b664713f 100644 GIT binary patch literal 8222 zcmdT}F>4f25T4v!HkWuYnkW)UX(^aagdnIX5)2sR3bC??Rw5}?Qixi_&R&ajT3A~6 z1H{@NU=F)-rE<+q*l8oGefnJPckG& zMC6!E=-;JT%a#@|dV78N{DmiHFTZ>7?cDsEGaJvYw`FE{4_=lnU%1+qMpGmkuX*p; z;hOh<`bgdXuYQiNiPX15i0V?~s7PZ(_I%D*mR(v{T$=ZHj)^oU!&6)8DY=*KYtDUs zEG5^R`*|vlA-`4@eSItE`ly}z-WHkIDA4=N?eyKvckWjU{D3>Nc$RZS+N=2@Bkx5H zy$LwAE;9Z~gh;zb9e+({fB1vQ=vxsWvOcj9C{$qni;s_TMcM&AZRyvQSw_N43Tao2{J%eoHl z0=q~3{FM%W4*h|8L21CEUPV2jK=uRgOZtia*5I#N#o@hvwF-p4FjdOxSM&w@fPF!% zm&NW_z(Qj{GG-$MSiL7{Z!u!GoSH!e&C|d z;G?YnU{Cr_@x!#@bo#@omGI5|lfS=V>Z<3P`aj}t`e_H908vNuJdyT9KM~)c-!49U z&=2$v-2-Xo)bG^)W}o#(e+NZ>jAu~#qkpUZ6yKyj#owK;rK^6${Eheq{X~4ju0`=p z`iuAm{Y8B02FP`jSh0R~@u@TFj!1i=zgvCQAN?H^{V|?F>5u-c`cr(9{uJM|{w4gL z*T0Bw(68c~^cV3B`iuAm{dMuFGwO~=d!oNP9sNE3_xr{0Rfexoew}gO46N8sGTvNI zSl4kM(6XNl{AfQ(|8vMkANJ$)=k>|`Ye2+{nh-1Yx2ykIeHibc>O=qist^5H>vOkL zAI}f_5A-wpn0*bTJvlW|{BRGxKX7l^_Xq6B_lM$}PF)n=H2)KR&?Ebrx};8FPu~CD zU*=EoP5D!NQ~ng+l)r@EbN=rCW&RZ3lt0Bc;F^&R^(%cmCmwq-_4tp6ovq-&B9aH|;+ozG45U_=vyw$9)&ExK>)9eEq>a zxF5*xE+Xy8`DOHc!~QekV}0Q{C(k{Jv?u2`kNT`1`a3B4VLXG<5B*#9qxdHMD86Za zM|{KihvFC7p$@Qb*hfEIeCmX{A<~}cC*m9Q6Y&lDdE96H(BDDP591k>e(2w-AH_H6 oNAXSTPsBH@KZBw@C;Ex_2K_|*Ui9PtYTIbYZ#o#BZU6uP literal 8446 zcmcJTzfV*_5XXo6@i_1h0S&=WTAD~_OpFOg0g*&vt}s>Vb%LIe^`=#RFZ#El3y*!zbwhWD#@?2{GjyBv*9ee zy|B16A2VfGq%oeduIaL@lSL<=h45uvdOQo^_mxf#`s{=3tsZpPn6)8%Z;6a<<{IDG z8Mk+z%>EGmG?h>KYewe^!PLf!d6B`7BIkCJPHc#bY>SxMcvNq{?VcrFm-=1^`&&t! zy@mdaY$tzJjf>jr{c(3w{+WH9>QLVk8QN9*QdJn;%+ z^&7ea!hhh2^>;kAevYT|4|pQ~D!#iS*1wC-&w1PTrUm{6`Ja`XANc>7{~z6PBgMDu z|ECi${_Rga*A<8GV?n#Lq*LwG(VE(L>~;$IZ;wSLS3^)$PTyy0Sq|u9y06YU5p9JMiV!?>N4lI9uFJ3*ry+Yh_Y9Rn=~dhpCPCvwwd} z^G_?M=AZhXtBprHeEzvxL7LC<-16Sk#=G(#cw+s4C-yJ!ME(Fz~Pd9csPSTe_)@NA>j+ZoS0%Ii6ZS;EDAEo>)J}Q|sq$y;S`Ho~S>-6YB>& zQGb9Z>W|~8`r~-2{s2$ZA9rh~;txEre!vs?13ZyGz!Ul7cq;ymr{WJh5&w06e<11) z@I?H8C*lV@5kKIG{B=APf5%ht2cC$3#m8Uy!~~+CDEomY><6B(znbT7>VNc` TL$9xnHXgOpKgO?SwVM0|75(P8