From f9e5214e87a935e1311b886e44bdfe1f8bfbdf56 Mon Sep 17 00:00:00 2001 From: Siddarth-Suresh <65844402+Siddarth-Suresh@users.noreply.github.com> Date: Tue, 15 Apr 2025 11:59:27 -0400 Subject: Added pipeline to GUI --- gui/gui.cc | 106 ++++++++++++++- gui/gui.h | 54 ++++++++ gui/gui.ui | 404 +++++++++++++++++++++++++++++++++++++++++++--------------- gui/worker.cc | 13 +- gui/worker.h | 5 + 5 files changed, 472 insertions(+), 110 deletions(-) (limited to 'gui') diff --git a/gui/gui.cc b/gui/gui.cc index 3d3c56f..3c091e1 100644 --- a/gui/gui.cc +++ b/gui/gui.cc @@ -19,6 +19,16 @@ GUI::GUI(QWidget *parent) // Display clock cycles and PC connect(worker, &Worker::clock_cycles, this, &GUI::onWorkerClockCycles); + connect(worker, &Worker::if_info, this, &GUI::onWorkerFetchInfo); + + connect(worker, &Worker::id_info, this, &GUI::onWorkerDecodeInfo); + + connect(worker, &Worker::ex_info, this, &GUI::onWorkerExecuteInfo); + + connect(worker, &Worker::mm_info, this, &GUI::onWorkerMemoryInfo); + + connect(worker, &Worker::wb_info, this, &GUI::onWorkerWriteBackInfo); + // Display dram connect(worker, &Worker::dram_storage, this, &GUI::onWorkerShowDram); @@ -103,7 +113,7 @@ void displayTableHTML(QTextEdit *textEdit, const std::vectorsetReadOnly(true); } -void browseAndUploadFile(QTextEdit *textEdit) { +void browseAndUploadFile(QWidget* parent) { QString filePath = QFileDialog::getOpenFileName(nullptr, "Open File", QDir::homePath(), "Text Files (*.txt);;All Files (*.*)"); if (filePath.isEmpty()) { @@ -112,7 +122,8 @@ void browseAndUploadFile(QTextEdit *textEdit) { QFile file(filePath); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - textEdit->setPlainText("Error: Unable to open file!"); + // textEdit->setPlainText("Error: Unable to open file!"); + QMessageBox::critical(parent, "File Upload", "Unable to open file!"); return; } @@ -135,15 +146,98 @@ void browseAndUploadFile(QTextEdit *textEdit) { file.close(); - textEdit->setReadOnly(false); - textEdit->setHtml(content); - textEdit->setReadOnly(true); + + QMessageBox::information(parent, "File Upload", "Instructions loaded successfully!"); + + // textEdit->setReadOnly(false); + // textEdit->setHtml(content); + // textEdit->setReadOnly(true); } void GUI::onWorkerClockCycles(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)); } +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])); + } else { + ui->fetch_pc->clear(); + ui->fetch_instruction_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])); + } else { + // ui->decode_mnemonic->clear(); + ui->decode_pc->clear(); + ui->decode_s1->clear(); + // ui->decode_s2->clear(); + // ui->decode_s3->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_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_s1->clear(); + ui->execute_s2->clear(); + ui->execute_s3->clear(); + } +} + +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_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_s1->clear(); + ui->memory_s2->clear(); + ui->memory_s3->clear(); + } +} + +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])); + } else { + ui->wb_mnemonic->clear(); + ui->wb_pc->clear(); + ui->wb_s1->clear(); + ui->wb_s2->clear(); + ui->wb_s3->clear(); + } +} + void GUI::onWorkerShowDram(const std::vector> data) { displayTableHTML(ui->dram_table, data); } @@ -163,7 +257,7 @@ void GUI::onWorkerFinished() { void GUI::on_upload_intructions_btn_clicked() { qDebug() << "Upload intructions button clicked."; - browseAndUploadFile(ui->instruction_table); + browseAndUploadFile(ui->register_table); } diff --git a/gui/gui.h b/gui/gui.h index 77a8867..b845124 100644 --- a/gui/gui.h +++ b/gui/gui.h @@ -7,6 +7,7 @@ #include #include #include +#include #include "worker.h" QT_BEGIN_NAMESPACE @@ -33,6 +34,16 @@ signals: private slots: void onWorkerClockCycles(int value, int pc); + void onWorkerFetchInfo(const std::vector info); + + void onWorkerDecodeInfo(const std::vector info); + + void onWorkerExecuteInfo(const std::vector info); + + void onWorkerMemoryInfo(const std::vector info); + + void onWorkerWriteBackInfo(const std::vector info); + void onWorkerShowDram(const std::vector> data); void onWorkerShowCache(const std::vector> data); @@ -65,5 +76,48 @@ private: Ui::GUI *ui; QThread workerThread; Worker *worker; + const std::map mnemonicNameMap = { + {Mnemonic::ADD, "ADD"}, + {Mnemonic::SUB, "SUB"}, + {Mnemonic::MUL, "MUL"}, + {Mnemonic::QUOT, "QUOT"}, + {Mnemonic::SFTR, "SFTR"}, + {Mnemonic::SFTL, "SFTL"}, + {Mnemonic::AND, "AND"}, + {Mnemonic::OR, "OR"}, + {Mnemonic::NOT, "NOT"}, + {Mnemonic::XOR, "XOR"}, + {Mnemonic::ADDV, "ADDV"}, + {Mnemonic::SUBV, "SUBV"}, + {Mnemonic::MULV, "MULV"}, + {Mnemonic::DIVV, "DIVV"}, + {Mnemonic::CMP, "CMP"}, + {Mnemonic::CEV, "CEV"}, + {Mnemonic::LOAD, "LOAD"}, + {Mnemonic::LOADV, "LOADV"}, + {Mnemonic::ADDI, "ADDI"}, + {Mnemonic::SUBI, "SUBI"}, + {Mnemonic::SFTRI, "SFTRI"}, + {Mnemonic::SFTLI, "SFTLI"}, + {Mnemonic::ANDI, "ANDI"}, + {Mnemonic::ORI, "ORI"}, + {Mnemonic::XORI, "XORI"}, + {Mnemonic::STORE, "STORE"}, + {Mnemonic::STOREV, "STOREV"}, + {Mnemonic::JMP, "JMP"}, + {Mnemonic::JRL, "JRL"}, + {Mnemonic::JAL, "JAL"}, + {Mnemonic::BEQ, "BEQ"}, + {Mnemonic::BGT, "BGT"}, + {Mnemonic::BUF, "BUF"}, + {Mnemonic::BOF, "BOF"}, + {Mnemonic::PUSH, "PUSH"}, + {Mnemonic::POP, "POP"}, + {Mnemonic::NOP, "NOP"}, + }; + QString mnemonicToString(Mnemonic mnemonic) { + auto it = mnemonicNameMap.find(mnemonic); + return (it != mnemonicNameMap.end()) ? it->second : "Unknown"; + } }; #endif // GUI_H diff --git a/gui/gui.ui b/gui/gui.ui index f515b58..7390212 100644 --- a/gui/gui.ui +++ b/gui/gui.ui @@ -13,49 +13,16 @@ RISC V[ECTOR] - - + + - - - - - Qt::Vertical - - - - - - - - - - true - - - - Instructions - - - - - - - Qt::Horizontal - - - + + + - - - - - - - - + - + true @@ -67,7 +34,7 @@ - + Qt::Horizontal @@ -79,18 +46,18 @@ - + Qt::Horizontal - + - + - + true @@ -102,7 +69,7 @@ - + Qt::Horizontal @@ -114,16 +81,16 @@ - + Qt::Vertical - + - + true @@ -135,7 +102,7 @@ - + Qt::Horizontal @@ -150,33 +117,255 @@ - - - - Qt::Vertical - - - - - - - Qt::Horizontal - - - - - - - Qt::Horizontal - - + + + + + + Fetch + + + + + + Instruction Bits + + + + + + + Program Counter + + + + + + + + + + Qt::Vertical + + + + + + + Decode + + + + + + Instruction Bits + + + + + + + + Program Counter + + + + + + + + + + Qt::Vertical + + + + + + + Execute + + + + + + s1 + + + + + + + + + + s2 + + + + + + + s3 + + + + + + + Mnemonic + + + + + + + Program Counter + + + + + + + + + + Qt::Vertical + + + + + + + Memory + + + + + + s1 + + + + + + + + + + s2 + + + + + + + s3 + + + + + + + Mnemonic + + + + + + + Program Counter + + + + + + + + + + Qt::Vertical + + + + + + + Write Back + + + + + + s1 + + + + + + + + + + s2 + + + + + + + s3 + + + + + + + Mnemonic + + + + + + + Program Counter + + + + + + + - - + + - + - + true @@ -188,14 +377,14 @@ - + Qt::Horizontal - + @@ -204,7 +393,7 @@ - + @@ -217,7 +406,7 @@ - + Qt::Horizontal @@ -226,9 +415,9 @@ - + - + true @@ -240,16 +429,16 @@ - + Qt::Horizontal - + - + @@ -274,12 +463,25 @@ - + + + + + Reset + + + Enable Pipeline + + false + + + false + @@ -287,6 +489,9 @@ Enable Cache + + false + @@ -296,16 +501,16 @@ - + - + Qt::Horizontal - + true @@ -317,16 +522,16 @@ - + Qt::Horizontal - + - + @@ -355,16 +560,16 @@ - + Qt::Horizontal - + - + true @@ -376,7 +581,7 @@ - + Qt::Horizontal @@ -400,15 +605,8 @@ - - - - Qt::Vertical - - - - - + + Qt::Vertical diff --git a/gui/worker.cc b/gui/worker.cc index 685b46c..e7c9876 100644 --- a/gui/worker.cc +++ b/gui/worker.cc @@ -63,6 +63,8 @@ void Worker::doWork() this->d->load(p); } + + Worker::~Worker() { emit finished(); @@ -98,6 +100,11 @@ void Worker::runSteps(int steps) emit cache_storage(this->c->view(0, 8)); 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()); } void Worker::runStep() @@ -107,6 +114,10 @@ void Worker::runStep() emit dram_storage(this->d->view(0, 256)); emit cache_storage(this->c->view(0, 8)); emit register_storage(this->ct->get_gprs()); - qDebug() << "PC " << this->ct->get_pc(); 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 99ab39a..ee8926b 100644 --- a/gui/worker.h +++ b/gui/worker.h @@ -44,6 +44,11 @@ signals: void dram_storage(const std::vector> data); void cache_storage(const std::vector> data); void register_storage(const std::array data); + void if_info(const std::vector info); + void id_info(const std::vector info); + void ex_info(const std::vector info); + void mm_info(const std::vector info); + void wb_info(const std::vector info); void finished(); }; -- cgit v1.2.3