← Back to team overview

kicad-developers team mailing list archive

DRC rules


I’ve just merged a possible implementation of the DRC rules.  I’d like to get some feedback on it, and also some testing.  (Because the rules support such a wide range of possibilities it’s going to need a good deal of testing.)

For now, it picks up DRC rules from a file named “drc-rules” in the project directory.

There’s no GUI editor at present: use a text editor.

Grammar is s-expr.  It generally follows the ideas set down here:

https://docs.google.com/document/d/1qvCH9aHwCzp5qtKTna4jJXuloNU0b96gAxAHSKPuXpU <https://docs.google.com/document/d/1qvCH9aHwCzp5qtKTna4jJXuloNU0b96gAxAHSKPuXpU>

with one major exception: I found the select-a-single-rule didn’t pan out.  You have to duplicate too much stuff in each rule for that.

Also, because the DRC engine (and zone filler) don’t currently support min/opt/max the prototype implements min with Seth’s “relaxed” option.

Top level is a list; first expression must be (version x) followed by any number of (selector…) and (rule…) expressions.
 * Match tokens:
 *     match_netclass
 *     match_type
 *     match_layer
 *     match_all
 *     match_area  (not yet implemented with the exception of “$board”, which matches everything)
 *     (selector (match_area "$board") (rule "OSHParkClass3") (priority 100))
 *     (selector (match_netclass "HV") (rule "HV_internal"))
 *     (selector (match_netclass "HV") (match_layer "F_Cu") (rule "HV_external"))
 *     (selector (match_netclass "HV") (match_layer "B_Cu") (rule "HV_external"))
 *     (selector (match_netclass "HV") (match_netclass "HV") (rule "HV2HV"))
 *     (selector (match_netclass "HV") (match_netclass "HV") (match_layer "F_Cu") (rule "HV2HV_external"))
 *     (selector (match_netclass "HV") (match_netclass "HV") (match_layer "B_Cu") (rule "HV2HV_external"))
 *   TODO: pads for connector pins or wire pads have even larger required creepage clearances.  How to encode?
 *   User attributes on parent footprint?
 *     (selector (match_netclass "HV") (match_type "pad") (match_netclass "HV") (match_type "pad") (rule "pad2PadHV"))
 *     (selector (match_netclass "signal") (match_area "BGA") (rule "neckdown"))
 * Type tokens:
 *     track
 *     via
 *     micro_via
 *     blind_via
 *     pad
 *     zone
 *     text
 *     graphic
 *     board_edge
 *     hole
 *     npth
 *     pth
 * Rule tokens:
 *     allow  (not yet implemented)
 *     clearance
 *     annulus_width
 *     track_width
 *     hole
 * Rule modifiers:
 *     relaxed
 *     (rule "HV" (clearance 200) (priority 200))
 *     (rule "HV_external" (clearance 400) (priority 200))
 *     (rule "HV2HV" (clearance 200) (priority 200))
 *     (rule "HV2HV_external" (clearance 500) (priority 200))
 *     (rule "pad2padHV" (clearance 500) (priority 200))
 *     (rule "signal" (clearance 20))                       // implied priority of 1
 *     (rule "neckdown" (clearance relaxed 15) (priority 2))
 *     (rule "allowMicrovias" (allow microvia))

Follow ups