From 85d83e42294c952eca0dd8efd7baf55fe6af15df Mon Sep 17 00:00:00 2001 From: David Li Date: Sun, 3 Jan 2016 10:24:14 -0700 Subject: Add write_word, read_byte, write_byte --- src/memory.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 50 insertions(+), 6 deletions(-) diff --git a/src/memory.rs b/src/memory.rs index 5092f55..22d9bce 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -48,8 +48,43 @@ pub trait MemoryInterface { // fn read_halfword(&self, address: isa::Address) -> Result; // fn write_halfword(&self, address: isa::Address) -> Result<()>; - // fn read_byte(&self, address: isa::Address) -> Result; - // fn write_byte(&self, address: isa::Address) -> Result<()>; + fn read_byte(&mut self, address: isa::Address) -> Result { + let result = self.read_word(address); + let offset = address % 4; + + match result { + Ok(word) => match offset { + 0 => Ok((word & 0xFF) as isa::Byte), + 1 => Ok((word & 0xFF00) as isa::Byte), + 2 => Ok((word & 0xFF0000) as isa::Byte), + 3 => Ok((word & 0xFF000000) as isa::Byte), + _ => panic!(""), + }, + Err(e) => Err(e), + } + } + + fn write_byte(&mut self, address: isa::Address, value: isa::Byte) -> Result<()> { + let address = address / 4; + let offset = address % 4; + + let result = self.read_word(address); + let value = value as isa::Word; + + match result { + Ok(word) => { + match offset { + 0 => (word & !(0xFF)) | value, + 1 => (word & !(0xFF00)) | (value << 8), + 2 => (word & !(0xFF0000)) | (value << 16), + 3 => (word & !(0xFF000000)) | (value << 24), + _ => panic!(""), + }; + Ok(()) + }, + Err(e) => Err(e), + } + } } pub type SharedMemory<'a> = Rc>>; @@ -191,7 +226,7 @@ impl<'a> DirectMappedCache<'a> { impl<'a> MemoryInterface for DirectMappedCache<'a> { fn latency(&self) -> u32 { - 100 + 0 } fn step(&mut self) { @@ -240,7 +275,7 @@ impl<'a> MemoryInterface for DirectMappedCache<'a> { fn read_word(&mut self, address: isa::Address) -> Result { let normalized = self.normalize_address(address); let (new_tag, _, _) = self.parse_address(address); - let stall = self.latency(); + let stall = self.next_level.borrow().latency(); let (tag, index, offset) = self.parse_address(address); let ref mut set = self.cache[index as usize]; @@ -286,7 +321,16 @@ impl<'a> MemoryInterface for DirectMappedCache<'a> { fn write_word(&mut self, address: isa::Address, value: isa::Word) -> Result<()> { - // XXX: temporary - self.next_level.borrow_mut().write_word(address, value) + // Write-allocate policy + match self.read_word(address) { + Ok(_) => { + // Write-through policy + match self.next_level.borrow_mut().write_word(address, value) { + Ok(()) => Ok(()), + Err(e) => Err(e), + } + }, + Err(e) => Err(e), + } } } -- cgit v1.2.3