aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/programdock.cpp
diff options
context:
space:
mode:
authorPavel Pisa <pisa@cmp.felk.cvut.cz>2019-02-11 17:45:47 +0100
committerPavel Pisa <pisa@cmp.felk.cvut.cz>2019-02-11 17:45:47 +0100
commit10f4d52221438f0d5ce7cc72c5b6c1f6720ef5c6 (patch)
tree2bf2cf63384a5d83d29ccbd036ea8ca30a84918e /qtmips_gui/programdock.cpp
parent745a2aff8602a48b723a8d2ebf54b0e92cd17b30 (diff)
downloadqtmips-10f4d52221438f0d5ce7cc72c5b6c1f6720ef5c6.tar.gz
qtmips-10f4d52221438f0d5ce7cc72c5b6c1f6720ef5c6.tar.bz2
qtmips-10f4d52221438f0d5ce7cc72c5b6c1f6720ef5c6.zip
Extend program view to support selected stage followup.
Signed-off-by: Pavel Pisa <pisa@cmp.felk.cvut.cz>
Diffstat (limited to 'qtmips_gui/programdock.cpp')
-rw-r--r--qtmips_gui/programdock.cpp68
1 files changed, 66 insertions, 2 deletions
diff --git a/qtmips_gui/programdock.cpp b/qtmips_gui/programdock.cpp
index 39a3f77..a355b22 100644
--- a/qtmips_gui/programdock.cpp
+++ b/qtmips_gui/programdock.cpp
@@ -50,11 +50,23 @@ ProgramDock::ProgramDock(QWidget *parent, QSettings *settings) : Super(parent) {
setObjectName("Program");
setWindowTitle("Program");
+ this->settings = settings;
+ follow_source = (enum FollowSource)
+ settings->value("ProgramViewFollowSource", 0).toInt();
+
+ for (int i = 0; i < FOLLOWSRC_COUNT; i++)
+ follow_addr[i] = 0;
+
QWidget *content = new QWidget();
QComboBox *follow_inst = new QComboBox();
- follow_inst->addItem("Follow - none");
- follow_inst->addItem("Follow - fetch");
+ follow_inst->addItem("Follow none");
+ follow_inst->addItem("Follow fetch");
+ follow_inst->addItem("Follow decode");
+ follow_inst->addItem("Follow execute");
+ follow_inst->addItem("Follow memory");
+ follow_inst->addItem("Follow writeback");
+ follow_inst->setCurrentIndex((int)follow_source);
QTableView *program_content = new ProgramTableView(0, settings);
// program_content->setSizePolicy();
@@ -81,8 +93,60 @@ ProgramDock::ProgramDock(QWidget *parent, QSettings *settings) : Super(parent) {
go_edit, SLOT(set_value(std::uint32_t)));
connect(this, SIGNAL(jump_to_pc(std::uint32_t)),
program_content, SLOT(go_to_address(std::uint32_t)));
+ connect(follow_inst, SIGNAL(currentIndexChanged(int)),
+ this, SLOT(set_follow_inst(int)));
+ connect(this, SIGNAL(focus_addr(std::uint32_t)),
+ program_content, SLOT(focus_address(std::uint32_t)));
}
void ProgramDock::setup(machine::QtMipsMachine *machine) {
+ std::uint32_t pc;
emit machine_setup(machine);
+ if (machine == nullptr)
+ return;
+ pc = machine->registers()->read_pc();
+ for (int i = 0; i < FOLLOWSRC_COUNT; i++)
+ follow_addr[i] = pc;
+ update_follow_position();
+}
+
+void ProgramDock::set_follow_inst(int follow) {
+ follow_source = (enum FollowSource)follow;
+ settings->setValue("ProgramViewFollowSource", (int)follow_source);
+ update_follow_position();
+}
+
+void ProgramDock::fetch_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_FETCH] = addr;
+ if (follow_source == FOLLOWSRC_FETCH)
+ update_follow_position();
+}
+
+void ProgramDock::decode_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_DECODE] = addr;
+ if (follow_source == FOLLOWSRC_DECODE)
+ update_follow_position();
+}
+
+void ProgramDock::execute_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_EXECUTE] = addr;
+ if (follow_source == FOLLOWSRC_EXECUTE)
+ update_follow_position();
+}
+
+void ProgramDock::memory_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_MEMORY] = addr;
+ if (follow_source == FOLLOWSRC_MEMORY)
+ update_follow_position();
+}
+
+void ProgramDock::writeback_inst_addr(std::uint32_t addr) {
+ follow_addr[FOLLOWSRC_WRITEBACK] = addr;
+ if (follow_source == FOLLOWSRC_WRITEBACK)
+ update_follow_position();
+}
+
+void ProgramDock::update_follow_position() {
+ if (follow_source != FOLLOWSRC_NONE)
+ emit focus_addr(follow_addr[follow_source]);
}