diff options
-rw-r--r-- | qtmips_cli/main.cpp | 10 | ||||
-rw-r--r-- | qtmips_machine/machineconfig.cpp | 14 | ||||
-rw-r--r-- | qtmips_machine/machineconfig.h | 1 |
3 files changed, 25 insertions, 0 deletions
diff --git a/qtmips_cli/main.cpp b/qtmips_cli/main.cpp index c77ba2f..2984d8c 100644 --- a/qtmips_cli/main.cpp +++ b/qtmips_cli/main.cpp @@ -59,6 +59,7 @@ void create_parser(QCommandLineParser &p) { p.addOption({"asm", "Treat provided file argument as assembler source."}); p.addOption({"pipelined", "Configure CPU to use five stage pipeline."}); p.addOption({"no-delay-slot", "Disable jump delay slot."}); + p.addOption({"hazard-unit", "Specify hazard unit imeplementation [none|stall|forward].", "HUKIND"}); p.addOption({{"trace-fetch", "tr-fetch"}, "Trace fetched instruction (for both pipelined and not core)."}); p.addOption({{"trace-decode", "tr-decode"}, "Trace instruction in decode stage. (only for pipelined core)"}); p.addOption({{"trace-execute", "tr-execute"}, "Trace instruction in execute stage. (only for pipelined core)"}); @@ -145,6 +146,15 @@ void configure_machine(QCommandLineParser &p, MachineConfig &cc) { cc.set_delay_slot(!p.isSet("no-delay-slot")); cc.set_pipelined(p.isSet("pipelined")); + siz = p.values("hazard-unit").size(); + if (siz >= 1) { + QString hukind = p.values("hazard-unit").at(siz - 1).toLower(); + if (!cc.set_hazard_unit(hukind)) { + std::cerr << "Unknown kind of hazard unit specified" << std::endl; + exit(1); + } + } + siz = p.values("read-time").size(); if (siz >= 1) cc.set_memory_access_time_read(p.values("read-time").at(siz - 1).toLong()); diff --git a/qtmips_machine/machineconfig.cpp b/qtmips_machine/machineconfig.cpp index 2e0cf78..b81d7c6 100644 --- a/qtmips_machine/machineconfig.cpp +++ b/qtmips_machine/machineconfig.cpp @@ -34,6 +34,7 @@ ******************************************************************************/ #include "machineconfig.h" +#include <QMap> using namespace machine; @@ -304,6 +305,19 @@ void MachineConfig::set_hazard_unit(enum MachineConfig::HazardUnit hu) { hunit = hu; } +bool MachineConfig::set_hazard_unit(QString hukind) { + static QMap<QString, enum HazardUnit> hukind_map = { + {"none", HU_NONE}, + {"stall", HU_STALL}, + {"forward", HU_STALL_FORWARD}, + {"stall-forward", HU_STALL_FORWARD}, + }; + if (!hukind_map.contains(hukind)) + return false; + set_hazard_unit(hukind_map.value(hukind)); + return true; +} + void MachineConfig::set_memory_execute_protection(bool v) { exec_protect = v; } diff --git a/qtmips_machine/machineconfig.h b/qtmips_machine/machineconfig.h index bcd5b76..35373f7 100644 --- a/qtmips_machine/machineconfig.h +++ b/qtmips_machine/machineconfig.h @@ -119,6 +119,7 @@ public: void set_delay_slot(bool); // Hazard unit void set_hazard_unit(enum HazardUnit); + bool set_hazard_unit(QString hukind); // Protect data memory from execution. Only program sections can be executed. void set_memory_execute_protection(bool); // Protect program memory from accidental writes. |