El desarrollador conocido por publicar crates en crates.io presenta la versión 0.2 de sus bibliotecas ab-riscv-interpreter y ab-riscv-primitives, un intérprete modular de RISC-V escrito en Rust que reimplementa la arquitectura de manera fiel a la especificación. La herramienta es genérica, carece de panic en tiempo de ejecución, funciona en entornos no_std sin asignaciones dinámicas y puede ejecutarse en tiempo de compilación mediante const fn. Pasa las pruebas oficiales de certificación arquitectónica de RISC-V, lo que la hace apta, según el autor, para casos de uso como blockchain.
El proyecto se estructura de forma modular: la ISA base y cada extensión se implementan por separado y se componen siguiendo la especificación, mientras que la memoria, el banco de registros e incluso el tipo del registro de propósito general son parámetros genéricos. La definición y decodificación de instrucciones vive en una crate aparte, útil por sí sola si solo se necesita un decodificador conforme a la especificación. Se ilustra con el ejemplo de la extensión Zicond, que codifica las instrucciones czero.eqz y czero.nez, y se muestra cómo expresar dependencias y herencia entre extensiones, así como instrucciones condicionadas a la presencia de otras (por ejemplo, las variantes Amocas de Zabha cuando también está Zacas).
Para resolver la falta de macros con estado en Rust, el autor recurre a un build script que analiza el código y genera las implementaciones combinadas, apoyándose en un proc macro que sustituye el código original por include!(). Como se utilizan rasgos nocturnos como const trait, que syn aún no soporta, se aplica un pequeño truco para transformar la sintaxis nocturna en estable y revertirla tras el procesamiento. Todo ello requiere alrededor de 30 características nightly de Rust, desde const generics avanzados hasta tail calls garantizados, funcionalidades que el autor espera que se estabilicen próximamente.
