bugfix in Instruction.decrementCount()
[fleet.git] / src / edu / berkeley / fleet / api / Instruction.java
1 package edu.berkeley.fleet.api;
2
3 public abstract class Instruction {
4
5     public static class Kill extends Instruction {
6
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"; }
11
12     }
13
14     public static class Executable extends Instruction {
15
16         public final BenkoBox benkoBox;
17         public final BenkoBox dest;
18         public final int      count;
19
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;
26
27         /** count=0 denotes a standing move */
28         public Executable(BenkoBox benkoBox,
29                           BenkoBox dest,
30                           int      count,
31                           boolean  tokenIn,
32                           boolean  dataIn,
33                           boolean  latch,
34                           boolean  dataOut,
35                           boolean  tokenOut,
36                           boolean  recycle) {
37             this.benkoBox = benkoBox;
38             this.dest = dest;
39             this.count = count;
40             this.tokenIn = tokenIn;
41             this.dataIn = dataIn;
42             this.latch = latch;
43             this.dataOut = dataOut;
44             this.tokenOut = tokenOut;
45             this.recycle = recycle;
46             if (count < 0)
47                 throw new RuntimeException("count field of an instruction must be >=0");
48         }
49
50         public Instruction.Executable decrementCount() {
51             if (count==1) return null;
52             return new Executable(benkoBox, dest, count==0 ? 0 : count-1,
53                                   tokenIn, dataIn, latch, dataOut, tokenOut, recycle);
54         }
55
56         public String toString() {
57             String ret = "";
58             if (count==0 || count>1 || recycle) {
59                 ret += "[";
60                 if (count>1) ret += count;
61                 if (count==0) ret += "*";
62                 if (recycle) ret += "r";
63                 ret += "] ";
64             }
65             boolean needcomma = false;
66             if (tokenIn)           { ret += (needcomma ? ", " : "") + "wait";    needcomma = true; }
67             if (dataIn && latch)   { ret += (needcomma ? ", " : "") + "take";    needcomma = true; }
68             if (dataIn && !latch)  { ret += (needcomma ? ", " : "") + "discard"; needcomma = true; }
69             if (dataOut)  {
70                 if (benkoBox instanceof BenkoBox.Inbox || dest==null)
71                     ret += (needcomma ? ", " : "") + "deliver";
72                 else
73                     ret += (needcomma ? ", " : "") + "sendto "+dest;
74                 needcomma = true;
75             }
76             if (tokenOut) { ret += (needcomma ? ", " : "") + "ack "+dest; needcomma = true; }
77             return ret;
78         }
79
80     }
81
82     public static class Literal extends Instruction {
83         public final BenkoBox dest;
84         protected Literal(BenkoBox dest) { this.dest = dest; }
85
86         public static class Absolute extends Literal {
87             public final long value;
88             public Absolute(BenkoBox dest, long value) { super(dest); this.value = value; }
89             public String toString() { return value + ": sendto " + dest; }
90         }
91
92         public static class Relative extends Literal {
93             /** value transmitted will be offset plus the address from which this instruction was loaded */
94             public final long offset;
95             public Relative(BenkoBox dest, long offset) { super(dest); this.offset = offset; }
96             // FIXME: not final form!
97             public String toString() { return "(relative "+offset+"): sendto " + dest; }
98         }
99
100         public static class CodeBagDescriptor extends Literal {
101             /** address of CBD, relative to address that this instruction was loaded from */
102             public final long offset;
103             public final long size;
104             public CodeBagDescriptor(BenkoBox dest, long offset, long size) {
105                 super(dest); this.offset = offset; this.size = size; }
106             // FIXME: not final form!
107             public String toString() { return "(CBD "+offset+":"+size+"): sendto " + dest; }
108         }
109     }
110 }