ShiboSoftwareDev/nema8-20mm-dual-usbc-stepper-controller

A compact 4-layer USB‑C PD stepper-motor controller PCB using a CH32X035 MCU, TMC2209 driver, dual USB‑C ports, power protection/regulation, ESD/TVS diodes, current-sense resistors, and NEMA‑8 motor connector.

Version
1.0.13
License
unset
Stars
0

scripts/search-usb-cc-tails.mjs

import fs from "node:fs"
import { runAllRoutingChecks } from "@tscircuit/checks"

let circuit = JSON.parse(fs.readFileSync("dist/index/circuit.json", "utf8"))
  .filter((element) => !String(element.type).endsWith("error"))

const wire = (x, y, layer, extra = {}) => ({ route_type: "wire", x, y, width: 0.15, layer, ...extra })

const replaceTail = (input, traceId, viaIndex, laneX, laneStartY, endpointY) => input.map((element) => {
  if (element.type !== "pcb_trace" || element.pcb_trace_id !== traceId) return element
  const via = element.route[viaIndex]
  const endpoint = element.route[element.route.length - 1]
  return {
    ...element,
    route: [
      ...element.route.slice(0, viaIndex + 1),
      wire(via.x, via.y, "bottom"),
      wire(laneX, laneStartY, "bottom"),
      wire(laneX, endpointY, "bottom"),
      wire(endpoint.x, endpoint.y, "bottom", { end_pcb_port_id: endpoint.end_pcb_port_id }),
    ],
  }
})

let errors = await runAllRoutingChecks(circuit)
console.log(`start\t${errors.length}`)

const searches = [
  { traceId: "source_net_8_0", viaIndex: 33, endpointY: -0.8, lanes: [-2.8,-2.6,-2.4,-2.2,-2.0,-1.8], starts: [-2.4,-2.2,-2.0,-1.8,-1.6] },
  { traceId: "source_net_7_0", viaIndex: 23, endpointY: -0.4, lanes: [-2.8,-2.6,-2.4,-2.2,-2.0,-1.8], starts: [-4.4,-4.2,-4.0,-3.8,-3.6] },
]

for (const search of searches) {
  let best = { count: errors.length, circuit, errors, lane: 0, start: 0 }
  for (const lane of search.lanes) {
    for (const start of search.starts) {
      const candidate = replaceTail(circuit, search.traceId, search.viaIndex, lane, start, search.endpointY)
      const candidateErrors = await runAllRoutingChecks(candidate)
      if (candidateErrors.length < best.count) {
        best = { count: candidateErrors.length, circuit: candidate, errors: candidateErrors, lane, start }
      }
    }
  }
  circuit = best.circuit
  errors = best.errors
  console.log(`${search.traceId}\t${best.count}\t${best.lane},${best.start}`)
}

console.log(errors.map((error) => error.message).join("\n"))