Skip to content

docs(website): blog post -- a WASM interpreter ran on the board - #1624

Merged
gHashTag merged 1 commit into
mainfrom
docs/blog-wasm-board-ax7203
Oct 12, 2026
Merged

gHashTag merged 1 commit into
mainfrom
docs/blog-wasm-board-ax7203

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 12, 2026 •

Copy link
Copy Markdown
Owner
{
  "version": 1,
  "head_sha": "fe2b698dca415c53d63e3233719deff287b34d28",
  "summary": "New bilingual blog post for the 12 October silicon run: a t27 spec in gHashTag/t27 (branch wasm-board, 351e3cdf4) became the fpga_wasm_board Verilog core through t27c gen-verilog, openXC7 placed it on an ALINX AX7203, and the board answered 134 of 134 requests exactly over six runs (804 of 804), 416 answers per second. 21 opcodes of the WASM MVP set, a 14-program 101-byte ROM, i32.mul as a 32-clock shift-add microsequence; the nextpnr timing estimate went from 18.57 to 70.41 MHz against a 68.7 bar at one percent of the LUTs. Ships with the recorded bench session under public/term/wasm-board-ax7203/ and its recorder script, and fixes the recordings index count, stale at 108 while the grid held 118 cards.",
  "changes": [
    "apps/website/src/data/blog/bodies/a-wasm-interpreter-ran-on-the-board.ts: new EN and RU body",
    "apps/website/src/data/blog/index.ts: new PostMeta entry (published: true) with five receipts and five open questions in both languages",
    "apps/website/src/data/blog/posts.ts: import and map entry for the new body",
    "apps/website/public/term/wasm-board-ax7203/: the recorded bench session (cast, card, page, meta) and its grid entry in public/term/index.html, whose count was 10 behind the grid",
    "apps/website/scripts/wasm-board-cast.mjs: the recorder, refusing to write unless the scan shows one FT232H, the flash prints done, the self-test passes and the run prints the exact PASS line"
  ],
  "tests": [
    {
      "command": "npx vite build (apps/website)",
      "status": "passed",
      "result": "build succeeds in 15.26 s; the post is present in dist/rss.xml, the Blog chunk and its own lazy chunk",
      "evidence": "local build of this head (fe2b698dc) in a clean worktree off origin/main, 2026-10-12"
    },
    {
      "command": "npm run typecheck:ratchet",
      "status": "passed",
      "result": "baseline 179 errors across 26 files, unchanged; no file gained errors. The first run caught a missing type import in the new body (2 errors), fixed before this commit",
      "evidence": "same local run, 2026-10-12"
    },
    {
      "command": "node qa/explorer-language-contract.mjs && node qa/queen-language-contract.mjs",
      "status": "passed",
      "result": "explorer pages 8/8 en-ru key sets identical; queen 497 EN and 497 RU keys",
      "evidence": "same local run, 2026-10-12"
    }
  ],
  "limitations": [
    "Every frequency in the post is a nextpnr estimate (openXC7, seed 1), not sign-off timing; each figure says so in its own sentence.",
    "The interpreter covers 21 opcodes of the WebAssembly MVP set; the full ISA is not claimed.",
    "Programs are ROM-resident, built from the spec; no .wasm binary is loaded over the wire.",
    "416 answers per second is the pace of the 1,144,744-baud UART link, not a ceiling of the interpreter.",
    "One board, one night, six runs; no voltage or temperature corners were swept.",
    "The bring-up top is hand-written Verilog under the owner-approved-foreign exception in trinity-fpga."
  ],
  "tags": ["t27", "FPGA", "WASM", "OpenToolchain"],
  "blog": {
    "title": "A WASM interpreter ran on the board: 134 of 134, from a spec",
    "summary": "This PR is itself the blog article: a t27 spec became a Verilog WASM interpreter core, openXC7 placed it on an ALINX AX7203, and the chip answered every request exactly -- with the conformance harness, its self-test and the one bug that self-test caught, all in the post.",
    "outline": [
      "What the silicon runs: a 21-opcode WASM MVP interpreter, a 14-program 101-byte ROM, AA 55 frames at 1,144,744 baud; the core generated from the spec, the bring-up top hand-written and said so plainly.",
      "Timing as a nextpnr estimate, 18.57 to 70.41 MHz after rewriting i32.mul into a 32-clock shift-add microsequence; one percent of the LUTs; the self-test that caught a wire-offset bug worth 76 false failures before any hardware run.",
      "Open: 21 opcodes is a subset, programs are ROM-resident, answers per second is the link pace, one board and six runs, the hand-written top."
    ]
  }
}

