2026-09-27

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 mini files, 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 update over HTTPS, and it released v0.0.1.
  • rustygo added goroutines, channels and select, then reflection, the file layer and fmt (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.