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))