add sim
This commit is contained in:
parent
54e82d4a8d
commit
90bbe2794f
55
editor/src/editor/sim.ts
Normal file
55
editor/src/editor/sim.ts
Normal file
@ -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<boolean>(comp.stmts.length).fill(false);
|
||||||
|
|
||||||
|
const operation = <Ops extends ir.Stmt[]>(
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user