update encoding code
authorAdam Megacz <adam.megacz@sun.com>
Thu, 9 Apr 2009 03:56:04 +0000 (03:56 +0000)
committerAdam Megacz <adam.megacz@sun.com>
Thu, 9 Apr 2009 03:56:04 +0000 (03:56 +0000)
testCode/edu/berkeley/fleet/api/BitVector.java
testCode/edu/berkeley/fleet/api/Instruction.java
testCode/edu/berkeley/fleet/two/FleetTwoFleet.java

index 8b08fc6..3352a6c 100644 (file)
@@ -19,7 +19,7 @@ package edu.berkeley.fleet.api;
  *  complement number using the number of bits allocated in the
  *  BitVector.
  */
-public class BitVector {
+public class BitVector implements DeferredBitVector {
 
     private final boolean[] bits;
 
@@ -143,6 +143,10 @@ public class BitVector {
                 ret |= (1L << i);
         return ret;
     }
+
+    public BitVector getBitVector() {
+        return this;
+    }
 }
 
 
index 0eda440..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 */
@@ -235,7 +239,7 @@ public abstract class Instruction {
             super(dock, predicate);
             if (!dock.isInputDock()) throw new RuntimeException("Flush is only allowed at input docks");
         }
-        public String toString() { return super.toString()+"flush"; }
+        public String toString() { return super.toString()+"flush;"; }
     }
 
     /** all communication is performed with this 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 */
index fea301d..0c84eca 100644 (file)
@@ -368,7 +368,7 @@ public abstract class FleetTwoFleet extends Fleet {
         } else if (d instanceof Shift) {
             Shift shift = (Shift)d;
             instr = SHIFT.set(instr);
-            instr = SHIFT.setval(instr, shift.immediate);
+            instr = SHIFT.setval(instr, shift.immediate.getBitVector());
 
         } else if (d instanceof Flush) {
             instr = FLUSH.set(instr);