package datapath.graph.operations; import datapath.graph.OperationVisitor; /** * Shift operation with constant shift amount * @author jh */ public class ConstantShift extends UnaryOperation { private int shiftAmount; private ShiftMode mode; public void setMode(ShiftMode mode) { this.mode = mode; } public ConstantShift(int shiftAmount, ShiftMode mode) { assert shiftAmount >= 0; this.shiftAmount = shiftAmount; this.mode = mode; } @Override public int getOutputBitsize() { return getData().getOutputBitsize(); } @Override public int getDelay() { // combinatorical op return 0; } @Override public int getStageDelay() { // combinatorical op return 0; } @Override public String getDisplayLabel() { ShiftMode m = mode; switch (m) { case Right: if(isSigned()) m = ShiftMode.SignedRight; else m = ShiftMode.UnsignedRight; } switch (m) { case Left: return "<< " + shiftAmount; case SignedRight: return ">>> " + shiftAmount; case UnsignedRight: return ">> " + shiftAmount; default: return ("shift mode " + mode + " not supported"); } } public void setShiftAmount(int shiftAmount) { this.shiftAmount = shiftAmount; } @Override public void visit(OperationVisitor visitor) { visitor.visit(this); } public ShiftMode getMode() { return mode; } public int getShiftAmount() { return shiftAmount; } }