1 package com.sun.vlsi.chips.marina.test;
2 /* -*- tab-width: 4 -*- */
3 import java.util.ArrayList;
6 import com.sun.async.test.BitVector;
7 import com.sun.async.test.ChainControl;
8 import com.sun.async.test.ChainG;
9 import com.sun.async.test.ChainTest;
10 import com.sun.async.test.ChipModel;
11 import com.sun.async.test.HP34401A;
12 import com.sun.async.test.Infrastructure;
13 import com.sun.async.test.JtagSubchainTesterModel;
14 import com.sun.async.test.JtagTester;
15 import com.sun.async.test.ManualPowerChannel;
16 import com.sun.async.test.NanosimModel;
17 import com.sun.async.test.HsimModel;
18 import com.sun.async.test.VerilogModel;
19 import com.sun.async.test.Netscan4;
20 import com.sun.async.test.PowerChannel;
21 import com.sun.async.test.Pst3202Channel;
22 import com.sun.async.test.SiliconChip;
23 import com.sun.async.test.SimulationModel;
24 import com.sun.async.test.VoltageReadable;
25 import com.sun.vlsi.chips.marina.test.Marina.Ilc;
26 import com.sun.vlsi.chips.marina.test.CmdArgs;
27 import com.sun.vlsi.chips.marina.test.CmdArgs.Mode;
29 import edu.berkeley.fleet.api.Dock;
30 import edu.berkeley.fleet.api.Instruction;
31 import edu.berkeley.fleet.api.Predicate;
32 import edu.berkeley.fleet.api.Instruction.Set.SetDest;
33 import edu.berkeley.fleet.api.Instruction.Set.SetSource;
34 import edu.berkeley.fleet.marina.MarinaFleet;
35 import edu.berkeley.fleet.marina.MarinaPath;
40 public class MarinaTest {
41 public static final MarinaFleet marinaFleet = new MarinaFleet();
42 public static final Dock dock = marinaFleet.getOnlyInputDock();
44 //-------------------------- constants -----------------------------------
45 private static final String SCAN_CHAIN_XML = "marina.xml";
46 private static final String NET_LIST = "marina.spi";
48 public static final int INSTR_SZ = 36;
51 public static final Instruction.Set.FlagFunction CLEAR_FLAG
52 = Instruction.Set.FlagFunction.ZERO;
53 public static final Instruction.Set.FlagFunction SET_FLAG
54 = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA)
55 .add(Predicate.NotFlagA);
56 public static final Instruction.Set.FlagFunction A_FLAG
57 = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA);
59 public static final Instruction.Set.FlagFunction B_FLAG
60 = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB);
62 // COLUMN_LATENCY is a delay that is larger than the latency through an Infinity column
63 private static final int COLUMN_LATENCY = 10; // nanoseconds
66 // Officially, this should be the number of requeueing no-ops that
67 // can be inserted into an idle dock whose OLC is nonzero.
69 // Less formally, this is roughly the number of stages of
70 // buffering between the instruction insertion point and the
71 // instruction ring, plus the capacity of the instruction ring.
72 private static final int INSTRUCTION_IN_SATURATION_AMOUNT = 19;
74 // This is some number which is significantly greater than
75 // INSTRUCTION_IN_SATURATION_AMOUNT. Increasing it may slow the tests down, but
76 // will never cause them to operate incorrectly.
77 private static final int MORE_THAN_INSTRUCTION_IN_SATURATION_AMOUNT = 25;
79 // This is the number of items which can be in the instruction
80 // fifo ring WITHOUT causing it to stop circulating.
81 private static final int INSTRUCTION_RING_CAPACITY = 13;
83 // Officially, this should be the number of data items which can
84 // be sent from the dock while the "data" proper stopper is in
85 // the "stopped" state
87 // Less formally, this is roughly the number of stages of
88 // buffering between the dock's data successor and the "data"
91 FIXME: what is the correct value here?
92 private static final int DATA_OUT_SATURATION_AMOUNT = XXX;
95 // This is some number which is greater than
96 // DATA_OUT_SATURATION_AMOUNT, but less than the capacity of the
98 private static final int MORE_THAN_DATA_OUT_SATURATION_AMOUNT = 10;
100 // Nominal cycle time assuming 4 GHz throughput
101 public static double CYCLE_TIME_NS;
103 //-------------------------------- types ---------------------------------
105 //-------------------------- private data --------------------------------
106 private static long startTime;
108 public static Indenter indenter = new Indenter();
109 private Marina marina;
110 private ChipModel model;
111 //private ChainControl cc;
112 //private JtagTester tester;
113 private CmdArgs cmdArgs;
114 private PowerChannel corePowerSupply, padsPowerSupply;
115 private VoltageReadable coreVoltmeter, voltmeterForCurrent;
117 private ChainTest ctD, ctR, ctC, ct;
118 private ChainControl ccD, ccR, ccC, cc;
120 //-------------------------- private methods -----------------------------
121 /** @return true if simulation. Return false if we're testing silicon. */
122 private boolean sim() {return model instanceof SimulationModel;}
124 private void prln(String msg) {indenter.prln(msg);}
125 private void pr(String msg) {indenter.pr(msg);}
126 private void adjustIndent(int n) {indenter.adjustIndent(n);}
128 public static void fatal(boolean pred, String msg) { MarinaUtils.fatal(pred, msg); }
130 public static void fatalIfBitVectorsDoNotMatch(BitVector bv1, BitVector bv2) {
131 // FIXME: better error reporting needed here
133 fatal(bv1.getNumBits()!=bv2.getNumBits(), "lengths do not match");
135 boolean mismatch = false;
137 for(int i=0; i<bv1.getNumBits(); i++) {
138 if (bv1.get(i) != bv2.get(i)) {
143 fatal(mismatch, "bit vectors do not match on bits " + err + "\n "+bv1+"\n "+bv2);
146 private static void printTestTime() {
147 long endTime = System.currentTimeMillis();
148 System.out.println("Test took: "+(endTime-startTime)/1000.0+" sec");
151 // Tell user what we're about to do
152 private static void reportTask(CmdArgs args) {
153 System.out.println("Begin testing Marina");
155 case WHOLE_CHIP_SCHEMATIC_PARASITICS:
156 System.out.println(" Simulate whole chip, schematic parasitics");
158 case WHOLE_CHIP_LAYOUT_PARASITICS:
159 System.out.println(" Simulate whole chip, layout parasitics");
162 System.out.println(" Test silicon");
165 fatal(true, "unrecognized CmdArgs.Mode");
169 private void setUpSuppliesAndMeters(Station station) {
170 // set up power supplies and meters
172 prln("Testing station: "+station);
173 Infrastructure.gpibControllers = new int[] {0};
174 switch (cmdArgs.station) {
176 corePowerSupply = new Pst3202Channel("ch1", "HPST3202", 1);
177 padsPowerSupply = new Pst3202Channel("ch2", "HPST3202", 2);
180 corePowerSupply = new Pst3202Channel("ch1", "HPST3202B", 1);
181 padsPowerSupply = new Pst3202Channel("ch2", "HPST3202B", 2);
184 fatal(true, "Unrecognized station: "+cmdArgs.station);
186 corePowerSupply.setCurrent((float)1.7);
187 corePowerSupply.setVoltageWait((float)1.0);
189 padsPowerSupply.setCurrent((float)0.100);
190 padsPowerSupply.setVoltageWait((float)1.8);
192 coreVoltmeter = new HP34401A(station.coreVoltmeter);
193 voltmeterForCurrent = new HP34401A(station.currentVoltmenter);
197 private MarinaTest(String[] args) {
198 cmdArgs = new CmdArgs(args);
200 if (cmdArgs.mode==Mode.TEST_SILICON) doSilicon(); else doSim();
203 private void doSim() {
205 switch (cmdArgs.mode) {
206 case WHOLE_CHIP_SCHEMATIC_PARASITICS:
207 netListName = NET_LIST;
209 case WHOLE_CHIP_LAYOUT_PARASITICS:
210 netListName = "marina_pads_guts.spi";
213 fatal(true, "unrecognized CmdArgs.Mode");
216 model = cmdArgs.useVerilog
220 : new NanosimModel();
222 ((SimulationModel)model).setOptimizedDirectReadsWrites(true);
224 CYCLE_TIME_NS = cmdArgs.useVerilog ? (100*20) : 0.250;
225 int khz = model instanceof VerilogModel ? 100000 : cmdArgs.jtagShift ? 20000 : 1000000;
227 prln("constructing jtag controller");
228 JtagTester tester = ((SimulationModel)model).createJtagTester("TCK", "TMS", "TRSTb", "TDI", "TDO");
229 tester.printInfo = false;
231 ChainControls ccs = new ChainControls();
232 PowerChannel pc = new ManualPowerChannel("pc", false);
234 JtagTester testerD, testerR, testerC;
235 testerD = ((SimulationModel)model).createJtagSubchainTester("sid[1:9]", null);
236 testerR = ((SimulationModel)model).createJtagSubchainTester("sir[1:9]", null);
237 testerC = ((SimulationModel)model).createJtagSubchainTester("sic[1:9]", null);
238 testerD.printInfo = testerR.printInfo = testerC.printInfo = false;
240 ccD = new ChainControl(SCAN_CHAIN_XML, testerD, 1.8f, khz);
241 ccR = new ChainControl(SCAN_CHAIN_XML, testerR, 1.8f, khz);
242 ccC = new ChainControl(SCAN_CHAIN_XML, testerC, 1.8f, khz);
243 ccD.noTestSeverity = ccR.noTestSeverity = ccC.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
246 ctD = new ChainTest(ccD, pc);
247 ctR = new ChainTest(ccR, pc);
248 ctC = new ChainTest(ccC, pc);
251 ccs.addChain(Marina.DATA_CHAIN, ccD);
252 ccs.addChain(Marina.REPORT_CHAIN, ccR);
253 ccs.addChain(Marina.CONTROL_CHAIN, ccC);
256 cc = new ChainControl(SCAN_CHAIN_XML, tester, 1.8f, khz);
257 ct = new ChainTest(cc, pc);
258 ccs.addChain(Marina.DATA_CHAIN, cc);
259 ccs.addChain(Marina.REPORT_CHAIN, cc);
260 ccs.addChain(Marina.CONTROL_CHAIN, cc);
262 marina = new Marina(ccs, model, !cmdArgs.jtagShift, indenter);
264 if (model instanceof VerilogModel)
265 ((SimulationModel)model).start("verilog", "marina.v", VerilogModel.DUMPVARS, !cmdArgs.jtagShift);
266 else if (model instanceof HsimModel)
267 ((SimulationModel)model).start("hsim64", netListName, 0, !cmdArgs.jtagShift);
269 ((SimulationModel)model).start("nanosim -c cfg", netListName, 0, !cmdArgs.jtagShift);
273 ccC.shift(Marina.CONTROL_CHAIN, false, true);
277 cc.shift(Marina.CONTROL_CHAIN, false, true);
279 doOneTest(cmdArgs.testNum);
281 ((SimulationModel)model).finish();
283 private void doSilicon() {
284 model = new SiliconChip();
285 String ip = cmdArgs.station.ipAddr;
286 JtagTester tester = new Netscan4(ip, cmdArgs.station.jtagChannel);
287 tester.printInfo = false;
289 ChainControl cc = new ChainControl("???", tester, 1.8f, khz);
290 cc.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
291 ChainControls ccs = new ChainControls();
292 ccs.addChain(Marina.DATA_CHAIN, cc);
293 ccs.addChain(Marina.REPORT_CHAIN, cc);
294 ccs.addChain(Marina.CONTROL_CHAIN, cc);
295 marina = new Marina(ccs, model, false, indenter);
296 PowerChannel pc = new ManualPowerChannel("pc", false);
297 ChainTest ct = new ChainTest(cc, pc);
298 ct.testAllChains("marina", Infrastructure.SEVERITY_WARNING);
299 doOneTest(cmdArgs.testNum);
300 setUpSuppliesAndMeters(cmdArgs.station);
303 /** In the absence of looping, the longest path through Infinity is 4 column delays */
304 private void waitUntilQuiescent() {
305 model.waitNS(4*COLUMN_LATENCY);
308 private double readCurrent() {
309 return voltmeterForCurrent.readVoltage() / cmdArgs.station.ammeterShuntResistance;
312 /** Generate List of BitVectors where Token=true, high 25 data bits
313 * are alternating ones and zeros, low 12 data bits increment from
314 * zero, and address is given by addr. */
315 private List<BitVector> makeIncrDataConstAdr(int num, int addr) {
316 List<BitVector> ans = new ArrayList<BitVector>();
317 BitVector dHi = new BitVector(25, "dataHi");
318 BitVector dLo = new BitVector(12, "dataLo");
319 BitVector t = new BitVector("1", "token");
320 BitVector a = new BitVector(14, "addr");
321 dHi.setFromLong(0x00aaaaa);
323 for (int i=0; i<num; i++) {
325 ans.add(dHi.cat(dLo).cat(t).cat(a));
330 private void stopToStop(ProperStopper s1, ProperStopper s2,
332 List<BitVector> din) {
333 prln("Begin stopToStop");
338 long ctrStart = ctr==null ? 0 : ctr.getCount();
341 waitUntilQuiescent();
343 List<BitVector> dout = s2.drainMany();
345 MarinaUtils.compareItemsOrdered(din, dout);
348 long ctrEnd = ctr.getCount();
349 long delta = ctrEnd - ctrStart;
350 long expect = din.size();
352 "counter delta wrong: expected delta: "+expect+
353 " counter before:"+ctrStart+" counter after:"+ctrEnd);
357 prln("End stopToStop");
359 /** Burst data from src to dst. gate is stopped while loading src. gate
360 * is then run to allow the burst to flow. */
361 private void stopToStopBurst(ProperStopper src, ProperStopper gate,
364 List<BitVector> din) {
365 prln("Begin stopToStopBurst test");
371 long ctrStart = ctr==null ? 0 : ctr.getCount();
374 waitUntilQuiescent();
376 // open the gate to start the burst
378 waitUntilQuiescent();
380 List<BitVector> dout = dst.drainMany();
382 MarinaUtils.compareItemsOrdered(din, dout);
385 long ctrEnd = ctr.getCount();
386 long delta = ctrEnd - ctrStart;
388 long expectA = din.size();
389 fatal(delta!=expectA,
390 "counter delta wrong: expected delta: "+expectA+
391 " counter before:"+ctrStart+" counter after:"+ctrEnd);
395 prln("End stopToStopBurst test");
398 private void stopToStopOne(ProperStopper s1, ProperStopper s2,
399 Counter ctr, int adr) {
400 prln("Begin stopToStopOne");
403 List<BitVector> din = makeIncrDataConstAdr(1, adr);
404 stopToStop(s1, s2, ctr, din);
407 prln("End stopToStopOne");
410 private void stopToStopThree(ProperStopper s1, ProperStopper s2,
411 Counter ctr, int adr) {
412 prln("Begin stopToStopOne");
415 List<BitVector> din = makeIncrDataConstAdr(3, adr);
416 stopToStop(s1, s2, ctr, din);
419 prln("End stopToStopOne");
422 private int indexOf(BitVector o, List<BitVector> dIn) {
423 for (int i=0; i<dIn.size(); i++) {
424 if (o.equals(dIn.get(i))) return i;
428 private String ringDump(List<BitVector> dIn, List<BitVector> dOut) {
429 StringBuffer sb = new StringBuffer();
430 sb.append(" ring dump: ");
431 for (BitVector o : dOut) {
432 sb.append(indexOf(o, dIn)+" ");
434 return sb.toString();
437 private int[][] makeIntArray2D(int a, int b) {
438 int[][] ans = new int[a][];
439 for (int i=0; i<a; i++) ans[i] = new int[b];
443 //=========================================================================
444 // Put top level tests here
446 private void testChains(Marina marina) {
448 prln("Testing control chain...");
449 ctC.testOneChain(Marina.CONTROL_CHAIN, Infrastructure.SEVERITY_WARNING);
451 ccC.shift(Marina.CONTROL_CHAIN, false, true);
455 prln("Testing data chain...");
456 ctD.testOneChain(Marina.DATA_CHAIN, Infrastructure.SEVERITY_WARNING);
458 //ccD.shift(Marina.DATA_CHAIN, false, true);
462 prln("Testing report chain...");
463 ctR.testOneChain(Marina.REPORT_CHAIN, Infrastructure.SEVERITY_WARNING);
465 //ccR.shift(Marina.REPORT_CHAIN, false, true);
469 prln("Testing control chain...");
470 ct.testOneChain(Marina.CONTROL_CHAIN, Infrastructure.SEVERITY_WARNING);
472 cc.shift(Marina.CONTROL_CHAIN, false, true);
473 prln("Testing data chain...");
474 ct.testOneChain(Marina.DATA_CHAIN, Infrastructure.SEVERITY_WARNING);
475 prln("Testing report chain...");
476 ct.testOneChain(Marina.REPORT_CHAIN, Infrastructure.SEVERITY_WARNING);
480 private void testProperStoppers(Marina marina) {
481 prln("Begin testProperStoppers");
484 for(ProperStopper ps : new ProperStopper[] { marina.data, marina.instrIn }) {
486 prln("testing " + (ps == marina.data ? "data" : "instruction") + " stopper");
489 prln("un-stopping stopper");
491 fatal( ps.getStopped(), "stopper should not have been stopped, but was");
493 prln("stopping stopper");
495 fatal( !ps.getStopped(), "stopper should have been stopped, but was not");
503 private void sendInstructions(Marina marina) {
504 prln("Begin sendInstructions");
507 List<BitVector> din = new ArrayList<BitVector>();
509 BitVector count = new BitVector(MarinaPacket.WORD_WIDTH,"count");
510 BitVector one = new BitVector(MarinaPacket.WORD_WIDTH, "one");
511 count.setFromLong(0);
513 for (int i=0; i<3; i++) {
515 count = count.add(one);
518 for(BitVector d : din)
519 marina.instrIn.fill(new MarinaPacket(d, false, MarinaPacket.null_path));
522 prln("End sendInstructions");
525 private void sendToken(Marina marina) {
526 prln("Begin sendToken");
529 //getCtrsFlags(marina);
531 int nbToks = marina.getNumTokens();
532 fatal(nbToks!=0, "Expected no tokens on initialization but got: "+nbToks+" tokens");
534 marina.instrIn.fill(setIlc(1));
535 marina.instrIn.fill(SEND_TOKEN);
536 nbToks = marina.getNumTokens();
537 fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
540 prln("End sendToken");
543 private void sendData(Marina marina) {
544 prln("Begin sendData");
547 edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
548 for(int i=0; i<bv.length(); i+=2) bv.set(i, false);
549 MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
551 marina.instrIn.fill(setIlc(1));
552 marina.instrIn.fill(SEND_DATA);
554 List<BitVector> dataItems = marina.data.drainMany();
555 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
557 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
558 fatal(mp.tokenhood, "Expected tokenhood=data, but got tokenhood=token");
561 prln("End sendData");
564 private void sendDataIlcInfinite(Marina marina) {
565 prln("Begin sendDataIlcInfinite");
568 marina.fillSouthProperStopper(new Instruction[] {
569 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
575 List<BitVector> dataItems = marina.data.drainMany(howmany);
576 fatal(dataItems.size()!=howmany,
577 "Expected an unending supply of data items to emerge but only got got: "+dataItems.size());
580 prln("End sendDataIlcInfinite");
583 private Instruction setOlc(int olc) {
584 return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, olc);
586 private Instruction setOlcIfZero(int olc) {
587 return new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter, olc);
589 private Instruction setIlc(int ilc) {
590 return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, ilc);
593 private void testFlagD(Marina marina) {
594 prln("Begin testFlagD");
597 List<BitVector> toks;
599 Predicate only_if_olc_zero = Predicate.FlagD;
600 Predicate only_if_olc_nonzero = Predicate.Default;
602 marina.instrIn.fill(setIlc(1));
604 for(int olc : new int[] { 1, 0 }) {
605 for(boolean predicate_olc_nonzero : new boolean[] { true, false }) {
606 prln("Attempting send data item with "+
608 "predicate olc"+(predicate_olc_nonzero?"!=0":"==0"));
611 marina.fillSouthProperStopper(new Instruction[] {
613 new Instruction.Move(dock,
614 predicate_olc_nonzero // predicate
615 ? only_if_olc_nonzero
618 false, // torpedoable
628 expectNorthFifoExactly((predicate_olc_nonzero == (olc!=0)) ? 1 : 0);
630 for(int i=0; i<olc; i++)
631 marina.instrIn.fill(DEC);
637 prln("End testFlagD");
640 private void testPredicationOnAB(Marina marina) {
641 prln("Begin testPredicationOnAB");
644 List<BitVector> dItems;
646 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 1));
647 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 1));
649 for(boolean flag_a : new boolean[] { false, true }) {
650 for(boolean flag_b : new boolean[] { false, true }) {
651 prln("Setting flags, a="+flag_a+" b="+flag_b);
652 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
654 ? Instruction.Set.FlagFunction.ONE
655 : Instruction.Set.FlagFunction.ZERO,
657 ? Instruction.Set.FlagFunction.ONE
658 : Instruction.Set.FlagFunction.ZERO
660 getCtrsFlags(marina);
663 for(Predicate predicate : new Predicate[] {
671 prln("Attempting send data with a="+flag_a+", b="+flag_b+", predicate="+predicate);
673 marina.instrIn.fill(new Instruction.Move(dock,
674 predicate, // predicate
675 false, // torpedoable
685 dItems = marina.data.drainMany();
686 int expected = predicate.evaluate(flag_a, flag_b, false, false) ? 1 : 0;
687 fatal(dItems.size()!=expected, "Expected "+expected+" data items to emerge but got: "+
688 dItems.size()+" items(s)");
694 prln("End testPredicationOnAB");
698 private void showOlc() {
699 prln("OLC=="+marina.getOLC());
701 private void expectOlc(int x) {
702 int olc = marina.getOLC();
703 fatal(x!=olc, "expected OLC=="+x+", but scanned out OLC=="+olc);
706 private void getCtrsFlags(Marina marina) {
707 prln("begin getCtrsFlags");
711 Ilc ilc = marina.getILC();
712 prln("ILC.done=="+ilc.getDone()+
713 " ILC.infinity=="+ilc.getInfinity()+
714 " ILC.count=="+ilc.getCount());
715 prln("flagA=="+marina.getFlagA());
716 prln("flagB=="+marina.getFlagB());
718 prln("end getCtrsFlags");
721 private void walkOneOLC(Marina marina) {
722 prln("Begin walkOneOLC");
724 for (int i=0; i<6; i++) {
726 if (marina.kesselsCounter) {
727 System.out.println("master-clearing...");
728 // master clear on each iteration; otherwise we'd need to "run down" the olc
729 marina.masterClear();
730 marina.enableInstructionSend(true);
733 int inOlc = i==-1 ? 0 : (1<<i);
734 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc));
736 model.waitNS(128 * CYCLE_TIME_NS);
739 prln("walkOneOLC: "+inOlc+" checks out");
742 prln("End walkOneOLC");
744 private void walkOneILC(Marina marina) {
745 prln("Begin walkOneILC");
747 for (int i=0; i<6; i++) {
748 // Mask off the "zero" bit position
750 prln("inIlc="+inIlc);
751 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, inIlc));
752 Ilc ilc = marina.getILC();
753 int outIlc = ilc.getCount();
754 fatal(outIlc!=inIlc, "bad ILC count: "+outIlc+" expected: "+inIlc);
755 fatal(ilc.getInfinity(), "bad Infinity bit: true");
757 prln("Now test the infinity bit");
758 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity));
759 Ilc ilc = marina.getILC();
760 fatal(!ilc.getInfinity(), "bad Infinity bit: false");
762 prln("End walkOneILC");
764 private void countIlc(Marina marina) {
765 final int maxIlc = 63;
766 prln("Begin countIlc");
769 marina.instrIn.fill(new
770 Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, maxIlc));
772 int ilc = marina.getILC().getCount();
773 fatal(ilc!=maxIlc, "bad ILC count: "+ilc+" expected: "+maxIlc);
775 prln("execute a move instruction that does nothing except decrement the ILC to zero");
777 new Instruction.Move(dock,
778 Predicate.IgnoreFlagD, // predicate
779 false, // torpedoable
789 // wait for ILC to count from 63 to 0
790 model.waitNS(128 * CYCLE_TIME_NS);
791 //model.waitNS(10000);
793 prln("Check that ILC==0");
794 ilc = marina.getILC().getCount();
795 fatal(ilc!=0, "bad ILC count: "+ilc+" expected: "+0);
798 prln("End countIlc");
800 // Note: countOlc takes 44 minutes to run on nanosim
801 private void countOlc(Marina marina) {
803 prln("Begin countOlc");
806 marina.instrIn.fill(setOlc(maxOlc));
808 for (int i=maxOlc; i>=0; i--) {
809 model.waitNS(128 * CYCLE_TIME_NS);
810 prln("OLC should be: "+i);
812 marina.instrIn.fill(new
813 Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement));
817 prln("End countOlc");
820 private void saturateInstructionFifo(Marina marina, Instruction instruction, int quantity, boolean expect_it_to_jam_up) {
821 prln("Inserting "+quantity+" copies of \"" + instruction + "\"");
824 for(i=0; i<quantity; i++) {
825 prln("Inserting instruction " + (i+1) +"/"+ quantity);
826 marina.instrIn.fill(instruction);
827 boolean jammed = (marina.instrIn.getFillStateWire()==MarinaUtils.StateWireState.FULL);
828 if (jammed && expect_it_to_jam_up) {
829 prln("Stopper remained full after inserting instruction; this was expected; we are happy.");
833 fatal(jammed, "Instruction stopper did not drain after inserting " + (i+1) + " instructions; not good!");
835 fatal(expect_it_to_jam_up, "Expected instruction stopper to jam up, but it did not");
837 prln("Successfully inserted " + i + " instructions");
840 private static MarinaPath null_path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(),
841 MarinaUtils.sunToBerk(MarinaPacket.null_path));
843 private static final Instruction DEC =
844 new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter, SetSource.Decrement);
846 private static final Instruction FLAG_NOP =
847 new Instruction.Set(dock, Predicate.IgnoreFlagD,
848 CLEAR_FLAG.add(Predicate.FlagA),
849 CLEAR_FLAG.add(Predicate.FlagB));
851 private static final Instruction NOP =
852 new Instruction.Move(dock,
853 Predicate.IgnoreFlagD, /* predicate */
854 false, /* torpedoable */
858 false, /* latchData */
859 false, /* latchPath */
864 private static final Instruction SEND_DATA =
865 new Instruction.Move(dock,
866 Predicate.IgnoreFlagD, /* predicate */
867 false, /* torpedoable */
868 null_path, /* path */
871 false, /* latchData */
872 false, /* latchPath */
877 private static final Instruction SEND_DATA_IF_D_NOT_SET =
878 new Instruction.Move(dock,
879 Predicate.Default, /* predicate */
880 false, /* torpedoable */
881 null_path, /* path */
884 false, /* latchData */
885 false, /* latchPath */
890 private static final Instruction TORPEDOABLE_RECV_DATA =
891 new Instruction.Move(dock,
892 Predicate.IgnoreFlagD, /* predicate */
893 true, /* torpedoable */
897 true, /* latchData */
898 false, /* latchPath */
903 private static final Instruction RECV_DATA =
904 new Instruction.Move(dock,
905 Predicate.IgnoreFlagD, /* predicate */
906 false, /* torpedoable */
910 true, /* latchData */
911 false, /* latchPath */
916 private static final Instruction SEND_TOKEN =
917 new Instruction.Move(dock,
918 Predicate.IgnoreFlagD, /* predicate */
919 false, /* torpedoable */
920 null_path, /* path */
923 false, /* latchData */
924 false, /* latchPath */
929 private static final Instruction RECV_TOKEN =
930 new Instruction.Move(dock,
931 Predicate.IgnoreFlagD, /* predicate */
932 false, /* torpedoable */
936 false, /* latchData */
937 false, /* latchPath */
943 private void expectNorthFifoNoMoreThan(int num) {
944 model.waitNS(128 * CYCLE_TIME_NS);
945 List<BitVector> dataItems = marina.data.drainMany(num+1);
946 fatal(dataItems.size()>num,
947 "Expected no more than "+num+
948 " data items to emerge but got at least: "+dataItems.size());
950 private void expectNorthFifoExactly(int num) {
951 model.waitNS(128 * CYCLE_TIME_NS);
952 List<BitVector> dataItems = marina.data.drainMany(num+1);
953 fatal(dataItems.size()!=num,
954 "Expected exactly "+num+
955 " data items to emerge but got at least: "+dataItems.size());
957 private void expectTokensNoMoreThan(int num) {
958 int x = marina.getNumTokens();
959 List<BitVector> dataItems = marina.data.drainMany(num+1);
961 "Expected no more than "+num+
962 " data items to emerge but got at least: "+x);
964 private void expectTokensExactly(int num) {
965 int x = marina.getNumTokens();
967 "Expected exactly "+num+
968 " data items to emerge but got at least: "+x);
971 private void testFlagDRecomputationTime(Marina marina) {
972 marina.instrIn.fill(setIlc(1));
973 marina.fillSouthProperStopper(new Instruction[] {
975 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
976 SEND_DATA_IF_D_NOT_SET
978 marina.fillNorthProperStopper();
979 expectNorthFifoNoMoreThan(0);
981 marina.fillSouthProperStopper(new Instruction[] {
983 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
984 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
985 SEND_DATA_IF_D_NOT_SET
987 marina.fillNorthProperStopper();
988 expectNorthFifoNoMoreThan(0);
990 marina.fillSouthProperStopper(new Instruction[] {
992 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
993 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
994 SEND_DATA_IF_D_NOT_SET
996 marina.fillNorthProperStopper();
997 expectNorthFifoExactly(1);
998 marina.instrIn.fill(DEC);
1000 marina.fillSouthProperStopper(new Instruction[] {
1002 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
1003 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
1004 SEND_DATA_IF_D_NOT_SET
1006 marina.fillNorthProperStopper();
1007 expectNorthFifoExactly(1);
1010 private void testTailWaitsForHead(Marina marina) {
1011 marina.instrIn.fill(setIlc(1));
1012 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
1014 marina.enableInstructionSend(false);
1015 marina.enableInstructionRecirculate(true);
1017 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1018 marina.instrIn.fill(new Instruction.Head(dock));
1019 marina.instrIn.fill(SEND_DATA);
1020 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1021 marina.instrIn.fill(SEND_TOKEN);
1022 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1023 marina.instrIn.fill(new Instruction.Tail(dock));
1024 marina.instrIn.fillTorpedo();
1026 marina.enableInstructionRecirculate(false);
1027 marina.enableInstructionSend(true);
1028 marina.instrIn.run();
1030 expectNorthFifoNoMoreThan(0);
1031 prln("inserting into north proper stopper");
1032 marina.fillNorthProperStopper();
1033 expectNorthFifoExactly(1);
1034 int nbToks = marina.getNumTokens();
1035 fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
1039 marina.instrIn.fill(setIlc(1));
1040 marina.instrIn.fill(setOlc(1));
1042 // this makes the head wait for the torpedo
1043 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1045 // the head should wait for the tail
1046 marina.instrIn.fill(new Instruction.Head(dock));
1047 marina.instrIn.fill(NOP);
1048 marina.instrIn.fill(SEND_DATA);
1049 marina.instrIn.fill(RECV_DATA);
1051 expectNorthFifoNoMoreThan(0);
1053 marina.instrIn.fillTorpedo();
1054 expectNorthFifoNoMoreThan(0);
1056 marina.instrIn.fill(new Instruction.Tail(dock));
1057 expectNorthFifoExactly(1);
1060 private void testTailWithoutHead(Marina marina) {
1061 marina.instrIn.fill(setIlc(1));
1062 marina.fillSouthProperStopper(new Instruction[] {
1063 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
1064 new Instruction.Tail(dock),
1067 List<BitVector> dataItems = marina.data.drainMany(1);
1068 fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
1071 private void testHeadWaitsForTail(Marina marina) {
1072 List<BitVector> dataItems;
1074 prln("Begin testHeadWaitsForTail");
1077 marina.instrIn.fill(setIlc(1));
1078 marina.fillSouthProperStopper(new Instruction[] {
1079 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
1080 new Instruction.Head(dock),
1081 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1084 dataItems = marina.data.drainMany(1);
1085 fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
1086 marina.instrIn.fill(new Instruction.Tail(dock));
1088 BitVector bv = marina.data.drain();
1089 fatal(bv==null, "Expected at least one data item to emerge but got none");
1092 prln("End testHeadWaitsForTail");
1095 private void testNonTorpedoableMoveDoesNotResetDFlag(Marina marina) {
1096 marina.instrIn.fill(setIlc(1));
1097 marina.fillSouthProperStopper(new Instruction[] {
1098 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,63),
1099 new Instruction.Move(dock,
1100 Predicate.IgnoreFlagD, // predicate
1101 true, // torpedoable
1110 new Instruction.Move(dock,
1111 Predicate.FlagD, // predicate
1112 false, // torpedoable
1122 marina.instrIn.fillTorpedo();
1123 expectNorthFifoExactly(1);
1124 marina.fillSouthProperStopper(new Instruction[] {
1125 new Instruction.Move(dock,
1126 Predicate.Default, // predicate
1127 false, // torpedoable
1137 expectNorthFifoNoMoreThan(0);
1140 private void testAbort(Marina marina) {
1142 marina.instrIn.fill(setIlc(1));
1143 marina.fillSouthProperStopper(new Instruction[] {
1144 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,1),
1145 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
1146 SEND_DATA_IF_D_NOT_SET,
1147 new Instruction.Head(dock),
1148 SEND_DATA_IF_D_NOT_SET,
1149 new Instruction.Set(dock,Predicate.Default,SetDest.DataLatch,2),
1150 new Instruction.Abort(dock, Predicate.FlagD),
1151 new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter,SetSource.Decrement),
1152 new Instruction.Tail(dock),
1155 for(int i=0; i<4; i++) {
1158 model.waitNS(128 * CYCLE_TIME_NS);
1159 bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
1160 fatal(bv==null, "no data item found");
1161 prln("got " + bv.toLong());
1162 fatal(bv.toLong()!=1, "expected 1, got " + bv.toLong());
1164 model.waitNS(128 * CYCLE_TIME_NS);
1165 bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
1166 fatal(bv==null, "no data item found");
1167 prln("got " + bv.toLong());
1168 fatal(bv.toLong()!=1, "expected 1, got " + bv.toLong());
1170 model.waitNS(128 * CYCLE_TIME_NS);
1171 bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
1172 fatal(bv==null, "no data item found");
1173 prln("got " + bv.toLong());
1174 fatal(bv.toLong()!=2, "expected 2, got " + bv.toLong());
1179 private void testAbortOutsideOfLoop(Marina marina) {
1180 marina.instrIn.fill(setIlc(1));
1181 marina.fillSouthProperStopper(new Instruction[] {
1182 // ensure that an abort doesn't cause problems if no loop is in progress
1183 new Instruction.Abort(dock, Predicate.IgnoreFlagD),
1186 expectNorthFifoExactly(1);
1189 private void testFlagAB(Marina marina) {
1190 prln("Begin testFlagAB");
1193 Instruction.Set.FlagFunction zero = Instruction.Set.FlagFunction.ZERO;
1194 Instruction.Set.FlagFunction one = zero;
1197 // we should be able to use any pair of FlagX+NotFlagX,
1198 // but we toss them all in to maximize the chances of the
1199 // test passing (later we will try the individual
1200 // combinations to maximize the chances of failure).
1201 one = one.add(Predicate.FlagA);
1202 one = one.add(Predicate.NotFlagA);
1203 one = one.add(Predicate.FlagB);
1204 one = one.add(Predicate.NotFlagB);
1205 one = one.add(Predicate.FlagC);
1206 one = one.add(Predicate.NotFlagC);
1208 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
1209 for(boolean fast : new boolean[] { true, false }) {
1210 // clear the flags to a known state, then check both 0->1 and 1->0 transitions
1211 for(boolean b : new boolean[] { false, true, false }) {
1212 prln("state: a="+marina.getFlagA()+", b="+marina.getFlagB());
1213 prln((b?"Setting":"Clearing")+" flags");
1215 Instruction inst = new Instruction.Set(dock,Predicate.IgnoreFlagD,
1220 marina.fillSouthProperStopper(new Instruction[] {
1225 model.waitNS(64 * CYCLE_TIME_NS);
1226 marina.fillNorthProperStopper();
1228 marina.instrIn.fill(inst);
1231 fatal(marina.getFlagA()!=b,
1232 "after "+(b?"setting":"clearing")+" FlagA, it was still "+(b?"clear":"set"));
1233 fatal(marina.getFlagB()!=b,
1234 "after "+(b?"setting":"clearing")+" FlagB, it was still "+(b?"clear":"set"));
1239 prln("End testFlagAB");
1243 * WARNING: this is a very, very, very long test case -- it goes
1244 * through 216 iterations.
1246 private void testFlagTruthTable(Marina marina) {
1247 prln("Begin testFlagTruthTable");
1250 marina.instrIn.fill(setIlc(1));
1251 Instruction.Set.FlagFunction zero = Instruction.Set.FlagFunction.ZERO;
1252 Instruction.Set.FlagFunction one = zero.add(Predicate.FlagA).add(Predicate.NotFlagA);
1254 for(Predicate a_input : new Predicate[] { null, Predicate.FlagA, Predicate.NotFlagA })
1255 for(Predicate b_input : new Predicate[] { null, Predicate.FlagB, Predicate.NotFlagB })
1256 for(Predicate c_input : new Predicate[] { null, Predicate.FlagC, Predicate.NotFlagC })
1257 for(boolean a_state : new boolean[] { false, true })
1258 for(boolean b_state : new boolean[] { false, true })
1259 for(boolean c_state : new boolean[] { false, true }) {
1260 for(boolean which : new boolean[] { false, true }) {
1262 prln("before instruction: a="+a_state+", b="+b_state+", c="+c_state);
1263 // set A,B flags to a_state and b_state
1264 marina.instrIn.fill(new
1265 Instruction.Set(dock,Predicate.IgnoreFlagD,
1266 a_state ? one : zero,
1267 b_state ? one : zero
1270 // set C flag to c_state
1271 BitVector data = new BitVector(37, "empty");
1272 BitVector addr = new BitVector(14, "empty");
1273 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1274 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1275 addr.set(Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE, c_state);
1276 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1277 marina.instrIn.fill(RECV_DATA);
1279 Instruction.Set.FlagFunction func = zero;
1280 if (a_input!=null) func = func.add(a_input);
1281 if (b_input!=null) func = func.add(b_input);
1282 if (c_input!=null) func = func.add(c_input);
1284 Instruction inst = new
1285 Instruction.Set(dock,Predicate.IgnoreFlagD,
1286 !which ? func : zero.add(Predicate.FlagA),
1287 which ? func : zero.add(Predicate.FlagB)
1290 marina.instrIn.fill(inst);
1292 boolean expected_a = !which ? func.evaluate(a_state, b_state, c_state, false) : a_state;
1293 boolean expected_b = which ? func.evaluate(a_state, b_state, c_state, false) : b_state;
1294 fatal(expected_a != marina.getFlagA(),
1295 "expected A="+expected_a+", but got "+marina.getFlagA());
1296 fatal(expected_b != marina.getFlagB(),
1297 "expected B="+expected_b+", but got "+marina.getFlagB());
1301 prln("End testFlagTruthTable");
1304 private void recvData(Marina marina) {
1305 prln("Begin recvData");
1308 marina.instrIn.fill(setIlc(1));
1309 marina.fillSouthProperStopper(new Instruction[] {
1310 new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
1311 new Instruction.Move(dock,
1312 Predicate.IgnoreFlagD, // predicate
1313 false, // torpedoable
1322 new Instruction.Set(dock,Predicate.IgnoreFlagD, SET_FLAG, SET_FLAG),
1324 model.waitNS(64 * CYCLE_TIME_NS);
1326 prln("checking to confirm that A flag is cleared");
1327 fatal(marina.getFlagA(), "bad A flag: "+marina.getFlagA());
1329 prln("inserting data item in north fifo ring");
1330 BitVector data = new BitVector(37, "empty");
1331 BitVector addr = new BitVector(14, "empty");
1332 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1333 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1334 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1335 model.waitNS(64 * CYCLE_TIME_NS);
1337 prln("checking to see if A flag got set");
1338 fatal(!marina.getFlagA(), "bad A flag: "+marina.getFlagA());
1341 prln("End recvData");
1345 private void testRecvAndSendWalkingOne(Marina marina) {
1346 prln("Begin testRecvAndSendWalkingOne");
1349 marina.instrIn.fill(setIlc(1));
1351 List<BitVector> dataItems;
1352 for(int bit=0; bit<37; bit++) {
1354 BitVector data = new BitVector(37, "empty");
1355 BitVector addr = new BitVector(14, "empty");
1356 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1357 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1358 data.set(bit, true);
1359 prln("testing with bit pattern " + data);
1361 prln("inserting data item into north fifo ring");
1362 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1364 prln("stopping the north proper stopper");
1367 dataItems = marina.data.drainMany(1);
1368 fatal(dataItems.size()!=0,
1369 "found a data item waiting in the north proper stopper, but should not have");
1371 marina.instrIn.fill(new Instruction.Move(dock,
1372 Predicate.IgnoreFlagD, // predicate
1373 false, // torpedoable
1383 dataItems = marina.data.drainMany(2);
1384 fatal(dataItems.size()!=1,
1385 "found "+dataItems.size()+" data items in north fifo; expected one");
1386 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
1387 fatalIfBitVectorsDoNotMatch(mp.data, data);
1391 prln("End testRecvAndSendWalkingOne");
1396 private void setOlcFromDataLatch(Marina marina) {
1397 prln("Begin setOlcFromDataLatch");
1400 marina.instrIn.fill(setIlc(1));
1402 // walk a bit from 0 to 5
1403 for(int bit=0; bit<6; bit++) {
1404 prln("inserting data item in north fifo ring");
1405 BitVector data = new BitVector(37, "empty");
1406 BitVector addr = new BitVector(14, "empty");
1407 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1408 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1409 data.set(bit, true);
1410 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1412 marina.fillSouthProperStopper(new Instruction[] {
1414 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.DataLatch),
1415 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,-1),
1418 model.waitNS(CYCLE_TIME_NS * 64);
1422 if (marina.kesselsCounter) {
1423 // master clear on each iteration; otherwise we'd need to "run down" the olc
1424 marina.masterClear();
1425 marina.enableInstructionSend(true);
1430 prln("End setOlcFromDataLatch");
1433 private void setIlcFromDataLatch(Marina marina) {
1434 prln("Begin setIlcFromDataLatch");
1437 marina.instrIn.fill(setIlc(1));
1439 // walk a bit from 0 to 5
1440 for(int bit=5; bit>=0; bit--) {
1441 prln("inserting data item in north fifo ring");
1442 BitVector data = new BitVector(37, "empty");
1443 BitVector addr = new BitVector(14, "empty");
1444 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1445 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1446 data.set(bit, true);
1447 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1449 marina.fillSouthProperStopper(new Instruction[] {
1450 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1452 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.DataLatch),
1454 model.waitNS(CYCLE_TIME_NS * 64);
1456 int ilc = marina.getILC().getCount();
1457 fatal(ilc != (1<<bit), "expected ilc to be " + (1<<bit) + ", but got " + ilc);
1461 prln("End setIlcFromDataLatch");
1464 private void testSendAndRecvToken(Marina marina) {
1465 prln("Begin testSendAndRecvToken");
1468 marina.instrIn.fill(setIlc(1));
1469 marina.fillSouthProperStopper(new Instruction[] {
1474 expectNorthFifoExactly(1);
1477 prln("End testSendAndRecvToken");
1480 private void testSignExtendedLiteral(Marina marina) {
1481 prln("Begin testSignExtendedLiteral");
1484 marina.instrIn.fill(setIlc(1));
1485 for(long val : new long[] { (-1L << 14), -1, 0, 1 }) {
1487 marina.fillSouthProperStopper(new Instruction[] {
1488 new Instruction.Set(dock,Predicate.IgnoreFlagD,
1489 Instruction.Set.SetDest.DataLatch,
1493 model.waitNS(CYCLE_TIME_NS * 64);
1495 List<BitVector> dataItems = marina.data.drainMany(3);
1496 fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
1498 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
1499 BitVector bv = mp.data;
1500 prln("got back " + mp);
1502 boolean mismatch = false;
1504 for(int i=0; i<37; i++) {
1505 if (bv.get(i) != ( (val & (1L << i)) != 0 )) {
1510 fatal(mismatch, "data read back did not match inserted literal; mismatch on bits " + err);
1514 prln("End testSignExtendedLiteral");
1517 private void testShiftedLiteral(Marina marina) {
1518 prln("Begin testShiftedLiteral");
1521 marina.instrIn.fill(setIlc(1));
1522 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
1523 Instruction.Set.SetDest.DataLatch,
1526 BitVector dreg = new BitVector(37, "what we think is in the d-register");
1527 for(int i=0; i<37; i++) dreg.set(i, false);
1529 for(long val : new long[] { -1, 0, 1, (-1L << 18) }) {
1531 edu.berkeley.fleet.api.BitVector immediate =
1532 new edu.berkeley.fleet.api.BitVector(19);
1533 for(int i=0; i<immediate.length(); i++)
1534 immediate.set(i, (val & (1L << i)) != 0);
1536 // shift over 19 LSB's towards MSB
1537 for(int i=0; i<19; i++)
1538 if (i+19 <= 36) dreg.set(i+19, dreg.get(i));
1539 for(int i=0; i<19; i++)
1540 dreg.set(i, immediate.get(i));
1542 marina.fillSouthProperStopper(new Instruction[] {
1543 new Instruction.Shift(dock,Predicate.IgnoreFlagD,immediate),
1547 model.waitNS(CYCLE_TIME_NS * 64);
1548 List<BitVector> dataItems = marina.data.drainMany(3);
1549 fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
1551 BitVector bv = new MarinaPacket(dataItems.get(0)).data;
1552 fatal(!bv.equals(dreg), "data read back did not match inserted literal.\n" +
1553 "got: "+bv.bitReverse().getState()+"\n"+
1554 "expected:"+dreg.bitReverse().getState());
1558 prln("End testShiftedLiteral");
1561 private void testFlagC(Marina marina) {
1562 prln("Begin testFlagC");
1570 // Dc=1 => sigS is copied into C-flag
1571 // Dc=0 => sigA is copied into C-flag
1573 marina.instrIn.fill(setIlc(1));
1574 for(boolean dc : new boolean[] { false, true }) {
1575 for(boolean c_flag : new boolean[] { true, false, true }) {
1578 prln("****** checking case where dc="+dc+", cflag="+c_flag);
1579 BitVector data = new BitVector(37, "empty");
1580 BitVector addr = new BitVector(14, "empty");
1581 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1582 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1585 ? Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE
1586 : Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ZERO;
1587 prln("setting addr["+whichbit+"] to "+(c_flag?"1":"0"));
1588 addr.set(whichbit, c_flag);
1590 prln("... and filling north fifo proper stopper");
1591 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1593 prln("clearing flags");
1594 prln("executing recv data with Dc="+dc);
1595 prln("copying c-flag to a-flag");
1596 marina.fillSouthProperStopper(new Instruction[] {
1597 new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
1598 new Instruction.Move(dock,
1599 Predicate.IgnoreFlagD, /* predicate */
1600 true, /* torpedoable */
1602 false, /* tokenIn */
1605 false, /* latchPath */
1606 false, /* dataOut */
1607 false /* tokenOut */
1610 new Instruction.Set(dock,Predicate.IgnoreFlagD,
1611 Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagC),
1616 model.waitNS(CYCLE_TIME_NS * 64);
1618 prln("checking to confirm that A flag is " + c_flag);
1619 fatal(marina.getFlagA()!=c_flag, "bad A flag: "+marina.getFlagA());
1623 prln("End testFlagC");
1626 private void sendDataWithPath(Marina marina) {
1627 prln("Begin sendDataWithPath");
1630 edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
1631 marina.instrIn.fill(setIlc(1));
1633 // alternating ones and zeroes
1634 for(int i=0; i<bv.length(); i+=2)
1636 // and then ones in the lower four bits so it's not symmetric
1637 for(int i=0; i<4; i++)
1640 MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
1642 marina.fillSouthProperStopper(new Instruction[] {
1643 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1644 new Instruction.Move(dock,
1645 Predicate.IgnoreFlagD, /* predicate */
1646 false, /* torpedoable */
1648 false, /* tokenIn */
1650 false, /* latchData */
1651 false, /* latchPath */
1653 false /* tokenOut */
1657 List<BitVector> dataItems;
1660 dataItems = marina.data.drainMany();
1661 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
1662 mp = new MarinaPacket(dataItems.get(0));
1664 // the 14th bit of the outbound address cannot be set by the
1665 // ship, so we don't care about it
1666 fatalIfBitVectorsDoNotMatch(MarinaUtils.berkToSun(bv), mp.path.get(0,13));
1668 prln("send data with no change to path");
1669 marina.instrIn.fill(new Instruction.Move(dock,
1670 Predicate.IgnoreFlagD, /* predicate */
1671 false, /* torpedoable */
1673 false, /* tokenIn */
1675 false, /* latchData */
1676 false, /* latchPath */
1678 false /* tokenOut */
1681 dataItems = marina.data.drainMany();
1682 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
1683 mp = new MarinaPacket(dataItems.get(0));
1685 // the 14th bit of the outbound address cannot be set by the
1686 // ship, so we don't care about it
1687 fatalIfBitVectorsDoNotMatch(MarinaUtils.berkToSun(bv), mp.path.get(0,13));
1690 prln("End sendDataWithPath");
1693 private void recvPath(Marina marina) {
1694 prln("Begin recvPath");
1697 marina.instrIn.fill(setIlc(1));
1698 for(int bit=0; bit<11; bit++) {
1699 BitVector packet_data = new BitVector(37, "inbound data item");
1700 for(int i=0; i<37; i++) packet_data.set(i, false);
1701 packet_data.set(27+bit, true);
1702 BitVector packet_path = new BitVector(14, "inbound data item");
1703 for(int i=0; i<14; i++) packet_path.set(i, false);
1705 marina.fillNorthProperStopper(new MarinaPacket(packet_data, false, packet_path));
1707 prln("recv path, send data (using recv'd path)");
1708 marina.instrIn.fill(new Instruction.Move(dock,
1709 Predicate.IgnoreFlagD, /* predicate */
1710 false, /* torpedoable */
1712 false, /* tokenIn */
1714 true, /* latchData */
1715 true, /* latchPath */
1717 false /* tokenOut */
1720 List<BitVector> dataItems = marina.data.drainMany();
1721 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
1722 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
1724 fatalIfBitVectorsDoNotMatch(packet_data.get(25,11), mp.path.get(0,11));
1725 fatalIfBitVectorsDoNotMatch(packet_data, mp.data);
1729 prln("End recvPath");
1732 private void testILC(Marina marina) {
1733 prln("Begin testILC");
1736 for(int bit=0; bit<6; bit++) {
1737 int ilc = bit<0 ? 0 : (1<<bit);
1738 marina.fillSouthProperStopper(new Instruction[] {
1739 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,ilc),
1742 List<BitVector> dataItems = marina.data.drainMany();
1743 fatal(dataItems.size()!=ilc, "Expected "+ilc+" data item(s) to emerge but got: "+dataItems.size()+" data items");
1747 prln("End testILC");
1750 private void testILCZero(Marina marina) {
1752 marina.fillSouthProperStopper(new Instruction[] {
1753 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,0),
1757 expectNorthFifoNoMoreThan(0);
1758 expectTokensExactly(1);
1762 private void sendTorpedo(Marina marina) {
1763 prln("Begin sendTorpedo");
1765 marina.instrIn.fill(setIlc(1));
1766 marina.instrIn.fill(setOlc(63));
1768 model.waitNS(128 * CYCLE_TIME_NS);
1771 marina.instrIn.fill(new
1772 Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
1773 fatal(marina.getFlagA(), "bad A flag: true");
1774 fatal(marina.getFlagB(), "bad B flag: true");
1776 prln("execute a move instruction that does nothing but loops until torpedo arrives");
1777 prln("A=1, B=B This instruction should not execute because D-flag is set");
1778 prln("Set A=A, B=1 This instruction should execute because D-flag is set");
1780 model.waitNS(128 * CYCLE_TIME_NS);
1782 marina.fillSouthProperStopper(new Instruction[] {
1783 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity),
1784 new Instruction.Move(dock,
1785 Predicate.IgnoreFlagD, // predicate
1786 true, // torpedoable
1795 new Instruction.Set(dock,Predicate.Default,
1797 Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB)
1799 new Instruction.Set(dock, Predicate.FlagD,
1800 Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA),
1805 model.waitNS(128 * CYCLE_TIME_NS);
1807 prln("send torpedo. This should clear the OLC");
1808 marina.instrIn.fillTorpedo();
1809 model.waitNS(128 * CYCLE_TIME_NS);
1811 model.waitNS(128 * CYCLE_TIME_NS);
1813 prln("A should remain false, B should be true");
1814 fatal(marina.getFlagA(), "bad A flag: true");
1815 fatal(!marina.getFlagB(), "bad B flag: false");
1817 model.waitNS(128 * CYCLE_TIME_NS);
1819 prln("Reload OLC after torpedo, clears D-flag");
1820 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
1822 // FIXME: find another way to test this
1823 model.waitNS(128 * CYCLE_TIME_NS);
1826 prln("Set A=1, B=1 This instruction should execute because OLC!=0");
1827 marina.instrIn.fill(new
1828 Instruction.Set(dock,Predicate.Default, SET_FLAG, SET_FLAG));
1830 prln("A and B should be true");
1831 fatal(!marina.getFlagA(), "bad A flag: false");
1832 fatal(!marina.getFlagB(), "bad B flag: false");
1835 prln("End sendTorpedo");
1838 private void testTorpedoOnAnInfinite(Marina marina) {
1839 prln("Begin testTorpedoOnAnInfinite");
1842 List<BitVector> dataItems;
1844 marina.instrIn.fill(setIlc(1));
1845 for(boolean torpedoable : new boolean[] { true, false }) {
1847 marina.fillSouthProperStopper(new Instruction[] {
1848 new Instruction.Move(dock,
1849 Predicate.IgnoreFlagD, // predicate
1850 false, // torpedoable
1859 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
1860 new Instruction.Move(dock,
1861 Predicate.IgnoreFlagD, // predicate
1862 torpedoable, // torpedoable
1871 // FIXME: this probably should be removed, unless Ivan doesn't want to change the behavior
1872 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1877 // expect nothing to come out, because the NOP is executing
1878 dataItems = marina.data.drainMany(2);
1879 fatal(dataItems.size()!=0, "Expected no data item(s) to emerge but got at least: "+dataItems.size()+" data items");
1881 marina.instrIn.fillTorpedo();
1883 int expected = torpedoable?1:0;
1884 dataItems = marina.data.drainMany(2);
1885 fatal(dataItems.size()!=expected, "Expected "+expected+" item to emerge but got: "+dataItems.size()+" data items");
1887 fatal(!marina.getILC().getDone(), "Expected ilc=done, but got "+marina.getILC());
1891 prln("End testTorpedoOnAnInfinite");
1894 private void testOlcDecrementAtHighSpeed(Marina marina) {
1895 prln("Begin testOlcDecrementAtHighSpeed");
1898 List<BitVector> dataItems;
1900 // Each element of the following pair of arrays is one "test".
1901 // The OLC will be loaded with olcs[i] and then decremented
1902 // decr_amounts[i] times; after that has happened the zeroness
1903 // of the OLC will be checked by executing a MOVE with
1904 // [olc!=0] as the predicate.
1906 int[] olcs = new int[] { 3, 3, 3, 10, 41 };
1907 int[] decr_amounts = new int[] { 2, 3, 4, 9, 9 };
1909 for(int which=0; which<olcs.length; which++) {
1910 int olc = olcs[which];
1911 int decr_amount = decr_amounts[which];
1913 prln("inserting set olc="+olc);
1914 prln("inserting set ilc=1");
1915 marina.fillSouthProperStopper(new Instruction[] {
1916 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1917 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,olc),
1920 // commenting the following four lines causes this test to pass
1922 prln("inserting: "+decr_amount+" olc-- instructions");
1923 prln("inserting: [!d] send data");
1924 Instruction[] instructions = new Instruction[decr_amount+1];
1925 for(int i=0; i<decr_amount; i++)
1927 new Instruction.Set(dock,
1929 SetDest.OuterLoopCounter,
1930 SetSource.Decrement);
1931 instructions[instructions.length-1] =
1932 new Instruction.Move(dock,
1933 Predicate.Default, // predicate
1934 false, // torpedoable
1944 marina.fillSouthProperStopper(instructions);
1945 model.waitNS(64 * CYCLE_TIME_NS);
1947 int expected = decr_amount>=olc ? 0 : 1;
1948 dataItems = marina.data.drainMany(2);
1949 fatal(dataItems.size()!=expected, "Expected "+expected+" item to emerge but got: "+dataItems.size()+" data items");
1951 if (marina.kesselsCounter) {
1952 // master clear on each iteration; otherwise we'd need to "run down" the olc
1953 marina.masterClear();
1954 marina.enableInstructionSend(true);
1959 prln("End testOlcDecrementAtHighSpeed");
1962 private void flipIlcBit(Marina marina) {
1963 prln("Begin flipIlcBit");
1965 prln("Using the set ILC instruction, toggle a single bit between zero and one. \n" +
1966 "Check correct setting of the ILC zero bit");
1968 for (int i=0; i<6; i++) {
1971 prln("Then immediately set ILC="+notZero);
1972 marina.fillSouthProperStopper(new Instruction[] {
1973 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
1974 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
1977 model.waitNS(64 * CYCLE_TIME_NS);
1979 prln("Verify ILC using scan chain");
1980 Ilc ilc = marina.getILC();
1981 int ilcCount = ilc.getCount();
1982 fatal(ilcCount!=notZero, "bad ILC count: "+ilcCount+" expected: "+notZero);
1983 fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
1985 marina.fillSouthProperStopper(new Instruction[] {
1986 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
1987 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
1990 model.waitNS(64 * CYCLE_TIME_NS);
1992 prln("Verify ILC using scan chain");
1993 ilc = marina.getILC();
1994 ilcCount = ilc.getCount();
1995 fatal(ilcCount!=0, "bad ILC count: "+ilcCount+" expected: 0");
1996 fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
2000 prln("End flipIlcBit");
2002 private void flipOlcBit(Marina marina) {
2003 prln("Begin flipOlcBit");
2005 prln("Using the set OLC instruction, toggle a single bit between zero and one. \n" +
2006 "Check correct setting of the OLC zero bit");
2008 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
2010 for (int i=0; i<6; i++) {
2011 int notZero = 32 >> i;
2013 if (marina.kesselsCounter) {
2014 // master clear on each iteration; otherwise we'd need to "run down" the olc
2015 marina.masterClear();
2016 marina.enableInstructionSend(true);
2021 prln("Then immediately set OLC="+notZero);
2022 marina.fillSouthProperStopper(new Instruction[] {
2023 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
2024 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
2027 model.waitNS(64 * CYCLE_TIME_NS);
2028 prln("Verify OLC count using scan chain");
2031 if (!marina.kesselsCounter) {
2032 prln("Set OLC="+notZero);
2033 prln("Then immediately set OLC=0");
2034 marina.fillSouthProperStopper(new Instruction[] {
2035 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
2036 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
2039 model.waitNS(64 * CYCLE_TIME_NS);
2040 prln("Verify OLC count using scan chain");
2046 prln("End flipOlcBit");
2048 private void testSouthRecirculate(Marina marina, int AMOUNT) {
2049 prln("Begin testSouthRecirculate("+AMOUNT+")");
2052 marina.enableInstructionSend(false);
2053 marina.enableInstructionRecirculate(true);
2055 prln("Completely fill south ring");
2057 for (int i=0; i<AMOUNT; i++) {
2058 prln("inserting item " + (i+1) + " / " + AMOUNT);
2059 BitVector path = new BitVector(MarinaPacket.PATH_WIDTH, "path");
2060 BitVector data = new BitVector(MarinaPacket.WORD_WIDTH, "path");
2061 path.set(0, MarinaPacket.PATH_WIDTH, false);
2062 data.setFromLong(i+9);
2063 marina.instrIn.fill(new MarinaPacket(data, false, path));
2067 prln("Drain south ring and check contents");
2069 List<BitVector> out = marina.instrIn.drainMany();
2070 boolean bad = false;
2071 for (int i=0; i<AMOUNT; i++) {
2072 prln("extracting item " + (i+1) + " / " + AMOUNT);
2073 //int expect = (i+Marina.SOUTH_RING_CAPACITY-1) % Marina.SOUTH_RING_CAPACITY;
2075 long got = new MarinaPacket(out.get(i)).data.toLong();
2078 prln(" bad instruction: "+got+" expected: "+expect);
2080 prln(" good instruction.");
2083 fatal(bad, "data inserted does not match data retrieved");
2086 for (int i=0; i<5; i++) {}
2089 prln("End testSouthRecirculate("+AMOUNT+")");
2091 private void doOneTest(int testNum) {
2093 prln("============================================================");
2094 prln("MarinaTest: performing test: "+testNum);
2097 marina.masterClear();
2098 marina.enableInstructionSend(true);
2105 // these tests run fairly quickly
2108 doOneTest(1); // passes extracted parasitics
2109 doOneTest(2); // passes extracted parasitics
2110 doOneTest(3); // passes extracted parasitics
2111 doOneTest(4); // passes extracted parasitics
2112 doOneTest(5); // passes extracted parasitics
2119 doOneTest(1000); // passes extracted parasitics
2120 doOneTest(1001); // passes extracted parasitics
2121 doOneTest(1003); // passes extracted parasitics
2122 doOneTest(3000); // passes extracted parasitics
2123 doOneTest(3001); // passes extracted parasitics
2124 doOneTest(3003); // passes extracted parasitics
2125 doOneTest(3004); // passes extracted parasitics
2126 doOneTest(3005); // passes extracted parasitics
2127 doOneTest(3006); // passes extracted parasitics
2128 doOneTest(3007); // passes extracted parasitics
2129 doOneTest(3008); // passes extracted parasitics
2130 doOneTest(3009); // passes extracted parasitics
2131 doOneTest(3010); // passes extracted parasitics
2132 doOneTest(3011); // passes extracted parasitics
2133 doOneTest(3012); // passes extracted parasitics
2134 doOneTest(3013); // passes extracted parasitics
2135 doOneTest(3014); // passes extracted parasitics
2136 doOneTest(3015); // passes extracted parasitics
2137 doOneTest(3019); // passes extracted parasitics
2138 doOneTest(3020); // passes extracted parasitics
2139 doOneTest(3022); // passes extracted parasitics
2140 doOneTest(3023); // passes extracted parasitics
2141 doOneTest(3026); // passes extracted parasitics
2142 doOneTest(3027); // passes extracted parasitics
2143 doOneTest(3028); // passes extracted parasitics
2145 // these tests take a while and usually pass
2156 // this takes an insanely long time
2160 case 1: testChains(marina); break; // passes, 24-Mar (+verilog)
2161 case 2: testProperStoppers(marina); break; // passes, 24-Mar (+verilog)
2162 case 3: testSouthRecirculate(marina, 1); break; // passes, 24-Mar (+verilog)
2163 case 4: getCtrsFlags(marina); break; // 20-Apr (+verilog)
2164 case 5: sendInstructions(marina); break; // passes, 24-Mar (+verilog)
2165 case 6: walkOneOLC(marina); break; // 21-Apr (+verilog)
2167 // Russell's tests begin with 1000
2168 case 1000: walkOneILC(marina); break; // 20-Apr (+verilog)
2169 case 1001: countIlc(marina); break; // 20-Apr (+verilog)
2170 case 1002: countOlc(marina); break; // 23-Apr (+verilog)
2172 case 1003: sendTorpedo(marina); break; // 23-Apr (+verilog) [with wor-hack]
2174 case 1004: flipIlcBit(marina); break; // 20-Apr (+verilog)
2175 case 1005: flipOlcBit(marina); break; // 21-Apr (+verilog)
2177 case 1006: testSouthRecirculate(marina, Marina.SOUTH_RING_CAPACITY-1); break; // passes, 24-Mar (+verilog)
2179 // Adam's tests begin with 3000
2180 case 3000: sendToken(marina); break; // passes, 24-Mar (+verilog)
2181 case 3001: testFlagAB(marina); break; // passes, 08-Apr (+verilog)
2182 case 3002: testPredicationOnAB(marina); break; // 22-Apr (+verilog)
2183 case 3003: testFlagC(marina); break; // 23-Apr (+verilog)
2184 case 3004: testFlagD(marina); break; // 23-Apr (+verilog)
2185 case 3005: testFlagDRecomputationTime(marina); break;
2187 case 3006: testTailWaitsForHead(marina); break;
2188 case 3007: testTailWithoutHead(marina); break;
2189 case 3008: testHeadWaitsForTail(marina); break; // 22-Apr (+verilog)
2190 case 3009: testAbort(marina); break; // 22-Apr (+verilog)
2192 case 3010: sendData(marina); break; // passes, 24-Mar (+verilog)
2193 case 3011: recvData(marina); break; // 21-Apr (+verilog)
2194 case 3012: sendDataWithPath(marina); break; // passes, 13-Apr (+verilog)
2196 case 3013: testSignExtendedLiteral(marina); break; // 20-Apr (+verilog)
2197 case 3014: testShiftedLiteral(marina); break; // 20-Apr (+verilog)
2198 case 3015: testSendAndRecvToken(marina); break; // 21-Apr (+verilog)
2200 case 3016: sendDataIlcInfinite(marina); break; // 22-Apr (+verilog)
2201 case 3017: testFlagTruthTable(marina); break; // 23-Apr (+verilog)
2203 case 3019: setOlcFromDataLatch(marina); break; // 23-Apr (+verilog)
2204 case 3020: setIlcFromDataLatch(marina); break; // 23-Apr (+verilog)
2205 case 3021: recvPath(marina); break; // 22-Apr (+verilog)
2206 case 3022: testILC(marina); break; // 23-Apr (+verilog)
2207 case 3023: testTorpedoOnAnInfinite(marina); break; // 23-Apr (+verilog)
2208 case 3024: testRecvAndSendWalkingOne(marina); break; // 21-Apr (+verilog)
2209 case 3025: testOlcDecrementAtHighSpeed(marina); break; // 23-Apr (+verilog)
2211 case 3026: testNonTorpedoableMoveDoesNotResetDFlag(marina); break; // 23-Apr (+verilog)
2212 case 3027: testILCZero(marina); break;
2213 case 3028: testAbortOutsideOfLoop(marina); break;
2216 fatal(true, "Test number: "+testNum+" doesn't exist.");
2219 // If we get here then test passed
2220 prln("Test Result: Passed");
2222 //Infrastructure.exit(0);
2223 } catch (MarinaUtils.FailureException fe) {
2224 System.out.println("******************************************************************************");
2225 System.out.println("******************************************************************************");
2226 System.out.println("******************************************************************************");
2227 System.out.println("******************************************************************************");
2228 fe.printStackTrace();
2233 //============================ for public use =============================
2236 * 0: test detected success
2237 * 2: test detected failure
2240 public static void main(String[] args) {
2241 startTime = System.currentTimeMillis();
2242 new MarinaTest(args);