From 90bbe2794ff357251d8396ecc5fa0f3afdd9e6a0 Mon Sep 17 00:00:00 2001 From: sfja Date: Wed, 10 Jun 2026 01:26:07 +0200 Subject: [PATCH] add sim --- editor/src/editor/sim.ts | 55 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 editor/src/editor/sim.ts diff --git a/editor/src/editor/sim.ts b/editor/src/editor/sim.ts new file mode 100644 index 0000000..3601605 --- /dev/null +++ b/editor/src/editor/sim.ts @@ -0,0 +1,55 @@ +import * as ir from "./ir"; + +export class Sim { + constructor( + private comp: ir.Component, + private inputs: boolean[], + private outputs: boolean[], + ) {} + + simulate() { + const { comp, inputs, outputs } = this; + + const stmtIdcs = new Map(comp.stmts.map((stmt, i) => [stmt, i])); + const state = new Map(comp.states.map((state) => [state, false])); + + const regs = new Array(comp.stmts.length).fill(false); + + const operation = ( + action: (...ops: boolean[]) => boolean, + ...ops: Ops + ) => action(...ops.map((op) => regs[stmtIdcs.get(op)!])); + + for (const [i, stmt] of comp.stmts.entries()) { + const k = stmt.kind; + switch (k.tag) { + case "Null": + regs[i] = false; + break; + case "Input": + regs[i] = inputs[k.i]; + break; + case "Output": + outputs[k.i] = regs[i]; + break; + case "GetState": + regs[i] = state.get(k.state)!; + break; + case "SetState": + state.set(k.state, regs[i]); + break; + case "Not": + regs[i] = operation((v) => !v, k.op); + break; + case "And": + regs[i] = operation((a, b) => a && b, k.lhs, k.rhs); + break; + case "Or": + regs[i] = operation((a, b) => a || b, k.lhs, k.rhs); + break; + case "Component": + throw new Error("not implemented"); + } + } + } +}