From c00703033380d68eeff47c40a9c7dc5f8cd7fb1f Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 13:06:44 -0400 Subject: Report status correctly when steps have finished running --- gui/gui.cc | 5 ++++- gui/gui.h | 2 ++ gui/worker.cc | 1 + gui/worker.h | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) (limited to 'gui') diff --git a/gui/gui.cc b/gui/gui.cc index b4feda6..28876ba 100644 --- a/gui/gui.cc +++ b/gui/gui.cc @@ -72,6 +72,8 @@ GUI::GUI(QWidget *parent) : QMainWindow(parent), ui(new Ui::GUI) connect(worker, &Worker::wb_info, this, &GUI::onWorkerWriteBackInfo); + connect(worker, &Worker::steps_done, this, &GUI::onWorkerStepsDone); + // Display cache connect(worker, &Worker::storage, this, &GUI::onWorkerShowStorage); @@ -139,7 +141,6 @@ void GUI::on_worker_refresh_gui(int cycles, int pc) { ui->p_counter->set_value(pc); ui->cycle_counter->set_value(cycles); - this->set_status(get_waiting, "idle"); } void GUI::onWorkerFetchInfo(const InstrDTO *i) @@ -215,6 +216,8 @@ void GUI::onWorkerWriteBackInfo(const InstrDTO *i) } } +void GUI::onWorkerStepsDone() { this->set_status(get_waiting, "idle"); } + void GUI::onWorkerShowStorage(const QVector> &data, int i) { this->tab_boxes.at(i)->set_data(data); diff --git a/gui/gui.h b/gui/gui.h index 830d852..8e0b5b4 100644 --- a/gui/gui.h +++ b/gui/gui.h @@ -68,6 +68,8 @@ class GUI : public QMainWindow void onWorkerWriteBackInfo(const InstrDTO *); + void onWorkerStepsDone(); + void onWorkerShowStorage(const QVector> &data, int i); void onWorkerShowRegisters(const std::array &data); diff --git a/gui/worker.cc b/gui/worker.cc index 0ba364b..dd7b637 100644 --- a/gui/worker.cc +++ b/gui/worker.cc @@ -72,6 +72,7 @@ void Worker::runSteps(int steps) { this->ct->run_for(steps); this->update(); + emit steps_done(); } void Worker::update() diff --git a/gui/worker.h b/gui/worker.h index c62f4ed..5ffb6ef 100644 --- a/gui/worker.h +++ b/gui/worker.h @@ -72,6 +72,7 @@ class Worker : public QObject void ex_info(const InstrDTO *); void mm_info(const InstrDTO *); void wb_info(const InstrDTO *); + void steps_done(); void finished(); private: -- cgit v1.2.3 From ad0557059bb83da52e1a5bd7ea608a29a4ab6346 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 13:53:21 -0400 Subject: Use spinboxes to select cache levels --- gui/cachewaysselector.cc | 59 +++++++++++++++++++++++++ gui/cachewaysselector.h | 50 +++++++++++++++++++++ gui/dynamicwaysentry.cc | 99 ------------------------------------------ gui/dynamicwaysentry.h | 51 ---------------------- gui/gui.cc | 18 +++----- gui/gui.ui | 110 ++++++++--------------------------------------- gui/messages.h | 3 -- 7 files changed, 134 insertions(+), 256 deletions(-) create mode 100644 gui/cachewaysselector.cc create mode 100644 gui/cachewaysselector.h delete mode 100644 gui/dynamicwaysentry.cc delete mode 100644 gui/dynamicwaysentry.h (limited to 'gui') diff --git a/gui/cachewaysselector.cc b/gui/cachewaysselector.cc new file mode 100644 index 0000000..f0314e5 --- /dev/null +++ b/gui/cachewaysselector.cc @@ -0,0 +1,59 @@ +// Simulator for the RISC-V[ECTOR] mini-ISA +// Copyright (C) 2025 Siddarth Suresh +// Copyright (C) 2025 bdunahu + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "cachewaysselector.h" +#include +#include +#include +#include + +CacheWaysSelector::CacheWaysSelector(QWidget *parent) : QWidget(parent) +{ + QVBoxLayout *v; + QHBoxLayout *l; + QSpinBox *sb; + QLabel *b; + int i; + + v = new QVBoxLayout(this); + + for (i = 1; i <= 6; ++i) { + l = new QHBoxLayout(this); + + b = new QLabel(QString("L%1 2^").arg(i), this); + + sb = new QSpinBox; + sb->setRange(-1, 4); + sb->setValue(-1); + + l->addWidget(b); + l->addWidget(sb); + + v->addLayout(l); + this->sbs.append(sb); + } + v->addStretch(); +} + +QList CacheWaysSelector::values() const +{ + QList r; + for (const QSpinBox *sb : this->sbs) { + r.append(sb->value()); + } + return r; +} diff --git a/gui/cachewaysselector.h b/gui/cachewaysselector.h new file mode 100644 index 0000000..4612b0c --- /dev/null +++ b/gui/cachewaysselector.h @@ -0,0 +1,50 @@ +// Simulator for the RISC-V[ECTOR] mini-ISA +// Copyright (C) 2025 Siddarth Suresh +// Copyright (C) 2025 bdunahu + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifndef CACHEWAYSSELECTOR_H +#define CACHEWAYSSELECTOR_H + +#include +#include + +class CacheWaysSelector : public QWidget +{ + Q_OBJECT + + public: + /** + * Constructor. + * This class provides a simple group of labeled spinboxs meant for + * selecting cache ways. + * @param The parent widget. + * @param a newly allocated CacheWaysSelector + */ + explicit CacheWaysSelector(QWidget *parent = nullptr); + + /** + * @return the values in the spinboxes. + */ + QList values() const; + + private: + /** + * A list of spinboxes. + */ + QList sbs; +}; + +#endif // CACHEWAYSSELECTOR_H diff --git a/gui/dynamicwaysentry.cc b/gui/dynamicwaysentry.cc deleted file mode 100644 index cbd5342..0000000 --- a/gui/dynamicwaysentry.cc +++ /dev/null @@ -1,99 +0,0 @@ -// Simulator for the RISC-V[ECTOR] mini-ISA -// Copyright (C) 2025 Siddarth Suresh -// Copyright (C) 2025 bdunahu - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#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; -} - -// TODO if you enter something valid and then make it invalid, -// the next box still shows -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 deleted file mode 100644 index 26b8b3e..0000000 --- a/gui/dynamicwaysentry.h +++ /dev/null @@ -1,51 +0,0 @@ -// Simulator for the RISC-V[ECTOR] mini-ISA -// Copyright (C) 2025 Siddarth Suresh -// Copyright (C) 2025 bdunahu - -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. - -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. - -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . - -#ifndef DYNAMICWAYSENTRY_H -#define DYNAMICWAYSENTRY_H - - -#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(); -}; - -#endif // DYNAMICWAYSENTRY_H diff --git a/gui/gui.cc b/gui/gui.cc index 28876ba..2581c4c 100644 --- a/gui/gui.cc +++ b/gui/gui.cc @@ -18,7 +18,7 @@ #include "gui.h" #include "./ui_gui.h" #include "digitlabeldelegate.h" -#include "dynamicwaysentry.h" +#include "cachewaysselector.h" #include "messages.h" #include "storageview.h" #include "util.h" @@ -304,21 +304,15 @@ void GUI::on_config_clicked() { std::vector ways; QStringList entries; - signed int i; - DynamicWaysEntry *dwe = ui->cache_way_selector; + CacheWaysSelector *cws = ui->cache_ways_selector; - for (const QString &s : dwe->get_entries()) { + for (int i : cws->values()) { - if (s.isEmpty()) + // invalid + if (i == -1) continue; - i = dwe->parse_valid_way(s); - if (i >= 0) { - ways.push_back((unsigned int)i); - } else { - this->set_status(get_bad_cache, "angry"); - return; - } + ways.push_back((unsigned int)i); } if (this->p.empty()) { diff --git a/gui/gui.ui b/gui/gui.ui index 67cca60..c20b3f6 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -6,7 +6,7 @@ 0 0 - 1499 + 1522 621 @@ -25,7 +25,7 @@ - 700 + 800 0 @@ -45,7 +45,7 @@ - + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop @@ -380,90 +380,18 @@ QLayout::SizeConstraint::SetMinimumSize - - - - Qt::Orientation::Vertical - - - - - - - QLayout::SizeConstraint::SetMinimumSize - - - - - - 16777215 - 16777215 - - - - C1 2^ - - - - - - - - 16777215 - 16777215 - - - - C2 2^ - - - - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - C3 2^ - - - - - - - - 16777215 - 16777215 - - - - C4 2^ - - - - - - - - - - 0 - 0 - - - - + + + + Ways Selector (powers of 2) + + + + + + @@ -674,17 +602,17 @@ - - DynamicWaysEntry - QWidget -
dynamicwaysentry.h
- 1 -
DigitLabel QLabel
digitlabel.h
+ + CacheWaysSelector + QWidget +
cachewaysselector.h
+ 1 +
diff --git a/gui/messages.h b/gui/messages.h index 461c461..0c38751 100644 --- a/gui/messages.h +++ b/gui/messages.h @@ -35,8 +35,6 @@ const std::vector load_file = { const std::vector no_instructions = { "NO PROGRAM PROVIDED", "NOTHING TO DO, GIVING UP", "INSTRUCTIONS MISSING", "404 INSTRUCTIONS NOT FOUND"}; -const std::vector bad_cache = { - "WAYS CANNOT BE BELOW 0 OR ABOVE 4"}; const std::vector no_pipeline = { "SIMULATION READY: NO PIPE", "PIPE OFF, SIMULATION READY"}; const std::vector no_cache = { @@ -59,7 +57,6 @@ std::string get_load_file() { return RANDOM_MESSAGE(load_file); } * @return a friendly reminder that the simulation is not configured yet */ std::string get_no_instructions() { return RANDOM_MESSAGE(no_instructions); } -std::string get_bad_cache() { return RANDOM_MESSAGE(bad_cache); } /** * @return unsolicited complaints for successful initialization -- cgit v1.2.3 From 8954fab5b430623e2052753fae20707b878b858c Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 14:33:26 -0400 Subject: Fix styles --- gui/cachewaysselector.cc | 3 +-- gui/gui.ui | 7 ------- gui/resources/styles.qss | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 9 deletions(-) (limited to 'gui') diff --git a/gui/cachewaysselector.cc b/gui/cachewaysselector.cc index f0314e5..14dae6f 100644 --- a/gui/cachewaysselector.cc +++ b/gui/cachewaysselector.cc @@ -32,7 +32,7 @@ CacheWaysSelector::CacheWaysSelector(QWidget *parent) : QWidget(parent) v = new QVBoxLayout(this); for (i = 1; i <= 6; ++i) { - l = new QHBoxLayout(this); + l = new QHBoxLayout; b = new QLabel(QString("L%1 2^").arg(i), this); @@ -46,7 +46,6 @@ CacheWaysSelector::CacheWaysSelector(QWidget *parent) : QWidget(parent) v->addLayout(l); this->sbs.append(sb); } - v->addStretch(); } QList CacheWaysSelector::values() const diff --git a/gui/gui.ui b/gui/gui.ui index c20b3f6..57a7974 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -375,13 +375,6 @@
- - - - QLayout::SizeConstraint::SetMinimumSize - - - diff --git a/gui/resources/styles.qss b/gui/resources/styles.qss index a61035e..758978c 100644 --- a/gui/resources/styles.qss +++ b/gui/resources/styles.qss @@ -4,6 +4,8 @@ color: "#00cc00"; background-color: "#000200"; border: 0px solid "#000200"; + selection-background-color: "#00cc00"; + selection-color: "#000200"; } QStatusBar { @@ -50,6 +52,52 @@ QGroupBox::title { QLabel { } +QSpinBox { + padding-right: 15px; /* make room for the arrows */ + border: none; +} + +QSpinBox::up-button { + color: "#000200"; + background-color: "#00cc00"; + subcontrol-origin: border; + subcontrol-position: top right; /* position at the top right corner */ + + width: 16px; + border: none; + subcontrol-origin: border; +} + +QSpinBox::up-arrow { + width: 7px; + height: 7px; +} + +QSpinBox::up-button:pressed { + color: "#00cc00"; + background-color: "#000200"; +} + +QSpinBox::down-button { + color: "#000200"; + background-color: "#00cc00"; + subcontrol-origin: border; + subcontrol-position: bottom right; /* position at bottom right corner */ + + width: 16px; + border: none; +} + +QSpinBox::down-arrow { + width: 7px; + height: 7px; +} + +QSpinBox::down-button:pressed { + color: "#00cc00"; + background-color: "#000200"; +} + QTableView { border: 0px; selection-background-color: transparent; -- cgit v1.2.3 From e1ac80f5f07c26a8423382cd306a1c1d07bf4c85 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 14:55:33 -0400 Subject: Make spinbox arrows visible --- gui/resources.qrc | 2 ++ gui/resources/arrow_down.png | Bin 0 -> 228 bytes gui/resources/arrow_up.png | Bin 0 -> 221 bytes gui/resources/styles.qss | 12 +++++++----- 4 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 gui/resources/arrow_down.png create mode 100644 gui/resources/arrow_up.png (limited to 'gui') diff --git a/gui/resources.qrc b/gui/resources.qrc index 569cc22..8fea0ee 100644 --- a/gui/resources.qrc +++ b/gui/resources.qrc @@ -1,6 +1,8 @@ + resources/arrow_down.png + resources/arrow_up.png resources/styles.qss resources/idle.png resources/angry.png diff --git a/gui/resources/arrow_down.png b/gui/resources/arrow_down.png new file mode 100644 index 0000000..80b1753 Binary files /dev/null and b/gui/resources/arrow_down.png differ diff --git a/gui/resources/arrow_up.png b/gui/resources/arrow_up.png new file mode 100644 index 0000000..69b65af Binary files /dev/null and b/gui/resources/arrow_up.png differ diff --git a/gui/resources/styles.qss b/gui/resources/styles.qss index 758978c..ea85e00 100644 --- a/gui/resources/styles.qss +++ b/gui/resources/styles.qss @@ -69,6 +69,13 @@ QSpinBox::up-button { } QSpinBox::up-arrow { + image: url(:/resources/arrow_up.png); + width: 7px; + height: 7px; +} + +QSpinBox::down-arrow { + image: url(:/resources/arrow_down.png); width: 7px; height: 7px; } @@ -88,11 +95,6 @@ QSpinBox::down-button { border: none; } -QSpinBox::down-arrow { - width: 7px; - height: 7px; -} - QSpinBox::down-button:pressed { color: "#00cc00"; background-color: "#000200"; -- cgit v1.2.3 From 599593ff229cfcead87a9fa87b4eaa13f0e280b5 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 14:58:35 -0400 Subject: Make spinbox arrows invert colors when pressed --- gui/resources.qrc | 2 ++ gui/resources/arrow_down_pressed.png | Bin 0 -> 234 bytes gui/resources/arrow_up_pressed.png | Bin 0 -> 227 bytes gui/resources/styles.qss | 16 ++++++++++++++-- 4 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 gui/resources/arrow_down_pressed.png create mode 100644 gui/resources/arrow_up_pressed.png (limited to 'gui') diff --git a/gui/resources.qrc b/gui/resources.qrc index 8fea0ee..66cd6e4 100644 --- a/gui/resources.qrc +++ b/gui/resources.qrc @@ -3,6 +3,8 @@ resources/arrow_down.png resources/arrow_up.png + resources/arrow_down_pressed.png + resources/arrow_up_pressed.png resources/styles.qss resources/idle.png resources/angry.png diff --git a/gui/resources/arrow_down_pressed.png b/gui/resources/arrow_down_pressed.png new file mode 100644 index 0000000..0981cf2 Binary files /dev/null and b/gui/resources/arrow_down_pressed.png differ diff --git a/gui/resources/arrow_up_pressed.png b/gui/resources/arrow_up_pressed.png new file mode 100644 index 0000000..98d50ac Binary files /dev/null and b/gui/resources/arrow_up_pressed.png differ diff --git a/gui/resources/styles.qss b/gui/resources/styles.qss index ea85e00..c6d8daa 100644 --- a/gui/resources/styles.qss +++ b/gui/resources/styles.qss @@ -74,8 +74,8 @@ QSpinBox::up-arrow { height: 7px; } -QSpinBox::down-arrow { - image: url(:/resources/arrow_down.png); +QSpinBox::up-arrow:pressed { + image: url(:/resources/arrow_up_pressed.png); width: 7px; height: 7px; } @@ -100,6 +100,18 @@ QSpinBox::down-button:pressed { background-color: "#000200"; } +QSpinBox::down-arrow { + image: url(:/resources/arrow_down.png); + width: 7px; + height: 7px; +} + +QSpinBox::down-arrow:pressed { + image: url(:/resources/arrow_down_pressed.png); + width: 7px; + height: 7px; +} + QTableView { border: 0px; selection-background-color: transparent; -- cgit v1.2.3 From 51f66c58ae8a21951d2406b3a36e96c9beb391a2 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 15:04:24 -0400 Subject: Make the storage display bigger --- gui/gui.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gui') diff --git a/gui/gui.ui b/gui/gui.ui index 57a7974..e571a0f 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -25,7 +25,7 @@ - 800 + 1500 0 -- cgit v1.2.3 From d9832fa5f24dc0e7df41b61e5d0181adbb4edf77 Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 15:09:55 -0400 Subject: Adjust storage display size --- gui/gui.ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gui') diff --git a/gui/gui.ui b/gui/gui.ui index e571a0f..18d5da1 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -25,7 +25,7 @@ - 1500 + 1250 0 -- cgit v1.2.3 From 07c618096daec422c42ee1a379200101d0d349cc Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 16:00:06 -0400 Subject: Add files for new RegisterView class --- gui/gui.cc | 6 ++++-- gui/registerview.cc | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ gui/registerview.h | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ gui/storageview.cc | 5 +++-- gui/storageview.h | 12 ++++++++---- src/id.cc | 2 -- 6 files changed, 116 insertions(+), 10 deletions(-) create mode 100644 gui/registerview.cc create mode 100644 gui/registerview.h (limited to 'gui') diff --git a/gui/gui.cc b/gui/gui.cc index b4feda6..4d558d4 100644 --- a/gui/gui.cc +++ b/gui/gui.cc @@ -21,6 +21,7 @@ #include "dynamicwaysentry.h" #include "messages.h" #include "storageview.h" +#include "registerview.h" #include "util.h" #include #include @@ -355,14 +356,15 @@ void GUI::make_tabs(int num) for (i = 0; i < num; ++i) { if (i == 0) { n = "Registers"; - e = new StorageView(0, this); + e = new RegisterView(GPR_NUM+V_NUM, V_R_LIMIT, this); } else if (i == num - 1) { n = "DRAM"; - e = new StorageView(MEM_LINES, this); + e = new StorageView(MEM_LINES, LINE_SIZE, this); } else { n = QString("L%1").arg(i); e = new StorageView( (1 << cache_size_mapper(this->curr_cache_levels - 1, i - 1)), + LINE_SIZE, this); } diff --git a/gui/registerview.cc b/gui/registerview.cc new file mode 100644 index 0000000..5320afa --- /dev/null +++ b/gui/registerview.cc @@ -0,0 +1,53 @@ +// Simulator for the RISC-V[ECTOR] mini-ISA +// Copyright (C) 2025 Siddarth Suresh +// Copyright (C) 2025 bdunahu + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include "registerview.h" +#include "definitions.h" +#include "util.h" +#include +#include + +QVariant RegisterView::data(const QModelIndex &i, int role) const +{ + Qt::Alignment a; + + if (role == Qt::TextAlignmentRole) { + a = Qt::AlignRight | Qt::AlignVCenter; + return QVariant(static_cast(a)); + } + if (!i.isValid() || role != Qt::DisplayRole) + return QVariant(); + return this->d[i.row()][i.column()]; +} + +QVariant RegisterView::headerData(int section, Qt::Orientation o, int role) const +{ + Qt::Alignment a; + + if (role == Qt::TextAlignmentRole) { + a = Qt::AlignRight | Qt::AlignVCenter; + return QVariant(static_cast(a)); + } + + if (role != Qt::DisplayRole) + return QVariant(); + + if (o == Qt::Vertical) { + return format_toggled_value(section * 4, this->is_hex); + } + return QVariant(); +} diff --git a/gui/registerview.h b/gui/registerview.h new file mode 100644 index 0000000..e4cb940 --- /dev/null +++ b/gui/registerview.h @@ -0,0 +1,48 @@ +// Simulator for the RISC-V[ECTOR] mini-ISA +// Copyright (C) 2025 Siddarth Suresh +// Copyright (C) 2025 bdunahu + +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifndef REGISTERVIEW_H +#define REGISTERVIEW_H + +#include +#include "storageview.h" +#include + +// see https://doc.qt.io/qt-6/qabstracttablemodel.html +class RegisterView : public StorageView +{ + Q_OBJECT + public: + using StorageView::StorageView; + + /** + * Returns a properly formatted cell, including alignment.This function is + * specific to the implementation details of QAbstractTableModel. + */ + QVariant + data(const QModelIndex &index, int role = Qt::DisplayRole) const override; + + /** + * Adds custom formatting options for row and column headers. + */ + QVariant headerData( + int section, + Qt::Orientation o, + int role = Qt::DisplayRole) const override; +}; + +#endif // REGISTERVIEW_H diff --git a/gui/storageview.cc b/gui/storageview.cc index 2f444a9..60391f9 100644 --- a/gui/storageview.cc +++ b/gui/storageview.cc @@ -21,10 +21,11 @@ #include #include -StorageView::StorageView(int rows, QObject *parent) +StorageView::StorageView(int rows, int columns, QObject *parent) : QAbstractTableModel(parent) { this->r = rows; + this->c = columns; this->d.resize(rows); for (auto &row : this->d) row.resize(LINE_SIZE, 0); @@ -32,7 +33,7 @@ StorageView::StorageView(int rows, QObject *parent) int StorageView::rowCount(const QModelIndex &) const { return this->r; } -int StorageView::columnCount(const QModelIndex &) const { return LINE_SIZE; } +int StorageView::columnCount(const QModelIndex &) const { return this->c; } QVariant StorageView::data(const QModelIndex &i, int role) const { diff --git a/gui/storageview.h b/gui/storageview.h index 0518d8f..e8f3473 100644 --- a/gui/storageview.h +++ b/gui/storageview.h @@ -31,7 +31,7 @@ class StorageView : public QAbstractTableModel * `rows' rows. * @param the number of rows */ - StorageView(int rows, QObject *parent = nullptr); + StorageView(int rows, int columns, QObject *parent = nullptr); /** * Returns the number of rows in this table. @@ -51,13 +51,13 @@ class StorageView : public QAbstractTableModel * Returns a properly formatted cell, including alignment.This function is * specific to the implementation details of QAbstractTableModel. */ - QVariant + virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; /** * Adds custom formatting options for row and column headers. */ - QVariant headerData( + virtual QVariant headerData( int section, Qt::Orientation o, int role = Qt::DisplayRole) const override; @@ -75,11 +75,15 @@ class StorageView : public QAbstractTableModel public slots: void set_hex_display(bool hex); - private: + protected: /** * The number of rows in this table. */ int r; + /** + * The number of columns in this table. + */ + int c; /** * Whether or not the headers should be displayed in hex. */ diff --git a/src/id.cc b/src/id.cc index 7398f49..aebb054 100644 --- a/src/id.cc +++ b/src/id.cc @@ -136,8 +136,6 @@ Response ID::set_vlen(){ return r; } - - void ID::decode_R_type(signed int &s1) { unsigned int s0b, s1b, s2b; -- cgit v1.2.3 From 4f77c3161128ff965b26f9575853c5347c0d662d Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 17:34:16 -0400 Subject: Basic register display --- gui/digitlabeldelegate.cc | 8 +++++-- gui/gui.cc | 44 +++++++++------------------------------ gui/gui.h | 2 +- gui/registerview.cc | 24 +++++++++++++++++---- gui/registerview.h | 18 +++++++++++++++- gui/storageview.h | 2 ++ gui/worker.cc | 24 +++++++-------------- gui/worker.h | 21 +++++++++++++++---- inc/controller.h | 6 +++++- src/controller.cc | 8 ++++++- src/id.cc | 53 ++++++++++++++++++++++++++++------------------- 11 files changed, 125 insertions(+), 85 deletions(-) (limited to 'gui') diff --git a/gui/digitlabeldelegate.cc b/gui/digitlabeldelegate.cc index 430946c..7a6a1d5 100644 --- a/gui/digitlabeldelegate.cc +++ b/gui/digitlabeldelegate.cc @@ -37,9 +37,13 @@ void DigitLabelDelegate::paint( QString t; QStyleOptionViewItem o; QStyle *s; + QVariant a; + bool e; - v = index.data(Qt::DisplayRole).toInt(); - t = format_toggled_value(v, this->is_hex); + a = index.data(Qt::DisplayRole); + v = a.toInt(); + e = a.isNull(); + t = format_toggled_value(v, this->is_hex, e); o = option; initStyleOption(&o, index); diff --git a/gui/gui.cc b/gui/gui.cc index 63bb4f3..395c6e6 100644 --- a/gui/gui.cc +++ b/gui/gui.cc @@ -17,11 +17,11 @@ #include "gui.h" #include "./ui_gui.h" -#include "digitlabeldelegate.h" #include "cachewaysselector.h" +#include "digitlabeldelegate.h" #include "messages.h" -#include "storageview.h" #include "registerview.h" +#include "storageview.h" #include "util.h" #include #include @@ -112,32 +112,6 @@ GUI::~GUI() delete ui; } -void displayArrayHTML(QTextEdit *textEdit, const std::array &data) -{ - textEdit->setReadOnly(false); - QString tableText = ""; - - tableText += ""; - int index = 0; - for (int value : data) { - tableText += QString("") - .arg(QString::asprintf("%04X", value)) - .arg(index); - index++; - } - tableText += ""; - tableText += "
" - "%1 %2" - "
"; - - textEdit->setHtml(tableText); - textEdit->setReadOnly(true); -} - void GUI::on_worker_refresh_gui(int cycles, int pc) { ui->p_counter->set_value(pc); @@ -224,10 +198,13 @@ void GUI::onWorkerShowStorage(const QVector> &data, int i) this->tab_boxes.at(i)->set_data(data); } -void GUI::onWorkerShowRegisters(const std::array &data) +void GUI::onWorkerShowRegisters( + const QVector &gprs, const QVector> &vrs) { - ; - // displayArrayHTML(this->tab_boxes.at(0), data); + RegisterView *rv; + + rv = dynamic_cast(this->tab_boxes.at(0)); + rv->set_data(gprs, vrs); } void GUI::on_upload_intructions_btn_clicked() @@ -353,7 +330,7 @@ void GUI::make_tabs(int num) for (i = 0; i < num; ++i) { if (i == 0) { n = "Registers"; - e = new RegisterView(GPR_NUM+V_NUM, V_R_LIMIT, this); + e = new RegisterView(GPR_NUM + V_NUM, V_R_LIMIT, this); } else if (i == num - 1) { n = "DRAM"; e = new StorageView(MEM_LINES, LINE_SIZE, this); @@ -361,8 +338,7 @@ void GUI::make_tabs(int num) n = QString("L%1").arg(i); e = new StorageView( (1 << cache_size_mapper(this->curr_cache_levels - 1, i - 1)), - LINE_SIZE, - this); + LINE_SIZE, this); } t = new QTableView(ui->storage); diff --git a/gui/gui.h b/gui/gui.h index 8e0b5b4..edcde88 100644 --- a/gui/gui.h +++ b/gui/gui.h @@ -72,7 +72,7 @@ class GUI : public QMainWindow void onWorkerShowStorage(const QVector> &data, int i); - void onWorkerShowRegisters(const std::array &data); + void onWorkerShowRegisters(const QVector &gprs, const QVector> &vrs); void on_upload_intructions_btn_clicked(); diff --git a/gui/registerview.cc b/gui/registerview.cc index 5320afa..b1a1333 100644 --- a/gui/registerview.cc +++ b/gui/registerview.cc @@ -15,8 +15,8 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "pipe_spec.h" #include "registerview.h" -#include "definitions.h" #include "util.h" #include #include @@ -29,12 +29,22 @@ QVariant RegisterView::data(const QModelIndex &i, int role) const a = Qt::AlignRight | Qt::AlignVCenter; return QVariant(static_cast(a)); } + if (!i.isValid() || role != Qt::DisplayRole) return QVariant(); - return this->d[i.row()][i.column()]; + + if (i.row() < 16) { + if (i.column() < 1) + return this->gprs[i.row()]; + else + return QVariant(); + } + + return this->vrs[i.row() - GPR_NUM][i.column() - GPR_NUM]; } -QVariant RegisterView::headerData(int section, Qt::Orientation o, int role) const +QVariant +RegisterView::headerData(int section, Qt::Orientation o, int role) const { Qt::Alignment a; @@ -47,7 +57,13 @@ QVariant RegisterView::headerData(int section, Qt::Orientation o, int role) cons return QVariant(); if (o == Qt::Vertical) { - return format_toggled_value(section * 4, this->is_hex); + return format_toggled_value(section, this->is_hex); } return QVariant(); } + +void RegisterView::set_data(const QVector &gprs, const QVector> &vrs) +{ + this->gprs = gprs; + this->vrs = vrs; +} diff --git a/gui/registerview.h b/gui/registerview.h index e4cb940..cc5a1f8 100644 --- a/gui/registerview.h +++ b/gui/registerview.h @@ -18,8 +18,8 @@ #ifndef REGISTERVIEW_H #define REGISTERVIEW_H -#include #include "storageview.h" +#include #include // see https://doc.qt.io/qt-6/qabstracttablemodel.html @@ -43,6 +43,22 @@ class RegisterView : public StorageView int section, Qt::Orientation o, int role = Qt::DisplayRole) const override; + + /** + * @param field to assign to `this->gprs'. + * @param field to assign to `this->vrs'. + */ + void set_data(const QVector &gprs, const QVector> &vrs); + + private: + /** + * The general purpose registers. + */ + QVector gprs; + /** + * The vector registers. + */ + QVector> vrs; }; #endif // REGISTERVIEW_H diff --git a/gui/storageview.h b/gui/storageview.h index e8f3473..a0f8dbb 100644 --- a/gui/storageview.h +++ b/gui/storageview.h @@ -88,6 +88,8 @@ class StorageView : public QAbstractTableModel * Whether or not the headers should be displayed in hex. */ bool is_hex = true; + + private: /** * The data this table displays. */ diff --git a/gui/worker.cc b/gui/worker.cc index dd7b637..a48888c 100644 --- a/gui/worker.cc +++ b/gui/worker.cc @@ -78,9 +78,16 @@ void Worker::runSteps(int steps) void Worker::update() { unsigned long i; + std::array gprs; + std::array, V_NUM> vrs; this->ct_mutex.lock(); - emit register_storage(this->ct->get_gprs()); + gprs = this->ct->get_gprs(); + vrs = this->ct->get_vrs(); + std::vector> v(vrs.begin(), vrs.end()); + + emit register_storage( + QVector(gprs.begin(), gprs.end()), this->data_to_QT(v)); for (i = 0; i < s.size(); ++i) emit storage(this->data_to_QT(this->s.at(i)->get_data()), i + 1); @@ -93,18 +100,3 @@ void Worker::update() emit wb_info(this->wb_stage->get_instr()); this->ct_mutex.unlock(); } - -QVector> -Worker::data_to_QT(std::vector> data) -{ - QVector> r; - QVector tmp; - - r.reserve(static_cast(data.size())); - - for (const auto &line : data) { - tmp = QVector(line.begin(), line.end()); - r.append(tmp); - } - return r; -} diff --git a/gui/worker.h b/gui/worker.h index 5ffb6ef..2a362a4 100644 --- a/gui/worker.h +++ b/gui/worker.h @@ -64,9 +64,9 @@ class Worker : public QObject signals: void clock_cycles(int value, int pc); - void - storage(QVector> data, int i); - void register_storage(const std::array data); + void storage(QVector> data, int i); + void register_storage( + QVector gprs, QVector> vrs); void if_info(const InstrDTO *); void id_info(const InstrDTO *); void ex_info(const InstrDTO *); @@ -81,8 +81,21 @@ class Worker : public QObject * @param the original data * @return a less universal version of the same thing */ + template QVector> - data_to_QT(std::vector> data); + data_to_QT(const std::vector> &data) + { + QVector> r; + QVector tmp; + + r.reserve(static_cast(data.size())); + + for (const auto &line : data) { + tmp = QVector(line.begin(), line.end()); + r.append(tmp); + } + return r; + } /** * Sets the GUI signals to update the storage, clock cycle, and stage * displays. diff --git a/inc/controller.h b/inc/controller.h index b7fa835..cd59fc8 100644 --- a/inc/controller.h +++ b/inc/controller.h @@ -49,7 +49,11 @@ class Controller : public Stage /** * @return a copy of gprs. */ - std::array get_gprs(); + std::array get_gprs(); + /** + * @return a copy of vrs. + */ + std::array, V_NUM> get_vrs(); /** * @return the pc. */ diff --git a/src/controller.cc b/src/controller.cc index 8df4b97..a84126d 100644 --- a/src/controller.cc +++ b/src/controller.cc @@ -15,6 +15,7 @@ // You should have received a copy of the GNU General Public License // along with this program. If not, see . +#include "definitions.h" #include "controller.h" #include "ex.h" #include "response.h" @@ -47,7 +48,12 @@ void Controller::run_for(int number) int Controller::get_clock_cycle() { return this->clock_cycle; } -std::array Controller::get_gprs() { return this->gprs; } +std::array Controller::get_gprs() { return this->gprs; } + +std::array, V_NUM> Controller::get_vrs() +{ + return this->vrs; +} int Controller::get_pc() { return this->pc; } diff --git a/src/id.cc b/src/id.cc index aebb054..7db67c4 100644 --- a/src/id.cc +++ b/src/id.cc @@ -34,7 +34,8 @@ Response ID::read_guard(signed int &v) return r; } -Response ID::read_vec_guard(signed int v, std::array &vrs) +Response +ID::read_vec_guard(signed int v, std::array &vrs) { Response r; if (this->is_checked_out(v)) @@ -58,7 +59,8 @@ void ID::write_guard(signed int &v) v = this->dereference_register(v); } -void ID::write_vec_guard(signed int v, std::array &vrs){ +void ID::write_vec_guard(signed int v, std::array &vrs) +{ // zero register shouldn't be written. if (v != 0) { @@ -121,13 +123,14 @@ void ID::split_instr(signed int &raw, unsigned int &type, Mnemonic &m) raw = (unsigned int)raw >> (TYPE_SIZE + opcode_size); } -Response ID::set_vlen(){ +Response ID::set_vlen() +{ signed int vlen_reg = 4; Response r; r = this->read_guard(vlen_reg); vlen_reg = vlen_reg & 0xf; - if (r == OK){ - if (vlen_reg > V_R_LIMIT){ + if (r == OK) { + if (vlen_reg > V_R_LIMIT) { this->curr_instr->slot_A = V_R_LIMIT; } else { this->curr_instr->slot_A = vlen_reg; @@ -150,9 +153,11 @@ void ID::decode_R_type(signed int &s1) s2 = GET_MID_BITS(s1, s0b, s1b); s1 = GET_LS_BITS(s1, s0b); - if(this->is_vector_type(this->curr_instr->mnemonic)){ - r1 = this->read_vec_guard(s1, this->curr_instr->operands.vector.slot_one); - r2 = this->read_vec_guard(s2, this->curr_instr->operands.vector.slot_two); + if (this->is_vector_type(this->curr_instr->mnemonic)) { + r1 = this->read_vec_guard( + s1, this->curr_instr->operands.vector.slot_one); + r2 = this->read_vec_guard( + s2, this->curr_instr->operands.vector.slot_two); r3 = this->set_vlen(); } else { r1 = this->read_guard(s1); @@ -171,14 +176,16 @@ void ID::decode_R_type(signed int &s1) case SUBV: case MULV: case DIVV: - if(this->status == OK){ - this->write_vec_guard(s3, this->curr_instr->operands.vector.slot_three); + if (this->status == OK) { + this->write_vec_guard( + s3, this->curr_instr->operands.vector.slot_three); } break; default: - if (this->status == OK) + if (this->status == OK) { this->write_guard(s3); this->curr_instr->operands.integer.slot_three = s3; + } } } @@ -219,7 +226,8 @@ void ID::decode_I_type(signed int &s1) r1 = this->read_guard(s1); this->curr_instr->operands.load_store_vector.base_addr = s1; // vector value to be stored - r2 = this->read_vec_guard(s2,this->curr_instr->operands.load_store_vector.vector_register); + r2 = this->read_vec_guard( + s2, this->curr_instr->operands.load_store_vector.vector_register); r3 = this->set_vlen(); this->status = (r1 == OK && r2 == OK && r3 == OK) ? OK : STALLED; @@ -234,7 +242,9 @@ void ID::decode_I_type(signed int &s1) r3 = this->set_vlen(); if (r1 == OK && r3 == OK) // vector destination - this->write_vec_guard(s2, this->curr_instr->operands.load_store_vector.vector_register); + this->write_vec_guard( + s2, + this->curr_instr->operands.load_store_vector.vector_register); this->status = (r1 == OK && r3 == OK) ? OK : STALLED; return; case LOAD: @@ -249,7 +259,7 @@ void ID::decode_I_type(signed int &s1) r1 = this->read_guard(s1); this->curr_instr->operands.integer.slot_one = s1; - if (r1 == OK){ + if (r1 == OK) { this->write_guard(s2); this->curr_instr->operands.integer.slot_two = s2; } @@ -259,7 +269,7 @@ void ID::decode_I_type(signed int &s1) void ID::decode_J_type(signed int &s1) { Response r1, r2; - signed int s2,s3; + signed int s2, s3; unsigned int s0b, s1b; s0b = REG_SIZE; @@ -271,11 +281,12 @@ void ID::decode_J_type(signed int &s1) switch (this->curr_instr->mnemonic) { case PUSH: s2 = s1; // source - s3 = 2; // stack pointer + s3 = 2; // stack pointer s1 = -1; // increment amount r1 = this->read_guard(s2); this->curr_instr->operands.integer.slot_two = s2; - r2 = (this->is_checked_out(s3)) ? STALLED : OK; // we read the stack pointer + r2 = (this->is_checked_out(s3)) ? STALLED + : OK; // we read the stack pointer if (r1 == OK && r2 == OK) { this->write_guard(s3); // we write the stack pointer this->curr_instr->operands.integer.slot_three = s3; @@ -284,9 +295,10 @@ void ID::decode_J_type(signed int &s1) break; case POP: s2 = s1; // destination - s3 = 2; // stack pointer - s1 = 1; // increment amount - r1 = (this->is_checked_out(s3)) ? STALLED : OK; // we read the stack pointer + s3 = 2; // stack pointer + s1 = 1; // increment amount + r1 = (this->is_checked_out(s3)) ? STALLED + : OK; // we read the stack pointer if (r1 == OK) { this->write_guard(s2); this->curr_instr->operands.integer.slot_two = s2; @@ -302,5 +314,4 @@ void ID::decode_J_type(signed int &s1) this->status = this->read_guard(s1); this->curr_instr->operands.integer.slot_one = s1; } - } -- cgit v1.2.3 From 336faf3fd701aaf962613abd1ff0a69cbdf021ce Mon Sep 17 00:00:00 2001 From: bd Date: Sun, 27 Apr 2025 23:34:35 -0400 Subject: Fix UI display to not be ridged --- gui/gui.ui | 21 ++++++++++++--------- src/ex.cc | 2 ++ 2 files changed, 14 insertions(+), 9 deletions(-) (limited to 'gui') diff --git a/gui/gui.ui b/gui/gui.ui index 18d5da1..5a5a037 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -6,7 +6,7 @@ 0 0 - 1522 + 1686 621
@@ -18,14 +18,17 @@ - + + + 6 + - 1250 + 0 0 @@ -35,7 +38,7 @@ - + @@ -93,7 +96,7 @@ - 200 + 0 0 @@ -146,7 +149,7 @@ - 200 + 0 0 @@ -199,7 +202,7 @@ - 200 + 0 0 @@ -255,7 +258,7 @@ - 200 + 0 0 @@ -308,7 +311,7 @@ - 200 + 0 0 diff --git a/src/ex.cc b/src/ex.cc index 3f86ad4..286c7ba 100644 --- a/src/ex.cc +++ b/src/ex.cc @@ -32,6 +32,8 @@ void EX::advance_helper() Mnemonic m; s1 = 0, s2 = 0, s3 = 0; + v1 = {0}, v2 = {0}, v3 = {0}; + v_len = 0, v_immediate = 0, v_base_addr = 0; m = this->curr_instr->mnemonic; pc = this->curr_instr->slot_B; -- cgit v1.2.3