use crate::mem::Memory; pub struct CpuState { pub memory: Memory, pub registers: [u32; 32], pub f_registers: [f32; 32], pub csr: [u32; 4096], pub pc: u32, pub reserved_addr: Option, } impl CpuState { pub fn new(memory: Memory) -> CpuState { CpuState { memory, registers: [0u32; 32], f_registers: [0f32; 32], csr: [0u32; 4096], pc: 0, reserved_addr: None, } } pub fn is_addr_reserved(&self, addr: usize) -> bool { if let Some(reservation) = self.reserved_addr && (reservation..reservation + 4).contains(&addr) { return true } false } pub fn release_reservations(&mut self, indices: &[usize]) { if let Some(addr) = self.reserved_addr { for index in indices { if (addr..addr + 4).contains(index) { self.reserved_addr = None; return; } } } } pub fn acquire_reservations(&mut self, addr: usize) { self.reserved_addr = Some(addr); } }