diff options
-rw-r--r-- | qtmips_gui/coreview.cpp | 87 | ||||
-rw-r--r-- | qtmips_gui/coreview.h | 10 | ||||
-rw-r--r-- | qtmips_gui/coreview/adder.cpp | 6 | ||||
-rw-r--r-- | qtmips_gui/coreview/alu.cpp | 8 | ||||
-rw-r--r-- | qtmips_gui/coreview/alu.h | 1 | ||||
-rw-r--r-- | qtmips_gui/coreview/and.cpp | 53 | ||||
-rw-r--r-- | qtmips_gui/coreview/and.h | 29 | ||||
-rw-r--r-- | qtmips_gui/coreview/connection.cpp | 95 | ||||
-rw-r--r-- | qtmips_gui/coreview/connection.h | 54 | ||||
-rw-r--r-- | qtmips_gui/coreview/constant.cpp | 4 | ||||
-rw-r--r-- | qtmips_gui/coreview/junction.cpp | 16 | ||||
-rw-r--r-- | qtmips_gui/coreview/junction.h | 5 | ||||
-rw-r--r-- | qtmips_gui/coreview/latch.cpp | 4 | ||||
-rw-r--r-- | qtmips_gui/coreview/logicblock.cpp | 2 | ||||
-rw-r--r-- | qtmips_gui/coreview/memory.cpp | 14 | ||||
-rw-r--r-- | qtmips_gui/coreview/multiplexer.cpp | 14 | ||||
-rw-r--r-- | qtmips_gui/coreview/multiplexer.h | 3 | ||||
-rw-r--r-- | qtmips_gui/coreview/programcounter.cpp | 4 | ||||
-rw-r--r-- | qtmips_gui/coreview/registers.cpp | 14 | ||||
-rw-r--r-- | qtmips_gui/qtmips_gui.pro | 6 |
20 files changed, 319 insertions, 110 deletions
diff --git a/qtmips_gui/coreview.cpp b/qtmips_gui/coreview.cpp index ad1572b..6b85cfe 100644 --- a/qtmips_gui/coreview.cpp +++ b/qtmips_gui/coreview.cpp @@ -77,8 +77,9 @@ CoreViewScene::CoreViewScene(CoreView *view, machine::QtMipsMachine *machine) : NEW(Adder, ft.adder, 100, 330); struct coreview::Latch::ConnectorPair pc_latch_pair = ft.latch->new_connector(10); NEW_B(Constant, ft.adder_4, ft.adder->connector_in_b(), "4"); - NEW(Junction, ft.junction, 80, mem_program->connector_address()->y()); - NEW(Multiplexer, ft.multiplex, 20, 390, 4); + NEW(Junction, ft.junc_pc, 80, mem_program->connector_address()->y()); + NEW(Junction, ft.junc_pc_4, 130, 380); + NEW(Multiplexer, ft.multiplex, 20, 390, 2); // Decode stage NEW(LogicBlock, dc.ctl_block, 230, 90, {"Control", "unit"}); dc.ctl_block->setSize(35, 70); @@ -87,6 +88,11 @@ CoreViewScene::CoreViewScene(CoreView *view, machine::QtMipsMachine *machine) : NEW(Adder, dc.add, 320, 390); const coreview::Connector *dc_con_sign_ext = dc.sign_ext->new_connector(1, 0); NEW(Junction, dc.j_sign_ext, 270, dc_con_sign_ext->y()); + NEW(LogicBlock, dc.cmp, 320, 200, "="); + NEW(And, dc.and_branch, 350, 190); + dc.cmp->setSize(24, 12); + NEW(Junction, dc.j_inst_up, 180, 126); + NEW(Junction, dc.j_inst_down, 180, dc_con_sign_ext->y()); // Execute stage NEW(Alu, alu, 470, 230); // Memory stage @@ -95,17 +101,30 @@ CoreViewScene::CoreViewScene(CoreView *view, machine::QtMipsMachine *machine) : // Connections // coreview::Connection *con; // Fetch stage - new_connection(ft.pc->connector_out(), pc_latch_pair.in); - new_connection(pc_latch_pair.out, ft.junction->new_connector(0)); - new_connection(ft.junction->new_connector(M_PI_2), ft.adder->connector_in_a()); - new_connection(ft.junction->new_connector(M_PI), mem_program->connector_address()); - new_connection(ft.multiplex->connector_out(), ft.pc->connector_in()); - con = new_connection(ft.adder->connector_out(), ft.multiplex->connector_in(0)); - con->setAxes({CON_AXIS_Y(130), CON_AXIS_X(380), CON_AXIS_Y(10)}); + new_bus(ft.pc->connector_out(), pc_latch_pair.in); + new_bus(pc_latch_pair.out, ft.junc_pc->new_connector(coreview::Connector::AX_X)); + new_bus(ft.junc_pc->new_connector(coreview::Connector::AX_Y), ft.adder->connector_in_a()); + new_bus(ft.junc_pc->new_connector(coreview::Connector::AX_X), mem_program->connector_address()); + new_bus(ft.multiplex->connector_out(), ft.pc->connector_in()); + new_bus(ft.adder->connector_out(), ft.junc_pc_4->new_connector(coreview::Connector::AX_Y)); + con = new_bus(ft.junc_pc_4->new_connector(coreview::Connector::AX_X), ft.multiplex->connector_in(0)); + con->setAxes({CON_AXIS_Y(10)}); // Decode stage - new_connection(dc_con_sign_ext, dc.j_sign_ext->new_connector(0)); - new_connection(dc.j_sign_ext->new_connector(-M_PI_2), dc.shift2->new_connector(-1, 0)); - new_connection(dc.shift2->new_connector(1, 0), dc.add->connector_in_a()); + new_bus(dc_con_sign_ext, dc.j_sign_ext->new_connector(coreview::Connector::AX_X)); + new_bus(dc.j_sign_ext->new_connector(coreview::Connector::AX_Y), dc.shift2->new_connector(-1, 0)); + new_bus(dc.shift2->new_connector(1, 0), dc.add->connector_in_a()); + con = new_signal(dc.cmp->new_connector(1, 0), dc.and_branch->connector_in(1)); + con->setAxes({CON_AXIS_Y(343)}); + con = new_signal(dc.ctl_block->new_connector(1, 0.9), dc.and_branch->connector_in(0)); + con->setAxes({CON_AXIS_Y(343)}); + dc.instr_bus = new_bus(dc.j_inst_up->new_connector(coreview::Connector::AX_Y), dc.j_inst_down->new_connector(coreview::Connector::AX_Y)); + new_bus(dc.j_inst_up->new_connector(coreview::Connector::AX_X), dc.ctl_block->new_connector(-1, 0), 2); + new_bus(dc.j_inst_down->new_connector(coreview::Connector::AX_X), dc.sign_ext->new_connector(-1, 0), 2); + // From decode stage to fetch stage + con = new_signal(dc.and_branch->connector_out(), ft.multiplex->connector_ctl()); + con->setAxes({CON_AXIS_Y(365), CON_AXIS_X(490)}); + con = new_bus(dc.add->connector_out(), ft.multiplex->connector_in(1)); + con->setAxes({CON_AXIS_Y(340), CON_AXIS_X(480), CON_AXIS_Y(10)}); connect(regs, SIGNAL(open_registers()), this, SIGNAL(request_registers())); connect(mem_program, SIGNAL(open_mem()), this, SIGNAL(request_program_memory())); @@ -120,9 +139,16 @@ CoreViewScene::~CoreViewScene() { delete ft.latch; delete ft.adder; delete ft.adder_4; - delete ft.junction; + delete ft.junc_pc; + delete ft.junc_pc_4; delete ft.multiplex; delete dc.ctl_block; + delete dc.sign_ext; + delete dc.shift2; + delete dc.cmp; + delete dc.add; + delete dc.j_sign_ext; + delete dc.and_branch; delete alu; delete mem_program; delete mem_data; @@ -137,6 +163,21 @@ coreview::Connection *CoreViewScene::new_connection(const coreview::Connector *a return c; } +coreview::Bus *CoreViewScene::new_bus(const coreview::Connector *a, const coreview::Connector *b, unsigned width) { + coreview::Bus *c = new coreview::Bus(a, b, width); + connections.append(c); + addItem(c); + return c; +} + +coreview::Signal *CoreViewScene::new_signal(const coreview::Connector *a, const coreview::Connector *b) { + coreview::Signal *c = new coreview::Signal(a, b); + connections.append(c); + addItem(c); + c->setZValue(-1); // hide connections under neath the items + return c; +} + CoreViewSceneSimple::CoreViewSceneSimple(CoreView *view, machine::QtMipsMachine *machine) : CoreViewScene(view, machine) { NEW(Latch, delay_slot_latch, 160, 50, machine, 150); } @@ -146,13 +187,13 @@ CoreViewSceneSimple::~CoreViewSceneSimple() { } CoreViewScenePipelined::CoreViewScenePipelined(CoreView *view, machine::QtMipsMachine *machine) : CoreViewScene(view, machine) { - NEW(Latch, latch_if_id, 158, 90, machine, 400); + NEW(Latch, latch_if_id, 158, 90, machine, 380); latch_if_id->setTitle("IF/ID"); - NEW(Latch, latch_id_ex, 392, 90, machine, 400); + NEW(Latch, latch_id_ex, 392, 90, machine, 380); latch_id_ex->setTitle("ID/EX"); - NEW(Latch, latch_ex_mem, 536, 90, machine, 400); + NEW(Latch, latch_ex_mem, 536, 90, machine, 380); latch_ex_mem->setTitle("EX/MEM"); - NEW(Latch, latch_mem_wb, 680, 90, machine, 400); + NEW(Latch, latch_mem_wb, 680, 90, machine, 380); latch_mem_wb->setTitle("MEM/WB"); NEW_I(inst_fetch, 100, 2, instruction_fetched(const machine::Instruction&)); @@ -166,8 +207,16 @@ CoreViewScenePipelined::CoreViewScenePipelined(CoreView *view, machine::QtMipsMa hazard_unit->setSize(SC_WIDTH - 100, 12); } - struct coreview::Latch::ConnectorPair program_latch_pair = latch_if_id->new_connector(mem_program->connector_instruction()->y() - latch_if_id->y()); - new_connection(mem_program->connector_instruction(), program_latch_pair.in); + coreview::Connection *con; + // Fetch stage + struct coreview::Latch::ConnectorPair lp_ft_inst = latch_if_id->new_connector(mem_program->connector_instruction()->y() - latch_if_id->y()); + new_bus(mem_program->connector_instruction(), lp_ft_inst.in); + struct coreview::Latch::ConnectorPair lp_ft_pc = latch_if_id->new_connector(370); + new_bus(ft.junc_pc_4->new_connector(coreview::Connector::AX_Y), lp_ft_pc.in); + // Decode stage + //new_bus(lp_ft_inst.out, dc.instr_bus->new_connector(lp_ft_inst.out->point())); + con = new_bus(lp_ft_pc.out, dc.add->connector_in_b()); + con->setAxes({CON_AXIS_Y(270)}); } CoreViewScenePipelined::~CoreViewScenePipelined() { diff --git a/qtmips_gui/coreview.h b/qtmips_gui/coreview.h index ff2cbe2..edc970c 100644 --- a/qtmips_gui/coreview.h +++ b/qtmips_gui/coreview.h @@ -16,6 +16,7 @@ #include "coreview/junction.h" #include "coreview/constant.h" #include "coreview/logicblock.h" +#include "coreview/and.h" class CoreView : public QGraphicsView { public: @@ -49,19 +50,24 @@ protected: coreview::Latch *latch; coreview::Adder *adder; coreview::Constant *adder_4; - coreview::Junction *junction; + coreview::Junction *junc_pc, *junc_pc_4; coreview::Multiplexer *multiplex; } ft; struct { - coreview::LogicBlock *ctl_block, *sign_ext, *shift2; + coreview::LogicBlock *ctl_block, *sign_ext, *shift2, *cmp; coreview::Adder *add; coreview::Junction *j_sign_ext; + coreview::And *and_branch; + coreview::Junction *j_inst_up, *j_inst_down; + coreview::Bus *instr_bus; } dc; coreview::Alu *alu; coreview::Multiplexer *mem_or_reg; QVector<coreview::Connection*> connections; coreview::Connection *new_connection(const coreview::Connector*, const coreview::Connector*); + coreview::Bus *new_bus(const coreview::Connector*, const coreview::Connector*, unsigned width = 4); + coreview::Signal *new_signal(const coreview::Connector*, const coreview::Connector*); coreview::Connection *pc2pc_latch; coreview::Connection *pc_latch2pc_joint, *pc_joint2pc_adder, *pc_joint2mem; coreview::Connection *pc_multiplexer2pc; diff --git a/qtmips_gui/coreview/adder.cpp b/qtmips_gui/coreview/adder.cpp index cd227ab..4363f97 100644 --- a/qtmips_gui/coreview/adder.cpp +++ b/qtmips_gui/coreview/adder.cpp @@ -17,9 +17,9 @@ Adder::Adder() : QGraphicsItem(nullptr), plus("+", this) { QRectF plus_box = plus.boundingRect(); plus.setPos(DENT + (WIDTH-DENT)/2 - plus_box.width()/2, HEIGHT/2 - plus_box.height()/2); - con_in_a = new Connector(0); - con_in_b = new Connector(0); - con_out = new Connector(M_PI); + con_in_a = new Connector(Connector::AX_X); + con_in_b = new Connector(Connector::AX_X); + con_out = new Connector(Connector::AX_X); setPos(x(), y()); // set connector's position } diff --git a/qtmips_gui/coreview/alu.cpp b/qtmips_gui/coreview/alu.cpp index d49cab2..2f24210 100644 --- a/qtmips_gui/coreview/alu.cpp +++ b/qtmips_gui/coreview/alu.cpp @@ -14,10 +14,10 @@ coreview::Alu::Alu() : QGraphicsItem(nullptr), name("ALU", this) { font.setPointSize(7); name.setFont(font); - con_in_a = new Connector(0); - con_in_b = new Connector(0); - con_out = new Connector(M_PI); - con_ctl = new Connector(-M_PI_2); + con_in_a = new Connector(Connector::AX_X); + con_in_b = new Connector(Connector::AX_X); + con_out = new Connector(Connector::AX_X); + con_ctl = new Connector(Connector::AX_Y); setPos(x(), y()); // set connector's position } diff --git a/qtmips_gui/coreview/alu.h b/qtmips_gui/coreview/alu.h index 25d7351..288de87 100644 --- a/qtmips_gui/coreview/alu.h +++ b/qtmips_gui/coreview/alu.h @@ -2,7 +2,6 @@ #define COREVIEW_ALU_H #include <QGraphicsItem> -#include <qtmipsmachine.h> #include "connection.h" namespace coreview { diff --git a/qtmips_gui/coreview/and.cpp b/qtmips_gui/coreview/and.cpp new file mode 100644 index 0000000..f60dfcd --- /dev/null +++ b/qtmips_gui/coreview/and.cpp @@ -0,0 +1,53 @@ +#include "and.h" +#include <cmath> + +using namespace coreview; + +////////////////////// +#define GAP 5 +#define PENW 1 +////////////////////// + +And::And(unsigned size) : QGraphicsItem(nullptr) { + for (unsigned i = 0; i < size; i++) + connectors.append(new Connector(Connector::AX_X)); + con_out = new Connector(Connector::AX_X); + + setPos(x(), y()); // update connectors positions +} + +And::~And() { + delete con_out; + for (int i = 0; i < connectors.size(); i++) + delete connectors[i]; +} + +QRectF And::boundingRect() const { + qreal side = GAP * connectors.size(); + return QRectF(-PENW, -PENW, side + PENW, side + PENW); +} + +void And::paint(QPainter *painter, const QStyleOptionGraphicsItem *option __attribute__((unused)), QWidget *widget __attribute__((unused))) { + qreal size = GAP * connectors.size(); + painter->drawLine(0, 0, 0, size); + painter->drawLine(0, 0, size/2, 0); + painter->drawLine(0, size, size/2, size); + painter->drawArc(0, 0, size, size, 270 * 16, 180 * 16); +} + +void And::setPos(qreal x, qreal y) { + QGraphicsItem::setPos(x, y); + + qreal size = GAP * connectors.size(); + con_out->setPos(x + size, y + size/2); + for (int i = 0; i < connectors.size(); i++) + connectors[i]->setPos(x, y + GAP/2 + GAP*i); +} + +const Connector *And::connector_in(unsigned i) const { + return connectors[i]; +} + +const Connector *And::connector_out() const { + return con_out; +} diff --git a/qtmips_gui/coreview/and.h b/qtmips_gui/coreview/and.h new file mode 100644 index 0000000..ca0af30 --- /dev/null +++ b/qtmips_gui/coreview/and.h @@ -0,0 +1,29 @@ +#ifndef COREVIEW_AND_H +#define COREVIEW_AND_H + +#include <QGraphicsItem> +#include <QVector> +#include "connection.h" + +namespace coreview { + +class And : public QGraphicsItem { +public: + And(unsigned size = 2); + ~And(); + + QRectF boundingRect() const; + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + + void setPos(qreal x, qreal y); + const Connector *connector_in(unsigned) const; + const Connector *connector_out() const; + +private: + QVector<Connector*> connectors; + Connector* con_out; +}; + +} + +#endif // COREVIEW_AND_H diff --git a/qtmips_gui/coreview/connection.cpp b/qtmips_gui/coreview/connection.cpp index 71647e2..3355eed 100644 --- a/qtmips_gui/coreview/connection.cpp +++ b/qtmips_gui/coreview/connection.cpp @@ -3,14 +3,19 @@ using namespace coreview; -Connector::Connector(qreal angle) { - ang = angle; +Connector::Connector(enum Axis ax) { + this->ax = ax; } void Connector::setPos(qreal x, qreal y) { qx = x; qy = y; - emit updated(QPointF(qx, qy)); + emit updated(point()); + emit updated(vector()); +} + +enum Connector::Axis Connector::axis() const { + return ax; } qreal Connector::x() const { @@ -21,28 +26,34 @@ qreal Connector::y() const { return qy; } -QLineF Connector::vector() const { - return QLineF(point(), QPointF(x() + cos(ang), y() + sin(ang))); -} - QPointF Connector::point() const { return QPointF(qx, qy); } -qreal Connector::angle() const { - return ang; +QLineF Connector::vector() const { + QPointF p = point(); + switch (ax) { + case AX_X: + return QLineF(p, p + QPointF(1, 0)); + case AX_Y: + return QLineF(p, p + QPointF(0, 1)); + case AX_XY: + return QLineF(p, p + QPointF(1, 1)); + case AX_MXY: + return QLineF(p, p + QPoint(1, -1)); + } } Connection::Connection(const Connector *a, const Connector *b) : QGraphicsObject(nullptr) { pen_width = 1; - ang_start = a->angle(); - ang_end = b->angle(); + ax_start = a->vector(); + ax_end = a->vector(); - connect(a, SIGNAL(updated(QPointF)), this, SLOT(moved_start(QPointF))); - connect(b, SIGNAL(updated(QPointF)), this, SLOT(moved_end(QPointF))); - moved_start(a->point()); - moved_end(b->point()); + connect(a, SIGNAL(updated(QLineF)), this, SLOT(moved_start(QLineF))); + connect(b, SIGNAL(updated(QLineF)), this, SLOT(moved_end(QLineF))); + moved_start(a->vector()); + moved_end(b->vector()); } void Connection::setHasText(bool has) { @@ -65,13 +76,13 @@ void Connection::setAxes(QVector<QLineF> axes) { recalc_line(); } -void Connection::moved_start(QPointF p) { - p_start = p; +void Connection::moved_start(QLineF p) { + ax_start = p; recalc_line(); } -void Connection::moved_end(QPointF p) { - p_end = p; +void Connection::moved_end(QLineF p) { + ax_end = p; recalc_line(); } @@ -88,7 +99,9 @@ QRectF Connection::boundingRect() const { void Connection::paint(QPainter *painter, const QStyleOptionGraphicsItem *option __attribute__((unused)), QWidget *widget __attribute__((unused))) { QPen pen; pen.setWidth(pen_width); - // TODO color? + pen.setColor(color); + pen.setCapStyle(Qt::FlatCap); + pen.setJoinStyle(Qt::BevelJoin); painter->setPen(pen); painter->drawPolyline(QPolygonF(points)); @@ -97,20 +110,44 @@ void Connection::paint(QPainter *painter, const QStyleOptionGraphicsItem *option void Connection::recalc_line() { points.clear(); - points.append(p_start); + points.append(ax_start.p1()); - QLineF cur_l(p_start, QPointF(p_start.x() + cos(ang_start), p_start.y() + sin(ang_start))); + QLineF cur_l = ax_start; for (int i = 0; i < break_axes.size(); i++) { - recalc_line_add_point(cur_l, break_axes[i]); - cur_l = break_axes[i]; + if (recalc_line_add_point(cur_l, break_axes[i])) + cur_l = break_axes[i]; } - recalc_line_add_point(cur_l, QLineF(QPoint(p_end.x() + cos(ang_end), p_end.y() + sin(ang_end)), p_end)); + recalc_line_add_point(cur_l, ax_end); - points.append(p_end); + points.append(ax_end.p1()); } -void Connection::recalc_line_add_point(const QLineF &l1, const QLineF &l2) { +bool Connection::recalc_line_add_point(const QLineF &l1, const QLineF &l2) { QPointF intersec; - if (l1.intersect(l2, &intersec) != QLineF::NoIntersection) - points.append(intersec); + if (l1.intersect(l2, &intersec) == QLineF::NoIntersection) + return false; + points.append(intersec); + return true; +} + +Bus::Bus(const Connector *start, const Connector *end, unsigned width) : Connection(start, end) { + pen_width = width; +} + +const Connector *Bus::new_connector(qreal x, qreal y, enum Connector::Axis axis) { + Connector *c = new Connector(axis); + conns.append({ + .c = c, + .p = QPoint(x, y) + }); + // TODO update positions + return c; +} + +const Connector *Bus::new_connector(const QPointF &p, enum Connector::Axis axis) { + return new_connector(p.x(), p.y(), axis); +} + +Signal::Signal(const Connector *start, const Connector *end) : Connection(start, end) { + color = QColor(0, 0, 255); } diff --git a/qtmips_gui/coreview/connection.h b/qtmips_gui/coreview/connection.h index 0ee981e..88ad1da 100644 --- a/qtmips_gui/coreview/connection.h +++ b/qtmips_gui/coreview/connection.h @@ -10,21 +10,30 @@ namespace coreview { class Connector : public QObject { Q_OBJECT public: - Connector(qreal angle); + enum Axis { + AX_X, // X axis + AX_Y, // Y axis + AX_XY, // X=Y axis (45°) + AX_MXY // X=-Y axis (-45°) + }; + + Connector(enum Axis axis = AX_X); void setPos(qreal x, qreal y); + + enum Axis axis() const; qreal x() const; qreal y() const; + QPointF point() const; QLineF vector() const; - qreal angle() const; - signals: - void updated(QPointF); + void updated(QPointF point); + void updated(QLineF vector); private: - qreal ang; + enum Axis ax; qreal qx, qy; }; @@ -42,22 +51,43 @@ public: void setAxes(QVector<QLineF>); private slots: - void moved_start(QPointF); - void moved_end(QPointF); + void moved_start(QLineF); + void moved_end(QLineF); -private: +protected: QGraphicsSimpleTextItem *value; QVector<QPointF> points; - QPointF p_start, p_end; - qreal ang_start, ang_end; + QLineF ax_start, ax_end; QVector<QLineF> break_axes; QString text; int pen_width; + QColor color; - // TODO line width and possibly bus width void recalc_line(); - void recalc_line_add_point(const QLineF &l1, const QLineF &l2); + bool recalc_line_add_point(const QLineF &l1, const QLineF &l2); +}; + +class Bus : public Connection { +public: + Bus(const Connector *start, const Connector *end, unsigned width = 4); + + // This creates connector snapped to closes point to x,y that is on bus + const Connector *new_connector(qreal x, qreal y, enum Connector::Axis = Connector::AX_X); + const Connector *new_connector(const QPointF&, enum Connector::Axis = Connector::AX_X); + +protected: + struct con_pos { + Connector *c; + QPointF p; + }; + QVector<struct con_pos> conns; + // TODO because of this we have to overload setAxis function and update that in there +}; + +class Signal : public Connection { +public: + Signal(const Connector *start, const Connector *end); }; #define CON_AXIS_X(Y) QLineF(QPointF(0, Y), QPointF(1, Y)) diff --git a/qtmips_gui/coreview/constant.cpp b/qtmips_gui/coreview/constant.cpp index 2f39fce..433d842 100644 --- a/qtmips_gui/coreview/constant.cpp +++ b/qtmips_gui/coreview/constant.cpp @@ -12,8 +12,8 @@ Constant::Constant(const Connector *con, const QString &text) : QGraphicsObject( font.setPointSize(7); this->text.setFont(font); - con_our = new Connector(M_PI); - conn = new Connection(con_our, con); + con_our = new Connector(Connector::AX_X); + conn = new Bus(con_our, con, 2); connect(con, SIGNAL(updated(QPointF)), this, SLOT(ref_con_updated(QPointF))); ref_con_updated(con->point()); // update initial connector position } diff --git a/qtmips_gui/coreview/junction.cpp b/qtmips_gui/coreview/junction.cpp index 271284c..494aca6 100644 --- a/qtmips_gui/coreview/junction.cpp +++ b/qtmips_gui/coreview/junction.cpp @@ -6,7 +6,9 @@ using namespace coreview; #define DOT_SIZE 4 ////////////////////// -Junction::Junction() : QGraphicsItem(nullptr) { } +Junction::Junction(bool point) : QGraphicsItem(nullptr) { + this->point = point; +} Junction::~Junction() { for (int i = 0; i < cons.size(); i++) @@ -14,11 +16,17 @@ Junction::~Junction() { } QRectF Junction::boundingRect() const { - return QRectF(-DOT_SIZE/2, -DOT_SIZE/2, DOT_SIZE, DOT_SIZE); + if (point) + return QRectF(-DOT_SIZE/2, -DOT_SIZE/2, DOT_SIZE, DOT_SIZE); + else + return QRectF(); } void Junction::paint(QPainter *painter, const QStyleOptionGraphicsItem *option __attribute__((unused)), QWidget *widget __attribute__((unused))) { + if (!point) + return; painter->setBrush(QBrush(QColor(0, 0, 0))); + painter->setPen(QPen(Qt::NoPen)); // Disable pen (render only brush) painter->drawEllipse(-DOT_SIZE/2, -DOT_SIZE/2, DOT_SIZE, DOT_SIZE); } @@ -28,8 +36,8 @@ void Junction::setPos(qreal x, qreal y) { con->setPos(x, y); } -Connector *Junction::new_connector(qreal angle) { - Connector*n = new Connector(angle); +Connector *Junction::new_connector(enum Connector::Axis axis) { + Connector*n = new Connector(axis); cons.append(n); setPos(x(), y()); // set connector's position return n; diff --git a/qtmips_gui/coreview/junction.h b/qtmips_gui/coreview/junction.h index 1a8f5d7..2eaa732 100644 --- a/qtmips_gui/coreview/junction.h +++ b/qtmips_gui/coreview/junction.h @@ -10,17 +10,18 @@ namespace coreview { class Junction : public QGraphicsItem { public: - Junction(); + Junction(bool point = true); ~Junction(); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void setPos(qreal x, qreal y); - Connector *new_connector(qreal angle); + Connector *new_connector(enum Connector::Axis axis = Connector::AX_X); private: QList<Connector*> cons; + bool point; }; } diff --git a/qtmips_gui/coreview/latch.cpp b/qtmips_gui/coreview/latch.cpp index c3bab4f..e3d8ef5 100644 --- a/qtmips_gui/coreview/latch.cpp +++ b/qtmips_gui/coreview/latch.cpp @@ -69,8 +69,8 @@ void Latch::setPos(qreal x, qreal y) { struct Latch::ConnectorPair Latch::new_connector(qreal cy) { SANITY_ASSERT(cy < height, "Latch: Trying to create connector outside of latch height"); ConnectorPair cp; - cp.in = new Connector(0); - cp.out = new Connector(M_PI); + cp.in = new Connector(Connector::AX_X); + cp.out = new Connector(Connector::AX_X); connectors.append(cp); connectors_off.append(cy); setPos(x(), y()); // Update connectors position diff --git a/qtmips_gui/coreview/logicblock.cpp b/qtmips_gui/coreview/logicblock.cpp index 1ee9a18..2e74a77 100644 --- a/qtmips_gui/coreview/logicblock.cpp +++ b/qtmips_gui/coreview/logicblock.cpp @@ -78,7 +78,7 @@ const Connector *LogicBlock::new_connector(qreal x, qreal y) { y = sign(y); // Note: we are using here that 0 and M_PI is same angle but different orientation (but we ignore orientation for now) - Connector *c = new Connector(fabs(x) > fabs(y) ? 0 : M_PI_2); + Connector *c = new Connector(fabs(x) > fabs(y) ? Connector::AX_X : Connector::AX_Y); connectors.append({ .con = c, .x = x, diff --git a/qtmips_gui/coreview/memory.cpp b/qtmips_gui/coreview/memory.cpp index 8f1669d..a2e5899 100644 --- a/qtmips_gui/coreview/memory.cpp +++ b/qtmips_gui/coreview/memory.cpp @@ -53,8 +53,8 @@ ProgramMemory::ProgramMemory(machine::QtMipsMachine *machine) : Memory(machine) cache = machine->config().cache_program().enabled(); set_type("Program"); - con_address = new Connector(0); - con_inst = new Connector(M_PI); + con_address = new Connector(Connector::AX_X); + con_inst = new Connector(Connector::AX_X); } ProgramMemory::~ProgramMemory() { @@ -81,11 +81,11 @@ 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); + con_address = new Connector(Connector::AX_X); + con_data_out = new Connector(Connector::AX_X); + con_data_in = new Connector(Connector::AX_X); + con_req_write = new Connector(Connector::AX_X); + con_req_read = new Connector(Connector::AX_X); } DataMemory::~DataMemory() { diff --git a/qtmips_gui/coreview/multiplexer.cpp b/qtmips_gui/coreview/multiplexer.cpp index 7429fda..b25e6d1 100644 --- a/qtmips_gui/coreview/multiplexer.cpp +++ b/qtmips_gui/coreview/multiplexer.cpp @@ -10,15 +10,15 @@ using namespace coreview; #define PENW 1 ////////////////////// -Multiplexer::Multiplexer(unsigned size) { +Multiplexer::Multiplexer(unsigned size, bool ctl_up) { this->size = size; seton = 0; - ctlfrom = false; - con_ctl = new Connector(M_PI_2); - con_out = new Connector(M_PI); + ctlfrom = ctl_up; + con_ctl = new Connector(Connector::AX_Y); + con_out = new Connector(Connector::AX_X); con_in = new Connector*[size]; for (unsigned i = 0; i < size; i++) - con_in[i] = new Connector(0); + con_in[i] = new Connector(Connector::AX_X); setPos(x(), y()); // Set connectors possitions } @@ -80,7 +80,3 @@ void Multiplexer::set(unsigned i) { update(); } -void Multiplexer::setCtl(bool up) { - ctlfrom = up; - setPos(x(), y()); // Update connectors -} diff --git a/qtmips_gui/coreview/multiplexer.h b/qtmips_gui/coreview/multiplexer.h index 2cfc90d..ad4fd0b 100644 --- a/qtmips_gui/coreview/multiplexer.h +++ b/qtmips_gui/coreview/multiplexer.h @@ -9,7 +9,7 @@ namespace coreview { class Multiplexer : public QGraphicsItem { public: - Multiplexer(unsigned size); + Multiplexer(unsigned size, bool ctl_up = false); ~Multiplexer(); QRectF boundingRect() const; @@ -21,7 +21,6 @@ public: const Connector *connector_in(unsigned i) const; // Inputs void set(unsigned i); // Set what value should be set as connected (indexing from 1 where 0 is no line) - void setCtl(bool up); // Set if control signal is from up or down (in default down) private: bool ctlfrom; diff --git a/qtmips_gui/coreview/programcounter.cpp b/qtmips_gui/coreview/programcounter.cpp index c43ff6d..ab7d49b 100644 --- a/qtmips_gui/coreview/programcounter.cpp +++ b/qtmips_gui/coreview/programcounter.cpp @@ -22,8 +22,8 @@ ProgramCounter::ProgramCounter(machine::QtMipsMachine *machine) : QGraphicsObjec connect(machine->registers(), SIGNAL(pc_update(std::uint32_t)), this, SLOT(pc_update(std::uint32_t))); - con_in = new Connector(-M_PI_2); - con_out = new Connector(M_PI_2); + con_in = new Connector(Connector::AX_Y); + con_out = new Connector(Connector::AX_Y); setPos(x(), y()); // To set initial connectors positions } diff --git a/qtmips_gui/coreview/registers.cpp b/qtmips_gui/coreview/registers.cpp index 87db32e..9a4fcff 100644 --- a/qtmips_gui/coreview/registers.cpp +++ b/qtmips_gui/coreview/registers.cpp @@ -10,13 +10,13 @@ using namespace coreview; ////////////////////// Registers::Registers() : QGraphicsObject(nullptr), name("Registers", this) { - con_read1 = new Connector(-M_PI_2); - con_read1_reg = new Connector(-M_PI_2); - con_read2 = new Connector(-M_PI_2); - con_read2_reg = new Connector(-M_PI_2); - con_write = new Connector(-M_PI_2); - con_write_reg = new Connector(-M_PI_2); - con_ctl_write = new Connector(-M_PI_2); + con_read1 = new Connector(Connector::AX_Y); + con_read1_reg = new Connector(Connector::AX_Y); + con_read2 = new Connector(Connector::AX_Y); + con_read2_reg = new Connector(Connector::AX_Y); + con_write = new Connector(Connector::AX_Y); + con_write_reg = new Connector(Connector::AX_Y); + con_ctl_write = new Connector(Connector::AX_Y); // TODO do we want to have any hooks on real registers? diff --git a/qtmips_gui/qtmips_gui.pro b/qtmips_gui/qtmips_gui.pro index a71509e..4767fe9 100644 --- a/qtmips_gui/qtmips_gui.pro +++ b/qtmips_gui/qtmips_gui.pro @@ -32,7 +32,8 @@ SOURCES += \ coreview/adder.cpp \ coreview/constant.cpp \ coreview/junction.cpp \ - coreview/logicblock.cpp + coreview/logicblock.cpp \ + coreview/and.cpp HEADERS += \ mainwindow.h \ @@ -53,7 +54,8 @@ HEADERS += \ coreview/adder.h \ coreview/constant.h \ coreview/junction.h \ - coreview/logicblock.h + coreview/logicblock.h \ + coreview/and.h FORMS += \ NewDialog.ui \ |