From a833dd57fefc8a545f5a903130b2638d33fdcb6e Mon Sep 17 00:00:00 2001 From: Matthias Koefferlein Date: Sun, 6 Dec 2020 18:25:57 +0100 Subject: [PATCH] Implemented rectangle and opposite filters for DRC functions. --- scripts/create_drc_samples.rb | 110 ++++++++++++ src/db/db/dbEdgePairRelations.h | 6 +- src/db/db/dbRegionLocalOperations.cc | 8 +- src/db/db/dbRegionLocalOperations.h | 14 +- src/db/db/gsiDeclDbRegion.cc | 8 + src/drc/drc/built-in-macros/_drc_engine.rb | 32 ++++ src/drc/drc/built-in-macros/_drc_layer.rb | 190 ++++++++++++-------- src/drc/drc/built-in-macros/_drc_tags.rb | 18 ++ src/lay/lay/doc/about/drc_ref_global.xml | 2 + src/lay/lay/doc/about/drc_ref_layer.xml | 86 ++++++++- src/lay/lay/doc/images/drc_separation10.png | Bin 0 -> 6276 bytes src/lay/lay/doc/images/drc_separation11.png | Bin 0 -> 6554 bytes src/lay/lay/doc/images/drc_separation2.png | Bin 0 -> 6971 bytes src/lay/lay/doc/images/drc_separation3.png | Bin 0 -> 7154 bytes src/lay/lay/doc/images/drc_separation4.png | Bin 0 -> 7589 bytes src/lay/lay/doc/images/drc_separation5.png | Bin 0 -> 5998 bytes src/lay/lay/doc/images/drc_separation6.png | Bin 0 -> 6218 bytes src/lay/lay/doc/images/drc_separation7.png | Bin 0 -> 6082 bytes src/lay/lay/doc/images/drc_separation8.png | Bin 0 -> 6400 bytes src/lay/lay/doc/images/drc_separation9.png | Bin 0 -> 6188 bytes src/lay/lay/layDRCLVSHelpResources.qrc | 10 ++ 21 files changed, 396 insertions(+), 88 deletions(-) create mode 100644 src/lay/lay/doc/images/drc_separation10.png create mode 100644 src/lay/lay/doc/images/drc_separation11.png create mode 100644 src/lay/lay/doc/images/drc_separation2.png create mode 100644 src/lay/lay/doc/images/drc_separation3.png create mode 100644 src/lay/lay/doc/images/drc_separation4.png create mode 100644 src/lay/lay/doc/images/drc_separation5.png create mode 100644 src/lay/lay/doc/images/drc_separation6.png create mode 100644 src/lay/lay/doc/images/drc_separation7.png create mode 100644 src/lay/lay/doc/images/drc_separation8.png create mode 100644 src/lay/lay/doc/images/drc_separation9.png diff --git a/scripts/create_drc_samples.rb b/scripts/create_drc_samples.rb index 196c6bf19..15de2e5ed 100644 --- a/scripts/create_drc_samples.rb +++ b/scripts/create_drc_samples.rb @@ -240,6 +240,116 @@ gen = Gen::new run_demo gen, "input1.separation(input2, 1.2, euclidian)", "drc_separation1.png" +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(1000, 0), + RBA::Point::new(1000, 6000), + RBA::Point::new(2000, 6000), + RBA::Point::new(2000, 0), + ]; + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(5000, 2000), + RBA::Point::new(5000, 4000), + RBA::Point::new(6000, 4000), + RBA::Point::new(6000, 2000), + ]; + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(3000, 0), + RBA::Point::new(3000, 6000), + RBA::Point::new(4000, 6000), + RBA::Point::new(4000, 0) + ]; + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input1.sep(input2, 1.2, projection)", "drc_separation2.png" +run_demo gen, "input1.sep(input2, 1.2, projection, not_opposite)", "drc_separation3.png" +run_demo gen, "input1.sep(input2, 1.2, projection, only_opposite)", "drc_separation4.png" + +class Gen + def produce(s1, s2) + pts = [ + RBA::Point::new(0, 3000), + RBA::Point::new(0, 4000), + RBA::Point::new(1000, 4000), + RBA::Point::new(1000, 3000) + ] + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(3000, 3000), + RBA::Point::new(3000, 4000), + RBA::Point::new(4000, 4000), + RBA::Point::new(4000, 3000) + ] + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(6000, 3000), + RBA::Point::new(6000, 4000), + RBA::Point::new(7000, 4000), + RBA::Point::new(7000, 3000) + ] + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(4500, 1500), + RBA::Point::new(4500, 2500), + RBA::Point::new(5500, 2500), + RBA::Point::new(5500, 1500) + ] + s2.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(1500, 3000), + RBA::Point::new(1500, 4000), + RBA::Point::new(2500, 4000), + RBA::Point::new(2500, 3000) + ] + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(3000, 4500), + RBA::Point::new(3000, 5500), + RBA::Point::new(4000, 5500), + RBA::Point::new(4000, 4500) + ] + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(3000, 1500), + RBA::Point::new(3000, 2500), + RBA::Point::new(4000, 2500), + RBA::Point::new(4000, 1500) + ] + s1.insert(RBA::Polygon::new(pts)) + pts = [ + RBA::Point::new(4500, 3000), + RBA::Point::new(4500, 4000), + RBA::Point::new(5500, 4000), + RBA::Point::new(5500, 3000) + ] + s1.insert(RBA::Polygon::new(pts)) + end +end + +gen = Gen::new + +run_demo gen, "input1.sep(input2, 1.0, projection)", "drc_separation5.png" +run_demo gen, "input1.sep(input2, 1.0, projection,\n" + + " one_side_allowed)", "drc_separation6.png" +run_demo gen, "input1.sep(input2, 1.0, projection,\n" + + " two_sides_allowed)", "drc_separation7.png" +run_demo gen, "input1.sep(input2, 1.0, projection,\n" + + " two_opposite_sides_allowed)", "drc_separation8.png" +run_demo gen, "input1.sep(input2, 1.0, projection,\n" + + " two_connected_sides_allowed)", "drc_separation9.png" +run_demo gen, "input1.sep(input2, 1.0, projection,\n" + + " three_sides_allowed)", "drc_separation10.png" +run_demo gen, "input1.sep(input2, 1.0, projection,\n" + + " one_side_allowed,\n" + + " two_opposite_sides_allowed)", "drc_separation11.png" + # ... class Gen diff --git a/src/db/db/dbEdgePairRelations.h b/src/db/db/dbEdgePairRelations.h index a2d26b461..b7e0dece3 100644 --- a/src/db/db/dbEdgePairRelations.h +++ b/src/db/db/dbEdgePairRelations.h @@ -257,9 +257,9 @@ private: // Internal methods exposed for testing purposes -DB_PUBLIC bool projected_near_part_of_edge (bool include_zero, db::Coord d, const db::Edge &e, const db::Edge &g, db::Edge *output); -DB_PUBLIC bool square_near_part_of_edge (bool include_zero, db::Coord d, const db::Edge &e, const db::Edge &g, db::Edge *output); -DB_PUBLIC bool euclidian_near_part_of_edge (bool include_zero, db::Coord d, const db::Edge &e, const db::Edge &g, db::Edge *output); +DB_PUBLIC bool projected_near_part_of_edge (bool include_zero, db::coord_traits::distance_type d, const db::Edge &e, const db::Edge &g, db::Edge *output); +DB_PUBLIC bool square_near_part_of_edge (bool include_zero, db::coord_traits::distance_type d, const db::Edge &e, const db::Edge &g, db::Edge *output); +DB_PUBLIC bool euclidian_near_part_of_edge (bool include_zero, db::coord_traits::distance_type d, const db::Edge &e, const db::Edge &g, db::Edge *output); DB_PUBLIC db::Edge::distance_type edge_projection (const db::Edge &a, const db::Edge &b); } diff --git a/src/db/db/dbRegionLocalOperations.cc b/src/db/db/dbRegionLocalOperations.cc index 584ef8da1..e2998637e 100644 --- a/src/db/db/dbRegionLocalOperations.cc +++ b/src/db/db/dbRegionLocalOperations.cc @@ -352,9 +352,11 @@ check_local_operation::compute_local (db::Layout *layout, const shape_in uint32_t p4 = p32 & 0xf; p32 >>= 4; - for (unsigned int r = 0; r < 4 && ! can_be_waived; ++r) { - can_be_waived = (error_pattern == p4); - p4 = ((p4 << 1) & 0xf) | ((p4 & 0x8) >> 3); + if (p4 > 0) { + for (unsigned int r = 0; r < 4 && ! can_be_waived; ++r) { + can_be_waived = (error_pattern == p4); + p4 = ((p4 << 1) & 0xf) | ((p4 & 0x8) >> 3); + } } } diff --git a/src/db/db/dbRegionLocalOperations.h b/src/db/db/dbRegionLocalOperations.h index 95cefa485..6fc454f3f 100644 --- a/src/db/db/dbRegionLocalOperations.h +++ b/src/db/db/dbRegionLocalOperations.h @@ -39,7 +39,9 @@ namespace db * of groups of 4 bits each specifying an allowed pattern. Rotation is implicit, so it's just * required to give on incarnation. * - * For example: 0x1953 would be one- or two-sided. + * For example: 0x153 would be one- or two-sided. + * + * The bitmaps are choosen such that they can be or-combined. */ enum RectFilter { @@ -56,27 +58,27 @@ enum RectFilter /** * @brief Allow errors on two sides (not specified which) */ - TwoSidesAllowed = 0x953, + TwoSidesAllowed = 0x530, /** * @brief Allow errors on two sides ("L" configuration) */ - TwoConnectedSidesAllowed = 0x3, + TwoConnectedSidesAllowed = 0x30, /** * @brief Allow errors on two opposite sides */ - TwoOppositeSidesAllowed = 0x5, + TwoOppositeSidesAllowed = 0x500, /** * @brief Allow errors on three sides */ - ThreeSidesAllowed = 0x7, + ThreeSidesAllowed = 0x7000, /** * @brief Allow errors when on all sides */ - FourSidesAllowed = 0xf + FourSidesAllowed = 0xf0000 }; /** diff --git a/src/db/db/gsiDeclDbRegion.cc b/src/db/db/gsiDeclDbRegion.cc index 68e9ad177..07eb2fd27 100644 --- a/src/db/db/gsiDeclDbRegion.cc +++ b/src/db/db/gsiDeclDbRegion.cc @@ -2510,6 +2510,9 @@ gsi::EnumIn decl_Region_Metrics ("db", "Metrics", "This enum has been introduced in version 0.27." ); +// Inject the Region::Metrics declarations into Region: +gsi::ClassExt inject_Metrics_in_parent (decl_Region_Metrics.defs ()); + gsi::EnumIn decl_Region_RectFilter ("db", "RectFilter", gsi::enum_const ("NoRectFilter", db::RectFilter::NoSideAllowed, "@brief Specifies no filtering" @@ -2537,6 +2540,8 @@ gsi::EnumIn decl_Region_RectFilter ("db", "RectFilte "This enum has been introduced in version 0.27." ); +// Inject the Region::RectFilter declarations into Region: +gsi::ClassExt inject_RectFilter_in_parent (decl_Region_RectFilter.defs ()); gsi::EnumIn decl_Region_OppositeFilter ("db", "OppositeFilter", gsi::enum_const ("NoOppositeFilter", db::OppositeFilter::NoOppositeFilter, @@ -2553,5 +2558,8 @@ gsi::EnumIn decl_Region_OppositeFilter ("db", "O "This enum has been introduced in version 0.27." ); +// Inject the Region::OppositeFilter declarations into Region: +gsi::ClassExt inject_OppositeFilter_in_parent (decl_Region_OppositeFilter.defs ()); + } diff --git a/src/drc/drc/built-in-macros/_drc_engine.rb b/src/drc/drc/built-in-macros/_drc_engine.rb index bcacad3f0..58f39e071 100644 --- a/src/drc/drc/built-in-macros/_drc_engine.rb +++ b/src/drc/drc/built-in-macros/_drc_engine.rb @@ -115,6 +115,38 @@ module DRC DRCMetrics::new(RBA::Region::Projection) end + def not_opposite + DRCOppositeErrorFilter::new(RBA::Region::NotOpposite) + end + + def only_opposite + DRCOppositeErrorFilter::new(RBA::Region::OnlyOpposite) + end + + def one_side_allowed + DRCRectangleErrorFilter::new(RBA::Region::OneSideAllowed) + end + + def two_sides_allowed + DRCRectangleErrorFilter::new(RBA::Region::TwoSidesAllowed) + end + + def two_connected_sides_allowed + DRCRectangleErrorFilter::new(RBA::Region::TwoConnectedSidesAllowed) + end + + def two_opposite_sides_allowed + DRCRectangleErrorFilter::new(RBA::Region::TwoOppositeSidesAllowed) + end + + def three_sides_allowed + DRCRectangleErrorFilter::new(RBA::Region::ThreeSidesAllowed) + end + + def four_sides_allowed + DRCRectangleErrorFilter::new(RBA::Region::FourSidesAllowed) + end + def pattern(p) DRCPattern::new(true, p) end diff --git a/src/drc/drc/built-in-macros/_drc_layer.rb b/src/drc/drc/built-in-macros/_drc_layer.rb index 4fd5e452a..b54ef5689 100644 --- a/src/drc/drc/built-in-macros/_drc_layer.rb +++ b/src/drc/drc/built-in-macros/_drc_layer.rb @@ -2609,8 +2609,8 @@ CODE # method will only report space violations to other polygons. \separation is a two-layer # space check where space is checked against polygons of another layer. # - # The options available are the same than for the \width method. Like for the \width - # method, merged semantics applies. + # 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. # @@ -2621,17 +2621,21 @@ CODE # @td @img(/images/drc_space1.png) @/td # @/tr # @/table + # # %DRC% # @name isolated # @brief An isolation check # @synopsis layer.isolated(value [, options]) + # @synopsis layer.iso(value [, options]) # # 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 # different polygons can be identified. # + # "iso" is the short form of this method. + # # The following image shows the effect of the isolated check: # # @table @@ -2648,7 +2652,8 @@ CODE # 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 - # different polygons can be identified. + # different polygons can be identified. Also, opposite and rectangle error + # filtering is not available for this method. # # The following image shows the effect of the notch check: # @@ -2662,12 +2667,15 @@ CODE # @name separation # @brief A two-layer spacing check # @synopsis layer.separation(other_layer, value [, options]) + # @synopsis layer.sep(other_layer, value [, options]) # # 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 # as edge pair error markers. - # + # + # "sep" is the short form of this method. + # # In contrast to the \space and related methods, locations where both # layers touch are also reported. More specifically, the case of zero spacing # will also trigger an error while for \space it will not. @@ -2684,6 +2692,72 @@ CODE # @td @img(/images/drc_separation1.png) @/td # @/tr # @/table + # + # The options for the separation check are those available for the \width or \space + # method plus opposite and rectangle error filtering. + # + # Opposite error filtering will waive errors that are on opposite sides of the original + # figure. The inverse is selection of errors only when there is an error present on + # the opposite side of the original figure. Opposite error waiving or selection is achieved + # through these options inside the DRC function call: + # + # @ul + # @li @b not_opposite @/b will waive opposite errors @/li + # @li @b only_opposite @/b will select errors only if there is an opposite one @/li + # @/ul + # + # These modes imply partial waiving or selection if "opposite" only applies to a section + # of an error. + # + # The following images shows the effect of these options: + # + # @table + # @tr + # @td @img(/images/drc_separation2.png) @/td + # @/tr + # @tr + # @td @img(/images/drc_separation3.png) @/td + # @td @img(/images/drc_separation4.png) @/td + # @/tr + # @/table + # + # Rectangle error filtering allows waiving errors based on how they cover the + # sides of an original rectangular figure. This selection only applies to errors + # covering the full edge of the rectangle. Errors covering parts of the rectangle + # edges are not considered in this scheme. + # + # The rectangle filter option is enabled by these modes: + # + # @ul + # @li @b one_side_allowed @/b will waive errors when they appear on one side of the rectangle only @/li + # @li @b two_sides_allowed @/b will waive errors when they appear on two sides of the rectangle @/li + # @li @b two_connected_sides_allowed @/b will waive errors when they appear on two connected sides of the rectangle ("L" configuration) @/li + # @li @b two_opposite_sides_allowed @/b will waive errors when they appear on two opposite sides of the rectangle @/li + # @li @b three_sides_allowed @/b will waive errors when they appear on three sides of the rectangle @/li + # @li @b four_sides_allowed @/b will waive errors when they appear on four sides of the rectangle @/li + # @/ul + # + # Multiple of these options can be given, which will make errors waived if one of these conditions is met. + # + # The following images shows the effect of some rectangle filter modes: + # + # @table + # @tr + # @td @img(/images/drc_separation5.png) @/td + # @/tr + # @tr + # @td @img(/images/drc_separation6.png) @/td + # @td @img(/images/drc_separation7.png) @/td + # @/tr + # @tr + # @td @img(/images/drc_separation8.png) @/td + # @td @img(/images/drc_separation9.png) @/td + # @/tr + # @tr + # @td @img(/images/drc_separation10.png) @/td + # @td @img(/images/drc_separation11.png) @/td + # @/tr + # @/table # %DRC% # @name overlap @@ -2697,6 +2771,8 @@ CODE # such locations form an overlap with a value of 0. Locations, where both regions # do not overlap or touch will not be reported. Such regions can be detected # with \outside or by a boolean "not". + # + # The options are the same as for \separation. # # Formally, the overlap method is a two-layer width check. In contrast to the single- # layer width method (\width), the zero value also triggers an error and separate @@ -2725,6 +2801,7 @@ CODE # @name enclosing # @brief An enclosing check # @synopsis layer.enclosing(other_layer, value [, options]) + # @synopsis layer.enc(other_layer, value [, options]) # # 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 @@ -2734,6 +2811,10 @@ CODE # extends outside layer will not be reported as errors. Such regions can be detected # by \not_inside or a boolean "not" operation. # + # "enc" is the short form of this method. + # + # The options are the same as for \separation. + # # The enclosing method can be applied to both edge or polygon layers. On edge layers # the orientation of the edges matters and only edges looking into the same direction # are checked. @@ -2752,20 +2833,26 @@ CODE # @/tr # @/table - %w(width space overlap enclosing separation).each do |f| + %w(width space overlap enclosing separation isolated notch).each do |f| eval <<"CODE" def #{f}(*args) - requires_edges_or_region("#{f}") + if :#{f} == :width || :#{f} == :space || :#{f} == :overlap || :#{f} == :enclosing || :#{f} == :separation + requires_edges_or_region("#{f}") + else + requires_region("#{f}") + end value = nil - metrics = nil + metrics = RBA::Region::Euclidian minp = nil maxp = nil alim = nil whole_edges = false other = nil shielded = nil + opposite_filter = RBA::Region::NoOppositeFilter + rect_filter = RBA::Region::NoRectFilter n = 1 args.each do |a| @@ -2773,6 +2860,10 @@ CODE metrics = a.value elsif a.is_a?(DRCWholeEdges) whole_edges = a.value + elsif a.is_a?(DRCOppositeErrorFilter) + opposite_filter = a.value + elsif a.is_a?(DRCRectangleErrorFilter) + rect_filter = RBA::Region::RectFilter::new(a.value.to_i | rect_filter.to_i) elsif a.is_a?(DRCAngleLimit) alim = a.value elsif a.is_a?(DRCLayer) @@ -2796,24 +2887,35 @@ CODE end args = [ value, whole_edges, metrics, alim, minp, maxp ] - if shielded != nil - if self.data.is_a?(RBA::Region) - args << shielded - else - raise("#{f}: shielding can only be used for polygon layers") + + if self.data.is_a?(RBA::Region) + args << shielded + if :#{f} != :width && :#{f} != :notch + args << opposite_filter + args << rect_filter + elsif opposite_filter != RBA::Region::NoOppositeFilter + raise("#{f}: an opposite error filter cannot be used with this check") + elsif rect_filter != RBA::Region::NoRectFilter + raise("#{f}: a rectangle error filter cannot be used with this check") end + elsif shielded != nil + raise("#{f}: shielding can only be used for polygon layers") + elsif opposite_filter != RBA::Region::NoOppositeFilter + raise("#{f}: an opposite error filter can only be used for polygon layers") + elsif rect_filter != RBA::Region::NoRectFilter + raise("#{f}: a rectangle error filter can only be used for polygon layers") end border = (metrics == RBA::Region::Square ? value * 1.5 : value) - if "#{f}" == "width" || "#{f}" == "space" || "#{f}" == "notch" || "#{f}" == "isolated" + if :#{f} == :width || :#{f} == :space || :#{f} == :notch || :#{f} == :isolated if other - raise("No other layer must be specified for single-layer checks (i.e. width)") + raise("No other layer must be specified for a single-layer check (here: #{f})") end DRCLayer::new(@engine, @engine._tcmd(self.data, border, RBA::EdgePairs, :#{f}_check, *args)) else if !other - raise("The other layer must be specified for two-layer checks (i.e. overlap)") + raise("The other layer must be specified for a two-layer check (here: #{f})") end requires_same_type(other, "#{f}") DRCLayer::new(@engine, @engine._tcmd(self.data, border, RBA::EdgePairs, :#{f}_check, other.data, *args)) @@ -2823,64 +2925,6 @@ CODE CODE end - %w(isolated notch).each do |f| - eval <<"CODE" - def #{f}(*args) - - requires_region("#{f}") - - value = nil - metrics = nil - minp = nil - maxp = nil - alim = nil - whole_edges = false - other = nil - - n = 1 - args.each do |a| - if a.is_a?(DRCMetrics) - metrics = a.value - elsif a.is_a?(DRCWholeEdges) - whole_edges = a.value - elsif a.is_a?(DRCAngleLimit) - alim = a.value - elsif a.is_a?(DRCLayer) - other = a - elsif a.is_a?(DRCProjectionLimits) - minp = @engine._prep_value(a.min) - maxp = @engine._prep_value(a.max) - elsif a.is_a?(Float) || a.is_a?(1.class) - value && raise("Value already specified") - value = @engine._prep_value(a) - else - raise("#{f}: Parameter #" + n.to_s + " does not have an expected type") - end - n += 1 - end - - if !value - raise("A check value must be specified") - end - - border = (metrics == RBA::Region::Square ? value * 1.5 : value) - - if "#{f}" == "width" || "#{f}" == "space" || "#{f}" == "notch" || "#{f}" == "isolated" - if other - raise("#{f}: No other layer must be specified for single-layer checks (i.e. width)") - end - DRCLayer::new(@engine, @engine._tcmd(self.data, border, RBA::EdgePairs, :#{f}_check, value, whole_edges, metrics, alim, minp, maxp)) - else - if !other - raise("#{f}: The other layer must be specified for two-layer checks (i.e. overlap)") - end - DRCLayer::new(@engine, @engine._tcmd(self.data, border, RBA::EdgePairs, :#{f}_check, other.data, value, whole_edges, metrics, alim, minp, maxp)) - end - - end -CODE - end - # %DRC% # @name scaled # @brief Scales a layer diff --git a/src/drc/drc/built-in-macros/_drc_tags.rb b/src/drc/drc/built-in-macros/_drc_tags.rb index 30f460f2f..eaf58624b 100644 --- a/src/drc/drc/built-in-macros/_drc_tags.rb +++ b/src/drc/drc/built-in-macros/_drc_tags.rb @@ -72,6 +72,24 @@ module DRC end end + # A wrapper for a rectangle error filter mode + # The purpose of this wrapper is to identify the error filter mode + class DRCRectangleErrorFilter + attr_accessor :value + def initialize(v) + self.value = v + end + end + + # A wrapper for a opposite error filter mode + # The purpose of this wrapper is to identify the error filter mode + class DRCOppositeErrorFilter + attr_accessor :value + def initialize(v) + self.value = v + end + end + # A wrapper for a glob-pattern style text selection for # some DRC functions. The purpose of this class # is to identify the value by the class. diff --git a/src/lay/lay/doc/about/drc_ref_global.xml b/src/lay/lay/doc/about/drc_ref_global.xml index 6f80c8b5a..38cc38445 100644 --- a/src/lay/lay/doc/about/drc_ref_global.xml +++ b/src/lay/lay/doc/about/drc_ref_global.xml @@ -422,6 +422,7 @@ Disables tiling mode. Tiling mode can be enabled again with til

