lots of changes to Marina test code, mostly for scan chain counters
[fleet.git] / src / com / sun / vlsi / chips / marina / test / ProperStopper.java
index 484ac8e..46151fa 100644 (file)
@@ -2,12 +2,7 @@ package com.sun.vlsi.chips.marina.test;
 import java.util.ArrayList;
 import java.util.List;
 
-import com.sun.async.test.BitVector;
-import com.sun.async.test.ChainControl;
-import com.sun.async.test.ChipModel;
-import com.sun.async.test.Infrastructure;
-import com.sun.async.test.NanosimModel;
-import com.sun.async.test.VerilogModel;
+import com.sun.async.test.*;
 import com.sun.vlsi.chips.marina.test.MarinaUtils.StateWireState;
 
 public class ProperStopper {
@@ -48,6 +43,8 @@ public class ProperStopper {
     private final ChipModel model;
     private final Indenter indenter;
 
+    private final String pathToCounter;
+
     protected static void fatal(boolean pred, String msg) { MarinaUtils.fatal(pred, msg); }
     private void prln(String msg) { indenter.prln(msg); }
     private void adjustIndent(int n) { indenter.adjustIndent(n); }
@@ -100,8 +97,35 @@ public class ProperStopper {
     private StateWireState boolToState(boolean b) {
         return b ? StateWireState.FULL : StateWireState.EMPTY;
     }
+
+    private CommandCodes fdcstate = null;
+
+    public void setCounterEnable(boolean enable) {
+        this.extra = enable;
+        setFillDrainControl(fdcstate);
+    }
+
+    public void setCounterValue(int val) {
+        SubchainNode chainNode = (SubchainNode) cc.getChainControlFromPath(dataChain).findNode(pathToCounter);
+        int bitIndex = chainNode.getBitIndex();
+        ChainNode root = chainNode.getParentChain();
+        for(int i=0; i<31; i++)
+            root.getInBits().set(bitIndex+i, ((1<<i) & val)!=0);
+        shiftData(false, true);
+    }
+
+    // DOES NOT SHIFT THE CHAIN!!!!
+    public int getCounterValue() {
+        SubchainNode chainNode = (SubchainNode) cc.getChainControlFromPath(dataChain).findNode(pathToCounter);
+        int bitIndex = chainNode.getBitIndex();
+        ChainNode root = chainNode.getParentChain();
+        return (int)root.getOutBits().get(bitIndex, 30).bitReverse().toLong();
+    }
+
     // The first 5 bits of the control chain control the fill and drain stages
-    private void setFillDrainControl(BitVector fdCtl) {
+    private void setFillDrainControl(CommandCodes ccc) {
+        BitVector fdCtl = ccc.bits(extra);
+        fdcstate = ccc;
         fatal(fdCtl.getNumBits()!=6, "expect 6 proper stopper control bits");
         BitVector val = cc.getInBits(controlPath);
         for (int i=0; i<fdCtl.getNumBits(); i++) {
@@ -122,45 +146,47 @@ public class ProperStopper {
 
     /** Put stopper in RUN state */
     public void run() {
-        setFillDrainControl(CommandCodes.RUN.bits());
+        setFillDrainControl(CommandCodes.RUN);
     }
     /** Put stopper in IDLE state */
     public void idle() {
-        setFillDrainControl(CommandCodes.IDLE.bits());
+        setFillDrainControl(CommandCodes.IDLE);
     }
     /** Put stopper in FILL state */
     public void fill() {
-        setFillDrainControl(CommandCodes.FILL.bits());
+        setFillDrainControl(CommandCodes.FILL);
     }
     /** Put stopper in BLOCK state */
     public void block() {
-        setFillDrainControl(CommandCodes.BLOCK.bits());
+        setFillDrainControl(CommandCodes.BLOCK);
     }
     /** Put stopper in STOP state */
     public void stop() {
-        setFillDrainControl(CommandCodes.STOP.bits());
+        setFillDrainControl(CommandCodes.STOP);
     }
     /** Put stopper in CLEAR state */
     public void clear() {
-        setFillDrainControl(CommandCodes.CLEAR.bits());
+        setFillDrainControl(CommandCodes.CLEAR);
     }
     /** Put stopper in SOURCE state */
     public void source() {
-        setFillDrainControl(CommandCodes.SOURCE.bits());
+        setFillDrainControl(CommandCodes.SOURCE);
     }
     /** Put stopper in STOPSOURCE state */
     public void stopSource() {
-        setFillDrainControl(CommandCodes.STOPSOURCE.bits());
+        setFillDrainControl(CommandCodes.STOPSOURCE);
     }
     /** Put stopper in SINK state */
     public void sink() {
-        setFillDrainControl(CommandCodes.SINK.bits());
+        setFillDrainControl(CommandCodes.SINK);
     }
     /** Put stopper in STOPSINK state */
     public void stopSink() {
-        setFillDrainControl(CommandCodes.STOPSINK.bits());
+        setFillDrainControl(CommandCodes.STOPSINK);
     }
 
+    public boolean extra = false;
+
     /** Stop a running stopper in order to add items.  Ensure that we don't
      * lose the item in the fill stage.  
      * Exit state: block */
@@ -218,7 +244,8 @@ public class ProperStopper {
                          String reportChain,
                          ChainControls cc, ChipModel model,
                          boolean clockHack,
-                         Indenter indenter) {
+                         Indenter indenter,
+                         String pathToCounter) {
         this.name = name;
         this.controlChain = controlChain;
         this.controlPath = controlChain+'.'+propInst;
@@ -233,6 +260,7 @@ public class ProperStopper {
         this.cc = cc;
         this.clockHack = clockHack;
         this.indenter = indenter;
+        this.pathToCounter = dataChain+'.'+pathToCounter;
     }
 
     /** Reset ProperStopper after the JTAG TRST has been pulsed */
@@ -389,6 +417,12 @@ public class ProperStopper {
         return ans;
     }
 
+    // proper stopper ring occupancy bits
+    //southFif@1.upDown8w@1.weakStag@18.scanEx1@0 REPORT chain
+    //18, 22, 19, 23, 20, 24, 21, 25
+    //northFif@1.upDown8w@2...
+    // south fifo tap stage:
+    //   southFif@1.tapPropS@1.tapStage@2.scanEx1@0 (also REPORT chain)
 
     /**
      * (Note by Bill and Adam: Ivan has struck again!)
@@ -405,21 +439,25 @@ public class ProperStopper {
      *  The old bit order for Infinity was: Fill, Block, Clear, Silent, Go
      */
     private static enum CommandCodes {
-        RUN        ("000100"),
-            IDLE       ("100000"),
-            FILL       ("101000"),
-            BLOCK      ("100100"),
-            STOP       ("000000"),
-            CLEAR      ("100010"),
-            SOURCE     ("001100"),
-            STOPSOURCE ("001000"),
-            SINK       ("000101"),
-            STOPSINK   ("000001");
-        private BitVector scanBits;
-        CommandCodes(String bits) {
-            scanBits = new BitVector(bits,"CommandCodes");
+        RUN        ("000100","010100"),
+            IDLE       ("100000","110000"),
+            FILL       ("101000","111000"),
+            BLOCK      ("100100","110100"),
+            STOP       ("000000","010000"),
+            CLEAR      ("100010","110010"),
+            SOURCE     ("001100","011100"),
+            STOPSOURCE ("001000","011000"),
+            SINK       ("000101","010101"),
+            STOPSINK   ("000001","010001");
+        private BitVector scanBits0;
+        private BitVector scanBits1;
+        CommandCodes(String bits0,String bits1) {
+            scanBits0 = new BitVector(bits0,"CommandCodes");
+            scanBits1 = new BitVector(bits1,"CommandCodes");
+        }
+        public BitVector bits(boolean extra) {
+            return extra ? scanBits1 : scanBits0;
         }
-        public BitVector bits() {return scanBits;}
     }
 
 }