rename com.sun.vlsi.chips.marina.test -> edu.berkeley.fleet.marina
[fleet.git] / src / com / sun / vlsi / chips / marina / test / Marina.java
diff --git a/src/com/sun/vlsi/chips/marina/test/Marina.java b/src/com/sun/vlsi/chips/marina/test/Marina.java
deleted file mode 100644 (file)
index 12dee06..0000000
+++ /dev/null
@@ -1,548 +0,0 @@
-package com.sun.vlsi.chips.marina.test;
-/* -*- tab-width: 4 -*- */
-import com.sun.electric.tool.simulation.test.*;
-
-import edu.berkeley.fleet.api.Instruction;
-import edu.berkeley.fleet.marina.MarinaPath;
-
-/** The Marina object will eventually represent the Marina test chip.  
- * Right now, it doesn't do much of anything. It just helps me exercise
- * my test infrastructure. */
-public class Marina {
-
-    public static final int INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE  = 5;
-    public static final int INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ZERO = MarinaPath.SIGNAL_BIT_INDEX;
-
-       
-    public static int TOKEN_FIFO_CAPACITY = 3;
-    
-    //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";
-    public static final String REPORT_CHAIN =  kesselsCounter ? "marina.marina_report" : "marina.ivan_report";
-    public static final String DUKE_CHAIN   = "marina.duke";
-
-    public static String prefix = "marinaGu@0.outDockW@"+(kesselsCounter?"3":"0")+".marinaOu@"+(kesselsCounter?"1":"0")+".";
-    public static String MASTER_CLEAR = "mc";
-
-
-    /*
-    private static String prefix = "outDockW@"+(kesselsCounter?"3":"0")+".marinaOu@1.";
-    private static String MASTER_CLEAR = "EXTmasterClear";
-    */
-
-    private static final String OLC_PATH_EVEN = 
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.olcWcont@0.scanEx3h@1"; // bits 2,4,6
-    private static final String OLC_PATH_ODD = 
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.olcWcont@0.scanEx3h@2"; // bits 1,3,5
-    public static final String OLC_PATH_KESSEL = 
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.counte@0.adamScan@1.scanEx6h@";
-    private static final String ILC_PATH_ODD = 
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.scanEx4h@0"; // bits 1,3,5,7
-    private static final String ILC_PATH_EVEN = 
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.scanEx4h@1"; // bits 2,4,6,8
-    private static final String FLAGS_PATH = 
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flags@0.scanEx3h@0";
-
-    private static final String INSTR_RING_CONTROL_PATH = 
-        prefix+"southFif@1.tapPropS@1.tapStage@2";
-    private static final String TOK_FIFO_PATH =
-        prefix+"tokenFIF@1";
-    private static final String INSTRUCTION_COUNTER_PATH =
-        prefix+"southFif@1.tapPropS@1.instruct@0";
-    private static final String DATA_COUNTER_PATH =
-        prefix+"northFif@1.fillDrai@1.instruct@0";
-    private static final String TOK_PRED_PATH =
-        prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.scanEx2h@0.scanCell@10";
-
-    private static final int COUNTER_LENGTH = 34;
-    private static final int INSTRUCTION_SEND_NDX = 1;
-    private static final int INSTRUCTION_RECIRCULATE_NDX = 0;
-
-    public static final int INSTRUCTION_LENGTH = 36;
-        
-    private static final int A_FLAG_NDX = 0;
-    private static final int B_FLAG_NDX = 1;
-        
-    public static final int SOUTH_RING_CAPACITY = 11;
-        
-    // ILC appears in scan chain as "count[1:6], zLo, i, dLo"
-    public class Ilc {
-        // value is bit reversed and complemented
-        private int value;
-        private Ilc() {
-            shiftReport(true, false);
-            BitVector odd  = cc.getOutBits(REPORT_CHAIN+"."+ILC_PATH_ODD).bitReverse().not();
-            BitVector even = cc.getOutBits(REPORT_CHAIN+"."+ILC_PATH_EVEN).bitReverse().not();
-            BitVector ret  = new BitVector(8, "olc");
-            for(int i=0; i<4; i++) {
-                ret.set(i*2+1, odd.get(i));
-                ret.set(i*2,   even.get(i));
-            }
-            value = (int)ret.toLong();
-        }
-        /** Get the inner loop counter done bit. */
-        public boolean getDone() {
-            return (value & 0x40) != 0;
-        }
-        /** Get the inner loop counter infinity bit */
-        public boolean getInfinity() {
-            return (value & 0x80) != 0;
-        }
-        /** Get the 6 bits of count of the inner loop counter */
-        public int getCount() {
-            return value & 0x3f;
-        }
-        public String toString() {
-            return "[ilc, count="+getCount()+", infinity="+getInfinity()+", done="+getDone()+"]";
-        }
-    }
-        
-    private final Indenter indenter;
-
-    // The name of the scan chain
-    // The instance path, from the top cell of the netlist, of the instance of infinityWithCover 
-    public final ChainControls cc;           // specifies the scan chain
-    private final ChipModel model;
-    public final ProperStopper data;
-    public final InstructionStopper instrIn;
-    
-    private void prln(String msg) {indenter.prln(msg);}
-    private void pr(String msg) {indenter.pr(msg);}
-    
-    /** Shift the report scan chain */
-    public void shiftReport(boolean readEnable, boolean writeEnable) {
-        cc.shift(REPORT_CHAIN, readEnable, writeEnable);
-    }
-    
-    /** Shift the report scan chain */
-    private void shiftControl(boolean readEnable, boolean writeEnable) {
-        cc.shift(CONTROL_CHAIN, readEnable, writeEnable);
-    }
-        
-    /** Shift the data scan chain */
-    private void shiftData(boolean readEnable, boolean writeEnable) {
-        cc.shift(DATA_CHAIN, readEnable, writeEnable);
-    }
-
-    /** Shift the data scan chain */
-    public void shiftDuke(boolean readEnable, boolean writeEnable) {
-        cc.shift(DUKE_CHAIN, readEnable, writeEnable);
-    }
-
-    public Marina(ChainControls cc, ChipModel model, boolean clockHack, Indenter indenter) {
-        this.cc = cc;
-        this.model = model;
-        this.indenter = indenter;
-        data = new ProperStopper("north fifo",
-                                 prefix+"northFif@1.fillDrai@1.properSt@1",
-                                 cc, model, clockHack, indenter,
-                                 prefix+"northFif@1.fillDrai@1.instruct@0.cntScnTh@1.cntScnOn@1");
-        instrIn = new InstructionStopper("south fifo",
-                                         prefix+"southFif@1.tapPropS@1.properSt@1", 
-                                         cc, model, clockHack, indenter,
-                                         prefix+"southFif@1.tapPropS@1.instruct@0.cntScnTh@1.cntScnOn@1");
-    }
-
-    int northCount = 0;
-    int southCount = 0;
-
-    public void stopAndResetCounters() {
-        instrIn.setCounterEnable(false);
-        data.setCounterEnable(false);
-        cc.shift(DATA_CHAIN, true, false);        
-        northCount = data.getCounterValue();
-        southCount = instrIn.getCounterValue();
-        data.setCounterValue(0);
-        instrIn.setCounterValue(0);
-    }
-    public void startCounters() { startCounters(true, true); }
-    public void startCounters(boolean south, boolean north) {
-        instrIn.setCounterEnable(south);
-        data.setCounterEnable(north);
-    }
-    public int getNorthCount() { return northCount; }
-    public int getSouthCount() { return southCount; }
-
-
-    public void masterClear() {
-        final double WIDTH = 10; // ns
-        // Put a high going pulse on the internal chip master clear signal
-        if (model instanceof VerilogModel) {
-
-            data.clear();
-            instrIn.clear();
-
-            VerilogModel vm = (VerilogModel)model;
-            //
-            // In real life the flags come up with some undefined
-            // value.  In verilog we need to prevent the X'es from
-            // propagating, so we force the flags to a known value
-            //
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_A__set_", 0);
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_A__clr_", 1);
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_B__set_", 0);
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_B__clr_", 1);
-
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_D__set_", 1);
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_D__clr_", 0);
-
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flags@0.aFlag@0.net_50", 0);       // A
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flags@0.aFlag@1.net_50", 0);       // B
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.litDandP@0.latch2in@0.hi2inLat@0.latchKee@0.out_B_", 0); // C
-
-            // possible C-flag inputs
-            vm.setNodeState(prefix+"northFif@1.upDown8w@2.weakStag@22.ain["+(INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE+1)+"]", 0);
-            vm.setNodeState(prefix+"northFif@1.upDown8w@2.weakStag@22.ain["+(INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ZERO+1)+"]", 0);
-
-            // force the OLC to zero
-            if (!kesselsCounter)
-                for(int i=1; i<=6; i++)
-                    vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.olcWcont@0.olc@0.inLO["+i+"]", (i==1)?0:1);
-
-            // set the ILC input to 1
-            for(int i=1; i<=8; i++) {
-                if (i!=7)
-                    vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.\\inLO["+i+"]", (i==1)?0:1);
-            }
-
-            vm.setNodeState(prefix+"northFif@1.upDown8w@2.weakStag@22.addr1in2@0.fire", 1);
-            model.waitNS(1000);
-            vm.setNodeState(prefix+"northFif@1.upDown8w@2.weakStag@22.addr1in2@0.fire", 0);
-            model.waitNS(1000);
-
-            vm.setNodeState(MASTER_CLEAR, 1);
-            model.waitNS(1000);
-            vm.setNodeState(MASTER_CLEAR, 0);
-            model.waitNS(1000);
-
-            // pulse ilc[load] and olc[load]
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.ilc_load_", 1);
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.ilc_decLO_", 1);
-            vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.ilc_torpLO_", 1);
-            if (!kesselsCounter)
-                vm.setNodeState(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.olcWcont@0.olc@0.olc_load_", 1);
-            model.waitNS(100);
-            model.waitNS(1);
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.ilc_load_");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.ilc_decLO_");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.ilc_torpLO_");
-            if (!kesselsCounter)
-                vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.olcWcont@0.olc@0.olc_load_");
-
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_A__set_");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_A__clr_");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_B__set_");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_B__clr_");
-
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_D__set_");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flag_D__clr_");
-
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flags@0.aFlag@0.net_50");
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.flags@0.aFlag@1.net_50");
-
-            // Every move instruction, even those with Ti=0,Di=0,
-            // loads the C-flag.  It will get loaded with an "X",
-            // which will then leak into the flags and from there the
-            // predicate.
-            vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.litDandP@0.latch2in@0.hi2inLat@0.latchKee@0.out_B_");
-            vm.releaseNode(prefix+"northFif@1.upDown8w@2.weakStag@22.ain["+(INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE+1)+"]");
-            vm.releaseNode(prefix+"northFif@1.upDown8w@2.weakStag@22.ain["+(INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ZERO+1)+"]");
-            vm.releaseNode(prefix+"northFif@1.upDown8w@2.weakStag@22.addr1in2@0.fire");
-
-            for(int i=1; i<=8; i++) {
-                if (i!=7)
-                    vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.ilcMoveO@0.ilc@0.\\inLO["+i+"] ");
-            }
-            model.waitNS(1000);
-
-            if (!kesselsCounter)
-                for(int i=1; i<=6; i++)
-                    vm.releaseNode(prefix+"outputDo@0.outM1Pre@0.outDockP@0.outDockC@0.olcWcont@0.olc@0.inLO["+i+"]");
-
-            // the proper stopper states come up in an undefined ("X")
-            // state, so under Verilog we need to force them to a
-            // known state
-
-            data.idle();
-            instrIn.idle();
-
-        } else if (model instanceof NanosimModel) {
-            NanosimModel nModel = (NanosimModel) model;
-            /*
-            nModel.setNodeVoltage(prefix+"sid[9]",1.0);
-            nModel.setNodeVoltage(prefix+"sic[9]",1.0);
-            nModel.setNodeVoltage(prefix+"sir[9]",1.0);
-            nModel.waitNS(WIDTH);
-            nModel.setNodeVoltage(prefix+"sid[9]",0.0);
-            nModel.setNodeVoltage(prefix+"sic[9]",0.0);
-            nModel.setNodeVoltage(prefix+"sir[9]",0.0);
-            nModel.waitNS(1);
-            */
-            nModel.setNodeVoltage(MASTER_CLEAR,1.0);
-            nModel.waitNS(WIDTH);
-            nModel.setNodeVoltage(MASTER_CLEAR,0.0);
-            nModel.waitNS(1);
-        } else {
-
-            mc0.setLogicState(true);
-            mc1.setLogicState(true);
-            model.waitNS(1000);
-            mc0.setLogicState(false);
-            mc1.setLogicState(false);
-            model.waitNS(1000);
-
-        }
-        resetAfterMasterClear();
-    }
-
-    JtagLogicLevel mc0;
-    JtagLogicLevel mc1;
-
-    private void resetAfterMasterClear() {
-        // The following call to ChainControl.resetInBits() is vital!
-        // If you forget, then the inBits member initializes 
-        // with random data. Then when you do your first write,
-        // some bits are written randomly.
-        cc.resetInBits();
-
-        // For reset, I want to clear all the stoppers simultaneously
-        data.clear();
-        //tokOut.clear();
-        instrIn.clear();
-        
-        data.stop();
-        //tokOut.stop();
-        instrIn.stop();
-        
-        data.resetAfterMasterClear();
-        //tokOut.resetAfterMasterClear();
-        instrIn.resetAfterMasterClear();
-    }
-
-
-    /** Get the 6 bit outer loop counter. */
-    public int getOLC() {
-        shiftReport(true, false);
-        if (omegaCounter) {
-            BitVector bits = null;
-            for(int i=0; i<4; i++) {
-                BitVector x = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_KESSEL+i);
-                //System.out.println("bits are: " + x);
-                bits = bits==null ? x : bits.cat(x);
-            }
-            System.out.print("  kesselsCounter = ");
-            int ret = 0;
-            boolean done = true;
-            boolean bad = false;
-            for(int bit=5; bit>=0; bit--) {
-                boolean zeroOrTwo  = bits.get(4+bit*3);
-                boolean zeroOrDone = bits.get(4+bit*3+1);
-                if      ( zeroOrTwo && !zeroOrDone) {
-                    ret += (2<<bit);
-                    System.out.print("2");
-                    done = false;
-                } else if (!zeroOrTwo && !zeroOrDone) {
-                    ret += (1<<bit);
-                    System.out.print("1");
-                    done = false;
-                } else if ( zeroOrTwo &&  zeroOrDone) {
-                    System.out.print("0");
-                    bad = true;
-                    done = false;
-                } else if (!zeroOrTwo &&  zeroOrDone) {
-                    System.out.print("_");
-                    if (!done) bad = true;
-                }
-                // FIXME: check for unreduced counter and warn about it
-            }
-            if (bad) System.out.print("  WARNING: UNREDUCED COUNTER VALUE!!!!!!");
-            System.out.println();
-            return ret;
-        } else if (kesselsCounter) {
-            BitVector bits = null;
-            for(int i=0; i<4; i++) {
-                BitVector x = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_KESSEL+i);
-                //System.out.println("bits are: " + x);
-                bits = bits==null ? x : bits.cat(x);
-            }
-            //System.out.println("kesselsCounter = " + bits);
-            int first = 0;
-            int second = 0;
-            String hi="";
-            String lo="";
-            String latched="";
-            String res="";
-            for(int i=0; i<6; i++) {
-                first  |= bits.get(4+i*3)   ? (1<<i) : 0;
-                second |= bits.get(4+i*3+2) ? (1<<i) : 0;
-                hi = (bits.get(4+i*3)   ? "1" : "0") + hi;
-                lo = (bits.get(4+i*3+2)   ? "1" : "0") + lo;
-                res =
-                    (   bits.get(4+i*3) && !bits.get(4+i*3+2) ? "X"
-                     : !bits.get(4+i*3) && !bits.get(4+i*3+2) ? "0"
-                     : !bits.get(4+i*3) &&  bits.get(4+i*3+2) ? "1"
-                     : "2")
-                    +res;
-                latched = (bits.get(4+i*3+1)   ? "0" : "1") + latched;
-            }
-            System.out.println("kesselsCounter: "+
-                               "s[1]="+hi+
-                               " s[3]="+lo+
-                               " latched="+latched +
-                               " res="+res+
-                               " do[ins]="+(bits.get(0) ? "1" : "0")+
-                               " dec="+(bits.get(1) ? "1" : "0")+
-                               " flag[D][set]="+(bits.get(2) ? "1" : "0")+
-                               " resetting="+(bits.get(3) ? "1" : "0")+
-                               ""
-                               );
-            return (first+second);
-        } else {
-            BitVector odd = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_ODD).bitReverse();
-            BitVector even = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_EVEN).bitReverse();
-            odd = odd.not();
-            even = even.not();
-            BitVector bv = new BitVector(6, "olc");
-            for(int i=0; i<3; i++) {
-                bv.set(i*2,   odd.get(i));
-                bv.set(i*2+1, even.get(i));
-            }
-            return (int)bv.toLong();
-        }
-    }
-    /** Get the 7 bit inner loop counter. The MSB is the zero bit.
-     * The low order 6 bits are the count */
-    public Ilc getILC() {
-        return new Ilc();
-    }
-    /** Get the A flag */
-    public boolean getFlagA() {
-        shiftReport(true, false);
-        return cc.getOutBits(REPORT_CHAIN+"."+FLAGS_PATH).get(A_FLAG_NDX);
-    }
-    /** Get the B flag */
-    public boolean getFlagB() {
-        shiftReport(true, false);
-        return cc.getOutBits(REPORT_CHAIN+"."+FLAGS_PATH).get(B_FLAG_NDX);
-    }
-    /** return value of instruction counter. Instruction counter counts 
-     * the instructions flowing through 1/2 of alternating FIFO.
-     * Caution: instruction counter is written by all scans, 
-     * regardless of readEnable or writeEnable! */
-    public long getInstructionCounter() {
-        shiftData(true, false);
-        BitVector count = cc.getOutBits(DATA_CHAIN+"."+INSTRUCTION_COUNTER_PATH);
-        int sz = count.getNumBits(); 
-        MarinaTest.fatal(sz!=COUNTER_LENGTH, "wrong number of counter bits: "+sz+
-                         " expected: "+COUNTER_LENGTH);
-        return count.bitReverse().toLong();
-    }
-    /** return value of data counter. Data counter counts items flowing
-     * through drain stage of data proper stopper. 
-     * Caution: data counter is written by all scans, 
-     * regardless of readEnable or writeEnable! */
-    public long getDataCounter() {
-        shiftData(true, false);
-        BitVector count = cc.getOutBits(DATA_CHAIN+"."+DATA_COUNTER_PATH);
-        int sz = count.getNumBits(); 
-        MarinaTest.fatal(sz!=COUNTER_LENGTH, "wrong number of counter bits: "+sz+
-                         " expected: "+COUNTER_LENGTH);
-        return count.bitReverse().toLong();
-    }
-    /** Fill the "North" Fifo ring */
-    public void fillNorthProperStopper() {
-        BitVector data = new BitVector(37, "empty");
-        BitVector addr = new BitVector(14, "empty");
-        for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
-        for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
-        fillNorthProperStopper(new MarinaPacket(data, false, addr));
-    }
-    /** Fill the "North" Fifo ring */
-    public void fillNorthProperStopper(MarinaPacket mp) {
-        prln("inserting into north: " + mp);
-        this.data.fill(mp.toSingleBitVector());
-    }
-    /** Enable the transmission of instructions from the instruction
-     * ring test structure to the EPI FIFO. */
-    public void enableInstructionSend(boolean b) {
-        BitVector bv = cc.getInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH);
-        bv.set(INSTRUCTION_SEND_NDX, b);
-        cc.setInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH, bv); 
-        shiftControl(false, true);
-    } 
-    /** Enable the recirculation of instructions within the South FIFO */
-    public void enableInstructionRecirculate(boolean b) {
-        BitVector bv = cc.getInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH);
-        bv.set(INSTRUCTION_RECIRCULATE_NDX, b);
-        cc.setInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH, bv); 
-        shiftControl(false, true);
-    }
-    /** get the number of tokens in the token FIFO.
-     * This includes the Token successor wire, the token FIFO wires,
-     * and Token predecessor wire.
-     * Master clear clears the token FIFO. */
-    public int getNumTokens() {
-        shiftReport(true, false);
-        // get the token successor and token FIFO wires
-        BitVector bv = cc.getOutBits(REPORT_CHAIN+"."+TOK_FIFO_PATH);
-        int sz = bv.getNumBits();
-        MarinaTest.fatal(sz!=3, "wrong token FIFO size: "+sz+" expected: 3");
-        
-        // get the token predecessor wire
-        BitVector pred = cc.getOutBits(REPORT_CHAIN+"."+TOK_PRED_PATH);
-        sz = pred.getNumBits();
-        MarinaTest.fatal(sz!=1, "wrong token predecessor size: "+sz+" expected: 1");
-
-        // concatenate them
-        bv = bv.cat(pred);
-        sz = bv.getNumBits();
-        prln("Token state wires: "+bv.getState());
-        
-        int nbTok = 0;
-        for (int i=0; i<sz; i++) if (bv.get(i)) nbTok++;
-        return nbTok;
-    }
-    /** Configure the test probe so it measures the throughput of
-     * the north data FIFO. The test probe frequency is 8192 
-     * times slower than the FIFO throughput. This control has
-     * highest priority. */
-    public void probeDataCounter(Boolean b) {
-        data.setGeneralPurposeOutput(b);
-    }
-    /** Configure the test probe so it measures the throughput of
-     * the alternating instruction FIFO. The test probe frequency is
-     * 1/16384 of the FIFO throughput. This control has second
-     * highest priority. Thus the following two calls probe the
-     * instruction counter: 
-     *      probeDataCounter(false);
-     *      probeInstructionCounter(true)
-     */
-    public void enableInstructionCounter(Boolean b) {
-        instrIn.setGeneralPurposeOutput(b);
-    }
-
-    public void fillSouthProperStopper(Instruction i) {
-        instrIn.fill(i);
-    }
-    public void fillSouthProperStopper(Instruction[] instructions) { fillSouthProperStopper(instructions, false); }
-    public void fillSouthProperStopper(Instruction[] instructions, boolean repeat) { fillSouthProperStopper(instructions, repeat, false); }
-    public void fillSouthProperStopper(Instruction[] instructions, boolean repeat, boolean leaveStopped) {
-        enableInstructionSend(false);
-        enableInstructionRecirculate(true);
-        for(Instruction i : instructions)
-            if (i!=null) {
-                instrIn.fill(i);
-            } else {
-                instrIn.fillTorpedo();
-            }
-        enableInstructionRecirculate(repeat);
-        enableInstructionSend(true);
-        if (!leaveStopped) instrIn.run();
-    }
-
-    
-}