#[derive(Debug)]
pub enum BusError {
AccessFault,
AddressMisaligned,
}
pub trait Bus<A, V> {
fn load(&self, address: A) -> Result<V, BusError>;
fn store(&self, address: A, value: V) -> Result<(), BusError>;
}
pub trait Csr {
fn access(
&mut self,
address: CsrAddress,
f: impl FnOnce(u64) -> u64,
) -> Result<u64, CsrIllegal>;
}
pub struct CsrIllegal;
#[derive(Clone, Copy)]
pub struct CsrAddress(u16);
impl Csr for () {
fn access(&mut self, address: CsrAddress, f: impl FnOnce(u64) -> u64) -> Result<u64, CsrIllegal> {
Err(CsrIllegal)
}
}
impl CsrAddress {
pub const fn new(address: u16) -> Option<CsrAddress> {
if address < 4096 {
Some(CsrAddress(address))
} else {
None
}
}
pub const unsafe fn new_unchecked(address: u16) -> CsrAddress {
CsrAddress(address)
}
pub const fn address(self) -> u16 {
self.0
}
}