summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-27 20:47:44 -0400
committerbd <bdunahu@operationnull.com>2025-03-27 20:47:44 -0400
commit043c2566c112f0d913c52aa80c9fcc4da5fb11ae (patch)
tree65afb024ab26d4731487343d553db961a8dc6659
parenteaa87e9fcd90c00d6261cbdb854efb7a09467f1d (diff)
Use an unordered map to record pipe stage history on instructions
-rw-r--r--inc/instrDTO.h22
-rw-r--r--src/sim/if.cc2
-rw-r--r--src/sim/instrDTO.cc11
-rw-r--r--tests/if.cc6
4 files changed, 15 insertions, 26 deletions
diff --git a/inc/instrDTO.h b/inc/instrDTO.h
index 7f2c688..2a6ab1f 100644
--- a/inc/instrDTO.h
+++ b/inc/instrDTO.h
@@ -2,6 +2,8 @@
#define INSTRDTO_H
#include <string>
#include <functional>
+#include <unordered_map>
+#include "accessor.h"
class InstrDTO
{
@@ -13,9 +15,9 @@ class InstrDTO
~InstrDTO() = default;
/**
- * @return if_cycle
+ * @return hist entry for Accessor
*/
- int get_if_cycle();
+ int get_time_of(Accessor);
/**
* @return id_cycle
*/
@@ -42,13 +44,9 @@ class InstrDTO
std::string get_oper_name();
/**
- * @param if_cycle
+ * @param set hist key
*/
- void set_if_cycle(int);
- /**
- * @param id_cycle
- */
- void set_id_cycle(int);
+ void set_time_of(Accessor, int);
/**
* @param instr_bits
*/
@@ -68,13 +66,9 @@ class InstrDTO
private:
/**
- * The clock cycle this instruction finished being fetched.
- */
- int if_cycle;
- /**
- * The clock cycle this instruction finished being identified.
+ * The clock cycle each stage finished an operation.
*/
- int id_cycle;
+ std::unordered_map<Accessor, int> hist;
/**
* The raw bits encoding the instruction.
*/
diff --git a/src/sim/if.cc b/src/sim/if.cc
index f5a2bb9..559ad2e 100644
--- a/src/sim/if.cc
+++ b/src/sim/if.cc
@@ -14,7 +14,7 @@ Response IF::advance(InstrDTO &i)
r = this->storage->read_word(this->id, this->pc, bits);
if (r == OK) {
++this->pc;
- i.set_if_cycle(this->clock_cycle);
+ i.set_time_of(this->id, this->clock_cycle);
i.set_instr_bits(bits);
}
diff --git a/src/sim/instrDTO.cc b/src/sim/instrDTO.cc
index 4e24d4e..7864eb4 100644
--- a/src/sim/instrDTO.cc
+++ b/src/sim/instrDTO.cc
@@ -1,18 +1,15 @@
#include "instrDTO.h"
+#include "accessor.h"
InstrDTO::InstrDTO()
{
- this->if_cycle = 0;
- this->id_cycle = 0;
this->instr_bits = 0;
this->s1 = 0;
this->s2 = 0;
this->s3 = 0;
}
-int InstrDTO::get_if_cycle() { return this->if_cycle; }
-
-int InstrDTO::get_id_cycle() { return this->id_cycle; }
+int InstrDTO::get_time_of(Accessor a) { return this->hist[a]; }
signed int InstrDTO::get_instr_bits() { return this->instr_bits; }
@@ -22,9 +19,7 @@ signed int InstrDTO::get_s2() { return this->s2; }
signed int InstrDTO::get_s3() { return this->s3; }
-void InstrDTO::set_if_cycle(int cycle) { this->if_cycle = cycle; }
-
-void InstrDTO::set_id_cycle(int cycle) { this->id_cycle = cycle; }
+void InstrDTO::set_time_of(Accessor a, int i) { this->hist[a] = i; }
void InstrDTO::set_instr_bits(signed int instr) { this->instr_bits = instr; }
diff --git a/tests/if.cc b/tests/if.cc
index 5c1b645..3e68ac4 100644
--- a/tests/if.cc
+++ b/tests/if.cc
@@ -77,7 +77,7 @@ TEST_CASE_METHOD(IFPipeFixture, "fetch returns single instuction", "[if_pipe]")
expected_cycles = this->m_delay + this->c_delay + 2;
this->fetch_through(instr);
- CHECK(instr.get_if_cycle() == expected_cycles);
+ CHECK(instr.get_time_of(FETCH) == expected_cycles);
REQUIRE(instr.get_instr_bits() == this->p[0]);
}
@@ -89,12 +89,12 @@ TEST_CASE_METHOD(IFPipeFixture, "fetch returns two instuctions", "[if_pipe]")
expected_cycles = this->m_delay + this->c_delay + 2;
this->fetch_through(instr);
- CHECK(instr.get_if_cycle() == expected_cycles);
+ CHECK(instr.get_time_of(FETCH) == expected_cycles);
REQUIRE(instr.get_instr_bits() == this->p[0]);
expected_cycles += this->c_delay + 1;
this->fetch_cache(instr);
- CHECK(instr.get_if_cycle() == expected_cycles);
+ CHECK(instr.get_time_of(FETCH) == expected_cycles);
REQUIRE(instr.get_instr_bits() == this->p[1]);
}