switch to VoltageReadablePowerChannel, add a bunch of tests
authorAdam Megacz <adam@megacz.com>
Fri, 20 Nov 2009 03:02:35 +0000 (19:02 -0800)
committerAdam Megacz <adam@megacz.com>
Fri, 20 Nov 2009 03:02:35 +0000 (19:02 -0800)
src/com/sun/vlsi/chips/marina/test/Marina.java
src/com/sun/vlsi/chips/marina/test/MarinaTest.java

index 353c049..12dee06 100644 (file)
@@ -16,9 +16,9 @@ public class Marina {
        
     public static int TOKEN_FIFO_CAPACITY = 3;
     
-    //public static boolean kesselsCounter = true;
-    public static boolean kesselsCounter = false;
-    public static boolean omegaCounter = false;
+    //public static final boolean kesselsCounter = true;
+    public static final boolean kesselsCounter = false;
+    public static final boolean omegaCounter = false;
 
     public static final String DATA_CHAIN =    kesselsCounter ? "marina.marina_data" : "marina.ivan_data";      
     public static final String CONTROL_CHAIN = kesselsCounter ? "marina.marina_control" : "marina.ivan_control";
index 01b394d..98044b2 100644 (file)
@@ -163,6 +163,12 @@ public class MarinaTest {
         
     static PowerChannel vdd18;
     static PowerChannel vdd10;
+    static PowerChannel vdds;
+
+    private void setVdd10(float v) {
+        if (vdd10==null) return;
+        vdd10.setVoltageWait(v);
+    }
 
     private void doSim() throws Exception {
         String netListName;
@@ -178,11 +184,17 @@ public class MarinaTest {
                 return;
         }
 
+
         Infrastructure.gpibControllers = new int[]{1};
-        vdd18 = new Pst3202Channel("ch2", "tiPST3202", 2);
-        vdd10 = new Pst3202Channel("ch3", "tiPST3202", 3);
-        vdd10.setVoltageNoWait(vdd);
-        vdd18.setVoltageNoWait(1.8f);
+        vdd18 = new Pst3202Channel("ch1", "tiPST3202", 1);
+        vdd18 = new Pst3202Channel("ch3", "tiPST3202", 3);
+        vdd10 = new PowerChannelResistorVoltageReadable(new Pst3202Channel("ch2", "tiPST3202", 2),
+                                                        1000, 
+                                                        new HP34401A("HP34970"),
+                                                        true);
+        
+        if (vdd10!=null) setVdd10(vdd);
+        if (vdd18!=null) vdd18.setVoltageNoWait(1.8f);
 
         model = cmdArgs.useVerilog
             ? new VerilogModel()
@@ -209,58 +221,61 @@ public class MarinaTest {
         JtagTester tester =
             model instanceof SimulationModel
             ? ((SimulationModel)model).createJtagTester("TCK", "TMS", "TRSTb", "TDI", "TDO")
-            : new Netscan("jtag2"); // bad kessels counter
-            //: new Netscan4("jtag3", 4);    // good kessels counter
+            : new Netscan("jtag2");
+        //: new Netscan("10.0.0.200");
+        //: new Signalyzer();
+        //: new Netscan("jtag2");
         JtagLogicLevel mc0=null;
         JtagLogicLevel mc1=null;
-        if (tester instanceof Netscan) {
-            ((Netscan)tester).reset();
+        if (tester instanceof NetscanGeneric) {
+            ((NetscanGeneric)tester).reset();
             // master clear
             // not sure if "GPIO1" means "index 0" or not
             mc0 = new JtagLogicLevel(tester, 0);
             mc1 = new JtagLogicLevel(tester, 1);
+            mc1 = mc0;
             mc0.setLogicState(true);
             mc1.setLogicState(true);
         }
         /*
-        Logger.setLogInits(true);
-        tester.setLogSets(true);
-        tester.setLogOthers(true);
-        tester.setAllLogging(true);
-        tester.printInfo = true;
+          Logger.setLogInits(true);
+          tester.setLogSets(true);
+          tester.setLogOthers(true);
+          tester.setAllLogging(true);
+          tester.printInfo = true;
         */
         tester.printInfo = false;
 
         ChainControls ccs = new ChainControls();
         PowerChannel pc = new ManualPowerChannel("pc", false);
         /*
-        JtagTester testerD, testerR, testerC;
-        testerD = ((SimulationModel)model).createJtagSubchainTester("sid[1:9]", null); 
-        testerR = ((SimulationModel)model).createJtagSubchainTester("sir[1:9]", null); 
-        testerC = ((SimulationModel)model).createJtagSubchainTester("sic[1:9]", null); 
-        testerD.printInfo = testerR.printInfo = testerC.printInfo = false;
+          JtagTester testerD, testerR, testerC;
+          testerD = ((SimulationModel)model).createJtagSubchainTester("sid[1:9]", null); 
+          testerR = ((SimulationModel)model).createJtagSubchainTester("sir[1:9]", null); 
+          testerC = ((SimulationModel)model).createJtagSubchainTester("sic[1:9]", null); 
+          testerD.printInfo = testerR.printInfo = testerC.printInfo = false;
 
-        ccD = new ChainControl(SCAN_CHAIN_XML, testerD, 1.8f, khz);
-        ccR = new ChainControl(SCAN_CHAIN_XML, testerR, 1.8f, khz);
-        ccC = new ChainControl(SCAN_CHAIN_XML, testerC, 1.8f, khz);
-        ccD.noTestSeverity = ccR.noTestSeverity = ccC.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
+          ccD = new ChainControl(SCAN_CHAIN_XML, testerD, 1.8f, khz);
+          ccR = new ChainControl(SCAN_CHAIN_XML, testerR, 1.8f, khz);
+          ccC = new ChainControl(SCAN_CHAIN_XML, testerC, 1.8f, khz);
+          ccD.noTestSeverity = ccR.noTestSeverity = ccC.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
 
         
-        ctD = new ChainTest(ccD, pc);
-        ctR = new ChainTest(ccR, pc);
-        ctC = new ChainTest(ccC, pc);
+          ctD = new ChainTest(ccD, pc);
+          ctR = new ChainTest(ccR, pc);
+          ctC = new ChainTest(ccC, pc);
         */        
         /*
-        ccs.addChain(Marina.DATA_CHAIN, ccD);
-        ccs.addChain(Marina.REPORT_CHAIN, ccR);
-        ccs.addChain(Marina.CONTROL_CHAIN, ccC);
+          ccs.addChain(Marina.DATA_CHAIN, ccD);
+          ccs.addChain(Marina.REPORT_CHAIN, ccR);
+          ccs.addChain(Marina.CONTROL_CHAIN, ccC);
         */
         /*
-        PowerChannel ch2 = new Pst3202Channel("ch2", "tiPST3202", 2);
-        PowerChannel ch3 = new Pst3202Channel("ch3", "tiPST3202", 3);
-        Infrastructure.gpibControllers = new int[]{1};
-        ch2.setVoltageNoWait(1f);
-        ch3.setVoltageNoWait(1.8f);
+          PowerChannel ch2 = new Pst3202Channel("ch2", "tiPST3202", 2);
+          PowerChannel ch3 = new Pst3202Channel("ch3", "tiPST3202", 3);
+          Infrastructure.gpibControllers = new int[]{1};
+          ch2.setVoltageNoWait(1f);
+          ch3.setVoltageNoWait(1.8f);
         */
 
 
@@ -737,65 +752,65 @@ public class MarinaTest {
         //for (int i=-1; i<6; i++) {
         marina.fillSouthProperStopper(new Instruction[] {
 
-                new Instruction.Head(dock),
+        new Instruction.Head(dock),
 
-                //                new Instruction.Set(dock,Predicate.IgnoreFlagD, SetDest.OuterLoopCounter, 1),
-                FLAG_NOP,
-                FLAG_NOP,
-                FLAG_NOP,
-                TORPEDOABLE_RECV_DATA,
-                FLAG_NOP,
-                FLAG_NOP,
-                FLAG_NOP,
+        //                new Instruction.Set(dock,Predicate.IgnoreFlagD, SetDest.OuterLoopCounter, 1),
+        FLAG_NOP,
+        FLAG_NOP,
+        FLAG_NOP,
+        TORPEDOABLE_RECV_DATA,
+        FLAG_NOP,
+        FLAG_NOP,
+        FLAG_NOP,
 
 
-                //new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement),
+        //new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement),
                 
-                new Instruction.Tail(dock),
-            });
+        new Instruction.Tail(dock),
+        });
         marina.fillSouthProperStopper(new Instruction[] {
-                null,
-            },
-            true);
+        null,
+        },
+        true);
         while(true) {
-            BitVector bits = null;
-            marina.shiftReport(true, false);
-            for(int i=0; i<4; i++) {
-                BitVector x = marina.cc.getOutBits(marina.REPORT_CHAIN+"."+marina.OLC_PATH_KESSEL+i);
-                //System.out.println("bits are: " + x);
-                bits = bits==null ? x : bits.cat(x);
-            }
-            System.out.println("dec="+bits.get(0));
-            if (bits.get(1)) throw new RuntimeException();
+        BitVector bits = null;
+        marina.shiftReport(true, false);
+        for(int i=0; i<4; i++) {
+        BitVector x = marina.cc.getOutBits(marina.REPORT_CHAIN+"."+marina.OLC_PATH_KESSEL+i);
+        //System.out.println("bits are: " + x);
+        bits = bits==null ? x : bits.cat(x);
+        }
+        System.out.println("dec="+bits.get(0));
+        if (bits.get(1)) throw new RuntimeException();
         }
         */
         /*        for (int i=0; i<64; i++) {
 
-            if (marina.kesselsCounter) {
-                System.out.println("master-clearing...");
-                // master clear on each iteration; otherwise we'd need to "run down" the olc
-                marina.masterClear();
-                marina.enableInstructionSend(true);
-            }
-
-            expectTokensExactly(0);
-            marina.getOLC();
-
-            int inOlc = i==-1 ? 0 : (1<<i);
-            inOlc = i;
-            marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc));
-            marina.instrIn.fill(SEND_DATA_IF_D_SET);
-            marina.instrIn.fill(SEND_DATA_IF_D_NOT_SET);
-            marina.instrIn.fill(SEND_DATA);
-
-            model.waitNS(128 * CYCLE_TIME_NS);
-
-            expectOlc(inOlc);
-            prln("walkOneOLC: "+inOlc+" checks out");
-            expectNorthFifoExactly(0);
-        }
-        adjustIndent(-2);
-        prln("End walkOneOLC");
+                  if (marina.kesselsCounter) {
+                  System.out.println("master-clearing...");
+                  // master clear on each iteration; otherwise we'd need to "run down" the olc
+                  marina.masterClear();
+                  marina.enableInstructionSend(true);
+                  }
+
+                  expectTokensExactly(0);
+                  marina.getOLC();
+
+                  int inOlc = i==-1 ? 0 : (1<<i);
+                  inOlc = i;
+                  marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc));
+                  marina.instrIn.fill(SEND_DATA_IF_D_SET);
+                  marina.instrIn.fill(SEND_DATA_IF_D_NOT_SET);
+                  marina.instrIn.fill(SEND_DATA);
+
+                  model.waitNS(128 * CYCLE_TIME_NS);
+
+                  expectOlc(inOlc);
+                  prln("walkOneOLC: "+inOlc+" checks out");
+                  expectNorthFifoExactly(0);
+                  }
+                  adjustIndent(-2);
+                  prln("End walkOneOLC");
         */
     }
     private void walkOneILC(Marina marina) {
@@ -1194,27 +1209,27 @@ public class MarinaTest {
         fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
     }
 
-        /*
-        marina.instrIn.fill(setIlc(1));
-        marina.instrIn.fill(setOlc(1));
+    /*
+      marina.instrIn.fill(setIlc(1));
+      marina.instrIn.fill(setOlc(1));
 
-        // this makes the head wait for the torpedo
-        marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
+      // this makes the head wait for the torpedo
+      marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
 
-        // the head should wait for the tail
-        marina.instrIn.fill(new Instruction.Head(dock));
-        marina.instrIn.fill(NOP);
-        marina.instrIn.fill(SEND_DATA);
-        marina.instrIn.fill(RECV_DATA);
+      // the head should wait for the tail
+      marina.instrIn.fill(new Instruction.Head(dock));
+      marina.instrIn.fill(NOP);
+      marina.instrIn.fill(SEND_DATA);
+      marina.instrIn.fill(RECV_DATA);
 
-        expectNorthFifoNoMoreThan(0);
+      expectNorthFifoNoMoreThan(0);
 
-        marina.instrIn.fillTorpedo();
-        expectNorthFifoNoMoreThan(0);
+      marina.instrIn.fillTorpedo();
+      expectNorthFifoNoMoreThan(0);
 
-        marina.instrIn.fill(new Instruction.Tail(dock));
-        expectNorthFifoExactly(1);
-        */
+      marina.instrIn.fill(new Instruction.Tail(dock));
+      expectNorthFifoExactly(1);
+    */
 
     private void testTailWithoutHead(Marina marina) {
         marina.instrIn.fill(setIlc(1));
@@ -2356,197 +2371,369 @@ public class MarinaTest {
 
         MarinaUtils.testnum = testNum;
 
-            switch (testNum) {
-                case 0: {
-
-                    doOneTest(1);       // passes extracted parasitics
-                    doOneTest(2);       // passes extracted parasitics
-                    doOneTest(3);       // passes extracted parasitics
-                    doOneTest(4);       // passes extracted parasitics
-                    doOneTest(5);       // passes extracted parasitics
-                    doOneTest(6);
-
-                    doOneTest(1000);    // passes extracted parasitics
-                    doOneTest(1001);    // passes extracted parasitics
-                    doOneTest(1003);    // passes extracted parasitics
-                    doOneTest(1005);
-                    doOneTest(3000);    // passes extracted parasitics
-                    doOneTest(3001);    // passes extracted parasitics
-                    doOneTest(3003);    // passes extracted parasitics
-                    doOneTest(3004);    // passes extracted parasitics
-                    doOneTest(3005);    // passes extracted parasitics
-                    doOneTest(3006);    // passes extracted parasitics
-                    doOneTest(3007);    // passes extracted parasitics
-                    doOneTest(3008);    // passes extracted parasitics
-                    doOneTest(3009);    // passes extracted parasitics
-                    doOneTest(3010);    // passes extracted parasitics
-                    doOneTest(3011);    // passes extracted parasitics
-                    doOneTest(3012);    // passes extracted parasitics
-                    doOneTest(3013);    // passes extracted parasitics
-                    doOneTest(3014);    // passes extracted parasitics
-                    doOneTest(3015);    // passes extracted parasitics
-                    doOneTest(3019);    // passes extracted parasitics
-                    doOneTest(3020);    // passes extracted parasitics
-                    doOneTest(3022);    // passes extracted parasitics
-                    doOneTest(3023);    // passes extracted parasitics
-                    doOneTest(3025);    // passes extracted parasitics
-                    doOneTest(3026);    // passes extracted parasitics
-                    doOneTest(3027);    // passes extracted parasitics
-                    doOneTest(3028);    // passes extracted parasitics
-                    doOneTest(3029);    // passes extracted parasitics
-                    //doOneTest(3030);    // passes extracted parasitics (questionable)
-                    //doOneTest(3031);    // passes extracted parasitics should not pass!
+        switch (testNum) {
+            case 0: {
+
+                doOneTest(1);       // passes extracted parasitics
+                doOneTest(2);       // passes extracted parasitics
+                doOneTest(3);       // passes extracted parasitics
+                doOneTest(4);       // passes extracted parasitics
+                doOneTest(5);       // passes extracted parasitics
+                doOneTest(6);
+
+                doOneTest(1000);    // passes extracted parasitics
+                doOneTest(1001);    // passes extracted parasitics
+                doOneTest(1003);    // passes extracted parasitics
+                doOneTest(1005);
+                doOneTest(3000);    // passes extracted parasitics
+                doOneTest(3001);    // passes extracted parasitics
+                doOneTest(3003);    // passes extracted parasitics
+                doOneTest(3004);    // passes extracted parasitics
+                doOneTest(3005);    // passes extracted parasitics
+                doOneTest(3006);    // passes extracted parasitics
+                doOneTest(3007);    // passes extracted parasitics
+                doOneTest(3008);    // passes extracted parasitics
+                doOneTest(3009);    // passes extracted parasitics
+                doOneTest(3010);    // passes extracted parasitics
+                doOneTest(3011);    // passes extracted parasitics
+                doOneTest(3012);    // passes extracted parasitics
+                doOneTest(3013);    // passes extracted parasitics
+                doOneTest(3014);    // passes extracted parasitics
+                doOneTest(3015);    // passes extracted parasitics
+                doOneTest(3019);    // passes extracted parasitics
+                doOneTest(3020);    // passes extracted parasitics
+                doOneTest(3022);    // passes extracted parasitics
+                doOneTest(3023);    // passes extracted parasitics
+                doOneTest(3025);    // passes extracted parasitics
+                doOneTest(3026);    // passes extracted parasitics
+                doOneTest(3027);    // passes extracted parasitics
+                doOneTest(3028);    // passes extracted parasitics
+                doOneTest(3029);    // passes extracted parasitics
+                //doOneTest(3030);    // passes extracted parasitics (questionable)
+                //doOneTest(3031);    // passes extracted parasitics should not pass!
                     
-                    // these tests take a while and usually pass
-                    doOneTest(1002);
-                    doOneTest(1004);
-                    doOneTest(1005);
-                    doOneTest(1006);
-                    doOneTest(3002);
-                    doOneTest(3016);
-                    doOneTest(3021);
-                    doOneTest(3024);
-                    doOneTest(3025);
-                    doOneTest(3040);
+                // these tests take a while and usually pass
+                doOneTest(1002);
+                doOneTest(1004);
+                doOneTest(1005);
+                doOneTest(1006);
+                doOneTest(3002);
+                doOneTest(3016);
+                doOneTest(3021);
+                doOneTest(3024);
+                doOneTest(3025);
+                doOneTest(3040);
                     
-                    // this takes an insanely long time
-                    doOneTest(3017);
-                    break;
-                }
-                case 1:    testChains(marina);                     break; // passes, 24-Mar (+verilog)
-                case 2:    testProperStoppers(marina);             break; // passes, 24-Mar (+verilog)
-                case 3:    testSouthRecirculate(marina, 1);        break; // passes, 24-Mar (+verilog)
-                case 4:    getCtrsFlags(marina);                   break; //         20-Apr (+verilog)
-                case 5:    sendInstructions(marina);               break; // passes, 24-Mar (+verilog)
-                case 6:    walkOneOLC(marina);                     break; //         21-Apr (+verilog)
+                // this takes an insanely long time
+                doOneTest(3017);
+                break;
+            }
+            case 1:    testChains(marina);                     break; // passes, 24-Mar (+verilog)
+            case 2:    testProperStoppers(marina);             break; // passes, 24-Mar (+verilog)
+            case 3:    testSouthRecirculate(marina, 1);        break; // passes, 24-Mar (+verilog)
+            case 4:    getCtrsFlags(marina);                   break; //         20-Apr (+verilog)
+            case 5:    sendInstructions(marina);               break; // passes, 24-Mar (+verilog)
+            case 6:    walkOneOLC(marina);                     break; //         21-Apr (+verilog)
                 
-                    // Russell's tests begin with 1000
-                case 1000: walkOneILC(marina);                     break; //         20-Apr (+verilog)
-                case 1001: countIlc(marina);                       break; //         20-Apr (+verilog)
-                case 1002: countOlc(marina);                       break; //         23-Apr (+verilog)
-
-                case 1003: sendTorpedo(marina);                    break; //         23-Apr (+verilog)  [with wor-hack]
-
-                case 1004: flipIlcBit(marina);                     break; //         20-Apr (+verilog)
-                case 1005: flipOlcBit(marina);                     break; //         21-Apr (+verilog)
-
-                case 1006: testSouthRecirculate(marina, Marina.SOUTH_RING_CAPACITY-1);        break; // passes, 24-Mar (+verilog)
-
-                    // Adam's tests begin with 3000
-                case 3000: sendToken(marina);                      break; // passes, 24-Mar (+verilog)
-                case 3001: testFlagAB(marina);                     break; // passes, 08-Apr (+verilog)
-                case 3002: testPredicationOnAB(marina);            break; //         22-Apr (+verilog)
-                case 3003: testFlagC(marina);                      break; //         23-Apr (+verilog)
-                case 3004: testFlagD(marina);                      break; //         23-Apr (+verilog)
-                case 3005: testFlagDRecomputationTime(marina);     break;
-
-                case 3006: testTailWaitsForHead(marina);           break;
-                case 3007: testTailWithoutHead(marina);            break;
-                case 3008: testHeadWaitsForTail(marina);           break; //         22-Apr (+verilog)
-                case 3009: testAbort(marina);                      break; //         22-Apr (+verilog)
-
-                case 3010: sendData(marina);                       break; // passes, 24-Mar (+verilog)
-                case 3011: recvData(marina);                       break; //         21-Apr (+verilog)
-                case 3012: sendDataWithPath(marina);               break; // passes, 13-Apr (+verilog)
-
-                case 3013: testSignExtendedLiteral(marina);        break; //         20-Apr (+verilog)
-                case 3014: testShiftedLiteral(marina);             break; //         20-Apr (+verilog)
-                case 3015: testSendAndRecvToken(marina);           break; //         21-Apr (+verilog)
-
-                case 3016: sendDataIlcInfinite(marina);            break; //         22-Apr (+verilog)
-                case 3017: testFlagTruthTable(marina);             break; //         23-Apr (+verilog)
-
-                case 3019: setOlcFromDataLatch(marina);            break; //         23-Apr (+verilog)
-                case 3020: setIlcFromDataLatch(marina);            break; //         23-Apr (+verilog)
-                case 3021: recvPath(marina);                       break; //         22-Apr (+verilog)
-                case 3022: testILC(marina);                        break; //         23-Apr (+verilog)
-                case 3023: testTorpedoOnAnInfinite(marina);        break; //         23-Apr (+verilog)
-                case 3024: testRecvAndSendWalkingOne(marina);      break; //         21-Apr (+verilog)
-                case 3025: testOlcDecrementAtHighSpeed(marina);    break; //         23-Apr (+verilog)
-
-                case 3026: testNonTorpedoableMoveDoesNotResetDFlag(marina);        break; //         23-Apr (+verilog)
-                case 3027: testILCZero(marina);                    break;
-                case 3028: testAbortOutsideOfLoop(marina); break;
-                case 3029: testDFlagWhenTorpedoLyingInWait(marina); break;
-                case 3030: testSetOlcFollowedByDPredicated(marina); break;
-                case 3031: testOverfillTokens(marina); break;
-
-                case 3040: loadEveryValueOLC(marina); break;
-                case 8888: {
-
-                    //int wait = 1000;
-                    int wait = 200;
-                    //int toks = 1;
-
-                    PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
-                    for(double myvdd = 1.0; myvdd<2.0; myvdd += 0.05) {
-                        vdd = (float)myvdd;
-                        vdd18.setVoltageWait((float)Math.max(1.8,vdd));
-                        vdd10.setVoltageWait(vdd);
-                        Thread.sleep(1000);
+                // Russell's tests begin with 1000
+            case 1000: walkOneILC(marina);                     break; //         20-Apr (+verilog)
+            case 1001: countIlc(marina);                       break; //         20-Apr (+verilog)
+            case 1002: countOlc(marina);                       break; //         23-Apr (+verilog)
+
+            case 1003: sendTorpedo(marina);                    break; //         23-Apr (+verilog)  [with wor-hack]
+
+            case 1004: flipIlcBit(marina);                     break; //         20-Apr (+verilog)
+            case 1005: flipOlcBit(marina);                     break; //         21-Apr (+verilog)
+
+            case 1006: testSouthRecirculate(marina, Marina.SOUTH_RING_CAPACITY-1);        break; // passes, 24-Mar (+verilog)
+
+                // Adam's tests begin with 3000
+            case 3000: sendToken(marina);                      break; // passes, 24-Mar (+verilog)
+            case 3001: testFlagAB(marina);                     break; // passes, 08-Apr (+verilog)
+            case 3002: testPredicationOnAB(marina);            break; //         22-Apr (+verilog)
+            case 3003: testFlagC(marina);                      break; //         23-Apr (+verilog)
+            case 3004: testFlagD(marina);                      break; //         23-Apr (+verilog)
+            case 3005: testFlagDRecomputationTime(marina);     break;
+
+            case 3006: testTailWaitsForHead(marina);           break;
+            case 3007: testTailWithoutHead(marina);            break;
+            case 3008: testHeadWaitsForTail(marina);           break; //         22-Apr (+verilog)
+            case 3009: testAbort(marina);                      break; //         22-Apr (+verilog)
+
+            case 3010: sendData(marina);                       break; // passes, 24-Mar (+verilog)
+            case 3011: recvData(marina);                       break; //         21-Apr (+verilog)
+            case 3012: sendDataWithPath(marina);               break; // passes, 13-Apr (+verilog)
+
+            case 3013: testSignExtendedLiteral(marina);        break; //         20-Apr (+verilog)
+            case 3014: testShiftedLiteral(marina);             break; //         20-Apr (+verilog)
+            case 3015: testSendAndRecvToken(marina);           break; //         21-Apr (+verilog)
+
+            case 3016: sendDataIlcInfinite(marina);            break; //         22-Apr (+verilog)
+            case 3017: testFlagTruthTable(marina);             break; //         23-Apr (+verilog)
+
+            case 3019: setOlcFromDataLatch(marina);            break; //         23-Apr (+verilog)
+            case 3020: setIlcFromDataLatch(marina);            break; //         23-Apr (+verilog)
+            case 3021: recvPath(marina);                       break; //         22-Apr (+verilog)
+            case 3022: testILC(marina);                        break; //         23-Apr (+verilog)
+            case 3023: testTorpedoOnAnInfinite(marina);        break; //         23-Apr (+verilog)
+            case 3024: testRecvAndSendWalkingOne(marina);      break; //         21-Apr (+verilog)
+            case 3025: testOlcDecrementAtHighSpeed(marina);    break; //         23-Apr (+verilog)
+
+            case 3026: testNonTorpedoableMoveDoesNotResetDFlag(marina);        break; //         23-Apr (+verilog)
+            case 3027: testILCZero(marina);                    break;
+            case 3028: testAbortOutsideOfLoop(marina); break;
+            case 3029: testDFlagWhenTorpedoLyingInWait(marina); break;
+            case 3030: testSetOlcFollowedByDPredicated(marina); break;
+            case 3031: testOverfillTokens(marina); break;
+
+            case 3040: loadEveryValueOLC(marina); break;
+            case 6666: {
+                SubchainNode chainNode =
+                    (SubchainNode)marina.cc.getChainControlFromPath(Marina.DUKE_CHAIN)
+                    .findNode("marina.duke.marinaGu@0.dukeAll@1.dukePart@0.ring37sW@1.scanner@0.scanFx1@1.scanCell@3");
+                int bitIndex = chainNode.getBitIndex();
+                ChainNode root = chainNode.getParentChain();
+
+                for(int i=0; i<13; i++) {
+                    System.out.println("i="+i);
+                    for(int j=0; j<12; j++)
+                        root.getInBits().set(bitIndex+j, false);
+                    root.getInBits().set(bitIndex+i, true);
+                    marina.shiftDuke(false, true);
+                    System.in.read();
+                }
+                break;
+            }
+
+            case 7777: {
+
+                int wait = 300;
+
+                PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
+
+                vdd = 0.9f;
+                vdd18.setVoltageWait((float)Math.max(1.8,vdd));
+                //vdd10.setVoltageWait(vdd);
+
+                if (!Marina.kesselsCounter) throw new RuntimeException();
+                if (!Marina.omegaCounter) throw new RuntimeException();
+
+                for(int xx=1; xx<65; xx++) {
+                marina.masterClear();
+                marina.data.sink();
+                marina.stopAndResetCounters();
+                    
+                marina.enableInstructionSend(true);
+                marina.fillSouthProperStopper(new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                                                                  Instruction.Set.FlagFunction.ZERO
+                                                                  .add(Predicate.FlagA).add(Predicate.NotFlagA),
+                                                                  Instruction.Set.FlagFunction.ZERO));
+                //int xx = 63;      // 1.802ms
+                //int xx = 1;         // 0.207ms  =>  24.3ns for 62 counts => 390ps cycle time => 2.5Ghz
+                marina.fillSouthProperStopper(new Instruction[] {
+                        new Instruction.Head(dock),
+                        setOlc(xx),
+                        FLAG_NOP,
+                        FLAG_NOP,
+                        TORPEDOABLE_RECV_DATA,
+                        FLAG_NOP,
+                        FLAG_NOP,
+                        SEND_DATA,
+                        new Instruction.Tail(dock),
+                    }, false, false);
+
+                marina.fillSouthProperStopper(new Instruction[] {
+                        /*
+                          new Instruction.Set(dock,Predicate.FlagD,
+                          Instruction.Set.FlagFunction.ZERO.add(Predicate.NotFlagA),
+                          Instruction.Set.FlagFunction.ZERO),
+                          setOlcIfZero(32),
+                          setIlc(63),
+                          SEND_DATA_IF_A_SET_AND_D_NOT_SET,
+                          setIlc(63),
+                          SEND_DATA_IF_A_SET_AND_D_NOT_SET,
+                          DEC,
+                          setIlc(63),
+                          SEND_DATA_IF_A_SET_AND_D_NOT_SET,
+                          setIlc(63),
+                          SEND_DATA,
+                        */
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                    }, true, true);
+
+                //marina.startCounters(false, false);
+                    
+                marina.instrIn.run();
+
+                vdd10.setVoltageWait(vdd);
+                marina.startCounters(false, true);
+
+                try { Thread.sleep(wait); } catch (Exception e) { }
+                //marina.instrIn.stop();
+                    
+                marina.stopAndResetCounters();
+                int countNorth = marina.getNorthCount();
+                int countSouth = marina.getSouthCount();
+                pw.println(xx + " " + countNorth + " " + vdd + " " + vdd10.readCurrent());
+                pw.flush();
+                System.out.println(xx + " " + countNorth + " " + vdd + " " + vdd10.readCurrent());
+                }
+                pw.close();
+                break;
+            }
+            case 8888: {
+
+                //int wait = 1000;
+                int wait = 200;
+                //int toks = 1;
+
+                PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
+                for(double myvdd = 1.00; myvdd<1.01; myvdd += 0.05) {
+                    vdd = (float)myvdd;
+                    vdd18.setVoltageWait((float)Math.max(1.8,vdd));
+                    vdd10.setVoltageWait(vdd);
+                    Thread.sleep(1000);
 
                     for(int toks = 0; toks < 13; toks++) {
-                            int MAX_ITER = 10;
-                            double total = 0;
-                            for(int iter = 0; iter < MAX_ITER; iter++) {
+                        int MAX_ITER = 10;
+                        double total = 0;
+                        for(int iter = 0; iter < MAX_ITER; iter++) {
 
-                                marina.masterClear();
-                                marina.data.sink();
-                                marina.stopAndResetCounters();
+                            marina.masterClear();
+                            marina.data.sink();
+                            marina.stopAndResetCounters();
                                 
-                                marina.enableInstructionSend(true);
-                                marina.fillSouthProperStopper(setOlc(1));
-                                marina.fillSouthProperStopper(new Instruction.Head(dock));
-                                for(int i=0; i<toks; i++)
-                                    marina.fillSouthProperStopper(/*SEND_DATA*/NOP);
-                                marina.fillSouthProperStopper(new Instruction[] {
-                                        new Instruction.Tail(dock),
-                                    }, false, true);
-                                marina.startCounters();
+                            marina.enableInstructionSend(true);
+                            marina.fillSouthProperStopper(setOlc(1));
+                            marina.fillSouthProperStopper(new Instruction.Head(dock));
+                            for(int i=0; i<toks; i++)
+                                marina.fillSouthProperStopper(/*SEND_DATA*/NOP);
+                            marina.fillSouthProperStopper(new Instruction[] {
+                                    new Instruction.Tail(dock),
+                                }, false, true);
                                 
-                                marina.instrIn.run();
-                                try { Thread.sleep(wait); } catch (Exception e) { }
-                                //marina.instrIn.stop();
-                                
-                                marina.stopAndResetCounters();
-                                int countNorth = marina.getNorthCount();
-                                int count      = marina.getSouthCount();
-                                System.out.println();
-                                System.out.println();
-                                if (count > (2<<29))
-                                    System.out.println("warning: count was greater than 2^29...");
-                                double gst = ((((double)count*2)) / (1000000. * wait /* * toks*/));
-                                System.out.println("south counter is: " + count + ", which is " + gst + "Ginst/sec with toks="+toks + " @vdd="+vdd);
-                                total += gst;
-
-                                System.out.println();
-                                System.out.println();
-                                /*
-                                  System.out.println("counters are " + count + " and " + countNorth + "; ratio is "+
-                                  (((double)countNorth)/((double)(count*2))) + " " +
-                                  (((double)countNorth)/((double)(count*2+1))) + " " +
-                                  "");
-                                */
-                            }
-                            pw.println(vdd + " " + toks + " " + (((double)total) / MAX_ITER));
-                            pw.flush();
+                            marina.instrIn.run();
+
+                            // have to set the voltage while drawing current
+                            vdd10.setVoltageWait(vdd);
+
+                            marina.startCounters();
+                            try { Thread.sleep(wait); } catch (Exception e) { }
+                            marina.stopAndResetCounters();
+                            //marina.instrIn.stop();
+
+                            int countNorth = marina.getNorthCount();
+                            int countSouth = marina.getSouthCount();
+                            System.out.println();
+                            System.out.println();
+                            if (countSouth > (2<<29))
+                                System.out.println("warning: count was greater than 2^29...");
+                            double gst = ((((double)countSouth*2)) / (1000000. * wait /* * toks*/));
+                            System.out.println("south counter is: " + countSouth + ", which is " + gst + "Ginst/sec with toks="+toks + " @vdd="+vdd);
+                            total += gst;
+
+                            System.out.println();
+                            System.out.println();
+                            /*
+                              System.out.println("counters are " + count + " and " + countNorth + "; ratio is "+
+                              (((double)countNorth)/((double)(count*2))) + " " +
+                              (((double)countNorth)/((double)(count*2+1))) + " " +
+                              "");
+                            */
                         }
+                        float vdd10v = vdd10.readVoltage();
+                        float vdd18v = vdd18.readVoltage();
+                        float vddsv  = vdds.readCurrent();
+                        float vdd10c = vdd10.readCurrent();
+                        float vdd18c = vdd18.readCurrent();
+                        pw.println(vdd + " " +
+                                   toks + " " +
+                                   (((double)total) / MAX_ITER) + " " +
+                                   //vddsv  + " " + 
+                                   vdd10c + " " +
+                                   vdd18v + " " +
+                                   vdd18c + " " +
+                                   "");
+                        pw.flush();
                     }
-                    break;
                 }
-                case 9999:
-                    loadEveryValueOLC(marina);
-                    countOlc(marina);
-                    break;
-
-                default:
-                    fatal(true, "Test number: "+testNum+" doesn't exist.");
-                    break;
+                break;
+            }
+            case 8889: {
+
+                int wait = 1000;
+                //int wait = 200;
+                //int toks = 1;
+
+                PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("out.dat")));
+                for(int toks = 0; toks < 13; toks++) {
+                    int MAX_ITER = 10;
+                    double total = 0;
+                    for(int iter = 0; iter < MAX_ITER; iter++) {
+                            
+                        marina.masterClear();
+                        marina.data.sink();
+                        marina.stopAndResetCounters();
+                            
+                        marina.enableInstructionSend(true);
+                        marina.fillSouthProperStopper(setOlc(1));
+                        marina.fillSouthProperStopper(new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                                                                          Instruction.Set.FlagFunction.ZERO,
+                                                                          Instruction.Set.FlagFunction.ZERO));
+                        marina.fillSouthProperStopper(new Instruction.Head(dock));
+                        //marina.fillSouthProperStopper(setIlc(31));
+                        marina.fillSouthProperStopper(SEND_DATA);
+                        for(int i=0; i<toks+1; i++) {
+                            //marina.fillSouthProperStopper(FLAG_NOP_IF_FLAG_A);
+                            marina.fillSouthProperStopper(FLAG_NOP);
+                        }
+                        marina.fillSouthProperStopper(new Instruction[] {
+                                new Instruction.Tail(dock),
+                            }, false, true);
+                        marina.startCounters();
+                            
+                        marina.instrIn.run();
+                        try { Thread.sleep(wait); } catch (Exception e) { }
+                            
+                        marina.stopAndResetCounters();
+                        int countNorth = marina.getNorthCount();
+                        int count      = marina.getSouthCount();
+                        System.out.println();
+                        System.out.println();
+                        if (count > (2<<29))
+                            System.out.println("warning: count was greater than 2^29...");
+                        double gst = ((((double)count*2)) / (1000000. * wait /* * toks*/));
+                        System.out.println("south counter is: " + count + ", which is " + gst + "Ginst/sec with toks="+toks + " @vdd="+vdd);
+                        total += gst;
+                            
+                        System.out.println();
+                        System.out.println();
+                    }
+                    pw.println(vdd + " " + toks + " " + (((double)total) / MAX_ITER));
+                    pw.flush();
+                }
+                break;
             }
-            // If we get here then test passed
-            prln("Test Result: Passed");
-            printTestTime();
-            //Infrastructure.exit(0);
+            case 9999:
+                loadEveryValueOLC(marina);
+                countOlc(marina);
+                break;
+
+            default:
+                fatal(true, "Test number: "+testNum+" doesn't exist.");
+                break;
+        }
+        // If we get here then test passed
+        prln("Test Result: Passed");
+        printTestTime();
+        //Infrastructure.exit(0);
     }