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.cpp151
1 files changed, 82 insertions, 69 deletions
diff --git a/qtmips_gui/coreview/memory.cpp b/qtmips_gui/coreview/memory.cpp
index cde1c72..8f1669d 100644
--- a/qtmips_gui/coreview/memory.cpp
+++ b/qtmips_gui/coreview/memory.cpp
@@ -4,114 +4,127 @@
using namespace coreview;
//////////////////////
-#define WIDTH 680
-#define HEIGHT 30
+#define WIDTH 60
+#define HEIGHT 80
+#define CACHE_HEIGHT 50
#define PENW 1
//////////////////////
-Memory::Memory(machine::QtMipsMachine *machine) : QGraphicsObject(nullptr) {
- 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);
-
- // 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
+Memory::Memory(machine::QtMipsMachine *machine) : QGraphicsObject(nullptr), name("Memory", this), type(this) {
+ cache = false;
QFont font;
font.setPointSize(7);
+ name.setFont(font);
+ type.setFont(font);
- // 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);
+ const QRectF &name_box = name.boundingRect();
+ name.setPos(WIDTH/2 - name_box.width()/2, HEIGHT - (HEIGHT - CACHE_HEIGHT)/2);
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 {
return QRectF(-PENW / 2, -PENW / 2, WIDTH + PENW, HEIGHT + PENW);
}
void Memory::paint(QPainter *painter, const QStyleOptionGraphicsItem *option __attribute__((unused)), QWidget *widget __attribute__((unused))) {
painter->drawRect(0, 0, WIDTH, HEIGHT);
- // TODO cache
+ if (cache)
+ painter->drawLine(0, CACHE_HEIGHT, WIDTH, CACHE_HEIGHT);
}
-void Memory::setPos(qreal x, qreal y) {
- QGraphicsObject::setPos(x, y);
+void Memory::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) {
+ QGraphicsObject::mouseDoubleClickEvent(event);
+
+ if (cache && event->pos().y() < HEIGHT/2)
+ emit open_cache();
+ else
+ emit open_mem();
+}
- con_pc->setPos(x + 30, y);
- con_inst->setPos(x + 40, y);
+void Memory::set_type(const QString &text) {
+ type.setText(text);
+ const QRectF &box = type.boundingRect();
+ type.setPos(WIDTH/2 - box.width()/2, HEIGHT - (HEIGHT - CACHE_HEIGHT)/2 - box.height());
+}
+
+ProgramMemory::ProgramMemory(machine::QtMipsMachine *machine) : Memory(machine) {
+ cache = machine->config().cache_program().enabled();
+ set_type("Program");
- 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);
+ con_address = new Connector(0);
+ con_inst = new Connector(M_PI);
}
-const Connector *Memory::connector_pc() const {
- return con_pc;
+ProgramMemory::~ProgramMemory() {
+ delete con_address;
+ delete con_inst;
}
-const Connector *Memory::connector_inst() const {
+void ProgramMemory::setPos(qreal x, qreal y) {
+ QGraphicsObject::setPos(x, y);
+
+ con_address->setPos(x, y + 20);
+ con_inst->setPos(x + WIDTH, y + 20);
+}
+
+const Connector *ProgramMemory::connector_address() const {
+ return con_address;
+}
+
+const Connector *ProgramMemory::connector_instruction() const {
return con_inst;
}
-const Connector *Memory::connector_address() const {
+DataMemory::DataMemory(machine::QtMipsMachine *machine) : Memory(machine) {
+ cache = machine->config().cache_data().enabled();
+ set_type("Data");
+
+ con_address = new Connector(0);
+ con_data_out = new Connector(M_PI);
+ con_data_in = new Connector(0);
+ con_req_write = new Connector(M_PI_2);
+ con_req_read = new Connector(M_PI_2);
+}
+
+DataMemory::~DataMemory() {
+ delete con_address;
+ delete con_data_out;
+ delete con_data_in;
+ delete con_req_write;
+ delete con_req_read;
+}
+
+void DataMemory::setPos(qreal x, qreal y) {
+ QGraphicsObject::setPos(x, y);
+
+ con_address->setPos(x, y + 20);
+ con_data_out->setPos(x + WIDTH, y + 20);
+ if (cache)
+ con_data_in->setPos(x, y + 40);
+ else
+ con_data_in->setPos(x, y + 60);
+ con_req_write->setPos(x + 40, y);
+ con_req_read->setPos(x + 50, y);
+}
+
+const Connector *DataMemory::connector_address() const {
return con_address;
}
-const Connector *Memory::connector_data_out() const {
+const Connector *DataMemory::connector_data_out() const {
return con_data_out;
}
-const Connector *Memory::connector_data_in() const {
+const Connector *DataMemory::connector_data_in() const {
return con_data_in;
}
-const Connector *Memory::connector_req_write() const {
+const Connector *DataMemory::connector_req_write() const {
return con_req_write;
}
-const Connector *Memory::connector_req_read() const {
+const Connector *DataMemory::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
- emit open_data_mem();
-}