From 06632f57c9047b7e54a274b6b020bcc83f5f9a64 Mon Sep 17 00:00:00 2001
From: Siddarth-Suresh <65844402+Siddarth-Suresh@users.noreply.github.com>
Date: Fri, 18 Apr 2025 04:08:15 -0400
Subject: initialization from GUI
---
gui/gui.ui | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.ui b/gui/gui.ui
index 5e8daca..3b7003c 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -437,26 +437,36 @@
-
-
-
+
-
-
-
-
+
-
+
- Refresh DRAM
+ Cache Levels
-
-
-
- Refresh Cache
+
+
+ -
+
+
+ size
-
-
+
+
+ ways
+
+
+
+ -
+
- Refresh Registers
+ Cache Conf
@@ -465,9 +475,9 @@
-
-
-
+
- Reset
+ Configure
@@ -476,12 +486,12 @@
Enable Pipeline
-
+
-
@@ -489,9 +499,9 @@
Enable Cache
-
+
--
cgit v1.2.3
From d593d9964e5e6dd77c805763863d1e03dd5f3083 Mon Sep 17 00:00:00 2001
From: bd
Date: Fri, 18 Apr 2025 18:21:17 -0400
Subject: Remove lines
---
gui/gui.ui | 307 +++++++++++++++++--------------------------------------------
1 file changed, 83 insertions(+), 224 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.ui b/gui/gui.ui
index 3b7003c..661e228 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -7,7 +7,7 @@
0
0
1359
- 606
+ 638
@@ -16,108 +16,8 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Registers
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Cache
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- -
-
-
-
-
-
-
- true
-
-
-
- DRAM
-
-
-
- -
-
-
- Qt::Horizontal
-
-
-
- -
-
-
-
-
-
-
-
-
- -
+
+
-
-
@@ -142,13 +42,6 @@
- -
-
-
- Qt::Vertical
-
-
-
-
@@ -162,30 +55,6 @@
-
-
@@ -196,13 +65,6 @@
- -
-
-
- Qt::Vertical
-
-
-
-
@@ -250,13 +112,6 @@
- -
-
-
- Qt::Vertical
-
-
-
-
@@ -304,13 +159,6 @@
- -
-
-
- Qt::Vertical
-
-
-
-
@@ -360,7 +208,7 @@
- -
+
-
-
@@ -376,13 +224,6 @@
- -
-
-
- Qt::Horizontal
-
-
-
-
-
@@ -405,13 +246,6 @@
- -
-
-
- Qt::Horizontal
-
-
-
-
@@ -428,18 +262,11 @@
- -
-
-
- Qt::Horizontal
-
-
-
-
-
-
+
-
-
-
+
-
Cache Levels
@@ -486,12 +313,6 @@
Enable Pipeline
-
-
@@ -499,9 +320,6 @@
Enable Cache
-
@@ -512,13 +330,6 @@
-
-
-
-
-
- Qt::Horizontal
-
-
-
-
@@ -531,13 +342,6 @@
- -
-
-
- Qt::Horizontal
-
-
-
-
-
@@ -569,13 +373,6 @@
- -
-
-
- Qt::Horizontal
-
-
-
-
-
@@ -590,13 +387,6 @@
- -
-
-
- Qt::Horizontal
-
-
-
-
@@ -615,12 +405,70 @@
- -
-
-
- Qt::Vertical
-
-
+
-
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Registers
+
+
+
+ -
+
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Cache
+
+
+
+ -
+
+
+
+
+ -
+
+
-
+
+
+
+ true
+
+
+
+ DRAM
+
+
+
+ -
+
+
+
+
+
+
+
@@ -632,12 +480,23 @@
0
0
1359
- 26
+ 19
+
+
+ toolBar
+
+
+ TopToolBarArea
+
+
+ false
+
+
-
+
--
cgit v1.2.3
From 5e96476ae29a104df1c4526ba1037dc830207d56 Mon Sep 17 00:00:00 2001
From: bd
Date: Fri, 18 Apr 2025 19:31:17 -0400
Subject: Use a slider for step amount
---
gui/gui.cc | 13 ++-
gui/gui.h | 2 +-
gui/gui.ui | 348 +++++++++++++++++++++++++++++++++++++++-------------------
gui/worker.cc | 6 +-
gui/worker.h | 2 +-
5 files changed, 250 insertions(+), 121 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index e2e7beb..7e3ddfe 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -54,8 +54,14 @@ GUI::GUI(QWidget *parent)
// Refresh Registers from worker thread
connect(this, &GUI::sendRefreshRegisters, worker, &Worker::refreshRegisters, Qt::QueuedConnection);
- // Advance controller by 1 step
- connect(this, &GUI::sendRunStep, worker, &Worker::runStep, Qt::QueuedConnection);
+ // Advance controller by somes steps
+ connect(this, &GUI::sendRunSteps, worker, &Worker::runSteps, Qt::QueuedConnection);
+
+ // Update the step button with step amount
+ connect(ui->step_slider, &QSlider::valueChanged, this, [=](int index){
+ int value = step_values[index];
+ ui->step_btn->setText(QString("Step %1").arg(value));
+ });
// Proper cleanup when worker finishes
connect(worker, &Worker::finished, this, &GUI::onWorkerFinished);
@@ -330,7 +336,8 @@ void GUI::on_enabl_cache_checkbox_checkStateChanged(const Qt::CheckState &arg1)
void GUI::on_step_btn_clicked()
{
qDebug() << "Run step button clicked.";
- emit sendRunStep();
+ int steps = step_values[ui->step_slider->value()];
+ emit sendRunSteps(steps);
}
void GUI::on_save_program_state_btn_clicked()
diff --git a/gui/gui.h b/gui/gui.h
index ee871a1..618f2b5 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -35,7 +35,6 @@ signals:
void sendRefreshCache();
void sendRefreshRegisters();
void sendRunSteps(int steps);
- void sendRunStep();
void sendLoadProgram(std::vector program);
void sendConfigure(std::vector ways, std::vector size, bool is_pipelined, bool is_cache_enabled);
@@ -82,6 +81,7 @@ private:
Ui::GUI *ui;
QThread workerThread;
Worker *worker;
+ QVector step_values = {1, 5, 10, 50, 250, 1000, 10000};
const std::map mnemonicNameMap = {
{Mnemonic::ADD, "ADD"},
{Mnemonic::SUB, "SUB"},
diff --git a/gui/gui.ui b/gui/gui.ui
index 661e228..7198a20 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -7,7 +7,7 @@
0
0
1359
- 638
+ 621
@@ -16,8 +16,108 @@
-
-
-
-
+
+
-
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Registers
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Cache
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
+ -
+
+
-
+
+
+
+ true
+
+
+
+ DRAM
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
+
+
+
+
+
+
+ -
-
@@ -42,6 +142,13 @@
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
-
@@ -65,6 +172,13 @@
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
-
@@ -112,6 +226,13 @@
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
-
@@ -159,6 +280,13 @@
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
-
@@ -206,9 +334,61 @@
+ -
+
+
-
+
+
+
+ true
+
+
+
+ Run
+
+
+
+ -
+
+
+ 0
+
+
+ 6
+
+
+ 1
+
+
+ Qt::Orientation::Horizontal
+
+
+ QSlider::TickPosition::NoTicks
+
+
+ 1
+
+
+
+ -
+
+
+ Step
+
+
+
+
+
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
- -
+
-
-
@@ -224,6 +404,13 @@
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
-
-
@@ -246,6 +433,13 @@
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
-
@@ -262,6 +456,13 @@
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
-
-
@@ -331,48 +532,31 @@
-
-
-
-
-
- true
-
+
+
+ Qt::Orientation::Horizontal
-
- Run
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
-
-
-
-
-
-
-
-
-
- # Steps
-
-
-
- -
-
-
- Run Steps
-
-
-
-
-
- -
-
-
- Step
-
-
-
-
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
-
-
@@ -387,6 +571,13 @@
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
-
@@ -405,70 +596,12 @@
- -
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Registers
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Cache
-
-
-
- -
-
-
-
-
- -
-
-
-
-
-
-
- true
-
-
-
- DRAM
-
-
-
- -
-
-
-
-
-
-
-
+ -
+
+
+ Qt::Orientation::Vertical
+
+
@@ -485,17 +618,6 @@
-
-
- toolBar
-
-
- TopToolBarArea
-
-
- false
-
-
diff --git a/gui/worker.cc b/gui/worker.cc
index 4465268..3c2c952 100644
--- a/gui/worker.cc
+++ b/gui/worker.cc
@@ -90,10 +90,10 @@ void Worker::refreshRegisters()
emit register_storage(this->ct->get_gprs());
}
-void Worker::runStep()
+void Worker::runSteps(int steps)
{
- qDebug() << "Running for 1 step ";
- this->ct->advance(WAIT);
+ qDebug() << "Running for " << steps << "steps";
+ this->ct->run_for(steps);
emit dram_storage(this->d->view(0, 255));
if(this->cache_enabled && getWays().size() > 0) {
unsigned int size = this->c.at(getWays().size()-1)->get_size();
diff --git a/gui/worker.h b/gui/worker.h
index 60bbce3..f0ce7a3 100644
--- a/gui/worker.h
+++ b/gui/worker.h
@@ -45,7 +45,7 @@ public slots:
void configure(std::vector ways, std::vector size, bool is_pipelined, bool is_cache_enabled);
void refreshCache();
void refreshRegisters();
- void runStep();
+ void runSteps(int steps);
signals:
void clock_cycles(int value, int pc);
--
cgit v1.2.3
From 5c2de6eccd2d4b32ce81082b82917e8768394ed1 Mon Sep 17 00:00:00 2001
From: bd
Date: Fri, 18 Apr 2025 20:08:21 -0400
Subject: Initial retro-theme change
---
gui/gui.cc | 2 +-
gui/gui.ui | 92 +++++++++++++++++++------------
gui/main.cc | 15 ++++-
gui/resources.qrc | 5 +-
gui/resources/input.txt | 1 -
gui/resources/styles.qss | 139 +++++++++++++++++++++++++++++++++++++++++++++++
6 files changed, 213 insertions(+), 41 deletions(-)
delete mode 100644 gui/resources/input.txt
create mode 100644 gui/resources/styles.qss
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index 7e3ddfe..8281fb1 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -336,7 +336,7 @@ void GUI::on_enabl_cache_checkbox_checkStateChanged(const Qt::CheckState &arg1)
void GUI::on_step_btn_clicked()
{
qDebug() << "Run step button clicked.";
- int steps = step_values[ui->step_slider->value()];
+ int steps = step_values[ui->step_slider->value()];
emit sendRunSteps(steps);
}
diff --git a/gui/gui.ui b/gui/gui.ui
index 7198a20..ad6275f 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -124,18 +124,21 @@
Fetch
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
-
- Instruction Bits
+
-
- Program Counter
+
@@ -154,18 +157,21 @@
Decode
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
-
- Instruction Bits
+
-
- Program Counter
+
@@ -184,11 +190,14 @@
Execute
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
-
- s1
+
@@ -198,28 +207,28 @@
- s2
+
-
- s3
+
-
- Mnemonic
+
-
- Program Counter
+
@@ -238,11 +247,14 @@
Memory
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
-
- s1
+
@@ -252,28 +264,28 @@
- s2
+
-
- s3
+
-
- Mnemonic
+
-
- Program Counter
+
@@ -292,11 +304,14 @@
Write Back
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
-
- s1
+
@@ -306,28 +321,28 @@
- s2
+
-
- s3
+
-
- Mnemonic
+
-
- Program Counter
+
@@ -372,8 +387,14 @@
-
+
+
+ 400
+ 0
+
+
- Step
+ Step 1
@@ -421,15 +442,21 @@
-
-
-
-
-
-
- Upload Program State File
-
-
-
-
+
+
+ Upload Program State File
+
+
+
+ -
+
+
+ Save Current Program State
+
+
+
+ -
+
@@ -585,13 +612,6 @@
- -
-
-
- Save Current Program State
-
-
-
diff --git a/gui/main.cc b/gui/main.cc
index 5e45465..09bc4e9 100644
--- a/gui/main.cc
+++ b/gui/main.cc
@@ -1,7 +1,9 @@
-#include "pipe_spec.h"
#include "gui.h"
#include "logger.h"
+#include "pipe_spec.h"
#include
+#include
+#include
#include
#include
@@ -67,6 +69,17 @@ int main(int argc, char **argv)
global_log->log(INFO, "Starting QT...");
QApplication a(argc, argv);
+
+ int fId = QFontDatabase::addApplicationFont(
+ ":/resources/BigBlueTermPlusNerdFontMono-Regular.ttf");
+ QFile ssf(":/resources/styles.qss");
+ QString f = QFontDatabase::applicationFontFamilies(fId).at(0);
+ a.setFont(QFont(f));
+
+ ssf.open(QFile::ReadOnly);
+ QString ss = QLatin1String(ssf.readAll());
+ a.setStyleSheet(ss);
+
GUI w;
w.show();
return a.exec();
diff --git a/gui/resources.qrc b/gui/resources.qrc
index 8bfd4e7..59fb36f 100644
--- a/gui/resources.qrc
+++ b/gui/resources.qrc
@@ -1,6 +1,7 @@
-
- resources/input.txt
+
+ resources/styles.qss
+ resources/BigBlueTermPlusNerdFontMono-Regular.ttf
diff --git a/gui/resources/input.txt b/gui/resources/input.txt
deleted file mode 100644
index fc1c3cf..0000000
--- a/gui/resources/input.txt
+++ /dev/null
@@ -1 +0,0 @@
-Lorem Ipsum
\ No newline at end of file
diff --git a/gui/resources/styles.qss b/gui/resources/styles.qss
new file mode 100644
index 0000000..1f1b82f
--- /dev/null
+++ b/gui/resources/styles.qss
@@ -0,0 +1,139 @@
+* {
+ font-family: "BigBlueTermPlusNerdFontMono", "monospace";
+ font-size: 20pt;
+ color: "#00cc00";
+ background-color: "#000004";
+}
+
+/* main window */
+QWidget {
+}
+
+QGroupBox {
+ font-size: 17pt;
+ background-color: "#000004";
+ border: 4px solid ;
+ border-radius: 0px;
+ margin-bottom: 1ex; /* leave space at the bottom for the title */
+}
+
+QGroupBox::title {
+ subcontrol-origin: margin;
+ subcontrol-position: bottom left;
+ border-radius: 0px;
+ padding: 0 2px;
+ background-color: "#00cc00";
+ color: "#000000";
+}
+
+QLabel {
+}
+
+/* text entry */
+QLineEdit {
+ font-size: 15pt;
+ border-radius: 0px;
+ padding: 0 4px;
+ selection-background-color: "#00cc00";
+}
+
+QTextEdit, QListView {
+ font-size: 10pt;
+ background-color: "#000004";
+}
+
+QPushButton {
+ border: 4px solid "#00cc00";
+}
+
+QPushButton:pressed {
+ color: "#000004";
+ background-color: "#00cc00";
+}
+
+QPushButton:flat {
+ border: none; /* no border for a flat push button */
+}
+
+QPushButton:default {
+ border-color: "#00cc00";
+}
+
+QMenuBar {
+ background-color: "#00cc00";
+ spacing: 3px; /* spacing between menu bar items */
+}
+
+QMenuBar::item {
+ padding: 1px 4px;
+ background: transparent;
+ border-radius: 4px;
+}
+
+QMenuBar::item:selected { /* when selected using mouse or keyboard */
+ background: #a8a8a8;
+}
+
+QMenuBar::item:pressed {
+ background: #888888;
+}
+
+QCheckBox {
+ spacing: 5px;
+}
+
+QCheckBox::indicator {
+ width: 13px;
+ height: 13px;
+ border: 2px solid "#00cc00";
+}
+
+QCheckBox::indicator:unchecked {
+}
+
+/* QCheckBox::indicator:unchecked:pressed { */
+/* image: url(:/images/checkbox_unchecked_pressed.png); */
+/* } */
+
+QCheckBox::indicator:checked {
+ background: "#00cc00";
+}
+
+QSlider::groove:horizontal {
+ height: 5px; /* the groove expands to the size of the slider by default. by giving it a height, it has a fixed size */
+ background: "#00cc00";
+ margin: 2px 0;
+}
+
+QSlider::handle:horizontal {
+ background: "#00cc00";
+ width: 10px;
+ margin: -30px 0; /* handle is placed by default on the contents rect of the groove. Expand outside the groove */
+ border-radius: 3px;
+}
+
+QScrollBar:horizontal {
+ border: 2px solid "#00cc00";
+ height: 4px;
+ margin: 0px 20px 0 20px;
+}
+QScrollBar::handle:horizontal {
+ min-width: 20px;
+}
+QScrollBar::add-line:horizontal {
+ border: 2px solid "#00cc00";
+ width: 4px;
+ subcontrol-position: right;
+ subcontrol-origin: margin;
+}
+
+QScrollBar::sub-line:horizontal {
+ border: 2px solid "#00cc00";
+ width: 4px;
+ subcontrol-position: left;
+ subcontrol-origin: margin;
+}
+
+/* Local Variables: */
+/* mode: css */
+/* End: */
--
cgit v1.2.3
From c270fb1b6cbdc9f84c861210e69e6865170d9793 Mon Sep 17 00:00:00 2001
From: bd
Date: Fri, 18 Apr 2025 20:49:50 -0400
Subject: Display squashed, swap text entry to labels in stage view
---
gui/gui.cc | 55 ++++++-------
gui/gui.ui | 238 ++++++++++++++++++++++++++++++-------------------------
src/sim/id.cc | 2 +-
src/sim/if.cc | 2 +-
src/sim/stage.cc | 2 +-
5 files changed, 154 insertions(+), 145 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index 8281fb1..b3dc666 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -163,42 +163,35 @@ void GUI::onWorkerClockCycles(int cycles, int pc) {
}
void GUI::onWorkerFetchInfo(const std::vector info) {
- //QString::asprintf("%04X", value)
- if(!info.empty()) {
- ui->fetch_pc->setText(QString::number(info[0]));
- ui->fetch_instruction_bits->setText(QString::asprintf("%04X", info[1]));
+ if (!info.empty()) {
+ ui->fetch_squashed->setText(QString::number(info[0]));
+ ui->fetch_bits->setText(QString::asprintf("%04X", info[1]));
} else {
- ui->fetch_pc->clear();
- ui->fetch_instruction_bits->clear();
+ ui->fetch_squashed->clear();
+ ui->fetch_bits->clear();
}
}
void GUI::onWorkerDecodeInfo(const std::vector info) {
if(!info.empty()) {
- // ui->decode_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
- ui->decode_pc->setText(QString::number(info[0]));
- ui->decode_s1->setText(QString::asprintf("%04X", info[1]));
- // ui->decode_s2->setText(QString::asprintf("%04X", info[3]));
- // ui->decode_s3->setText(QString::asprintf("%04X", info[4]));
+ ui->decode_squashed->setText(QString::number(info[0]));
+ ui->decode_bits->setText(QString::asprintf("%04X", info[1]));
} else {
- // ui->decode_mnemonic->clear();
- ui->decode_pc->clear();
- ui->decode_s1->clear();
- // ui->decode_s2->clear();
- // ui->decode_s3->clear();
+ ui->decode_squashed->clear();
+ ui->decode_bits->clear();
}
}
void GUI::onWorkerExecuteInfo(const std::vector info) {
if(!info.empty()) {
- ui->execute_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
- ui->execute_pc->setText(QString::number(info[1]));
+ ui->execute_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
+ ui->execute_squashed->setText(QString::number(info[1]));
ui->execute_s1->setText(QString::asprintf("%04X", info[2]));
ui->execute_s2->setText(QString::asprintf("%04X", info[3]));
ui->execute_s3->setText(QString::asprintf("%04X", info[4]));
} else {
ui->execute_mnemonic->clear();
- ui->execute_pc->clear();
+ ui->execute_squashed->clear();
ui->execute_s1->clear();
ui->execute_s2->clear();
ui->execute_s3->clear();
@@ -207,14 +200,14 @@ void GUI::onWorkerExecuteInfo(const std::vector info) {
void GUI::onWorkerMemoryInfo(const std::vector info) {
if(!info.empty()) {
- ui->memory_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
- ui->memory_pc->setText(QString::number(info[1]));
+ ui->memory_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
+ ui->memory_squashed->setText(QString::number(info[1]));
ui->memory_s1->setText(QString::asprintf("%04X", info[2]));
ui->memory_s2->setText(QString::asprintf("%04X", info[3]));
ui->memory_s3->setText(QString::asprintf("%04X", info[4]));
} else {
ui->memory_mnemonic->clear();
- ui->memory_pc->clear();
+ ui->memory_squashed->clear();
ui->memory_s1->clear();
ui->memory_s2->clear();
ui->memory_s3->clear();
@@ -223,17 +216,15 @@ void GUI::onWorkerMemoryInfo(const std::vector info) {
void GUI::onWorkerWriteBackInfo(const std::vector info) {
if(!info.empty()) {
- ui->wb_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
- ui->wb_pc->setText(QString::number(info[1]));
- ui->wb_s1->setText(QString::asprintf("%04X", info[2]));
- ui->wb_s2->setText(QString::asprintf("%04X", info[3]));
- ui->wb_s3->setText(QString::asprintf("%04X", info[4]));
+ ui->write_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
+ ui->write_s1->setText(QString::asprintf("%04X", info[2]));
+ ui->write_s2->setText(QString::asprintf("%04X", info[3]));
+ ui->write_s3->setText(QString::asprintf("%04X", info[4]));
} else {
- ui->wb_mnemonic->clear();
- ui->wb_pc->clear();
- ui->wb_s1->clear();
- ui->wb_s2->clear();
- ui->wb_s3->clear();
+ ui->write_mnemonic->clear();
+ ui->write_s1->clear();
+ ui->write_s2->clear();
+ ui->write_s3->clear();
}
}
diff --git a/gui/gui.ui b/gui/gui.ui
index ad6275f..ae853a2 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -121,6 +121,12 @@
-
+
+
+ 150
+ 0
+
+
Fetch
@@ -129,15 +135,15 @@
-
-
-
+
+
-
-
-
+
+
@@ -154,6 +160,12 @@
-
+
+
+ 150
+ 0
+
+
Decode
@@ -162,16 +174,16 @@
-
-
-
-
+
+
+
-
-
-
-
+
+
+
@@ -187,6 +199,12 @@
-
+
+
+ 150
+ 0
+
+
Execute
@@ -195,41 +213,41 @@
-
-
-
+
+
-
-
+
-
-
-
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
+
+ Qt::TextFormat::MarkdownText
+
@@ -244,6 +262,12 @@
-
+
+
+ 150
+ 0
+
+
Memory
@@ -252,39 +276,36 @@
-
-
-
+
+
-
-
+
-
-
-
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
@@ -301,6 +322,12 @@
-
+
+
+ 150
+ 0
+
+
Write Back
@@ -309,39 +336,29 @@
-
-
-
-
-
-
-
- -
-
+
-
-
-
-
-
-
+
+
-
-
-
+
+
-
-
-
+
+
@@ -411,64 +428,6 @@
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Upload Files
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
-
-
- Upload Instruction File
-
-
-
- -
-
-
- Upload Program State File
-
-
-
- -
-
-
- Save Current Program State
-
-
-
- -
-
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
-
-
-
-
@@ -573,7 +532,66 @@
-
-
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Upload Files
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
-
+
+
+ Load Instructions
+
+
+
+ -
+
+
+ Upload Program State
+
+
+
+ -
+
+
+ Save Program State
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+
diff --git a/src/sim/id.cc b/src/sim/id.cc
index d10d695..59eefda 100644
--- a/src/sim/id.cc
+++ b/src/sim/id.cc
@@ -204,7 +204,7 @@ std::vector ID::stage_info()
{
std::vector info;
if (this->curr_instr) {
- info.push_back(this->curr_instr->get_pc());
+ info.push_back(this->curr_instr->is_squashed());
info.push_back(this->curr_instr->get_instr_bits());
}
return info;
diff --git a/src/sim/if.cc b/src/sim/if.cc
index 6494912..5f23115 100644
--- a/src/sim/if.cc
+++ b/src/sim/if.cc
@@ -26,7 +26,7 @@ InstrDTO *IF::advance(Response p)
std::vector IF::stage_info() {
std::vector info;
if(this->curr_instr){
- info.push_back(this->curr_instr->get_pc());
+ info.push_back(this->curr_instr->is_squashed());
info.push_back(this->curr_instr->get_instr_bits());
}
return info;
diff --git a/src/sim/stage.cc b/src/sim/stage.cc
index d65ca87..5819543 100644
--- a/src/sim/stage.cc
+++ b/src/sim/stage.cc
@@ -59,7 +59,7 @@ std::vector Stage::stage_info()
std::vector info;
if (this->curr_instr) {
info.push_back(this->curr_instr->get_mnemonic());
- info.push_back(this->curr_instr->get_pc());
+ info.push_back(this->curr_instr->is_squashed());
info.push_back(this->curr_instr->get_s1());
info.push_back(this->curr_instr->get_s2());
info.push_back(this->curr_instr->get_s3());
--
cgit v1.2.3
From 1613c52e8e52a5c1a2a8120fcfa7ed3a011fbdf1 Mon Sep 17 00:00:00 2001
From: bd
Date: Fri, 18 Apr 2025 21:56:45 -0400
Subject: Remove/comment out a lot of code in charge of loading
---
gui/gui.cc | 78 ++++-----------------------------------------------
gui/gui.h | 12 --------
gui/gui.ui | 49 ++------------------------------
gui/worker.cc | 89 +++++++++--------------------------------------------------
gui/worker.h | 19 ++-----------
5 files changed, 24 insertions(+), 223 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index b3dc666..39163ea 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -1,6 +1,5 @@
#include "gui.h"
#include "./ui_gui.h"
-// #include "byteswap.h"
GUI::GUI(QWidget *parent)
: QMainWindow(parent)
@@ -8,16 +7,13 @@ GUI::GUI(QWidget *parent)
{
ui->setupUi(this);
- ui->enabl_cache_checkbox->setChecked(true);
- ui->enable_pipeline_checkbox->setChecked(true);
-
worker = new Worker();
worker->moveToThread(&workerThread);
// Connect worker thread lifecycle
- connect(&workerThread, &QThread::started, worker, &Worker::doWork);
+ // connect(&workerThread, &QThread::started, worker, &Worker::doWork);
- // Display clock cycles and PC
+ // display clock cycles and PC
connect(worker, &Worker::clock_cycles, this, &GUI::onWorkerClockCycles);
connect(worker, &Worker::if_info, this, &GUI::onWorkerFetchInfo);
@@ -39,17 +35,11 @@ GUI::GUI(QWidget *parent)
// Display registers
connect(worker, &Worker::register_storage, this, &GUI::onWorkerShowRegisters);
- // Refresh DRAM from worker thread
- connect(this, &GUI::sendRefreshDram, worker, &Worker::refreshDram, Qt::QueuedConnection);
-
- // Load program from worker thread
- connect(this, &GUI::sendLoadProgram, worker, &Worker::loadProgram, Qt::QueuedConnection);
-
- // Configure pipeline
- connect(this, &GUI::sendConfigure, worker, &Worker::configure, Qt::QueuedConnection);
+ // // Refresh DRAM from worker thread
+ // connect(this, &GUI::sendRefreshDram, worker, &Worker::refreshDram, Qt::QueuedConnection);
- // Refresh Cache from worker thread
- connect(this, &GUI::sendRefreshCache, worker, &Worker::refreshCache, Qt::QueuedConnection);
+ // // Refresh Cache from worker thread
+ // connect(this, &GUI::sendRefreshCache, worker, &Worker::refreshCache, Qt::QueuedConnection);
// Refresh Registers from worker thread
connect(this, &GUI::sendRefreshRegisters, worker, &Worker::refreshRegisters, Qt::QueuedConnection);
@@ -257,51 +247,14 @@ void GUI::on_upload_intructions_btn_clicked()
QMessageBox::information(ui->register_table, "File Upload", "Instructions loaded successfully!");
}
-
void GUI::on_upload_program_state_btn_clicked()
{
//TODO:Upload and set program state ( have to decide how to use this)
qDebug() << "upload program state button is clicked.";
}
-void GUI::on_set_levels_btn_clicked()
-{
- qDebug() << "Set levels button clicked.";
- bool ok;
- int value = QInputDialog::getInt(this, "Enter Value", "Enter value:",
- 0,
- 0, 10, 1, &ok);
- if (ok) {
- cache_levels = value;
- ui->cache_levels_dropdwn->clear(); // Clear previous entries
- for (int i = 0; i < cache_levels; ++i) {
- ui->cache_levels_dropdwn->addItem(QString::number(i));
- ways.push_back(2);
- size.push_back(5);
- }
- } else {
- qDebug() << "User cancelled input.";
- }
-}
-
-void GUI::on_set_cache_btn_clicked() {
- int current_cache = ui->cache_levels_dropdwn->currentIndex();
- // qDebug() << "current cache: " << current_cache;
- int prevWays = ways[current_cache];
- int prevSize = size[current_cache];
- QString cache_ways = ui->cache_ways_inp->text();
- QString cache_size = ui->cache_size_inp->text();
- ways[current_cache] = cache_ways.isEmpty() ? prevWays : cache_ways.toInt();
- size[current_cache] = cache_size.isEmpty() ? prevSize : cache_size.toInt();
- QMessageBox::information(ui->register_table, "Cache Configuration", "Cache" + QString::number(current_cache) + " values set successfully! Please click on Configure button to configure the pipeline or configure other caches.");
- // for(int i=0;iregister_table, "Pipeline Configuration", "Pipeline and memory subsystem configured successfully!");
-}
diff --git a/gui/gui.h b/gui/gui.h
index 618f2b5..aaa0ede 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -25,10 +25,7 @@ public:
GUI(QWidget *parent = nullptr);
~GUI();
bool is_pipelined = false;
- bool is_cache_enabled = false;
- int cache_levels = 0;
std::vector ways;
- std::vector size;
signals:
void sendRefreshDram();
@@ -36,7 +33,6 @@ signals:
void sendRefreshRegisters();
void sendRunSteps(int steps);
void sendLoadProgram(std::vector program);
- void sendConfigure(std::vector ways, std::vector size, bool is_pipelined, bool is_cache_enabled);
private slots:
void onWorkerClockCycles(int value, int pc);
@@ -63,16 +59,8 @@ private slots:
void on_upload_program_state_btn_clicked();
- void on_Configure_Btn_clicked();
-
- void on_set_levels_btn_clicked();
-
- void on_set_cache_btn_clicked();
-
void on_enable_pipeline_checkbox_checkStateChanged(const Qt::CheckState &arg1);
- void on_enabl_cache_checkbox_checkStateChanged(const Qt::CheckState &arg1);
-
void on_step_btn_clicked();
void on_save_program_state_btn_clicked();
diff --git a/gui/gui.ui b/gui/gui.ui
index ae853a2..d731e99 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -452,60 +452,17 @@
-
-
-
-
-
-
-
- Cache Levels
-
-
-
- -
-
-
- -
-
-
- size
-
-
-
- -
-
-
- ways
-
-
-
- -
-
-
- Cache Conf
-
-
-
-
+
-
-
-
-
-
- Configure
-
-
-
-
Enable Pipeline
-
-
- -
-
-
- Enable Cache
+
+ true
diff --git a/gui/worker.cc b/gui/worker.cc
index 3c2c952..1d87fd3 100644
--- a/gui/worker.cc
+++ b/gui/worker.cc
@@ -2,86 +2,27 @@
Worker::Worker(QObject *parent) : QObject(parent) {}
-void Worker::configure(std::vector ways, std::vector size, bool is_pipelined, bool is_cache_enabled) {
- this->d = new Dram(ways.size()+10);
- setWays(ways);
- setSize(size);
- qDebug() << "is cache enabled:" << is_cache_enabled;
- qDebug() << "is pipelined:" << is_pipelined;
- this->cache_enabled = is_cache_enabled;
- if (!is_cache_enabled || ways.size() == 0) {
- this->ct = new Controller(wb_stage, this->d, is_pipelined);
- } else {
- // 0th index cache has largest delay
- for(int i=0;id, size[i], ways[i], ways.size());
- this->c.push_back(cache);
- } else {
- Cache* cache = new Cache(this->c[i-1], size[i], ways[i], ways.size()-i);
- this->c.push_back(cache);
- }
- }
- this->ct = new Controller(wb_stage, this->c.at(ways.size()-1), is_pipelined);
- }
- emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
-}
-
-void Worker::setWays(std::vector ways) {
- this->cache_ways = ways;
-}
-
-void Worker::setSize(std::vector size) {
- this->cache_size = size;
-}
-
-std::vector Worker::getWays() {
- return this->cache_ways;
-}
-
-std::vector Worker::getSize() {
- return this->cache_size;
-}
-
-void Worker::doWork()
-{
- qDebug() << "Initializing...";
-
- this->if_stage = new IF(nullptr);
- this->id_stage = new ID(if_stage);
- this->ex_stage = new EX(id_stage);
- this->mm_stage = new MM(ex_stage);
- this->wb_stage = new WB(mm_stage);
-}
-
Worker::~Worker()
{
emit finished();
qDebug() << "Worker destructor called in thread:"
<< QThread::currentThread();
delete this->ct;
- for(Cache *cache: this->c) {
- delete cache;
- }
-}
-
-void Worker::loadProgram(std::vector p) {
- this->d->load(p);
}
void Worker::refreshDram()
{
qDebug() << "Refreshing Dram";
- emit dram_storage(this->d->view(0, 255));
+ // emit dram_storage(this->d->view(0, 255));
}
void Worker::refreshCache()
{
qDebug() << "Refreshing Cache";
- if(getWays().size() > 0) {
- unsigned int size = this->c.at(getWays().size()-1)->get_size();
- emit cache_storage(this->c.at(getWays().size()-1)->view(0, 1< 0) {
+ // unsigned int size = this->c.at(getWays().size()-1)->get_size();
+ // emit cache_storage(this->c.at(getWays().size()-1)->view(0, 1<ct->run_for(steps);
- emit dram_storage(this->d->view(0, 255));
- if(this->cache_enabled && getWays().size() > 0) {
- unsigned int size = this->c.at(getWays().size()-1)->get_size();
- emit cache_storage(this->c.at(getWays().size()-1)->view(0, 1<ct->get_gprs());
- emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
- emit if_info(this->if_stage->stage_info());
- emit id_info(this->id_stage->stage_info());
- emit ex_info(this->ex_stage->stage_info());
- emit mm_info(this->mm_stage->stage_info());
- emit wb_info(this->wb_stage->stage_info());
+ // emit dram_storage(this->d->view(0, 255));
+ // emit register_storage(this->ct->get_gprs());
+ // emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
+ // emit if_info(this->if_stage->stage_info());
+ // emit id_info(this->id_stage->stage_info());
+ // emit ex_info(this->ex_stage->stage_info());
+ // emit mm_info(this->mm_stage->stage_info());
+ // emit wb_info(this->wb_stage->stage_info());
}
diff --git a/gui/worker.h b/gui/worker.h
index f0ce7a3..53e4851 100644
--- a/gui/worker.h
+++ b/gui/worker.h
@@ -18,31 +18,16 @@ class Worker : public QObject {
Q_OBJECT
private:
- std::vector c;
- std::vector cache_ways;
- std::vector cache_size;
- bool cache_enabled = false;
- Dram *d;
+ std::vector s;
+ std::vector p;
Controller *ct;
- ID *id_stage;
- IF *if_stage;
- EX *ex_stage;
- MM *mm_stage;
- WB *wb_stage;
public:
explicit Worker(QObject *parent = nullptr);
~Worker();
- std::vector getWays();
- std::vector getSize();
- void setWays(std::vector ways);
- void setSize(std::vector size);
public slots:
- void doWork();
void refreshDram();
- void loadProgram(std::vector p);
- void configure(std::vector ways, std::vector size, bool is_pipelined, bool is_cache_enabled);
void refreshCache();
void refreshRegisters();
void runSteps(int steps);
--
cgit v1.2.3
From 80dba1457231afd13a667a85f07c3db74f30aa87 Mon Sep 17 00:00:00 2001
From: bd
Date: Fri, 18 Apr 2025 22:34:46 -0400
Subject: Add a status bar
---
gui/gui.cc | 6 ++
gui/gui.ui | 351 ++++++++++++++++++++++++++++++-------------------------------
2 files changed, 180 insertions(+), 177 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index 39163ea..9381b55 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -7,6 +7,12 @@ GUI::GUI(QWidget *parent)
{
ui->setupUi(this);
+ QLabel* status_label = new QLabel("CONSENSUS: WAITING FOR USER.", this);
+ QLabel* risc_vector = new QLabel("RISC V[ECTOR], CS535 UMASS AMHERST", this);
+ status_label->setMinimumWidth(1200);
+ ui->statusBar->addWidget(status_label);
+ ui->statusBar->addPermanentWidget(risc_vector);
+
worker = new Worker();
worker->moveToThread(&workerThread);
diff --git a/gui/gui.ui b/gui/gui.ui
index d731e99..a2cd6cb 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -16,7 +16,7 @@
-
-
+
-
-
@@ -117,6 +117,171 @@
+ -
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Controls
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
-
+
+
+ -
+
+
-
+
+
+ Enable Pipeline
+
+
+ true
+
+
+
+
+
+
+
+
+
+ -
+
+
-
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Upload Files
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
-
+
+
+ Load Instructions
+
+
+
+ -
+
+
+ Upload Program State
+
+
+
+ -
+
+
+ Save Program State
+
+
+
+ -
+
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+
+
+
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
-
+
+
+
+ true
+
+
+
+ Program State
+
+
+
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
+ Clock Cycles
+
+
+
+
+
+
+
-
-
@@ -426,171 +591,6 @@
- -
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Controls
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- Enable Pipeline
-
-
- true
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
-
-
-
-
-
-
- true
-
-
-
- Upload Files
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
-
-
- Load Instructions
-
-
-
- -
-
-
- Upload Program State
-
-
-
- -
-
-
- Save Program State
-
-
-
- -
-
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
-
-
-
- true
-
-
-
- Program State
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
- Clock Cycles
-
-
-
-
-
-
-
-
@@ -598,21 +598,18 @@
+ -
+
+
+ GroupBox
+
+
+
-
-
+
--
cgit v1.2.3
From da25748edb6997629ffb380683c8c736f24033a8 Mon Sep 17 00:00:00 2001
From: bd
Date: Sat, 19 Apr 2025 02:23:03 -0400
Subject: Add custom QWidget to keep track of up to 4 user cache ways
---
gui/CMakeLists.txt | 2 +-
gui/dynamicwaysentry.cc | 80 ++++++++++++++++++++++++++++++++++
gui/dynamicwaysentry.h | 28 ++++++++++++
gui/gui.cc | 15 ++++---
gui/gui.h | 25 +++++++++--
gui/gui.ui | 109 +++++++++++++++++++++++++++++++++++++----------
gui/messages.h | 4 +-
gui/resources/styles.qss | 3 +-
8 files changed, 229 insertions(+), 37 deletions(-)
create mode 100644 gui/dynamicwaysentry.cc
create mode 100644 gui/dynamicwaysentry.h
(limited to 'gui/gui.ui')
diff --git a/gui/CMakeLists.txt b/gui/CMakeLists.txt
index 0d73527..2c48beb 100644
--- a/gui/CMakeLists.txt
+++ b/gui/CMakeLists.txt
@@ -21,7 +21,7 @@ file(GLOB SRCS
qt_add_resources(GUI_RESOURCES "resources.qrc")
add_executable(risc_vector ${SRCS} ${GUI_RESOURCES})
-target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/inc)
+target_include_directories(${PROJECT_NAME} PRIVATE ${PROJECT_SOURCE_DIR}/inc ${PROJECT_SOURCE_DIR}/gui)
target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_lib ram_lib Qt6::Widgets)
set_target_properties(risc_vector PROPERTIES
diff --git a/gui/dynamicwaysentry.cc b/gui/dynamicwaysentry.cc
new file mode 100644
index 0000000..f35c9ef
--- /dev/null
+++ b/gui/dynamicwaysentry.cc
@@ -0,0 +1,80 @@
+#include "dynamicwaysentry.h"
+#include
+#include
+#include
+#include
+#include
+#include
+
+DynamicWaysEntry::DynamicWaysEntry(QWidget *parent) : QWidget(parent)
+{
+ this->l = new QVBoxLayout(this);
+ this->l->setAlignment(Qt::AlignTop);
+ this->l->setSpacing(6);
+ this->l->setContentsMargins(0, 0, 0, 0);
+ this->setLayout(l);
+ this->add_field();
+}
+
+QStringList DynamicWaysEntry::get_entries() const { return this->entries; }
+
+int DynamicWaysEntry::parse_valid_way(QString t)
+{
+ bool s;
+ int i;
+ i = t.toInt(&s);
+ return (s && i >= 0 && 5 > i) ? i : -1;
+}
+
+void DynamicWaysEntry::on_number_enter(const QString &t)
+{
+ int i;
+ QLineEdit *sender_field;
+
+ sender_field = qobject_cast(sender());
+ i = fields.indexOf(sender_field);
+ entries[i] = t;
+
+ if (i == this->fields.size() - 1 && !t.isEmpty() &&
+ (this->parse_valid_way(t) > 0) && fields.size() < 4)
+ add_field();
+
+ // TODO, unlink, don't trash everything after
+ if (t.isEmpty()) {
+ while (this->fields.size() > i + 1) {
+ remove_last_field();
+ }
+ while (entries.size() > fields.size()) {
+ entries.removeLast();
+ }
+ }
+}
+
+void DynamicWaysEntry::add_field()
+{
+ QLineEdit *f;
+
+ f = new QLineEdit(this);
+ f->setPlaceholderText("# ways (a power of 2)");
+
+ this->l->addWidget(f);;
+ this->fields.append(f);
+ this->entries.append(QString());
+ connect(
+ f, &QLineEdit::textChanged, this, &DynamicWaysEntry::on_number_enter);
+}
+
+void DynamicWaysEntry::remove_last_field()
+{
+ QLineEdit *f;
+
+ if (this->fields.isEmpty())
+ return;
+
+ f = this->fields.takeLast();
+ this->l->removeWidget(f);
+ f->deleteLater();
+
+ if (!this->entries.isEmpty())
+ entries.removeLast();
+}
diff --git a/gui/dynamicwaysentry.h b/gui/dynamicwaysentry.h
new file mode 100644
index 0000000..be42696
--- /dev/null
+++ b/gui/dynamicwaysentry.h
@@ -0,0 +1,28 @@
+#include
+#include
+#include
+#include
+#include
+
+class DynamicWaysEntry : public QWidget
+{
+ public:
+ DynamicWaysEntry(QWidget *parent = nullptr);
+ QStringList get_entries() const;
+ /**
+ * Parses a string from this entry field, if it is valid.
+ * @param a string
+ * @param -1 if the string is not suitable as a way, an integer compatible
+ * with the cache constructor otherwise.
+ */
+ int parse_valid_way(QString t);
+ private slots:
+ void on_number_enter(const QString &t);
+
+ private:
+ QVBoxLayout *l;
+ QVector fields;
+ QStringList entries;
+ void add_field();
+ void remove_last_field();
+};
diff --git a/gui/gui.cc b/gui/gui.cc
index 699ab48..0ba4867 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -6,7 +6,8 @@ GUI::GUI(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI)
{
ui->setupUi(this);
- this->status_label = new QLabel(this->make_status(get_waiting), this);
+ this->status_label = new QLabel("", this);
+ this->set_status(get_waiting);
QLabel *risc_vector =
new QLabel("RISC V[ECTOR], CS535 UMASS AMHERST", this);
status_label->setMinimumWidth(1200);
@@ -250,7 +251,7 @@ void GUI::on_upload_intructions_btn_clicked()
"Binary Files (*.bin *.rv);;All Files (*.*)");
QFile file(filePath);
if (filePath.isEmpty() || !file.open(QIODevice::ReadOnly)) {
- this->status_label->setText(this->make_status(get_bad_file));
+ this->set_status(get_bad_file);
return;
}
@@ -267,7 +268,7 @@ void GUI::on_upload_intructions_btn_clicked()
}
}
- this->status_label->setText(this->make_status(get_load_file));
+ this->set_status(get_load_file);
file.close();
}
@@ -283,10 +284,10 @@ void GUI::on_enable_pipeline_checkbox_checkStateChanged(
{
if (arg1 == Qt::CheckState::Checked) {
qDebug() << "enable pipeline checkbox checked.";
- is_pipelined = true;
+ this->is_pipelined = true;
} else {
qDebug() << "enable pipeline checkbox unchecked.";
- is_pipelined = false;
+ this->is_pipelined = false;
}
}
@@ -303,7 +304,7 @@ void GUI::on_save_program_state_btn_clicked()
qDebug() << "save program state button is clicked.";
}
-QString GUI::make_status(const std::function &func)
+void GUI::set_status(const std::function &func)
{
- return "CPU SAYS: \"" + QString::fromStdString(func()) + "\"";
+ this->status_label->setText("CPU SAYS: \"" + QString::fromStdString(func()) + "\"");
}
diff --git a/gui/gui.h b/gui/gui.h
index 85f965a..09fe0d9 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -24,10 +24,18 @@ class GUI : public QMainWindow
Q_OBJECT
public:
+ /**
+ * Constructor.
+ * @return A newly allocated GUI object.
+ */
GUI(QWidget *parent = nullptr);
~GUI();
- bool is_pipelined = false;
- std::vector ways;
+
+ /**
+ * Uses `func' to set the current status.
+ * @param a function which returns a string.
+ */
+ void set_status(const std::function &func);
signals:
void sendRefreshDram();
@@ -82,11 +90,21 @@ class GUI : public QMainWindow
*/
std::vector p;
+ /**
+ * The current cache configurations.
+ */
+ std::vector c;
+
+ /**
+ * If this stage is pipelined or not.
+ */
+ bool is_pipelined = false;
+
QThread workerThread;
Worker *worker;
- QVector step_values = {1, 5, 10, 50, 250, 1000, 10000};
+ QVector step_values = {1, 5, 20, 50, 250, 1000, 10000};
const std::map mnemonicNameMap = {
{Mnemonic::ADD, "ADD"}, {Mnemonic::SUB, "SUB"},
@@ -115,6 +133,5 @@ class GUI : public QMainWindow
return (it != mnemonicNameMap.end()) ? it->second : "Unknown";
}
- QString make_status(const std::function &func);
};
#endif // GUI_H
diff --git a/gui/gui.ui b/gui/gui.ui
index a2cd6cb..a5a51f1 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -133,6 +133,85 @@
+ -
+
+
-
+
+
+ QLayout::SizeConstraint::SetMinimumSize
+
+
-
+
+
+
+ 16777215
+ 16777215
+
+
+
+ C1 2^
+
+
+
+ -
+
+
+
+ 16777215
+ 16777215
+
+
+
+ C2 2^
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 16777215
+ 16777215
+
+
+
+ C3 2^
+
+
+
+ -
+
+
+
+ 16777215
+ 16777215
+
+
+
+ C4 2^
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+
+
-
@@ -142,9 +221,6 @@
-
-
-
-
-
-
-
@@ -533,18 +609,6 @@
-
-
-
-
-
-
- true
-
-
-
- Run
-
-
-
-
@@ -598,19 +662,20 @@
- -
-
-
- GroupBox
-
-
-
+
+
+ DynamicWaysEntry
+ QWidget
+
+ 1
+
+
diff --git a/gui/messages.h b/gui/messages.h
index 84b8318..8f852f7 100644
--- a/gui/messages.h
+++ b/gui/messages.h
@@ -1,7 +1,7 @@
#ifndef MESSAGES_H
#define MESSAGES_H
-#include
#include
+#include
/**
* Humorous computer speak.
@@ -16,7 +16,7 @@ const std::vector load_file = {
"FILE LOADED", "FINISHED READING DATA. EAGERLY WAITING"};
/**
- * @return a random waiting message
+ * @return an unsolicited waiting message
*/
std::string get_waiting() { return RANDOM_MESSAGE(waiting); }
diff --git a/gui/resources/styles.qss b/gui/resources/styles.qss
index 7b5944d..9b63249 100644
--- a/gui/resources/styles.qss
+++ b/gui/resources/styles.qss
@@ -10,6 +10,7 @@ QWidget {
}
QGroupBox {
+ text-decoration: underline "#00cc00";
font-size: 17pt;
background-color: "#000004";
border: 4px solid ;
@@ -29,7 +30,7 @@ QLabel {
/* text entry */
QLineEdit {
- font-size: 15pt;
+ font-size: 18pt;
border-radius: 0px;
padding: 0 4px;
selection-background-color: "#00cc00";
--
cgit v1.2.3
From 327ba8b631436cf21866c05c6c7cae239fe54a5c Mon Sep 17 00:00:00 2001
From: bd
Date: Sat, 19 Apr 2025 02:45:38 -0400
Subject: Small UI cleanups
---
gui/gui.cc | 9 ++--
gui/gui.ui | 127 ++++++++++++++++++++++++++++++++++++---------------------
gui/messages.h | 13 +++---
3 files changed, 94 insertions(+), 55 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index 0ba4867..a36920b 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -251,7 +251,7 @@ void GUI::on_upload_intructions_btn_clicked()
"Binary Files (*.bin *.rv);;All Files (*.*)");
QFile file(filePath);
if (filePath.isEmpty() || !file.open(QIODevice::ReadOnly)) {
- this->set_status(get_bad_file);
+ this->set_status(get_no_instructions);
return;
}
@@ -268,7 +268,10 @@ void GUI::on_upload_intructions_btn_clicked()
}
}
- this->set_status(get_load_file);
+ if (this->p.empty())
+ this->set_status(get_no_instructions);
+ else
+ this->set_status(get_load_file);
file.close();
}
@@ -306,5 +309,5 @@ void GUI::on_save_program_state_btn_clicked()
void GUI::set_status(const std::function &func)
{
- this->status_label->setText("CPU SAYS: \"" + QString::fromStdString(func()) + "\"");
+ this->status_label->setText("COMPUTER SAYS: \"" + QString::fromStdString(func()) + "\"");
}
diff --git a/gui/gui.ui b/gui/gui.ui
index a5a51f1..b9ad041 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -135,6 +135,16 @@
-
+
+ QLayout::SizeConstraint::SetMinimumSize
+
+
-
+
+
+ Qt::Orientation::Vertical
+
+
+
-
@@ -306,6 +316,20 @@
+ -
+
+
+ Qt::Orientation::Horizontal
+
+
+
+ -
+
+
+ Initialize!
+
+
+
-
@@ -326,36 +350,6 @@
- -
-
-
-
-
-
-
- true
-
-
-
- Program State
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
- Clock Cycles
-
-
-
-
-
-
@@ -610,25 +604,66 @@
-
-
-
-
- 0
-
-
- 6
-
-
- 1
-
+
+
-
+
+
+ 0
+
+
+ 6
+
+
+ 1
+
+
+ Qt::Orientation::Horizontal
+
+
+ QSlider::TickPosition::NoTicks
+
+
+ 1
+
+
+
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
+ -
+
+
-
+
+
+
+ true
+
+
+
+ Program State
+
+
+
+ -
+
+
+ Clock Cycles
+
+
+
+
+
+
+
+ -
+
Qt::Orientation::Horizontal
-
- QSlider::TickPosition::NoTicks
-
-
- 1
-
-
diff --git a/gui/messages.h b/gui/messages.h
index 8f852f7..2af8e6b 100644
--- a/gui/messages.h
+++ b/gui/messages.h
@@ -10,10 +10,11 @@
const std::vector waiting = {
"WAITING FOR USER", "FRIENDS MISSING", "BORED", "SLEEPING"};
-const std::vector bad_file = {
- "BAD FILE", "TRY AGAIN", "SEEKING NEW READING MATERIAL"};
const std::vector load_file = {
"FILE LOADED", "FINISHED READING DATA. EAGERLY WAITING"};
+const std::vector no_instructions = {
+ "NO PROGRAM PROVIDED", "RISC V[ECTOR]: INSTRUCTIONS NOT INCLUDED",
+ "NOTHING TO DO, GIVING UP"};
/**
* @return an unsolicited waiting message
@@ -21,13 +22,13 @@ const std::vector load_file = {
std::string get_waiting() { return RANDOM_MESSAGE(waiting); }
/**
- * @return a complaint about a bad file name
+ * @return confirmation of file upload
*/
-std::string get_bad_file() { return RANDOM_MESSAGE(bad_file); }
+std::string get_load_file() { return RANDOM_MESSAGE(load_file); }
/**
- * @return confirmation of file upload
+ * @return a friendly reminder that the simulation is not configured yet
*/
-std::string get_load_file() { return RANDOM_MESSAGE(load_file); }
+std::string get_no_instructions() { return RANDOM_MESSAGE(no_instructions); }
#endif // MESSAGES_H
--
cgit v1.2.3
From 5ad39ec769fa09b9ac4dcc8f66232ef51384a3c6 Mon Sep 17 00:00:00 2001
From: bd
Date: Sat, 19 Apr 2025 12:18:14 -0400
Subject: Safely delete old controller object when re-initializing
---
gui/gui.cc | 25 +++++--------
gui/gui.h | 5 +--
gui/gui.ui | 93 ++++++++++++++++++++----------------------------
gui/messages.h | 12 +++++--
gui/resources/styles.qss | 9 +++--
gui/worker.cc | 42 +++++++++-------------
gui/worker.h | 10 +++---
7 files changed, 84 insertions(+), 112 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.cc b/gui/gui.cc
index dc77fc9..6cb9ada 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -18,9 +18,6 @@ GUI::GUI(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI)
worker = new Worker();
worker->moveToThread(&workerThread);
- // Connect worker thread lifecycle
- // connect(&workerThread, &QThread::started, worker, &Worker::doWork);
-
// display clock cycles and PC
connect(worker, &Worker::clock_cycles, this, &GUI::onWorkerClockCycles);
@@ -49,19 +46,6 @@ GUI::GUI(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI)
this, &GUI::sendConfigure, worker, &Worker::configure,
Qt::QueuedConnection);
- // // Refresh DRAM from worker thread
- // connect(this, &GUI::sendRefreshDram, worker, &Worker::refreshDram,
- // Qt::QueuedConnection);
-
- // // Refresh Cache from worker thread
- // connect(this, &GUI::sendRefreshCache, worker, &Worker::refreshCache,
- // Qt::QueuedConnection);
-
- // Refresh Registers from worker thread
- connect(
- this, &GUI::sendRefreshRegisters, worker, &Worker::refreshRegisters,
- Qt::QueuedConnection);
-
// Advance controller by some steps
connect(
this, &GUI::sendRunSteps, worker, &Worker::runSteps,
@@ -303,10 +287,17 @@ void GUI::on_enable_pipeline_checkbox_checkStateChanged(
void GUI::on_step_btn_clicked()
{
qDebug() << "Run step button clicked.";
+ // try to configure first
+ if (!this->ready)
+ this->on_config_clicked();
+ // try again
if (!this->ready)
- return this->on_config_clicked();
+ return;
+
+ this->set_status(get_running);
int steps = step_values[ui->step_slider->value()];
emit sendRunSteps(steps);
+ this->set_status(get_waiting);
}
void GUI::on_save_program_state_btn_clicked()
diff --git a/gui/gui.h b/gui/gui.h
index cbd482b..4c47874 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -38,9 +38,6 @@ class GUI : public QMainWindow
void set_status(const std::function &func);
signals:
- void sendRefreshDram();
- void sendRefreshCache();
- void sendRefreshRegisters();
void sendRunSteps(int steps);
void sendConfigure(
std::vector ways,
@@ -110,7 +107,7 @@ class GUI : public QMainWindow
/**
* If this stage is pipelined or not.
*/
- bool is_pipelined = false;
+ bool is_pipelined = true;
/**
* The possible step slider values.
diff --git a/gui/gui.ui b/gui/gui.ui
index b9ad041..acd9c53 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -604,60 +604,23 @@
-
-
-
-
-
-
-
- 0
-
-
- 6
-
-
- 1
-
-
- Qt::Orientation::Horizontal
-
-
- QSlider::TickPosition::NoTicks
-
-
- 1
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- -
-
-
-
-
-
-
- true
-
-
-
- Program State
-
-
-
- -
-
-
- Clock Cycles
-
-
-
-
-
-
+
+
+
+ true
+
+
+
+ Program State
+
+
+
+ -
+
+
+ Clock Cycles
+
+
-
@@ -666,6 +629,28 @@
+ -
+
+
+ 0
+
+
+ 6
+
+
+ 1
+
+
+ Qt::Orientation::Horizontal
+
+
+ QSlider::TickPosition::NoTicks
+
+
+ 1
+
+
+
-
diff --git a/gui/messages.h b/gui/messages.h
index c2a86b9..2b31037 100644
--- a/gui/messages.h
+++ b/gui/messages.h
@@ -9,14 +9,19 @@
#define RANDOM_MESSAGE(v) (v[std::rand() % v.size()])
const std::vector waiting = {
- "WAITING FOR USER", "FRIENDS MISSING", "BORED", "SLEEPING"};
+ "WAITING FOR USER", "BORED", "SLEEPING", "TIRED", "IDLE", "EXCITED"};
+const std::vector running = {
+ "CALCULATING", "COMPUTING",
+ "EXTERMINATE"
+ "WORKING",
+ "BUSY"};
const std::vector load_file = {
"FILE LOADED", "FINISHED READING DATA. EAGERLY WAITING"};
const std::vector no_instructions = {
"NO PROGRAM PROVIDED", "INSTRUCTIONS NOT INCLUDED",
"NOTHING TO DO, GIVING UP"};
const std::vector bad_cache = {
- "INVALID NUMBER OF WAYS", "WAYS CANNOT BE BELOW 0 OR ABOVE 5"};
+ "WAYS CANNOT BE BELOW 0 OR ABOVE 5"};
const std::vector no_pipeline = {
"PIPELINE--HUMANS PROBABLY WORKED HARD ON THAT",
"I WOULD PREFER YOU LEAVE THE PIPE ON", "SLOW MODE ENABLED",
@@ -26,9 +31,10 @@ const std::vector no_cache = {
const std::vector initialize = {"SIMULATION READY"};
/**
- * @return an unsolicited waiting message
+ * @return an unsolicited status messages
*/
std::string get_waiting() { return RANDOM_MESSAGE(waiting); }
+std::string get_running() { return RANDOM_MESSAGE(running); }
/**
* @return confirmation of file upload
diff --git a/gui/resources/styles.qss b/gui/resources/styles.qss
index 9b63249..59d36ca 100644
--- a/gui/resources/styles.qss
+++ b/gui/resources/styles.qss
@@ -2,7 +2,8 @@
font-family: "BigBlueTermPlusNerdFontMono", "monospace";
font-size: 20pt;
color: "#00cc00";
- background-color: "#000004";
+ background-color: "#000200";
+ border: 0px solid "#000200";
}
/* main window */
@@ -12,7 +13,6 @@ QWidget {
QGroupBox {
text-decoration: underline "#00cc00";
font-size: 17pt;
- background-color: "#000004";
border: 4px solid ;
border-radius: 0px;
margin-top: 1ex; /* leave space at the top for the title */
@@ -38,11 +38,10 @@ QLineEdit {
QTextEdit, QListView {
font-size: 10pt;
- background-color: "#000004";
}
QPushButton {
- color: "#000004";
+ color: "#000200";
background-color: "#00cc00";
border-radius: 0px;
padding: 1px;
@@ -51,7 +50,7 @@ QPushButton {
QPushButton:pressed {
color: "#00cc00";
- background-color: "#000004";
+ background-color: "#000200";
}
QPushButton:flat {
diff --git a/gui/worker.cc b/gui/worker.cc
index cd79821..88248e8 100644
--- a/gui/worker.cc
+++ b/gui/worker.cc
@@ -18,21 +18,23 @@ void Worker::configure(
{
Dram *d;
Storage *s;
+ Stage *old;
int i;
+ this->ct_mutex.lock();
if (ways.size() != 0) {
// will ensure the largest cache is only half of DRAM
this->size_inc = (MEM_LINE_SPEC / ways.size()) / 2;
}
d = new Dram(DRAM_DELAY);
- s = (Storage *)d;
+ s = static_cast(d);
this->s.push_front(s);
d->load(program);
for (i = ways.size(); i > 0; --i) {
- s = (Storage *)new Cache(
- s, this->size_inc * (i), ways.at(i - 1), CACHE_DELAY + i);
+ s = static_cast(new Cache(
+ s, this->size_inc * (i), ways.at(i - 1), CACHE_DELAY + i));
this->s.push_front(s);
}
@@ -41,37 +43,26 @@ void Worker::configure(
this->ex_stage = new EX(id_stage);
this->mm_stage = new MM(ex_stage);
this->wb_stage = new WB(mm_stage);
- this->ct =
- new Controller(wb_stage, s, is_pipelined);
- emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
-}
-
-void Worker::refreshDram()
-{
- qDebug() << "Refreshing Dram";
- emit dram_storage(this->s.back()->view(0, 255));
-}
-
-void Worker::refreshCache()
-{
- qDebug() << "Refreshing Cache";
- if(this->s.size() > 0) {
- emit cache_storage(this->s.at(0)->view(0, 1 << this->size_inc));
- }
-}
+ old = static_cast(this->ct);
+ this->ct = new Controller(wb_stage, s, is_pipelined);
+ if (old)
+ delete old;
+ this->ct_mutex.unlock();
-void Worker::refreshRegisters()
-{
- qDebug() << "Refreshing Registers";
- emit register_storage(this->ct->get_gprs());
+ emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
}
void Worker::runSteps(int steps)
{
+ this->ct_mutex.lock();
qDebug() << "Running for " << steps << "steps";
this->ct->run_for(steps);
+ // TODO move these to separate functions
emit dram_storage(this->s.back()->view(0, 255));
+ if (this->s.size() > 1) {
+ emit cache_storage(this->s.at(0)->view(0, 1 << this->size_inc));
+ }
emit register_storage(this->ct->get_gprs());
emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
emit if_info(this->if_stage->stage_info());
@@ -79,4 +70,5 @@ void Worker::runSteps(int steps)
emit ex_info(this->ex_stage->stage_info());
emit mm_info(this->mm_stage->stage_info());
emit wb_info(this->wb_stage->stage_info());
+ this->ct_mutex.unlock();
}
diff --git a/gui/worker.h b/gui/worker.h
index acfffcf..20a9838 100644
--- a/gui/worker.h
+++ b/gui/worker.h
@@ -12,6 +12,7 @@
#include
#include
#include
+#include
#include
class Worker : public QObject
@@ -28,7 +29,10 @@ class Worker : public QObject
EX *ex_stage;
MM *mm_stage;
WB *wb_stage;
- Controller *ct;
+
+ Controller *ct = nullptr;
+ QMutex ct_mutex;
+
/**
* The size each progressive cache level increases by.
*/
@@ -37,11 +41,9 @@ class Worker : public QObject
public:
explicit Worker(QObject *parent = nullptr);
~Worker();
+ QMutex& get_ct_mutex() { return ct_mutex; }
public slots:
- void refreshDram();
- void refreshCache();
- void refreshRegisters();
void runSteps(int steps);
void configure(
std::vector ways,
--
cgit v1.2.3
From c375eba808841797a7339afcfe9c4426da53de75 Mon Sep 17 00:00:00 2001
From: bd
Date: Sat, 19 Apr 2025 13:02:26 -0400
Subject: Fix some spacing issues
---
gui/gui.ui | 28 +++++++++++++++++++++-------
1 file changed, 21 insertions(+), 7 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.ui b/gui/gui.ui
index acd9c53..d442c8a 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -76,7 +76,14 @@
-
-
+
+
+
+ 500
+ 0
+
+
+
@@ -109,7 +116,14 @@
-
-
+
+
+
+ 500
+ 0
+
+
+
@@ -358,7 +372,7 @@
- 150
+ 200
0
@@ -397,7 +411,7 @@
- 150
+ 200
0
@@ -436,7 +450,7 @@
- 150
+ 200
0
@@ -499,7 +513,7 @@
- 150
+ 200
0
@@ -559,7 +573,7 @@
- 150
+ 200
0
--
cgit v1.2.3
From 2b5ca09c90c5e091c094e9ed8f02079674b8aeda Mon Sep 17 00:00:00 2001
From: bd
Date: Sat, 19 Apr 2025 15:14:56 -0400
Subject: Add new widget to display number in base 10 and 16
---
gui/digitlabel.cc | 39 +++++++++++++++++++++++
gui/digitlabel.h | 52 ++++++++++++++++++++++++++++++
gui/gui.cc | 36 +++++++++------------
gui/gui.h | 2 +-
gui/gui.ui | 95 +++++++++++++++++++++++++++++++++++++++----------------
gui/worker.cc | 1 +
6 files changed, 176 insertions(+), 49 deletions(-)
create mode 100644 gui/digitlabel.cc
create mode 100644 gui/digitlabel.h
(limited to 'gui/gui.ui')
diff --git a/gui/digitlabel.cc b/gui/digitlabel.cc
new file mode 100644
index 0000000..a5c84f1
--- /dev/null
+++ b/gui/digitlabel.cc
@@ -0,0 +1,39 @@
+#include "digitlabel.h"
+
+DigitLabel::DigitLabel(QWidget *parent) : QLabel(parent)
+{
+ this->update_display();
+}
+
+void DigitLabel::clear()
+{
+ this->is_cleared = true;
+ setText(QString());
+}
+
+void DigitLabel::set_value(int v)
+{
+ this->is_cleared = false;
+ if (this->v != v) {
+ this->v = v;
+ update_display();
+ }
+}
+
+void DigitLabel::toggle_mode()
+{
+ this->is_hex = !this->is_hex;
+ this->update_display();
+}
+
+void DigitLabel::update_display()
+{
+ QString t;
+ if (this->is_cleared) {
+ setText(QString());
+ } else {
+ t = (this->is_hex) ? QString::number(this->v, 6).toUpper()
+ : QString::number(this->v);
+ setText(t);
+ }
+}
diff --git a/gui/digitlabel.h b/gui/digitlabel.h
new file mode 100644
index 0000000..9106cc9
--- /dev/null
+++ b/gui/digitlabel.h
@@ -0,0 +1,52 @@
+#ifndef DIGITLABEL_H
+#define DIGITLABEL_H
+
+#include
+
+class DigitLabel : public QLabel
+{
+ Q_OBJECT
+
+ public:
+ /**
+ * Constructor.
+ * @return a newly allocated DigitLabel.
+ */
+ explicit DigitLabel(QWidget *parent = nullptr);
+
+ /**
+ * Sets the empty flag.
+ */
+ void clear();
+ /**
+ * @param the value to set `this->v' with.
+ */
+ void set_value(int v);
+
+ public slots:
+ /**
+ * Toggles the base this label displays in, by setting `this->is_hex'.
+ */
+ void toggle_mode();
+
+ private:
+ /**
+ * Refreshes the display of this label, taking base into consideration..
+ */
+ void update_display();
+
+ /**
+ * The decimal value associated with this label.
+ */
+ int v = 0;
+ /**
+ * To display in hexidecimal or not.
+ */
+ bool is_hex = true;
+ /**
+ * To display in hexidecimal or not.
+ */
+ bool is_cleared = true;
+};
+
+#endif // DIGITLABEL_H
diff --git a/gui/gui.cc b/gui/gui.cc
index 6cb9ada..94ddd0e 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -19,7 +19,7 @@ GUI::GUI(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI)
worker->moveToThread(&workerThread);
// display clock cycles and PC
- connect(worker, &Worker::clock_cycles, this, &GUI::onWorkerClockCycles);
+ connect(worker, &Worker::clock_cycles, this, &GUI::on_worker_refresh_gui);
connect(worker, &Worker::if_info, this, &GUI::onWorkerFetchInfo);
@@ -129,23 +129,17 @@ void displayTableHTML(
textEdit->setReadOnly(true);
}
-void GUI::onWorkerClockCycles(int cycles, int pc)
+void GUI::on_worker_refresh_gui(int cycles, int pc)
{
- QFont font = ui->cycles_label->font();
- font.setBold(true);
- font.setItalic(true);
- font.setPointSize(14);
- ui->cycles_label->setFont(font);
- ui->cycles_label->setText(
- "Clock Cycles: " + QString::number(cycles) + "\t\t" +
- "PC: " + QString::number(pc));
+ ui->p_counter->set_value(pc);
+ ui->cycle_counter->set_value(cycles);
}
void GUI::onWorkerFetchInfo(const std::vector info)
{
if (!info.empty()) {
ui->fetch_squashed->setText(QString::number(info[0]));
- ui->fetch_bits->setText(QString::asprintf("%04X", info[1]));
+ ui->fetch_bits->set_value(info[1]);
} else {
ui->fetch_squashed->clear();
ui->fetch_bits->clear();
@@ -156,7 +150,7 @@ void GUI::onWorkerDecodeInfo(const std::vector info)
{
if (!info.empty()) {
ui->decode_squashed->setText(QString::number(info[0]));
- ui->decode_bits->setText(QString::asprintf("%04X", info[1]));
+ ui->decode_bits->set_value(info[1]);
} else {
ui->decode_squashed->clear();
ui->decode_bits->clear();
@@ -168,9 +162,9 @@ void GUI::onWorkerExecuteInfo(const std::vector info)
if (!info.empty()) {
ui->execute_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
ui->execute_squashed->setText(QString::number(info[1]));
- ui->execute_s1->setText(QString::asprintf("%04X", info[2]));
- ui->execute_s2->setText(QString::asprintf("%04X", info[3]));
- ui->execute_s3->setText(QString::asprintf("%04X", info[4]));
+ ui->execute_s1->set_value(info[2]);
+ ui->execute_s2->set_value(info[3]);
+ ui->execute_s3->set_value(info[4]);
} else {
ui->execute_mnemonic->clear();
ui->execute_squashed->clear();
@@ -185,9 +179,9 @@ void GUI::onWorkerMemoryInfo(const std::vector info)
if (!info.empty()) {
ui->memory_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
ui->memory_squashed->setText(QString::number(info[1]));
- ui->memory_s1->setText(QString::asprintf("%04X", info[2]));
- ui->memory_s2->setText(QString::asprintf("%04X", info[3]));
- ui->memory_s3->setText(QString::asprintf("%04X", info[4]));
+ ui->memory_s1->set_value(info[2]);
+ ui->memory_s2->set_value(info[3]);
+ ui->memory_s3->set_value(info[4]);
} else {
ui->memory_mnemonic->clear();
ui->memory_squashed->clear();
@@ -201,9 +195,9 @@ void GUI::onWorkerWriteBackInfo(const std::vector info)
{
if (!info.empty()) {
ui->write_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
- ui->write_s1->setText(QString::asprintf("%04X", info[2]));
- ui->write_s2->setText(QString::asprintf("%04X", info[3]));
- ui->write_s3->setText(QString::asprintf("%04X", info[4]));
+ ui->write_s1->set_value(info[2]);
+ ui->write_s2->set_value(info[3]);
+ ui->write_s3->set_value(info[4]);
} else {
ui->write_mnemonic->clear();
ui->write_s1->clear();
diff --git a/gui/gui.h b/gui/gui.h
index 4c47874..b7016ab 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -45,7 +45,7 @@ class GUI : public QMainWindow
bool is_pipelined);
private slots:
- void onWorkerClockCycles(int value, int pc);
+ void on_worker_refresh_gui(int value, int pc);
void onWorkerFetchInfo(const std::vector info);
diff --git a/gui/gui.ui b/gui/gui.ui
index d442c8a..2447a93 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -384,7 +384,7 @@
-
-
+
@@ -423,7 +423,7 @@
-
-
+
@@ -462,21 +462,21 @@
-
-
+
-
-
+
-
-
+
@@ -525,21 +525,21 @@
-
-
+
-
-
+
-
-
+
@@ -585,21 +585,21 @@
-
-
+
-
-
+
-
-
+
@@ -618,23 +618,59 @@
-
-
-
-
-
- true
-
-
-
- Program State
-
-
+
+
-
+
+
+
+ true
+
+
+
+ State
+
+
+
+ -
+
+
+ Decimal
+
+
+
+
-
-
-
- Clock Cycles
-
-
+
+
-
+
+
+ PC
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+ Cycle
+
+
+
+ -
+
+
+
+
+
+
+
-
@@ -706,9 +742,14 @@
DynamicWaysEntry
QWidget
-
+
1
+
+ DigitLabel
+ QLabel
+
+
diff --git a/gui/worker.cc b/gui/worker.cc
index 742e3f3..43db5bd 100644
--- a/gui/worker.cc
+++ b/gui/worker.cc
@@ -50,6 +50,7 @@ void Worker::configure(
delete old;
this->ct_mutex.unlock();
+ std::cout << this->ct->get_clock_cycle() << ":" << this->ct->get_pc() << std::endl;
emit clock_cycles(this->ct->get_clock_cycle(), this->ct->get_pc());
}
--
cgit v1.2.3
From 89763e6f696a96ad310f031c66960bcaaba3ffdb Mon Sep 17 00:00:00 2001
From: bd
Date: Mon, 21 Apr 2025 14:32:41 -0400
Subject: Restructure GUI layout
---
gui/gui.ui | 936 +++++++++++++++++++++++++++----------------------------------
1 file changed, 414 insertions(+), 522 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/gui.ui b/gui/gui.ui
index 2447a93..f205b96 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -6,7 +6,7 @@
0
0
- 1359
+ 1499
621
@@ -16,125 +16,313 @@
-
-
-
-
-
+
+
-
+
-
-
+
-
-
-
-
- true
-
-
-
- Registers
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
+
+
-
+
+
-
+
+
+
+ true
+
+
+
+ Registers
+
+
+
+ -
+
+
+
+
+ -
+
+
-
+
+
+
+ true
+
+
+
+ DRAM
+
+
+
+ -
+
+
+
+ 500
+ 0
+
+
+
+
+
+
+ -
+
+
-
+
+
+
+ true
+
+
+
+ Cache
+
+
+
+ -
+
+
+
+ 500
+ 0
+
+
+
+
+
+
+
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
+
-
-
-
-
- true
-
+
+
+
+ 200
+ 0
+
-
- Cache
+
+ Fetch
-
-
- -
-
-
- Qt::Orientation::Horizontal
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
+
-
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
-
-
+
- 500
+ 200
0
+
+ Decode
+
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
+
+
-
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- -
-
-
-
-
-
- true
-
+
+
+
+ 200
+ 0
+
+
+
+ Execute
-
- DRAM
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
+
-
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+ Qt::TextFormat::MarkdownText
+
+
+
+
-
-
-
- Qt::Orientation::Horizontal
+
+
+
+ 200
+ 0
+
+
+
+ Memory
+
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
+
-
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
-
-
+
- 500
+ 200
0
+
+ Write Back
+
+
+ Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
+
+
+
-
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+ -
+
+
+
+
+
+
+
-
-
- -
-
-
-
+
-
@@ -148,7 +336,7 @@
-
-
+
QLayout::SizeConstraint::SetMinimumSize
@@ -160,7 +348,7 @@
-
-
+
QLayout::SizeConstraint::SetMinimumSize
@@ -237,117 +425,194 @@
-
-
-
- Qt::Orientation::Horizontal
+
+
+ Enable Pipeline
-
-
- -
-
-
-
-
-
-
-
-
- Enable Pipeline
-
-
- true
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
- Qt::Orientation::Horizontal
+
+ true
-
-
+
Qt::Orientation::Horizontal
-
-
+
-
-
+
-
-
-
-
- true
-
-
-
- Upload Files
-
-
+
+
-
+
+
+
+ true
+
+
+
+ Upload Files
+
+
+
+ -
+
+
-
+
+
+ Load Instructions
+
+
+
+ -
+
+
+ Upload Program State
+
+
+
+ -
+
+
+ Save Program State
+
+
+
+ -
+
+
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+ -
+
+
+ Initialize!
+
+
+
+ -
+
+
+ Qt::Orientation::Vertical
+
+
+
+ 20
+ 40
+
+
+
+
+
+
+
+ -
+
-
-
-
- Qt::Orientation::Horizontal
-
-
+
+
-
+
+
+
+ true
+
+
+
+ State
+
+
+
+ -
+
+
+ Decimal
+
+
+
+
-
-
+
-
-
+
- Load Instructions
+ PC
-
-
+
- Upload Program State
+
-
-
+
- Save Program State
+ Cycle
-
-
+
+
+
+
+
-
-
+
+
+ 0
+
+
+ 6
+
+
+ 1
+
Qt::Orientation::Horizontal
-
-
- -
-
-
- Initialize!
+
+ QSlider::TickPosition::NoTicks
+
+
+ 1
-
-
-
- Qt::Orientation::Horizontal
+
+
+
+ 400
+ 0
+
+
+
+ Step 1
@@ -357,381 +622,8 @@
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
-
-
-
-
- 200
- 0
-
-
-
- Fetch
-
-
- Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- -
-
-
-
- 200
- 0
-
-
-
- Decode
-
-
- Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- -
-
-
-
- 200
- 0
-
-
-
- Execute
-
-
- Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
- Qt::TextFormat::MarkdownText
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- -
-
-
-
- 200
- 0
-
-
-
- Memory
-
-
- Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
- -
-
-
-
- 200
- 0
-
-
-
- Write Back
-
-
- Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
- true
-
-
-
- State
-
-
-
- -
-
-
- Decimal
-
-
-
-
-
- -
-
-
-
-
-
- PC
-
-
-
- -
-
-
-
-
-
-
- -
-
-
- Cycle
-
-
-
- -
-
-
-
-
-
-
-
-
- -
-
-
- Qt::Orientation::Horizontal
-
-
-
- -
-
-
- 0
-
-
- 6
-
-
- 1
-
-
- Qt::Orientation::Horizontal
-
-
- QSlider::TickPosition::NoTicks
-
-
- 1
-
-
-
- -
-
-
-
- 400
- 0
-
-
-
- Step 1
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
-
-
- -
-
-
- Qt::Orientation::Vertical
-
-
-
--
cgit v1.2.3
From 40dfec9ae067d3f8e3868d259bfc4251aeca8724 Mon Sep 17 00:00:00 2001
From: bd
Date: Mon, 21 Apr 2025 15:56:38 -0400
Subject: Add functionality to toggle button.
---
gui/digitlabel.cc | 20 ++++++++------------
gui/digitlabel.h | 12 ++++++------
gui/gui.cc | 22 +++++++++++++++-------
gui/gui.h | 9 +++++++++
gui/gui.ui | 5 ++++-
5 files changed, 42 insertions(+), 26 deletions(-)
(limited to 'gui/gui.ui')
diff --git a/gui/digitlabel.cc b/gui/digitlabel.cc
index ffecfff..8314943 100644
--- a/gui/digitlabel.cc
+++ b/gui/digitlabel.cc
@@ -16,11 +16,9 @@
// along with this program. If not, see .
#include "digitlabel.h"
+#include "gui.h"
-DigitLabel::DigitLabel(QWidget *parent) : QLabel(parent)
-{
- this->update_display();
-}
+DigitLabel::DigitLabel(QWidget *parent) : QLabel(parent) { setText(QString()); }
void DigitLabel::clear()
{
@@ -31,16 +29,14 @@ void DigitLabel::clear()
void DigitLabel::set_value(int v)
{
this->is_cleared = false;
- if (this->v != v) {
- this->v = v;
- update_display();
- }
+ this->v = v;
+ update_display();
}
-void DigitLabel::toggle_mode()
+void DigitLabel::on_hex_toggle(bool is_hex)
{
- this->is_hex = !this->is_hex;
- this->update_display();
+ this->is_hex = is_hex;
+ update_display();
}
void DigitLabel::update_display()
@@ -49,7 +45,7 @@ void DigitLabel::update_display()
if (this->is_cleared) {
setText(QString());
} else {
- t = (this->is_hex) ? QString::number(this->v, 6).toUpper()
+ t = (this->is_hex) ? QString::number(this->v, 16).toUpper()
: QString::number(this->v);
setText(t);
}
diff --git a/gui/digitlabel.h b/gui/digitlabel.h
index 2916426..68b01cb 100644
--- a/gui/digitlabel.h
+++ b/gui/digitlabel.h
@@ -29,7 +29,7 @@ class DigitLabel : public QLabel
* Constructor.
* @return a newly allocated DigitLabel.
*/
- explicit DigitLabel(QWidget *parent = nullptr);
+ explicit DigitLabel(QWidget *parent);
/**
* Sets the empty flag.
@@ -44,7 +44,7 @@ class DigitLabel : public QLabel
/**
* Toggles the base this label displays in, by setting `this->is_hex'.
*/
- void toggle_mode();
+ void on_hex_toggle(bool is_hex);
private:
/**
@@ -55,13 +55,13 @@ class DigitLabel : public QLabel
/**
* The decimal value associated with this label.
*/
- int v = 0;
+ int v;
/**
- * To display in hexidecimal or not.
+ * If this digit should display in hexidecinmal.
*/
- bool is_hex = true;
+ int is_hex;
/**
- * To display in hexidecimal or not.
+ * If this digit should not display.
*/
bool is_cleared = true;
};
diff --git a/gui/gui.cc b/gui/gui.cc
index 2744a06..294a7d0 100644
--- a/gui/gui.cc
+++ b/gui/gui.cc
@@ -48,6 +48,13 @@ GUI::GUI(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI)
worker = new Worker();
worker->moveToThread(&workerThread);
+ // find all the labels
+ QList labels = this->findChildren();
+ for (DigitLabel* label : labels) {
+ connect(this, &GUI::hex_toggled, label, &DigitLabel::on_hex_toggle);
+ }
+ emit this->hex_toggled(this->is_hex);
+
// display clock cycles and PC
connect(worker, &Worker::clock_cycles, this, &GUI::on_worker_refresh_gui);
@@ -207,6 +214,7 @@ void GUI::onWorkerExecuteInfo(const std::vector info)
void GUI::onWorkerMemoryInfo(const std::vector info)
{
if (!info.empty()) {
+ std::cout << "this " << info[3] << std::endl;
ui->memory_mnemonic->setText(mnemonicToString((Mnemonic)info[0]));
ui->memory_squashed->setText(QString::number(info[1]));
ui->memory_s1->set_value(info[2]);
@@ -299,13 +307,13 @@ void GUI::on_upload_program_state_btn_clicked()
void GUI::on_enable_pipeline_checkbox_checkStateChanged(
const Qt::CheckState &arg1)
{
- if (arg1 == Qt::CheckState::Checked) {
- qDebug() << "enable pipeline checkbox checked.";
- this->is_pipelined = true;
- } else {
- qDebug() << "enable pipeline checkbox unchecked.";
- this->is_pipelined = false;
- }
+ this->is_pipelined = (arg1 == Qt::CheckState::Checked) ? true : false;
+}
+
+void GUI::on_base_toggle_checkbox_checkStateChanged(const Qt::CheckState &state)
+{
+ this->is_hex = (state == Qt::CheckState::Checked) ? false : true;
+ emit this->hex_toggled(this->is_hex);
}
void GUI::on_step_btn_clicked()
diff --git a/gui/gui.h b/gui/gui.h
index 7efde1f..0b10145 100644
--- a/gui/gui.h
+++ b/gui/gui.h
@@ -58,6 +58,7 @@ class GUI : public QMainWindow
const QString &img = "idle.png");
signals:
+ void hex_toggled(bool is_hex);
void sendRunSteps(int steps);
void sendConfigure(
std::vector ways, vector program, bool is_pipelined);
@@ -92,6 +93,9 @@ class GUI : public QMainWindow
void
on_enable_pipeline_checkbox_checkStateChanged(const Qt::CheckState &arg1);
+ void
+ on_base_toggle_checkbox_checkStateChanged(const Qt::CheckState &state);
+
void on_step_btn_clicked();
void on_save_program_state_btn_clicked();
@@ -112,6 +116,11 @@ class GUI : public QMainWindow
*/
bool ready;
+ /**
+ * Whether or not numerical values are currently displaying in hex.
+ */
+ bool is_hex = true;
+
/**
* The message displayed on the status bar.
*/
diff --git a/gui/gui.ui b/gui/gui.ui
index f205b96..dbb3a33 100644
--- a/gui/gui.ui
+++ b/gui/gui.ui
@@ -541,7 +541,10 @@
-
-
+
+
+ true
+
Decimal
--
cgit v1.2.3