riscv-codec 0.4.0

Decode/Encode and Assemble/Disassemble RISC-V instructions
Documentation
use std::process::exit;

use riscv_codec::{assembly::assemble_line, instruction::Instruction,};
fn main() {
    let mut valid: u32 = 0;
    for x in 0..u32::MAX {
        if x % 10000 == 0 {
            println!("{:.4}%", 100.0 * (x as f64) / (u32::MAX as f64))
        }
        if let Ok(i) = Instruction::decode(x) {
            valid += 1;
            let e = Instruction::encode(&i);
            if x != e {
                println!("i: {i}\nx: {x:032b}\ne: {e:032b}");
                exit(1);
            }

            let d = i.to_string();
            let i2 = assemble_line(&d).unwrap().i();
            if i != i2 {
                println!("disassembled {i:#?} to get {d}. Assembled to get {i2:#?}!");
                exit(1);
            }
        }
    }
    println!("Done.");
    println!("proportion of encoding space used: {}%", 100.0 * (valid as f64) / (u32::MAX as f64))
}