Blog
[the browser runner skips invariant and bench blocks; the lesson specs are not yet in gHashTag/t27] A new course comes before the FPGA and AI numbers courses: 27 lessons on the t27 language, each with a black-and-white table or diagram drawn from its own spec and a lesson spec that compiles on all 7 backends.

The t27 courses started at the chip: course 1 teaches an FPGA and course 2 the numbers AI chips store. Both expect the reader to read a .t27 spec already. Course 0 comes before them and teaches that: 27 lessons on the language itself, in 9 modules of 3 lessons, ending where course 1 starts.
Every lesson opens one infographic and one spec. The infographic is a black-and-white table, and in 11 of the 27 lessons also a flow diagram; its words and rows live in a .t27 widget spec (specs/widgets/basics-<lesson>.t27), and a widget spec test checks that the table has whole rows. The lesson spec lives under specs/basics/ and compiles clean on all 7 backends in the browser, with its tests passing; the course generator refuses to build if one of them does not.
The tables are real HTML tables with a caption and header cells, and the diagrams are SVG with a title, so a screen reader reads both. On a phone the table turns into one card per row.
| Lesson | Title | Infographic |
|---|---|---|
| 1 | What a spec is | table + flow diagram: The parts of a spec, top to bottom |
| 2 | The module line | table: Module lines, as the compiler answered |
| 3 | Comments and prose lines | table: Notes in a spec, as the compiler answered |
| 4 | Constants | table: pub const WIDTH : u8 = 8; |
| 5 | Whole numbers and their widths | table + flow diagram: Integer types |
| 6 | True, false and text | table: bool and str |
| 7 | Arrays | table: pub const PRIMES : [5]u8 = [2, 3, 5, 7, 11]; |
| 8 | Trits: minus one, zero, one | table + flow diagram: A trit as i8 constants |
| 9 | Expressions | table: A = 17, B = 5 |
| 10 | A test block | table + flow diagram: test a_year_is_52_weeks_and_a_day |
| 11 | Many tests in one spec | table: The tests of the lesson spec |
| 12 | Functions | table: fn add(a: u8, b: u8) -> u8 |
| 13 | Local names: let and var | table: Three kinds of names |
| 14 | Choices: if, else and switch | table + flow diagram: Choice forms, as the compiler answered |
| 15 | Loops: while and for | table + flow diagram: Loop forms, as the compiler answered |
| 16 | pub or private | table: pub and private constants through gen-ts |
| 17 | Structs | table: The structs of the lesson spec |
| 18 | Enums | table: The enums of the lesson spec |
| 19 | Using other modules | table: use base::types; |
| 20 | Invariants and benches | table: Checking blocks and the site test runner |
| 21 | gen-ts: a spec becomes TypeScript | table + flow diagram: gen-ts on the lesson spec |
| 22 | Seven backends | table: Backends on the lesson spec |
| 23 | The stages of t27c | table + flow diagram: Stages on the lesson spec |
| 24 | tri: the command line | table + flow diagram: tri commands, from scripts/tri |
| 25 | Reading compiler errors | table: Mistakes, as the compiler answered |
| 26 | A small complete program | table + flow diagram: gen-verilog on the lesson spec |
| 27 | Where to go next | table + flow diagram: The courses, in order |
Work with me
I work contract and part-time on hardware-AI, FPGA/RTL and ML systems — from specification and open toolchains to reproducible measurements.