aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/programdock.cpp
blob: 974e5ad69d3649837b532d03e08fd3cd3e570e58 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "programdock.h"
#include "qtmipsexception.h"

ProgramView::ProgramView(QWidget *parent) : MemoryView(parent) {
    cb_single = new QComboBox(this);
    cb_single->addItems({
        "Don't follow",
        "Follow executing instruction"
    });
    cb_single->setCurrentIndex(1);
    cb_single->hide();
    layout->addWidget(cb_single);
    connect(cb_single, SIGNAL(currentIndexChanged(int)), this, SLOT(cb_single_changed(int)));

    cb_pipelined = new QComboBox(this);
    cb_pipelined->addItems({
        "Don't follow",
        "Follow Instruction fetch stage",
        "Follow Instruction decode stage",
        "Follow Execution stage",
        "Follow Memory access stage",
        "Follow Registers write back stage",
    });
    cb_pipelined->hide();
    cb_pipelined->setCurrentIndex(1);
    layout->addWidget(cb_pipelined);
    connect(cb_pipelined, SIGNAL(currentIndexChanged(int)), this, SLOT(cb_pipelined_changed(int)));
}

void ProgramView::setup(machine::QtMipsMachine *machine) {
    MemoryView::setup(machine);
    if (machine == nullptr)
        return;

    bool pipelined = machine->config().pipelined();
    cb_single->setVisible(!pipelined);
    cb_pipelined->setVisible(pipelined);
    // Sync selection somewhat
    if (pipelined) {
        if (cb_single->currentIndex() == 0)
            cb_pipelined->setCurrentIndex(0);
        else if (cb_pipelined->currentIndex() == 0)
            cb_pipelined->setCurrentIndex(1);
    } else
        cb_single->setCurrentIndex(cb_pipelined->currentIndex() == 0 ? 0 : 1);
}

void ProgramView::jump_to_pc(std::uint32_t addr) {
    set_focus(addr);
}

QList<QWidget*> ProgramView::row_widget(std::uint32_t address, QWidget *parent) {
    QList<QWidget*> widgs;
    QLabel *l;

    QFont f;
    f.setStyleHint(QFont::Monospace);

    l = new QLabel(" ", parent);
    l->setFont(f);
    widgs.append(l);

    l = new QLabel(QString("0x") + QString("%1").arg(address, 8, 16, QChar('0')).toUpper(), parent);
    l->setTextInteractionFlags(Qt::TextSelectableByMouse);
    l->setFont(f);
    widgs.append(l);

    l = new QLabel(parent);
    l->setTextInteractionFlags(Qt::TextSelectableByMouse);
    l->setFont(f);
    l->setMinimumWidth(60);
    if (memory != nullptr)
        l->setText(machine::Instruction(memory->read_word(address)).to_str());
    widgs.append(l);

    return widgs;
}

void ProgramView::cb_single_changed(int index) {
    // TODO set memory view
}

void ProgramView::cb_pipelined_changed(int index) {
    // TODO set memory view
}

ProgramDock::ProgramDock(QWidget *parent) : QDockWidget(parent) {
    view = new ProgramView(this);
    setWidget(view);

    setObjectName("Program");
    setWindowTitle("Program");
}

void ProgramDock::setup(machine::QtMipsMachine *machine) {
    view->setup(machine);
}

void ProgramDock::jump_to_pc(std::uint32_t addr) {
    view->jump_to_pc(addr);
}