krishnax12/tps2553-usb-power-switch

USB‑C 5V input board with CC pull-downs feeding a TPS2553 current-limited power switch, filtered 5V output connector, external enable control, and red overcurrent/fault LED indicator.

Version
1.0.0
License
unset
Stars
0

scripts/validate-board.ts

import assert from "node:assert/strict"
import type { AnyCircuitElement } from "circuit-json"

const circuitJson: AnyCircuitElement[] = await Bun.file(
  "dist/index/circuit.json",
).json()
const diagnostics = circuitJson.filter((element) =>
  /_(error|warning)$/.test(element.type),
)
assert.equal(diagnostics.length, 0, JSON.stringify(diagnostics))
const sheets = circuitJson.filter(
  (element) => element.type === "schematic_sheet",
)
assert.equal(sheets.length, 3)
const sourceChips = circuitJson.filter(
  (element) => element.type === "source_component",
)
const powerSwitch = sourceChips.find((chip) => chip.name === "U1")!
const powerSwitchPorts = circuitJson.filter(
  (element) =>
    element.type === "source_port" &&
    element.source_component_id === powerSwitch.source_component_id,
)
assert.equal(powerSwitchPorts.length, 6)
const sourceTraces = circuitJson.filter(
  (element) => element.type === "source_trace",
)
const sourceNets = circuitJson.filter(
  (element) => element.type === "source_net",
)
for (const [pinName, netName] of Object.entries({
  IN: "V5_IN",
  OUT: "V5_OUT",
  GND: "GND",
  EN: "ENABLE",
  N_FAULT: "N_FAULT",
  ILIM: "ILIM",
})) {
  const switchPort = powerSwitchPorts.find(
    (port) => port.type === "source_port" && port.name === pinName,
  )
  assert(switchPort?.type === "source_port", `Missing TPS2553 pin ${pinName}`)
  const sourceNet = sourceNets.find((net) => net.name === netName)!
  assert(
    sourceTraces.some(
      (trace) =>
        trace.connected_source_port_ids.includes(switchPort.source_port_id) &&
        trace.connected_source_net_ids.includes(sourceNet.source_net_id),
    ),
    `TPS2553 ${pinName} is not on ${netName}`,
  )
}
const pcbTraces = circuitJson.filter((element) => element.type === "pcb_trace")
assert(pcbTraces.length > 0, "PCB has no routed copper")
const solverReport: { solvers: Array<{ solver_name: string }> } =
  await Bun.file("dist/solver-debug/index/solver-inputs.json").json()
const solverNames = solverReport.solvers.map((solver) => solver.solver_name)
assert.equal(
  solverNames.filter((name) => name === "LayoutPipelineSolver").length,
  3,
)
assert.equal(
  solverNames.filter((name) => name === "SchematicTracePipelineSolver").length,
  3,
)
const fabricationRect = circuitJson.find(
  (element) => element.type === "pcb_fabrication_note_rect",
)!
assert(fabricationRect.type === "pcb_fabrication_note_rect")
const summary = {
  source_components: sourceChips.length,
  schematic_sheets: sheets.map((sheet) => sheet.name),
  schematic_warnings: diagnostics.filter((element) =>
    element.type.startsWith("schematic_"),
  ).length,
  circuit_errors_and_warnings: diagnostics.length,
  pcb_traces: pcbTraces.length,
  pcb_vias: circuitJson.filter((element) => element.type === "pcb_via").length,
  solver_names: solverNames,
  fabrication_rotation_observation: {
    component: "U1",
    pcb_rotation_degrees: 90,
    expected_width: 2.8,
    expected_height: 1.7,
    actual_width: fabricationRect.width,
    actual_height: fabricationRect.height,
  },
}
await Bun.write("reports/validation.json", JSON.stringify(summary, null, 2))
await Bun.write(
  "reports/board.circuit.json",
  JSON.stringify(circuitJson, null, 2),
)
console.log(JSON.stringify(summary, null, 2))