@asciiz/atoolkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/ReadMe.md +198 -0
- package/dist/acircuit/chip.d.ts +46 -0
- package/dist/acircuit/chip.d.ts.map +1 -0
- package/dist/acircuit/chip.js +104 -0
- package/dist/acircuit/chip.js.map +1 -0
- package/dist/acircuit/circuit.d.ts +86 -0
- package/dist/acircuit/circuit.d.ts.map +1 -0
- package/dist/acircuit/circuit.js +606 -0
- package/dist/acircuit/circuit.js.map +1 -0
- package/dist/acircuit/composite.d.ts +32 -0
- package/dist/acircuit/composite.d.ts.map +1 -0
- package/dist/acircuit/composite.js +88 -0
- package/dist/acircuit/composite.js.map +1 -0
- package/dist/acircuit/index.d.ts +7 -0
- package/dist/acircuit/index.d.ts.map +1 -0
- package/dist/acircuit/index.js +6 -0
- package/dist/acircuit/index.js.map +1 -0
- package/dist/acircuit/socket.d.ts +20 -0
- package/dist/acircuit/socket.d.ts.map +1 -0
- package/dist/acircuit/socket.js +23 -0
- package/dist/acircuit/socket.js.map +1 -0
- package/dist/acircuit/types.d.ts +94 -0
- package/dist/acircuit/types.d.ts.map +1 -0
- package/dist/acircuit/types.js +2 -0
- package/dist/acircuit/types.js.map +1 -0
- package/dist/acircuit/wire.d.ts +26 -0
- package/dist/acircuit/wire.d.ts.map +1 -0
- package/dist/acircuit/wire.js +23 -0
- package/dist/acircuit/wire.js.map +1 -0
- package/dist/adiag/bus.d.ts +65 -0
- package/dist/adiag/bus.d.ts.map +1 -0
- package/dist/adiag/bus.js +225 -0
- package/dist/adiag/bus.js.map +1 -0
- package/dist/adiag/index.d.ts +3 -0
- package/dist/adiag/index.d.ts.map +1 -0
- package/dist/adiag/index.js +2 -0
- package/dist/adiag/index.js.map +1 -0
- package/dist/aecs/ComponentSet.d.ts +33 -0
- package/dist/aecs/ComponentSet.d.ts.map +1 -0
- package/dist/aecs/ComponentSet.js +127 -0
- package/dist/aecs/ComponentSet.js.map +1 -0
- package/dist/aecs/Entity.d.ts +43 -0
- package/dist/aecs/Entity.d.ts.map +1 -0
- package/dist/aecs/Entity.js +82 -0
- package/dist/aecs/Entity.js.map +1 -0
- package/dist/aecs/FloatSet.d.ts +34 -0
- package/dist/aecs/FloatSet.d.ts.map +1 -0
- package/dist/aecs/FloatSet.js +147 -0
- package/dist/aecs/FloatSet.js.map +1 -0
- package/dist/aecs/Query.d.ts +90 -0
- package/dist/aecs/Query.d.ts.map +1 -0
- package/dist/aecs/Query.js +304 -0
- package/dist/aecs/Query.js.map +1 -0
- package/dist/aecs/index.d.ts +6 -0
- package/dist/aecs/index.d.ts.map +1 -0
- package/dist/aecs/index.js +6 -0
- package/dist/aecs/index.js.map +1 -0
- package/dist/aecs/join.d.ts +2 -0
- package/dist/aecs/join.d.ts.map +1 -0
- package/dist/aecs/join.js +2 -0
- package/dist/aecs/join.js.map +1 -0
- package/dist/alm/constants.d.ts +11 -0
- package/dist/alm/constants.d.ts.map +1 -0
- package/dist/alm/constants.js +17 -0
- package/dist/alm/constants.js.map +1 -0
- package/dist/alm/index.d.ts +9 -0
- package/dist/alm/index.d.ts.map +1 -0
- package/dist/alm/index.js +12 -0
- package/dist/alm/index.js.map +1 -0
- package/dist/alm/mat3.d.ts +63 -0
- package/dist/alm/mat3.d.ts.map +1 -0
- package/dist/alm/mat3.js +393 -0
- package/dist/alm/mat3.js.map +1 -0
- package/dist/alm/mat4.d.ts +157 -0
- package/dist/alm/mat4.d.ts.map +1 -0
- package/dist/alm/mat4.js +1448 -0
- package/dist/alm/mat4.js.map +1 -0
- package/dist/alm/quat.d.ts +89 -0
- package/dist/alm/quat.d.ts.map +1 -0
- package/dist/alm/quat.js +543 -0
- package/dist/alm/quat.js.map +1 -0
- package/dist/alm/spatial.d.ts +102 -0
- package/dist/alm/spatial.d.ts.map +1 -0
- package/dist/alm/spatial.js +389 -0
- package/dist/alm/spatial.js.map +1 -0
- package/dist/alm/vec2.d.ts +97 -0
- package/dist/alm/vec2.d.ts.map +1 -0
- package/dist/alm/vec2.js +369 -0
- package/dist/alm/vec2.js.map +1 -0
- package/dist/alm/vec3.d.ts +117 -0
- package/dist/alm/vec3.d.ts.map +1 -0
- package/dist/alm/vec3.js +547 -0
- package/dist/alm/vec3.js.map +1 -0
- package/dist/alm/vec4.d.ts +95 -0
- package/dist/alm/vec4.d.ts.map +1 -0
- package/dist/alm/vec4.js +452 -0
- package/dist/alm/vec4.js.map +1 -0
- package/dist/atempo/cadence.d.ts +58 -0
- package/dist/atempo/cadence.d.ts.map +1 -0
- package/dist/atempo/cadence.js +110 -0
- package/dist/atempo/cadence.js.map +1 -0
- package/dist/atempo/clip.d.ts +37 -0
- package/dist/atempo/clip.d.ts.map +1 -0
- package/dist/atempo/clip.js +92 -0
- package/dist/atempo/clip.js.map +1 -0
- package/dist/atempo/curve.d.ts +6 -0
- package/dist/atempo/curve.d.ts.map +1 -0
- package/dist/atempo/curve.js +2 -0
- package/dist/atempo/curve.js.map +1 -0
- package/dist/atempo/curves/bezier.d.ts +7 -0
- package/dist/atempo/curves/bezier.d.ts.map +1 -0
- package/dist/atempo/curves/bezier.js +46 -0
- package/dist/atempo/curves/bezier.js.map +1 -0
- package/dist/atempo/curves/bounce.d.ts +6 -0
- package/dist/atempo/curves/bounce.d.ts.map +1 -0
- package/dist/atempo/curves/bounce.js +22 -0
- package/dist/atempo/curves/bounce.js.map +1 -0
- package/dist/atempo/curves/cubic.d.ts +14 -0
- package/dist/atempo/curves/cubic.d.ts.map +1 -0
- package/dist/atempo/curves/cubic.js +22 -0
- package/dist/atempo/curves/cubic.js.map +1 -0
- package/dist/atempo/curves/elastic.d.ts +6 -0
- package/dist/atempo/curves/elastic.d.ts.map +1 -0
- package/dist/atempo/curves/elastic.js +12 -0
- package/dist/atempo/curves/elastic.js.map +1 -0
- package/dist/atempo/curves/expo.d.ts +14 -0
- package/dist/atempo/curves/expo.d.ts.map +1 -0
- package/dist/atempo/curves/expo.js +26 -0
- package/dist/atempo/curves/expo.js.map +1 -0
- package/dist/atempo/curves/holdSnap.d.ts +6 -0
- package/dist/atempo/curves/holdSnap.d.ts.map +1 -0
- package/dist/atempo/curves/holdSnap.js +15 -0
- package/dist/atempo/curves/holdSnap.js.map +1 -0
- package/dist/atempo/curves/index.d.ts +14 -0
- package/dist/atempo/curves/index.d.ts.map +1 -0
- package/dist/atempo/curves/index.js +14 -0
- package/dist/atempo/curves/index.js.map +1 -0
- package/dist/atempo/curves/linear.d.ts +6 -0
- package/dist/atempo/curves/linear.d.ts.map +1 -0
- package/dist/atempo/curves/linear.js +5 -0
- package/dist/atempo/curves/linear.js.map +1 -0
- package/dist/atempo/curves/overshoot.d.ts +6 -0
- package/dist/atempo/curves/overshoot.d.ts.map +1 -0
- package/dist/atempo/curves/overshoot.js +16 -0
- package/dist/atempo/curves/overshoot.js.map +1 -0
- package/dist/atempo/curves/quad.d.ts +14 -0
- package/dist/atempo/curves/quad.d.ts.map +1 -0
- package/dist/atempo/curves/quad.js +22 -0
- package/dist/atempo/curves/quad.js.map +1 -0
- package/dist/atempo/curves/step.d.ts +6 -0
- package/dist/atempo/curves/step.d.ts.map +1 -0
- package/dist/atempo/curves/step.js +11 -0
- package/dist/atempo/curves/step.js.map +1 -0
- package/dist/atempo/index.d.ts +17 -0
- package/dist/atempo/index.d.ts.map +1 -0
- package/dist/atempo/index.js +18 -0
- package/dist/atempo/index.js.map +1 -0
- package/dist/atempo/phase.d.ts +66 -0
- package/dist/atempo/phase.d.ts.map +1 -0
- package/dist/atempo/phase.js +121 -0
- package/dist/atempo/phase.js.map +1 -0
- package/dist/atempo/spring.d.ts +20 -0
- package/dist/atempo/spring.d.ts.map +1 -0
- package/dist/atempo/spring.js +71 -0
- package/dist/atempo/spring.js.map +1 -0
- package/dist/atempo/track.d.ts +69 -0
- package/dist/atempo/track.d.ts.map +1 -0
- package/dist/atempo/track.js +184 -0
- package/dist/atempo/track.js.map +1 -0
- package/dist/atempo/tracks/color.d.ts +20 -0
- package/dist/atempo/tracks/color.d.ts.map +1 -0
- package/dist/atempo/tracks/color.js +52 -0
- package/dist/atempo/tracks/color.js.map +1 -0
- package/dist/atempo/tracks/float.d.ts +9 -0
- package/dist/atempo/tracks/float.d.ts.map +1 -0
- package/dist/atempo/tracks/float.js +13 -0
- package/dist/atempo/tracks/float.js.map +1 -0
- package/dist/atempo/tracks/index.d.ts +8 -0
- package/dist/atempo/tracks/index.d.ts.map +1 -0
- package/dist/atempo/tracks/index.js +8 -0
- package/dist/atempo/tracks/index.js.map +1 -0
- package/dist/atempo/tracks/quat.d.ts +16 -0
- package/dist/atempo/tracks/quat.d.ts.map +1 -0
- package/dist/atempo/tracks/quat.js +72 -0
- package/dist/atempo/tracks/quat.js.map +1 -0
- package/dist/atempo/tracks/vec.d.ts +11 -0
- package/dist/atempo/tracks/vec.d.ts.map +1 -0
- package/dist/atempo/tracks/vec.js +27 -0
- package/dist/atempo/tracks/vec.js.map +1 -0
- package/dist/awasm/abi/index.d.ts +4 -0
- package/dist/awasm/abi/index.d.ts.map +1 -0
- package/dist/awasm/abi/index.js +4 -0
- package/dist/awasm/abi/index.js.map +1 -0
- package/dist/awasm/abi/layout.d.ts +40 -0
- package/dist/awasm/abi/layout.d.ts.map +1 -0
- package/dist/awasm/abi/layout.js +100 -0
- package/dist/awasm/abi/layout.js.map +1 -0
- package/dist/awasm/abi/slice.d.ts +28 -0
- package/dist/awasm/abi/slice.d.ts.map +1 -0
- package/dist/awasm/abi/slice.js +68 -0
- package/dist/awasm/abi/slice.js.map +1 -0
- package/dist/awasm/abi/string-buffer.d.ts +23 -0
- package/dist/awasm/abi/string-buffer.d.ts.map +1 -0
- package/dist/awasm/abi/string-buffer.js +52 -0
- package/dist/awasm/abi/string-buffer.js.map +1 -0
- package/dist/awasm/index.d.ts +5 -0
- package/dist/awasm/index.d.ts.map +1 -0
- package/dist/awasm/index.js +8 -0
- package/dist/awasm/index.js.map +1 -0
- package/dist/awasm/memory/block-pool.d.ts +31 -0
- package/dist/awasm/memory/block-pool.d.ts.map +1 -0
- package/dist/awasm/memory/block-pool.js +98 -0
- package/dist/awasm/memory/block-pool.js.map +1 -0
- package/dist/awasm/memory/index.d.ts +5 -0
- package/dist/awasm/memory/index.d.ts.map +1 -0
- package/dist/awasm/memory/index.js +5 -0
- package/dist/awasm/memory/index.js.map +1 -0
- package/dist/awasm/memory/linear-arena.d.ts +36 -0
- package/dist/awasm/memory/linear-arena.d.ts.map +1 -0
- package/dist/awasm/memory/linear-arena.js +94 -0
- package/dist/awasm/memory/linear-arena.js.map +1 -0
- package/dist/awasm/memory/memory-view.d.ts +51 -0
- package/dist/awasm/memory/memory-view.d.ts.map +1 -0
- package/dist/awasm/memory/memory-view.js +110 -0
- package/dist/awasm/memory/memory-view.js.map +1 -0
- package/dist/awasm/memory/wasm-memory.d.ts +40 -0
- package/dist/awasm/memory/wasm-memory.d.ts.map +1 -0
- package/dist/awasm/memory/wasm-memory.js +88 -0
- package/dist/awasm/memory/wasm-memory.js.map +1 -0
- package/dist/awasm/runtime/host-bridge.d.ts +30 -0
- package/dist/awasm/runtime/host-bridge.d.ts.map +1 -0
- package/dist/awasm/runtime/host-bridge.js +57 -0
- package/dist/awasm/runtime/host-bridge.js.map +1 -0
- package/dist/awasm/runtime/index.d.ts +5 -0
- package/dist/awasm/runtime/index.d.ts.map +1 -0
- package/dist/awasm/runtime/index.js +5 -0
- package/dist/awasm/runtime/index.js.map +1 -0
- package/dist/awasm/runtime/module-inspector.d.ts +32 -0
- package/dist/awasm/runtime/module-inspector.d.ts.map +1 -0
- package/dist/awasm/runtime/module-inspector.js +43 -0
- package/dist/awasm/runtime/module-inspector.js.map +1 -0
- package/dist/awasm/runtime/module-loader.d.ts +17 -0
- package/dist/awasm/runtime/module-loader.d.ts.map +1 -0
- package/dist/awasm/runtime/module-loader.js +99 -0
- package/dist/awasm/runtime/module-loader.js.map +1 -0
- package/dist/awasm/runtime/wasm-instance.d.ts +25 -0
- package/dist/awasm/runtime/wasm-instance.d.ts.map +1 -0
- package/dist/awasm/runtime/wasm-instance.js +60 -0
- package/dist/awasm/runtime/wasm-instance.js.map +1 -0
- package/dist/awasm/thread/atomic-queue.d.ts +33 -0
- package/dist/awasm/thread/atomic-queue.d.ts.map +1 -0
- package/dist/awasm/thread/atomic-queue.js +78 -0
- package/dist/awasm/thread/atomic-queue.js.map +1 -0
- package/dist/awasm/thread/index.d.ts +4 -0
- package/dist/awasm/thread/index.d.ts.map +1 -0
- package/dist/awasm/thread/index.js +4 -0
- package/dist/awasm/thread/index.js.map +1 -0
- package/dist/awasm/thread/shared-memory.d.ts +38 -0
- package/dist/awasm/thread/shared-memory.d.ts.map +1 -0
- package/dist/awasm/thread/shared-memory.js +74 -0
- package/dist/awasm/thread/shared-memory.js.map +1 -0
- package/dist/awasm/thread/worker-pool.d.ts +43 -0
- package/dist/awasm/thread/worker-pool.d.ts.map +1 -0
- package/dist/awasm/thread/worker-pool.js +118 -0
- package/dist/awasm/thread/worker-pool.js.map +1 -0
- package/dist/awgpu/binding.d.ts +108 -0
- package/dist/awgpu/binding.d.ts.map +1 -0
- package/dist/awgpu/binding.js +251 -0
- package/dist/awgpu/binding.js.map +1 -0
- package/dist/awgpu/device.d.ts +68 -0
- package/dist/awgpu/device.d.ts.map +1 -0
- package/dist/awgpu/device.js +150 -0
- package/dist/awgpu/device.js.map +1 -0
- package/dist/awgpu/graph.d.ts +77 -0
- package/dist/awgpu/graph.d.ts.map +1 -0
- package/dist/awgpu/graph.js +288 -0
- package/dist/awgpu/graph.js.map +1 -0
- package/dist/awgpu/index.d.ts +10 -0
- package/dist/awgpu/index.d.ts.map +1 -0
- package/dist/awgpu/index.js +19 -0
- package/dist/awgpu/index.js.map +1 -0
- package/dist/awgpu/memory.d.ts +231 -0
- package/dist/awgpu/memory.d.ts.map +1 -0
- package/dist/awgpu/memory.js +547 -0
- package/dist/awgpu/memory.js.map +1 -0
- package/dist/awgpu/pipeline.d.ts +114 -0
- package/dist/awgpu/pipeline.d.ts.map +1 -0
- package/dist/awgpu/pipeline.js +335 -0
- package/dist/awgpu/pipeline.js.map +1 -0
- package/dist/awgpu/sequence.d.ts +83 -0
- package/dist/awgpu/sequence.d.ts.map +1 -0
- package/dist/awgpu/sequence.js +273 -0
- package/dist/awgpu/sequence.js.map +1 -0
- package/dist/awgpu/state.d.ts +27 -0
- package/dist/awgpu/state.d.ts.map +1 -0
- package/dist/awgpu/state.js +43 -0
- package/dist/awgpu/state.js.map +1 -0
- package/dist/awgpu/stream.d.ts +57 -0
- package/dist/awgpu/stream.d.ts.map +1 -0
- package/dist/awgpu/stream.js +139 -0
- package/dist/awgpu/stream.js.map +1 -0
- package/dist/awgpu/target.d.ts +98 -0
- package/dist/awgpu/target.d.ts.map +1 -0
- package/dist/awgpu/target.js +357 -0
- package/dist/awgpu/target.js.map +1 -0
- package/dist/awgpu_old/buffer.d.ts +78 -0
- package/dist/awgpu_old/buffer.d.ts.map +1 -0
- package/dist/awgpu_old/buffer.js +220 -0
- package/dist/awgpu_old/buffer.js.map +1 -0
- package/dist/awgpu_old/device.d.ts +69 -0
- package/dist/awgpu_old/device.d.ts.map +1 -0
- package/dist/awgpu_old/device.js +121 -0
- package/dist/awgpu_old/device.js.map +1 -0
- package/dist/awgpu_old/frame.d.ts +17 -0
- package/dist/awgpu_old/frame.d.ts.map +1 -0
- package/dist/awgpu_old/frame.js +29 -0
- package/dist/awgpu_old/frame.js.map +1 -0
- package/dist/awgpu_old/index.d.ts +8 -0
- package/dist/awgpu_old/index.d.ts.map +1 -0
- package/dist/awgpu_old/index.js +18 -0
- package/dist/awgpu_old/index.js.map +1 -0
- package/dist/awgpu_old/layout.d.ts +70 -0
- package/dist/awgpu_old/layout.d.ts.map +1 -0
- package/dist/awgpu_old/layout.js +137 -0
- package/dist/awgpu_old/layout.js.map +1 -0
- package/dist/awgpu_old/pass.d.ts +97 -0
- package/dist/awgpu_old/pass.d.ts.map +1 -0
- package/dist/awgpu_old/pass.js +302 -0
- package/dist/awgpu_old/pass.js.map +1 -0
- package/dist/awgpu_old/pipeline.d.ts +73 -0
- package/dist/awgpu_old/pipeline.d.ts.map +1 -0
- package/dist/awgpu_old/pipeline.js +226 -0
- package/dist/awgpu_old/pipeline.js.map +1 -0
- package/dist/awgpu_old/target.d.ts +186 -0
- package/dist/awgpu_old/target.d.ts.map +1 -0
- package/dist/awgpu_old/target.js +428 -0
- package/dist/awgpu_old/target.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/package.json +106 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Asciizzz
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/ReadMe.md
ADDED
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# Atoolkit: Modular Computational Toolkit & Hardware Execution Framework
|
|
2
|
+
|
|
3
|
+
A collection of zero-dependency TypeScript modules designed for simulation, numerical evaluation, entity management, and WebGPU hardware execution.
|
|
4
|
+
|
|
5
|
+
All modules share common engineering invariants: zero-allocation calling conventions on hot paths, contiguous typed array storage, deterministic execution plans, and dual-tier hardware transparency.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. Package Architecture
|
|
10
|
+
|
|
11
|
+
| Package | Role | Core Data Structures | Performance & Memory Invariants | Documentation |
|
|
12
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
13
|
+
| **[`aecs`](./aecs/ReadMe.md)** | Entity Component System | `Entity`, `EntityPool`, `ComponentSet<T>`, `FloatSet`, `QueryBuilder`, `query2`, `query3` | Contiguous packed dense arrays; generational slot recycling; cardinality-driven smallest-set iteration. | [aecs ReadMe](./aecs/ReadMe.md) |
|
|
14
|
+
| **[`alm`](./alm/ReadMe.md)** | 3D Linear Algebra & Spatial Math | `Vec2`, `Vec3`, `Vec4`, `Quat`, `Mat3`, `Mat4`, `Ray`, `Plane`, `AABB`, `Frustum` | Direct subclassing of native `Float32Array`; in-place fluent operations; out-parameter zero-allocation conventions. | [alm ReadMe](./alm/ReadMe.md) |
|
|
15
|
+
| **[`atempo`](./atempo/ReadMe.md)** | Temporal Orchestration & Cadence | `Track`, `FloatTrack`, `Vec3Track`, `Curve`, `Clip`, `Cadence`, `FixedCadence`, `Spring`, `Phase`, `Metronome` | Contiguous double-precision timestamps; cached O(1) interval lookup; closed-form 2nd-order analytical spring solvers. | [atempo ReadMe](./atempo/ReadMe.md) |
|
|
16
|
+
| **[`acircuit`](./acircuit/ReadMe.md)** | Directed Computation Circuit | `Socket`, `Wire`, `Chip`, `Circuit`, `Subcircuit` | Kahn topological ordering; execution plan caching (`_cachedPlan`); 1-to-1 input enforcement; 1-to-N output fan-out. | [acircuit ReadMe](./acircuit/ReadMe.md) |
|
|
17
|
+
| **[`awgpu`](./awgpu/ReadMe.md)** | Six-Tier WebGPU Hardware Engine | `Device`, `Buffer`, `BufferPool`, `Texture`, `Sampler`, `StreamSet`, `Target`, `BindLayout`, `BindTable`, `RasterPipeline`, `ComputePipeline`, `PipelineCache`, `RenderPassNode`, `ComputePassNode`, `PassSequence`, `PassGraph` | Zero-allocation render pass descriptors; transient buffer pooling; automated vertex strides; 8-slot bind group filtering; DAG dead pass culling. | [awgpu ReadMe](./awgpu/ReadMe.md) |
|
|
18
|
+
| **[`adiag`](./adiag/ReadMe.md)** | Diagnostic Telemetry Bus | `Bus`, `Result`, causal chain tracers | Fixed-capacity circular ring buffer (default 1000 records); non-throwing diagnostics; pointer-based causal error chains (`ref`). | [adiag ReadMe](./adiag/ReadMe.md) |
|
|
19
|
+
| **[`awasm`](./awasm/ReadMe.md)** | WebAssembly Computational Runtime & Memory Coordinator | `WasmMemory`, `LinearArena`, `BlockPool`, `MemoryView`, `StructLayout`, `Slice`, `StringBuffer`, `ModuleInspector`, `HostBridge`, `ModuleLoader`, `WasmInstance`, `SharedMemory`, `AtomicQueue`, `WorkerPool` | Monotonic bump allocation; detachment-resilient typed views; 16-byte SIMD alignment; intrusive slab recycling; lock-free atomic queues. | [awasm ReadMe](./awasm/ReadMe.md) |
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## 2. Subsystem Specifications
|
|
24
|
+
|
|
25
|
+
### 2.1 aecs: Entity Component System
|
|
26
|
+
|
|
27
|
+
High-performance, sets-first ECS decoupled from rigid scene graphs.
|
|
28
|
+
|
|
29
|
+
- **Entity Allocation**: `Entity` packs a 20-bit slot index and a 12-bit generation counter into a single integer. `EntityPool` manages issuance, generational validation, and slot recycling via an internal free-list array.
|
|
30
|
+
- **Dense Storage Primitives**:
|
|
31
|
+
- `ComponentSet<T>`: Contiguous sparse-dense storage for JavaScript objects, state tags, and reference payloads.
|
|
32
|
+
- `FloatSet`: Contiguous packed `Float32Array` storage for high-frequency numeric vectors and matrices, eliminating object reference overhead.
|
|
33
|
+
- **Cardinality Joins**: `QueryBuilder`, `query2()`, and `query3()` identify the smallest active component set and iterate only across that driver set, testing presence in secondary sets in O(1) time.
|
|
34
|
+
|
|
35
|
+
### 2.2 alm: 3D Linear Algebra & Spatial Primitives
|
|
36
|
+
|
|
37
|
+
High-performance 3D mathematics built directly on native typed arrays.
|
|
38
|
+
|
|
39
|
+
- **Storage Layout**: Every mathematical primitive (`Vec2`, `Vec3`, `Vec4`, `Quat`, `Mat3`, `Mat4`) subclasses `Float32Array` directly. Slices and views write directly into WebGPU buffers (`device.queue.writeBuffer`) with zero serialization or memory copying.
|
|
40
|
+
- **Dual Calling Convention**:
|
|
41
|
+
- Fluent in-place methods (`v.add(b)`) mutate instances and return `this`.
|
|
42
|
+
- Static procedural methods (`Mat4.mul(a, b, out)`) accept destination `out` buffers to guarantee zero heap allocations in hot animation loops.
|
|
43
|
+
- **Spatial Structures**: Provides analytical intersection testing, frustum-bounding sphere containment, ray-plane casting, and bounding-box containment via `Ray`, `Plane`, `AABB`, and `Frustum`.
|
|
44
|
+
|
|
45
|
+
### 2.3 atempo: Temporal Orchestration & Cadence
|
|
46
|
+
|
|
47
|
+
Time-shaping functions and sequence evaluation primitives decoupled from concrete data interpolation.
|
|
48
|
+
|
|
49
|
+
- **Sequence Evaluation**: `Track<T, TOut>` manages chronological keyframe sequences, locates active interval spans via cached index pointers (falling back to O(log N) binary search on non-linear seeks), and shapes progress using unary transfer functions (`Curve`).
|
|
50
|
+
- **Composite Timelines**: `Clip` evaluates heterogeneous tracks simultaneously across a unified temporal coordinate space.
|
|
51
|
+
- **Analytical Harmonic Dynamics**: `Spring` implements a closed-form analytical second-order damped harmonic oscillator, evaluating exact displacement and velocity in continuous time without numerical Euler integration errors.
|
|
52
|
+
- **Cadence & Timesteps**: `Cadence` computes frame-rate independent exponential half-life decay. `FixedCadence` accumulates elapsed frame time and produces deterministic fixed-timestep simulation steps.
|
|
53
|
+
|
|
54
|
+
### 2.4 acircuit: Directed Computation Circuit
|
|
55
|
+
|
|
56
|
+
Value computation graph featuring static topology validation and plan caching.
|
|
57
|
+
|
|
58
|
+
- **Endpoints & Connections**: `Socket` declares input or output endpoints with optional data type constraints and requirement tags. `Wire` defines directed connections linking an output socket to an input socket. Input sockets strictly enforce 1-to-1 connections; output sockets support 1-to-N fan-out.
|
|
59
|
+
- **Computation Units**: `Chip` represents a stateless computational node that declares socket schemas and evaluates input records.
|
|
60
|
+
- **Graph Ownership**: `Circuit` validates connections against cycles and missing required inputs, derives topological evaluation sequences via Kahn's algorithm, and caches the resulting execution plan (`_cachedPlan`).
|
|
61
|
+
- **Composite Encapsulation**: `Subcircuit` wraps an entire circuit inside a single composite chip, mapping boundary sockets and enabling hierarchical composition.
|
|
62
|
+
|
|
63
|
+
### 2.5 awgpu: Six-Tier WebGPU Hardware Engine
|
|
64
|
+
|
|
65
|
+
Domain-agnostic WebGPU execution engine built across six distinct compositional levels:
|
|
66
|
+
|
|
67
|
+
- **Level 0 (Hardware Foundation)**: `Device` acquires adapters, logical devices, and queue handles. Exposes hardware telemetry (`limits`, `features`, `lost`) and attaches error hooks (`onError`, `onDeviceLost`).
|
|
68
|
+
- **Level 1 (Managed Memory)**: `Buffer` encapsulates sized allocations and uniform alignment. `BufferPool` recycles transient buffers across frames via power-of-two size bucketing. `Texture` handles 256-byte aligned row stride calculations (`write2D`) and external image copy (`copyExternalImage`). `Sampler` configures filtering and shadow comparison modes.
|
|
69
|
+
- **Level 2 (Data Structures)**: `StreamSet` groups planar or interleaved vertex attributes and index streams, automatically deriving 4-byte aligned vertex buffer layouts. `Target` manages swapchain backbuffers, offscreen multi-render-targets (MRT), MSAA resolution, and cached render pass descriptors. `SwapBuffer` manages ping-pong buffer pointers in O(1) time.
|
|
70
|
+
- **Level 3 (Resource Binding)**: `BindLayoutBuilder` constructs `GPUBindGroupLayout` descriptors with fluent method chaining. `BindTable` normalizes raw or wrapped resources into native binding descriptors. `BindTableCache` automatically deduplicates identical bind groups via deterministic composite hashing.
|
|
71
|
+
- **Level 4 (Hardware Pipelines)**: `RasterPipeline` and `ComputePipeline` compile shader modules with synchronous and asynchronous factory methods. `PipelineCache` provides deterministic 32-bit FNV-1a descriptor hashing and cached retrieval.
|
|
72
|
+
- **Level 5 (Command Sequencing & DAG)**: `RenderPassNode` and `ComputePassNode` record commands while filtering redundant driver state changes (tracking 8 bind group slots, vertex buffers, and index buffers). `PassGraph` schedules passes via Kahn topological sort, resolving read/write hazards and eliminating dead passes via reverse reachability from side-effect roots.
|
|
73
|
+
|
|
74
|
+
### 2.6 adiag: Diagnostic Telemetry Bus
|
|
75
|
+
|
|
76
|
+
Structured diagnostics and causal error tracing without cross-boundary thrown exceptions.
|
|
77
|
+
|
|
78
|
+
- **Structured Records**: `Result` captures category types (`"ok"`, `"err"`, `"warn"`, `"info"`), machine-readable codes, templated messages, arbitrary key-value payloads, and parent error references (`ref`).
|
|
79
|
+
- **Circular History**: `Bus` logs diagnostic records into a pre-allocated circular ring buffer (default 1000 entries) in O(1) time, overwriting oldest records when capacity is reached.
|
|
80
|
+
- **Causal Traversal**: Tracing utilities traverse parent `ref` pointers to extract chronological root cause failure chains across asynchronous subsystem boundaries.
|
|
81
|
+
|
|
82
|
+
### 2.7 awasm: WebAssembly Computational Runtime & Linear Memory Coordinator
|
|
83
|
+
|
|
84
|
+
Low-level WebAssembly execution runtime, linear memory arena coordinator, binary inspector, and multi-threaded worker dispatch framework.
|
|
85
|
+
|
|
86
|
+
- **Memory Subsystem**: `WasmMemory` tracks page growth and notifies listeners when native buffers detach. `LinearArena` provides O(1) bump allocations with 4/8/16-byte alignment and watermark rewinding. `BlockPool` manages intrusive free-list slab recycling. `MemoryView` exposes detachment-resilient typed array views.
|
|
87
|
+
- **ABI Subsystem**: `StructLayout` computes member byte offsets and stride calculations matching C/Rust `repr(C)` specifications. `Slice` encapsulates guest memory spans `(ptr, length)` without buffer duplication. `StringBuffer` provides UTF-8 encoding into arena memory and decoding from guest spans.
|
|
88
|
+
- **Runtime Subsystem**: `ModuleInspector` performs static binary analysis on uninstantiated modules. `HostBridge` constructs typed host import tables with standard timing and panic hooks. `ModuleLoader` compiles modules via streaming or buffered paths with optional IndexedDB bytecode caching. `WasmInstance` manages active instances with dual-tier native handle access.
|
|
89
|
+
- **Thread Subsystem**: `SharedMemory` allocates thread-safe `SharedArrayBuffer` memory with 32-bit atomic wait/notify synchronization. `AtomicQueue` coordinates lock-free message passing via circular ring buffers. `WorkerPool` dispatches tasks across dedicated Web Workers sharing the same compiled module and linear memory.
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## 3. Core Engineering Invariants
|
|
94
|
+
|
|
95
|
+
1. **Zero-Allocation Hot Paths**:
|
|
96
|
+
- Math operations in `alm` and interval evaluations in `atempo` write directly into destination buffers passed as `out` parameters.
|
|
97
|
+
- Render targets in `awgpu` update swapchain views in place within pre-allocated descriptors, eliminating garbage collection pauses during animation and simulation loops.
|
|
98
|
+
|
|
99
|
+
2. **Dense Contiguous Memory**:
|
|
100
|
+
- `aecs` stores component values and entity keys in packed, contiguous arrays (`ComponentSet`, `FloatSet`). Iterations execute directly over dense memory blocks without pointer-chasing scene graphs.
|
|
101
|
+
|
|
102
|
+
3. **Four-Tier Bind Frequency Slots**:
|
|
103
|
+
- `awgpu` standardizes pipeline bindings into four update frequencies (`PerFrame = 0`, `PerPhase = 1`, `PerBatch = 2`, `PerInstance = 3`), filtering redundant GPU driver state updates between draws.
|
|
104
|
+
|
|
105
|
+
4. **Deterministic Plan Caching**:
|
|
106
|
+
- Both `acircuit` and `awgpu` cache topological execution orders (`_cachedPlan` in `Circuit`, `_cachedSequence` in `PassGraph`), executing in O(1) time across subsequent frames unless graph topology is explicitly invalidated.
|
|
107
|
+
|
|
108
|
+
5. **Dual-Tier Hardware Interoperability**:
|
|
109
|
+
- High-level abstractions expose raw underlying handles (`GPUDevice`, `GPUBuffer`, `GPUTexture`, `GPUCommandEncoder`). Callers can execute custom imperative passes alongside managed passes without translation overhead.
|
|
110
|
+
|
|
111
|
+
6. **Bounded Diagnostic Footprint**:
|
|
112
|
+
- `adiag` uses bounded ring buffers for error logging, ensuring diagnostic instrumentation cannot cause runaway memory expansion.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
## 4. End-to-End Composition Example
|
|
117
|
+
|
|
118
|
+
Demonstrates coordinating entity management, 3D mathematics, temporal spring dynamics, and WebGPU command execution across Atoolkit modules:
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
import { EntityPool, ComponentSet, FloatSet, query2 } from "./aecs/index.js";
|
|
122
|
+
import { Vec3, Mat4 } from "./alm/index.js";
|
|
123
|
+
import { Spring } from "./atempo/index.js";
|
|
124
|
+
import { Device, Buffer, StreamSet, BindLayout, BindTable, RasterPipeline, Target, RenderPassNode } from "./awgpu/index.js";
|
|
125
|
+
import { Bus } from "./adiag/index.js";
|
|
126
|
+
|
|
127
|
+
// 1. Diagnostics & Hardware Foundation
|
|
128
|
+
const bus = new Bus(500);
|
|
129
|
+
const gfx = await Device.create({ canvas: "#viewport" });
|
|
130
|
+
bus.info({ code: "GPU_READY", raw: "Device acquired: $format$", data: { format: gfx.format } });
|
|
131
|
+
|
|
132
|
+
// 2. Entity Component Storage
|
|
133
|
+
const entities = new EntityPool();
|
|
134
|
+
const transforms = new FloatSet(16); // stores 4x4 matrix per entity
|
|
135
|
+
const tagSet = new ComponentSet<string>();
|
|
136
|
+
|
|
137
|
+
const player = entities.spawn();
|
|
138
|
+
transforms.set(player, Mat4.identity(new Mat4()));
|
|
139
|
+
tagSet.set(player, "ActivePlayer");
|
|
140
|
+
|
|
141
|
+
// 3. Temporal Harmonic Follower
|
|
142
|
+
const spring = new Spring({ stiffness: 180, damping: 14, mass: 1 });
|
|
143
|
+
spring.target = 5.0; // animate target elevation
|
|
144
|
+
|
|
145
|
+
// 4. Managed GPU Geometry & Uniforms
|
|
146
|
+
const posBuf = Buffer.createVertex(gfx, new Float32Array([-1, -1, 0, 1, -1, 0, 0, 1, 0]));
|
|
147
|
+
const uboBuf = Buffer.createUniform(gfx, 64);
|
|
148
|
+
|
|
149
|
+
const streams = new StreamSet().addStream(0, posBuf, "float32x3");
|
|
150
|
+
const target = Target.createScreen(gfx);
|
|
151
|
+
|
|
152
|
+
const bindLayout = BindLayout.builder()
|
|
153
|
+
.addUniform(0, GPUShaderStage.VERTEX)
|
|
154
|
+
.build(gfx);
|
|
155
|
+
|
|
156
|
+
const bindTable = BindTable.create(gfx, bindLayout, [
|
|
157
|
+
{ binding: 0, resource: uboBuf },
|
|
158
|
+
]);
|
|
159
|
+
|
|
160
|
+
const pipeline = RasterPipeline.create(gfx, {
|
|
161
|
+
vertex: { code: shaderSource },
|
|
162
|
+
fragment: { code: shaderSource, targets: [{ format: gfx.format }] },
|
|
163
|
+
streamSet: streams,
|
|
164
|
+
layouts: [bindLayout],
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
const pass = new RenderPassNode(target).addDraw({
|
|
168
|
+
pipeline,
|
|
169
|
+
streamSet: streams,
|
|
170
|
+
bindTables: [bindTable],
|
|
171
|
+
vertexCount: 3,
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
// Scratch matrices (zero heap allocations in render loop)
|
|
175
|
+
const model = new Mat4();
|
|
176
|
+
const viewProj = new Mat4();
|
|
177
|
+
const mvp = new Mat4();
|
|
178
|
+
Mat4.perspective(Math.PI / 4, 16 / 9, 0.1, 100, viewProj);
|
|
179
|
+
|
|
180
|
+
// 5. Simulation & Render Tick
|
|
181
|
+
function tick(deltaTime: number) {
|
|
182
|
+
// Evaluate continuous harmonic spring displacement
|
|
183
|
+
spring.step(deltaTime);
|
|
184
|
+
const elevation = spring.position;
|
|
185
|
+
|
|
186
|
+
// Process matching entities
|
|
187
|
+
query2(transforms, tagSet, (entity, matrixView) => {
|
|
188
|
+
Mat4.translation(0, elevation, -5, model);
|
|
189
|
+
Mat4.mul(viewProj, model, mvp);
|
|
190
|
+
uboBuf.write(gfx, mvp);
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
// Record and submit commands
|
|
194
|
+
const encoder = gfx.createCommandEncoder("FrameEncoder");
|
|
195
|
+
pass.execute(encoder);
|
|
196
|
+
gfx.submit(encoder);
|
|
197
|
+
}
|
|
198
|
+
```
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Socket, type SocketOptions } from "./socket.js";
|
|
2
|
+
import type { ProcessCtx } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Stateless computational unit with 1-to-1 input sockets and 1-to-N output sockets.
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class Chip {
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly name: string;
|
|
9
|
+
readonly inputs: Map<string, Socket>;
|
|
10
|
+
readonly outputs: Map<string, Socket>;
|
|
11
|
+
readonly metadata: Record<string, any>;
|
|
12
|
+
constructor(id: string, name: string);
|
|
13
|
+
/**
|
|
14
|
+
* Registers an input socket.
|
|
15
|
+
*/
|
|
16
|
+
addInput(socketOrName: Socket | string, options?: string | SocketOptions): this;
|
|
17
|
+
/**
|
|
18
|
+
* Registers an output socket.
|
|
19
|
+
*/
|
|
20
|
+
addOutput(socketOrName: Socket | string, dataType?: string): this;
|
|
21
|
+
hasInput(name: string): boolean;
|
|
22
|
+
hasOutput(name: string): boolean;
|
|
23
|
+
getInput<T extends Socket = Socket>(name: string): T | undefined;
|
|
24
|
+
getOutput<T extends Socket = Socket>(name: string): T | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Connection validation gate invoked prior to establishing a wire.
|
|
27
|
+
* Enforces socket existence and dataType compatibility when types are declared.
|
|
28
|
+
*/
|
|
29
|
+
canConnectInput(inSocketName: string, outChip: Chip, outSocketName: string): boolean;
|
|
30
|
+
/**
|
|
31
|
+
* Evaluates the chip from one execution's resolved input values.
|
|
32
|
+
* Input and output values belong to the circuit run, not to the chip.
|
|
33
|
+
*/
|
|
34
|
+
abstract process(inputs: Record<string, any>, ctx?: ProcessCtx<any>): Record<string, any>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Transparent proxy chip delegating execution and configuration to a source chip.
|
|
38
|
+
*/
|
|
39
|
+
export declare class ChipProxy extends Chip {
|
|
40
|
+
readonly sourceChip: Chip;
|
|
41
|
+
constructor(id: string, sourceChip: Chip);
|
|
42
|
+
canConnectInput(inSocketName: string, outChip: Chip, outSocketName: string): boolean;
|
|
43
|
+
process(inputs: Record<string, any>, ctx?: ProcessCtx<any>): Record<string, any>;
|
|
44
|
+
clone(newId: string): ChipProxy;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=chip.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chip.d.ts","sourceRoot":"","sources":["../../acircuit/chip.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C;;GAEG;AACH,8BAAsB,IAAI;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,sBAA6B;IAC5C,QAAQ,CAAC,OAAO,sBAA6B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;gBAEhC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAKpC;;OAEG;IACH,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAc/E;;OAEG;IACH,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAcjE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAC/B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAEhC,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIhE,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIjE;;;OAGG;IACH,eAAe,CACX,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,IAAI,EACb,aAAa,EAAE,MAAM,GACtB,OAAO;IAYV;;;OAGG;IACH,QAAQ,CAAC,OAAO,CACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,GACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CACzB;AAED;;GAEG;AACH,qBAAa,SAAU,SAAQ,IAAI;IAC/B,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;gBAEd,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI;IAe/B,eAAe,CACpB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,IAAI,EACb,aAAa,EAAE,MAAM,GACtB,OAAO;IAID,OAAO,CACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3B,GAAG,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,GACtB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAItB,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS;CAGlC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Socket } from "./socket.js";
|
|
2
|
+
/**
|
|
3
|
+
* Stateless computational unit with 1-to-1 input sockets and 1-to-N output sockets.
|
|
4
|
+
*/
|
|
5
|
+
export class Chip {
|
|
6
|
+
id;
|
|
7
|
+
name;
|
|
8
|
+
inputs = new Map();
|
|
9
|
+
outputs = new Map();
|
|
10
|
+
metadata = {};
|
|
11
|
+
constructor(id, name) {
|
|
12
|
+
this.id = id;
|
|
13
|
+
this.name = name;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Registers an input socket.
|
|
17
|
+
*/
|
|
18
|
+
addInput(socketOrName, options) {
|
|
19
|
+
let socket;
|
|
20
|
+
if (typeof socketOrName === "string") {
|
|
21
|
+
socket = new Socket(socketOrName, "input", options);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
socket = socketOrName;
|
|
25
|
+
}
|
|
26
|
+
if (socket.direction !== "input") {
|
|
27
|
+
throw new Error(`[Chip] Input socket "${socket.name}" must have input direction.`);
|
|
28
|
+
}
|
|
29
|
+
this.inputs.set(socket.name, socket);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Registers an output socket.
|
|
34
|
+
*/
|
|
35
|
+
addOutput(socketOrName, dataType) {
|
|
36
|
+
let socket;
|
|
37
|
+
if (typeof socketOrName === "string") {
|
|
38
|
+
socket = new Socket(socketOrName, "output", dataType ? { dataType } : {});
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
socket = socketOrName;
|
|
42
|
+
}
|
|
43
|
+
if (socket.direction !== "output") {
|
|
44
|
+
throw new Error(`[Chip] Output socket "${socket.name}" must have output direction.`);
|
|
45
|
+
}
|
|
46
|
+
this.outputs.set(socket.name, socket);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
hasInput(name) { return this.inputs.has(name); }
|
|
50
|
+
hasOutput(name) { return this.outputs.has(name); }
|
|
51
|
+
getInput(name) {
|
|
52
|
+
return this.inputs.get(name);
|
|
53
|
+
}
|
|
54
|
+
getOutput(name) {
|
|
55
|
+
return this.outputs.get(name);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Connection validation gate invoked prior to establishing a wire.
|
|
59
|
+
* Enforces socket existence and dataType compatibility when types are declared.
|
|
60
|
+
*/
|
|
61
|
+
canConnectInput(inSocketName, outChip, outSocketName) {
|
|
62
|
+
const inSocket = this.getInput(inSocketName);
|
|
63
|
+
const outSocket = outChip.getOutput(outSocketName);
|
|
64
|
+
if (!inSocket || !outSocket)
|
|
65
|
+
return true;
|
|
66
|
+
if (inSocket.dataType !== undefined && outSocket.dataType !== undefined) {
|
|
67
|
+
if (inSocket.dataType === "any" || outSocket.dataType === "any")
|
|
68
|
+
return true;
|
|
69
|
+
if (inSocket.dataType !== outSocket.dataType)
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Transparent proxy chip delegating execution and configuration to a source chip.
|
|
77
|
+
*/
|
|
78
|
+
export class ChipProxy extends Chip {
|
|
79
|
+
sourceChip;
|
|
80
|
+
constructor(id, sourceChip) {
|
|
81
|
+
super(id, sourceChip.name);
|
|
82
|
+
this.sourceChip = sourceChip;
|
|
83
|
+
for (const socket of sourceChip.inputs.values()) {
|
|
84
|
+
this.addInput(socket.name, {
|
|
85
|
+
dataType: socket.dataType,
|
|
86
|
+
required: socket.required,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
for (const socket of sourceChip.outputs.values()) {
|
|
90
|
+
this.addOutput(socket.name, socket.dataType);
|
|
91
|
+
}
|
|
92
|
+
Object.assign(this.metadata, sourceChip.metadata);
|
|
93
|
+
}
|
|
94
|
+
canConnectInput(inSocketName, outChip, outSocketName) {
|
|
95
|
+
return this.sourceChip.canConnectInput(inSocketName, outChip, outSocketName);
|
|
96
|
+
}
|
|
97
|
+
process(inputs, ctx) {
|
|
98
|
+
return this.sourceChip.process(inputs, ctx);
|
|
99
|
+
}
|
|
100
|
+
clone(newId) {
|
|
101
|
+
return new ChipProxy(newId, this.sourceChip);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=chip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chip.js","sourceRoot":"","sources":["../../acircuit/chip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { Chip } from "./chip.js";
|
|
2
|
+
import { type Wire } from "./wire.js";
|
|
3
|
+
import type { RunOptions, RunResult, CircuitValidationResult, SerializedCircuit, ChipFactory } from "./types.js";
|
|
4
|
+
export interface CircuitOptions {
|
|
5
|
+
label?: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Directed graph with 1-to-1 input wires and 1-to-N output fan-out.
|
|
9
|
+
* Chip values exist only in the scope of a run.
|
|
10
|
+
*/
|
|
11
|
+
export declare class Circuit {
|
|
12
|
+
readonly label: string;
|
|
13
|
+
readonly chips: Map<string, Chip>;
|
|
14
|
+
/** Inward wires: "inChipId:inSocket" -> Wire (1-to-1). */
|
|
15
|
+
private readonly _inWires;
|
|
16
|
+
/** Outward wires: "outChipId:outSocket" -> Wire[] (1-to-N). */
|
|
17
|
+
private readonly _outWires;
|
|
18
|
+
/** Inward wires grouped by destination chip ID. */
|
|
19
|
+
private readonly _chipInWires;
|
|
20
|
+
/** Outward wires grouped by source chip ID. */
|
|
21
|
+
private readonly _chipOutWires;
|
|
22
|
+
private _dirtyTopo;
|
|
23
|
+
private _cachedOrder;
|
|
24
|
+
private _cachedPlan;
|
|
25
|
+
constructor(options?: CircuitOptions);
|
|
26
|
+
private _addChipWire;
|
|
27
|
+
private _removeChipWire;
|
|
28
|
+
addChip(chip: Chip): this;
|
|
29
|
+
hasChip(id: string): boolean;
|
|
30
|
+
getChip<T extends Chip = Chip>(id: string): T | undefined;
|
|
31
|
+
removeChip(chipOrId: Chip | string): this;
|
|
32
|
+
/**
|
|
33
|
+
* Connects an output socket to an input socket, replacing any existing
|
|
34
|
+
* connection on the destination input.
|
|
35
|
+
*/
|
|
36
|
+
connect(outChipOrId: Chip | string, outSocketName: string, inChipOrId: Chip | string, inSocketName: string): Wire;
|
|
37
|
+
disconnect(wireOrChipId: Wire | Chip | string, inSocketName?: string): boolean;
|
|
38
|
+
disconnectAll(chipOrId: Chip | string): this;
|
|
39
|
+
getIncomingWire(chipOrId: Chip | string, socketName: string): Wire | undefined;
|
|
40
|
+
getIncomingWires(chipOrId: Chip | string): Wire[];
|
|
41
|
+
getOutgoingWires(chipOrId: Chip | string, socketName?: string): Wire[];
|
|
42
|
+
getWires(): Wire[];
|
|
43
|
+
/** Returns all chips in dependency order and rejects cycles. */
|
|
44
|
+
topoSort<T extends Chip = Chip>(force?: boolean): T[];
|
|
45
|
+
/** Executes chips in topological order with run-local input and output values. */
|
|
46
|
+
run<TCtx = unknown>(options?: RunOptions<TCtx, Chip>): RunResult<Chip>;
|
|
47
|
+
/**
|
|
48
|
+
* Statically analyzes graph topology without throwing errors.
|
|
49
|
+
* Identifies cycles, missing required inputs, type mismatches, and isolated chips.
|
|
50
|
+
*/
|
|
51
|
+
validate(): CircuitValidationResult;
|
|
52
|
+
/** Returns chips with indegree 0 (zero incoming connections). */
|
|
53
|
+
getSources(): Chip[];
|
|
54
|
+
/** Returns chips with outdegree 0 (zero outgoing connections). */
|
|
55
|
+
getSinks(): Chip[];
|
|
56
|
+
/** Returns all transitive upstream ancestor chips feeding into the target chip. */
|
|
57
|
+
getUpstreamChips(chipOrId: Chip | string): Set<Chip>;
|
|
58
|
+
/** Returns all transitive downstream descendant chips fed by the target chip. */
|
|
59
|
+
getDownstreamChips(chipOrId: Chip | string): Set<Chip>;
|
|
60
|
+
/** Returns whether a directed path exists from source chip to target chip. */
|
|
61
|
+
isReachable(fromChipOrId: Chip | string, toChipOrId: Chip | string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Dead code elimination: prunes chips that do not reach target chips.
|
|
64
|
+
* When targetChipIds is omitted, preserves all chips reaching circuit sinks.
|
|
65
|
+
*/
|
|
66
|
+
pruneUnreachable(targetChipIds?: string[]): this;
|
|
67
|
+
/**
|
|
68
|
+
* Extracts an isolated subcircuit containing only the specified target chips,
|
|
69
|
+
* their transitive upstream dependencies, and internal interconnecting wires.
|
|
70
|
+
*/
|
|
71
|
+
extractSubgraph(targetChipIds: string[], options?: CircuitOptions): Circuit;
|
|
72
|
+
/**
|
|
73
|
+
* Inlines a composite subcircuit chip directly into this graph,
|
|
74
|
+
* expanding its inner chips and rerouting external wires.
|
|
75
|
+
*/
|
|
76
|
+
flatten(chipOrId: Chip | string, prefix?: string): this;
|
|
77
|
+
/** Clones this circuit graph with optional custom chip factory. */
|
|
78
|
+
clone(chipCloner?: (chip: Chip) => Chip): Circuit;
|
|
79
|
+
/** Merges another circuit graph into this one, optionally applying a prefix to chip IDs. */
|
|
80
|
+
merge(other: Circuit, prefix?: string): this;
|
|
81
|
+
/** Serializes circuit topology into a portable JSON structure. */
|
|
82
|
+
toJSON(): SerializedCircuit;
|
|
83
|
+
/** Reconstructs a Circuit graph from serialized JSON using a chip factory. */
|
|
84
|
+
static fromJSON(json: SerializedCircuit, chipFactory: ChipFactory): Circuit;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=circuit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../../acircuit/circuit.ts"],"names":[],"mappings":"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"}
|