Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion apps/website/public/term/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
<main>
<div class="top"><a class="brand" href="../"><img src="../favicon.svg" alt="">Trinity S³AI</a></div>
<h1>Recordings</h1>
<p class="lede">Terminal sessions recorded from real commands: the output is what the commands printed. 30 so far.</p>
<p class="lede">Terminal sessions recorded from real commands: the output is what the commands printed. 32 so far.</p>
<div class="grid">
<a href="tri-x7-refs/"><img src="tri-x7-refs/card.png" alt="" loading="lazy"><div><b>tri x7-part · x7-refs · x7-bench: the references the bitstream path is checked on</b><small>2026-10-04 04:52 UTC · 7.3 s real</small></div></a>
<a href="tri-fpga-tools/"><img src="tri-fpga-tools/card.png" alt="" loading="lazy"><div><b>tri fpga-tools · 14 bench tools test themselves</b><small>2026-10-04 04:52 UTC · 5.8 s real</small></div></a>
Expand All @@ -54,6 +54,8 @@ <h1>Recordings</h1>
<a href="tri-fpga-batch/"><img src="tri-fpga-batch/card.png" alt="" loading="lazy"><div><b>tri fpga-batch-rehearsal · the batched wire protocol, rehearsed off-board</b><small>2026-10-04 04:52 UTC · 4.7 s real</small></div></a>
<a href="tri-x7-mutate/"><img src="tri-x7-mutate/card.png" alt="" loading="lazy"><div><b>tri x7-mutate · plant a bug, the tests must catch it</b><small>2026-10-04 04:48 UTC · 81.6 s real</small></div></a>
<a href="tri-x7-audit/"><img src="tri-x7-audit/card.png" alt="" loading="lazy"><div><b>tri x7-audit · the whole bitstream path, re-checked</b><small>2026-10-04 03:38 UTC · 208.3 s real</small></div></a>
<a href="perf2-loop/"><img src="perf2-loop/card.png" alt="" loading="lazy"><div><b>Place and route to a loaded bitstream, timed</b><small>2026-10-03 19:54 UTC · 22.6 s real</small></div></a>
<a href="perf2-knockouts/"><img src="perf2-knockouts/card.png" alt="" loading="lazy"><div><b>Three PERF2 bits, and one knockout bitstream per bit</b><small>2026-10-03 19:53 UTC · 26.2 s real</small></div></a>
<a href="tri-x7-fasm/"><img src="tri-x7-fasm/card.png" alt="" loading="lazy"><div><b>tri x7-fasm · a bitstream assembled without Vivado</b><small>2026-10-03 19:49 UTC · 21.7 s real</small></div></a>
<a href="tri-fpga-wire/"><img src="tri-fpga-wire/card.png" alt="" loading="lazy"><div><b>tri fpga-wire · the baud rate actually on the wire</b><small>2026-10-03 19:49 UTC · 6.5 s real</small></div></a>
<a href="tri-fpga-rgmii/"><img src="tri-fpga-rgmii/card.png" alt="" loading="lazy"><div><b>tri fpga-txhold · RGMII margins from nextpnr&#39;s own SDF</b><small>2026-10-03 19:49 UTC · 4.7 s real</small></div></a>
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
95 changes: 95 additions & 0 deletions apps/website/public/term/perf2-knockouts/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Three PERF2 bits, and one knockout bitstream per bit · Trinity S³AI</title>
<meta name="description" content="The A/B bitstreams differ in three bits. Each knockout clears one: 3 bytes from the working .bit.">
<link rel="canonical" href="https://t27.ai/term/perf2-knockouts/">
<link rel="icon" href="../../favicon.svg" type="image/svg+xml">
<meta property="og:type" content="article">
<meta property="og:site_name" content="Trinity S³AI">
<meta property="og:title" content="Three PERF2 bits, and one knockout bitstream per bit">
<meta property="og:description" content="The A/B bitstreams differ in three bits. Each knockout clears one: 3 bytes from the working .bit.">
<meta property="og:url" content="https://t27.ai/term/perf2-knockouts/">
<meta property="og:image" content="https://t27.ai/term/perf2-knockouts/card.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Three PERF2 bits, and one knockout bitstream per bit: the terminal session it shows">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Three PERF2 bits, and one knockout bitstream per bit">
<meta name="twitter:description" content="The A/B bitstreams differ in three bits. Each knockout clears one: 3 bytes from the working .bit.">
<meta name="twitter:image" content="https://t27.ai/term/perf2-knockouts/card.png">
<meta name="twitter:image:alt" content="Three PERF2 bits, and one knockout bitstream per bit: the terminal session it shows">
<style>@font-face{font-family:Outfit;src:url(../../fonts/outfit-latin.woff2) format('woff2');font-weight:100 900;font-display:swap}
*{box-sizing:border-box}html,body{margin:0;background:#000;color:#ebebeb}
body{font:16px/1.6 Outfit,system-ui,sans-serif;background-image:linear-gradient(rgba(255,255,255,.025) 1px,transparent 1px),linear-gradient(90deg,rgba(255,255,255,.025) 1px,transparent 1px);background-size:40px 40px}
main{max-width:980px;margin:0 auto;padding:28px 20px 64px}
a{color:#00ff88}a:hover{color:#fff}
.brand{display:flex;align-items:center;gap:10px;color:#fff;text-decoration:none;font-weight:700;font-size:20px}
.brand img{width:30px;height:30px}
.top{display:flex;justify-content:space-between;align-items:center;margin-bottom:28px}
.top .all{color:#888;font-size:14px;text-decoration:none}.top .all:hover{color:#00ff88}
h1{font-size:clamp(26px,4.4vw,42px);line-height:1.15;margin:0 0 10px;color:#fff}
.lede{color:#888;margin:0 0 22px;font-size:18px}
.facts{display:flex;flex-wrap:wrap;gap:8px;margin:18px 0}
.facts span{border:1px solid rgba(255,255,255,.08);border-radius:999px;padding:3px 12px;font-size:13px;color:#bbb}
.facts b{color:#ffd700;font-weight:600}
.cmds{font:13px/1.5 'JetBrains Mono',Menlo,monospace;background:#0a0a0a;border:1px solid rgba(255,255,255,.08);border-radius:10px;padding:12px 16px;margin:18px 0;white-space:pre-wrap;overflow-wrap:anywhere}
.cmds i{color:#ffd700;font-style:normal}
.honest{color:#888;font-size:14px;border-left:2px solid #00ff88;padding-left:12px}
.links{display:flex;flex-wrap:wrap;gap:10px;margin-top:22px}
.links a{border:1px solid rgba(255,255,255,.16);border-radius:8px;padding:6px 14px;text-decoration:none;font-size:14px}
.links a.x{background:#00ff88;color:#000;border-color:#00ff88;font-weight:600}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:18px}
.grid a{display:block;border:1px solid rgba(255,255,255,.08);border-radius:12px;overflow:hidden;text-decoration:none;color:#ebebeb;background:#050505}
.grid a:hover{border-color:#00ff88}.grid img{width:100%;display:block;aspect-ratio:1200/630}
.grid div{padding:10px 14px}.grid b{display:block;color:#fff}.grid small{color:#888}</style>
</head>
<body>
<main>
<div class="top"><a class="brand" href="../../"><img src="../../favicon.svg" alt="">Trinity S³AI</a><a class="all" href="../">All recordings →</a></div>
<h1>Three PERF2 bits, and one knockout bitstream per bit</h1>
<p class="lede">The A/B bitstreams differ in three bits. Each knockout clears one: 3 bytes from the working .bit.</p>
<div id="player"><noscript><figure style='margin:0 0 1.6em;border:1px solid rgba(255,255,255,.08);border-radius:12px;overflow:hidden;background:#000'><div style='padding:8px 12px;background:#0a0a0a;color:#888;font:12px system-ui;text-align:center;border-bottom:1px solid rgba(255,255,255,.08)'>Three PERF2 bits: which ones, and one knockout bitstream per bit</div><pre style='margin:0;padding:14px 16px;color:#ebebeb;background:#000;font:12px/1.25 Menlo,monospace;overflow-x:auto'><span style='color:#ebebeb'> 28_994 0 -> 1 rows using it: c030ed6 CLK_PERF2.{CLKOUT2,CLKOUT3} </span>
<span style='color:#ebebeb'> master none </span>
<span style='color:#ebebeb'> 29_1022 0 -> 1 rows using it: c030ed6 CLK_PERF2.{CLKFBOUT,CLKOUT0,CLKOUT1,CLKOUT2,CLKOUT3} </span>
<span style='color:#ebebeb'> master none </span>
<span style='color:#ebebeb'>HCLK_CMT_X8Y234 </span>
<span style='color:#ebebeb'> 28_180 0 -> 1 rows using it: c030ed6 PERFCLK2.{MUXED2,MUXED3} </span>
<span style='color:#ebebeb'> master none </span>
<span style='color:#ffd700'>board $ </span><span style='color:#ebebeb'>python3 perf2.py knockout bufr-new.frames --out rec </span>

<span style='color:#ebebeb'>== CMT_TOP_R_LOWER_B_X8Y217 28_994: frame 0x0002009C word 31 bit 2, 1 -> 0 </span>
<span style='color:#ebebeb'> rec/ko-28_994.frames == ko-28_994.frames (the file flashed on 2026-10-04) </span>
<span style='color:#ebebeb'>$ xc7frames2bit --part_file db-new/artix7/xc7a200tfbg484-2/part.yaml --part_name xc7a200tfbg484-2 --frm_</span>
<span style='color:#ebebeb'>file rec/ko-28_994.frames --output_file rec/ko-28_994.bit </span>
<span style='color:#ebebeb'> rc=0 0.59 s </span>
<span style='color:#ebebeb'> past the sync word, rec/ko-28_994.bit differs from bufr-new.bit in 3 bytes </span>

<span style='color:#ebebeb'>== CMT_TOP_R_LOWER_B_X8Y217 29_1022: frame 0x0002009D word 31 bit 30, 1 -> 0 </span>
<span style='color:#ebebeb'> rec/ko-29_1022.frames == ko-29_1022.frames (the file flashed on 2026-10-04) </span>
<span style='color:#ebebeb'>$ xc7frames2bit --part_file db-new/artix7/xc7a200tfbg484-2/part.yaml --part_name xc7a200tfbg484-2 --frm_</span>
<span style='color:#ebebeb'>file rec/ko-29_1022.frames --output_file rec/ko-29_1022.bit </span>
<span style='color:#ebebeb'> rc=0 0.90 s </span>
<span style='color:#ebebeb'> past the sync word, rec/ko-29_1022.bit differs from bufr-new.bit in 3 bytes </span>

<span style='color:#ebebeb'>== HCLK_CMT_X8Y234 28_180: frame 0x0002009C word 50 bit 20, 1 -> 0 </span>
<span style='color:#ebebeb'> rec/ko-28_180.frames == ko-28_180.frames (the file flashed on 2026-10-04) </span>
<span style='color:#ebebeb'>$ xc7frames2bit --part_file db-new/artix7/xc7a200tfbg484-2/part.yaml --part_name xc7a200tfbg484-2 --frm_</span>
<span style='color:#ebebeb'>file rec/ko-28_180.frames --output_file rec/ko-28_180.bit </span>
<span style='color:#ebebeb'> rc=0 0.55 s </span>
<span style='color:#ebebeb'> past the sync word, rec/ko-28_180.bit differs from bufr-new.bit in 3 bytes </span>
<span style='color:#ffd700'>board $ </span><span style='color:#ebebeb'> </span></pre></figure></noscript></div>
<div class="facts"><span>recorded <b>2026-10-03 19:53 UTC</b></span><span>real <b>26.2 s</b></span><span>shown <b>15.9 s</b></span><span>exit codes <b>0 0</b></span></div>
<div class="cmds"><i>$</i> python3 perf2.py diff bufr-old.frames bufr-new.frames
<i>$</i> python3 perf2.py knockout bufr-new.frames --out rec</div>
<p class="honest">Staged: the prompt and the typing. Real: every byte the commands printed, at the time they printed it. Any silence longer than 2 s is shown for 2 s, and the title bar says so while it happens. Edited: home directory shown as ~.</p>
<div class="links"><a href="https://t27.ai/#/blog/three-bits-each-necessary">Read the post</a><a href="session.gif">GIF</a><a href="card.png">Preview card</a></div>
</main>
<script type="module">
import { mount } from '../player.js'
mount(document.getElementById('player'), { src: 'session.cast', share: "https://t27.ai/term/perf2-knockouts/", title: "Three PERF2 bits: which ones, and one knockout bitstream per bit" })
</script>
</body>
</html>
23 changes: 23 additions & 0 deletions apps/website/public/term/perf2-knockouts/meta.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
{
"id": "perf2-knockouts",
"title": "Three PERF2 bits, and one knockout bitstream per bit",
"desc": "The A/B bitstreams differ in three bits. Each knockout clears one: 3 bytes from the working .bit.",
"url": "https://t27.ai/term/perf2-knockouts/",
"gif": "https://t27.ai/term/perf2-knockouts/session.gif",
"post": "https://t27.ai/#/blog/three-bits-each-necessary",
"recorded": "2026-10-03 19:53 UTC",
"real_s": 26.2,
"shown_s": 15.9,
"commands": [
"python3 perf2.py diff bufr-old.frames bufr-new.frames",
"python3 perf2.py knockout bufr-new.frames --out rec"
],
"exit_codes": [
"0",
"0"
],
"redacted": [
"home directory shown as ~"
],
"published": "2026-10-03"
}
131 changes: 131 additions & 0 deletions apps/website/public/term/perf2-knockouts/session.cast
Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
{"version": 2, "width": 104, "height": 30, "timestamp": 1791057239, "title": "Three PERF2 bits: which ones, and one knockout bitstream per bit", "commands": ["python3 perf2.py diff bufr-old.frames bufr-new.frames", "python3 perf2.py knockout bufr-new.frames --out rec"], "redacted": ["home directory shown as ~"]}
[0.0001, "o", "\u001b[38;2;255;215;0mboard $ \u001b[0m"]
[0.4101, "o", "p"]
[0.4552, "o", "y"]
[0.4935, "o", "t"]
[0.5337, "o", "h"]
[0.5705, "o", "o"]
[0.6059, "o", "n"]
[0.6437, "o", "3"]
[0.6889, "o", " "]
[0.7285, "o", "p"]
[0.7696, "o", "e"]
[0.8108, "o", "r"]
[0.8471, "o", "f"]
[0.8926, "o", "2"]
[0.9305, "o", "."]
[0.9696, "o", "p"]
[1.0097, "o", "y"]
[1.0466, "o", " "]
[1.09, "o", "d"]
[1.1359, "o", "i"]
[1.1718, "o", "f"]
[1.2162, "o", "f"]
[1.2612, "o", " "]
[1.3021, "o", "b"]
[1.3442, "o", "u"]
[1.3887, "o", "f"]
[1.4239, "o", "r"]
[1.4683, "o", "-"]
[1.5137, "o", "o"]
[1.5536, "o", "l"]
[1.5972, "o", "d"]
[1.6371, "o", "."]
[1.686, "o", "f"]
[1.7268, "o", "r"]
[1.7702, "o", "a"]
[1.8153, "o", "m"]
[1.8568, "o", "e"]
[1.8963, "o", "s"]
[1.9354, "o", " "]
[1.9806, "o", "b"]
[2.0263, "o", "u"]
[2.0682, "o", "f"]
[2.1071, "o", "r"]
[2.1487, "o", "-"]
[2.1885, "o", "n"]
[2.2394, "o", "e"]
[2.2784, "o", "w"]
[2.3236, "o", "."]
[2.3596, "o", "f"]
[2.4071, "o", "r"]
[2.4582, "o", "a"]
[2.4942, "o", "m"]
[2.5393, "o", "e"]
[2.5812, "o", "s"]
[2.9287, "o", "\r\n"]
[10.3484, "o", "bufr-old.frames -> bufr-new.frames: 3 bit(s) differ, frame ECC aside\r\n"]
[10.3781, "o", "CMT_TOP_R_LOWER_B_X8Y217\r\n"]
[10.3937, "o", " 28_994 0 -> 1 rows using it: c030ed6 CLK_PERF2.{CLKOUT2,CLKOUT3}\r\n master none\r\n"]
[10.3944, "o", " 29_1022 0 -> 1 rows using it: c030ed6 CLK_PERF2.{CLKFBOUT,CLKOUT0,CLKOUT1,CLKOUT2,CLKOUT3}\r\n master none\r\nHCLK_CMT_X8Y234\r\n"]
[10.4074, "o", " 28_180 0 -> 1 rows using it: c030ed6 PERFCLK2.{MUXED2,MUXED3}\r\n master none\r\n"]
[10.5448, "x", "0"]
[11.5525, "o", "\u001b[38;2;255;215;0mboard $ \u001b[0m"]
[12.0129, "o", "p"]
[12.0829, "o", "y"]
[12.1199, "o", "t"]
[12.168, "o", "h"]
[12.2249, "o", "o"]
[12.2633, "o", "n"]
[12.3251, "o", "3"]
[12.3746, "o", " "]
[12.4185, "o", "p"]
[12.4633, "o", "e"]
[12.5089, "o", "r"]
[12.5579, "o", "f"]
[12.5933, "o", "2"]
[12.6418, "o", "."]
[12.6884, "o", "p"]
[12.7322, "o", "y"]
[12.7918, "o", " "]
[12.8343, "o", "k"]
[12.8755, "o", "n"]
[12.9257, "o", "o"]
[12.9724, "o", "c"]
[13.009, "o", "k"]
[13.0481, "o", "o"]
[13.0835, "o", "u"]
[13.1302, "o", "t"]
[13.1687, "o", " "]
[13.208, "o", "b"]
[13.2464, "o", "u"]
[13.2831, "o", "f"]
[13.3195, "o", "r"]
[13.3663, "o", "-"]
[13.4064, "o", "n"]
[13.4442, "o", "e"]
[13.4908, "o", "w"]
[13.5373, "o", "."]
[13.5741, "o", "f"]
[13.6169, "o", "r"]
[13.6582, "o", "a"]
[13.7006, "o", "m"]
[13.7433, "o", "e"]
[13.7841, "o", "s"]
[13.8276, "o", " "]
[13.9087, "o", "-"]
[13.9597, "o", "-"]
[14.0158, "o", "o"]
[14.0726, "o", "u"]
[14.1191, "o", "t"]
[14.1685, "o", " "]
[14.2135, "o", "r"]
[14.2697, "o", "e"]
[14.3138, "o", "c"]
[14.6649, "o", "\r\n"]
[21.5975, "o", "\r\n== CMT_TOP_R_LOWER_B_X8Y217 28_994: frame 0x0002009C word 31 bit 2, 1 -> 0\r\n"]
[21.6137, "o", " rec/ko-28_994.frames == ko-28_994.frames (the file flashed on 2026-10-04)\r\n$ xc7frames2bit --part_file db-new/artix7/xc7a200tfbg484-2/part.yaml --part_name xc7a200tfbg484-2 --frm_file rec/ko-28_994.frames --output_file rec/ko-28_994.bit\r\n"]
[22.2006, "o", " rc=0 0.59 s\r\n"]
[22.7853, "o", " past the sync word, rec/ko-28_994.bit differs from bufr-new.bit in 3 bytes\r\n"]
[22.8778, "o", "\r\n== CMT_TOP_R_LOWER_B_X8Y217 29_1022: frame 0x0002009D word 31 bit 30, 1 -> 0\r\n"]
[22.8885, "o", " rec/ko-29_1022.frames == ko-29_1022.frames (the file flashed on 2026-10-04)\r\n"]
[22.8885, "o", "$ xc7frames2bit --part_file db-new/artix7/xc7a200tfbg484-2/part.yaml --part_name xc7a200tfbg484-2 --frm_file rec/ko-29_1022.frames --output_file rec/ko-29_1022.bit\r\n"]
[23.7913, "o", " rc=0 0.90 s\r\n"]
[24.1817, "o", " past the sync word, rec/ko-29_1022.bit differs from bufr-new.bit in 3 bytes\r\n"]
[24.2635, "o", "\r\n== HCLK_CMT_X8Y234 28_180: frame 0x0002009C word 50 bit 20, 1 -> 0"]
[24.2643, "o", "\r\n"]
[24.28, "o", " rec/ko-28_180.frames == ko-28_180.frames (the file flashed on 2026-10-04)\r\n$ xc7frames2bit --part_file db-new/artix7/xc7a200tfbg484-2/part.yaml --part_name xc7a200tfbg484-2 --frm_file rec/ko-28_180.frames --output_file rec/ko-28_180.bit\r\n"]
[24.8309, "o", " rc=0 0.55 s\r\n"]
[25.1509, "o", " past the sync word, rec/ko-28_180.bit differs from bufr-new.bit in 3 bytes\r\n"]
[25.2216, "x", "0"]
[26.2266, "o", "\u001b[38;2;255;215;0mboard $ \u001b[0m"]
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added apps/website/public/term/perf2-loop/card.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading