correct encoding of Marina predicate bits
[fleet.git] / src / edu / berkeley / fleet / two / FleetTwoFleet.java
index 311a007..fea301d 100644 (file)
@@ -25,7 +25,6 @@ public abstract class FleetTwoFleet extends Fleet {
     public final Mask DISPATCH_PATH;
     public final Mask DISPATCH_INSTR;
     public final Mask NOT_INTERRUPTIBLE;
-    public final Mask OS;
     public final Mask P;
     public final Mask P_NOT_A;
     public final Mask P_A;
@@ -77,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,49 +97,50 @@ public abstract class FleetTwoFleet extends Fleet {
 
             DISPATCH_PATH              = new Mask("v....................................");
             DISPATCH_INSTR             = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
-            NOT_INTERRUPTIBLE          = new Mask(".................1...................");
-            OS                         = new Mask(".......1.............................");
             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..............................");
-
-            SHIFT                      = new Mask("..........101111.1vvvvvvvvvvvvvvvvvvv");
-
-            TAIL                       = new Mask("................1...................0");
-            HEAD                       = null;
-            ABORT                      = null;
-
-            MOVE                       = new Mask("..........110111.....................");
-            TI                         = new Mask("..........110111..1..................");
-            DI                         = new Mask("..........110111...1.................");
-            FLUSH                      = new Mask(".........1110111.....................");
-            DC                         = new Mask("..........110111....1................");
-            DO                         = new Mask("..........110111.....1...............");
-            TO                         = new Mask("..........110111......1..............");
-            PATH_IMMEDIATE             = new Mask("..........110111.......1vvvvvvvvvvvvv");
-            PATH_DATA                  = new Mask("..........110111.......00............");
-            PATH_NOCHANGE              = new Mask("..........110111.......01............");
-
-            SET_OLC_FROM_IMMEDIATE     = new Mask("..........111101.0.............vvvvvv");
-            SET_OLC_FROM_DATA_LATCH    = new Mask("..........111101.1...................");
-            SET_OLC_FROM_OLC_MINUS_ONE = new Mask("..........111011.....................");
-
-            SET_ILC_FROM_IMMEDIATE     = new Mask("..........011111.0...........0.vvvvvv");
-            SET_ILC_FROM_INFINITY      = new Mask("..........011111.............1.......");
-            SET_ILC_FROM_DATA_LATCH    = new Mask("..........011111.1...................");
-
-            SET_IMMEDIATE              = new Mask("..........101111.0.....vvvvvvvvvvvvvv");
-            SET_IMMEDIATE_EXTEND       = new Mask("..........101111.0....v..............");
-
-            SET_FLAGS                  = new Mask("..........111110.....................");
-            SET_FLAGS_A                = new Mask("..........111110...............vvvvvv");
-            SET_FLAGS_B                = new Mask("..........111110.........vvvvvv......");
+            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
+            HEAD                       = new Mask(".......1.............................");
+            ABORT                      = new Mask("........1............................");
+            TAIL                       = new Mask(".........1...........................");
+
+            // actually "is interruptible"
+            NOT_INTERRUPTIBLE          = new Mask("...........1....1....................");
+
+            SHIFT                      = new Mask("..........1......1vvvvvvvvvvvvvvvvvvv");
+            SET_IMMEDIATE              = new Mask("..........1......0.....vvvvvvvvvvvvvv");
+            SET_IMMEDIATE_EXTEND       = new Mask("..........1......0....v..............");
+            MOVE                       = new Mask("............1........................");
+            TI                         = new Mask("............1.....1..................");
+            DI                         = new Mask("............1......1.................");
+            FLUSH                      = new Mask("..........1......0.....011...........");
+            DC                         = new Mask("............1.......1................");
+            DO                         = new Mask("............1........1...............");
+            TO                         = new Mask("............1.........1..............");
+            PATH_IMMEDIATE             = new Mask("............1..........1vvvvvvvvvvvvv");
+            PATH_DATA                  = new Mask("............1..........00............");
+            PATH_NOCHANGE              = new Mask("............1..........01............");
+
+            SET_OLC_FROM_IMMEDIATE     = new Mask("..............1.10.............vvvvvv");
+            SET_OLC_FROM_DATA_LATCH    = new Mask("...............1.11..................");
+            SET_OLC_FROM_OLC_MINUS_ONE = new Mask("...............1.10..................");
+
+            SET_ILC_FROM_IMMEDIATE     = new Mask("...............1.00..........0.vvvvvv");
+            SET_ILC_FROM_INFINITY      = new Mask("...............1.0...........1.......");
+            SET_ILC_FROM_DATA_LATCH    = new Mask("...............1.01..................");
+
+            SET_FLAGS                  = new Mask("...............1.....................");
+            SET_FLAGS_A                = new Mask("...............1...............vvvvvv");
+            SET_FLAGS_B                = new Mask("...............1.........vvvvvv......");
 
             SET_FLAGS_VALUE_A          = new Mask(".....1");
             SET_FLAGS_VALUE_NOT_A      = new Mask("....1.");
@@ -153,7 +153,6 @@ public abstract class FleetTwoFleet extends Fleet {
             DISPATCH_PATH              = new Mask("vvvvvvvvvvv..........................");
             DISPATCH_INSTR             = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv");
             NOT_INTERRUPTIBLE          = new Mask("...........1.........................");
-            OS                         = new Mask("............1........................");
             P                          = new Mask(".............vvv.....................");
             P_NOT_A                    = new Mask(".............000.....................");
             P_A                        = new Mask(".............001.....................");
@@ -219,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,31 +276,30 @@ public abstract class FleetTwoFleet extends Fleet {
         if (P_NOT_A.get(inst))  predicate = NotFlagA;
         if (P_NOT_B.get(inst))  predicate = NotFlagB;
 
-        boolean looping = !OS.get(inst);
         if (FLUSH.get(inst))
-            return new Flush(dock, looping, predicate);
+            return new Flush(dock, predicate);
         if (ABORT.get(inst))
             return new Abort(dock, predicate);
-        if (SHIFT.get(inst))                return new Shift(dock, looping, 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, looping, 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, looping, 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, looping, 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, looping, 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, looping, 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, looping, 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, looping, 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);
@@ -312,14 +317,13 @@ 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, looping, predicate, ap, bp);
+            return new Set(dock,  predicate, ap, bp);
         }
         if (MOVE.get(inst))
             return new Move(dock,
-                            looping,
                             predicate,
                             !NOT_INTERRUPTIBLE.get(inst),
-                            getPathByAddr(dock, PATH_IMMEDIATE.getvalAsBitVector(inst)),
+                            PATH_DATA.get(inst)?null:getPathByAddr(dock, PATH_IMMEDIATE.getvalAsBitVector(inst)),
                             TI.get(inst),
                             DI.get(inst),
                             hack?(!DC.get(inst)):DC.get(inst),
@@ -344,7 +348,6 @@ public abstract class FleetTwoFleet extends Fleet {
 
         boolean dl = false;
         Instruction pi = d;
-        if (!pi.looping) instr = OS.set(instr);
         switch(pi.predicate) {
             case IgnoreFlagD:         instr = P_ALWAYS.set(instr); break;
             case FlagD:         instr = P_OLC_ZERO.set(instr); break;