utilize DeferredBitVector functionality in Fleet implementations
[fleet.git] / src / edu / berkeley / fleet / api / Instruction.java
index e41c0fe..a9698ed 100644 (file)
@@ -214,18 +214,22 @@ public abstract class Instruction {
 
     /** 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 */
@@ -317,13 +321,22 @@ public abstract class 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 */