From 7fb3d7b576f88fe3eb96247651263fc2217c57f5 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev Date: Sun, 18 Oct 2026 18:11:15 +0700 Subject: [PATCH 1/9] WIP paper-claims widget spec, card, gallery and lesson link Co-Authored-By: Claude Opus 5.5 --- .../public/widgets/paper-claims/card.png | Bin 0 -> 72085 bytes .../public/widgets/paper-claims/tool.js | 3 + apps/website/specs/course/goldenfloat.t27 | 2 +- apps/website/specs/widgets/gallery.t27 | 32 ++--- apps/website/specs/widgets/paper-claims.t27 | 110 ++++++++++++++++++ 5 files changed, 130 insertions(+), 17 deletions(-) create mode 100644 apps/website/public/widgets/paper-claims/card.png create mode 100644 apps/website/public/widgets/paper-claims/tool.js create mode 100644 apps/website/specs/widgets/paper-claims.t27 diff --git a/apps/website/public/widgets/paper-claims/card.png b/apps/website/public/widgets/paper-claims/card.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff7a09a3450b8f7da9ee2cfcb5cdad38dfd36d4 GIT binary patch literal 72085 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 literal 0 HcmV?d00001 diff --git a/apps/website/public/widgets/paper-claims/tool.js b/apps/website/public/widgets/paper-claims/tool.js new file mode 100644 index 0000000000..4f480287d3 --- /dev/null +++ b/apps/website/public/widgets/paper-claims/tool.js @@ -0,0 +1,3 @@ +// paper-claims/tool.js -- offered in lesson 1 of the GoldenFloat course. The words and cells are in +// specs/widgets/paper-claims.t27 (window.T27_WIDGET); ../infographic.js draws them. +import '../infographic.js' diff --git a/apps/website/specs/course/goldenfloat.t27 b/apps/website/specs/course/goldenfloat.t27 index ff3a4fb09d..b7acee4983 100644 --- a/apps/website/specs/course/goldenfloat.t27 +++ b/apps/website/specs/course/goldenfloat.t27 @@ -181,7 +181,7 @@ pub const LESSON_WIDGETS : [27]str = [ "golden-gft16", "golden-gft32", "golden-decode" ]; pub const LESSON_ALSO : [27]str = [ - "", "", "", + "paper-claims", "", "", "", "", "", "", "", "", "", "", "", diff --git a/apps/website/specs/widgets/gallery.t27 b/apps/website/specs/widgets/gallery.t27 index 6285d9a4d1..4f504507e3 100644 --- a/apps/website/specs/widgets/gallery.t27 +++ b/apps/website/specs/widgets/gallery.t27 @@ -78,15 +78,15 @@ pub const TOOL_NOSCRIPT : str = "This widget runs in your browser and needs Java ; Parallel arrays, WIDGET_COUNT long. WIDGET_TITLES is empty wherever the page carries an ; og:title, which is every kind but tab: the page is the one place the words live. A tool's ; WIDGET_HOOKS entry is empty too: its hook is the page's t27:hook, written from its own spec. -pub const WIDGET_COUNT : u8 = 252; -pub const WIDGET_IDS : [252]str = ["x7-board", "tri-x7-fasm", "tri-x7-mutate", "perf2-loop", "tri-fpga-rgmii", "tri-fpga-jtag", "tri-fpga-pins", "devkit-flow", "play-verilog", "bit-diff", "build-receipt", "cost-curves", "gf16-calc", "idcode", "lut-explain", "pin-map", "placement-map", "resource-bars", "slack-waterfall", "test-waves", "synth-smells", "bit-autopsy", "fasm-skyline", "vcd-wrapped", "fits-on", "stat-card", "lut-depth", "fsm-sketch", "lut-treemap", "t27-cell", "t27-vs-nvfp4", "uart-bucket", "tri-fpga-specs", "tri-fpga-tools", "tri-fpga-wire", "tri-fpga-batch", "tri-fpga-status", "tri-fpga-tmpcheck", "tri-fpga-keycheck", "tri-fpga-selftest", "tri-x7-refs", "tri-x7-audit", "t27c-clock-domain", "t27c-clocks", "t27c-wukong-v1", "t27c-cts", "t27c-mmcm", "t27c-mmcm-mutate", "t27c-timing", "t27c-reset-sync", "t27c-reset-sync-gen", "t27c-mtbf", "t27c-clock-domain-gen", "t27c-fifo", "t27c-fifo-mutate", "t27c-fifo-flags", "t27c-emitter-xdc", "t27c-fpga-rxcap", "t27-tri-competitors", "t27-tri-discard", "tri-fpga-txhold", "tri-fpga-rxcap", "tri-fpga-rxer", "tri-fpga-steps", "tri-fpga-ioclients", "tri-fpga-claim", "tri-fpga-release", "tri-fpga-next", "t27c-memory", "t27c-spi-tb", "t27c-check-uart", "t27c-check-spi", "t27c-check-apb", "t27c-check-axi4", "t27c-check-bridge", "t27c-check-memory", "t27c-verilog-uart", "t27c-verilog-spi", "t27c-verilog-apb", "t27c-verilog-axi4", "t27c-verilog-bridge", "t27c-verilog-top", "t27c-verilog-uart-tb", "t27c-verilog-apb-tb", "t27c-verilog-axi-tb", "t27c-verilog-mem-tb", "t27c-verilog-integration-tb", "t27c-verilog-top-tb", "t27c-verilog-spi-tb", "t27c-hir-uart", "t27c-hir-apb", "t27c-hir-axi4", "t27c-eth-crc", "t27c-rgmii", "jtag-verdict", "line-bounce", "eye-isi", "ecc-secded", "carry-chain", "prefix-adder", "csa-tree", "shift-add", "booth-radix4", "dsp-fit", "q-format", "round-sat", "sqnr", "cordic", "cordic-vector", "sine-table", "alias-fold", "nco", "dft-bin", "fir-response", "fir-design", "fir-cost", "decimator", "cic-growth", "polyphase", "fft-butterfly", "bit-reverse", "fft-scaling", "barker-corr", "fir-fit", "fir-on-board", "play-hello-world", "play-rust", "play-js", "t27c-hello-world", "t27-tri-misread", "test-touch", "t27c-stages", "t27c-e8m0", "play-e8m0", "t27c-ocp-mx", "play-gfternary", "t27c-gfternary", "play-golden-sieve", "t27c-golden-sieve", "play-tnf17", "t27c-tnf17", "t27c-activation-quantizer", "t27c-bitnet-majority", "t27c-bitnet-neuron-nchunk", "t27c-comb-ternary-dot", "t27c-stream-ternary-mac", "t27c-bitnet-mlp", "t27c-gft-smul", "t27c-gft-sadd", "t27c-gft-signed-mac", "t27c-gft-relu", "t27c-gft-exp2", "t27c-gft-argmax4", "t27c-gft-nll", "t27c-gft-sgd-step", "t27c-gft-xornet", "basics-what-a-spec-is", "basics-the-module-line", "basics-comments-and-prose", "basics-constants", "basics-whole-numbers", "basics-true-false-and-text", "basics-arrays", "basics-trits", "basics-expressions", "basics-a-test-block", "basics-many-tests", "basics-functions", "basics-local-names", "basics-if-and-else", "basics-loops", "basics-pub-or-private", "basics-structs", "basics-enums", "basics-use-other-modules", "basics-invariants", "basics-gen-ts", "basics-seven-backends", "basics-stages-of-t27c", "basics-tri-commands", "basics-reading-errors", "basics-a-small-program", "basics-where-next", "golden-split", "golden-phi-ratio", "golden-lucas", "golden-split-optimality", "golden-radix-economy", "golden-phi-in-gf16", "golden-gf4", "golden-gf6", "golden-gf8", "golden-gf10", "golden-gf12", "golden-gf14", "golden-gf16", "golden-dot-two", "golden-gf24", "golden-gf32", "golden-gf48", "golden-gf64", "golden-gf96", "golden-gf128", "golden-gf256", "golden-gf512", "golden-gf1024", "golden-gft8", "golden-gft16", "golden-gft32", "golden-decode", "t27-tri-vectors", "t27-tri-census", "t27-tri-seals", "t27-tri-prose", "t27-tri-lean", "tri-selftest", "play-terminal-gates", "tc-why-three", "tc-balanced-count", "tc-flip-and-cut", "tc-kleene-gates", "tc-consensus-any", "tc-sum-and-carry", "tc-half-adder", "tc-full-adder", "tc-ripple-carry", "tc-times-a-trit", "tc-long-multiply", "tc-ternary-mac", "tc-two-bits", "tc-five-in-a-byte", "tc-trit-word", "tc-instruction-word", "tc-opcode-map", "tc-immediate", "tc-ternary-alu", "tc-three-way-jump", "tc-run-a-program", "tc-compare", "tc-thirds", "tc-sort-three", "tc-one-neuron", "tc-detector", "tc-tiny-layer", "wars", "tri-game-tick", "tri-game-vault", "perf2-knockouts", "race-the-bee", "gatle", "tri-blog-list", "tri-game-selftest"]; -pub const WIDGET_KINDS : [252]str = ["cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "player", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "player", "player", "player", "cast", "cast", "tool", "tool", "cast", "player", "cast", "player", "cast", "player", "cast", "player", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tab", "cast", "cast", "cast", "tool", "tool", "cast", "cast"]; -pub const WIDGET_CATEGORIES : [252]str = ["fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "game", "game", "game", "game", "game", "game", "game", "game"]; -pub const WIDGET_PAGES : [252]str = ["term/x7-board/", "term/tri-x7-fasm/", "term/tri-x7-mutate/", "term/perf2-loop/", "term/tri-fpga-rgmii/", "term/tri-fpga-jtag/", "term/tri-fpga-pins/", "term/devkit-flow/", "play/hello-world/verilog/", "widgets/bit-diff/", "widgets/build-receipt/", "widgets/cost-curves/", "widgets/gf16-calc/", "widgets/idcode/", "widgets/lut-explain/", "widgets/pin-map/", "widgets/placement-map/", "widgets/resource-bars/", "widgets/slack-waterfall/", "widgets/test-waves/", "widgets/synth-smells/", "widgets/bit-autopsy/", "widgets/fasm-skyline/", "widgets/vcd-wrapped/", "widgets/fits-on/", "widgets/stat-card/", "widgets/lut-depth/", "widgets/fsm-sketch/", "widgets/lut-treemap/", "widgets/t27-cell/", "widgets/t27-vs-nvfp4/", "widgets/uart-bucket/", "term/tri-fpga-specs/", "term/tri-fpga-tools/", "term/tri-fpga-wire/", "term/tri-fpga-batch/", "term/tri-fpga-status/", "term/tri-fpga-tmpcheck/", "term/tri-fpga-keycheck/", "term/tri-fpga-selftest/", "term/tri-x7-refs/", "term/tri-x7-audit/", "term/t27c-clock-domain/", "term/t27c-clocks/", "term/t27c-wukong-v1/", "term/t27c-cts/", "term/t27c-mmcm/", "term/t27c-mmcm-mutate/", "term/t27c-timing/", "term/t27c-reset-sync/", "term/t27c-reset-sync-gen/", "term/t27c-mtbf/", "term/t27c-clock-domain-gen/", "term/t27c-fifo/", "term/t27c-fifo-mutate/", "term/t27c-fifo-flags/", "term/t27c-emitter-xdc/", "term/t27c-fpga-rxcap/", "term/t27-tri-competitors/", "term/t27-tri-discard/", "term/tri-fpga-txhold/", "term/tri-fpga-rxcap/", "term/tri-fpga-rxer/", "term/tri-fpga-steps/", "term/tri-fpga-ioclients/", "term/tri-fpga-claim/", "term/tri-fpga-release/", "term/tri-fpga-next/", "term/t27c-memory/", "term/t27c-spi-tb/", "term/t27c-check-uart/", "term/t27c-check-spi/", "term/t27c-check-apb/", "term/t27c-check-axi4/", "term/t27c-check-bridge/", "term/t27c-check-memory/", "term/t27c-verilog-uart/", "term/t27c-verilog-spi/", "term/t27c-verilog-apb/", "term/t27c-verilog-axi4/", "term/t27c-verilog-bridge/", "term/t27c-verilog-top/", "term/t27c-verilog-uart-tb/", "term/t27c-verilog-apb-tb/", "term/t27c-verilog-axi-tb/", "term/t27c-verilog-mem-tb/", "term/t27c-verilog-integration-tb/", "term/t27c-verilog-top-tb/", "term/t27c-verilog-spi-tb/", "term/t27c-hir-uart/", "term/t27c-hir-apb/", "term/t27c-hir-axi4/", "term/t27c-eth-crc/", "term/t27c-rgmii/", "widgets/jtag-verdict/", "widgets/line-bounce/", "widgets/eye-isi/", "widgets/ecc-secded/", "widgets/carry-chain/", "widgets/prefix-adder/", "widgets/csa-tree/", "widgets/shift-add/", "widgets/booth-radix4/", "widgets/dsp-fit/", "widgets/q-format/", "widgets/round-sat/", "widgets/sqnr/", "widgets/cordic/", "widgets/cordic-vector/", "widgets/sine-table/", "widgets/alias-fold/", "widgets/nco/", "widgets/dft-bin/", "widgets/fir-response/", "widgets/fir-design/", "widgets/fir-cost/", "widgets/decimator/", "widgets/cic-growth/", "widgets/polyphase/", "widgets/fft-butterfly/", "widgets/bit-reverse/", "widgets/fft-scaling/", "widgets/barker-corr/", "widgets/fir-fit/", "widgets/fir-on-board/", "play/hello-world/", "play/hello-world/rust/", "play/hello-world/js/", "term/t27c-hello-world/", "term/t27-tri-misread/", "widgets/test-touch/", "widgets/t27c-stages/", "term/t27c-e8m0/", "play/e8m0/", "term/t27c-ocp-mx/", "play/gfternary/", "term/t27c-gfternary/", "play/golden-sieve/", "term/t27c-golden-sieve/", "play/tnf17/", "term/t27c-tnf17/", "term/t27c-activation-quantizer/", "term/t27c-bitnet-majority/", "term/t27c-bitnet-neuron-nchunk/", "term/t27c-comb-ternary-dot/", "term/t27c-stream-ternary-mac/", "term/t27c-bitnet-mlp/", "term/t27c-gft-smul/", "term/t27c-gft-sadd/", "term/t27c-gft-signed-mac/", "term/t27c-gft-relu/", "term/t27c-gft-exp2/", "term/t27c-gft-argmax4/", "term/t27c-gft-nll/", "term/t27c-gft-sgd-step/", "term/t27c-gft-xornet/", "widgets/basics-what-a-spec-is/", "widgets/basics-the-module-line/", "widgets/basics-comments-and-prose/", "widgets/basics-constants/", "widgets/basics-whole-numbers/", "widgets/basics-true-false-and-text/", "widgets/basics-arrays/", "widgets/basics-trits/", "widgets/basics-expressions/", "widgets/basics-a-test-block/", "widgets/basics-many-tests/", "widgets/basics-functions/", "widgets/basics-local-names/", "widgets/basics-if-and-else/", "widgets/basics-loops/", "widgets/basics-pub-or-private/", "widgets/basics-structs/", "widgets/basics-enums/", "widgets/basics-use-other-modules/", "widgets/basics-invariants/", "widgets/basics-gen-ts/", "widgets/basics-seven-backends/", "widgets/basics-stages-of-t27c/", "widgets/basics-tri-commands/", "widgets/basics-reading-errors/", "widgets/basics-a-small-program/", "widgets/basics-where-next/", "widgets/golden-split/", "widgets/golden-phi-ratio/", "widgets/golden-lucas/", "widgets/golden-split-optimality/", "widgets/golden-radix-economy/", "widgets/golden-phi-in-gf16/", "widgets/golden-gf4/", "widgets/golden-gf6/", "widgets/golden-gf8/", "widgets/golden-gf10/", "widgets/golden-gf12/", "widgets/golden-gf14/", "widgets/golden-gf16/", "widgets/golden-dot-two/", "widgets/golden-gf24/", "widgets/golden-gf32/", "widgets/golden-gf48/", "widgets/golden-gf64/", "widgets/golden-gf96/", "widgets/golden-gf128/", "widgets/golden-gf256/", "widgets/golden-gf512/", "widgets/golden-gf1024/", "widgets/golden-gft8/", "widgets/golden-gft16/", "widgets/golden-gft32/", "widgets/golden-decode/", "term/t27-tri-vectors/", "term/t27-tri-census/", "term/t27-tri-seals/", "term/t27-tri-prose/", "term/t27-tri-lean/", "term/tri-selftest/", "term/play-terminal-gates/", "widgets/tc-why-three/", "widgets/tc-balanced-count/", "widgets/tc-flip-and-cut/", "widgets/tc-kleene-gates/", "widgets/tc-consensus-any/", "widgets/tc-sum-and-carry/", "widgets/tc-half-adder/", "widgets/tc-full-adder/", "widgets/tc-ripple-carry/", "widgets/tc-times-a-trit/", "widgets/tc-long-multiply/", "widgets/tc-ternary-mac/", "widgets/tc-two-bits/", "widgets/tc-five-in-a-byte/", "widgets/tc-trit-word/", "widgets/tc-instruction-word/", "widgets/tc-opcode-map/", "widgets/tc-immediate/", "widgets/tc-ternary-alu/", "widgets/tc-three-way-jump/", "widgets/tc-run-a-program/", "widgets/tc-compare/", "widgets/tc-thirds/", "widgets/tc-sort-three/", "widgets/tc-one-neuron/", "widgets/tc-detector/", "widgets/tc-tiny-layer/", "wars", "term/tri-game-tick/", "term/tri-game-vault/", "term/perf2-knockouts/", "widgets/race-the-bee/", "widgets/gatle/", "term/tri-blog-list/", "term/tri-game-selftest/"]; -pub const WIDGET_TITLES : [252]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "WARS: agent configurations compared on real GitHub issues", "", "", "", "", "", "", ""]; -pub const WIDGET_LINES : [252]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "One issue, one pinned commit, the same tools and gates; only the decision layer changes, and a missing run stays unknown.", "", "", "", "", "", "", ""]; +pub const WIDGET_COUNT : u8 = 253; +pub const WIDGET_IDS : [253]str = ["x7-board", "tri-x7-fasm", "tri-x7-mutate", "perf2-loop", "tri-fpga-rgmii", "tri-fpga-jtag", "tri-fpga-pins", "devkit-flow", "play-verilog", "bit-diff", "build-receipt", "cost-curves", "gf16-calc", "idcode", "lut-explain", "pin-map", "placement-map", "resource-bars", "slack-waterfall", "test-waves", "synth-smells", "bit-autopsy", "fasm-skyline", "vcd-wrapped", "fits-on", "stat-card", "lut-depth", "fsm-sketch", "lut-treemap", "t27-cell", "t27-vs-nvfp4", "uart-bucket", "tri-fpga-specs", "tri-fpga-tools", "tri-fpga-wire", "tri-fpga-batch", "tri-fpga-status", "tri-fpga-tmpcheck", "tri-fpga-keycheck", "tri-fpga-selftest", "tri-x7-refs", "tri-x7-audit", "t27c-clock-domain", "t27c-clocks", "t27c-wukong-v1", "t27c-cts", "t27c-mmcm", "t27c-mmcm-mutate", "t27c-timing", "t27c-reset-sync", "t27c-reset-sync-gen", "t27c-mtbf", "t27c-clock-domain-gen", "t27c-fifo", "t27c-fifo-mutate", "t27c-fifo-flags", "t27c-emitter-xdc", "t27c-fpga-rxcap", "t27-tri-competitors", "t27-tri-discard", "tri-fpga-txhold", "tri-fpga-rxcap", "tri-fpga-rxer", "tri-fpga-steps", "tri-fpga-ioclients", "tri-fpga-claim", "tri-fpga-release", "tri-fpga-next", "t27c-memory", "t27c-spi-tb", "t27c-check-uart", "t27c-check-spi", "t27c-check-apb", "t27c-check-axi4", "t27c-check-bridge", "t27c-check-memory", "t27c-verilog-uart", "t27c-verilog-spi", "t27c-verilog-apb", "t27c-verilog-axi4", "t27c-verilog-bridge", "t27c-verilog-top", "t27c-verilog-uart-tb", "t27c-verilog-apb-tb", "t27c-verilog-axi-tb", "t27c-verilog-mem-tb", "t27c-verilog-integration-tb", "t27c-verilog-top-tb", "t27c-verilog-spi-tb", "t27c-hir-uart", "t27c-hir-apb", "t27c-hir-axi4", "t27c-eth-crc", "t27c-rgmii", "jtag-verdict", "line-bounce", "eye-isi", "ecc-secded", "carry-chain", "prefix-adder", "csa-tree", "shift-add", "booth-radix4", "dsp-fit", "q-format", "round-sat", "sqnr", "cordic", "cordic-vector", "sine-table", "alias-fold", "nco", "dft-bin", "fir-response", "fir-design", "fir-cost", "decimator", "cic-growth", "polyphase", "fft-butterfly", "bit-reverse", "fft-scaling", "barker-corr", "fir-fit", "fir-on-board", "play-hello-world", "play-rust", "play-js", "t27c-hello-world", "t27-tri-misread", "test-touch", "t27c-stages", "t27c-e8m0", "play-e8m0", "t27c-ocp-mx", "play-gfternary", "t27c-gfternary", "play-golden-sieve", "t27c-golden-sieve", "play-tnf17", "t27c-tnf17", "t27c-activation-quantizer", "t27c-bitnet-majority", "t27c-bitnet-neuron-nchunk", "t27c-comb-ternary-dot", "t27c-stream-ternary-mac", "t27c-bitnet-mlp", "t27c-gft-smul", "t27c-gft-sadd", "t27c-gft-signed-mac", "t27c-gft-relu", "t27c-gft-exp2", "t27c-gft-argmax4", "t27c-gft-nll", "t27c-gft-sgd-step", "t27c-gft-xornet", "basics-what-a-spec-is", "basics-the-module-line", "basics-comments-and-prose", "basics-constants", "basics-whole-numbers", "basics-true-false-and-text", "basics-arrays", "basics-trits", "basics-expressions", "basics-a-test-block", "basics-many-tests", "basics-functions", "basics-local-names", "basics-if-and-else", "basics-loops", "basics-pub-or-private", "basics-structs", "basics-enums", "basics-use-other-modules", "basics-invariants", "basics-gen-ts", "basics-seven-backends", "basics-stages-of-t27c", "basics-tri-commands", "basics-reading-errors", "basics-a-small-program", "basics-where-next", "golden-split", "golden-phi-ratio", "golden-lucas", "golden-split-optimality", "golden-radix-economy", "golden-phi-in-gf16", "golden-gf4", "golden-gf6", "golden-gf8", "golden-gf10", "golden-gf12", "golden-gf14", "golden-gf16", "golden-dot-two", "golden-gf24", "golden-gf32", "golden-gf48", "golden-gf64", "golden-gf96", "golden-gf128", "golden-gf256", "golden-gf512", "golden-gf1024", "golden-gft8", "golden-gft16", "golden-gft32", "golden-decode", "t27-tri-vectors", "t27-tri-census", "t27-tri-seals", "t27-tri-prose", "t27-tri-lean", "tri-selftest", "play-terminal-gates", "tc-why-three", "tc-balanced-count", "tc-flip-and-cut", "tc-kleene-gates", "tc-consensus-any", "tc-sum-and-carry", "tc-half-adder", "tc-full-adder", "tc-ripple-carry", "tc-times-a-trit", "tc-long-multiply", "tc-ternary-mac", "tc-two-bits", "tc-five-in-a-byte", "tc-trit-word", "tc-instruction-word", "tc-opcode-map", "tc-immediate", "tc-ternary-alu", "tc-three-way-jump", "tc-run-a-program", "tc-compare", "tc-thirds", "tc-sort-three", "tc-one-neuron", "tc-detector", "tc-tiny-layer", "paper-claims", "wars", "tri-game-tick", "tri-game-vault", "perf2-knockouts", "race-the-bee", "gatle", "tri-blog-list", "tri-game-selftest"]; +pub const WIDGET_KINDS : [253]str = ["cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "player", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "player", "player", "player", "cast", "cast", "tool", "tool", "cast", "player", "cast", "player", "cast", "player", "cast", "player", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tab", "cast", "cast", "cast", "tool", "tool", "cast", "cast"]; +pub const WIDGET_CATEGORIES : [253]str = ["fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "game", "game", "game", "game", "game", "game", "game", "game"]; +pub const WIDGET_PAGES : [253]str = ["term/x7-board/", "term/tri-x7-fasm/", "term/tri-x7-mutate/", "term/perf2-loop/", "term/tri-fpga-rgmii/", "term/tri-fpga-jtag/", "term/tri-fpga-pins/", "term/devkit-flow/", "play/hello-world/verilog/", "widgets/bit-diff/", "widgets/build-receipt/", "widgets/cost-curves/", "widgets/gf16-calc/", "widgets/idcode/", "widgets/lut-explain/", "widgets/pin-map/", "widgets/placement-map/", "widgets/resource-bars/", "widgets/slack-waterfall/", "widgets/test-waves/", "widgets/synth-smells/", "widgets/bit-autopsy/", "widgets/fasm-skyline/", "widgets/vcd-wrapped/", "widgets/fits-on/", "widgets/stat-card/", "widgets/lut-depth/", "widgets/fsm-sketch/", "widgets/lut-treemap/", "widgets/t27-cell/", "widgets/t27-vs-nvfp4/", "widgets/uart-bucket/", "term/tri-fpga-specs/", "term/tri-fpga-tools/", "term/tri-fpga-wire/", "term/tri-fpga-batch/", "term/tri-fpga-status/", "term/tri-fpga-tmpcheck/", "term/tri-fpga-keycheck/", "term/tri-fpga-selftest/", "term/tri-x7-refs/", "term/tri-x7-audit/", "term/t27c-clock-domain/", "term/t27c-clocks/", "term/t27c-wukong-v1/", "term/t27c-cts/", "term/t27c-mmcm/", "term/t27c-mmcm-mutate/", "term/t27c-timing/", "term/t27c-reset-sync/", "term/t27c-reset-sync-gen/", "term/t27c-mtbf/", "term/t27c-clock-domain-gen/", "term/t27c-fifo/", "term/t27c-fifo-mutate/", "term/t27c-fifo-flags/", "term/t27c-emitter-xdc/", "term/t27c-fpga-rxcap/", "term/t27-tri-competitors/", "term/t27-tri-discard/", "term/tri-fpga-txhold/", "term/tri-fpga-rxcap/", "term/tri-fpga-rxer/", "term/tri-fpga-steps/", "term/tri-fpga-ioclients/", "term/tri-fpga-claim/", "term/tri-fpga-release/", "term/tri-fpga-next/", "term/t27c-memory/", "term/t27c-spi-tb/", "term/t27c-check-uart/", "term/t27c-check-spi/", "term/t27c-check-apb/", "term/t27c-check-axi4/", "term/t27c-check-bridge/", "term/t27c-check-memory/", "term/t27c-verilog-uart/", "term/t27c-verilog-spi/", "term/t27c-verilog-apb/", "term/t27c-verilog-axi4/", "term/t27c-verilog-bridge/", "term/t27c-verilog-top/", "term/t27c-verilog-uart-tb/", "term/t27c-verilog-apb-tb/", "term/t27c-verilog-axi-tb/", "term/t27c-verilog-mem-tb/", "term/t27c-verilog-integration-tb/", "term/t27c-verilog-top-tb/", "term/t27c-verilog-spi-tb/", "term/t27c-hir-uart/", "term/t27c-hir-apb/", "term/t27c-hir-axi4/", "term/t27c-eth-crc/", "term/t27c-rgmii/", "widgets/jtag-verdict/", "widgets/line-bounce/", "widgets/eye-isi/", "widgets/ecc-secded/", "widgets/carry-chain/", "widgets/prefix-adder/", "widgets/csa-tree/", "widgets/shift-add/", "widgets/booth-radix4/", "widgets/dsp-fit/", "widgets/q-format/", "widgets/round-sat/", "widgets/sqnr/", "widgets/cordic/", "widgets/cordic-vector/", "widgets/sine-table/", "widgets/alias-fold/", "widgets/nco/", "widgets/dft-bin/", "widgets/fir-response/", "widgets/fir-design/", "widgets/fir-cost/", "widgets/decimator/", "widgets/cic-growth/", "widgets/polyphase/", "widgets/fft-butterfly/", "widgets/bit-reverse/", "widgets/fft-scaling/", "widgets/barker-corr/", "widgets/fir-fit/", "widgets/fir-on-board/", "play/hello-world/", "play/hello-world/rust/", "play/hello-world/js/", "term/t27c-hello-world/", "term/t27-tri-misread/", "widgets/test-touch/", "widgets/t27c-stages/", "term/t27c-e8m0/", "play/e8m0/", "term/t27c-ocp-mx/", "play/gfternary/", "term/t27c-gfternary/", "play/golden-sieve/", "term/t27c-golden-sieve/", "play/tnf17/", "term/t27c-tnf17/", "term/t27c-activation-quantizer/", "term/t27c-bitnet-majority/", "term/t27c-bitnet-neuron-nchunk/", "term/t27c-comb-ternary-dot/", "term/t27c-stream-ternary-mac/", "term/t27c-bitnet-mlp/", "term/t27c-gft-smul/", "term/t27c-gft-sadd/", "term/t27c-gft-signed-mac/", "term/t27c-gft-relu/", "term/t27c-gft-exp2/", "term/t27c-gft-argmax4/", "term/t27c-gft-nll/", "term/t27c-gft-sgd-step/", "term/t27c-gft-xornet/", "widgets/basics-what-a-spec-is/", "widgets/basics-the-module-line/", "widgets/basics-comments-and-prose/", "widgets/basics-constants/", "widgets/basics-whole-numbers/", "widgets/basics-true-false-and-text/", "widgets/basics-arrays/", "widgets/basics-trits/", "widgets/basics-expressions/", "widgets/basics-a-test-block/", "widgets/basics-many-tests/", "widgets/basics-functions/", "widgets/basics-local-names/", "widgets/basics-if-and-else/", "widgets/basics-loops/", "widgets/basics-pub-or-private/", "widgets/basics-structs/", "widgets/basics-enums/", "widgets/basics-use-other-modules/", "widgets/basics-invariants/", "widgets/basics-gen-ts/", "widgets/basics-seven-backends/", "widgets/basics-stages-of-t27c/", "widgets/basics-tri-commands/", "widgets/basics-reading-errors/", "widgets/basics-a-small-program/", "widgets/basics-where-next/", "widgets/golden-split/", "widgets/golden-phi-ratio/", "widgets/golden-lucas/", "widgets/golden-split-optimality/", "widgets/golden-radix-economy/", "widgets/golden-phi-in-gf16/", "widgets/golden-gf4/", "widgets/golden-gf6/", "widgets/golden-gf8/", "widgets/golden-gf10/", "widgets/golden-gf12/", "widgets/golden-gf14/", "widgets/golden-gf16/", "widgets/golden-dot-two/", "widgets/golden-gf24/", "widgets/golden-gf32/", "widgets/golden-gf48/", "widgets/golden-gf64/", "widgets/golden-gf96/", "widgets/golden-gf128/", "widgets/golden-gf256/", "widgets/golden-gf512/", "widgets/golden-gf1024/", "widgets/golden-gft8/", "widgets/golden-gft16/", "widgets/golden-gft32/", "widgets/golden-decode/", "term/t27-tri-vectors/", "term/t27-tri-census/", "term/t27-tri-seals/", "term/t27-tri-prose/", "term/t27-tri-lean/", "term/tri-selftest/", "term/play-terminal-gates/", "widgets/tc-why-three/", "widgets/tc-balanced-count/", "widgets/tc-flip-and-cut/", "widgets/tc-kleene-gates/", "widgets/tc-consensus-any/", "widgets/tc-sum-and-carry/", "widgets/tc-half-adder/", "widgets/tc-full-adder/", "widgets/tc-ripple-carry/", "widgets/tc-times-a-trit/", "widgets/tc-long-multiply/", "widgets/tc-ternary-mac/", "widgets/tc-two-bits/", "widgets/tc-five-in-a-byte/", "widgets/tc-trit-word/", "widgets/tc-instruction-word/", "widgets/tc-opcode-map/", "widgets/tc-immediate/", "widgets/tc-ternary-alu/", "widgets/tc-three-way-jump/", "widgets/tc-run-a-program/", "widgets/tc-compare/", "widgets/tc-thirds/", "widgets/tc-sort-three/", "widgets/tc-one-neuron/", "widgets/tc-detector/", "widgets/tc-tiny-layer/", "widgets/paper-claims/", "wars", "term/tri-game-tick/", "term/tri-game-vault/", "term/perf2-knockouts/", "widgets/race-the-bee/", "widgets/gatle/", "term/tri-blog-list/", "term/tri-game-selftest/"]; +pub const WIDGET_TITLES : [253]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "WARS: agent configurations compared on real GitHub issues", "", "", "", "", "", "", ""]; +pub const WIDGET_LINES : [253]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "One issue, one pinned commit, the same tools and gates; only the decision layer changes, and a missing run stays unknown.", "", "", "", "", "", "", ""]; ; Why a person would pass this one on: the reason the widget is in the gallery at all. -pub const WIDGET_HOOKS : [252]str = ["The bitstream is byte-identical to openXC7's and runs on a real board: the claim most FPGA people doubt, shown.", "A Xilinx 7-series bitstream assembled with no Vivado anywhere in the path.", "Plant a bug in the bitstream path and watch the tests catch it: mutation testing for hardware.", "Place and route to a loaded bitstream, with the clock on screen.", "RGMII hold margins read from nextpnr's own SDF, not from a datasheet.", "The cable asks which chip is there and the chip answers with its IDCODE.", "Before an edit to a Verilog file: every spec and generator it would touch.", "The whole FPGA flow, one layer per line, from spec to board.", "A spec turned into Verilog inside a post, with the RTL read the way a hardware engineer reads it.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "17 of 17 conformance specs compile, their test blocks pass, and no generated file has drifted.", "14 of 14 bench tools pass their own self-tests in one sweep: decode 18/18, repin 17/17, firelog 10/10, tmpcheck 9/9, stamps 9/9, keep 9/9.", "Requested 115,200 puts 115,385 on the wire (+0.16 %), 921,600 puts 923,077, and 3,000,000 is exact.", "26 checks, no board, no RTL: every receipt returns, 11 loss and fault cases recover, and a lie stops the run.", "One command reads the bench: cables, locks, and the last board runs: three x7-board runs PASS 51840/51840.", "112 files under /tmp pinned by sha256 in specs: every one has a kept copy, 0 lost, 0 unlocated.", "84 board and model logs scanned for the TRI-NET key: 0 hits, 0 logs of 1 MB or more.", "16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.", "The part table in far.t27 matches prjxray-db part.json, all 6 reference bitstreams present, bitwalk reads all 6 in 84.4 ms.", "One command re-runs every sweep: CRC 12/12, ECC 32520/32520 frames, 82/82 pins, 4224/4224 segbits, gold 5/5. audit: CLEAN.", "The CDC spec through the real compiler: 12 tests pass natively and the header says what the model does and does not claim.", "The tri clocks card as a spec: constants a tool page reads, and a native test-report that says so plainly -- 0 tests, because it is not a test suite.", "The board itself as a spec: 15 tests pass natively and the part line names the xc7a200tfgg676 the Wukong carries.", "Clock-tree synthesis in numbers: 15 tests pass natively, and the header pins the Artix-7 teaching delays the tree arithmetic uses.", "The MMCM model through the real compiler: VCO window, M/D/O ranges, fractional multiply in eighths, the 1/56 phase step, 16 tests natively.", "Widen the VCO window with one sed and exactly one test objects -- the rejection test that names the 500 MHz config it calls out.", "Static timing as arithmetic: 25 tests pass natively on arcs, slack and Fmax, with the Artix-7 teaching delays in the header.", "The three reset kinds through the real compiler: async assert with sync release through 2 to 4 flops, and the racy async release, 16 tests natively.", "What the compiler emits for the reset pipe: t27c gen prints the Zig, one struct copy per clock, and wc -l counts it.", "Metastability MTBF without floats: the WP323 form in Q10 log2, one flop negative slack, two flops astronomical, 15 tests natively.", "The CDC model as Zig: t27c gen prints what it compiled and wc -l says how many lines of code the model is.", "The FIFO stdlib through the real compiler: 18 tests pass natively and 6 invariants are proved comptime.", "Move a pointer by 3 instead of 1 and every test still passes: the suite asserts fill and flags, never pointer values.", "Flip one flag assignment and a single test objects: the guard that keeps the FIFO honest.", "The pins-to-XDC emitter spec parsed by the real compiler, and the create_clock lines it exists to write.", "The fpga-rxcap tool card as a spec: constants for a tool page, and a native run that says 0 tests and why.", "168 records: 14 papers entered twice, 141 cite no score, 144 state zero at pass@1.", "67 specs lose 23,578 tokens to parser recovery, each held at its pinned bound.", "Smallest hold 3445 ps on TXD1 against a 1000 ps bench; each TX pin setup and hold from the routed SDF.", "Per-bit setup and hold of an async RX nibble against its RXC edge, from the routed SDF: one nibble changes 2387 to 2486 ps apart, so a binary counter tears where a gray one cannot.", "RX_ER pulses injected at exact nibble positions of a ping -- preamble, mid-frame, IP header -- and the frame state each pulse leaves behind, RTL vs model.", "The Ethernet bring-up plan on the bench: pre-registered steps, logged exits, what ran and what did not.", "The registered IO clients on the bench, read live: names, claims and what each declares it owns.", "The bench claim in action: one client takes the hardware lock and the tool reports who holds it.", "The bench lock given back: the client gives up its claim and the bench reports itself free.", "The next queued step on the bench, read live from the run state.", "The memory map spec through the real compiler: 15 tests pass natively and 6 invariants are proved comptime.", "The SPI testbench through the real compiler: 7 tests pass natively, driving the modes and checking the captures.", "t27c check on the UART spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the SPI spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the APB bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the AXI4 spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the bus bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the memory spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "The UART spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The SPI spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The APB bridge spec lowered to synthesizable Verilog: port list, PSEL and PENABLE wiring, the address decode.", "The AXI4 spec lowered to synthesizable Verilog: the five channels' wiring and handshakes as generated wires.", "The bus bridge spec lowered to synthesizable Verilog: both sides of the crossing as generated wires.", "The whole design in one spec lowered to synthesizable Verilog: clocks, resets and bus wiring as the compiler emits them.", "The UART testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The APB bridge testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The AXI4 testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The memory testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The integration testbench spec lowered to Verilog: every bus of the design in one bench.", "The top-level testbench spec lowered to Verilog: the whole design under one bench.", "The SPI testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The UART spec lowered to hardware IR: the compiler's own view of the wires and state before Verilog exists.", "The APB bridge spec lowered to hardware IR: PSEL, PENABLE and the decode as the compiler structures them.", "The AXI4 spec lowered to hardware IR: the five channels and their handshakes as the compiler structures them.", "The Ethernet FCS spec through the real compiler: 8 tests pass natively -- the table derived from one bit step, the 0xCBF43926 check value, the 0xDEBB20E3 receiver residue.", "The RGMII spec through the real compiler: 7 tests pass natively and 1 invariant is proved comptime -- the 8 ns gigabit period, a nibble on both edges, the 78 ps tap ladder.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The t27 compiler running as WebAssembly in a post: compile, test, seven backends.", "The same spec as Rust, printed by a terminal in the page.", "The only backend that runs in the browser: generate the module, then run it.", "t27c on hello_world.t27, on a real machine, every byte as printed.", "Code that compiles and is wrong: the tool that finds it.", "", "", "The OCP MX scale byte as a spec: 2^(e-127), code 255 is NaN, 18 tests and 9 comptime invariants, compiled on a real machine.", "The same scale byte compiled in your browser: seven backends, the spec's tests run in the page, and every skip says why.", "One outlier sets the scale for 32 weights: MXFP4 flushes 23 of them to zero, MXFP8 E4M3 none. 49 tests pass; a planted bug fails one.", "Ternary weights scaled by phi, compiled in your browser: codes 00, 01, 10, and the fourth code folded to zero.", "13 of 13 tests pass natively, and the report says 8 of them executed no assert; a planted bug fails exactly one.", "Five measured rules for a ternary weight alphabet, and the one formula that passes all five, run in your browser.", "One more trit and the spec does not compile at all: BLOCKED, not failed, because no test ever ran.", "A 17-bit float whose exponent is four balanced trits, 3^4 = 81 values, compiled in your browser.", "34 tests pass natively, none vacuous; swap one XOR for OR and only the test that negates twice fails.", "A neuron's sum squeezed back to one trit: 7 tests pass natively, and turning one > into >= fails only the boundary test.", "One ternary neuron, two functions picked by its weights: 12 tests pass natively, and one weight moved from P to Z fails exactly one.", "A neuron wider than 27 inputs, summed chunk by chunk: 11 tests pass natively, and a loop that stops after one chunk fails exactly one.", "A 27-lane ternary dot product as pure wires: 4 tests pass natively, and one wrong sign in tmul fails exactly one.", "The same dot product added into a register on every clock: 4 tests pass natively, and a lane mask short one bit fails exactly one.", "A whole small ternary network, 3 neurons then 2: 4 tests pass natively, and a trit packed one bit low fails exactly one.", "A signed multiply: 3 tests pass natively, none vacuous, and a sign stuck at 0 fails exactly one, m2.", "A signed add: 3 tests pass natively, and adding where opposite signs must subtract fails exactly one, a2.", "Two signed products summed: 4 tests pass natively, and OR in place of the sign XOR fails exactly one, pp.", "A ReLU: 4 tests pass natively, and letting negative inputs through fails only negz, the one test with a negative input.", "2^x for a softmax: 4 tests pass natively, and dropping the minus sign of k fails exactly one, em1.", "argmax by comparing bits alone: 4 tests pass natively, and >= in place of > fails exactly one, tie_low.", "A loss in bits: 3 tests pass natively, and a zero with the sign bit set fails exactly one, perfect.", "One SGD step: 3 tests pass natively, and g times g in place of eta times g fails exactly one, ascend.", "A 2-layer ReLU net for XOR: 4 tests pass natively, and one relu removed fails exactly one, x00.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "34 vector files, 512 cases: 2 files executed, 8 debt, 24 prose-only; 19% carry data.", "Four census populations recounted another way all agree; three are named as uncheckable.", "31 of 1,428 seals record no output (16 specs); 3 of those are missing from the debt ledger.", "11 specs refused at parse, 0 blocked only by prose, 23 broken on purpose as fixtures.", "12 Lean files, 15,553 lines and 4 sorry, are reached by no build root: nothing compiles them.", "tri, railway, python3 and the loop directory: each present or not, in one call.", "The terminal for seven t27 backends: every command run on hello_world. 21 pass, 0 fail.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Pick a lane and see whether the TRI decision layer beats the baseline on the same issue.", "One tick of the Queen's loop: an anomaly scan that reports only what changed.", "The loop's skills checked against snapshots before an agent may use them.", "Three performance bits, and one knockout bitstream per bit to prove each one matters.", "", "", "73 published posts with date, language and revision, newest first.", "6 of 6 self-tests hold: anomalies, blog_drift, lessons, site_gate, tick, vault."]; +pub const WIDGET_HOOKS : [253]str = ["The bitstream is byte-identical to openXC7's and runs on a real board: the claim most FPGA people doubt, shown.", "A Xilinx 7-series bitstream assembled with no Vivado anywhere in the path.", "Plant a bug in the bitstream path and watch the tests catch it: mutation testing for hardware.", "Place and route to a loaded bitstream, with the clock on screen.", "RGMII hold margins read from nextpnr's own SDF, not from a datasheet.", "The cable asks which chip is there and the chip answers with its IDCODE.", "Before an edit to a Verilog file: every spec and generator it would touch.", "The whole FPGA flow, one layer per line, from spec to board.", "A spec turned into Verilog inside a post, with the RTL read the way a hardware engineer reads it.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "17 of 17 conformance specs compile, their test blocks pass, and no generated file has drifted.", "14 of 14 bench tools pass their own self-tests in one sweep: decode 18/18, repin 17/17, firelog 10/10, tmpcheck 9/9, stamps 9/9, keep 9/9.", "Requested 115,200 puts 115,385 on the wire (+0.16 %), 921,600 puts 923,077, and 3,000,000 is exact.", "26 checks, no board, no RTL: every receipt returns, 11 loss and fault cases recover, and a lie stops the run.", "One command reads the bench: cables, locks, and the last board runs: three x7-board runs PASS 51840/51840.", "112 files under /tmp pinned by sha256 in specs: every one has a kept copy, 0 lost, 0 unlocated.", "84 board and model logs scanned for the TRI-NET key: 0 hits, 0 logs of 1 MB or more.", "16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.", "The part table in far.t27 matches prjxray-db part.json, all 6 reference bitstreams present, bitwalk reads all 6 in 84.4 ms.", "One command re-runs every sweep: CRC 12/12, ECC 32520/32520 frames, 82/82 pins, 4224/4224 segbits, gold 5/5. audit: CLEAN.", "The CDC spec through the real compiler: 12 tests pass natively and the header says what the model does and does not claim.", "The tri clocks card as a spec: constants a tool page reads, and a native test-report that says so plainly -- 0 tests, because it is not a test suite.", "The board itself as a spec: 15 tests pass natively and the part line names the xc7a200tfgg676 the Wukong carries.", "Clock-tree synthesis in numbers: 15 tests pass natively, and the header pins the Artix-7 teaching delays the tree arithmetic uses.", "The MMCM model through the real compiler: VCO window, M/D/O ranges, fractional multiply in eighths, the 1/56 phase step, 16 tests natively.", "Widen the VCO window with one sed and exactly one test objects -- the rejection test that names the 500 MHz config it calls out.", "Static timing as arithmetic: 25 tests pass natively on arcs, slack and Fmax, with the Artix-7 teaching delays in the header.", "The three reset kinds through the real compiler: async assert with sync release through 2 to 4 flops, and the racy async release, 16 tests natively.", "What the compiler emits for the reset pipe: t27c gen prints the Zig, one struct copy per clock, and wc -l counts it.", "Metastability MTBF without floats: the WP323 form in Q10 log2, one flop negative slack, two flops astronomical, 15 tests natively.", "The CDC model as Zig: t27c gen prints what it compiled and wc -l says how many lines of code the model is.", "The FIFO stdlib through the real compiler: 18 tests pass natively and 6 invariants are proved comptime.", "Move a pointer by 3 instead of 1 and every test still passes: the suite asserts fill and flags, never pointer values.", "Flip one flag assignment and a single test objects: the guard that keeps the FIFO honest.", "The pins-to-XDC emitter spec parsed by the real compiler, and the create_clock lines it exists to write.", "The fpga-rxcap tool card as a spec: constants for a tool page, and a native run that says 0 tests and why.", "168 records: 14 papers entered twice, 141 cite no score, 144 state zero at pass@1.", "67 specs lose 23,578 tokens to parser recovery, each held at its pinned bound.", "Smallest hold 3445 ps on TXD1 against a 1000 ps bench; each TX pin setup and hold from the routed SDF.", "Per-bit setup and hold of an async RX nibble against its RXC edge, from the routed SDF: one nibble changes 2387 to 2486 ps apart, so a binary counter tears where a gray one cannot.", "RX_ER pulses injected at exact nibble positions of a ping -- preamble, mid-frame, IP header -- and the frame state each pulse leaves behind, RTL vs model.", "The Ethernet bring-up plan on the bench: pre-registered steps, logged exits, what ran and what did not.", "The registered IO clients on the bench, read live: names, claims and what each declares it owns.", "The bench claim in action: one client takes the hardware lock and the tool reports who holds it.", "The bench lock given back: the client gives up its claim and the bench reports itself free.", "The next queued step on the bench, read live from the run state.", "The memory map spec through the real compiler: 15 tests pass natively and 6 invariants are proved comptime.", "The SPI testbench through the real compiler: 7 tests pass natively, driving the modes and checking the captures.", "t27c check on the UART spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the SPI spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the APB bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the AXI4 spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the bus bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the memory spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "The UART spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The SPI spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The APB bridge spec lowered to synthesizable Verilog: port list, PSEL and PENABLE wiring, the address decode.", "The AXI4 spec lowered to synthesizable Verilog: the five channels' wiring and handshakes as generated wires.", "The bus bridge spec lowered to synthesizable Verilog: both sides of the crossing as generated wires.", "The whole design in one spec lowered to synthesizable Verilog: clocks, resets and bus wiring as the compiler emits them.", "The UART testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The APB bridge testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The AXI4 testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The memory testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The integration testbench spec lowered to Verilog: every bus of the design in one bench.", "The top-level testbench spec lowered to Verilog: the whole design under one bench.", "The SPI testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The UART spec lowered to hardware IR: the compiler's own view of the wires and state before Verilog exists.", "The APB bridge spec lowered to hardware IR: PSEL, PENABLE and the decode as the compiler structures them.", "The AXI4 spec lowered to hardware IR: the five channels and their handshakes as the compiler structures them.", "The Ethernet FCS spec through the real compiler: 8 tests pass natively -- the table derived from one bit step, the 0xCBF43926 check value, the 0xDEBB20E3 receiver residue.", "The RGMII spec through the real compiler: 7 tests pass natively and 1 invariant is proved comptime -- the 8 ns gigabit period, a nibble on both edges, the 78 ps tap ladder.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The t27 compiler running as WebAssembly in a post: compile, test, seven backends.", "The same spec as Rust, printed by a terminal in the page.", "The only backend that runs in the browser: generate the module, then run it.", "t27c on hello_world.t27, on a real machine, every byte as printed.", "Code that compiles and is wrong: the tool that finds it.", "", "", "The OCP MX scale byte as a spec: 2^(e-127), code 255 is NaN, 18 tests and 9 comptime invariants, compiled on a real machine.", "The same scale byte compiled in your browser: seven backends, the spec's tests run in the page, and every skip says why.", "One outlier sets the scale for 32 weights: MXFP4 flushes 23 of them to zero, MXFP8 E4M3 none. 49 tests pass; a planted bug fails one.", "Ternary weights scaled by phi, compiled in your browser: codes 00, 01, 10, and the fourth code folded to zero.", "13 of 13 tests pass natively, and the report says 8 of them executed no assert; a planted bug fails exactly one.", "Five measured rules for a ternary weight alphabet, and the one formula that passes all five, run in your browser.", "One more trit and the spec does not compile at all: BLOCKED, not failed, because no test ever ran.", "A 17-bit float whose exponent is four balanced trits, 3^4 = 81 values, compiled in your browser.", "34 tests pass natively, none vacuous; swap one XOR for OR and only the test that negates twice fails.", "A neuron's sum squeezed back to one trit: 7 tests pass natively, and turning one > into >= fails only the boundary test.", "One ternary neuron, two functions picked by its weights: 12 tests pass natively, and one weight moved from P to Z fails exactly one.", "A neuron wider than 27 inputs, summed chunk by chunk: 11 tests pass natively, and a loop that stops after one chunk fails exactly one.", "A 27-lane ternary dot product as pure wires: 4 tests pass natively, and one wrong sign in tmul fails exactly one.", "The same dot product added into a register on every clock: 4 tests pass natively, and a lane mask short one bit fails exactly one.", "A whole small ternary network, 3 neurons then 2: 4 tests pass natively, and a trit packed one bit low fails exactly one.", "A signed multiply: 3 tests pass natively, none vacuous, and a sign stuck at 0 fails exactly one, m2.", "A signed add: 3 tests pass natively, and adding where opposite signs must subtract fails exactly one, a2.", "Two signed products summed: 4 tests pass natively, and OR in place of the sign XOR fails exactly one, pp.", "A ReLU: 4 tests pass natively, and letting negative inputs through fails only negz, the one test with a negative input.", "2^x for a softmax: 4 tests pass natively, and dropping the minus sign of k fails exactly one, em1.", "argmax by comparing bits alone: 4 tests pass natively, and >= in place of > fails exactly one, tie_low.", "A loss in bits: 3 tests pass natively, and a zero with the sign bit set fails exactly one, perfect.", "One SGD step: 3 tests pass natively, and g times g in place of eta times g fails exactly one, ascend.", "A 2-layer ReLU net for XOR: 4 tests pass natively, and one relu removed fails exactly one, x00.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "34 vector files, 512 cases: 2 files executed, 8 debt, 24 prose-only; 19% carry data.", "Four census populations recounted another way all agree; three are named as uncheckable.", "31 of 1,428 seals record no output (16 specs); 3 of those are missing from the debt ledger.", "11 specs refused at parse, 0 blocked only by prose, 23 broken on purpose as fixtures.", "12 Lean files, 15,553 lines and 4 sorry, are reached by no build root: nothing compiles them.", "tri, railway, python3 and the loop directory: each present or not, in one call.", "The terminal for seven t27 backends: every command run on hello_world. 21 pass, 0 fail.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Pick a lane and see whether the TRI decision layer beats the baseline on the same issue.", "One tick of the Queen's loop: an anomaly scan that reports only what changed.", "The loop's skills checked against snapshots before an agent may use them.", "Three performance bits, and one knockout bitstream per bit to prove each one matters.", "", "", "73 published posts with date, language and revision, newest first.", "6 of 6 self-tests hold: anomalies, blog_drift, lessons, site_gate, tick, vault."]; ; --- Ideas: asked for, not built --------------------------------------------------------------- ; From what engineers share today (gh-skyline, Tiny Tapeout renders, Wrapped cards, Gatle-style @@ -119,9 +119,9 @@ test the_fpga_shelf_comes_first_and_opens_on_the_board { } test the_arena_is_a_tab_and_says_its_own_words { - assert WIDGET_IDS[244] == "wars"; - assert WIDGET_KINDS[244] == "tab"; - assert WIDGET_PAGES[244] == "wars"; + assert WIDGET_IDS[245] == "wars"; + assert WIDGET_KINDS[245] == "tab"; + assert WIDGET_PAGES[245] == "wars"; } test the_gallery_posts_nothing { @@ -157,8 +157,8 @@ test the_verification_shelf_is_rehearsals_and_audits { test ideas_are_counted_apart_from_widgets { assert IDEA_COUNT == 6; - assert WIDGET_IDS[249] == "gatle"; - assert WIDGET_COUNT == 252; + assert WIDGET_IDS[250] == "gatle"; + assert WIDGET_COUNT == 253; } test the_ternary_machine_shelf_runs_before_the_arena { @@ -172,9 +172,9 @@ test every_tool_lives_under_widgets_and_keeps_its_words_on_its_page { assert WIDGET_KINDS[9] == "tool"; assert WIDGET_PAGES[9] == "widgets/bit-diff/"; assert WIDGET_HOOKS[9] == ""; - assert WIDGET_KINDS[248] == "tool"; - assert WIDGET_CATEGORIES[248] == "game"; - assert WIDGET_PAGES[248] == "widgets/race-the-bee/"; + assert WIDGET_KINDS[249] == "tool"; + assert WIDGET_CATEGORIES[249] == "game"; + assert WIDGET_PAGES[249] == "widgets/race-the-bee/"; } test the_arithmetic_shelf_closes_the_fpga_bench { diff --git a/apps/website/specs/widgets/paper-claims.t27 b/apps/website/specs/widgets/paper-claims.t27 new file mode 100644 index 0000000000..6f1770067f --- /dev/null +++ b/apps/website/specs/widgets/paper-claims.t27 @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/widgets/paper-claims.t27 -- which numbers printed in three format papers recompute to the printed value +; Source of truth for public/widgets/paper-claims/ (gHashTag/trinity): scripts/widget-pages-from-spec.mjs compiles +; this file, checks its constants, evaluates the tests below and writes the page. tool.js is one import of +; ../infographic.js, which draws SAY_TABLE_* as a real and SAY_FLOW_* as an SVG diagram with a +; , black and white, and holds no words of its own. ASCII only (L3), English only (LANG-EN). +; Every row is one row of gHashTag/t27 specs/numeric/paper_claims.t27 (module NumericPaperClaims, +; gHashTag/t27#10392), copied from the t27 MCP tool t27_paper_claims run on the Railway lab. The claim +; texts are the spec's own CL_TEXT strings. Where the spec has no recomputation (not checkable) this +; page prints "-" instead of the spec's placeholder 0. +; phi^2 + 1/phi^2 = 3 | TRINITY + +module widget_paper_claims; + +pub const KIND : str = "widget-tool"; +pub const ID : str = "paper-claims"; +pub const TITLE : str = "Three format papers, 45 printed numbers, recomputed exactly"; +pub const DESCRIPTION : str = "Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked."; +pub const IMAGE_ALT : str = "A table of 45 claims from three papers. GoldenFloat: 9 fit, 1 not checkable. Golden Ruler: 8 fit, 1 does not fit (12 clusters printed, the catalog has 13), 1 not checkable. TNF: 15 fit, 7 do not fit, 1 not checkable. Two sums over the t27 repo tables fit."; +pub const HOOK : str = "45 numbers from three format papers, recomputed in exact integers. 34 fit. 8 do not."; +pub const CATEGORY : str = "compiler"; +pub const DATA_SOURCES : [3]str = ["gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392): t27c 0.5.2 test-report on the Railway lab, 10 of 10 tests pass, 0 vacuous; tri papers runs the same spec", "The t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23), wasm generated from that spec with t27c gen-c and zig 0.16.0, called once on the lab with no filter; every row below is one row of its answer", "The papers: arXiv:2606.05017v5 (GoldenFloat), arXiv:2606.09686v3 (Golden Ruler), and the TNF paper by Dmitrii Vasilev, 2026-08-11"]; +pub const READS_LOCAL_FILES : bool = false; +pub const SENDS_NOTHING : bool = true; + +; --- The table: one row per claim, in the spec's row order ------------------------------------ +pub const SAY_TABLE_CAPTION : str = "45 printed numbers and what exact integer arithmetic gives"; +pub const SAY_TABLE_HEAD : [6]str = ["Paper", "Where", "Claim", "Printed", "Recomputed", "Verdict"]; +pub const SAY_TABLE_CELLS : [270]str = [ + "GoldenFloat", "Table 1", "e = round((N-1)/phi^2), f = N-1-e gives the printed (e, f) at all 17 widths", "17", "17", "fits", + "GoldenFloat", "Table 1", "(N-1)/phi^2 to four decimals, as printed, at all 17 widths", "17", "17", "fits", + "GoldenFloat", "Table 1", "GF16: e = 6", "6", "6", "fits", + "GoldenFloat", "Table 1", "GF1024: e = 391", "391", "391", "fits", + "GoldenFloat", "Table 1", "GF16: (N-1)/phi^2 = 5.7295", "5.7295", "5.7295", "fits", + "GoldenFloat", "Abstract", "phi^(2n) + phi^(-2n) = L_(2n) for n = 1..45 (the paper claims 1..256 at 500 digits; u64 stops at 45)", "45", "45", "fits", + "GoldenFloat", "GF16 anchor", "GF16 code 0x47C0 (e = 6, f = 9, bias 31) decodes to 30", "30", "30", "fits", + "GoldenFloat", "GF16 anchor", "30 = 1^2 + 2^2 + 3^2 + 4^2, the dot4 anchor", "30", "30", "fits", + "GoldenFloat", "Look-elsewhere", "p = K / N_s = 83 / 80000 = 1.04e-3", "1.04e-3", "1.04e-3", "fits", + "GoldenFloat", "Abstract", "35 of 35 testbench vectors at 323 MHz on an XC7A35T", "35", "-", "not checkable", + "Golden Ruler", "Abstract", "the catalog holds 109 formats", "109", "109", "fits", + "Golden Ruler", "Abstract", "the 109 formats span 12 clusters", "12", "13", "does not fit", + "Golden Ruler", "Packs", "3.0 in BF16 is 0x4040", "0x4040", "0x4040", "fits", + "Golden Ruler", "Packs", "3.0 in FP8 E4M3 is 0x44", "0x44", "0x44", "fits", + "Golden Ruler", "Packs", "3.0 in FP8 E5M2 is 0x42", "0x42", "0x42", "fits", + "Golden Ruler", "Packs", "3.0 in the MXFP4 element E2M1 is 0x5", "0x5", "0x5", "fits", + "Golden Ruler", "Packs", "3.0 in GF16 is 0x4100", "0x4100", "0x4100", "fits", + "Golden Ruler", "Packs", "3.0 has no E8M0 code: E8M0 holds powers of two only", "none", "none", "fits", + "Golden Ruler", "Anchor", "phi^2 + phi^-2 = L_2 = 3", "3", "3", "fits", + "Golden Ruler", "Abstract", "the packs are cross-validated against ml_dtypes 0.5.4", "-", "-", "not checkable", + "TNF", "Table 1", "2^-(M+1) matches the printed M at all 8 rungs", "8", "8", "fits", + "TNF", "Table 1 vs Sec. 10", "the printed M equals the adopted M = N - 1 - Et at all 8 rungs (Sec. 10: all rungs satisfy 1 + Et + M = N)", "8", "2", "does not fit", + "TNF", "Eq. (1)", "TNF16 value = (1 + M/2^9) 2^e: a 9-bit mantissa, where 1 + 4 + M = 16 needs 11", "9", "11", "does not fit", + "TNF", "Sec. 2", "four balanced trits give e in [-40, 40]", "40", "40", "fits", + "TNF", "Sec. 2", "four balanced trits give 3^4 = 81 exponent steps", "81", "81", "fits", + "TNF", "Sec. 3", "error constant (1/2) ln 2 = 0.3466 for a uniform significand", "0.3466", "0.3466", "fits", + "TNF", "Sec. 3", "error constant 1/(4 ln 2) = 0.3607 for a logarithmic significand", "0.3607", "0.3607", "fits", + "TNF", "Table 10", "bits = ceil(Et log2 3) at all 7 rows", "7", "7", "fits", + "TNF", "Table 10", "efficiency 3^Et / 2^bits to 0.1% at all 7 rows", "7", "7", "fits", + "TNF", "Table 11", "k = N - (1 + Et + M) at all 10 rows", "10", "10", "fits", + "TNF", "Table 11", "reconciled M = N - 1 - Et at all 9 rows, equal to the repo tnf*.t27", "9", "9", "fits", + "TNF", "Sec. 17", "ternary radix economy 3/ln 3 sits 0.46% above e/ln e", "0.46%", "0.46%", "fits", + "TNF", "Sec. 17", "binary radix economy 2/ln 2 sits 6.15% above e/ln e", "6.15%", "6.15%", "fits", + "TNF", "Cor. 18", "kappa(3)/kappa(2) = 1.683 with kappa(r) = (r-1)^2 / (r ln r)", "1.683", "1.682", "does not fit", + "TNF", "Sec. 17", "kappa(3)/kappa(2) = 1.68", "1.68", "1.68", "fits", + "TNF", "Cor. 26", "1 - log3 2 = 0.3691", "0.3691", "0.3691", "fits", + "TNF", "Table 22", "E* = ceil(log2 b) at all 4 percentiles", "4", "4", "fits", + "TNF", "Sec. 17", "the family F_N has N - 3 members (N = 16: 13)", "13", "13", "fits", + "TNF", "Table 24", "the GF-T column follows Et = round((N-1)/phi^2) at all 9 rungs", "9", "1", "does not fit", + "TNF", "Table 24", "GF-T and TNF give the same layout at 8 of 9 rungs (by their rules: golden GF-T against reconciled TNF)", "8", "1", "does not fit", + "TNF", "Table 24 vs Sec. 10", "the TNF column obeys 1 + Et + M = N at all 9 rungs (Sec. 10)", "9", "3", "does not fit", + "TNF", "Table 23", "BNF8 is E = 3, M = 4 (the repo bnf8.t27 is E = 5, M = 2)", "3", "5", "does not fit", + "TNF", "Table 23", "magnitude counts 129 / 109 / 73 for GF8, GF-T8, TNF8", "-", "-", "not checkable", + "t27 repo", "gft*.t27", "the repo GF-T rungs follow Et = round((N-1)/phi^2) at all 9 rungs", "9", "9", "fits", + "t27 repo", "tnf*.t27, bnf*.t27", "every repo TNF and BNF rung obeys 1 + E + M = N (9 TNF, 8 BNF)", "17", "17", "fits" +]; +pub const K_TABLE_COLS : u8 = 6; +pub const K_TABLE_ROWS : u8 = 45; +pub const K_TABLE_CELLS : u16 = 270; + +; --- The verdict counts, per paper: GoldenFloat, Golden Ruler, TNF, t27 repo ------------------- +pub const K_FITS : [4]u8 = [9, 8, 15, 2]; +pub const K_MISFITS : [4]u8 = [0, 1, 7, 0]; +pub const K_UNCHECKED : [4]u8 = [1, 1, 1, 0]; +pub const K_ROWS_PER_PAPER : [4]u8 = [10, 10, 23, 2]; +pub const K_FITS_ALL : u8 = 34; +pub const K_MISFITS_ALL : u8 = 8; +pub const K_UNCHECKED_ALL : u8 = 3; + +; --- The diagram and the note ---------------------------------------------------------------- +pub const SAY_FLOW_TITLE : str = "How each printed number is checked"; +pub const SAY_FLOW_STEPS : [4]str = ["the number as printed", "the rule the paper states", "exact u64 arithmetic in paper_claims.t27", "fits, does not fit, or not checkable"]; +pub const SAY_NOTE : str = "No floating point anywhere: square roots are integer square roots, constants are series sums at scale 1e12, and three-digit values are rounded half to even. A claim the paper gives no rule for is not checkable, never fits. Run it yourself: tri papers, or the MCP tool t27_paper_claims."; + +test the_cells_fill_whole_rows { + assert K_TABLE_ROWS * K_TABLE_COLS == K_TABLE_CELLS; +} + +test every_paper_adds_up { + assert K_FITS[0] + K_MISFITS[0] + K_UNCHECKED[0] == K_ROWS_PER_PAPER[0]; + assert K_FITS[1] + K_MISFITS[1] + K_UNCHECKED[1] == K_ROWS_PER_PAPER[1]; + assert K_FITS[2] + K_MISFITS[2] + K_UNCHECKED[2] == K_ROWS_PER_PAPER[2]; + assert K_FITS[3] + K_MISFITS[3] + K_UNCHECKED[3] == K_ROWS_PER_PAPER[3]; +} + +test the_totals_are_the_rows { + assert K_FITS[0] + K_FITS[1] + K_FITS[2] + K_FITS[3] == K_FITS_ALL; + assert K_MISFITS[0] + K_MISFITS[1] + K_MISFITS[2] + K_MISFITS[3] == K_MISFITS_ALL; + assert K_UNCHECKED[0] + K_UNCHECKED[1] + K_UNCHECKED[2] + K_UNCHECKED[3] == K_UNCHECKED_ALL; + assert K_FITS_ALL + K_MISFITS_ALL + K_UNCHECKED_ALL == K_TABLE_ROWS; +} From 6559522131531cdaeb6371b6eabfdcb28e8f9886 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Sun, 18 Oct 2026 18:13:00 +0700 Subject: [PATCH 2/9] WIP regenerate widget page, gallery and course outputs Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/public/learn/goldenfloat.t27 | 2 +- apps/website/public/widgets/gallery.t27 | 32 ++--- .../public/widgets/paper-claims/index.html | 47 ++++++++ .../widgets/paper-claims/paper-claims.t27 | 110 ++++++++++++++++++ apps/website/src/lib/course.generated.ts | 15 ++- .../website/src/lib/queenWidgets.generated.ts | 21 +++- 6 files changed, 205 insertions(+), 22 deletions(-) create mode 100644 apps/website/public/widgets/paper-claims/index.html create mode 100644 apps/website/public/widgets/paper-claims/paper-claims.t27 diff --git a/apps/website/public/learn/goldenfloat.t27 b/apps/website/public/learn/goldenfloat.t27 index ff3a4fb09d..b7acee4983 100644 --- a/apps/website/public/learn/goldenfloat.t27 +++ b/apps/website/public/learn/goldenfloat.t27 @@ -181,7 +181,7 @@ pub const LESSON_WIDGETS : [27]str = [ "golden-gft16", "golden-gft32", "golden-decode" ]; pub const LESSON_ALSO : [27]str = [ - "", "", "", + "paper-claims", "", "", "", "", "", "", "", "", "", "", "", diff --git a/apps/website/public/widgets/gallery.t27 b/apps/website/public/widgets/gallery.t27 index 6285d9a4d1..4f504507e3 100644 --- a/apps/website/public/widgets/gallery.t27 +++ b/apps/website/public/widgets/gallery.t27 @@ -78,15 +78,15 @@ pub const TOOL_NOSCRIPT : str = "This widget runs in your browser and needs Java ; Parallel arrays, WIDGET_COUNT long. WIDGET_TITLES is empty wherever the page carries an ; og:title, which is every kind but tab: the page is the one place the words live. A tool's ; WIDGET_HOOKS entry is empty too: its hook is the page's t27:hook, written from its own spec. -pub const WIDGET_COUNT : u8 = 252; -pub const WIDGET_IDS : [252]str = ["x7-board", "tri-x7-fasm", "tri-x7-mutate", "perf2-loop", "tri-fpga-rgmii", "tri-fpga-jtag", "tri-fpga-pins", "devkit-flow", "play-verilog", "bit-diff", "build-receipt", "cost-curves", "gf16-calc", "idcode", "lut-explain", "pin-map", "placement-map", "resource-bars", "slack-waterfall", "test-waves", "synth-smells", "bit-autopsy", "fasm-skyline", "vcd-wrapped", "fits-on", "stat-card", "lut-depth", "fsm-sketch", "lut-treemap", "t27-cell", "t27-vs-nvfp4", "uart-bucket", "tri-fpga-specs", "tri-fpga-tools", "tri-fpga-wire", "tri-fpga-batch", "tri-fpga-status", "tri-fpga-tmpcheck", "tri-fpga-keycheck", "tri-fpga-selftest", "tri-x7-refs", "tri-x7-audit", "t27c-clock-domain", "t27c-clocks", "t27c-wukong-v1", "t27c-cts", "t27c-mmcm", "t27c-mmcm-mutate", "t27c-timing", "t27c-reset-sync", "t27c-reset-sync-gen", "t27c-mtbf", "t27c-clock-domain-gen", "t27c-fifo", "t27c-fifo-mutate", "t27c-fifo-flags", "t27c-emitter-xdc", "t27c-fpga-rxcap", "t27-tri-competitors", "t27-tri-discard", "tri-fpga-txhold", "tri-fpga-rxcap", "tri-fpga-rxer", "tri-fpga-steps", "tri-fpga-ioclients", "tri-fpga-claim", "tri-fpga-release", "tri-fpga-next", "t27c-memory", "t27c-spi-tb", "t27c-check-uart", "t27c-check-spi", "t27c-check-apb", "t27c-check-axi4", "t27c-check-bridge", "t27c-check-memory", "t27c-verilog-uart", "t27c-verilog-spi", "t27c-verilog-apb", "t27c-verilog-axi4", "t27c-verilog-bridge", "t27c-verilog-top", "t27c-verilog-uart-tb", "t27c-verilog-apb-tb", "t27c-verilog-axi-tb", "t27c-verilog-mem-tb", "t27c-verilog-integration-tb", "t27c-verilog-top-tb", "t27c-verilog-spi-tb", "t27c-hir-uart", "t27c-hir-apb", "t27c-hir-axi4", "t27c-eth-crc", "t27c-rgmii", "jtag-verdict", "line-bounce", "eye-isi", "ecc-secded", "carry-chain", "prefix-adder", "csa-tree", "shift-add", "booth-radix4", "dsp-fit", "q-format", "round-sat", "sqnr", "cordic", "cordic-vector", "sine-table", "alias-fold", "nco", "dft-bin", "fir-response", "fir-design", "fir-cost", "decimator", "cic-growth", "polyphase", "fft-butterfly", "bit-reverse", "fft-scaling", "barker-corr", "fir-fit", "fir-on-board", "play-hello-world", "play-rust", "play-js", "t27c-hello-world", "t27-tri-misread", "test-touch", "t27c-stages", "t27c-e8m0", "play-e8m0", "t27c-ocp-mx", "play-gfternary", "t27c-gfternary", "play-golden-sieve", "t27c-golden-sieve", "play-tnf17", "t27c-tnf17", "t27c-activation-quantizer", "t27c-bitnet-majority", "t27c-bitnet-neuron-nchunk", "t27c-comb-ternary-dot", "t27c-stream-ternary-mac", "t27c-bitnet-mlp", "t27c-gft-smul", "t27c-gft-sadd", "t27c-gft-signed-mac", "t27c-gft-relu", "t27c-gft-exp2", "t27c-gft-argmax4", "t27c-gft-nll", "t27c-gft-sgd-step", "t27c-gft-xornet", "basics-what-a-spec-is", "basics-the-module-line", "basics-comments-and-prose", "basics-constants", "basics-whole-numbers", "basics-true-false-and-text", "basics-arrays", "basics-trits", "basics-expressions", "basics-a-test-block", "basics-many-tests", "basics-functions", "basics-local-names", "basics-if-and-else", "basics-loops", "basics-pub-or-private", "basics-structs", "basics-enums", "basics-use-other-modules", "basics-invariants", "basics-gen-ts", "basics-seven-backends", "basics-stages-of-t27c", "basics-tri-commands", "basics-reading-errors", "basics-a-small-program", "basics-where-next", "golden-split", "golden-phi-ratio", "golden-lucas", "golden-split-optimality", "golden-radix-economy", "golden-phi-in-gf16", "golden-gf4", "golden-gf6", "golden-gf8", "golden-gf10", "golden-gf12", "golden-gf14", "golden-gf16", "golden-dot-two", "golden-gf24", "golden-gf32", "golden-gf48", "golden-gf64", "golden-gf96", "golden-gf128", "golden-gf256", "golden-gf512", "golden-gf1024", "golden-gft8", "golden-gft16", "golden-gft32", "golden-decode", "t27-tri-vectors", "t27-tri-census", "t27-tri-seals", "t27-tri-prose", "t27-tri-lean", "tri-selftest", "play-terminal-gates", "tc-why-three", "tc-balanced-count", "tc-flip-and-cut", "tc-kleene-gates", "tc-consensus-any", "tc-sum-and-carry", "tc-half-adder", "tc-full-adder", "tc-ripple-carry", "tc-times-a-trit", "tc-long-multiply", "tc-ternary-mac", "tc-two-bits", "tc-five-in-a-byte", "tc-trit-word", "tc-instruction-word", "tc-opcode-map", "tc-immediate", "tc-ternary-alu", "tc-three-way-jump", "tc-run-a-program", "tc-compare", "tc-thirds", "tc-sort-three", "tc-one-neuron", "tc-detector", "tc-tiny-layer", "wars", "tri-game-tick", "tri-game-vault", "perf2-knockouts", "race-the-bee", "gatle", "tri-blog-list", "tri-game-selftest"]; -pub const WIDGET_KINDS : [252]str = ["cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "player", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "player", "player", "player", "cast", "cast", "tool", "tool", "cast", "player", "cast", "player", "cast", "player", "cast", "player", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tab", "cast", "cast", "cast", "tool", "tool", "cast", "cast"]; -pub const WIDGET_CATEGORIES : [252]str = ["fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "game", "game", "game", "game", "game", "game", "game", "game"]; -pub const WIDGET_PAGES : [252]str = ["term/x7-board/", "term/tri-x7-fasm/", "term/tri-x7-mutate/", "term/perf2-loop/", "term/tri-fpga-rgmii/", "term/tri-fpga-jtag/", "term/tri-fpga-pins/", "term/devkit-flow/", "play/hello-world/verilog/", "widgets/bit-diff/", "widgets/build-receipt/", "widgets/cost-curves/", "widgets/gf16-calc/", "widgets/idcode/", "widgets/lut-explain/", "widgets/pin-map/", "widgets/placement-map/", "widgets/resource-bars/", "widgets/slack-waterfall/", "widgets/test-waves/", "widgets/synth-smells/", "widgets/bit-autopsy/", "widgets/fasm-skyline/", "widgets/vcd-wrapped/", "widgets/fits-on/", "widgets/stat-card/", "widgets/lut-depth/", "widgets/fsm-sketch/", "widgets/lut-treemap/", "widgets/t27-cell/", "widgets/t27-vs-nvfp4/", "widgets/uart-bucket/", "term/tri-fpga-specs/", "term/tri-fpga-tools/", "term/tri-fpga-wire/", "term/tri-fpga-batch/", "term/tri-fpga-status/", "term/tri-fpga-tmpcheck/", "term/tri-fpga-keycheck/", "term/tri-fpga-selftest/", "term/tri-x7-refs/", "term/tri-x7-audit/", "term/t27c-clock-domain/", "term/t27c-clocks/", "term/t27c-wukong-v1/", "term/t27c-cts/", "term/t27c-mmcm/", "term/t27c-mmcm-mutate/", "term/t27c-timing/", "term/t27c-reset-sync/", "term/t27c-reset-sync-gen/", "term/t27c-mtbf/", "term/t27c-clock-domain-gen/", "term/t27c-fifo/", "term/t27c-fifo-mutate/", "term/t27c-fifo-flags/", "term/t27c-emitter-xdc/", "term/t27c-fpga-rxcap/", "term/t27-tri-competitors/", "term/t27-tri-discard/", "term/tri-fpga-txhold/", "term/tri-fpga-rxcap/", "term/tri-fpga-rxer/", "term/tri-fpga-steps/", "term/tri-fpga-ioclients/", "term/tri-fpga-claim/", "term/tri-fpga-release/", "term/tri-fpga-next/", "term/t27c-memory/", "term/t27c-spi-tb/", "term/t27c-check-uart/", "term/t27c-check-spi/", "term/t27c-check-apb/", "term/t27c-check-axi4/", "term/t27c-check-bridge/", "term/t27c-check-memory/", "term/t27c-verilog-uart/", "term/t27c-verilog-spi/", "term/t27c-verilog-apb/", "term/t27c-verilog-axi4/", "term/t27c-verilog-bridge/", "term/t27c-verilog-top/", "term/t27c-verilog-uart-tb/", "term/t27c-verilog-apb-tb/", "term/t27c-verilog-axi-tb/", "term/t27c-verilog-mem-tb/", "term/t27c-verilog-integration-tb/", "term/t27c-verilog-top-tb/", "term/t27c-verilog-spi-tb/", "term/t27c-hir-uart/", "term/t27c-hir-apb/", "term/t27c-hir-axi4/", "term/t27c-eth-crc/", "term/t27c-rgmii/", "widgets/jtag-verdict/", "widgets/line-bounce/", "widgets/eye-isi/", "widgets/ecc-secded/", "widgets/carry-chain/", "widgets/prefix-adder/", "widgets/csa-tree/", "widgets/shift-add/", "widgets/booth-radix4/", "widgets/dsp-fit/", "widgets/q-format/", "widgets/round-sat/", "widgets/sqnr/", "widgets/cordic/", "widgets/cordic-vector/", "widgets/sine-table/", "widgets/alias-fold/", "widgets/nco/", "widgets/dft-bin/", "widgets/fir-response/", "widgets/fir-design/", "widgets/fir-cost/", "widgets/decimator/", "widgets/cic-growth/", "widgets/polyphase/", "widgets/fft-butterfly/", "widgets/bit-reverse/", "widgets/fft-scaling/", "widgets/barker-corr/", "widgets/fir-fit/", "widgets/fir-on-board/", "play/hello-world/", "play/hello-world/rust/", "play/hello-world/js/", "term/t27c-hello-world/", "term/t27-tri-misread/", "widgets/test-touch/", "widgets/t27c-stages/", "term/t27c-e8m0/", "play/e8m0/", "term/t27c-ocp-mx/", "play/gfternary/", "term/t27c-gfternary/", "play/golden-sieve/", "term/t27c-golden-sieve/", "play/tnf17/", "term/t27c-tnf17/", "term/t27c-activation-quantizer/", "term/t27c-bitnet-majority/", "term/t27c-bitnet-neuron-nchunk/", "term/t27c-comb-ternary-dot/", "term/t27c-stream-ternary-mac/", "term/t27c-bitnet-mlp/", "term/t27c-gft-smul/", "term/t27c-gft-sadd/", "term/t27c-gft-signed-mac/", "term/t27c-gft-relu/", "term/t27c-gft-exp2/", "term/t27c-gft-argmax4/", "term/t27c-gft-nll/", "term/t27c-gft-sgd-step/", "term/t27c-gft-xornet/", "widgets/basics-what-a-spec-is/", "widgets/basics-the-module-line/", "widgets/basics-comments-and-prose/", "widgets/basics-constants/", "widgets/basics-whole-numbers/", "widgets/basics-true-false-and-text/", "widgets/basics-arrays/", "widgets/basics-trits/", "widgets/basics-expressions/", "widgets/basics-a-test-block/", "widgets/basics-many-tests/", "widgets/basics-functions/", "widgets/basics-local-names/", "widgets/basics-if-and-else/", "widgets/basics-loops/", "widgets/basics-pub-or-private/", "widgets/basics-structs/", "widgets/basics-enums/", "widgets/basics-use-other-modules/", "widgets/basics-invariants/", "widgets/basics-gen-ts/", "widgets/basics-seven-backends/", "widgets/basics-stages-of-t27c/", "widgets/basics-tri-commands/", "widgets/basics-reading-errors/", "widgets/basics-a-small-program/", "widgets/basics-where-next/", "widgets/golden-split/", "widgets/golden-phi-ratio/", "widgets/golden-lucas/", "widgets/golden-split-optimality/", "widgets/golden-radix-economy/", "widgets/golden-phi-in-gf16/", "widgets/golden-gf4/", "widgets/golden-gf6/", "widgets/golden-gf8/", "widgets/golden-gf10/", "widgets/golden-gf12/", "widgets/golden-gf14/", "widgets/golden-gf16/", "widgets/golden-dot-two/", "widgets/golden-gf24/", "widgets/golden-gf32/", "widgets/golden-gf48/", "widgets/golden-gf64/", "widgets/golden-gf96/", "widgets/golden-gf128/", "widgets/golden-gf256/", "widgets/golden-gf512/", "widgets/golden-gf1024/", "widgets/golden-gft8/", "widgets/golden-gft16/", "widgets/golden-gft32/", "widgets/golden-decode/", "term/t27-tri-vectors/", "term/t27-tri-census/", "term/t27-tri-seals/", "term/t27-tri-prose/", "term/t27-tri-lean/", "term/tri-selftest/", "term/play-terminal-gates/", "widgets/tc-why-three/", "widgets/tc-balanced-count/", "widgets/tc-flip-and-cut/", "widgets/tc-kleene-gates/", "widgets/tc-consensus-any/", "widgets/tc-sum-and-carry/", "widgets/tc-half-adder/", "widgets/tc-full-adder/", "widgets/tc-ripple-carry/", "widgets/tc-times-a-trit/", "widgets/tc-long-multiply/", "widgets/tc-ternary-mac/", "widgets/tc-two-bits/", "widgets/tc-five-in-a-byte/", "widgets/tc-trit-word/", "widgets/tc-instruction-word/", "widgets/tc-opcode-map/", "widgets/tc-immediate/", "widgets/tc-ternary-alu/", "widgets/tc-three-way-jump/", "widgets/tc-run-a-program/", "widgets/tc-compare/", "widgets/tc-thirds/", "widgets/tc-sort-three/", "widgets/tc-one-neuron/", "widgets/tc-detector/", "widgets/tc-tiny-layer/", "wars", "term/tri-game-tick/", "term/tri-game-vault/", "term/perf2-knockouts/", "widgets/race-the-bee/", "widgets/gatle/", "term/tri-blog-list/", "term/tri-game-selftest/"]; -pub const WIDGET_TITLES : [252]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "WARS: agent configurations compared on real GitHub issues", "", "", "", "", "", "", ""]; -pub const WIDGET_LINES : [252]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "One issue, one pinned commit, the same tools and gates; only the decision layer changes, and a missing run stays unknown.", "", "", "", "", "", "", ""]; +pub const WIDGET_COUNT : u8 = 253; +pub const WIDGET_IDS : [253]str = ["x7-board", "tri-x7-fasm", "tri-x7-mutate", "perf2-loop", "tri-fpga-rgmii", "tri-fpga-jtag", "tri-fpga-pins", "devkit-flow", "play-verilog", "bit-diff", "build-receipt", "cost-curves", "gf16-calc", "idcode", "lut-explain", "pin-map", "placement-map", "resource-bars", "slack-waterfall", "test-waves", "synth-smells", "bit-autopsy", "fasm-skyline", "vcd-wrapped", "fits-on", "stat-card", "lut-depth", "fsm-sketch", "lut-treemap", "t27-cell", "t27-vs-nvfp4", "uart-bucket", "tri-fpga-specs", "tri-fpga-tools", "tri-fpga-wire", "tri-fpga-batch", "tri-fpga-status", "tri-fpga-tmpcheck", "tri-fpga-keycheck", "tri-fpga-selftest", "tri-x7-refs", "tri-x7-audit", "t27c-clock-domain", "t27c-clocks", "t27c-wukong-v1", "t27c-cts", "t27c-mmcm", "t27c-mmcm-mutate", "t27c-timing", "t27c-reset-sync", "t27c-reset-sync-gen", "t27c-mtbf", "t27c-clock-domain-gen", "t27c-fifo", "t27c-fifo-mutate", "t27c-fifo-flags", "t27c-emitter-xdc", "t27c-fpga-rxcap", "t27-tri-competitors", "t27-tri-discard", "tri-fpga-txhold", "tri-fpga-rxcap", "tri-fpga-rxer", "tri-fpga-steps", "tri-fpga-ioclients", "tri-fpga-claim", "tri-fpga-release", "tri-fpga-next", "t27c-memory", "t27c-spi-tb", "t27c-check-uart", "t27c-check-spi", "t27c-check-apb", "t27c-check-axi4", "t27c-check-bridge", "t27c-check-memory", "t27c-verilog-uart", "t27c-verilog-spi", "t27c-verilog-apb", "t27c-verilog-axi4", "t27c-verilog-bridge", "t27c-verilog-top", "t27c-verilog-uart-tb", "t27c-verilog-apb-tb", "t27c-verilog-axi-tb", "t27c-verilog-mem-tb", "t27c-verilog-integration-tb", "t27c-verilog-top-tb", "t27c-verilog-spi-tb", "t27c-hir-uart", "t27c-hir-apb", "t27c-hir-axi4", "t27c-eth-crc", "t27c-rgmii", "jtag-verdict", "line-bounce", "eye-isi", "ecc-secded", "carry-chain", "prefix-adder", "csa-tree", "shift-add", "booth-radix4", "dsp-fit", "q-format", "round-sat", "sqnr", "cordic", "cordic-vector", "sine-table", "alias-fold", "nco", "dft-bin", "fir-response", "fir-design", "fir-cost", "decimator", "cic-growth", "polyphase", "fft-butterfly", "bit-reverse", "fft-scaling", "barker-corr", "fir-fit", "fir-on-board", "play-hello-world", "play-rust", "play-js", "t27c-hello-world", "t27-tri-misread", "test-touch", "t27c-stages", "t27c-e8m0", "play-e8m0", "t27c-ocp-mx", "play-gfternary", "t27c-gfternary", "play-golden-sieve", "t27c-golden-sieve", "play-tnf17", "t27c-tnf17", "t27c-activation-quantizer", "t27c-bitnet-majority", "t27c-bitnet-neuron-nchunk", "t27c-comb-ternary-dot", "t27c-stream-ternary-mac", "t27c-bitnet-mlp", "t27c-gft-smul", "t27c-gft-sadd", "t27c-gft-signed-mac", "t27c-gft-relu", "t27c-gft-exp2", "t27c-gft-argmax4", "t27c-gft-nll", "t27c-gft-sgd-step", "t27c-gft-xornet", "basics-what-a-spec-is", "basics-the-module-line", "basics-comments-and-prose", "basics-constants", "basics-whole-numbers", "basics-true-false-and-text", "basics-arrays", "basics-trits", "basics-expressions", "basics-a-test-block", "basics-many-tests", "basics-functions", "basics-local-names", "basics-if-and-else", "basics-loops", "basics-pub-or-private", "basics-structs", "basics-enums", "basics-use-other-modules", "basics-invariants", "basics-gen-ts", "basics-seven-backends", "basics-stages-of-t27c", "basics-tri-commands", "basics-reading-errors", "basics-a-small-program", "basics-where-next", "golden-split", "golden-phi-ratio", "golden-lucas", "golden-split-optimality", "golden-radix-economy", "golden-phi-in-gf16", "golden-gf4", "golden-gf6", "golden-gf8", "golden-gf10", "golden-gf12", "golden-gf14", "golden-gf16", "golden-dot-two", "golden-gf24", "golden-gf32", "golden-gf48", "golden-gf64", "golden-gf96", "golden-gf128", "golden-gf256", "golden-gf512", "golden-gf1024", "golden-gft8", "golden-gft16", "golden-gft32", "golden-decode", "t27-tri-vectors", "t27-tri-census", "t27-tri-seals", "t27-tri-prose", "t27-tri-lean", "tri-selftest", "play-terminal-gates", "tc-why-three", "tc-balanced-count", "tc-flip-and-cut", "tc-kleene-gates", "tc-consensus-any", "tc-sum-and-carry", "tc-half-adder", "tc-full-adder", "tc-ripple-carry", "tc-times-a-trit", "tc-long-multiply", "tc-ternary-mac", "tc-two-bits", "tc-five-in-a-byte", "tc-trit-word", "tc-instruction-word", "tc-opcode-map", "tc-immediate", "tc-ternary-alu", "tc-three-way-jump", "tc-run-a-program", "tc-compare", "tc-thirds", "tc-sort-three", "tc-one-neuron", "tc-detector", "tc-tiny-layer", "paper-claims", "wars", "tri-game-tick", "tri-game-vault", "perf2-knockouts", "race-the-bee", "gatle", "tri-blog-list", "tri-game-selftest"]; +pub const WIDGET_KINDS : [253]str = ["cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "player", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "player", "player", "player", "cast", "cast", "tool", "tool", "cast", "player", "cast", "player", "cast", "player", "cast", "player", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tab", "cast", "cast", "cast", "tool", "tool", "cast", "cast"]; +pub const WIDGET_CATEGORIES : [253]str = ["fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "game", "game", "game", "game", "game", "game", "game", "game"]; +pub const WIDGET_PAGES : [253]str = ["term/x7-board/", "term/tri-x7-fasm/", "term/tri-x7-mutate/", "term/perf2-loop/", "term/tri-fpga-rgmii/", "term/tri-fpga-jtag/", "term/tri-fpga-pins/", "term/devkit-flow/", "play/hello-world/verilog/", "widgets/bit-diff/", "widgets/build-receipt/", "widgets/cost-curves/", "widgets/gf16-calc/", "widgets/idcode/", "widgets/lut-explain/", "widgets/pin-map/", "widgets/placement-map/", "widgets/resource-bars/", "widgets/slack-waterfall/", "widgets/test-waves/", "widgets/synth-smells/", "widgets/bit-autopsy/", "widgets/fasm-skyline/", "widgets/vcd-wrapped/", "widgets/fits-on/", "widgets/stat-card/", "widgets/lut-depth/", "widgets/fsm-sketch/", "widgets/lut-treemap/", "widgets/t27-cell/", "widgets/t27-vs-nvfp4/", "widgets/uart-bucket/", "term/tri-fpga-specs/", "term/tri-fpga-tools/", "term/tri-fpga-wire/", "term/tri-fpga-batch/", "term/tri-fpga-status/", "term/tri-fpga-tmpcheck/", "term/tri-fpga-keycheck/", "term/tri-fpga-selftest/", "term/tri-x7-refs/", "term/tri-x7-audit/", "term/t27c-clock-domain/", "term/t27c-clocks/", "term/t27c-wukong-v1/", "term/t27c-cts/", "term/t27c-mmcm/", "term/t27c-mmcm-mutate/", "term/t27c-timing/", "term/t27c-reset-sync/", "term/t27c-reset-sync-gen/", "term/t27c-mtbf/", "term/t27c-clock-domain-gen/", "term/t27c-fifo/", "term/t27c-fifo-mutate/", "term/t27c-fifo-flags/", "term/t27c-emitter-xdc/", "term/t27c-fpga-rxcap/", "term/t27-tri-competitors/", "term/t27-tri-discard/", "term/tri-fpga-txhold/", "term/tri-fpga-rxcap/", "term/tri-fpga-rxer/", "term/tri-fpga-steps/", "term/tri-fpga-ioclients/", "term/tri-fpga-claim/", "term/tri-fpga-release/", "term/tri-fpga-next/", "term/t27c-memory/", "term/t27c-spi-tb/", "term/t27c-check-uart/", "term/t27c-check-spi/", "term/t27c-check-apb/", "term/t27c-check-axi4/", "term/t27c-check-bridge/", "term/t27c-check-memory/", "term/t27c-verilog-uart/", "term/t27c-verilog-spi/", "term/t27c-verilog-apb/", "term/t27c-verilog-axi4/", "term/t27c-verilog-bridge/", "term/t27c-verilog-top/", "term/t27c-verilog-uart-tb/", "term/t27c-verilog-apb-tb/", "term/t27c-verilog-axi-tb/", "term/t27c-verilog-mem-tb/", "term/t27c-verilog-integration-tb/", "term/t27c-verilog-top-tb/", "term/t27c-verilog-spi-tb/", "term/t27c-hir-uart/", "term/t27c-hir-apb/", "term/t27c-hir-axi4/", "term/t27c-eth-crc/", "term/t27c-rgmii/", "widgets/jtag-verdict/", "widgets/line-bounce/", "widgets/eye-isi/", "widgets/ecc-secded/", "widgets/carry-chain/", "widgets/prefix-adder/", "widgets/csa-tree/", "widgets/shift-add/", "widgets/booth-radix4/", "widgets/dsp-fit/", "widgets/q-format/", "widgets/round-sat/", "widgets/sqnr/", "widgets/cordic/", "widgets/cordic-vector/", "widgets/sine-table/", "widgets/alias-fold/", "widgets/nco/", "widgets/dft-bin/", "widgets/fir-response/", "widgets/fir-design/", "widgets/fir-cost/", "widgets/decimator/", "widgets/cic-growth/", "widgets/polyphase/", "widgets/fft-butterfly/", "widgets/bit-reverse/", "widgets/fft-scaling/", "widgets/barker-corr/", "widgets/fir-fit/", "widgets/fir-on-board/", "play/hello-world/", "play/hello-world/rust/", "play/hello-world/js/", "term/t27c-hello-world/", "term/t27-tri-misread/", "widgets/test-touch/", "widgets/t27c-stages/", "term/t27c-e8m0/", "play/e8m0/", "term/t27c-ocp-mx/", "play/gfternary/", "term/t27c-gfternary/", "play/golden-sieve/", "term/t27c-golden-sieve/", "play/tnf17/", "term/t27c-tnf17/", "term/t27c-activation-quantizer/", "term/t27c-bitnet-majority/", "term/t27c-bitnet-neuron-nchunk/", "term/t27c-comb-ternary-dot/", "term/t27c-stream-ternary-mac/", "term/t27c-bitnet-mlp/", "term/t27c-gft-smul/", "term/t27c-gft-sadd/", "term/t27c-gft-signed-mac/", "term/t27c-gft-relu/", "term/t27c-gft-exp2/", "term/t27c-gft-argmax4/", "term/t27c-gft-nll/", "term/t27c-gft-sgd-step/", "term/t27c-gft-xornet/", "widgets/basics-what-a-spec-is/", "widgets/basics-the-module-line/", "widgets/basics-comments-and-prose/", "widgets/basics-constants/", "widgets/basics-whole-numbers/", "widgets/basics-true-false-and-text/", "widgets/basics-arrays/", "widgets/basics-trits/", "widgets/basics-expressions/", "widgets/basics-a-test-block/", "widgets/basics-many-tests/", "widgets/basics-functions/", "widgets/basics-local-names/", "widgets/basics-if-and-else/", "widgets/basics-loops/", "widgets/basics-pub-or-private/", "widgets/basics-structs/", "widgets/basics-enums/", "widgets/basics-use-other-modules/", "widgets/basics-invariants/", "widgets/basics-gen-ts/", "widgets/basics-seven-backends/", "widgets/basics-stages-of-t27c/", "widgets/basics-tri-commands/", "widgets/basics-reading-errors/", "widgets/basics-a-small-program/", "widgets/basics-where-next/", "widgets/golden-split/", "widgets/golden-phi-ratio/", "widgets/golden-lucas/", "widgets/golden-split-optimality/", "widgets/golden-radix-economy/", "widgets/golden-phi-in-gf16/", "widgets/golden-gf4/", "widgets/golden-gf6/", "widgets/golden-gf8/", "widgets/golden-gf10/", "widgets/golden-gf12/", "widgets/golden-gf14/", "widgets/golden-gf16/", "widgets/golden-dot-two/", "widgets/golden-gf24/", "widgets/golden-gf32/", "widgets/golden-gf48/", "widgets/golden-gf64/", "widgets/golden-gf96/", "widgets/golden-gf128/", "widgets/golden-gf256/", "widgets/golden-gf512/", "widgets/golden-gf1024/", "widgets/golden-gft8/", "widgets/golden-gft16/", "widgets/golden-gft32/", "widgets/golden-decode/", "term/t27-tri-vectors/", "term/t27-tri-census/", "term/t27-tri-seals/", "term/t27-tri-prose/", "term/t27-tri-lean/", "term/tri-selftest/", "term/play-terminal-gates/", "widgets/tc-why-three/", "widgets/tc-balanced-count/", "widgets/tc-flip-and-cut/", "widgets/tc-kleene-gates/", "widgets/tc-consensus-any/", "widgets/tc-sum-and-carry/", "widgets/tc-half-adder/", "widgets/tc-full-adder/", "widgets/tc-ripple-carry/", "widgets/tc-times-a-trit/", "widgets/tc-long-multiply/", "widgets/tc-ternary-mac/", "widgets/tc-two-bits/", "widgets/tc-five-in-a-byte/", "widgets/tc-trit-word/", "widgets/tc-instruction-word/", "widgets/tc-opcode-map/", "widgets/tc-immediate/", "widgets/tc-ternary-alu/", "widgets/tc-three-way-jump/", "widgets/tc-run-a-program/", "widgets/tc-compare/", "widgets/tc-thirds/", "widgets/tc-sort-three/", "widgets/tc-one-neuron/", "widgets/tc-detector/", "widgets/tc-tiny-layer/", "widgets/paper-claims/", "wars", "term/tri-game-tick/", "term/tri-game-vault/", "term/perf2-knockouts/", "widgets/race-the-bee/", "widgets/gatle/", "term/tri-blog-list/", "term/tri-game-selftest/"]; +pub const WIDGET_TITLES : [253]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "WARS: agent configurations compared on real GitHub issues", "", "", "", "", "", "", ""]; +pub const WIDGET_LINES : [253]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "One issue, one pinned commit, the same tools and gates; only the decision layer changes, and a missing run stays unknown.", "", "", "", "", "", "", ""]; ; Why a person would pass this one on: the reason the widget is in the gallery at all. -pub const WIDGET_HOOKS : [252]str = ["The bitstream is byte-identical to openXC7's and runs on a real board: the claim most FPGA people doubt, shown.", "A Xilinx 7-series bitstream assembled with no Vivado anywhere in the path.", "Plant a bug in the bitstream path and watch the tests catch it: mutation testing for hardware.", "Place and route to a loaded bitstream, with the clock on screen.", "RGMII hold margins read from nextpnr's own SDF, not from a datasheet.", "The cable asks which chip is there and the chip answers with its IDCODE.", "Before an edit to a Verilog file: every spec and generator it would touch.", "The whole FPGA flow, one layer per line, from spec to board.", "A spec turned into Verilog inside a post, with the RTL read the way a hardware engineer reads it.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "17 of 17 conformance specs compile, their test blocks pass, and no generated file has drifted.", "14 of 14 bench tools pass their own self-tests in one sweep: decode 18/18, repin 17/17, firelog 10/10, tmpcheck 9/9, stamps 9/9, keep 9/9.", "Requested 115,200 puts 115,385 on the wire (+0.16 %), 921,600 puts 923,077, and 3,000,000 is exact.", "26 checks, no board, no RTL: every receipt returns, 11 loss and fault cases recover, and a lie stops the run.", "One command reads the bench: cables, locks, and the last board runs: three x7-board runs PASS 51840/51840.", "112 files under /tmp pinned by sha256 in specs: every one has a kept copy, 0 lost, 0 unlocated.", "84 board and model logs scanned for the TRI-NET key: 0 hits, 0 logs of 1 MB or more.", "16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.", "The part table in far.t27 matches prjxray-db part.json, all 6 reference bitstreams present, bitwalk reads all 6 in 84.4 ms.", "One command re-runs every sweep: CRC 12/12, ECC 32520/32520 frames, 82/82 pins, 4224/4224 segbits, gold 5/5. audit: CLEAN.", "The CDC spec through the real compiler: 12 tests pass natively and the header says what the model does and does not claim.", "The tri clocks card as a spec: constants a tool page reads, and a native test-report that says so plainly -- 0 tests, because it is not a test suite.", "The board itself as a spec: 15 tests pass natively and the part line names the xc7a200tfgg676 the Wukong carries.", "Clock-tree synthesis in numbers: 15 tests pass natively, and the header pins the Artix-7 teaching delays the tree arithmetic uses.", "The MMCM model through the real compiler: VCO window, M/D/O ranges, fractional multiply in eighths, the 1/56 phase step, 16 tests natively.", "Widen the VCO window with one sed and exactly one test objects -- the rejection test that names the 500 MHz config it calls out.", "Static timing as arithmetic: 25 tests pass natively on arcs, slack and Fmax, with the Artix-7 teaching delays in the header.", "The three reset kinds through the real compiler: async assert with sync release through 2 to 4 flops, and the racy async release, 16 tests natively.", "What the compiler emits for the reset pipe: t27c gen prints the Zig, one struct copy per clock, and wc -l counts it.", "Metastability MTBF without floats: the WP323 form in Q10 log2, one flop negative slack, two flops astronomical, 15 tests natively.", "The CDC model as Zig: t27c gen prints what it compiled and wc -l says how many lines of code the model is.", "The FIFO stdlib through the real compiler: 18 tests pass natively and 6 invariants are proved comptime.", "Move a pointer by 3 instead of 1 and every test still passes: the suite asserts fill and flags, never pointer values.", "Flip one flag assignment and a single test objects: the guard that keeps the FIFO honest.", "The pins-to-XDC emitter spec parsed by the real compiler, and the create_clock lines it exists to write.", "The fpga-rxcap tool card as a spec: constants for a tool page, and a native run that says 0 tests and why.", "168 records: 14 papers entered twice, 141 cite no score, 144 state zero at pass@1.", "67 specs lose 23,578 tokens to parser recovery, each held at its pinned bound.", "Smallest hold 3445 ps on TXD1 against a 1000 ps bench; each TX pin setup and hold from the routed SDF.", "Per-bit setup and hold of an async RX nibble against its RXC edge, from the routed SDF: one nibble changes 2387 to 2486 ps apart, so a binary counter tears where a gray one cannot.", "RX_ER pulses injected at exact nibble positions of a ping -- preamble, mid-frame, IP header -- and the frame state each pulse leaves behind, RTL vs model.", "The Ethernet bring-up plan on the bench: pre-registered steps, logged exits, what ran and what did not.", "The registered IO clients on the bench, read live: names, claims and what each declares it owns.", "The bench claim in action: one client takes the hardware lock and the tool reports who holds it.", "The bench lock given back: the client gives up its claim and the bench reports itself free.", "The next queued step on the bench, read live from the run state.", "The memory map spec through the real compiler: 15 tests pass natively and 6 invariants are proved comptime.", "The SPI testbench through the real compiler: 7 tests pass natively, driving the modes and checking the captures.", "t27c check on the UART spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the SPI spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the APB bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the AXI4 spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the bus bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the memory spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "The UART spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The SPI spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The APB bridge spec lowered to synthesizable Verilog: port list, PSEL and PENABLE wiring, the address decode.", "The AXI4 spec lowered to synthesizable Verilog: the five channels' wiring and handshakes as generated wires.", "The bus bridge spec lowered to synthesizable Verilog: both sides of the crossing as generated wires.", "The whole design in one spec lowered to synthesizable Verilog: clocks, resets and bus wiring as the compiler emits them.", "The UART testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The APB bridge testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The AXI4 testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The memory testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The integration testbench spec lowered to Verilog: every bus of the design in one bench.", "The top-level testbench spec lowered to Verilog: the whole design under one bench.", "The SPI testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The UART spec lowered to hardware IR: the compiler's own view of the wires and state before Verilog exists.", "The APB bridge spec lowered to hardware IR: PSEL, PENABLE and the decode as the compiler structures them.", "The AXI4 spec lowered to hardware IR: the five channels and their handshakes as the compiler structures them.", "The Ethernet FCS spec through the real compiler: 8 tests pass natively -- the table derived from one bit step, the 0xCBF43926 check value, the 0xDEBB20E3 receiver residue.", "The RGMII spec through the real compiler: 7 tests pass natively and 1 invariant is proved comptime -- the 8 ns gigabit period, a nibble on both edges, the 78 ps tap ladder.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The t27 compiler running as WebAssembly in a post: compile, test, seven backends.", "The same spec as Rust, printed by a terminal in the page.", "The only backend that runs in the browser: generate the module, then run it.", "t27c on hello_world.t27, on a real machine, every byte as printed.", "Code that compiles and is wrong: the tool that finds it.", "", "", "The OCP MX scale byte as a spec: 2^(e-127), code 255 is NaN, 18 tests and 9 comptime invariants, compiled on a real machine.", "The same scale byte compiled in your browser: seven backends, the spec's tests run in the page, and every skip says why.", "One outlier sets the scale for 32 weights: MXFP4 flushes 23 of them to zero, MXFP8 E4M3 none. 49 tests pass; a planted bug fails one.", "Ternary weights scaled by phi, compiled in your browser: codes 00, 01, 10, and the fourth code folded to zero.", "13 of 13 tests pass natively, and the report says 8 of them executed no assert; a planted bug fails exactly one.", "Five measured rules for a ternary weight alphabet, and the one formula that passes all five, run in your browser.", "One more trit and the spec does not compile at all: BLOCKED, not failed, because no test ever ran.", "A 17-bit float whose exponent is four balanced trits, 3^4 = 81 values, compiled in your browser.", "34 tests pass natively, none vacuous; swap one XOR for OR and only the test that negates twice fails.", "A neuron's sum squeezed back to one trit: 7 tests pass natively, and turning one > into >= fails only the boundary test.", "One ternary neuron, two functions picked by its weights: 12 tests pass natively, and one weight moved from P to Z fails exactly one.", "A neuron wider than 27 inputs, summed chunk by chunk: 11 tests pass natively, and a loop that stops after one chunk fails exactly one.", "A 27-lane ternary dot product as pure wires: 4 tests pass natively, and one wrong sign in tmul fails exactly one.", "The same dot product added into a register on every clock: 4 tests pass natively, and a lane mask short one bit fails exactly one.", "A whole small ternary network, 3 neurons then 2: 4 tests pass natively, and a trit packed one bit low fails exactly one.", "A signed multiply: 3 tests pass natively, none vacuous, and a sign stuck at 0 fails exactly one, m2.", "A signed add: 3 tests pass natively, and adding where opposite signs must subtract fails exactly one, a2.", "Two signed products summed: 4 tests pass natively, and OR in place of the sign XOR fails exactly one, pp.", "A ReLU: 4 tests pass natively, and letting negative inputs through fails only negz, the one test with a negative input.", "2^x for a softmax: 4 tests pass natively, and dropping the minus sign of k fails exactly one, em1.", "argmax by comparing bits alone: 4 tests pass natively, and >= in place of > fails exactly one, tie_low.", "A loss in bits: 3 tests pass natively, and a zero with the sign bit set fails exactly one, perfect.", "One SGD step: 3 tests pass natively, and g times g in place of eta times g fails exactly one, ascend.", "A 2-layer ReLU net for XOR: 4 tests pass natively, and one relu removed fails exactly one, x00.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "34 vector files, 512 cases: 2 files executed, 8 debt, 24 prose-only; 19% carry data.", "Four census populations recounted another way all agree; three are named as uncheckable.", "31 of 1,428 seals record no output (16 specs); 3 of those are missing from the debt ledger.", "11 specs refused at parse, 0 blocked only by prose, 23 broken on purpose as fixtures.", "12 Lean files, 15,553 lines and 4 sorry, are reached by no build root: nothing compiles them.", "tri, railway, python3 and the loop directory: each present or not, in one call.", "The terminal for seven t27 backends: every command run on hello_world. 21 pass, 0 fail.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Pick a lane and see whether the TRI decision layer beats the baseline on the same issue.", "One tick of the Queen's loop: an anomaly scan that reports only what changed.", "The loop's skills checked against snapshots before an agent may use them.", "Three performance bits, and one knockout bitstream per bit to prove each one matters.", "", "", "73 published posts with date, language and revision, newest first.", "6 of 6 self-tests hold: anomalies, blog_drift, lessons, site_gate, tick, vault."]; +pub const WIDGET_HOOKS : [253]str = ["The bitstream is byte-identical to openXC7's and runs on a real board: the claim most FPGA people doubt, shown.", "A Xilinx 7-series bitstream assembled with no Vivado anywhere in the path.", "Plant a bug in the bitstream path and watch the tests catch it: mutation testing for hardware.", "Place and route to a loaded bitstream, with the clock on screen.", "RGMII hold margins read from nextpnr's own SDF, not from a datasheet.", "The cable asks which chip is there and the chip answers with its IDCODE.", "Before an edit to a Verilog file: every spec and generator it would touch.", "The whole FPGA flow, one layer per line, from spec to board.", "A spec turned into Verilog inside a post, with the RTL read the way a hardware engineer reads it.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "17 of 17 conformance specs compile, their test blocks pass, and no generated file has drifted.", "14 of 14 bench tools pass their own self-tests in one sweep: decode 18/18, repin 17/17, firelog 10/10, tmpcheck 9/9, stamps 9/9, keep 9/9.", "Requested 115,200 puts 115,385 on the wire (+0.16 %), 921,600 puts 923,077, and 3,000,000 is exact.", "26 checks, no board, no RTL: every receipt returns, 11 loss and fault cases recover, and a lie stops the run.", "One command reads the bench: cables, locks, and the last board runs: three x7-board runs PASS 51840/51840.", "112 files under /tmp pinned by sha256 in specs: every one has a kept copy, 0 lost, 0 unlocated.", "84 board and model logs scanned for the TRI-NET key: 0 hits, 0 logs of 1 MB or more.", "16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.", "The part table in far.t27 matches prjxray-db part.json, all 6 reference bitstreams present, bitwalk reads all 6 in 84.4 ms.", "One command re-runs every sweep: CRC 12/12, ECC 32520/32520 frames, 82/82 pins, 4224/4224 segbits, gold 5/5. audit: CLEAN.", "The CDC spec through the real compiler: 12 tests pass natively and the header says what the model does and does not claim.", "The tri clocks card as a spec: constants a tool page reads, and a native test-report that says so plainly -- 0 tests, because it is not a test suite.", "The board itself as a spec: 15 tests pass natively and the part line names the xc7a200tfgg676 the Wukong carries.", "Clock-tree synthesis in numbers: 15 tests pass natively, and the header pins the Artix-7 teaching delays the tree arithmetic uses.", "The MMCM model through the real compiler: VCO window, M/D/O ranges, fractional multiply in eighths, the 1/56 phase step, 16 tests natively.", "Widen the VCO window with one sed and exactly one test objects -- the rejection test that names the 500 MHz config it calls out.", "Static timing as arithmetic: 25 tests pass natively on arcs, slack and Fmax, with the Artix-7 teaching delays in the header.", "The three reset kinds through the real compiler: async assert with sync release through 2 to 4 flops, and the racy async release, 16 tests natively.", "What the compiler emits for the reset pipe: t27c gen prints the Zig, one struct copy per clock, and wc -l counts it.", "Metastability MTBF without floats: the WP323 form in Q10 log2, one flop negative slack, two flops astronomical, 15 tests natively.", "The CDC model as Zig: t27c gen prints what it compiled and wc -l says how many lines of code the model is.", "The FIFO stdlib through the real compiler: 18 tests pass natively and 6 invariants are proved comptime.", "Move a pointer by 3 instead of 1 and every test still passes: the suite asserts fill and flags, never pointer values.", "Flip one flag assignment and a single test objects: the guard that keeps the FIFO honest.", "The pins-to-XDC emitter spec parsed by the real compiler, and the create_clock lines it exists to write.", "The fpga-rxcap tool card as a spec: constants for a tool page, and a native run that says 0 tests and why.", "168 records: 14 papers entered twice, 141 cite no score, 144 state zero at pass@1.", "67 specs lose 23,578 tokens to parser recovery, each held at its pinned bound.", "Smallest hold 3445 ps on TXD1 against a 1000 ps bench; each TX pin setup and hold from the routed SDF.", "Per-bit setup and hold of an async RX nibble against its RXC edge, from the routed SDF: one nibble changes 2387 to 2486 ps apart, so a binary counter tears where a gray one cannot.", "RX_ER pulses injected at exact nibble positions of a ping -- preamble, mid-frame, IP header -- and the frame state each pulse leaves behind, RTL vs model.", "The Ethernet bring-up plan on the bench: pre-registered steps, logged exits, what ran and what did not.", "The registered IO clients on the bench, read live: names, claims and what each declares it owns.", "The bench claim in action: one client takes the hardware lock and the tool reports who holds it.", "The bench lock given back: the client gives up its claim and the bench reports itself free.", "The next queued step on the bench, read live from the run state.", "The memory map spec through the real compiler: 15 tests pass natively and 6 invariants are proved comptime.", "The SPI testbench through the real compiler: 7 tests pass natively, driving the modes and checking the captures.", "t27c check on the UART spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the SPI spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the APB bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the AXI4 spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the bus bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the memory spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "The UART spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The SPI spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The APB bridge spec lowered to synthesizable Verilog: port list, PSEL and PENABLE wiring, the address decode.", "The AXI4 spec lowered to synthesizable Verilog: the five channels' wiring and handshakes as generated wires.", "The bus bridge spec lowered to synthesizable Verilog: both sides of the crossing as generated wires.", "The whole design in one spec lowered to synthesizable Verilog: clocks, resets and bus wiring as the compiler emits them.", "The UART testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The APB bridge testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The AXI4 testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The memory testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The integration testbench spec lowered to Verilog: every bus of the design in one bench.", "The top-level testbench spec lowered to Verilog: the whole design under one bench.", "The SPI testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The UART spec lowered to hardware IR: the compiler's own view of the wires and state before Verilog exists.", "The APB bridge spec lowered to hardware IR: PSEL, PENABLE and the decode as the compiler structures them.", "The AXI4 spec lowered to hardware IR: the five channels and their handshakes as the compiler structures them.", "The Ethernet FCS spec through the real compiler: 8 tests pass natively -- the table derived from one bit step, the 0xCBF43926 check value, the 0xDEBB20E3 receiver residue.", "The RGMII spec through the real compiler: 7 tests pass natively and 1 invariant is proved comptime -- the 8 ns gigabit period, a nibble on both edges, the 78 ps tap ladder.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The t27 compiler running as WebAssembly in a post: compile, test, seven backends.", "The same spec as Rust, printed by a terminal in the page.", "The only backend that runs in the browser: generate the module, then run it.", "t27c on hello_world.t27, on a real machine, every byte as printed.", "Code that compiles and is wrong: the tool that finds it.", "", "", "The OCP MX scale byte as a spec: 2^(e-127), code 255 is NaN, 18 tests and 9 comptime invariants, compiled on a real machine.", "The same scale byte compiled in your browser: seven backends, the spec's tests run in the page, and every skip says why.", "One outlier sets the scale for 32 weights: MXFP4 flushes 23 of them to zero, MXFP8 E4M3 none. 49 tests pass; a planted bug fails one.", "Ternary weights scaled by phi, compiled in your browser: codes 00, 01, 10, and the fourth code folded to zero.", "13 of 13 tests pass natively, and the report says 8 of them executed no assert; a planted bug fails exactly one.", "Five measured rules for a ternary weight alphabet, and the one formula that passes all five, run in your browser.", "One more trit and the spec does not compile at all: BLOCKED, not failed, because no test ever ran.", "A 17-bit float whose exponent is four balanced trits, 3^4 = 81 values, compiled in your browser.", "34 tests pass natively, none vacuous; swap one XOR for OR and only the test that negates twice fails.", "A neuron's sum squeezed back to one trit: 7 tests pass natively, and turning one > into >= fails only the boundary test.", "One ternary neuron, two functions picked by its weights: 12 tests pass natively, and one weight moved from P to Z fails exactly one.", "A neuron wider than 27 inputs, summed chunk by chunk: 11 tests pass natively, and a loop that stops after one chunk fails exactly one.", "A 27-lane ternary dot product as pure wires: 4 tests pass natively, and one wrong sign in tmul fails exactly one.", "The same dot product added into a register on every clock: 4 tests pass natively, and a lane mask short one bit fails exactly one.", "A whole small ternary network, 3 neurons then 2: 4 tests pass natively, and a trit packed one bit low fails exactly one.", "A signed multiply: 3 tests pass natively, none vacuous, and a sign stuck at 0 fails exactly one, m2.", "A signed add: 3 tests pass natively, and adding where opposite signs must subtract fails exactly one, a2.", "Two signed products summed: 4 tests pass natively, and OR in place of the sign XOR fails exactly one, pp.", "A ReLU: 4 tests pass natively, and letting negative inputs through fails only negz, the one test with a negative input.", "2^x for a softmax: 4 tests pass natively, and dropping the minus sign of k fails exactly one, em1.", "argmax by comparing bits alone: 4 tests pass natively, and >= in place of > fails exactly one, tie_low.", "A loss in bits: 3 tests pass natively, and a zero with the sign bit set fails exactly one, perfect.", "One SGD step: 3 tests pass natively, and g times g in place of eta times g fails exactly one, ascend.", "A 2-layer ReLU net for XOR: 4 tests pass natively, and one relu removed fails exactly one, x00.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "34 vector files, 512 cases: 2 files executed, 8 debt, 24 prose-only; 19% carry data.", "Four census populations recounted another way all agree; three are named as uncheckable.", "31 of 1,428 seals record no output (16 specs); 3 of those are missing from the debt ledger.", "11 specs refused at parse, 0 blocked only by prose, 23 broken on purpose as fixtures.", "12 Lean files, 15,553 lines and 4 sorry, are reached by no build root: nothing compiles them.", "tri, railway, python3 and the loop directory: each present or not, in one call.", "The terminal for seven t27 backends: every command run on hello_world. 21 pass, 0 fail.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Pick a lane and see whether the TRI decision layer beats the baseline on the same issue.", "One tick of the Queen's loop: an anomaly scan that reports only what changed.", "The loop's skills checked against snapshots before an agent may use them.", "Three performance bits, and one knockout bitstream per bit to prove each one matters.", "", "", "73 published posts with date, language and revision, newest first.", "6 of 6 self-tests hold: anomalies, blog_drift, lessons, site_gate, tick, vault."]; ; --- Ideas: asked for, not built --------------------------------------------------------------- ; From what engineers share today (gh-skyline, Tiny Tapeout renders, Wrapped cards, Gatle-style @@ -119,9 +119,9 @@ test the_fpga_shelf_comes_first_and_opens_on_the_board { } test the_arena_is_a_tab_and_says_its_own_words { - assert WIDGET_IDS[244] == "wars"; - assert WIDGET_KINDS[244] == "tab"; - assert WIDGET_PAGES[244] == "wars"; + assert WIDGET_IDS[245] == "wars"; + assert WIDGET_KINDS[245] == "tab"; + assert WIDGET_PAGES[245] == "wars"; } test the_gallery_posts_nothing { @@ -157,8 +157,8 @@ test the_verification_shelf_is_rehearsals_and_audits { test ideas_are_counted_apart_from_widgets { assert IDEA_COUNT == 6; - assert WIDGET_IDS[249] == "gatle"; - assert WIDGET_COUNT == 252; + assert WIDGET_IDS[250] == "gatle"; + assert WIDGET_COUNT == 253; } test the_ternary_machine_shelf_runs_before_the_arena { @@ -172,9 +172,9 @@ test every_tool_lives_under_widgets_and_keeps_its_words_on_its_page { assert WIDGET_KINDS[9] == "tool"; assert WIDGET_PAGES[9] == "widgets/bit-diff/"; assert WIDGET_HOOKS[9] == ""; - assert WIDGET_KINDS[248] == "tool"; - assert WIDGET_CATEGORIES[248] == "game"; - assert WIDGET_PAGES[248] == "widgets/race-the-bee/"; + assert WIDGET_KINDS[249] == "tool"; + assert WIDGET_CATEGORIES[249] == "game"; + assert WIDGET_PAGES[249] == "widgets/race-the-bee/"; } test the_arithmetic_shelf_closes_the_fpga_bench { diff --git a/apps/website/public/widgets/paper-claims/index.html b/apps/website/public/widgets/paper-claims/index.html new file mode 100644 index 0000000000..c28595e362 --- /dev/null +++ b/apps/website/public/widgets/paper-claims/index.html @@ -0,0 +1,47 @@ +<!doctype html> +<!-- Generated by scripts/widget-pages-from-spec.mjs from specs/widgets/paper-claims.t27 (sha256 db9c3e9839ebe00e); do not edit. --> +<html lang="en"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<title>Three format papers, 45 printed numbers, recomputed exactly · Trinity S³AI + + + + + + + + + + + + + + + + + + + + + + + + +
+Trinity S³AI +

