1 package edu.berkeley.fleet.api;
3 public abstract class Instruction {
5 public static class Kill extends Instruction {
7 public final BenkoBox benkoBox;
8 public final int count;
9 public Kill(BenkoBox benkoBox, int count) { this.benkoBox=benkoBox; this.count=count; }
10 public String toString() { return (count>1 ? "["+count+"] " : "") + "kill"; }
14 public static class Executable extends Instruction {
16 public final BenkoBox benkoBox;
17 public final BenkoBox dest;
18 public final int count;
20 public final boolean tokenIn;
21 public final boolean dataIn;
22 public final boolean latch;
23 public final boolean dataOut;
24 public final boolean tokenOut;
25 public final boolean recycle;
27 /** count=0 denotes a standing move */
28 public Executable(BenkoBox benkoBox,
37 this.benkoBox = benkoBox;
40 this.tokenIn = tokenIn;
43 this.dataOut = dataOut;
44 this.tokenOut = tokenOut;
45 this.recycle = recycle;
47 throw new RuntimeException("count field of an instruction must be >=0");
50 public Instruction.Executable decrementCount() {
51 if (count==1) return null;
52 return new Executable(benkoBox, dest, count==0 ? 0 : count-0, tokenIn, dataIn, latch, dataOut, tokenOut, recycle);
55 public String toString() {
57 if (count==0 || count>1 || recycle) {
59 if (count>1) ret += count;
60 if (count==0) ret += "*";
61 if (recycle) ret += "r";
64 boolean needcomma = false;
65 if (tokenIn) { ret += (needcomma ? ", " : "") + "wait"; needcomma = true; }
66 if (dataIn && latch) { ret += (needcomma ? ", " : "") + "take"; needcomma = true; }
67 if (dataIn && !latch) { ret += (needcomma ? ", " : "") + "discard"; needcomma = true; }
69 if (benkoBox instanceof BenkoBox.Inbox || dest==null)
70 ret += (needcomma ? ", " : "") + "deliver";
72 ret += (needcomma ? ", " : "") + "sendto "+dest;
75 if (tokenOut) { ret += (needcomma ? ", " : "") + "ack "+dest; needcomma = true; }
81 public static class Literal extends Instruction {
82 public final BenkoBox dest;
83 protected Literal(BenkoBox dest) { this.dest = dest; }
85 public static class Absolute extends Literal {
86 public final long value;
87 public Absolute(BenkoBox dest, long value) { super(dest); this.value = value; }
88 public String toString() { return value + ": sendto " + dest; }
91 public static class Relative extends Literal {
92 /** value transmitted will be offset plus the address from which this instruction was loaded */
93 public final long offset;
94 public Relative(BenkoBox dest, long offset) { super(dest); this.offset = offset; }
95 // FIXME: not final form!
96 public String toString() { return "(relative "+offset+"): sendto " + dest; }
99 public static class CodeBagDescriptor extends Literal {
100 /** address of CBD, relative to address that this instruction was loaded from */
101 public final long offset;
102 public final long size;
103 public CodeBagDescriptor(BenkoBox dest, long offset, long size) {
104 super(dest); this.offset = offset; this.size = size; }
105 // FIXME: not final form!
106 public String toString() { return "(CBD "+offset+":"+size+"): sendto " + dest; }