summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-04-18 00:03:56 -0400
committerbd <bdunahu@operationnull.com>2025-04-18 00:03:56 -0400
commit360e6cbffb3d2c1279ae7c3a02c2850f5523eeb2 (patch)
tree5bc5c848ca6b5326480c7b0760087db79c8653f1 /src
parent12a8ceb7b7046652264c98a2d0de2dd4fd7c5cd4 (diff)
Keep track of squashed instructions in DTO object
Diffstat (limited to 'src')
-rw-r--r--src/sim/if.cc5
-rw-r--r--src/sim/instrDTO.cc5
-rw-r--r--src/sim/stage.cc4
3 files changed, 11 insertions, 3 deletions
diff --git a/src/sim/if.cc b/src/sim/if.cc
index bab2608..6494912 100644
--- a/src/sim/if.cc
+++ b/src/sim/if.cc
@@ -12,8 +12,9 @@ InstrDTO *IF::advance(Response p)
this->advance_helper();
if (this->curr_instr != nullptr && p == WAIT) {
- // mutual consent
- ++this->pc;
+ // don't increment PC if the PC was just set by wb
+ if (this->curr_instr->is_squashed() != 1)
+ ++this->pc;
r = new InstrDTO(*this->curr_instr);
delete curr_instr;
curr_instr = nullptr;
diff --git a/src/sim/instrDTO.cc b/src/sim/instrDTO.cc
index a82ef28..fb6c82b 100644
--- a/src/sim/instrDTO.cc
+++ b/src/sim/instrDTO.cc
@@ -11,6 +11,7 @@ InstrDTO::InstrDTO()
this->mnemonic = ADD;
this->type = INV;
this->pc = 0;
+ this->squashed = 0;
}
signed int InstrDTO::get_instr_bits() { return this->instr_bits; }
@@ -29,6 +30,8 @@ Type InstrDTO::get_type() { return this->type; }
unsigned int InstrDTO::get_pc() { return this->pc; }
+int InstrDTO::is_squashed() { return this->squashed; }
+
void InstrDTO::set_instr_bits(signed int instr) { this->instr_bits = instr; }
void InstrDTO::set_checked_out(signed int checked_out)
@@ -47,3 +50,5 @@ void InstrDTO::set_mnemonic(Mnemonic m) { this->mnemonic = m; }
void InstrDTO::set_type(Type t) { this->type = t; }
void InstrDTO::set_pc(unsigned int pc) { this->pc = pc; }
+
+void InstrDTO::squash() { this->squashed = 1; }
diff --git a/src/sim/stage.cc b/src/sim/stage.cc
index 9528e4b..d65ca87 100644
--- a/src/sim/stage.cc
+++ b/src/sim/stage.cc
@@ -34,6 +34,8 @@ InstrDTO *Stage::advance(Response p)
// for (long unsigned int i = 0; i < this->checked_out.size(); ++i)
// std::cout << this->checked_out[i] << " ";
// std::cout << std::endl;
+ if (this->curr_instr && this->curr_instr->is_squashed() == 1)
+ this->status = OK;
if (this->curr_instr && this->status != OK) {
this->advance_helper();
}
@@ -108,7 +110,7 @@ bool Stage::is_checked_out(signed int r)
void Stage::squash()
{
if (curr_instr) {
- this->curr_instr->set_mnemonic(NOP);
+ this->curr_instr->squash();
this->status = OK;
}
if (this->next) {