aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarel Kočí <cynerd@email.cz>2018-01-04 18:44:28 +0100
committerKarel Kočí <cynerd@email.cz>2018-01-04 18:44:28 +0100
commitc06242f07721a7d86dc2d9795622d6646ae6c88f (patch)
tree55a264c093ce4e7719e87c9ac187635f9f97df63
parent5eccfdab52973f9be9e38c65c17a33e8d2428692 (diff)
downloadqtmips-c06242f07721a7d86dc2d9795622d6646ae6c88f.tar.gz
qtmips-c06242f07721a7d86dc2d9795622d6646ae6c88f.tar.bz2
qtmips-c06242f07721a7d86dc2d9795622d6646ae6c88f.zip
Implement some machine execution speed control for gui
-rw-r--r--qtmips_gui/MainWindow.ui69
-rw-r--r--qtmips_gui/mainwindow.cpp28
-rw-r--r--qtmips_gui/mainwindow.h4
-rw-r--r--qtmips_machine/qtmipsmachine.cpp8
4 files changed, 67 insertions, 42 deletions
diff --git a/qtmips_gui/MainWindow.ui b/qtmips_gui/MainWindow.ui
index 56f5319..0ab35d1 100644
--- a/qtmips_gui/MainWindow.ui
+++ b/qtmips_gui/MainWindow.ui
@@ -73,22 +73,14 @@
<property name="title">
<string>Machine</string>
</property>
- <widget class="QMenu" name="menuSimulation_speed">
- <property name="title">
- <string>Simulation speed</string>
- </property>
- <addaction name="action1_ips"/>
- <addaction name="action2_ips"/>
- <addaction name="action5_ips"/>
- <addaction name="action10_ips"/>
- <addaction name="actionOther_ips"/>
- <addaction name="separator"/>
- <addaction name="actionUnlimited"/>
- </widget>
<addaction name="actionRun"/>
<addaction name="actionPause"/>
<addaction name="actionStep"/>
- <addaction name="menuSimulation_speed"/>
+ <addaction name="separator"/>
+ <addaction name="ips1"/>
+ <addaction name="ips5"/>
+ <addaction name="ips10"/>
+ <addaction name="ipsUnlimited"/>
<addaction name="separator"/>
<addaction name="actionRestart"/>
</widget>
@@ -119,6 +111,10 @@
<addaction name="actionRun"/>
<addaction name="actionPause"/>
<addaction name="actionStep"/>
+ <addaction name="separator"/>
+ <addaction name="ips1"/>
+ <addaction name="ips10"/>
+ <addaction name="ipsUnlimited"/>
</widget>
<action name="actionNew">
<property name="icon">
@@ -188,42 +184,48 @@
<string>Ctrl+P</string>
</property>
</action>
- <action name="action1_ips">
+ <action name="ips1">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
<property name="text">
<string>1 instruction per second</string>
</property>
- </action>
- <action name="action2_ips">
- <property name="text">
- <string>2 instructions per second</string>
+ <property name="toolTip">
+ <string>Run CPU in speed of single instruction per second</string>
</property>
</action>
- <action name="action5_ips">
+ <action name="ips5">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
<property name="text">
<string>5 instructions per second</string>
</property>
+ <property name="toolTip">
+ <string>Run CPU in speed of 5 instructions per second</string>
+ </property>
</action>
- <action name="action10_ips">
+ <action name="ips10">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
<property name="text">
<string>10 instructions per second</string>
</property>
- </action>
- <action name="actionUnlimited">
- <property name="text">
- <string>Unlimited</string>
+ <property name="toolTip">
+ <string>Run CPU in speed of 10 instructions per second</string>
</property>
</action>
- <action name="actionOther_ips">
+ <action name="ipsUnlimited">
<property name="checkable">
- <bool>false</bool>
+ <bool>true</bool>
</property>
<property name="text">
- <string>Custom...</string>
+ <string>Unlimited</string>
</property>
- </action>
- <action name="actionMachine_control">
- <property name="text">
- <string>Machine control</string>
+ <property name="toolTip">
+ <string>Run CPU without any clock constrains</string>
</property>
</action>
<action name="actionMemory">
@@ -251,11 +253,6 @@
<string>Registers</string>
</property>
</action>
- <action name="actionAssembler">
- <property name="text">
- <string>Assembler</string>
- </property>
- </action>
<action name="actionReload">
<property name="icon">
<iconset resource="icons.qrc">
diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp
index 9384890..d1a9770 100644
--- a/qtmips_gui/mainwindow.cpp
+++ b/qtmips_gui/mainwindow.cpp
@@ -21,12 +21,24 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
registers = new RegistersDock(this);
registers->hide();
+ // Execution speed actions
+ speed_group = new QActionGroup(this);
+ speed_group->addAction(ui->ips1);
+ speed_group->addAction(ui->ips5);
+ speed_group->addAction(ui->ips10);
+ speed_group->addAction(ui->ipsUnlimited);
+ ui->ips1->setChecked(true);
+
// Connect signals from menu
connect(ui->actionExit, SIGNAL(triggered(bool)), this, SLOT(close()));
connect(ui->actionNew, SIGNAL(triggered(bool)), this, SLOT(new_machine()));
connect(ui->actionCache, SIGNAL(triggered(bool)), this, SLOT(show_cache_content()));
connect(ui->actionCache_statistics, SIGNAL(triggered(bool)), this, SLOT(show_cache_statictics()));
connect(ui->actionRegisters, SIGNAL(triggered(bool)), this, SLOT(show_registers()));
+ connect(ui->ips1, SIGNAL(toggled(bool)), this, SLOT(set_speed()));
+ connect(ui->ips5, SIGNAL(toggled(bool)), this, SLOT(set_speed()));
+ connect(ui->ips10, SIGNAL(toggled(bool)), this, SLOT(set_speed()));
+ connect(ui->ipsUnlimited, SIGNAL(toggled(bool)), this, SLOT(set_speed()));
// Restore application state from settings
restoreState(settings->value("windowState").toByteArray());
@@ -63,7 +75,7 @@ void MainWindow::create_core(machine::MachineConfig *config) {
// Create machine view
corescene = new CoreViewScene(coreview, machine);
- machine->set_speed(1000); // Set default speed to 1 sec
+ set_speed(); // Update machine speed to current settings
// Connect machine signals and slots
connect(ui->actionRun, SIGNAL(triggered(bool)), machine, SLOT(play()));
@@ -100,6 +112,20 @@ void MainWindow::show_registers() {
show_dockwidget(registers);
}
+void MainWindow::set_speed() {
+ if (machine == nullptr)
+ return; // just ignore
+
+ if (ui->ips1->isChecked())
+ machine->set_speed(1000);
+ else if (ui->ips5->isChecked())
+ machine->set_speed(500);
+ else if (ui->ips10->isChecked())
+ machine->set_speed(100);
+ else
+ machine->set_speed(0);
+}
+
void MainWindow::closeEvent(QCloseEvent *event) {
settings->setValue("windowGeometry", saveGeometry());
settings->setValue("windowState", saveState());
diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h
index 6f588ac..d2ab9bb 100644
--- a/qtmips_gui/mainwindow.h
+++ b/qtmips_gui/mainwindow.h
@@ -31,6 +31,8 @@ public slots:
void show_cache_content();
void show_cache_statictics();
void show_registers();
+ // Actions - execution speed
+ void set_speed();
// Machine signals
void machine_status(enum machine::QtMipsMachine::Status st);
void machine_exit();
@@ -51,6 +53,8 @@ private:
CacheStatisticsDock *cache_statictics;
RegistersDock *registers;
+ QActionGroup *speed_group;
+
QSettings *settings;
machine::QtMipsMachine *machine; // Current simulated machine
diff --git a/qtmips_machine/qtmipsmachine.cpp b/qtmips_machine/qtmipsmachine.cpp
index 3d79c7c..a652363 100644
--- a/qtmips_machine/qtmipsmachine.cpp
+++ b/qtmips_machine/qtmipsmachine.cpp
@@ -35,15 +35,13 @@ QtMipsMachine::QtMipsMachine(const MachineConfig &cc) {
else
cr = new CoreSingle(regs, coremem, cc.delay_slot());
- run_speed = 1;
run_t = new QTimer(this);
+ set_speed(0); // In default run as fast as possible
connect(run_t, SIGNAL(timeout()), this, SLOT(step()));
}
void QtMipsMachine::set_speed(unsigned val) {
- run_speed = val;
- if (run_t->isActive())
- play();
+ run_t->setInterval(val);
}
const Registers *QtMipsMachine::registers() {
@@ -78,7 +76,7 @@ bool QtMipsMachine::exited() {
void QtMipsMachine::play() {
CTL_GUARD;
set_status(ST_RUNNING);
- run_t->start(run_speed);
+ run_t->start();
}
void QtMipsMachine::pause() {