#bits #register #compile-time #bit #isa #static

无需 std register-bits

在编译时验证的寄存器位操作

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编码

MIT 许可证

630KB
19K SLoC

寄存器位 🦀 许可证: MIT register-bits on crates.io 源代码仓库

一个用于执行编译时验证的寄存器位操作的 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.rsreg16.rsreg32.rsreg64.rs 会自动从 reg_reference.rs 文件中生成。这个过程是通过 generate_impl_rs.py 脚本完成的。

无运行时依赖

特性