Simtronics — Arquitetura e Fluxo
Fluxo completo da simulação: do desenho esquemático à geração da netlist, execução no Web Worker e parsing dos resultados.
Arquitetura e Fluxo
O Simtronics segue uma arquitetura em camadas com separação rígida entre thread principal e worker, maximizando responsividade e isolando o WASM.
Diagrama de fluxo
┌──────────────────────────────────────────────────────┐
│ Página /edu/simulador (Astro, SSR estático) │
│ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ Editor SVG │ │ Editor Código │ (modos de │
│ │ (Esquema) │ │ (Netlist) │ visualização) │
│ └──────┬──────┘ └──────────────┘ │
│ │ │
│ ┌──────▼──────────────────────────┐ │
│ │ src/lib/edu/schematic (puro) │ │
│ │ toNetlist(schematic) → netlist │ │
│ └──────┬──────────────────────────┘ │
│ │ string SPICE │
│ ┌──────▼──────────────────────────┐ │
│ │ src/scripts/simulation/ │ │
│ │ client.ts (façade main thread)│ │
│ │ → postMessage netlist │ │
│ └──────┬──────────────────────────┘ │
│ │ │
├─────────┼─── thread boundary ────────────────────────┤
│ │ │
│ ┌──────▼──────────────────────────┐ │
│ │ sim-worker.ts (Web Worker) │ │
│ │ dynamic import eecircuit-engine│ │
│ │ → ngspice WASM (base64 inline) │ │
│ │ → runSim() → ResultType │ │
│ └──────┬──────────────────────────┘ │
│ │ ResultType bruto │
│ ┌──────▼──────────────────────────┐ │
│ │ src/lib/edu/simulation/result.ts │ │
│ │ parseSimResult → SimResult │ │
│ └──────┬──────────────────────────┘ │
│ │ SimResult (scale + vectors + log) │
│ ┌──────▼──────────────────────────┐ │
│ │ Gráfico canvas (plot.ts) │ │
│ │ + log de saída │ │
│ └─────────────────────────────────┘ │
└──────────────────────────────────────────────────────┘
Camadas
1. Editor (src/scripts/schematic/)
Canvas SVG com grid snapping. O usuário monta o circuito visualmente. A cada
mudança, o modelo Schematic é atualizado e a netlist é regenerada via
toNetlist(). Fluxo unidirecional na v0: esquema → código (não o inverso).
2. Biblioteca esquemática (src/lib/edu/schematic/)
Pura, sem DOM, testável em Node. Responsável por:
- pinsOf(): posições dos pinos por tipo de componente e rotação.
- buildNets(): conectividade point-on-segment via union-find.
- toNetlist(): geração da netlist SPICE com validação em 7 etapas.
3. Façade de simulação (src/scripts/simulation/)
- client.ts: cria o Web Worker sob demanda, gerencia correlação de
mensagens por
id, rejeita chamadas concorrentes. - sim-worker.ts: importa dinamicamente o módulo pesado
eecircuit-engine, executarunSim()e detecta erros fatais vs notas.
4. Engine (eecircuit-engine 1.7.0)
ngspice compilado com Emscripten. O WASM é embutido como base64 inline no
módulo ESM — não há arquivo .wasm separado.
Características:
- Single-thread (sem SharedArrayBuffer, sem COOP/COEP).
- Inicialização assíncrona (
start()), reutilizável. runSim()resolve mesmo com erros não fatais do ngspice.
5. Parser de resultados (src/lib/edu/simulation/result.ts)
Converte o ResultType bruto do engine em SimResult:
- Detecta tipo de análise (op/dc/ac/tran).
- Separa vetor de escala dos demais.
- Converte complexos: magnitude (
|X|) + partes real e imaginária. - Mapeia tipo do engine → unidade (V, A, s, Hz).
6. Visualização (src/scripts/simulation/plot.ts)
Canvas próprio (sem biblioteca externa) para polylines e eixos. Exibe os vetores de resultado sobre a escala.
Lazy loading
Abrir a página do simulador não deve carregar o módulo pesado. A importação do
engine é dinâmica (import('eecircuit-engine')) e acontece apenas na primeira
chamada a run(). O worker também é criado sob demanda. Nenhuma página fora de
/edu/simulador carrega o engine.
Anterior: 01 — Estado atual · Índice: 00 — Introdução · Próximo: 03 — Editor esquemático