aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2018-01-15 13:13:56 +0100
committerKarel Kočí <cynerd@email.cz>2018-01-15 13:13:56 +0100
commit5241e1d9733ea69a91d3f497bc794ce881ad49fd (patch)
treeed941cd505a82f81f9b39004a70087c5b900dc06
parent4dc4726c80bab8192abfb2d881a69ef9f490754f (diff)
downloadqtmips-5241e1d9733ea69a91d3f497bc794ce881ad49fd.tar.gz
qtmips-5241e1d9733ea69a91d3f497bc794ce881ad49fd.tar.bz2
qtmips-5241e1d9733ea69a91d3f497bc794ce881ad49fd.zip
Change how we configure cache and configure hazard unit
-rw-r--r--qtmips_gui/coreview/memory.cpp4
-rw-r--r--qtmips_machine/machineconfig.cpp71
-rw-r--r--qtmips_machine/machineconfig.h42
-rw-r--r--qtmips_machine/qtmipsmachine.cpp19
4 files changed, 95 insertions, 41 deletions
diff --git a/qtmips_gui/coreview/memory.cpp b/qtmips_gui/coreview/memory.cpp
index 13355db..cde1c72 100644
--- a/qtmips_gui/coreview/memory.cpp
+++ b/qtmips_gui/coreview/memory.cpp
@@ -18,9 +18,7 @@ Memory::Memory(machine::QtMipsMachine *machine) : QGraphicsObject(nullptr) {
con_req_write = new Connector(M_PI_2);
con_req_read = new Connector(M_PI_2);
- if (machine->config().cache()) {
- // TODO cache?
- }
+ // TODO cache?
name = new QGraphicsSimpleTextItem("Memory", this);
QRectF name_box = name->boundingRect();
diff --git a/qtmips_machine/machineconfig.cpp b/qtmips_machine/machineconfig.cpp
index cf8629c..e479d66 100644
--- a/qtmips_machine/machineconfig.cpp
+++ b/qtmips_machine/machineconfig.cpp
@@ -2,18 +2,36 @@
using namespace machine;
+MachineConfigCache::MachineConfigCache() {
+ // TODO
+}
+
+MachineConfigCache::MachineConfigCache(const MachineConfigCache *cc) {
+ // TODO
+}
+
+bool MachineConfigCache::operator==(const MachineConfigCache &c) const {
+ // TODO
+ return true;
+}
+
+bool MachineConfigCache::operator!=(const MachineConfigCache &c) const {
+ return !operator==(c);
+}
+
MachineConfig::MachineConfig() {
pipeline = false;
delayslot = true;
- cache_type = CCT_NONE;
- elf_path = QString("");
+ hunit = HU_STALL_FORWARD;
}
MachineConfig::MachineConfig(const MachineConfig *cc) {
pipeline = cc->pipelined();
delayslot = cc->delay_slot();
- cache_type = cc->cache();
elf_path = cc->elf();
+ cch_program = cc->cache_program();
+ cch_data = cc->cache_data();
+ hunit = cc->hazard_unit();
}
void MachineConfig::set_pipelined(bool v) {
@@ -26,14 +44,22 @@ void MachineConfig::set_delay_slot(bool v) {
pipeline = false;
}
-void MachineConfig::set_cache(enum CacheType cc) {
- cache_type = cc;
-}
-
void MachineConfig::set_elf(QString path) {
elf_path = path;
}
+void MachineConfig::set_cache_program(const MachineConfigCache &c) {
+ cch_program = c;
+}
+
+void MachineConfig::set_cache_data(const MachineConfigCache &c) {
+ cch_data = c;
+}
+
+void MachineConfig::set_hazard_unit(enum MachineConfig::HazardUnit hu) {
+ hunit = hu;
+}
+
bool MachineConfig::pipelined() const {
return pipeline;
}
@@ -42,10 +68,33 @@ bool MachineConfig::delay_slot() const {
return delayslot;
}
-enum MachineConfig::CacheType MachineConfig::cache() const {
- return cache_type;
-}
-
QString MachineConfig::elf() const {
return elf_path;
}
+
+MachineConfigCache MachineConfig::cache_program() const {
+ return cch_program;
+}
+
+MachineConfigCache MachineConfig::cache_data() const {
+ return cch_data;
+}
+
+enum MachineConfig::HazardUnit MachineConfig::hazard_unit() const {
+ return hunit;
+}
+
+bool MachineConfig::operator==(const MachineConfig &c) const {
+#define CMP(GETTER) (GETTER)() == (c.GETTER)()
+ return CMP(pipelined) && \
+ CMP(delay_slot) && \
+ CMP(elf) && \
+ CMP(cache_program) && \
+ CMP(cache_data) && \
+ CMP(hazard_unit);
+#undef CMP
+}
+
+bool MachineConfig::operator!=(const MachineConfig &c) const {
+ return !operator==(c);
+}
diff --git a/qtmips_machine/machineconfig.h b/qtmips_machine/machineconfig.h
index c55228a..10b8458 100644
--- a/qtmips_machine/machineconfig.h
+++ b/qtmips_machine/machineconfig.h
@@ -5,38 +5,60 @@
namespace machine {
+class MachineConfigCache {
+public:
+ MachineConfigCache();
+ MachineConfigCache(const MachineConfigCache *cc);
+
+ // TODO
+
+ bool operator ==(const MachineConfigCache &c) const;
+ bool operator !=(const MachineConfigCache &c) const;
+
+private:
+ // TODO
+};
+
class MachineConfig {
public:
MachineConfig();
MachineConfig(const MachineConfig *cc);
- enum CacheType {
- CCT_NONE,
- CCT_ASSOCIATIVE,
- // TODO
+ enum HazardUnit {
+ HU_NONE,
+ HU_STALL,
+ HU_STALL_FORWARD
};
// Configure if CPU is pipelined
// In default disabled.
void set_pipelined(bool);
- // Configure if we want to do jump prediction
+ // Configure if cpu should simulate delay slot in non-pipelined core
// In default enabled. When disabled it also automatically disables pipelining.
void set_delay_slot(bool);
- // Configure cache type
- // In default CCT_NONE is used.
- void set_cache(enum CacheType);
// Set path to source elf file. This has to be set before core is initialized.
void set_elf(QString path);
+ // Configure cache
+ void set_cache_program(const MachineConfigCache&);
+ void set_cache_data(const MachineConfigCache&);
+ // Hazard unit
+ void set_hazard_unit(enum HazardUnit);
bool pipelined() const;
bool delay_slot() const;
- enum CacheType cache() const;
QString elf() const;
+ MachineConfigCache cache_program() const;
+ MachineConfigCache cache_data() const;
+ enum HazardUnit hazard_unit() const;
+
+ bool operator ==(const MachineConfig &c) const;
+ bool operator !=(const MachineConfig &c) const;
private:
bool pipeline, delayslot;
- enum CacheType cache_type;
QString elf_path;
+ MachineConfigCache cch_program, cch_data;
+ enum HazardUnit hunit;
};
}
diff --git a/qtmips_machine/qtmipsmachine.cpp b/qtmips_machine/qtmipsmachine.cpp
index f2683fb..c60cdce 100644
--- a/qtmips_machine/qtmipsmachine.cpp
+++ b/qtmips_machine/qtmipsmachine.cpp
@@ -14,25 +14,10 @@ QtMipsMachine::QtMipsMachine(const MachineConfig &cc) : QObject(), mcnf(&cc) {
regs = new Registers();
mem = new Memory(*mem_program_only);
- MemoryAccess *coremem;
- switch (cc.cache()) {
- case MachineConfig::CCT_NONE:
- cch = nullptr;
- coremem = mem;
- break;
- case MachineConfig::CCT_ASSOCIATIVE:
- // TODO
- coremem = mem;
- //coremem = cch = new CacheAssociative();
- break;
- default:
- throw QTMIPS_EXCEPTION(Sanity, "Trying to configure unknown cache type", "");
- }
-
if (cc.pipelined())
- cr = new CorePipelined(regs, coremem);
+ cr = new CorePipelined(regs, mem);
else
- cr = new CoreSingle(regs, coremem, cc.delay_slot());
+ cr = new CoreSingle(regs, mem, cc.delay_slot());
run_t = new QTimer(this);
set_speed(0); // In default run as fast as possible