make getDestAddr() return a BitVector
authoradam <adam@megacz.com>
Mon, 3 Nov 2008 09:49:10 +0000 (10:49 +0100)
committeradam <adam@megacz.com>
Mon, 3 Nov 2008 09:49:10 +0000 (10:49 +0100)
src/edu/berkeley/fleet/fpga/Fpga.java
src/edu/berkeley/fleet/interpreter/Interpreter.java
src/edu/berkeley/fleet/interpreter/InterpreterDock.java
src/edu/berkeley/fleet/two/FleetTwoFleet.java

index ec45ab3..7566cee 100644 (file)
@@ -51,6 +51,10 @@ public class Fpga extends FleetTwoFleet {
         } catch (Exception e) { throw new RuntimeException(e); }
     }
 
+    public BitVector getDestAddr(Path path) {
+        return ((FpgaPath)path).toBitVector();
+    }
+
     // Setup //////////////////////////////////////////////////////////////////////////////
 
     public Ship createShip(String type, String name) throws IOException {
@@ -402,15 +406,4 @@ public class Fpga extends FleetTwoFleet {
         } catch (Exception e) { throw new RuntimeException(e); }
     }
 
-    public long getDestAddr(Path path) {
-        return ((FpgaPath)path).toLong();
-    }
-    public Dock getBoxByInstAddr(long dest) {
-        for(Ship ship : Fpga.this)
-            for(Dock bb : ship)
-                if (((FpgaDestination)((FpgaDock)bb).getInstructionDestination()).getAddr() == dest)
-                    return bb;
-        return null;
-    }
-
 }
index 9f0f6af..3cd2558 100644 (file)
@@ -74,14 +74,14 @@ public class Interpreter extends FleetTwoFleet implements Parser.FleetWithDynami
 
     // Instruction Encoding /////////////////////////////////////////////////////////////////////////
 
