Search in sources :

Example 86 with Direction

use of com.cburch.logisim.data.Direction in project logisim-evolution by reds-heig.

the class Multiplexer method paintInstance.

@Override
public void paintInstance(InstancePainter painter) {
    Graphics g = painter.getGraphics();
    Bounds bds = painter.getBounds();
    Direction facing = painter.getAttributeValue(StdAttr.FACING);
    BitWidth select = painter.getAttributeValue(Plexers.ATTR_SELECT);
    boolean enable = painter.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue();
    int inputs = 1 << select.getWidth();
    // draw stubs for select/enable inputs that aren't on instance boundary
    GraphicsUtil.switchToWidth(g, 3);
    boolean vertical = facing != Direction.NORTH && facing != Direction.SOUTH;
    Object selectLoc = painter.getAttributeValue(Plexers.ATTR_SELECT_LOC);
    int selMult = selectLoc == Plexers.SELECT_BOTTOM_LEFT ? 1 : -1;
    int dx = vertical ? 0 : -selMult;
    int dy = vertical ? selMult : 0;
    if (inputs == 2) {
        // draw select wire
        Location pt = painter.getInstance().getPortLocation(inputs);
        if (painter.getShowState()) {
            g.setColor(painter.getPortValue(inputs).getColor());
        }
        g.drawLine(pt.getX() - 2 * dx, pt.getY() - 2 * dy, pt.getX(), pt.getY());
    }
    if (enable) {
        Location en = painter.getInstance().getPortLocation(inputs + 1);
        if (painter.getShowState()) {
            g.setColor(painter.getPortValue(inputs + 1).getColor());
        }
        int len = inputs == 2 ? 6 : 4;
        g.drawLine(en.getX() - len * dx, en.getY() - len * dy, en.getX(), en.getY());
    }
    GraphicsUtil.switchToWidth(g, 1);
    // draw a circle indicating where the select input is located
    Multiplexer.drawSelectCircle(g, bds, painter.getInstance().getPortLocation(inputs));
    // draw a 0 indicating where the numbering starts for inputs
    int x0;
    int y0;
    int halign;
    if (facing == Direction.WEST) {
        x0 = bds.getX() + bds.getWidth() - 3;
        y0 = bds.getY() + 15 + (inputs == 2 ? 5 : 0);
        halign = GraphicsUtil.H_RIGHT;
    } else if (facing == Direction.NORTH) {
        x0 = bds.getX() + 10 + (inputs == 2 ? 5 : 0);
        y0 = bds.getY() + bds.getHeight() - 2;
        halign = GraphicsUtil.H_CENTER;
    } else if (facing == Direction.SOUTH) {
        x0 = bds.getX() + 10 + (inputs == 2 ? 5 : 0);
        y0 = bds.getY() + 12;
        halign = GraphicsUtil.H_CENTER;
    } else {
        x0 = bds.getX() + 3;
        y0 = bds.getY() + 15 + (inputs == 2 ? 5 : 0);
        halign = GraphicsUtil.H_LEFT;
    }
    g.setColor(Color.GRAY);
    GraphicsUtil.drawText(g, "0", x0, y0, halign, GraphicsUtil.V_BASELINE);
    // draw the trapezoid, "MUX" string, the individual ports
    g.setColor(Color.BLACK);
    if (inputs == 2) {
        if (facing == Direction.EAST || facing == Direction.WEST) {
            Plexers.drawTrapezoid(g, Bounds.create(bds.getX(), bds.getY() + 5, bds.getWidth(), bds.getHeight() - 10), facing, 10);
        } else {
            Plexers.drawTrapezoid(g, Bounds.create(bds.getX() + 5, bds.getY(), bds.getWidth() - 10, bds.getHeight()), facing, 10);
        }
    } else {
        Plexers.drawTrapezoid(g, bds, facing, 20);
    }
    GraphicsUtil.drawCenteredText(g, "MUX", bds.getX() + bds.getWidth() / 2, bds.getY() + bds.getHeight() / 2);
    painter.drawPorts();
}
Also used : Graphics(java.awt.Graphics) BitWidth(com.cburch.logisim.data.BitWidth) Bounds(com.cburch.logisim.data.Bounds) Direction(com.cburch.logisim.data.Direction) Location(com.cburch.logisim.data.Location)

Example 87 with Direction

use of com.cburch.logisim.data.Direction in project logisim-evolution by reds-heig.

the class Multiplexer method getOffsetBounds.

@Override
public Bounds getOffsetBounds(AttributeSet attrs) {
    Direction dir = attrs.getValue(StdAttr.FACING);
    BitWidth select = attrs.getValue(Plexers.ATTR_SELECT);
    int inputs = 1 << select.getWidth();
    if (inputs == 2) {
        return Bounds.create(-30, -25, 30, 50).rotate(Direction.EAST, dir, 0, 0);
    } else {
        int offs = -(inputs / 2) * 10 - 10;
        int length = inputs * 10 + 20;
        return Bounds.create(-40, offs, 40, length).rotate(Direction.EAST, dir, 0, 0);
    }
}
Also used : BitWidth(com.cburch.logisim.data.BitWidth) Direction(com.cburch.logisim.data.Direction)

Example 88 with Direction

use of com.cburch.logisim.data.Direction in project logisim-evolution by reds-heig.

the class Multiplexer method updatePorts.

