@audiofab-io/fv1-core 0.2.2 → 0.4.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.
Files changed (133) hide show
  1. package/blocks/ATL_DEVELOPER_REFERENCE.md +156 -0
  2. package/blocks/control/constant.atl +36 -0
  3. package/blocks/control/entropy_lfo.atl +74 -0
  4. package/blocks/control/envelope.atl +121 -0
  5. package/blocks/control/invert.atl +33 -0
  6. package/blocks/control/pot.atl +150 -0
  7. package/blocks/control/power.atl +77 -0
  8. package/blocks/control/ramp_lfo.atl +122 -0
  9. package/blocks/control/scale_offset.atl +84 -0
  10. package/blocks/control/sincos_lfo.atl +126 -0
  11. package/blocks/control/smoother.atl +48 -0
  12. package/blocks/control/tremolizer.atl +55 -0
  13. package/blocks/effects/delay/micro_stutter.atl +77 -0
  14. package/blocks/effects/delay/mn3011.atl +281 -0
  15. package/blocks/effects/delay/simple_delay.atl +96 -0
  16. package/blocks/effects/delay/triple_tap_delay.atl +176 -0
  17. package/blocks/effects/lo-fi/bit_mangler.atl +74 -0
  18. package/blocks/effects/lo-fi/chiptune.atl +311 -0
  19. package/blocks/effects/lo-fi/tape_degrade.atl +181 -0
  20. package/blocks/effects/modulation/chorus.atl +141 -0
  21. package/blocks/effects/modulation/chorus_4voice.atl +188 -0
  22. package/blocks/effects/modulation/flanger.atl +184 -0
  23. package/blocks/effects/modulation/guitar_synth.atl +350 -0
  24. package/blocks/effects/modulation/harmonic_trem.atl +129 -0
  25. package/blocks/effects/modulation/organ_synth.atl +326 -0
  26. package/blocks/effects/modulation/phaser.atl +300 -0
  27. package/blocks/effects/pitch/octave_up_down.atl +80 -0
  28. package/blocks/effects/pitch/pitch_offset.atl +149 -0
  29. package/blocks/effects/pitch/pitch_offset_dual.atl +197 -0
  30. package/blocks/effects/pitch/pitch_shift.atl +115 -0
  31. package/blocks/effects/pitch/sub_octave.atl +100 -0
  32. package/blocks/effects/reverb/ducking_reverb.atl +145 -0
  33. package/blocks/effects/reverb/min_reverb.atl +132 -0
  34. package/blocks/effects/reverb/plate_reverb.atl +344 -0
  35. package/blocks/effects/reverb/room_reverb.atl +293 -0
  36. package/blocks/effects/reverb/smear.atl +90 -0
  37. package/blocks/effects/reverb/spring_reverb.atl +353 -0
  38. package/blocks/filter/1p_high_pass.atl +63 -0
  39. package/blocks/filter/1p_low_pass.atl +59 -0
  40. package/blocks/filter/auto_wah.atl +207 -0
  41. package/blocks/filter/bbd_loss.atl +79 -0
  42. package/blocks/filter/shelving_high_pass.atl +76 -0
  43. package/blocks/filter/shelving_low_pass.atl +76 -0
  44. package/blocks/filter/svf_2p.atl +116 -0
  45. package/blocks/gain_mix/crossfade.atl +93 -0
  46. package/blocks/gain_mix/crossfade2.atl +86 -0
  47. package/blocks/gain_mix/crossfade3.atl +71 -0
  48. package/blocks/gain_mix/gainboost.atl +54 -0
  49. package/blocks/gain_mix/mixer2.atl +76 -0
  50. package/blocks/gain_mix/mixer3.atl +109 -0
  51. package/blocks/gain_mix/mixer4.atl +152 -0
  52. package/blocks/gain_mix/volume.atl +51 -0
  53. package/blocks/io/adc.atl +53 -0
  54. package/blocks/io/dac.atl +61 -0
  55. package/blocks/other/stickynote.atl +24 -0
  56. package/blocks/other/tone_gen_adjustable.atl +137 -0
  57. package/blocks/other/tone_gen_fixed.atl +109 -0
  58. package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts +13 -0
  59. package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts.map +1 -0
  60. package/dist/blockDiagram/blocks/BlockDirectoryLoader.js +44 -0
  61. package/dist/blockDiagram/blocks/BlockDirectoryLoader.js.map +1 -0
  62. package/dist/blockDiagram/blocks/BlockRegistry.d.ts +48 -0
  63. package/dist/blockDiagram/blocks/BlockRegistry.d.ts.map +1 -0
  64. package/dist/blockDiagram/blocks/BlockRegistry.js +109 -0
  65. package/dist/blockDiagram/blocks/BlockRegistry.js.map +1 -0
  66. package/dist/blockDiagram/blocks/TemplateBlock.d.ts +20 -0
  67. package/dist/blockDiagram/blocks/TemplateBlock.d.ts.map +1 -0
  68. package/dist/blockDiagram/blocks/TemplateBlock.js +82 -0
  69. package/dist/blockDiagram/blocks/TemplateBlock.js.map +1 -0
  70. package/dist/blockDiagram/blocks/base/BaseBlock.d.ts +248 -0
  71. package/dist/blockDiagram/blocks/base/BaseBlock.d.ts.map +1 -0
  72. package/dist/blockDiagram/blocks/base/BaseBlock.js +402 -0
  73. package/dist/blockDiagram/blocks/base/BaseBlock.js.map +1 -0
  74. package/dist/blockDiagram/builtinBlocks.d.ts +9 -0
  75. package/dist/blockDiagram/builtinBlocks.d.ts.map +1 -0
  76. package/dist/blockDiagram/builtinBlocks.js +4912 -0
  77. package/dist/blockDiagram/builtinBlocks.js.map +1 -0
  78. package/dist/blockDiagram/compiler/BlockTemplate.d.ts +37 -0
  79. package/dist/blockDiagram/compiler/BlockTemplate.d.ts.map +1 -0
  80. package/dist/blockDiagram/compiler/BlockTemplate.js +860 -0
  81. package/dist/blockDiagram/compiler/BlockTemplate.js.map +1 -0
  82. package/dist/blockDiagram/compiler/CodeOptimizer.d.ts +75 -0
  83. package/dist/blockDiagram/compiler/CodeOptimizer.d.ts.map +1 -0
  84. package/dist/blockDiagram/compiler/CodeOptimizer.js +443 -0
  85. package/dist/blockDiagram/compiler/CodeOptimizer.js.map +1 -0
  86. package/dist/blockDiagram/compiler/GraphCompiler.d.ts +63 -0
  87. package/dist/blockDiagram/compiler/GraphCompiler.d.ts.map +1 -0
  88. package/dist/blockDiagram/compiler/GraphCompiler.js +656 -0
  89. package/dist/blockDiagram/compiler/GraphCompiler.js.map +1 -0
  90. package/dist/blockDiagram/compiler/TopologicalSort.d.ts +63 -0
  91. package/dist/blockDiagram/compiler/TopologicalSort.d.ts.map +1 -0
  92. package/dist/blockDiagram/compiler/TopologicalSort.js +268 -0
  93. package/dist/blockDiagram/compiler/TopologicalSort.js.map +1 -0
  94. package/dist/blockDiagram/index.d.ts +30 -0
  95. package/dist/blockDiagram/index.d.ts.map +1 -0
  96. package/dist/blockDiagram/index.js +29 -0
  97. package/dist/blockDiagram/index.js.map +1 -0
  98. package/dist/blockDiagram/types/Block.d.ts +178 -0
  99. package/dist/blockDiagram/types/Block.d.ts.map +1 -0
  100. package/dist/blockDiagram/types/Block.js +5 -0
  101. package/dist/blockDiagram/types/Block.js.map +1 -0
  102. package/dist/blockDiagram/types/CodeGenContext.d.ts +235 -0
  103. package/dist/blockDiagram/types/CodeGenContext.d.ts.map +1 -0
  104. package/dist/blockDiagram/types/CodeGenContext.js +554 -0
  105. package/dist/blockDiagram/types/CodeGenContext.js.map +1 -0
  106. package/dist/blockDiagram/types/Connection.d.ts +17 -0
  107. package/dist/blockDiagram/types/Connection.d.ts.map +1 -0
  108. package/dist/blockDiagram/types/Connection.js +5 -0
  109. package/dist/blockDiagram/types/Connection.js.map +1 -0
  110. package/dist/blockDiagram/types/Graph.d.ts +28 -0
  111. package/dist/blockDiagram/types/Graph.d.ts.map +1 -0
  112. package/dist/blockDiagram/types/Graph.js +24 -0
  113. package/dist/blockDiagram/types/Graph.js.map +1 -0
  114. package/dist/blockDiagram/types/IR.d.ts +79 -0
  115. package/dist/blockDiagram/types/IR.d.ts.map +1 -0
  116. package/dist/blockDiagram/types/IR.js +6 -0
  117. package/dist/blockDiagram/types/IR.js.map +1 -0
  118. package/dist/blockDiagram/utils/SpinCADConverter.d.ts +17 -0
  119. package/dist/blockDiagram/utils/SpinCADConverter.d.ts.map +1 -0
  120. package/dist/blockDiagram/utils/SpinCADConverter.js +307 -0
  121. package/dist/blockDiagram/utils/SpinCADConverter.js.map +1 -0
  122. package/dist/effect/compileEffect.d.ts +51 -0
  123. package/dist/effect/compileEffect.d.ts.map +1 -0
  124. package/dist/effect/compileEffect.js +133 -0
  125. package/dist/effect/compileEffect.js.map +1 -0
  126. package/dist/index.d.ts +2 -0
  127. package/dist/index.d.ts.map +1 -1
  128. package/dist/index.js +2 -0
  129. package/dist/index.js.map +1 -1
  130. package/dist/simulator/FV1Simulator.d.ts.map +1 -1
  131. package/dist/simulator/FV1Simulator.js +7 -4
  132. package/dist/simulator/FV1Simulator.js.map +1 -1
  133. package/package.json +17 -5
