add Fleet.{getShiftWidth(),getSetWidth()}
[fleet.git] / src / edu / berkeley / fleet / two / FleetTwoFleet.java
index 2ec3680..93f145e 100644 (file)
@@ -21,7 +21,9 @@ public abstract class FleetTwoFleet extends Fleet {
     public static final int  WIDTH_WORD                 = PACKET_DATA.valmaskwidth;
     public static final int  WIDTH_PACKET               = PACKET_TOKEN.width;
 
+    public static final Mask WHOLE_WORD                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
     public static final Mask DISPATCH_PATH              = new Mask("vvvvvvvvvvv..........................");
+    public static final Mask DISPATCH_INSTR             = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv");
     public static final Mask I                          = new Mask("...........1.........................");
     public static final Mask OS                         = new Mask("............1........................");
     public static final Mask P                          = new Mask(".............vvv.....................");
@@ -29,9 +31,9 @@ public abstract class FleetTwoFleet extends Fleet {
     public static final Mask P_A                        = new Mask(".............001.....................");
     public static final Mask P_NOT_B                    = new Mask(".............010.....................");
     public static final Mask P_B                        = new Mask(".............011.....................");
-    public static final Mask P_NOT_C                    = new Mask(".............100.....................");
-    public static final Mask P_C                        = new Mask(".............101.....................");
-    public static final Mask P_OLC                      = new Mask(".............110.....................");
+    public static final Mask P_UNUSED                   = new Mask(".............100.....................");
+    public static final Mask P_OLC_ZERO                 = new Mask(".............101.....................");
+    public static final Mask P_OLC_NONZERO              = new Mask(".............110.....................");
     public static final Mask P_ALWAYS                   = new Mask(".............111.....................");
 
     public static final Mask SHIFT                      = new Mask("................00vvvvvvvvvvvvvvvvvvv");
@@ -39,31 +41,30 @@ public abstract class FleetTwoFleet extends Fleet {
     public static final Mask TAIL                       = new Mask("................11...................");
 
     public static final Mask MOVE                       = new Mask("................01...................");
-    public static final Mask TI                         = new Mask("..................1..................");
-    public static final Mask DI                         = new Mask("...................1.................");
-    public static final Mask DC                         = new Mask("....................1................");
-    public static final Mask DO                         = new Mask(".....................1...............");
-    public static final Mask TO                         = new Mask("......................1..............");
-    public static final Mask PATH_IMMEDIATE             = new Mask(".......................1vvvvvvvvvvvvv");
-    public static final Mask PATH_DATA                  = new Mask(".......................01............");
-    public static final Mask PATH_NOCHANGE              = new Mask(".......................00............");
-
-    public static final Mask SET                        = new Mask("................10...................");
-
-    public static final Mask SET_OLC_FROM_IMMEDIATE     = new Mask("................1010000100.....vvvvvv");
-    public static final Mask SET_OLC_FROM_DATA_LATCH    = new Mask("................1010000010...........");
-    public static final Mask SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................1010000001...........");
-
-    public static final Mask SET_ILC_FROM_IMMEDIATE     = new Mask("................1001000100.....vvvvvv");
-    public static final Mask SET_ILC_FROM_INFINITY      = new Mask("................1001000010...........");
-    public static final Mask SET_ILC_FROM_DATA_LATCH    = new Mask("................1001000001...........");
-
-    public static final Mask SET_IMMEDIATE                = new Mask("................1000100.vvvvvvvvvvvvv");
-    public static final Mask SET_IMMEDIATE_EXTEND         = new Mask("................1000100v.............");
-
-    public static final Mask SET_FLAGS                  = new Mask("................1000010..............");
-    public static final Mask SET_FLAGS_A                = new Mask("................1000010..vvvvvv......");
-    public static final Mask SET_FLAGS_B                = new Mask("................1000010........vvvvvv");
+    public static final Mask TI                         = new Mask("................011..................");
+    public static final Mask DI                         = new Mask("................01.1.................");
+    public static final Mask FLUSH                      = new Mask("................01.01................");
+    public static final Mask DC                         = new Mask("................01.11................");
+    public static final Mask DO                         = new Mask("................01...1...............");
+    public static final Mask TO                         = new Mask("................01....1..............");
+    public static final Mask PATH_IMMEDIATE             = new Mask("................01.....1vvvvvvvvvvvvv");
+    public static final Mask PATH_DATA                  = new Mask("................01.....01............");
+    public static final Mask PATH_NOCHANGE              = new Mask("................01.....00............");
+
+    public static final Mask SET_OLC_FROM_IMMEDIATE     = new Mask("................101000100......vvvvvv");
+    public static final Mask SET_OLC_FROM_DATA_LATCH    = new Mask("................101000010............");
+    public static final Mask SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................101000001............");
+
+    public static final Mask SET_ILC_FROM_IMMEDIATE     = new Mask("................10010010......0vvvvvv");
+    public static final Mask SET_ILC_FROM_INFINITY      = new Mask("................10010010......1......");
+    public static final Mask SET_ILC_FROM_DATA_LATCH    = new Mask("................10010001.............");
+
+    public static final Mask SET_IMMEDIATE              = new Mask("................100010.vvvvvvvvvvvvvv");
+    public static final Mask SET_IMMEDIATE_EXTEND       = new Mask("................100010v..............");
+
+    public static final Mask SET_FLAGS                  = new Mask("................100001...............");
+    public static final Mask SET_FLAGS_A                = new Mask("................100001...vvvvvv......");
+    public static final Mask SET_FLAGS_B                = new Mask("................100001.........vvvvvv");
     public static final Mask SET_FLAGS_VALUE_A          = new Mask("1.....");
     public static final Mask SET_FLAGS_VALUE_NOT_A      = new Mask(".1....");
     public static final Mask SET_FLAGS_VALUE_B          = new Mask("..1...");
@@ -71,8 +72,6 @@ public abstract class FleetTwoFleet extends Fleet {
     public static final Mask SET_FLAGS_VALUE_C          = new Mask("....1.");
     public static final Mask SET_FLAGS_VALUE_NOT_C      = new Mask(".....1");
 
-    public static final Mask SET_TAPL_FROM_IMMEDIATE    = new Mask("................1000001.vvvvvvvvvvvvv");
-
     // Misc //////////////////////////////////////////////////////////////////////////////
 
     public static final long DataLatch_WIDTH = SET_IMMEDIATE.valmaskmax-SET_IMMEDIATE.valmaskmin+1;  // FIXME: this is an abstraction breakage
@@ -91,9 +90,27 @@ public abstract class FleetTwoFleet extends Fleet {
     // FIXME this should use a BitVector not a long!
     protected abstract long getDestAddr(Path box);
 
+    private static final BitVector SIGNAL_ZERO = new BitVector(1);
+    private static final BitVector SIGNAL_ONE  = new BitVector(1);
+    static {
+        SIGNAL_ONE.set(0,true);
+    }
+
     /** decode a path, given the starting point and the bits that comprise it */
     // FIXME this should use a BitVector not a long!
-    protected abstract Path getPathByAddr(Dock source, long dest);
+    //protected abstract Path getPathByAddr(Dock source, long dest);
+    public Path getPathByAddr(Dock source, long dest) {
+        for(Ship ship : this)
+            for(Dock bb : ship) {
+                for(Destination d : new Destination[] { bb.getInstructionDestination(), bb.getDataDestination() }) {
+                    for(BitVector signal : new BitVector[] { SIGNAL_ZERO, SIGNAL_ONE }) {
+                        Path p = (Path)source.getPath(d, signal);
+                        if (getDestAddr(p) == dest) return p;
+                    }
+                }
+            }
+        return null;
+    }
 
     /** read a machine-formatted instruction from a file (into a Java object) */
     public Instruction readInstruction(DataInputStream is, Dock dispatchFrom) throws IOException {
@@ -111,6 +128,10 @@ public abstract class FleetTwoFleet extends Fleet {
         }
     }
 
+    public int getShiftWidth() { return SHIFT.valmaskwidth; }
+    public int getSetWidth() { return SET_IMMEDIATE.valmaskwidth+1; }
+
+    // FIXME: should use BitVector here
     public Instruction readInstruction(long inst, Dock dispatchFrom) {
         Dock dock = getPathByAddr(dispatchFrom, DISPATCH_PATH.getval(inst)).getDestination().getDock();
 
@@ -118,15 +139,16 @@ public abstract class FleetTwoFleet extends Fleet {
 
         Predicate predicate = Default;
         if (P_ALWAYS.get(inst)) predicate = IgnoreOLC;
-        if (P_OLC.get(inst))    predicate = Default;
+        if (P_OLC_NONZERO.get(inst))    predicate = Default;
+        if (P_OLC_ZERO.get(inst))    predicate = OLCZero;
         if (P_A.get(inst))      predicate = FlagA;
         if (P_B.get(inst))      predicate = FlagB;
-        if (P_C.get(inst))      predicate = FlagC;
         if (P_NOT_A.get(inst))  predicate = NotFlagA;
         if (P_NOT_B.get(inst))  predicate = NotFlagB;
-        if (P_NOT_C.get(inst))  predicate = NotFlagC;
 
         boolean looping = !OS.get(inst);
+        if (FLUSH.get(inst))
+            return new Flush(dock, looping, predicate);
         if (SHIFT.get(inst))                return new Shift(dock, looping, predicate, new BitVector(dock.getShip().getFleet().getWordWidth()).set(SHIFT.getval(inst)));
         if (SET_IMMEDIATE.get(inst)) {
             boolean extend = SET_IMMEDIATE_EXTEND.getval(inst) != 0;
@@ -166,8 +188,6 @@ public abstract class FleetTwoFleet extends Fleet {
             if (SET_FLAGS_VALUE_NOT_C.get(flag_b)) bp = bp.add(NotFlagC );
             return new Set(dock, looping, predicate, ap, bp);
         }
-        if (SET_TAPL_FROM_IMMEDIATE.get(inst))
-            return new Set(dock, looping, predicate, SetDest.TAPL, getPathByAddr(dock, SET_TAPL_FROM_IMMEDIATE.getval(inst)));
         if (MOVE.get(inst))
             return new Move(dock,
                             looping,
@@ -195,13 +215,13 @@ public abstract class FleetTwoFleet extends Fleet {
         if (!pi.looping) instr = OS.set(instr);
         switch(pi.predicate) {
             case IgnoreOLC:         instr = P_ALWAYS.set(instr); break;
-            case Default: instr = P_OLC.set(instr); break;
+            case OLCZero:         instr = P_OLC_ZERO.set(instr); break;
+            case Default: instr = P_OLC_NONZERO.set(instr); break;
             case FlagA:      instr = P_A.set(instr);      break;
             case FlagB:      instr = P_B.set(instr);      break;
-            case FlagC:      instr = P_C.set(instr);      break;
             case NotFlagA:  instr = P_NOT_A.set(instr);      break;
             case NotFlagB:  instr = P_NOT_B.set(instr);      break;
-            case NotFlagC:  instr = P_NOT_C.set(instr);      break;
+            default: throw new RuntimeException("error!");
         }
 
         if (d instanceof Tail) {
@@ -212,6 +232,9 @@ public abstract class FleetTwoFleet extends Fleet {
             instr = SHIFT.set(instr);
             instr = SHIFT.setval(instr, shift.immediate);
 
+        } else if (d instanceof Flush) {
+            instr = FLUSH.set(instr);
+
         } else if (d instanceof Set) {
             Set s = (Set)d;
             switch(s.dest) {
@@ -241,11 +264,6 @@ public abstract class FleetTwoFleet extends Fleet {
                             break;
                     }
                     break;
-                case TAPL: {
-                    instr = SET_TAPL_FROM_IMMEDIATE.set(instr);
-                    instr = SET_TAPL_FROM_IMMEDIATE.setval(instr, getDestAddr(s.path));
-                    break;
-                }
                 case Flags: {
                     instr = SET_FLAGS.set(instr);
                     instr = SET_FLAGS_A.setval(instr, flagFunctionToLong(s.newFlagA));