You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Two follow-ups to #296 (which merged before these were committed).
**fix(coproc): decouple from Axiom.jl.** Per owner directive: Axiom.jl
was the design *model* (capability classes + linear buffers + thin FFI
seam, full coverage), **not** a dependency. Removes all 'forward to /
surface / import / co-own Axiom' framing from `Coproc.eph`, the Zig shim
(`TODO(axiom)`→`TODO(backend)`, drop Julia C-embedding), and the README
— ephapax owns its own seam, dispatching to a native backend it chooses.
Code unchanged (always a generic FFI boundary; only the narrative was
wrong). Adds `just build-coproc`/`test-coproc`. Documents honestly
(README + gaps **G6**) that the typed `Coproc` API is **not yet
consumable** — `import Coproc; Coproc.upload(…)` neither parses
(qualified `Coproc.Tensor`) nor resolves (import exposes no members):
the keystone gap stranding the whole stdlib. Seam reachable today only
via raw `__ffi` (42-vs-0 proof).
**docs(formal): §4.8 path (3) disproved.** Records that the
owner-approved leaf-rule strengthening was implemented + coqc-disproved
(false at type-erasing eliminators, `EDrop(EVar j)`); the real fork is
effect typing (A′).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
IO/FPGA) reached over a single C-ABI seam, with the language's linear types
13
+
guarding the device-buffer lifecycle.
14
14
15
-
The boundary is deliberately clean (no framework internals cross into the
16
-
language):
15
+
The DESIGN follows the pattern Axiom.jl demonstrated (capability classes +
16
+
linear buffers + a thin FFI seam, covering the full range of coprocessor
17
+
types). ephapax *models* that pattern — it does **not** import, depend on,
18
+
co-own, or forward to Axiom. The seam is ephapax's own, and the boundary is
19
+
deliberately clean (no framework internals cross into the language):
17
20
18
21
[cols="1,3"]
19
22
|===
20
23
| `stdlib/Coproc.eph` | The typed ephapax surface: a `Capability` sum type (the ten classes), a `cap_tag` wire-tag map, and a LINEAR `CoprocBuf` device-buffer handle with an `upload → dispatch* → (download \| release)` lifecycle. Type-checks under `ephapax check`.
21
-
| `tools/coproc/ephapax_coproc.zig` | The single shared seam: a Zig shared library exporting a flat C ABI (`eph_coproc_*`, all `i64 (...) -> i64`). In a full build it forwards to Axiom via the Julia C-embedding API; the in-tree build is a STUB (reports unavailable, with one loopback for the seam test). Mirrors how Axiom itself links Zig.
24
+
| `tools/coproc/ephapax_coproc.zig` | The single C-ABI seam: a Zig shared library exporting flat `eph_coproc_*` symbols (`i64 (...) -> i64`) that dispatch to whatever native coprocessor backend is linked behind them. The in-tree build is a STUB (reports unavailable, with one loopback for the seam test). No external framework, no Julia, no Axiom runtime.
22
25
| ephapax `__ffi` path | ephapax reaches the seam through its ordinary foreign-call mechanism — no new language feature. Load with `-L libephapax_coproc.so`.
23
26
|===
24
27
@@ -55,14 +58,30 @@ returns `42` with the shim linked, and falls through to ephapax's built-in
55
58
`[ffi:stub] -> 0` when it is not — proving the `__ffi` path reaches this
56
59
shim.
57
60
58
-
== Wiring the real Axiom backend
61
+
== Wiring status (honest)
59
62
60
-
The `// TODO(axiom)` markers in `ephapax_coproc.zig` are the exact forwarder
61
-
points. Each `eph_coproc_*` symbol selects the Axiom `CoprocessorBackend`
62
-
struct from its capability tag and `jl_call`s the matching
0 commit comments