int nbToks = marina.getNumTokens();
fatal(nbToks!=0, "Expected no tokens on initialization but got: "+nbToks+" tokens");
- marina.instrIn.fill(
- new Instruction.Move(dock,
- Predicate.IgnoreFlagD, /* predicate */
- false, /* torpedoable */
- null, /* path */
- false, /* tokenIn */
- false, /* dataIn */
- false, /* latchData */
- false, /* latchPath */
- false, /* dataOut */
- true /* tokenOut */
- ));
-
- //getCtrsFlags(marina);
-
+ marina.instrIn.fill(SEND_TOKEN);
nbToks = marina.getNumTokens();
fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
prln("Begin sendData");
adjustIndent(2);
- //getCtrsFlags(marina);
-
edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
for(int i=0; i<bv.length(); i+=2) bv.set(i, false);
MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
- marina.instrIn.fill(new Instruction.Move(dock,
- Predicate.IgnoreFlagD, /* predicate */
- false, /* torpedoable */
- path, /* path */
- false, /* tokenIn */
- false, /* dataIn */
- false, /* latchData */
- false, /* latchPath */
- true, /* dataOut */
- false /* tokenOut */
- ));
-
- //getCtrsFlags(marina);
+ marina.instrIn.fill(SEND_DATA);
List<BitVector> dataItems = marina.data.drainMany();
fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
prln("Begin sendDataIlcInfinite");
adjustIndent(2);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity));
- marina.instrIn.fill(SEND_DATA);
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
+ SEND_DATA,
+ });
// more than MAX_ILC
int howmany = 70;
prln("End sendDataIlcInfinite");
}
- private void setOLC(Marina marina, int olc) {
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, olc));
+ private Instruction setOlc(int olc) {
+ return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, olc);
}
private void testFlagD(Marina marina) {
"predicate olc"+(predicate_olc_nonzero?"!=0":"==0"));
adjustIndent(2);
- setOLC(marina, olc);
- marina.instrIn.fill(new Instruction.Move(dock,
- predicate_olc_nonzero // predicate
- ? only_if_olc_nonzero
- : only_if_olc_zero
- ,
- false, // torpedoable
- null, // path
- false, // tokenIn
- false, // dataIn
- false, // latchData
- false, // latchPath
- true, // dataOut
- false // tokenOut
- ));
+ marina.fillSouthProperStopper(new Instruction[] {
+ setOlc(olc),
+ new Instruction.Move(dock,
+ predicate_olc_nonzero // predicate
+ ? only_if_olc_nonzero
+ : only_if_olc_zero
+ ,
+ false, // torpedoable
+ null, // path
+ false, // tokenIn
+ false, // dataIn
+ false, // latchData
+ false, // latchPath
+ true, // dataOut
+ false // tokenOut
+ ),
+ });
toks = marina.data.drainMany();
int expected = (predicate_olc_nonzero == (olc!=0)) ? 1 : 0;
fatal(toks.size()!=expected, "Expected "+expected+" token to emerge but got: "+toks.size()+" token(s)");
false /* tokenOut */
);
- private static final Instruction REQUEUEING_NOP = NOP;
-
private static final Instruction SEND_DATA =
new Instruction.Move(dock,
Predicate.IgnoreFlagD, /* predicate */
false /* tokenOut */
);
- private static final Instruction REQUEUEING_SEND_DATA = SEND_DATA;
private void expectNorthFifoNoMoreThan(int num) {
List<BitVector> dataItems = marina.data.drainMany(num+1);
}
private void testTailWaitsForHead(Marina marina) {
- setOLC(marina, 63);
+ marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
marina.enableInstructionSend(false);
marina.enableInstructionRecirculate(true);
}
private void testTailWithoutHead(Marina marina) {
- setOLC(marina, 63);
- marina.instrIn.fill(new Instruction.Tail(dock));
- marina.instrIn.fill(SEND_DATA);
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
+ new Instruction.Tail(dock),
+ SEND_DATA,
+ });
List<BitVector> dataItems = marina.data.drainMany(1);
fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
}
prln("Begin testHeadWaitsForTail");
adjustIndent(2);
- setOLC(marina, 63);
- marina.instrIn.fill(new Instruction.Head(dock));
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
- marina.instrIn.fill(SEND_DATA);
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
+ new Instruction.Head(dock),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+ SEND_DATA,
+ });
dataItems = marina.data.drainMany(1);
fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
marina.instrIn.fill(new Instruction.Tail(dock));
private void testAbort(Marina marina) {
marina.fillSouthProperStopper(new Instruction[] {
-
- // ensure that an abort doesn't cause problems if no loop is in progress
- //new Instruction.Abort(dock, Predicate.IgnoreFlagD),
-
new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,1),
new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
SEND_DATA_IF_D_NOT_SET,
}
}
+ private void testAbortOutsideOfLoop(Marina marina) {
+ marina.fillSouthProperStopper(new Instruction[] {
+ // ensure that an abort doesn't cause problems if no loop is in progress
+ new Instruction.Abort(dock, Predicate.IgnoreFlagD),
+ SEND_DATA,
+ });
+ expectNorthFifoExactly(1);
+ }
+
private void testFlagAB(Marina marina) {
prln("Begin testFlagAB");
adjustIndent(2);
prln("Begin recvData");
adjustIndent(2);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
- marina.instrIn.fill(new Instruction.Move(dock,
- Predicate.IgnoreFlagD, // predicate
- false, // torpedoable
- null, // path
- false, // tokenIn
- true, // dataIn
- false, // latchData
- false, // latchPath
- false, // dataOut
- false // tokenOut
- ));
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD, SET_FLAG, SET_FLAG));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
+ new Instruction.Move(dock,
+ Predicate.IgnoreFlagD, // predicate
+ false, // torpedoable
+ null, // path
+ false, // tokenIn
+ true, // dataIn
+ false, // latchData
+ false, // latchPath
+ false, // dataOut
+ false // tokenOut
+ ),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD, SET_FLAG, SET_FLAG),
+ });
model.waitNS(64 * CYCLE_TIME_NS);
prln("checking to confirm that A flag is cleared");
data.set(bit, true);
marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
- marina.instrIn.fill(RECV_DATA);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.DataLatch));
+ marina.fillSouthProperStopper(new Instruction[] {
+ RECV_DATA,
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.DataLatch)
+ });
int olc = marina.getOLC();
fatal(olc != (1<<bit), "expected olc to be " + (1<<bit) + ", but got " + olc);
data.set(bit, true);
marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
- marina.instrIn.fill(RECV_DATA);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.DataLatch));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+ RECV_DATA,
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.DataLatch),
+ });
model.waitNS(CYCLE_TIME_NS * 64);
int ilc = marina.getILC().getCount();
prln("Begin testSendAndRecvToken");
adjustIndent(2);
- marina.instrIn.fill(SEND_TOKEN);
- marina.instrIn.fill(RECV_TOKEN);
- marina.instrIn.fill(SEND_DATA);
+ marina.fillSouthProperStopper(new Instruction[] {
+ SEND_TOKEN,
+ RECV_TOKEN,
+ SEND_DATA,
+ });
List<BitVector> dataItems = marina.data.drainMany(3);
fatal(dataItems.size()!=1,
"expected exactly one data item, got " + dataItems.size());
for(long val : new long[] { (-1L << 14), -1, 0, 1 }) {
- /*
marina.fillSouthProperStopper(new Instruction[] {
new Instruction.Set(dock,Predicate.IgnoreFlagD,
Instruction.Set.SetDest.DataLatch,
val),
SEND_DATA,
});
- */
- marina.fillSouthProperStopper(new Instruction[] {
- new Instruction.Set(dock,Predicate.IgnoreFlagD,
- Instruction.Set.SetDest.DataLatch,
- val) });
- marina.fillSouthProperStopper(new Instruction[] {
- SEND_DATA,
- });
List<BitVector> dataItems = marina.data.drainMany(3);
fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
new edu.berkeley.fleet.api.BitVector(19);
for(int i=0; i<immediate.length(); i++)
immediate.set(i, (val & (1L << i)) != 0);
- marina.instrIn.fill(new Instruction.Shift(dock,Predicate.IgnoreFlagD,immediate));
// shift over 19 LSB's towards MSB
for(int i=0; i<19; i++)
for(int i=0; i<19; i++)
dreg.set(i, immediate.get(i));
- marina.instrIn.fill(SEND_DATA);
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Shift(dock,Predicate.IgnoreFlagD,immediate),
+ SEND_DATA,
+ });
List<BitVector> dataItems = marina.data.drainMany(3);
fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
prln("clearing flags");
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
-
prln("executing recv data with Dc="+dc);
- marina.instrIn.fill(new Instruction.Move(dock,
- Predicate.IgnoreFlagD, /* predicate */
- true, /* torpedoable */
- null, /* path */
- false, /* tokenIn */
- true, /* dataIn */
- dc, /* latchData */
- false, /* latchPath */
- false, /* dataOut */
- false /* tokenOut */
- ));
-
prln("copying c-flag to a-flag");
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
- Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagC),
- CLEAR_FLAG
- ));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
+ new Instruction.Move(dock,
+ Predicate.IgnoreFlagD, /* predicate */
+ true, /* torpedoable */
+ null, /* path */
+ false, /* tokenIn */
+ true, /* dataIn */
+ dc, /* latchData */
+ false, /* latchPath */
+ false, /* dataOut */
+ false /* tokenOut */
+ ),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,
+ Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagC),
+ CLEAR_FLAG
+ ),
+ });
model.waitNS(CYCLE_TIME_NS * 64);
prln("Begin sendDataWithPath");
adjustIndent(2);
- //getCtrsFlags(marina);
-
edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
// alternating ones and zeroes
MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
- marina.instrIn.fill(new Instruction.Move(dock,
- Predicate.IgnoreFlagD, /* predicate */
- false, /* torpedoable */
- path, /* path */
- false, /* tokenIn */
- false, /* dataIn */
- false, /* latchData */
- false, /* latchPath */
- true, /* dataOut */
- false /* tokenOut */
- ));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+ new Instruction.Move(dock,
+ Predicate.IgnoreFlagD, /* predicate */
+ false, /* torpedoable */
+ path, /* path */
+ false, /* tokenIn */
+ false, /* dataIn */
+ false, /* latchData */
+ false, /* latchPath */
+ true, /* dataOut */
+ false /* tokenOut */
+ ),
+ });
+
List<BitVector> dataItems;
MarinaPacket mp;
for(int bit=0; bit<6; bit++) {
int ilc = bit<0 ? 0 : (1<<bit);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,ilc));
- marina.instrIn.fill(SEND_DATA);
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,ilc),
+ SEND_DATA,
+ });
List<BitVector> dataItems = marina.data.drainMany();
fatal(dataItems.size()!=ilc, "Expected "+ilc+" data item(s) to emerge but got: "+dataItems.size()+" data items");
}
Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
fatal(marina.getFlagA(), "bad A flag: true");
fatal(marina.getFlagB(), "bad B flag: true");
- marina.instrIn.fill(new
- Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity));
prln("execute a move instruction that does nothing but loops until torpedo arrives");
- marina.instrIn.fill(
- new Instruction.Move(dock,
- Predicate.IgnoreFlagD, // predicate
- true, // torpedoable
- null, // path
- false, // tokenIn
- true, // dataIn
- false, // latchData
- false, // latchPath
- false, // dataOut
- false // tokenOut
- ));
-
-
prln("A=1, B=B This instruction should not execute because D-flag is set");
- marina.instrIn.fill(new
- Instruction.Set(dock,Predicate.Default,
- SET_FLAG,
- Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB)
- ));
-
prln("Set A=A, B=1 This instruction should execute because D-flag is set");
- marina.instrIn.fill(new
- Instruction.Set(dock, Predicate.FlagD,
- Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA),
- SET_FLAG
- ));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity),
+ new Instruction.Move(dock,
+ Predicate.IgnoreFlagD, // predicate
+ true, // torpedoable
+ null, // path
+ false, // tokenIn
+ true, // dataIn
+ false, // latchData
+ false, // latchPath
+ false, // dataOut
+ false // tokenOut
+ ),
+ new Instruction.Set(dock,Predicate.Default,
+ SET_FLAG,
+ Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB)
+ ),
+ new Instruction.Set(dock, Predicate.FlagD,
+ Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA),
+ SET_FLAG
+ ),
+ });
prln("send torpedo. This should clear the OLC");
marina.instrIn.fillTorpedo();
for(boolean torpedoable : new boolean[] { true, false }) {
- marina.instrIn.fill(new Instruction.Move(dock,
- Predicate.IgnoreFlagD, // predicate
- false, // torpedoable
- null, // path
- false, // tokenIn
- false, // dataIn
- false, // latchData
- false, // latchPath
- false, // dataOut
- true // tokenOut
- ));
-
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity));
-
- marina.instrIn.fill(new Instruction.Move(dock,
- Predicate.IgnoreFlagD, // predicate
- torpedoable, // torpedoable
- null, // path
- true, // tokenIn
- false, // dataIn
- false, // latchData
- false, // latchPath
- false, // dataOut
- true // tokenOut
- ));
-
- // FIXME: this probably should be removed, unless Ivan doesn't want to change the behavior
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Move(dock,
+ Predicate.IgnoreFlagD, // predicate
+ false, // torpedoable
+ null, // path
+ false, // tokenIn
+ false, // dataIn
+ false, // latchData
+ false, // latchPath
+ false, // dataOut
+ true // tokenOut
+ ),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
+ new Instruction.Move(dock,
+ Predicate.IgnoreFlagD, // predicate
+ torpedoable, // torpedoable
+ null, // path
+ true, // tokenIn
+ false, // dataIn
+ false, // latchData
+ false, // latchPath
+ false, // dataOut
+ true // tokenOut
+ ),
+ // FIXME: this probably should be removed, unless Ivan doesn't want to change the behavior
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
- marina.instrIn.fill(SEND_DATA);
+ SEND_DATA,
+ });
// expect nothing to come out, because the NOP is executing
dataItems = marina.data.drainMany(2);
int decr_amount = decr_amounts[which];
prln("inserting set olc="+olc);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,olc));
prln("inserting set ilc=1");
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,olc),
+ });
// commenting the following four lines causes this test to pass
for (int i=0; i<6; i++) {
int notZero = 1<<i;
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0));
-
prln("Then immediately set ILC="+notZero);
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
+ });
prln("Verify ILC using scan chain");
Ilc ilc = marina.getILC();
int ilcCount = ilc.getCount();
fatal(ilcCount!=notZero, "bad ILC count: "+ilcCount+" expected: "+notZero);
fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
-
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero));
- marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0));
+
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
+ });
prln("Verify ILC using scan chain");
ilc = marina.getILC();
for (int i=0; i<6; i++) {
int notZero = 32 >> i;
prln("Set OLC=0");
- marina.instrIn.fill(new
- Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0));
-
prln("Then immediately set OLC="+notZero);
- marina.instrIn.fill(new
- Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
+ });
prln("Verify OLC count using scan chain");
int outOlc = marina.getOLC();
fatal(outOlc!=notZero, "bad OLC count: "+outOlc+" expected: "+notZero);
prln("Set OLC="+notZero);
- marina.instrIn.fill(new
- Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero));
-
prln("Then immediately set OLC=0");
- marina.instrIn.fill(new
- Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0));
+ marina.fillSouthProperStopper(new Instruction[] {
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
+ new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
+ });
prln("Verify OLC count using scan chain");
outOlc = marina.getOLC();
doOneTest(3023);
doOneTest(3026);
doOneTest(3027);
+ doOneTest(3028);
// these tests take a while and usually pass
doOneTest(1002);
case 3026: testNonTorpedoableMoveDoesNotResetDFlag(marina); break; // 23-Apr (+verilog)
case 3027: testILCZero(marina); break;
+ case 3028: testAbortOutsideOfLoop(marina); break;
default:
fatal(true, "Test number: "+testNum+" doesn't exist.");