correct encoding of Marina predicate bits
[fleet.git] / src / edu / berkeley / fleet / two / FleetTwoFleet.java
index c868ded..fea301d 100644 (file)
@@ -76,7 +76,7 @@ public abstract class FleetTwoFleet extends Fleet {
     public final int  WIDTH_WORD;
     public final int  WIDTH_PACKET;
 
-    public final long DataLatch_WIDTH;
+    public final int DataLatch_WIDTH;
     private final long mask;
 
     public FleetTwoFleet() { this(false); }
@@ -98,14 +98,14 @@ public abstract class FleetTwoFleet extends Fleet {
             DISPATCH_PATH              = new Mask("v....................................");
             DISPATCH_INSTR             = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
             P                          = new Mask(".vvvvvv..............................");
-            P_NOT_A                    = new Mask(".011110..............................");
-            P_A                        = new Mask(".011101..............................");
-            P_NOT_B                    = new Mask(".011011..............................");
-            P_B                        = new Mask(".010111..............................");
-            P_UNUSED                   = new Mask(".000000..............................");
-            P_OLC_ZERO                 = new Mask(".101111..............................");
-            P_OLC_NONZERO              = new Mask(".011111..............................");
-            P_ALWAYS                   = new Mask(".111111..............................");
+            P_NOT_A                    = new Mask(".100001..............................");
+            P_A                        = new Mask(".100010..............................");
+            P_NOT_B                    = new Mask(".100100..............................");
+            P_B                        = new Mask(".101000..............................");
+            P_UNUSED                   = new Mask(".111111..............................");
+            P_OLC_ZERO                 = new Mask(".010000..............................");
+            P_OLC_NONZERO              = new Mask(".100000..............................");
+            P_ALWAYS                   = new Mask(".000000..............................");
 
 
             // use these when Marina gets updated to 07-Jan-2009 version of internal encoding
@@ -218,6 +218,13 @@ public abstract class FleetTwoFleet extends Fleet {
         return false;
     }
 
+    public boolean isSmallEnoughToFit(BitVector immediate) {
+        boolean b = immediate.get((int)DataLatch_WIDTH);
+        for(int i=DataLatch_WIDTH+1; i<immediate.length(); i++)
+            if (immediate.get(i) != b) return false;
+        return true;
+    }
+
     public int getWordWidth() { return 37; }
 
     //////////////////////////////////////////////////////////////////////////////
@@ -270,29 +277,29 @@ public abstract class FleetTwoFleet extends Fleet {
         if (P_NOT_B.get(inst))  predicate = NotFlagB;
 
         if (FLUSH.get(inst))
-            return new Flush(dock, false, predicate);
+            return new Flush(dock, predicate);
         if (ABORT.get(inst))
             return new Abort(dock, predicate);
-        if (SHIFT.get(inst))                return new Shift(dock, false, predicate, new BitVector(dock.getShip().getFleet().getShiftWidth()).set(SHIFT.getval(inst)));
+        if (SHIFT.get(inst))                return new Shift(dock, predicate, new BitVector(dock.getShip().getFleet().getShiftWidth()).set(SHIFT.getval(inst)));
         if (SET_IMMEDIATE.get(inst)) {
             boolean extend = SET_IMMEDIATE_EXTEND.getval(inst) != 0;
             long immediate = SET_IMMEDIATE.getval(inst);
             if (extend) immediate |= (-1L << DataLatch_WIDTH);
-            return new Set(dock, false, predicate, SetDest.DataLatch, (immediate));
+            return new Set(dock, predicate, SetDest.DataLatch, (immediate));
         }
 
         if (SET_OLC_FROM_OLC_MINUS_ONE.get(inst))
-            return new Set(dock, false, predicate, SetDest.OuterLoopCounter, SetSource.Decrement);
+            return new Set(dock, predicate, SetDest.OuterLoopCounter, SetSource.Decrement);
         if (SET_OLC_FROM_IMMEDIATE.get(inst))
-            return new Set(dock, false, predicate, SetDest.OuterLoopCounter, (SET_OLC_FROM_IMMEDIATE.getval(inst)));
+            return new Set(dock, predicate, SetDest.OuterLoopCounter, (SET_OLC_FROM_IMMEDIATE.getval(inst)));
         if (SET_ILC_FROM_IMMEDIATE.get(inst))
-            return new Set(dock, false, predicate, SetDest.InnerLoopCounter, (SET_ILC_FROM_IMMEDIATE.getval(inst)));
+            return new Set(dock, predicate, SetDest.InnerLoopCounter, (SET_ILC_FROM_IMMEDIATE.getval(inst)));
         if (SET_OLC_FROM_DATA_LATCH.get(inst))
-            return new Set(dock, false, predicate, SetDest.OuterLoopCounter, SetSource.DataLatch);
+            return new Set(dock, predicate, SetDest.OuterLoopCounter, SetSource.DataLatch);
         if (SET_ILC_FROM_DATA_LATCH.get(inst))
-            return new Set(dock, false, predicate, SetDest.InnerLoopCounter, SetSource.DataLatch);
+            return new Set(dock, predicate, SetDest.InnerLoopCounter, SetSource.DataLatch);
         if (SET_ILC_FROM_INFINITY.get(inst))
-            return new Set(dock, false, predicate, SetDest.InnerLoopCounter, SetSource.Infinity);
+            return new Set(dock, predicate, SetDest.InnerLoopCounter, SetSource.Infinity);
         if (SET_FLAGS.get(inst)) {
             long flag_a = SET_FLAGS_A.getval(inst);
             long flag_b = SET_FLAGS_B.getval(inst);
@@ -310,11 +317,10 @@ public abstract class FleetTwoFleet extends Fleet {
             if (SET_FLAGS_VALUE_NOT_B.get(flag_b)) bp = bp.add(NotFlagB );
             if (SET_FLAGS_VALUE_C    .get(flag_b)) bp = bp.add(FlagC    );
             if (SET_FLAGS_VALUE_NOT_C.get(flag_b)) bp = bp.add(NotFlagC );
-            return new Set(dock, false, predicate, ap, bp);
+            return new Set(dock,  predicate, ap, bp);
         }
         if (MOVE.get(inst))
             return new Move(dock,
-                            false,
                             predicate,
                             !NOT_INTERRUPTIBLE.get(inst),
                             PATH_DATA.get(inst)?null:getPathByAddr(dock, PATH_IMMEDIATE.getvalAsBitVector(inst)),