add Marina code
authoradam <adam@megacz.com>
Mon, 3 Nov 2008 10:03:55 +0000 (11:03 +0100)
committeradam <adam@megacz.com>
Mon, 3 Nov 2008 10:03:55 +0000 (11:03 +0100)
src/edu/berkeley/fleet/marina/MarinaDock.java [new file with mode: 0644]
src/edu/berkeley/fleet/marina/MarinaFleet.java [new file with mode: 0644]
src/edu/berkeley/fleet/marina/MarinaShip.java [new file with mode: 0644]
src/edu/berkeley/fleet/two/FleetTwoFleet.java

diff --git a/src/edu/berkeley/fleet/marina/MarinaDock.java b/src/edu/berkeley/fleet/marina/MarinaDock.java
new file mode 100644 (file)
index 0000000..158eef7
--- /dev/null
@@ -0,0 +1,23 @@
+package edu.berkeley.fleet.marina;
+import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.two.*;
+
+public class MarinaDock extends FleetTwoDock {
+
+    public Destination getDataDestination() { return null; }
+    public Destination getInstructionDestination() { return null; }
+    public int         getInstructionFifoSize() { return 0; }
+    public Path getPath(Destination d,BitVector bv) { return null; }
+
+    private boolean isInput;
+    public boolean isInputDock() { return isInput; }
+    public boolean isOutputDock() { return !isInput; }
+
+    public MarinaDock(MarinaShip ship, boolean isInput) {
+        super(ship, null);
+        this.isInput = isInput;
+        ship.addDock(this);
+    }
+
+}
+
diff --git a/src/edu/berkeley/fleet/marina/MarinaFleet.java b/src/edu/berkeley/fleet/marina/MarinaFleet.java
new file mode 100644 (file)
index 0000000..949acde
--- /dev/null
@@ -0,0 +1,40 @@
+package edu.berkeley.fleet.marina;
+import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.two.*;
+import edu.berkeley.fleet.*;
+import java.util.*;
+
+public class MarinaFleet extends FleetTwoFleet {
+
+    private MarinaShip fakeShip = new MarinaShip(this);
+    private MarinaDock onlyDock = new MarinaDock(fakeShip, true);
+
+    public MarinaFleet() {
+        // use "internal encoding"
+        super(true);
+    }
+
+    public BitVector   encodeInstruction(Dock dispatchFrom, Instruction instruction) {
+        return encodeInstruction(instruction, dispatchFrom);
+    }
+
+    public Iterator<Ship> iterator() {
+        return new HashSet<Ship>().iterator();
+    }
+
+    public Ship getShip(String type, int ordinal) {
+        throw new RuntimeException("not implemented");
+    }
+
+    public FleetProcess run(Instruction[] instructions) {
+        throw new RuntimeException("not implemented");
+    }
+
+    public BitVector getDestAddr(Path path) {
+        return new BitVector(0);
+    }
+
+    public Dock getOnlyInputDock() {
+        return onlyDock;
+    }
+}
diff --git a/src/edu/berkeley/fleet/marina/MarinaShip.java b/src/edu/berkeley/fleet/marina/MarinaShip.java
new file mode 100644 (file)
index 0000000..55fd98d
--- /dev/null
@@ -0,0 +1,22 @@
+package edu.berkeley.fleet.marina;
+import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.two.*;
+import java.util.*;
+
+public class MarinaShip extends FleetTwoShip {
+
+    private HashSet<MarinaDock> docks = new HashSet<MarinaDock>();
+
+    public Iterator<Dock> iterator() { return (Iterator<Dock>)(Object)docks.iterator(); }
+
+    private MarinaFleet fleet;
+
+    /*package*/ void addDock(MarinaDock dock) { docks.add(dock); }
+
+    public MarinaShip(MarinaFleet fleet) {
+        super(fleet, null);
+        this.fleet = fleet;
+    }
+
+}
+
index da3e2f1..0f44bc3 100644 (file)
@@ -10,73 +10,190 @@ import static edu.berkeley.fleet.api.Predicate.*;
 /** common subclass for the "FleetTwo" generation of processors, all 37-bit wide, with AM33 encoding */
 public abstract class FleetTwoFleet extends Fleet {
 
-    public static final Mask PACKET_TOKEN               = new Mask("v.................................................");
-    public static final Mask PACKET_DATA                = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv............");
-    public static final Mask PACKET_SIGNAL              = new Mask("......................................v...........");
-    public static final Mask PACKET_DEST                = new Mask(".......................................vvvvvvvvvvv");
-
-    public static final Mask CBD_SIZE                   = new Mask("...............................vvvvvv");
-    public static final Mask CBD_OFFSET                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv......");
-
-    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.....................");
-    public static final Mask P_NOT_A                    = new Mask(".............000.....................");
-    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_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");
-
-    public static final Mask TAIL                       = new Mask("................11...................");
-
-    public static final Mask MOVE                       = new Mask("................01...................");
-    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...");
-    public static final Mask SET_FLAGS_VALUE_NOT_B      = new Mask("...1..");
-    public static final Mask SET_FLAGS_VALUE_C          = new Mask("....1.");
-    public static final Mask SET_FLAGS_VALUE_NOT_C      = new Mask(".....1");
+    public final Mask PACKET_TOKEN;
+    public final Mask PACKET_DATA;
+    public final Mask PACKET_SIGNAL;
+    public final Mask PACKET_DEST;
+
+    public final Mask CBD_SIZE;
+    public final Mask CBD_OFFSET;
+
+    public final Mask WHOLE_WORD;
+    public final Mask DISPATCH_PATH;
+    public final Mask DISPATCH_INSTR;
+    public final Mask I;
+    public final Mask OS;
+    public final Mask P;
+    public final Mask P_NOT_A;
+    public final Mask P_A;
+    public final Mask P_NOT_B;
+    public final Mask P_B;
+    public final Mask P_UNUSED;
+    public final Mask P_OLC_ZERO;
+    public final Mask P_OLC_NONZERO;
+    public final Mask P_ALWAYS;
+
+    public final Mask SHIFT;
+
+    public final Mask TAIL;
+
+    public final Mask MOVE;
+    public final Mask TI;
+    public final Mask DI;
+    public final Mask FLUSH;
+    public final Mask DC;
+    public final Mask DO;
+    public final Mask TO;
+    public final Mask PATH_IMMEDIATE;
+    public final Mask PATH_DATA;
+    public final Mask PATH_NOCHANGE;
+
+    public final Mask SET_OLC_FROM_IMMEDIATE;
+    public final Mask SET_OLC_FROM_DATA_LATCH;
+    public final Mask SET_OLC_FROM_OLC_MINUS_ONE;
+
+    public final Mask SET_ILC_FROM_IMMEDIATE;
+    public final Mask SET_ILC_FROM_INFINITY;
+    public final Mask SET_ILC_FROM_DATA_LATCH;
+
+    public final Mask SET_IMMEDIATE;
+    public final Mask SET_IMMEDIATE_EXTEND;
+
+    public final Mask SET_FLAGS;
+    public final Mask SET_FLAGS_A;
+    public final Mask SET_FLAGS_B;
+    public final Mask SET_FLAGS_VALUE_A;
+    public final Mask SET_FLAGS_VALUE_NOT_A;
+    public final Mask SET_FLAGS_VALUE_B;
+    public final Mask SET_FLAGS_VALUE_NOT_B;
+    public final Mask SET_FLAGS_VALUE_C;
+    public final Mask SET_FLAGS_VALUE_NOT_C;
+
+    public final int  WIDTH_WORD;
+    public final int  WIDTH_PACKET;
+
+    public final long DataLatch_WIDTH;
+    private final long mask;
+
+    public FleetTwoFleet() { this(false); }
+
+    public FleetTwoFleet(boolean useInternalEncoding) {
+        PACKET_TOKEN               = new Mask("v.................................................");
+        PACKET_DATA                = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv............");
+        PACKET_SIGNAL              = new Mask("......................................v...........");
+        PACKET_DEST                = new Mask(".......................................vvvvvvvvvvv");
+
+        CBD_SIZE                   = new Mask("...............................vvvvvv");
+        CBD_OFFSET                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv......");
+
+        WHOLE_WORD                 = new Mask("vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
+
+        if (useInternalEncoding) {
+
+            DISPATCH_PATH              = new Mask("v....................................");
+            DISPATCH_INSTR             = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
+            I                          = new Mask(".................1...................");
+            OS                         = new Mask(".......1.............................");
+            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_UNUSED                   = new Mask(".111111..............................");
+            P_OLC_ZERO                 = new Mask(".010000..............................");
+            P_OLC_NONZERO              = new Mask(".100000..............................");
+            P_ALWAYS                   = new Mask(".000000..............................");
+
+            SHIFT                      = new Mask("..........101111.1vvvvvvvvvvvvvvvvvvv");
+
+            TAIL                       = new Mask("................1....................");
+
+            MOVE                       = new Mask("..........110111.....................");
+            TI                         = new Mask("..........110111..1..................");
+            DI                         = new Mask("..........110111...1.................");
+            FLUSH                      = new Mask("..........110111...01................");
+            DC                         = new Mask("..........110111...11................");
+            DO                         = new Mask("..........110111.....1...............");
+            TO                         = new Mask("..........110111......1..............");
+            PATH_IMMEDIATE             = new Mask("..........110111.......0vvvvvvvvvvvvv");
+            PATH_DATA                  = new Mask("..........110111.......11............");
+            PATH_NOCHANGE              = new Mask("..........110111.......10............");
+
+            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");
+        } else {
+            DISPATCH_PATH              = new Mask("vvvvvvvvvvv..........................");
+            DISPATCH_INSTR             = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv");
+            I                          = new Mask("...........1.........................");
+            OS                         = new Mask("............1........................");
+            P                          = new Mask(".............vvv.....................");
+            P_NOT_A                    = new Mask(".............000.....................");
+            P_A                        = new Mask(".............001.....................");
+            P_NOT_B                    = new Mask(".............010.....................");
+            P_B                        = new Mask(".............011.....................");
+            P_UNUSED                   = new Mask(".............100.....................");
+            P_OLC_ZERO                 = new Mask(".............101.....................");
+            P_OLC_NONZERO              = new Mask(".............110.....................");
+            P_ALWAYS                   = new Mask(".............111.....................");
+
+            SHIFT                      = new Mask("................00vvvvvvvvvvvvvvvvvvv");
+
+            TAIL                       = new Mask("................11...................");
+
+            MOVE                       = new Mask("................01...................");
+            TI                         = new Mask("................011..................");
+            DI                         = new Mask("................01.1.................");
+            FLUSH                      = new Mask("................01.01................");
+            DC                         = new Mask("................01.11................");
+            DO                         = new Mask("................01...1...............");
+            TO                         = new Mask("................01....1..............");
+            PATH_IMMEDIATE             = new Mask("................01.....1vvvvvvvvvvvvv");
+            PATH_DATA                  = new Mask("................01.....01............");
+            PATH_NOCHANGE              = new Mask("................01.....00............");
+
+            SET_OLC_FROM_IMMEDIATE     = new Mask("................101000100......vvvvvv");
+            SET_OLC_FROM_DATA_LATCH    = new Mask("................101000010............");
+            SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................101000001............");
+
+            SET_ILC_FROM_IMMEDIATE     = new Mask("................10010010......0vvvvvv");
+            SET_ILC_FROM_INFINITY      = new Mask("................10010010......1......");
+            SET_ILC_FROM_DATA_LATCH    = new Mask("................10010001.............");
+
+            SET_IMMEDIATE              = new Mask("................100010.vvvvvvvvvvvvvv");
+            SET_IMMEDIATE_EXTEND       = new Mask("................100010v..............");
+
+            SET_FLAGS                  = new Mask("................100001...............");
+            SET_FLAGS_A                = new Mask("................100001...vvvvvv......");
+            SET_FLAGS_B                = new Mask("................100001.........vvvvvv");
+        }
+        SET_FLAGS_VALUE_A          = new Mask("1.....");
+        SET_FLAGS_VALUE_NOT_A      = new Mask(".1....");
+        SET_FLAGS_VALUE_B          = new Mask("..1...");
+        SET_FLAGS_VALUE_NOT_B      = new Mask("...1..");
+        SET_FLAGS_VALUE_C          = new Mask("....1.");
+        SET_FLAGS_VALUE_NOT_C      = new Mask(".....1");
+
+        WIDTH_WORD                 = PACKET_DATA.valmaskwidth;
+        WIDTH_PACKET               = PACKET_TOKEN.width;
+        DataLatch_WIDTH = SET_IMMEDIATE.valmaskmax-SET_IMMEDIATE.valmaskmin+1;  // FIXME: this is an abstraction breakage
+        mask  = ~(-1L << DataLatch_WIDTH);
+    }
 
     // Misc //////////////////////////////////////////////////////////////////////////////
 
-    public static final long DataLatch_WIDTH = SET_IMMEDIATE.valmaskmax-SET_IMMEDIATE.valmaskmin+1;  // FIXME: this is an abstraction breakage
-    private static final long mask  = ~(-1L << DataLatch_WIDTH);
-    public static boolean isSmallEnoughToFit(long immediate) {
+    public boolean isSmallEnoughToFit(long immediate) {
         if ((immediate & ~mask) == 0)   return true;
         if ((immediate |  mask) == -1L) return true;
         return false;
@@ -190,6 +307,7 @@ public abstract class FleetTwoFleet extends Fleet {
         throw new RuntimeException("unknown instruction: 0x" + Long.toString(inst, 16));
     }
 
+    // FIXME: should use BitVector here
     public long writeInstruction(Instruction d, Dock dispatchFrom) {
         long instr = 0;