velxio/test/test_circuit/test/ngspice_smoke.test.js

38 lines
1.2 KiB
JavaScript
Raw Normal View History

feat: electrical simulation via ngspice-WASM (eecircuit-engine) Adds full SPICE-accurate electrical simulation to Velxio, behind a lazy- loaded ⚡ toolbar toggle. Arduino / ESP32 / RP2040 sketches now co-simulate with real analog behaviour: correct voltages on wires, real I–V curves on LEDs, working potentiometers, NTC thermistors read by analogRead(), PWM driving RC filters, transistors, op-amps, diodes, MOSFETs, etc. Engine: eecircuit-engine (ngspice compiled to WebAssembly). Main bundle stays at 2.4 MB; the 20 MB SPICE chunk only loads when the user activates electrical mode. Disabled at build time via VITE_ELECTRICAL_SIM=false. Frontend additions: - simulation/spice/: SpiceEngine wrapper + lazy entry, NetlistBuilder with UnionFind over wires, componentToSpice mapping (24 metadataIds incl. real part numbers: 2N2222, 2N3055, BC547, IRF540, 2N7000, 1N4148, 1N4007, 1N4733, LEDs, NTC, op-amp ideal), CircuitScheduler with debounced coalescing, AVRSpiceBridge for quasi-static co-simulation. - store/useElectricalStore: Zustand slice, feature-flag aware. - components/analog-ui/: ⚡ toolbar toggle + SVG voltage overlay. - components/components-instruments/: Voltmeter, Ammeter probes. - 62 tests (spice-*, netlist-builder, component-to-spice, instruments). Sandbox (test/test_circuit/): 47-test validation sandbox that proved the approach (hand-rolled MNA baseline + ngspice pipeline) before porting to the app. Kept as reference. Docs: docs/wiki/circuit-emulation-*.md (13 engineering pages covering architecture, solvers, components, AVR bridge, gotchas, performance, integration plan, API reference, appendix) + electrical-simulation- user-guide.md (end-user facing). Reference plan: test/test_circuit/plan/phase_8_velxio_implementation.md Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-15 19:11:54 +07:00
import { describe, it, expect } from 'vitest';
import { Simulation } from 'eecircuit-engine';
/**
* Smoke test: bring up ngspice-WASM and run one DC analysis.
*
* Netlist is the classic voltage divider: 9V across 1k + 2k.
* Expected: V(out) = 6.000 V
*/
describe('ngspice-WASM — smoke test', () => {
it('runs a voltage-divider DC op-point', { timeout: 60_000 }, async () => {
const sim = new Simulation();
await sim.start();
const netlist = `Voltage divider
V1 vcc 0 DC 9
R1 vcc out 1k
R2 out 0 2k
.op
.end`;
sim.setNetList(netlist);
const result = await sim.runSim();
expect(result).toBeDefined();
expect(result.variableNames.length).toBeGreaterThan(0);
console.log('variables:', result.variableNames);
console.log('numPoints:', result.numPoints);
console.log('dataType:', result.dataType);
// Find the voltage on node 'out'
const outIdx = result.variableNames.findIndex(n => /v\(out\)/i.test(n) || n.toLowerCase() === 'v(out)');
expect(outIdx).toBeGreaterThanOrEqual(0);
const outVoltage = result.data[outIdx].values[0];
console.log('V(out) =', outVoltage);
expect(outVoltage).toBeCloseTo(6.0, 2);
});
});