ModuLisp/MAP.md

3.6 KiB

MAP — ModuLisp repo inventory

modulisp/
├── meson.build              # project root: useq_utils → useq_devtools → useq_signal_engine static libs
├── library.properties       # Arduino library manifest (ModuLisp 0.1.0, includes=src/signal_engine/signal_engine.h)
├── src/
│   ├── pch.h                # precompiled header (std includes)
│   ├── modulisp/
│   │   └── lisp/symbol_intern.h        # header-only symbol interning table
│   ├── signal_engine/       # 12 .cpp + 13 .h + symbols.def
│   │   ├── token.{h,cpp}               # tokenizer
│   │   ├── cell_store.{h,cpp}          # S-expression cell arena
│   │   ├── node_pool.{h,cpp}           # fixed-pool DAG node storage + traversal
│   │   ├── graph_builder.{h,cpp}       # cell graph → node DAG compiler
│   │   │                               # (resolve_hardware_input consults ext_registry first)
│   │   ├── compiler_pipeline.{h,cpp}   # source → tokens → cells → DAG orchestration
│   │   ├── cold_eval.{h,cpp} + eval_ops.h  # constant folding / cold evaluation
│   │   │                               # (top-level sink forms + cold commands dispatch here)
│   │   ├── executor.{h,cpp}            # tick-time DAG executor
│   │   │                               # (+ publish_sink_values post-tick publication)
│   │   ├── ext_registry.{h,cpp}        # generic named external-input/sink/command registries
│   │   │                               # (firmware profile seam; no nn/* or midi/* builtins)
│   │   ├── state_registry.{h,cpp}      # defstate slots, live-edit slots
│   │   ├── synth_registry.{h,cpp}      # synth graph snapshot registry
│   │   ├── synth_graph.{h,cpp}         # serialisable synth artefact graph
│   │   ├── diagnostics.{h,cpp}         # health/persistent-output diagnostics
│   │   ├── signal_engine.h             # umbrella header
│   │   ├── types.h, build_profile.h    # shared types, build tuning knobs
│   │   └── symbols.def                 # builtin symbol catalogue (X-macro list)
│   ├── utils/               # string.{h,cpp}, common.{h,cpp}, itoa.{h,cpp}, log.{h,cpp},
│   │                        # json_builder.h, json_cursor.h, dtostrf.h, serial_message.h,
│   │                        # time.h, compiler_config.h
│   ├── devtools/            # devtools.{h,cpp} — USEQ_DEVTOOLS-gated telemetry
│   └── ports/               # IStorage.h, II2CTransport.h, mocks/{MockStorage.h,MockI2CBus.h}
└── test/
    ├── meson.build          # 18 Catch2 executables, fresh file
    ├── catch.hpp            # vendored Catch2 v2 (from src-useq/test/catch.hpp)
    └── signal_engine/       # 18 test .cpp (host-only subset; exclusions in README.md)

External-register seam (NISPS-USEQ spec §3, generic mechanism only): ext_registry.{h,cpp} holds firmware-profile registrations for named external inputs, external sinks, and cold commands. graph_builder resolves registered input names before the builtin board inputs; cold_eval binds registered sinks with ordinary top-level assignment (channels publish as pool output slots ≥ SINK_SLOT_BASE, so per-sink LKG rides the existing GraphMutationTransaction machinery) and dispatches registered commands to the installed handler after the submission's earlier forms compiled. executor::publish_sink_values writes SignalEngine::sink_values / sink_dirty per tick for the firmware to poll.

Build artifacts: build/ (meson/ninja). 3 libs + 18 test executables.