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_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_NOT_C = new Mask(".............100.....................");
- public static final Mask P_C = new Mask(".............101.....................");
- public static final Mask P_OLC = new Mask(".............110.....................");
+ 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("..................1..................");
- public static final Mask DI = new Mask("...................1.................");
- public static final Mask DC = new Mask("....................1................");
- public static final Mask DO = new Mask(".....................1...............");
- public static final Mask TO = new Mask("......................1..............");
- public static final Mask PATH_IMMEDIATE = new Mask(".......................1vvvvvvvvvvvvv");
- public static final Mask PATH_DATA = new Mask(".......................01............");
- public static final Mask PATH_NOCHANGE = new Mask(".......................00............");
-
- public static final Mask SET = new Mask("................10...................");
-
- public static final Mask SET_OLC_FROM_IMMEDIATE = new Mask("................1010000100.....vvvvvv");
- public static final Mask SET_OLC_FROM_DATA_LATCH = new Mask("................1010000010...........");
- public static final Mask SET_OLC_FROM_OLC_MINUS_ONE = new Mask("................1010000001...........");
-
- public static final Mask SET_ILC_FROM_IMMEDIATE = new Mask("................1001000100.....vvvvvv");
- public static final Mask SET_ILC_FROM_INFINITY = new Mask("................1001000010...........");
- public static final Mask SET_ILC_FROM_DATA_LATCH = new Mask("................1001000001...........");
-
- public static final Mask SET_IMMEDIATE = new Mask("................1000100.vvvvvvvvvvvvv");
- public static final Mask SET_IMMEDIATE_EXTEND = new Mask("................1000100v.............");
-
- public static final Mask SET_FLAGS = new Mask("................1000010..............");
- public static final Mask SET_FLAGS_A = new Mask("................1000010..vvvvvv......");
- public static final Mask SET_FLAGS_B = new Mask("................1000010........vvvvvv");
+ 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_C = new Mask("....1.");
public static final Mask SET_FLAGS_VALUE_NOT_C = new Mask(".....1");
- public static final Mask SET_TAPL_FROM_IMMEDIATE = new Mask("................1000001.vvvvvvvvvvvvv");
-
// Misc //////////////////////////////////////////////////////////////////////////////
public static final long DataLatch_WIDTH = SET_IMMEDIATE.valmaskmax-SET_IMMEDIATE.valmaskmin+1; // FIXME: this is an abstraction breakage
// FIXME this should use a BitVector not a long!
protected abstract long 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);
+ }
+
/** 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);
+ //protected abstract Path getPathByAddr(Dock source, long dest);
+ public Path getPathByAddr(Dock source, long 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;
+ }
+ }
+ }
+ return null;
+ }
/** read a machine-formatted instruction from a file (into a Java object) */
public Instruction readInstruction(DataInputStream is, Dock dispatchFrom) throws IOException {
}
}
+ public int getShiftWidth() { return SHIFT.valmaskwidth; }
+ public int getSetWidth() { return SET_IMMEDIATE.valmaskwidth+1; }
+
+ // FIXME: should use BitVector here
public Instruction readInstruction(long inst, Dock dispatchFrom) {
Dock dock = getPathByAddr(dispatchFrom, DISPATCH_PATH.getval(inst)).getDestination().getDock();
Predicate predicate = Default;
if (P_ALWAYS.get(inst)) predicate = IgnoreOLC;
- if (P_OLC.get(inst)) predicate = Default;
+ if (P_OLC_NONZERO.get(inst)) predicate = Default;
+ if (P_OLC_ZERO.get(inst)) predicate = OLCZero;
if (P_A.get(inst)) predicate = FlagA;
if (P_B.get(inst)) predicate = FlagB;
- if (P_C.get(inst)) predicate = FlagC;
if (P_NOT_A.get(inst)) predicate = NotFlagA;
if (P_NOT_B.get(inst)) predicate = NotFlagB;
- if (P_NOT_C.get(inst)) predicate = NotFlagC;
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 (SET_IMMEDIATE.get(inst)) {
boolean extend = SET_IMMEDIATE_EXTEND.getval(inst) != 0;
if (SET_FLAGS_VALUE_NOT_C.get(flag_b)) bp = bp.add(NotFlagC );
return new Set(dock, looping, predicate, ap, bp);
}
- if (SET_TAPL_FROM_IMMEDIATE.get(inst))
- return new Set(dock, looping, predicate, SetDest.TAPL, getPathByAddr(dock, SET_TAPL_FROM_IMMEDIATE.getval(inst)));
if (MOVE.get(inst))
return new Move(dock,
looping,
if (!pi.looping) instr = OS.set(instr);
switch(pi.predicate) {
case IgnoreOLC: instr = P_ALWAYS.set(instr); break;
- case Default: instr = P_OLC.set(instr); break;
+ case OLCZero: instr = P_OLC_ZERO.set(instr); break;
+ case Default: instr = P_OLC_NONZERO.set(instr); break;
case FlagA: instr = P_A.set(instr); break;
case FlagB: instr = P_B.set(instr); break;
- case FlagC: instr = P_C.set(instr); break;
case NotFlagA: instr = P_NOT_A.set(instr); break;
case NotFlagB: instr = P_NOT_B.set(instr); break;
- case NotFlagC: instr = P_NOT_C.set(instr); break;
+ default: throw new RuntimeException("error!");
}
if (d instanceof Tail) {
instr = SHIFT.set(instr);
instr = SHIFT.setval(instr, shift.immediate);
+ } else if (d instanceof Flush) {
+ instr = FLUSH.set(instr);
+
} else if (d instanceof Set) {
Set s = (Set)d;
switch(s.dest) {
break;
}
break;
- case TAPL: {
- instr = SET_TAPL_FROM_IMMEDIATE.set(instr);
- instr = SET_TAPL_FROM_IMMEDIATE.setval(instr, getDestAddr(s.path));
- break;
- }
case Flags: {
instr = SET_FLAGS.set(instr);
instr = SET_FLAGS_A.setval(instr, flagFunctionToLong(s.newFlagA));