@tscircuit/checks 0.0.152 → 0.0.154

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 CHANGED
@@ -80,6 +80,11 @@ declare function checkViaTraceClearance(circuitJson: AnyCircuitElement[], { conn
80
80
  minClearance?: number;
81
81
  }): PcbViaTraceClearanceError[];
82
82
 
83
+ declare function checkViaPadClearance(circuitJson: AnyCircuitElement[], { connMap, minClearance, }?: {
84
+ connMap?: ConnectivityMap;
85
+ minClearance?: number;
86
+ }): PcbPadPadClearanceError[];
87
+
83
88
  declare function checkViasInPads(circuitJson: AnyCircuitElement[]): PcbPlacementError[];
84
89
 
85
90
  /**
@@ -141,7 +146,7 @@ declare function runAllNetlistChecks(circuitJson: AnyCircuitElement[]): Promise<
141
146
  subcircuit_id?: string;
142
147
  }[]>;
143
148
  declare function runAllPinSpecificationChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.SourceComponentPinsUnderspecifiedWarning | circuit_json.SourceNoPowerPinDefinedWarning | circuit_json.SourceNoGroundPinDefinedWarning)[]>;
144
- declare function runAllRoutingChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | circuit_json.PcbTraceTooLongWarning | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError)[]>;
149
+ declare function runAllRoutingChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | circuit_json.PcbTraceTooLongWarning | circuit_json.PcbPadPadClearanceError | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError)[]>;
145
150
  declare function runAllChecks(circuitJson: AnyCircuitElement[]): Promise<(circuit_json.PcbPortNotConnectedError | circuit_json.PcbTraceError | circuit_json.PcbPlacementError | circuit_json.PcbComponentOutsideBoardError | circuit_json.PcbViaClearanceError | circuit_json.PcbTraceMissingError | circuit_json.PcbFootprintOverlapError | circuit_json.PcbTraceTooLongWarning | circuit_json.PcbPadPadClearanceError | circuit_json.PcbPadTraceClearanceError | circuit_json.PcbViaTraceClearanceError | {
146
151
  type: "source_pin_must_be_connected_error";
147
152
  source_pin_must_be_connected_error_id: string;
@@ -161,4 +166,4 @@ declare function checkConnectorAccessibleOrientation(circuitJson: AnyCircuitElem
161
166
  */
162
167
  declare function checkTestPointAccessibility(circuitJson: AnyCircuitElement[]): PcbPlacementError[];
163
168
 
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 };
169
+ export { NetManager, checkAllPinsInComponentAreUnderspecified, checkConnectorAccessibleOrientation, checkDifferentNetViaSpacing, checkEachPcbPortConnectedToPcbTraces, checkEachPcbTraceNonOverlapping, checkNoGroundPinDefined, checkNoPowerPinDefined, checkPadPadClearance, checkPadTraceClearance, checkPcbComponentOverlap, checkPcbComponentsOutOfBoard, checkPcbTraceLengths, checkPcbTracesOutOfBoard, checkPinMustBeConnected, checkSameNetViaSpacing, checkSourceTracesHavePcbTraces, checkSourceTracesMatchPcbTraceThickness, checkTestPointAccessibility, checkTracesAreContiguous, checkViaPadClearance, checkViaTraceClearance, checkViasInPads, checkViasOffBoard, dedupePcbDrcErrors, runAllChecks, runAllNetlistChecks, runAllPinSpecificationChecks, runAllPlacementChecks, runAllRoutingChecks };
package/dist/index.js CHANGED
@@ -589,7 +589,7 @@ var getPadRadius = (pad) => {
589
589
  const bounds = getPadBounds(pad);
590
590
  return Math.min(bounds.maxX - bounds.minX, bounds.maxY - bounds.minY) / 2;
591
591
  };
592
- var isCircularPad = (pad) => pad.shape === "circle";
592
+ var isCircularPad = (pad) => pad.type === "pcb_via" || pad.shape === "circle";
593
593
  var isPillPad = (pad) => pad.type === "pcb_smtpad" && (pad.shape === "pill" || pad.shape === "rotated_pill");
