use super::MATH_STATUS;
use bitflags::bitflags;
use volatile_register::{RO, WO};
bitflags! {
pub struct StatusFlags: u8 {
const DIVBUSY = 0b1000_0000; const MULBUSY = 0b0100_0000; }
}
#[repr(C, packed)]
pub struct MathAccelerator {
pub divout_fraction: RO<u32>, pub divout_whole: RO<u32>, pub multin_a: WO<u32>, pub multin_b: WO<u32>, pub multout: RO<u64>, }
impl MathAccelerator {
pub fn multiply(&self, a: u32, b: u32) -> u64 {
unsafe {
self.multin_a.write(a);
self.multin_b.write(b);
}
self.multout.read()
}
pub fn multiply_divide(&self, a: u32, b: u32) -> (u64, u32, u32) {
let product = self.multiply(a, b);
while unsafe { &(*MATH_STATUS) }
.read()
.contains(StatusFlags::DIVBUSY)
{}
(
product,
self.divout_whole.read(),
self.divout_fraction.read(),
)
}
}