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/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/paper-claims/card.png b/apps/website/public/widgets/paper-claims/card.png new file mode 100644 index 0000000000..0ff7a09a34 Binary files /dev/null and b/apps/website/public/widgets/paper-claims/card.png differ 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..df6958e9e8 --- /dev/null +++ b/apps/website/public/widgets/paper-claims/index.html @@ -0,0 +1,47 @@ + + + + + + +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.

+
+
+ + + + + + 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..8c6e0e79c3 --- /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 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" +]; +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/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/public/widgets/t27t-savings/card.png b/apps/website/public/widgets/t27t-savings/card.png new file mode 100644 index 0000000000..d96a95d620 Binary files /dev/null and b/apps/website/public/widgets/t27t-savings/card.png differ 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.

+
+
+ + + + + + 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/public/widgets/t27t-savings/tool.js b/apps/website/public/widgets/t27t-savings/tool.js new file mode 100644 index 0000000000..659695dd97 --- /dev/null +++ b/apps/website/public/widgets/t27t-savings/tool.js @@ -0,0 +1,3 @@ +// t27t-savings/tool.js -- the run-savings law of t27t. The words and cells are in +// specs/widgets/t27t-savings.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/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/specs/widgets/gallery.t27 b/apps/website/specs/widgets/gallery.t27 index 17117ac2a9..4b9ebb448b 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 : 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/specs/widgets/paper-claims.t27 b/apps/website/specs/widgets/paper-claims.t27 new file mode 100644 index 0000000000..8c6e0e79c3 --- /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 <table> and SAY_FLOW_* as an SVG diagram with a +; <title>, 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 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" +]; +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/specs/widgets/t27t-savings.t27 b/apps/website/specs/widgets/t27t-savings.t27 new file mode 100644 index 0000000000..8a1b6ae90e --- /dev/null +++ b/apps/website/specs/widgets/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 <table> and SAY_FLOW_* as an SVG +; diagram with a <title>, 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/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..22d0cd65cb --- /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 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', + 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 тестовых векторов — аппаратный результат, пересчитать его здесь нельзя. Тактовую частоту, которую аннотация печатает рядом с ними, сам t27 отозвал 2026-08-18 (RESEARCH_CLAIMS.md): это частота переключения кольцевого генератора, а не путь через арифметику GF16, и в статье она всё ещё стоит.', + }, + { + 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/bodies/training-cheaper-on-int8-tensor-cores.ts b/apps/website/src/data/blog/bodies/training-cheaper-on-int8-tensor-cores.ts new file mode 100644 index 0000000000..edeb81a586 --- /dev/null +++ b/apps/website/src/data/blog/bodies/training-cheaper-on-int8-tensor-cores.ts @@ -0,0 +1,324 @@ +import type { Block } from '../types' + +// Every number here is a constant or a recomputation of gHashTag/t27 specs/t27t/t27t.t27 (module T27t, +// gHashTag/t27#10789, PR #10790): the #10360 GEMM bench on one RTX 4090, 2026-10-18, and the saving +// law f x (1 - 1/s). t27c 0.5.2 test-report on the Railway lab: 8 of 8 tests pass, 3 invariants, 0 vacuous. +// The widget t27t-savings recomputes every cell of the cost grid in its own spec tests. +// The figures are static SVG strings: no drawing code. + +// Speed over bf16 per shape: 100 px per 1.0x, bars start at x = 240, so bf16 is x = 340 and the 4x +// datasheet figure is x = 640. int8 TC: 2.93 2.90 3.16 3.54 3.19; dp4a: 0.94 0.91 0.92 0.92 0.93. +const SPEED_BARS = + '<text x="10" y="66" font-size="13" fill="currentColor">4096x3456x1280, FFN up</text>' + + '<rect x="240" y="44" width="293" height="18" fill="#ffd700"/><text x="527" y="58" font-size="12" text-anchor="end" fill="#000">2.93x</text>' + + '<rect x="240" y="66" width="94" height="18" fill="#ff5c5c"/><text x="348" y="80" font-size="12" fill="currentColor" fill-opacity="0.85">0.94x</text>' + + '<text x="10" y="116" font-size="13" fill="currentColor">4096x1280x3456, FFN down</text>' + + '<rect x="240" y="94" width="290" height="18" fill="#ffd700"/><text x="524" y="108" font-size="12" text-anchor="end" fill="#000">2.90x</text>' + + '<rect x="240" y="116" width="91" height="18" fill="#ff5c5c"/><text x="348" y="130" font-size="12" fill="currentColor" fill-opacity="0.85">0.91x</text>' + + '<text x="10" y="166" font-size="13" fill="currentColor">16384x3456x1280</text>' + + '<rect x="240" y="144" width="316" height="18" fill="#ffd700"/><text x="550" y="158" font-size="12" text-anchor="end" fill="#000">3.16x</text>' + + '<rect x="240" y="166" width="92" height="18" fill="#ff5c5c"/><text x="348" y="180" font-size="12" fill="currentColor" fill-opacity="0.85">0.92x</text>' + + '<text x="10" y="216" font-size="13" fill="currentColor">16384x1280x3456</text>' + + '<rect x="240" y="194" width="354" height="18" fill="#ffd700"/><text x="588" y="208" font-size="12" text-anchor="end" fill="#000">3.54x</text>' + + '<rect x="240" y="216" width="92" height="18" fill="#ff5c5c"/><text x="348" y="230" font-size="12" fill="currentColor" fill-opacity="0.85">0.92x</text>' + + '<text x="10" y="266" font-size="13" fill="currentColor">16384x1280x1280, attn</text>' + + '<rect x="240" y="244" width="319" height="18" fill="#ffd700"/><text x="553" y="258" font-size="12" text-anchor="end" fill="#000">3.19x</text>' + + '<rect x="240" y="266" width="93" height="18" fill="#ff5c5c"/><text x="348" y="280" font-size="12" fill="currentColor" fill-opacity="0.85">0.93x</text>' + + '<line x1="340" y1="36" x2="340" y2="292" stroke="currentColor" stroke-opacity="0.7" stroke-width="1.5"/>' + + '<line x1="640" y1="36" x2="640" y2="292" stroke="currentColor" stroke-opacity="0.5" stroke-dasharray="5 4"/>' + +const FIG_SPEED_EN = + '<svg viewBox="0 0 720 320" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="GEMM speed over bf16 on an RTX 4090, five training shapes. int8 tensor cores: 2.93x, 2.90x, 3.16x, 3.54x, 3.19x. int8 dp4a on CUDA cores: 0.94x, 0.91x, 0.92x, 0.92x, 0.93x, slower than bf16 on every shape. The datasheet says 4x." style="width:100%;height:auto;font-family:inherit">' + + '<rect x="240" y="8" width="14" height="14" fill="#ffd700"/><text x="260" y="20" font-size="13" fill="currentColor">int8 tensor cores</text>' + + '<rect x="470" y="8" width="14" height="14" fill="#ff5c5c"/><text x="490" y="20" font-size="13" fill="currentColor">int8 dp4a, CUDA cores</text>' + + SPEED_BARS + + '<text x="340" y="310" font-size="12" text-anchor="middle" fill="currentColor">bf16 = 1.0x</text>' + + '<text x="640" y="310" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">datasheet 4x</text>' + + '</svg>' + +const FIG_SPEED_RU = + '<svg viewBox="0 0 720 320" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Скорость GEMM относительно bf16 на RTX 4090, пять форм из обучения. int8 на тензорных ядрах: 2.93x, 2.90x, 3.16x, 3.54x, 3.19x. int8 dp4a на ядрах CUDA: 0.94x, 0.91x, 0.92x, 0.92x, 0.93x, медленнее bf16 на каждой форме. В паспорте 4x." style="width:100%;height:auto;font-family:inherit">' + + '<rect x="240" y="8" width="14" height="14" fill="#ffd700"/><text x="260" y="20" font-size="13" fill="currentColor">int8, тензорные ядра</text>' + + '<rect x="470" y="8" width="14" height="14" fill="#ff5c5c"/><text x="490" y="20" font-size="13" fill="currentColor">int8 dp4a, ядра CUDA</text>' + + SPEED_BARS + + '<text x="340" y="310" font-size="12" text-anchor="middle" fill="currentColor">bf16 = 1.0x</text>' + + '<text x="640" y="310" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">паспорт 4x</text>' + + '</svg>' + +// One training step as a 600 px bar, f = 1/3, s = 3.2: forward GEMMs 200 px shrink to 62.5 px, +// the rest stays 400 px, and 137.5 px of 600 (22.9%) is saved. +const FIG_STEP_EN = + '<svg viewBox="0 0 720 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="One training step drawn as a bar. In bf16, forward GEMMs take a third and everything else two thirds. With the forward GEMMs on int8 tensor cores at 3.2x, the third shrinks to about a tenth; everything else stays the same; 22.9% of the step is saved." style="width:100%;height:auto;font-family:inherit">' + + '<text x="10" y="56" font-size="13" fill="currentColor">bf16</text>' + + '<rect x="100" y="34" width="200" height="34" fill="#ffd700"/><text x="200" y="56" font-size="12" text-anchor="middle" fill="#000">forward GEMMs, f = 1/3</text>' + + '<rect x="300" y="34" width="400" height="34" fill="currentColor" fill-opacity="0.25"/><text x="500" y="56" font-size="12" text-anchor="middle" fill="currentColor">backward in bf16, optimizer, data, the rest</text>' + + '<text x="10" y="136" font-size="13" fill="currentColor">int8 fwd</text>' + + '<rect x="100" y="114" width="62.5" height="34" fill="#ffd700"/>' + + '<rect x="162.5" y="114" width="400" height="34" fill="currentColor" fill-opacity="0.25"/><text x="362.5" y="136" font-size="12" text-anchor="middle" fill="currentColor">backward in bf16, optimizer, data, the rest</text>' + + '<rect x="562.5" y="114" width="137.5" height="34" fill="none" stroke="#ffd700" stroke-dasharray="5 4"/><text x="631" y="136" font-size="12" text-anchor="middle" fill="currentColor">saved: 22.9%</text>' + + '<text x="100" y="182" font-size="12" fill="currentColor" fill-opacity="0.8">One step, f = 1/3, s = 3.2x: only the yellow part gets faster, by s. The saving is f x (1 - 1/s).</text>' + + '</svg>' + +const FIG_STEP_RU = + '<svg viewBox="0 0 720 200" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Один шаг обучения в виде полосы. В bf16 прямые GEMM занимают треть, всё остальное две трети. Когда прямые GEMM идут на тензорных ядрах int8 в 3.2 раза быстрее, треть сжимается примерно до десятой; остальное не меняется; экономится 22.9% шага." style="width:100%;height:auto;font-family:inherit">' + + '<text x="10" y="56" font-size="13" fill="currentColor">bf16</text>' + + '<rect x="100" y="34" width="200" height="34" fill="#ffd700"/><text x="200" y="56" font-size="12" text-anchor="middle" fill="#000">прямые GEMM, f = 1/3</text>' + + '<rect x="300" y="34" width="400" height="34" fill="currentColor" fill-opacity="0.25"/><text x="500" y="56" font-size="12" text-anchor="middle" fill="currentColor">обратный проход в bf16, оптимизатор, данные</text>' + + '<text x="10" y="136" font-size="13" fill="currentColor">int8 вперёд</text>' + + '<rect x="100" y="114" width="62.5" height="34" fill="#ffd700"/>' + + '<rect x="162.5" y="114" width="400" height="34" fill="currentColor" fill-opacity="0.25"/><text x="362.5" y="136" font-size="12" text-anchor="middle" fill="currentColor">обратный проход в bf16, оптимизатор, данные</text>' + + '<rect x="562.5" y="114" width="137.5" height="34" fill="none" stroke="#ffd700" stroke-dasharray="5 4"/><text x="631" y="136" font-size="12" text-anchor="middle" fill="currentColor">сэкономлено: 22.9%</text>' + + '<text x="100" y="182" font-size="12" fill="currentColor" fill-opacity="0.8">Один шаг, f = 1/3, s = 3.2x: быстрее становится только жёлтая часть, в s раз. Экономия f x (1 - 1/s).</text>' + + '</svg>' + +// Saving against f, 0 to 0.5: x = 70 + 1240 f, y = 270 - 4.8 x (percent). Lines from the origin to +// f = 0.5: s = 2.9 ends at 32.76% (y 112.8), s = 3.5 at 35.71% (y 98.6), the ceiling (s unbounded) at +// 50% (y 30). The band is the #10360 estimate f = 1/4 to 1/3: x = 380 to 483.3. Points: 16.4% and +// 17.9% at 1/4, 21.8% and 23.8% at 1/3. +const LAW_PLOT = + '<rect x="380" y="30" width="103.3" height="240" fill="#ffd700" fill-opacity="0.14"/>' + + '<line x1="70" y1="270" x2="690" y2="270" stroke="currentColor" stroke-opacity="0.12"/><text x="62" y="274" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">0%</text>' + + '<line x1="70" y1="222" x2="690" y2="222" stroke="currentColor" stroke-opacity="0.12"/><text x="62" y="226" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">10%</text>' + + '<line x1="70" y1="174" x2="690" y2="174" stroke="currentColor" stroke-opacity="0.12"/><text x="62" y="178" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">20%</text>' + + '<line x1="70" y1="126" x2="690" y2="126" stroke="currentColor" stroke-opacity="0.12"/><text x="62" y="130" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">30%</text>' + + '<line x1="70" y1="78" x2="690" y2="78" stroke="currentColor" stroke-opacity="0.12"/><text x="62" y="82" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">40%</text>' + + '<line x1="70" y1="30" x2="690" y2="30" stroke="currentColor" stroke-opacity="0.12"/><text x="62" y="34" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">50%</text>' + + '<text x="70" y="288" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">0</text>' + + '<text x="194" y="288" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">0.1</text>' + + '<text x="318" y="288" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">0.2</text>' + + '<text x="442" y="288" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">0.3</text>' + + '<text x="566" y="288" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">0.4</text>' + + '<text x="690" y="288" font-size="12" text-anchor="middle" fill="currentColor" fill-opacity="0.8">0.5</text>' + + '<line x1="70" y1="270" x2="690" y2="30" stroke="currentColor" stroke-opacity="0.5" stroke-dasharray="5 4"/>' + + '<line x1="70" y1="270" x2="690" y2="98.6" stroke="#ffd700" stroke-width="2.5"/>' + + '<line x1="70" y1="270" x2="690" y2="112.8" stroke="#ffd700" stroke-width="2.5" stroke-opacity="0.6"/>' + + '<text x="628" y="106" font-size="12" text-anchor="middle" fill="currentColor">s = 3.5x</text>' + + '<text x="628" y="146" font-size="12" text-anchor="middle" fill="currentColor">s = 2.9x</text>' + + '<circle cx="380" cy="191.4" r="4" fill="#ffd700"/><circle cx="380" cy="184.3" r="4" fill="#ffd700"/>' + + '<circle cx="483.3" cy="165.2" r="4" fill="#ffd700"/><circle cx="483.3" cy="155.7" r="4" fill="#ffd700"/>' + + '<text x="372" y="200" font-size="12" text-anchor="end" fill="currentColor">16.4%</text>' + + '<text x="491" y="152" font-size="12" fill="currentColor">23.8%</text>' + +const FIG_LAW_EN = + '<svg viewBox="0 0 720 330" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Saving of a run against f, the share of step time spent in forward GEMMs, from 0 to 0.5. Two lines for s = 2.9x and s = 3.5x, and a dashed ceiling where saving equals f. The band from f = 1/4 to 1/3 is the estimate, not measured: there the saving is 16.4% to 23.8%." style="width:100%;height:auto;font-family:inherit">' + + LAW_PLOT + + '<text x="431.7" y="46" font-size="12" text-anchor="middle" fill="currentColor">estimate, not measured</text>' + + '<text x="590" y="50" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">ceiling: saving = f</text>' + + '<text x="380" y="310" font-size="12" text-anchor="middle" fill="currentColor">f, the share of step time in forward GEMMs</text>' + + '<text x="70" y="20" font-size="12" fill="currentColor">share of the run saved</text>' + + '<text x="690" y="326" font-size="11" text-anchor="end" fill="currentColor" fill-opacity="0.7">source: specs/t27t/t27t.t27, saving_e3</text>' + + '</svg>' + +const FIG_LAW_RU = + '<svg viewBox="0 0 720 330" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Экономия прогона в зависимости от f, доли времени шага на прямые GEMM, от 0 до 0.5. Две линии для s = 2.9x и s = 3.5x и пунктирный потолок, где экономия равна f. Полоса от f = 1/4 до 1/3 это оценка, не измерение: там экономия от 16.4% до 23.8%." style="width:100%;height:auto;font-family:inherit">' + + LAW_PLOT + + '<text x="431.7" y="46" font-size="12" text-anchor="middle" fill="currentColor">оценка, не измерено</text>' + + '<text x="590" y="50" font-size="12" text-anchor="end" fill="currentColor" fill-opacity="0.8">потолок: экономия = f</text>' + + '<text x="380" y="310" font-size="12" text-anchor="middle" fill="currentColor">f, доля времени шага на прямые GEMM</text>' + + '<text x="70" y="20" font-size="12" fill="currentColor">доля сэкономленного прогона</text>' + + '<text x="690" y="326" font-size="11" text-anchor="end" fill="currentColor" fill-opacity="0.7">источник: specs/t27t/t27t.t27, saving_e3</text>' + + '</svg>' + +export const body: Block[] = [ + { + kind: 'p', + text: 'Training gets cheaper when the forward GEMMs of a step run on int8 tensor cores and the gradients stay in bf16. On one RTX 4090 the int8 tensor cores ran 2.9x to 3.5x faster than bf16 on the five GEMM shapes of our training run. If forward GEMMs take a quarter to a third of a step, a run costs 16% to 24% less: $16 to $24 of every $100. No custom CUDA backend is needed for that, because PyTorch already reaches those cores through torch._int_mm. One number in that chain is still a guess: f, the share of step time spent in forward GEMMs. Nobody has measured it.', + }, + { + kind: 'p', + text: 'All of this now lives in one place: t27t, the t27 trainer. Its law is a t27 spec, specs/t27t/t27t.t27 in gHashTag/t27. It holds the bench times, every ratio recomputed from them, the saving formula, the rule that picks a GEMM path, and the list of what nobody measured. Its runner is the PyTorch trainer gHashTag/igla-coder-gpu, which stays in Python; t27t says what the runner must do.', + }, + { + kind: 'figure', + svg: FIG_SPEED_EN, + caption: 'Speed over bf16 for each of the five training shapes (M x N x K). Yellow: int8 on tensor cores, 2.90x to 3.54x, under the 4x of the datasheet. Red: int8 dp4a on ordinary CUDA cores, 0.91x to 0.94x, slower than bf16 on every shape. Source: gHashTag/t27#10360, one RTX 4090, 2026-10-18.', + }, + { kind: 'h', text: 'The bench' }, + { + kind: 'table', + head: ['Shape, M x N x K', 'bf16, ms', 'int8 TC, ms', 'int8 TC vs bf16', 'dp4a, ms', 'dp4a vs bf16'], + rows: [ + ['4096 x 3456 x 1280 (FFN up)', '0.2254', '0.0770', '2.93x', '0.2406', '0.94x'], + ['4096 x 1280 x 3456 (FFN down)', '0.2239', '0.0773', '2.90x', '0.2470', '0.91x'], + ['16384 x 3456 x 1280', '0.8540', '0.2701', '3.16x', '0.9234', '0.92x'], + ['16384 x 1280 x 3456', '0.8506', '0.2399', '3.54x', '0.9278', '0.92x'], + ['16384 x 1280 x 1280 (attn proj)', '0.3215', '0.1007', '3.19x', '0.3460', '0.93x'], + ], + }, + { + kind: 'p', + text: 'The spec recomputes every ratio from the two times beside it. The times have four printed digits, so the tests allow one hundredth of slack, and they need it once: 0.8506 / 0.2399 = 3.5456, printed as 3.54. The int8 times are the best CUTLASS 3.5.1 s8 kernel. They stand in for torch._int_mm, which was not timed itself.', + }, + { kind: 'h', text: 'The law: f x (1 - 1/s)' }, + { + kind: 'p', + text: 'Only the forward GEMMs get faster. The backward pass keeps its gradients in bf16, and the optimizer, the data loader and everything else do not change. So if f is the share of a step spent in forward GEMMs and s is how much faster int8 makes them, the step loses f x (1 - 1/s) of its time. Even an infinitely fast int8 kernel cannot save more than f.', + }, + { + kind: 'figure', + svg: FIG_STEP_EN, + caption: 'One step at f = 1/3 and s = 3.2x. The forward GEMMs shrink from a third of the step to about a tenth; the rest of the step stays as it was.', + }, + { + kind: 'table', + head: ['f, share of step time in forward GEMMs', 's = 2.9x', 's = 3.2x', 's = 3.5x'], + rows: [ + ['1/4', '16.4%, $16 per $100', '17.2%, $17', '17.9%, $18'], + ['1/3', '21.8%, $22 per $100', '22.9%, $23', '23.8%, $24'], + ], + }, + { + kind: 'figure', + svg: FIG_LAW_EN, + caption: 'The saving grows in a straight line with f, and the speed s only sets the slope. The yellow band is where f was assumed to be, not where it was measured. Outside the band the same formula gives 13% at f = 1/5 and 33% to 36% at f = 1/2.', + }, + { + kind: 'p', + text: 'All six cells are T27t.saving_e3 in tenths of a percent, rounded half up. The spec checks them against the cost table #10360 printed, and the widget t27t-savings checks them again in its own tests, together with two what-if rows for f = 1/5 and f = 1/2.', + }, + { kind: 'h', text: 'Why no custom CUDA backend' }, + { + kind: 'p', + text: 'The question behind #10360 was whether t27c needs its own CUDA or PTX backend to make training cheaper. It does not. The speed comes from the int8 tensor cores, and PyTorch reaches them already. The int8 path a backend could add on its own is dp4a on CUDA cores, and dp4a ran slower than plain bf16 on all five shapes. t27t writes this down as a rule, pick_path:', + }, + { + kind: 'ul', + items: [ + 'A forward GEMM goes to int8 tensor cores through torch._int_mm.', + 'A backward GEMM stays in bf16, and so does a GPU without int8 tensor cores.', + 'dp4a is never picked; two invariants of the spec say so.', + 'A kernel generated by t27c takes over only if it reaches 1.10x of tuned CUTLASS s8 or better.', + ], + }, + { kind: 'h', text: 'What nobody has measured' }, + { + kind: 'ul', + items: [ + 'f, the share of a real training step spent in forward GEMMs. The 1/4 to 1/3 is an estimate, and the spec says so: F_MEASURED = false.', + 'The cost of quantizing activations from bf16 to int8, and its kernel launch. It comes out of the saving.', + 'torch._int_mm itself, and cuBLAS under it; the bench timed CUTLASS.', + 'A run end to end. The runner gHashTag/igla-coder-gpu does not call torch._int_mm yet: RUNNER_USES_INT_MM = false.', + 'Whether int8 forward GEMMs change the loss curve. The bench measured speed, not quality.', + ], + }, + { + kind: 'p', + text: 'So 16% to 24% is what the law gives for the assumed f, not a saving anyone has billed. The next step is to time one real step, which gives f, and then to wire torch._int_mm into the runner and compare two runs.', + }, + { kind: 'h', text: 'The same habit, applied to papers' }, + { + kind: 'p', + text: 'The same week, t27 rechecked 45 numbers printed in three papers on number formats against the rules those papers state: GoldenFloat (arXiv:2606.05017), the Golden Ruler catalog (arXiv:2606.09686) and the TNF paper. 34 fit, 8 do not, and 3 cannot be checked. Golden Ruler says 12 clusters where its catalog has 13, and seven TNF numbers miss, four of them because two tables do not follow the rule Section 10 adopts. The method is the one used here: write the rule as a spec, recompute the printed number, and print what does not fit. The earlier post has all 45 rows.', + }, + { kind: 'h', text: 'Run it yourself' }, + { + kind: 'code', + text: '# in a gHashTag/t27 checkout, with t27c built\ntri t27t # the trainer law: 8 tests, 3 invariants\ntri papers # the 45 paper numbers', + }, + { + kind: 'p', + text: 'The widget at t27.ai/widgets/t27t-savings shows the whole grid, the path from int8 GEMMs to the saving, and the list of unmeasured inputs. Every cell there is recomputed by its spec\'s tests when the page is built.', + }, +] + +export const ruBody: Block[] = [ + { + kind: 'p', + text: 'Обучение дешевеет, если прямые GEMM шага считать на тензорных ядрах int8, а градиенты оставить в bf16. На одной RTX 4090 тензорные ядра int8 были в 2.9–3.5 раза быстрее bf16 на пяти формах GEMM из нашего обучения. Если прямые GEMM занимают от четверти до трети шага, прогон стоит на 16–24% меньше: $16–24 с каждых $100. Свой CUDA-бэкенд для этого не нужен: PyTorch уже достаёт до этих ядер через torch._int_mm. Одно число в этой цепочке пока догадка: f, доля времени шага на прямые GEMM. Её никто не мерил.', + }, + { + kind: 'p', + text: 'Теперь всё это собрано в одном месте: t27t, тренер t27. Его закон это спецификация t27, specs/t27t/t27t.t27 в gHashTag/t27. В ней времена замеров, каждое отношение, пересчитанное из них, формула экономии, правило выбора пути для GEMM и список того, что никто не мерил. Исполнитель это тренер на PyTorch gHashTag/igla-coder-gpu, он остаётся на Python; t27t говорит, что он должен делать.', + }, + { + kind: 'figure', + svg: FIG_SPEED_RU, + caption: 'Скорость относительно bf16 для каждой из пяти форм обучения (M x N x K). Жёлтое: int8 на тензорных ядрах, от 2.90x до 3.54x, ниже 4x из паспорта. Красное: int8 dp4a на обычных ядрах CUDA, от 0.91x до 0.94x, медленнее bf16 на каждой форме. Источник: gHashTag/t27#10360, одна RTX 4090, 2026-10-18.', + }, + { kind: 'h', text: 'Замер' }, + { + kind: 'table', + head: ['Форма, M x N x K', 'bf16, мс', 'int8 TC, мс', 'int8 TC к bf16', 'dp4a, мс', 'dp4a к bf16'], + rows: [ + ['4096 x 3456 x 1280 (FFN вверх)', '0.2254', '0.0770', '2.93x', '0.2406', '0.94x'], + ['4096 x 1280 x 3456 (FFN вниз)', '0.2239', '0.0773', '2.90x', '0.2470', '0.91x'], + ['16384 x 3456 x 1280', '0.8540', '0.2701', '3.16x', '0.9234', '0.92x'], + ['16384 x 1280 x 3456', '0.8506', '0.2399', '3.54x', '0.9278', '0.92x'], + ['16384 x 1280 x 1280 (проекция внимания)', '0.3215', '0.1007', '3.19x', '0.3460', '0.93x'], + ], + }, + { + kind: 'p', + text: 'Спецификация пересчитывает каждое отношение из двух времён рядом с ним. У времён четыре напечатанные цифры, поэтому тесты допускают одну сотую, и один раз она нужна: 0.8506 / 0.2399 = 3.5456, напечатано 3.54. Времена int8 это лучшее ядро CUTLASS 3.5.1 s8. Они стоят вместо torch._int_mm, который сам не замерялся.', + }, + { kind: 'h', text: 'Закон: f x (1 - 1/s)' }, + { + kind: 'p', + text: 'Быстрее становятся только прямые GEMM. Обратный проход держит градиенты в bf16, а оптимизатор, загрузка данных и всё остальное не меняются. Поэтому если f это доля шага на прямые GEMM, а s это во сколько раз int8 их ускоряет, шаг теряет f x (1 - 1/s) своего времени. Даже бесконечно быстрое ядро int8 не сэкономит больше f.', + }, + { + kind: 'figure', + svg: FIG_STEP_RU, + caption: 'Один шаг при f = 1/3 и s = 3.2x. Прямые GEMM сжимаются с трети шага примерно до десятой; остальная часть шага остаётся как была.', + }, + { + kind: 'table', + head: ['f, доля времени шага на прямые GEMM', 's = 2.9x', 's = 3.2x', 's = 3.5x'], + rows: [ + ['1/4', '16.4%, $16 со $100', '17.2%, $17', '17.9%, $18'], + ['1/3', '21.8%, $22 со $100', '22.9%, $23', '23.8%, $24'], + ], + }, + { + kind: 'figure', + svg: FIG_LAW_RU, + caption: 'Экономия растёт по прямой вместе с f, а скорость s задаёт только наклон. Жёлтая полоса показывает, где f предположили, а не где её измерили. Вне полосы та же формула даёт 13% при f = 1/5 и 33–36% при f = 1/2.', + }, + { + kind: 'p', + text: 'Все шесть клеток это T27t.saving_e3 в десятых долях процента с округлением половины вверх. Спецификация сверяет их с таблицей стоимости, напечатанной в #10360, а виджет t27t-savings сверяет ещё раз в своих тестах, вместе с двумя строками «а что если» для f = 1/5 и f = 1/2.', + }, + { kind: 'h', text: 'Почему не нужен свой CUDA-бэкенд' }, + { + kind: 'p', + text: 'Вопрос #10360 был такой: нужен ли t27c свой бэкенд CUDA или PTX, чтобы обучение подешевело. Не нужен. Скорость дают тензорные ядра int8, и PyTorch до них уже достаёт. Путь int8, который бэкенд мог бы добавить сам, это dp4a на ядрах CUDA, а dp4a оказался медленнее обычного bf16 на всех пяти формах. t27t записывает это правилом pick_path:', + }, + { + kind: 'ul', + items: [ + 'Прямой GEMM идёт на тензорные ядра int8 через torch._int_mm.', + 'Обратный GEMM остаётся в bf16, как и на GPU без тензорных ядер int8.', + 'dp4a не выбирается никогда; это говорят два инварианта спецификации.', + 'Ядро, сгенерированное t27c, берёт работу на себя, только если оно достигает 1.10x от настроенного CUTLASS s8 или лучше.', + ], + }, + { kind: 'h', text: 'Чего никто не мерил' }, + { + kind: 'ul', + items: [ + 'f, долю настоящего шага обучения на прямые GEMM. 1/4–1/3 это оценка, и спецификация так и пишет: F_MEASURED = false.', + 'Цену квантования активаций из bf16 в int8 и запуска его ядра. Она вычитается из экономии.', + 'Сам torch._int_mm и cuBLAS под ним; в замере был CUTLASS.', + 'Прогон целиком. Исполнитель gHashTag/igla-coder-gpu пока не вызывает torch._int_mm: RUNNER_USES_INT_MM = false.', + 'Меняют ли прямые GEMM в int8 кривую потерь. Замер мерил скорость, а не качество.', + ], + }, + { + kind: 'p', + text: 'Так что 16–24% это то, что закон даёт при предположенном f, а не экономия, которую кто-то увидел в счёте. Следующий шаг: замерить один настоящий шаг, это даст f, затем подключить torch._int_mm в исполнитель и сравнить два прогона.', + }, + { kind: 'h', text: 'Та же привычка, применённая к статьям' }, + { + kind: 'p', + text: 'На той же неделе t27 перепроверил 45 чисел, напечатанных в трёх статьях о числовых форматах, по правилам, которые формулируют сами статьи: GoldenFloat (arXiv:2606.05017), каталог Golden Ruler (arXiv:2606.09686) и статья TNF. 34 подходят, 8 нет, 3 проверить нельзя. Golden Ruler пишет о 12 кластерах, а в каталоге их 13; семь чисел TNF не сходятся, четыре из них потому, что две таблицы не следуют правилу, принятому в разделе 10. Метод тот же, что здесь: записать правило спецификацией, пересчитать напечатанное число и назвать то, что не сходится. Все 45 строк в предыдущем посте.', + }, + { kind: 'h', text: 'Запустить самому' }, + { + kind: 'code', + text: '# в checkout gHashTag/t27, с собранным t27c\ntri t27t # закон тренера: 8 тестов, 3 инварианта\ntri papers # 45 чисел из статей', + }, + { + kind: 'p', + text: 'Виджет t27.ai/widgets/t27t-savings показывает всю сетку, путь от GEMM в int8 до экономии и список неизмеренных входов. Каждую клетку там пересчитывают тесты его спецификации, когда страница собирается.', + }, +] diff --git a/apps/website/src/data/blog/index.ts b/apps/website/src/data/blog/index.ts index 0665822df9..f4ab541db0 100644 --- a/apps/website/src/data/blog/index.ts +++ b/apps/website/src/data/blog/index.ts @@ -2,6 +2,71 @@ import type { PostMeta } from './types' /** Индекс блога: список и метаданные без тяжёлых тел публикаций. */ export const postsIndex: PostMeta[] = [ + { + slug: "training-cheaper-on-int8-tensor-cores", + title: "t27t: training gets 16% to 24% cheaper on int8 tensor cores, if f is what we think", + summary: "[one RTX 4090, one day, five GEMM shapes; the int8 times are CUTLASS s8 standing in for torch._int_mm; f, the share of a step in forward GEMMs, is an estimate nobody has measured] t27t is the t27 trainer, and its law is one spec, specs/t27t/t27t.t27 in gHashTag/t27. On the five GEMM shapes of our training run, int8 tensor cores were 2.9x to 3.5x faster than bf16, and int8 dp4a on CUDA cores was slower than bf16 on every shape. With forward GEMMs in int8 and gradients in bf16, a run saves f x (1 - 1/s): 16% to 24% for f = 1/4 to 1/3, or $16 to $24 of every $100. No custom CUDA backend is needed, because PyTorch reaches those cores through torch._int_mm.", + date: "2026-10-19", + readingMinutes: 5, + tags: ["t27", "Training", "Verification"], + receipts: [ + { label: "t27#10790: specs/t27t/t27t.t27 and tri t27t", href: "https://github.com/gHashTag/t27/pull/10790" }, + { label: "t27#10789: the issue", href: "https://github.com/gHashTag/t27/issues/10789" }, + { label: "t27#10360: the GEMM bench and the verdict", href: "https://github.com/gHashTag/t27/issues/10360" }, + { label: "The widget: run savings by f and s", href: "https://t27.ai/widgets/t27t-savings/" }, + { label: "trinity#1690: the widget and this post", href: "https://github.com/gHashTag/trinity/pull/1690" }, + { label: "The papers post: 45 printed numbers", href: "https://t27.ai/#/blog/forty-five-printed-numbers" }, + ], + openQuestions: [ + "f, the share of a real step spent in forward GEMMs, has not been measured; timing one step of tern-tc-500m gives it.", + "The cost of quantizing activations from bf16 to int8 is not in the saving yet.", + "The runner gHashTag/igla-coder-gpu does not call torch._int_mm yet, so no run has billed the saving.", + "Whether int8 forward GEMMs change the loss curve was not measured.", + ], + published: true, + ru: { + title: "t27t: обучение дешевеет на 16–24% на тензорных ядрах int8, если f такая, как мы думаем", + summary: "[одна RTX 4090, один день, пять форм GEMM; времена int8 это CUTLASS s8 вместо torch._int_mm; f, доля шага на прямые GEMM, это оценка, её никто не мерил] t27t это тренер t27, и его закон это одна спецификация, specs/t27t/t27t.t27 в gHashTag/t27. На пяти формах GEMM из нашего обучения тензорные ядра int8 были в 2.9–3.5 раза быстрее bf16, а int8 dp4a на ядрах CUDA был медленнее bf16 на каждой форме. Если прямые GEMM считать в int8, а градиенты оставить в bf16, прогон экономит f x (1 - 1/s): 16–24% при f от 1/4 до 1/3, то есть $16–24 с каждых $100. Свой CUDA-бэкенд не нужен: PyTorch достаёт до этих ядер через torch._int_mm.", + openQuestions: [ + "f, долю настоящего шага на прямые GEMM, никто не мерил; её даст замер одного шага tern-tc-500m.", + "Цена квантования активаций из bf16 в int8 пока не вычтена из экономии.", + "Исполнитель gHashTag/igla-coder-gpu пока не вызывает torch._int_mm, поэтому экономию не видел ни один счёт.", + "Меняют ли прямые GEMM в int8 кривую потерь, не измерялось.", + ], + }, + }, + { + 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: "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" }, + ], + 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: "neural-networks-in-t27-a-widget-per-lesson", title: "Neural networks in t27: 27 lessons, and a widget in each one that runs a specs/ml spec", diff --git a/apps/website/src/data/blog/posts.ts b/apps/website/src/data/blog/posts.ts index 80b3fe53d0..4eca26301d 100644 --- a/apps/website/src/data/blog/posts.ts +++ b/apps/website/src/data/blog/posts.ts @@ -113,8 +113,12 @@ 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' +import { body as body_training_cheaper_on_int8_tensor_cores, ruBody as ruBody_training_cheaper_on_int8_tensor_cores } from './bodies/training-cheaper-on-int8-tensor-cores' const bodies: Record<string, PostBody> = { + 'training-cheaper-on-int8-tensor-cores': { body: body_training_cheaper_on_int8_tensor_cores, ruBody: ruBody_training_cheaper_on_int8_tensor_cores }, + '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 }, 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",