@tscircuit/checks 0.0.148 → 0.0.150
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -1
- package/dist/index.js +64 -0
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
package/dist/index.d.ts
CHANGED
|
@@ -80,6 +80,8 @@ declare function checkViaTraceClearance(circuitJson: AnyCircuitElement[], { conn
|
|
|
80
80
|
minClearance?: number;
|
|
81
81
|
}): PcbViaTraceClearanceError[];
|
|
82
82
|
|
|
83
|
+
declare function checkViasInPads(circuitJson: AnyCircuitElement[]): PcbPlacementError[];
|
|
84
|
+
|
|
83
85
|
/**
|
|
84
86
|
* Removes generic pcb_trace_error records when a more specific pad-trace or
|
|
85
87
|
* via-trace clearance error describes the same physical pair.
|
|
@@ -159,4 +161,4 @@ declare function checkConnectorAccessibleOrientation(circuitJson: AnyCircuitElem
|
|
|
159
161
|
*/
|
|
160
162
|
declare function checkTestPointAccessibility(circuitJson: AnyCircuitElement[]): PcbPlacementError[];
|
|
161
163
|
|
|
162
|
-
export { NetManager, checkAllPinsInComponentAreUnderspecified, checkConnectorAccessibleOrientation, checkDifferentNetViaSpacing, checkEachPcbPortConnectedToPcbTraces, checkEachPcbTraceNonOverlapping, checkNoGroundPinDefined, checkNoPowerPinDefined, checkPadPadClearance, checkPadTraceClearance, checkPcbComponentOverlap, checkPcbComponentsOutOfBoard, checkPcbTraceLengths, checkPcbTracesOutOfBoard, checkPinMustBeConnected, checkSameNetViaSpacing, checkSourceTracesHavePcbTraces, checkSourceTracesMatchPcbTraceThickness, checkTestPointAccessibility, checkTracesAreContiguous, checkViaTraceClearance, checkViasOffBoard, dedupePcbDrcErrors, runAllChecks, runAllNetlistChecks, runAllPinSpecificationChecks, runAllPlacementChecks, runAllRoutingChecks };
|
|
164
|
+
export { NetManager, checkAllPinsInComponentAreUnderspecified, checkConnectorAccessibleOrientation, checkDifferentNetViaSpacing, checkEachPcbPortConnectedToPcbTraces, checkEachPcbTraceNonOverlapping, checkNoGroundPinDefined, checkNoPowerPinDefined, checkPadPadClearance, checkPadTraceClearance, checkPcbComponentOverlap, checkPcbComponentsOutOfBoard, checkPcbTraceLengths, checkPcbTracesOutOfBoard, checkPinMustBeConnected, checkSameNetViaSpacing, checkSourceTracesHavePcbTraces, checkSourceTracesMatchPcbTraceThickness, checkTestPointAccessibility, checkTracesAreContiguous, checkViaTraceClearance, checkViasInPads, checkViasOffBoard, dedupePcbDrcErrors, runAllChecks, runAllNetlistChecks, runAllPinSpecificationChecks, runAllPlacementChecks, runAllRoutingChecks };
|
package/dist/index.js
CHANGED
|
@@ -448,6 +448,16 @@ var getReadableNameForElementId = (circuitJson, elementId) => sanitizeReadableNa
|
|
|
448
448
|
"element"
|
|
449
449
|
);
|
|
450
450
|
var containsCircuitJsonId = (message) => CIRCUIT_JSON_ID_PATTERN.test(message);
|
|
451
|
+
function getReadableNameForFootprintPad(circuitJson, pad, ordinal) {
|
|
452
|
+
const padKind = pad.type === "pcb_smtpad" ? "SMD pad" : "through-hole pad";
|
|
453
|
+
const portRef = pad.pcb_port_id ? getReadableNameForPort(circuitJson, pad.pcb_port_id) : null;
|
|
454
|
+
const bounds = getBoundsOfPcbElements([pad]);
|
|
455
|
+
const centerX = (bounds.minX + bounds.maxX) / 2;
|
|
456
|
+
const centerY = (bounds.minY + bounds.maxY) / 2;
|
|
457
|
+
const location = `(${centerX.toFixed(2)}mm, ${centerY.toFixed(2)}mm)`;
|
|
458
|
+
if (portRef) return `${padKind} ${portRef} at ${location}`;
|
|
459
|
+
return `${padKind} #${ordinal + 1} at ${location}`;
|
|
460
|
+
}
|
|
451
461
|
|
|
452
462
|
// lib/check-each-pcb-port-connected-to-pcb-trace.ts
|
|
453
463
|
function checkEachPcbPortConnectedToPcbTraces(circuitJson) {
|
|
@@ -2760,6 +2770,58 @@ function checkViaTraceClearance(circuitJson, {
|
|
|
2760
2770
|
return Array.from(errors.values()).map(({ error }) => error);
|
|
2761
2771
|
}
|
|
2762
2772
|
|
|
2773
|
+
// lib/check-vias-in-pads.ts
|
|
2774
|
+
import { getPrimaryId as getPrimaryId5 } from "@tscircuit/circuit-json-util";
|
|
2775
|
+
function checkViasInPads(circuitJson) {
|
|
2776
|
+
const board = getPcbBoard(circuitJson);
|
|
2777
|
+
if (board && "is_via_in_pad_allowed" in board && board.is_via_in_pad_allowed === true) {
|
|
2778
|
+
return [];
|
|
2779
|
+
}
|
|
2780
|
+
const vias = circuitJson.filter(
|
|
2781
|
+
(element) => element.type === "pcb_via"
|
|
2782
|
+
);
|
|
2783
|
+
const pads = getPads(circuitJson);
|
|
2784
|
+
if (vias.length === 0 || pads.length === 0) return [];
|
|
2785
|
+
const padOrdinals = new Map(
|
|
2786
|
+
pads.map((pad, index) => [getPrimaryId5(pad), index])
|
|
2787
|
+
);
|
|
2788
|
+
const padIndex = new SpatialObjectIndex({
|
|
2789
|
+
objects: pads,
|
|
2790
|
+
getBounds: getPadBounds,
|
|
2791
|
+
getId: getPrimaryId5
|
|
2792
|
+
});
|
|
2793
|
+
const errors = [];
|
|
2794
|
+
for (const via of vias) {
|
|
2795
|
+
const nearbyPads = padIndex.getObjectsInBounds({
|
|
2796
|
+
minX: via.x,
|
|
2797
|
+
minY: via.y,
|
|
2798
|
+
maxX: via.x,
|
|
2799
|
+
maxY: via.y
|
|
2800
|
+
});
|
|
2801
|
+
for (const pad of nearbyPads) {
|
|
2802
|
+
const viaLayers = getLayersOfPcbElement(via);
|
|
2803
|
+
const padLayers = getLayersOfPcbElement(pad);
|
|
2804
|
+
if (!viaLayers.some((layer) => padLayers.includes(layer))) continue;
|
|
2805
|
+
if (!isPointInPad(via, pad)) continue;
|
|
2806
|
+
const padId = getPrimaryId5(pad);
|
|
2807
|
+
const padOrdinal = padOrdinals.get(padId) ?? 0;
|
|
2808
|
+
const padName = getReadableNameForFootprintPad(
|
|
2809
|
+
circuitJson,
|
|
2810
|
+
pad,
|
|
2811
|
+
padOrdinal
|
|
2812
|
+
);
|
|
2813
|
+
errors.push({
|
|
2814
|
+
type: "pcb_placement_error",
|
|
2815
|
+
pcb_placement_error_id: `via_in_pad_${via.pcb_via_id}_${padId}`,
|
|
2816
|
+
error_type: "pcb_placement_error",
|
|
2817
|
+
message: `Via at (${via.x.toFixed(2)}mm, ${via.y.toFixed(2)}mm) is inside ${padName}`,
|
|
2818
|
+
subcircuit_id: via.subcircuit_id ?? pad.subcircuit_id
|
|
2819
|
+
});
|
|
2820
|
+
}
|
|
2821
|
+
}
|
|
2822
|
+
return errors;
|
|
2823
|
+
}
|
|
2824
|
+
|
|
2763
2825
|
// lib/dedupe-pcb-drc-errors.ts
|
|
2764
2826
|
var dedupePcbDrcErrors = (errors) => {
|
|
2765
2827
|
const specificallyReportedPairIds = /* @__PURE__ */ new Set();
|
|
@@ -3256,6 +3318,7 @@ function checkTestPointAccessibility(circuitJson) {
|
|
|
3256
3318
|
async function runAllPlacementChecks(circuitJson) {
|
|
3257
3319
|
return [
|
|
3258
3320
|
...checkViasOffBoard(circuitJson),
|
|
3321
|
+
...checkViasInPads(circuitJson),
|
|
3259
3322
|
...checkPcbComponentsOutOfBoard(circuitJson),
|
|
3260
3323
|
...checkPcbComponentOverlap(circuitJson),
|
|
3261
3324
|
...checkPadPadClearance(circuitJson),
|
|
@@ -3318,6 +3381,7 @@ export {
|
|
|
3318
3381
|
checkTestPointAccessibility,
|
|
3319
3382
|
checkTracesAreContiguous,
|
|
3320
3383
|
checkViaTraceClearance,
|
|
3384
|
+
checkViasInPads,
|
|
3321
3385
|
checkViasOffBoard,
|
|
3322
3386
|
dedupePcbDrcErrors,
|
|
3323
3387
|
runAllChecks,
|