From d7ca8071777cc1b11572dbb0d79dcf8a677a0bcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Karel=20Ko=C4=8D=C3=AD?= Date: Sun, 15 Apr 2018 12:59:45 +0200 Subject: Add cache dock --- qtmips_gui/MainWindow.ui | 32 +++++++++++++++++++------------- qtmips_gui/cachedock.cpp | 44 ++++++++++++++++++++++++++++++++++++++++++++ qtmips_gui/cachedock.h | 27 +++++++++++++++++++++++++++ qtmips_gui/coreview.h | 2 ++ qtmips_gui/mainwindow.cpp | 14 ++++++++++++++ qtmips_gui/mainwindow.h | 5 ++++- qtmips_gui/qtmips_gui.pro | 6 ++++-- 7 files changed, 114 insertions(+), 16 deletions(-) create mode 100644 qtmips_gui/cachedock.cpp create mode 100644 qtmips_gui/cachedock.h diff --git a/qtmips_gui/MainWindow.ui b/qtmips_gui/MainWindow.ui index a3f5fcc..1c49fe3 100644 --- a/qtmips_gui/MainWindow.ui +++ b/qtmips_gui/MainWindow.ui @@ -64,10 +64,10 @@ Windows - - - + + + @@ -271,16 +271,6 @@ Ctrl+P - - - Cache content - - - - - Cache statistics - - Registers @@ -301,6 +291,22 @@ Ctrl+Shift+R + + + Program Cache + + + Ctrl+Shift+P + + + + + Data Cache + + + Ctrl+Shift+M + + diff --git a/qtmips_gui/cachedock.cpp b/qtmips_gui/cachedock.cpp new file mode 100644 index 0000000..eb96e06 --- /dev/null +++ b/qtmips_gui/cachedock.cpp @@ -0,0 +1,44 @@ +#include "cachedock.h" + +CacheDock::CacheDock(QWidget *parent, const QString &type) : QDockWidget(parent) { + top_widget = new QWidget(this); + setWidget(top_widget); + layout_box = new QVBoxLayout(top_widget); + + no_cache = new QLabel("No " + type + " Cache configured", top_widget); + layout_box->addWidget(no_cache); + + top_form = new QWidget(top_widget); + top_form->setVisible(false); + layout_box->addWidget(top_form); + layout_top_form = new QFormLayout(top_form); + + l_hit = new QLabel("0", top_form); + layout_top_form->addRow("Hit:", l_hit); + l_miss = new QLabel("0", top_form); + layout_top_form->addRow("Miss:", l_miss); + + // TODO cache view + + setObjectName(type + "Cache"); + setWindowTitle(type + " Cache"); +} + +void CacheDock::setup(const machine::Cache *cache) { + l_hit->setText("0"); + l_miss->setText("0"); + if (cache) { + connect(cache, SIGNAL(hit_update(uint)), this, SLOT(hit_update(uint))); + connect(cache, SIGNAL(miss_update(uint)), this, SLOT(miss_update(uint))); + } + top_form->setVisible((bool)cache); + no_cache->setVisible(!(bool)cache); +} + +void CacheDock::hit_update(unsigned val) { + l_hit->setText(QString::number(val)); +} + +void CacheDock::miss_update(unsigned val) { + l_miss->setText(QString::number(val)); +} diff --git a/qtmips_gui/cachedock.h b/qtmips_gui/cachedock.h new file mode 100644 index 0000000..a13cd08 --- /dev/null +++ b/qtmips_gui/cachedock.h @@ -0,0 +1,27 @@ +#ifndef CACHEDOCK_H +#define CACHEDOCK_H + +#include +#include +#include +#include "qtmipsmachine.h" + +class CacheDock : public QDockWidget { + Q_OBJECT +public: + CacheDock(QWidget *parent, const QString &type); + + void setup(const machine::Cache *cache); + +private slots: + void hit_update(unsigned); + void miss_update(unsigned); + +private: + QVBoxLayout *layout_box; + QWidget *top_widget, *top_form; + QFormLayout *layout_top_form; + QLabel *l_hit, *l_miss, *no_cache; +}; + +#endif // CACHEDOCK_H diff --git a/qtmips_gui/coreview.h b/qtmips_gui/coreview.h index 1504483..9fdf0a3 100644 --- a/qtmips_gui/coreview.h +++ b/qtmips_gui/coreview.h @@ -41,6 +41,8 @@ signals: void request_data_memory(); void request_program_memory(); void request_jump_to_program_counter(std::uint32_t addr); + void request_cache_program(); + void request_cache_data(); protected: coreview::ProgramMemory *mem_program; diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp index 21581d2..ce6f52c 100644 --- a/qtmips_gui/mainwindow.cpp +++ b/qtmips_gui/mainwindow.cpp @@ -20,6 +20,10 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { program->hide(); memory = new MemoryDock(this); memory->hide(); + cache_program = new CacheDock(this, "Program"); + cache_program->hide(); + cache_data = new CacheDock(this, "Data"); + cache_data->hide(); // Execution speed actions speed_group = new QActionGroup(this); @@ -36,6 +40,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { connect(ui->actionRegisters, SIGNAL(triggered(bool)), this, SLOT(show_registers())); connect(ui->actionProgram_memory, SIGNAL(triggered(bool)), this, SLOT(show_program())); connect(ui->actionMemory, SIGNAL(triggered(bool)), this, SLOT(show_memory())); + connect(ui->actionProgram_Cache, SIGNAL(triggered(bool)), this, SLOT(show_cache_program())); + connect(ui->actionData_Cache, SIGNAL(triggered(bool)), this, SLOT(show_cache_data())); connect(ui->ips1, SIGNAL(toggled(bool)), this, SLOT(set_speed())); connect(ui->ips5, SIGNAL(toggled(bool)), this, SLOT(set_speed())); connect(ui->ips10, SIGNAL(toggled(bool)), this, SLOT(set_speed())); @@ -57,6 +63,8 @@ MainWindow::~MainWindow() { delete registers; delete program; delete memory; + delete cache_program; + delete cache_data; delete ui; if (machine != nullptr) delete machine; @@ -101,11 +109,15 @@ void MainWindow::create_core(const machine::MachineConfig &config) { connect(corescene, SIGNAL(request_program_memory()), this, SLOT(show_program())); connect(corescene, SIGNAL(request_data_memory()), this, SLOT(show_memory())); connect(corescene, SIGNAL(request_jump_to_program_counter(std::uint32_t)), program, SLOT(jump_to_pc(std::uint32_t))); + connect(corescene, SIGNAL(request_cache_program()), this, SLOT(show_cache_program())); + connect(corescene, SIGNAL(request_cache_data()), this, SLOT(show_cache_data())); // Setup docks registers->setup(machine); program->setup(machine); memory->setup(machine); + cache_program->setup(machine->config().cache_program().enabled() ? machine->cache_program() : nullptr); + cache_data->setup(machine->config().cache_data().enabled() ? machine->cache_data() : nullptr); // Set status to ready machine_status(machine::QtMipsMachine::ST_READY); } @@ -139,6 +151,8 @@ void MainWindow::machine_reload() { SHOW_HANDLER(registers) SHOW_HANDLER(program) SHOW_HANDLER(memory) +SHOW_HANDLER(cache_program) +SHOW_HANDLER(cache_data) #undef SHOW_HANDLER void MainWindow::set_speed() { diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h index 999c966..3c1cf9f 100644 --- a/qtmips_gui/mainwindow.h +++ b/qtmips_gui/mainwindow.h @@ -9,6 +9,7 @@ #include "registersdock.h" #include "programdock.h" #include "memorydock.h" +#include "cachedock.h" #include "qtmipsmachine.h" #include "machineconfig.h" @@ -32,6 +33,8 @@ public slots: void show_registers(); void show_program(); void show_memory(); + void show_cache_data(); + void show_cache_program(); // Actions - execution speed void set_speed(); // Machine signals @@ -53,7 +56,7 @@ private: RegistersDock *registers; ProgramDock *program; MemoryDock *memory; - // TODO implement cache docks + CacheDock *cache_program, *cache_data; QActionGroup *speed_group; diff --git a/qtmips_gui/qtmips_gui.pro b/qtmips_gui/qtmips_gui.pro index 59111d6..2d8ba78 100644 --- a/qtmips_gui/qtmips_gui.pro +++ b/qtmips_gui/qtmips_gui.pro @@ -35,7 +35,8 @@ SOURCES += \ coreview/junction.cpp \ coreview/logicblock.cpp \ coreview/and.cpp \ - statictable.cpp + statictable.cpp \ + cachedock.cpp \ HEADERS += \ mainwindow.h \ @@ -58,7 +59,8 @@ HEADERS += \ coreview/junction.h \ coreview/logicblock.h \ coreview/and.h \ - statictable.h + statictable.h \ + cachedock.h \ FORMS += \ NewDialog.ui \ -- cgit v1.2.3