@audiofab-io/fv1-core 0.2.3 → 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.
- package/blocks/ATL_DEVELOPER_REFERENCE.md +156 -0
- package/blocks/control/constant.atl +36 -0
- package/blocks/control/entropy_lfo.atl +74 -0
- package/blocks/control/envelope.atl +121 -0
- package/blocks/control/invert.atl +33 -0
- package/blocks/control/pot.atl +150 -0
- package/blocks/control/power.atl +77 -0
- package/blocks/control/ramp_lfo.atl +122 -0
- package/blocks/control/scale_offset.atl +84 -0
- package/blocks/control/sincos_lfo.atl +126 -0
- package/blocks/control/smoother.atl +48 -0
- package/blocks/control/tremolizer.atl +55 -0
- package/blocks/effects/delay/micro_stutter.atl +77 -0
- package/blocks/effects/delay/mn3011.atl +281 -0
- package/blocks/effects/delay/simple_delay.atl +96 -0
- package/blocks/effects/delay/triple_tap_delay.atl +176 -0
- package/blocks/effects/lo-fi/bit_mangler.atl +74 -0
- package/blocks/effects/lo-fi/chiptune.atl +311 -0
- package/blocks/effects/lo-fi/tape_degrade.atl +181 -0
- package/blocks/effects/modulation/chorus.atl +141 -0
- package/blocks/effects/modulation/chorus_4voice.atl +188 -0
- package/blocks/effects/modulation/flanger.atl +184 -0
- package/blocks/effects/modulation/guitar_synth.atl +350 -0
- package/blocks/effects/modulation/harmonic_trem.atl +129 -0
- package/blocks/effects/modulation/organ_synth.atl +326 -0
- package/blocks/effects/modulation/phaser.atl +300 -0
- package/blocks/effects/pitch/octave_up_down.atl +80 -0
- package/blocks/effects/pitch/pitch_offset.atl +149 -0
- package/blocks/effects/pitch/pitch_offset_dual.atl +197 -0
- package/blocks/effects/pitch/pitch_shift.atl +115 -0
- package/blocks/effects/pitch/sub_octave.atl +100 -0
- package/blocks/effects/reverb/ducking_reverb.atl +145 -0
- package/blocks/effects/reverb/min_reverb.atl +132 -0
- package/blocks/effects/reverb/plate_reverb.atl +344 -0
- package/blocks/effects/reverb/room_reverb.atl +293 -0
- package/blocks/effects/reverb/smear.atl +90 -0
- package/blocks/effects/reverb/spring_reverb.atl +353 -0
- package/blocks/filter/1p_high_pass.atl +63 -0
- package/blocks/filter/1p_low_pass.atl +59 -0
- package/blocks/filter/auto_wah.atl +207 -0
- package/blocks/filter/bbd_loss.atl +79 -0
- package/blocks/filter/shelving_high_pass.atl +76 -0
- package/blocks/filter/shelving_low_pass.atl +76 -0
- package/blocks/filter/svf_2p.atl +116 -0
- package/blocks/gain_mix/crossfade.atl +93 -0
- package/blocks/gain_mix/crossfade2.atl +86 -0
- package/blocks/gain_mix/crossfade3.atl +71 -0
- package/blocks/gain_mix/gainboost.atl +54 -0
- package/blocks/gain_mix/mixer2.atl +76 -0
- package/blocks/gain_mix/mixer3.atl +109 -0
- package/blocks/gain_mix/mixer4.atl +152 -0
- package/blocks/gain_mix/volume.atl +51 -0
- package/blocks/io/adc.atl +53 -0
- package/blocks/io/dac.atl +61 -0
- package/blocks/other/stickynote.atl +24 -0
- package/blocks/other/tone_gen_adjustable.atl +137 -0
- package/blocks/other/tone_gen_fixed.atl +109 -0
- package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts +13 -0
- package/dist/blockDiagram/blocks/BlockDirectoryLoader.d.ts.map +1 -0
- package/dist/blockDiagram/blocks/BlockDirectoryLoader.js +44 -0
- package/dist/blockDiagram/blocks/BlockDirectoryLoader.js.map +1 -0
- package/dist/blockDiagram/blocks/BlockRegistry.d.ts +48 -0
- package/dist/blockDiagram/blocks/BlockRegistry.d.ts.map +1 -0
- package/dist/blockDiagram/blocks/BlockRegistry.js +109 -0
- package/dist/blockDiagram/blocks/BlockRegistry.js.map +1 -0
- package/dist/blockDiagram/blocks/TemplateBlock.d.ts +20 -0
- package/dist/blockDiagram/blocks/TemplateBlock.d.ts.map +1 -0
- package/dist/blockDiagram/blocks/TemplateBlock.js +82 -0
- package/dist/blockDiagram/blocks/TemplateBlock.js.map +1 -0
- package/dist/blockDiagram/blocks/base/BaseBlock.d.ts +248 -0
- package/dist/blockDiagram/blocks/base/BaseBlock.d.ts.map +1 -0
- package/dist/blockDiagram/blocks/base/BaseBlock.js +402 -0
- package/dist/blockDiagram/blocks/base/BaseBlock.js.map +1 -0
- package/dist/blockDiagram/builtinBlocks.d.ts +9 -0
- package/dist/blockDiagram/builtinBlocks.d.ts.map +1 -0
- package/dist/blockDiagram/builtinBlocks.js +4912 -0
- package/dist/blockDiagram/builtinBlocks.js.map +1 -0
- package/dist/blockDiagram/compiler/BlockTemplate.d.ts +37 -0
- package/dist/blockDiagram/compiler/BlockTemplate.d.ts.map +1 -0
- package/dist/blockDiagram/compiler/BlockTemplate.js +860 -0
- package/dist/blockDiagram/compiler/BlockTemplate.js.map +1 -0
- package/dist/blockDiagram/compiler/CodeOptimizer.d.ts +75 -0
- package/dist/blockDiagram/compiler/CodeOptimizer.d.ts.map +1 -0
- package/dist/blockDiagram/compiler/CodeOptimizer.js +443 -0
- package/dist/blockDiagram/compiler/CodeOptimizer.js.map +1 -0
- package/dist/blockDiagram/compiler/GraphCompiler.d.ts +63 -0
- package/dist/blockDiagram/compiler/GraphCompiler.d.ts.map +1 -0
- package/dist/blockDiagram/compiler/GraphCompiler.js +656 -0
- package/dist/blockDiagram/compiler/GraphCompiler.js.map +1 -0
- package/dist/blockDiagram/compiler/TopologicalSort.d.ts +63 -0
- package/dist/blockDiagram/compiler/TopologicalSort.d.ts.map +1 -0
- package/dist/blockDiagram/compiler/TopologicalSort.js +268 -0
- package/dist/blockDiagram/compiler/TopologicalSort.js.map +1 -0
- package/dist/blockDiagram/index.d.ts +30 -0
- package/dist/blockDiagram/index.d.ts.map +1 -0
- package/dist/blockDiagram/index.js +29 -0
- package/dist/blockDiagram/index.js.map +1 -0
- package/dist/blockDiagram/types/Block.d.ts +178 -0
- package/dist/blockDiagram/types/Block.d.ts.map +1 -0
- package/dist/blockDiagram/types/Block.js +5 -0
- package/dist/blockDiagram/types/Block.js.map +1 -0
- package/dist/blockDiagram/types/CodeGenContext.d.ts +235 -0
- package/dist/blockDiagram/types/CodeGenContext.d.ts.map +1 -0
- package/dist/blockDiagram/types/CodeGenContext.js +554 -0
- package/dist/blockDiagram/types/CodeGenContext.js.map +1 -0
- package/dist/blockDiagram/types/Connection.d.ts +17 -0
- package/dist/blockDiagram/types/Connection.d.ts.map +1 -0
- package/dist/blockDiagram/types/Connection.js +5 -0
- package/dist/blockDiagram/types/Connection.js.map +1 -0
- package/dist/blockDiagram/types/Graph.d.ts +28 -0
- package/dist/blockDiagram/types/Graph.d.ts.map +1 -0
- package/dist/blockDiagram/types/Graph.js +24 -0
- package/dist/blockDiagram/types/Graph.js.map +1 -0
- package/dist/blockDiagram/types/IR.d.ts +79 -0
- package/dist/blockDiagram/types/IR.d.ts.map +1 -0
- package/dist/blockDiagram/types/IR.js +6 -0
- package/dist/blockDiagram/types/IR.js.map +1 -0
- package/dist/blockDiagram/utils/SpinCADConverter.d.ts +17 -0
- package/dist/blockDiagram/utils/SpinCADConverter.d.ts.map +1 -0
- package/dist/blockDiagram/utils/SpinCADConverter.js +307 -0
- package/dist/blockDiagram/utils/SpinCADConverter.js.map +1 -0
- package/dist/effect/compileEffect.d.ts +51 -0
- package/dist/effect/compileEffect.d.ts.map +1 -0
- package/dist/effect/compileEffect.js +133 -0
- package/dist/effect/compileEffect.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +17 -5
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphCompiler.js","sourceRoot":"","sources":["../../../src/blockDiagram/compiler/GraphCompiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topological sort for block execution order
|
|
3
|
+
* Ensures blocks are processed in dependency order
|
|
4
|
+
*/
|
|
5
|
+
import { BlockGraph } from '../types/Graph.js';
|
|
6
|
+
export interface TopologicalSortResult {
|
|
7
|
+
success: boolean;
|
|
8
|
+
order?: string[];
|
|
9
|
+
feedbackConnections?: Set<string>;
|
|
10
|
+
error?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class TopologicalSort {
|
|
13
|
+
/**
|
|
14
|
+
* Perform topological sort on the block graph using reverse traversal from outputs
|
|
15
|
+
*
|
|
16
|
+
* Algorithm:
|
|
17
|
+
* 1. Identify and exclude feedback connections to break cycles
|
|
18
|
+
* 2. Find all terminal nodes (blocks with no outgoing connections)
|
|
19
|
+
* 3. For each terminal node, traverse backwards through parents
|
|
20
|
+
* 4. Generate code for leaf nodes (no inputs) first, working forward
|
|
21
|
+
* 5. Each block is generated only once
|
|
22
|
+
* 6. Feedback loops are detected by tracking visiting blocks in current path
|
|
23
|
+
*/
|
|
24
|
+
sort(graph: BlockGraph): TopologicalSortResult;
|
|
25
|
+
/**
|
|
26
|
+
* Identify feedback connections by detecting which connections create cycles.
|
|
27
|
+
* Uses a heuristic approach: connections that target "feedback" or "fb" ports
|
|
28
|
+
* are candidates, and we verify they're part of a cycle.
|
|
29
|
+
*/
|
|
30
|
+
private identifyFeedbackConnections;
|
|
31
|
+
/**
|
|
32
|
+
* Build a map of blockId -> blocks that provide inputs to it (parents)
|
|
33
|
+
* @param graph The block graph
|
|
34
|
+
* @param feedbackConnections Set of connection IDs to exclude (these are feedback paths)
|
|
35
|
+
*/
|
|
36
|
+
private buildParentMap;
|
|
37
|
+
/**
|
|
38
|
+
* Build a map of blockId -> blocks that consume its outputs (children)
|
|
39
|
+
* @param graph The block graph
|
|
40
|
+
* @param feedbackConnections Set of connection IDs to exclude (these are feedback paths)
|
|
41
|
+
*/
|
|
42
|
+
private buildChildMap;
|
|
43
|
+
/**
|
|
44
|
+
* Build a map of blockId -> blocks it depends on
|
|
45
|
+
* A block depends on all blocks that connect to its inputs
|
|
46
|
+
* @param graph The block graph
|
|
47
|
+
* @param feedbackConnections Set of connection IDs to exclude (these are feedback paths)
|
|
48
|
+
*
|
|
49
|
+
* Feedback connections are EXCLUDED from the dependency map to break cycles.
|
|
50
|
+
* They are handled separately to ensure proper execution order.
|
|
51
|
+
*/
|
|
52
|
+
private buildDependencyMap;
|
|
53
|
+
/**
|
|
54
|
+
* Check if the graph has cycles using DFS
|
|
55
|
+
* Used internally for feedback detection
|
|
56
|
+
*/
|
|
57
|
+
private hasCyclesInternal;
|
|
58
|
+
/**
|
|
59
|
+
* Detect if graph has cycles
|
|
60
|
+
*/
|
|
61
|
+
hasCycles(graph: BlockGraph): boolean;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=TopologicalSort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopologicalSort.d.ts","sourceRoot":"","sources":["../../../src/blockDiagram/compiler/TopologicalSort.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAG/C,MAAM,WAAW,qBAAqB;IAClC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,mBAAmB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,eAAe;IACxB;;;;;;;;;;OAUG;IACH,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,qBAAqB;IAgG9C;;;;OAIG;IACH,OAAO,CAAC,2BAA2B;IAqCnC;;;;OAIG;IACH,OAAO,CAAC,cAAc;IA+BtB;;;;OAIG;IACH,OAAO,CAAC,aAAa;IA+BrB;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IAgC1B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAuCzB;;OAEG;IACH,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;CAIxC"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Topological sort for block execution order
|
|
3
|
+
* Ensures blocks are processed in dependency order
|
|
4
|
+
*/
|
|
5
|
+
export class TopologicalSort {
|
|
6
|
+
/**
|
|
7
|
+
* Perform topological sort on the block graph using reverse traversal from outputs
|
|
8
|
+
*
|
|
9
|
+
* Algorithm:
|
|
10
|
+
* 1. Identify and exclude feedback connections to break cycles
|
|
11
|
+
* 2. Find all terminal nodes (blocks with no outgoing connections)
|
|
12
|
+
* 3. For each terminal node, traverse backwards through parents
|
|
13
|
+
* 4. Generate code for leaf nodes (no inputs) first, working forward
|
|
14
|
+
* 5. Each block is generated only once
|
|
15
|
+
* 6. Feedback loops are detected by tracking visiting blocks in current path
|
|
16
|
+
*/
|
|
17
|
+
sort(graph) {
|
|
18
|
+
// Identify potential feedback connections by detecting cycles
|
|
19
|
+
const feedbackConnections = this.identifyFeedbackConnections(graph);
|
|
20
|
+
// Build parent map INCLUDING feedback connections (we need to visit all parents)
|
|
21
|
+
const allParents = this.buildParentMap(graph, new Set());
|
|
22
|
+
// Build child map EXCLUDING feedback connections (to find true terminal nodes)
|
|
23
|
+
const children = this.buildChildMap(graph, feedbackConnections);
|
|
24
|
+
// Track generated blocks and current path (for feedback detection)
|
|
25
|
+
const generated = new Set();
|
|
26
|
+
const sorted = [];
|
|
27
|
+
/**
|
|
28
|
+
* Recursively visit a block and its parents, generating code in dependency order
|
|
29
|
+
* @param blockId The block to visit
|
|
30
|
+
* @param visiting Blocks currently being visited in this path (for feedback detection)
|
|
31
|
+
*/
|
|
32
|
+
const visitReverse = (blockId, visiting) => {
|
|
33
|
+
// Already generated? Skip it
|
|
34
|
+
if (generated.has(blockId)) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Visiting again in same path? Feedback loop - skip it
|
|
38
|
+
if (visiting.has(blockId)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Mark as visiting for this path
|
|
42
|
+
const newVisiting = new Set(visiting);
|
|
43
|
+
newVisiting.add(blockId);
|
|
44
|
+
// First, recursively visit all parents (blocks providing inputs)
|
|
45
|
+
// This includes feedback connections, so we visit the entire feedback path
|
|
46
|
+
const parentBlocks = allParents.get(blockId) || [];
|
|
47
|
+
for (const parentId of parentBlocks) {
|
|
48
|
+
visitReverse(parentId, newVisiting);
|
|
49
|
+
}
|
|
50
|
+
// All parents have been generated, now generate this block
|
|
51
|
+
if (!generated.has(blockId)) {
|
|
52
|
+
generated.add(blockId);
|
|
53
|
+
sorted.push(blockId);
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
// Find all terminal nodes (blocks with no children - no outgoing connections)
|
|
57
|
+
// Use children map that excludes feedback, so feedback path blocks aren't terminals
|
|
58
|
+
// BUT: Exclude completely disconnected blocks (no connections at all)
|
|
59
|
+
const terminalNodes = [];
|
|
60
|
+
for (const block of graph.blocks) {
|
|
61
|
+
const blockChildren = children.get(block.id) || [];
|
|
62
|
+
if (blockChildren.length === 0) {
|
|
63
|
+
// Check if this block has ANY connections before treating it as a terminal
|
|
64
|
+
const hasConnections = graph.connections.some(c => c.from.blockId === block.id || c.to.blockId === block.id);
|
|
65
|
+
// Only add to terminals if it has at least some connections
|
|
66
|
+
if (hasConnections) {
|
|
67
|
+
terminalNodes.push(block.id);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Process each terminal node, traversing backwards
|
|
72
|
+
for (const terminalId of terminalNodes) {
|
|
73
|
+
visitReverse(terminalId, new Set());
|
|
74
|
+
}
|
|
75
|
+
// Handle any orphaned blocks (not connected to terminal nodes)
|
|
76
|
+
// BUT: Skip completely disconnected blocks (no connections at all)
|
|
77
|
+
for (const block of graph.blocks) {
|
|
78
|
+
if (!generated.has(block.id)) {
|
|
79
|
+
// Check if this block has ANY connections (input or output)
|
|
80
|
+
const hasConnections = graph.connections.some(c => c.from.blockId === block.id || c.to.blockId === block.id);
|
|
81
|
+
// Only process orphaned blocks that have at least some connections
|
|
82
|
+
if (hasConnections) {
|
|
83
|
+
visitReverse(block.id, new Set());
|
|
84
|
+
}
|
|
85
|
+
// Completely disconnected blocks are silently skipped
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
success: true,
|
|
90
|
+
order: sorted,
|
|
91
|
+
feedbackConnections
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Identify feedback connections by detecting which connections create cycles.
|
|
96
|
+
* Uses a heuristic approach: connections that target "feedback" or "fb" ports
|
|
97
|
+
* are candidates, and we verify they're part of a cycle.
|
|
98
|
+
*/
|
|
99
|
+
identifyFeedbackConnections(graph) {
|
|
100
|
+
const feedbackConnections = new Set();
|
|
101
|
+
// First pass: Mark connections to ports with "feedback" in the name as candidates
|
|
102
|
+
const feedbackCandidates = new Set();
|
|
103
|
+
for (const conn of graph.connections) {
|
|
104
|
+
const portId = conn.to.portId.toLowerCase();
|
|
105
|
+
if (portId.includes('feedback') || portId.includes('fb') || portId === 'fb_in') {
|
|
106
|
+
feedbackCandidates.add(conn.id);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Second pass: Test each candidate - if removing it breaks the cycle, it's a feedback connection
|
|
110
|
+
for (const candidateId of feedbackCandidates) {
|
|
111
|
+
const testGraph = {
|
|
112
|
+
...graph,
|
|
113
|
+
connections: graph.connections.filter(c => c.id !== candidateId)
|
|
114
|
+
};
|
|
115
|
+
if (!this.hasCyclesInternal(testGraph)) {
|
|
116
|
+
// Removing this connection breaks a cycle, so it's a feedback connection
|
|
117
|
+
feedbackConnections.add(candidateId);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// If we still have cycles, try removing self-loops
|
|
121
|
+
if (this.hasCyclesInternal(graph)) {
|
|
122
|
+
for (const conn of graph.connections) {
|
|
123
|
+
if (conn.from.blockId === conn.to.blockId) {
|
|
124
|
+
feedbackConnections.add(conn.id);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return feedbackConnections;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Build a map of blockId -> blocks that provide inputs to it (parents)
|
|
132
|
+
* @param graph The block graph
|
|
133
|
+
* @param feedbackConnections Set of connection IDs to exclude (these are feedback paths)
|
|
134
|
+
*/
|
|
135
|
+
buildParentMap(graph, feedbackConnections) {
|
|
136
|
+
const map = new Map();
|
|
137
|
+
// Initialize map for all blocks
|
|
138
|
+
for (const block of graph.blocks) {
|
|
139
|
+
map.set(block.id, []);
|
|
140
|
+
}
|
|
141
|
+
// Add parent relationships based on connections
|
|
142
|
+
for (const connection of graph.connections) {
|
|
143
|
+
// Ignore self-loops
|
|
144
|
+
if (connection.from.blockId === connection.to.blockId) {
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
// Skip feedback connections
|
|
148
|
+
if (feedbackConnections.has(connection.id)) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
// connection.from is a parent of connection.to
|
|
152
|
+
const parentList = map.get(connection.to.blockId) || [];
|
|
153
|
+
if (!parentList.includes(connection.from.blockId)) {
|
|
154
|
+
parentList.push(connection.from.blockId);
|
|
155
|
+
}
|
|
156
|
+
map.set(connection.to.blockId, parentList);
|
|
157
|
+
}
|
|
158
|
+
return map;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Build a map of blockId -> blocks that consume its outputs (children)
|
|
162
|
+
* @param graph The block graph
|
|
163
|
+
* @param feedbackConnections Set of connection IDs to exclude (these are feedback paths)
|
|
164
|
+
*/
|
|
165
|
+
buildChildMap(graph, feedbackConnections) {
|
|
166
|
+
const map = new Map();
|
|
167
|
+
// Initialize map for all blocks
|
|
168
|
+
for (const block of graph.blocks) {
|
|
169
|
+
map.set(block.id, []);
|
|
170
|
+
}
|
|
171
|
+
// Add child relationships based on connections
|
|
172
|
+
for (const connection of graph.connections) {
|
|
173
|
+
// Ignore self-loops
|
|
174
|
+
if (connection.from.blockId === connection.to.blockId) {
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
// Skip feedback connections
|
|
178
|
+
if (feedbackConnections.has(connection.id)) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
// connection.to is a child of connection.from
|
|
182
|
+
const childList = map.get(connection.from.blockId) || [];
|
|
183
|
+
if (!childList.includes(connection.to.blockId)) {
|
|
184
|
+
childList.push(connection.to.blockId);
|
|
185
|
+
}
|
|
186
|
+
map.set(connection.from.blockId, childList);
|
|
187
|
+
}
|
|
188
|
+
return map;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Build a map of blockId -> blocks it depends on
|
|
192
|
+
* A block depends on all blocks that connect to its inputs
|
|
193
|
+
* @param graph The block graph
|
|
194
|
+
* @param feedbackConnections Set of connection IDs to exclude (these are feedback paths)
|
|
195
|
+
*
|
|
196
|
+
* Feedback connections are EXCLUDED from the dependency map to break cycles.
|
|
197
|
+
* They are handled separately to ensure proper execution order.
|
|
198
|
+
*/
|
|
199
|
+
buildDependencyMap(graph, feedbackConnections) {
|
|
200
|
+
const map = new Map();
|
|
201
|
+
// Initialize map for all blocks
|
|
202
|
+
for (const block of graph.blocks) {
|
|
203
|
+
map.set(block.id, []);
|
|
204
|
+
}
|
|
205
|
+
// Add dependencies based on connections
|
|
206
|
+
for (const connection of graph.connections) {
|
|
207
|
+
// Ignore self-loops (block connected to itself)
|
|
208
|
+
// These are valid for delay/memory-based blocks
|
|
209
|
+
if (connection.from.blockId === connection.to.blockId) {
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
// Skip feedback connections - they don't create forward dependencies
|
|
213
|
+
if (feedbackConnections.has(connection.id)) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
// Normal forward connection: destination depends on source
|
|
217
|
+
const deps = map.get(connection.to.blockId) || [];
|
|
218
|
+
if (!deps.includes(connection.from.blockId)) {
|
|
219
|
+
deps.push(connection.from.blockId);
|
|
220
|
+
}
|
|
221
|
+
map.set(connection.to.blockId, deps);
|
|
222
|
+
}
|
|
223
|
+
return map;
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if the graph has cycles using DFS
|
|
227
|
+
* Used internally for feedback detection
|
|
228
|
+
*/
|
|
229
|
+
hasCyclesInternal(graph) {
|
|
230
|
+
const visited = new Set();
|
|
231
|
+
const visiting = new Set();
|
|
232
|
+
const dependencies = this.buildDependencyMap(graph, new Set()); // No feedback exclusions
|
|
233
|
+
const visit = (blockId) => {
|
|
234
|
+
if (visited.has(blockId)) {
|
|
235
|
+
return false; // No cycle on this path
|
|
236
|
+
}
|
|
237
|
+
if (visiting.has(blockId)) {
|
|
238
|
+
return true; // Cycle detected!
|
|
239
|
+
}
|
|
240
|
+
visiting.add(blockId);
|
|
241
|
+
const deps = dependencies.get(blockId) || [];
|
|
242
|
+
for (const depId of deps) {
|
|
243
|
+
if (visit(depId)) {
|
|
244
|
+
return true;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
visiting.delete(blockId);
|
|
248
|
+
visited.add(blockId);
|
|
249
|
+
return false;
|
|
250
|
+
};
|
|
251
|
+
for (const block of graph.blocks) {
|
|
252
|
+
if (!visited.has(block.id)) {
|
|
253
|
+
if (visit(block.id)) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Detect if graph has cycles
|
|
262
|
+
*/
|
|
263
|
+
hasCycles(graph) {
|
|
264
|
+
const result = this.sort(graph);
|
|
265
|
+
return !result.success;
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=TopologicalSort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopologicalSort.js","sourceRoot":"","sources":["../../../src/blockDiagram/compiler/TopologicalSort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point for the block-diagram compiler and registry.
|
|
3
|
+
*
|
|
4
|
+
* Typical browser usage:
|
|
5
|
+
* import { BlockRegistry, BUILTIN_BLOCKS, GraphCompiler } from '@audiofab-io/fv1-core/blockDiagram';
|
|
6
|
+
* const registry = new BlockRegistry();
|
|
7
|
+
* registry.loadManifest(BUILTIN_BLOCKS);
|
|
8
|
+
* const compiler = new GraphCompiler(registry);
|
|
9
|
+
* const result = compiler.compile(graph, { regCount: 32, progSize: 128, delaySize: 32768 });
|
|
10
|
+
*
|
|
11
|
+
* Node consumers can additionally pull in `loadBlocksFromDirectory` to
|
|
12
|
+
* extend the registry with user-supplied ATL directories.
|
|
13
|
+
*/
|
|
14
|
+
export { BlockRegistry, blockRegistry } from './blocks/BlockRegistry.js';
|
|
15
|
+
export { TemplateBlock } from './blocks/TemplateBlock.js';
|
|
16
|
+
export { BaseBlock } from './blocks/base/BaseBlock.js';
|
|
17
|
+
export { BUILTIN_BLOCKS } from './builtinBlocks.js';
|
|
18
|
+
export { GraphCompiler } from './compiler/GraphCompiler.js';
|
|
19
|
+
export type { CompilationResult, CompilationStatistics } from './compiler/GraphCompiler.js';
|
|
20
|
+
export { BlockTemplate } from './compiler/BlockTemplate.js';
|
|
21
|
+
export { CodeOptimizer, OptimizationLevel } from './compiler/CodeOptimizer.js';
|
|
22
|
+
export { TopologicalSort } from './compiler/TopologicalSort.js';
|
|
23
|
+
export type { IBlockDefinition, BlockMetadata, Block, CodeGenContext, } from './types/Block.js';
|
|
24
|
+
export type { BlockGraph } from './types/Graph.js';
|
|
25
|
+
export { createEmptyGraph } from './types/Graph.js';
|
|
26
|
+
export type { Connection } from './types/Connection.js';
|
|
27
|
+
export type { BlockTemplateDefinition, IRNode, IRSection } from './types/IR.js';
|
|
28
|
+
export { CodeGenerationContext } from './types/CodeGenContext.js';
|
|
29
|
+
export { SpinCADConverter } from './utils/SpinCADConverter.js';
|
|
30
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blockDiagram/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAGvD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGpD,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAGhE,YAAY,EACR,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,cAAc,GACjB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,YAAY,EAAE,uBAAuB,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point for the block-diagram compiler and registry.
|
|
3
|
+
*
|
|
4
|
+
* Typical browser usage:
|
|
5
|
+
* import { BlockRegistry, BUILTIN_BLOCKS, GraphCompiler } from '@audiofab-io/fv1-core/blockDiagram';
|
|
6
|
+
* const registry = new BlockRegistry();
|
|
7
|
+
* registry.loadManifest(BUILTIN_BLOCKS);
|
|
8
|
+
* const compiler = new GraphCompiler(registry);
|
|
9
|
+
* const result = compiler.compile(graph, { regCount: 32, progSize: 128, delaySize: 32768 });
|
|
10
|
+
*
|
|
11
|
+
* Node consumers can additionally pull in `loadBlocksFromDirectory` to
|
|
12
|
+
* extend the registry with user-supplied ATL directories.
|
|
13
|
+
*/
|
|
14
|
+
// Registry
|
|
15
|
+
export { BlockRegistry, blockRegistry } from './blocks/BlockRegistry.js';
|
|
16
|
+
export { TemplateBlock } from './blocks/TemplateBlock.js';
|
|
17
|
+
export { BaseBlock } from './blocks/base/BaseBlock.js';
|
|
18
|
+
// Built-in block manifest (generated from blocks/**/*.atl at build time)
|
|
19
|
+
export { BUILTIN_BLOCKS } from './builtinBlocks.js';
|
|
20
|
+
// Compiler
|
|
21
|
+
export { GraphCompiler } from './compiler/GraphCompiler.js';
|
|
22
|
+
export { BlockTemplate } from './compiler/BlockTemplate.js';
|
|
23
|
+
export { CodeOptimizer, OptimizationLevel } from './compiler/CodeOptimizer.js';
|
|
24
|
+
export { TopologicalSort } from './compiler/TopologicalSort.js';
|
|
25
|
+
export { createEmptyGraph } from './types/Graph.js';
|
|
26
|
+
export { CodeGenerationContext } from './types/CodeGenContext.js';
|
|
27
|
+
// Utilities
|
|
28
|
+
export { SpinCADConverter } from './utils/SpinCADConverter.js';
|
|
29
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blockDiagram/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAEvD,yEAAyE;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAUhE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core type definitions for FV-1 block diagram programming
|
|
3
|
+
*/
|
|
4
|
+
export interface BlockPosition {
|
|
5
|
+
x: number;
|
|
6
|
+
y: number;
|
|
7
|
+
}
|
|
8
|
+
export interface BlockPort {
|
|
9
|
+
id: string;
|
|
10
|
+
name: string;
|
|
11
|
+
type: 'audio' | 'control';
|
|
12
|
+
required?: boolean;
|
|
13
|
+
parameter?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface BlockParameter {
|
|
16
|
+
id: string;
|
|
17
|
+
name: string;
|
|
18
|
+
type: 'number' | 'select' | 'boolean' | 'string';
|
|
19
|
+
default: any;
|
|
20
|
+
min?: number;
|
|
21
|
+
max?: number;
|
|
22
|
+
step?: number;
|
|
23
|
+
options?: Array<{
|
|
24
|
+
label: string;
|
|
25
|
+
value: any;
|
|
26
|
+
}>;
|
|
27
|
+
description?: string;
|
|
28
|
+
multiline?: boolean;
|
|
29
|
+
displayMin?: number;
|
|
30
|
+
displayMax?: number;
|
|
31
|
+
displayStep?: number;
|
|
32
|
+
displayDecimals?: number;
|
|
33
|
+
displayUnit?: string;
|
|
34
|
+
toDisplay?: (codeValue: number) => number;
|
|
35
|
+
fromDisplay?: (displayValue: number) => number;
|
|
36
|
+
conversion?: string;
|
|
37
|
+
visibleIf?: string;
|
|
38
|
+
}
|
|
39
|
+
export interface BlockMetadata {
|
|
40
|
+
type: string;
|
|
41
|
+
category: string;
|
|
42
|
+
subcategory?: string;
|
|
43
|
+
name: string;
|
|
44
|
+
description: string;
|
|
45
|
+
color: string;
|
|
46
|
+
icon?: string;
|
|
47
|
+
width: number;
|
|
48
|
+
height: number;
|
|
49
|
+
inputs: BlockPort[];
|
|
50
|
+
outputs: BlockPort[];
|
|
51
|
+
parameters: BlockParameter[];
|
|
52
|
+
hasCustomLabel?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface Block {
|
|
55
|
+
id: string;
|
|
56
|
+
type: string;
|
|
57
|
+
position: BlockPosition;
|
|
58
|
+
parameters: Record<string, any>;
|
|
59
|
+
}
|
|
60
|
+
export interface ValidationResult {
|
|
61
|
+
valid: boolean;
|
|
62
|
+
error?: string;
|
|
63
|
+
warnings?: string[];
|
|
64
|
+
}
|
|
65
|
+
export interface CodeGenContext {
|
|
66
|
+
isOutputConnected(blockId: string, portId: string): boolean;
|
|
67
|
+
getInputRegister(blockId: string, portId: string): string | null;
|
|
68
|
+
isInputZeroBypassed(blockId: string, portId: string): boolean;
|
|
69
|
+
getInputZeroValue(blockId: string, portId: string): number;
|
|
70
|
+
registerHeaderEqu(name: string): void;
|
|
71
|
+
hasHeaderEqu(name: string): boolean;
|
|
72
|
+
allocateRegister(blockId: string, portId: string): string;
|
|
73
|
+
getScratchRegister(): string;
|
|
74
|
+
resetScratchRegisters(): void;
|
|
75
|
+
pushHeaderComment(...lines: string[]): void;
|
|
76
|
+
pushInitCode(...lines: string[]): void;
|
|
77
|
+
pushInputCode(...lines: string[]): void;
|
|
78
|
+
pushMainCode(...lines: string[]): void;
|
|
79
|
+
pushOutputCode(...lines: string[]): void;
|
|
80
|
+
allocateMemory(blockId: string, size: number): {
|
|
81
|
+
name: string;
|
|
82
|
+
address: number;
|
|
83
|
+
size: number;
|
|
84
|
+
};
|
|
85
|
+
registerEqu(name: string, value: string | number): string;
|
|
86
|
+
getStandardConstant(value: number): string;
|
|
87
|
+
hasEqu(name: string): boolean;
|
|
88
|
+
getEquDeclarations(): Array<{
|
|
89
|
+
name: string;
|
|
90
|
+
value: string;
|
|
91
|
+
}>;
|
|
92
|
+
getRegisterAliases(): Array<{
|
|
93
|
+
alias: string;
|
|
94
|
+
register: string;
|
|
95
|
+
}>;
|
|
96
|
+
getParameter(blockId: string, parameterId: string): any;
|
|
97
|
+
getBlock(blockId: string): any;
|
|
98
|
+
getCurrentBlock(): string | null;
|
|
99
|
+
pushIR(node: any): void;
|
|
100
|
+
getIR(): any[];
|
|
101
|
+
getShortId(blockId: string): string;
|
|
102
|
+
getVariable(name: string): string | undefined;
|
|
103
|
+
setVariable(name: string, value: string): void;
|
|
104
|
+
getUsedRegisterCount(): number;
|
|
105
|
+
getUsedMemorySize(): number;
|
|
106
|
+
getMemoryBlocks(): Array<{
|
|
107
|
+
name: string;
|
|
108
|
+
address: number;
|
|
109
|
+
size: number;
|
|
110
|
+
}>;
|
|
111
|
+
addError(message: string): void;
|
|
112
|
+
getErrors(): string[];
|
|
113
|
+
}
|
|
114
|
+
export interface ValidationContext {
|
|
115
|
+
hasInput(blockId: string, portId: string): boolean;
|
|
116
|
+
getInputs(blockId: string): string[];
|
|
117
|
+
getBlock(blockId: string): Block | undefined;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Base interface that all block definitions must implement
|
|
121
|
+
*/
|
|
122
|
+
export interface IBlockDefinition {
|
|
123
|
+
readonly type: string;
|
|
124
|
+
readonly category: string;
|
|
125
|
+
readonly subcategory?: string;
|
|
126
|
+
readonly name: string;
|
|
127
|
+
readonly description: string;
|
|
128
|
+
readonly color: string;
|
|
129
|
+
readonly icon?: string;
|
|
130
|
+
readonly width: number;
|
|
131
|
+
readonly height: number;
|
|
132
|
+
readonly inputs: BlockPort[];
|
|
133
|
+
readonly outputs: BlockPort[];
|
|
134
|
+
readonly parameters: BlockParameter[];
|
|
135
|
+
/**
|
|
136
|
+
* Generate FV-1 assembly code for this block
|
|
137
|
+
* Blocks should push code to appropriate sections using ctx.pushInitCode(),
|
|
138
|
+
* ctx.pushInputCode(), ctx.pushMainCode(), or ctx.pushOutputCode()
|
|
139
|
+
* @param ctx Code generation context providing resource allocation and code sections
|
|
140
|
+
*/
|
|
141
|
+
generateCode(ctx: CodeGenContext): void;
|
|
142
|
+
/**
|
|
143
|
+
* Validate this block's configuration and connections
|
|
144
|
+
* @param ctx Validation context
|
|
145
|
+
* @returns Validation result
|
|
146
|
+
*/
|
|
147
|
+
validate(ctx: ValidationContext): ValidationResult;
|
|
148
|
+
/**
|
|
149
|
+
* Get metadata about this block type
|
|
150
|
+
*/
|
|
151
|
+
getMetadata(): BlockMetadata;
|
|
152
|
+
/**
|
|
153
|
+
* Convert a code value to display value for a specific parameter
|
|
154
|
+
* @param parameterId The parameter ID
|
|
155
|
+
* @param codeValue The code value to convert
|
|
156
|
+
* @returns The display value
|
|
157
|
+
*/
|
|
158
|
+
getDisplayValue(parameterId: string, codeValue: number): number;
|
|
159
|
+
/**
|
|
160
|
+
* Convert a display value to code value for a specific parameter
|
|
161
|
+
* @param parameterId The parameter ID
|
|
162
|
+
* @param displayValue The display value to convert
|
|
163
|
+
* @returns The code value
|
|
164
|
+
*/
|
|
165
|
+
getCodeValue(parameterId: string, displayValue: number): number;
|
|
166
|
+
/**
|
|
167
|
+
* Get custom label text for this block instance (optional)
|
|
168
|
+
* @param parameters The current parameter values
|
|
169
|
+
* @returns Custom label text or null if no custom label
|
|
170
|
+
*/
|
|
171
|
+
getCustomLabel?(parameters: Record<string, any>): string | null;
|
|
172
|
+
/**
|
|
173
|
+
* Get the raw ATL template string for this block instance (optional)
|
|
174
|
+
* @returns The raw ATL string or undefined
|
|
175
|
+
*/
|
|
176
|
+
getRawTemplate?(): string | undefined;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=Block.d.ts.map
|