Weekly open source: reticle, an HDL toolchain that reaches real FPGAs
The new project this week is reticle, a hardware description language toolchain, and by the end of the week it was configuring real FPGAs. rawusb, a dependency-free USB library, started the same day and gives it a way to reach a JTAG cable. CatCard kept adding wallet features and gained a JavaScript SDK and a browser manager. pktkit spent a single day on a review that produced about 470 commits. rsasm started linking whole programs and made its first releases, and rsemu moved on to Macintoshes.
reticle: Verilog and VHDL, down to a bitstream
reticle is "a VHDL / Verilog compiler written from scratch in Rust, with no foreign code and no third-party crates", intended to grow into one self-contained hardware toolchain. Its first week (about 310 commits) built most of the pipeline:
- Frontends for Verilog / synthesisable SystemVerilog (with a 28-rule linter and a formatter) and VHDL-2008, both lowering to one IR with a round-tripping text format.
- Formal and synthesis. A CDCL SAT solver, bit-blaster, bounded model checking, k-induction and equivalence checking. Process lowering, flip-flop / memory / FSM inference, an AIG optimiser, LUT and standard-cell mapping, and post-synthesis equivalence checks.
- Simulation, timing, IP. An event-driven simulator with concurrent assertions (an SVA and PSL subset), an interactive session, static timing and clock-domain-crossing analysis. An IP library with a USB full-speed device, a DVI transmitter and an SDRAM controller, plus a C API and a WebAssembly build.
- Real hardware. Reticle can read a 7-series fabric from
Project X-Ray's database, write a
.bit, and "configure a 7-series FPGA over JTAG". It can also write and load a Gowin GW2A bitstream, and program a Lattice ECP5 through a Cynthion's Apollo debugger. The commits record a clocked design loaded onto a part and a USB device built on the Cynthion's AUX port. The examples include a 6502 computer, an Apple II mapped onto a Basys 3, and an NES-compatible console built from the IP library.
The one dependency is optional. Configuring a board means speaking
USB, so the program feature pulls in
rawusb, new this week:
"dependency-free, cross-platform USB device access for Rust, in the
spirit of libusb". It talks to usbfs on Linux, WinUSB on Windows and
IOKit on macOS directly, with hotplug, isochronous transfers, and
class helpers for HID, mass storage, CDC-ACM/FTDI serial, UVC video
and USB Ethernet. The Ethernet helper plugs into pktkit. It went
from v0.1.1 to v0.1.4 during the week.
CatCard: security key, HSM mode, and a way in from the browser
CatCard had its
busiest week yet, about 470 commits. Most of it was features that
match stock Coldcard firmware: HSM mode over the ckcc protocol with
the Single-Signer Spending Policy engine, Key Teleport (in stock's
wire format), trick PINs, Seed XOR, BIP-322 message signing and
proof-of-reserves, PSBT v2 (BIP-370), Secure Notes with TOTP, and
backups with Verify Backup. Some things go past stock. The device
can now act as a FIDO security key with passkeys. It lays EVM and
Solana transactions out as cards, and for Solana it will "never sign
past what was shown". The chain picker gained Namecoin. NFC can
share an address or take in a transaction. A tag push publishes a GitHub release
with the .dfu images.
Two companion projects started:
- catcard-sdk is a JavaScript SDK that makes an air-gapped CatCard "work like a regular browser wallet". It provides an EIP-1193 / EIP-6963 provider for EVM, a Wallet Standard wallet for Solana, TIP-1193 for Tron, and Bitcoin through Wallet Standard and sats-connect. Requests and answers travel as animated BBQr or BC-UR QR codes, and the SDK checks every returned signature against the expected account.
- catcard-mgr is a WebHID page, with no server, that identifies a CatCard or a stock Coldcard, switches a Coldcard to CatCard, installs or updates firmware, and can put Coinkite's signed firmware back. It warns "loudly" when a Coldcard runs firmware with the weak seed generator. After pairing with a six-digit code, it can fetch addresses and send PSBTs and Ethereum or Solana transactions to be signed.
pktkit: a review in one day
pktkit, the
zero-copy L2/L3 toolkit for virtual network topologies, made about
470 commits on Sunday alone. More than 400 of them were fixes. The
review went module by module through the TCP engine (vtcp),
WireGuard, the OpenVPN server, NAT/NAT64 and its ALGs, UPnP, slirp,
DHCP, ARP/NDP and the high-level virtual client. Typical lines are
"answer SYN floods with cookies", "update the replay window only
after a packet authenticates", and "never lease the server, router,
network or broadcast address". Along the way it gained a few
features: WireGuard protocol timers "so tunnels rekey and stay up",
OpenVPN data-cipher negotiation and soft-reset rekeying, SACK-based
loss recovery on by default, and builds for wasm32-unknown-unknown
and wasm32-wasip1 (releases v0.1.5 to v0.1.7).
rsasm: linking whole programs, and a release
rsasm made its first
releases, v0.1.1 through v0.1.3. A new tools/link-diff harness
assembles a multi-object program twice, once with the reference
assembler and once with rsasm, then links both with the same GNU ld
and compares the images and symbol tables. It now covers x86, ARM,
RISC-V, PowerPC, MIPS, SPARC, m68k, SuperH, RX, RL78, MSP430, V850,
AVR and PE/COFF. That work pulled in the target-specific sections a
linker expects (.ARM.attributes, .riscv.attributes,
.MIPS.abiflags, V850's .note.renesas), and RISC-V branch
widening when a target is out of reach.
rsemu: Macintoshes and big-box Amigas
rsemu added a Macintosh Plus, with the VIA, the IWM reading and writing Apple's 6-and-2 GCR disks, the clock chip and its parameter RAM, keyboard, mouse, sound and an NCR 5380 SCSI port. Then a Macintosh Classic, with ADB, the SWIM and 1.44 MB MFM disks. On the Amiga side came the A3000 (Super DMAC and WD33C93A SCSI), the A4000 (68040 with AGA and IDE) and the A4000T booting Workbench 3.1 off an NCR 53C710 with its SCRIPTS processor. The 68040 arrived with its MMU and FPU. The 68000 integer core is now lifted into the translation IR. A monitor console can change media in a running machine.
Also this week
- oxideav-heif went
from v0.0.2 to v0.0.4: HEVC and lossy AV1 still encoding, HDR and
tone-map boxes, AVC and layered-HEVC items, alpha sequences,
low-overhead
minifiles, and parallel grid-tile decode. The workspace rollup records HEIF working end to end on real-world files, with output that Apple ImageIO, libheif and ImageMagick decode byte-exact. oxideav's AVIF and MOV code now goes through it. - purecrypto made its big precomputed tables optional (edwards25519, P-256, Streebog, Whirlpool), for firmware size. It also added a Valgrind memcheck constant-time harness for x86-64 and aarch64 (v0.9.2 to v0.9.4).
- rsurl had a curl-compatibility and fail-closed pass across HTTP/2, HTTP/3, FTP, SMTP, IMAP, WebSocket, cookies and the libcurl ABI. SSH now rejects unknown host keys by default, as curl does.
- nixvm, the
syscall-emulating Linux sandbox, got guest networking in its
browser demo over a WebSocket IP tunnel using pktkit's TCP/IP
stack. Its arm64 guests can now run
apk updateover HTTPS, and it released v0.0.1. - rustygo added
goroutines, channels and
select, then reflection, the file layer andfmt(v0.0.2).
Next week
reticle has more of its FPGA flow to prove on real parts, and more device families to bring up. rawusb gets its first real users. CatCard keeps closing the gap with stock, and catcard-sdk and catcard-mgr need users to try them. rsasm gets closer to producing finished programs itself, and rsemu keeps adding machines.