diff options
author | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-02-11 17:45:47 +0100 |
---|---|---|
committer | Pavel Pisa <pisa@cmp.felk.cvut.cz> | 2019-02-11 17:45:47 +0100 |
commit | 10f4d52221438f0d5ce7cc72c5b6c1f6720ef5c6 (patch) | |
tree | 2bf2cf63384a5d83d29ccbd036ea8ca30a84918e /qtmips_gui/programdock.cpp | |
parent | 745a2aff8602a48b723a8d2ebf54b0e92cd17b30 (diff) | |
download | qtmips-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.cpp | 68 |
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]); } |