1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
li:pcb-rnd-conf-v1 {
ha:overwrite {
ha:plugins {
ha:drc_query {
disable=0
li:definitions {
ha:min_copper_clearance {
type = coord
legacy = design/bloat
desc = {minimum gap between copper features of different networks}
}
ha:min_copper_overlap {
type = coord
legacy = design/shrink
desc = {minimum overlap between copper features on the same network for reliable connection}
}
ha:min_drill {
type = coord
legacy = design/min_drill
desc = {minimum drill diameter}
}
ha:hole_overlap_factor {
type = real
default = 0.0
desc = {How much drilled holes may overlap [-1..+1]; 0 means touching holes are reported; positive numbers allow more overlap, negative numbers report non-overlapping but close holes}
}
ha:min_copper_thickness {
type = coord
default = 0mm
legacy = design/min_wid
desc = {Minimum copper object width; anything thinner than this value is a violation}
}
ha:min_silk_thickness {
type = coord
default = 0mm
legacy = design/min_slk
desc = {Minimum silk object width; anything thinner than this value is a violation}
}
ha:min_ring {
type = coord
default = 0mm
legacy = design/min_ring
desc = {Minimum ring thickness of padstacks }
}
}
li:rules {
ha:hole_dia {
type = single hole
title = hole too small
desc = padstack hole diameter is too small
query = {(@.hole > 0) && (@.hole < $min_drill) thus violation(DRCGRP1, @, DRCMEASURE, @.hole, DRCEXPECT, $min_drill)}
}
ha:hole_overlap {
type = pair hole
title = overlapping holes
desc = padstack holes overlap
query = {
rule overlap
let A (@.type==PSTK) && (@.hole > 0)
let B A
assert (A.IID > B.IID) && (distance(A.x, A.y, B.x, B.y) < (A.hole + B.hole)/(2*(1+$hole_overlap_factor))) thus violation(DRCGRP1, A, DRCGRP2, B, DRCMEASURE, coord(distance(A.x, A.y, B.x, B.y)), DRCEXPECT, coord((A.hole + B.hole)/(2*(1+$hole_overlap_factor))))
}
}
ha:net_break {
type = broken net
title = insufficient overlap
desc = the overlap between two objects in the net is insufficient and can lead to broken network during board fabrication
query = {
rule net brk
let N netlist()
let O netsegs(N)
assert netbreak(O, $min_copper_overlap)
}
}
ha:net_short {
type = shorted nets
title = net too close to other net
desc = insufficient clearance between an object of the network and objects of other networks
query = {
rule net short
let N netlist()
let O netsegs(N)
assert netshort(O, $min_copper_clearance)
}
}
ha:min_copper_thickness {
type = thin copper
title = copper object too thin
desc = Copper object thickness is below the required value. Copper objects too thin may break or peel off during board fabriaction.
query = {(@.layer.type == COPPER) && (@.thickness != 0) && (@.thickness < $min_copper_thickness) thus violation(DRCGRP1, @, DRCMEASURE, @.thickness, DRCEXPECT, $min_copper_thickness)}
}
ha:min_silk_thickness {
type = thin silk
title = silk object too thin
desc = Silk object thickness is below the required value. Silk objects too thin may disappear during board fabrication.
query = {(@.layer.type == SILK) && (@.thickness != 0) && (@.thickness < $min_silk_thickness) thus violation(DRCGRP1, @, DRCMEASURE, @.thickness, DRCEXPECT, $min_silk_thickness) }
}
ha:beyond_drawing_area {
type = object beyond drawing area
title = Objects located outside of the drawing area
desc = Objects may be omitted from exports or may be outside of the board contour.
query = { (@.bbox.x2 < 0) || (@.bbox.y2 < 0) || (@.bbox.x1 > $dwg_area_x) || (@.bbox.y1 > $dwg_area_y) }
}
ha:min_ring {
type = padstack ring too thin
title = Ring of a padstack object is too thin
desc = The smallest neck of the ring is thinner than the required value - the ring may break during drilling or erode away during etching.
query = { pstkring(@, $min_ring) > 0 }
}
ha:fullpoly {
type = fullpoly
title = Multi-island polygon with the fullpoly flag
desc = Polygon with the fullpoly flag set is cut into multiple islands; there is no guarantee that the islands are connected while pcb-rnd will always think they are, fooling the drc and rats optimizer.
query = { poly_num_islands(@) > 1 }
}
ha:ko_named {
type = courtyard
title = Courtyard conflict
desc = Courtyard objects overlap
query = {
rule courtyard
let A (@.layer.purpose ~ "^ko.") thus @
let B A
assert (A != B) && (A.IID <= B.IID) && (A.layer.position == B.layer.position) && (A.layer.purpose == B.layer.purpose) && (overlap(A, B)) \\
thus violation(DRCGRP1, A, DRCGRP2, B, DRCTEXT, "On keepout type ", DRCTEXT, A.layer.purpose, DRCTEXT, " ", DRCTEXT, A.layer.a.drc_desc)
}
}
ha:invalid_polygons {
type = polygon
title = Invalid polygon
desc = Polygon contour is invalid, most probably self intersecting
query = {
rule invalidpoly
assert @.type == POLYGON && !poly_is_valid(@)
}
}
ha:invalid_text_chars {
type = text_char
title = Invalid character in text
desc = Text object contains character(s) that will not render with the given font
query = {
rule invalid_text_chars
assert @.type == TEXT && (text_invalid_chars(@) > 0) \\
thus violation(DRCGRP1, @, DRCTEXT, "Number of invalid characters:", DRCTEXT, text_invalid_chars(@))
}
}
}
}
}
}
}
|