forked from tscircuit/checks
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcheck-same-net-via-spacing.ts
More file actions
64 lines (61 loc) · 2.25 KB
/
check-same-net-via-spacing.ts
File metadata and controls
64 lines (61 loc) · 2.25 KB
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
import type {
AnyCircuitElement,
PcbVia,
PcbViaClearanceError,
} from "circuit-json"
import { getReadableNameForElement } from "@tscircuit/circuit-json-util"
import {
getFullConnectivityMapFromCircuitJson,
type ConnectivityMap,
} from "circuit-json-to-connectivity-map"
import { DEFAULT_SAME_NET_VIA_MARGIN, EPSILON } from "lib/drc-defaults"
import { distance } from "lib/util/distance"
import { viasAreAtSameLocation } from "lib/util/viasAreAtSameLocation"
export function checkSameNetViaSpacing(
circuitJson: AnyCircuitElement[],
{
connMap,
minSpacing = DEFAULT_SAME_NET_VIA_MARGIN,
}: { connMap?: ConnectivityMap; minSpacing?: number } = {},
): PcbViaClearanceError[] {
const vias = circuitJson.filter((el) => el.type === "pcb_via") as PcbVia[]
if (vias.length < 2) return []
connMap ??= getFullConnectivityMapFromCircuitJson(circuitJson)
const errors: PcbViaClearanceError[] = []
const reported = new Set<string>()
for (let i = 0; i < vias.length; i++) {
for (let j = i + 1; j < vias.length; j++) {
const viaA = vias[i]
const viaB = vias[j]
// TODO: It is a very inefficient piece of code, the way to fix it is to use flatbush.
if (viasAreAtSameLocation(viaA, viaB)) continue
if (!connMap.areIdsConnected(viaA.pcb_via_id, viaB.pcb_via_id)) continue
const gap =
distance(viaA, viaB) - viaA.outer_diameter / 2 - viaB.outer_diameter / 2
if (gap + EPSILON >= minSpacing) continue
const pairId = [viaA.pcb_via_id, viaB.pcb_via_id].sort().join("_")
if (reported.has(pairId)) continue
reported.add(pairId)
errors.push({
type: "pcb_via_clearance_error",
pcb_error_id: `same_net_vias_close_${pairId}`,
message: `Vias ${getReadableNameForElement(
circuitJson,
viaA.pcb_via_id,
)} and ${getReadableNameForElement(
circuitJson,
viaB.pcb_via_id,
)} are too close together (gap: ${gap.toFixed(3)}mm)`,
error_type: "pcb_via_clearance_error",
pcb_via_ids: [viaA.pcb_via_id, viaB.pcb_via_id],
minimum_clearance: minSpacing,
actual_clearance: gap,
pcb_center: {
x: (viaA.x + viaB.x) / 2,
y: (viaA.y + viaB.y) / 2,
},
})
}
}
return errors
}