public final BenkoBox benkoBox;
public final int count;
- public Kill(BenkoBox benkoBox, int count) { this.benkoBox=benkoBox; this.count=count; }
+ public final boolean killOnlyStandingInstructions;
+ public Kill(BenkoBox benkoBox, int count, boolean killOnlyStandingInstructions) {
+ this.benkoBox=benkoBox;
+ this.count=count;
+ this.killOnlyStandingInstructions = killOnlyStandingInstructions;
+ }
public String toString() { return (count>1 ? "["+count+"] " : "") + "kill"; }
}
- public static class Normal extends Instruction {
+ public static class Executable extends Instruction {
public final BenkoBox benkoBox;
public final BenkoBox dest;
public final int count;
- public final boolean wait;
+ public final boolean tokenIn;
public final boolean dataIn;
public final boolean latch;
public final boolean dataOut;
- public final boolean ack;
+ public final boolean tokenOut;
public final boolean recycle;
- public Normal(BenkoBox benkoBox,
- BenkoBox dest,
- int count,
- boolean dataIn,
- boolean latch,
- boolean ack,
- boolean wait,
- boolean dataOut,
- boolean recycle) {
+ /** count=0 denotes a standing move */
+ public Executable(BenkoBox benkoBox,
+ BenkoBox dest,
+ int count,
+ boolean tokenIn,
+ boolean dataIn,
+ boolean latch,
+ boolean dataOut,
+ boolean tokenOut,
+ boolean recycle) {
this.benkoBox = benkoBox;
this.dest = dest;
this.count = count;
+ this.tokenIn = tokenIn;
this.dataIn = dataIn;
this.latch = latch;
- this.ack = ack;
- this.wait = wait;
this.dataOut = dataOut;
+ this.tokenOut = tokenOut;
this.recycle = recycle;
- if (count <= 0)
- throw new RuntimeException("count field of an instruction must be >0");
+ if (count < 0)
+ throw new RuntimeException("count field of an instruction must be >=0");
+ }
+
+ public boolean isStanding() {
+ return count==0;
+ }
+
+ public Instruction.Executable decrementCount() {
+ if (count==1) return null;
+ return new Executable(benkoBox, dest, count==0 ? 0 : count-1,
+ tokenIn, dataIn, latch, dataOut, tokenOut, recycle);
+ }
+
+ public String toString() {
+ String ret = benkoBox.toString() + ": ";
+ if (count==0 || count>1 || recycle) {
+ ret += "[";
+ if (count>1) ret += count;
+ if (count==0) ret += "*";
+ if (recycle) ret += "r";
+ ret += "] ";
+ }
+ boolean needcomma = false;
+ if (tokenIn) { ret += (needcomma ? ", " : "") + "wait"; needcomma = true; }
+ if (dataIn && latch) { ret += (needcomma ? ", " : "") + "take"; needcomma = true; }
+ if (dataIn && !latch) { ret += (needcomma ? ", " : "") + "discard"; needcomma = true; }
+ if (dataOut) {
+ if (benkoBox instanceof BenkoBox.Inbox || dest==null)
+ ret += (needcomma ? ", " : "") + "deliver";
+ else
+ ret += (needcomma ? ", " : "") + "sendto "+dest;
+ needcomma = true;
+ }
+ if (tokenOut) { ret += (needcomma ? ", " : "") + "ack "+dest; needcomma = true; }
+ return ret;
}
}
public static class Absolute extends Literal {
public final long value;
public Absolute(BenkoBox dest, long value) { super(dest); this.value = value; }
- public String toString() { return value + ": sendto " + dest; }
+ public String toString() {
+ return value + ": sendto " + dest;
+ }
}
public static class Relative extends Literal {
/** value transmitted will be offset plus the address from which this instruction was loaded */
public final long offset;
public Relative(BenkoBox dest, long offset) { super(dest); this.offset = offset; }
- // FIXME: not final form!
- public String toString() { return "(relative "+offset+"): sendto " + dest; }
+ public String toString() {
+ String off = ""+offset;
+ if (offset > 0) off = "+"+off;
+ return "(@"+offset+"): sendto " + dest;
+ }
}
public static class CodeBagDescriptor extends Literal {
public final long size;
public CodeBagDescriptor(BenkoBox dest, long offset, long size) {
super(dest); this.offset = offset; this.size = size; }
- // FIXME: not final form!
- public String toString() { return "(CBD "+offset+":"+size+"): sendto " + dest; }
+ public String toString() {
+ String off = ""+offset;
+ if (offset > 0) off = "+"+off;
+ return "(@"+off+":"+size+"): sendto " + dest;
+ }
}
}
}