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 \ | 
