@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,402 @@
1
+ import { ComputationIR } from '@mica-js/device-model';
2
+ import { InputPath } from '@mica-js/device-model';
3
+ import { OperationIR } from '@mica-js/device-model';
4
+ import { ParameterTypeIR } from '@mica-js/device-model';
5
+ import { RegionIR } from '@mica-js/device-model';
6
+ import { SourceInfo } from '@mica-js/device-model';
7
+ import { ValueTypeIR } from '@mica-js/device-model';
8
+
9
+ export declare interface Artifact<T = CompiledBody> {
10
+ readonly execute: T;
11
+ readonly source: string;
12
+ readonly constants: readonly unknown[];
13
+ readonly positions: readonly GeneratedPosition[];
14
+ readonly resume: readonly ResumePoint[];
15
+ readonly effects: EffectMetadata;
16
+ readonly mir: InternalGraph;
17
+ readonly dependencies: ArtifactDependencies;
18
+ readonly sourceMap: SourceMap;
19
+ readonly frameLayout: FrameLayout;
20
+ readonly resumeMap: ResumeMap;
21
+ readonly exitMap: readonly ExitPoint[];
22
+ readonly optimizations: OptimizationMetadata;
23
+ }
24
+
25
+ export declare interface ArtifactBinding {
26
+ readonly instance?: string;
27
+ readonly entry?: string;
28
+ readonly generation?: number;
29
+ readonly codeVersion?: string | number;
30
+ readonly instruction?: {
31
+ readonly pc: number;
32
+ readonly nextPc: number;
33
+ };
34
+ }
35
+
36
+ export declare interface ArtifactDependencies {
37
+ readonly binding: ArtifactBinding | null;
38
+ readonly reads: readonly string[];
39
+ readonly writes: readonly string[];
40
+ readonly calls: readonly string[];
41
+ readonly resources: readonly string[];
42
+ readonly unresolvedCalls: boolean;
43
+ }
44
+
45
+ export declare interface BaselinePosition {
46
+ readonly position: number;
47
+ readonly block: number;
48
+ readonly phase: 'before' | 'after' | 'delegate';
49
+ }
50
+
51
+ /** One operation per block is intentional; joins/resume/exit blocks are explicit. */
52
+ export declare interface BasicBlock {
53
+ readonly id: number;
54
+ readonly region: number;
55
+ readonly role: 'operation' | 'entry' | 'exit' | 'join' | 'resume' | 'return' | 'throw' | 'stop' | 'redirect';
56
+ readonly position: number | null;
57
+ readonly predecessors: readonly number[];
58
+ readonly successors: readonly number[];
59
+ readonly uses: readonly string[];
60
+ readonly definitions: readonly string[];
61
+ readonly liveIn: readonly string[];
62
+ readonly liveOut: readonly string[];
63
+ readonly baselineLiveIn: readonly string[];
64
+ readonly baselineLiveOut: readonly string[];
65
+ }
66
+
67
+ export declare function checkBoolean(value: unknown): boolean;
68
+
69
+ export declare function checkDuration(value: unknown): number;
70
+
71
+ export declare function checkPc(value: unknown): number;
72
+
73
+ export declare function combineIntents(values: readonly unknown[]): readonly unknown[];
74
+
75
+ /** Inputs must already have passed device-model validation and contextual binding. */
76
+ export declare function compileBody(region: RegionIR, options?: CompileOptions): CompiledBody;
77
+
78
+ export declare function compileBodyArtifact(region: RegionIR, options?: CompileOptions): Artifact<CompiledBody>;
79
+
80
+ export declare function compileComputation(computation: ComputationIR, options?: CompileOptions): CompiledComputation;
81
+
82
+ export declare function compileComputationArtifact(computation: ComputationIR, options?: CompileOptions): Artifact<CompiledComputation>;
83
+
84
+ export declare type CompiledBody = (host: ExecutionHost, args?: readonly unknown[], reaction?: ReactionFrame) => Generator<ExecutionSignal, unknown, unknown>;
85
+
86
+ export declare type CompiledComputation = (host: ExecutionHost) => unknown;
87
+
88
+ /** Inputs have already passed model validation and contextual binding. */
89
+ export declare function compileDirectJit(instructions: readonly {
90
+ readonly pc: number;
91
+ readonly nextPc: number;
92
+ readonly body: RegionIR;
93
+ }[], binding: DirectJitBinding): DirectJitProgram | undefined;
94
+
95
+ export declare interface CompileOptions {
96
+ readonly optimize?: boolean;
97
+ /** Optional identity supplied by the binding runtime; it is never guessed from a body. */
98
+ readonly binding?: ArtifactBinding;
99
+ }
100
+
101
+ export declare interface ConstantMaterialization {
102
+ readonly slot: number;
103
+ readonly kind: 'constant';
104
+ readonly value: number | boolean | string | null;
105
+ }
106
+
107
+ export declare interface ControlEdge {
108
+ readonly from: number;
109
+ readonly to: number;
110
+ readonly kind: EdgeKind;
111
+ readonly arm?: number;
112
+ readonly value?: number;
113
+ }
114
+
115
+ export declare function createBytes(elements: readonly unknown[]): Uint8Array;
116
+
117
+ export declare function createEnum(_name: string, member: string): EnumValue;
118
+
119
+ export declare function createRecord(fields: readonly (readonly [string, unknown])[]): Readonly<Record<string, unknown>>;
120
+
121
+ /** Static numeric bank layout; the runtime guards ownership/observers before entry. */
122
+ export declare interface DirectJitBinding {
123
+ readonly states: ReadonlyMap<string, number>;
124
+ readonly memories: ReadonlyMap<string, number>;
125
+ readonly pc: {
126
+ readonly name: string;
127
+ readonly index: number;
128
+ };
129
+ /** Compile-time write barriers; recompile when membership changes. */
130
+ readonly blockedStates?: ReadonlySet<string>;
131
+ readonly blockedMemories?: ReadonlySet<string>;
132
+ }
133
+
134
+ /** Reusable runtime-owned bank. Flush completed effects even when run throws. */
135
+ export declare interface DirectJitFrame {
136
+ states: unknown[];
137
+ memories: Uint8Array[];
138
+ /** Reusable bit words indexed by bank index >>> 5; clear before each invocation. */
139
+ stateDirty: number[];
140
+ memoryDirty: number[];
141
+ time: number;
142
+ /** Absolute wake time when resume is nonzero. */
143
+ due: number;
144
+ /** Zero means idle; other values are opaque continuations owned by this program. */
145
+ resume: number;
146
+ /** Allocate at least program.localCount slots once, not once per instruction. */
147
+ locals: unknown[];
148
+ /** Complete a pending old instruction, then exit before starting another. */
149
+ stopAfterInstruction?: boolean;
150
+ }
151
+
152
+ export declare interface DirectJitProgram {
153
+ /** At time === deadline neither an instruction nor its suffix executes. */
154
+ run(frame: DirectJitFrame, deadline: number): DirectJitReason;
155
+ readonly localCount: number;
156
+ readonly readStates: readonly string[];
157
+ readonly writeStates: readonly string[];
158
+ readonly readMemories: readonly string[];
159
+ readonly writeMemories: readonly string[];
160
+ }
161
+
162
+ export declare type DirectJitReason = 'deadline' | 'fallback' | 'stopped' | 'invalidated';
163
+
164
+ export declare type EdgeKind = 'next' | 'true' | 'false' | 'arm' | 'default' | 'backedge' | 'break' | 'continue' | 'yield' | 'return' | 'suspend' | 'resume' | 'redirect' | 'stop' | 'throw';
165
+
166
+ /** Effects are conservative and syntactic; calls require runtime/model call-graph analysis. */
167
+ export declare interface EffectMetadata {
168
+ readonly reads: readonly string[];
169
+ readonly writes: readonly string[];
170
+ readonly calls: readonly string[];
171
+ readonly operations: readonly OperationIR['kind'][];
172
+ readonly maySuspend: boolean;
173
+ readonly mayRedirect: boolean;
174
+ readonly mayStop: boolean;
175
+ readonly timeDependent: boolean;
176
+ readonly random: boolean;
177
+ }
178
+
179
+ /** Nominal enum identity is validated statically; runtime values are member names. */
180
+ export declare type EnumValue = string;
181
+
182
+ /** Structural comparison deliberately does not shortcut identical objects containing NaN. */
183
+ export declare function equalValues(left: unknown, right: unknown): boolean;
184
+
185
+ export declare interface ExecutionHost {
186
+ read(resource: 'property' | 'const' | 'state' | 'derived', name: string): unknown;
187
+ write(name: string, value: unknown): void;
188
+ sample(pin: unknown): unknown;
189
+ intent(pin: unknown, value: unknown): void;
190
+ resistor(pin: unknown, resistance: unknown): unknown;
191
+ load(kind: string, memory: unknown, offset: unknown): number;
192
+ store(kind: string, memory: unknown, offset: unknown, value: unknown): void;
193
+ copyBytes(memory: unknown, offset: unknown, length: unknown): unknown;
194
+ memoryLength(memory: unknown): number;
195
+ send(name: string, value: unknown): void;
196
+ notify(name: string): void;
197
+ now(): number;
198
+ random(): number;
199
+ call(name: string, args: readonly unknown[]): Generator<ExecutionSignal, unknown, unknown>;
200
+ assert(condition: unknown, message: unknown): void;
201
+ }
202
+
203
+ export declare type ExecutionSignal = {
204
+ readonly kind: 'ticks' | 'elapse';
205
+ readonly duration: number;
206
+ } | {
207
+ readonly kind: 'receive';
208
+ readonly channel: string;
209
+ } | {
210
+ readonly kind: 'waitUntil';
211
+ readonly predicate: string;
212
+ } | {
213
+ readonly kind: 'redirect';
214
+ readonly pc: number;
215
+ readonly delay: number;
216
+ } | {
217
+ readonly kind: 'stop';
218
+ };
219
+
220
+ export declare interface ExitPoint {
221
+ readonly baseline: BaselinePosition;
222
+ readonly reason: ExitReason;
223
+ readonly generated: GeneratedRange;
224
+ readonly requiredSlots: readonly number[];
225
+ readonly captureSlots: readonly number[];
226
+ }
227
+
228
+ export declare type ExitReason = 'return' | 'suspend' | 'redirect' | 'stop' | 'throw' | 'deopt';
229
+
230
+ /** Data contract for a future consumer; current generators do not expose their slots. */
231
+ export declare interface ExitState {
232
+ readonly reason: ExitReason;
233
+ readonly baseline: BaselinePosition;
234
+ readonly values: readonly {
235
+ readonly slot: number;
236
+ readonly value: unknown;
237
+ }[];
238
+ readonly signal?: ExecutionSignal;
239
+ readonly value?: unknown;
240
+ readonly cause?: unknown;
241
+ /** A retained native continuation is required for resuming this backend's stack. */
242
+ readonly continuation?: Generator<ExecutionSignal, unknown, unknown>;
243
+ }
244
+
245
+ /** Describes actual native-generator bindings, not an externally writable stack frame. */
246
+ export declare interface FrameLayout {
247
+ readonly storage: 'native-generator';
248
+ readonly serializable: false;
249
+ readonly slots: readonly FrameSlot[];
250
+ readonly materializations: readonly ConstantMaterialization[];
251
+ }
252
+
253
+ export declare interface FrameSlot {
254
+ readonly id: number;
255
+ readonly key: string;
256
+ readonly kind: 'value' | 'local' | 'argument' | 'reaction' | 'temporary';
257
+ readonly name: string;
258
+ readonly region: number;
259
+ readonly definition: number | null;
260
+ readonly materialized: boolean;
261
+ readonly type?: ParameterTypeIR;
262
+ }
263
+
264
+ /** Generated line and column are one-based, relative to Artifact.source. */
265
+ export declare interface GeneratedPosition {
266
+ readonly path: InputPath;
267
+ readonly kind: OperationIR['kind'];
268
+ readonly line: number;
269
+ readonly column: number;
270
+ readonly source?: SourceInfo;
271
+ }
272
+
273
+ export declare interface GeneratedRange {
274
+ readonly start: {
275
+ readonly line: number;
276
+ readonly column: number;
277
+ };
278
+ readonly end: {
279
+ readonly line: number;
280
+ readonly column: number;
281
+ };
282
+ }
283
+
284
+ export declare type InternalAttribute = string | number | boolean | null | readonly InternalAttribute[] | {
285
+ readonly [key: string]: InternalAttribute;
286
+ };
287
+
288
+ /** SSA result definitions plus explicit mutable local slots; locals are not SSA-promoted. */
289
+ export declare interface InternalGraph {
290
+ readonly entry: number;
291
+ readonly normalExit: number;
292
+ readonly regions: readonly InternalRegion[];
293
+ readonly blocks: readonly BasicBlock[];
294
+ readonly edges: readonly ControlEdge[];
295
+ readonly operations: readonly InternalOperation[];
296
+ readonly values: readonly ValueDefinition[];
297
+ }
298
+
299
+ export declare interface InternalOperation {
300
+ readonly position: number;
301
+ readonly block: number;
302
+ readonly region: number;
303
+ readonly kind: OperationIR['kind'];
304
+ readonly path: InputPath;
305
+ readonly source?: SourceInfo;
306
+ readonly inputs: readonly number[];
307
+ readonly attributes: Readonly<Record<string, InternalAttribute>>;
308
+ readonly regions: readonly {
309
+ readonly role: string;
310
+ readonly region: number;
311
+ }[];
312
+ readonly effects: OperationEffects;
313
+ readonly eliminated: boolean;
314
+ readonly folded: boolean;
315
+ }
316
+
317
+ export declare interface InternalRegion {
318
+ readonly id: number;
319
+ readonly parent: number | null;
320
+ readonly path: InputPath;
321
+ readonly entry: number;
322
+ readonly exit: number;
323
+ }
324
+
325
+ export declare function nonNull(value: unknown): unknown;
326
+
327
+ export declare interface OperationEffects extends EffectMetadata {
328
+ readonly mayThrow: boolean;
329
+ }
330
+
331
+ export declare interface OptimizationMetadata {
332
+ readonly enabled: boolean;
333
+ readonly foldedPositions: readonly number[];
334
+ readonly eliminatedPositions: readonly number[];
335
+ }
336
+
337
+ export declare function reactionCapture(frame: ReactionFrame | undefined, index: number): unknown;
338
+
339
+ export declare interface ReactionFrame {
340
+ readonly previous: unknown;
341
+ readonly current: unknown;
342
+ readonly captures: readonly unknown[];
343
+ }
344
+
345
+ export declare function reactionValue(frame: ReactionFrame | undefined, binding: 'previous' | 'current'): unknown;
346
+
347
+ export declare function readIndex(value: string | ArrayLike<number>, index: unknown): string | number;
348
+
349
+ export declare interface ResumeLocation {
350
+ readonly id: number;
351
+ readonly kind: OperationIR['kind'];
352
+ readonly suspended: BaselinePosition;
353
+ readonly baseline: BaselinePosition;
354
+ readonly generated: GeneratedRange;
355
+ readonly continuation: {
356
+ readonly line: number;
357
+ readonly column: number;
358
+ };
359
+ readonly liveSlots: readonly number[];
360
+ readonly delegated: boolean;
361
+ readonly terminal: boolean;
362
+ }
363
+
364
+ export declare interface ResumeMap {
365
+ readonly entries: readonly ResumeLocation[];
366
+ }
367
+
368
+ export declare interface ResumePoint extends GeneratedPosition {
369
+ readonly id: number;
370
+ /** Calls may suspend or terminate through any transitive callee. */
371
+ readonly delegated: boolean;
372
+ }
373
+
374
+ export declare interface SourceMap {
375
+ readonly entries: readonly SourceMapEntry[];
376
+ }
377
+
378
+ export declare interface SourceMapEntry {
379
+ readonly position: number;
380
+ readonly block: number;
381
+ readonly path: InputPath;
382
+ readonly kind: OperationIR['kind'];
383
+ readonly source?: SourceInfo;
384
+ readonly generated: GeneratedRange | null;
385
+ readonly eliminated: boolean;
386
+ readonly folded: boolean;
387
+ }
388
+
389
+ export declare interface ValueDefinition {
390
+ readonly result: number;
391
+ readonly type: ValueTypeIR;
392
+ readonly position: number;
393
+ readonly region: number;
394
+ readonly block: number;
395
+ readonly form: 'operation' | 'phi';
396
+ readonly inputs: readonly number[];
397
+ readonly users: readonly number[];
398
+ readonly eliminated: boolean;
399
+ readonly folded: boolean;
400
+ }
401
+
402
+ export { }