opentitanlib/util/
bitfield.rs1pub struct BitField {
7 pub offset: u32,
9 pub size: u32,
11}
12
13impl BitField {
14 pub const fn new(offset: u32, size: u32) -> BitField {
16 BitField { offset, size }
17 }
18
19 pub const fn extract(&self, word: u32) -> u32 {
21 (word & self.mask()) >> self.offset
22 }
23
24 pub const fn emplace(&self, value: u32) -> u32 {
26 (value << self.offset) & self.mask()
27 }
28
29 pub const fn mask(&self) -> u32 {
31 let mask = (1 << self.size) - 1;
32 mask << self.offset
33 }
34}
35
36#[cfg(test)]
37mod test {
38 use super::*;
39
40 #[test]
41 fn basic() {
42 let bitfield = BitField { offset: 2, size: 3 };
43
44 assert_eq!(bitfield.mask(), 0b0011100);
45 assert_eq!(bitfield.extract(0b1110111), 0b101);
46 assert_eq!(bitfield.emplace(0b101), 0b0010100);
47 }
48}