@mica-js/compiler 0.0.0-stage → 0.2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/values.ts","../src/analysis.ts","../src/metadata.ts","../src/compiler.ts","../src/direct-jit.ts"],"sourcesContent":["import type { ReactionFrame, ExecutionSignal } from './types.js';\n\n/** Nominal enum identity is validated statically; runtime values are member names. */\nexport type EnumValue = string;\n\nexport function createEnum(_name: string, member: string): EnumValue {\n return member;\n}\n\nexport function createRecord(\n fields: readonly (readonly [string, unknown])[],\n): Readonly<Record<string, unknown>> {\n return Object.freeze(Object.fromEntries(fields));\n}\n\nexport function createBytes(elements: readonly unknown[]): Uint8Array {\n const bytes = new Uint8Array(elements.length);\n for (let index = 0; index < elements.length; index++) {\n const value = elements[index];\n if (typeof value !== 'number' || !Number.isInteger(value)) {\n throw new TypeError('Byte value must be an integer number');\n }\n if (value < 0 || value > 255) throw new RangeError('Byte value must be in [0, 255]');\n bytes[index] = value;\n }\n return bytes;\n}\n\nexport function combineIntents(values: readonly unknown[]): readonly unknown[] {\n const branches: unknown[] = [];\n for (const value of values) {\n if (Array.isArray(value)) {\n for (const branch of value) branches.push(branch);\n } else branches.push(value);\n }\n return Object.freeze(branches);\n}\n\n/** Structural comparison deliberately does not shortcut identical objects containing NaN. */\nexport function equalValues(left: unknown, right: unknown): boolean {\n if (left === null || right === null || typeof left !== 'object' || typeof right !== 'object') {\n return left === right;\n }\n if (isByteSequence(left) || isByteSequence(right)) {\n if (!isByteSequence(left) || !isByteSequence(right) || left.length !== right.length)\n return false;\n for (let i = 0; i < left.length; i++) {\n if (left[i] !== right[i]) return false;\n }\n return true;\n }\n const a = left as Record<string, unknown>;\n const b = right as Record<string, unknown>;\n const keys = Object.keys(a);\n if (keys.length !== Object.keys(b).length) return false;\n for (const key of keys) {\n if (!Object.hasOwn(b, key) || !equalValues(a[key], b[key])) return false;\n }\n return true;\n}\n\nfunction isByteSequence(\n value: object,\n): value is { readonly length: number; readonly [index: number]: number } {\n return (\n Array.isArray(value) ||\n ArrayBuffer.isView(value) ||\n ('length' in value && Symbol.iterator in value)\n );\n}\n\nexport function readIndex(value: string | ArrayLike<number>, index: unknown): string | number {\n if (typeof index !== 'number' || !Number.isSafeInteger(index)) {\n throw new TypeError('Index must be a safe integer number');\n }\n if (index < 0 || index >= value.length) throw new RangeError('Index is outside the value');\n return value[index]!;\n}\n\nexport function nonNull(value: unknown): unknown {\n if (value === null) throw new TypeError('Expected a non-null value');\n return value;\n}\n\nexport function checkBoolean(value: unknown): boolean {\n if (typeof value !== 'boolean') throw new TypeError('Condition must be a boolean');\n return value;\n}\n\nexport function checkDuration(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value) || !Number.isInteger(value)) {\n throw new TypeError('Duration must be a finite integer number');\n }\n if (value < 0 || value > 7_200_000_000_000_000) {\n throw new RangeError('Duration must be in [0, 7200000000000000] picoseconds');\n }\n return value;\n}\n\nexport function checkPc(value: unknown): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new TypeError('Redirect target must be a finite number');\n }\n return value;\n}\n\nexport function reactionValue(\n frame: ReactionFrame | undefined,\n binding: 'previous' | 'current',\n): unknown {\n if (!frame) throw new TypeError('Reaction value requires a reaction frame');\n return frame[binding];\n}\n\nexport function reactionCapture(frame: ReactionFrame | undefined, index: number): unknown {\n if (!frame || index >= frame.captures.length) {\n throw new RangeError('Reaction capture is not available');\n }\n return frame.captures[index];\n}\n\nconst terminated = Symbol('terminated call');\n\n/** Propagate terminal control across yield* even if a driver mistakenly resumes it. */\nfunction* delegate(\n generator: Generator<ExecutionSignal, unknown, unknown>,\n): Generator<ExecutionSignal, unknown, unknown> {\n let done = false;\n try {\n let step = generator.next();\n while (!step.done) {\n const signal = step.value;\n const input: unknown = yield signal;\n if (signal.kind === 'stop' || signal.kind === 'redirect') return terminated;\n step = generator.next(input);\n }\n done = true;\n return step.value;\n } finally {\n if (!done) generator.return(undefined);\n }\n}\n\nexport const runtimeHelpers = Object.freeze({\n createEnum,\n createRecord,\n createBytes,\n combineIntents,\n equalValues,\n readIndex,\n nonNull,\n checkBoolean,\n checkDuration,\n checkPc,\n reactionValue,\n reactionCapture,\n delegate,\n terminated,\n});\n","import type {\n InputPath,\n OperationIR,\n RegionIR,\n SourceInfo,\n ValueTypeIR,\n} from '@mica-js/device-model';\nimport type {\n BasicBlock,\n CompileOptions,\n ControlEdge,\n EdgeKind,\n EffectMetadata,\n InternalGraph,\n InternalAttribute,\n InternalRegion,\n OperationEffects,\n OptimizationMetadata,\n} from './types.js';\n\nexport type Primitive = number | boolean | string | null;\ninterface Block {\n id: number;\n region: number;\n role: BasicBlock['role'];\n position: number | null;\n uses: Set<string>;\n definitions: Set<string>;\n liveIn: Set<string>;\n liveOut: Set<string>;\n}\ninterface Region {\n id: number;\n parent: number | null;\n path: InputPath;\n entry: number;\n exit: number;\n nodes: Node[];\n}\nexport interface Node {\n operation: OperationIR;\n position: number;\n block: number;\n region: number;\n path: InputPath;\n source?: SourceInfo;\n inputs: readonly number[];\n effects: OperationEffects;\n children: Map<string, Region>;\n definitionBlock: number;\n resumeBlock?: number;\n completionBlock?: number;\n failureBlock?: number;\n}\ninterface Context {\n breakTo?: number;\n continueTo?: number;\n yieldTo?: number;\n}\nexport interface BodyAnalysis {\n nodes: readonly Node[];\n byOperation: ReadonlyMap<OperationIR, Node>;\n graph: InternalGraph;\n folded: ReadonlyMap<number, Primitive>;\n constants: ReadonlyMap<number, Primitive>;\n eliminated: ReadonlySet<number>;\n effects: EffectMetadata;\n resources: readonly string[];\n optimizations: OptimizationMetadata;\n}\n\nexport function sourceSnapshot(source: SourceInfo): SourceInfo {\n return source.uri === undefined\n ? Object.freeze({ ...source })\n : Object.freeze({\n ...source,\n range: Object.freeze({\n start: Object.freeze({ ...source.range.start }),\n end: Object.freeze({ ...source.range.end }),\n }),\n });\n}\nexport function typeSnapshot(type: ValueTypeIR): ValueTypeIR {\n return type.kind === 'optional'\n ? Object.freeze({ ...type, inner: Object.freeze({ ...type.inner }) })\n : Object.freeze({ ...type });\n}\n\nexport function inputs(op: OperationIR): readonly number[] {\n switch (op.kind) {\n case 'unary':\n case 'field':\n case 'length':\n case 'optional':\n case 'isNone':\n case 'nonNull':\n case 'localWrite':\n case 'write':\n case 'writeIntent':\n case 'send':\n case 'match':\n case 'returnValue':\n case 'yield':\n return [op.value];\n case 'binary':\n return [op.left, op.right];\n case 'numeric':\n return [...op.args];\n case 'record':\n return op.fields.map((field) => field.value);\n case 'bytes':\n return [...op.elements];\n case 'index':\n return [op.value, op.index];\n case 'local':\n return [op.initial];\n case 'load8':\n case 'load16le':\n case 'load16be':\n case 'load32le':\n case 'load32be':\n return [op.offset];\n case 'store8':\n case 'store16le':\n case 'store16be':\n case 'store32le':\n case 'store32be':\n return [op.offset, op.value];\n case 'copyBytes':\n return [op.offset, op.length];\n case 'resistor':\n return [op.resistance];\n case 'combineIntents':\n return [...op.values];\n case 'call':\n case 'callValue':\n return op.args.flatMap((arg) => (arg.kind === 'value' ? [arg.value] : []));\n case 'if':\n case 'select':\n case 'assert':\n return [op.condition];\n case 'and':\n case 'or':\n return [op.left];\n case 'wait':\n case 'elapse':\n return [op.duration];\n case 'redirect':\n return [op.target, op.delay];\n default:\n return [];\n }\n}\n\nexport function argumentUses(op: OperationIR): readonly string[] {\n const uses: string[] = [];\n const ref = (input: { kind: string; index?: number }): void => {\n if (input.kind === 'parameter') uses.push(`argument:${input.index}`);\n };\n if ('memory' in op) ref(op.memory);\n if ('pin' in op) ref(op.pin);\n if (op.kind === 'resistor') ref(op.to);\n if (op.kind === 'refEqual') {\n ref(op.left);\n ref(op.right);\n }\n if (op.kind === 'call' || op.kind === 'callValue')\n op.args.forEach((arg) => {\n if (arg.kind !== 'value') ref(arg);\n });\n if (op.kind === 'parameter') uses.push(`argument:${op.index}`);\n if (op.kind === 'reactionValue' || op.kind === 'reactionCapture') uses.push('reaction');\n return uses;\n}\n\nfunction resourceName(ref: { kind: string; name?: string; index?: number }): string {\n return ref.kind === 'parameter' ? `$${ref.index}` : ref.name!;\n}\nfunction effects(op: OperationIR): OperationEffects {\n const reads: string[] = [],\n writes: string[] = [],\n calls: string[] = [];\n const call = op.kind === 'call' || op.kind === 'callValue';\n const maySuspend =\n call || ['wait', 'elapse', 'receive', 'waitUntil', 'redirect'].includes(op.kind);\n const mayThrow =\n call ||\n [\n 'read',\n 'write',\n 'readSample',\n 'writeIntent',\n 'resistor',\n 'bytes',\n 'index',\n 'nonNull',\n 'field',\n 'length',\n 'memoryLength',\n 'copyBytes',\n 'send',\n 'receive',\n 'notify',\n 'now',\n 'random',\n 'reactionValue',\n 'reactionCapture',\n 'if',\n 'select',\n 'and',\n 'or',\n 'assert',\n 'wait',\n 'elapse',\n 'redirect',\n ].includes(op.kind) ||\n op.kind.startsWith('load') ||\n op.kind.startsWith('store');\n if (op.kind === 'read') reads.push(`${op.resource}:${op.name}`);\n if (op.kind === 'write') writes.push(`state:${op.name}`);\n if ('memory' in op)\n (op.kind.startsWith('store') ? writes : reads).push(`memory:${resourceName(op.memory)}`);\n if (op.kind === 'readSample') reads.push(`pin:${resourceName(op.pin)}`);\n if (op.kind === 'writeIntent') writes.push(`pin:${resourceName(op.pin)}`);\n if (op.kind === 'send') writes.push(`channel:${op.channel}`);\n if (op.kind === 'receive') {\n reads.push(`channel:${op.channel}`);\n writes.push(`channel:${op.channel}`);\n }\n if (op.kind === 'notify') writes.push(`notification:${op.notification}`);\n if (op.kind === 'waitUntil') {\n reads.push('*');\n calls.push(op.predicate);\n }\n if (call) {\n calls.push(op.name);\n reads.push('*');\n writes.push('*');\n }\n return Object.freeze({\n reads: Object.freeze(reads),\n writes: Object.freeze(writes),\n calls: Object.freeze(calls),\n operations: Object.freeze([op.kind]),\n maySuspend,\n mayThrow,\n mayRedirect: call || op.kind === 'redirect',\n mayStop: call || op.kind === 'stop',\n timeDependent: call || op.kind === 'now',\n random: call || op.kind === 'random',\n });\n}\n\nfunction fold(\n op: OperationIR,\n known: ReadonlyMap<number, Primitive>,\n): { value: Primitive } | undefined {\n const values = inputs(op);\n if (values.some((id) => !known.has(id))) return undefined;\n const a = known.get(values[0]!)!,\n b = known.get(values[1]!)!;\n switch (op.kind) {\n case 'constant': {\n const c = op.constant;\n if (c.kind === 'none') return { value: null };\n if (c.kind === 'enum') return { value: c.member };\n if (c.kind === 'number' || c.kind === 'bool' || c.kind === 'string')\n return { value: c.value };\n return undefined;\n }\n case 'optional':\n return { value: a };\n case 'isNone':\n return { value: a === null };\n case 'nonNull':\n return a === null ? undefined : { value: a };\n case 'unary':\n switch (op.operator) {\n case 'positive':\n return { value: +(a as number) };\n case 'negate':\n return { value: -(a as number) };\n case 'not':\n return { value: !a };\n case 'bitNot':\n return { value: ~(a as number) };\n }\n break;\n case 'binary': {\n const x = a as number,\n y = b as number;\n switch (op.operator) {\n case 'add':\n return { value: x + y };\n case 'subtract':\n return { value: x - y };\n case 'multiply':\n return { value: x * y };\n case 'divide':\n return { value: x / y };\n case 'remainder':\n return { value: x % y };\n case 'power':\n return { value: x ** y };\n case 'lessThan':\n return { value: x < y };\n case 'lessThanOrEqual':\n return { value: x <= y };\n case 'greaterThan':\n return { value: x > y };\n case 'greaterThanOrEqual':\n return { value: x >= y };\n case 'equal':\n return { value: a === b };\n case 'notEqual':\n return { value: a !== b };\n case 'concat':\n return { value: (a as string) + (b as string) };\n case 'bitAnd':\n return { value: x & y };\n case 'bitOr':\n return { value: x | y };\n case 'bitXor':\n return { value: x ^ y };\n case 'shiftLeft':\n return { value: x << y };\n case 'shiftRight':\n return { value: x >> y };\n case 'shiftRightUnsigned':\n return { value: x >>> y };\n }\n break;\n }\n case 'numeric': {\n const args = op.args.map((id) => known.get(id) as number);\n if (op.builtin === 'isNaN') return { value: Number.isNaN(args[0]) };\n if (op.builtin === 'isFinite') return { value: Number.isFinite(args[0]) };\n if (op.builtin === 'isInteger') return { value: Number.isInteger(args[0]) };\n if (op.builtin === 'isSafeInteger') return { value: Number.isSafeInteger(args[0]) };\n const fn = Math[op.builtin] as (...values: number[]) => number;\n return { value: fn(...args) };\n }\n }\n return undefined;\n}\n\nfunction removable(\n op: OperationIR,\n types: ReadonlyMap<number, ValueTypeIR>,\n folded: ReadonlyMap<number, Primitive>,\n): boolean {\n switch (op.kind) {\n case 'constant':\n return op.constant.kind !== 'bytes' && op.constant.kind !== 'record';\n case 'parameter':\n case 'localRead':\n case 'optional':\n case 'isNone':\n case 'unary':\n case 'numeric':\n return true;\n case 'nonNull':\n return folded.has(op.result);\n case 'binary': {\n if (op.operator !== 'equal' && op.operator !== 'notEqual') return true;\n let type = types.get(op.left);\n if (type?.kind === 'optional') type = type.inner;\n return !!type && ['number', 'string', 'bool', 'enum'].includes(type.kind);\n }\n default:\n return false;\n }\n}\n\nfunction attributes(op: OperationIR): Readonly<Record<string, InternalAttribute>> {\n const copy = (value: unknown): InternalAttribute => {\n if (value === null || typeof value !== 'object')\n return value as string | number | boolean | null;\n if (Array.isArray(value)) return Object.freeze(value.map(copy));\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value)\n .filter(([, value]) => value !== undefined)\n .map(([key, value]) => [key, copy(value)]),\n ),\n );\n };\n return Object.freeze(\n Object.fromEntries(\n Object.entries(op).flatMap(([key, value]) => {\n if (\n ['kind', 'type', 'source', 'body', 'test', 'message', 'yes', 'no'].includes(key) ||\n value === undefined ||\n (key === 'right' && typeof value === 'object')\n )\n return [];\n return [\n [\n key,\n copy(\n key === 'arms'\n ? (op as Extract<OperationIR, { kind: 'match' }>).arms.map((arm) => arm.pattern)\n : value,\n ),\n ],\n ];\n }),\n ),\n );\n}\n\nexport function analyzeBody(\n body: RegionIR,\n options: CompileOptions,\n metadata = true,\n): BodyAnalysis {\n return new Analyzer(body, options.optimize !== false, metadata).analyze();\n}\nclass Analyzer {\n private readonly nodes: Node[] = [];\n private readonly regions: Region[] = [];\n private blocks: Block[] = [];\n private readonly blockSpecs: Pick<Block, 'id' | 'region' | 'role' | 'position'>[] = [];\n private buildingGraph = false;\n private readonly edges: ControlEdge[] = [];\n private readonly byOperation = new Map<OperationIR, Node>();\n private readonly folded = new Map<number, Primitive>();\n private readonly eliminated = new Set<number>();\n private readonly root: Region;\n private readonly throwExit: number;\n private readonly stopExit: number;\n private readonly redirectExit: number;\n\n constructor(\n body: RegionIR,\n private readonly optimize: boolean,\n private readonly metadata: boolean,\n ) {\n this.root = this.index(body, [], null, body.source);\n this.throwExit = this.block(0, 'throw');\n this.stopExit = this.block(0, 'stop');\n this.redirectExit = this.block(0, 'redirect');\n }\n private block(region: number, role: BasicBlock['role'], position: number | null = null): number {\n const id = this.blockSpecs.length;\n const spec = { id, region, role, position };\n this.blockSpecs.push(spec);\n if (this.buildingGraph) this.blocks.push(this.allocateBlock(spec));\n return id;\n }\n private allocateBlock(spec: Pick<Block, 'id' | 'region' | 'role' | 'position'>): Block {\n return {\n ...spec,\n uses: new Set(),\n definitions: new Set(),\n liveIn: new Set(),\n liveOut: new Set(),\n };\n }\n private edge(\n from: number,\n to: number,\n kind: EdgeKind,\n extra: { arm?: number; value?: number } = {},\n ): void {\n this.edges.push(Object.freeze({ from, to, kind, ...extra }));\n }\n private index(\n input: RegionIR,\n path: InputPath,\n parent: number | null,\n inherited?: SourceInfo,\n ): Region {\n const id = this.regions.length;\n const region: Region = {\n id,\n parent,\n path: Object.freeze([...path]),\n entry: this.block(id, 'entry'),\n exit: this.block(id, 'exit'),\n nodes: [],\n };\n this.regions.push(region);\n input.operations.forEach((operation, index) => {\n const position = this.nodes.length;\n const block = this.block(id, 'operation', position);\n const source = this.metadata ? (operation.source ?? input.source ?? inherited) : undefined;\n let effectSummary: OperationEffects | undefined;\n const node: Node = {\n operation,\n position,\n block,\n definitionBlock: block,\n region: id,\n path: Object.freeze([...path, 'operations', index]),\n inputs: Object.freeze(inputs(operation)),\n get effects() {\n return (effectSummary ??= effects(operation));\n },\n children: new Map(),\n ...(source ? { source: sourceSnapshot(source) } : {}),\n };\n region.nodes.push(node);\n this.nodes.push(node);\n this.byOperation.set(operation, node);\n const child = (\n key: string,\n body: RegionIR,\n suffix: InputPath = [key],\n inherited = source,\n ): void => {\n node.children.set(key, this.index(body, [...node.path, ...suffix], id, inherited));\n };\n switch (operation.kind) {\n case 'if':\n child('yes', operation.yes);\n if (operation.no) child('no', operation.no);\n break;\n case 'match':\n operation.arms.forEach((arm, i) =>\n child(`arm${i}`, arm.body, ['arms', i, 'body'], arm.source ?? source),\n );\n if (operation.otherwise) child('otherwise', operation.otherwise);\n break;\n case 'while':\n child('test', operation.test.body, ['test', 'body']);\n child('body', operation.body);\n break;\n case 'loop':\n child('body', operation.body);\n break;\n case 'select':\n child('yes', operation.yes.body, ['yes', 'body']);\n child('no', operation.no.body, ['no', 'body']);\n break;\n case 'and':\n case 'or':\n child('right', operation.right.body, ['right', 'body']);\n break;\n case 'assert':\n if (operation.message) child('message', operation.message.body, ['message', 'body']);\n break;\n }\n });\n return region;\n }\n private link(\n region: Region,\n target: number | null,\n context: Context,\n exitKind: EdgeKind = 'next',\n ): void {\n this.edge(region.entry, region.nodes[0]?.block ?? region.exit, 'next');\n if (target !== null) this.edge(region.exit, target, exitKind);\n region.nodes.forEach((node, index) => {\n const op = node.operation,\n head = node.block;\n const next = region.nodes[index + 1]?.block ?? region.exit;\n const child = (\n key: string,\n destination = next,\n ctx = context,\n kind: EdgeKind = 'next',\n ): Region => {\n const nested = node.children.get(key)!;\n this.link(nested, destination, ctx, kind);\n return nested;\n };\n const valueChild = (key: string, destination: number | null): Region => {\n const nested = node.children.get(key)!;\n this.link(nested, destination, { yieldTo: nested.exit });\n return nested;\n };\n if (node.effects.mayThrow && op.kind !== 'assert') this.edge(head, this.throwExit, 'throw');\n switch (op.kind) {\n case 'if':\n this.edge(head, child('yes').entry, 'true');\n this.edge(head, node.children.has('no') ? child('no').entry : next, 'false');\n break;\n case 'match':\n op.arms.forEach((_, i) => this.edge(head, child(`arm${i}`).entry, 'arm', { arm: i }));\n if (op.otherwise) this.edge(head, child('otherwise').entry, 'default');\n break;\n case 'while': {\n const test = valueChild('test', null);\n const loopContext = { ...context, breakTo: next, continueTo: test.entry };\n const body = child('body', test.entry, loopContext, 'backedge');\n this.edge(head, test.entry, 'next');\n this.edge(test.exit, body.entry, 'true');\n this.edge(test.exit, next, 'false');\n break;\n }\n case 'loop': {\n const body = node.children.get('body')!;\n child(\n 'body',\n body.entry,\n { ...context, breakTo: next, continueTo: body.entry },\n 'backedge',\n );\n this.edge(head, body.entry, 'next');\n break;\n }\n case 'select':\n case 'and':\n case 'or': {\n const join = this.block(region.id, 'join', node.position);\n node.definitionBlock = join;\n this.edge(join, next, 'next');\n if (op.kind === 'select') {\n this.edge(head, valueChild('yes', join).entry, 'true');\n this.edge(head, valueChild('no', join).entry, 'false');\n } else {\n const right = valueChild('right', join);\n this.edge(head, right.entry, op.kind === 'and' ? 'true' : 'false');\n this.edge(head, join, op.kind === 'and' ? 'false' : 'true', { value: op.left });\n }\n break;\n }\n case 'assert': {\n const failure = this.block(region.id, 'throw', node.position);\n node.failureBlock = failure;\n this.edge(head, next, 'true');\n this.edge(failure, this.throwExit, 'throw');\n this.edge(head, op.message ? valueChild('message', failure).entry : failure, 'false');\n break;\n }\n case 'break':\n if (context.breakTo === undefined) throw new TypeError('Break has no loop target');\n this.edge(head, context.breakTo, 'break');\n break;\n case 'continue':\n if (context.continueTo === undefined) throw new TypeError('Continue has no loop target');\n this.edge(head, context.continueTo, 'continue');\n break;\n case 'yield':\n if (context.yieldTo === undefined)\n throw new TypeError('Yield has no value-region target');\n this.edge(head, context.yieldTo, 'yield', { value: op.value });\n break;\n case 'return':\n case 'returnValue':\n this.edge(head, this.root.exit, 'return');\n break;\n case 'redirect':\n this.edge(head, this.redirectExit, 'redirect');\n break;\n case 'stop':\n this.edge(head, this.stopExit, 'stop');\n break;\n case 'wait':\n case 'elapse':\n case 'receive':\n case 'waitUntil':\n case 'call':\n case 'callValue': {\n const resume = this.block(region.id, 'resume', node.position);\n node.resumeBlock = resume;\n const call = op.kind === 'call' || op.kind === 'callValue';\n this.edge(head, resume, 'suspend');\n if (call) {\n const completion = this.block(region.id, 'join', node.position);\n node.completionBlock = completion;\n node.definitionBlock = completion;\n this.edge(head, completion, 'next');\n this.edge(resume, resume, 'suspend');\n this.edge(resume, completion, 'resume');\n this.edge(completion, next, 'next');\n for (const from of [head, resume]) {\n this.edge(from, this.redirectExit, 'redirect');\n this.edge(from, this.stopExit, 'stop');\n }\n this.edge(resume, this.throwExit, 'throw');\n } else {\n if (op.kind === 'receive') node.definitionBlock = resume;\n this.edge(resume, op.kind === 'waitUntil' ? this.root.exit : next, 'resume');\n if (op.kind === 'elapse') this.edge(head, next, 'next');\n }\n break;\n }\n default:\n this.edge(head, next, 'next');\n }\n });\n }\n analyze(): BodyAnalysis {\n const types = new Map<number, ValueTypeIR>();\n for (const node of this.nodes)\n if ('result' in node.operation) types.set(node.operation.result, node.operation.type);\n const known = new Map<number, Primitive>();\n if (this.optimize) {\n for (const node of this.nodes) {\n if (!('result' in node.operation)) continue;\n const constant = fold(node.operation, known);\n if (constant) {\n known.set(node.operation.result, constant.value);\n if (node.operation.kind !== 'constant') this.folded.set(node.position, constant.value);\n }\n }\n const foldedByResult = new Map<number, Primitive>();\n for (const node of this.nodes)\n if ('result' in node.operation && this.folded.has(node.position))\n foldedByResult.set(node.operation.result, this.folded.get(node.position)!);\n const definitions = new Map(\n this.nodes.flatMap((node) =>\n 'result' in node.operation ? [[node.operation.result, node] as const] : [],\n ),\n );\n const required = new Set<number>();\n const queue: number[] = [];\n const require = (id: number): void => {\n if (!required.has(id)) {\n required.add(id);\n queue.push(id);\n }\n };\n // Retain unknown inputs of even dead operations for baseline exit recovery.\n // Only known folded inputs can be discarded and reconstructed from recipes.\n for (const node of this.nodes) {\n if (!this.folded.has(node.position)) node.inputs.forEach(require);\n }\n for (let i = 0; i < queue.length; i++) {\n const node = definitions.get(queue[i]!);\n if (node && !this.folded.has(node.position)) node.inputs.forEach(require);\n }\n for (const node of this.nodes)\n if (\n 'result' in node.operation &&\n !required.has(node.operation.result) &&\n removable(node.operation, types, foldedByResult)\n )\n this.eliminated.add(node.position);\n }\n let completed: BodyAnalysis | undefined;\n const complete = (): BodyAnalysis => (completed ??= this.complete(known));\n return {\n nodes: this.nodes,\n byOperation: this.byOperation,\n folded: this.folded,\n constants: known,\n eliminated: this.eliminated,\n optimizations: Object.freeze({\n enabled: this.optimize,\n foldedPositions: Object.freeze(\n [...this.folded.keys()].filter((id) => !this.eliminated.has(id)),\n ),\n eliminatedPositions: Object.freeze([...this.eliminated]),\n }),\n get graph() {\n return complete().graph;\n },\n get effects() {\n return complete().effects;\n },\n get resources() {\n return complete().resources;\n },\n };\n }\n private complete(known: ReadonlyMap<number, Primitive>): BodyAnalysis {\n this.buildingGraph = true;\n this.blocks = this.blockSpecs.map((spec) => this.allocateBlock(spec));\n this.link(this.root, null, {});\n for (const node of this.nodes) {\n if (this.eliminated.has(node.position)) continue;\n const block = this.blocks[node.block]!,\n op = node.operation;\n if (!this.folded.has(node.position)) {\n node.inputs.forEach((id) => block.uses.add(`value:${id}`));\n argumentUses(op).forEach((key) => block.uses.add(key));\n if (op.kind === 'localRead') block.uses.add(`local:${op.local}`);\n }\n if ('result' in op) this.blocks[node.definitionBlock]!.definitions.add(`value:${op.result}`);\n if (op.kind === 'local' || op.kind === 'localWrite')\n block.definitions.add(`local:${op.local}`);\n }\n const regionOutputs = new Map<number, string>();\n for (const node of this.nodes) {\n const child =\n node.operation.kind === 'while'\n ? node.children.get('test')\n : node.operation.kind === 'assert'\n ? node.children.get('message')\n : undefined;\n if (!child) continue;\n const key = `region:${child.id}`;\n regionOutputs.set(child.exit, key);\n this.blocks[node.failureBlock ?? child.exit]!.uses.add(key);\n }\n for (const edge of this.edges)\n if (edge.kind === 'yield' && regionOutputs.has(edge.to))\n this.blocks[edge.from]!.definitions.add(regionOutputs.get(edge.to)!);\n const outgoing = this.blocks.map(() => [] as number[]),\n incoming = this.blocks.map(() => [] as number[]);\n this.edges.forEach((edge) => {\n outgoing[edge.from]!.push(edge.to);\n incoming[edge.to]!.push(edge.from);\n });\n const baselineUses = this.blocks.map(\n (block) => new Set([...block.uses].filter((key) => key.startsWith('region:'))),\n );\n const baselineDefinitions = this.blocks.map(\n (block) => new Set([...block.definitions].filter((key) => key.startsWith('region:'))),\n );\n for (const node of this.nodes) {\n const op = node.operation;\n node.inputs.forEach((id) => baselineUses[node.block]!.add(`value:${id}`));\n argumentUses(op).forEach((key) => baselineUses[node.block]!.add(key));\n if (op.kind === 'localRead') baselineUses[node.block]!.add(`local:${op.local}`);\n if ('result' in op) baselineDefinitions[node.definitionBlock]!.add(`value:${op.result}`);\n if (op.kind === 'local' || op.kind === 'localWrite')\n baselineDefinitions[node.block]!.add(`local:${op.local}`);\n }\n const liveness = (\n uses: readonly Set<string>[],\n definitions: readonly Set<string>[],\n ): { input: Set<string>[]; output: Set<string>[] } => {\n const input = this.blocks.map(() => new Set<string>());\n const output = this.blocks.map(() => new Set<string>());\n let changed = true;\n while (changed) {\n changed = false;\n for (let i = this.blocks.length - 1; i >= 0; i--) {\n const out = new Set(outgoing[i]!.flatMap((id) => [...input[id]!]));\n const incoming = new Set([\n ...uses[i]!,\n ...[...out].filter((key) => !definitions[i]!.has(key)),\n ]);\n if (\n out.size !== output[i]!.size ||\n [...out].some((key) => !output[i]!.has(key)) ||\n incoming.size !== input[i]!.size ||\n [...incoming].some((key) => !input[i]!.has(key))\n ) {\n changed = true;\n output[i] = out;\n input[i] = incoming;\n }\n }\n }\n return { input, output };\n };\n const optimizedLive = liveness(\n this.blocks.map((block) => block.uses),\n this.blocks.map((block) => block.definitions),\n );\n const baselineLive = liveness(baselineUses, baselineDefinitions);\n this.blocks.forEach((block, index) => {\n block.liveIn = optimizedLive.input[index]!;\n block.liveOut = optimizedLive.output[index]!;\n });\n const yieldInputs = new Map<number, number[]>();\n for (const edge of this.edges)\n if (edge.kind === 'yield' && edge.value !== undefined) {\n const values = yieldInputs.get(edge.to) ?? [];\n values.push(edge.value);\n yieldInputs.set(edge.to, values);\n }\n const users = new Map<number, number[]>();\n for (const node of this.nodes)\n for (const input of node.inputs) {\n const positions = users.get(input) ?? [];\n positions.push(node.position);\n users.set(input, positions);\n }\n const values = this.nodes.flatMap((node) => {\n const op = node.operation;\n if (!('result' in op)) return [];\n const phi = op.kind === 'select' || op.kind === 'and' || op.kind === 'or';\n const phiInputs = phi\n ? [...node.children.values()].flatMap((region) => yieldInputs.get(region.exit) ?? [])\n : [];\n if (op.kind === 'and' || op.kind === 'or') phiInputs.unshift(op.left);\n return [\n Object.freeze({\n result: op.result,\n type: typeSnapshot(op.type),\n position: node.position,\n region: node.region,\n block: node.definitionBlock,\n form: phi ? ('phi' as const) : ('operation' as const),\n inputs: Object.freeze(phi ? phiInputs : [...node.inputs]),\n users: Object.freeze(users.get(op.result) ?? []),\n eliminated: this.eliminated.has(node.position),\n folded: this.folded.has(node.position),\n }),\n ];\n });\n const graph: InternalGraph = Object.freeze({\n entry: this.root.entry,\n normalExit: this.root.exit,\n regions: Object.freeze(\n this.regions.map(({ id, parent, path, entry, exit }): InternalRegion =>\n Object.freeze({ id, parent, path, entry, exit }),\n ),\n ),\n blocks: Object.freeze(\n this.blocks.map((block): BasicBlock =>\n Object.freeze({\n ...block,\n predecessors: Object.freeze([...new Set(incoming[block.id])]),\n successors: Object.freeze([...new Set(outgoing[block.id])]),\n uses: Object.freeze([...block.uses]),\n definitions: Object.freeze([...block.definitions]),\n liveIn: Object.freeze([...block.liveIn]),\n liveOut: Object.freeze([...block.liveOut]),\n baselineLiveIn: Object.freeze([...baselineLive.input[block.id]!]),\n baselineLiveOut: Object.freeze([...baselineLive.output[block.id]!]),\n }),\n ),\n ),\n edges: Object.freeze([...this.edges]),\n values: Object.freeze(values),\n operations: Object.freeze(\n this.nodes.map((node) =>\n Object.freeze({\n position: node.position,\n block: node.block,\n region: node.region,\n kind: node.operation.kind,\n path: node.path,\n ...(node.source ? { source: node.source } : {}),\n inputs: node.inputs,\n attributes: attributes(node.operation),\n regions: Object.freeze(\n [...node.children].map(([role, region]) =>\n Object.freeze({ role, region: region.id }),\n ),\n ),\n effects: node.effects,\n eliminated: this.eliminated.has(node.position),\n folded: this.folded.has(node.position),\n }),\n ),\n ),\n });\n const summaries = this.nodes.map((node) => node.effects);\n const union = (key: 'reads' | 'writes' | 'calls' | 'operations'): readonly string[] =>\n Object.freeze([...new Set(summaries.flatMap((summary) => summary[key]))]);\n const effectMetadata: EffectMetadata = Object.freeze({\n reads: union('reads'),\n writes: union('writes'),\n calls: union('calls'),\n operations: union('operations') as EffectMetadata['operations'],\n maySuspend: summaries.some((e) => e.maySuspend),\n mayRedirect: summaries.some((e) => e.mayRedirect),\n mayStop: summaries.some((e) => e.mayStop),\n timeDependent: summaries.some((e) => e.timeDependent),\n random: summaries.some((e) => e.random),\n });\n const resources = new Set(\n [...effectMetadata.reads, ...effectMetadata.writes].filter((key) => key !== '*'),\n );\n for (const node of this.nodes) {\n const op = node.operation;\n if (op.kind === 'resistor') resources.add(`pin:${resourceName(op.to)}`);\n if (op.kind === 'refEqual')\n for (const ref of [op.left, op.right])\n resources.add(\n `${ref.kind === 'parameter' ? ref.resource : ref.kind}:${resourceName(ref)}`,\n );\n if (op.kind === 'call' || op.kind === 'callValue')\n for (const arg of op.args)\n if (arg.kind !== 'value')\n resources.add(\n `${arg.kind === 'parameter' ? arg.resource : arg.kind}:${resourceName(arg)}`,\n );\n }\n return {\n nodes: this.nodes,\n byOperation: this.byOperation,\n graph,\n folded: this.folded,\n constants: known,\n eliminated: this.eliminated,\n effects: effectMetadata,\n resources: Object.freeze([...resources]),\n optimizations: Object.freeze({\n enabled: this.optimize,\n foldedPositions: Object.freeze(\n [...this.folded.keys()].filter((id) => !this.eliminated.has(id)),\n ),\n eliminatedPositions: Object.freeze([...this.eliminated]),\n }),\n };\n }\n}\n","import type { ParameterTypeIR, ValueTypeIR } from '@mica-js/device-model';\nimport { typeSnapshot } from './analysis.js';\nimport type { BodyAnalysis, Node } from './analysis.js';\nimport type {\n ArtifactBinding,\n ArtifactDependencies,\n BaselinePosition,\n CompileOptions,\n ExitPoint,\n ExitReason,\n FrameLayout,\n FrameSlot,\n GeneratedRange,\n ResumeMap,\n ResumePoint,\n SourceMap,\n} from './types.js';\n\nexport interface GeneratedTemporary {\n readonly key: string;\n readonly name: string;\n readonly region: number;\n readonly definition: number;\n readonly type: ValueTypeIR;\n}\n\nexport function layoutMetadata(\n analysis: BodyAnalysis,\n ranges: ReadonlyMap<number, GeneratedRange>,\n resume: readonly ResumePoint[],\n source: string,\n options: CompileOptions,\n temporaries: readonly GeneratedTemporary[],\n): {\n dependencies: ArtifactDependencies;\n sourceMap: SourceMap;\n frameLayout: FrameLayout;\n resumeMap: ResumeMap;\n exitMap: readonly ExitPoint[];\n} {\n const slots: FrameSlot[] = [];\n const byKey = new Map<string, number>();\n const slotTypes = new Map<string, ParameterTypeIR>();\n for (const node of analysis.nodes) {\n const op = node.operation;\n if ('result' in op) slotTypes.set(`value:${op.result}`, typeSnapshot(op.type));\n if (op.kind === 'local') slotTypes.set(`local:${op.local}`, typeSnapshot(op.type));\n if (op.kind === 'parameter') slotTypes.set(`argument:${op.index}`, typeSnapshot(op.type));\n const resource = (ref: { kind: string; index?: number; resource?: 'pin' | 'memory' }): void => {\n if (ref.kind === 'parameter' && ref.resource)\n slotTypes.set(`argument:${ref.index}`, Object.freeze({ kind: ref.resource }));\n };\n if ('memory' in op) resource(op.memory);\n if ('pin' in op) resource(op.pin);\n if (op.kind === 'resistor') resource(op.to);\n if (op.kind === 'refEqual') {\n resource(op.left);\n resource(op.right);\n }\n if (op.kind === 'call' || op.kind === 'callValue')\n op.args.forEach((arg) => {\n if (arg.kind !== 'value') resource(arg);\n });\n }\n const slot = (\n key: string,\n kind: FrameSlot['kind'],\n name: string,\n region: number,\n definition: number | null,\n materialized = true,\n ): void => {\n if (byKey.has(key)) return;\n byKey.set(key, slots.length);\n slots.push(\n Object.freeze({\n id: slots.length,\n key,\n kind,\n name,\n region,\n definition,\n materialized,\n ...(slotTypes.has(key) ? { type: slotTypes.get(key)! } : {}),\n }),\n );\n };\n for (const node of analysis.nodes) {\n const op = node.operation;\n if ('result' in op)\n slot(\n `value:${op.result}`,\n 'value',\n `v${op.result}`,\n node.region,\n node.position,\n !analysis.eliminated.has(node.position),\n );\n if (op.kind === 'local')\n slot(`local:${op.local}`, 'local', `l${op.local}`, node.region, node.position);\n }\n for (const temporary of temporaries) {\n slotTypes.set(temporary.key, typeSnapshot(temporary.type));\n slot(temporary.key, 'temporary', temporary.name, temporary.region, temporary.definition);\n }\n for (const block of analysis.graph.blocks)\n for (const key of [...block.uses, ...block.liveIn, ...block.baselineLiveIn]) {\n if (key.startsWith('argument:'))\n slot(key, 'argument', `args[${key.slice('argument:'.length)}]`, 0, null);\n if (key === 'reaction') slot(key, 'reaction', 'reaction', 0, null);\n }\n const materializations = Object.freeze(\n [...analysis.constants].flatMap(([result, value]) => {\n const id = byKey.get(`value:${result}`);\n return id === undefined\n ? []\n : [Object.freeze({ slot: id, kind: 'constant' as const, value })];\n }),\n );\n const materializedConstants = new Set(materializations.map((item) => item.slot));\n const requiredSlots = (keys: readonly string[]): readonly number[] =>\n Object.freeze(\n keys\n .flatMap((key) => {\n const id = byKey.get(key);\n return id === undefined ? [] : [id];\n })\n .sort((a, b) => a - b),\n );\n const captureSlots = (keys: readonly string[]): readonly number[] =>\n Object.freeze(\n requiredSlots(keys).filter((id) => slots[id]!.materialized && !materializedConstants.has(id)),\n );\n const liveSlots = (keys: readonly string[]): readonly number[] =>\n Object.freeze(\n keys\n .flatMap((key) => {\n const id = byKey.get(key);\n return id === undefined || !slots[id]!.materialized ? [] : [id];\n })\n .sort((a, b) => a - b),\n );\n const baseline = (\n node: Node,\n phase: BaselinePosition['phase'],\n block = node.block,\n ): BaselinePosition => Object.freeze({ position: node.position, block, phase });\n const nodeByPath = new Map(analysis.nodes.map((node) => [JSON.stringify(node.path), node]));\n const lines = source.split('\\n');\n const lineRange = (line: number): GeneratedRange =>\n Object.freeze({\n start: Object.freeze({ line, column: (lines[line - 1]?.search(/\\S/) ?? 0) + 1 }),\n end: Object.freeze({ line, column: (lines[line - 1]?.length ?? 0) + 1 }),\n });\n const resumeMap: ResumeMap = Object.freeze({\n entries: Object.freeze(\n resume.map((point) => {\n const node = nodeByPath.get(JSON.stringify(point.path))!;\n const terminal =\n node.operation.kind === 'redirect' ||\n node.operation.kind === 'stop' ||\n node.operation.kind === 'waitUntil';\n const keys = terminal ? [] : analysis.graph.blocks[node.resumeBlock!]!.liveIn;\n return Object.freeze({\n id: point.id,\n kind: point.kind,\n suspended: baseline(node, 'before'),\n baseline: baseline(\n node,\n point.delegated ? 'delegate' : 'after',\n node.resumeBlock ?? node.block,\n ),\n generated: lineRange(point.line),\n continuation: Object.freeze({\n line: point.delegated ? point.line : Math.min(point.line + 1, lines.length),\n column: point.delegated ? point.column : (lines[point.line]?.search(/\\S/) ?? 0) + 1,\n }),\n liveSlots: liveSlots(keys),\n delegated: point.delegated,\n terminal,\n });\n }),\n ),\n });\n const exitMap: ExitPoint[] = [];\n const exit = (\n node: Node,\n reason: ExitReason,\n range: GeneratedRange,\n block = node.block,\n ): void => {\n exitMap.push(\n Object.freeze({\n baseline: baseline(node, 'before', block),\n reason,\n generated: range,\n requiredSlots: requiredSlots(analysis.graph.blocks[block]!.baselineLiveIn),\n captureSlots: captureSlots(analysis.graph.blocks[block]!.baselineLiveIn),\n }),\n );\n };\n for (const node of analysis.nodes) {\n const range = ranges.get(node.position);\n if (!range) continue;\n exit(node, 'deopt', lineRange(range.start.line));\n if (node.effects.mayThrow && !analysis.folded.has(node.position)) {\n if (node.operation.kind === 'assert') {\n let failureLine = range.start.line;\n for (let line = range.start.line; line <= range.end.line; line++)\n if (lines[line - 1]?.includes('host.assert(')) failureLine = line;\n exit(node, 'throw', lineRange(failureLine), node.failureBlock);\n } else exit(node, 'throw', lineRange(range.start.line));\n }\n if (node.operation.kind === 'return' || node.operation.kind === 'returnValue')\n exit(node, 'return', lineRange(range.start.line));\n }\n for (const point of resumeMap.entries) {\n const keys = point.terminal ? [] : analysis.graph.blocks[point.baseline.block]!.baselineLiveIn;\n exitMap.push(\n Object.freeze({\n baseline: point.baseline,\n reason:\n point.kind === 'redirect'\n ? ('redirect' as const)\n : point.kind === 'stop'\n ? ('stop' as const)\n : ('suspend' as const),\n generated: point.generated,\n requiredSlots: requiredSlots(keys),\n captureSlots: captureSlots(keys),\n }),\n );\n }\n for (const point of exitMap)\n for (const id of point.requiredSlots) {\n if (!slots[id]!.materialized && !materializedConstants.has(id)) {\n throw new Error(\n `Missing baseline value for frame slot ${id} at position ${point.baseline.position}`,\n );\n }\n }\n const binding: ArtifactBinding | null = options.binding\n ? Object.freeze({\n ...options.binding,\n ...(options.binding.instruction\n ? { instruction: Object.freeze({ ...options.binding.instruction }) }\n : {}),\n })\n : null;\n return {\n dependencies: Object.freeze({\n binding,\n reads: analysis.effects.reads,\n writes: analysis.effects.writes,\n calls: analysis.effects.calls,\n resources: analysis.resources,\n unresolvedCalls: analysis.effects.calls.length !== 0,\n }),\n sourceMap: Object.freeze({\n entries: Object.freeze(\n analysis.nodes.map((node) =>\n Object.freeze({\n position: node.position,\n block: node.block,\n path: node.path,\n kind: node.operation.kind,\n ...(node.source ? { source: node.source } : {}),\n generated: ranges.get(node.position) ?? null,\n eliminated: analysis.eliminated.has(node.position),\n folded: analysis.folded.has(node.position),\n }),\n ),\n ),\n }),\n frameLayout: Object.freeze({\n storage: 'native-generator',\n serializable: false,\n slots: Object.freeze(slots),\n materializations,\n }),\n resumeMap,\n exitMap: Object.freeze(exitMap),\n };\n}\n","import type {\n ArgumentIR,\n BinaryOperator,\n ComputationIR,\n ConstantIR,\n InputPath,\n MemoryRefIR,\n OperationIR,\n PinRefIR,\n RegionIR,\n SourceInfo,\n ValueRegionIR,\n ValueTypeIR,\n} from '@mica-js/device-model';\nimport type {\n Artifact,\n CompiledBody,\n CompiledComputation,\n CompileOptions,\n GeneratedRange,\n GeneratedPosition,\n ResumePoint,\n} from './types.js';\nimport { createBytes, createEnum, createRecord, runtimeHelpers } from './values.js';\nimport { analyzeBody } from './analysis.js';\nimport type { BodyAnalysis } from './analysis.js';\nimport { layoutMetadata } from './metadata.js';\nimport type { GeneratedTemporary } from './metadata.js';\n\nconst binaryOperators: Partial<Record<BinaryOperator, string>> = {\n add: '+',\n subtract: '-',\n multiply: '*',\n divide: '/',\n remainder: '%',\n power: '**',\n lessThan: '<',\n lessThanOrEqual: '<=',\n greaterThan: '>',\n greaterThanOrEqual: '>=',\n concat: '+',\n bitAnd: '&',\n bitOr: '|',\n bitXor: '^',\n shiftLeft: '<<',\n shiftRight: '>>',\n shiftRightUnsigned: '>>>',\n};\nconst numericBuiltins = new Set([\n 'isNaN',\n 'isFinite',\n 'isInteger',\n 'isSafeInteger',\n 'abs',\n 'floor',\n 'ceil',\n 'trunc',\n 'round',\n 'sqrt',\n 'min',\n 'max',\n 'pow',\n]);\nconst numberBuiltins = new Set(['isNaN', 'isFinite', 'isInteger', 'isSafeInteger']);\n\n/** Inputs must already have passed device-model validation and contextual binding. */\nexport function compileBody(region: RegionIR, options: CompileOptions = {}): CompiledBody {\n return new Emitter(analyzeBody(region, options, false), options, false).compileExecutable(region);\n}\n\nexport function compileBodyArtifact(\n region: RegionIR,\n options: CompileOptions = {},\n): Artifact<CompiledBody> {\n return new Emitter(analyzeBody(region, options), options).compile(region);\n}\n\nexport function compileComputation(\n computation: ComputationIR,\n options: CompileOptions = {},\n): CompiledComputation {\n return completeComputation(compileBody(computation.body, options));\n}\n\nexport function compileComputationArtifact(\n computation: ComputationIR,\n options: CompileOptions = {},\n): Artifact<CompiledComputation> {\n const body = compileBodyArtifact(\n computation.source && !computation.body.source\n ? { ...computation.body, source: computation.source }\n : computation.body,\n options,\n );\n return Object.freeze(\n Object.defineProperties(\n {},\n {\n ...Object.getOwnPropertyDescriptors(body),\n execute: { value: completeComputation(body.execute), enumerable: true },\n },\n ),\n ) as Artifact<CompiledComputation>;\n}\n\nfunction completeComputation(body: CompiledBody): CompiledComputation {\n return (host) => {\n const generator = body(host);\n const result = generator.next();\n if (!result.done) {\n generator.return(undefined);\n throw new TypeError(`Computation unexpectedly suspended with ${result.value.kind}`);\n }\n return result.value;\n };\n}\n\nfunction name(prefix: string, id: number): string {\n if (!Number.isSafeInteger(id) || id < 0)\n throw new TypeError('IR identifiers must be nonnegative safe integers');\n return `${prefix}${id}`;\n}\nconst value = (id: number): string => name('v', id);\nconst local = (id: number): string => name('l', id);\nconst quote = (text: string): string => JSON.stringify(text);\n\nfunction snapshotSource(source: SourceInfo): SourceInfo {\n if (source.uri !== undefined) {\n return Object.freeze({\n ...source,\n range: Object.freeze({\n start: Object.freeze({ ...source.range.start }),\n end: Object.freeze({ ...source.range.end }),\n }),\n });\n }\n return Object.freeze({ ...source });\n}\n\nclass Emitter {\n constructor(\n private readonly analysis: BodyAnalysis,\n private readonly options: CompileOptions,\n private readonly captureMetadata = true,\n ) {}\n\n private readonly ranges = new Map<number, GeneratedRange>();\n private readonly temporaries: GeneratedTemporary[] = [];\n private readonly lines: string[] = [];\n private readonly constants: unknown[] = [];\n private readonly primitiveConstants = new Map<unknown, number>();\n private readonly negativeZero = Symbol('negative zero');\n private readonly positions: GeneratedPosition[] = [];\n private readonly resume: ResumePoint[] = [];\n private readonly types = new Map<number, ValueTypeIR>();\n private indent = 0;\n private serial = 0;\n\n compileExecutable(region: RegionIR): CompiledBody {\n return this.generate(region).execute;\n }\n\n compile(region: RegionIR): Artifact<CompiledBody> {\n const generated = this.generate(region);\n const analysis = this.analysis;\n let layout: ReturnType<typeof layoutMetadata> | undefined;\n const metadata = (): ReturnType<typeof layoutMetadata> =>\n (layout ??= layoutMetadata(\n analysis,\n this.ranges,\n this.resume,\n generated.source,\n this.options,\n this.temporaries,\n ));\n return Object.freeze({\n ...generated,\n positions: Object.freeze(this.positions.slice()),\n resume: Object.freeze(this.resume.slice()),\n optimizations: analysis.optimizations,\n get effects() {\n return analysis.effects;\n },\n get mir() {\n return analysis.graph;\n },\n get dependencies() {\n return metadata().dependencies;\n },\n get sourceMap() {\n return metadata().sourceMap;\n },\n get frameLayout() {\n return metadata().frameLayout;\n },\n get resumeMap() {\n return metadata().resumeMap;\n },\n get exitMap() {\n return metadata().exitMap;\n },\n });\n }\n\n private generate(region: RegionIR): {\n execute: CompiledBody;\n source: string;\n constants: readonly unknown[];\n } {\n this.line('function* compiledBody(host, args = [], reaction) {');\n this.indent++;\n this.region(region, []);\n this.indent--;\n this.line('}');\n const source = this.lines.join('\\n');\n const constants = Object.freeze(this.constants.slice());\n // Only trusted templates enter Function; model strings and numbers are captured data.\n const factory = new Function('C', 'H', `\"use strict\"; return (${source});`) as (\n constants: readonly unknown[],\n helpers: typeof runtimeHelpers,\n ) => CompiledBody;\n return { execute: factory(constants, runtimeHelpers), source, constants };\n }\n\n private line(text: string): void {\n this.lines.push(`${' '.repeat(this.indent)}${text}`);\n }\n\n private block(header: string, body: () => void): void {\n this.line(`${header} {`);\n this.indent++;\n body();\n this.indent--;\n this.line('}');\n }\n\n private capture(input: unknown): string {\n const primitive = input === null || typeof input !== 'object';\n const key = Object.is(input, -0) ? this.negativeZero : input;\n const existing = primitive ? this.primitiveConstants.get(key) : undefined;\n if (existing !== undefined) return `C[${existing}]`;\n const index = this.constants.push(input) - 1;\n if (primitive) this.primitiveConstants.set(key, index);\n return `C[${index}]`;\n }\n\n private ref(ref: PinRefIR | MemoryRefIR): string {\n return ref.kind === 'parameter' ? `args[${ref.index}]` : this.capture(ref.name);\n }\n\n private argument(argument: ArgumentIR): string {\n return argument.kind === 'value' ? value(argument.value) : this.ref(argument);\n }\n\n private constant(constant: ConstantIR): unknown {\n switch (constant.kind) {\n case 'number':\n case 'bool':\n case 'string':\n return constant.value;\n case 'none':\n return null;\n case 'enum':\n return createEnum(constant.name, constant.member);\n case 'bytes':\n return Object.freeze(Array.from(createBytes(constant.value)));\n case 'record':\n return createRecord(constant.fields.map((field) => [field.name, field.value]));\n default:\n return exhaustive(constant);\n }\n }\n\n private position(operation: OperationIR, path: InputPath): GeneratedPosition {\n const position: GeneratedPosition = Object.freeze({\n path: Object.freeze([...path]),\n kind: operation.kind,\n line: this.lines.length + 1,\n column: this.indent * 2 + 1,\n ...(this.analysis.byOperation.get(operation)?.source\n ? { source: snapshotSource(this.analysis.byOperation.get(operation)!.source!) }\n : {}),\n });\n this.positions.push(position);\n return position;\n }\n\n private suspension(position: GeneratedPosition | undefined, delegated = false): void {\n if (!position) return;\n this.resume.push(\n Object.freeze({\n ...position,\n line: this.lines.length + 1,\n column: this.indent * 2 + 1,\n id: this.resume.length,\n delegated,\n }),\n );\n }\n\n private region(\n region: RegionIR,\n path: InputPath,\n output?: { slot: string; label: string },\n ): void {\n region.operations.forEach((operation, index) => {\n this.operation(operation, [...path, 'operations', index], output);\n });\n }\n\n private valueRegion(region: ValueRegionIR, slot: string, path: InputPath): void {\n if (this.captureMetadata && !slot.startsWith('v')) {\n const key = JSON.stringify([...path, 'body']);\n const owner = this.analysis.nodes.find((node) =>\n [...node.children.values()].some((child) => JSON.stringify(child.path) === key),\n )!;\n const nested = [...owner.children.values()].find(\n (child) => JSON.stringify(child.path) === key,\n )!;\n this.temporaries.push({\n key: `region:${nested.id}`,\n name: slot,\n region: owner.region,\n definition: owner.position,\n type: region.type,\n });\n }\n const label = `valueRegion${this.serial++}`;\n this.block(`${label}:`, () => this.region(region.body, [...path, 'body'], { slot, label }));\n }\n\n private equality(left: number, right: number): string {\n let type = this.types.get(left);\n if (type?.kind === 'optional') type = type.inner;\n if (type && (type.kind === 'number' || type.kind === 'string' || type.kind === 'bool')) {\n return `(${value(left)} === ${value(right)})`;\n }\n return `H.equalValues(${value(left)}, ${value(right)})`;\n }\n\n private operation(\n operation: OperationIR,\n path: InputPath,\n output?: { slot: string; label: string },\n ): void {\n if ('result' in operation) this.types.set(operation.result, operation.type);\n const node = this.analysis.byOperation.get(operation)!;\n if (this.analysis.eliminated.has(node.position)) return;\n const position = this.captureMetadata ? this.position(operation, path) : undefined;\n try {\n if ('result' in operation && this.analysis.folded.has(node.position)) {\n this.line(\n `const ${value(operation.result)} = ${this.capture(this.analysis.folded.get(node.position))};`,\n );\n } else this.emitOperation(operation, path, position, output);\n } finally {\n if (position)\n this.ranges.set(\n node.position,\n Object.freeze({\n start: Object.freeze({ line: position.line, column: position.column }),\n end: Object.freeze({\n line: this.lines.length,\n column: this.lines[this.lines.length - 1]!.length + 1,\n }),\n }),\n );\n }\n }\n\n private emitOperation(\n operation: OperationIR,\n path: InputPath,\n position: GeneratedPosition | undefined,\n output?: { slot: string; label: string },\n ): void {\n const assign = (expression: string): void => {\n if (!('result' in operation)) throw new TypeError('Expected a result-producing operation');\n this.line(`const ${value(operation.result)} = ${expression};`);\n };\n const child = (region: RegionIR, key: string): void =>\n this.region(region, [...path, key], output);\n switch (operation.kind) {\n case 'constant': {\n const captured = this.capture(this.constant(operation.constant));\n assign(operation.constant.kind === 'bytes' ? `H.createBytes(${captured})` : captured);\n break;\n }\n case 'read':\n assign(`host.read(${this.capture(operation.resource)}, ${this.capture(operation.name)})`);\n break;\n case 'parameter':\n assign(`args[${operation.index}]`);\n break;\n case 'reactionValue':\n assign(`H.reactionValue(reaction, ${quote(operation.binding)})`);\n break;\n case 'reactionCapture':\n assign(`H.reactionCapture(reaction, ${operation.index})`);\n break;\n case 'unary': {\n const operators = { positive: '+', negate: '-', not: '!', bitNot: '~' };\n const operator = operators[operation.operator];\n if (!operator) throw new TypeError('Unknown unary operator');\n assign(`(${operator}${value(operation.value)})`);\n break;\n }\n case 'binary': {\n if (operation.operator === 'equal' || operation.operator === 'notEqual') {\n assign(\n `${operation.operator === 'notEqual' ? '!' : ''}${this.equality(operation.left, operation.right)}`,\n );\n } else {\n const operator = binaryOperators[operation.operator];\n if (!operator) throw new TypeError('Unknown binary operator');\n assign(`(${value(operation.left)} ${operator} ${value(operation.right)})`);\n }\n break;\n }\n case 'numeric': {\n if (!numericBuiltins.has(operation.builtin)) throw new TypeError('Unknown numeric builtin');\n const receiver = numberBuiltins.has(operation.builtin) ? 'Number' : 'Math';\n assign(`${receiver}.${operation.builtin}(${operation.args.map(value).join(', ')})`);\n break;\n }\n case 'record':\n assign(\n `H.createRecord([${operation.fields.map((field) => `[${this.capture(field.name)}, ${value(field.value)}]`).join(', ')}])`,\n );\n break;\n case 'field':\n assign(`${value(operation.value)}[${this.capture(operation.field)}]`);\n break;\n case 'bytes':\n assign(`H.createBytes([${operation.elements.map(value).join(', ')}])`);\n break;\n case 'length':\n assign(`${value(operation.value)}.length`);\n break;\n case 'index':\n assign(`H.readIndex(${value(operation.value)}, ${value(operation.index)})`);\n break;\n case 'optional':\n assign(value(operation.value));\n break;\n case 'isNone':\n assign(`(${value(operation.value)} === null)`);\n break;\n case 'nonNull':\n assign(`H.nonNull(${value(operation.value)})`);\n break;\n case 'localRead':\n assign(local(operation.local));\n break;\n case 'local':\n this.line(`let ${local(operation.local)} = ${value(operation.initial)};`);\n break;\n case 'localWrite':\n this.line(`${local(operation.local)} = ${value(operation.value)};`);\n break;\n case 'write':\n this.line(`host.write(${this.capture(operation.name)}, ${value(operation.value)});`);\n break;\n case 'memoryLength':\n assign(`host.memoryLength(${this.ref(operation.memory)})`);\n break;\n case 'load8':\n case 'load16le':\n case 'load16be':\n case 'load32le':\n case 'load32be':\n assign(\n `host.load(${quote(operation.kind)}, ${this.ref(operation.memory)}, ${value(operation.offset)})`,\n );\n break;\n case 'store8':\n case 'store16le':\n case 'store16be':\n case 'store32le':\n case 'store32be':\n this.line(\n `host.store(${quote(operation.kind)}, ${this.ref(operation.memory)}, ${value(operation.offset)}, ${value(operation.value)});`,\n );\n break;\n case 'copyBytes':\n assign(\n `host.copyBytes(${this.ref(operation.memory)}, ${value(operation.offset)}, ${value(operation.length)})`,\n );\n break;\n case 'readSample':\n assign(`host.sample(${this.ref(operation.pin)})`);\n break;\n case 'resistor':\n assign(`host.resistor(${this.ref(operation.to)}, ${value(operation.resistance)})`);\n break;\n case 'combineIntents':\n assign(`H.combineIntents([${operation.values.map(value).join(', ')}])`);\n break;\n case 'refEqual':\n assign(`(${this.ref(operation.left)} === ${this.ref(operation.right)})`);\n break;\n case 'writeIntent':\n this.line(`host.intent(${this.ref(operation.pin)}, ${value(operation.value)});`);\n break;\n case 'call':\n case 'callValue': {\n this.suspension(position, true);\n const slot = `call${this.serial++}`;\n this.line(\n `const ${slot} = yield* H.delegate(host.call(${this.capture(operation.name)}, [${operation.args.map((argument) => this.argument(argument)).join(', ')}]));`,\n );\n this.line(`if (${slot} === H.terminated) return;`);\n if (operation.kind === 'callValue') assign(slot);\n break;\n }\n case 'send':\n this.line(`host.send(${this.capture(operation.channel)}, ${value(operation.value)});`);\n break;\n case 'notify':\n this.line(`host.notify(${this.capture(operation.notification)});`);\n break;\n case 'receive':\n this.suspension(position);\n assign(`yield { kind: \"receive\", channel: ${this.capture(operation.channel)} }`);\n break;\n case 'now':\n assign('host.now()');\n break;\n case 'random':\n assign('host.random()');\n break;\n case 'if':\n this.block(`if (H.checkBoolean(${value(operation.condition)}))`, () =>\n child(operation.yes, 'yes'),\n );\n if (operation.no) this.block('else', () => child(operation.no!, 'no'));\n break;\n case 'match': {\n operation.arms.forEach((arm, index) => {\n const pattern = arm.pattern;\n const constant =\n pattern.kind === 'none'\n ? null\n : pattern.kind === 'enum'\n ? createEnum(pattern.name, pattern.member)\n : pattern.value;\n this.block(\n `${index ? 'else if' : 'if'} (H.equalValues(${value(operation.value)}, ${this.capture(constant)}))`,\n () => {\n this.region(arm.body, [...path, 'arms', index, 'body'], output);\n },\n );\n });\n if (operation.otherwise) {\n this.block(operation.arms.length ? 'else' : '', () =>\n child(operation.otherwise!, 'otherwise'),\n );\n }\n break;\n }\n case 'while':\n this.block('while (true)', () => {\n const slot = `condition${this.serial++}`;\n this.line(`let ${slot};`);\n this.valueRegion(operation.test, slot, [...path, 'test']);\n this.line(`if (!H.checkBoolean(${slot})) break;`);\n this.block('', () => child(operation.body, 'body'));\n });\n break;\n case 'loop':\n this.block('while (true)', () => child(operation.body, 'body'));\n break;\n case 'and':\n case 'or': {\n const slot = value(operation.result);\n this.line(`let ${slot} = H.checkBoolean(${value(operation.left)});`);\n this.block(`if (${operation.kind === 'or' ? '!' : ''}${slot})`, () => {\n this.valueRegion(operation.right, slot, [...path, 'right']);\n this.line(`${slot} = H.checkBoolean(${slot});`);\n });\n break;\n }\n case 'select': {\n const slot = value(operation.result);\n this.line(`let ${slot};`);\n this.block(`if (H.checkBoolean(${value(operation.condition)}))`, () =>\n this.valueRegion(operation.yes, slot, [...path, 'yes']),\n );\n this.block('else', () => this.valueRegion(operation.no, slot, [...path, 'no']));\n break;\n }\n case 'assert':\n this.block(`if (!H.checkBoolean(${value(operation.condition)}))`, () => {\n if (operation.message) {\n const slot = `message${this.serial++}`;\n this.line(`let ${slot};`);\n this.valueRegion(operation.message, slot, [...path, 'message']);\n this.line(`host.assert(false, ${slot});`);\n } else this.line('host.assert(false, undefined);');\n });\n break;\n case 'wait':\n case 'elapse': {\n const duration = `duration${this.serial++}`;\n this.line(`const ${duration} = H.checkDuration(${value(operation.duration)});`);\n this.suspension(position);\n const signal = `yield { kind: ${quote(operation.kind === 'wait' ? 'ticks' : 'elapse')}, duration: ${duration} };`;\n if (operation.kind === 'elapse') this.line(`if (${duration} !== 0) ${signal}`);\n else this.line(signal);\n break;\n }\n case 'waitUntil':\n this.suspension(position);\n this.line(`yield { kind: \"waitUntil\", predicate: ${this.capture(operation.predicate)} };`);\n this.line('return;');\n break;\n case 'redirect':\n this.suspension(position);\n this.line(\n `yield { kind: \"redirect\", pc: H.checkPc(${value(operation.target)}), delay: H.checkDuration(${value(operation.delay)}) };`,\n );\n this.line('return;');\n break;\n case 'stop':\n this.suspension(position);\n this.line('yield { kind: \"stop\" };');\n this.line('return;');\n break;\n case 'return':\n this.line('return;');\n break;\n case 'returnValue':\n this.line(`return ${value(operation.value)};`);\n break;\n case 'break':\n this.line('break;');\n break;\n case 'continue':\n this.line('continue;');\n break;\n case 'yield':\n if (!output) throw new TypeError('Value-region yield is outside a value region');\n this.line(`${output.slot} = ${value(operation.value)};`);\n this.line(`break ${output.label};`);\n break;\n default:\n exhaustive(operation);\n }\n }\n}\n\nfunction exhaustive(value: never): never {\n throw new TypeError(`Unsupported IR operation: ${String((value as { kind?: unknown }).kind)}`);\n}\n","import type { BinaryOperator, MemoryRefIR, OperationIR, RegionIR } from '@mica-js/device-model';\nimport type {\n DirectJitBinding,\n DirectJitFrame,\n DirectJitProgram,\n DirectJitReason,\n} from './types.js';\nimport { checkBoolean, checkDuration, checkPc } from './values.js';\n\nconst binary: Partial<Record<BinaryOperator, string>> = {\n add: '+',\n subtract: '-',\n multiply: '*',\n divide: '/',\n remainder: '%',\n power: '**',\n lessThan: '<',\n lessThanOrEqual: '<=',\n greaterThan: '>',\n greaterThanOrEqual: '>=',\n equal: '===',\n notEqual: '!==',\n bitAnd: '&',\n bitOr: '|',\n bitXor: '^',\n shiftLeft: '<<',\n shiftRight: '>>',\n shiftRightUnsigned: '>>>',\n};\nconst numeric = new Set([\n 'isNaN',\n 'isFinite',\n 'isInteger',\n 'isSafeInteger',\n 'abs',\n 'floor',\n 'ceil',\n 'trunc',\n 'round',\n 'sqrt',\n 'min',\n 'max',\n 'pow',\n]);\nconst predicates = new Set(['isNaN', 'isFinite', 'isInteger', 'isSafeInteger']);\n\nfunction offset(memory: Uint8Array, value: unknown): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value))\n throw new TypeError('offset must be a safe integer');\n if (value < 0) throw new RangeError('offset must be nonnegative');\n if (value >= memory.length) throw new RangeError('Memory range is out of bounds');\n return value;\n}\n\nfunction byte(value: unknown): number {\n if (typeof value !== 'number' || !Number.isSafeInteger(value))\n throw new TypeError('stored value must be a safe integer');\n return value;\n}\n\nconst helpers = Object.freeze({ checkBoolean, checkPc, offset, byte });\nconst unsupported = Symbol('unsupported direct instruction');\n\n/** Inputs have already passed model validation and contextual binding. */\nexport function compileDirectJit(\n instructions: readonly {\n readonly pc: number;\n readonly nextPc: number;\n readonly body: RegionIR;\n }[],\n binding: DirectJitBinding,\n): DirectJitProgram | undefined {\n if (!validIndex(binding.pc.index) || binding.states.get(binding.pc.name) !== binding.pc.index)\n return undefined;\n const constants: unknown[] = [];\n const capture = (value: unknown): string => `C[${constants.push(value) - 1}]`;\n const entries: Instruction[] = [];\n const seen = new Set<number>();\n for (const instruction of instructions) {\n if (!Number.isFinite(instruction.pc) || seen.has(instruction.pc)) continue;\n // Even an unsupported first occurrence owns this PC, matching runtime lookup.\n seen.add(instruction.pc);\n if (!Number.isFinite(instruction.nextPc)) continue;\n try {\n entries.push(new Instruction(binding, capture).compile(instruction));\n } catch (error) {\n if (error !== unsupported) throw error;\n }\n }\n if (!entries.length) return undefined;\n const localCount = Math.max(...entries.map((entry) => entry.slots.length));\n const registers = Array.from({ length: localCount }, (_, index) => `v${index}`);\n const lines = [\n 'function run(F, deadline) {',\n 'const S = F.states, M = F.memories, L = F.locals, SD = F.stateDirty, MD = F.memoryDirty;',\n ...(registers.length ? [`let ${registers.join(',')};`] : []),\n 'while (true) {',\n 'if (F.time >= deadline) return \"deadline\";',\n 'if (F.resume !== 0) {',\n 'if (F.due >= deadline) { F.time = deadline; return \"deadline\"; }',\n 'F.time = Math.max(F.time, F.due);',\n 'switch (F.resume) {',\n ];\n entries.forEach((entry, index) => {\n lines.push(`case ${index + 1}: {`);\n entry.slots.forEach((slot, slotIndex) => lines.push(`${slot} = L[${slotIndex}];`));\n lines.push('F.resume = 0;', ...entry.suffix, finish(entry.stop), '}');\n });\n lines.push(\n 'default: throw new TypeError(\"Unknown direct JIT continuation\");',\n '}',\n '}',\n 'if (F.stopAfterInstruction) return \"invalidated\";',\n `switch (H.checkPc(S[${binding.pc.index}])) {`,\n );\n entries.forEach((entry, index) => {\n lines.push(\n `case ${entry.pc}: {`,\n `S[${binding.pc.index}] = ${entry.nextPc};`,\n dirty('SD', binding.pc.index),\n ...entry.prefix,\n );\n if (entry.duration !== undefined) {\n lines.push(\n `F.due = F.time + ${entry.duration};`,\n 'if (F.due > 7200000000000000) throw new RangeError(\"Time out of range\");',\n 'if (F.due >= deadline) {',\n );\n entry.slots.forEach((slot, slotIndex) => lines.push(`L[${slotIndex}] = ${slot};`));\n lines.push(`F.resume = ${index + 1};`, 'F.time = deadline;', 'return \"deadline\";', '}');\n lines.push('F.time = F.due;');\n }\n lines.push(...entry.suffix, finish(entry.stop), '}');\n });\n lines.push('default: return \"fallback\";', '}', '}', '}');\n // Only compiler-owned templates/indices enter source; all IR constants are closure data.\n const factory = new Function('C', 'H', `\"use strict\"; return (${lines.join('\\n')});`) as (\n constants: readonly unknown[],\n runtimeHelpers: typeof helpers,\n ) => (frame: DirectJitFrame, deadline: number) => DirectJitReason;\n const names = (field: 'readStates' | 'writeStates' | 'readMemories' | 'writeMemories') =>\n Object.freeze([...new Set(entries.flatMap((entry) => [...entry[field]]))]);\n return Object.freeze({\n run: factory(Object.freeze(constants), helpers),\n localCount,\n readStates: names('readStates'),\n writeStates: names('writeStates'),\n readMemories: names('readMemories'),\n writeMemories: names('writeMemories'),\n });\n}\n\nfunction finish(stop: boolean): string {\n return stop ? 'return \"stopped\";' : 'if (F.stopAfterInstruction) return \"invalidated\"; continue;';\n}\n\nfunction dirty(bank: 'SD' | 'MD', index: number): string {\n return `${bank}[${index >>> 5}] |= ${1 << (index & 31)};`;\n}\n\nfunction validIndex(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0;\n}\n\nclass Instruction {\n readonly readStates = new Set<string>();\n readonly writeStates = new Set<string>();\n readonly readMemories = new Set<string>();\n readonly writeMemories = new Set<string>();\n readonly slots: string[] = [];\n prefix: string[] = [];\n suffix: string[] = [];\n pc = '';\n nextPc = '';\n duration?: string;\n stop = false;\n private readonly values = new Map<number, string>();\n private readonly locals = new Map<number, string>();\n private readonly literals = new Map<number, number | boolean>();\n private labels = 0;\n\n constructor(\n private readonly binding: DirectJitBinding,\n private readonly capture: (value: unknown) => string,\n ) {}\n\n compile(instruction: { pc: number; nextPc: number; body: RegionIR }): this {\n this.pc = this.capture(instruction.pc);\n this.nextPc = this.capture(instruction.nextPc);\n this.readStates.add(this.binding.pc.name);\n this.state(this.binding.pc.name, true);\n let output = this.prefix;\n let terminal = false;\n for (const operation of instruction.body.operations) {\n if (terminal) throw unsupported;\n if (operation.kind === 'elapse') {\n if (this.duration !== undefined) throw unsupported;\n this.duration = this.delay(operation.duration);\n output = this.suffix;\n } else if (operation.kind === 'redirect') {\n if (this.duration !== undefined) throw unsupported;\n const duration = this.delay(operation.delay);\n output.push(\n `S[${this.binding.pc.index}] = H.checkPc(${this.value(operation.target)});`,\n dirty('SD', this.binding.pc.index),\n );\n this.duration = duration;\n output = this.suffix;\n terminal = true;\n } else if (operation.kind === 'stop') {\n this.stop = true;\n terminal = true;\n } else {\n this.operation(operation, output);\n }\n }\n if (this.duration === undefined && !this.stop) throw unsupported;\n return this;\n }\n\n private delay(id: number): string {\n const duration = this.literals.get(id);\n if (typeof duration !== 'number') throw unsupported;\n try {\n checkDuration(duration);\n } catch {\n throw unsupported;\n }\n if (duration <= 0) throw unsupported;\n return this.capture(duration);\n }\n\n private value(id: number): string {\n const slot = this.values.get(id);\n if (!slot) throw unsupported;\n return slot;\n }\n\n private slot(): string {\n const slot = `v${this.slots.length}`;\n this.slots.push(slot);\n return slot;\n }\n\n private state(name: string, write: boolean): number {\n const index = this.binding.states.get(name);\n if (!validIndex(index) || (write && this.binding.blockedStates?.has(name))) throw unsupported;\n (write ? this.writeStates : this.readStates).add(name);\n return index;\n }\n\n private memory(operation: { readonly kind: string; readonly memory: MemoryRefIR }): number {\n if (operation.memory.kind !== 'memory') throw unsupported;\n const name = operation.memory.name;\n const index = this.binding.memories.get(name);\n if (\n !validIndex(index) ||\n (operation.kind !== 'load8' && this.binding.blockedMemories?.has(name))\n )\n throw unsupported;\n (operation.kind === 'load8' ? this.readMemories : this.writeMemories).add(name);\n return index;\n }\n\n private region(\n region: RegionIR,\n lines: string[],\n output?: { slot: string; label: string },\n ): void {\n for (const operation of region.operations) {\n if (operation.kind === 'yield') {\n if (!output) throw unsupported;\n lines.push(`${output.slot} = ${this.value(operation.value)}; break ${output.label};`);\n } else {\n this.operation(operation, lines, output);\n }\n }\n }\n\n private operation(\n operation: OperationIR,\n lines: string[],\n output?: { slot: string; label: string },\n ): void {\n let result: string | undefined;\n if ('result' in operation) {\n if (operation.type.kind !== 'number' && operation.type.kind !== 'bool') throw unsupported;\n result = this.slot();\n this.values.set(operation.result, result);\n }\n const assign = (expression: string): void => {\n lines.push(`${result!} = ${expression};`);\n };\n switch (operation.kind) {\n case 'constant':\n if (operation.constant.kind !== 'number' && operation.constant.kind !== 'bool')\n throw unsupported;\n this.literals.set(operation.result, operation.constant.value);\n assign(this.capture(operation.constant.value));\n break;\n case 'read':\n if (operation.resource !== 'state') throw unsupported;\n assign(`S[${this.state(operation.name, false)}]`);\n break;\n case 'write': {\n const index = this.state(operation.name, true);\n lines.push(`S[${index}] = ${this.value(operation.value)};`, dirty('SD', index));\n break;\n }\n case 'unary': {\n const operator = { positive: '+', negate: '-', not: '!', bitNot: '~' }[operation.operator];\n if (!operator) throw unsupported;\n assign(`(${operator}${this.value(operation.value)})`);\n break;\n }\n case 'binary': {\n const operator = binary[operation.operator];\n if (!operator) throw unsupported;\n assign(`(${this.value(operation.left)} ${operator} ${this.value(operation.right)})`);\n break;\n }\n case 'numeric':\n if (!numeric.has(operation.builtin)) throw unsupported;\n assign(\n `${predicates.has(operation.builtin) ? 'Number' : 'Math'}.${operation.builtin}(${operation.args.map((id) => this.value(id)).join(',')})`,\n );\n break;\n case 'local': {\n if (operation.type.kind !== 'number' && operation.type.kind !== 'bool') throw unsupported;\n const slot = this.slot();\n this.locals.set(operation.local, slot);\n lines.push(`${slot} = ${this.value(operation.initial)};`);\n break;\n }\n case 'localRead': {\n const slot = this.locals.get(operation.local);\n if (!slot) throw unsupported;\n assign(slot);\n break;\n }\n case 'localWrite': {\n const slot = this.locals.get(operation.local);\n if (!slot) throw unsupported;\n lines.push(`${slot} = ${this.value(operation.value)};`);\n break;\n }\n case 'load8': {\n const memory = `M[${this.memory(operation)}]`;\n assign(`${memory}[H.offset(${memory},${this.value(operation.offset)})]`);\n break;\n }\n case 'store8': {\n const index = this.memory(operation);\n const memory = `M[${index}]`;\n // Check the address before the value, as the generic host does.\n lines.push(\n `${memory}[H.offset(${memory},${this.value(operation.offset)})] = H.byte(${this.value(operation.value)});`,\n dirty('MD', index),\n );\n break;\n }\n case 'if':\n lines.push(`if (H.checkBoolean(${this.value(operation.condition)})) {`);\n this.region(operation.yes, lines, output);\n if (operation.no) {\n lines.push('} else {');\n this.region(operation.no, lines, output);\n }\n lines.push('}');\n break;\n case 'select': {\n const label = `select${this.labels++}`;\n lines.push(`${label}: {`, `if (H.checkBoolean(${this.value(operation.condition)})) {`);\n this.region(operation.yes.body, lines, { slot: result!, label });\n lines.push('} else {');\n this.region(operation.no.body, lines, { slot: result!, label });\n lines.push('}', '}');\n break;\n }\n default:\n throw unsupported;\n }\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,39 @@
1
1
  {
2
2
  "name": "@mica-js/compiler",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.0",
4
+ "description": "Direct JavaScript compiler for Mica device execution bodies",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/x-botlab/mica-js.git",
9
+ "directory": "packages/compiler"
10
+ },
11
+ "type": "module",
12
+ "sideEffects": false,
13
+ "exports": {
14
+ ".": {
15
+ "types": "./dist/index.d.ts",
16
+ "import": "./dist/index.js"
17
+ }
18
+ },
19
+ "files": [
20
+ "dist"
21
+ ],
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "dependencies": {
26
+ "@mica-js/device-model": "0.5.0"
27
+ },
28
+ "devDependencies": {
29
+ "typescript": "^6.0.3",
30
+ "vite": "^8.3.4",
31
+ "vite-plugin-dts": "^5.1.2"
32
+ },
33
+ "scripts": {
34
+ "bench": "node bench/run.mjs",
35
+ "build": "vite build",
36
+ "typecheck": "tsc --noEmit",
37
+ "test": "node --test tests/*.test.mjs"
38
+ }
6
39
  }