594
594
  var getCircleShape = (pad) => {
595
595
  const center = getPadCenter(pad);
@@ -2770,8 +2770,69 @@ function checkViaTraceClearance(circuitJson, {
2770
2770
  return Array.from(errors.values()).map(({ error }) => error);
2771
2771
  }
2772
2772
 
2773
+ // lib/check-via-pad-clearance.ts
2774
+ import {
2775
+ getPrimaryId as getPrimaryId5,
2776
+ getReadableNameForElement as getReadableNameForElement9
2777
+ } from "@tscircuit/circuit-json-util";
2778
+ import {
2779
+ getFullConnectivityMapFromCircuitJson as getFullConnectivityMapFromCircuitJson11
2780
+ } from "circuit-json-to-connectivity-map";
2781
+ function checkViaPadClearance(circuitJson, {
2782
+ connMap,
2783
+ minClearance
2784
+ } = {}) {
2785
+ const vias = circuitJson.filter(
2786
+ (element) => element.type === "pcb_via"
2787
+ );
2788
+ const pads = getPads(circuitJson);
2789
+ if (vias.length === 0 || pads.length === 0) return [];
2790
+ const board = getPcbBoard(circuitJson);
2791
+ const requiredClearance = minClearance ?? getBoardDrcValue(board, "min_pad_edge_to_pad_edge_clearance") ?? jlcMinTolerances.min_pad_edge_to_pad_edge_clearance;
2792
+ connMap ??= getFullConnectivityMapFromCircuitJson11(circuitJson);
2793
+ const padIndex = new SpatialObjectIndex({
2794
+ objects: pads,
2795
+ getBounds: getPadBounds,
2796
+ getId: getPrimaryId5
2797
+ });
2798
+ const errors = [];
2799
+ for (const via of vias) {
2800
+ const nearbyPads = padIndex.getObjectsInBounds(
2801
+ getPadBounds(via),
2802
+ requiredClearance
2803
+ );
2804
+ for (const pad of nearbyPads) {
2805
+ const padId = getPrimaryId5(pad);
2806
+ if (!getLayersOfPcbElement(via).some(
2807
+ (layer) => getLayersOfPcbElement(pad).includes(layer)
2808
+ )) {
2809
+ continue;
2810
+ }
2811
+ if (connMap.areIdsConnected(via.pcb_via_id, padId)) continue;
2812
+ const gap = getPadToPadGap(via, pad);
2813
+ if (gap + EPSILON >= requiredClearance) continue;
2814
+ const viaCenter = getPadCenter(via);
2815
+ const padCenter = getPadCenter(pad);
2816
+ errors.push({
2817
+ type: "pcb_pad_pad_clearance_error",
2818
+ pcb_pad_pad_clearance_error_id: `via_pad_clearance_${via.pcb_via_id}_${padId}`,
2819
+ error_type: "pcb_pad_pad_clearance_error",
2820
+ message: `Via ${getReadableNameForElement9(circuitJson, via.pcb_via_id)} and pad ${getReadableNameForElement9(circuitJson, padId)} are too close (clearance: ${formatMm(gap)}, minimum: ${formatMm(requiredClearance)})`,
2821
+ pcb_pad_ids: [via.pcb_via_id, padId],
2822
+ minimum_clearance: requiredClearance,
2823
+ actual_clearance: gap,
2824
+ center: {
2825
+ x: (viaCenter.x + padCenter.x) / 2,
2826
+ y: (viaCenter.y + padCenter.y) / 2
2827
+ }
2828
+ });
2829
+ }
2830
+ }
2831
+ return errors;
2832
+ }
2833
+
2773
2834
  // lib/check-vias-in-pads.ts
2774
- import { getPrimaryId as getPrimaryId5 } from "@tscircuit/circuit-json-util";
2835
+ import { getPrimaryId as getPrimaryId6 } from "@tscircuit/circuit-json-util";
2775
2836
  function checkViasInPads(circuitJson) {
2776
2837
  const board = getPcbBoard(circuitJson);
2777
2838
  if (board && "is_via_in_pad_allowed" in board && board.is_via_in_pad_allowed === true) {
@@ -2783,12 +2844,12 @@ function checkViasInPads(circuitJson) {
2783
2844
  const pads = getPads(circuitJson);
2784
2845
  if (vias.length === 0 || pads.length === 0) return [];
2785
2846
  const padOrdinals = new Map(
2786
- pads.map((pad, index) => [getPrimaryId5(pad), index])
2847
+ pads.map((pad, index) => [getPrimaryId6(pad), index])
2787
2848
  );
2788
2849
  const padIndex = new SpatialObjectIndex({
2789
2850
  objects: pads,
2790
2851
  getBounds: getPadBounds,
2791
- getId: getPrimaryId5
2852
+ getId: getPrimaryId6
2792
2853
  });
2793
2854
  const errors = [];
2794
2855
  for (const via of vias) {
@@ -2803,7 +2864,7 @@ function checkViasInPads(circuitJson) {
2803
2864
  const padLayers = getLayersOfPcbElement(pad);
2804
2865
  if (!viaLayers.some((layer) => padLayers.includes(layer))) continue;
2805
2866
  if (!isPointInPad(via, pad)) continue;
2806
- const padId = getPrimaryId5(pad);
2867
+ const padId = getPrimaryId6(pad);
2807
2868
  const padOrdinal = padOrdinals.get(padId) ?? 0;
2808
2869
  const padName = getReadableNameForFootprintPad(
2809
2870
  circuitJson,
@@ -3346,6 +3407,7 @@ async function runAllRoutingChecks(circuitJson) {
3346
3407
  ...checkEachPcbTraceNonOverlapping(circuitJson),
3347
3408
  ...checkPadTraceClearance(circuitJson),
3348
3409
  ...checkViaTraceClearance(circuitJson),
3410
+ ...checkViaPadClearance(circuitJson),
3349
3411
  ...checkSameNetViaSpacing(circuitJson),
3350
3412
  ...checkDifferentNetViaSpacing(circuitJson),
3351
3413
  ...checkTracesAreContiguous(circuitJson),
@@ -3381,6 +3443,7 @@ export {
3381
3443
  checkSourceTracesMatchPcbTraceThickness,
3382
3444
  checkTestPointAccessibility,
3383
3445
  checkTracesAreContiguous,
3446
+ checkViaPadClearance,
3384
3447
  checkViaTraceClearance,
3385
3448
  checkViasInPads,
3386
3449
  checkViasOffBoard,