aboutsummaryrefslogtreecommitdiff
path: root/qtmips_gui/coreview/memory.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_gui/coreview/memory.cpp')
-rw-r--r--qtmips_gui/coreview/memory.cpp124
1 files changed, 90 insertions, 34 deletions
diff --git a/qtmips_gui/coreview/memory.cpp b/qtmips_gui/coreview/memory.cpp
index c732687..13355db 100644
--- a/qtmips_gui/coreview/memory.cpp
+++ b/qtmips_gui/coreview/memory.cpp
@@ -1,63 +1,119 @@
#include "memory.h"
+#include <cmath>
using namespace coreview;
//////////////////////
-#define WIDTH 80
-#define HEIGHT 100
+#define WIDTH 680
+#define HEIGHT 30
#define PENW 1
//////////////////////
Memory::Memory(machine::QtMipsMachine *machine) : QGraphicsObject(nullptr) {
-#define CON_INIT(X) do { \
- X.in = new Connector(); \
- X.out = new Connector(); \
- X.read = new Connector(); \
- X.write = new Connector(); \
- } while(false)
- CON_INIT(con_program);
- CON_INIT(con_data);
-#undef CON_INIT
- // TODO cache?
+ con_pc = new Connector(M_PI_2);
+ con_inst = new Connector(M_PI_2);
+ con_address = new Connector(M_PI_2);
+ con_data_in = new Connector(M_PI_2);
+ con_data_out = new Connector(M_PI_2);
+ con_req_write = new Connector(M_PI_2);
+ con_req_read = new Connector(M_PI_2);
+
+ if (machine->config().cache()) {
+ // TODO cache?
+ }
+
+ name = new QGraphicsSimpleTextItem("Memory", this);
+ QRectF name_box = name->boundingRect();
+ name->setPos(WIDTH/2 - name_box.width()/2, HEIGHT/2 - name_box.height()/2);
+
+ // TODO add labels for connections
+
+ QFont font;
+ font.setPointSize(7);
+
+ // TODO better placement
+ name_program = new QGraphicsSimpleTextItem("Program", this);
+ name_box = name_program->boundingRect();
+ name_program->setPos(1, HEIGHT - 1 - name_box.height());
+ name_program->setFont(font);
+
+ name_data = new QGraphicsSimpleTextItem("Data", this);
+ name_box = name_data->boundingRect();
+ name_data->setPos(WIDTH - 1 - name_box.width(), HEIGHT - 1 - name_box.height());
+ name_data->setFont(font);
+
+ setPos(x(), y()); // set connector's position
+}
+
+Memory::~Memory() {
+ delete con_pc;
+ delete con_inst;
+ delete con_address;
+ delete con_data_out;
+ delete con_data_in;
+ delete con_req_write;
+ delete con_req_read;
+
+ delete name;
+ delete name_program;
+ delete name_data;
}
QRectF Memory::boundingRect() const {
- // TODO
+ return QRectF(-PENW / 2, -PENW / 2, WIDTH + PENW, HEIGHT + PENW);
}
void Memory::paint(QPainter *painter, const QStyleOptionGraphicsItem *option __attribute__((unused)), QWidget *widget __attribute__((unused))) {
- // TODO
+ painter->drawRect(0, 0, WIDTH, HEIGHT);
+ // TODO cache
}
void Memory::setPos(qreal x, qreal y) {
QGraphicsObject::setPos(x, y);
- // TODO con
+
+ con_pc->setPos(x + 30, y);
+ con_inst->setPos(x + 40, y);
+
+ con_address->setPos(x + WIDTH - 70, y);
+ con_data_in->setPos(x + WIDTH - 60, y);
+ con_req_write->setPos(x + WIDTH- 50, y);
+ con_req_read->setPos(x + WIDTH - 40, y);
+ con_data_out->setPos(x + WIDTH - 30, y);
}
-const Connector *Memory::connector_in(bool program) const {
- if (program)
- return con_program.in;
- else
- return con_data.in;
+const Connector *Memory::connector_pc() const {
+ return con_pc;
}
-const Connector *Memory::connector_out(bool program) const {
- if (program)
- return con_program.out;
- else
- return con_data.out;
+const Connector *Memory::connector_inst() const {
+ return con_inst;
}
-const Connector *Memory::connector_read(bool program) const {
- if (program)
- return con_program.read;
- else
- return con_data.read;
+const Connector *Memory::connector_address() const {
+ return con_address;
+}
+
+const Connector *Memory::connector_data_out() const {
+ return con_data_out;
+}
+
+const Connector *Memory::connector_data_in() const {
+ return con_data_in;
+}
+
+const Connector *Memory::connector_req_write() const {
+ return con_req_write;
}
-const Connector *Memory::connector_write(bool program) const {
- if (program)
- return con_program.write;
+const Connector *Memory::connector_req_read() const {
+ return con_req_read;
+}
+
+void Memory::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
+ QGraphicsObject::mouseDoubleClickEvent(event);
+
+ if (event->pos().x() < WIDTH/2)
+ emit open_program_mem();
else
- return con_data.write;
+ emit open_data_mem();
}