nimiser.toml (user manifest)
│
▼
┌─────────────────────────────────────────────┐
│ src/main.rs │
│ CLI entry point (clap) │
│ Subcommands: init, validate, generate, │
│ build, run, info │
└──────────┬──────────────────────────────────┘
│
┌──────┴──────┐
▼ ▼
┌────────┐ ┌──────────┐
│manifest│ │ codegen │
│mod.rs │ │ mod.rs │
│ │ │ │
│ Parse │ │ Generate │
│ TOML │──▶ Nim src │
│ Validate│ │ │
└────────┘ └─────┬────┘
│
┌────────┼────────┐
▼ ▼ ▼
┌─────────┐ ┌────┐ ┌──────┐
│Templates│ │Macros│ │Generics│
│{.exportc│ │AST │ │Mono- │
│ .cdecl.}│ │xform│ │morph │
└────┬────┘ └──┬──┘ └──┬───┘
│ │ │
└─────┬───┘───────┘
▼
┌──────────────────┐
│ Nim Source Code │
│ (generated/) │
└────────┬─────────┘
│
▼ nim c --app:lib --gc:arc
┌──────────────────┐
│ C Library Output │
│ .a / .so + .h │
└────────┬─────────┘
│
▼
┌──────────────────┐
│ Zig FFI Bridge │
│ (nimiser_* fns) │
└──────────────────┘
| Module | Path | Purpose |
|---|---|---|
CLI |
|
Clap-based CLI with 6 subcommands |
Library |
|
Public API for programmatic use |
Manifest |
|
Parse and validate |
Codegen |
|
Generate Nim templates, macros, generics |
ABI (Rust) |
|
Rust-side ABI types mirroring Idris2 |
ABI (Idris2) |
|
Formal type definitions: NimTemplate, NimMacro, CompileTimeAST, CBackend, NimObject |
Layout (Idris2) |
|
Memory layout proofs for Nim objects exported as C structs |
Foreign (Idris2) |
|
FFI declarations: nimiser_init, nimiser_compile, nimiser_gen_template, etc. |
FFI (Zig) |
|
C-ABI implementation of nimiser_* functions |
FFI Build |
|
Zig build system for shared/static library |
FFI Tests |
|
Integration tests verifying Zig FFI matches Idris2 ABI |
-
User writes
nimiser.tomldescribing library interface (types, functions, strategies) -
Manifest parser (
src/manifest/) validates and produces aManifeststruct -
Codegen (
src/codegen/) generates Nim source files:-
Templates for zero-cost generic abstractions
-
Macros for AST-level compile-time transforms
-
Generics for monomorphised type specialisation
-
-
Nim compiler (
nim c --app:lib --gc:arc) compiles generated Nim to optimised C -
C library (
.a/.so+.h) is the primary output artefact -
Zig FFI (
src/interface/ffi/) provides a stable bridge for consumers -
Idris2 ABI (
src/interface/abi/) proves the C ABI is correct at compile time
Idris2 ABI Proofs ──────────── Zig FFI Implementation Types.idr (NimTemplate, main.zig (nimiser_init, NimMacro, CBackend) nimiser_compile, etc.) Layout.idr (NimObject build.zig (shared/static lib) struct layout proofs) Foreign.idr (FFI integration_test.zig function signatures) (verify ABI compliance)
The Idris2 ABI is the specification. The Zig FFI is the implementation. Integration tests verify they agree.