aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_gui')
-rw-r--r--qtmips_gui/NewDialog.ui9
-rw-r--r--qtmips_gui/mainwindow.cpp16
-rw-r--r--qtmips_gui/mainwindow.h5
-rw-r--r--qtmips_gui/newdialog.cpp10
-rw-r--r--qtmips_gui/newdialog.h1
5 files changed, 31 insertions, 10 deletions
diff --git a/qtmips_gui/NewDialog.ui b/qtmips_gui/NewDialog.ui
index e3423a4..ee30fc2 100644
--- a/qtmips_gui/NewDialog.ui
+++ b/qtmips_gui/NewDialog.ui
@@ -7,7 +7,7 @@
<x>0</x>
<y>0</y>
<width>558</width>
- <height>316</height>
+ <height>323</height>
</rect>
</property>
<property name="windowTitle">
@@ -81,6 +81,13 @@
</widget>
</item>
<item>
+ <widget class="QCheckBox" name="reset_at_compile">
+ <property name="text">
+ <string>Reset at compile time (reload after make)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
<spacer name="verticalSpacer_3">
<property name="orientation">
<enum>Qt::Vertical</enum>
diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp
index 210b8de..3af5e47 100644
--- a/qtmips_gui/mainwindow.cpp
+++ b/qtmips_gui/mainwindow.cpp
@@ -224,11 +224,12 @@ void MainWindow::show_hide_coreview(bool show) {
coreview->setScene(corescene);
}
-void MainWindow::create_core(const machine::MachineConfig &config, bool load_executable) {
+void MainWindow::create_core(const machine::MachineConfig &config, bool load_executable,
+ bool keep_memory) {
// Create machine
machine::QtMipsMachine *new_machine = new machine::QtMipsMachine(&config, true, load_executable);
- if (!load_executable && (machine != nullptr)) {
+ if (keep_memory && (machine != nullptr)) {
new_machine->memory_rw()->reset(*machine->memory());
}
@@ -309,13 +310,13 @@ void MainWindow::new_machine() {
ndialog->show();
}
-void MainWindow::machine_reload() {
+void MainWindow::machine_reload(bool force_memory_reset) {
if (machine == nullptr)
return new_machine();
bool load_executable = machine->executable_loaded();
machine::MachineConfig cnf(&machine->config()); // We have to make local copy as create_core will delete current machine
try {
- create_core(cnf, load_executable);
+ create_core(cnf, load_executable, !load_executable && !force_memory_reset);
} catch (const machine::QtMipsExceptionInput &e) {
QMessageBox msg(this);
msg.setText(e.msg(false));
@@ -714,20 +715,25 @@ void MainWindow::message_selected(messagetype::Type type, QString file, int line
}
void MainWindow::compile_source() {
- SymbolTableDb symtab(machine->symbol_table_rw(true));
bool error_occured = false;
if (current_srceditor == nullptr)
return;
+ if (machine != nullptr) {
+ if (machine->config().reset_at_compile())
+ machine_reload(true);
+ }
if (machine == nullptr) {
QMessageBox::critical(this, "QtMips Error", tr("No machine to store program."));
return;
}
+ SymbolTableDb symtab(machine->symbol_table_rw(true));
machine::MemoryAccess *mem = machine->physical_address_space_rw();
if (mem == nullptr) {
QMessageBox::critical(this, "QtMips Error", tr("No physical addresspace to store program."));
return;
}
QString filename = current_srceditor->filename();
+
machine->cache_sync();
SrcEditor *editor = current_srceditor;
QTextDocument *doc = editor->document();
diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h
index 95b3b59..d48ccda 100644
--- a/qtmips_gui/mainwindow.h
+++ b/qtmips_gui/mainwindow.h
@@ -64,7 +64,8 @@ public:
~MainWindow();
void start();
- void create_core(const machine::MachineConfig &config, bool load_executable = true);
+ void create_core(const machine::MachineConfig &config, bool load_executable = true,
+ bool keep_memory = false);
bool configured();
@@ -76,7 +77,7 @@ signals:
public slots:
// Actions signals
void new_machine();
- void machine_reload();
+ void machine_reload(bool force_memory_reset = false);
void print_action();
void new_source();
void open_source();
diff --git a/qtmips_gui/newdialog.cpp b/qtmips_gui/newdialog.cpp
index ef9dac3..def95fb 100644
--- a/qtmips_gui/newdialog.cpp
+++ b/qtmips_gui/newdialog.cpp
@@ -66,6 +66,7 @@ NewDialog::NewDialog(QWidget *parent, QSettings *settings) : QDialog(parent) {
connect(ui->preset_no_pipeline_cache, SIGNAL(toggled(bool)), this, SLOT(set_preset()));
connect(ui->preset_pipelined_bare, SIGNAL(toggled(bool)), this, SLOT(set_preset()));
connect(ui->preset_pipelined, SIGNAL(toggled(bool)), this, SLOT(set_preset()));
+ connect(ui->reset_at_compile, SIGNAL(clicked(bool)), this, SLOT(reset_at_compile_change(bool)));
connect(ui->pipelined, SIGNAL(clicked(bool)), this, SLOT(pipelined_change(bool)));
connect(ui->delay_slot, SIGNAL(clicked(bool)), this, SLOT(delay_slot_change(bool)));
@@ -126,7 +127,7 @@ void NewDialog::create() {
MainWindow *prnt = (MainWindow*)parent();
try {
- prnt->create_core(*config);
+ prnt->create_core(*config, true, false);
} catch (const machine::QtMipsExceptionInput &e) {
QMessageBox msg(this);
msg.setText(e.msg(false));
@@ -144,7 +145,7 @@ void NewDialog::create() {
void NewDialog::create_empty() {
MainWindow *prnt = (MainWindow*)parent();
- prnt->create_core(*config, false);
+ prnt->create_core(*config, false, true);
store_settings(); // Save to settings
this->close();
}
@@ -270,9 +271,14 @@ void NewDialog::osemu_fs_root_change(QString val) {
config->set_osemu_fs_root(val);
}
+void NewDialog::reset_at_compile_change(bool v) {
+ config->set_reset_at_compile(v);
+}
+
void NewDialog::config_gui() {
// Basic
ui->elf_file->setText(config->elf());
+ ui->reset_at_compile->setChecked(config->reset_at_compile());
// Core
ui->pipelined->setChecked(config->pipelined());
ui->delay_slot->setChecked(config->delay_slot());
diff --git a/qtmips_gui/newdialog.h b/qtmips_gui/newdialog.h
index 077b1ab..532f253 100644
--- a/qtmips_gui/newdialog.h
+++ b/qtmips_gui/newdialog.h
@@ -79,6 +79,7 @@ private slots:
void osemu_exception_stop_change(bool);
void browse_osemu_fs_root();
void osemu_fs_root_change(QString val);
+ void reset_at_compile_change(bool);
private:
Ui::NewDialog *ui;