2020-10-06 18:09:24 +00:00
### Top-level Clauses
2020-10-04 11:25:59 +00:00
(version < number > )
(rule < rule_name > < rule_clause > ...)
2021-08-08 13:37:14 +00:00
< br >
2021-03-20 20:09:57 +00:00
2020-10-06 18:09:24 +00:00
### Rule Clauses
2020-10-04 11:25:59 +00:00
(constraint < constraint_type > ...)
(condition "< expression > ")
(layer "< layer_name > ")
2021-09-05 15:06:12 +00:00
(severity < severity_name > )
2020-10-04 11:25:59 +00:00
2021-08-08 13:37:14 +00:00
< br >
2021-03-20 20:09:57 +00:00
2020-10-06 18:09:24 +00:00
### Constraint Types
2020-10-04 11:25:59 +00:00
2021-08-13 15:18:56 +00:00
* annular\_width
2020-10-04 11:25:59 +00:00
* clearance
2020-10-11 10:51:23 +00:00
* courtyard_clearance
2020-10-20 19:44:20 +00:00
* diff\_pair\_gap
* diff\_pair\_uncoupled
2020-10-04 11:25:59 +00:00
* disallow
2021-08-13 15:18:56 +00:00
* edge\_clearance
2020-10-11 10:51:23 +00:00
* length
2021-08-13 15:18:56 +00:00
* hole\_clearance
* hole\_size
2021-08-13 19:10:30 +00:00
* mechanical\_clearance
* mechanical\_hole\_clearance
2021-08-09 10:10:09 +00:00
* min\_resolved\_spokes
2021-08-13 15:18:56 +00:00
* silk\_clearance
2020-10-11 10:51:23 +00:00
* skew
2021-07-11 15:12:28 +00:00
* text\_height
* text\_thickness
2021-08-08 13:37:14 +00:00
* thermal\_relief\_gap
* thermal\_spoke\_width
2021-08-13 15:18:56 +00:00
* track\_width
* via\_count
2021-08-26 23:43:11 +00:00
* via\_diameter
2021-08-08 13:37:14 +00:00
* zone\_connection
2020-10-04 11:25:59 +00:00
2021-08-13 19:10:30 +00:00
Note: `clearance` and `hole_clearance` rules are not run against items of the same net; `mechanical_clearance` and `mechanical_hole_clearance` rules are.
2021-08-08 13:37:14 +00:00
< br >
2021-03-20 20:09:57 +00:00
2020-10-06 18:09:24 +00:00
### Item Types
2020-10-04 11:25:59 +00:00
2021-08-08 13:37:14 +00:00
* buried\_via
2020-10-04 11:25:59 +00:00
* graphic
* hole
2021-08-08 13:37:14 +00:00
* micro\_via
2020-10-04 11:25:59 +00:00
* pad
* text
* track
* via
* zone
2021-03-20 20:09:57 +00:00
< br >
2020-10-04 11:25:59 +00:00
2021-08-08 13:37:14 +00:00
### Zone Connections
* solid
* thermal\_reliefs
* none
< br >
2021-09-05 15:06:12 +00:00
### Severity Names
* warning
* error
* exclusion
* ignore
< br >
2020-10-06 18:09:24 +00:00
### Examples
2020-10-04 11:25:59 +00:00
2021-04-15 08:51:56 +00:00
(version 1)
2020-10-04 11:25:59 +00:00
(rule HV
(constraint clearance (min 1.5mm))
(condition "A.NetClass == 'HV'"))
(rule HV
(layer outer)
(constraint clearance (min 1.5mm))
(condition "A.NetClass == 'HV'"))
(rule HV_HV
# wider clearance between HV tracks
(constraint clearance (min "1.5mm + 2.0mm"))
(condition "A.NetClass == 'HV' & & B.NetClass == 'HV'"))
(rule HV_unshielded
(constraint clearance (min 2mm))
2021-02-27 19:20:48 +00:00
(condition "A.NetClass == 'HV' & & !A.insideArea('Shield*')"))
2021-08-08 13:37:14 +00:00
(rule heavy_thermals
(constraint thermal_spoke_width (min 0.5mm))
2021-12-23 22:35:24 +00:00
(condition "A.NetClass == 'HV'"))
2021-03-20 20:09:57 +00:00
< br > < br >
2020-10-13 09:17:33 +00:00
2020-10-06 18:09:24 +00:00
### Notes
2020-10-04 11:25:59 +00:00
2021-04-15 08:51:56 +00:00
Version clause must be the first clause. It indicates the syntax version of the file so that
future rules parsers can perform automatic updates. It should be
set to "1".
2020-10-04 11:25:59 +00:00
Rules should be ordered by specificity. Later rules take
precedence over earlier rules; once a matching rule is found
no further rules will be checked.
Use Ctrl+/ to comment or uncomment line(s).
2021-03-20 20:09:57 +00:00
< br > < br > < br >
2020-10-04 11:25:59 +00:00
2020-10-06 18:09:24 +00:00
### Expression functions
2020-10-04 11:25:59 +00:00
2020-10-06 18:09:24 +00:00
All function parameters support simple wildcards (`*` and `?` ).
2021-03-20 20:09:57 +00:00
< br > < br >
2020-10-04 11:25:59 +00:00
A.insideCourtyard('< footprint_refdes > ')
2021-03-20 20:09:57 +00:00
True if any part of `A` lies within the given footprint's principal courtyard.
< br > < br >
A.insideFrontCourtyard('< footprint_refdes > ')
True if any part of `A` lies within the given footprint's front courtyard.
< br > < br >
A.insideBackCourtyard('< footprint_refdes > ')
True if any part of `A` lies within the given footprint's back courtyard.
< br > < br >
2020-10-04 11:25:59 +00:00
A.insideArea('< zone_name > ')
2021-02-27 19:20:48 +00:00
True if any part of `A` lies within the given zone's outline.
2021-03-20 20:09:57 +00:00
< br > < br >
2020-10-04 11:25:59 +00:00
A.isPlated()
2021-02-27 19:20:48 +00:00
True if `A` has a hole which is plated.
2021-03-20 20:09:57 +00:00
< br > < br >
2021-02-28 00:54:55 +00:00
A.inDiffPair('< net_name > ')
True if `A` has net that is part of the specified differential pair.
`<net_name>` is the base name of the differential pair. For example, `inDiffPair('CLK')`
2021-03-20 23:03:34 +00:00
matches items in the `CLK_P` and `CLK_N` nets.
< br > < br >
2021-03-25 00:34:57 +00:00
AB.isCoupledDiffPair()
2021-03-20 23:03:34 +00:00
True if `A` and `B` are members of the same diff pair.
< br > < br >
2021-02-28 00:54:55 +00:00
2020-10-04 11:25:59 +00:00
A.memberOf('< group_name > ')
2021-02-27 19:20:48 +00:00
True if `A` is a member of the given group. Includes nested membership.
2021-03-20 20:09:57 +00:00
< br > < br >
2020-10-04 11:25:59 +00:00
2021-02-27 19:20:48 +00:00
A.existsOnLayer('< layer_name > ')
2020-10-06 18:09:24 +00:00
True if `A` exists on the given layer. The layer name can be
2020-10-04 11:25:59 +00:00
either the name assigned in Board Setup > Board Editor Layers or
2020-10-06 18:09:24 +00:00
the canonical name (ie: `F.Cu` ).
2020-10-04 11:25:59 +00:00
NB: this returns true if `A` is on the given layer, independently
of whether or not the rule is being evaluated for that layer.
For the latter use a `(layer "layer_name")` clause in the rule.
2021-03-20 20:09:57 +00:00
< br > < br > < br >
2021-02-27 19:20:48 +00:00
### More Examples
(rule "copper keepout"
(constraint disallow track via zone)
(condition "A.insideArea('zone3')"))
(rule "BGA neckdown"
(constraint track_width (min 0.2mm) (opt 0.25mm))
(constraint clearance (min 0.05mm) (opt 0.08mm))
(condition "A.insideCourtyard('U3')"))
# prevent silk over tented vias
(rule silk_over_via
(constraint silk_clearance (min 0.2mm))
(condition "A.Type == '*Text' & & B.Type == 'Via'"))
(rule "Distance between Vias of Different Nets"
(constraint hole_to_hole (min 0.254mm))
2021-09-22 21:20:18 +00:00
(condition "A.Type == 'Via' & & B.Type == 'Via' & & A.Net != B.Net"))
2021-02-27 19:20:48 +00:00
(rule "Clearance between Pads of Different Nets"
(constraint clearance (min 3.0mm))
2021-09-22 21:20:18 +00:00
(condition "A.Type == 'Pad' & & B.Type == 'Pad' & & A.Net != B.Net"))
2021-02-27 19:20:48 +00:00
(rule "Via Hole to Track Clearance"
(constraint hole_clearance (min 0.254mm))
2021-09-22 21:20:18 +00:00
(condition "A.Type == 'Via' & & B.Type == 'Track'"))
2021-02-27 19:20:48 +00:00
(rule "Pad to Track Clearance"
(constraint clearance (min 0.2mm))
2021-09-22 21:20:18 +00:00
(condition "A.Type == 'Pad' & & B.Type == 'Track'"))
2021-02-27 19:20:48 +00:00
(rule "clearance-to-1mm-cutout"
(constraint clearance (min 0.8mm))
2021-09-22 21:20:18 +00:00
(condition "A.Layer == 'Edge.Cuts' & & A.Thickness == 1.0mm"))
2021-02-27 19:20:48 +00:00
(rule "Max Drill Hole Size Mechanical"
2021-08-13 15:18:56 +00:00
(constraint hole_size (max 6.3mm))
2021-02-27 19:20:48 +00:00
(condition "A.Pad_Type == 'NPTH, mechanical'"))
(rule "Max Drill Hole Size PTH"
2021-08-13 15:18:56 +00:00
(constraint hole_size (max 6.35mm))
2021-02-27 19:20:48 +00:00
(condition "A.Pad_Type == 'Through-hole'"))
2021-02-27 19:44:06 +00:00
2021-03-25 00:34:57 +00:00
# Specify an optimal gap for a particular diff-pair
(rule "dp clock gap"
(constraint diff_pair_gap (opt "0.8mm"))
(condition "A.inDiffPair('CLK') & & AB.isCoupledDiffPair()"))
2021-02-27 19:44:06 +00:00
# Specify a larger clearance around any diff-pair
(rule "dp clearance"
(constraint clearance (min "1.5mm"))
2021-03-25 00:34:57 +00:00
(condition "A.inDiffPair('*') & & !AB.isCoupledDiffPair()"))
2021-08-08 13:37:14 +00:00
# Don't use thermal reliefs on heatsink pads
(rule heat_sink_pad
(constraint zone_connection solid)
2021-08-09 10:10:09 +00:00
(condition "A.Fabrication_Property == 'Heatsink pad'"))
# Require all four thermal relief spokes to connect to parent zone
(rule fully_spoked_pads
2021-08-13 19:10:30 +00:00
(constraint min_resolved_spokes 4))
2022-01-09 11:09:18 +00:00
# Set thermal relief gap & spoke width for all zones
(rule defined_relief
(constraint thermal_relief_gap (min 10mil))
(constraint thermal_spoke_width (min 12mil)))
# Override thermal relief gap & spoke width for GND and PWR zones
(rule defined_relief_pwr
(constraint thermal_relief_gap (min 10mil))
(constraint thermal_spoke_width (min 12mil))
(condition "A.Name == 'zone_GND' || A.Name == 'zone_PWR'"))
2021-08-13 19:10:30 +00:00
# Prevent solder wicking from SMD pads
(rule holes_in_pads
(constraint mechanical_hole_clearance (min 0.2mm))
2021-09-22 21:20:18 +00:00
(condition "B.Pad_Type == 'SMD'"))
# Disallow solder mask margin overrides
(rule "disallow solder mask margin overrides"
(constraint assertion "A.Soldermask_Margin_Override == 0mm")
(condition "A.Type == 'Pad'"))