From 043c2566c112f0d913c52aa80c9fcc4da5fb11ae Mon Sep 17 00:00:00 2001 From: bd Date: Thu, 27 Mar 2025 20:47:44 -0400 Subject: Use an unordered map to record pipe stage history on instructions --- inc/instrDTO.h | 22 ++++++++-------------- src/sim/if.cc | 2 +- src/sim/instrDTO.cc | 11 +++-------- tests/if.cc | 6 +++--- 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 #include +#include +#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 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]); } -- cgit v1.2.3