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, executa runSim() 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