hardware 0.0.9

A no_std bare-metal hardware abstraction layer — all port I/O, memory and swap allocations are guarded at runtime. Do not consider this dependency stable before x.1.x
Documentation
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct BitField {
    pub offset: u8,
    pub width: u8,
}

impl BitField {
    pub const fn new(offset: u8, width: u8) -> Self {
        Self { offset, width }
    }

    pub const fn mask_u64(&self) -> u64 {
        if self.width == 0 {
            0
        } else {
            ((1u64 << (self.width as u64)) - 1) << (self.offset as u64)
        }
    }

    pub const fn mask_u32(&self) -> u32 {
        self.mask_u64() as u32
    }

    pub fn extract_u32(&self, value: u32) -> u32 {
        (value >> self.offset) & ((1u32 << self.width) - 1)
    }

    pub fn insert_u32(&self, value: u32, field: u32) -> u32 {
        let mask = self.mask_u32();
        let f = (field << self.offset) & mask;
        (value & !mask) | f
    }

    pub fn extract_u64(&self, value: u64) -> u64 {
        (value >> (self.offset as u64)) & ((1u64 << (self.width as u64)) - 1)
    }

    pub fn insert_u64(&self, value: u64, field: u64) -> u64 {
        let mask = self.mask_u64();
        let f = (field << (self.offset as u64)) & mask;
        (value & !mask) | f
    }
}