5 个版本
0.2.3 | 2022年7月19日 |
---|---|
0.2.2 | 2022年7月7日 |
0.2.1 | 2022年7月7日 |
0.2.0 | 2022年6月21日 |
0.1.0 | 2022年6月17日 |
#897 在 编码
630KB
19K SLoC
寄存器位 🦀
一个用于执行编译时验证的寄存器位操作的 crate
此 crate 提供了许多内联过程来执行位操作,包括选择位、连接位和形成新的位字符串。所有这些操作都在编译时进行检查,以确保运行时的可靠性,但代价是编译时间。
有 4 种不同的寄存器类型。
所有寄存器变体都可以使用 all-regs
功能包含。
用法
要利用大多数功能,需要使用一组特质。要利用所有有用的特质,建议使用预导入。
基本用法
use register_bits::prelude::*;
// Forms a Reg32Bits<32>
let value = Reg32Bits::new(0x1234_5678);
// Take substrings from value
let low_12bits: Reg32Bits<12> = value.take_low(); // 0x678
let high_12bits: Reg32Bits<12> = value.take_high(); // 0x123
// Type of Reg32Bits<24> is automatically inferred
let concatination = high_12bits.concat(low_12bits); // 0x123_678
assert_eq!(high_12bits.concat(low_12bits), 0x123_678);
转换
use register_bits::prelude::*;
// Forms a Reg32Bits<32>
let value = Reg32Bits::new(0x1234_5678);
let low_12bits: Reg32Bits<12> = value.take_low(); // 0x678
// We can fetch the inner value
let uint_value = u32::from(low_12bits);
assert_eq!(uint_value, 0x678);
// Most of the operations you can do from within the struct however
assert_eq!(low_12bits, 0x678);
assert_eq!(low_12bits + 1, 0x679);
assert_eq!(low_12bits - 1, 0x677);
assert_eq!(low_12bits % 2, 0);
assert_eq!(low_12bits >> 2, 0x6);
// You can also add bits
let bigger: Reg32Bits<16> = low_12bits.zero_extend(); // 0x0678
let sign_extended: Reg32Bits<16> = low_12bits.sign_extend(); // 0x0678
let padded: Reg32Bits<16> = low_12bits.zero_pad(); // 0x6780
单个位操作
use register_bits::prelude::*;
// Forms a Reg32Bits<32>
let value = Reg32Bits::new(0b1011_1000);
let low_byte: Reg32Bits<8> = value.take_low(); // 0b1011_1000
// We can get the value of individual bits
let bits = low_byte.bits();
// This is perfect for pattern matching
assert_eq!(bits, [1, 0, 1, 1, 1, 0, 0, 0]);
// We can also get a bit from a runtime variable
assert_eq!(low_byte.get(3).unwrap(), 1u8);
无 std
no-std
确保环境不使用标准库。
开发
reg8.rs
、reg16.rs
、reg32.rs
和 reg64.rs
会自动从 reg_reference.rs
文件中生成。这个过程是通过 generate_impl_rs.py
脚本完成的。