155 lines
7.1 KiB
Plaintext
155 lines
7.1 KiB
Plaintext
(version 1)
|
|
|
|
# SP1 edge-connector (J3): the gold fingers must reach the board edge to make
|
|
# contact in the GameCube slot, so copper-to-edge clearance is intentionally
|
|
# relaxed for this footprint only. This is by design, not a defect.
|
|
# Test BOTH items because the violated pair is (Edge.Cuts segment of J3) vs (pad
|
|
# of J3) - the edge segment is item A, the pad is item B.
|
|
(rule "SP1 gold fingers - allow copper to board edge"
|
|
(condition "A.memberOfFootprint('J3') || B.memberOfFootprint('J3')")
|
|
(constraint edge_clearance (min -0.5mm)))
|
|
|
|
# Power-integrity: flag any power-rail track narrower than its netclass width.
|
|
# A netclass "track width" is only the DEFAULT for new routing - KiCad does NOT
|
|
# enforce it - so without these rules an under-width power trace passes DRC
|
|
# silently. These make DRC surface every thin power segment so they don't have to
|
|
# be found by eye. Severity is "warning" (not error) so an unavoidable neck into a
|
|
# fine-pitch pin is flagged for review but never blocks fab export.
|
|
(rule "Power rail minimum width (0.3mm)"
|
|
(severity warning)
|
|
(condition "A.NetClass == 'Power'")
|
|
(constraint track_width (min 0.3mm)))
|
|
|
|
(rule "Low-current power rail minimum width (0.25mm)"
|
|
(severity warning)
|
|
(condition "A.NetClass == 'PowerLV'")
|
|
(constraint track_width (min 0.25mm)))
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# JLCPCB manufacturing capability floor (standard multi-layer tier), pulled
|
|
# from jlcpcb.com/capabilities/pcb-capabilities. These are "the board cannot
|
|
# physically be made this way" limits, not house-style margins - severity is
|
|
# "error" because violating one means a rejected/reworked fab order, not just
|
|
# a style nit. They sit BELOW the netclass defaults above (0.2-0.3mm), so on
|
|
# a board routed to house style they should never fire; they exist as a
|
|
# backstop for hand-tweaked geometry (e.g. necking into a fine-pitch pin)
|
|
# that dips below what JLCPCB can actually etch/drill.
|
|
#
|
|
# NOT covered here (no DRC constraint type exists for these - check manually
|
|
# before ordering):
|
|
# - Board thickness: JLCPCB stocks 0.6/0.8/1.0/1.2/1.6/2.0mm. This board's
|
|
# stackup sums to 1.1412mm, which is NOT one of those - confirm with
|
|
# JLCPCB's stackup tool (their impedance-controlled 4-layer config can
|
|
# produce non-stock totals like this deliberately) before ordering.
|
|
# - Solder mask minimum bridge/dam width (0.10mm standard, 0.13mm black/
|
|
# white): no matching KiCad custom-rule constraint type as of this
|
|
# version.
|
|
# - NPTH minimum hole size (0.50mm): skipped - no confirmed condition
|
|
# syntax to select NPTH-only pads without risking a rule that silently
|
|
# never matches; the general hole_size floor below still catches any
|
|
# NPTH hole below the PTH/via floor, just not the tighter 0.50mm NPTH-
|
|
# specific one.
|
|
|
|
(rule "JLCPCB min copper trace width (0.09mm)"
|
|
(severity error)
|
|
(constraint track_width (min 0.09mm)))
|
|
|
|
(rule "JLCPCB min copper clearance (0.09mm)"
|
|
(severity error)
|
|
(constraint clearance (min 0.09mm)))
|
|
|
|
(rule "JLCPCB min via/PTH drill (0.15mm)"
|
|
(severity error)
|
|
(constraint hole_size (min 0.15mm)))
|
|
|
|
(rule "JLCPCB min via pad diameter (0.25mm)"
|
|
(severity error)
|
|
(constraint via_diameter (min 0.25mm)))
|
|
|
|
(rule "JLCPCB min hole-to-hole spacing (0.2mm)"
|
|
(severity error)
|
|
(constraint hole_to_hole (min 0.2mm)))
|
|
|
|
(rule "JLCPCB min hole-to-copper clearance (0.2mm)"
|
|
(severity error)
|
|
(constraint hole_clearance (min 0.2mm)))
|
|
|
|
(rule "JLCPCB min silkscreen line/text thickness (0.15mm, front)"
|
|
(severity warning)
|
|
(layer "F.SilkS")
|
|
(constraint text_thickness (min 0.15mm)))
|
|
|
|
(rule "JLCPCB min silkscreen line/text thickness (0.15mm, back)"
|
|
(severity warning)
|
|
(layer "B.SilkS")
|
|
(constraint text_thickness (min 0.15mm)))
|
|
|
|
(rule "JLCPCB min silkscreen text height (1.0mm, front)"
|
|
(severity warning)
|
|
(layer "F.SilkS")
|
|
(constraint text_height (min 1.0mm)))
|
|
|
|
(rule "JLCPCB min silkscreen text height (1.0mm, back)"
|
|
(severity warning)
|
|
(layer "B.SilkS")
|
|
(constraint text_height (min 1.0mm)))
|
|
|
|
(rule "JLCPCB min silkscreen-to-pad clearance (0.15mm, front)"
|
|
(severity warning)
|
|
(layer "F.SilkS")
|
|
(constraint silk_clearance (min 0.15mm)))
|
|
|
|
(rule "JLCPCB min silkscreen-to-pad clearance (0.15mm, back)"
|
|
(severity warning)
|
|
(layer "B.SilkS")
|
|
(constraint silk_clearance (min 0.15mm)))
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# Differential pair geometry vs calculated target impedance. The USB_DP/ETH_DP
|
|
# netclasses (0.25/0.15mm, 0.2/0.14mm) only set the DEFAULT for new routing -
|
|
# same caveat as the power-rail rules above, KiCad does not enforce a
|
|
# netclass's width/gap on already-routed copper. These rules close that gap:
|
|
# they check the geometry actually laid down, not just what a fresh route
|
|
# would use, so re-routing to the wrong default (the original bug that had
|
|
# USB sitting at ~113ohm on the Default netclass's 0.2/0.25mm) gets caught by
|
|
# DRC instead of requiring another hand calculation to notice.
|
|
#
|
|
# Target values and their impedance were derived by hand (IPC-2141-style
|
|
# edge-coupled microstrip formula) from this board's actual stackup - F.Cu/
|
|
# B.Cu are symmetric microstrip over In1.Cu/In2.Cu respectively (both 0.2104mm
|
|
# FR4 dielectrics, same εr), so one target pair covers a net whether it's
|
|
# routed on F.Cu or briefly detours to B.Cu for a crossover. Severity is
|
|
# "error": these two nets only exist to hit a controlled-impedance target, so
|
|
# missing it isn't a style nit like the power-rail/silkscreen rules above -
|
|
# it's the one thing the routing was actually for.
|
|
# USB_DP: 0.25mm width / 0.15mm gap -> ~91ohm (target 90ohm +/-15%)
|
|
# ETH_DP: 0.20mm width / 0.14mm gap -> ~100ohm (target 100ohm +/-15%)
|
|
# track_width keeps a +/-0.02mm max band (routing precision). diff_pair_gap
|
|
# has NO max: a max bound sounds right but false-flags normal pad fanout,
|
|
# where P/N necessarily diverge for a few mm right at the pad before
|
|
# converging into the coupled run - DRC can't tell that apart from a
|
|
# genuinely uncoupled long run, and real routing hit gaps of 0.65-1.65mm on
|
|
# fanout stubs vs a ~0.16mm max here. min still catches the case that matters
|
|
# (traces routed too close, i.e. below the fab clearance floor); max on gap
|
|
# only matters over a long uncoupled run, which is a length-matching/loss
|
|
# question, not something this board-wide rule can safely judge per-segment.
|
|
#
|
|
# Covers both halves of the D1/D4/D5 split-net TVS pattern: USB_DP now
|
|
# matches FT_DP/FT_DN (D1's chip-side pins) alongside USB_D+/USB_D-, and
|
|
# ETH_DP matches PHY_TX_P/PHY_TX_N/PHY_RX_P/PHY_RX_N (D4/D5's chip-side pins)
|
|
# alongside ETH_TX_P/N and ETH_RX_P/N - see netclass_patterns in
|
|
# re-bba-rb.kicad_pro. Without that, the chip-side half of each pair falls
|
|
# back to Default and silently skips the impedance target.
|
|
|
|
(rule "USB differential pair width/gap (target ~90ohm)"
|
|
(severity error)
|
|
(condition "A.NetClass == 'USB_DP'")
|
|
(constraint track_width (min 0.23mm) (opt 0.25mm) (max 0.27mm))
|
|
(constraint diff_pair_gap (min 0.13mm) (opt 0.15mm)))
|
|
|
|
(rule "Ethernet differential pair width/gap (target ~100ohm)"
|
|
(severity error)
|
|
(condition "A.NetClass == 'ETH_DP'")
|
|
(constraint track_width (min 0.18mm) (opt 0.20mm) (max 0.22mm))
|
|
(constraint diff_pair_gap (min 0.12mm) (opt 0.14mm)))
|