diff options
Diffstat (limited to 'qtmips_gui')
-rw-r--r-- | qtmips_gui/coreview.cpp | 36 | ||||
-rw-r--r-- | qtmips_gui/coreview.h | 13 | ||||
-rw-r--r-- | qtmips_gui/mainwindow.cpp | 83 | ||||
-rw-r--r-- | qtmips_gui/mainwindow.h | 11 | ||||
-rw-r--r-- | qtmips_gui/registersdock.cpp | 11 | ||||
-rw-r--r-- | qtmips_gui/registersdock.h | 3 |
6 files changed, 121 insertions, 36 deletions
diff --git a/qtmips_gui/coreview.cpp b/qtmips_gui/coreview.cpp index b7c17fc..f7cc416 100644 --- a/qtmips_gui/coreview.cpp +++ b/qtmips_gui/coreview.cpp @@ -1,14 +1,23 @@ #include "coreview.h" -CoreView::CoreView(QWidget *parent, machine::QtMipsMachine *machine) : QGraphicsView(parent) { +CoreView::CoreView(QWidget *parent) : QGraphicsView(parent) { setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); + // TODO fitInView doesn't work as I want so reimplement or do something with it + //fitInView(0, 0, 201, 201, Qt::KeepAspectRatioByExpanding); +} + +void CoreView::resizeEvent(QResizeEvent *event) { + // fitInView(0, 0, 201, 201, Qt::KeepAspectRatioByExpanding); +} + +CoreViewScene::CoreViewScene(CoreView *view, machine::QtMipsMachine *machine) : QGraphicsScene(view) { this->machine = machine; // Identification cross - scene.addLine(400, 0, 400, 800); - scene.addLine(0, 400, 800, 400); + addLine(400, 0, 400, 800); + addLine(0, 400, 800, 400); pc = new coreview::ProgramCounter(machine); alu = new coreview::Alu(); @@ -17,22 +26,19 @@ CoreView::CoreView(QWidget *parent, machine::QtMipsMachine *machine) : QGraphics pc2pc = new coreview::Connection(pc_multiplexer->connector_out(), pc->connector_in()); - scene.addItem(pc); - scene.addItem(alu); - scene.addItem(pc_multiplexer); - scene.addItem(testlatch); - scene.addItem(pc2pc); + addItem(pc); + addItem(alu); + addItem(pc_multiplexer); + addItem(testlatch); + addItem(pc2pc); pc->setPos(100,100); alu->setPos(200, 100); pc_multiplexer->setPos(60, 100); pc_multiplexer->set(2); - setScene(&scene); - // TODO fitInView doesn't work as I want so reimplement or do something with it - //fitInView(0, 0, 201, 201, Qt::KeepAspectRatioByExpanding); -} - -void CoreView::resizeEvent(QResizeEvent *event) { - // fitInView(0, 0, 201, 201, Qt::KeepAspectRatioByExpanding); + QGraphicsScene *old_scene = view->scene(); + view->setScene(this); + if (old_scene != nullptr) + delete old_scene; } diff --git a/qtmips_gui/coreview.h b/qtmips_gui/coreview.h index 8c0701e..fddcafe 100644 --- a/qtmips_gui/coreview.h +++ b/qtmips_gui/coreview.h @@ -11,14 +11,19 @@ #include "coreview/alu.h" class CoreView : public QGraphicsView { - Q_OBJECT public: - CoreView(QWidget *parent, machine::QtMipsMachine *machine); + CoreView(QWidget *parent); private: void resizeEvent(QResizeEvent *event); +}; + +class CoreViewScene : public QGraphicsScene { + Q_OBJECT +public: + CoreViewScene(CoreView *view, machine::QtMipsMachine *machine); - QGraphicsScene scene; +private: machine::QtMipsMachine *machine; coreview::ProgramCounter *pc; @@ -31,6 +36,6 @@ private: #else class CoreView; -class CoreViewBlock; +class CoreViewScene; #endif // COREVIEW_H diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp index 6a507fa..9e1902a 100644 --- a/qtmips_gui/mainwindow.cpp +++ b/qtmips_gui/mainwindow.cpp @@ -1,13 +1,17 @@ #include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { + machine = nullptr; + corescene = nullptr; settings = new QSettings("CTU", "QtMips"); - coreview = nullptr; ui = new Ui::MainWindow(); ui->setupUi(this); setWindowTitle("QtMips"); + // Prepare empty core view + coreview = new CoreView(this); + this->setCentralWidget(coreview); // Create/prepare other widgets ndialog = new NewDialog(this, settings); cache_content = new CacheContentDock(this); @@ -32,6 +36,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { MainWindow::~MainWindow() { settings->sync(); delete settings; + if (corescene != nullptr) + delete corescene; if (coreview != nullptr) delete coreview; delete ndialog; @@ -49,22 +55,34 @@ void MainWindow::start() { } void MainWindow::create_core(machine::MachineConfig *config) { + // Remove old machine + if (machine != nullptr) + delete machine; // Create machine machine = new machine::QtMipsMachine(config); // Create machine view - coreview = new CoreView(this, machine); - this->setCentralWidget(coreview); + corescene = new CoreViewScene(coreview, machine); - machine->set_speed(1000); // Set default speed to 1 sec + //machine->set_speed(1000); // Set default speed to 1 sec + machine->set_speed(0); - // Connect machine signals + // Connect machine signals and slots connect(ui->actionRun, SIGNAL(triggered(bool)), machine, SLOT(play())); connect(ui->actionPause, SIGNAL(triggered(bool)), machine, SLOT(pause())); connect(ui->actionStep, SIGNAL(triggered(bool)), machine, SLOT(step())); connect(ui->actionRestart, SIGNAL(triggered(bool)), machine, SLOT(restart())); + connect(machine, SIGNAL(status_change(machine::QtMipsMachine::Status)), this, SLOT(machine_status(machine::QtMipsMachine::Status))); + connect(machine, SIGNAL(program_exit()), this, SLOT(machine_exit())); + connect(machine, SIGNAL(program_trap(machine::QtMipsException&)), this, SLOT(machine_trap(machine::QtMipsException&))); // Setup docks registers->setup(machine); + // Set status to ready + machine_status(machine::QtMipsMachine::ST_READY); +} + +bool MainWindow::configured() { + return (machine != nullptr); } void MainWindow::new_machine() { @@ -83,15 +101,10 @@ void MainWindow::show_registers() { show_dockwidget(registers); } -bool MainWindow::configured() { - return (machine != nullptr); -} - void MainWindow::closeEvent(QCloseEvent *event) { settings->setValue("windowGeometry", saveGeometry()); settings->setValue("windowState", saveState()); settings->sync(); - QMainWindow::closeEvent(event); } void MainWindow::show_dockwidget(QDockWidget *dw) { @@ -103,3 +116,53 @@ void MainWindow::show_dockwidget(QDockWidget *dw) { dw->setFocus(); } } + +void MainWindow::machine_status(enum machine::QtMipsMachine::Status st) { + QString status; + switch (st) { + case machine::QtMipsMachine::ST_READY: + ui->actionPause->setEnabled(false); + ui->actionRun->setEnabled(true); + ui->actionStep->setEnabled(true); + status = "Ready"; + break; + case machine::QtMipsMachine::ST_RUNNING: + ui->actionPause->setEnabled(true); + ui->actionRun->setEnabled(false); + ui->actionStep->setEnabled(false); + status = "Running"; + break; + case machine::QtMipsMachine::ST_BUSY: + // Busy is not interesting (in such case we should just be running + return; + case machine::QtMipsMachine::ST_EXIT: + // machine_exit is called so we disable controls in that + status = "Exited"; + break; + case machine::QtMipsMachine::ST_TRAPPED: + // machine_trap is called so we disable controls in that + status = "Trapped"; + break; + default: + status = "Unknown"; + break; + } + ui->statusBar->showMessage(status); +} + +void MainWindow::machine_exit() { + ui->actionPause->setEnabled(false); + ui->actionRun->setEnabled(false); + ui->actionStep->setEnabled(false); +} + +void MainWindow::machine_trap(machine::QtMipsException &e) { + machine_exit(); + + QMessageBox msg(this); + msg.setText(e.msg(false)); + msg.setIcon(QMessageBox::Critical); + msg.setDetailedText(e.msg(true)); + msg.setWindowTitle("Machine trapped"); + msg.exec(); +} diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h index 8b9e3e7..6f588ac 100644 --- a/qtmips_gui/mainwindow.h +++ b/qtmips_gui/mainwindow.h @@ -23,14 +23,18 @@ public: void start(); void create_core(machine::MachineConfig *config); + bool configured(); + public slots: + // Actions signals void new_machine(); - void show_cache_content(); void show_cache_statictics(); void show_registers(); - - bool configured(); + // Machine signals + void machine_status(enum machine::QtMipsMachine::Status st); + void machine_exit(); + void machine_trap(machine::QtMipsException &e); protected: void closeEvent(QCloseEvent *event); @@ -41,6 +45,7 @@ private: NewDialog *ndialog; CoreView *coreview; + CoreViewScene *corescene; CacheContentDock *cache_content; CacheStatisticsDock *cache_statictics; diff --git a/qtmips_gui/registersdock.cpp b/qtmips_gui/registersdock.cpp index 20eb9e4..5d965ca 100644 --- a/qtmips_gui/registersdock.cpp +++ b/qtmips_gui/registersdock.cpp @@ -3,8 +3,10 @@ RegistersDock::RegistersDock(QWidget *parent) : QDockWidget(parent) { regs = nullptr; - widg = new QScrollArea(this); + scrollarea = new QScrollArea(this); + widg = new QWidget(scrollarea); layout = new QFormLayout(widg); + layout->setSizeConstraint(QLayout::SetMinAndMaxSize); #define INIT(X, LABEL) do{ \ X = new QLabel(widg); \ @@ -17,10 +19,13 @@ RegistersDock::RegistersDock(QWidget *parent) : QDockWidget(parent) { INIT(gp[i], QString("GP") + QString::number(i) + QString(" ($") + QString::number(i) + QString("):")); INIT(lo, "LO:"); INIT(hi, "HI:"); - #undef INIT + widg->setLayout(layout); + scrollarea->setWidget(widg); - setWidget(widg); + setWidget(scrollarea); + setObjectName("Registers"); + setWindowTitle("Registers"); } RegistersDock::~RegistersDock() { diff --git a/qtmips_gui/registersdock.h b/qtmips_gui/registersdock.h index 654983e..3504608 100644 --- a/qtmips_gui/registersdock.h +++ b/qtmips_gui/registersdock.h @@ -24,7 +24,8 @@ private slots: private: const machine::Registers *regs; - QScrollArea *widg; + QWidget *widg; + QScrollArea *scrollarea; QFormLayout *layout; QLabel *pc; |