private void updatePorts(Instance instance) {
    Direction dir = instance.getAttributeValue(StdAttr.FACING);
    Object selectLoc = instance.getAttributeValue(Plexers.ATTR_SELECT_LOC);
    BitWidth data = instance.getAttributeValue(StdAttr.WIDTH);
    BitWidth select = instance.getAttributeValue(Plexers.ATTR_SELECT);
    boolean enable = instance.getAttributeValue(Plexers.ATTR_ENABLE).booleanValue();
    int selMult = selectLoc == Plexers.SELECT_BOTTOM_LEFT ? 1 : -1;
    int inputs = 1 << select.getWidth();
    Port[] ps = new Port[inputs + (enable ? 3 : 2)];
    Location sel;
    if (inputs == 2) {
        Location end0;
        Location end1;
        if (dir == Direction.WEST) {
            end0 = Location.create(30, -10);
            end1 = Location.create(30, 10);
            sel = Location.create(20, selMult * 20);
        } else if (dir == Direction.NORTH) {
            end0 = Location.create(-10, 30);
            end1 = Location.create(10, 30);
            sel = Location.create(selMult * -20, 20);
        } else if (dir == Direction.SOUTH) {
            end0 = Location.create(-10, -30);
            end1 = Location.create(10, -30);
            sel = Location.create(selMult * -20, -20);
        } else {
            end0 = Location.create(-30, -10);
            end1 = Location.create(-30, 10);
            sel = Location.create(-20, selMult * 20);
        }
        ps[0] = new Port(end0.getX(), end0.getY(), Port.INPUT, data.getWidth());
        ps[1] = new Port(end1.getX(), end1.getY(), Port.INPUT, data.getWidth());
    } else {
        int dx = -(inputs / 2) * 10;
        int ddx = 10;
        int dy = -(inputs / 2) * 10;
        int ddy = 10;
        if (dir == Direction.WEST) {
            dx = 40;
            ddx = 0;
            sel = Location.create(20, selMult * (dy + 10 * inputs));
        } else if (dir == Direction.NORTH) {
            dy = 40;
            ddy = 0;
            sel = Location.create(selMult * dx, 20);
        } else if (dir == Direction.SOUTH) {
            dy = -40;
            ddy = 0;
            sel = Location.create(selMult * dx, -20);
        } else {
            dx = -40;
            ddx = 0;
            sel = Location.create(-20, selMult * (dy + 10 * inputs));
        }
        for (int i = 0; i < inputs; i++) {
            ps[i] = new Port(dx, dy, Port.INPUT, data.getWidth());
            dx += ddx;
            dy += ddy;
        }
    }
    Location en = sel.translate(dir, 10);
    ps[inputs] = new Port(sel.getX(), sel.getY(), Port.INPUT, select.getWidth());
    if (enable) {
        ps[inputs + 1] = new Port(en.getX(), en.getY(), Port.INPUT, BitWidth.ONE);
    }
    ps[ps.length - 1] = new Port(0, 0, Port.OUTPUT, data.getWidth());
    for (int i = 0; i < inputs; i++) {
        ps[i].setToolTip(Strings.getter("multiplexerInTip", "" + i));
    }
    ps[inputs].setToolTip(Strings.getter("multiplexerSelectTip"));
    if (enable) {
        ps[inputs + 1].setToolTip(Strings.getter("multiplexerEnableTip"));
    }
    ps[ps.length - 1].setToolTip(Strings.getter("multiplexerOutTip"));
    instance.setPorts(ps);
}
Also used : BitWidth(com.cburch.logisim.data.BitWidth) Port(com.cburch.logisim.instance.Port) Direction(com.cburch.logisim.data.Direction) Location(com.cburch.logisim.data.Location)

Example 89 with Direction

use of com.cburch.logisim.data.Direction in project logisim-evolution by reds-heig.

the class PriorityEncoder method getOffsetBounds.

@Override
public Bounds getOffsetBounds(AttributeSet attrs) {
    Direction dir = attrs.getValue(StdAttr.FACING);
    BitWidth select = attrs.getValue(Plexers.ATTR_SELECT);
    int inputs = 1 << select.getWidth();
    int offs = -5 * inputs;
    int len = 10 * inputs + 10;
    if (dir == Direction.NORTH) {
        return Bounds.create(offs, 0, len, 40);
    } else if (dir == Direction.SOUTH) {
        return Bounds.create(offs, -40, len, 40);
    } else if (dir == Direction.WEST) {
        return Bounds.create(0, offs, 40, len);
    } else {
        // dir == Direction.EAST
        return Bounds.create(-40, offs, 40, len);
    }
}
Also used : BitWidth(com.cburch.logisim.data.BitWidth) Direction(com.cburch.logisim.data.Direction)

Aggregations

Direction (com.cburch.logisim.data.Direction)89 Location (com.cburch.logisim.data.Location)39 Bounds (com.cburch.logisim.data.Bounds)27 BitWidth (com.cburch.logisim.data.BitWidth)20 Graphics (java.awt.Graphics)20 Graphics2D (java.awt.Graphics2D)13 Port (com.cburch.logisim.instance.Port)10 Instance (com.cburch.logisim.instance.Instance)9 ArrayList (java.util.ArrayList)7 CanvasObject (com.cburch.draw.model.CanvasObject)5 Color (java.awt.Color)5 Font (java.awt.Font)5 HashMap (java.util.HashMap)5 Map (java.util.Map)5 AttributeSet (com.cburch.logisim.data.AttributeSet)4 FontMetrics (java.awt.FontMetrics)4 List (java.util.List)4 Wire (com.cburch.logisim.circuit.Wire)3 Attribute (com.cburch.logisim.data.Attribute)3 Value (com.cburch.logisim.data.Value)3