1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
#ifndef GUI_H
#define GUI_H
#include <QMainWindow>
#include <QThread>
#include <QFileDialog>
#include <QFile>
#include <QTextStream>
#include <QTextEdit>
#include <QMessageBox>
#include "worker.h"
QT_BEGIN_NAMESPACE
namespace Ui {
class GUI;
}
QT_END_NAMESPACE
class GUI : public QMainWindow
{
Q_OBJECT
public:
GUI(QWidget *parent = nullptr);
~GUI();
signals:
void sendRefreshDram();
void sendRefreshCache();
void sendRefreshRegisters();
void sendRunSteps(int steps);
void sendRunStep();
void sendLoadProgram(std::vector<signed int> program);
private slots:
void onWorkerClockCycles(int value, int pc);
void onWorkerFetchInfo(const std::vector<int> info);
void onWorkerDecodeInfo(const std::vector<int> info);
void onWorkerExecuteInfo(const std::vector<int> info);
void onWorkerMemoryInfo(const std::vector<int> info);
void onWorkerWriteBackInfo(const std::vector<int> info);
void onWorkerShowDram(const std::vector<std::array<signed int, LINE_SIZE>> data);
void onWorkerShowCache(const std::vector<std::array<signed int, LINE_SIZE>> data);
void onWorkerShowRegisters(const std::array<int, GPR_NUM> &data);
void onWorkerFinished();
void on_upload_intructions_btn_clicked();
void on_upload_program_state_btn_clicked();
void on_refresh_dram_btn_clicked();
void on_refresh_cache_btn_clicked();
void on_refresh_registers_btn_clicked();
void on_enable_pipeline_checkbox_checkStateChanged(const Qt::CheckState &arg1);
void on_enabl_cache_checkbox_checkStateChanged(const Qt::CheckState &arg1);
void on_run_steps_btn_clicked();
void on_step_btn_clicked();
void on_save_program_state_btn_clicked();
private:
Ui::GUI *ui;
QThread workerThread;
Worker *worker;
const std::map<Mnemonic, QString> 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
|