Side fix outside this repo: trinity-fpga#919 relabels the timing line in the experience log this post links to, so the receipt says "nextpnr estimate" the same way the post does.

🤖 Generated with Claude Code

A bilingual post for the 12 October silicon run: the t27 spec in
gHashTag/t27 became a Verilog core through t27c gen-verilog, openXC7
placed it on an ALINX AX7203, and the board answered 134 of 134
requests exactly over six runs. Adds the recorded bench session under
public/term/wasm-board-ax7203/ with its recorder in scripts/, and
corrects the recordings index count, which had gone stale at 108 while
the grid already held 118 cards. Every frequency figure is labelled a
nextpnr estimate in its own sentence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added the status:in-progress 🔵 Agent working label Oct 12, 2026
@tri-claw

tri-claw Bot commented Oct 12, 2026

Copy link
Copy Markdown

Summary by t27-bees

This PR adds a bilingual blog post documenting a WASM interpreter running on an ALINX AX7203 FPGA board, generated from a t27 spec via openXC7. It includes the bench session recording (asciicast), a recorder script that validates the run before publishing, and updates the recordings index.

Worth a look

  • apps/website/scripts/wasm-board-cast.mjs:L52-L57 — Hardcoded device paths (/dev/cu.usbserial-130, busdev 000:005) and Chrome search paths (macOS/Linux only) mean the script will fail on other machines without --port, --busdev, and --chrome overrides. Windows Chrome paths are not in the fallback list.

  • apps/website/scripts/wasm-board-cast.mjs:L100-L118 — The render function spawns Chrome detached, then tries to kill the process group with process.kill(-b.pid, 'SIGKILL'). If the kill races with Chrome's own cleanup or the process group is already gone, this can throw or leave the temp directory uncleaned (the catch block swallows the rmSync failure).

  • apps/website/scripts/wasm-board-cast.mjs:L132-L134 — The scan validation expects exactly one FT232H line containing the busdev (with colon replaced by space). If openFPGALoader --scan-usb output format changes (e.g., extra whitespace, different column order), the ft232.length !== 1 check will falsely block a valid recording.

  • apps/website/public/term/index.html:L15 — The lede count jumps from 108 to 119 while only one new <a> card is added in the diff. The description explains the grid already held 118 cards (count was stale at 108), so 119 is correct, but the diff alone doesn't show the other 118 cards — a reviewer seeing only this diff might think the count is wrong.

  • apps/website/src/data/blog/bodies/a-wasm-interpreter-ran-on-the-board.ts:L43 — The timing claim "70.41 MHz against a 68.7 MHz bar" is a nextpnr estimate (seed 1), not sign-off timing. The post acknowledges this, but the table heading "Timing (nextpnr estimate)" only appears in the Russian version; the English table says "Timing (nextpnr estimate)" in the row but the column header is just "What".


Read: 9 files, +814 -3, the whole diff. Head fe2b698. Model: openai-compatible/nvidia/nemotron-3-ultra-550b-a55b. Commands: @t27-bees review | summary | help | pause | resume. Free for every repository.

@github-actions

Copy link
Copy Markdown
Contributor

X Brain Health Check

Score: 100.0/100
Status: 🟢 HEALTHY
Threshold: 80/100

X Brain is above merge threshold

@github-actions

Copy link
Copy Markdown
Contributor

🧪 Brain Stress Test Results

Tests: 261/261 passed, 0 leaked
Status: 🟢 PASS
Gate: every test in zig build test-brain-stress passes and none leaks

@gHashTag
gHashTag merged commit 252955f into main Oct 12, 2026
31 checks passed
@gHashTag
gHashTag deleted the docs/blog-wasm-board-ax7203 branch October 12, 2026 07:39
@github-actions github-actions Bot added status:completed Done and removed status:in-progress 🔵 Agent working labels Oct 12, 2026
github-actions Bot added a commit that referenced this pull request Oct 12, 2026
docs(website): blog post -- a WASM interpreter ran on the board (#1624)

Bilingual post for the 12 October silicon run: a t27 spec became the fpga_wasm_board Verilog core, openXC7 placed it on an ALINX AX7203, and the board answered 134 of 134 requests exactly over six runs. Every frequency is labelled a nextpnr estimate. Ships with the recorded bench session under public/term/wasm-board-ax7203/ and fixes the stale recordings index count (108 -> 119).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant