add MarinaTest.testDFlagWhenTorpedoLyingInWait() and MarinaTest.testSetOlcFollowedByD...
[fleet.git] / marina / testCode / com / sun / vlsi / chips / marina / test / MarinaTest.java
index 9a5df19..a01c0d8 100644 (file)
@@ -222,10 +222,12 @@ public class MarinaTest {
         ((SimulationModel)model).setOptimizedDirectReadsWrites(true);
 
         CYCLE_TIME_NS = cmdArgs.useVerilog ? (100*20) : 0.250;
-        int khz   = model instanceof VerilogModel ?  100000 : 1000000;
+        int khz   = model instanceof VerilogModel ? 100000 : cmdArgs.jtagShift ? 20000 : 1000000;
 
+        prln("constructing jtag controller");
         JtagTester tester = ((SimulationModel)model).createJtagTester("TCK", "TMS", "TRSTb", "TDI", "TDO");
         tester.printInfo = false;
+
         ChainControls ccs = new ChainControls();
         PowerChannel pc = new ManualPowerChannel("pc", false);
         /*
@@ -252,6 +254,7 @@ public class MarinaTest {
         */
 
         cc = new ChainControl(SCAN_CHAIN_XML, tester, 1.8f, khz);
+        cc.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
         ct = new ChainTest(cc, pc);
         ccs.addChain(Marina.DATA_CHAIN, cc);
         ccs.addChain(Marina.REPORT_CHAIN, cc);
@@ -885,6 +888,19 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
+    private static final Instruction SEND_DATA_IF_D_SET =
+        new Instruction.Move(dock,
+                             Predicate.FlagD,       /* predicate   */
+                             false,                 /* torpedoable */
+                             null_path,             /* path        */
+                             false,                 /* tokenIn     */
+                             false,                 /* dataIn      */
+                             false,                 /* latchData   */
+                             false,                 /* latchPath   */
+                             true,                  /* dataOut     */
+                             false                  /* tokenOut    */
+                             );
+
     private static final Instruction TORPEDOABLE_RECV_DATA =
         new Instruction.Move(dock,
                              Predicate.IgnoreFlagD, /* predicate   */
@@ -952,18 +968,25 @@ public class MarinaTest {
               "Expected exactly "+num+
               " data items to emerge but got at least: "+dataItems.size());
     }
+    private void expectNorthFifoAtLeast(int num) {
+        model.waitNS(128 * CYCLE_TIME_NS);
+        List<BitVector> dataItems = marina.data.drainMany(num);
+        fatal(dataItems.size()<num,
+              "Expected at least "+num+
+              " data items to emerge but got only: "+dataItems.size());
+    }
     private void expectTokensNoMoreThan(int num) {
         int x = marina.getNumTokens();
         List<BitVector> dataItems = marina.data.drainMany(num+1);
         fatal(x>num,
               "Expected no more than "+num+
-              " data items to emerge but got at least: "+x);
+              " tokens to emerge but got at least: "+x);
     }
     private void expectTokensExactly(int num) {
         int x = marina.getNumTokens();
         fatal(x!=num,
               "Expected exactly "+num+
-              " data items to emerge but got at least: "+x);
+              " tokens but got at least: "+x);
     }
 
     private void testFlagDRecomputationTime(Marina marina) {
@@ -1079,12 +1102,10 @@ public class MarinaTest {
                 new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
                 SEND_DATA,
             });
-        dataItems = marina.data.drainMany(1);
-        fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
-        marina.instrIn.fill(new Instruction.Tail(dock));
 
-        BitVector bv = marina.data.drain();
-        fatal(bv==null, "Expected at least one data item to emerge but got none");
+        expectNorthFifoExactly(0);
+        marina.instrIn.fill(new Instruction.Tail(dock));
+        expectNorthFifoAtLeast(1);
 
         adjustIndent(-2);
         prln("End testHeadWaitsForTail");
@@ -1889,6 +1910,45 @@ public class MarinaTest {
         prln("End testTorpedoOnAnInfinite");
     }
 
+    private void testDFlagWhenTorpedoLyingInWait(Marina marina) {
+        marina.fillSouthProperStopper(new Instruction[] {
+                RECV_DATA,
+                TORPEDOABLE_RECV_DATA,
+                marina.kesselsCounter ? null : FLAG_NOP,
+                SEND_DATA_IF_D_SET,
+            });
+        marina.instrIn.fillTorpedo();
+        model.waitNS(64 * CYCLE_TIME_NS);
+        marina.fillNorthProperStopper();
+        model.waitNS(64 * CYCLE_TIME_NS);
+        expectNorthFifoExactly(1);
+    }
+
+    private void testSetOlcFollowedByDPredicated(Marina marina) {
+        for(boolean d_set : new boolean[] { false, true }) {
+            prln("");
+            marina.fillSouthProperStopper(new Instruction[] {
+                    setOlc(0),
+                    marina.kesselsCounter ? null : FLAG_NOP,
+                    d_set ? SEND_DATA_IF_D_SET : SEND_DATA_IF_D_NOT_SET,
+                });
+            expectNorthFifoExactly(d_set ? 1 : 0);
+
+            prln("");
+            marina.fillSouthProperStopper(new Instruction[] {
+                    setOlc(32),
+                    marina.kesselsCounter ? null : FLAG_NOP,
+                    d_set ? SEND_DATA_IF_D_SET : SEND_DATA_IF_D_NOT_SET,
+                });
+            expectNorthFifoExactly(d_set ? 0 : 1);
+
+            if (marina.kesselsCounter) {
+                marina.masterClear();
+                marina.enableInstructionSend(true);
+            }
+        }
+    }
+
     private void testOlcDecrementAtHighSpeed(Marina marina) {
         prln("Begin testOlcDecrementAtHighSpeed");
         adjustIndent(2);