public final Mask DISPATCH_PATH;
public final Mask DISPATCH_INSTR;
public final Mask NOT_INTERRUPTIBLE;
+ public final Mask IS_INTERRUPTIBLE;
public final Mask P;
public final Mask P_NOT_A;
public final Mask P_A;
DISPATCH_PATH = new Mask("v....................................");
DISPATCH_INSTR = new Mask(".vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv");
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..............................");
+ 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..............................");
-
- // use these when Marina gets updated to 07-Jan-2009 version of internal encoding
HEAD = new Mask(".......1.............................");
- ABORT = new Mask("........1............................");
+ ABORT = new Mask("........1......1.........000100000001");
TAIL = new Mask(".........1...........................");
// actually "is interruptible"
- NOT_INTERRUPTIBLE = new Mask("...........1....1....................");
+ NOT_INTERRUPTIBLE = new Mask("...........0....0....................");
+ IS_INTERRUPTIBLE = new Mask("...........1....1....................");
SHIFT = new Mask("..........1......1vvvvvvvvvvvvvvvvvvv");
SET_IMMEDIATE = new Mask("..........1......0.....vvvvvvvvvvvvvv");
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_OLC_FROM_DATA_LATCH = new Mask("...............1.11..................");
- SET_OLC_FROM_OLC_MINUS_ONE = new Mask("...............1.10..................");
- SET_ILC_FROM_IMMEDIATE = new Mask("...............1.00..........0.vvvvvv");
- SET_ILC_FROM_INFINITY = new Mask("...............1.0...........1.......");
- SET_ILC_FROM_DATA_LATCH = new Mask("...............1.01..................");
+ 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");
DISPATCH_PATH = new Mask("vvvvvvvvvvv..........................");
DISPATCH_INSTR = new Mask("...........vvvvvvvvvvvvvvvvvvvvvvvvvv");
NOT_INTERRUPTIBLE = new Mask("...........1.........................");
+ IS_INTERRUPTIBLE = new Mask("...........0.........................");
P = new Mask(".............vvv.....................");
P_NOT_A = new Mask(".............000.....................");
P_A = new Mask(".............001.....................");
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();
} 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) {