Usage:

  • info(message)
  • +
  • info(message, indent)

Prints the message to the log window in verbose mode. @@ -520,6 +521,7 @@ For further methods on the source object see Source.

Usage:

  • log(message)
  • +
  • log(message, indent)

Prints the message to the log window. diff --git a/src/lay/lay/doc/about/drc_ref_layer.xml b/src/lay/lay/doc/about/drc_ref_layer.xml index 192e50857..08d96c467 100644 --- a/src/lay/lay/doc/about/drc_ref_layer.xml +++ b/src/lay/lay/doc/about/drc_ref_layer.xml @@ -357,6 +357,7 @@ See enclosing for a description of that method

Usage:

  • layer.enclosing(other_layer, value [, options])
  • +
  • layer.enc(other_layer, value [, options])

This method checks whether layer encloses (is bigger than) other_layer by the @@ -367,6 +368,10 @@ such locations form an enclosure with a distance of 0. Locations, where other_la extends outside layer will not be reported as errors. Such regions can be detected by not_inside or a boolean "not" operation.

+"enc" is the short form of this method. +

+The options are the same as for separation. +

The enclosing method can be applied to both edge or polygon layers. On edge layers the orientation of the edges matters and only edges looking into the same direction are checked. @@ -915,6 +920,7 @@ See isolated for a description of that method

