1 package com.sun.vlsi.chips.marina.test;
2 /* -*- tab-width: 4 -*- */
3 import java.util.ArrayList;
6 import com.sun.electric.tool.simulation.test.*;
7 import com.sun.vlsi.chips.marina.test.Marina.Ilc;
8 import com.sun.vlsi.chips.marina.test.CmdArgs;
9 import com.sun.vlsi.chips.marina.test.CmdArgs.Mode;
11 import edu.berkeley.fleet.api.Dock;
12 import edu.berkeley.fleet.api.Instruction;
13 import edu.berkeley.fleet.api.Predicate;
14 import edu.berkeley.fleet.api.Instruction.Set.SetDest;
15 import edu.berkeley.fleet.api.Instruction.Set.SetSource;
16 import edu.berkeley.fleet.marina.MarinaFleet;
17 import edu.berkeley.fleet.marina.MarinaPath;
24 public class MarinaTest {
25 public static final MarinaFleet marinaFleet = new MarinaFleet();
26 public static final Dock dock = marinaFleet.getOnlyInputDock();
28 public static float vdd = 1.0f;
30 //-------------------------- constants -----------------------------------
31 private static final String SCAN_CHAIN_XML = "marina.xml";
32 private static final String NET_LIST = "marina.spi";
34 public static final int INSTR_SZ = 36;
37 public static final Instruction.Set.FlagFunction CLEAR_FLAG
38 = Instruction.Set.FlagFunction.ZERO;
39 public static final Instruction.Set.FlagFunction SET_FLAG
40 = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA)
41 .add(Predicate.NotFlagA);
42 public static final Instruction.Set.FlagFunction A_FLAG
43 = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA);
45 public static final Instruction.Set.FlagFunction B_FLAG
46 = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB);
48 // COLUMN_LATENCY is a delay that is larger than the latency through an Infinity column
49 private static final int COLUMN_LATENCY = 10; // nanoseconds
52 // Officially, this should be the number of requeueing no-ops that
53 // can be inserted into an idle dock whose OLC is nonzero.
55 // Less formally, this is roughly the number of stages of
56 // buffering between the instruction insertion point and the
57 // instruction ring, plus the capacity of the instruction ring.
58 private static final int INSTRUCTION_IN_SATURATION_AMOUNT = 19;
60 // This is some number which is significantly greater than
61 // INSTRUCTION_IN_SATURATION_AMOUNT. Increasing it may slow the tests down, but
62 // will never cause them to operate incorrectly.
63 private static final int MORE_THAN_INSTRUCTION_IN_SATURATION_AMOUNT = 25;
65 // This is the number of items which can be in the instruction
66 // fifo ring WITHOUT causing it to stop circulating.
67 private static final int INSTRUCTION_RING_CAPACITY = 13;
69 // Officially, this should be the number of data items which can
70 // be sent from the dock while the "data" proper stopper is in
71 // the "stopped" state
73 // Less formally, this is roughly the number of stages of
74 // buffering between the dock's data successor and the "data"
77 FIXME: what is the correct value here?
78 private static final int DATA_OUT_SATURATION_AMOUNT = XXX;
81 // This is some number which is greater than
82 // DATA_OUT_SATURATION_AMOUNT, but less than the capacity of the
84 private static final int MORE_THAN_DATA_OUT_SATURATION_AMOUNT = 10;
86 // Nominal cycle time assuming 4 GHz throughput
87 public static double CYCLE_TIME_NS;
89 //-------------------------------- types ---------------------------------
91 //-------------------------- private data --------------------------------
92 private static long startTime;
94 public static Indenter indenter = new Indenter();
95 private Marina marina;
96 private ChipModel model;
97 //private ChainControl cc;
98 //private JtagTester tester;
99 private CmdArgs cmdArgs;
100 private PowerChannel corePowerSupply, padsPowerSupply;
101 private VoltageReadable coreVoltmeter, voltmeterForCurrent;
105 private ChainTest ctD, ctR, ctC, ct;
106 private ChainControl ccD, ccR, ccC, cc;
108 //-------------------------- private methods -----------------------------
109 /** @return true if simulation. Return false if we're testing silicon. */
110 private boolean sim() {return model instanceof SimulationModel;}
112 private void prln(String msg) {indenter.prln(msg);}
113 private void pr(String msg) {indenter.pr(msg);}
114 private void adjustIndent(int n) {indenter.adjustIndent(n);}
116 public static void fatal(boolean pred, String msg) { MarinaUtils.fatal(pred, msg); }
118 public static void fatalIfBitVectorsDoNotMatch(BitVector bv1, BitVector bv2) {
119 // FIXME: better error reporting needed here
121 fatal(bv1.getNumBits()!=bv2.getNumBits(), "lengths do not match");
123 boolean mismatch = false;
125 for(int i=0; i<bv1.getNumBits(); i++) {
126 if (bv1.get(i) != bv2.get(i)) {
131 fatal(mismatch, "bit vectors do not match on bits " + err + "\n "+bv1+"\n "+bv2);
134 private static void printTestTime() {
135 long endTime = System.currentTimeMillis();
136 System.out.println("Test took: "+(endTime-startTime)/1000.0+" sec");
139 // Tell user what we're about to do
140 private static void reportTask(CmdArgs args) {
141 System.out.println("Begin testing Marina");
143 case WHOLE_CHIP_SCHEMATIC_PARASITICS:
144 System.out.println(" Simulate whole chip, schematic parasitics");
146 case WHOLE_CHIP_LAYOUT_PARASITICS:
147 System.out.println(" Simulate whole chip, layout parasitics");
150 System.out.println(" Test silicon");
153 fatal(true, "unrecognized CmdArgs.Mode");
158 private MarinaTest(String[] args) throws Exception {
159 cmdArgs = new CmdArgs(args);
164 static PowerChannel vdd18;
165 static PowerChannel vdd10;
166 static PowerChannel vdds;
168 private void setVdd10(float v) {
169 if (vdd10==null) return;
170 vdd10.setVoltageWait(v);
173 private void doSim() throws Exception {
175 switch (cmdArgs.mode) {
176 case WHOLE_CHIP_SCHEMATIC_PARASITICS:
177 netListName = NET_LIST;
179 case WHOLE_CHIP_LAYOUT_PARASITICS:
180 netListName = "marina_pads_guts.spi";
183 fatal(true, "unrecognized CmdArgs.Mode");
188 Infrastructure.gpibControllers = new int[]{1};
189 vdd18 = new Pst3202Channel("ch1", "tiPST3202", 1);
190 vdd18 = new Pst3202Channel("ch3", "tiPST3202", 3);
191 vdd10 = new PowerChannelResistorVoltageReadable(new Pst3202Channel("ch2", "tiPST3202", 2),
193 new HP34401A("HP34970"),
196 if (vdd10!=null) setVdd10(vdd);
197 if (vdd18!=null) vdd18.setVoltageNoWait(1.8f);
199 model = cmdArgs.useVerilog
205 : new NanosimModel();
207 if (model instanceof SimulationModel)
208 ((SimulationModel)model).setOptimizedDirectReadsWrites(true);
210 CYCLE_TIME_NS = cmdArgs.useVerilog ? (100*20) : 0.250;
212 model instanceof VerilogModel
216 : model instanceof ChipModel
220 System.err.println("constructing jtag controller");
222 model instanceof SimulationModel
223 ? ((SimulationModel)model).createJtagTester("TCK", "TMS", "TRSTb", "TDI", "TDO")
224 : new Netscan("jtag2");
225 //: new Netscan("10.0.0.200");
226 //: new Signalyzer();
227 //: new Netscan("jtag2");
228 JtagLogicLevel mc0=null;
229 JtagLogicLevel mc1=null;
230 if (tester instanceof NetscanGeneric) {
231 ((NetscanGeneric)tester).reset();
233 // not sure if "GPIO1" means "index 0" or not
234 mc0 = new JtagLogicLevel(tester, 0);
235 mc1 = new JtagLogicLevel(tester, 1);
237 mc0.setLogicState(true);
238 mc1.setLogicState(true);
241 Logger.setLogInits(true);
242 tester.setLogSets(true);
243 tester.setLogOthers(true);
244 tester.setAllLogging(true);
245 tester.printInfo = true;
247 tester.printInfo = false;
249 ChainControls ccs = new ChainControls();
250 PowerChannel pc = new ManualPowerChannel("pc", false);
252 JtagTester testerD, testerR, testerC;
253 testerD = ((SimulationModel)model).createJtagSubchainTester("sid[1:9]", null);
254 testerR = ((SimulationModel)model).createJtagSubchainTester("sir[1:9]", null);
255 testerC = ((SimulationModel)model).createJtagSubchainTester("sic[1:9]", null);
256 testerD.printInfo = testerR.printInfo = testerC.printInfo = false;
258 ccD = new ChainControl(SCAN_CHAIN_XML, testerD, 1.8f, khz);
259 ccR = new ChainControl(SCAN_CHAIN_XML, testerR, 1.8f, khz);
260 ccC = new ChainControl(SCAN_CHAIN_XML, testerC, 1.8f, khz);
261 ccD.noTestSeverity = ccR.noTestSeverity = ccC.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
264 ctD = new ChainTest(ccD, pc);
265 ctR = new ChainTest(ccR, pc);
266 ctC = new ChainTest(ccC, pc);
269 ccs.addChain(Marina.DATA_CHAIN, ccD);
270 ccs.addChain(Marina.REPORT_CHAIN, ccR);
271 ccs.addChain(Marina.CONTROL_CHAIN, ccC);
274 PowerChannel ch2 = new Pst3202Channel("ch2", "tiPST3202", 2);
275 PowerChannel ch3 = new Pst3202Channel("ch3", "tiPST3202", 3);
276 Infrastructure.gpibControllers = new int[]{1};
277 ch2.setVoltageNoWait(1f);
278 ch3.setVoltageNoWait(1.8f);
282 cc = new ChainControl(SCAN_CHAIN_XML, tester, 1.8f, khz);
283 cc.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
284 ct = new ChainTest(cc, pc);
285 ccs.addChain(Marina.DATA_CHAIN, cc);
286 ccs.addChain(Marina.REPORT_CHAIN, cc);
287 ccs.addChain(Marina.CONTROL_CHAIN, cc);
288 ccs.addChain(Marina.DUKE_CHAIN, cc);
290 marina = new Marina(ccs, model, !cmdArgs.jtagShift, indenter);
294 if (model instanceof NanosimModel) {
295 NanosimLogicSettable mc = (NanosimLogicSettable)
296 ((SimulationModel)model).createLogicSettable(Marina.MASTER_CLEAR);
297 mc.setInitState(true);
300 prln("starting model");
301 if (model instanceof VerilogModel)
302 ((SimulationModel)model).start("verilog", "marina.v", VerilogModel.DUMPVARS, !cmdArgs.jtagShift);
303 else if (model instanceof HsimModel)
304 ((SimulationModel)model).start("hsim64", netListName, 0, !cmdArgs.jtagShift);
305 else if (model instanceof NanosimModel)
306 ((SimulationModel)model).start("nanosim -c cfg", netListName, 0, !cmdArgs.jtagShift);
309 prln("model started");
312 prln("deasserting master clear");
313 if (model instanceof SimulationModel)
314 ((SimulationModel)model).setNodeState(Marina.MASTER_CLEAR, 0);
316 marina.masterClear();
319 if (cmdArgs.testNum!=0 && cmdArgs.testNum!=1) {
321 cc.shift(Marina.CONTROL_CHAIN, false, true);
324 doOneTest(cmdArgs.testNum);
326 if (model instanceof SimulationModel)
327 ((SimulationModel)model).finish();
330 /** In the absence of looping, the longest path through Infinity is 4 column delays */
331 private void waitUntilQuiescent() {
332 model.waitNS(4*COLUMN_LATENCY);
335 private double readCurrent() {
336 return voltmeterForCurrent.readVoltage() / cmdArgs.station.ammeterShuntResistance;
339 /** Generate List of BitVectors where Token=true, high 25 data bits
340 * are alternating ones and zeros, low 12 data bits increment from
341 * zero, and address is given by addr. */
342 private List<BitVector> makeIncrDataConstAdr(int num, int addr) {
343 List<BitVector> ans = new ArrayList<BitVector>();
344 BitVector dHi = new BitVector(25, "dataHi");
345 BitVector dLo = new BitVector(12, "dataLo");
346 BitVector t = new BitVector("1", "token");
347 BitVector a = new BitVector(14, "addr");
348 dHi.setFromLong(0x00aaaaa);
350 for (int i=0; i<num; i++) {
352 ans.add(dHi.cat(dLo).cat(t).cat(a));
357 private void stopToStop(ProperStopper s1, ProperStopper s2,
359 List<BitVector> din) {
360 prln("Begin stopToStop");
365 long ctrStart = ctr==null ? 0 : ctr.getCount();
368 waitUntilQuiescent();
370 List<BitVector> dout = s2.drainMany();
372 MarinaUtils.compareItemsOrdered(din, dout);
375 long ctrEnd = ctr.getCount();
376 long delta = ctrEnd - ctrStart;
377 long expect = din.size();
379 "counter delta wrong: expected delta: "+expect+
380 " counter before:"+ctrStart+" counter after:"+ctrEnd);
384 prln("End stopToStop");
386 /** Burst data from src to dst. gate is stopped while loading src. gate
387 * is then run to allow the burst to flow. */
388 private void stopToStopBurst(ProperStopper src, ProperStopper gate,
391 List<BitVector> din) {
392 prln("Begin stopToStopBurst test");
398 long ctrStart = ctr==null ? 0 : ctr.getCount();
401 waitUntilQuiescent();
403 // open the gate to start the burst
405 waitUntilQuiescent();
407 List<BitVector> dout = dst.drainMany();
409 MarinaUtils.compareItemsOrdered(din, dout);
412 long ctrEnd = ctr.getCount();
413 long delta = ctrEnd - ctrStart;
415 long expectA = din.size();
416 fatal(delta!=expectA,
417 "counter delta wrong: expected delta: "+expectA+
418 " counter before:"+ctrStart+" counter after:"+ctrEnd);
422 prln("End stopToStopBurst test");
425 private void stopToStopOne(ProperStopper s1, ProperStopper s2,
426 Counter ctr, int adr) {
427 prln("Begin stopToStopOne");
430 List<BitVector> din = makeIncrDataConstAdr(1, adr);
431 stopToStop(s1, s2, ctr, din);
434 prln("End stopToStopOne");
437 private void stopToStopThree(ProperStopper s1, ProperStopper s2,
438 Counter ctr, int adr) {
439 prln("Begin stopToStopOne");
442 List<BitVector> din = makeIncrDataConstAdr(3, adr);
443 stopToStop(s1, s2, ctr, din);
446 prln("End stopToStopOne");
449 private int indexOf(BitVector o, List<BitVector> dIn) {
450 for (int i=0; i<dIn.size(); i++) {
451 if (o.equals(dIn.get(i))) return i;
455 private String ringDump(List<BitVector> dIn, List<BitVector> dOut) {
456 StringBuffer sb = new StringBuffer();
457 sb.append(" ring dump: ");
458 for (BitVector o : dOut) {
459 sb.append(indexOf(o, dIn)+" ");
461 return sb.toString();
464 private int[][] makeIntArray2D(int a, int b) {
465 int[][] ans = new int[a][];
466 for (int i=0; i<a; i++) ans[i] = new int[b];
470 //=========================================================================
471 // Put top level tests here
473 private void testChains(Marina marina) {
475 prln("Testing control chain...");
476 ctC.testOneChain(Marina.CONTROL_CHAIN, Infrastructure.SEVERITY_WARNING);
478 ccC.shift(Marina.CONTROL_CHAIN, false, true);
482 prln("Testing data chain...");
483 ctD.testOneChain(Marina.DATA_CHAIN, Infrastructure.SEVERITY_WARNING);
485 //ccD.shift(Marina.DATA_CHAIN, false, true);
489 prln("Testing report chain...");
490 ctR.testOneChain(Marina.REPORT_CHAIN, Infrastructure.SEVERITY_WARNING);
492 //ccR.shift(Marina.REPORT_CHAIN, false, true);
496 prln("Testing control chain...");
497 ct.testOneChain(Marina.CONTROL_CHAIN, Infrastructure.SEVERITY_WARNING);
499 cc.shift(Marina.CONTROL_CHAIN, false, true);
500 prln("Testing data chain...");
501 ct.testOneChain(Marina.DATA_CHAIN, Infrastructure.SEVERITY_WARNING);
502 prln("Testing report chain...");
503 ct.testOneChain(Marina.REPORT_CHAIN, Infrastructure.SEVERITY_WARNING);
507 private void testProperStoppers(Marina marina) {
508 prln("Begin testProperStoppers");
511 for(ProperStopper ps : new ProperStopper[] { marina.data, marina.instrIn }) {
513 prln("testing " + (ps == marina.data ? "data" : "instruction") + " stopper");
516 prln("un-stopping stopper");
518 fatal( ps.getStopped(), "stopper should not have been stopped, but was");
520 prln("stopping stopper");
522 fatal( !ps.getStopped(), "stopper should have been stopped, but was not");
530 private void sendInstructions(Marina marina) {
531 prln("Begin sendInstructions");
534 List<BitVector> din = new ArrayList<BitVector>();
536 BitVector count = new BitVector(MarinaPacket.WORD_WIDTH,"count");
537 BitVector one = new BitVector(MarinaPacket.WORD_WIDTH, "one");
538 count.setFromLong(0);
540 for (int i=0; i<3; i++) {
542 count = count.add(one);
545 for(BitVector d : din)
546 marina.instrIn.fill(new MarinaPacket(d, false, MarinaPacket.null_path));
549 prln("End sendInstructions");
552 private void sendToken(Marina marina) {
553 prln("Begin sendToken");
556 //getCtrsFlags(marina);
558 int nbToks = marina.getNumTokens();
559 fatal(nbToks!=0, "Expected no tokens on initialization but got: "+nbToks+" tokens");
561 marina.instrIn.fill(setIlc(1));
562 marina.instrIn.fill(SEND_TOKEN);
563 nbToks = marina.getNumTokens();
564 fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
567 prln("End sendToken");
570 private void sendData(Marina marina) {
571 prln("Begin sendData");
574 edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
575 for(int i=0; i<bv.length(); i+=2) bv.set(i, false);
576 MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
578 marina.instrIn.fill(setIlc(1));
579 marina.instrIn.fill(SEND_DATA);
581 List<BitVector> dataItems = marina.data.drainMany();
582 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
584 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
585 fatal(mp.tokenhood, "Expected tokenhood=data, but got tokenhood=token");
588 prln("End sendData");
591 private void sendDataIlcInfinite(Marina marina) {
592 prln("Begin sendDataIlcInfinite");
595 marina.fillSouthProperStopper(new Instruction[] {
596 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
602 List<BitVector> dataItems = marina.data.drainMany(howmany);
603 fatal(dataItems.size()!=howmany,
604 "Expected an unending supply of data items to emerge but only got got: "+dataItems.size());
607 prln("End sendDataIlcInfinite");
610 private Instruction setOlc(int olc) {
611 return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, olc);
613 private Instruction setOlcIfZero(int olc) {
614 return new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter, olc);
616 private Instruction setIlc(int ilc) {
617 return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, ilc);
620 private void testFlagD(Marina marina) {
621 prln("Begin testFlagD");
624 List<BitVector> toks;
626 Predicate only_if_olc_zero = Predicate.FlagD;
627 Predicate only_if_olc_nonzero = Predicate.Default;
629 marina.instrIn.fill(setIlc(1));
631 for(int olc : new int[] { 1, 0 }) {
632 for(boolean predicate_olc_nonzero : new boolean[] { true, false }) {
633 prln("Attempting send data item with "+
635 "predicate olc"+(predicate_olc_nonzero?"!=0":"==0"));
638 marina.fillSouthProperStopper(new Instruction[] {
640 new Instruction.Move(dock,
641 predicate_olc_nonzero // predicate
642 ? only_if_olc_nonzero
645 false, // torpedoable
655 expectNorthFifoExactly((predicate_olc_nonzero == (olc!=0)) ? 1 : 0);
657 for(int i=0; i<olc; i++)
658 marina.instrIn.fill(DEC);
664 prln("End testFlagD");
667 private void testPredicationOnAB(Marina marina) {
668 prln("Begin testPredicationOnAB");
671 List<BitVector> dItems;
673 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 1));
674 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 1));
676 for(boolean flag_a : new boolean[] { false, true }) {
677 for(boolean flag_b : new boolean[] { false, true }) {
678 prln("Setting flags, a="+flag_a+" b="+flag_b);
679 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
681 ? Instruction.Set.FlagFunction.ONE
682 : Instruction.Set.FlagFunction.ZERO,
684 ? Instruction.Set.FlagFunction.ONE
685 : Instruction.Set.FlagFunction.ZERO
687 getCtrsFlags(marina);
690 for(Predicate predicate : new Predicate[] {
698 prln("Attempting send data with a="+flag_a+", b="+flag_b+", predicate="+predicate);
700 marina.instrIn.fill(new Instruction.Move(dock,
701 predicate, // predicate
702 false, // torpedoable
712 dItems = marina.data.drainMany();
713 int expected = predicate.evaluate(flag_a, flag_b, false, false) ? 1 : 0;
714 fatal(dItems.size()!=expected, "Expected "+expected+" data items to emerge but got: "+
715 dItems.size()+" items(s)");
721 prln("End testPredicationOnAB");
725 private void showOlc() {
726 prln("OLC=="+marina.getOLC());
728 private void expectOlc(int x) {
729 int olc = marina.getOLC();
730 fatal(x!=olc, "expected OLC=="+x+", but scanned out OLC=="+olc);
733 private void getCtrsFlags(Marina marina) {
734 prln("begin getCtrsFlags");
738 Ilc ilc = marina.getILC();
739 prln("ILC.done=="+ilc.getDone()+
740 " ILC.infinity=="+ilc.getInfinity()+
741 " ILC.count=="+ilc.getCount());
742 prln("flagA=="+marina.getFlagA());
743 prln("flagB=="+marina.getFlagB());
745 prln("end getCtrsFlags");
748 private void walkOneOLC(Marina marina) {
749 prln("Begin walkOneOLC");
752 //for (int i=-1; i<6; i++) {
753 marina.fillSouthProperStopper(new Instruction[] {
755 new Instruction.Head(dock),
757 // new Instruction.Set(dock,Predicate.IgnoreFlagD, SetDest.OuterLoopCounter, 1),
761 TORPEDOABLE_RECV_DATA,
767 //new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement),
769 new Instruction.Tail(dock),
771 marina.fillSouthProperStopper(new Instruction[] {
776 BitVector bits = null;
777 marina.shiftReport(true, false);
778 for(int i=0; i<4; i++) {
779 BitVector x = marina.cc.getOutBits(marina.REPORT_CHAIN+"."+marina.OLC_PATH_KESSEL+i);
780 //System.out.println("bits are: " + x);
781 bits = bits==null ? x : bits.cat(x);
783 System.out.println("dec="+bits.get(0));
784 if (bits.get(1)) throw new RuntimeException();
787 /* for (int i=0; i<64; i++) {
789 if (marina.kesselsCounter) {
790 System.out.println("master-clearing...");
791 // master clear on each iteration; otherwise we'd need to "run down" the olc
792 marina.masterClear();
793 marina.enableInstructionSend(true);
796 expectTokensExactly(0);
799 int inOlc = i==-1 ? 0 : (1<<i);
801 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc));
802 marina.instrIn.fill(SEND_DATA_IF_D_SET);
803 marina.instrIn.fill(SEND_DATA_IF_D_NOT_SET);
804 marina.instrIn.fill(SEND_DATA);
806 model.waitNS(128 * CYCLE_TIME_NS);
809 prln("walkOneOLC: "+inOlc+" checks out");
810 expectNorthFifoExactly(0);
813 prln("End walkOneOLC");
816 private void walkOneILC(Marina marina) {
817 prln("Begin walkOneILC");
819 for (int i=0; i<6; i++) {
820 // Mask off the "zero" bit position
822 prln("inIlc="+inIlc);
823 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, inIlc));
824 Ilc ilc = marina.getILC();
825 int outIlc = ilc.getCount();
826 fatal(outIlc!=inIlc, "bad ILC count: "+outIlc+" expected: "+inIlc);
827 fatal(ilc.getInfinity(), "bad Infinity bit: true");
829 prln("Now test the infinity bit");
830 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity));
831 Ilc ilc = marina.getILC();
832 fatal(!ilc.getInfinity(), "bad Infinity bit: false");
834 prln("End walkOneILC");
836 private void countIlc(Marina marina) {
837 final int maxIlc = 63;
838 prln("Begin countIlc");
841 marina.instrIn.fill(new
842 Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, maxIlc));
844 int ilc = marina.getILC().getCount();
845 fatal(ilc!=maxIlc, "bad ILC count: "+ilc+" expected: "+maxIlc);
847 prln("execute a move instruction that does nothing except decrement the ILC to zero");
849 new Instruction.Move(dock,
850 Predicate.IgnoreFlagD, // predicate
851 false, // torpedoable
861 // wait for ILC to count from 63 to 0
862 model.waitNS(128 * CYCLE_TIME_NS);
863 //model.waitNS(10000);
865 prln("Check that ILC==0");
866 ilc = marina.getILC().getCount();
867 fatal(ilc!=0, "bad ILC count: "+ilc+" expected: "+0);
870 prln("End countIlc");
872 // Note: countOlc takes 44 minutes to run on nanosim
873 private void countOlc(Marina marina) {
875 prln("Begin countOlc");
878 marina.instrIn.fill(setOlc(maxOlc));
880 for (int i=maxOlc; i>=0; i--) {
881 model.waitNS(128 * CYCLE_TIME_NS);
882 prln("OLC should be: "+i);
884 marina.instrIn.fill(new
885 Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement));
889 prln("End countOlc");
891 private void loadEveryValueOLC(Marina marina) {
894 for (int i=0; i<(1<<6); i++) {
896 if (marina.kesselsCounter) {
897 System.out.println("master-clearing...");
898 // master clear on each iteration; otherwise we'd need to "run down" the olc
899 marina.masterClear();
900 marina.enableInstructionSend(true);
904 marina.fillSouthProperStopper(new Instruction[] {
908 // to ensure that instruction is bubble-limited
911 // the Set-OLC instruction
912 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc),
914 // put a Set-ILC instruction right behind it with inverted bits to be sure we're
915 // not capturing the instruction-latch value too late in the cycle
916 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, (inOlc ^ (~(-1<<6)))),
920 model.waitNS(128 * CYCLE_TIME_NS);
921 marina.fillNorthProperStopper();
922 model.waitNS(128 * CYCLE_TIME_NS);
925 prln("loadEveryValueOLC: "+inOlc+" checks out");
930 private void saturateInstructionFifo(Marina marina, Instruction instruction, int quantity, boolean expect_it_to_jam_up) {
931 prln("Inserting "+quantity+" copies of \"" + instruction + "\"");
934 for(i=0; i<quantity; i++) {
935 prln("Inserting instruction " + (i+1) +"/"+ quantity);
936 marina.instrIn.fill(instruction);
937 boolean jammed = (marina.instrIn.getFillStateWire()==MarinaUtils.StateWireState.FULL);
938 if (jammed && expect_it_to_jam_up) {
939 prln("Stopper remained full after inserting instruction; this was expected; we are happy.");
943 fatal(jammed, "Instruction stopper did not drain after inserting " + (i+1) + " instructions; not good!");
945 fatal(expect_it_to_jam_up, "Expected instruction stopper to jam up, but it did not");
947 prln("Successfully inserted " + i + " instructions");
950 private static MarinaPath null_path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(),
951 MarinaUtils.sunToBerk(MarinaPacket.null_path));
953 private static final Instruction DEC =
954 new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter, SetSource.Decrement);
956 private static final Instruction FLAG_NOP =
957 new Instruction.Set(dock, Predicate.IgnoreFlagD,
958 CLEAR_FLAG.add(Predicate.FlagA),
959 CLEAR_FLAG.add(Predicate.FlagB));
961 private static final Instruction FLAG_NOP_IF_FLAG_A =
962 new Instruction.Set(dock, Predicate.FlagA,
963 CLEAR_FLAG.add(Predicate.FlagA),
964 CLEAR_FLAG.add(Predicate.FlagB));
966 private static final Instruction NOP =
967 new Instruction.Move(dock,
968 Predicate.IgnoreFlagD, /* predicate */
969 false, /* torpedoable */
973 false, /* latchData */
974 false, /* latchPath */
979 private static final Instruction SEND_DATA =
980 new Instruction.Move(dock,
981 Predicate.IgnoreFlagD, /* predicate */
982 false, /* torpedoable */
983 null_path, /* path */
986 false, /* latchData */
987 false, /* latchPath */
992 private static final Instruction SEND_DATA_IF_D_NOT_SET =
993 new Instruction.Move(dock,
994 Predicate.Default, /* predicate */
995 false, /* torpedoable */
996 null_path, /* path */
999 false, /* latchData */
1000 false, /* latchPath */
1002 false /* tokenOut */
1005 private static final Instruction SEND_DATA_IF_A_SET_AND_D_NOT_SET =
1006 new Instruction.Move(dock,
1007 Predicate.FlagA, /* predicate */
1008 false, /* torpedoable */
1009 null_path, /* path */
1010 false, /* tokenIn */
1012 false, /* latchData */
1013 false, /* latchPath */
1015 false /* tokenOut */
1018 private static final Instruction SEND_DATA_IF_D_SET =
1019 new Instruction.Move(dock,
1020 Predicate.FlagD, /* predicate */
1021 false, /* torpedoable */
1022 null_path, /* path */
1023 false, /* tokenIn */
1025 false, /* latchData */
1026 false, /* latchPath */
1028 false /* tokenOut */
1031 private static final Instruction SEND_TOKEN_IF_D_SET =
1032 new Instruction.Move(dock,
1033 Predicate.FlagD, /* predicate */
1034 false, /* torpedoable */
1035 null_path, /* path */
1036 false, /* tokenIn */
1038 false, /* latchData */
1039 false, /* latchPath */
1040 false, /* dataOut */
1044 private static final Instruction SEND_TOKEN_IF_D_NOT_SET =
1045 new Instruction.Move(dock,
1046 Predicate.Default, /* predicate */
1047 false, /* torpedoable */
1048 null_path, /* path */
1049 false, /* tokenIn */
1051 false, /* latchData */
1052 false, /* latchPath */
1053 false, /* dataOut */
1057 private static final Instruction TORPEDOABLE_RECV_DATA =
1058 new Instruction.Move(dock,
1059 Predicate.IgnoreFlagD, /* predicate */
1060 true, /* torpedoable */
1062 false, /* tokenIn */
1064 true, /* latchData */
1065 false, /* latchPath */
1066 false, /* dataOut */
1067 false /* tokenOut */
1070 private static final Instruction RECV_DATA =
1071 new Instruction.Move(dock,
1072 Predicate.IgnoreFlagD, /* predicate */
1073 false, /* torpedoable */
1075 false, /* tokenIn */
1077 true, /* latchData */
1078 false, /* latchPath */
1079 false, /* dataOut */
1080 false /* tokenOut */
1083 private static final Instruction SEND_TOKEN =
1084 new Instruction.Move(dock,
1085 Predicate.IgnoreFlagD, /* predicate */
1086 false, /* torpedoable */
1087 null_path, /* path */
1088 false, /* tokenIn */
1090 false, /* latchData */
1091 false, /* latchPath */
1092 false, /* dataOut */
1096 private static final Instruction RECV_TOKEN =
1097 new Instruction.Move(dock,
1098 Predicate.IgnoreFlagD, /* predicate */
1099 false, /* torpedoable */
1103 false, /* latchData */
1104 false, /* latchPath */
1105 false, /* dataOut */
1106 false /* tokenOut */
1110 private void expectNorthFifoNoMoreThan(int num) {
1111 model.waitNS(128 * CYCLE_TIME_NS);
1112 List<BitVector> dataItems = marina.data.drainMany(num+1);
1113 fatal(dataItems.size()>num,
1114 "Expected no more than "+num+
1115 " data items to emerge but got at least: "+dataItems.size());
1117 private void expectNorthFifoExactly(int num) {
1118 model.waitNS(128 * CYCLE_TIME_NS);
1119 List<BitVector> dataItems = marina.data.drainMany(num+1);
1120 fatal(dataItems.size()!=num,
1121 "Expected exactly "+num+
1122 " data items to emerge but got at least: "+dataItems.size());
1124 private void expectNorthFifoAtLeast(int num) {
1125 model.waitNS(128 * CYCLE_TIME_NS);
1126 List<BitVector> dataItems = marina.data.drainMany(num);
1127 fatal(dataItems.size()<num,
1128 "Expected at least "+num+
1129 " data items to emerge but got only: "+dataItems.size());
1131 private void expectTokensNoMoreThan(int num) {
1132 int x = marina.getNumTokens();
1133 List<BitVector> dataItems = marina.data.drainMany(num+1);
1135 "Expected no more than "+num+
1136 " tokens to emerge but got at least: "+x);
1138 private void expectTokensExactly(int num) {
1139 int x = marina.getNumTokens();
1141 "Expected exactly "+num+
1142 " tokens but got at least: "+x);
1145 private void testFlagDRecomputationTime(Marina marina) {
1146 marina.instrIn.fill(setIlc(1));
1147 marina.fillSouthProperStopper(new Instruction[] {
1149 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
1150 SEND_DATA_IF_D_NOT_SET
1152 marina.fillNorthProperStopper();
1153 expectNorthFifoNoMoreThan(0);
1155 marina.fillSouthProperStopper(new Instruction[] {
1157 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
1158 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
1159 SEND_DATA_IF_D_NOT_SET
1161 marina.fillNorthProperStopper();
1162 expectNorthFifoNoMoreThan(0);
1164 marina.fillSouthProperStopper(new Instruction[] {
1166 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
1167 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
1168 SEND_DATA_IF_D_NOT_SET
1170 marina.fillNorthProperStopper();
1171 expectNorthFifoExactly(1);
1172 marina.instrIn.fill(DEC);
1174 marina.fillSouthProperStopper(new Instruction[] {
1176 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
1177 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
1178 SEND_DATA_IF_D_NOT_SET
1180 marina.fillNorthProperStopper();
1181 expectNorthFifoExactly(1);
1184 private void testTailWaitsForHead(Marina marina) {
1185 marina.instrIn.fill(setIlc(1));
1186 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
1188 marina.enableInstructionSend(false);
1189 marina.enableInstructionRecirculate(true);
1191 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1192 marina.instrIn.fill(new Instruction.Head(dock));
1193 marina.instrIn.fill(SEND_DATA);
1194 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1195 marina.instrIn.fill(SEND_TOKEN);
1196 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1197 marina.instrIn.fill(new Instruction.Tail(dock));
1198 marina.instrIn.fillTorpedo();
1200 marina.enableInstructionRecirculate(false);
1201 marina.enableInstructionSend(true);
1202 marina.instrIn.run();
1204 expectNorthFifoNoMoreThan(0);
1205 prln("inserting into north proper stopper");
1206 marina.fillNorthProperStopper();
1207 expectNorthFifoExactly(1);
1208 int nbToks = marina.getNumTokens();
1209 fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
1213 marina.instrIn.fill(setIlc(1));
1214 marina.instrIn.fill(setOlc(1));
1216 // this makes the head wait for the torpedo
1217 marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
1219 // the head should wait for the tail
1220 marina.instrIn.fill(new Instruction.Head(dock));
1221 marina.instrIn.fill(NOP);
1222 marina.instrIn.fill(SEND_DATA);
1223 marina.instrIn.fill(RECV_DATA);
1225 expectNorthFifoNoMoreThan(0);
1227 marina.instrIn.fillTorpedo();
1228 expectNorthFifoNoMoreThan(0);
1230 marina.instrIn.fill(new Instruction.Tail(dock));
1231 expectNorthFifoExactly(1);
1234 private void testTailWithoutHead(Marina marina) {
1235 marina.instrIn.fill(setIlc(1));
1236 marina.fillSouthProperStopper(new Instruction[] {
1237 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
1238 new Instruction.Tail(dock),
1241 List<BitVector> dataItems = marina.data.drainMany(1);
1242 fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
1245 private void testHeadWaitsForTail(Marina marina) {
1246 List<BitVector> dataItems;
1248 prln("Begin testHeadWaitsForTail");
1251 marina.instrIn.fill(setIlc(1));
1252 marina.fillSouthProperStopper(new Instruction[] {
1253 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
1254 new Instruction.Head(dock),
1255 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1259 expectNorthFifoExactly(0);
1260 marina.instrIn.fill(new Instruction.Tail(dock));
1261 expectNorthFifoAtLeast(1);
1264 prln("End testHeadWaitsForTail");
1267 private void testNonTorpedoableMoveDoesNotResetDFlag(Marina marina) {
1268 marina.instrIn.fill(setIlc(1));
1269 marina.fillSouthProperStopper(new Instruction[] {
1270 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,63),
1271 new Instruction.Move(dock,
1272 Predicate.IgnoreFlagD, // predicate
1273 true, // torpedoable
1282 new Instruction.Move(dock,
1283 Predicate.FlagD, // predicate
1284 false, // torpedoable
1294 marina.instrIn.fillTorpedo();
1295 expectNorthFifoExactly(1);
1296 marina.fillSouthProperStopper(new Instruction[] {
1297 new Instruction.Move(dock,
1298 Predicate.Default, // predicate
1299 false, // torpedoable
1309 expectNorthFifoNoMoreThan(0);
1312 private void testAbort(Marina marina) {
1314 marina.instrIn.fill(setIlc(1));
1315 marina.fillSouthProperStopper(new Instruction[] {
1316 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,1),
1317 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
1318 SEND_DATA_IF_D_NOT_SET,
1319 new Instruction.Head(dock),
1320 SEND_DATA_IF_D_NOT_SET,
1321 new Instruction.Set(dock,Predicate.Default,SetDest.DataLatch,2),
1322 new Instruction.Abort(dock, Predicate.FlagD),
1323 new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter,SetSource.Decrement),
1324 new Instruction.Tail(dock),
1327 for(int i=0; i<4; i++) {
1330 model.waitNS(128 * CYCLE_TIME_NS);
1331 bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
1332 fatal(bv==null, "no data item found");
1333 prln("got " + bv.toLong());
1334 fatal(bv.toLong()!=1, "expected 1, got " + bv.toLong());
1336 model.waitNS(128 * CYCLE_TIME_NS);
1337 bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
1338 fatal(bv==null, "no data item found");
1339 prln("got " + bv.toLong());
1340 fatal(bv.toLong()!=1, "expected 1, got " + bv.toLong());
1342 model.waitNS(128 * CYCLE_TIME_NS);
1343 bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
1344 fatal(bv==null, "no data item found");
1345 prln("got " + bv.toLong());
1346 fatal(bv.toLong()!=2, "expected 2, got " + bv.toLong());
1351 private void testAbortOutsideOfLoop(Marina marina) {
1352 marina.instrIn.fill(setIlc(1));
1353 marina.fillSouthProperStopper(new Instruction[] {
1354 // ensure that an abort doesn't cause problems if no loop is in progress
1355 new Instruction.Abort(dock, Predicate.IgnoreFlagD),
1358 expectNorthFifoExactly(1);
1361 private void testFlagAB(Marina marina) {
1362 prln("Begin testFlagAB");
1365 Instruction.Set.FlagFunction zero = Instruction.Set.FlagFunction.ZERO;
1366 Instruction.Set.FlagFunction one = zero;
1369 // we should be able to use any pair of FlagX+NotFlagX,
1370 // but we toss them all in to maximize the chances of the
1371 // test passing (later we will try the individual
1372 // combinations to maximize the chances of failure).
1373 one = one.add(Predicate.FlagA);
1374 one = one.add(Predicate.NotFlagA);
1375 one = one.add(Predicate.FlagB);
1376 one = one.add(Predicate.NotFlagB);
1377 one = one.add(Predicate.FlagC);
1378 one = one.add(Predicate.NotFlagC);
1380 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
1381 for(boolean fast : new boolean[] { true, false }) {
1382 // clear the flags to a known state, then check both 0->1 and 1->0 transitions
1383 for(boolean b : new boolean[] { false, true, false }) {
1384 prln("state: a="+marina.getFlagA()+", b="+marina.getFlagB());
1385 prln((b?"Setting":"Clearing")+" flags");
1387 Instruction inst = new Instruction.Set(dock,Predicate.IgnoreFlagD,
1392 marina.fillSouthProperStopper(new Instruction[] {
1397 model.waitNS(64 * CYCLE_TIME_NS);
1398 marina.fillNorthProperStopper();
1400 marina.instrIn.fill(inst);
1403 fatal(marina.getFlagA()!=b,
1404 "after "+(b?"setting":"clearing")+" FlagA, it was still "+(b?"clear":"set"));
1405 fatal(marina.getFlagB()!=b,
1406 "after "+(b?"setting":"clearing")+" FlagB, it was still "+(b?"clear":"set"));
1411 prln("End testFlagAB");
1415 * WARNING: this is a very, very, very long test case -- it goes
1416 * through 216 iterations.
1418 private void testFlagTruthTable(Marina marina) {
1419 prln("Begin testFlagTruthTable");
1422 marina.instrIn.fill(setIlc(1));
1423 Instruction.Set.FlagFunction zero = Instruction.Set.FlagFunction.ZERO;
1424 Instruction.Set.FlagFunction one = zero.add(Predicate.FlagA).add(Predicate.NotFlagA);
1426 for(Predicate a_input : new Predicate[] { null, Predicate.FlagA, Predicate.NotFlagA })
1427 for(Predicate b_input : new Predicate[] { null, Predicate.FlagB, Predicate.NotFlagB })
1428 for(Predicate c_input : new Predicate[] { null, Predicate.FlagC, Predicate.NotFlagC })
1429 for(boolean a_state : new boolean[] { false, true })
1430 for(boolean b_state : new boolean[] { false, true })
1431 for(boolean c_state : new boolean[] { false, true }) {
1432 for(boolean which : new boolean[] { false, true }) {
1434 prln("before instruction: a="+a_state+", b="+b_state+", c="+c_state);
1435 // set A,B flags to a_state and b_state
1436 marina.instrIn.fill(new
1437 Instruction.Set(dock,Predicate.IgnoreFlagD,
1438 a_state ? one : zero,
1439 b_state ? one : zero
1442 // set C flag to c_state
1443 BitVector data = new BitVector(37, "empty");
1444 BitVector addr = new BitVector(14, "empty");
1445 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1446 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1447 addr.set(Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE, c_state);
1448 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1449 marina.instrIn.fill(RECV_DATA);
1451 Instruction.Set.FlagFunction func = zero;
1452 if (a_input!=null) func = func.add(a_input);
1453 if (b_input!=null) func = func.add(b_input);
1454 if (c_input!=null) func = func.add(c_input);
1456 Instruction inst = new
1457 Instruction.Set(dock,Predicate.IgnoreFlagD,
1458 !which ? func : zero.add(Predicate.FlagA),
1459 which ? func : zero.add(Predicate.FlagB)
1462 marina.instrIn.fill(inst);
1464 boolean expected_a = !which ? func.evaluate(a_state, b_state, c_state, false) : a_state;
1465 boolean expected_b = which ? func.evaluate(a_state, b_state, c_state, false) : b_state;
1466 fatal(expected_a != marina.getFlagA(),
1467 "expected A="+expected_a+", but got "+marina.getFlagA());
1468 fatal(expected_b != marina.getFlagB(),
1469 "expected B="+expected_b+", but got "+marina.getFlagB());
1473 prln("End testFlagTruthTable");
1476 private void recvData(Marina marina) {
1477 prln("Begin recvData");
1480 marina.instrIn.fill(setIlc(1));
1481 marina.fillSouthProperStopper(new Instruction[] {
1482 new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
1483 new Instruction.Move(dock,
1484 Predicate.IgnoreFlagD, // predicate
1485 false, // torpedoable
1494 new Instruction.Set(dock,Predicate.IgnoreFlagD, SET_FLAG, SET_FLAG),
1496 model.waitNS(64 * CYCLE_TIME_NS);
1498 prln("checking to confirm that A flag is cleared");
1499 fatal(marina.getFlagA(), "bad A flag: "+marina.getFlagA());
1501 prln("inserting data item in north fifo ring");
1502 BitVector data = new BitVector(37, "empty");
1503 BitVector addr = new BitVector(14, "empty");
1504 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1505 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1506 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1507 model.waitNS(64 * CYCLE_TIME_NS);
1509 prln("checking to see if A flag got set");
1510 fatal(!marina.getFlagA(), "bad A flag: "+marina.getFlagA());
1513 prln("End recvData");
1517 private void testRecvAndSendWalkingOne(Marina marina) {
1518 prln("Begin testRecvAndSendWalkingOne");
1521 marina.instrIn.fill(setIlc(1));
1523 List<BitVector> dataItems;
1524 for(int bit=0; bit<37; bit++) {
1526 BitVector data = new BitVector(37, "empty");
1527 BitVector addr = new BitVector(14, "empty");
1528 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1529 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1530 data.set(bit, true);
1531 prln("testing with bit pattern " + data);
1533 prln("inserting data item into north fifo ring");
1534 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1536 prln("stopping the north proper stopper");
1539 dataItems = marina.data.drainMany(1);
1540 fatal(dataItems.size()!=0,
1541 "found a data item waiting in the north proper stopper, but should not have");
1543 marina.instrIn.fill(new Instruction.Move(dock,
1544 Predicate.IgnoreFlagD, // predicate
1545 false, // torpedoable
1555 dataItems = marina.data.drainMany(2);
1556 fatal(dataItems.size()!=1,
1557 "found "+dataItems.size()+" data items in north fifo; expected one");
1558 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
1559 fatalIfBitVectorsDoNotMatch(mp.data, data);
1563 prln("End testRecvAndSendWalkingOne");
1568 private void setOlcFromDataLatch(Marina marina) {
1569 prln("Begin setOlcFromDataLatch");
1572 marina.instrIn.fill(setIlc(1));
1574 // walk a bit from 0 to 5
1575 for(int bit=0; bit<6; bit++) {
1576 prln("inserting data item in north fifo ring");
1577 BitVector data = new BitVector(37, "empty");
1578 BitVector addr = new BitVector(14, "empty");
1579 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1580 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1581 data.set(bit, true);
1582 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1584 marina.fillSouthProperStopper(new Instruction[] {
1586 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.DataLatch),
1587 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,-1),
1590 model.waitNS(CYCLE_TIME_NS * 64);
1594 if (marina.kesselsCounter) {
1595 // master clear on each iteration; otherwise we'd need to "run down" the olc
1596 marina.masterClear();
1597 marina.enableInstructionSend(true);
1602 prln("End setOlcFromDataLatch");
1605 private void setIlcFromDataLatch(Marina marina) {
1606 prln("Begin setIlcFromDataLatch");
1609 marina.instrIn.fill(setIlc(1));
1611 // walk a bit from 0 to 5
1612 for(int bit=5; bit>=0; bit--) {
1613 prln("inserting data item in north fifo ring");
1614 BitVector data = new BitVector(37, "empty");
1615 BitVector addr = new BitVector(14, "empty");
1616 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1617 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1618 data.set(bit, true);
1619 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1621 marina.fillSouthProperStopper(new Instruction[] {
1622 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1624 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.DataLatch),
1626 model.waitNS(CYCLE_TIME_NS * 64);
1628 int ilc = marina.getILC().getCount();
1629 fatal(ilc != (1<<bit), "expected ilc to be " + (1<<bit) + ", but got " + ilc);
1633 prln("End setIlcFromDataLatch");
1636 private void testSendAndRecvToken(Marina marina) {
1637 prln("Begin testSendAndRecvToken");
1640 marina.instrIn.fill(setIlc(1));
1641 marina.fillSouthProperStopper(new Instruction[] {
1646 expectNorthFifoExactly(1);
1649 prln("End testSendAndRecvToken");
1652 private void testSignExtendedLiteral(Marina marina) {
1653 prln("Begin testSignExtendedLiteral");
1656 marina.instrIn.fill(setIlc(1));
1657 for(long val : new long[] { (-1L << 14), -1, 0, 1 }) {
1659 marina.fillSouthProperStopper(new Instruction[] {
1660 new Instruction.Set(dock,Predicate.IgnoreFlagD,
1661 Instruction.Set.SetDest.DataLatch,
1665 model.waitNS(CYCLE_TIME_NS * 64);
1667 List<BitVector> dataItems = marina.data.drainMany(3);
1668 fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
1670 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
1671 BitVector bv = mp.data;
1672 prln("got back " + mp);
1674 boolean mismatch = false;
1676 for(int i=0; i<37; i++) {
1677 if (bv.get(i) != ( (val & (1L << i)) != 0 )) {
1682 fatal(mismatch, "data read back did not match inserted literal; mismatch on bits " + err);
1686 prln("End testSignExtendedLiteral");
1689 private void testShiftedLiteral(Marina marina) {
1690 prln("Begin testShiftedLiteral");
1693 marina.instrIn.fill(setIlc(1));
1694 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
1695 Instruction.Set.SetDest.DataLatch,
1698 BitVector dreg = new BitVector(37, "what we think is in the d-register");
1699 for(int i=0; i<37; i++) dreg.set(i, false);
1701 for(long val : new long[] { -1, 0, 1, (-1L << 18) }) {
1703 edu.berkeley.fleet.api.BitVector immediate =
1704 new edu.berkeley.fleet.api.BitVector(19);
1705 for(int i=0; i<immediate.length(); i++)
1706 immediate.set(i, (val & (1L << i)) != 0);
1708 // shift over 19 LSB's towards MSB
1709 for(int i=0; i<19; i++)
1710 if (i+19 <= 36) dreg.set(i+19, dreg.get(i));
1711 for(int i=0; i<19; i++)
1712 dreg.set(i, immediate.get(i));
1714 marina.fillSouthProperStopper(new Instruction[] {
1715 new Instruction.Shift(dock,Predicate.IgnoreFlagD,immediate),
1719 model.waitNS(CYCLE_TIME_NS * 64);
1720 List<BitVector> dataItems = marina.data.drainMany(3);
1721 fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
1723 BitVector bv = new MarinaPacket(dataItems.get(0)).data;
1724 fatal(!bv.equals(dreg), "data read back did not match inserted literal.\n" +
1725 "got: "+bv.bitReverse().getState()+"\n"+
1726 "expected:"+dreg.bitReverse().getState());
1730 prln("End testShiftedLiteral");
1733 private void testFlagC(Marina marina) {
1734 prln("Begin testFlagC");
1742 // Dc=1 => sigS is copied into C-flag
1743 // Dc=0 => sigA is copied into C-flag
1745 marina.instrIn.fill(setIlc(1));
1746 for(boolean dc : new boolean[] { false, true }) {
1747 for(boolean c_flag : new boolean[] { true, false, true }) {
1750 prln("****** checking case where dc="+dc+", cflag="+c_flag);
1751 BitVector data = new BitVector(37, "empty");
1752 BitVector addr = new BitVector(14, "empty");
1753 for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
1754 for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
1757 ? Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE
1758 : Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ZERO;
1759 prln("setting addr["+whichbit+"] to "+(c_flag?"1":"0"));
1760 addr.set(whichbit, c_flag);
1762 prln("... and filling north fifo proper stopper");
1763 marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
1765 prln("clearing flags");
1766 prln("executing recv data with Dc="+dc);
1767 prln("copying c-flag to a-flag");
1768 marina.fillSouthProperStopper(new Instruction[] {
1769 new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
1770 new Instruction.Move(dock,
1771 Predicate.IgnoreFlagD, /* predicate */
1772 true, /* torpedoable */
1774 false, /* tokenIn */
1777 false, /* latchPath */
1778 false, /* dataOut */
1779 false /* tokenOut */
1782 new Instruction.Set(dock,Predicate.IgnoreFlagD,
1783 Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagC),
1788 model.waitNS(CYCLE_TIME_NS * 64);
1790 prln("checking to confirm that A flag is " + c_flag);
1791 fatal(marina.getFlagA()!=c_flag, "bad A flag: "+marina.getFlagA());
1795 prln("End testFlagC");
1798 private void sendDataWithPath(Marina marina) {
1799 prln("Begin sendDataWithPath");
1802 edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
1803 marina.instrIn.fill(setIlc(1));
1805 // alternating ones and zeroes
1806 for(int i=0; i<bv.length(); i+=2)
1808 // and then ones in the lower four bits so it's not symmetric
1809 for(int i=0; i<4; i++)
1812 MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
1814 marina.fillSouthProperStopper(new Instruction[] {
1815 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
1816 new Instruction.Move(dock,
1817 Predicate.IgnoreFlagD, /* predicate */
1818 false, /* torpedoable */
1820 false, /* tokenIn */
1822 false, /* latchData */
1823 false, /* latchPath */
1825 false /* tokenOut */
1829 List<BitVector> dataItems;
1832 dataItems = marina.data.drainMany();
1833 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
1834 mp = new MarinaPacket(dataItems.get(0));
1836 // the 14th bit of the outbound address cannot be set by the
1837 // ship, so we don't care about it
1838 fatalIfBitVectorsDoNotMatch(MarinaUtils.berkToSun(bv), mp.path.get(0,13));
1840 prln("send data with no change to path");
1841 marina.instrIn.fill(new Instruction.Move(dock,
1842 Predicate.IgnoreFlagD, /* predicate */
1843 false, /* torpedoable */
1845 false, /* tokenIn */
1847 false, /* latchData */
1848 false, /* latchPath */
1850 false /* tokenOut */
1853 dataItems = marina.data.drainMany();
1854 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
1855 mp = new MarinaPacket(dataItems.get(0));
1857 // the 14th bit of the outbound address cannot be set by the
1858 // ship, so we don't care about it
1859 fatalIfBitVectorsDoNotMatch(MarinaUtils.berkToSun(bv), mp.path.get(0,13));
1862 prln("End sendDataWithPath");
1865 private void recvPath(Marina marina) {
1866 prln("Begin recvPath");
1869 marina.instrIn.fill(setIlc(1));
1870 for(int bit=0; bit<11; bit++) {
1871 BitVector packet_data = new BitVector(37, "inbound data item");
1872 for(int i=0; i<37; i++) packet_data.set(i, false);
1873 packet_data.set(27+bit, true);
1874 BitVector packet_path = new BitVector(14, "inbound data item");
1875 for(int i=0; i<14; i++) packet_path.set(i, false);
1877 marina.fillNorthProperStopper(new MarinaPacket(packet_data, false, packet_path));
1879 prln("recv path, send data (using recv'd path)");
1880 marina.instrIn.fill(new Instruction.Move(dock,
1881 Predicate.IgnoreFlagD, /* predicate */
1882 false, /* torpedoable */
1884 false, /* tokenIn */
1886 true, /* latchData */
1887 true, /* latchPath */
1889 false /* tokenOut */
1892 List<BitVector> dataItems = marina.data.drainMany();
1893 fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
1894 MarinaPacket mp = new MarinaPacket(dataItems.get(0));
1896 fatalIfBitVectorsDoNotMatch(packet_data.get(25,11), mp.path.get(0,11));
1897 fatalIfBitVectorsDoNotMatch(packet_data, mp.data);
1901 prln("End recvPath");
1904 private void testILC(Marina marina) {
1905 prln("Begin testILC");
1908 for(int bit=0; bit<6; bit++) {
1909 int ilc = bit<0 ? 0 : (1<<bit);
1910 marina.fillSouthProperStopper(new Instruction[] {
1911 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,ilc),
1914 List<BitVector> dataItems = marina.data.drainMany();
1915 fatal(dataItems.size()!=ilc, "Expected "+ilc+" data item(s) to emerge but got: "+dataItems.size()+" data items");
1919 prln("End testILC");
1922 private void testILCZero(Marina marina) {
1924 marina.fillSouthProperStopper(new Instruction[] {
1925 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,0),
1929 expectNorthFifoNoMoreThan(0);
1930 expectTokensExactly(1);
1934 private void sendTorpedo(Marina marina) {
1935 prln("Begin sendTorpedo");
1937 marina.instrIn.fill(setIlc(1));
1938 marina.instrIn.fill(setOlc(63));
1940 model.waitNS(128 * CYCLE_TIME_NS);
1943 marina.instrIn.fill(new
1944 Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
1945 fatal(marina.getFlagA(), "bad A flag: true");
1946 fatal(marina.getFlagB(), "bad B flag: true");
1948 prln("execute a move instruction that does nothing but loops until torpedo arrives");
1949 prln("A=1, B=B This instruction should not execute because D-flag is set");
1950 prln("Set A=A, B=1 This instruction should execute because D-flag is set");
1952 model.waitNS(128 * CYCLE_TIME_NS);
1954 marina.fillSouthProperStopper(new Instruction[] {
1955 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity),
1956 new Instruction.Move(dock,
1957 Predicate.IgnoreFlagD, // predicate
1958 true, // torpedoable
1967 new Instruction.Set(dock,Predicate.Default,
1969 Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB)
1971 new Instruction.Set(dock, Predicate.FlagD,
1972 Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA),
1977 model.waitNS(128 * CYCLE_TIME_NS);
1979 prln("send torpedo. This should clear the OLC");
1980 marina.instrIn.fillTorpedo();
1981 model.waitNS(128 * CYCLE_TIME_NS);
1983 model.waitNS(128 * CYCLE_TIME_NS);
1985 prln("A should remain false, B should be true");
1986 fatal(marina.getFlagA(), "bad A flag: true");
1987 fatal(!marina.getFlagB(), "bad B flag: false");
1989 model.waitNS(128 * CYCLE_TIME_NS);
1991 prln("Reload OLC after torpedo, clears D-flag");
1992 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
1994 // FIXME: find another way to test this
1995 model.waitNS(128 * CYCLE_TIME_NS);
1998 prln("Set A=1, B=1 This instruction should execute because OLC!=0");
1999 marina.instrIn.fill(new
2000 Instruction.Set(dock,Predicate.Default, SET_FLAG, SET_FLAG));
2002 prln("A and B should be true");
2003 fatal(!marina.getFlagA(), "bad A flag: false");
2004 fatal(!marina.getFlagB(), "bad B flag: false");
2007 prln("End sendTorpedo");
2010 private void testTorpedoOnAnInfinite(Marina marina) {
2011 prln("Begin testTorpedoOnAnInfinite");
2014 List<BitVector> dataItems;
2016 marina.instrIn.fill(setIlc(1));
2017 for(boolean torpedoable : new boolean[] { true, false }) {
2019 marina.fillSouthProperStopper(new Instruction[] {
2020 new Instruction.Move(dock,
2021 Predicate.IgnoreFlagD, // predicate
2022 false, // torpedoable
2031 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
2032 new Instruction.Move(dock,
2033 Predicate.IgnoreFlagD, // predicate
2034 torpedoable, // torpedoable
2043 // FIXME: this probably should be removed, unless Ivan doesn't want to change the behavior
2044 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
2049 // expect nothing to come out, because the NOP is executing
2050 dataItems = marina.data.drainMany(2);
2051 fatal(dataItems.size()!=0, "Expected no data item(s) to emerge but got at least: "+dataItems.size()+" data items");
2053 marina.instrIn.fillTorpedo();
2055 int expected = torpedoable?1:0;
2056 dataItems = marina.data.drainMany(2);
2057 fatal(dataItems.size()!=expected, "Expected "+expected+" item to emerge but got: "+dataItems.size()+" data items");
2059 fatal(!marina.getILC().getDone(), "Expected ilc=done, but got "+marina.getILC());
2063 prln("End testTorpedoOnAnInfinite");
2066 private void testDFlagWhenTorpedoLyingInWait(Marina marina) {
2067 marina.fillSouthProperStopper(new Instruction[] {
2070 TORPEDOABLE_RECV_DATA,
2074 SEND_TOKEN_IF_D_SET,
2077 expectTokensExactly(0);
2079 // changing the order of these lines should work, but it does not
2080 marina.fillNorthProperStopper();
2081 marina.instrIn.fillTorpedo();
2083 expectTokensExactly(1);
2086 private void testSetOlcFollowedByDPredicated(Marina marina) {
2087 for(boolean d_set : new boolean[] { false, true }) {
2089 marina.fillSouthProperStopper(new Instruction[] {
2091 marina.kesselsCounter ? null : FLAG_NOP,
2092 d_set ? SEND_DATA_IF_D_SET : SEND_DATA_IF_D_NOT_SET,
2094 expectNorthFifoExactly(d_set ? 1 : 0);
2097 marina.fillSouthProperStopper(new Instruction[] {
2099 marina.kesselsCounter ? null : FLAG_NOP,
2100 d_set ? SEND_DATA_IF_D_SET : SEND_DATA_IF_D_NOT_SET,
2102 expectNorthFifoExactly(d_set ? 0 : 1);
2104 if (marina.kesselsCounter) {
2105 marina.masterClear();
2106 marina.enableInstructionSend(true);
2111 private void testOlcDecrementAtHighSpeed(Marina marina) {
2112 prln("Begin testOlcDecrementAtHighSpeed");
2115 List<BitVector> dataItems;
2117 // Each element of the following pair of arrays is one "test".
2118 // The OLC will be loaded with olcs[i] and then decremented
2119 // decr_amounts[i] times; after that has happened the zeroness
2120 // of the OLC will be checked by executing a MOVE with
2121 // [olc!=0] as the predicate.
2123 int[] olcs = new int[] { 3, 3, 3, 10, 41 };
2124 int[] decr_amounts = new int[] { 2, 3, 4, 9, 9 };
2126 for(int which=0; which<olcs.length; which++) {
2127 int olc = olcs[which];
2128 int decr_amount = decr_amounts[which];
2130 prln("inserting set olc="+olc);
2131 prln("inserting set ilc=1");
2132 marina.fillSouthProperStopper(new Instruction[] {
2133 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
2134 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,olc),
2137 // commenting the following four lines causes this test to pass
2139 prln("inserting: "+decr_amount+" olc-- instructions");
2140 prln("inserting: [!d] send data");
2141 Instruction[] instructions = new Instruction[decr_amount+1];
2142 for(int i=0; i<decr_amount; i++)
2144 new Instruction.Set(dock,
2146 SetDest.OuterLoopCounter,
2147 SetSource.Decrement);
2148 instructions[instructions.length-1] =
2149 new Instruction.Move(dock,
2150 Predicate.Default, // predicate
2151 false, // torpedoable
2161 marina.fillSouthProperStopper(instructions);
2162 model.waitNS(64 * CYCLE_TIME_NS);
2164 int expected = decr_amount>=olc ? 0 : 1;
2165 dataItems = marina.data.drainMany(2);
2166 fatal(dataItems.size()!=expected, "Expected "+expected+" item to emerge but got: "+dataItems.size()+" data items");
2167 expectOlc(Math.max(0,olc-decr_amount));
2169 if (marina.kesselsCounter) {
2170 // master clear on each iteration; otherwise we'd need to "run down" the olc
2171 marina.masterClear();
2172 marina.enableInstructionSend(true);
2177 prln("End testOlcDecrementAtHighSpeed");
2180 private void flipIlcBit(Marina marina) {
2181 prln("Begin flipIlcBit");
2183 prln("Using the set ILC instruction, toggle a single bit between zero and one. \n" +
2184 "Check correct setting of the ILC zero bit");
2186 for (int i=0; i<6; i++) {
2189 prln("Then immediately set ILC="+notZero);
2190 marina.fillSouthProperStopper(new Instruction[] {
2191 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
2192 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
2195 model.waitNS(64 * CYCLE_TIME_NS);
2197 prln("Verify ILC using scan chain");
2198 Ilc ilc = marina.getILC();
2199 int ilcCount = ilc.getCount();
2200 fatal(ilcCount!=notZero, "bad ILC count: "+ilcCount+" expected: "+notZero);
2201 fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
2203 marina.fillSouthProperStopper(new Instruction[] {
2204 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
2205 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
2208 model.waitNS(64 * CYCLE_TIME_NS);
2210 prln("Verify ILC using scan chain");
2211 ilc = marina.getILC();
2212 ilcCount = ilc.getCount();
2213 fatal(ilcCount!=0, "bad ILC count: "+ilcCount+" expected: 0");
2214 fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
2218 prln("End flipIlcBit");
2220 private void flipOlcBit(Marina marina) {
2221 prln("Begin flipOlcBit");
2223 prln("Using the set OLC instruction, toggle a single bit between zero and one. \n" +
2224 "Check correct setting of the OLC zero bit");
2226 marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
2228 for (int i=0; i<6; i++) {
2229 int notZero = 32 >> i;
2231 if (marina.kesselsCounter) {
2232 // master clear on each iteration; otherwise we'd need to "run down" the olc
2233 marina.masterClear();
2234 marina.enableInstructionSend(true);
2239 prln("Then immediately set OLC="+notZero);
2240 marina.fillSouthProperStopper(new Instruction[] {
2241 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
2242 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
2245 model.waitNS(64 * CYCLE_TIME_NS);
2246 prln("Verify OLC count using scan chain");
2249 if (!marina.kesselsCounter) {
2250 prln("Set OLC="+notZero);
2251 prln("Then immediately set OLC=0");
2252 marina.fillSouthProperStopper(new Instruction[] {
2253 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
2254 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
2257 model.waitNS(64 * CYCLE_TIME_NS);
2258 prln("Verify OLC count using scan chain");
2264 prln("End flipOlcBit");
2266 private void testSouthRecirculate(Marina marina, int AMOUNT) {
2267 prln("Begin testSouthRecirculate("+AMOUNT+")");
2270 marina.enableInstructionSend(false);
2271 marina.enableInstructionRecirculate(true);
2273 prln("Completely fill south ring");
2275 for (int i=0; i<AMOUNT; i++) {
2276 prln("inserting item " + (i+1) + " / " + AMOUNT);
2277 BitVector path = new BitVector(MarinaPacket.PATH_WIDTH, "path");
2278 BitVector data = new BitVector(MarinaPacket.WORD_WIDTH, "path");
2279 path.set(0, MarinaPacket.PATH_WIDTH, false);
2280 data.setFromLong(i+9);
2281 marina.instrIn.fill(new MarinaPacket(data, false, path));
2285 prln("Drain south ring and check contents");
2287 List<BitVector> out = marina.instrIn.drainMany();
2288 boolean bad = false;
2289 for (int i=0; i<AMOUNT; i++) {
2290 prln("extracting item " + (i+1) + " / " + AMOUNT);
2291 //int expect = (i+Marina.SOUTH_RING_CAPACITY-1) % Marina.SOUTH_RING_CAPACITY;
2293 long got = new MarinaPacket(out.get(i)).data.toLong();
2296 prln(" bad instruction: "+got+" expected: "+expect);
2298 prln(" good instruction.");
2301 fatal(bad, "data inserted does not match data retrieved");
2304 for (int i=0; i<5; i++) {}
2307 prln("End testSouthRecirculate("+AMOUNT+")");
2311 private void testOverfillTokens(Marina marina) {
2312 prln("Begin testOverfillTokens");
2315 for(int i=0; i<marina.TOKEN_FIFO_CAPACITY + 3; i++)
2316 marina.instrIn.fill(SEND_TOKEN);
2317 marina.instrIn.fill(SEND_DATA);
2318 expectNorthFifoExactly(0);
2321 prln("End testSouthRecirculate");
2326 private void doOneTest(int testNum) throws Exception {
2328 doOneTest_(testNum);
2329 } catch (MarinaUtils.FailureException fe) {
2330 System.out.println("******************************************************************************");
2331 System.out.println("******************************************************************************");
2332 System.out.println("******************************************************************************");
2333 System.out.println("******************************************************************************");
2334 fe.printStackTrace();
2338 private void doOneTest_(int testNum) throws Exception {
2340 prln("============================================================");
2341 prln("MarinaTest: performing test: "+testNum);
2346 int[] tests = new int[] { 1002, 1003, 1005, 3002, 3004, 3005, 3006, 3008, 3009, 3025, 3026, 3029 };
2348 PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("test.out")));
2349 while(vdd <= 1.3f) {
2350 vdd10.setVoltageWait(vdd);
2351 System.out.println("vdd10 = " + vdd10.readVoltage());
2353 for(int i=0; i<tests.length; i++) {
2355 doOneTest_(tests[i]);
2356 pw.println(vdd + " " + i + " " + "1");
2357 } catch (MarinaUtils.FailureException fe) {
2358 pw.println(vdd + " " + i + " " + "0");
2364 } catch (Exception e) { throw new RuntimeException(e); }
2368 marina.masterClear();
2369 marina.enableInstructionSend(true);
2372 MarinaUtils.testnum = testNum;
2377 doOneTest(1); // passes extracted parasitics
2378 doOneTest(2); // passes extracted parasitics
2379 doOneTest(3); // passes extracted parasitics
2380 doOneTest(4); // passes extracted parasitics
2381 doOneTest(5); // passes extracted parasitics
2384 doOneTest(1000); // passes extracted parasitics
2385 doOneTest(1001); // passes extracted parasitics
2386 doOneTest(1003); // passes extracted parasitics
2388 doOneTest(3000); // passes extracted parasitics
2389 doOneTest(3001); // passes extracted parasitics
2390 doOneTest(3003); // passes extracted parasitics
2391 doOneTest(3004); // passes extracted parasitics
2392 doOneTest(3005); // passes extracted parasitics
2393 doOneTest(3006); // passes extracted parasitics
2394 doOneTest(3007); // passes extracted parasitics
2395 doOneTest(3008); // passes extracted parasitics
2396 doOneTest(3009); // passes extracted parasitics
2397 doOneTest(3010); // passes extracted parasitics
2398 doOneTest(3011); // passes extracted parasitics
2399 doOneTest(3012); // passes extracted parasitics
2400 doOneTest(3013); // passes extracted parasitics
2401 doOneTest(3014); // passes extracted parasitics
2402 doOneTest(3015); // passes extracted parasitics
2403 doOneTest(3019); // passes extracted parasitics
2404 doOneTest(3020); // passes extracted parasitics
2405 doOneTest(3022); // passes extracted parasitics
2406 doOneTest(3023); // passes extracted parasitics
2407 doOneTest(3025); // passes extracted parasitics
2408 doOneTest(3026); // passes extracted parasitics
2409 doOneTest(3027); // passes extracted parasitics
2410 doOneTest(3028); // passes extracted parasitics
2411 doOneTest(3029); // passes extracted parasitics
2412 //doOneTest(3030); // passes extracted parasitics (questionable)
2413 //doOneTest(3031); // passes extracted parasitics should not pass!
2415 // these tests take a while and usually pass
2427 // this takes an insanely long time
2431 case 1: testChains(marina); break; // passes, 24-Mar (+verilog)
2432 case 2: testProperStoppers(marina); break; // passes, 24-Mar (+verilog)
2433 case 3: testSouthRecirculate(marina, 1); break; // passes, 24-Mar (+verilog)
2434 case 4: getCtrsFlags(marina); break; // 20-Apr (+verilog)
2435 case 5: sendInstructions(marina); break; // passes, 24-Mar (+verilog)
2436 case 6: walkOneOLC(marina); break; // 21-Apr (+verilog)
2438 // Russell's tests begin with 1000
2439 case 1000: walkOneILC(marina); break; // 20-Apr (+verilog)
2440 case 1001: countIlc(marina); break; // 20-Apr (+verilog)
2441 case 1002: countOlc(marina); break; // 23-Apr (+verilog)
2443 case 1003: sendTorpedo(marina); break; // 23-Apr (+verilog) [with wor-hack]
2445 case 1004: flipIlcBit(marina); break; // 20-Apr (+verilog)
2446 case 1005: flipOlcBit(marina); break; // 21-Apr (+verilog)
2448 case 1006: testSouthRecirculate(marina, Marina.SOUTH_RING_CAPACITY-1); break; // passes, 24-Mar (+verilog)
2450 // Adam's tests begin with 3000
2451 case 3000: sendToken(marina); break; // passes, 24-Mar (+verilog)
2452 case 3001: testFlagAB(marina); break; // passes, 08-Apr (+verilog)
2453 case 3002: testPredicationOnAB(marina); break; // 22-Apr (+verilog)
2454 case 3003: testFlagC(marina); break; // 23-Apr (+verilog)
2455 case 3004: testFlagD(marina); break; // 23-Apr (+verilog)
2456 case 3005: testFlagDRecomputationTime(marina); break;
2458 case 3006: testTailWaitsForHead(marina); break;
2459 case 3007: testTailWithoutHead(marina); break;
2460 case 3008: testHeadWaitsForTail(marina); break; // 22-Apr (+verilog)
2461 case 3009: testAbort(marina); break; // 22-Apr (+verilog)
2463 case 3010: sendData(marina); break; // passes, 24-Mar (+verilog)
2464 case 3011: recvData(marina); break; // 21-Apr (+verilog)
2465 case 3012: sendDataWithPath(marina); break; // passes, 13-Apr (+verilog)
2467 case 3013: testSignExtendedLiteral(marina); break; // 20-Apr (+verilog)
2468 case 3014: testShiftedLiteral(marina); break; // 20-Apr (+verilog)
2469 case 3015: testSendAndRecvToken(marina); break; // 21-Apr (+verilog)
2471 case 3016: sendDataIlcInfinite(marina); break; // 22-Apr (+verilog)
2472 case 3017: testFlagTruthTable(marina); break; // 23-Apr (+verilog)
2474 case 3019: setOlcFromDataLatch(marina); break; // 23-Apr (+verilog)
2475 case 3020: setIlcFromDataLatch(marina); break; // 23-Apr (+verilog)
2476 case 3021: recvPath(marina); break; // 22-Apr (+verilog)
2477 case 3022: testILC(marina); break; // 23-Apr (+verilog)
2478 case 3023: testTorpedoOnAnInfinite(marina); break; // 23-Apr (+verilog)
2479 case 3024: testRecvAndSendWalkingOne(marina); break; // 21-Apr (+verilog)
2480 case 3025: testOlcDecrementAtHighSpeed(marina); break; // 23-Apr (+verilog)
2482 case 3026: testNonTorpedoableMoveDoesNotResetDFlag(marina); break; // 23-Apr (+verilog)
2483 case 3027: testILCZero(marina); break;
2484 case 3028: testAbortOutsideOfLoop(marina); break;
2485 case 3029: testDFlagWhenTorpedoLyingInWait(marina); break;
2486 case 3030: testSetOlcFollowedByDPredicated(marina); break;
2487 case 3031: testOverfillTokens(marina); break;
2489 case 3040: loadEveryValueOLC(marina); break;
2491 SubchainNode chainNode =
2492 (SubchainNode)marina.cc.getChainControlFromPath(Marina.DUKE_CHAIN)
2493 .findNode("marina.duke.marinaGu@0.dukeAll@1.dukePart@0.ring37sW@1.scanner@0.scanFx1@1.scanCell@3");
2494 int bitIndex = chainNode.getBitIndex();
2495 ChainNode root = chainNode.getParentChain();
2497 for(int i=0; i<13; i++) {
2498 System.out.println("i="+i);
2499 for(int j=0; j<12; j++)
2500 root.getInBits().set(bitIndex+j, false);
2501 root.getInBits().set(bitIndex+i, true);
2502 marina.shiftDuke(false, true);
2512 PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
2515 vdd18.setVoltageWait((float)Math.max(1.8,vdd));
2516 //vdd10.setVoltageWait(vdd);
2518 if (!Marina.kesselsCounter) throw new RuntimeException();
2519 if (!Marina.omegaCounter) throw new RuntimeException();
2521 for(int xx=1; xx<65; xx++) {
2522 marina.masterClear();
2524 marina.stopAndResetCounters();
2526 marina.enableInstructionSend(true);
2527 marina.fillSouthProperStopper(new Instruction.Set(dock,Predicate.IgnoreFlagD,
2528 Instruction.Set.FlagFunction.ZERO
2529 .add(Predicate.FlagA).add(Predicate.NotFlagA),
2530 Instruction.Set.FlagFunction.ZERO));
2531 //int xx = 63; // 1.802ms
2532 //int xx = 1; // 0.207ms => 24.3ns for 62 counts => 390ps cycle time => 2.5Ghz
2533 marina.fillSouthProperStopper(new Instruction[] {
2534 new Instruction.Head(dock),
2538 TORPEDOABLE_RECV_DATA,
2542 new Instruction.Tail(dock),
2545 marina.fillSouthProperStopper(new Instruction[] {
2547 new Instruction.Set(dock,Predicate.FlagD,
2548 Instruction.Set.FlagFunction.ZERO.add(Predicate.NotFlagA),
2549 Instruction.Set.FlagFunction.ZERO),
2552 SEND_DATA_IF_A_SET_AND_D_NOT_SET,
2554 SEND_DATA_IF_A_SET_AND_D_NOT_SET,
2557 SEND_DATA_IF_A_SET_AND_D_NOT_SET,
2571 //marina.startCounters(false, false);
2573 marina.instrIn.run();
2575 vdd10.setVoltageWait(vdd);
2576 marina.startCounters(false, true);
2578 try { Thread.sleep(wait); } catch (Exception e) { }
2579 //marina.instrIn.stop();
2581 marina.stopAndResetCounters();
2582 int countNorth = marina.getNorthCount();
2583 int countSouth = marina.getSouthCount();
2584 pw.println(xx + " " + countNorth + " " + vdd + " " + vdd10.readCurrent());
2586 System.out.println(xx + " " + countNorth + " " + vdd + " " + vdd10.readCurrent());
2597 PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
2598 for(double myvdd = 1.00; myvdd<1.01; myvdd += 0.05) {
2600 vdd18.setVoltageWait((float)Math.max(1.8,vdd));
2601 vdd10.setVoltageWait(vdd);
2604 for(int toks = 0; toks < 13; toks++) {
2607 for(int iter = 0; iter < MAX_ITER; iter++) {
2609 marina.masterClear();
2611 marina.stopAndResetCounters();
2613 marina.enableInstructionSend(true);
2614 marina.fillSouthProperStopper(setOlc(1));
2615 marina.fillSouthProperStopper(new Instruction.Head(dock));
2616 for(int i=0; i<toks; i++)
2617 marina.fillSouthProperStopper(/*SEND_DATA*/NOP);
2618 marina.fillSouthProperStopper(new Instruction[] {
2619 new Instruction.Tail(dock),
2622 marina.instrIn.run();
2624 // have to set the voltage while drawing current
2625 vdd10.setVoltageWait(vdd);
2627 marina.startCounters();
2628 try { Thread.sleep(wait); } catch (Exception e) { }
2629 marina.stopAndResetCounters();
2630 //marina.instrIn.stop();
2632 int countNorth = marina.getNorthCount();
2633 int countSouth = marina.getSouthCount();
2634 System.out.println();
2635 System.out.println();
2636 if (countSouth > (2<<29))
2637 System.out.println("warning: count was greater than 2^29...");
2638 double gst = ((((double)countSouth*2)) / (1000000. * wait /* * toks*/));
2639 System.out.println("south counter is: " + countSouth + ", which is " + gst + "Ginst/sec with toks="+toks + " @vdd="+vdd);
2642 System.out.println();
2643 System.out.println();
2645 System.out.println("counters are " + count + " and " + countNorth + "; ratio is "+
2646 (((double)countNorth)/((double)(count*2))) + " " +
2647 (((double)countNorth)/((double)(count*2+1))) + " " +
2651 float vdd10v = vdd10.readVoltage();
2652 float vdd18v = vdd18.readVoltage();
2653 float vddsv = vdds.readCurrent();
2654 float vdd10c = vdd10.readCurrent();
2655 float vdd18c = vdd18.readCurrent();
2656 pw.println(vdd + " " +
2658 (((double)total) / MAX_ITER) + " " +
2675 PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
2676 for(int toks = 0; toks < 13; toks++) {
2679 for(int iter = 0; iter < MAX_ITER; iter++) {
2681 marina.masterClear();
2683 marina.stopAndResetCounters();
2685 marina.enableInstructionSend(true);
2686 marina.fillSouthProperStopper(setOlc(1));
2687 marina.fillSouthProperStopper(new Instruction.Set(dock,Predicate.IgnoreFlagD,
2688 Instruction.Set.FlagFunction.ZERO,
2689 Instruction.Set.FlagFunction.ZERO));
2690 marina.fillSouthProperStopper(new Instruction.Head(dock));
2691 //marina.fillSouthProperStopper(setIlc(31));
2692 marina.fillSouthProperStopper(SEND_DATA);
2693 for(int i=0; i<toks+1; i++) {
2694 //marina.fillSouthProperStopper(FLAG_NOP_IF_FLAG_A);
2695 marina.fillSouthProperStopper(FLAG_NOP);
2697 marina.fillSouthProperStopper(new Instruction[] {
2698 new Instruction.Tail(dock),
2700 marina.startCounters();
2702 marina.instrIn.run();
2703 try { Thread.sleep(wait); } catch (Exception e) { }
2705 marina.stopAndResetCounters();
2706 int countNorth = marina.getNorthCount();
2707 int count = marina.getSouthCount();
2708 System.out.println();
2709 System.out.println();
2710 if (count > (2<<29))
2711 System.out.println("warning: count was greater than 2^29...");
2712 double gst = ((((double)count*2)) / (1000000. * wait /* * toks*/));
2713 System.out.println("south counter is: " + count + ", which is " + gst + "Ginst/sec with toks="+toks + " @vdd="+vdd);
2716 System.out.println();
2717 System.out.println();
2719 pw.println(vdd + " " + toks + " " + (((double)total) / MAX_ITER));
2725 loadEveryValueOLC(marina);
2730 fatal(true, "Test number: "+testNum+" doesn't exist.");
2733 // If we get here then test passed
2734 prln("Test Result: Passed");
2736 //Infrastructure.exit(0);
2740 //============================ for public use =============================
2743 * 0: test detected success
2744 * 2: test detected failure
2747 public static void main(String[] args) throws Exception {
2748 startTime = System.currentTimeMillis();
2749 new MarinaTest(args);