summaryrefslogtreecommitdiff
path: root/gui/gui.h
blob: 85f965a23ae496920a21578e4dec3c4f2beb560b (plain)
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
#ifndef GUI_H
#define GUI_H

#include "worker.h"
#include <QFile>
#include <QFileDialog>
#include <QInputDialog>
#include <QMainWindow>
#include <QMessageBox>
#include <QTextEdit>
#include <QTextStream>
#include <QThread>
#include <functional>

QT_BEGIN_NAMESPACE
namespace Ui
{
class GUI;
}
QT_END_NAMESPACE

class GUI : public QMainWindow
{
	Q_OBJECT

  public:
	GUI(QWidget *parent = nullptr);
	~GUI();
	bool is_pipelined = false;
	std::vector<int> ways;

  signals:
	void sendRefreshDram();
	void sendRefreshCache();
	void sendRefreshRegisters();
	void sendRunSteps(int steps);

  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_enable_pipeline_checkbox_checkStateChanged(const Qt::CheckState &arg1);

	void on_step_btn_clicked();

	void on_save_program_state_btn_clicked();

  private:
	Ui::GUI *ui;

	/**
	 * The message displayed on the status bar.
	 */
	QLabel *status_label;

	/**
	 * The currently loaded program.
	 */
	std::vector<signed int> p;

	QThread workerThread;

	Worker *worker;

	QVector<int> step_values = {1, 5, 10, 50, 250, 1000, 10000};

	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";
	}

	QString make_status(const std::function<std::string()> &func);
};
#endif // GUI_H