@@ -0,0 +1,554 @@
1
+ /**
2
+ * Code generation context implementation
3
+ */
4
+ export class CodeGenerationContext {
5
+ constructor(graph, options) {
6
+ this.registerAllocations = [];
7
+ this.memoryAllocations = [];
8
+ this.equDeclarations = [];
9
+ this.constantMap = new Map(); // Dynamic map of value -> EQU name
10
+ this.nextRegister = 0; // Allocate permanent registers from REG0 upward
11
+ this.nextScratchRegister = 31; // Allocate scratch registers from REG31 downward
12
+ this.nextMemoryAddress = 0;
13
+ this.currentBlockId = null;
14
+ this.blockShortIdMap = new Map();
15
+ this.nextShortId = 1;
16
+ this.blockVariables = new Map();
17
+ // Code sections
18
+ this.headerComments = []; // User comments from sticky notes
19
+ this.initCode = []; // EQU, MEM declarations, SKP logic
20
+ this.inputCode = []; // ADC reads, POT reads
21
+ this.mainCode = []; // Main processing logic
22
+ this.outputCode = []; // DAC writes
23
+ this.flattenedCode = []; // Aggressive optimization flattened buffer
24
+ this.irNodes = []; // Semantic IR nodes
25
+ this.flattenMode = false;
26
+ // Error tracking
27
+ this.compilationErrors = [];
28
+ // Set of EQU names pushed to IR header section (decoupled from equDeclarations)
29
+ this.headerEquSet = new Set();
30
+ this.graph = graph;
31
+ this.maxMemory = options?.delaySize ?? 32768;
32
+ }
33
+ /**
34
+ * Get the current block ID being processed
35
+ */
36
+ getCurrentBlock() {
37
+ return this.currentBlockId;
38
+ }
39
+ /**
40
+ * Set the current block ID
41
+ being processed
42
+ */
43
+ setCurrentBlock(blockId) {
44
+ this.currentBlockId = blockId;
45
+ }
46
+ /**
47
+ * Push comments to the header section
48
+ * For documentation and notes from sticky note blocks
49
+ */
50
+ pushHeaderComment(...lines) {
51
+ this.headerComments.push(...lines);
52
+ }
53
+ /**
54
+ * Report an error that halts generation and alerts the user
55
+ */
56
+ addError(message) {
57
+ if (this.currentBlockId) {
58
+ const shortId = this.getShortId(this.currentBlockId);
59
+ this.compilationErrors.push(`Block [${shortId}]: ${message}`);
60
+ }
61
+ else {
62
+ this.compilationErrors.push(message);
63
+ }
64
+ }
65
+ /**
66
+ * Return all collected errors during AST template evaluation
67
+ */
68
+ getErrors() {
69
+ return this.compilationErrors;
70
+ }
71
+ /**
72
+ * Set flatten mode for aggressive optimization
73
+ */
74
+ setFlattenMode(enabled) {
75
+ this.flattenMode = enabled;
76
+ }
77
+ /**
78
+ * Check if flatten mode is enabled
79
+ */
80
+ isFlattenMode() {
81
+ return this.flattenMode;
82
+ }
83
+ /**
84
+ * Push code to the initialization section
85
+ * For EQU/MEM declarations and SKP logic
86
+ */
87
+ pushInitCode(...lines) {
88
+ this.initCode.push(...lines);
89
+ }
90
+ /**
91
+ * Push code to the input section
92
+ * For ADC reads and POT reads
93
+ */
94
+ pushInputCode(...lines) {
95
+ if (this.flattenMode) {
96
+ this.flattenedCode.push(...lines);
97
+ }
98
+ else {
99
+ this.inputCode.push(...lines);
100
+ }
101
+ }
102
+ /**
103
+ * Push code to the main code section
104
+ * For main processing logic
105
+ */
106
+ pushMainCode(...lines) {
107
+ if (this.flattenMode) {
108
+ this.flattenedCode.push(...lines);
109
+ }
110
+ else {
111
+ this.mainCode.push(...lines);
112
+ }
113
+ }
114
+ /**
115
+ * Push code to the output section
116
+ * For DAC writes
117
+ */
118
+ pushOutputCode(...lines) {
119
+ if (this.flattenMode) {
120
+ this.flattenedCode.push(...lines);
121
+ }
122
+ else {
123
+ this.outputCode.push(...lines);
124
+ }
125
+ }
126
+ /**
127
+ * Get header comments (from sticky notes)
128
+ */
129
+ getHeaderComments() {
130
+ return [...this.headerComments];
131
+ }
132
+ /**
133
+ * Get all code sections
134
+ * Also generates EQU and MEM declarations at the beginning of init section
135
+ */
136
+ getCodeSections() {
137
+ const init = [];
138
+ // Add EQU declarations for constants
139
+ const equDecls = this.getEquDeclarations();
140
+ if (equDecls.length > 0) {
141
+ init.push('; Constants');
142
+ for (const equ of equDecls) {
143
+ init.push(`equ\t${equ.name}\t${equ.value}`);
144
+ }
145
+ init.push('');
146
+ }
147
+ // Add EQU declarations for register aliases
148
+ const aliases = this.getRegisterAliases();
149
+ if (aliases.length > 0) {
150
+ init.push('; Register Aliases');
151
+ for (const alias of aliases) {
152
+ init.push(`equ\t${alias.alias}\t${alias.register}`);
153
+ }
154
+ init.push('');
155
+ }
156
+ // Add MEM declarations
157
+ const memBlocks = this.getMemoryBlocks();
158
+ if (memBlocks.length > 0) {
159
+ init.push('; Memory Allocations');
160
+ for (const mem of memBlocks) {
161
+ init.push(`mem\t${mem.name}\t${mem.size}`);
162
+ }
163
+ init.push('');
164
+ }
165
+ // Add any custom init code from blocks
166
+ if (this.initCode.length > 0) {
167
+ init.push(...this.initCode);
168
+ }
169
+ return {
170
+ init,
171
+ input: [...this.inputCode],
172
+ main: this.flattenMode ? [...this.flattenedCode] : [...this.mainCode],
173
+ output: [...this.outputCode]
174
+ };
175
+ }
176
+ /**
177
+ * Check if an output port is connected to anything
178
+ * Used to skip generating code for unused outputs (optimization)
179
+ */
180
+ isOutputConnected(blockIdOrType, portId) {
181
+ // If blockIdOrType looks like a type (contains '.'), use current block ID
182
+ const blockId = blockIdOrType.includes('.') ? this.currentBlockId : blockIdOrType;
183
+ // Check if any connection uses this output
184
+ return this.graph.connections.some(conn => conn.from.blockId === blockId && conn.from.portId === portId);
185
+ }
186
+ /**
187
+ * Get the register that feeds a block's input port
188
+ * Returns null if input is not connected (for optional inputs like CV)
189
+ */
190
+ getInputRegister(blockIdOrType, portId) {
191
+ // If blockIdOrType looks like a type (contains '.'), use current block ID
192
+ const blockId = blockIdOrType.includes('.') ? this.currentBlockId : blockIdOrType;
193
+ // Find the connection feeding this input
194
+ const connection = this.graph.connections.find(conn => conn.to.blockId === blockId && conn.to.portId === portId);
195
+ if (!connection) {
196
+ // No connection - this is OK for optional inputs
197
+ return null;
198
+ }
199
+ // Find the register allocated to the source output
200
+ const allocation = this.registerAllocations.find(alloc => alloc.blockId === connection.from.blockId &&
201
+ alloc.portId === connection.from.portId);
202
+ if (!allocation) {
203
+ throw new Error(`No register allocated for ${connection.from.blockId}.${connection.from.portId}`);
204
+ }
205
+ // Return the alias (symbolic name) instead of raw register name
206
+ return allocation.alias;
207
+ }
208
+ /**
209
+ * Check if an input port is connected to a zero-bypass pot
210
+ */
211
+ isInputZeroBypassed(blockIdOrType, portId) {
212
+ const blockId = blockIdOrType.includes('.') ? this.currentBlockId : blockIdOrType;
213
+ // Find the connection feeding this input
214
+ const connection = this.graph.connections.find(conn => conn.to.blockId === blockId && conn.to.portId === portId);
215
+ if (!connection) {
216
+ return false;
217
+ }
218
+ // Check the source block
219
+ const sourceBlock = this.graph.blocks.find(b => b.id === connection.from.blockId);
220
+ if (sourceBlock && sourceBlock.type === 'input.pot') {
221
+ return sourceBlock.parameters['ignoreIfZero'] === true;
222
+ }
223
+ return false;
224
+ }
225
+ /**
226
+ * Get the zeroValue from a connected zero-bypass pot
227
+ * Returns 0 if not connected to a zero-bypass pot
228
+ */
229
+ getInputZeroValue(blockIdOrType, portId) {
230
+ const blockId = blockIdOrType.includes('.') ? this.currentBlockId : blockIdOrType;
231
+ const connection = this.graph.connections.find(conn => conn.to.blockId === blockId && conn.to.portId === portId);
232
+ if (!connection) {
233
+ return 0;
234
+ }
235
+ const sourceBlock = this.graph.blocks.find(b => b.id === connection.from.blockId);
236
+ if (sourceBlock && sourceBlock.type === 'input.pot' && sourceBlock.parameters['ignoreIfZero'] === true) {
237
+ return sourceBlock.parameters['zeroValue'] ?? 0;
238
+ }
239
+ return 0;
240
+ }
241
+ /**
242
+ * Allocate a register for a block's output port
243
+ * These are permanent registers allocated from REG0 upward
244
+ */
245
+ allocateRegister(blockIdOrType, portId) {
246
+ // If blockIdOrType looks like a type (contains '.'), use current block ID
247
+ const blockId = blockIdOrType.includes('.') ? this.currentBlockId : blockIdOrType;
248
+ // Check if already allocated
249
+ const existing = this.registerAllocations.find(alloc => alloc.blockId === blockId && alloc.portId === portId);
250
+ if (existing) {
251
+ return existing.alias; // Return alias, not raw register name
252
+ }
253
+ // NOTE: No hard limit check here. Registers are allowed to spill past REG31
254
+ // during code generation. The actual limit is enforced post-optimization
255
+ // after dead store elimination and register renumbering compact the set.
256
+ const registerName = `REG${this.nextRegister}`;
257
+ this.nextRegister++;
258
+ // Generate a meaningful alias for this register
259
+ const alias = this.generateRegisterAlias(blockId, portId);
260
+ this.registerAllocations.push({
261
+ blockId,
262
+ portId,
263
+ register: registerName,
264
+ alias
265
+ });
266
+ return alias; // Return the alias, not the raw register name
267
+ }
268
+ /**
269
+ * Generate a meaningful alias for a register
270
+ */
271
+ generateRegisterAlias(blockId, portId) {
272
+ // Get the block to find its type
273
+ const block = this.graph.blocks.find(b => b.id === blockId);
274
+ if (!block) {
275
+ // Fallback to blockId
276
+ return this.sanitizeIdentifier(`${blockId}_${portId}`);
277
+ }
278
+ // Create alias from block type and port
279
+ // e.g., "input.adcl" + "out" -> "adcl_out"
280
+ // e.g., "math.gain" + "out" -> "gain_out"
281
+ const typeParts = block.type.split('.');
282
+ const baseName = typeParts[typeParts.length - 1]; // Get last part (e.g., "adcl", "gain")
283
+ // Special case for POT blocks: use the potNumber parameter
284
+ let suffix = '';
285
+ if (block.type === 'input.pot') {
286
+ const potNum = (block.parameters && block.parameters.potNumber !== undefined && block.parameters.potNumber !== null)
287
+ ? block.parameters.potNumber
288
+ : 0;
289
+ suffix = `${potNum}`;
290
+ }
291
+ else if (this.graph.blocks.filter(b => b.type === block.type).length > 1) {
292
+ // If there are multiple blocks of the same type, add a number
293
+ const sameTypeBlocks = this.graph.blocks.filter(b => b.type === block.type);
294
+ const index = sameTypeBlocks.findIndex(b => b.id === blockId);
295
+ suffix = `${index + 1}`;
296
+ }
297
+ const baseAlias = this.sanitizeIdentifier(`${baseName}${suffix}_${portId}`);
298
+ let finalAlias = baseAlias;
299
+ let counter = 2;
300
+ // Guarantee global alias uniqueness
301
+ while (this.registerAllocations.some(a => a.alias === finalAlias && (a.blockId !== blockId || a.portId !== portId))) {
302
+ finalAlias = `${baseAlias}_${counter}`;
303
+ counter++;
304
+ }
305
+ return finalAlias;
306
+ }
307
+ /**
308
+ * Sanitize an identifier to make it valid for assembly
309
+ */
310
+ sanitizeIdentifier(name) {
311
+ return name.replace(/[^a-zA-Z0-9_]/g, '_').toLowerCase();
312
+ }
313
+ /**
314
+ * Get a scratch/temporary register for intermediate calculations
315
+ * Scratch registers are allocated from REG31 downward and are automatically
316
+ * available again after the current block's code generation completes
317
+ */
318
+ getScratchRegister() {
319
+ // NOTE: No hard limit check here. Scratch registers may temporarily overlap
320
+ // with permanent registers during code generation. The renumbering pass
321
+ // will compact everything post-optimization.
322
+ const registerName = `REG${this.nextScratchRegister}`;
323
+ this.nextScratchRegister--;
324
+ return registerName;
325
+ }
326
+ /**
327
+ * Reset scratch register allocation
328
+ * Called after each block's code generation to make scratch registers available again
329
+ */
330
+ resetScratchRegisters() {
331
+ this.nextScratchRegister = 31;
332
+ }
333
+ /**
334
+ * Register an EQU constant declaration
335
+ * For common values, use standardized names
336
+ */
337
+ registerEqu(name, value) {
338
+ // Check if already registered
339
+ if (this.hasEqu(name)) {
340
+ return name; // Already registered, skip
341
+ }
342
+ const valueStr = typeof value === 'number' ? value.toString() : value;
343
+ this.equDeclarations.push({ name, value: valueStr });
344
+ this.constantMap.set(name, valueStr);
345
+ return name;
346
+ }
347
+ /**
348
+ * Get or create a standard EQU name for a constant value
349
+ * Returns the EQU name to use in code
350
+ * Dynamically builds the constant map as values are encountered
351
+ */
352
+ getStandardConstant(value) {
353
+ // Generate a name for this constant
354
+ // Convert value to a valid identifier (e.g., 0.6 -> k_0_6, -0.6 -> k_neg_0_6)
355
+ const valueStr = value.toString().replace('.', '_');
356
+ const absValueStr = valueStr.startsWith('-') ? valueStr.substring(1) : valueStr;
357
+ let name = value < 0 ? `k_neg_${absValueStr}` : `k_${absValueStr}`;
358
+ // Check if we already have an EQU for this value
359
+ const existingName = this.constantMap.get(name);
360
+ if (existingName) {
361
+ return existingName;
362
+ }
363
+ // Register the EQU
364
+ this.registerEqu(name, value.toString());
365
+ return name;
366
+ }
367
+ /**
368
+ * Check if an EQU constant has been registered
369
+ */
370
+ hasEqu(name) {
371
+ return this.equDeclarations.some(equ => equ.name === name);
372
+ }
373
+ /**
374
+ * Register an EQU that lives only in the IR header section (not in equDeclarations).
375
+ * Prevents the EQU from being duplicated in the init/Constants section.
376
+ */
377
+ registerHeaderEqu(name) {
378
+ this.headerEquSet.add(name);
379
+ }
380
+ /**
381
+ * Returns true if an EQU has been registered for the IR header section.
382
+ */
383
+ hasHeaderEqu(name) {
384
+ return this.headerEquSet.has(name);
385
+ }
386
+ /**
387
+ * Get all registered EQU declarations
388
+ */
389
+ getEquDeclarations() {
390
+ return [...this.equDeclarations];
391
+ }
392
+ /**
393
+ * Get all register aliases for EQU declarations
394
+ */
395
+ getRegisterAliases() {
396
+ return this.registerAllocations.map(alloc => ({
397
+ alias: alloc.alias,
398
+ register: alloc.register
399
+ }));
400
+ }
401
+ /**
402
+ * Allocate delay memory for a block
403
+ */
404
+ allocateMemory(name, size) {
405
+ // If blockIdOrType looks like a type (contains '.'), use current block ID
406
+ const blockId = this.currentBlockId;
407
+ // I don't see why we would ever want to do this...
408
+ // // Check if already allocated
409
+ // const existing = this.memoryAllocations.find(
410
+ // alloc => alloc.blockId === blockId
411
+ // );
412
+ // if (existing) {
413
+ // return existing;
414
+ // }
415
+ // Check if enough memory available
416
+ if (this.nextMemoryAddress + size > this.maxMemory) {
417
+ // Update nextMemoryAddress to reflect total attempted allocation
418
+ // so getUsedMemorySize() returns the correct total when error is caught
419
+ this.nextMemoryAddress += size;
420
+ throw new Error(`Out of delay memory! Requested ${size} words, ` +
421
+ `but only ${this.maxMemory - (this.nextMemoryAddress - size)} available.`);
422
+ }
423
+ // Generate a short, unique memory name based on block type
424
+ // Follow same pattern as register aliases: use block type name + instance number
425
+ // const block = this.graph.blocks.find(b => b.id === blockId);
426
+ // let memName: string;
427
+ // if (block) {
428
+ // // Extract base name from block type (e.g., "effects.delay" -> "delay")
429
+ // const typeParts = block.type.split('.');
430
+ // const baseName = typeParts[typeParts.length - 1];
431
+ // // If there are multiple blocks of the same type, add instance number
432
+ // const sameTypeBlocks = this.graph.blocks.filter(b => b.type === block.type);
433
+ // let suffix = '';
434
+ // if (sameTypeBlocks.length > 1) {
435
+ // const index = sameTypeBlocks.findIndex(b => b.id === blockId);
436
+ // suffix = `${index + 1}`;
437
+ // }
438
+ // memName = this.sanitizeIdentifier(`mem_${baseName}${suffix}_${name}`);
439
+ // } else {
440
+ // // Fallback to generic name with counter
441
+ // memName = `mem${this.memoryAllocations.length}_${name}`;
442
+ // }
443
+ // Just use a generic name with counter
444
+ let memName = `mem${this.memoryAllocations.length}_${name}`;
445
+ // Ensure name doesn't exceed 32 characters (FV-1 limit)
446
+ if (memName.length > 32) {
447
+ memName = memName.substring(0, 32);
448
+ }
449
+ const allocation = {
450
+ blockId,
451
+ name: memName,
452
+ address: this.nextMemoryAddress,
453
+ size
454
+ };
455
+ this.memoryAllocations.push(allocation);
456
+ this.nextMemoryAddress += size;
457
+ return allocation;
458
+ }
459
+ /**
460
+ * Get a block instance
461
+ */
462
+ getBlock(blockId) {
463
+ return this.graph.blocks.find(b => b.id === blockId);
464
+ }
465
+ /**
466
+ * Get a parameter value from a block
467
+ */
468
+ getParameter(blockIdOrType, parameterId) {
469
+ // If blockIdOrType looks like a type (contains '.'), use current block ID
470
+ const blockId = blockIdOrType.includes('.') ? this.currentBlockId : blockIdOrType;
471
+ const block = this.graph.blocks.find(b => b.id === blockId);
472
+ if (!block) {
473
+ throw new Error(`Block ${blockId} not found`);
474
+ }
475
+ return block.parameters[parameterId];
476
+ }
477
+ /**
478
+ * Push an IR node
479
+ */
480
+ pushIR(node) {
481
+ this.irNodes.push(node);
482
+ }
483
+ /**
484
+ * Get a short, unique identifier for a block (e.g. "b1", "b2") to avoid long UUIDs in assembly
485
+ */
486
+ getShortId(blockId) {
487
+ const existing = this.blockShortIdMap.get(blockId);
488
+ if (existing) {
489
+ return existing;
490
+ }
491
+ const newId = `b${this.nextShortId++}`;
492
+ this.blockShortIdMap.set(blockId, newId);
493
+ return newId;
494
+ }
495
+ /**
496
+ * Get all IR nodes
497
+ */
498
+ getIR() {
499
+ return [...this.irNodes];
500
+ }
501
+ /**
502
+ * Get count of used registers
503
+ */
504
+ getUsedRegisterCount() {
505
+ return this.nextRegister;
506
+ }
507
+ /**
508
+ * Get total used memory size
509
+ */
510
+ getUsedMemorySize() {
511
+ return this.nextMemoryAddress;
512
+ }
513
+ /**
514
+ * Get all memory allocations
515
+ */
516
+ getMemoryBlocks() {
517
+ return this.memoryAllocations.map(alloc => ({
518
+ name: alloc.name,
519
+ address: alloc.address,
520
+ size: alloc.size
521
+ }));
522
+ }
523
+ /**
524
+ * Get a local variable value (used by macros)
525
+ */
526
+ getVariable(name) {
527
+ return this.blockVariables.get(name);
528
+ }
529
+ /**
530
+ * Set a local variable value (used by macros)
531
+ */
532
+ setVariable(name, value) {
533
+ this.blockVariables.set(name, value);
534
+ }
535
+ /**
536
+ * Reset allocations (for re-compilation)
537
+ */
538
+ reset() {
539
+ this.registerAllocations = [];
540
+ this.memoryAllocations = [];
541
+ this.equDeclarations = [];
542
+ this.blockVariables.clear();
543
+ this.constantMap.clear();
544
+ this.initCode = [];
545
+ this.inputCode = [];
546
+ this.mainCode = [];
547
+ this.outputCode = [];
548
+ this.flattenedCode = [];
549
+ this.nextRegister = 0;
550
+ this.nextScratchRegister = 31;
551
+ this.nextMemoryAddress = 0;
552
+ }
553
+ }
554
+ //# sourceMappingURL=CodeGenContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodeGenContext.js","sourceRoot":"","sources":["../../../src/blockDiagram/types/CodeGenContext.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Connection type definitions
3
+ */
4
+ export interface ConnectionEndpoint {
5
+ blockId: string;
6
+ portId: string;
7
+ }
8
+ export interface Connection {
9
+ id: string;
10
+ from: ConnectionEndpoint;
11
+ to: ConnectionEndpoint;
12
+ }
13
+ export interface ConnectionValidationResult {
14
+ valid: boolean;
15
+ error?: string;
16
+ }
17
+ //# sourceMappingURL=Connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Connection.d.ts","sourceRoot":"","sources":["../../../src/blockDiagram/types/Connection.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,kBAAkB,CAAC;IACzB,EAAE,EAAE,kBAAkB,CAAC;CAC1B;AAED,MAAM,WAAW,0BAA0B;IACvC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Connection type definitions
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=Connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Connection.js","sourceRoot":"","sources":["../../../src/blockDiagram/types/Connection.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Block diagram graph structure
3
+ */
4
+ import { Block } from './Block.js';
5
+ import { Connection } from './Connection.js';
6
+ export interface GraphMetadata {
7
+ name: string;
8
+ author?: string;
9
+ description?: string;
10
+ version?: string;
11
+ }
12
+ export interface CanvasState {
13
+ zoom: number;
14
+ panX: number;
15
+ panY: number;
16
+ }
17
+ export interface BlockGraph {
18
+ version: string;
19
+ metadata: GraphMetadata;
20
+ canvas: CanvasState;
21
+ blocks: Block[];
22
+ connections: Connection[];
23
+ }
24
+ /**
25
+ * Default empty graph
26
+ */
27
+ export declare function createEmptyGraph(name?: string): BlockGraph;
28
+ //# sourceMappingURL=Graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Graph.d.ts","sourceRoot":"","sources":["../../../src/blockDiagram/types/Graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,aAAa,CAAC;IACxB,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAsB,GAAG,UAAU,CAgBzE"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Block diagram graph structure
3
+ */
4
+ /**
5
+ * Default empty graph
6
+ */
7
+ export function createEmptyGraph(name = 'New Program') {
8
+ return {
9
+ version: '1.0',
10
+ metadata: {
11
+ name,
12
+ author: '',
13
+ description: ''
14
+ },
15
+ canvas: {
16
+ zoom: 1.0,
17
+ panX: 0,
18
+ panY: 0
19
+ },
20
+ blocks: [],
21
+ connections: []
22
+ };
23
+ }
24
+ //# sourceMappingURL=Graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Graph.js","sourceRoot":"","sources":["../../../src/blockDiagram/types/Graph.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0BH;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe,aAAa;IACzD,OAAO;QACH,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE;YACN,IAAI;YACJ,MAAM,EAAE,EAAE;YACV,WAAW,EAAE,EAAE;SAClB;QACD,MAAM,EAAE;YACJ,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,CAAC;YACP,IAAI,EAAE,CAAC;SACV;QACD,MAAM,EAAE,EAAE;QACV,WAAW,EAAE,EAAE;KAClB,CAAC;AACN,CAAC"}