summaryrefslogtreecommitdiff
path: root/src/sim/ex.cc
diff options
context:
space:
mode:
authorSiddarth Suresh <155843085+SiddarthSuresh98@users.noreply.github.com>2025-03-30 19:34:17 -0400
committerGitHub <noreply@github.com>2025-03-30 19:34:17 -0400
commit12a9e93f913c0057f2ef32f5894931c8b4bd3a85 (patch)
tree88669ed2be55b4f455ef4ac56263a01dd5f70a40 /src/sim/ex.cc
parenteedf9686eb60f2008e7766cc9a5d3e037b9dae64 (diff)
parent36dabe6183af98b2e3f6d0316436dc3affc3d986 (diff)
Merge pull request #41 from bdunahu/bdunahu
Add mock stage, proper decode tests changes look good
Diffstat (limited to 'src/sim/ex.cc')
-rw-r--r--src/sim/ex.cc197
1 files changed, 195 insertions, 2 deletions
diff --git a/src/sim/ex.cc b/src/sim/ex.cc
index 3a1e92c..50882d2 100644
--- a/src/sim/ex.cc
+++ b/src/sim/ex.cc
@@ -1,9 +1,202 @@
#include "ex.h"
#include "accessor.h"
+#include "definitions.h"
#include "instrDTO.h"
#include "response.h"
#include "stage.h"
+#include <unordered_map>
-EX::EX(Stage *stage) : Stage(stage) { this->id = EXEC; }
+// clang-format off
+#define INIT_INSTRUCTION(mnemonic, body) \
+ {mnemonic, [this](signed int &s1, signed int s2) { \
+ body; \
+ }}
+// clang-format on
-InstrDTO *EX::advance(Response p) { return nullptr; }
+EX::EX(Stage *stage) : Stage(stage)
+{
+ this->id = EXEC;
+ instr_map = {
+
+ /* R type instructions */
+ INIT_INSTRUCTION(
+ ADD,
+ {
+ s1 = s1 + s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ SUB,
+ {
+ s1 = s1 - s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ MUL,
+ {
+ s1 = s1 * s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ QUOT,
+ {
+ s1 = s1 / s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ REM,
+ {
+ s1 = s1 % s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ SFTR,
+ {
+ s1 = s1 >> s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ SFTL,
+ {
+ s1 = s1 << s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ AND,
+ {
+ s1 = s1 & s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ OR,
+ {
+ s1 = s1 | s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ NOT,
+ {
+ s1 = ~s1;
+ (void)s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ XOR,
+ {
+ s1 = s1 ^ s2;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ ADDV,
+ {
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ SUBV,
+ {
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ MULV,
+ {
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ DIVV,
+ {
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
+
+ INIT_INSTRUCTION(
+ CMP,
+ {
+ (s1 > s2) ? this->set_condition(GT, true)
+ : this->set_condition(GT, false);
+ (s1 == s2) ? this->set_condition(EQ, true)
+ : this->set_condition(EQ, false);
+ }),
+
+ INIT_INSTRUCTION(
+ CEV,
+ {
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
+
+ /* I type instructions */
+ INIT_INSTRUCTION(LOAD, {}),
+
+ INIT_INSTRUCTION(LOADV, {}),
+
+ INIT_INSTRUCTION(ADDI, {}),
+
+ INIT_INSTRUCTION(SUBI, {}),
+
+ INIT_INSTRUCTION(SFTRI, {}),
+
+ INIT_INSTRUCTION(SFTL, {}),
+
+ INIT_INSTRUCTION(ANDI, {}),
+
+ INIT_INSTRUCTION(ORI, {}),
+
+ INIT_INSTRUCTION(XORI, {}),
+
+ INIT_INSTRUCTION(STORE, {}),
+
+ INIT_INSTRUCTION(STOREV, {}),
+
+ /* J type instructions */
+ INIT_INSTRUCTION(JMP, {}),
+
+ INIT_INSTRUCTION(JRL, {}),
+
+ INIT_INSTRUCTION(JAL, {}),
+
+ INIT_INSTRUCTION(BEQ, {}),
+
+ INIT_INSTRUCTION(BGT, {}),
+
+ INIT_INSTRUCTION(BUF, {}),
+
+ INIT_INSTRUCTION(BOF, {}),
+
+ INIT_INSTRUCTION(PUSH, {}),
+
+ INIT_INSTRUCTION(POP, {}),
+
+ /* NOP */
+ INIT_INSTRUCTION(
+ NOP,
+ {
+ (void)s2;
+ (void)s1;
+ (void)this;
+ }),
+ };
+}
+
+void EX::advance_helper() {}