diff options
Diffstat (limited to 'qtmips_gui')
-rw-r--r-- | qtmips_gui/coreview.cpp | 43 | ||||
-rw-r--r-- | qtmips_gui/coreview.h | 20 | ||||
-rw-r--r-- | qtmips_gui/graphicsview.cpp | 36 | ||||
-rw-r--r-- | qtmips_gui/graphicsview.h | 20 | ||||
-rw-r--r-- | qtmips_gui/mainwindow.cpp | 2 | ||||
-rw-r--r-- | qtmips_gui/mainwindow.h | 2 | ||||
-rw-r--r-- | qtmips_gui/qtmips_gui.pro | 2 |
7 files changed, 69 insertions, 56 deletions
diff --git a/qtmips_gui/coreview.cpp b/qtmips_gui/coreview.cpp index 66ad933..d32f4aa 100644 --- a/qtmips_gui/coreview.cpp +++ b/qtmips_gui/coreview.cpp @@ -7,41 +7,6 @@ #define SC_HEIGHT 540 ////////////////////////////////////////////////////////////////////////////// -CoreView::CoreView(QWidget *parent) : QGraphicsView(parent) { - setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); -} - -void CoreView::setScene(QGraphicsScene *scene) { - QGraphicsView::setScene(scene); - update_scale(); -} - -void CoreView::resizeEvent(QResizeEvent *event) { - QGraphicsView::resizeEvent(event); - update_scale(); -} - -void CoreView::update_scale() { - if (scene() == nullptr) - return; // Skip if we have no scene - - // Note: there is somehow three pixels error when viewing so we have to always compensate - const int w = scene()->width() + 3; - const int h = scene()->height() + 3; - - qreal scale = 1; - if (height() > h && width() > w) { - if (height() > width()) { - scale = (qreal)width() / w; - } else { - scale = (qreal)height() / h; - } - } - QTransform t; - t.scale(scale, scale); - setTransform(t, false); -} - #define NEW_B(TYPE, VAR, ...) do { \ VAR = new coreview::TYPE(__VA_ARGS__);\ addItem(VAR);\ @@ -55,7 +20,7 @@ void CoreView::update_scale() { connect(machine->core(), SIGNAL(SIG), VAR, SLOT(instruction_update(const machine::Instruction&))); \ } while(false) -CoreViewScene::CoreViewScene(CoreView *view, machine::QtMipsMachine *machine) : QGraphicsScene(view) { +CoreViewScene::CoreViewScene(GraphicsView *view, machine::QtMipsMachine *machine) : QGraphicsScene(view) { setSceneRect(0, 0, SC_WIDTH, SC_HEIGHT); // Elements // @@ -133,6 +98,8 @@ CoreViewScene::CoreViewScene(CoreView *view, machine::QtMipsMachine *machine) : connect(mem_data, SIGNAL(open_mem()), this, SIGNAL(request_data_memory())); connect(ft.pc, SIGNAL(open_program()), this, SIGNAL(request_program_memory())); connect(ft.pc, SIGNAL(jump_to_pc(std::uint32_t)), this, SIGNAL(request_jump_to_program_counter(std::uint32_t))); + connect(mem_program, SIGNAL(open_cache()), this, SIGNAL(request_cache_program())); + connect(mem_data, SIGNAL(open_cache()), this, SIGNAL(request_cache_data())); } CoreViewScene::~CoreViewScene() { @@ -160,7 +127,7 @@ coreview::Signal *CoreViewScene::new_signal(const coreview::Connector *a, const return c; } -CoreViewSceneSimple::CoreViewSceneSimple(CoreView *view, machine::QtMipsMachine *machine) : CoreViewScene(view, machine) { +CoreViewSceneSimple::CoreViewSceneSimple(GraphicsView *view, machine::QtMipsMachine *machine) : CoreViewScene(view, machine) { NEW_I(instr_prim, 230, 60, instruction_fetched(const machine::Instruction&)); if (machine->config().delay_slot()) { NEW(Latch, delay_slot_latch, 55, 470, machine, 25); @@ -226,7 +193,7 @@ CoreViewSceneSimple::CoreViewSceneSimple(CoreView *view, machine::QtMipsMachine con->setAxes({CON_AXIS_Y(430), CON_AXIS_X(500), CON_AXIS_Y(210)}); } -CoreViewScenePipelined::CoreViewScenePipelined(CoreView *view, machine::QtMipsMachine *machine) : CoreViewScene(view, machine) { +CoreViewScenePipelined::CoreViewScenePipelined(GraphicsView *view, machine::QtMipsMachine *machine) : CoreViewScene(view, machine) { NEW(Latch, latch_if_id, 158, 70, machine, 400); latch_if_id->setTitle("IF/ID"); NEW(Latch, latch_id_ex, 392, 70, machine, 400); diff --git a/qtmips_gui/coreview.h b/qtmips_gui/coreview.h index 9fdf0a3..8935d41 100644 --- a/qtmips_gui/coreview.h +++ b/qtmips_gui/coreview.h @@ -4,6 +4,7 @@ #include <QGraphicsView> #include <QGraphicsScene> #include "qtmipsmachine.h" +#include "graphicsview.h" #include "coreview/connection.h" #include "coreview/programcounter.h" #include "coreview/multiplexer.h" @@ -18,22 +19,10 @@ #include "coreview/logicblock.h" #include "coreview/and.h" -class CoreView : public QGraphicsView { -public: - CoreView(QWidget *parent); - - void setScene(QGraphicsScene *scene); - -protected: - void resizeEvent(QResizeEvent *event); -private: - void update_scale(); -}; - class CoreViewScene : public QGraphicsScene { Q_OBJECT public: - CoreViewScene(CoreView *view, machine::QtMipsMachine *machine); + CoreViewScene(GraphicsView *view, machine::QtMipsMachine *machine); ~CoreViewScene(); signals: @@ -86,7 +75,7 @@ protected: class CoreViewSceneSimple : public CoreViewScene { public: - CoreViewSceneSimple(CoreView *view, machine::QtMipsMachine *machine); + CoreViewSceneSimple(GraphicsView *view, machine::QtMipsMachine *machine); private: coreview::InstructionView *instr_prim, *instr_delay; @@ -95,7 +84,7 @@ private: class CoreViewScenePipelined : public CoreViewScene { public: - CoreViewScenePipelined(CoreView *view, machine::QtMipsMachine *machine); + CoreViewScenePipelined(GraphicsView *view, machine::QtMipsMachine *machine); private: coreview::Latch *latch_if_id, *latch_id_ex, *latch_ex_mem, *latch_mem_wb; @@ -105,7 +94,6 @@ private: #else -class CoreView; class CoreViewScene; class CoreViewSceneSimple; class CoreViewScenePipelined; diff --git a/qtmips_gui/graphicsview.cpp b/qtmips_gui/graphicsview.cpp new file mode 100644 index 0000000..6ef118d --- /dev/null +++ b/qtmips_gui/graphicsview.cpp @@ -0,0 +1,36 @@ +#include "graphicsview.h" + +GraphicsView::GraphicsView(QWidget *parent) : QGraphicsView(parent) { + setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); +} + +void GraphicsView::setScene(QGraphicsScene *scene) { + QGraphicsView::setScene(scene); + update_scale(); +} + +void GraphicsView::resizeEvent(QResizeEvent *event) { + QGraphicsView::resizeEvent(event); + update_scale(); +} + +void GraphicsView::update_scale() { + if (scene() == nullptr) + return; // Skip if we have no scene + + // Note: there is somehow three pixels error when viewing so we have to always compensate + const int w = scene()->width() + 3; + const int h = scene()->height() + 3; + + qreal scale = 1; + if (height() > h && width() > w) { + if (height() > width()) { + scale = (qreal)width() / w; + } else { + scale = (qreal)height() / h; + } + } + QTransform t; + t.scale(scale, scale); + setTransform(t, false); +} diff --git a/qtmips_gui/graphicsview.h b/qtmips_gui/graphicsview.h new file mode 100644 index 0000000..6b16d40 --- /dev/null +++ b/qtmips_gui/graphicsview.h @@ -0,0 +1,20 @@ +#ifndef GRAPHICSVIEW_H +#define GRAPHICSVIEW_H + +#include <QGraphicsView> +#include <QGraphicsScene> + +class GraphicsView : public QGraphicsView { +public: + GraphicsView(QWidget *parent); + + void setScene(QGraphicsScene *scene); + +protected: + void resizeEvent(QResizeEvent *event); + +private: + void update_scale(); +}; + +#endif // GRAPHICSVIEW_H diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp index ce6f52c..b61c0e5 100644 --- a/qtmips_gui/mainwindow.cpp +++ b/qtmips_gui/mainwindow.cpp @@ -10,7 +10,7 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { setWindowTitle("QtMips"); // Prepare empty core view - coreview = new CoreView(this); + coreview = new GraphicsView(this); this->setCentralWidget(coreview); // Create/prepare other widgets ndialog = new NewDialog(this, settings); diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h index 3c1cf9f..acfeb05 100644 --- a/qtmips_gui/mainwindow.h +++ b/qtmips_gui/mainwindow.h @@ -50,7 +50,7 @@ private: NewDialog *ndialog; - CoreView *coreview; + GraphicsView *coreview; CoreViewScene *corescene; RegistersDock *registers; diff --git a/qtmips_gui/qtmips_gui.pro b/qtmips_gui/qtmips_gui.pro index 2d8ba78..e12eaef 100644 --- a/qtmips_gui/qtmips_gui.pro +++ b/qtmips_gui/qtmips_gui.pro @@ -37,6 +37,7 @@ SOURCES += \ coreview/and.cpp \ statictable.cpp \ cachedock.cpp \ + graphicsview.cpp HEADERS += \ mainwindow.h \ @@ -61,6 +62,7 @@ HEADERS += \ coreview/and.h \ statictable.h \ cachedock.h \ + graphicsview.h FORMS += \ NewDialog.ui \ |