/** shifts an immediate into the low-order bits of the data latch */
public static class Shift extends Instruction {
- public final BitVector immediate;
- public Shift(Dock dock, BitVector immediate) { this(dock, Predicate.Default, immediate); }
- public Shift(Dock dock, Predicate predicate, BitVector immediate) {
+ public final DeferredBitVector immediate;
+ public Shift(Dock dock, DeferredBitVector immediate) { this(dock, Predicate.Default, immediate); }
+ public Shift(final Dock dock, Predicate predicate, final DeferredBitVector arg) {
super(dock, predicate);
- this.immediate = immediate;
- this.immediate.setImmutable();
- if (immediate.length() != dock.getShip().getFleet().getShiftWidth())
- throw new RuntimeException("attempt to create a Shift instruction with a "+immediate.length()+
- "-bit immediate on a Fleet that uses "+dock.getShip().getFleet().getShiftWidth()+
- "-bit shift instructions");
+ this.immediate = new DeferredBitVector() {
+ public BitVector getBitVector() {
+ BitVector ret = arg.getBitVector();
+ if (ret.length() != dock.getShip().getFleet().getShiftWidth())
+ throw new RuntimeException("attempt to create a Shift instruction with a "+ret.length()+
+ "-bit immediate on a Fleet that uses "+dock.getShip().getFleet().getShiftWidth()+
+ "-bit shift instructions");
+ return ret;
+ }
+ };
}
- public String toString() { return super.toString()+"shift "+immediate; }
+ public String toString() { return super.toString()+"shift "+immediate.getBitVector(); }
}
/** a flush instruction */
else ret.append(!dock.isInputDock() ? ", collect nothing" : ", recv nothing");
}
if (dataOut && dock.isInputDock()) ret.append(", deliver");
- if (dataOut && !dock.isInputDock()) ret.append(path==null ? ", send" : ", send to " + path.getDestination());
- if (tokenOut) ret.append(path==null ? ", token" : ", send token to " + path.getDestination());
+ if (dataOut && !dock.isInputDock()) ret.append(path==null ? ", send" : ", send to " + pathToString(path));
+ if (tokenOut) ret.append(path==null ? ", token" : ", send token to " + pathToString(path));
String s = ret.toString();
s = s.equals("") ? "nop" : s.substring(2);
if (interruptible) s = "[T] " + s;
return super.toString()+s+";";
}
+
+ private String pathToString(Path path) {
+ BitVector signal = path.getSignal();
+ if (signal!=null)
+ for(int i=0; i<signal.length(); i++)
+ if (signal.get(i))
+ return (path.getDestination()+":"+signal.toLong());
+ return (path.getDestination()+"");
+ }
}
/** a flush instruction */