@xenolithengine/graph-plugin-runtime 0.7.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +60 -0
- package/dist/editor/output-widget.d.ts +3 -0
- package/dist/editor/output-widget.d.ts.map +1 -0
- package/dist/editor/output-widget.js +43 -0
- package/dist/editor/output-widget.js.map +1 -0
- package/dist/editor/plugin.d.ts +3 -0
- package/dist/editor/plugin.d.ts.map +1 -0
- package/dist/editor/plugin.js +115 -0
- package/dist/editor/plugin.js.map +1 -0
- package/dist/editor/runtime-bridge.d.ts +6 -0
- package/dist/editor/runtime-bridge.d.ts.map +1 -0
- package/dist/editor/runtime-bridge.js +24 -0
- package/dist/editor/runtime-bridge.js.map +1 -0
- package/dist/editor/schema-sync.d.ts +28 -0
- package/dist/editor/schema-sync.d.ts.map +1 -0
- package/dist/editor/schema-sync.js +70 -0
- package/dist/editor/schema-sync.js.map +1 -0
- package/dist/editor/schemas.d.ts +28 -0
- package/dist/editor/schemas.d.ts.map +1 -0
- package/dist/editor/schemas.js +205 -0
- package/dist/editor/schemas.js.map +1 -0
- package/dist/editor/struct-widget.d.ts +37 -0
- package/dist/editor/struct-widget.d.ts.map +1 -0
- package/dist/editor/struct-widget.js +242 -0
- package/dist/editor/struct-widget.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/model/allocate-graph.d.ts +57 -0
- package/dist/model/allocate-graph.d.ts.map +1 -0
- package/dist/model/allocate-graph.js +209 -0
- package/dist/model/allocate-graph.js.map +1 -0
- package/dist/model/allocate.d.ts +3 -0
- package/dist/model/allocate.d.ts.map +1 -0
- package/dist/model/allocate.js +47 -0
- package/dist/model/allocate.js.map +1 -0
- package/dist/model/mandelbrot-graph.d.ts +8 -0
- package/dist/model/mandelbrot-graph.d.ts.map +1 -0
- package/dist/model/mandelbrot-graph.js +146 -0
- package/dist/model/mandelbrot-graph.js.map +1 -0
- package/dist/model/spawn-graph.d.ts +31 -0
- package/dist/model/spawn-graph.d.ts.map +1 -0
- package/dist/model/spawn-graph.js +117 -0
- package/dist/model/spawn-graph.js.map +1 -0
- package/dist/vm/codegen.d.ts +12 -0
- package/dist/vm/codegen.d.ts.map +1 -0
- package/dist/vm/codegen.js +303 -0
- package/dist/vm/codegen.js.map +1 -0
- package/dist/vm/collection.d.ts +8 -0
- package/dist/vm/collection.d.ts.map +1 -0
- package/dist/vm/collection.js +129 -0
- package/dist/vm/collection.js.map +1 -0
- package/dist/vm/compiler.bench.d.ts +2 -0
- package/dist/vm/compiler.bench.d.ts.map +1 -0
- package/dist/vm/compiler.bench.js +35 -0
- package/dist/vm/compiler.bench.js.map +1 -0
- package/dist/vm/compiler.d.ts +14 -0
- package/dist/vm/compiler.d.ts.map +1 -0
- package/dist/vm/compiler.js +190 -0
- package/dist/vm/compiler.js.map +1 -0
- package/dist/vm/interpreter.d.ts +87 -0
- package/dist/vm/interpreter.d.ts.map +1 -0
- package/dist/vm/interpreter.js +155 -0
- package/dist/vm/interpreter.js.map +1 -0
- package/dist/vm/primitives.d.ts +4 -0
- package/dist/vm/primitives.d.ts.map +1 -0
- package/dist/vm/primitives.js +436 -0
- package/dist/vm/primitives.js.map +1 -0
- package/dist/vm/value.d.ts +7 -0
- package/dist/vm/value.d.ts.map +1 -0
- package/dist/vm/value.js +28 -0
- package/dist/vm/value.js.map +1 -0
- package/dist/vm/wasm-codegen.bench.d.ts +2 -0
- package/dist/vm/wasm-codegen.bench.d.ts.map +1 -0
- package/dist/vm/wasm-codegen.bench.js +81 -0
- package/dist/vm/wasm-codegen.bench.js.map +1 -0
- package/dist/vm/wasm-codegen.d.ts +12 -0
- package/dist/vm/wasm-codegen.d.ts.map +1 -0
- package/dist/vm/wasm-codegen.js +352 -0
- package/dist/vm/wasm-codegen.js.map +1 -0
- package/package.json +57 -0
package/dist/vm/value.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// The runtime value model. `exec` is control flow, NOT a value — only data pins carry these.
|
|
2
|
+
// Collections (agents / units / events) are just typed arrays, so the Array primitives apply to all.
|
|
3
|
+
export function asNumber(v) {
|
|
4
|
+
if (typeof v === 'number')
|
|
5
|
+
return Number.isFinite(v) ? v : 0;
|
|
6
|
+
if (typeof v === 'boolean')
|
|
7
|
+
return v ? 1 : 0;
|
|
8
|
+
if (typeof v === 'string') {
|
|
9
|
+
const n = Number(v);
|
|
10
|
+
return Number.isFinite(n) ? n : 0;
|
|
11
|
+
}
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
export function asBool(v) {
|
|
15
|
+
if (typeof v === 'boolean')
|
|
16
|
+
return v;
|
|
17
|
+
if (typeof v === 'number')
|
|
18
|
+
return v !== 0;
|
|
19
|
+
if (typeof v === 'string')
|
|
20
|
+
return v.length > 0;
|
|
21
|
+
if (Array.isArray(v))
|
|
22
|
+
return v.length > 0;
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
export function asArray(v) {
|
|
26
|
+
return Array.isArray(v) ? v : [];
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=value.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value.js","sourceRoot":"","sources":["../../src/vm/value.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,qGAAqG;AAIrG,MAAM,UAAU,QAAQ,CAAC,CAAsB;IAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5D,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;QACnB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACnC,CAAC;IACD,OAAO,CAAC,CAAA;AACV,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,CAAsB;IAC3C,IAAI,OAAO,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,KAAK,CAAC,CAAA;IACzC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACzC,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,CAAsB;IAC5C,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-codegen.bench.d.ts","sourceRoot":"","sources":["../../src/vm/wasm-codegen.bench.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// WASM vs JS-codegen vs interp on a numeric graph. The fairqueue graphs are string-heavy →
|
|
2
|
+
// JS wins there; here we test what WASM was designed for — tight f64 math.
|
|
3
|
+
import { bench, describe } from 'vitest';
|
|
4
|
+
import { Runtime } from './interpreter.js';
|
|
5
|
+
import { BUILTIN_PRIMITIVES } from './primitives.js';
|
|
6
|
+
import { codegen } from './codegen.js';
|
|
7
|
+
import { wasmCodegen } from './wasm-codegen.js';
|
|
8
|
+
const DEFS = [...BUILTIN_PRIMITIVES];
|
|
9
|
+
const ein = (id) => ({ id, kind: 'exec', direction: 'in', type: 'exec' });
|
|
10
|
+
const eout = (id) => ({ id, kind: 'exec', direction: 'out', type: 'exec' });
|
|
11
|
+
const din = (id) => ({ id, kind: 'data', direction: 'in', type: 'scalar' });
|
|
12
|
+
const dout = (id) => ({ id, kind: 'data', direction: 'out', type: 'scalar' });
|
|
13
|
+
const edge = (fn, fp, tn, tp) => ({ from: { node: fn, pin: fp }, to: { node: tn, pin: tp } });
|
|
14
|
+
/** 200-node Add chain: 1+2+3+...+200. Hot-path numeric — WASM territory. */
|
|
15
|
+
function bigAdd() {
|
|
16
|
+
const nodes = [
|
|
17
|
+
{ id: 'tick', type: 'Tick', pins: [eout('out')] },
|
|
18
|
+
{ id: 'c0', type: 'Const', pins: [dout('out')], state: { value: 1 } },
|
|
19
|
+
];
|
|
20
|
+
const edges = [];
|
|
21
|
+
let prev = 'c0';
|
|
22
|
+
for (let i = 1; i < 200; i++) {
|
|
23
|
+
const cId = `c${i}`, aId = `a${i}`;
|
|
24
|
+
nodes.push({ id: cId, type: 'Const', pins: [dout('out')], state: { value: i + 1 } });
|
|
25
|
+
nodes.push({ id: aId, type: 'Add', pins: [din('a'), din('b'), dout('out')] });
|
|
26
|
+
edges.push(edge(prev, 'out', aId, 'a'));
|
|
27
|
+
edges.push(edge(cId, 'out', aId, 'b'));
|
|
28
|
+
prev = aId;
|
|
29
|
+
}
|
|
30
|
+
nodes.push({ id: 'sv', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'sum' } });
|
|
31
|
+
edges.push(edge('tick', 'out', 'sv', 'in'));
|
|
32
|
+
edges.push(edge(prev, 'out', 'sv', 'v'));
|
|
33
|
+
return { nodes, edges };
|
|
34
|
+
}
|
|
35
|
+
/** Mixed math: 100 nodes of alternating Add/Mul/Sub/Floor. Closer to a real DSP/ML inner loop. */
|
|
36
|
+
function mixedMath() {
|
|
37
|
+
const nodes = [
|
|
38
|
+
{ id: 'tick', type: 'Tick', pins: [eout('out')] },
|
|
39
|
+
{ id: 'getX', type: 'GetVar', pins: [dout('out')], state: { name: 'x' } },
|
|
40
|
+
];
|
|
41
|
+
const edges = [];
|
|
42
|
+
let prev = 'getX';
|
|
43
|
+
for (let i = 0; i < 100; i++) {
|
|
44
|
+
const op = ['Add', 'Mul', 'Sub', 'Floor'][i % 4];
|
|
45
|
+
const cId = `c${i}`, nId = `n${i}`;
|
|
46
|
+
if (op === 'Floor') {
|
|
47
|
+
nodes.push({ id: nId, type: 'Floor', pins: [din('n'), dout('out')] });
|
|
48
|
+
edges.push(edge(prev, 'out', nId, 'n'));
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
nodes.push({ id: cId, type: 'Const', pins: [dout('out')], state: { value: 1.0001 } });
|
|
52
|
+
nodes.push({ id: nId, type: op, pins: [din('a'), din('b'), dout('out')] });
|
|
53
|
+
edges.push(edge(prev, 'out', nId, 'a'));
|
|
54
|
+
edges.push(edge(cId, 'out', nId, 'b'));
|
|
55
|
+
}
|
|
56
|
+
prev = nId;
|
|
57
|
+
}
|
|
58
|
+
nodes.push({ id: 'sv', type: 'SetVar', pins: [ein('in'), din('v'), eout('out')], state: { name: 'x' } });
|
|
59
|
+
edges.push(edge('tick', 'out', 'sv', 'in'));
|
|
60
|
+
edges.push(edge(prev, 'out', 'sv', 'v'));
|
|
61
|
+
return { nodes, edges };
|
|
62
|
+
}
|
|
63
|
+
describe('200-node Add chain — interp vs JS codegen vs WASM', () => {
|
|
64
|
+
const G = bigAdd();
|
|
65
|
+
const rt = new Runtime(DEFS);
|
|
66
|
+
const cg = codegen(G, DEFS);
|
|
67
|
+
const wg = wasmCodegen(G, DEFS);
|
|
68
|
+
bench('interp', () => { rt.tick(G); });
|
|
69
|
+
bench('codegen-js', () => { cg.tick(); });
|
|
70
|
+
bench('codegen-wasm', () => { wg.tick(); });
|
|
71
|
+
});
|
|
72
|
+
describe('100-node mixed math (Add/Mul/Sub/Floor) — interp vs JS codegen vs WASM', () => {
|
|
73
|
+
const G = mixedMath();
|
|
74
|
+
const rt = new Runtime(DEFS);
|
|
75
|
+
const cg = codegen(G, DEFS);
|
|
76
|
+
const wg = wasmCodegen(G, DEFS);
|
|
77
|
+
bench('interp', () => { rt.tick(G); });
|
|
78
|
+
bench('codegen-js', () => { cg.tick(); });
|
|
79
|
+
bench('codegen-wasm', () => { wg.tick(); });
|
|
80
|
+
});
|
|
81
|
+
//# sourceMappingURL=wasm-codegen.bench.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-codegen.bench.js","sourceRoot":"","sources":["../../src/vm/wasm-codegen.bench.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { RtGraph, NodeDef } from './interpreter.js';
|
|
2
|
+
export declare function canCompileToWasm(graph: RtGraph): boolean;
|
|
3
|
+
export interface WasmGraph {
|
|
4
|
+
tick(entryType?: string): void;
|
|
5
|
+
getVar(name: string): number | undefined;
|
|
6
|
+
setVar(name: string, value: number): void;
|
|
7
|
+
reset(): void;
|
|
8
|
+
/** Raw module bytes — handy for the test/bench to assert "we actually emitted WASM". */
|
|
9
|
+
readonly bytes: Uint8Array;
|
|
10
|
+
}
|
|
11
|
+
export declare function wasmCodegen(graph: RtGraph, _defs: ReadonlyArray<NodeDef>): WasmGraph;
|
|
12
|
+
//# sourceMappingURL=wasm-codegen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-codegen.d.ts","sourceRoot":"","sources":["../../src/vm/wasm-codegen.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,OAAO,EAAiB,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAuMvE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAGxD;AAID,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC9B,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACxC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACzC,KAAK,IAAI,IAAI,CAAA;IACb,wFAAwF;IACxF,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAA;CAC3B;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CA4FpF"}
|
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
// Phase 3 — WebAssembly code generator. Emits a raw WASM binary (no deps, no wabt) for the
|
|
2
|
+
// NUMERIC SUBSET of the IR: graphs whose vars + edges carry f64 only and whose nodes are
|
|
3
|
+
// drawn from {Tick, Sequence, SetVar, GetVar, Const, Add, Sub, Mul, Floor, Gt, Gte, Eq}.
|
|
4
|
+
//
|
|
5
|
+
// Why numeric-only: WASM has no native strings/arrays/objects. GC-types exist but the JS
|
|
6
|
+
// interop bridge eats most of the speedup. For audio DSP, ML inference, particle systems —
|
|
7
|
+
// graphs where the hot path is f64 math — WASM JITs to near-native code. Mixed graphs (the
|
|
8
|
+
// current fairqueue/spawn) should keep using `codegen.ts` (the JS path).
|
|
9
|
+
//
|
|
10
|
+
// Equivalence + bench live in `wasm-codegen.test.ts` / `wasm-codegen.bench.ts`.
|
|
11
|
+
const dataIns = (n) => n.pins.filter((p) => p.kind === 'data' && p.direction === 'in');
|
|
12
|
+
const dataOuts = (n) => n.pins.filter((p) => p.kind === 'data' && p.direction === 'out');
|
|
13
|
+
const execOuts = (n) => n.pins.filter((p) => p.kind === 'exec' && p.direction === 'out');
|
|
14
|
+
function buildIR(graph) {
|
|
15
|
+
const nodes = graph.nodes.map((n, i) => ({
|
|
16
|
+
id: n.id, type: n.type, index: i, state: n.state,
|
|
17
|
+
dataIns: dataIns(n), dataOuts: dataOuts(n), execOuts: execOuts(n),
|
|
18
|
+
incoming: [], execTarget: [],
|
|
19
|
+
}));
|
|
20
|
+
const byId = new Map(nodes.map((n) => [n.id, n]));
|
|
21
|
+
for (const n of nodes) {
|
|
22
|
+
n.incoming = new Array(n.dataIns.length).fill(null);
|
|
23
|
+
n.execTarget = new Array(n.execOuts.length).fill(-1);
|
|
24
|
+
}
|
|
25
|
+
for (const e of graph.edges) {
|
|
26
|
+
const dst = byId.get(e.to.node);
|
|
27
|
+
const src = byId.get(e.from.node);
|
|
28
|
+
if (!dst || !src)
|
|
29
|
+
continue;
|
|
30
|
+
const inIdx = dst.dataIns.findIndex((p) => p.id === e.to.pin);
|
|
31
|
+
const outIdx = src.dataOuts.findIndex((p) => p.id === e.from.pin);
|
|
32
|
+
if (inIdx >= 0 && outIdx >= 0 && dst.incoming[inIdx] === null)
|
|
33
|
+
dst.incoming[inIdx] = { srcIdx: src.index, outIdx };
|
|
34
|
+
const eOut = src.execOuts.findIndex((p) => p.id === e.from.pin);
|
|
35
|
+
if (eOut >= 0)
|
|
36
|
+
src.execTarget[eOut] = dst.index;
|
|
37
|
+
}
|
|
38
|
+
const varIndex = new Map();
|
|
39
|
+
for (const n of nodes) {
|
|
40
|
+
if ((n.type === 'GetVar' || n.type === 'SetVar') && typeof n.state?.['name'] === 'string') {
|
|
41
|
+
const name = n.state['name'];
|
|
42
|
+
if (!varIndex.has(name))
|
|
43
|
+
varIndex.set(name, varIndex.size);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const entriesByType = new Map();
|
|
47
|
+
for (const n of nodes) {
|
|
48
|
+
if (n.type !== 'Tick' && n.type !== 'Init')
|
|
49
|
+
continue;
|
|
50
|
+
const arr = entriesByType.get(n.type) ?? [];
|
|
51
|
+
arr.push(n.index);
|
|
52
|
+
entriesByType.set(n.type, arr);
|
|
53
|
+
}
|
|
54
|
+
return { nodes, varIndex, entriesByType };
|
|
55
|
+
}
|
|
56
|
+
// --- binary builder -----------------------------------------------------------------------------
|
|
57
|
+
/** Minimal raw WASM emitter — we only ever produce the bytes we actually use here, no general
|
|
58
|
+
* WAT assembler. ULEB128 for unsigned ints + section framing per the WebAssembly 1.0 spec. */
|
|
59
|
+
class WB {
|
|
60
|
+
bytes = [];
|
|
61
|
+
u8(b) { this.bytes.push(b & 0xff); }
|
|
62
|
+
bytesRaw(arr) { for (const b of arr)
|
|
63
|
+
this.u8(b); }
|
|
64
|
+
uleb(n) { while (n >= 0x80) {
|
|
65
|
+
this.u8((n & 0x7f) | 0x80);
|
|
66
|
+
n >>>= 7;
|
|
67
|
+
} this.u8(n & 0x7f); }
|
|
68
|
+
// signed LEB128 (used for i32.const operand — unused here but kept for completeness)
|
|
69
|
+
sleb(n) { let more = true; while (more) {
|
|
70
|
+
const b = n & 0x7f;
|
|
71
|
+
n >>= 7;
|
|
72
|
+
const sign = b & 0x40;
|
|
73
|
+
if ((n === 0 && !sign) || (n === -1 && sign))
|
|
74
|
+
more = false;
|
|
75
|
+
else
|
|
76
|
+
this.u8(b | 0x80);
|
|
77
|
+
if (!more)
|
|
78
|
+
this.u8(b);
|
|
79
|
+
} }
|
|
80
|
+
f64(x) { const a = new ArrayBuffer(8); new DataView(a).setFloat64(0, x, true); const u = new Uint8Array(a); for (let i = 0; i < 8; i++)
|
|
81
|
+
this.u8(u[i]); }
|
|
82
|
+
/** Wrap `inner` as a length-prefixed payload. Used for sections + function bodies. */
|
|
83
|
+
section(id, inner) {
|
|
84
|
+
this.u8(id);
|
|
85
|
+
this.uleb(inner.bytes.length);
|
|
86
|
+
this.bytesRaw(inner.bytes);
|
|
87
|
+
}
|
|
88
|
+
result() { return new Uint8Array(this.bytes); }
|
|
89
|
+
}
|
|
90
|
+
// WASM opcodes used here. Spec section 5.4.
|
|
91
|
+
const OP = {
|
|
92
|
+
END: 0x0b,
|
|
93
|
+
LOCAL_GET: 0x20, LOCAL_SET: 0x21,
|
|
94
|
+
I32_CONST: 0x41, I32_ADD: 0x6a,
|
|
95
|
+
F64_LOAD: 0x2b, F64_STORE: 0x39, F64_CONST: 0x44,
|
|
96
|
+
F64_ADD: 0xa0, F64_SUB: 0xa1, F64_MUL: 0xa2, F64_DIV: 0xa3,
|
|
97
|
+
F64_FLOOR: 0x9c,
|
|
98
|
+
F64_EQ: 0x61, F64_NE: 0x62, F64_LT: 0x63, F64_GT: 0x64, F64_LE: 0x65, F64_GE: 0x66,
|
|
99
|
+
CALL: 0x10,
|
|
100
|
+
};
|
|
101
|
+
// --- emitters -----------------------------------------------------------------------------------
|
|
102
|
+
/** Numeric primitives are emitted as a postorder bytecode stream (WASM is a stack machine).
|
|
103
|
+
* Each pure pull pushes one f64 onto the value stack; each exec node consumes its inputs +
|
|
104
|
+
* optionally calls another node fn (for Sequence-style flow). */
|
|
105
|
+
function emitPullExpr(ir, n, outIdx, code) {
|
|
106
|
+
switch (n.type) {
|
|
107
|
+
case 'Const': {
|
|
108
|
+
const v = n.state?.['value'];
|
|
109
|
+
code.u8(OP.F64_CONST);
|
|
110
|
+
code.f64(typeof v === 'number' ? v : 0);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
case 'GetVar': {
|
|
114
|
+
const name = n.state?.['name'];
|
|
115
|
+
if (typeof name !== 'string') {
|
|
116
|
+
code.u8(OP.F64_CONST);
|
|
117
|
+
code.f64(0);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
const vi = ir.varIndex.get(name) ?? -1;
|
|
121
|
+
if (vi < 0) {
|
|
122
|
+
code.u8(OP.F64_CONST);
|
|
123
|
+
code.f64(0);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
// address = vi * 8, then f64.load align=3 offset=0
|
|
127
|
+
code.u8(OP.I32_CONST);
|
|
128
|
+
code.uleb(vi * 8);
|
|
129
|
+
code.u8(OP.F64_LOAD);
|
|
130
|
+
code.u8(3);
|
|
131
|
+
code.uleb(0);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
case 'Add':
|
|
135
|
+
case 'Sub':
|
|
136
|
+
case 'Mul': {
|
|
137
|
+
pullInput(ir, n, 0, code);
|
|
138
|
+
pullInput(ir, n, 1, code);
|
|
139
|
+
code.u8(n.type === 'Add' ? OP.F64_ADD : n.type === 'Sub' ? OP.F64_SUB : OP.F64_MUL);
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
case 'Floor': {
|
|
143
|
+
pullInput(ir, n, 0, code);
|
|
144
|
+
code.u8(OP.F64_FLOOR);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
case 'Gt':
|
|
148
|
+
case 'Gte':
|
|
149
|
+
case 'Eq': {
|
|
150
|
+
// i32 (0/1) → re-extend to f64 via conversion (WASM has no direct bool-to-f64 instr;
|
|
151
|
+
// use f64.convert_i32_s = 0xb7). Cheap: bools live as 0.0/1.0 in our model.
|
|
152
|
+
pullInput(ir, n, 0, code);
|
|
153
|
+
pullInput(ir, n, 1, code);
|
|
154
|
+
code.u8(n.type === 'Gt' ? OP.F64_GT : n.type === 'Gte' ? OP.F64_GE : OP.F64_EQ);
|
|
155
|
+
code.u8(0xb7); // f64.convert_i32_s
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
default:
|
|
159
|
+
// Unsupported pure node — push 0 to keep stack consistent. The graph-validity check at
|
|
160
|
+
// compile() time refuses to emit if any non-numeric primitive is used, so this is just
|
|
161
|
+
// a safety net.
|
|
162
|
+
code.u8(OP.F64_CONST);
|
|
163
|
+
code.f64(0);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
function pullInput(ir, n, i, code) {
|
|
167
|
+
const inc = n.incoming[i];
|
|
168
|
+
if (!inc) {
|
|
169
|
+
code.u8(OP.F64_CONST);
|
|
170
|
+
code.f64(0);
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
emitPullExpr(ir, ir.nodes[inc.srcIdx], inc.outIdx, code);
|
|
174
|
+
}
|
|
175
|
+
/** A per-node function body: SetVar/Sequence/Tick. Pure nodes are inlined into their consumers,
|
|
176
|
+
* so only exec nodes get a function slot. Body byte sequence assumes locals = [] and arity () → ().
|
|
177
|
+
* All function bodies end with `OP.END` and have a leading u32 for "number of local-decl groups"
|
|
178
|
+
* (always 0 here — no locals). */
|
|
179
|
+
function emitNodeBody(ir, n, fnIdxOf) {
|
|
180
|
+
const code = new WB();
|
|
181
|
+
code.uleb(0); // local-decl group count
|
|
182
|
+
switch (n.type) {
|
|
183
|
+
case 'Tick':
|
|
184
|
+
case 'Init': {
|
|
185
|
+
const t = n.execTarget[0];
|
|
186
|
+
if (t !== undefined && t >= 0) {
|
|
187
|
+
const fnIdx = fnIdxOf.get(t);
|
|
188
|
+
if (fnIdx !== undefined) {
|
|
189
|
+
code.u8(OP.CALL);
|
|
190
|
+
code.uleb(fnIdx);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
break;
|
|
194
|
+
}
|
|
195
|
+
case 'Sequence': {
|
|
196
|
+
for (let i = 0; i < n.execTarget.length; i++) {
|
|
197
|
+
const t = n.execTarget[i];
|
|
198
|
+
if (t === undefined || t < 0)
|
|
199
|
+
continue;
|
|
200
|
+
const fnIdx = fnIdxOf.get(t);
|
|
201
|
+
if (fnIdx !== undefined) {
|
|
202
|
+
code.u8(OP.CALL);
|
|
203
|
+
code.uleb(fnIdx);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
break;
|
|
207
|
+
}
|
|
208
|
+
case 'SetVar': {
|
|
209
|
+
const name = n.state?.['name'];
|
|
210
|
+
if (typeof name === 'string') {
|
|
211
|
+
const vi = ir.varIndex.get(name) ?? -1;
|
|
212
|
+
if (vi >= 0) {
|
|
213
|
+
// address = vi * 8 (i32)
|
|
214
|
+
code.u8(OP.I32_CONST);
|
|
215
|
+
code.uleb(vi * 8);
|
|
216
|
+
// value (f64) from input 0
|
|
217
|
+
pullInput(ir, n, 0, code);
|
|
218
|
+
// store: align=3 (8-byte aligned), offset=0
|
|
219
|
+
code.u8(OP.F64_STORE);
|
|
220
|
+
code.u8(3);
|
|
221
|
+
code.uleb(0);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
// chain flow
|
|
225
|
+
const t = n.execTarget[0];
|
|
226
|
+
if (t !== undefined && t >= 0) {
|
|
227
|
+
const fnIdx = fnIdxOf.get(t);
|
|
228
|
+
if (fnIdx !== undefined) {
|
|
229
|
+
code.u8(OP.CALL);
|
|
230
|
+
code.uleb(fnIdx);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
break;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
code.u8(OP.END);
|
|
237
|
+
return code.result();
|
|
238
|
+
}
|
|
239
|
+
// --- the supported-set guard ---------------------------------------------------------------------
|
|
240
|
+
const SUPPORTED = new Set([
|
|
241
|
+
'Tick', 'Init', 'Sequence', 'SetVar',
|
|
242
|
+
'GetVar', 'Const', 'Add', 'Sub', 'Mul', 'Floor', 'Gt', 'Gte', 'Eq',
|
|
243
|
+
]);
|
|
244
|
+
export function canCompileToWasm(graph) {
|
|
245
|
+
for (const n of graph.nodes)
|
|
246
|
+
if (!SUPPORTED.has(n.type))
|
|
247
|
+
return false;
|
|
248
|
+
return true;
|
|
249
|
+
}
|
|
250
|
+
export function wasmCodegen(graph, _defs) {
|
|
251
|
+
if (!canCompileToWasm(graph))
|
|
252
|
+
throw new Error('wasmCodegen: graph uses non-numeric primitives — keep on the JS codegen path');
|
|
253
|
+
const ir = buildIR(graph);
|
|
254
|
+
// Collect impure nodes that need a function slot.
|
|
255
|
+
const execNodes = ir.nodes.filter((n) => n.type === 'Tick' || n.type === 'Init' || n.type === 'Sequence' || n.type === 'SetVar');
|
|
256
|
+
const fnIdxOf = new Map();
|
|
257
|
+
execNodes.forEach((n, i) => fnIdxOf.set(n.index, i));
|
|
258
|
+
// Build the module: one type ((func)), N funcs, 1 memory exported, one tick export per entry
|
|
259
|
+
// (we collapse all entries into a single tick fn for simplicity — entries by type fire in order).
|
|
260
|
+
const module = new WB();
|
|
261
|
+
// Magic + version
|
|
262
|
+
module.bytesRaw([0x00, 0x61, 0x73, 0x6d, 0x01, 0x00, 0x00, 0x00]);
|
|
263
|
+
// ---- section 1: types ----
|
|
264
|
+
// Only one type: () -> ()
|
|
265
|
+
const typeSec = new WB();
|
|
266
|
+
typeSec.uleb(1); // num types
|
|
267
|
+
typeSec.u8(0x60);
|
|
268
|
+
typeSec.uleb(0);
|
|
269
|
+
typeSec.uleb(0); // (func [] -> [])
|
|
270
|
+
module.section(1, typeSec);
|
|
271
|
+
// ---- section 3: functions ----
|
|
272
|
+
// N functions, all of type 0
|
|
273
|
+
const funcSec = new WB();
|
|
274
|
+
funcSec.uleb(execNodes.length);
|
|
275
|
+
for (let i = 0; i < execNodes.length; i++)
|
|
276
|
+
funcSec.uleb(0);
|
|
277
|
+
module.section(3, funcSec);
|
|
278
|
+
// ---- section 5: memory ----
|
|
279
|
+
// 1 page initial, no max
|
|
280
|
+
const memSec = new WB();
|
|
281
|
+
memSec.uleb(1);
|
|
282
|
+
memSec.u8(0x00);
|
|
283
|
+
memSec.uleb(1);
|
|
284
|
+
module.section(5, memSec);
|
|
285
|
+
// ---- section 7: exports ----
|
|
286
|
+
// Export every entry-node fn under names "tick", "tick1", ... + "memory".
|
|
287
|
+
// For prototype, callers only invoke "tick".
|
|
288
|
+
const tickIdxs = [];
|
|
289
|
+
for (const [, idxs] of ir.entriesByType)
|
|
290
|
+
for (const ni of idxs) {
|
|
291
|
+
const fi = fnIdxOf.get(ni);
|
|
292
|
+
if (fi !== undefined)
|
|
293
|
+
tickIdxs.push(fi);
|
|
294
|
+
}
|
|
295
|
+
const exportSec = new WB();
|
|
296
|
+
const exportCount = tickIdxs.length + 1; // +1 for memory
|
|
297
|
+
exportSec.uleb(exportCount);
|
|
298
|
+
for (let i = 0; i < tickIdxs.length; i++) {
|
|
299
|
+
const name = i === 0 ? 'tick' : `tick${i}`;
|
|
300
|
+
const nameBytes = new TextEncoder().encode(name);
|
|
301
|
+
exportSec.uleb(nameBytes.length);
|
|
302
|
+
exportSec.bytesRaw(Array.from(nameBytes));
|
|
303
|
+
exportSec.u8(0x00);
|
|
304
|
+
exportSec.uleb(tickIdxs[i]);
|
|
305
|
+
}
|
|
306
|
+
const mem = new TextEncoder().encode('memory');
|
|
307
|
+
exportSec.uleb(mem.length);
|
|
308
|
+
exportSec.bytesRaw(Array.from(mem));
|
|
309
|
+
exportSec.u8(0x02);
|
|
310
|
+
exportSec.uleb(0);
|
|
311
|
+
module.section(7, exportSec);
|
|
312
|
+
// ---- section 10: code ----
|
|
313
|
+
const codeSec = new WB();
|
|
314
|
+
codeSec.uleb(execNodes.length);
|
|
315
|
+
for (const n of execNodes) {
|
|
316
|
+
const body = emitNodeBody(ir, n, fnIdxOf);
|
|
317
|
+
codeSec.uleb(body.length);
|
|
318
|
+
codeSec.bytesRaw(Array.from(body));
|
|
319
|
+
}
|
|
320
|
+
module.section(10, codeSec);
|
|
321
|
+
const bytes = module.result();
|
|
322
|
+
// `BufferSource` in the DOM lib is strict about ArrayBuffer (not SharedArrayBuffer); our bytes
|
|
323
|
+
// come from a fresh Uint8Array so the buffer is always plain — cast through `as BufferSource`.
|
|
324
|
+
const wasmMod = new WebAssembly.Module(bytes);
|
|
325
|
+
const instance = new WebAssembly.Instance(wasmMod, {});
|
|
326
|
+
const exports = instance.exports;
|
|
327
|
+
const view = new DataView(exports.memory.buffer);
|
|
328
|
+
const callTick = (entryType) => {
|
|
329
|
+
// First tick exported is always 'tick'; additional are tick1/tick2... but for typical use
|
|
330
|
+
// entries are of one type ('Tick'), so just call it.
|
|
331
|
+
if (entryType === 'Init' && typeof exports['init'] === 'function')
|
|
332
|
+
exports['init']();
|
|
333
|
+
else if (typeof exports['tick'] === 'function')
|
|
334
|
+
exports['tick']();
|
|
335
|
+
};
|
|
336
|
+
return {
|
|
337
|
+
bytes,
|
|
338
|
+
tick(entryType = 'Tick') { callTick(entryType); },
|
|
339
|
+
getVar(name) { const vi = ir.varIndex.get(name); return vi === undefined ? undefined : view.getFloat64(vi * 8, true); },
|
|
340
|
+
setVar(name, value) {
|
|
341
|
+
let vi = ir.varIndex.get(name);
|
|
342
|
+
if (vi === undefined) {
|
|
343
|
+
vi = ir.varIndex.size;
|
|
344
|
+
ir.varIndex.set(name, vi);
|
|
345
|
+
}
|
|
346
|
+
view.setFloat64(vi * 8, value, true);
|
|
347
|
+
},
|
|
348
|
+
reset() { for (let i = 0; i < ir.varIndex.size * 8; i += 8)
|
|
349
|
+
view.setFloat64(i, 0, true); },
|
|
350
|
+
};
|
|
351
|
+
}
|
|
352
|
+
//# sourceMappingURL=wasm-codegen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm-codegen.js","sourceRoot":"","sources":["../../src/vm/wasm-codegen.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@xenolithengine/graph-plugin-runtime",
|
|
3
|
+
"version": "0.7.0-beta.0",
|
|
4
|
+
"description": "Blueprint-style node runtime for XenolithGraph: typed exec/data primitives + a headless interpreter that runs a graph as a simulation. Installs as an editor plugin.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@xenolithengine/graph-core": "0.7.0-beta.0",
|
|
23
|
+
"@xenolithengine/graph-editor": "0.7.0-beta.0"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.7.0",
|
|
27
|
+
"vitest": "^3.0.0"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"node-editor",
|
|
31
|
+
"runtime",
|
|
32
|
+
"blueprint",
|
|
33
|
+
"executor",
|
|
34
|
+
"dataflow"
|
|
35
|
+
],
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public"
|
|
38
|
+
},
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/XenolithEngine/xenolith-graph.git",
|
|
42
|
+
"directory": "packages/plugin-runtime"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://xenolithengine.github.io/xenolith-graph/",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/XenolithEngine/xenolith-graph/issues"
|
|
47
|
+
},
|
|
48
|
+
"author": "XenolithEngine",
|
|
49
|
+
"scripts": {
|
|
50
|
+
"build": "tsc -b",
|
|
51
|
+
"dev": "tsc -b --watch",
|
|
52
|
+
"test": "vitest run",
|
|
53
|
+
"test:watch": "vitest",
|
|
54
|
+
"lint": "eslint src",
|
|
55
|
+
"typecheck": "tsc --noEmit"
|
|
56
|
+
}
|
|
57
|
+
}
|