krishnax12/watchy-eink-smartwatch
Unfinished prototype (not production-ready): 4 native DRC errors, 2 display-flex intersections, and missing antenna radiator copper remain
- Version
- 1.2.7
- License
- MIT
- Stars
- 1
scripts/check-schematic.ts
import type { AnyCircuitElement } from "circuit-json";
import expectedNets from "../tests/fixtures/expected-nets.json";
const circuitPath =
process.argv[2] ?? "reports/schematic-validation.circuit.json";
const circuit: AnyCircuitElement[] = await Bun.file(circuitPath).json();
const components = new Map(
circuit
.filter((item) => item.type === "source_component")
.map((item) => [item.source_component_id, item.name]),
);
const expectedPins = new Set(Object.values(expectedNets).flat());
const actualGroups = new Map<string, string[]>();
for (const port of circuit.filter((item) => item.type === "source_port")) {
const pin = `${components.get(port.source_component_id ?? "")}.${port.pin_number}`;
if (!expectedPins.has(pin)) continue;
const key = port.subcircuit_connectivity_map_key;
if (!key) throw new Error(`Missing connectivity for ${pin}`);
actualGroups.set(key, [...(actualGroups.get(key) ?? []), pin]);
}
const normalize = (groups: string[][]) =>
groups.map((pins) => [...pins].sort().join("|")).sort();
if (
JSON.stringify(normalize([...actualGroups.values()])) !==
JSON.stringify(normalize(Object.values(expectedNets)))
) {
throw new Error("Original electrical connectivity changed");
}
const errors = circuit.filter(
(item) => item.type.endsWith("_error") && !item.type.startsWith("pcb_"),
);
const pcbErrors = circuit.filter(
(item) => item.type.endsWith("_error") && item.type.startsWith("pcb_"),
);
const warnings = circuit.filter((item) => item.type.endsWith("_warning"));
const schematicWarnings = warnings.filter(
(item) => !item.type.startsWith("pcb_"),
);
const report = {
circuitPath,
scope:
"Schematic and component definitions; PCB routing is not evaluated here",
connectivityPreserved: true,
nets: actualGroups.size,
connectedPins: expectedPins.size,
errors,
pcbErrors,
schematicWarnings,
pcbWarnings: warnings.filter((item) => item.type.startsWith("pcb_")),
clean: errors.length === 0 && schematicWarnings.length === 0,
};
await Bun.write(
"reports/schematic-validation.json",
JSON.stringify(report, null, 2) + "\n",
);
console.log(
JSON.stringify(
{
connectivityPreserved: report.connectivityPreserved,
nets: report.nets,
connectedPins: report.connectedPins,
errors: errors.length,
pcbErrors: pcbErrors.length,
schematicWarnings: schematicWarnings.length,
pcbWarnings: report.pcbWarnings.length,
clean: report.clean,
},
null,
2,
),
);
if (!report.clean) process.exitCode = 1;