diff options
Diffstat (limited to 'qtmips_gui/coreview/memory.cpp')
-rw-r--r-- | qtmips_gui/coreview/memory.cpp | 151 |
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(); -} |