AnasSarkiz/rp2040-usb-c-single-axis-dm542t-motion-controller--01a0e89c

A USB‑C RP2040 controller board with external QSPI flash, crystal clock, regulated 3.3/1.1/5 V power, boost-converted motor-driver supply, protected USB and limit inputs, status LEDs, reset/boot switches, and AO3400A MOSFET outputs for stepper-control signals.

Version
0.1.0-prototype.19
License
unset
Stars
0

tooling/patches/tscircuit-autorouter.patch

--- a/lib/testing/getDrcErrors.ts
+++ b/lib/testing/getDrcErrors.ts
@@ -74,7 +74,9 @@
   options: GetDrcErrorsOptions = {},
 ): GetDrcErrorsResult => {
   const connMap = createDrcConnectivityMap(circuitJson)
+  const board = circuitJson.find((element) => element.type === "pcb_board")
   const viaClearance = Math.max(
+    board?.min_via_hole_edge_to_via_hole_edge_clearance ?? 0,
     options.viaClearance ?? MIN_VIA_TO_VIA_CLEARANCE,
     MIN_VIA_TO_VIA_CLEARANCE,
   )
--- a/lib/testing/utils/convertToCircuitJson.ts
+++ b/lib/testing/utils/convertToCircuitJson.ts
@@ -946,6 +946,9 @@
       ? { outline: srj.outline, shape: "polygon" as const }
       : { shape: "rect" as const }),
     material: "fr4",
+    ...(srj.minViaHoleEdgeToViaHoleEdgeClearance !== undefined
+      ? { min_via_hole_edge_to_via_hole_edge_clearance: srj.minViaHoleEdgeToViaHoleEdgeClearance }
+      : {}),
     ...(srj.minBoardEdgeClearance !== undefined
       ? { min_board_edge_clearance: srj.minBoardEdgeClearance }
       : {}),
--- a/lib/autorouter-pipelines/AutoroutingPipeline9_PreloadedTraceGraph/Pipeline9JointDrcRepairSolver.ts
+++ b/lib/autorouter-pipelines/AutoroutingPipeline9_PreloadedTraceGraph/Pipeline9JointDrcRepairSolver.ts
@@ -1,3 +1,4 @@
+import { getPipeline9ViaCopperClearance } from "./getPipeline9ViaCopperClearance"
 import type { AnyCircuitElement } from "circuit-json"
 import type { ConnectivityMap } from "circuit-json-to-connectivity-map"
 import type { GraphicsObject } from "graphics-debug"
@@ -721,7 +722,12 @@
       params.originalSrj.minTraceToPadEdgeClearance ??
       RELAXED_DRC_OPTIONS.traceClearance ??
       0.1
-    const viaClearance = RELAXED_DRC_OPTIONS.viaClearance ?? 0.1
+    const viaClearance = getPipeline9ViaCopperClearance({
+      originalSrj: params.originalSrj,
+      defaultViaDiameter: params.defaultViaDiameter,
+      defaultViaHoleDiameter: params.defaultViaHoleDiameter,
+      minimumCopperClearance: RELAXED_DRC_OPTIONS.viaClearance ?? 0.1,
+    })
     const baselineDrc = evaluateRelaxedDrc({
       includeBoardClearance: true,
       inputSrj: params.originalSrj,
--- /dev/null
+++ b/lib/autorouter-pipelines/AutoroutingPipeline9_PreloadedTraceGraph/getPipeline9ViaCopperClearance.ts
@@ -0,0 +1,29 @@
+import type { SimpleRouteJson } from "lib/types"
+
+/** Convert the drill-edge rule to a conservative copper-edge search margin. */
+export const getPipeline9ViaCopperClearance = (params: {
+  originalSrj: SimpleRouteJson
+  defaultViaDiameter: number
+  defaultViaHoleDiameter: number
+  minimumCopperClearance: number
+}): number => {
+  const annularDiameters = [
+    params.defaultViaDiameter - params.defaultViaHoleDiameter,
+  ]
+  for (const trace of params.originalSrj.traces ?? []) {
+    for (const point of trace.route) {
+      if (point.route_type !== "via") continue
+      annularDiameters.push(
+        (point.via_diameter ?? params.defaultViaDiameter) -
+          (point.via_hole_diameter ?? params.defaultViaHoleDiameter),
+      )
+    }
+  }
+  // Taking the smallest annulus preserves the drill rule for mixed via sizes.
+  // The authoritative Circuit JSON check still evaluates each actual drill.
+  return Math.max(
+    params.minimumCopperClearance,
+    (params.originalSrj.minViaHoleEdgeToViaHoleEdgeClearance ?? 0) -
+      Math.min(...annularDiameters),
+  )
+}