change CBD size field from 6 bits to 9 bits
[fleet.git] / src / edu / berkeley / fleet / two / FleetTwoFleet.java
index 0c84eca..0559065 100644 (file)
@@ -25,6 +25,7 @@ public abstract class FleetTwoFleet extends Fleet {
     public final Mask DISPATCH_PATH;
     public final Mask DISPATCH_INSTR;
     public final Mask NOT_INTERRUPTIBLE;
+    public final Mask IS_INTERRUPTIBLE;
     public final Mask P;
     public final Mask P_NOT_A;
     public final Mask P_A;
@@ -88,8 +89,8 @@ public abstract class FleetTwoFleet extends Fleet {
         PACKET_SIGNAL              = new Mask("......................................v...........");
         PACKET_DEST                = new Mask(".......................................vvvvvvvvvvv");
 
-        CBD_SIZE                   = new Mask("...............................vvvvvv");
-        CBD_OFFSET                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv......");
+        CBD_SIZE                   = new Mask("............................vvvvvvvvv");
+        CBD_OFFSET                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvv.........");
 
         WHOLE_WORD                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
 
@@ -98,23 +99,22 @@ 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(".100001..............................");
-            P_A                        = new Mask(".100010..............................");
-            P_NOT_B                    = new Mask(".100100..............................");
-            P_B                        = new Mask(".101000..............................");
+            P_NOT_A                    = new Mask(".010001..............................");
+            P_A                        = new Mask(".010010..............................");
+            P_NOT_B                    = new Mask(".010100..............................");
+            P_B                        = new Mask(".011000..............................");
             P_UNUSED                   = new Mask(".111111..............................");
-            P_OLC_ZERO                 = new Mask(".010000..............................");
-            P_OLC_NONZERO              = new Mask(".100000..............................");
+            P_OLC_ZERO                 = new Mask(".100000..............................");
+            P_OLC_NONZERO              = new Mask(".010000..............................");
             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............................");
+            ABORT                      = new Mask("........1......1.........000100000001");
             TAIL                       = new Mask(".........1...........................");
 
             // actually "is interruptible"
-            NOT_INTERRUPTIBLE          = new Mask("...........1....1....................");
+            NOT_INTERRUPTIBLE          = new Mask("...........0....0....................");
+            IS_INTERRUPTIBLE           = new Mask("...........1....1....................");
 
             SHIFT                      = new Mask("..........1......1vvvvvvvvvvvvvvvvvvv");
             SET_IMMEDIATE              = new Mask("..........1......0.....vvvvvvvvvvvvvv");
@@ -130,13 +130,13 @@ public abstract class FleetTwoFleet extends Fleet {
             PATH_DATA                  = new Mask("............1..........00............");
             PATH_NOCHANGE              = new Mask("............1..........01............");
 
+            SET_OLC_FROM_OLC_MINUS_ONE = new Mask(".............1..1....................");
+            SET_OLC_FROM_DATA_LATCH    = new Mask("..............1.11...................");
             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_ILC_FROM_DATA_LATCH    = new Mask("..............1.01...................");
+            SET_ILC_FROM_IMMEDIATE     = new Mask("..............1.00...........0.vvvvvv");
+            SET_ILC_FROM_INFINITY      = new Mask("..............1.0............1.......");
 
             SET_FLAGS                  = new Mask("...............1.....................");
             SET_FLAGS_A                = new Mask("...............1...............vvvvvv");
@@ -153,6 +153,7 @@ public abstract class FleetTwoFleet extends Fleet {
             DISPATCH_PATH              = new Mask("vvvvvvvvvvv..........................");
             DISPATCH_INSTR             = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv");
             NOT_INTERRUPTIBLE          = new Mask("...........1.........................");
+            IS_INTERRUPTIBLE           = new Mask("...........0.........................");
             P                          = new Mask(".............vvv.....................");
             P_NOT_A                    = new Mask(".............000.....................");
             P_A                        = new Mask(".............001.....................");
@@ -260,6 +261,19 @@ public abstract class FleetTwoFleet extends Fleet {
     public int getShiftWidth() { return SHIFT.valmaskwidth; }
     public int getSetWidth() { return SET_IMMEDIATE.valmaskwidth+1; }
 
+
+    public int getMaxCodeBagSize() {
+        return (1<<CBD_SIZE.valmaskwidth)-1;
+    }
+    public BitVector makeCodeBagDescriptor(long offset, long length) {
+        BitVector descriptor = new BitVector(getWordWidth());
+        CBD_OFFSET.setval(descriptor, offset);
+        CBD_SIZE.setval(descriptor, length);
+        return descriptor;
+    }
+
+
+
     // FIXME: should use BitVector here
     public Instruction readInstruction(long inst, Dock dispatchFrom) {
         Dock dock = getPathByAddr(dispatchFrom, DISPATCH_PATH.getvalAsBitVector(inst)).getDestination().getDock();
@@ -433,6 +447,7 @@ public abstract class FleetTwoFleet extends Fleet {
             if (inst.dataOut)                    instr = DO.set(instr);
             if (inst.tokenOut)                   instr = TO.set(instr);
             if (!inst.interruptible)             instr = NOT_INTERRUPTIBLE.set(instr);
+            else                                 instr = IS_INTERRUPTIBLE.set(instr);
 
             if (inst.latchPath)                  instr = PATH_DATA.set(instr);
             else if (inst.path!=null) {