A binary parser.
let spec =
#|a : 3;
#|b : 4;
// 7'b1011_100
let viewer = Bitviewer::new(b"\x5c");
let map = viewer.extract(spec); // a: 4, b: 11
// This is because `a` is 3'b100 = 4, and `b` is 4'b1011, which is 11.let spec = "rev: >32";
let viewer = Bitviewer::new(Bitvector::from(0x12345678).raw())
let map = viewer.extract(spec);
inspect(map.get("rev").unwrap().to(0), content="\{0x78563412}");// RISC-V instruction format, R-type
let spec =
#|opcode: 0..6;
#|rd : 7..11;
#|funct3: 12..14;
#|rs : 15..19;
#|rs2 : 20..24;
#|funct7: 25..31;
// RISC-V: add x5, x10, x22
// opcode = 0b0110011 (0x33), funct3 = funct7 = 0
let viewer = Bitviewer::new(Bitvector::from(0x016502b3).raw());
let map = viewer.extract(spec);
inspect(map, content={
"opcode": b"\x33",
"rd": b"\x05",
"funct3": b"\x00",
"rs": b"\x0a", // 10
"rs2": b"\x16", // 22
"funct7": b"\x00",
}.to_string())let spec =
#|h1 : 3*5-4+1;
#|h2 : 4;
let viewer = Bitviewer::build(spec, {
"h1": 0x234,
"h2": 1
});
// This will return a bitvector.
viewer.raw();
// The content is 0x3412, because it's little endian by default. As an int, it's 0x1234.Statement ::= Ident `:` Spec `;`;
Spec ::= (`<` | `>`)? Expr;
Expr ::= Add `..` Add | Add;
Add ::= Mul ((`+` | `-`) Mul)*;
Mul ::= Primary ((`*` | `/`) Primary)*;
Primary ::= `(` Expr `)` | Number | Ident;
Ident ::= [A-Za-z0-9][A-Za-z0-9_]*;
Number ::= [0-9]+;let spec =
#|a : 5;
#|=011: 3;
#|b : 6;
#|=01 : 2;