Usage:

  • layer.isolated(value [, options])
  • +
  • layer.iso(value [, options])

See space for a description of this method. @@ -922,6 +928,8 @@ In contrast to space, this method is available for polygon layers only, since only on such layers different polygons can be identified.

+"iso" is the short form of this method. +

The following image shows the effect of the isolated check:

@@ -1281,7 +1289,8 @@ is select_not_overlapping. 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 -different polygons can be identified. +different polygons can be identified. Also, opposite and rectangle error +filtering is not available for this method.

The following image shows the effect of the notch check:

@@ -1417,6 +1426,8 @@ such locations form an overlap with a value of 0. Locations, where both regions do not overlap or touch will not be reported. Such regions can be detected with outside or by a boolean "not".

+The options are the same as for separation. +

Formally, the overlap method is a two-layer width check. In contrast to the single- layer width method (width), the zero value also triggers an error and separate polygons are checked against each other, while for the single-layer width, only @@ -1880,6 +1891,7 @@ See separation for a description of that method

Usage:

  • layer.separation(other_layer, value [, options])
  • +
  • layer.sep(other_layer, value [, options])

This method performs a two-layer spacing check. Like space, this method @@ -1887,6 +1899,8 @@ 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 as edge pair error markers.

+"sep" is the short form of this method. +

