週次オープンソース:reticle、本物の FPGA まで届く HDL ツールチェーン
今週の新プロジェクトはハードウェア記述言語のツールチェーン reticle で、週の終わりには本物の FPGA を構成していた。同じ日に 始まった依存ゼロの USB ライブラリ rawusb が、JTAG ケーブルへの 道を与える。CatCard はウォレット機能を足し続け、JavaScript SDK とブラウザのマネージャを得た。pktkit は一日をレビューに費やし、 約 470 コミットを生んだ。rsasm はプログラム全体のリンクを始めて 最初のリリースを出し、rsemu は Macintosh に進んだ。
reticle:Verilog と VHDL を、ビットストリームまで
reticle は「Rust で ゼロから書いた VHDL / Verilog コンパイラで、外部コードもサード パーティのクレートもない」もので、自己完結した一つのハードウェア ツールチェーンに育つことを目指している。最初の一週間(約 310 コミット)でパイプラインの大半を作った:
- フロントエンド:Verilog / 合成可能な SystemVerilog(28 ルール のリンタとフォーマッタ付き)と VHDL-2008。どちらも往復可能な テキスト形式を持つ一つの IR に下ろす。
- 形式検証と合成。 CDCL SAT ソルバ、ビットブラスタ、有界モデル 検査、k-induction、等価性検査。プロセスの下ろし、フリップ フロップ/メモリ/FSM の推論、AIG オプティマイザ、LUT と スタンダードセルへのマッピング、合成後の等価性検査。
- シミュレーション、タイミング、IP。 並行アサーション(SVA と PSL のサブセット)付きのイベント駆動シミュレータ、対話セッション、 静的タイミング解析とクロックドメイン交差の解析。USB フルスピード デバイス、DVI 送信器、SDRAM コントローラを備えた IP ライブラリ、 そして C API と WebAssembly ビルド。
- 本物のハードウェア。 reticle は Project X-Ray のデータベース
から 7 シリーズのファブリックを読み、
.bitを書き、「JTAG 越しに 7 シリーズ FPGA を構成する」ことができる。Gowin GW2A の ビットストリームを書いてロードすることも、Cynthion の Apollo デバッガ経由で Lattice ECP5 を書き込むこともできる。コミットには、 クロック付きの設計を実際のチップにロードしたことと、Cynthion の AUX ポートに USB デバイスを作ったことが記録されている。例題には 6502 コンピュータ、Basys 3 にマップした Apple II、IP ライブラリ から作った NES 互換機がある。
唯一の依存はオプションだ。ボードを構成するには USB を話す必要が
あるので、program フィーチャが今週の新顔
rawusb を引き込む:
「libusb の精神での、依存ゼロ・クロスプラットフォームな Rust の USB
デバイスアクセス」。Linux の usbfs、Windows の WinUSB、macOS の IOKit
と直接話し、ホットプラグ、アイソクロナス転送、そして HID、マス
ストレージ、CDC-ACM/FTDI シリアル、UVC ビデオ、USB Ethernet の
クラスヘルパを備える。Ethernet のヘルパは pktkit とつながる。週の
うちに v0.1.1 から v0.1.4 まで進んだ。
CatCard:セキュリティキー、HSM モード、ブラウザからの入口
CatCard はこれまでで
最も忙しい週で、約 470 コミットだった。大半は純正 Coldcard
ファームウェアに合わせる機能だ:ckcc プロトコル越しの HSM モードと
Single-Signer Spending Policy エンジン、Key Teleport(純正のワイヤ
形式)、トリック PIN、Seed XOR、BIP-322 のメッセージ署名と
proof-of-reserves、PSBT v2(BIP-370)、TOTP 付きの Secure Notes、
Verify Backup 付きのバックアップ。純正を越えるものもある。デバイスは
パスキー対応の FIDO セキュリティキーとして振る舞えるようになった。
EVM と Solana のトランザクションはカードとして並べて表示し、Solana
では「表示した範囲を越えて署名しない」。チェーンの選択肢に Namecoin が加わった。
NFC ではアドレスを共有したり、トランザクションを受け取ったりできる。
タグを push すると .dfu イメージ付きの GitHub リリースが公開される。
関連プロジェクトが二つ始まった:
- catcard-sdk は、 エアギャップの CatCard を「普通のブラウザウォレットのように」使える ようにする JavaScript SDK だ。EVM には EIP-1193 / EIP-6963 の プロバイダ、Solana には Wallet Standard のウォレット、Tron には TIP-1193、Bitcoin には Wallet Standard と sats-connect を提供する。 要求と応答はアニメーションする BBQr または BC-UR の QR コードで 運ばれ、SDK は返ってきた署名をすべて期待するアカウントと照合する。
- catcard-mgr は サーバなしの WebHID のページで、CatCard や純正 Coldcard を識別し、 Coldcard を CatCard に切り替え、ファームウェアを入れたり更新したり し、Coinkite の署名付きファームウェアに戻すこともできる。弱い シード生成器を持つファームウェアの Coldcard には「大きく」警告を 出す。六桁のコードでペアリングした後は、アドレスを取得し、PSBT や Ethereum、Solana のトランザクションを署名に送れる。
pktkit:一日でのレビュー
仮想ネットワークトポロジ用のゼロコピー L2/L3 ツールキット
pktkit は、日曜日
だけで約 470 コミットを積んだ。そのうち 400 以上が修正だ。レビュー
はモジュールごとに進んだ:TCP エンジン(vtcp)、WireGuard、
OpenVPN サーバ、NAT/NAT64 とその ALG、UPnP、slirp、DHCP、ARP/NDP、
高水準の仮想クライアント。典型的な行は「SYN フラッドには cookie で
答える」「リプレイウィンドウはパケットが認証されてから更新する」
「サーバ、ルータ、ネットワーク、ブロードキャストのアドレスは決して
リースしない」。その途中で機能もいくつか入った:「トンネルが鍵を
更新し、上がったままでいるように」する WireGuard のプロトコル
タイマ、OpenVPN のデータ暗号の交渉とソフトリセットによる鍵更新、
デフォルトで有効な SACK ベースの損失回復、そして
wasm32-unknown-unknown と wasm32-wasip1 向けのビルド(リリースは
v0.1.5 から v0.1.7)。
rsasm:プログラム全体のリンク、そしてリリース
rsasm は最初のリリース
v0.1.1 から v0.1.3 を出した。新しい tools/link-diff ハーネスは、
複数オブジェクトに分かれたプログラムを二度——リファレンスの
アセンブラで一度、rsasm で一度——アセンブルし、両方を同じ GNU ld で
リンクして、イメージとシンボルテーブルを比べる。今では x86、ARM、
RISC-V、PowerPC、MIPS、SPARC、m68k、SuperH、RX、RL78、MSP430、
V850、AVR、PE/COFF をカバーする。その作業に伴い、リンカが期待する
ターゲット固有のセクション(.ARM.attributes、.riscv.attributes、
.MIPS.abiflags、V850 の .note.renesas)と、届かない分岐先に
対する RISC-V の分岐の拡幅が入った。
rsemu:Macintosh と大型 Amiga
rsemu は Macintosh Plus を加えた:VIA、Apple の 6-and-2 GCR ディスクを読み書きする IWM、 クロックチップとそのパラメータ RAM、キーボード、マウス、サウンド、 NCR 5380 の SCSI ポート。続いて ADB、SWIM、1.44 MB の MFM ディスクを 備えた Macintosh Classic。Amiga 側では A3000(Super DMAC と WD33C93A SCSI)、A4000(AGA と IDE を備えた 68040)、そして SCRIPTS プロセッサを持つ NCR 53C710 から Workbench 3.1 を起動する A4000T。 68040 は MMU と FPU とともに入った。68000 の整数コアは変換 IR に 持ち上げられるようになった。モニタコンソールでは、動作中のマシンの メディアを交換できる。
今週その他
- oxideav-heif は
v0.0.2 から v0.0.4 へ:HEVC と非可逆 AV1 の静止画エンコード、HDR
とトーンマップのボックス、AVC とレイヤード HEVC のアイテム、アルファ
付きシーケンス、低オーバーヘッドの
miniファイル、グリッドタイル の並列デコード。workspace のまとめには、実際のファイルで HEIF がエンドツーエンドに動き、 その出力を Apple ImageIO、libheif、ImageMagick がバイト単位で同じ ようにデコードすることが記録されている。oxideav の AVIF と MOV の コードは今やこれを経由する。 - purecrypto は ファームウェアのサイズのために、大きな事前計算テーブル (edwards25519、P-256、Streebog、Whirlpool)をオプションにした。 x86-64 と aarch64 向けの Valgrind memcheck による定数時間ハーネス も加えた(v0.9.2 から v0.9.4)。
- rsurl は HTTP/2、 HTTP/3、FTP、SMTP、IMAP、WebSocket、クッキー、libcurl ABI に わたって、curl 互換とフェイルクローズの一巡を経た。SSH は curl と 同じく、未知のホスト鍵をデフォルトで拒否するようになった。
- システムコールをエミュレートする Linux サンドボックス
nixvm は、pktkit の
TCP/IP スタックを使った WebSocket の IP トンネルで、ブラウザデモに
ゲストのネットワークを得た。arm64 のゲストは HTTPS 越しに
apk updateを実行できるようになり、v0.0.1 をリリースした。 - rustygo はゴルーチン、
チャネル、
select、続いてリフレクション、ファイル層、fmtを 加えた(v0.0.2)。
来週
reticle には、実機で確かめるべき FPGA フローの残りと、立ち上げる べきさらなるデバイスファミリがある。rawusb は最初の実ユーザを得る。 CatCard は純正との差を詰め続け、catcard-sdk と catcard-mgr には 試してくれるユーザが要る。rsasm は完成したプログラムを自ら出力する ところへ近づき、rsemu はマシンを足し続ける。