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
use crate::dma::buffer::DmaBuffer;

pub struct LpuBuffer {
    dma: DmaBuffer,
    rows: usize,
    cols: usize,
    elem_size: usize,
}

impl LpuBuffer {
    pub fn rows(&self) -> usize {
        self.rows
    }

    pub fn cols(&self) -> usize {
        self.cols
    }

    pub fn elem_size(&self) -> usize {
        self.elem_size
    }

    pub fn len_bytes(&self) -> usize {
        self.rows
            .saturating_mul(self.cols)
            .saturating_mul(self.elem_size)
    }

    pub fn as_ptr(&self) -> *mut u8 {
        self.dma.as_ptr()
    }

    pub fn into_dma(self) -> DmaBuffer {
        self.dma
    }
}

pub struct LpuMemory;

impl LpuMemory {
    pub fn alloc_matrix(
        rows: usize,
        cols: usize,
        elem_size: usize,
        align: usize,
    ) -> Option<LpuBuffer> {
        if rows == 0 || cols == 0 || elem_size == 0 {
            return None;
        }
        let len = rows.checked_mul(cols)?.checked_mul(elem_size)?;
        let dma = DmaBuffer::new(len, align)?;
        Some(LpuBuffer {
            dma,
            rows,
            cols,
            elem_size,
        })
    }

    pub fn alloc_tokens(tokens: usize, hidden_size: usize, align: usize) -> Option<LpuBuffer> {
        Self::alloc_matrix(tokens, hidden_size, 1, align)
    }
}