utilize DeferredBitVector functionality in Fleet implementations
authormegacz <adam@megacz.com>
Mon, 6 Apr 2009 18:28:37 +0000 (11:28 -0700)
committermegacz <adam@megacz.com>
Mon, 6 Apr 2009 18:28:37 +0000 (11:28 -0700)
src/edu/berkeley/fleet/api/Instruction.java
src/edu/berkeley/fleet/interpreter/InterpreterDock.java
src/edu/berkeley/fleet/two/FleetTwoFleet.java

index 145459f..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 */
index 14fd5b3..40e66b0 100644 (file)
@@ -190,8 +190,9 @@ class InterpreterDock extends FleetTwoDock {
                 Instruction.Shift shift = (Instruction.Shift)instructions.peek();
                 for(int i=dataLatch.length()-1; i>=getShip().getFleet().getShiftWidth(); i--)
                     dataLatch.set(i, dataLatch.get(i-getShip().getFleet().getShiftWidth()));
+                BitVector shift_immediate = shift.immediate.getBitVector();
                 for(int i=getShip().getFleet().getShiftWidth()-1; i>=0; i--)
-                    dataLatch.set(i, shift.immediate.get(i));
+                    dataLatch.set(i, shift_immediate.get(i));
                 break;
 
             } else if (instructions.peek() instanceof Instruction.Set) {
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);