aboutsummaryrefslogtreecommitdiff
path: root/riscv/icsim.cc
diff options
context:
space:
mode:
Diffstat (limited to 'riscv/icsim.cc')
-rw-r--r--riscv/icsim.cc100
1 files changed, 0 insertions, 100 deletions
diff --git a/riscv/icsim.cc b/riscv/icsim.cc
deleted file mode 100644
index 308e7ed..0000000
--- a/riscv/icsim.cc
+++ /dev/null
@@ -1,100 +0,0 @@
-#include "icsim.h"
-#include <stdexcept>
-#include <iostream>
-#include <iomanip>
-
-icsim_t::icsim_t(size_t _sets, size_t _ways, size_t _linesz, const char* _name)
- : sets(_sets), ways(_ways), linesz(_linesz), idx_mask(_sets-1), name(_name)
-{
- if(sets == 0 || (sets & (sets-1)))
- throw std::logic_error("sets not a power of 2");
- if(linesz == 0 || (linesz & (linesz-1)))
- throw std::logic_error("linesz not a power of 2");
-
- idx_shift = 0;
- while(_linesz >>= 1)
- idx_shift++;
-
- tags = new uint64_t[sets*ways];
- memset(tags, 0, sets*ways*sizeof(uint64_t));
-
- read_accesses = 0;
- read_misses = 0;
- bytes_read = 0;
- write_accesses = 0;
- write_misses = 0;
- bytes_written = 0;
- writebacks = 0;
-}
-
-icsim_t::icsim_t(const icsim_t& rhs)
- : sets(rhs.sets), ways(rhs.ways), linesz(rhs.linesz),
- idx_shift(rhs.idx_shift), idx_mask(rhs.idx_mask), name(rhs.name)
-{
- tags = new uint64_t[sets*ways];
- memcpy(tags, rhs.tags, sets*ways*sizeof(uint64_t));
-}
-
-icsim_t::~icsim_t()
-{
- delete [] tags;
-}
-
-void icsim_t::print_stats()
-{
- if(read_accesses + write_accesses == 0)
- return;
-
- float mr = 100.0f*(read_misses+write_misses)/(read_accesses+write_accesses);
-
- std::cout << std::setprecision(3) << std::fixed;
- std::cout << name << " ";
- std::cout << "Bytes Read: " << bytes_read << std::endl;
- std::cout << name << " ";
- std::cout << "Bytes Written: " << bytes_written << std::endl;
- std::cout << name << " ";
- std::cout << "Read Accesses: " << read_accesses << std::endl;
- std::cout << name << " ";
- std::cout << "Write Accesses: " << write_accesses << std::endl;
- std::cout << name << " ";
- std::cout << "Read Misses: " << read_misses << std::endl;
- std::cout << name << " ";
- std::cout << "Write Misses: " << write_misses << std::endl;
- std::cout << name << " ";
- std::cout << "Writebacks: " << writebacks << std::endl;
- std::cout << name << " ";
- std::cout << "Miss Rate: " << mr << '%' << std::endl;
-
- float cr = read_accesses == 0 ? 0.0f : 100.0f*bytes_read/(4*read_accesses);
- if(name == "I$")
- {
- std::cout << name << " ";
- std::cout << "RVC compression ratio: " << cr << '%' << std::endl;
- }
-}
-
-void icsim_t::tick(uint64_t pc, int insnlen, bool store)
-{
- store ? write_accesses++ : read_accesses++;
- (store ? bytes_written : bytes_read) += insnlen;
-
- size_t idx = (pc >> idx_shift) & idx_mask;
- size_t tag = (pc >> idx_shift) | VALID;
-
- for(size_t i = 0; i < ways; i++)
- {
- if(tag == (tags[idx + i*sets] & ~DIRTY)) // hit
- {
- if(store)
- tags[idx + i*sets] |= DIRTY;
- return;
- }
- }
-
- store ? write_misses++ : read_misses++;
-
- size_t way = lfsr.next() % ways;
- if((tags[idx + way*sets] & (VALID | DIRTY)) == (VALID | DIRTY))
- writebacks++;
- tags[idx + way*sets] = tag;
-}