public final Mask DISPATCH_PATH;
public final Mask DISPATCH_INSTR;
public final Mask NOT_INTERRUPTIBLE;
- public final Mask OS;
+ public final Mask IS_INTERRUPTIBLE;
public final Mask P;
public final Mask P_NOT_A;
public final Mask P_A;
public final int WIDTH_WORD;
public final int WIDTH_PACKET;
- public final long DataLatch_WIDTH;
+ public final int DataLatch_WIDTH;
private final long mask;
public FleetTwoFleet() { this(false); }
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");
DISPATCH_PATH = new Mask("v....................................");
DISPATCH_INSTR = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
- NOT_INTERRUPTIBLE = new Mask(".................1...................");
- OS = new Mask(".......1.............................");
P = new Mask(".vvvvvv..............................");
- P_NOT_A = new Mask(".011110..............................");
- P_A = new Mask(".011101..............................");
- P_NOT_B = new Mask(".011011..............................");
- P_B = new Mask(".010111..............................");
- P_UNUSED = new Mask(".000000..............................");
- P_OLC_ZERO = new Mask(".101111..............................");
- P_OLC_NONZERO = new Mask(".011111..............................");
- P_ALWAYS = new Mask(".111111..............................");
-
- SHIFT = new Mask("..........101111.1vvvvvvvvvvvvvvvvvvv");
-
- /*
- // use these when Marina gets updated to 07-Jan-2009 version of internal encoding
+ 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(".100000..............................");
+ P_OLC_NONZERO = new Mask(".010000..............................");
+ P_ALWAYS = new Mask(".000000..............................");
+
HEAD = new Mask(".......1.............................");
- ABORT = new Mask("........1............................");
+ ABORT = new Mask("........1......1.........000100000001");
TAIL = new Mask(".........1...........................");
- */
-
- TAIL = new Mask("................1...................0");
- HEAD = null;
- ABORT = null;
-
- MOVE = new Mask("..........110111.....................");
- TI = new Mask("..........110111..1..................");
- DI = new Mask("..........110111...1.................");
- FLUSH = new Mask(".........1110111.....................");
- DC = new Mask("..........110111....1................");
- DO = new Mask("..........110111.....1...............");
- TO = new Mask("..........110111......1..............");
- PATH_IMMEDIATE = new Mask("..........110111.......1vvvvvvvvvvvvv");
- PATH_DATA = new Mask("..........110111.......00............");
- PATH_NOCHANGE = new Mask("..........110111.......01............");
-
- 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......");
+
+ // actually "is interruptible"
+ NOT_INTERRUPTIBLE = new Mask("...........0....0....................");
+ IS_INTERRUPTIBLE = new Mask("...........1....1....................");
+
+ SHIFT = new Mask("..........1......1vvvvvvvvvvvvvvvvvvv");
+ SET_IMMEDIATE = new Mask("..........1......0.....vvvvvvvvvvvvvv");
+ SET_IMMEDIATE_EXTEND = new Mask("..........1......0....v..............");
+ MOVE = new Mask("............1........................");
+ TI = new Mask("............1.....1..................");
+ DI = new Mask("............1......1.................");
+ FLUSH = new Mask("..........1......0.....011...........");
+ DC = new Mask("............1.......1................");
+ DO = new Mask("............1........1...............");
+ TO = new Mask("............1.........1..............");
+ PATH_IMMEDIATE = new Mask("............1..........1vvvvvvvvvvvvv");
+ 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_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");
+ SET_FLAGS_B = new Mask("...............1.........vvvvvv......");
SET_FLAGS_VALUE_A = new Mask(".....1");
SET_FLAGS_VALUE_NOT_A = new Mask("....1.");
DISPATCH_PATH = new Mask("vvvvvvvvvvv..........................");
DISPATCH_INSTR = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv");
NOT_INTERRUPTIBLE = new Mask("...........1.........................");
- OS = new Mask("............1........................");
+ IS_INTERRUPTIBLE = new Mask("...........0.........................");
P = new Mask(".............vvv.....................");
P_NOT_A = new Mask(".............000.....................");
P_A = new Mask(".............001.....................");
return false;
}
+ public boolean isSmallEnoughToFit(BitVector immediate) {
+ boolean b = immediate.get((int)DataLatch_WIDTH);
+ for(int i=DataLatch_WIDTH+1; i<immediate.length(); i++)
+ if (immediate.get(i) != b) return false;
+ return true;
+ }
+
public int getWordWidth() { return 37; }
//////////////////////////////////////////////////////////////////////////////
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();
if (P_NOT_A.get(inst)) predicate = NotFlagA;
if (P_NOT_B.get(inst)) predicate = NotFlagB;
- boolean looping = !OS.get(inst);
if (FLUSH.get(inst))
- return new Flush(dock, looping, predicate);
+ return new Flush(dock, predicate);
if (ABORT.get(inst))
return new Abort(dock, predicate);
- if (SHIFT.get(inst)) return new Shift(dock, looping, predicate, new BitVector(dock.getShip().getFleet().getShiftWidth()).set(SHIFT.getval(inst)));
+ if (SHIFT.get(inst)) return new Shift(dock, 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);
if (extend) immediate |= (-1L << DataLatch_WIDTH);
- return new Set(dock, looping, predicate, SetDest.DataLatch, (immediate));
+ return new Set(dock, predicate, SetDest.DataLatch, (immediate));
}
if (SET_OLC_FROM_OLC_MINUS_ONE.get(inst))
- return new Set(dock, looping, predicate, SetDest.OuterLoopCounter, SetSource.Decrement);
+ return new Set(dock, predicate, SetDest.OuterLoopCounter, SetSource.Decrement);
if (SET_OLC_FROM_IMMEDIATE.get(inst))
- return new Set(dock, looping, predicate, SetDest.OuterLoopCounter, (SET_OLC_FROM_IMMEDIATE.getval(inst)));
+ return new Set(dock, predicate, SetDest.OuterLoopCounter, (SET_OLC_FROM_IMMEDIATE.getval(inst)));
if (SET_ILC_FROM_IMMEDIATE.get(inst))
- return new Set(dock, looping, predicate, SetDest.InnerLoopCounter, (SET_ILC_FROM_IMMEDIATE.getval(inst)));
+ return new Set(dock, predicate, SetDest.InnerLoopCounter, (SET_ILC_FROM_IMMEDIATE.getval(inst)));
if (SET_OLC_FROM_DATA_LATCH.get(inst))
- return new Set(dock, looping, predicate, SetDest.OuterLoopCounter, SetSource.DataLatch);
+ return new Set(dock, predicate, SetDest.OuterLoopCounter, SetSource.DataLatch);
if (SET_ILC_FROM_DATA_LATCH.get(inst))
- return new Set(dock, looping, predicate, SetDest.InnerLoopCounter, SetSource.DataLatch);
+ return new Set(dock, predicate, SetDest.InnerLoopCounter, SetSource.DataLatch);
if (SET_ILC_FROM_INFINITY.get(inst))
- return new Set(dock, looping, predicate, SetDest.InnerLoopCounter, SetSource.Infinity);
+ return new Set(dock, predicate, SetDest.InnerLoopCounter, SetSource.Infinity);
if (SET_FLAGS.get(inst)) {
long flag_a = SET_FLAGS_A.getval(inst);
long flag_b = SET_FLAGS_B.getval(inst);
if (SET_FLAGS_VALUE_NOT_B.get(flag_b)) bp = bp.add(NotFlagB );
if (SET_FLAGS_VALUE_C .get(flag_b)) bp = bp.add(FlagC );
if (SET_FLAGS_VALUE_NOT_C.get(flag_b)) bp = bp.add(NotFlagC );
- return new Set(dock, looping, predicate, ap, bp);
+ return new Set(dock, predicate, ap, bp);
}
if (MOVE.get(inst))
return new Move(dock,
- looping,
predicate,
!NOT_INTERRUPTIBLE.get(inst),
- getPathByAddr(dock, PATH_IMMEDIATE.getvalAsBitVector(inst)),
+ PATH_DATA.get(inst)?null:getPathByAddr(dock, PATH_IMMEDIATE.getvalAsBitVector(inst)),
TI.get(inst),
DI.get(inst),
hack?(!DC.get(inst)):DC.get(inst),
boolean dl = false;
Instruction pi = d;
- if (!pi.looping) instr = OS.set(instr);
switch(pi.predicate) {
case IgnoreFlagD: instr = P_ALWAYS.set(instr); break;
case FlagD: instr = P_OLC_ZERO.set(instr); break;
} else if (d instanceof Shift) {
Shift shift = (Shift)d;
instr = SHIFT.set(instr);
- instr = SHIFT.setval(instr, shift.immediate);
+ instr = SHIFT.setval(instr, shift.immediate.getBitVector());
} else if (d instanceof Flush) {
instr = FLUSH.set(instr);
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) {