/** the dock which is to execute this instruction */
public final Dock dock;
- /** true if the instruction is an outer-looping instruction */
- public final boolean looping;
-
/** the instruction's predicate */
public final Predicate predicate;
- Instruction(Dock dock, boolean looping, Predicate predicate) {
+ Instruction(Dock dock, Predicate predicate) {
if (dock==null) throw new RuntimeException("dock may not be null");
if (predicate==null) throw new RuntimeException("predicate may not be null");
this.dock = dock;
- this.looping = looping;
this.predicate = predicate;
}
public String toString() {
String s = predicate.toString();
if (s.length()>0) s = "["+s+"] ";
- if (looping) s += "[Rq] ";
return dock+": "+s;
}
public final FlagFunction newFlagB;
/** basic constructor */
- public Set(Dock dock, SetDest dest, SetSource source) { this(dock, false, Predicate.Default, dest, source); }
- public Set(Dock dock, boolean looping, Predicate predicate, SetDest dest, SetSource source) {
- super(dock, looping, predicate);
+ public Set(Dock dock, SetDest dest, SetSource source) { this(dock, Predicate.Default, dest, source); }
+ public Set(Dock dock, Predicate predicate, SetDest dest, SetSource source) {
+ super(dock, predicate);
OUTER: switch(dest) {
case InnerLoopCounter:
switch(source) {
}
/** constructor for set instructions with immediates */
- public Set(Dock dock, SetDest dest, long immediate) { this(dock, false, Predicate.Default, dest, immediate); }
- public Set(Dock dock, boolean looping, Predicate predicate, SetDest dest, long immediate) {
- super(dock, looping, predicate);
+ public Set(Dock dock, SetDest dest, long immediate) { this(dock, Predicate.Default, dest, immediate); }
+ public Set(Dock dock, Predicate predicate, SetDest dest, long immediate) {
+ super(dock, predicate);
if (dest!=SetDest.InnerLoopCounter && dest!=SetDest.OuterLoopCounter && dest!=SetDest.DataLatch)
throw new RuntimeException("a set instruction with dest="+dest+" may not take an immediate");
this.source = SetSource.Immediate;
}
/** constructor for <tt>set flags</tt> instructions */
- public Set(Dock dock, FlagFunction newFlagA, FlagFunction newFlagB) { this(dock, false, Predicate.Default, newFlagA, newFlagB); }
- public Set(Dock dock, boolean looping, Predicate predicate, FlagFunction newFlagA, FlagFunction newFlagB) {
- super(dock, looping, predicate);
+ public Set(Dock dock, FlagFunction newFlagA, FlagFunction newFlagB) { this(dock, Predicate.Default, newFlagA, newFlagB); }
+ public Set(Dock dock, Predicate predicate, FlagFunction newFlagA, FlagFunction newFlagB) {
+ super(dock, predicate);
this.source = SetSource.Immediate;
this.dest = SetDest.Flags;
this.immediate = 0;
/** 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, false, Predicate.Default, immediate); }
- public Shift(Dock dock, boolean looping, Predicate predicate, BitVector immediate) {
- super(dock, looping, predicate);
+ public Shift(Dock dock, BitVector immediate) { this(dock, Predicate.Default, immediate); }
+ public Shift(Dock dock, Predicate predicate, BitVector immediate) {
+ super(dock, predicate);
this.immediate = immediate;
this.immediate.setImmutable();
if (immediate.length() != dock.getShip().getFleet().getShiftWidth())
/** a flush instruction */
public static class Flush extends Instruction {
- public Flush(Dock dock) { this(dock, false, Predicate.Default); }
- public Flush(Dock dock, boolean looping, Predicate predicate) {
- super(dock, looping, predicate);
+ public Flush(Dock dock) { this(dock, Predicate.Default); }
+ public Flush(Dock dock, Predicate predicate) {
+ super(dock, predicate);
if (!dock.isInputDock()) throw new RuntimeException("Flush is only allowed at input docks");
}
public String toString() { return super.toString()+"flush"; }
boolean dataOut,
boolean tokenOut
) {
- this(dock, false, Predicate.Default, false, path, tokenIn, dataIn, latchData, latchPath, dataOut, tokenOut); }
+ this(dock, Predicate.Default, false, path, tokenIn, dataIn, latchData, latchPath, dataOut, tokenOut); }
public Move(Dock dock,
- boolean looping,
Predicate predicate,
boolean interruptible,
Path path,
boolean dataOut,
boolean tokenOut
) {
- super(dock, looping, predicate);
+ super(dock, predicate);
this.path = path;
this.tokenIn = tokenIn;
this.dataIn = dataIn;
/** a flush instruction */
public static class Abort extends Instruction {
- public Abort(Dock dock, Predicate predicate) { super(dock, false, predicate); }
+ public Abort(Dock dock, Predicate predicate) { super(dock, predicate); }
public String toString() { return super.toString()+"abort;"; }
}
/** marks the start of a loop; closes the hatch */
public static class Head extends Instruction {
- public Head(Dock dock) { super(dock, false, Predicate.IgnoreFlagD); }
+ public Head(Dock dock) { super(dock, Predicate.IgnoreFlagD); }
public String toString() { return dock+": head;"; }
}
/** marks the end of a loop; closes the hatch */
public static class Tail extends Instruction {
- public Tail(Dock dock) { super(dock, false, Predicate.IgnoreFlagD); }
+ public Tail(Dock dock) { super(dock, Predicate.IgnoreFlagD); }
public String toString() { return dock+": tail;"; }
}