In contrast to the space and related methods, locations where both layers touch are also reported. More specifically, the case of zero spacing will also trigger an error while for space it will not. @@ -1903,6 +1917,72 @@ The following image shows the effect of the separation check (input1: red, input

+

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

+Opposite error filtering will waive errors that are on opposite sides of the original +figure. The inverse is selection of errors only when there is an error present on +the opposite side of the original figure. Opposite error waiving or selection is achieved +through these options inside the DRC function call: +

+

    +
  • not_opposite will waive opposite errors
  • +
  • only_opposite will select errors only if there is an opposite one
  • +
+

+These modes imply partial waiving or selection if "opposite" only applies to a section +of an error. +

+The following images shows the effect of these options: +

+ + + + + + + + +
+

+Rectangle error filtering allows waiving errors based on how they cover the +sides of an original rectangular figure. This selection only applies to errors +covering the full edge of the rectangle. Errors covering parts of the rectangle +edges are not considered in this scheme. +

+The rectangle filter option is enabled by these modes: +

+

    +
  • one_side_allowed will waive errors when they appear on one side of the rectangle only
  • +
  • two_sides_allowed will waive errors when they appear on two sides of the rectangle
  • +
  • two_connected_sides_allowed will waive errors when they appear on two connected sides of the rectangle ("L" configuration)
  • +
  • two_opposite_sides_allowed will waive errors when they appear on two opposite sides of the rectangle
  • +
  • three_sides_allowed will waive errors when they appear on three sides of the rectangle
  • +
  • four_sides_allowed will waive errors when they appear on four sides of the rectangle
  • +
+

+Multiple of these options can be given, which will make errors waived if one of these conditions is met. +

+The following images shows the effect of some rectangle filter modes: +

+ + + + + + + + + + + + + + + + +

"size" - Polygon sizing (per-edge biasing, modifies the layer)

@@ -2037,8 +2117,8 @@ The
notch method is similar, but will only report self-spac method will only report space violations to other polygons. separation is a two-layer space check where space is checked against polygons of another layer.

-The options available are the same than for the width method. Like for the width -method, merged semantics applies. +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.

diff --git a/src/lay/lay/doc/images/drc_separation10.png b/src/lay/lay/doc/images/drc_separation10.png new file mode 100644 index 0000000000000000000000000000000000000000..041e66910282d562a5bbdcd144e7fd8fb1c164dc GIT binary patch literal 6276 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 W&$rxp(~+$PZ}(2G9ThIee)u2a`O;MY literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_separation11.png b/src/lay/lay/doc/images/drc_separation11.png new file mode 100644 index 0000000000000000000000000000000000000000..bfa3d688f99d3aba09fed4db84d80b7163afff7b GIT binary patch literal 6554 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�&SRVID24Jt}P{v@l|#DYP*6rg@yG?0I&(#T83G{@bvZ^4K6l+o7zfaiN37E-{-+R$fLLQE4QC!X6KY z!Cs@w>Zov1w$H;-1@#foQ#8}Mxq4K1+^%?Sjp)bgM=GjRHjoO;J!E`pqsc&@s*V9$ zPAlcvtx#+i`aKu;Q||i_;BA^m)`uIa~J>26`4O=H*k>O1(_Z zP8Q1zMhdn0^+M3Qn(rc!KQ;N+rPo8P=J!u-4)}P%~W+dKyMLv`N4n~6sL#)!Y1Vw0xs)CP0Qp8*1~u)ZDW ztg6!Fz)9Y<#se6R8#^;q4)&TOrbJBvH1Yzw zteV{f*rcC*^gK(I$BiSYc)3M`qD1CRI!jf2|=ldFG!B>k79HZ;;eY0$Q?*%fWUg=w)m7C6(a+P)kL%2Rj>^kF`DA1DZKN zX4D5k15d@|u)0Mpn-?Fnvp55AuRu$3Lu%35*KkEmHO;k6k# zg4+k=Uwr59p!InE0$`nd! z$aAi3X=_4=@680EJK(^bX{L?z#>qdLG@kgv6R$P)}b zVYnLnAO;r{f*4d=4;ap_OJ!UVQ4I8lPvS9chz`=P*CPT@4234Bq4?GY9Ws-sL?$Q7 z_ki$g&{5lrZ>_o~XaY@D&@=jiMf=lxJuY1RdfjX`(1{e=y5_j6EAJpox@ePdj1QTw zrvrwCyQ02*{yh$Mtn-cqQ)}3Ebc!$#1{<7lse?_0AG zvx;e{pe^YCMb7R{0U6C%^V)6(ciZTJiX}>A8G9T3%UtXh)X5yB1bzEd4{Sb3X=_m# zxQ{Y80@@bJzK{5NZMU{zjjRcNs<|5bWBcH#JKv-{(BL)PmL50BC^)usVe)s;D6wmG_QI5@tA{cK+UiLZZ$7@6Y^?dB+%9SZoT zd@6KSM~M;_9_170`67};@=^TM5k^X1)UmZk=Y2D_))Bqk7af0CpLZXnIk;|Q*8BBO zCd33XtmwjOsTTuc^X3TC5^j6Io%1Nf;@#xtUCx|7+2A0RN|i0jobr0%=Lm*lsL`XKdE+6 zrc>!9eD#yF-;RFinRZMMtR~{88F>jBH*HDv5Xiba6fOS$W;(saK&=bU}^-tYT7 z@B2LaBzSr3Qd_!aDFT5|L+^I+Mj+;m!@tkwLswk>zWWvQx8%p&zIX&;#S{29@5<&C zI`GAlt_M%<2nq=?L-=@l?F#9)hc2#zFM0)#Aw`GgDgRP0Bow>2C ziJhJ8#-Fx1?Lr`Q0?{tpe16Iud9^pH%eMS~p5+{J+JZaATjT3!!BXEZF58yyTZp&g zB1r(K;kIeeWxmJp&wUQegC-dbWH1>1y1f`Z^poS~43;G9HA8Pd>f@f0taT-AA@l$O zVY|J#le~MS*&4m~cfLq9FxY8m2#-e~E+x|>$P|~Pox7ni$~#Zt*Pzkx%?DeX$GrZd zv1iPPBvOEGZ)=$R%Hmk$Z@Hixh^0(`(iWpJ=g9Q)QR_LA(<@}hS)=i}X4lqMKajHP z1b}v-5l0;V6;NU0Z{^iaE=b-e24#_H`?$%VtVnAKxYm3-DSyO!SslJ^*!q5~QO71v3?MVDW<^Bpex>x>xnCy%aNCSsorP7Z1qVOYh3nrTu=p{JA7k zesy91fC^bisBh2jZ78jLhYGK96$gfqE)A;(1MhV1b7NmQu~|+eNf(KnU(b5Ca(J<` zLs;}cj6__lO9jk37%YA6T~ylP9&<%ZpJW8rC944XoT@-<^ZC-BT7f&_dFsRwZRT`E zmq@Hh+Q*SCT5HwA+(OEad|?|iiCk+HMg^;)P$7Krv@zLV_w^E~TyM|h;waDff=H%- z_+aQYF9%u|mnkU4S1-$RA~i=RdjK?8KGHge++eRYY4sHRZ<2!{tQEp>&RzI&JHG!gnBFGu8tWkkW;D!;P*5 z?hs$czQptn05LCznURM`w}&xb>euUuTG8Yd6#32;LfCR_okI3$l5^nbJsr*O0tA!fdzbtMuV@?MH9yZk8j_5uIJyvS}L;cF+ z#D<|~l!0P4Z=ZQGOHqF+eaujvx>pu^q}4sYPL| z{n+B(=`_j_{%PqAw)5W>u$MX-8%uy~ytP_O5Qy&&{}UR$wri?y9;^AKQsO*zB^qsb z#mC!~F&=jV<`CkHf!)o?Px152vVLRrI0KCWjTDHKO6n;Y?7dPs_Vs6W!HQ3f{TJMR zJ>RZj$N#^v@$JT4rsVDi!3up$Ooop)+VH!VZkSBC>YhOw(>n6+kWeCF&qBFv51Enk!|uFDHoo9 z2G6H_YbLyejZo$h2+dmGwM#!W@Bi7@9}A&k_A8l6rM4hRU`1qA+>k%&9J`KveWEYkWFGi$m7wwV_47nz~M#`04EEpX-yE6Rgp@som~SXS@*KR$u|)fZX7lZ zm-MeHHbqgUMx$&m24yw-_Xv99?LBZC>KXWKP!IITxJ9RaZBV@@n;63A;b_J!^oATK>M5;? zYu)DyIPK#OVA%laVzO3nHba2N)T&mKmYCVL9eT&{9y%U{AVs&{n{S$0A)nwU9saX8cO$rFxo z!}1z4p!0Q&=p>p>aiwJtg-P4!>Mk@-LF$o(9@q1sxTFw;Zd1gRnOzw9aI7_j_i+0I zJ+Cw6jzh5o&gXS?#tq}9$Jp-cfbPM}NKr19Yu#zTyzh>3Cp@4#T8qxbFZu!Q@Vvu% z?eJC}plPLQT_U>$Rxp>wZYMjseK`Bi#}-0~me5THqbvBzfHn%Ud|O0UEa!qb)CPr4 z@^xXwxc&OdS9Vwa-Q2#9=D`+05EaD_`;QBqAQ{+h+sUM5-#lg zNj{Ovoi@Y!p(pgcUD-~|6A&V%Go576F5aFt)HI8*ZZOZQtm24$&tG+`C)#Ec_pn-! znr3-WBC@fjK(}V(OdP*1ya(rWO*Zi;wb2;&Ydox)OpYFP2D&rG9bWAd?zqE-2ix#^ zoSR7OI8g5HKDqR-P@!10s%v|;(=@b(H}>mQYj_;d$h4k(=iu)x415lS$stgcOtmId znI|@V7Sgws^f(4nfZ9KcGQsLdtkp$QQFuLroDHs>Ma6(^UVz=z(-6G>1d4M*hhT8n zoRHi*0yxcV#^d^!aZ`YVZn21m`W&7&UgIF%*>!i4A-qMvVCFHVZBi({H=q)?UXu72 zg^?4Fh)05U7#Km^a<0@9m9g_6CO4mugcjU>yk!Ni$F519Oe%6yf%_xU|8rpM{^w+u z(BHG{i{g-+bQhCwNyla%qYS^I)1p6qT>V#R4Hg!C_NUrHzi{Fkm=N(;YKM_U!z}$f z*eIzX=pju5J{QFMwTQ;|(50RFg)vo72yd2p%D z)jhZAZsU(%L5w3!dt{^m2Q3L4ezTVRhy79M&SBm66qie@+=?eCZhOSdlvuK2dUBHb zKdFNygYSmnn)C==2fF{X#{>_N2ors$W+@1+$+qp z2t>XRWi#GmXF+oZZ|wI|l6WkpK8x;gy&NuV2X)@h?q+AvzT~_7ErO)bx6;sRG%^j? zAc#EtLL@yd2~#1NQ#)KNB{5n>!Iuz`*b*!0ewYTSmve|Y$`u$k`2`Cdzn_Z(R9v-z zWKz2TBIaZ5AF4~p_wP0LKs$|8qM)tuAb+n;HgO|v!2W9IQn;>}sixPbq~>M~pW8&> z@XD`oMcQkTCZ3@i4oWn@LmaHlkn0HnTfAE7<^pR=LTMVXwXq|C#Kq>0 z|B($qP1$&6^Hm)DY_Mq&ZQn^*;wfU2#@6P>djrjZeUC70L*)h{D;!vUXmlENPwrF>C|0Ku;p#YoiKZFZEE}5y_!Kx&~ zY|HZsg&V+gt*C12xlCVSs9>JdEy&v|+@Tffe~MlDcV&bhy%%DD~8f88f zF_jWwUI$Y%=3x?XH!E0TvQgT*+&oYO?hnpmT;&jc@2)voZLegv3iE5Q0vA@ePE2lp zqo0wFlF{$;Oy_Jq0TH3zB(UUW7!r6Zwc3Sn+A9Qg-eY_)$w~?ZX@iC2vI=MrQtu7) zD2XG8>(~a(@2dnwOMG_O@M9!gWqLOAP+wZK#k`EiimpT=FK9bF7j-42qErxdi=uxs zC?zZkm%w!UVKZFJl`LPMFq45iFJ9R!!9OlBD(UwD%4b4jqlOB+O|!8Cyp@ajYlv^7 zQy!VzHv~x(tSEj}F`Q#sNrl{H9LUx`Gq;!oEUQLIFeU#!nRe}{Y7a`3ryWg)pNMKCFrH-b}GEe?r)ORup3qwW1;8&ODOg&ZV+ zwHY!opFMsa!;%|~LRO>c=0y(%*zCqmvaGg-y_y|>-86yfElDcQb z_R}N5aNp~`#%YfqkY;dICu2DK9NGx?&pBm;h zttDve^FOVd`bwBvf7hK4>7E~V=oVS5o>f|H-H;RMTi?XA4q?65NUrY6CEPk8xyvT% z&8pWo8(}%STpzAuY$BS~;>1HOBw*Xd9f+zWtcTEG|3XVewrY?xAZ>)5irND` zhOJXI9HoB{P3RZx3~;XNe%a*Tun5!B>Zpi4Fou#&blFP7#rNglJ2UCnSV>_izj7@~ z@q(grz#F{ah6EfjNx&x8Pm-7C87j_khl0NG=#?; z>w0-R!-gP$pgnlXJ*pDFNu_xotDVYi_JX98C9q>E&qPIx97~|{4mg)bm5=zyW<&P2 zNa=TzwnCK+W`Iim!ZvWcX-O;G+>T2Ku~fnbqW1*4e+=u%yl}&$B0!~km57XOJMuOq z5_t)WfyUM-wZNaDrzCd4RhV{-vmR@`gf$b;ZWH^3(#3hf zCn?apT4$Aw?;ylJG|Th-eiI*ez~-KSJ<75bhckd<4 zYZ0hJ{(O9RWF(Y+HB#1B?GGSj^_ACtAT77cl1aG=x!$oRhFr#fq(zH~7^wMW^9_3<4KHz$N_WmW4Vf%A`eem|<*<9Y$WP_uYu)e;oJQstH=Dz(F z{w{(*e5HpQasJf7+kfNO(Ohg0ZZ4WB-)_3`Tfo#KALVYhrsRG%{i$F)+(&}W^5-`^ zy+xr=8X^(r8hinAX1|r@$+#-L4^K3Y!jZgY;M|&_F#8E8m9cBiFPJP=`02i0oRfaC zr>7^|8Q~`^y}7^-t-F9>U)YWR(lBa$)|cMR!IET~k4}nJ-+KCuVut*?4&qtT#b+AS z?i-8q7DP>`O|RC^_X@S2I?~RjC?+SLi4acD1|E7^zFpEvOZbPgPW1h%r_dg^-p#$2 z_>ViZ|GMrzbIgYSOKmT({LI2U0bc!vkD_y)UVP>DFTP(`ulwr`#uY;CqYHlqQLa}W z?-u>M!MsK7bxT@v$yn&y*umzr`2Xm;(!cs9b*A^D3J)E`qraGVp;dsLF?_O|iNIE^V&^Xp=zaw; zDr%)=mT5+&c!5$=Q-R70kqDI{ng}KcA_C|8P@9@Lopsh(>$leV1Htd|zWd$pv!DI! z{hr_H?xOeI;_tMywDjCuf8MR7HA@11zWoZg^7BL29^h;C@2xD33wJ2)spYqiC?wHto2F$cbW`e~iL&D!<0>&$J| z+S=NziQ4SwqNQcH!0qSFUQxv19{<+kOJ*Y0`116o=K z^lZb_#%>LZX1mRsmwzbbOvCM~CdO8#Yi4V1-;XDjtCLL*C7k*A;`Wr}MOV`P0o*>N z-DeItYce;;#Kg@t;ljrO3QRQbK3|4r zq9ebY$B&gQAGtx~T|euF;1qgu>K5uZFL34`Ou(v%#Ws1C9uN9X6)UQ&4L9s8=yxS!fH$K@;Mat_(W#Qw^FT!?&Q!`M{#G>e>>HpX_P}EEA z8lo@dXF5l~8f&eGie$CIq>92^_1O<7hAG1dRbI-xYG0)?25u3oOIyv z_<@*Z76ug_m-r#vrn8WJ;|`g4L&G<-WvVCJ#|aT`@#RQib4=$6|0a&_w)%3=;$BvsZ53vvFJ0CBTaA1@!JCiI74e^|D?X4fD+J6lF^WTJanETouOJp8BzM< zMG!7GeYTF;QIoj7iEiG#;EI;J!R4E3G{HptDW3{n1?{hPuusMvCV1pAJYv zlGHJ(!EFGjxQw_~=lreT`rgiJjFLA=&mM=@SGn}AGLB6-{1jH149V!c6HePDYJ~)z zl+4LDamiVy_}()aBPWLrmFF8K*6$)ryn-^sIFn~!%UI5eD_*w(fwyfo(MNZ>&a>LO)+({py(-?&L(JQcD9NR3bS{zFbzb z?aqsg!gliL(x_s3VY?}}&J?bSkFGwkqH|xtjbQ6mWk7E@MjM>5(B(25?M~Iq8 zHMaUnMs~TPpzTYn#f2DamuvDMU|$QHk3T@|=IcLPcAaHLVMEB^>M!>2@m}Cn#xq}| z?|@}4kIYj5Yd7GFjCn@ucA8Cv&XyZ}I3Ym-OtVQhMMj416QU!iW|%kVw+gmQgaM5@ zBSJaVu){e>!Eo{lFvNhEo5Tt2Wxz|zKe6N2-=r5TWzNSTYcPwYLjziZ;Rw4tcc_A^ zdLE}#od}s5Gt_<1zNOZ(j7G`MKe?Yug7G+)ClOqJpFg$zG`hucdhqM{SxQdTWSK3#F5_m+g!8IKL03#i)}r3Uhl1nFew^x3oX4)j9UyU zoqLxL=OEQ8RRAvW2&(Ewvit4IGnMHaF zoX6~sDK=!m>McWreyV0iQOc2tV7Qqv2@}k!ZCT09O6?({SoT!XZVS@XI zhQcPA3nxcR+vO2is-$(tIhA9>GNU}qir4Nhu&kc^JBd+WR% zaGljy7me~Aa~A>m%@L5*dCuEC!Q7DW@P)t$Dw$B4PHz#sp#do+Lk2Nfh3x9*kKwZG z-uTEa(Ze0&iqbMf;0pjm+qXxZ)$GTv;f)GEmrAi%GVMw7HM{wsM_GKzCWbP1%6+RB zdPQ%B(NwRCE&=9TXDeQACsEtbUUmm*xF3wIw!RLNG80L7YKy^b(4w>rvLY}o#S2i- zm!gHX+8e+vdC*Vaa!;691SP&1z`VZ2?q>c@QYYht>$j7wO9%+{v-bt!2tVE*?^gmN z;DovowrKiI zblZ8_hoi=~G<&jj;;3}cH8j8{`sd*btn zYP*f!ERk>UV;SIWQOr>nVRVL9yCq>O4U6j=j8LgmjBp&8jgFp_$V(Zps<81%+pr8z zX0D-O<3Y8)Xz|$CSV`+}yX??2F~rcOWUYH4sxCGgpKZ9&dBAPK-9?Xv<9znSs#P+E zLjCUkb*EU>e$~i_54&`fl>4p2W3qEU8z$@eyvYVwP!}Oc!zFv_B&PD~M^7Qc^AOY~ zbcbDi7U{eCE@E|@)A z=97TjRY;uG*S0@Q=x~cAI*|)MOkBT}Y)wzdDdbuvq)J!I8Z*m)$fj{j7J7k9xDpn5 zM~r6*d~9LNuRF`YsJk^mEL$#p=Fl;0^DL9R_V(zR;~|1`xMXoc>PC=_c^eD3q89?% z6ulb=8fjNKCU}R(BD;?WX{)rSA%716@nre2uMB(UYjST{j zzuzkR0Rz`!uxZNbWGMg|o5RvLd$5LuLX>QfX||{2<^A-aETs{D z(7DkKa7pjK@btt6zemtd1Edh+AJQ@477sfX#r*A?0Fhk|oy!fB`id-8BS7XTnASaDl zOT~OfUaVTeaI!8vlIu~3JMLk>3<~Y7II2GJ&K!?U54L+(D9}|b;~T6xwo_Ppzx9|a zm7CAXp2|-rco$dzZ+p_UkO(0ob^QBwzyte#lVXX5fOoE}N8!$$|BtamW#HnDH@VT< z(3{cbAopLM2JuOwRUp*8(;sMNZ%2`=w~{eWW@6`IgU0cnPJ54>1ggkg2*Gj?#^mNq zau+-LaRR`38UP8emU)633gYUb!9FS3@&IxDV-4vo0^%0fPo{V(k`lpjtPW>%C*!Gw zd_-vh05H>wm4`M008E3ON?$FLhE6Z{Qkh0QeFk8hW+8yxfR1LBA^}8Ta=YFp;BJEf z41^TUDyS7M`#K@@o7J+!t7QwNo9Qt3*KagP{0vFDcY?q)yPrHWGl+E4q>pn0dI=W9 zAC&3#7C34IQ@#MXZ<@5iXj5in+Y!qkXpSfgkPQF@@ojPRS92AIjn=s@zQ(pc)EEE+ zF2g4DG*Wa{!&OE!&YUUA`IM)oBfavuKxX3sUFU8Z+Fy08MSF%aT|nykyPq}6!z#Ej z9mw(#_U?curdN~@VISo3iNhbHP4Q%Ib}hifx-(RDZ3T6!nf>QN4bd@B@^MPP37 z&5~)^*2HA`D8-D2&C29kGQhyV;GPKJbWl zp9+u!30qL_U;n9kTMr7b#$?UXXVeRz>9*vEP*htFiTyE8;qXumD`b4>4|*gG%xj4r21O~6W`Q$#rb?7wsP=VL@_!&h5vDyLJcEVFkgU62eyBN-hMu^pi z;wjZMa0V%Ih0rK{F)q}0Z5~Hg!6r!TX;T8J#Eu0McdWaKFD;nT{?m%J@t0LJ)mI8O zYFZutVG0>*7nJUZFQK;&UI2s}aQlaeoRz*Pu12^4Ru&F-v1ZhCFby{)+*W2Q*OcVz z^FBJwBea~Am-EeEs)jA~SVVwo&>N6SQ(d%G}d^kJLUpOb9CdPK~_on5k~$-?w{# z>2SHl28BoB{Xca!#Hx%4irk$3HL|tqA1y&%X*W~4cc)<$i^HVzS-^fw<-{XpET;eb z;Yo*?DsJs<_kRJ9ue}3Cx@ao#-0++n02Y)QG^w->Q2Ag%C!|rjlG*?#OfI(Q{-nt; znBh~{E>|dknr7Q_kG#Iu9r@MqdhnVs$t1IS51UVUH;XJ0NW%RU7)b?%LM^Rzs0r&} zGOLZ?>g{!tns&qm)$A;2)q)RYSi~Orz2v*ZM|o;R^&*!*VKkQY{j)~%)`z9FJ;`BZ zjGXv2vc~ckg6?BGNp$zSfZ7Hma|=M4Cxx=<0%pcp*0uhmQtVH|sRo|{3@i&-I&Oe8 zb>Wn;Dr{0;YV`QK$7XjKgdQTkFnaCn<3R1unJvs@Ma=S|`n>$Jaz=K=h}h8;-9U{8 z50z$PpFZ>!jR|&D)ccvYt{3iLu)<1ly8bzZ?elq@O6y}%N1y~dtf`QWpS+0R3Lp0T zS-Jp~_-|E<@y!zo-7ukyk`Jv~f3(gHi(t0TYh7m;eGw&njV}kP>66#k*n@e1>eAu7 zD&L#bqbKip&?c~!c;+8+{2jOTsn|%My=X!t#q5=6=kDB(J>&JeJEIH0^ z`n+Ubun++)4&+C3qKVJ84J; zJ49fcW%aQKL5GD%U^T#V~>ecp2T1TPdt zzP{t0T~{VPShsawGArWz*y-}5v4k(kKUZG043a7k$CV^& ze|BOv)$|)J2~ah?5tk0-F(Eo5chtbC%_aZz2%s11602pyE(OMNGt|E4SI9;!Sg~Lw z*}UK=Q(&y~+0oq830q%|1G)pz#TF@Nz4^VzqII(Gj6Y6WbfZc4PJSZ()flrWHa2z$ zb85kFs5ge_lbg|De?O%w@YS~h7MN@vGW_G;+xPb__qk99n7jEcxu*za9%9H;T%>KPPWpd%J%Urmdy*1nExv!eJj^ z!M{Id)X`AO7mg;hu3__o6>l?O7>n4xT#OrdWb#X`B(6vWd0E){OnX7U=8VGa7x$k_ IwjB85pMP)dR{#J2 literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_separation5.png b/src/lay/lay/doc/images/drc_separation5.png new file mode 100644 index 0000000000000000000000000000000000000000..7087dfe6043ec9aecca2651fcbb935d9fcf1e8ec GIT binary patch literal 5998 zcmc&&dt8#|+sCz4Hq))vmU+rmn&nV2LsYc1<*B67N(;4vhc!(SBm+h2^|Y3ydB8l+ zecJ4g?eqTLKlnTk_x;@WeI35v>$z2c{ovR73@F&Of- zdx)KHV4w-e4ROpqkY@o5ZdVMR@VyuU+Wi#-Y-Vh32t169A(rOgeK3fjIT!{rH@J2X zZVv)|&T%|+(Cu30SnpYUzr*LzFYE|#<1n9Sds0h_^at?ws>X+hDz}^w7<}b0t9!^@ zm7aDIH~=*Iy0NkGwX%Hki7)SedSX-Jag$xT>RVia7sp+Sc~G4u`nAl?$!DLflPzRV z!OorcFDPD$KU|!>XV>4&)|mQoo&$m=O29 zfik`59`NF{M`>~8U_ymh=Wh?KGa(R(sH{hou|{*(g?7pL9QklOO6~kX7{ktpWHo2i zGI<=w-RRN3V?Lk(!Eq@ofU2lX&Q}{+oV@(xKATpAb7n`hU!9?Qo>7Q0+9GoND$hTO zf4TCAvW6tWOW4K9{YKVjBZXbo`mGL&fM>Z>X&?&QrAL`nP$Ct#An~WjZw>{LW0|^nwggX%o&qtu3FExnklzE9J>PnY_vv zJI+RQ=h(ct#gyRL<=r}0W%F@oscJ^-zSEmIOlbBvU9!-C*ke?C12cv~joQ$xKWdy} zy;j<>5OOZ@O5LQ>b7a;7s+vGYr43>SzvMMGU^sC|Spu_!FnJMmPvm|6yjVuF&1G*+ zHy2XRG|#AUCr>SyG45C}W@EyAmfe)-Gzgt&?8{H}jhH`cBc0Y)x|r(gg<~5CpVx4b zUVD?~h8d^5Ml}TcnN@PUz>r~0TYKd|*cs9sUGL*YREvi*alsF#ldbcJIlXCIhc6E7 zBRntSdt%bVP-U@O7W@U*UrPgL1@R+l$I`FW zbaZ)8-*3;*<6_5jX~uiJm$CpbFn@mgYHn?%8)y!D8}R zS~Z(G#MSvZ&i^AlFSUwv&qDy`9%W`ek*@;6bD4g=d@(~GN{wKep-$vGrIZvEvL7k9 z3j#SLR(${W_ymChxBKIE=N&q{BX5Nc3SJ~SEiSwc&K<89p0rFLxQfJ=U+_s8+KnXkjxBR#L6;kM-J;3F1 z(Ug|SW1E+Z9G=5GtG^)l?32w9@N!^(w8rM>xBwMDzkkgm6o-##S_nd~yVq)*uh$~f z3%%ZjEPU0<4^6U^B#0PpOS+e9T9#M9eb8#^smti;yz#{swWm9^A(S;!Z>Jxes(hnb z_l;WNtD}R#ij^y{O2lLWpTx#FFSB6ux}ZnNf@cwWU6s;U%6^-Om2fyy&0PQ5(r{D~g|SD*LGUZfUvqy4esvr5 z(?5Bm46|-1;m>Aipsz5N4s%gU>#_Um`HjJEEI_9wrBW)^RuD3&-c7$>e`Ae(UsIOdV^pxAZmeG_!&mU31(Zov0UZZ~(?Z)~KYb_S3`FgT+cG)) zWU%d}Ap;cB!~^t90u;_X<{9-)ribNjxELLd&pPINiR25i@IeELn9Y3sPVh@M3*EYx z*B;QCmG41P8cLu8eg|--3d?=E{+;Uq+ICCBhPf$=+~%dT?}k;C$#tfZ<%Tg5NBsXTE3w$eL3#@fcF@h5qX4N;~-thULUx6VPt z7op*73FV3tZl6Pka$T*p{2LC+J0~q z;pP|9!Ux@B)jfh?5!pIPg1<^F41#!(SbVni3uoqzFrCzq zDM`>eE*VCv|0%{={K_Cl-W^O&vyZzKe5o=%-m`hCI53+I=YJcOnfSokFX89z9JwEo zeJ%5GF>U11S`#qiG6(pkh1^2MrypD!CdUzf<)~ahk~(Vx^kzPqep)zA&^7^!f^v?h za>-i)#+`?;Yt`eV3q&t4O!Qqa<@;@^vGZF~q3#&eKyrvxq{?A}%qZ3QZE$}|aN4Z- z$HSM94dlUE{by`f=p2qF#IgsrrW$lVJCF9JvuE5`6y`I+;RfG^F}Mk(JU1Txgf`b( zZTOh*bR+Zh?fBM#sFD8pdk5E|h_Z}e*zEKx?nUBxB&oZ0i@w`g*sjQIK&3EIleAhB z0}rLB*DIFVxfC51U=h7SreqBlA{47*Vc@eS6r+5Wy3Zp4uD-gZmH;EfG4x7-F|N9g z@rX!1F>%)_erxK@_=<$=24BN~@rRj-VSvo~5wh4|dZztVI2Z_C2Hke<7|w0L{!&jA zv{O=@Ea>s?Wp7TBY@6?Nm1J;kGd6V>cK;UMG24mMoB3thBvNI6rhS7?ZC;^5wkiS* zpus7GY13OOt}g<4hm!rQXUW>Si~4j3v*#PECiyS2@jp!?xswmTjRSC(qQMcs=%bH@L=GpAqsWIoFOUT#$Xm4iO%&UiOENo5NGfghUHw=1Yd~cT|`weIMY9uw@89Ps?iVW_` z+*}ecbP>-HHPuft+nK+35@qD#TJ;*~9I9d9Ez31NUK$8w6Zy|R9}X!g5sK#eI#7E9%V~0L*@BossU>Mvs2u%H zJ+uOVeuvt}C1D}+v$NHnJ(NF(C?(p)38v31P3;JE`ehkMcSI2I;tfYC!pEeV4nL{C zCVAq>&Q^T? zL!P@Wn3Od@E=ypYa6DZc48-sQu?w5pzg#ZdigzAr(g3PDOtL$v&)wFVO7eA2_f@~H zng(R!#jw4(=Et;b{R^ zf{-TVj+Hd9@@3|+=*PgxE=A;h3dpliUUoyerG2nP)`;LiZLLduDTN?rVFiK*z2qtJc}9)V_rpiV zH5tRaD5zq<@V^J(#vdVl0hm%n(Y#g}Vh|`~OY0?Ia z<5KjW-5kDX*e~dEEfOWMDZJ_r%f(w{Ra*GzR9gPX^zn${z7Yn`KfLTOo}iZ2^V)K; z#ondTV7S&+gA2 zA^DnSV+0k!`7J$d;&JKE%c3GLo73Xy;q-1(tSMMS zn-M#ztE;Za(P&~NCW&(~eI{yz#cDWhcczRENNCqBv}j2Y^x&F!Z7&q^w2UUxv+fU% zT8+R>E!XI~EgJeI2MehZTUPwB8JtR?<6a5G(GhkXwCxRFF(8`9iH*WCOyPMn{|6+$ zw&&`mg^tqEo`^YK0ZT|3JX+!=ou93;HcAyNgoRZ}aJXu0XM}u~C4oYvQ?sINew~t% z(-E%2;sVi}1U*+nh|1BHbBAfWaCOo>70scZs=SHv&mPvwYKLeWVD6%Oy%S-2z_Gm% ztS;gOvls{kvo9;lp6c)Ce-6!epMT~uNJ`7v3*<@Q){vPv5*k6gSWpX(oELLjzVuO3 zrthZJe|WzqySwMNnR_EbTC5H8nk}|l(4*D1j%@h+Af=5!8QW=0!63uDW7Y5d;kIpB zEkaj6-XJuE9g#U~yW+RN>b8hygkkRsXXftp>V_*sb53Q^d&t|K*YVmOPvNzAbuDcv z@4*&T&{Ozvmz^!7S^4DFeE4HZ$6N;mQ4|zrmbYVGfq^oqb|DA2O#*j3*iWj1p{AB< z9vE-nmgPdHst(RH2uvqMa@R|(Y4An;0>+J-jp;$Mup_r*o7(3aNAL8TdH{T0G)>3W zG64QA<)UY4S!eY^?-bGI2+srj8XCzlxLP%0csLTA>Y@GZk4x2X3L;Q8lp`tbli-<6@zo|n$cbSF5k?4fxNTA;P^+tBtLQeEM_rIl1&%Y=!-``$R zE%&IT{T@5ricjS487YRADhlFrjp)zuw*Sq()c;S3xfV@|T~*EZ*arkk!7DoXq@ss1#_7X=#u`fZ`^NJy(n~yo-RQUL7hE)B;Nwf zM;Wy@sOJ639e#IY*fJVhj;7q>DB;iTUnd^=LEkM^?=MZ;-pS9`0Q8`vUxWVwn{V$V zI?8#dHjTT_Y5t&{Lp+O_1cQ!H%kA}j5q4YNu26kxp5$ycr@_i1nQsxE_< Unpe62t<8 literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_separation6.png b/src/lay/lay/doc/images/drc_separation6.png new file mode 100644 index 0000000000000000000000000000000000000000..dfa38c47567c4383fc40450ab127cd4f4420ce39 GIT binary patch literal 6218 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 DUY(pE literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_separation7.png b/src/lay/lay/doc/images/drc_separation7.png new file mode 100644 index 0000000000000000000000000000000000000000..95006d6af7b3f2d540c7e74b9c6a43e48160317f GIT binary patch literal 6082 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 a8p$CaBYyH}NCB(^Iq&w^RpoH#hkpZnuMT(s literal 0 HcmV?d00001 diff --git a/src/lay/lay/doc/images/drc_separation9.png b/src/lay/lay/doc/images/drc_separation9.png new file mode 100644 index 0000000000000000000000000000000000000000..a6da75eaa0841c82eb077702a0157c8d04855198 GIT binary patch literal 6188 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 Zne>G}Y~7MdfNQz!vuWGLyBi{Y`WKaVu`vJu literal 0 HcmV?d00001 diff --git a/src/lay/lay/layDRCLVSHelpResources.qrc b/src/lay/lay/layDRCLVSHelpResources.qrc index 41787d419..402d5d600 100644 --- a/src/lay/lay/layDRCLVSHelpResources.qrc +++ b/src/lay/lay/layDRCLVSHelpResources.qrc @@ -8,6 +8,16 @@ doc/images/drc_space2.png doc/images/drc_space3.png doc/images/drc_separation1.png + doc/images/drc_separation2.png + doc/images/drc_separation3.png + doc/images/drc_separation4.png + doc/images/drc_separation5.png + doc/images/drc_separation6.png + doc/images/drc_separation7.png + doc/images/drc_separation8.png + doc/images/drc_separation9.png + doc/images/drc_separation10.png + doc/images/drc_separation11.png doc/images/drc_raw1.png doc/images/drc_raw2.png doc/images/drc_raw3.png