-    public long getDestAddr(Path path) {
+    public BitVector getDestAddr(Path path) {
         long ret = ((InterpreterDestination)path.getDestination()).addr;
         BitVector bv = path.getSignal();
         if (bv != null) {
             if (bv.length() > 1) throw new RuntimeException("signal was " + bv.length() + " bits long!");
             if (bv.length() > 0 && bv.get(0)) ret |= 1;
         }
-        return ret;
+        throw new RuntimeException("fixme");
     }
 
 
index b83d26f..d1c6968 100644 (file)
@@ -5,7 +5,6 @@ import edu.berkeley.fleet.two.*;
 import edu.berkeley.fleet.api.*;
 import edu.berkeley.fleet.api.Instruction;
 import static edu.berkeley.fleet.api.Predicate.*;
-import static edu.berkeley.fleet.two.FleetTwoFleet.SHIFT;
 
 /** anything that has a source (instruction horn) address on the switch fabric */
 class InterpreterDock extends FleetTwoDock {
@@ -164,13 +163,16 @@ class InterpreterDock extends FleetTwoDock {
             instructions.add(executing);
 
         if (executing instanceof Instruction.Shift) {
+            /*
             Instruction.Shift shift = (Instruction.Shift)executing;
-            for(int i=dataLatch.length()-1; i>=SHIFT.valmaskwidth; i--)
-                dataLatch.set(i, dataLatch.get(i-SHIFT.valmaskwidth));
-            for(int i=SHIFT.valmaskwidth-1; i>=0; i--)
+            for(int i=dataLatch.length()-1; i>=getShip().getFleet().getShiftWidth(); i--)
+                dataLatch.set(i, dataLatch.get(i-getShip().getFleet().getShiftWidth()));
+            for(int i=getShip().getFleet().getShiftWidth()-1; i>=0; i--)
                 dataLatch.set(i, shift.immediate.get(i));
             executing = null;
             return;
+            */
+            throw new RuntimeException("FIXME");
         }
 
         if (executing instanceof Instruction.Set) {
@@ -186,7 +188,7 @@ class InterpreterDock extends FleetTwoDock {
                             break;
                         case DataLatch:
                             ilc = 0;
-                            for(int i=0; i<FleetTwoFleet.SET_ILC_FROM_IMMEDIATE.valmaskwidth-1; i++)
+                            for(int i=0; i<((FleetTwoFleet)getShip().getFleet()).SET_ILC_FROM_IMMEDIATE.valmaskwidth-1; i++)
                                 if (dataLatch.get(i))
                                     ilc |= (1 << i);
                             break;
@@ -205,7 +207,7 @@ class InterpreterDock extends FleetTwoDock {
                             break;
                         case DataLatch:
                             olc = 0;
-                            for(int i=0; i<FleetTwoFleet.SET_OLC_FROM_IMMEDIATE.valmaskwidth-1; i++)
+                            for(int i=0; i<((FleetTwoFleet)getShip().getFleet()).SET_OLC_FROM_IMMEDIATE.valmaskwidth-1; i++)
                                 if (dataLatch.get(i))
                                     olc |= (1 << i);
                             if (olc==0) hatchIsOpen = true;
@@ -277,7 +279,7 @@ class InterpreterDock extends FleetTwoDock {
             }
             if (move.latchData) dataLatch = bv;
             if (move.latchPath)
-                pathLatch = (InterpreterPath)getInterpreter().getPathByAddr(this, FleetTwoFleet.DISPATCH_PATH.getval(bv));
+                pathLatch = (InterpreterPath)getInterpreter().getPathByAddr(this, ((FleetTwoFleet)getShip().getFleet()).DISPATCH_PATH.getvalAsBitVector(bv.toLong()));
             // FIXME: c-flag at output docks
         }
 
index 93f145e..921c0b6 100644 (file)
@@ -87,25 +87,19 @@ public abstract class FleetTwoFleet extends Fleet {
     //////////////////////////////////////////////////////////////////////////////
 
     /** get the bits describing this box's location on the DESTINATION HORN */
-    // FIXME this should use a BitVector not a long!
-    protected abstract long getDestAddr(Path box);
+    protected abstract BitVector 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);
-    }
+    private static final BitVector SIGNAL_ONE  = new BitVector(1).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);
-    public Path getPathByAddr(Dock source, long dest) {
+    public Path getPathByAddr(Dock source, BitVector 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;
+                        if (getDestAddr(p).equals(dest)) return p;
                     }
                 }
             }
@@ -133,7 +127,7 @@ public abstract class FleetTwoFleet extends Fleet {
 
     // FIXME: should use BitVector here
     public Instruction readInstruction(long inst, Dock dispatchFrom) {
-        Dock dock = getPathByAddr(dispatchFrom, DISPATCH_PATH.getval(inst)).getDestination().getDock();
+        Dock dock = getPathByAddr(dispatchFrom, DISPATCH_PATH.getvalAsBitVector(inst)).getDestination().getDock();
 
         if (TAIL.get(inst))   return new Tail(dock);
 
@@ -149,7 +143,7 @@ public abstract class FleetTwoFleet extends Fleet {
         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 (SHIFT.get(inst))                return new Shift(dock, looping, 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);
@@ -193,7 +187,7 @@ public abstract class FleetTwoFleet extends Fleet {
                             looping,
                             predicate,
                             I.get(inst),
-                            getPathByAddr(dock, PATH_IMMEDIATE.getval(inst)),
+                            getPathByAddr(dock, PATH_IMMEDIATE.getvalAsBitVector(inst)),
                             TI.get(inst),
                             DI.get(inst),
                             DC.get(inst),
@@ -207,8 +201,13 @@ public abstract class FleetTwoFleet extends Fleet {
     public long writeInstruction(Instruction d, Dock dispatchFrom) {
         long instr = 0;
 
-        if (d.dock != null)
-            instr = DISPATCH_PATH.setval(instr, getDestAddr(dispatchFrom.getPath(d.dock.getInstructionDestination(),null)));
+        if (d.dock != null) {
+            BitVector bv = getDestAddr(dispatchFrom.getPath(d.dock.getInstructionDestination(),null));
+            BitVector bv2 = new BitVector(DISPATCH_PATH.valmaskwidth);
+            for(int i=0; i<bv2.length(); i++)
+                bv2.set(i, bv.get(i));
+            instr = DISPATCH_PATH.setval(instr, bv2);
+        }
 
         boolean dl = false;
         Instruction pi = d;
@@ -291,7 +290,13 @@ public abstract class FleetTwoFleet extends Fleet {
             if (inst.latchPath)                  instr = PATH_DATA.set(instr);
             else {
                 instr  = PATH_IMMEDIATE.set(instr);
-                instr  = PATH_IMMEDIATE.setval(instr, inst.path==null?0:getDestAddr(inst.path));
+                if (inst.path != null) {
+                    BitVector bv  = getDestAddr(inst.path);
+                    BitVector bv2 = new BitVector(PATH_IMMEDIATE.valmaskwidth);
+                    for(int i=0; i<Math.min(bv.length(),bv2.length()); i++)
+                        bv2.set(i, bv.get(i));
+                    instr  = PATH_IMMEDIATE.setval(instr, bv2);
+                }
             }
 
         } else {