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 {
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) {
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;
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;
}
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
}
//////////////////////////////////////////////////////////////////////////////
/** 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;
}
}
}
// 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);
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);
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),
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;
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 {