From 210fff77d5ec0ab172aee309323168a052d489c3 Mon Sep 17 00:00:00 2001 From: David Li Date: Sun, 17 Jan 2016 17:11:25 -0700 Subject: Distinguish between memory and cache at type level --- src/memory.rs | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'src/memory.rs') diff --git a/src/memory.rs b/src/memory.rs index 052ffb7..958ef21 100644 --- a/src/memory.rs +++ b/src/memory.rs @@ -123,7 +123,23 @@ pub trait MemoryInterface { } } +pub struct CacheMetadata { + /// How many sets are in the cache + pub num_sets: usize, + /// How many ways are in a set + pub num_ways: usize, + /// How many words are in a block/line + pub num_block_words: usize, + /// The tags currently in the cache, in order of set, then way + pub tags: Vec>, +} + +pub trait CacheInterface : MemoryInterface { + fn cache_metadata(&self) -> CacheMetadata; +} + pub type SharedMemory<'a> = Rc>; +pub type SharedCache<'a> = Rc>; pub trait Mmu { fn translate(&self, address: isa::Address) -> isa::Address; @@ -441,3 +457,29 @@ impl<'a> MemoryInterface for DirectMappedCache<'a> { } } } + +impl<'a> CacheInterface for DirectMappedCache<'a> { + fn cache_metadata(&self) -> CacheMetadata { + let tags = { + let mut tags = Vec::new(); + + for set in self.cache.iter() { + if set.valid { + tags.push(Some(isa::Word(set.tag))); + } + else { + tags.push(None); + } + } + + tags + }; + + CacheMetadata { + num_sets: self.num_sets as usize, + num_ways: 1, + num_block_words: self.block_words as usize, + tags: tags, + } + } +} -- cgit v1.2.3