Three format papers, 45 printed numbers, recomputed exactly

+

Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked.

+
+
+ +
+

This page sets no cookie and sends nothing anywhere.

+
Where the numbers come from
  • gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392): t27c 0.5.2 test-report on the Railway lab, 10 of 10 tests pass, 0 vacuous; tri papers runs the same spec
  • The t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23), wasm generated from that spec with t27c gen-c and zig 0.16.0, called once on the lab with no filter; every row below is one row of its answer
  • The papers: arXiv:2606.05017v5 (GoldenFloat), arXiv:2606.09686v3 (Golden Ruler), and the TNF paper by Dmitrii Vasilev, 2026-08-11
+

This widget's .t27 source · All widgets

+
+ + + + diff --git a/apps/website/public/widgets/paper-claims/paper-claims.t27 b/apps/website/public/widgets/paper-claims/paper-claims.t27 new file mode 100644 index 0000000000..6f1770067f --- /dev/null +++ b/apps/website/public/widgets/paper-claims/paper-claims.t27 @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/widgets/paper-claims.t27 -- which numbers printed in three format papers recompute to the printed value +; Source of truth for public/widgets/paper-claims/ (gHashTag/trinity): scripts/widget-pages-from-spec.mjs compiles +; this file, checks its constants, evaluates the tests below and writes the page. tool.js is one import of +; ../infographic.js, which draws SAY_TABLE_* as a real
and SAY_FLOW_* as an SVG diagram with a +; , black and white, and holds no words of its own. ASCII only (L3), English only (LANG-EN). +; Every row is one row of gHashTag/t27 specs/numeric/paper_claims.t27 (module NumericPaperClaims, +; gHashTag/t27#10392), copied from the t27 MCP tool t27_paper_claims run on the Railway lab. The claim +; texts are the spec's own CL_TEXT strings. Where the spec has no recomputation (not checkable) this +; page prints "-" instead of the spec's placeholder 0. +; phi^2 + 1/phi^2 = 3 | TRINITY + +module widget_paper_claims; + +pub const KIND : str = "widget-tool"; +pub const ID : str = "paper-claims"; +pub const TITLE : str = "Three format papers, 45 printed numbers, recomputed exactly"; +pub const DESCRIPTION : str = "Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked."; +pub const IMAGE_ALT : str = "A table of 45 claims from three papers. GoldenFloat: 9 fit, 1 not checkable. Golden Ruler: 8 fit, 1 does not fit (12 clusters printed, the catalog has 13), 1 not checkable. TNF: 15 fit, 7 do not fit, 1 not checkable. Two sums over the t27 repo tables fit."; +pub const HOOK : str = "45 numbers from three format papers, recomputed in exact integers. 34 fit. 8 do not."; +pub const CATEGORY : str = "compiler"; +pub const DATA_SOURCES : [3]str = ["gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392): t27c 0.5.2 test-report on the Railway lab, 10 of 10 tests pass, 0 vacuous; tri papers runs the same spec", "The t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23), wasm generated from that spec with t27c gen-c and zig 0.16.0, called once on the lab with no filter; every row below is one row of its answer", "The papers: arXiv:2606.05017v5 (GoldenFloat), arXiv:2606.09686v3 (Golden Ruler), and the TNF paper by Dmitrii Vasilev, 2026-08-11"]; +pub const READS_LOCAL_FILES : bool = false; +pub const SENDS_NOTHING : bool = true; + +; --- The table: one row per claim, in the spec's row order ------------------------------------ +pub const SAY_TABLE_CAPTION : str = "45 printed numbers and what exact integer arithmetic gives"; +pub const SAY_TABLE_HEAD : [6]str = ["Paper", "Where", "Claim", "Printed", "Recomputed", "Verdict"]; +pub const SAY_TABLE_CELLS : [270]str = [ + "GoldenFloat", "Table 1", "e = round((N-1)/phi^2), f = N-1-e gives the printed (e, f) at all 17 widths", "17", "17", "fits", + "GoldenFloat", "Table 1", "(N-1)/phi^2 to four decimals, as printed, at all 17 widths", "17", "17", "fits", + "GoldenFloat", "Table 1", "GF16: e = 6", "6", "6", "fits", + "GoldenFloat", "Table 1", "GF1024: e = 391", "391", "391", "fits", + "GoldenFloat", "Table 1", "GF16: (N-1)/phi^2 = 5.7295", "5.7295", "5.7295", "fits", + "GoldenFloat", "Abstract", "phi^(2n) + phi^(-2n) = L_(2n) for n = 1..45 (the paper claims 1..256 at 500 digits; u64 stops at 45)", "45", "45", "fits", + "GoldenFloat", "GF16 anchor", "GF16 code 0x47C0 (e = 6, f = 9, bias 31) decodes to 30", "30", "30", "fits", + "GoldenFloat", "GF16 anchor", "30 = 1^2 + 2^2 + 3^2 + 4^2, the dot4 anchor", "30", "30", "fits", + "GoldenFloat", "Look-elsewhere", "p = K / N_s = 83 / 80000 = 1.04e-3", "1.04e-3", "1.04e-3", "fits", + "GoldenFloat", "Abstract", "35 of 35 testbench vectors at 323 MHz on an XC7A35T", "35", "-", "not checkable", + "Golden Ruler", "Abstract", "the catalog holds 109 formats", "109", "109", "fits", + "Golden Ruler", "Abstract", "the 109 formats span 12 clusters", "12", "13", "does not fit", + "Golden Ruler", "Packs", "3.0 in BF16 is 0x4040", "0x4040", "0x4040", "fits", + "Golden Ruler", "Packs", "3.0 in FP8 E4M3 is 0x44", "0x44", "0x44", "fits", + "Golden Ruler", "Packs", "3.0 in FP8 E5M2 is 0x42", "0x42", "0x42", "fits", + "Golden Ruler", "Packs", "3.0 in the MXFP4 element E2M1 is 0x5", "0x5", "0x5", "fits", + "Golden Ruler", "Packs", "3.0 in GF16 is 0x4100", "0x4100", "0x4100", "fits", + "Golden Ruler", "Packs", "3.0 has no E8M0 code: E8M0 holds powers of two only", "none", "none", "fits", + "Golden Ruler", "Anchor", "phi^2 + phi^-2 = L_2 = 3", "3", "3", "fits", + "Golden Ruler", "Abstract", "the packs are cross-validated against ml_dtypes 0.5.4", "-", "-", "not checkable", + "TNF", "Table 1", "2^-(M+1) matches the printed M at all 8 rungs", "8", "8", "fits", + "TNF", "Table 1 vs Sec. 10", "the printed M equals the adopted M = N - 1 - Et at all 8 rungs (Sec. 10: all rungs satisfy 1 + Et + M = N)", "8", "2", "does not fit", + "TNF", "Eq. (1)", "TNF16 value = (1 + M/2^9) 2^e: a 9-bit mantissa, where 1 + 4 + M = 16 needs 11", "9", "11", "does not fit", + "TNF", "Sec. 2", "four balanced trits give e in [-40, 40]", "40", "40", "fits", + "TNF", "Sec. 2", "four balanced trits give 3^4 = 81 exponent steps", "81", "81", "fits", + "TNF", "Sec. 3", "error constant (1/2) ln 2 = 0.3466 for a uniform significand", "0.3466", "0.3466", "fits", + "TNF", "Sec. 3", "error constant 1/(4 ln 2) = 0.3607 for a logarithmic significand", "0.3607", "0.3607", "fits", + "TNF", "Table 10", "bits = ceil(Et log2 3) at all 7 rows", "7", "7", "fits", + "TNF", "Table 10", "efficiency 3^Et / 2^bits to 0.1% at all 7 rows", "7", "7", "fits", + "TNF", "Table 11", "k = N - (1 + Et + M) at all 10 rows", "10", "10", "fits", + "TNF", "Table 11", "reconciled M = N - 1 - Et at all 9 rows, equal to the repo tnf*.t27", "9", "9", "fits", + "TNF", "Sec. 17", "ternary radix economy 3/ln 3 sits 0.46% above e/ln e", "0.46%", "0.46%", "fits", + "TNF", "Sec. 17", "binary radix economy 2/ln 2 sits 6.15% above e/ln e", "6.15%", "6.15%", "fits", + "TNF", "Cor. 18", "kappa(3)/kappa(2) = 1.683 with kappa(r) = (r-1)^2 / (r ln r)", "1.683", "1.682", "does not fit", + "TNF", "Sec. 17", "kappa(3)/kappa(2) = 1.68", "1.68", "1.68", "fits", + "TNF", "Cor. 26", "1 - log3 2 = 0.3691", "0.3691", "0.3691", "fits", + "TNF", "Table 22", "E* = ceil(log2 b) at all 4 percentiles", "4", "4", "fits", + "TNF", "Sec. 17", "the family F_N has N - 3 members (N = 16: 13)", "13", "13", "fits", + "TNF", "Table 24", "the GF-T column follows Et = round((N-1)/phi^2) at all 9 rungs", "9", "1", "does not fit", + "TNF", "Table 24", "GF-T and TNF give the same layout at 8 of 9 rungs (by their rules: golden GF-T against reconciled TNF)", "8", "1", "does not fit", + "TNF", "Table 24 vs Sec. 10", "the TNF column obeys 1 + Et + M = N at all 9 rungs (Sec. 10)", "9", "3", "does not fit", + "TNF", "Table 23", "BNF8 is E = 3, M = 4 (the repo bnf8.t27 is E = 5, M = 2)", "3", "5", "does not fit", + "TNF", "Table 23", "magnitude counts 129 / 109 / 73 for GF8, GF-T8, TNF8", "-", "-", "not checkable", + "t27 repo", "gft*.t27", "the repo GF-T rungs follow Et = round((N-1)/phi^2) at all 9 rungs", "9", "9", "fits", + "t27 repo", "tnf*.t27, bnf*.t27", "every repo TNF and BNF rung obeys 1 + E + M = N (9 TNF, 8 BNF)", "17", "17", "fits" +]; +pub const K_TABLE_COLS : u8 = 6; +pub const K_TABLE_ROWS : u8 = 45; +pub const K_TABLE_CELLS : u16 = 270; + +; --- The verdict counts, per paper: GoldenFloat, Golden Ruler, TNF, t27 repo ------------------- +pub const K_FITS : [4]u8 = [9, 8, 15, 2]; +pub const K_MISFITS : [4]u8 = [0, 1, 7, 0]; +pub const K_UNCHECKED : [4]u8 = [1, 1, 1, 0]; +pub const K_ROWS_PER_PAPER : [4]u8 = [10, 10, 23, 2]; +pub const K_FITS_ALL : u8 = 34; +pub const K_MISFITS_ALL : u8 = 8; +pub const K_UNCHECKED_ALL : u8 = 3; + +; --- The diagram and the note ---------------------------------------------------------------- +pub const SAY_FLOW_TITLE : str = "How each printed number is checked"; +pub const SAY_FLOW_STEPS : [4]str = ["the number as printed", "the rule the paper states", "exact u64 arithmetic in paper_claims.t27", "fits, does not fit, or not checkable"]; +pub const SAY_NOTE : str = "No floating point anywhere: square roots are integer square roots, constants are series sums at scale 1e12, and three-digit values are rounded half to even. A claim the paper gives no rule for is not checkable, never fits. Run it yourself: tri papers, or the MCP tool t27_paper_claims."; + +test the_cells_fill_whole_rows { + assert K_TABLE_ROWS * K_TABLE_COLS == K_TABLE_CELLS; +} + +test every_paper_adds_up { + assert K_FITS[0] + K_MISFITS[0] + K_UNCHECKED[0] == K_ROWS_PER_PAPER[0]; + assert K_FITS[1] + K_MISFITS[1] + K_UNCHECKED[1] == K_ROWS_PER_PAPER[1]; + assert K_FITS[2] + K_MISFITS[2] + K_UNCHECKED[2] == K_ROWS_PER_PAPER[2]; + assert K_FITS[3] + K_MISFITS[3] + K_UNCHECKED[3] == K_ROWS_PER_PAPER[3]; +} + +test the_totals_are_the_rows { + assert K_FITS[0] + K_FITS[1] + K_FITS[2] + K_FITS[3] == K_FITS_ALL; + assert K_MISFITS[0] + K_MISFITS[1] + K_MISFITS[2] + K_MISFITS[3] == K_MISFITS_ALL; + assert K_UNCHECKED[0] + K_UNCHECKED[1] + K_UNCHECKED[2] + K_UNCHECKED[3] == K_UNCHECKED_ALL; + assert K_FITS_ALL + K_MISFITS_ALL + K_UNCHECKED_ALL == K_TABLE_ROWS; +} diff --git a/apps/website/src/lib/course.generated.ts b/apps/website/src/lib/course.generated.ts index 3c3fb75ca8..200b150166 100644 --- a/apps/website/src/lib/course.generated.ts +++ b/apps/website/src/lib/course.generated.ts @@ -1,5 +1,5 @@ // GENERATED by scripts/course-from-spec.mjs from specs/course/courses.t27, specs/course/t27-basics.t27, specs/course/course.t27, specs/course/ai-numbers.t27, specs/course/goldenfloat.t27, specs/course/verify-hardware.t27, specs/course/clocks-and-cdc.t27, specs/course/buses-and-peripherals.t27, specs/course/ternary-computing.t27, specs/course/arithmetic-and-dsp.t27 and their Russian bundles -// spec sha256 t27-basics 4827f6b9f5d95ae98e1d49f037966d2cc826e07c691044f2f5fa1ee9c98ae474, course 8429472829c5d9a0782b2d2b21ff26879a429c5470f4abb5088f1e1a7fa674be, ai-numbers 7f736e357ef13446dfa8f978482cc28c7710caac3f7396769a8fc01b91e20802, goldenfloat d6b6019b8e6bf77a41991b32a3a3d1b5eb78ca4b7078e2bf5f5436df3dd7c59c, verify-hardware 7ca437575eaa8f8646f42c82b75862f091fb509708de152c4e18ed76ee39d4cf, clocks-and-cdc 7d491967f9326fcde194ab19a9bfa7f0ed960ba94d7ca3d82df0747e269c5acc, buses-and-peripherals 4dfdbd8c909d7ad8f1ac2d4f7025c77f0619ade92b181212ea9b589262695acc, ternary-computing e0a14010163f00208d5b54c800e6ce3f05e6b8581de94c0323097b00b1854437, arithmetic-and-dsp c2b6bfd642e88caadaff9da965ac49172b389427b574b27d4c64145851bc206d +// spec sha256 t27-basics 4827f6b9f5d95ae98e1d49f037966d2cc826e07c691044f2f5fa1ee9c98ae474, course 8429472829c5d9a0782b2d2b21ff26879a429c5470f4abb5088f1e1a7fa674be, ai-numbers 7f736e357ef13446dfa8f978482cc28c7710caac3f7396769a8fc01b91e20802, goldenfloat 72dcbaaf0e0519e7190ec95773c8a7229106b416c3cf2e0ae03a52e371ae56f2, verify-hardware 7ca437575eaa8f8646f42c82b75862f091fb509708de152c4e18ed76ee39d4cf, clocks-and-cdc 7d491967f9326fcde194ab19a9bfa7f0ed960ba94d7ca3d82df0747e269c5acc, buses-and-peripherals 4dfdbd8c909d7ad8f1ac2d4f7025c77f0619ade92b181212ea9b589262695acc, ternary-computing e0a14010163f00208d5b54c800e6ce3f05e6b8581de94c0323097b00b1854437, arithmetic-and-dsp c2b6bfd642e88caadaff9da965ac49172b389427b574b27d4c64145851bc206d // Do not edit: change the .t27 source (or a Russian bundle) and regenerate. export const COURSES = [ @@ -3762,7 +3762,7 @@ export const COURSES = [ "publicSpec": "public/learn/goldenfloat.t27", "ruContract": "specs/course/goldenfloat-ru.t27", "ruBundle": "apps/website/i18n/goldenfloat.ru.json", - "sha256": "d6b6019b8e6bf77a41991b32a3a3d1b5eb78ca4b7078e2bf5f5436df3dd7c59c", + "sha256": "72dcbaaf0e0519e7190ec95773c8a7229106b416c3cf2e0ae03a52e371ae56f2", "schemaVersion": 1, "gallery": "specs/widgets/gallery.t27" }, @@ -4015,7 +4015,16 @@ export const COURSES = [ "preview": "widgets/golden-split/index.html?embed=1", "height": 640 }, - "also": [], + "also": [ + { + "id": "paper-claims", + "kind": "tool", + "title": "Three format papers, 45 printed numbers, recomputed exactly", + "url": "https://t27.ai/widgets/paper-claims/", + "preview": "widgets/paper-claims/index.html?embed=1", + "height": 640 + } + ], "spec": { "path": "specs/numeric/goldenfloat_family.t27", "source": "t27/files/specs/numeric/goldenfloat_family.t27", diff --git a/apps/website/src/lib/queenWidgets.generated.ts b/apps/website/src/lib/queenWidgets.generated.ts index e3cfbfac81..dc9adf67bc 100644 --- a/apps/website/src/lib/queenWidgets.generated.ts +++ b/apps/website/src/lib/queenWidgets.generated.ts @@ -1,12 +1,12 @@ // GENERATED by scripts/widgets-from-spec.mjs from specs/widgets/gallery.t27 -// spec sha256 0e72eea319b09e2a1d9ad2a4875f01334baf8cb056a64461be511ecf93df8cb1 +// spec sha256 46d708baa5746ee7c0cc91ed549932a877592371df3ceb572989cf0296abe64f // Do not edit: change the .t27 source and regenerate. export const QUEEN_WIDGETS = { "source": { "spec": "specs/widgets/gallery.t27", "publicSpec": "public/widgets/gallery.t27", - "sha256": "0e72eea319b09e2a1d9ad2a4875f01334baf8cb056a64461be511ecf93df8cb1", + "sha256": "46d708baa5746ee7c0cc91ed549932a877592371df3ceb572989cf0296abe64f", "schemaVersion": 1 }, "name": "t27 widgets", @@ -4555,6 +4555,23 @@ export const QUEEN_WIDGETS = { "iframe": "<iframe src=\"https://t27.ai/widgets/tc-tiny-layer/?embed=1\" width=\"640\" height=\"460\" loading=\"lazy\" style=\"border:0\" title=\"A layer of three ternary neurons\"></iframe>", "markdown": "[![A layer of three ternary neurons](https://t27.ai/widgets/tc-tiny-layer/card.png?v=3727a8a18457)](https://t27.ai/widgets/tc-tiny-layer/)" }, + { + "id": "paper-claims", + "kind": "tool", + "category": "compiler", + "hook": "45 numbers from three format papers, recomputed in exact integers. 34 fit. 8 do not.", + "title": "Three format papers, 45 printed numbers, recomputed exactly", + "line": "Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked.", + "url": "https://t27.ai/widgets/paper-claims/", + "view": null, + "image": "https://t27.ai/widgets/paper-claims/card.png?v=21be18ba1bba", + "gif": null, + "preview": "widgets/paper-claims/index.html?embed=1", + "commands": [], + "recorded": null, + "iframe": "<iframe src=\"https://t27.ai/widgets/paper-claims/?embed=1\" width=\"640\" height=\"460\" loading=\"lazy\" style=\"border:0\" title=\"Three format papers, 45 printed numbers, recomputed exactly\"></iframe>", + "markdown": "[![Three format papers, 45 printed numbers, recomputed exactly](https://t27.ai/widgets/paper-claims/card.png?v=21be18ba1bba)](https://t27.ai/widgets/paper-claims/)" + }, { "id": "wars", "kind": "tab", From d5ac24bf008be1d92cd694e85a543b4c1acdcbbb Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Sun, 18 Oct 2026 18:16:19 +0700 Subject: [PATCH 3/9] blog: forty-five-printed-numbers, the paper-claims results with two tables and two figures (EN + RU) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- .../blog/bodies/forty-five-printed-numbers.ts | 224 ++++++++++++++++++ apps/website/src/data/blog/index.ts | 31 +++ apps/website/src/data/blog/posts.ts | 2 + 3 files changed, 257 insertions(+) create mode 100644 apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts diff --git a/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts b/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts new file mode 100644 index 0000000000..83517d8d9e --- /dev/null +++ b/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts @@ -0,0 +1,224 @@ +import type { Block } from '../types' + +// Every number here is one row of gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392, +// PR #10401), as returned by the t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23) on the Railway +// lab, t27c 0.5.2: 45 rows, 34 fit, 8 do not, 3 not checkable; test-report 10 of 10, 0 vacuous. +// The figures are static SVG strings: no drawing code. + +const FIG_VERDICTS_EN = + '<svg viewBox="0 0 720 250" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Verdicts per paper. GoldenFloat: 9 fit, 0 do not, 1 not checkable. Golden Ruler: 8, 1, 1. TNF: 15, 7, 1. t27 repo tables: 2, 0, 0." style="width:100%;height:auto;font-family:inherit">' + + '<rect x="160" y="10" width="14" height="14" fill="#ffd700"/><text x="180" y="22" font-size="13" fill="currentColor">fits</text>' + + '<rect x="236" y="10" width="14" height="14" fill="#ff5c5c"/><text x="256" y="22" font-size="13" fill="currentColor">does not fit</text>' + + '<rect x="360" y="10" width="14" height="14" fill="currentColor" fill-opacity="0.35"/><text x="380" y="22" font-size="13" fill="currentColor">not checkable</text>' + + '<text x="10" y="70" font-size="14" fill="currentColor">GoldenFloat</text>' + + '<rect x="160" y="50" width="162" height="28" fill="#ffd700"/><rect x="322" y="50" width="18" height="28" fill="currentColor" fill-opacity="0.35"/>' + + '<text x="352" y="70" font-size="13" fill="currentColor" fill-opacity="0.8">9 / 0 / 1</text>' + + '<text x="10" y="120" font-size="14" fill="currentColor">Golden Ruler</text>' + + '<rect x="160" y="100" width="144" height="28" fill="#ffd700"/><rect x="304" y="100" width="18" height="28" fill="#ff5c5c"/><rect x="322" y="100" width="18" height="28" fill="currentColor" fill-opacity="0.35"/>' + + '<text x="352" y="120" font-size="13" fill="currentColor" fill-opacity="0.8">8 / 1 / 1</text>' + + '<text x="10" y="170" font-size="14" fill="currentColor">TNF</text>' + + '<rect x="160" y="150" width="270" height="28" fill="#ffd700"/><rect x="430" y="150" width="126" height="28" fill="#ff5c5c"/><rect x="556" y="150" width="18" height="28" fill="currentColor" fill-opacity="0.35"/>' + + '<text x="586" y="170" font-size="13" fill="currentColor" fill-opacity="0.8">15 / 7 / 1</text>' + + '<text x="10" y="220" font-size="14" fill="currentColor">t27 repo</text>' + + '<rect x="160" y="200" width="36" height="28" fill="#ffd700"/>' + + '<text x="208" y="220" font-size="13" fill="currentColor" fill-opacity="0.8">2 / 0 / 0</text>' + + '<text x="10" y="246" font-size="12" fill="currentColor" fill-opacity="0.65">45 claims: 34 fit, 8 do not, 3 cannot be checked. One square is one claim.</text>' + + '</svg>' + +const FIG_VERDICTS_RU = + '<svg viewBox="0 0 720 250" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Вердикты по статьям. GoldenFloat: 9 подходят, 0 нет, 1 не проверить. Golden Ruler: 8, 1, 1. TNF: 15, 7, 1. Таблицы репозитория t27: 2, 0, 0." style="width:100%;height:auto;font-family:inherit">' + + '<rect x="160" y="10" width="14" height="14" fill="#ffd700"/><text x="180" y="22" font-size="13" fill="currentColor">подходит</text>' + + '<rect x="262" y="10" width="14" height="14" fill="#ff5c5c"/><text x="282" y="22" font-size="13" fill="currentColor">не подходит</text>' + + '<rect x="386" y="10" width="14" height="14" fill="currentColor" fill-opacity="0.35"/><text x="406" y="22" font-size="13" fill="currentColor">не проверить</text>' + + '<text x="10" y="70" font-size="14" fill="currentColor">GoldenFloat</text>' + + '<rect x="160" y="50" width="162" height="28" fill="#ffd700"/><rect x="322" y="50" width="18" height="28" fill="currentColor" fill-opacity="0.35"/>' + + '<text x="352" y="70" font-size="13" fill="currentColor" fill-opacity="0.8">9 / 0 / 1</text>' + + '<text x="10" y="120" font-size="14" fill="currentColor">Golden Ruler</text>' + + '<rect x="160" y="100" width="144" height="28" fill="#ffd700"/><rect x="304" y="100" width="18" height="28" fill="#ff5c5c"/><rect x="322" y="100" width="18" height="28" fill="currentColor" fill-opacity="0.35"/>' + + '<text x="352" y="120" font-size="13" fill="currentColor" fill-opacity="0.8">8 / 1 / 1</text>' + + '<text x="10" y="170" font-size="14" fill="currentColor">TNF</text>' + + '<rect x="160" y="150" width="270" height="28" fill="#ffd700"/><rect x="430" y="150" width="126" height="28" fill="#ff5c5c"/><rect x="556" y="150" width="18" height="28" fill="currentColor" fill-opacity="0.35"/>' + + '<text x="586" y="170" font-size="13" fill="currentColor" fill-opacity="0.8">15 / 7 / 1</text>' + + '<text x="10" y="220" font-size="14" fill="currentColor">репозиторий t27</text>' + + '<rect x="160" y="200" width="36" height="28" fill="#ffd700"/>' + + '<text x="208" y="220" font-size="13" fill="currentColor" fill-opacity="0.8">2 / 0 / 0</text>' + + '<text x="10" y="246" font-size="12" fill="currentColor" fill-opacity="0.65">45 утверждений: 34 подходят, 8 нет, 3 не проверить. Один квадрат — одно утверждение.</text>' + + '</svg>' + +const FIG_FLOW_EN = + '<svg viewBox="0 0 720 96" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="How a number is checked: the number as printed, then the rule the paper states, then exact u64 arithmetic in paper_claims.t27, then a verdict: fits, does not fit, or not checkable." style="width:100%;height:auto;font-family:inherit">' + + '<rect x="10" y="18" width="156" height="60" rx="10" fill="none" stroke="currentColor" stroke-opacity="0.6"/><text x="88" y="44" font-size="13" text-anchor="middle" fill="currentColor">the number</text><text x="88" y="62" font-size="13" text-anchor="middle" fill="currentColor">as printed</text>' + + '<text x="183" y="53" font-size="16" text-anchor="middle" fill="currentColor">→</text>' + + '<rect x="200" y="18" width="156" height="60" rx="10" fill="none" stroke="currentColor" stroke-opacity="0.6"/><text x="278" y="44" font-size="13" text-anchor="middle" fill="currentColor">the rule</text><text x="278" y="62" font-size="13" text-anchor="middle" fill="currentColor">the paper states</text>' + + '<text x="373" y="53" font-size="16" text-anchor="middle" fill="currentColor">→</text>' + + '<rect x="390" y="18" width="156" height="60" rx="10" fill="none" stroke="#ffd700" stroke-width="2"/><text x="468" y="44" font-size="13" text-anchor="middle" fill="currentColor">exact u64 arithmetic</text><text x="468" y="62" font-size="13" text-anchor="middle" fill="currentColor">in paper_claims.t27</text>' + + '<text x="563" y="53" font-size="16" text-anchor="middle" fill="currentColor">→</text>' + + '<rect x="580" y="18" width="130" height="60" rx="10" fill="none" stroke="currentColor" stroke-opacity="0.6"/><text x="645" y="44" font-size="13" text-anchor="middle" fill="currentColor">fits, does not fit,</text><text x="645" y="62" font-size="13" text-anchor="middle" fill="currentColor">or not checkable</text>' + + '</svg>' + +const FIG_FLOW_RU = + '<svg viewBox="0 0 720 96" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Как проверяется число: число, как напечатано, затем правило из самой статьи, затем точная арифметика u64 в paper_claims.t27, затем вердикт: подходит, не подходит или не проверить." style="width:100%;height:auto;font-family:inherit">' + + '<rect x="10" y="18" width="156" height="60" rx="10" fill="none" stroke="currentColor" stroke-opacity="0.6"/><text x="88" y="44" font-size="13" text-anchor="middle" fill="currentColor">число,</text><text x="88" y="62" font-size="13" text-anchor="middle" fill="currentColor">как напечатано</text>' + + '<text x="183" y="53" font-size="16" text-anchor="middle" fill="currentColor">→</text>' + + '<rect x="200" y="18" width="156" height="60" rx="10" fill="none" stroke="currentColor" stroke-opacity="0.6"/><text x="278" y="44" font-size="13" text-anchor="middle" fill="currentColor">правило</text><text x="278" y="62" font-size="13" text-anchor="middle" fill="currentColor">из самой статьи</text>' + + '<text x="373" y="53" font-size="16" text-anchor="middle" fill="currentColor">→</text>' + + '<rect x="390" y="18" width="156" height="60" rx="10" fill="none" stroke="#ffd700" stroke-width="2"/><text x="468" y="44" font-size="13" text-anchor="middle" fill="currentColor">точная арифметика u64</text><text x="468" y="62" font-size="13" text-anchor="middle" fill="currentColor">в paper_claims.t27</text>' + + '<text x="563" y="53" font-size="16" text-anchor="middle" fill="currentColor">→</text>' + + '<rect x="580" y="18" width="130" height="60" rx="10" fill="none" stroke="currentColor" stroke-opacity="0.6"/><text x="645" y="44" font-size="13" text-anchor="middle" fill="currentColor">подходит, нет</text><text x="645" y="62" font-size="13" text-anchor="middle" fill="currentColor">или не проверить</text>' + + '</svg>' + +export const body: Block[] = [ + { + kind: 'p', + text: 'Three papers describe number formats that t27 implements: GoldenFloat (arXiv:2606.05017), the Golden Ruler catalog (arXiv:2606.09686), and the TNF paper on formats with a ternary exponent. We took every number in them that follows from a rule the paper itself states and put it into one t27 spec, **specs/numeric/paper_claims.t27**. The spec recomputes each number with exact 64-bit integer arithmetic and gives a verdict. Of 45 claims, **34 fit, 8 do not, and 3 cannot be checked**.', + }, + { + kind: 'figure', + svg: FIG_VERDICTS_EN, + caption: 'One row per paper, one square per claim. The two t27 repo rows are sums over the repository\'s own format tables, which the TNF paper compares itself against. Source: t27_paper_claims, called once with no filter on the Railway lab, t27c 0.5.2.', + }, + { kind: 'h', text: 'How a number is checked' }, + { + kind: 'p', + text: 'The spec uses no floating point at all. Square roots are integer square roots; ln 2, ln 3 and phi are series sums at scale 10^12; a value printed to three or four digits is rounded half to even at that digit before it is compared. A claim fits only if the recomputed value equals the printed one at the printed precision. If the paper gives no rule for a number (an FPGA run, a cross-check against another library, counts with no stated method), the claim is **not checkable**, and that never counts as fitting.', + }, + { + kind: 'figure', + svg: FIG_FLOW_EN, + caption: 'The four steps of every row. Only the third runs code, and that code is the t27 spec.', + }, + { kind: 'h', text: 'Per paper' }, + { + kind: 'table', + head: ['Paper', 'Claims', 'Fit', 'Do not fit', 'Not checkable'], + rows: [ + ['GoldenFloat, arXiv:2606.05017v5', '10', '9', '0', '1'], + ['Golden Ruler, arXiv:2606.09686v3', '10', '8', '1', '1'], + ['TNF paper, 2026-08-11', '23', '15', '7', '1'], + ['t27 repo format tables', '2', '2', '0', '0'], + ['All', '45', '34', '8', '3'], + ], + }, + { + kind: 'p', + text: '**GoldenFloat.** All nine numbers that can be checked fit: the exponent and mantissa split e = round((N-1)/phi^2) at all 17 widths, the printed (N-1)/phi^2 = 5.7295 for GF16, e = 391 for GF1024, the GF16 code 0x47C0 decoding to 30, and the look-elsewhere p = 83 / 80000 = 1.04e-3. The Lucas identity phi^(2n) + phi^(-2n) = L_(2n) is checked for n = 1 to 45, where u64 runs out; the paper checks it up to 256 at 500 digits. The 35 of 35 testbench vectors at 323 MHz is a hardware result and cannot be recomputed here.', + }, + { + kind: 'p', + text: '**Golden Ruler.** The five encodings of 3.0 fit: BF16 0x4040, FP8 E4M3 0x44, FP8 E5M2 0x42, the MXFP4 element E2M1 0x5, and GF16 0x4100. So does "no E8M0 code", because E8M0 holds only powers of two, and so does the count of 109 formats. The abstract says the 109 formats span 12 clusters; the catalog has 13.', + }, + { + kind: 'p', + text: '**TNF.** 15 of the 22 checkable numbers fit, among them the error constants (1/2) ln 2 = 0.3466 and 1/(4 ln 2) = 0.3607, the radix economy gaps 0.46% and 6.15%, 1 - log3 2 = 0.3691, the 81 exponent steps of four trits, and every row of Tables 10, 11 and 22. The seven that do not fit are below.', + }, + { kind: 'h', text: 'The eight that do not fit' }, + { + kind: 'table', + head: ['Paper', 'Where', 'Claim', 'Printed', 'Recomputed'], + rows: [ + ['Golden Ruler', 'Abstract', 'the 109 formats span this many clusters', '12', '13'], + ['TNF', 'Table 1 vs Sec. 10', 'rungs whose M equals the adopted M = N - 1 - Et', '8 of 8', '2 of 8'], + ['TNF', 'Eq. (1)', 'mantissa bits of TNF16, where 1 + 4 + M = 16', '9', '11'], + ['TNF', 'Cor. 18', 'kappa(3)/kappa(2), kappa(r) = (r-1)^2 / (r ln r)', '1.683', '1.682'], + ['TNF', 'Table 24', 'rungs where GF-T follows Et = round((N-1)/phi^2)', '9 of 9', '1 of 9'], + ['TNF', 'Table 24', 'rungs where GF-T and TNF give the same layout', '8 of 9', '1 of 9'], + ['TNF', 'Table 24 vs Sec. 10', 'rungs of the TNF column with 1 + Et + M = N', '9 of 9', '3 of 9'], + ['TNF', 'Table 23', 'exponent bits of BNF8 (the repo bnf8.t27 has E = 5, M = 2)', '3', '5'], + ], + }, + { + kind: 'p', + text: 'The kappa ratio is 8 ln 2 / (3 ln 3) = 1.68248, so 1.682 to three places; the paper prints 1.683 in one place and 1.68 in another, and the 1.68 fits. Four of the TNF misfits have the same shape: Section 10 adopts the rule M = N - 1 - Et for every rung, and Tables 1 and 24 do not follow it. Table 11, which carries the reconciled column, does: all nine of its rows fit and match the repository\'s tnf*.t27.', + }, + { kind: 'h', text: 'Run it yourself' }, + { + kind: 'code', + text: '# in a gHashTag/t27 checkout, with t27c built\ntri papers\n\n# or from any MCP client connected to t27-mcp\nt27_paper_claims {"paper": "tnf", "verdict": "misfit"}', + }, + { + kind: 'p', + text: 'tri papers runs the spec\'s test report: 10 tests, none vacuous. The MCP tool runs the same spec compiled to WebAssembly and can filter by paper and verdict. The widget at t27.ai/widgets/paper-claims shows all 45 rows, with the claim text for each, and is offered in the first lesson of the GoldenFloat course.', + }, + { + kind: 'p', + text: 'What this does not do: it does not judge the papers\' arguments, only the numbers a stated rule can reproduce. No paper has been revised yet. The three unchecked claims need their inputs published before anyone can check them: the testbench log, the ml_dtypes run, and how the Table 23 magnitudes were counted.', + }, +] + +export const ruBody: Block[] = [ + { + kind: 'p', + text: 'Три статьи описывают числовые форматы, которые реализует t27: GoldenFloat (arXiv:2606.05017), каталог Golden Ruler (arXiv:2606.09686) и статья TNF о форматах с троичной экспонентой. Мы взяли из них каждое число, которое следует из правила, сформулированного в самой статье, и собрали все такие числа в одну спецификацию t27 — **specs/numeric/paper_claims.t27**. Она пересчитывает каждое число в точной 64-битной целочисленной арифметике и выносит вердикт. Из 45 утверждений **34 подходят, 8 не подходят, 3 проверить нельзя**.', + }, + { + kind: 'figure', + svg: FIG_VERDICTS_RU, + caption: 'Строка — статья, квадрат — утверждение. Две строки репозитория t27 — суммы по собственным таблицам форматов, с которыми сравнивает себя статья TNF. Источник: t27_paper_claims, один вызов без фильтра на лаборатории Railway, t27c 0.5.2.', + }, + { kind: 'h', text: 'Как проверяется число' }, + { + kind: 'p', + text: 'Плавающей точки в спецификации нет вовсе. Квадратные корни — целочисленные; ln 2, ln 3 и phi — суммы рядов в масштабе 10^12; значение, напечатанное с тремя или четырьмя знаками, перед сравнением округляется до этого знака, половина — к чётному. Утверждение подходит, только если пересчёт совпадает с напечатанным при напечатанной точности. Если статья не даёт правила для числа (прогон на FPGA, сверка с другой библиотекой, подсчёты без описанного метода), утверждение **не проверить**, и это никогда не засчитывается как совпадение.', + }, + { + kind: 'figure', + svg: FIG_FLOW_RU, + caption: 'Четыре шага каждой строки. Код выполняет только третий, и этот код — спецификация t27.', + }, + { kind: 'h', text: 'По статьям' }, + { + kind: 'table', + head: ['Статья', 'Утверждений', 'Подходят', 'Не подходят', 'Не проверить'], + rows: [ + ['GoldenFloat, arXiv:2606.05017v5', '10', '9', '0', '1'], + ['Golden Ruler, arXiv:2606.09686v3', '10', '8', '1', '1'], + ['Статья TNF, 2026-08-11', '23', '15', '7', '1'], + ['Таблицы форматов репозитория t27', '2', '2', '0', '0'], + ['Всего', '45', '34', '8', '3'], + ], + }, + { + kind: 'p', + text: '**GoldenFloat.** Подходят все девять проверяемых чисел: разбиение на экспоненту и мантиссу e = round((N-1)/phi^2) на всех 17 ширинах, напечатанное (N-1)/phi^2 = 5.7295 для GF16, e = 391 для GF1024, код GF16 0x47C0, который декодируется в 30, и поправка на множественные сравнения p = 83 / 80000 = 1.04e-3. Тождество Люка phi^(2n) + phi^(-2n) = L_(2n) проверено для n от 1 до 45 — дальше u64 не хватает; статья проверяет его до 256 с точностью 500 знаков. 35 из 35 тестовых векторов на 323 МГц — аппаратный результат, пересчитать его здесь нельзя.', + }, + { + kind: 'p', + text: '**Golden Ruler.** Подходят все пять кодировок 3.0: BF16 0x4040, FP8 E4M3 0x44, FP8 E5M2 0x42, элемент MXFP4 E2M1 0x5 и GF16 0x4100. Подходит и «кода в E8M0 нет» — E8M0 хранит только степени двойки, — и число форматов, 109. В аннотации сказано, что 109 форматов делятся на 12 кластеров; в каталоге их 13.', + }, + { + kind: 'p', + text: '**TNF.** Подходят 15 из 22 проверяемых чисел, среди них константы ошибки (1/2) ln 2 = 0.3466 и 1/(4 ln 2) = 0.3607, отставание по экономичности системы счисления 0.46% и 6.15%, 1 - log3 2 = 0.3691, 81 шаг экспоненты из четырёх тритов и каждая строка таблиц 10, 11 и 22. Семь неподходящих — ниже.', + }, + { kind: 'h', text: 'Восемь, которые не подходят' }, + { + kind: 'table', + head: ['Статья', 'Где', 'Утверждение', 'Напечатано', 'Пересчитано'], + rows: [ + ['Golden Ruler', 'Аннотация', 'число кластеров, на которые делятся 109 форматов', '12', '13'], + ['TNF', 'Табл. 1 против разд. 10', 'ступени, где M равно принятому M = N - 1 - Et', '8 из 8', '2 из 8'], + ['TNF', 'Ур. (1)', 'бит мантиссы у TNF16, где 1 + 4 + M = 16', '9', '11'], + ['TNF', 'След. 18', 'kappa(3)/kappa(2), kappa(r) = (r-1)^2 / (r ln r)', '1.683', '1.682'], + ['TNF', 'Табл. 24', 'ступени, где GF-T следует Et = round((N-1)/phi^2)', '9 из 9', '1 из 9'], + ['TNF', 'Табл. 24', 'ступени, где у GF-T и TNF одинаковая раскладка', '8 из 9', '1 из 9'], + ['TNF', 'Табл. 24 против разд. 10', 'ступени столбца TNF с 1 + Et + M = N', '9 из 9', '3 из 9'], + ['TNF', 'Табл. 23', 'бит экспоненты у BNF8 (в репозитории bnf8.t27: E = 5, M = 2)', '3', '5'], + ], + }, + { + kind: 'p', + text: 'Отношение kappa равно 8 ln 2 / (3 ln 3) = 1.68248, то есть 1.682 с тремя знаками; статья печатает 1.683 в одном месте и 1.68 в другом, и 1.68 подходит. Четыре несовпадения в TNF устроены одинаково: раздел 10 принимает правило M = N - 1 - Et для каждой ступени, а таблицы 1 и 24 ему не следуют. Таблица 11 со сверенным столбцом следует: все девять её строк подходят и совпадают с tnf*.t27 из репозитория.', + }, + { kind: 'h', text: 'Проверьте сами' }, + { + kind: 'code', + text: '# in a gHashTag/t27 checkout, with t27c built\ntri papers\n\n# or from any MCP client connected to t27-mcp\nt27_paper_claims {"paper": "tnf", "verdict": "misfit"}', + }, + { + kind: 'p', + text: 'tri papers запускает отчёт по тестам спецификации: 10 тестов, ни одного пустого. Инструмент MCP выполняет ту же спецификацию, скомпилированную в WebAssembly, и фильтрует по статье и вердикту. Виджет t27.ai/widgets/paper-claims показывает все 45 строк с текстом каждого утверждения; он предложен в первом уроке курса GoldenFloat.', + }, + { + kind: 'p', + text: 'Чего здесь нет: оценки аргументов статей — только числа, которые воспроизводит сформулированное правило. Ни одна статья пока не исправлена. Для трёх непроверенных утверждений нужно сначала опубликовать исходные данные: журнал тестового стенда, прогон ml_dtypes и способ, которым считались величины в таблице 23.', + }, +] diff --git a/apps/website/src/data/blog/index.ts b/apps/website/src/data/blog/index.ts index 77f37996f0..d6d649bac2 100644 --- a/apps/website/src/data/blog/index.ts +++ b/apps/website/src/data/blog/index.ts @@ -2,6 +2,37 @@ import type { PostMeta } from './types' /** Индекс блога: список и метаданные без тяжёлых тел публикаций. */ export const postsIndex: PostMeta[] = [ + { + slug: "forty-five-printed-numbers", + title: "45 numbers from three format papers, recomputed: 34 fit, 8 do not", + summary: "[only numbers that follow from a rule the paper states; this checks arithmetic, not the arguments; u64 stops the Lucas check at n = 45] One t27 spec, specs/numeric/paper_claims.t27 in gHashTag/t27, recomputes 45 numbers printed in the GoldenFloat paper (arXiv:2606.05017), the Golden Ruler catalog (arXiv:2606.09686) and the TNF paper, in exact integers with no floating point. 34 fit, 8 do not, 3 cannot be checked. Golden Ruler says 12 clusters where its catalog has 13; seven TNF numbers miss, four of them because Tables 1 and 24 do not follow the M = N - 1 - Et rule Section 10 adopts. tri papers and the MCP tool t27_paper_claims run the same spec.", + date: "2026-10-18", + readingMinutes: 4, + tags: ["t27", "GoldenFloat", "Verification"], + receipts: [ + { label: "t27#10401: specs/numeric/paper_claims.t27 and tri papers", href: "https://github.com/gHashTag/t27/pull/10401" }, + { label: "t27#10392: the issue", href: "https://github.com/gHashTag/t27/issues/10392" }, + { label: "t27-mcp#23: the t27_paper_claims tool", href: "https://github.com/gHashTag/t27-mcp/pull/23" }, + { label: "The widget: all 45 rows", href: "https://t27.ai/widgets/paper-claims/" }, + { label: "arXiv:2606.05017 (GoldenFloat)", href: "https://arxiv.org/abs/2606.05017" }, + { label: "arXiv:2606.09686 (Golden Ruler)", href: "https://arxiv.org/abs/2606.09686" }, + ], + openQuestions: [ + "The Lucas identity is checked only to n = 45; going to the paper's 256 needs big integers in t27.", + "Three claims stay unchecked until their inputs are published: the testbench log, the ml_dtypes run, the Table 23 counting method.", + "No paper has been revised yet; the misfits are reported, not corrected.", + ], + published: true, + ru: { + title: "45 чисел из трёх статей о форматах, пересчитаны: 34 подходят, 8 нет", + summary: "[только числа, которые следуют из правила, сформулированного в самой статье; проверяется арифметика, а не аргументы; u64 останавливает проверку Люка на n = 45] Одна спецификация t27, specs/numeric/paper_claims.t27 в gHashTag/t27, пересчитывает 45 чисел, напечатанных в статье GoldenFloat (arXiv:2606.05017), каталоге Golden Ruler (arXiv:2606.09686) и статье TNF, в точных целых числах без плавающей точки. 34 подходят, 8 нет, 3 проверить нельзя. Golden Ruler пишет о 12 кластерах, а в каталоге их 13; семь чисел TNF не сходятся, четыре из них потому, что таблицы 1 и 24 не следуют правилу M = N - 1 - Et, принятому в разделе 10. tri papers и инструмент MCP t27_paper_claims запускают ту же спецификацию.", + openQuestions: [ + "Тождество Люка проверено только до n = 45; чтобы дойти до 256, как в статье, в t27 нужны длинные целые.", + "Три утверждения остаются непроверенными, пока не опубликованы исходные данные: журнал тестового стенда, прогон ml_dtypes, способ подсчёта в таблице 23.", + "Ни одна статья пока не исправлена; несовпадения названы, но не исправлены.", + ], + }, + }, { slug: "a-wasm-interpreter-ran-on-the-board", title: "A WASM interpreter ran on the board: 134 of 134, from a spec", diff --git a/apps/website/src/data/blog/posts.ts b/apps/website/src/data/blog/posts.ts index f0cb43ab98..d4fe86f990 100644 --- a/apps/website/src/data/blog/posts.ts +++ b/apps/website/src/data/blog/posts.ts @@ -112,8 +112,10 @@ import { body as body_clocks_resets_and_cdc, ruBody as ruBody_clocks_resets_and_ import { body as body_real_value_in_integer_container, ruBody as ruBody_real_value_in_integer_container } from './bodies/real-value-in-integer-container' import { body as body_features_that_change_no_bits, ruBody as ruBody_features_that_change_no_bits } from './bodies/features-that-change-no-bits' import { body as body_one_commit_nine_workflow_outcomes, ruBody as ruBody_one_commit_nine_workflow_outcomes } from './bodies/one-commit-nine-workflow-outcomes' +import { body as body_forty_five_printed_numbers, ruBody as ruBody_forty_five_printed_numbers } from './bodies/forty-five-printed-numbers' const bodies: Record<string, PostBody> = { + 'forty-five-printed-numbers': { body: body_forty_five_printed_numbers, ruBody: ruBody_forty_five_printed_numbers }, 'a-wasm-interpreter-ran-on-the-board': { body: body_a_wasm_interpreter_ran_on_the_board, ruBody: ruBody_a_wasm_interpreter_ran_on_the_board }, 'a-3-mb-compiler-spec-to-aarch64-in-5-ms': { body: body_a_3_mb_compiler_spec_to_aarch64_in_5_ms, ruBody: ruBody_a_3_mb_compiler_spec_to_aarch64_in_5_ms }, 'actors-beat-the-loop-on-recovery-not-everywhere': { body: body_actors_beat_the_loop_on_recovery_not_everywhere, ruBody: ruBody_actors_beat_the_loop_on_recovery_not_everywhere }, From 8a59b1299a685b217c46f5153bb5d8eff9c706ba Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Sun, 18 Oct 2026 18:19:06 +0700 Subject: [PATCH 4/9] blog: forty-five-printed-numbers links its issue (Refs #1689) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/src/data/blog/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/website/src/data/blog/index.ts b/apps/website/src/data/blog/index.ts index d6d649bac2..f33646d1ae 100644 --- a/apps/website/src/data/blog/index.ts +++ b/apps/website/src/data/blog/index.ts @@ -14,6 +14,7 @@ export const postsIndex: PostMeta[] = [ { label: "t27#10392: the issue", href: "https://github.com/gHashTag/t27/issues/10392" }, { label: "t27-mcp#23: the t27_paper_claims tool", href: "https://github.com/gHashTag/t27-mcp/pull/23" }, { label: "The widget: all 45 rows", href: "https://t27.ai/widgets/paper-claims/" }, + { label: "trinity#1689: the widget and this post", href: "https://github.com/gHashTag/trinity/issues/1689" }, { label: "arXiv:2606.05017 (GoldenFloat)", href: "https://arxiv.org/abs/2606.05017" }, { label: "arXiv:2606.09686 (Golden Ruler)", href: "https://arxiv.org/abs/2606.09686" }, ], From b59eac1755ff0d02f013301bb9f395a103b12c24 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Sun, 18 Oct 2026 18:26:39 +0700 Subject: [PATCH 5/9] paper-claims: claim 10 and the post no longer state the withdrawn GF16 clock (Refs #1689, gHashTag/t27#10418) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/specs/widgets/paper-claims.t27 | 2 +- .../src/data/blog/bodies/forty-five-printed-numbers.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/website/specs/widgets/paper-claims.t27 b/apps/website/specs/widgets/paper-claims.t27 index 6f1770067f..8c6e0e79c3 100644 --- a/apps/website/specs/widgets/paper-claims.t27 +++ b/apps/website/specs/widgets/paper-claims.t27 @@ -36,7 +36,7 @@ pub const SAY_TABLE_CELLS : [270]str = [ "GoldenFloat", "GF16 anchor", "GF16 code 0x47C0 (e = 6, f = 9, bias 31) decodes to 30", "30", "30", "fits", "GoldenFloat", "GF16 anchor", "30 = 1^2 + 2^2 + 3^2 + 4^2, the dot4 anchor", "30", "30", "fits", "GoldenFloat", "Look-elsewhere", "p = K / N_s = 83 / 80000 = 1.04e-3", "1.04e-3", "1.04e-3", "fits", - "GoldenFloat", "Abstract", "35 of 35 testbench vectors at 323 MHz on an XC7A35T", "35", "-", "not checkable", + "GoldenFloat", "Abstract", "35 of 35 testbench vectors pass; the clock printed beside them is withdrawn (RESEARCH_CLAIMS.md, Retraction 2026-08-18)", "35", "-", "not checkable", "Golden Ruler", "Abstract", "the catalog holds 109 formats", "109", "109", "fits", "Golden Ruler", "Abstract", "the 109 formats span 12 clusters", "12", "13", "does not fit", "Golden Ruler", "Packs", "3.0 in BF16 is 0x4040", "0x4040", "0x4040", "fits", diff --git a/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts b/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts index 83517d8d9e..22d0cd65cb 100644 --- a/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts +++ b/apps/website/src/data/blog/bodies/forty-five-printed-numbers.ts @@ -101,7 +101,7 @@ export const body: Block[] = [ }, { kind: 'p', - text: '**GoldenFloat.** All nine numbers that can be checked fit: the exponent and mantissa split e = round((N-1)/phi^2) at all 17 widths, the printed (N-1)/phi^2 = 5.7295 for GF16, e = 391 for GF1024, the GF16 code 0x47C0 decoding to 30, and the look-elsewhere p = 83 / 80000 = 1.04e-3. The Lucas identity phi^(2n) + phi^(-2n) = L_(2n) is checked for n = 1 to 45, where u64 runs out; the paper checks it up to 256 at 500 digits. The 35 of 35 testbench vectors at 323 MHz is a hardware result and cannot be recomputed here.', + text: '**GoldenFloat.** All nine numbers that can be checked fit: the exponent and mantissa split e = round((N-1)/phi^2) at all 17 widths, the printed (N-1)/phi^2 = 5.7295 for GF16, e = 391 for GF1024, the GF16 code 0x47C0 decoding to 30, and the look-elsewhere p = 83 / 80000 = 1.04e-3. The Lucas identity phi^(2n) + phi^(-2n) = L_(2n) is checked for n = 1 to 45, where u64 runs out; the paper checks it up to 256 at 500 digits. The 35 of 35 testbench vectors are a hardware result and cannot be recomputed here. The clock frequency the abstract prints beside them was withdrawn by t27 itself on 2026-08-18 (RESEARCH_CLAIMS.md): it is the toggle rate of a ring oscillator, not a path through GF16 arithmetic, and the paper still carries it.', }, { kind: 'p', @@ -179,7 +179,7 @@ export const ruBody: Block[] = [ }, { kind: 'p', - text: '**GoldenFloat.** Подходят все девять проверяемых чисел: разбиение на экспоненту и мантиссу e = round((N-1)/phi^2) на всех 17 ширинах, напечатанное (N-1)/phi^2 = 5.7295 для GF16, e = 391 для GF1024, код GF16 0x47C0, который декодируется в 30, и поправка на множественные сравнения p = 83 / 80000 = 1.04e-3. Тождество Люка phi^(2n) + phi^(-2n) = L_(2n) проверено для n от 1 до 45 — дальше u64 не хватает; статья проверяет его до 256 с точностью 500 знаков. 35 из 35 тестовых векторов на 323 МГц — аппаратный результат, пересчитать его здесь нельзя.', + text: '**GoldenFloat.** Подходят все девять проверяемых чисел: разбиение на экспоненту и мантиссу e = round((N-1)/phi^2) на всех 17 ширинах, напечатанное (N-1)/phi^2 = 5.7295 для GF16, e = 391 для GF1024, код GF16 0x47C0, который декодируется в 30, и поправка на множественные сравнения p = 83 / 80000 = 1.04e-3. Тождество Люка phi^(2n) + phi^(-2n) = L_(2n) проверено для n от 1 до 45 — дальше u64 не хватает; статья проверяет его до 256 с точностью 500 знаков. 35 из 35 тестовых векторов — аппаратный результат, пересчитать его здесь нельзя. Тактовую частоту, которую аннотация печатает рядом с ними, сам t27 отозвал 2026-08-18 (RESEARCH_CLAIMS.md): это частота переключения кольцевого генератора, а не путь через арифметику GF16, и в статье она всё ещё стоит.', }, { kind: 'p', From 7e0382f06c1e01a36621e6ee9b9e709643aee0ed Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Sun, 18 Oct 2026 18:27:39 +0700 Subject: [PATCH 6/9] paper-claims: regenerate the widget page after the claim 10 change (Refs #1689) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/public/widgets/paper-claims/index.html | 4 ++-- apps/website/public/widgets/paper-claims/paper-claims.t27 | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/website/public/widgets/paper-claims/index.html b/apps/website/public/widgets/paper-claims/index.html index c28595e362..df6958e9e8 100644 --- a/apps/website/public/widgets/paper-claims/index.html +++ b/apps/website/public/widgets/paper-claims/index.html @@ -1,5 +1,5 @@ <!doctype html> -<!-- Generated by scripts/widget-pages-from-spec.mjs from specs/widgets/paper-claims.t27 (sha256 db9c3e9839ebe00e); do not edit. --> +<!-- Generated by scripts/widget-pages-from-spec.mjs from specs/widgets/paper-claims.t27 (sha256 9d5580455c28fbc9); do not edit. --> <html lang="en"> <head> <meta charset="utf-8"> @@ -41,7 +41,7 @@ <h1>Three format papers, 45 printed numbers, recomputed exactly</h1> <details><summary>Where the numbers come from</summary><ul><li>gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392): t27c 0.5.2 test-report on the Railway lab, 10 of 10 tests pass, 0 vacuous; tri papers runs the same spec</li><li>The t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23), wasm generated from that spec with t27c gen-c and zig 0.16.0, called once on the lab with no filter; every row below is one row of its answer</li><li>The papers: arXiv:2606.05017v5 (GoldenFloat), arXiv:2606.09686v3 (Golden Ruler), and the TNF paper by Dmitrii Vasilev, 2026-08-11</li></ul></details> <p><a href="./paper-claims.t27" target="_blank" rel="noopener">This widget's .t27 source</a> · <a href="../../#/queen?tab=widgets" target="_top">All widgets</a></p> </footer> -<script>window.T27_WIDGET={"KIND":"widget-tool","ID":"paper-claims","TITLE":"Three format papers, 45 printed numbers, recomputed exactly","DESCRIPTION":"Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked.","IMAGE_ALT":"A table of 45 claims from three papers. GoldenFloat: 9 fit, 1 not checkable. Golden Ruler: 8 fit, 1 does not fit (12 clusters printed, the catalog has 13), 1 not checkable. TNF: 15 fit, 7 do not fit, 1 not checkable. Two sums over the t27 repo tables fit.","HOOK":"45 numbers from three format papers, recomputed in exact integers. 34 fit. 8 do not.","CATEGORY":"compiler","DATA_SOURCES":["gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392): t27c 0.5.2 test-report on the Railway lab, 10 of 10 tests pass, 0 vacuous; tri papers runs the same spec","The t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23), wasm generated from that spec with t27c gen-c and zig 0.16.0, called once on the lab with no filter; every row below is one row of its answer","The papers: arXiv:2606.05017v5 (GoldenFloat), arXiv:2606.09686v3 (Golden Ruler), and the TNF paper by Dmitrii Vasilev, 2026-08-11"],"READS_LOCAL_FILES":false,"SENDS_NOTHING":true,"SAY_TABLE_CAPTION":"45 printed numbers and what exact integer arithmetic gives","SAY_TABLE_HEAD":["Paper","Where","Claim","Printed","Recomputed","Verdict"],"SAY_TABLE_CELLS":["GoldenFloat","Table 1","e = round((N-1)/phi^2), f = N-1-e gives the printed (e, f) at all 17 widths","17","17","fits","GoldenFloat","Table 1","(N-1)/phi^2 to four decimals, as printed, at all 17 widths","17","17","fits","GoldenFloat","Table 1","GF16: e = 6","6","6","fits","GoldenFloat","Table 1","GF1024: e = 391","391","391","fits","GoldenFloat","Table 1","GF16: (N-1)/phi^2 = 5.7295","5.7295","5.7295","fits","GoldenFloat","Abstract","phi^(2n) + phi^(-2n) = L_(2n) for n = 1..45 (the paper claims 1..256 at 500 digits; u64 stops at 45)","45","45","fits","GoldenFloat","GF16 anchor","GF16 code 0x47C0 (e = 6, f = 9, bias 31) decodes to 30","30","30","fits","GoldenFloat","GF16 anchor","30 = 1^2 + 2^2 + 3^2 + 4^2, the dot4 anchor","30","30","fits","GoldenFloat","Look-elsewhere","p = K / N_s = 83 / 80000 = 1.04e-3","1.04e-3","1.04e-3","fits","GoldenFloat","Abstract","35 of 35 testbench vectors at 323 MHz on an XC7A35T","35","-","not checkable","Golden Ruler","Abstract","the catalog holds 109 formats","109","109","fits","Golden Ruler","Abstract","the 109 formats span 12 clusters","12","13","does not fit","Golden Ruler","Packs","3.0 in BF16 is 0x4040","0x4040","0x4040","fits","Golden Ruler","Packs","3.0 in FP8 E4M3 is 0x44","0x44","0x44","fits","Golden Ruler","Packs","3.0 in FP8 E5M2 is 0x42","0x42","0x42","fits","Golden Ruler","Packs","3.0 in the MXFP4 element E2M1 is 0x5","0x5","0x5","fits","Golden Ruler","Packs","3.0 in GF16 is 0x4100","0x4100","0x4100","fits","Golden Ruler","Packs","3.0 has no E8M0 code: E8M0 holds powers of two only","none","none","fits","Golden Ruler","Anchor","phi^2 + phi^-2 = L_2 = 3","3","3","fits","Golden Ruler","Abstract","the packs are cross-validated against ml_dtypes 0.5.4","-","-","not checkable","TNF","Table 1","2^-(M+1) matches the printed M at all 8 rungs","8","8","fits","TNF","Table 1 vs Sec. 10","the printed M equals the adopted M = N - 1 - Et at all 8 rungs (Sec. 10: all rungs satisfy 1 + Et + M = N)","8","2","does not fit","TNF","Eq. (1)","TNF16 value = (1 + M/2^9) 2^e: a 9-bit mantissa, where 1 + 4 + M = 16 needs 11","9","11","does not fit","TNF","Sec. 2","four balanced trits give e in [-40, 40]","40","40","fits","TNF","Sec. 2","four balanced trits give 3^4 = 81 exponent steps","81","81","fits","TNF","Sec. 3","error constant (1/2) ln 2 = 0.3466 for a uniform significand","0.3466","0.3466","fits","TNF","Sec. 3","error constant 1/(4 ln 2) = 0.3607 for a logarithmic significand","0.3607","0.3607","fits","TNF","Table 10","bits = ceil(Et log2 3) at all 7 rows","7","7","fits","TNF","Table 10","efficiency 3^Et / 2^bits to 0.1% at all 7 rows","7","7","fits","TNF","Table 11","k = N - (1 + Et + M) at all 10 rows","10","10","fits","TNF","Table 11","reconciled M = N - 1 - Et at all 9 rows, equal to the repo tnf*.t27","9","9","fits","TNF","Sec. 17","ternary radix economy 3/ln 3 sits 0.46% above e/ln e","0.46%","0.46%","fits","TNF","Sec. 17","binary radix economy 2/ln 2 sits 6.15% above e/ln e","6.15%","6.15%","fits","TNF","Cor. 18","kappa(3)/kappa(2) = 1.683 with kappa(r) = (r-1)^2 / (r ln r)","1.683","1.682","does not fit","TNF","Sec. 17","kappa(3)/kappa(2) = 1.68","1.68","1.68","fits","TNF","Cor. 26","1 - log3 2 = 0.3691","0.3691","0.3691","fits","TNF","Table 22","E* = ceil(log2 b) at all 4 percentiles","4","4","fits","TNF","Sec. 17","the family F_N has N - 3 members (N = 16: 13)","13","13","fits","TNF","Table 24","the GF-T column follows Et = round((N-1)/phi^2) at all 9 rungs","9","1","does not fit","TNF","Table 24","GF-T and TNF give the same layout at 8 of 9 rungs (by their rules: golden GF-T against reconciled TNF)","8","1","does not fit","TNF","Table 24 vs Sec. 10","the TNF column obeys 1 + Et + M = N at all 9 rungs (Sec. 10)","9","3","does not fit","TNF","Table 23","BNF8 is E = 3, M = 4 (the repo bnf8.t27 is E = 5, M = 2)","3","5","does not fit","TNF","Table 23","magnitude counts 129 / 109 / 73 for GF8, GF-T8, TNF8","-","-","not checkable","t27 repo","gft*.t27","the repo GF-T rungs follow Et = round((N-1)/phi^2) at all 9 rungs","9","9","fits","t27 repo","tnf*.t27, bnf*.t27","every repo TNF and BNF rung obeys 1 + E + M = N (9 TNF, 8 BNF)","17","17","fits"],"K_TABLE_COLS":6,"K_TABLE_ROWS":45,"K_TABLE_CELLS":270,"K_FITS":[9,8,15,2],"K_MISFITS":[0,1,7,0],"K_UNCHECKED":[1,1,1,0],"K_ROWS_PER_PAPER":[10,10,23,2],"K_FITS_ALL":34,"K_MISFITS_ALL":8,"K_UNCHECKED_ALL":3,"SAY_FLOW_TITLE":"How each printed number is checked","SAY_FLOW_STEPS":["the number as printed","the rule the paper states","exact u64 arithmetic in paper_claims.t27","fits, does not fit, or not checkable"],"SAY_NOTE":"No floating point anywhere: square roots are integer square roots, constants are series sums at scale 1e12, and three-digit values are rounded half to even. A claim the paper gives no rule for is not checkable, never fits. Run it yourself: tri papers, or the MCP tool t27_paper_claims."}</script> +<script>window.T27_WIDGET={"KIND":"widget-tool","ID":"paper-claims","TITLE":"Three format papers, 45 printed numbers, recomputed exactly","DESCRIPTION":"Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked.","IMAGE_ALT":"A table of 45 claims from three papers. GoldenFloat: 9 fit, 1 not checkable. Golden Ruler: 8 fit, 1 does not fit (12 clusters printed, the catalog has 13), 1 not checkable. TNF: 15 fit, 7 do not fit, 1 not checkable. Two sums over the t27 repo tables fit.","HOOK":"45 numbers from three format papers, recomputed in exact integers. 34 fit. 8 do not.","CATEGORY":"compiler","DATA_SOURCES":["gHashTag/t27 specs/numeric/paper_claims.t27 (gHashTag/t27#10392): t27c 0.5.2 test-report on the Railway lab, 10 of 10 tests pass, 0 vacuous; tri papers runs the same spec","The t27 MCP tool t27_paper_claims (gHashTag/t27-mcp#23), wasm generated from that spec with t27c gen-c and zig 0.16.0, called once on the lab with no filter; every row below is one row of its answer","The papers: arXiv:2606.05017v5 (GoldenFloat), arXiv:2606.09686v3 (Golden Ruler), and the TNF paper by Dmitrii Vasilev, 2026-08-11"],"READS_LOCAL_FILES":false,"SENDS_NOTHING":true,"SAY_TABLE_CAPTION":"45 printed numbers and what exact integer arithmetic gives","SAY_TABLE_HEAD":["Paper","Where","Claim","Printed","Recomputed","Verdict"],"SAY_TABLE_CELLS":["GoldenFloat","Table 1","e = round((N-1)/phi^2), f = N-1-e gives the printed (e, f) at all 17 widths","17","17","fits","GoldenFloat","Table 1","(N-1)/phi^2 to four decimals, as printed, at all 17 widths","17","17","fits","GoldenFloat","Table 1","GF16: e = 6","6","6","fits","GoldenFloat","Table 1","GF1024: e = 391","391","391","fits","GoldenFloat","Table 1","GF16: (N-1)/phi^2 = 5.7295","5.7295","5.7295","fits","GoldenFloat","Abstract","phi^(2n) + phi^(-2n) = L_(2n) for n = 1..45 (the paper claims 1..256 at 500 digits; u64 stops at 45)","45","45","fits","GoldenFloat","GF16 anchor","GF16 code 0x47C0 (e = 6, f = 9, bias 31) decodes to 30","30","30","fits","GoldenFloat","GF16 anchor","30 = 1^2 + 2^2 + 3^2 + 4^2, the dot4 anchor","30","30","fits","GoldenFloat","Look-elsewhere","p = K / N_s = 83 / 80000 = 1.04e-3","1.04e-3","1.04e-3","fits","GoldenFloat","Abstract","35 of 35 testbench vectors pass; the clock printed beside them is withdrawn (RESEARCH_CLAIMS.md, Retraction 2026-08-18)","35","-","not checkable","Golden Ruler","Abstract","the catalog holds 109 formats","109","109","fits","Golden Ruler","Abstract","the 109 formats span 12 clusters","12","13","does not fit","Golden Ruler","Packs","3.0 in BF16 is 0x4040","0x4040","0x4040","fits","Golden Ruler","Packs","3.0 in FP8 E4M3 is 0x44","0x44","0x44","fits","Golden Ruler","Packs","3.0 in FP8 E5M2 is 0x42","0x42","0x42","fits","Golden Ruler","Packs","3.0 in the MXFP4 element E2M1 is 0x5","0x5","0x5","fits","Golden Ruler","Packs","3.0 in GF16 is 0x4100","0x4100","0x4100","fits","Golden Ruler","Packs","3.0 has no E8M0 code: E8M0 holds powers of two only","none","none","fits","Golden Ruler","Anchor","phi^2 + phi^-2 = L_2 = 3","3","3","fits","Golden Ruler","Abstract","the packs are cross-validated against ml_dtypes 0.5.4","-","-","not checkable","TNF","Table 1","2^-(M+1) matches the printed M at all 8 rungs","8","8","fits","TNF","Table 1 vs Sec. 10","the printed M equals the adopted M = N - 1 - Et at all 8 rungs (Sec. 10: all rungs satisfy 1 + Et + M = N)","8","2","does not fit","TNF","Eq. (1)","TNF16 value = (1 + M/2^9) 2^e: a 9-bit mantissa, where 1 + 4 + M = 16 needs 11","9","11","does not fit","TNF","Sec. 2","four balanced trits give e in [-40, 40]","40","40","fits","TNF","Sec. 2","four balanced trits give 3^4 = 81 exponent steps","81","81","fits","TNF","Sec. 3","error constant (1/2) ln 2 = 0.3466 for a uniform significand","0.3466","0.3466","fits","TNF","Sec. 3","error constant 1/(4 ln 2) = 0.3607 for a logarithmic significand","0.3607","0.3607","fits","TNF","Table 10","bits = ceil(Et log2 3) at all 7 rows","7","7","fits","TNF","Table 10","efficiency 3^Et / 2^bits to 0.1% at all 7 rows","7","7","fits","TNF","Table 11","k = N - (1 + Et + M) at all 10 rows","10","10","fits","TNF","Table 11","reconciled M = N - 1 - Et at all 9 rows, equal to the repo tnf*.t27","9","9","fits","TNF","Sec. 17","ternary radix economy 3/ln 3 sits 0.46% above e/ln e","0.46%","0.46%","fits","TNF","Sec. 17","binary radix economy 2/ln 2 sits 6.15% above e/ln e","6.15%","6.15%","fits","TNF","Cor. 18","kappa(3)/kappa(2) = 1.683 with kappa(r) = (r-1)^2 / (r ln r)","1.683","1.682","does not fit","TNF","Sec. 17","kappa(3)/kappa(2) = 1.68","1.68","1.68","fits","TNF","Cor. 26","1 - log3 2 = 0.3691","0.3691","0.3691","fits","TNF","Table 22","E* = ceil(log2 b) at all 4 percentiles","4","4","fits","TNF","Sec. 17","the family F_N has N - 3 members (N = 16: 13)","13","13","fits","TNF","Table 24","the GF-T column follows Et = round((N-1)/phi^2) at all 9 rungs","9","1","does not fit","TNF","Table 24","GF-T and TNF give the same layout at 8 of 9 rungs (by their rules: golden GF-T against reconciled TNF)","8","1","does not fit","TNF","Table 24 vs Sec. 10","the TNF column obeys 1 + Et + M = N at all 9 rungs (Sec. 10)","9","3","does not fit","TNF","Table 23","BNF8 is E = 3, M = 4 (the repo bnf8.t27 is E = 5, M = 2)","3","5","does not fit","TNF","Table 23","magnitude counts 129 / 109 / 73 for GF8, GF-T8, TNF8","-","-","not checkable","t27 repo","gft*.t27","the repo GF-T rungs follow Et = round((N-1)/phi^2) at all 9 rungs","9","9","fits","t27 repo","tnf*.t27, bnf*.t27","every repo TNF and BNF rung obeys 1 + E + M = N (9 TNF, 8 BNF)","17","17","fits"],"K_TABLE_COLS":6,"K_TABLE_ROWS":45,"K_TABLE_CELLS":270,"K_FITS":[9,8,15,2],"K_MISFITS":[0,1,7,0],"K_UNCHECKED":[1,1,1,0],"K_ROWS_PER_PAPER":[10,10,23,2],"K_FITS_ALL":34,"K_MISFITS_ALL":8,"K_UNCHECKED_ALL":3,"SAY_FLOW_TITLE":"How each printed number is checked","SAY_FLOW_STEPS":["the number as printed","the rule the paper states","exact u64 arithmetic in paper_claims.t27","fits, does not fit, or not checkable"],"SAY_NOTE":"No floating point anywhere: square roots are integer square roots, constants are series sums at scale 1e12, and three-digit values are rounded half to even. A claim the paper gives no rule for is not checkable, never fits. Run it yourself: tri papers, or the MCP tool t27_paper_claims."}</script> <script type="module" src="./tool.js?v=5ed0683d6108"></script> </body> </html> diff --git a/apps/website/public/widgets/paper-claims/paper-claims.t27 b/apps/website/public/widgets/paper-claims/paper-claims.t27 index 6f1770067f..8c6e0e79c3 100644 --- a/apps/website/public/widgets/paper-claims/paper-claims.t27 +++ b/apps/website/public/widgets/paper-claims/paper-claims.t27 @@ -36,7 +36,7 @@ pub const SAY_TABLE_CELLS : [270]str = [ "GoldenFloat", "GF16 anchor", "GF16 code 0x47C0 (e = 6, f = 9, bias 31) decodes to 30", "30", "30", "fits", "GoldenFloat", "GF16 anchor", "30 = 1^2 + 2^2 + 3^2 + 4^2, the dot4 anchor", "30", "30", "fits", "GoldenFloat", "Look-elsewhere", "p = K / N_s = 83 / 80000 = 1.04e-3", "1.04e-3", "1.04e-3", "fits", - "GoldenFloat", "Abstract", "35 of 35 testbench vectors at 323 MHz on an XC7A35T", "35", "-", "not checkable", + "GoldenFloat", "Abstract", "35 of 35 testbench vectors pass; the clock printed beside them is withdrawn (RESEARCH_CLAIMS.md, Retraction 2026-08-18)", "35", "-", "not checkable", "Golden Ruler", "Abstract", "the catalog holds 109 formats", "109", "109", "fits", "Golden Ruler", "Abstract", "the 109 formats span 12 clusters", "12", "13", "does not fit", "Golden Ruler", "Packs", "3.0 in BF16 is 0x4040", "0x4040", "0x4040", "fits", From bc70aa665ffb86e38f6092ad9855e3666c27e358 Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Mon, 19 Oct 2026 09:59:48 +0700 Subject: [PATCH 7/9] t27t-savings: put the constant first in every assert An assert that starts with a parenthesis is read by t27c as assert(...) followed by a bare binary expression, so runSpecTests refused 36 of them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/specs/widgets/t27t-savings.t27 | 72 ++++++++++----------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/apps/website/specs/widgets/t27t-savings.t27 b/apps/website/specs/widgets/t27t-savings.t27 index 5493393c01..6c740e0a83 100644 --- a/apps/website/specs/widgets/t27t-savings.t27 +++ b/apps/website/specs/widgets/t27t-savings.t27 @@ -66,51 +66,51 @@ test the_cells_fill_whole_rows { } test every_saving_is_f_times_one_minus_one_over_s { - assert (2000 * (K_S_E2[0] - 100) + K_F_DEN[0] * K_S_E2[0]) / (2 * K_F_DEN[0] * K_S_E2[0]) == K_SAVING_E3[0]; - assert (2000 * (K_S_E2[1] - 100) + K_F_DEN[0] * K_S_E2[1]) / (2 * K_F_DEN[0] * K_S_E2[1]) == K_SAVING_E3[1]; - assert (2000 * (K_S_E2[2] - 100) + K_F_DEN[0] * K_S_E2[2]) / (2 * K_F_DEN[0] * K_S_E2[2]) == K_SAVING_E3[2]; - assert (2000 * (K_S_E2[0] - 100) + K_F_DEN[1] * K_S_E2[0]) / (2 * K_F_DEN[1] * K_S_E2[0]) == K_SAVING_E3[3]; - assert (2000 * (K_S_E2[1] - 100) + K_F_DEN[1] * K_S_E2[1]) / (2 * K_F_DEN[1] * K_S_E2[1]) == K_SAVING_E3[4]; - assert (2000 * (K_S_E2[2] - 100) + K_F_DEN[1] * K_S_E2[2]) / (2 * K_F_DEN[1] * K_S_E2[2]) == K_SAVING_E3[5]; - assert (2000 * (K_S_E2[0] - 100) + K_F_DEN[2] * K_S_E2[0]) / (2 * K_F_DEN[2] * K_S_E2[0]) == K_SAVING_E3[6]; - assert (2000 * (K_S_E2[1] - 100) + K_F_DEN[2] * K_S_E2[1]) / (2 * K_F_DEN[2] * K_S_E2[1]) == K_SAVING_E3[7]; - assert (2000 * (K_S_E2[2] - 100) + K_F_DEN[2] * K_S_E2[2]) / (2 * K_F_DEN[2] * K_S_E2[2]) == K_SAVING_E3[8]; - assert (2000 * (K_S_E2[0] - 100) + K_F_DEN[3] * K_S_E2[0]) / (2 * K_F_DEN[3] * K_S_E2[0]) == K_SAVING_E3[9]; - assert (2000 * (K_S_E2[1] - 100) + K_F_DEN[3] * K_S_E2[1]) / (2 * K_F_DEN[3] * K_S_E2[1]) == K_SAVING_E3[10]; - assert (2000 * (K_S_E2[2] - 100) + K_F_DEN[3] * K_S_E2[2]) / (2 * K_F_DEN[3] * K_S_E2[2]) == K_SAVING_E3[11]; + assert K_SAVING_E3[0] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[0] * K_S_E2[0]) / (2 * K_F_DEN[0] * K_S_E2[0]); + assert K_SAVING_E3[1] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[0] * K_S_E2[1]) / (2 * K_F_DEN[0] * K_S_E2[1]); + assert K_SAVING_E3[2] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[0] * K_S_E2[2]) / (2 * K_F_DEN[0] * K_S_E2[2]); + assert K_SAVING_E3[3] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[1] * K_S_E2[0]) / (2 * K_F_DEN[1] * K_S_E2[0]); + assert K_SAVING_E3[4] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[1] * K_S_E2[1]) / (2 * K_F_DEN[1] * K_S_E2[1]); + assert K_SAVING_E3[5] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[1] * K_S_E2[2]) / (2 * K_F_DEN[1] * K_S_E2[2]); + assert K_SAVING_E3[6] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[2] * K_S_E2[0]) / (2 * K_F_DEN[2] * K_S_E2[0]); + assert K_SAVING_E3[7] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[2] * K_S_E2[1]) / (2 * K_F_DEN[2] * K_S_E2[1]); + assert K_SAVING_E3[8] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[2] * K_S_E2[2]) / (2 * K_F_DEN[2] * K_S_E2[2]); + assert K_SAVING_E3[9] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[3] * K_S_E2[0]) / (2 * K_F_DEN[3] * K_S_E2[0]); + assert K_SAVING_E3[10] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[3] * K_S_E2[1]) / (2 * K_F_DEN[3] * K_S_E2[1]); + assert K_SAVING_E3[11] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[3] * K_S_E2[2]) / (2 * K_F_DEN[3] * K_S_E2[2]); } test every_dollar_figure_is_its_saving_rounded { - assert (K_SAVING_E3[0] + 5) / 10 == K_DOLLARS_PER_100[0]; - assert (K_SAVING_E3[1] + 5) / 10 == K_DOLLARS_PER_100[1]; - assert (K_SAVING_E3[2] + 5) / 10 == K_DOLLARS_PER_100[2]; - assert (K_SAVING_E3[3] + 5) / 10 == K_DOLLARS_PER_100[3]; - assert (K_SAVING_E3[4] + 5) / 10 == K_DOLLARS_PER_100[4]; - assert (K_SAVING_E3[5] + 5) / 10 == K_DOLLARS_PER_100[5]; - assert (K_SAVING_E3[6] + 5) / 10 == K_DOLLARS_PER_100[6]; - assert (K_SAVING_E3[7] + 5) / 10 == K_DOLLARS_PER_100[7]; - assert (K_SAVING_E3[8] + 5) / 10 == K_DOLLARS_PER_100[8]; - assert (K_SAVING_E3[9] + 5) / 10 == K_DOLLARS_PER_100[9]; - assert (K_SAVING_E3[10] + 5) / 10 == K_DOLLARS_PER_100[10]; - assert (K_SAVING_E3[11] + 5) / 10 == K_DOLLARS_PER_100[11]; + assert K_DOLLARS_PER_100[0] == (K_SAVING_E3[0] + 5) / 10; + assert K_DOLLARS_PER_100[1] == (K_SAVING_E3[1] + 5) / 10; + assert K_DOLLARS_PER_100[2] == (K_SAVING_E3[2] + 5) / 10; + assert K_DOLLARS_PER_100[3] == (K_SAVING_E3[3] + 5) / 10; + assert K_DOLLARS_PER_100[4] == (K_SAVING_E3[4] + 5) / 10; + assert K_DOLLARS_PER_100[5] == (K_SAVING_E3[5] + 5) / 10; + assert K_DOLLARS_PER_100[6] == (K_SAVING_E3[6] + 5) / 10; + assert K_DOLLARS_PER_100[7] == (K_SAVING_E3[7] + 5) / 10; + assert K_DOLLARS_PER_100[8] == (K_SAVING_E3[8] + 5) / 10; + assert K_DOLLARS_PER_100[9] == (K_SAVING_E3[9] + 5) / 10; + assert K_DOLLARS_PER_100[10] == (K_SAVING_E3[10] + 5) / 10; + assert K_DOLLARS_PER_100[11] == (K_SAVING_E3[11] + 5) / 10; } test the_headline_range_is_the_estimated_rows { - assert (K_SAVING_E3[3] + 5) / 10 == K_LOW_PCT; - assert (K_SAVING_E3[8] + 5) / 10 == K_HIGH_PCT; + assert K_LOW_PCT == (K_SAVING_E3[3] + 5) / 10; + assert K_HIGH_PCT == (K_SAVING_E3[8] + 5) / 10; assert K_F_MEASURED == false; } test every_printed_int8_ratio_is_within_one_hundredth_of_the_times { - assert (K_T_BF16[0] * 200 + K_T_INT8_TC[0]) / (2 * K_T_INT8_TC[0]) <= K_X_INT8_TC_PRINTED[0] + 1; + assert K_X_INT8_TC_PRINTED[0] + 1 >= (K_T_BF16[0] * 200 + K_T_INT8_TC[0]) / (2 * K_T_INT8_TC[0]); assert K_X_INT8_TC_PRINTED[0] <= (K_T_BF16[0] * 200 + K_T_INT8_TC[0]) / (2 * K_T_INT8_TC[0]) + 1; - assert (K_T_BF16[1] * 200 + K_T_INT8_TC[1]) / (2 * K_T_INT8_TC[1]) <= K_X_INT8_TC_PRINTED[1] + 1; + assert K_X_INT8_TC_PRINTED[1] + 1 >= (K_T_BF16[1] * 200 + K_T_INT8_TC[1]) / (2 * K_T_INT8_TC[1]); assert K_X_INT8_TC_PRINTED[1] <= (K_T_BF16[1] * 200 + K_T_INT8_TC[1]) / (2 * K_T_INT8_TC[1]) + 1; - assert (K_T_BF16[2] * 200 + K_T_INT8_TC[2]) / (2 * K_T_INT8_TC[2]) <= K_X_INT8_TC_PRINTED[2] + 1; + assert K_X_INT8_TC_PRINTED[2] + 1 >= (K_T_BF16[2] * 200 + K_T_INT8_TC[2]) / (2 * K_T_INT8_TC[2]); assert K_X_INT8_TC_PRINTED[2] <= (K_T_BF16[2] * 200 + K_T_INT8_TC[2]) / (2 * K_T_INT8_TC[2]) + 1; - assert (K_T_BF16[3] * 200 + K_T_INT8_TC[3]) / (2 * K_T_INT8_TC[3]) <= K_X_INT8_TC_PRINTED[3] + 1; + assert K_X_INT8_TC_PRINTED[3] + 1 >= (K_T_BF16[3] * 200 + K_T_INT8_TC[3]) / (2 * K_T_INT8_TC[3]); assert K_X_INT8_TC_PRINTED[3] <= (K_T_BF16[3] * 200 + K_T_INT8_TC[3]) / (2 * K_T_INT8_TC[3]) + 1; - assert (K_T_BF16[4] * 200 + K_T_INT8_TC[4]) / (2 * K_T_INT8_TC[4]) <= K_X_INT8_TC_PRINTED[4] + 1; + assert K_X_INT8_TC_PRINTED[4] + 1 >= (K_T_BF16[4] * 200 + K_T_INT8_TC[4]) / (2 * K_T_INT8_TC[4]); assert K_X_INT8_TC_PRINTED[4] <= (K_T_BF16[4] * 200 + K_T_INT8_TC[4]) / (2 * K_T_INT8_TC[4]) + 1; } @@ -120,9 +120,9 @@ test dp4a_is_slower_than_bf16_on_every_shape { assert K_T_DP4A[2] > K_T_BF16[2]; assert K_T_DP4A[3] > K_T_BF16[3]; assert K_T_DP4A[4] > K_T_BF16[4]; - assert (K_T_BF16[0] * 200 + K_T_DP4A[0]) / (2 * K_T_DP4A[0]) == K_X_DP4A_PRINTED[0]; - assert (K_T_BF16[1] * 200 + K_T_DP4A[1]) / (2 * K_T_DP4A[1]) == K_X_DP4A_PRINTED[1]; - assert (K_T_BF16[2] * 200 + K_T_DP4A[2]) / (2 * K_T_DP4A[2]) == K_X_DP4A_PRINTED[2]; - assert (K_T_BF16[3] * 200 + K_T_DP4A[3]) / (2 * K_T_DP4A[3]) == K_X_DP4A_PRINTED[3]; - assert (K_T_BF16[4] * 200 + K_T_DP4A[4]) / (2 * K_T_DP4A[4]) == K_X_DP4A_PRINTED[4]; + assert K_X_DP4A_PRINTED[0] == (K_T_BF16[0] * 200 + K_T_DP4A[0]) / (2 * K_T_DP4A[0]); + assert K_X_DP4A_PRINTED[1] == (K_T_BF16[1] * 200 + K_T_DP4A[1]) / (2 * K_T_DP4A[1]); + assert K_X_DP4A_PRINTED[2] == (K_T_BF16[2] * 200 + K_T_DP4A[2]) / (2 * K_T_DP4A[2]); + assert K_X_DP4A_PRINTED[3] == (K_T_BF16[3] * 200 + K_T_DP4A[3]) / (2 * K_T_DP4A[3]); + assert K_X_DP4A_PRINTED[4] == (K_T_BF16[4] * 200 + K_T_DP4A[4]) / (2 * K_T_DP4A[4]); } From 4fd20e429ab74cef6f6191cc0b4b363fa5400d4c Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Mon, 19 Oct 2026 10:01:16 +0700 Subject: [PATCH 8/9] t27t-savings: keep DESCRIPTION under 200 characters Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/specs/widgets/t27t-savings.t27 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/website/specs/widgets/t27t-savings.t27 b/apps/website/specs/widgets/t27t-savings.t27 index 6c740e0a83..8a1b6ae90e 100644 --- a/apps/website/specs/widgets/t27t-savings.t27 +++ b/apps/website/specs/widgets/t27t-savings.t27 @@ -17,7 +17,7 @@ module widget_t27t_savings; pub const KIND : str = "widget-tool"; pub const ID : str = "t27t-savings"; pub const TITLE : str = "t27t run savings: int8 tensor cores forward, bf16 gradients"; -pub const DESCRIPTION : str = "What a training run saves when its forward GEMMs move to int8 tensor cores and its gradients stay in bf16: f x (1 - 1/s), 16% to 24%, or $16 to $24 of every $100. f, the share of step time spent in forward GEMMs, is still an estimate; nobody has measured it."; +pub const DESCRIPTION : str = "Forward GEMMs on int8 tensor cores, gradients in bf16: a run saves f x (1 - 1/s), 16% to 24%, or $16 to $24 of every $100. f, the share of a step in forward GEMMs, is not measured."; pub const IMAGE_ALT : str = "The t27t saving law f x (1 - 1/s). Measured on an RTX 4090: int8 tensor cores 2.9x to 3.5x bf16, dp4a 0.91x to 0.94x. With f between 1/4 and 1/3 a run saves 16% to 24%, $16 to $24 per $100. f is not measured."; pub const HOOK : str = "Forward GEMMs on int8 tensor cores, gradients in bf16: 16% to 24% off a training run. No custom CUDA backend. f is still an estimate."; pub const CATEGORY : str = "compiler"; From de8d0c1d25689f638e4292d644cd267a1f3f56eb Mon Sep 17 00:00:00 2001 From: Dmitrii Vasilev <admin@t27.ai> Date: Mon, 19 Oct 2026 10:03:37 +0700 Subject: [PATCH 9/9] t27t-savings: generated page, gallery and course; offer it in the LAMB lesson Regenerated on the Railway lab with widget-pages-from-spec, widgets-from-spec and course-from-spec; all three --check runs are up to date (520 widget spec tests, 1723 asserts hold). The courses must cover the whole gallery, so the lamb-and-large-batches lesson now offers t27t-savings. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --- apps/website/public/learn/neural-networks.t27 | 2 +- apps/website/public/widgets/gallery.t27 | 34 ++--- .../public/widgets/t27t-savings/index.html | 47 +++++++ .../widgets/t27t-savings/t27t-savings.t27 | 128 ++++++++++++++++++ apps/website/specs/course/neural-networks.t27 | 2 +- apps/website/src/lib/course.generated.ts | 25 +++- .../website/src/lib/queenWidgets.generated.ts | 38 +++++- 7 files changed, 251 insertions(+), 25 deletions(-) create mode 100644 apps/website/public/widgets/t27t-savings/index.html create mode 100644 apps/website/public/widgets/t27t-savings/t27t-savings.t27 diff --git a/apps/website/public/learn/neural-networks.t27 b/apps/website/public/learn/neural-networks.t27 index 1d004ddf19..d967bf9e59 100644 --- a/apps/website/public/learn/neural-networks.t27 +++ b/apps/website/public/learn/neural-networks.t27 @@ -171,7 +171,7 @@ pub const LESSON_ALSO : [27]str = [ "nn-sgd,nn-rmsprop,nn-lamb", "nn-xor,nn-lamb,tc-tiny-layer", "nn-backprop,nn-lamb,tc-tiny-layer", - "nn-adam,nn-xor,nn-backprop", + "nn-adam,nn-xor,nn-backprop,t27t-savings", "nn-lstm,nn-attention", "nn-rnn,nn-attention,nn-sigmoid", "nn-rnn,nn-lstm,nn-encoder", diff --git a/apps/website/public/widgets/gallery.t27 b/apps/website/public/widgets/gallery.t27 index 17117ac2a9..4b9ebb448b 100644 --- a/apps/website/public/widgets/gallery.t27 +++ b/apps/website/public/widgets/gallery.t27 @@ -78,15 +78,15 @@ pub const TOOL_NOSCRIPT : str = "This widget runs in your browser and needs Java ; Parallel arrays, WIDGET_COUNT long. WIDGET_TITLES is empty wherever the page carries an ; og:title, which is every kind but tab: the page is the one place the words live. A tool's ; WIDGET_HOOKS entry is empty too: its hook is the page's t27:hook, written from its own spec. -pub const WIDGET_COUNT : u16 = 279; -pub const WIDGET_IDS : [279]str = ["x7-board", "tri-x7-fasm", "tri-x7-mutate", "perf2-loop", "tri-fpga-rgmii", "tri-fpga-jtag", "tri-fpga-pins", "devkit-flow", "play-verilog", "bit-diff", "build-receipt", "cost-curves", "gf16-calc", "idcode", "lut-explain", "pin-map", "placement-map", "resource-bars", "slack-waterfall", "test-waves", "synth-smells", "bit-autopsy", "fasm-skyline", "vcd-wrapped", "fits-on", "stat-card", "lut-depth", "fsm-sketch", "lut-treemap", "t27-cell", "t27-vs-nvfp4", "uart-bucket", "tri-fpga-specs", "tri-fpga-tools", "tri-fpga-wire", "tri-fpga-batch", "tri-fpga-status", "tri-fpga-tmpcheck", "tri-fpga-keycheck", "tri-fpga-selftest", "tri-x7-refs", "tri-x7-audit", "t27c-clock-domain", "t27c-clocks", "t27c-wukong-v1", "t27c-cts", "t27c-mmcm", "t27c-mmcm-mutate", "t27c-timing", "t27c-reset-sync", "t27c-reset-sync-gen", "t27c-mtbf", "t27c-clock-domain-gen", "t27c-fifo", "t27c-fifo-mutate", "t27c-fifo-flags", "t27c-emitter-xdc", "t27c-fpga-rxcap", "t27-tri-competitors", "t27-tri-discard", "tri-fpga-txhold", "tri-fpga-rxcap", "tri-fpga-rxer", "tri-fpga-steps", "tri-fpga-ioclients", "tri-fpga-claim", "tri-fpga-release", "tri-fpga-next", "t27c-memory", "t27c-spi-tb", "t27c-check-uart", "t27c-check-spi", "t27c-check-apb", "t27c-check-axi4", "t27c-check-bridge", "t27c-check-memory", "t27c-verilog-uart", "t27c-verilog-spi", "t27c-verilog-apb", "t27c-verilog-axi4", "t27c-verilog-bridge", "t27c-verilog-top", "t27c-verilog-uart-tb", "t27c-verilog-apb-tb", "t27c-verilog-axi-tb", "t27c-verilog-mem-tb", "t27c-verilog-integration-tb", "t27c-verilog-top-tb", "t27c-verilog-spi-tb", "t27c-hir-uart", "t27c-hir-apb", "t27c-hir-axi4", "t27c-eth-crc", "t27c-rgmii", "jtag-verdict", "line-bounce", "eye-isi", "ecc-secded", "carry-chain", "prefix-adder", "csa-tree", "shift-add", "booth-radix4", "dsp-fit", "q-format", "round-sat", "sqnr", "cordic", "cordic-vector", "sine-table", "alias-fold", "nco", "dft-bin", "fir-response", "fir-design", "fir-cost", "decimator", "cic-growth", "polyphase", "fft-butterfly", "bit-reverse", "fft-scaling", "barker-corr", "fir-fit", "fir-on-board", "play-hello-world", "play-rust", "play-js", "t27c-hello-world", "t27-tri-misread", "test-touch", "t27c-stages", "t27c-e8m0", "play-e8m0", "t27c-ocp-mx", "play-gfternary", "t27c-gfternary", "play-golden-sieve", "t27c-golden-sieve", "play-tnf17", "t27c-tnf17", "t27c-activation-quantizer", "t27c-bitnet-majority", "t27c-bitnet-neuron-nchunk", "t27c-comb-ternary-dot", "t27c-stream-ternary-mac", "t27c-bitnet-mlp", "t27c-gft-smul", "t27c-gft-sadd", "t27c-gft-signed-mac", "t27c-gft-relu", "t27c-gft-exp2", "t27c-gft-argmax4", "t27c-gft-nll", "t27c-gft-sgd-step", "t27c-gft-xornet", "basics-what-a-spec-is", "basics-the-module-line", "basics-comments-and-prose", "basics-constants", "basics-whole-numbers", "basics-true-false-and-text", "basics-arrays", "basics-trits", "basics-expressions", "basics-a-test-block", "basics-many-tests", "basics-functions", "basics-local-names", "basics-if-and-else", "basics-loops", "basics-pub-or-private", "basics-structs", "basics-enums", "basics-use-other-modules", "basics-invariants", "basics-gen-ts", "basics-seven-backends", "basics-stages-of-t27c", "basics-tri-commands", "basics-reading-errors", "basics-a-small-program", "basics-where-next", "golden-split", "golden-phi-ratio", "golden-lucas", "golden-split-optimality", "golden-radix-economy", "golden-phi-in-gf16", "golden-gf4", "golden-gf6", "golden-gf8", "golden-gf10", "golden-gf12", "golden-gf14", "golden-gf16", "golden-dot-two", "golden-gf24", "golden-gf32", "golden-gf48", "golden-gf64", "golden-gf96", "golden-gf128", "golden-gf256", "golden-gf512", "golden-gf1024", "golden-gft8", "golden-gft16", "golden-gft32", "golden-decode", "t27-tri-vectors", "t27-tri-census", "t27-tri-seals", "t27-tri-prose", "t27-tri-lean", "tri-selftest", "play-terminal-gates", "tc-why-three", "tc-balanced-count", "tc-flip-and-cut", "tc-kleene-gates", "tc-consensus-any", "tc-sum-and-carry", "tc-half-adder", "tc-full-adder", "tc-ripple-carry", "tc-times-a-trit", "tc-long-multiply", "tc-ternary-mac", "tc-two-bits", "tc-five-in-a-byte", "tc-trit-word", "tc-instruction-word", "tc-opcode-map", "tc-immediate", "tc-ternary-alu", "tc-three-way-jump", "tc-run-a-program", "tc-compare", "tc-thirds", "tc-sort-three", "tc-one-neuron", "tc-detector", "tc-tiny-layer", "nn-relu", "nn-sigmoid", "nn-tanh", "nn-gelu", "nn-silu", "nn-elu", "nn-softmax", "nn-embedding", "nn-dropout", "nn-conv", "nn-maxpool", "nn-batchnorm", "nn-mse", "nn-bce", "nn-huber", "nn-sgd", "nn-rmsprop", "nn-adam", "nn-backprop", "nn-xor", "nn-lamb", "nn-rnn", "nn-lstm", "nn-attention", "nn-positions", "nn-encoder", "nn-ppo", "wars", "tri-game-tick", "tri-game-vault", "perf2-knockouts", "race-the-bee", "gatle", "tri-blog-list", "tri-game-selftest"]; -pub const WIDGET_KINDS : [279]str = ["cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "player", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "player", "player", "player", "cast", "cast", "tool", "tool", "cast", "player", "cast", "player", "cast", "player", "cast", "player", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tab", "cast", "cast", "cast", "tool", "tool", "cast", "cast"]; -pub const WIDGET_CATEGORIES : [279]str = ["fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "game", "game", "game", "game", "game", "game", "game", "game"]; -pub const WIDGET_PAGES : [279]str = ["term/x7-board/", "term/tri-x7-fasm/", "term/tri-x7-mutate/", "term/perf2-loop/", "term/tri-fpga-rgmii/", "term/tri-fpga-jtag/", "term/tri-fpga-pins/", "term/devkit-flow/", "play/hello-world/verilog/", "widgets/bit-diff/", "widgets/build-receipt/", "widgets/cost-curves/", "widgets/gf16-calc/", "widgets/idcode/", "widgets/lut-explain/", "widgets/pin-map/", "widgets/placement-map/", "widgets/resource-bars/", "widgets/slack-waterfall/", "widgets/test-waves/", "widgets/synth-smells/", "widgets/bit-autopsy/", "widgets/fasm-skyline/", "widgets/vcd-wrapped/", "widgets/fits-on/", "widgets/stat-card/", "widgets/lut-depth/", "widgets/fsm-sketch/", "widgets/lut-treemap/", "widgets/t27-cell/", "widgets/t27-vs-nvfp4/", "widgets/uart-bucket/", "term/tri-fpga-specs/", "term/tri-fpga-tools/", "term/tri-fpga-wire/", "term/tri-fpga-batch/", "term/tri-fpga-status/", "term/tri-fpga-tmpcheck/", "term/tri-fpga-keycheck/", "term/tri-fpga-selftest/", "term/tri-x7-refs/", "term/tri-x7-audit/", "term/t27c-clock-domain/", "term/t27c-clocks/", "term/t27c-wukong-v1/", "term/t27c-cts/", "term/t27c-mmcm/", "term/t27c-mmcm-mutate/", "term/t27c-timing/", "term/t27c-reset-sync/", "term/t27c-reset-sync-gen/", "term/t27c-mtbf/", "term/t27c-clock-domain-gen/", "term/t27c-fifo/", "term/t27c-fifo-mutate/", "term/t27c-fifo-flags/", "term/t27c-emitter-xdc/", "term/t27c-fpga-rxcap/", "term/t27-tri-competitors/", "term/t27-tri-discard/", "term/tri-fpga-txhold/", "term/tri-fpga-rxcap/", "term/tri-fpga-rxer/", "term/tri-fpga-steps/", "term/tri-fpga-ioclients/", "term/tri-fpga-claim/", "term/tri-fpga-release/", "term/tri-fpga-next/", "term/t27c-memory/", "term/t27c-spi-tb/", "term/t27c-check-uart/", "term/t27c-check-spi/", "term/t27c-check-apb/", "term/t27c-check-axi4/", "term/t27c-check-bridge/", "term/t27c-check-memory/", "term/t27c-verilog-uart/", "term/t27c-verilog-spi/", "term/t27c-verilog-apb/", "term/t27c-verilog-axi4/", "term/t27c-verilog-bridge/", "term/t27c-verilog-top/", "term/t27c-verilog-uart-tb/", "term/t27c-verilog-apb-tb/", "term/t27c-verilog-axi-tb/", "term/t27c-verilog-mem-tb/", "term/t27c-verilog-integration-tb/", "term/t27c-verilog-top-tb/", "term/t27c-verilog-spi-tb/", "term/t27c-hir-uart/", "term/t27c-hir-apb/", "term/t27c-hir-axi4/", "term/t27c-eth-crc/", "term/t27c-rgmii/", "widgets/jtag-verdict/", "widgets/line-bounce/", "widgets/eye-isi/", "widgets/ecc-secded/", "widgets/carry-chain/", "widgets/prefix-adder/", "widgets/csa-tree/", "widgets/shift-add/", "widgets/booth-radix4/", "widgets/dsp-fit/", "widgets/q-format/", "widgets/round-sat/", "widgets/sqnr/", "widgets/cordic/", "widgets/cordic-vector/", "widgets/sine-table/", "widgets/alias-fold/", "widgets/nco/", "widgets/dft-bin/", "widgets/fir-response/", "widgets/fir-design/", "widgets/fir-cost/", "widgets/decimator/", "widgets/cic-growth/", "widgets/polyphase/", "widgets/fft-butterfly/", "widgets/bit-reverse/", "widgets/fft-scaling/", "widgets/barker-corr/", "widgets/fir-fit/", "widgets/fir-on-board/", "play/hello-world/", "play/hello-world/rust/", "play/hello-world/js/", "term/t27c-hello-world/", "term/t27-tri-misread/", "widgets/test-touch/", "widgets/t27c-stages/", "term/t27c-e8m0/", "play/e8m0/", "term/t27c-ocp-mx/", "play/gfternary/", "term/t27c-gfternary/", "play/golden-sieve/", "term/t27c-golden-sieve/", "play/tnf17/", "term/t27c-tnf17/", "term/t27c-activation-quantizer/", "term/t27c-bitnet-majority/", "term/t27c-bitnet-neuron-nchunk/", "term/t27c-comb-ternary-dot/", "term/t27c-stream-ternary-mac/", "term/t27c-bitnet-mlp/", "term/t27c-gft-smul/", "term/t27c-gft-sadd/", "term/t27c-gft-signed-mac/", "term/t27c-gft-relu/", "term/t27c-gft-exp2/", "term/t27c-gft-argmax4/", "term/t27c-gft-nll/", "term/t27c-gft-sgd-step/", "term/t27c-gft-xornet/", "widgets/basics-what-a-spec-is/", "widgets/basics-the-module-line/", "widgets/basics-comments-and-prose/", "widgets/basics-constants/", "widgets/basics-whole-numbers/", "widgets/basics-true-false-and-text/", "widgets/basics-arrays/", "widgets/basics-trits/", "widgets/basics-expressions/", "widgets/basics-a-test-block/", "widgets/basics-many-tests/", "widgets/basics-functions/", "widgets/basics-local-names/", "widgets/basics-if-and-else/", "widgets/basics-loops/", "widgets/basics-pub-or-private/", "widgets/basics-structs/", "widgets/basics-enums/", "widgets/basics-use-other-modules/", "widgets/basics-invariants/", "widgets/basics-gen-ts/", "widgets/basics-seven-backends/", "widgets/basics-stages-of-t27c/", "widgets/basics-tri-commands/", "widgets/basics-reading-errors/", "widgets/basics-a-small-program/", "widgets/basics-where-next/", "widgets/golden-split/", "widgets/golden-phi-ratio/", "widgets/golden-lucas/", "widgets/golden-split-optimality/", "widgets/golden-radix-economy/", "widgets/golden-phi-in-gf16/", "widgets/golden-gf4/", "widgets/golden-gf6/", "widgets/golden-gf8/", "widgets/golden-gf10/", "widgets/golden-gf12/", "widgets/golden-gf14/", "widgets/golden-gf16/", "widgets/golden-dot-two/", "widgets/golden-gf24/", "widgets/golden-gf32/", "widgets/golden-gf48/", "widgets/golden-gf64/", "widgets/golden-gf96/", "widgets/golden-gf128/", "widgets/golden-gf256/", "widgets/golden-gf512/", "widgets/golden-gf1024/", "widgets/golden-gft8/", "widgets/golden-gft16/", "widgets/golden-gft32/", "widgets/golden-decode/", "term/t27-tri-vectors/", "term/t27-tri-census/", "term/t27-tri-seals/", "term/t27-tri-prose/", "term/t27-tri-lean/", "term/tri-selftest/", "term/play-terminal-gates/", "widgets/tc-why-three/", "widgets/tc-balanced-count/", "widgets/tc-flip-and-cut/", "widgets/tc-kleene-gates/", "widgets/tc-consensus-any/", "widgets/tc-sum-and-carry/", "widgets/tc-half-adder/", "widgets/tc-full-adder/", "widgets/tc-ripple-carry/", "widgets/tc-times-a-trit/", "widgets/tc-long-multiply/", "widgets/tc-ternary-mac/", "widgets/tc-two-bits/", "widgets/tc-five-in-a-byte/", "widgets/tc-trit-word/", "widgets/tc-instruction-word/", "widgets/tc-opcode-map/", "widgets/tc-immediate/", "widgets/tc-ternary-alu/", "widgets/tc-three-way-jump/", "widgets/tc-run-a-program/", "widgets/tc-compare/", "widgets/tc-thirds/", "widgets/tc-sort-three/", "widgets/tc-one-neuron/", "widgets/tc-detector/", "widgets/tc-tiny-layer/", "widgets/nn-relu/", "widgets/nn-sigmoid/", "widgets/nn-tanh/", "widgets/nn-gelu/", "widgets/nn-silu/", "widgets/nn-elu/", "widgets/nn-softmax/", "widgets/nn-embedding/", "widgets/nn-dropout/", "widgets/nn-conv/", "widgets/nn-maxpool/", "widgets/nn-batchnorm/", "widgets/nn-mse/", "widgets/nn-bce/", "widgets/nn-huber/", "widgets/nn-sgd/", "widgets/nn-rmsprop/", "widgets/nn-adam/", "widgets/nn-backprop/", "widgets/nn-xor/", "widgets/nn-lamb/", "widgets/nn-rnn/", "widgets/nn-lstm/", "widgets/nn-attention/", "widgets/nn-positions/", "widgets/nn-encoder/", "widgets/nn-ppo/", "wars", "term/tri-game-tick/", "term/tri-game-vault/", "term/perf2-knockouts/", "widgets/race-the-bee/", "widgets/gatle/", "term/tri-blog-list/", "term/tri-game-selftest/"]; -pub const WIDGET_TITLES : [279]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "WARS: agent configurations compared on real GitHub issues", "", "", "", "", "", "", ""]; -pub const WIDGET_LINES : [279]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "One issue, one pinned commit, the same tools and gates; only the decision layer changes, and a missing run stays unknown.", "", "", "", "", "", "", ""]; +pub const WIDGET_COUNT : u16 = 281; +pub const WIDGET_IDS : [281]str = ["x7-board", "tri-x7-fasm", "tri-x7-mutate", "perf2-loop", "tri-fpga-rgmii", "tri-fpga-jtag", "tri-fpga-pins", "devkit-flow", "play-verilog", "bit-diff", "build-receipt", "cost-curves", "gf16-calc", "idcode", "lut-explain", "pin-map", "placement-map", "resource-bars", "slack-waterfall", "test-waves", "synth-smells", "bit-autopsy", "fasm-skyline", "vcd-wrapped", "fits-on", "stat-card", "lut-depth", "fsm-sketch", "lut-treemap", "t27-cell", "t27-vs-nvfp4", "uart-bucket", "tri-fpga-specs", "tri-fpga-tools", "tri-fpga-wire", "tri-fpga-batch", "tri-fpga-status", "tri-fpga-tmpcheck", "tri-fpga-keycheck", "tri-fpga-selftest", "tri-x7-refs", "tri-x7-audit", "t27c-clock-domain", "t27c-clocks", "t27c-wukong-v1", "t27c-cts", "t27c-mmcm", "t27c-mmcm-mutate", "t27c-timing", "t27c-reset-sync", "t27c-reset-sync-gen", "t27c-mtbf", "t27c-clock-domain-gen", "t27c-fifo", "t27c-fifo-mutate", "t27c-fifo-flags", "t27c-emitter-xdc", "t27c-fpga-rxcap", "t27-tri-competitors", "t27-tri-discard", "tri-fpga-txhold", "tri-fpga-rxcap", "tri-fpga-rxer", "tri-fpga-steps", "tri-fpga-ioclients", "tri-fpga-claim", "tri-fpga-release", "tri-fpga-next", "t27c-memory", "t27c-spi-tb", "t27c-check-uart", "t27c-check-spi", "t27c-check-apb", "t27c-check-axi4", "t27c-check-bridge", "t27c-check-memory", "t27c-verilog-uart", "t27c-verilog-spi", "t27c-verilog-apb", "t27c-verilog-axi4", "t27c-verilog-bridge", "t27c-verilog-top", "t27c-verilog-uart-tb", "t27c-verilog-apb-tb", "t27c-verilog-axi-tb", "t27c-verilog-mem-tb", "t27c-verilog-integration-tb", "t27c-verilog-top-tb", "t27c-verilog-spi-tb", "t27c-hir-uart", "t27c-hir-apb", "t27c-hir-axi4", "t27c-eth-crc", "t27c-rgmii", "jtag-verdict", "line-bounce", "eye-isi", "ecc-secded", "carry-chain", "prefix-adder", "csa-tree", "shift-add", "booth-radix4", "dsp-fit", "q-format", "round-sat", "sqnr", "cordic", "cordic-vector", "sine-table", "alias-fold", "nco", "dft-bin", "fir-response", "fir-design", "fir-cost", "decimator", "cic-growth", "polyphase", "fft-butterfly", "bit-reverse", "fft-scaling", "barker-corr", "fir-fit", "fir-on-board", "play-hello-world", "play-rust", "play-js", "t27c-hello-world", "t27-tri-misread", "test-touch", "t27c-stages", "t27c-e8m0", "play-e8m0", "t27c-ocp-mx", "play-gfternary", "t27c-gfternary", "play-golden-sieve", "t27c-golden-sieve", "play-tnf17", "t27c-tnf17", "t27c-activation-quantizer", "t27c-bitnet-majority", "t27c-bitnet-neuron-nchunk", "t27c-comb-ternary-dot", "t27c-stream-ternary-mac", "t27c-bitnet-mlp", "t27c-gft-smul", "t27c-gft-sadd", "t27c-gft-signed-mac", "t27c-gft-relu", "t27c-gft-exp2", "t27c-gft-argmax4", "t27c-gft-nll", "t27c-gft-sgd-step", "t27c-gft-xornet", "basics-what-a-spec-is", "basics-the-module-line", "basics-comments-and-prose", "basics-constants", "basics-whole-numbers", "basics-true-false-and-text", "basics-arrays", "basics-trits", "basics-expressions", "basics-a-test-block", "basics-many-tests", "basics-functions", "basics-local-names", "basics-if-and-else", "basics-loops", "basics-pub-or-private", "basics-structs", "basics-enums", "basics-use-other-modules", "basics-invariants", "basics-gen-ts", "basics-seven-backends", "basics-stages-of-t27c", "basics-tri-commands", "basics-reading-errors", "basics-a-small-program", "basics-where-next", "golden-split", "golden-phi-ratio", "golden-lucas", "golden-split-optimality", "golden-radix-economy", "golden-phi-in-gf16", "golden-gf4", "golden-gf6", "golden-gf8", "golden-gf10", "golden-gf12", "golden-gf14", "golden-gf16", "golden-dot-two", "golden-gf24", "golden-gf32", "golden-gf48", "golden-gf64", "golden-gf96", "golden-gf128", "golden-gf256", "golden-gf512", "golden-gf1024", "golden-gft8", "golden-gft16", "golden-gft32", "golden-decode", "t27-tri-vectors", "t27-tri-census", "t27-tri-seals", "t27-tri-prose", "t27-tri-lean", "tri-selftest", "play-terminal-gates", "tc-why-three", "tc-balanced-count", "tc-flip-and-cut", "tc-kleene-gates", "tc-consensus-any", "tc-sum-and-carry", "tc-half-adder", "tc-full-adder", "tc-ripple-carry", "tc-times-a-trit", "tc-long-multiply", "tc-ternary-mac", "tc-two-bits", "tc-five-in-a-byte", "tc-trit-word", "tc-instruction-word", "tc-opcode-map", "tc-immediate", "tc-ternary-alu", "tc-three-way-jump", "tc-run-a-program", "tc-compare", "tc-thirds", "tc-sort-three", "tc-one-neuron", "tc-detector", "tc-tiny-layer", "nn-relu", "nn-sigmoid", "nn-tanh", "nn-gelu", "nn-silu", "nn-elu", "nn-softmax", "nn-embedding", "nn-dropout", "nn-conv", "nn-maxpool", "nn-batchnorm", "nn-mse", "nn-bce", "nn-huber", "nn-sgd", "nn-rmsprop", "nn-adam", "nn-backprop", "nn-xor", "nn-lamb", "nn-rnn", "nn-lstm", "nn-attention", "nn-positions", "nn-encoder", "nn-ppo", "paper-claims", "t27t-savings", "wars", "tri-game-tick", "tri-game-vault", "perf2-knockouts", "race-the-bee", "gatle", "tri-blog-list", "tri-game-selftest"]; +pub const WIDGET_KINDS : [281]str = ["cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "player", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "player", "player", "player", "cast", "cast", "tool", "tool", "cast", "player", "cast", "player", "cast", "player", "cast", "player", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "cast", "cast", "cast", "cast", "cast", "cast", "cast", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tool", "tab", "cast", "cast", "cast", "tool", "tool", "cast", "cast"]; +pub const WIDGET_CATEGORIES : [281]str = ["fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "fpga", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "compiler", "game", "game", "game", "game", "game", "game", "game", "game"]; +pub const WIDGET_PAGES : [281]str = ["term/x7-board/", "term/tri-x7-fasm/", "term/tri-x7-mutate/", "term/perf2-loop/", "term/tri-fpga-rgmii/", "term/tri-fpga-jtag/", "term/tri-fpga-pins/", "term/devkit-flow/", "play/hello-world/verilog/", "widgets/bit-diff/", "widgets/build-receipt/", "widgets/cost-curves/", "widgets/gf16-calc/", "widgets/idcode/", "widgets/lut-explain/", "widgets/pin-map/", "widgets/placement-map/", "widgets/resource-bars/", "widgets/slack-waterfall/", "widgets/test-waves/", "widgets/synth-smells/", "widgets/bit-autopsy/", "widgets/fasm-skyline/", "widgets/vcd-wrapped/", "widgets/fits-on/", "widgets/stat-card/", "widgets/lut-depth/", "widgets/fsm-sketch/", "widgets/lut-treemap/", "widgets/t27-cell/", "widgets/t27-vs-nvfp4/", "widgets/uart-bucket/", "term/tri-fpga-specs/", "term/tri-fpga-tools/", "term/tri-fpga-wire/", "term/tri-fpga-batch/", "term/tri-fpga-status/", "term/tri-fpga-tmpcheck/", "term/tri-fpga-keycheck/", "term/tri-fpga-selftest/", "term/tri-x7-refs/", "term/tri-x7-audit/", "term/t27c-clock-domain/", "term/t27c-clocks/", "term/t27c-wukong-v1/", "term/t27c-cts/", "term/t27c-mmcm/", "term/t27c-mmcm-mutate/", "term/t27c-timing/", "term/t27c-reset-sync/", "term/t27c-reset-sync-gen/", "term/t27c-mtbf/", "term/t27c-clock-domain-gen/", "term/t27c-fifo/", "term/t27c-fifo-mutate/", "term/t27c-fifo-flags/", "term/t27c-emitter-xdc/", "term/t27c-fpga-rxcap/", "term/t27-tri-competitors/", "term/t27-tri-discard/", "term/tri-fpga-txhold/", "term/tri-fpga-rxcap/", "term/tri-fpga-rxer/", "term/tri-fpga-steps/", "term/tri-fpga-ioclients/", "term/tri-fpga-claim/", "term/tri-fpga-release/", "term/tri-fpga-next/", "term/t27c-memory/", "term/t27c-spi-tb/", "term/t27c-check-uart/", "term/t27c-check-spi/", "term/t27c-check-apb/", "term/t27c-check-axi4/", "term/t27c-check-bridge/", "term/t27c-check-memory/", "term/t27c-verilog-uart/", "term/t27c-verilog-spi/", "term/t27c-verilog-apb/", "term/t27c-verilog-axi4/", "term/t27c-verilog-bridge/", "term/t27c-verilog-top/", "term/t27c-verilog-uart-tb/", "term/t27c-verilog-apb-tb/", "term/t27c-verilog-axi-tb/", "term/t27c-verilog-mem-tb/", "term/t27c-verilog-integration-tb/", "term/t27c-verilog-top-tb/", "term/t27c-verilog-spi-tb/", "term/t27c-hir-uart/", "term/t27c-hir-apb/", "term/t27c-hir-axi4/", "term/t27c-eth-crc/", "term/t27c-rgmii/", "widgets/jtag-verdict/", "widgets/line-bounce/", "widgets/eye-isi/", "widgets/ecc-secded/", "widgets/carry-chain/", "widgets/prefix-adder/", "widgets/csa-tree/", "widgets/shift-add/", "widgets/booth-radix4/", "widgets/dsp-fit/", "widgets/q-format/", "widgets/round-sat/", "widgets/sqnr/", "widgets/cordic/", "widgets/cordic-vector/", "widgets/sine-table/", "widgets/alias-fold/", "widgets/nco/", "widgets/dft-bin/", "widgets/fir-response/", "widgets/fir-design/", "widgets/fir-cost/", "widgets/decimator/", "widgets/cic-growth/", "widgets/polyphase/", "widgets/fft-butterfly/", "widgets/bit-reverse/", "widgets/fft-scaling/", "widgets/barker-corr/", "widgets/fir-fit/", "widgets/fir-on-board/", "play/hello-world/", "play/hello-world/rust/", "play/hello-world/js/", "term/t27c-hello-world/", "term/t27-tri-misread/", "widgets/test-touch/", "widgets/t27c-stages/", "term/t27c-e8m0/", "play/e8m0/", "term/t27c-ocp-mx/", "play/gfternary/", "term/t27c-gfternary/", "play/golden-sieve/", "term/t27c-golden-sieve/", "play/tnf17/", "term/t27c-tnf17/", "term/t27c-activation-quantizer/", "term/t27c-bitnet-majority/", "term/t27c-bitnet-neuron-nchunk/", "term/t27c-comb-ternary-dot/", "term/t27c-stream-ternary-mac/", "term/t27c-bitnet-mlp/", "term/t27c-gft-smul/", "term/t27c-gft-sadd/", "term/t27c-gft-signed-mac/", "term/t27c-gft-relu/", "term/t27c-gft-exp2/", "term/t27c-gft-argmax4/", "term/t27c-gft-nll/", "term/t27c-gft-sgd-step/", "term/t27c-gft-xornet/", "widgets/basics-what-a-spec-is/", "widgets/basics-the-module-line/", "widgets/basics-comments-and-prose/", "widgets/basics-constants/", "widgets/basics-whole-numbers/", "widgets/basics-true-false-and-text/", "widgets/basics-arrays/", "widgets/basics-trits/", "widgets/basics-expressions/", "widgets/basics-a-test-block/", "widgets/basics-many-tests/", "widgets/basics-functions/", "widgets/basics-local-names/", "widgets/basics-if-and-else/", "widgets/basics-loops/", "widgets/basics-pub-or-private/", "widgets/basics-structs/", "widgets/basics-enums/", "widgets/basics-use-other-modules/", "widgets/basics-invariants/", "widgets/basics-gen-ts/", "widgets/basics-seven-backends/", "widgets/basics-stages-of-t27c/", "widgets/basics-tri-commands/", "widgets/basics-reading-errors/", "widgets/basics-a-small-program/", "widgets/basics-where-next/", "widgets/golden-split/", "widgets/golden-phi-ratio/", "widgets/golden-lucas/", "widgets/golden-split-optimality/", "widgets/golden-radix-economy/", "widgets/golden-phi-in-gf16/", "widgets/golden-gf4/", "widgets/golden-gf6/", "widgets/golden-gf8/", "widgets/golden-gf10/", "widgets/golden-gf12/", "widgets/golden-gf14/", "widgets/golden-gf16/", "widgets/golden-dot-two/", "widgets/golden-gf24/", "widgets/golden-gf32/", "widgets/golden-gf48/", "widgets/golden-gf64/", "widgets/golden-gf96/", "widgets/golden-gf128/", "widgets/golden-gf256/", "widgets/golden-gf512/", "widgets/golden-gf1024/", "widgets/golden-gft8/", "widgets/golden-gft16/", "widgets/golden-gft32/", "widgets/golden-decode/", "term/t27-tri-vectors/", "term/t27-tri-census/", "term/t27-tri-seals/", "term/t27-tri-prose/", "term/t27-tri-lean/", "term/tri-selftest/", "term/play-terminal-gates/", "widgets/tc-why-three/", "widgets/tc-balanced-count/", "widgets/tc-flip-and-cut/", "widgets/tc-kleene-gates/", "widgets/tc-consensus-any/", "widgets/tc-sum-and-carry/", "widgets/tc-half-adder/", "widgets/tc-full-adder/", "widgets/tc-ripple-carry/", "widgets/tc-times-a-trit/", "widgets/tc-long-multiply/", "widgets/tc-ternary-mac/", "widgets/tc-two-bits/", "widgets/tc-five-in-a-byte/", "widgets/tc-trit-word/", "widgets/tc-instruction-word/", "widgets/tc-opcode-map/", "widgets/tc-immediate/", "widgets/tc-ternary-alu/", "widgets/tc-three-way-jump/", "widgets/tc-run-a-program/", "widgets/tc-compare/", "widgets/tc-thirds/", "widgets/tc-sort-three/", "widgets/tc-one-neuron/", "widgets/tc-detector/", "widgets/tc-tiny-layer/", "widgets/nn-relu/", "widgets/nn-sigmoid/", "widgets/nn-tanh/", "widgets/nn-gelu/", "widgets/nn-silu/", "widgets/nn-elu/", "widgets/nn-softmax/", "widgets/nn-embedding/", "widgets/nn-dropout/", "widgets/nn-conv/", "widgets/nn-maxpool/", "widgets/nn-batchnorm/", "widgets/nn-mse/", "widgets/nn-bce/", "widgets/nn-huber/", "widgets/nn-sgd/", "widgets/nn-rmsprop/", "widgets/nn-adam/", "widgets/nn-backprop/", "widgets/nn-xor/", "widgets/nn-lamb/", "widgets/nn-rnn/", "widgets/nn-lstm/", "widgets/nn-attention/", "widgets/nn-positions/", "widgets/nn-encoder/", "widgets/nn-ppo/", "widgets/paper-claims/", "widgets/t27t-savings/", "wars", "term/tri-game-tick/", "term/tri-game-vault/", "term/perf2-knockouts/", "widgets/race-the-bee/", "widgets/gatle/", "term/tri-blog-list/", "term/tri-game-selftest/"]; +pub const WIDGET_TITLES : [281]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "WARS: agent configurations compared on real GitHub issues", "", "", "", "", "", "", ""]; +pub const WIDGET_LINES : [281]str = ["", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "One issue, one pinned commit, the same tools and gates; only the decision layer changes, and a missing run stays unknown.", "", "", "", "", "", "", ""]; ; Why a person would pass this one on: the reason the widget is in the gallery at all. -pub const WIDGET_HOOKS : [279]str = ["The bitstream is byte-identical to openXC7's and runs on a real board: the claim most FPGA people doubt, shown.", "A Xilinx 7-series bitstream assembled with no Vivado anywhere in the path.", "Plant a bug in the bitstream path and watch the tests catch it: mutation testing for hardware.", "Place and route to a loaded bitstream, with the clock on screen.", "RGMII hold margins read from nextpnr's own SDF, not from a datasheet.", "The cable asks which chip is there and the chip answers with its IDCODE.", "Before an edit to a Verilog file: every spec and generator it would touch.", "The whole FPGA flow, one layer per line, from spec to board.", "A spec turned into Verilog inside a post, with the RTL read the way a hardware engineer reads it.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "17 of 17 conformance specs compile, their test blocks pass, and no generated file has drifted.", "14 of 14 bench tools pass their own self-tests in one sweep: decode 18/18, repin 17/17, firelog 10/10, tmpcheck 9/9, stamps 9/9, keep 9/9.", "Requested 115,200 puts 115,385 on the wire (+0.16 %), 921,600 puts 923,077, and 3,000,000 is exact.", "26 checks, no board, no RTL: every receipt returns, 11 loss and fault cases recover, and a lie stops the run.", "One command reads the bench: cables, locks, and the last board runs: three x7-board runs PASS 51840/51840.", "112 files under /tmp pinned by sha256 in specs: every one has a kept copy, 0 lost, 0 unlocated.", "84 board and model logs scanned for the TRI-NET key: 0 hits, 0 logs of 1 MB or more.", "16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.", "The part table in far.t27 matches prjxray-db part.json, all 6 reference bitstreams present, bitwalk reads all 6 in 84.4 ms.", "One command re-runs every sweep: CRC 12/12, ECC 32520/32520 frames, 82/82 pins, 4224/4224 segbits, gold 5/5. audit: CLEAN.", "The CDC spec through the real compiler: 12 tests pass natively and the header says what the model does and does not claim.", "The tri clocks card as a spec: constants a tool page reads, and a native test-report that says so plainly -- 0 tests, because it is not a test suite.", "The board itself as a spec: 15 tests pass natively and the part line names the xc7a200tfgg676 the Wukong carries.", "Clock-tree synthesis in numbers: 15 tests pass natively, and the header pins the Artix-7 teaching delays the tree arithmetic uses.", "The MMCM model through the real compiler: VCO window, M/D/O ranges, fractional multiply in eighths, the 1/56 phase step, 16 tests natively.", "Widen the VCO window with one sed and exactly one test objects -- the rejection test that names the 500 MHz config it calls out.", "Static timing as arithmetic: 25 tests pass natively on arcs, slack and Fmax, with the Artix-7 teaching delays in the header.", "The three reset kinds through the real compiler: async assert with sync release through 2 to 4 flops, and the racy async release, 16 tests natively.", "What the compiler emits for the reset pipe: t27c gen prints the Zig, one struct copy per clock, and wc -l counts it.", "Metastability MTBF without floats: the WP323 form in Q10 log2, one flop negative slack, two flops astronomical, 15 tests natively.", "The CDC model as Zig: t27c gen prints what it compiled and wc -l says how many lines of code the model is.", "The FIFO stdlib through the real compiler: 18 tests pass natively and 6 invariants are proved comptime.", "Move a pointer by 3 instead of 1 and every test still passes: the suite asserts fill and flags, never pointer values.", "Flip one flag assignment and a single test objects: the guard that keeps the FIFO honest.", "The pins-to-XDC emitter spec parsed by the real compiler, and the create_clock lines it exists to write.", "The fpga-rxcap tool card as a spec: constants for a tool page, and a native run that says 0 tests and why.", "168 records: 14 papers entered twice, 141 cite no score, 144 state zero at pass@1.", "67 specs lose 23,578 tokens to parser recovery, each held at its pinned bound.", "Smallest hold 3445 ps on TXD1 against a 1000 ps bench; each TX pin setup and hold from the routed SDF.", "Per-bit setup and hold of an async RX nibble against its RXC edge, from the routed SDF: one nibble changes 2387 to 2486 ps apart, so a binary counter tears where a gray one cannot.", "RX_ER pulses injected at exact nibble positions of a ping -- preamble, mid-frame, IP header -- and the frame state each pulse leaves behind, RTL vs model.", "The Ethernet bring-up plan on the bench: pre-registered steps, logged exits, what ran and what did not.", "The registered IO clients on the bench, read live: names, claims and what each declares it owns.", "The bench claim in action: one client takes the hardware lock and the tool reports who holds it.", "The bench lock given back: the client gives up its claim and the bench reports itself free.", "The next queued step on the bench, read live from the run state.", "The memory map spec through the real compiler: 15 tests pass natively and 6 invariants are proved comptime.", "The SPI testbench through the real compiler: 7 tests pass natively, driving the modes and checking the captures.", "t27c check on the UART spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the SPI spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the APB bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the AXI4 spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the bus bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the memory spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "The UART spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The SPI spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The APB bridge spec lowered to synthesizable Verilog: port list, PSEL and PENABLE wiring, the address decode.", "The AXI4 spec lowered to synthesizable Verilog: the five channels' wiring and handshakes as generated wires.", "The bus bridge spec lowered to synthesizable Verilog: both sides of the crossing as generated wires.", "The whole design in one spec lowered to synthesizable Verilog: clocks, resets and bus wiring as the compiler emits them.", "The UART testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The APB bridge testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The AXI4 testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The memory testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The integration testbench spec lowered to Verilog: every bus of the design in one bench.", "The top-level testbench spec lowered to Verilog: the whole design under one bench.", "The SPI testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The UART spec lowered to hardware IR: the compiler's own view of the wires and state before Verilog exists.", "The APB bridge spec lowered to hardware IR: PSEL, PENABLE and the decode as the compiler structures them.", "The AXI4 spec lowered to hardware IR: the five channels and their handshakes as the compiler structures them.", "The Ethernet FCS spec through the real compiler: 8 tests pass natively -- the table derived from one bit step, the 0xCBF43926 check value, the 0xDEBB20E3 receiver residue.", "The RGMII spec through the real compiler: 7 tests pass natively and 1 invariant is proved comptime -- the 8 ns gigabit period, a nibble on both edges, the 78 ps tap ladder.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The t27 compiler running as WebAssembly in a post: compile, test, seven backends.", "The same spec as Rust, printed by a terminal in the page.", "The only backend that runs in the browser: generate the module, then run it.", "t27c on hello_world.t27, on a real machine, every byte as printed.", "Code that compiles and is wrong: the tool that finds it.", "", "", "The OCP MX scale byte as a spec: 2^(e-127), code 255 is NaN, 18 tests and 9 comptime invariants, compiled on a real machine.", "The same scale byte compiled in your browser: seven backends, the spec's tests run in the page, and every skip says why.", "One outlier sets the scale for 32 weights: MXFP4 flushes 23 of them to zero, MXFP8 E4M3 none. 49 tests pass; a planted bug fails one.", "Ternary weights scaled by phi, compiled in your browser: codes 00, 01, 10, and the fourth code folded to zero.", "13 of 13 tests pass natively, and the report says 8 of them executed no assert; a planted bug fails exactly one.", "Five measured rules for a ternary weight alphabet, and the one formula that passes all five, run in your browser.", "One more trit and the spec does not compile at all: BLOCKED, not failed, because no test ever ran.", "A 17-bit float whose exponent is four balanced trits, 3^4 = 81 values, compiled in your browser.", "34 tests pass natively, none vacuous; swap one XOR for OR and only the test that negates twice fails.", "A neuron's sum squeezed back to one trit: 7 tests pass natively, and turning one > into >= fails only the boundary test.", "One ternary neuron, two functions picked by its weights: 12 tests pass natively, and one weight moved from P to Z fails exactly one.", "A neuron wider than 27 inputs, summed chunk by chunk: 11 tests pass natively, and a loop that stops after one chunk fails exactly one.", "A 27-lane ternary dot product as pure wires: 4 tests pass natively, and one wrong sign in tmul fails exactly one.", "The same dot product added into a register on every clock: 4 tests pass natively, and a lane mask short one bit fails exactly one.", "A whole small ternary network, 3 neurons then 2: 4 tests pass natively, and a trit packed one bit low fails exactly one.", "A signed multiply: 3 tests pass natively, none vacuous, and a sign stuck at 0 fails exactly one, m2.", "A signed add: 3 tests pass natively, and adding where opposite signs must subtract fails exactly one, a2.", "Two signed products summed: 4 tests pass natively, and OR in place of the sign XOR fails exactly one, pp.", "A ReLU: 4 tests pass natively, and letting negative inputs through fails only negz, the one test with a negative input.", "2^x for a softmax: 4 tests pass natively, and dropping the minus sign of k fails exactly one, em1.", "argmax by comparing bits alone: 4 tests pass natively, and >= in place of > fails exactly one, tie_low.", "A loss in bits: 3 tests pass natively, and a zero with the sign bit set fails exactly one, perfect.", "One SGD step: 3 tests pass natively, and g times g in place of eta times g fails exactly one, ascend.", "A 2-layer ReLU net for XOR: 4 tests pass natively, and one relu removed fails exactly one, x00.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "34 vector files, 512 cases: 2 files executed, 8 debt, 24 prose-only; 19% carry data.", "Four census populations recounted another way all agree; three are named as uncheckable.", "31 of 1,428 seals record no output (16 specs); 3 of those are missing from the debt ledger.", "11 specs refused at parse, 0 blocked only by prose, 23 broken on purpose as fixtures.", "12 Lean files, 15,553 lines and 4 sorry, are reached by no build root: nothing compiles them.", "tri, railway, python3 and the loop directory: each present or not, in one call.", "The terminal for seven t27 backends: every command run on hello_world. 21 pass, 0 fail.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Pick a lane and see whether the TRI decision layer beats the baseline on the same issue.", "One tick of the Queen's loop: an anomaly scan that reports only what changed.", "The loop's skills checked against snapshots before an agent may use them.", "Three performance bits, and one knockout bitstream per bit to prove each one matters.", "", "", "73 published posts with date, language and revision, newest first.", "6 of 6 self-tests hold: anomalies, blog_drift, lessons, site_gate, tick, vault."]; +pub const WIDGET_HOOKS : [281]str = ["The bitstream is byte-identical to openXC7's and runs on a real board: the claim most FPGA people doubt, shown.", "A Xilinx 7-series bitstream assembled with no Vivado anywhere in the path.", "Plant a bug in the bitstream path and watch the tests catch it: mutation testing for hardware.", "Place and route to a loaded bitstream, with the clock on screen.", "RGMII hold margins read from nextpnr's own SDF, not from a datasheet.", "The cable asks which chip is there and the chip answers with its IDCODE.", "Before an edit to a Verilog file: every spec and generator it would touch.", "The whole FPGA flow, one layer per line, from spec to board.", "A spec turned into Verilog inside a post, with the RTL read the way a hardware engineer reads it.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "17 of 17 conformance specs compile, their test blocks pass, and no generated file has drifted.", "14 of 14 bench tools pass their own self-tests in one sweep: decode 18/18, repin 17/17, firelog 10/10, tmpcheck 9/9, stamps 9/9, keep 9/9.", "Requested 115,200 puts 115,385 on the wire (+0.16 %), 921,600 puts 923,077, and 3,000,000 is exact.", "26 checks, no board, no RTL: every receipt returns, 11 loss and fault cases recover, and a lie stops the run.", "One command reads the bench: cables, locks, and the last board runs: three x7-board runs PASS 51840/51840.", "112 files under /tmp pinned by sha256 in specs: every one has a kept copy, 0 lost, 0 unlocated.", "84 board and model logs scanned for the TRI-NET key: 0 hits, 0 logs of 1 MB or more.", "16 spec-named scripts run their own --self-test, 0 bad; 8 without the flag are listed, not skipped silently.", "The part table in far.t27 matches prjxray-db part.json, all 6 reference bitstreams present, bitwalk reads all 6 in 84.4 ms.", "One command re-runs every sweep: CRC 12/12, ECC 32520/32520 frames, 82/82 pins, 4224/4224 segbits, gold 5/5. audit: CLEAN.", "The CDC spec through the real compiler: 12 tests pass natively and the header says what the model does and does not claim.", "The tri clocks card as a spec: constants a tool page reads, and a native test-report that says so plainly -- 0 tests, because it is not a test suite.", "The board itself as a spec: 15 tests pass natively and the part line names the xc7a200tfgg676 the Wukong carries.", "Clock-tree synthesis in numbers: 15 tests pass natively, and the header pins the Artix-7 teaching delays the tree arithmetic uses.", "The MMCM model through the real compiler: VCO window, M/D/O ranges, fractional multiply in eighths, the 1/56 phase step, 16 tests natively.", "Widen the VCO window with one sed and exactly one test objects -- the rejection test that names the 500 MHz config it calls out.", "Static timing as arithmetic: 25 tests pass natively on arcs, slack and Fmax, with the Artix-7 teaching delays in the header.", "The three reset kinds through the real compiler: async assert with sync release through 2 to 4 flops, and the racy async release, 16 tests natively.", "What the compiler emits for the reset pipe: t27c gen prints the Zig, one struct copy per clock, and wc -l counts it.", "Metastability MTBF without floats: the WP323 form in Q10 log2, one flop negative slack, two flops astronomical, 15 tests natively.", "The CDC model as Zig: t27c gen prints what it compiled and wc -l says how many lines of code the model is.", "The FIFO stdlib through the real compiler: 18 tests pass natively and 6 invariants are proved comptime.", "Move a pointer by 3 instead of 1 and every test still passes: the suite asserts fill and flags, never pointer values.", "Flip one flag assignment and a single test objects: the guard that keeps the FIFO honest.", "The pins-to-XDC emitter spec parsed by the real compiler, and the create_clock lines it exists to write.", "The fpga-rxcap tool card as a spec: constants for a tool page, and a native run that says 0 tests and why.", "168 records: 14 papers entered twice, 141 cite no score, 144 state zero at pass@1.", "67 specs lose 23,578 tokens to parser recovery, each held at its pinned bound.", "Smallest hold 3445 ps on TXD1 against a 1000 ps bench; each TX pin setup and hold from the routed SDF.", "Per-bit setup and hold of an async RX nibble against its RXC edge, from the routed SDF: one nibble changes 2387 to 2486 ps apart, so a binary counter tears where a gray one cannot.", "RX_ER pulses injected at exact nibble positions of a ping -- preamble, mid-frame, IP header -- and the frame state each pulse leaves behind, RTL vs model.", "The Ethernet bring-up plan on the bench: pre-registered steps, logged exits, what ran and what did not.", "The registered IO clients on the bench, read live: names, claims and what each declares it owns.", "The bench claim in action: one client takes the hardware lock and the tool reports who holds it.", "The bench lock given back: the client gives up its claim and the bench reports itself free.", "The next queued step on the bench, read live from the run state.", "The memory map spec through the real compiler: 15 tests pass natively and 6 invariants are proved comptime.", "The SPI testbench through the real compiler: 7 tests pass natively, driving the modes and checking the captures.", "t27c check on the UART spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the SPI spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the APB bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the AXI4 spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the bus bridge spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "t27c check on the memory spec: 0 errors, 0 warnings -- the first bar every lesson's spec clears.", "The UART spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The SPI spec lowered to synthesizable Verilog: the TRINITY banner, the module port list and the datapath as wires.", "The APB bridge spec lowered to synthesizable Verilog: port list, PSEL and PENABLE wiring, the address decode.", "The AXI4 spec lowered to synthesizable Verilog: the five channels' wiring and handshakes as generated wires.", "The bus bridge spec lowered to synthesizable Verilog: both sides of the crossing as generated wires.", "The whole design in one spec lowered to synthesizable Verilog: clocks, resets and bus wiring as the compiler emits them.", "The UART testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The APB bridge testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The AXI4 testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The memory testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The integration testbench spec lowered to Verilog: every bus of the design in one bench.", "The top-level testbench spec lowered to Verilog: the whole design under one bench.", "The SPI testbench spec lowered to Verilog: what a bench looks like when the compiler emits it.", "The UART spec lowered to hardware IR: the compiler's own view of the wires and state before Verilog exists.", "The APB bridge spec lowered to hardware IR: PSEL, PENABLE and the decode as the compiler structures them.", "The AXI4 spec lowered to hardware IR: the five channels and their handshakes as the compiler structures them.", "The Ethernet FCS spec through the real compiler: 8 tests pass natively -- the table derived from one bit step, the 0xCBF43926 check value, the 0xDEBB20E3 receiver residue.", "The RGMII spec through the real compiler: 7 tests pass natively and 1 invariant is proved comptime -- the 8 ns gigabit period, a nibble on both edges, the 78 ps tap ladder.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "The t27 compiler running as WebAssembly in a post: compile, test, seven backends.", "The same spec as Rust, printed by a terminal in the page.", "The only backend that runs in the browser: generate the module, then run it.", "t27c on hello_world.t27, on a real machine, every byte as printed.", "Code that compiles and is wrong: the tool that finds it.", "", "", "The OCP MX scale byte as a spec: 2^(e-127), code 255 is NaN, 18 tests and 9 comptime invariants, compiled on a real machine.", "The same scale byte compiled in your browser: seven backends, the spec's tests run in the page, and every skip says why.", "One outlier sets the scale for 32 weights: MXFP4 flushes 23 of them to zero, MXFP8 E4M3 none. 49 tests pass; a planted bug fails one.", "Ternary weights scaled by phi, compiled in your browser: codes 00, 01, 10, and the fourth code folded to zero.", "13 of 13 tests pass natively, and the report says 8 of them executed no assert; a planted bug fails exactly one.", "Five measured rules for a ternary weight alphabet, and the one formula that passes all five, run in your browser.", "One more trit and the spec does not compile at all: BLOCKED, not failed, because no test ever ran.", "A 17-bit float whose exponent is four balanced trits, 3^4 = 81 values, compiled in your browser.", "34 tests pass natively, none vacuous; swap one XOR for OR and only the test that negates twice fails.", "A neuron's sum squeezed back to one trit: 7 tests pass natively, and turning one > into >= fails only the boundary test.", "One ternary neuron, two functions picked by its weights: 12 tests pass natively, and one weight moved from P to Z fails exactly one.", "A neuron wider than 27 inputs, summed chunk by chunk: 11 tests pass natively, and a loop that stops after one chunk fails exactly one.", "A 27-lane ternary dot product as pure wires: 4 tests pass natively, and one wrong sign in tmul fails exactly one.", "The same dot product added into a register on every clock: 4 tests pass natively, and a lane mask short one bit fails exactly one.", "A whole small ternary network, 3 neurons then 2: 4 tests pass natively, and a trit packed one bit low fails exactly one.", "A signed multiply: 3 tests pass natively, none vacuous, and a sign stuck at 0 fails exactly one, m2.", "A signed add: 3 tests pass natively, and adding where opposite signs must subtract fails exactly one, a2.", "Two signed products summed: 4 tests pass natively, and OR in place of the sign XOR fails exactly one, pp.", "A ReLU: 4 tests pass natively, and letting negative inputs through fails only negz, the one test with a negative input.", "2^x for a softmax: 4 tests pass natively, and dropping the minus sign of k fails exactly one, em1.", "argmax by comparing bits alone: 4 tests pass natively, and >= in place of > fails exactly one, tie_low.", "A loss in bits: 3 tests pass natively, and a zero with the sign bit set fails exactly one, perfect.", "One SGD step: 3 tests pass natively, and g times g in place of eta times g fails exactly one, ascend.", "A 2-layer ReLU net for XOR: 4 tests pass natively, and one relu removed fails exactly one, x00.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "34 vector files, 512 cases: 2 files executed, 8 debt, 24 prose-only; 19% carry data.", "Four census populations recounted another way all agree; three are named as uncheckable.", "31 of 1,428 seals record no output (16 specs); 3 of those are missing from the debt ledger.", "11 specs refused at parse, 0 blocked only by prose, 23 broken on purpose as fixtures.", "12 Lean files, 15,553 lines and 4 sorry, are reached by no build root: nothing compiles them.", "tri, railway, python3 and the loop directory: each present or not, in one call.", "The terminal for seven t27 backends: every command run on hello_world. 21 pass, 0 fail.", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "Pick a lane and see whether the TRI decision layer beats the baseline on the same issue.", "One tick of the Queen's loop: an anomaly scan that reports only what changed.", "The loop's skills checked against snapshots before an agent may use them.", "Three performance bits, and one knockout bitstream per bit to prove each one matters.", "", "", "73 published posts with date, language and revision, newest first.", "6 of 6 self-tests hold: anomalies, blog_drift, lessons, site_gate, tick, vault."]; ; --- Ideas: asked for, not built --------------------------------------------------------------- ; From what engineers share today (gh-skyline, Tiny Tapeout renders, Wrapped cards, Gatle-style @@ -119,9 +119,9 @@ test the_fpga_shelf_comes_first_and_opens_on_the_board { } test the_arena_is_a_tab_and_says_its_own_words { - assert WIDGET_IDS[271] == "wars"; - assert WIDGET_KINDS[271] == "tab"; - assert WIDGET_PAGES[271] == "wars"; + assert WIDGET_IDS[273] == "wars"; + assert WIDGET_KINDS[273] == "tab"; + assert WIDGET_PAGES[273] == "wars"; } test the_gallery_posts_nothing { @@ -157,8 +157,8 @@ test the_verification_shelf_is_rehearsals_and_audits { test ideas_are_counted_apart_from_widgets { assert IDEA_COUNT == 6; - assert WIDGET_IDS[276] == "gatle"; - assert WIDGET_COUNT == 279; + assert WIDGET_IDS[278] == "gatle"; + assert WIDGET_COUNT == 281; } test the_ternary_machine_shelf_runs_before_the_arena { @@ -172,9 +172,9 @@ test every_tool_lives_under_widgets_and_keeps_its_words_on_its_page { assert WIDGET_KINDS[9] == "tool"; assert WIDGET_PAGES[9] == "widgets/bit-diff/"; assert WIDGET_HOOKS[9] == ""; - assert WIDGET_KINDS[275] == "tool"; - assert WIDGET_CATEGORIES[275] == "game"; - assert WIDGET_PAGES[275] == "widgets/race-the-bee/"; + assert WIDGET_KINDS[277] == "tool"; + assert WIDGET_CATEGORIES[277] == "game"; + assert WIDGET_PAGES[277] == "widgets/race-the-bee/"; } test the_arithmetic_shelf_closes_the_fpga_bench { @@ -192,5 +192,5 @@ test the_neural_network_shelf_runs_before_the_arena { assert WIDGET_PAGES[244] == "widgets/nn-relu/"; assert WIDGET_IDS[270] == "nn-ppo"; assert WIDGET_CATEGORIES[270] == "compiler"; - assert WIDGET_IDS[271] == "wars"; + assert WIDGET_IDS[273] == "wars"; } diff --git a/apps/website/public/widgets/t27t-savings/index.html b/apps/website/public/widgets/t27t-savings/index.html new file mode 100644 index 0000000000..ef6aa2e95a --- /dev/null +++ b/apps/website/public/widgets/t27t-savings/index.html @@ -0,0 +1,47 @@ +<!doctype html> +<!-- Generated by scripts/widget-pages-from-spec.mjs from specs/widgets/t27t-savings.t27 (sha256 81afe3c1631545a1); do not edit. --> +<html lang="en"> +<head> +<meta charset="utf-8"> +<meta name="viewport" content="width=device-width,initial-scale=1"> +<title>t27t run savings: int8 tensor cores forward, bf16 gradients · Trinity S³AI + + + + + + + + + + + + + + + + + + + + + + + + +
+Trinity S³AI +

t27t run savings: int8 tensor cores forward, bf16 gradients

+

Forward GEMMs on int8 tensor cores, gradients in bf16: a run saves f x (1 - 1/s), 16% to 24%, or $16 to $24 of every $100. f, the share of a step in forward GEMMs, is not measured.

+
+
+ +
+

This page sets no cookie and sends nothing anywhere.

+
Where the numbers come from
  • gHashTag/t27 specs/t27t/t27t.t27 (gHashTag/t27#10789, PR #10790): the saving law saving_e3, the bench times and pick_path; t27c 0.5.2 test-report on the Railway lab, 8 of 8 tests pass, 3 invariants, 0 vacuous; tri t27t runs it
  • gHashTag/t27#10360: the GEMM bench, one RTX 4090, 2026-10-18, five training GEMM shapes, times printed to four digits; the int8 times are the best CUTLASS 3.5.1 s8 kernel, standing in for torch._int_mm, which was not timed itself
  • The rows f = 1/4 and f = 1/3 are the cost table #10360 printed; f = 1/5 and f = 1/2 are what-ifs from the same formula, shown because f has not been measured
+

This widget's .t27 source · All widgets

+
+ + + + diff --git a/apps/website/public/widgets/t27t-savings/t27t-savings.t27 b/apps/website/public/widgets/t27t-savings/t27t-savings.t27 new file mode 100644 index 0000000000..8a1b6ae90e --- /dev/null +++ b/apps/website/public/widgets/t27t-savings/t27t-savings.t27 @@ -0,0 +1,128 @@ +// SPDX-License-Identifier: Apache-2.0 +; specs/widgets/t27t-savings.t27 -- what a training run saves when t27t moves the forward GEMMs to int8 +; Source of truth for public/widgets/t27t-savings/ (gHashTag/trinity): scripts/widget-pages-from-spec.mjs +; compiles this file, checks its constants, evaluates the tests below and writes the page. tool.js is +; one import of ../infographic.js, which draws SAY_TABLE_* as a real
and SAY_FLOW_* as an SVG +; diagram with a , black and white, and holds no words of its own. ASCII only (L3), English +; only (LANG-EN). +; The law and the bench are gHashTag/t27 specs/t27t/t27t.t27 (module T27t, gHashTag/t27#10789): the +; saving is f x (1 - 1/s), where s is the int8 tensor-core speed over bf16 and f is the share of a +; training step spent in forward GEMMs. Every cell of the table is recomputed by the tests below with +; the same integer formula as T27t.saving_e3 (tenths of a percent, rounded half up). The rows f = 1/4 +; and f = 1/3 are the #10360 cost table; f = 1/5 and f = 1/2 are what-ifs, because f was never measured. +; phi^2 + 1/phi^2 = 3 | TRINITY + +module widget_t27t_savings; + +pub const KIND : str = "widget-tool"; +pub const ID : str = "t27t-savings"; +pub const TITLE : str = "t27t run savings: int8 tensor cores forward, bf16 gradients"; +pub const DESCRIPTION : str = "Forward GEMMs on int8 tensor cores, gradients in bf16: a run saves f x (1 - 1/s), 16% to 24%, or $16 to $24 of every $100. f, the share of a step in forward GEMMs, is not measured."; +pub const IMAGE_ALT : str = "The t27t saving law f x (1 - 1/s). Measured on an RTX 4090: int8 tensor cores 2.9x to 3.5x bf16, dp4a 0.91x to 0.94x. With f between 1/4 and 1/3 a run saves 16% to 24%, $16 to $24 per $100. f is not measured."; +pub const HOOK : str = "Forward GEMMs on int8 tensor cores, gradients in bf16: 16% to 24% off a training run. No custom CUDA backend. f is still an estimate."; +pub const CATEGORY : str = "compiler"; +pub const DATA_SOURCES : [3]str = ["gHashTag/t27 specs/t27t/t27t.t27 (gHashTag/t27#10789, PR #10790): the saving law saving_e3, the bench times and pick_path; t27c 0.5.2 test-report on the Railway lab, 8 of 8 tests pass, 3 invariants, 0 vacuous; tri t27t runs it", "gHashTag/t27#10360: the GEMM bench, one RTX 4090, 2026-10-18, five training GEMM shapes, times printed to four digits; the int8 times are the best CUTLASS 3.5.1 s8 kernel, standing in for torch._int_mm, which was not timed itself", "The rows f = 1/4 and f = 1/3 are the cost table #10360 printed; f = 1/5 and f = 1/2 are what-ifs from the same formula, shown because f has not been measured"]; +pub const READS_LOCAL_FILES : bool = false; +pub const SENDS_NOTHING : bool = true; + +; --- The table: one row per f, one column per s ------------------------------------------------ +pub const SAY_TABLE_CAPTION : str = "Share of the run saved, and dollars saved per $100, for f x (1 - 1/s)"; +pub const SAY_TABLE_HEAD : [5]str = ["f, share of step time in forward GEMMs", "s = 2.9x", "s = 3.2x", "s = 3.5x", "Ceiling, s unbounded"]; +pub const SAY_TABLE_CELLS : [20]str = [ + "1/5 (what-if)", "13.1%, $13", "13.8%, $14", "14.3%, $14", "20%", + "1/4 (#10360 low estimate)", "16.4%, $16", "17.2%, $17", "17.9%, $18", "25%", + "1/3 (#10360 high estimate)", "21.8%, $22", "22.9%, $23", "23.8%, $24", "33.3%", + "1/2 (what-if)", "32.8%, $33", "34.4%, $34", "35.7%, $36", "50%" +]; +pub const K_TABLE_COLS : u8 = 5; +pub const K_TABLE_ROWS : u8 = 4; +pub const K_TABLE_CELLS : u16 = 20; + +; --- The numbers behind the cells ------------------------------------------------------------- +; s in hundredths (the #10360 columns), f as 1/K_F_DEN, savings in tenths of a percent, row-major. +pub const K_S_E2 : [3]u32 = [290, 320, 350]; +pub const K_F_DEN : [4]u32 = [5, 4, 3, 2]; +pub const K_SAVING_E3 : [12]u32 = [131, 138, 143, 164, 172, 179, 218, 229, 238, 328, 344, 357]; +pub const K_DOLLARS_PER_100 : [12]u32 = [13, 14, 14, 16, 17, 18, 22, 23, 24, 33, 34, 36]; +pub const K_LOW_PCT : u32 = 16; +pub const K_HIGH_PCT : u32 = 24; +pub const K_F_MEASURED : bool = false; + +; --- The bench (#10360): times in 1e-4 ms, ratios over bf16 in hundredths, as printed ------------ +pub const K_T_BF16 : [5]u32 = [2254, 2239, 8540, 8506, 3215]; +pub const K_T_INT8_TC : [5]u32 = [770, 773, 2701, 2399, 1007]; +pub const K_T_DP4A : [5]u32 = [2406, 2470, 9234, 9278, 3460]; +pub const K_X_INT8_TC_PRINTED : [5]u32 = [293, 290, 316, 354, 319]; +pub const K_X_DP4A_PRINTED : [5]u32 = [94, 91, 92, 92, 93]; + +; --- The diagram and the note ---------------------------------------------------------------- +pub const SAY_FLOW_TITLE : str = "Where the saving comes from"; +pub const SAY_FLOW_STEPS : [6]str = ["forward GEMMs move to int8", "int8 tensor cores: 2.9x to 3.5x bf16", "backward and gradients: bf16", "saving = f x (1 - 1/s)", "f = 1/4 to 1/3: 16% to 24%", "f itself: an estimate, not measured"]; +pub const SAY_NOTE : str = "Measured on one RTX 4090, 2026-10-18 (gHashTag/t27#10360): int8 tensor cores ran 2.90x to 3.54x bf16 on five training GEMM shapes, under the 4x of the datasheet. dp4a on CUDA cores ran 0.91x to 0.94x, slower than bf16 on every shape, so t27t never picks it. No custom CUDA backend is needed: PyTorch reaches the int8 tensor cores through torch._int_mm, and a kernel generated by t27c would take over only at 1.10x of tuned CUTLASS or better. Not measured: f, the share of a training step spent in forward GEMMs; the cost of quantizing activations from bf16 to int8; torch._int_mm itself (the int8 times are the best CUTLASS s8 kernel); and a run end to end, because the runner, gHashTag/igla-coder-gpu, does not call torch._int_mm yet. Run the law yourself: tri t27t."; + +test the_cells_fill_whole_rows { + assert K_TABLE_ROWS * K_TABLE_COLS == K_TABLE_CELLS; + assert K_TABLE_ROWS * 3 == 12; +} + +test every_saving_is_f_times_one_minus_one_over_s { + assert K_SAVING_E3[0] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[0] * K_S_E2[0]) / (2 * K_F_DEN[0] * K_S_E2[0]); + assert K_SAVING_E3[1] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[0] * K_S_E2[1]) / (2 * K_F_DEN[0] * K_S_E2[1]); + assert K_SAVING_E3[2] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[0] * K_S_E2[2]) / (2 * K_F_DEN[0] * K_S_E2[2]); + assert K_SAVING_E3[3] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[1] * K_S_E2[0]) / (2 * K_F_DEN[1] * K_S_E2[0]); + assert K_SAVING_E3[4] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[1] * K_S_E2[1]) / (2 * K_F_DEN[1] * K_S_E2[1]); + assert K_SAVING_E3[5] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[1] * K_S_E2[2]) / (2 * K_F_DEN[1] * K_S_E2[2]); + assert K_SAVING_E3[6] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[2] * K_S_E2[0]) / (2 * K_F_DEN[2] * K_S_E2[0]); + assert K_SAVING_E3[7] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[2] * K_S_E2[1]) / (2 * K_F_DEN[2] * K_S_E2[1]); + assert K_SAVING_E3[8] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[2] * K_S_E2[2]) / (2 * K_F_DEN[2] * K_S_E2[2]); + assert K_SAVING_E3[9] == (2000 * (K_S_E2[0] - 100) + K_F_DEN[3] * K_S_E2[0]) / (2 * K_F_DEN[3] * K_S_E2[0]); + assert K_SAVING_E3[10] == (2000 * (K_S_E2[1] - 100) + K_F_DEN[3] * K_S_E2[1]) / (2 * K_F_DEN[3] * K_S_E2[1]); + assert K_SAVING_E3[11] == (2000 * (K_S_E2[2] - 100) + K_F_DEN[3] * K_S_E2[2]) / (2 * K_F_DEN[3] * K_S_E2[2]); +} + +test every_dollar_figure_is_its_saving_rounded { + assert K_DOLLARS_PER_100[0] == (K_SAVING_E3[0] + 5) / 10; + assert K_DOLLARS_PER_100[1] == (K_SAVING_E3[1] + 5) / 10; + assert K_DOLLARS_PER_100[2] == (K_SAVING_E3[2] + 5) / 10; + assert K_DOLLARS_PER_100[3] == (K_SAVING_E3[3] + 5) / 10; + assert K_DOLLARS_PER_100[4] == (K_SAVING_E3[4] + 5) / 10; + assert K_DOLLARS_PER_100[5] == (K_SAVING_E3[5] + 5) / 10; + assert K_DOLLARS_PER_100[6] == (K_SAVING_E3[6] + 5) / 10; + assert K_DOLLARS_PER_100[7] == (K_SAVING_E3[7] + 5) / 10; + assert K_DOLLARS_PER_100[8] == (K_SAVING_E3[8] + 5) / 10; + assert K_DOLLARS_PER_100[9] == (K_SAVING_E3[9] + 5) / 10; + assert K_DOLLARS_PER_100[10] == (K_SAVING_E3[10] + 5) / 10; + assert K_DOLLARS_PER_100[11] == (K_SAVING_E3[11] + 5) / 10; +} + +test the_headline_range_is_the_estimated_rows { + assert K_LOW_PCT == (K_SAVING_E3[3] + 5) / 10; + assert K_HIGH_PCT == (K_SAVING_E3[8] + 5) / 10; + assert K_F_MEASURED == false; +} + +test every_printed_int8_ratio_is_within_one_hundredth_of_the_times { + assert K_X_INT8_TC_PRINTED[0] + 1 >= (K_T_BF16[0] * 200 + K_T_INT8_TC[0]) / (2 * K_T_INT8_TC[0]); + assert K_X_INT8_TC_PRINTED[0] <= (K_T_BF16[0] * 200 + K_T_INT8_TC[0]) / (2 * K_T_INT8_TC[0]) + 1; + assert K_X_INT8_TC_PRINTED[1] + 1 >= (K_T_BF16[1] * 200 + K_T_INT8_TC[1]) / (2 * K_T_INT8_TC[1]); + assert K_X_INT8_TC_PRINTED[1] <= (K_T_BF16[1] * 200 + K_T_INT8_TC[1]) / (2 * K_T_INT8_TC[1]) + 1; + assert K_X_INT8_TC_PRINTED[2] + 1 >= (K_T_BF16[2] * 200 + K_T_INT8_TC[2]) / (2 * K_T_INT8_TC[2]); + assert K_X_INT8_TC_PRINTED[2] <= (K_T_BF16[2] * 200 + K_T_INT8_TC[2]) / (2 * K_T_INT8_TC[2]) + 1; + assert K_X_INT8_TC_PRINTED[3] + 1 >= (K_T_BF16[3] * 200 + K_T_INT8_TC[3]) / (2 * K_T_INT8_TC[3]); + assert K_X_INT8_TC_PRINTED[3] <= (K_T_BF16[3] * 200 + K_T_INT8_TC[3]) / (2 * K_T_INT8_TC[3]) + 1; + assert K_X_INT8_TC_PRINTED[4] + 1 >= (K_T_BF16[4] * 200 + K_T_INT8_TC[4]) / (2 * K_T_INT8_TC[4]); + assert K_X_INT8_TC_PRINTED[4] <= (K_T_BF16[4] * 200 + K_T_INT8_TC[4]) / (2 * K_T_INT8_TC[4]) + 1; +} + +test dp4a_is_slower_than_bf16_on_every_shape { + assert K_T_DP4A[0] > K_T_BF16[0]; + assert K_T_DP4A[1] > K_T_BF16[1]; + assert K_T_DP4A[2] > K_T_BF16[2]; + assert K_T_DP4A[3] > K_T_BF16[3]; + assert K_T_DP4A[4] > K_T_BF16[4]; + assert K_X_DP4A_PRINTED[0] == (K_T_BF16[0] * 200 + K_T_DP4A[0]) / (2 * K_T_DP4A[0]); + assert K_X_DP4A_PRINTED[1] == (K_T_BF16[1] * 200 + K_T_DP4A[1]) / (2 * K_T_DP4A[1]); + assert K_X_DP4A_PRINTED[2] == (K_T_BF16[2] * 200 + K_T_DP4A[2]) / (2 * K_T_DP4A[2]); + assert K_X_DP4A_PRINTED[3] == (K_T_BF16[3] * 200 + K_T_DP4A[3]) / (2 * K_T_DP4A[3]); + assert K_X_DP4A_PRINTED[4] == (K_T_BF16[4] * 200 + K_T_DP4A[4]) / (2 * K_T_DP4A[4]); +} diff --git a/apps/website/specs/course/neural-networks.t27 b/apps/website/specs/course/neural-networks.t27 index 1d004ddf19..d967bf9e59 100644 --- a/apps/website/specs/course/neural-networks.t27 +++ b/apps/website/specs/course/neural-networks.t27 @@ -171,7 +171,7 @@ pub const LESSON_ALSO : [27]str = [ "nn-sgd,nn-rmsprop,nn-lamb", "nn-xor,nn-lamb,tc-tiny-layer", "nn-backprop,nn-lamb,tc-tiny-layer", - "nn-adam,nn-xor,nn-backprop", + "nn-adam,nn-xor,nn-backprop,t27t-savings", "nn-lstm,nn-attention", "nn-rnn,nn-attention,nn-sigmoid", "nn-rnn,nn-lstm,nn-encoder", diff --git a/apps/website/src/lib/course.generated.ts b/apps/website/src/lib/course.generated.ts index 858a1c0ec0..9180202c23 100644 --- a/apps/website/src/lib/course.generated.ts +++ b/apps/website/src/lib/course.generated.ts @@ -1,5 +1,5 @@ // GENERATED by scripts/course-from-spec.mjs from specs/course/courses.t27, specs/course/t27-basics.t27, specs/course/course.t27, specs/course/ai-numbers.t27, specs/course/goldenfloat.t27, specs/course/verify-hardware.t27, specs/course/clocks-and-cdc.t27, specs/course/buses-and-peripherals.t27, specs/course/ternary-computing.t27, specs/course/arithmetic-and-dsp.t27, specs/course/neural-networks.t27 and their Russian bundles -// spec sha256 t27-basics 4827f6b9f5d95ae98e1d49f037966d2cc826e07c691044f2f5fa1ee9c98ae474, course 8429472829c5d9a0782b2d2b21ff26879a429c5470f4abb5088f1e1a7fa674be, ai-numbers 7f736e357ef13446dfa8f978482cc28c7710caac3f7396769a8fc01b91e20802, goldenfloat d6b6019b8e6bf77a41991b32a3a3d1b5eb78ca4b7078e2bf5f5436df3dd7c59c, verify-hardware 7ca437575eaa8f8646f42c82b75862f091fb509708de152c4e18ed76ee39d4cf, clocks-and-cdc 7d491967f9326fcde194ab19a9bfa7f0ed960ba94d7ca3d82df0747e269c5acc, buses-and-peripherals 4dfdbd8c909d7ad8f1ac2d4f7025c77f0619ade92b181212ea9b589262695acc, ternary-computing e0a14010163f00208d5b54c800e6ce3f05e6b8581de94c0323097b00b1854437, arithmetic-and-dsp c2b6bfd642e88caadaff9da965ac49172b389427b574b27d4c64145851bc206d, neural-networks d6cffe6af3c2bd2ce3f73272eee7cca3e463f8f8e4e034d1dbc39f7f43083bc1 +// spec sha256 t27-basics 4827f6b9f5d95ae98e1d49f037966d2cc826e07c691044f2f5fa1ee9c98ae474, course 8429472829c5d9a0782b2d2b21ff26879a429c5470f4abb5088f1e1a7fa674be, ai-numbers 7f736e357ef13446dfa8f978482cc28c7710caac3f7396769a8fc01b91e20802, goldenfloat 72dcbaaf0e0519e7190ec95773c8a7229106b416c3cf2e0ae03a52e371ae56f2, verify-hardware 7ca437575eaa8f8646f42c82b75862f091fb509708de152c4e18ed76ee39d4cf, clocks-and-cdc 7d491967f9326fcde194ab19a9bfa7f0ed960ba94d7ca3d82df0747e269c5acc, buses-and-peripherals 4dfdbd8c909d7ad8f1ac2d4f7025c77f0619ade92b181212ea9b589262695acc, ternary-computing e0a14010163f00208d5b54c800e6ce3f05e6b8581de94c0323097b00b1854437, arithmetic-and-dsp c2b6bfd642e88caadaff9da965ac49172b389427b574b27d4c64145851bc206d, neural-networks 11edc9e29a203d243052e1aff660e3daec531202f6eb0846772e9acca72a8a7e // Do not edit: change the .t27 source (or a Russian bundle) and regenerate. export const COURSES = [ @@ -3762,7 +3762,7 @@ export const COURSES = [ "publicSpec": "public/learn/goldenfloat.t27", "ruContract": "specs/course/goldenfloat-ru.t27", "ruBundle": "apps/website/i18n/goldenfloat.ru.json", - "sha256": "d6b6019b8e6bf77a41991b32a3a3d1b5eb78ca4b7078e2bf5f5436df3dd7c59c", + "sha256": "72dcbaaf0e0519e7190ec95773c8a7229106b416c3cf2e0ae03a52e371ae56f2", "schemaVersion": 1, "gallery": "specs/widgets/gallery.t27" }, @@ -4015,7 +4015,16 @@ export const COURSES = [ "preview": "widgets/golden-split/index.html?embed=1", "height": 640 }, - "also": [], + "also": [ + { + "id": "paper-claims", + "kind": "tool", + "title": "Three format papers, 45 printed numbers, recomputed exactly", + "url": "https://t27.ai/widgets/paper-claims/", + "preview": "widgets/paper-claims/index.html?embed=1", + "height": 640 + } + ], "spec": { "path": "specs/numeric/goldenfloat_family.t27", "source": "t27/files/specs/numeric/goldenfloat_family.t27", @@ -11884,7 +11893,7 @@ export const COURSES = [ "publicSpec": "public/learn/neural-networks.t27", "ruContract": "specs/course/neural-networks-ru.t27", "ruBundle": "apps/website/i18n/neural-networks.ru.json", - "sha256": "d6cffe6af3c2bd2ce3f73272eee7cca3e463f8f8e4e034d1dbc39f7f43083bc1", + "sha256": "11edc9e29a203d243052e1aff660e3daec531202f6eb0846772e9acca72a8a7e", "schemaVersion": 1, "gallery": "specs/widgets/gallery.t27" }, @@ -13253,6 +13262,14 @@ export const COURSES = [ "url": "https://t27.ai/widgets/nn-backprop/", "preview": "widgets/nn-backprop/index.html?embed=1", "height": 760 + }, + { + "id": "t27t-savings", + "kind": "tool", + "title": "t27t run savings: int8 tensor cores forward, bf16 gradients", + "url": "https://t27.ai/widgets/t27t-savings/", + "preview": "widgets/t27t-savings/index.html?embed=1", + "height": 760 } ], "spec": { diff --git a/apps/website/src/lib/queenWidgets.generated.ts b/apps/website/src/lib/queenWidgets.generated.ts index ec049a5412..ff7a602715 100644 --- a/apps/website/src/lib/queenWidgets.generated.ts +++ b/apps/website/src/lib/queenWidgets.generated.ts @@ -1,12 +1,12 @@ // GENERATED by scripts/widgets-from-spec.mjs from specs/widgets/gallery.t27 -// spec sha256 1f89127fb05172d18af3b035147793a5729c85ef722609555e2e7de68d43b7eb +// spec sha256 9235539dcd99b457e3429b925a14b7438bf73f6a098052bc24f0d75b1237c8a8 // Do not edit: change the .t27 source and regenerate. export const QUEEN_WIDGETS = { "source": { "spec": "specs/widgets/gallery.t27", "publicSpec": "public/widgets/gallery.t27", - "sha256": "1f89127fb05172d18af3b035147793a5729c85ef722609555e2e7de68d43b7eb", + "sha256": "9235539dcd99b457e3429b925a14b7438bf73f6a098052bc24f0d75b1237c8a8", "schemaVersion": 1 }, "name": "t27 widgets", @@ -5014,6 +5014,40 @@ export const QUEEN_WIDGETS = { "iframe": "<iframe src=\"https://t27.ai/widgets/nn-ppo/?embed=1\" width=\"640\" height=\"460\" loading=\"lazy\" style=\"border:0\" title=\"PPO: how an agent learns from reward without lurching\"></iframe>", "markdown": "[![PPO: how an agent learns from reward without lurching](https://t27.ai/widgets/nn-ppo/card.png?v=432b62b0ecd7)](https://t27.ai/widgets/nn-ppo/)" }, + { + "id": "paper-claims", + "kind": "tool", + "category": "compiler", + "hook": "45 numbers from three format papers, recomputed in exact integers. 34 fit. 8 do not.", + "title": "Three format papers, 45 printed numbers, recomputed exactly", + "line": "Every number the GoldenFloat, Golden Ruler and TNF papers print that a rule can recompute, run through exact integer arithmetic in a t27 spec: 34 fit, 8 do not, 3 cannot be checked.", + "url": "https://t27.ai/widgets/paper-claims/", + "view": null, + "image": "https://t27.ai/widgets/paper-claims/card.png?v=21be18ba1bba", + "gif": null, + "preview": "widgets/paper-claims/index.html?embed=1", + "commands": [], + "recorded": null, + "iframe": "<iframe src=\"https://t27.ai/widgets/paper-claims/?embed=1\" width=\"640\" height=\"460\" loading=\"lazy\" style=\"border:0\" title=\"Three format papers, 45 printed numbers, recomputed exactly\"></iframe>", + "markdown": "[![Three format papers, 45 printed numbers, recomputed exactly](https://t27.ai/widgets/paper-claims/card.png?v=21be18ba1bba)](https://t27.ai/widgets/paper-claims/)" + }, + { + "id": "t27t-savings", + "kind": "tool", + "category": "compiler", + "hook": "Forward GEMMs on int8 tensor cores, gradients in bf16: 16% to 24% off a training run. No custom CUDA backend. f is still an estimate.", + "title": "t27t run savings: int8 tensor cores forward, bf16 gradients", + "line": "Forward GEMMs on int8 tensor cores, gradients in bf16: a run saves f x (1 - 1/s), 16% to 24%, or $16 to $24 of every $100. f, the share of a step in forward GEMMs, is not measured.", + "url": "https://t27.ai/widgets/t27t-savings/", + "view": null, + "image": "https://t27.ai/widgets/t27t-savings/card.png?v=6fea68ed363c", + "gif": null, + "preview": "widgets/t27t-savings/index.html?embed=1", + "commands": [], + "recorded": null, + "iframe": "<iframe src=\"https://t27.ai/widgets/t27t-savings/?embed=1\" width=\"640\" height=\"460\" loading=\"lazy\" style=\"border:0\" title=\"t27t run savings: int8 tensor cores forward, bf16 gradients\"></iframe>", + "markdown": "[![t27t run savings: int8 tensor cores forward, bf16 gradients](https://t27.ai/widgets/t27t-savings/card.png?v=6fea68ed363c)](https://t27.ai/widgets/t27t-savings/)" + }, { "id": "wars", "kind": "tab",