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;