marina: add some additional control over the proper stopper counter
[fleet.git] / src / edu / berkeley / fleet / marina / MarinaTest.java
index cfca42c..ed4c51e 100644 (file)
@@ -1,48 +1,80 @@
 package edu.berkeley.fleet.marina;
-/* -*- tab-width: 4 -*- */
-import java.util.ArrayList;
-import java.util.List;
-
+import java.util.*;
 import com.sun.electric.tool.simulation.test.*;
-import edu.berkeley.fleet.marina.Marina.Ilc;
 import edu.berkeley.fleet.marina.CmdArgs;
 import edu.berkeley.fleet.marina.CmdArgs.Mode;
-
 import edu.berkeley.fleet.api.Dock;
 import edu.berkeley.fleet.api.Instruction;
 import edu.berkeley.fleet.api.Predicate;
 import edu.berkeley.fleet.api.Instruction.Set.SetDest;
 import edu.berkeley.fleet.api.Instruction.Set.SetSource;
-import edu.berkeley.fleet.marina.MarinaFleet;
-import edu.berkeley.fleet.marina.MarinaPath;
-
 import java.io.*;
 
 /**
  * Tests for Marina
  */
 public class MarinaTest {
-    public static final MarinaFleet marinaFleet = new MarinaFleet();
-    public static final Dock dock = marinaFleet.getOnlyInputDock();
+
+    private static Marina marina;
+    private MarinaTest(Marina marina) throws Exception {
+        this.marina = marina;
+        go("marina.spi");
+    }
+
+    private void go(String netListName) throws Exception {
+        if (model instanceof NanosimModel) {
+            NanosimLogicSettable mc = (NanosimLogicSettable)
+                ((SimulationModel)model).createLogicSettable(Marina.MASTER_CLEAR);
+            mc.setInitState(true);
+        }
+
+        prln("starting model");
+        if (model instanceof VerilogModel)
+            ((SimulationModel)model).start("verilog", "marina.v", VerilogModel.DUMPVARS, !cmdArgs.jtagShift);
+        else if (model instanceof HsimModel)
+            ((SimulationModel)model).start("hsim64", netListName, 0, !cmdArgs.jtagShift);
+        else if (model instanceof NanosimModel)
+            ((SimulationModel)model).start("nanosim -c cfg", netListName, 0, !cmdArgs.jtagShift);
+        else
+            {}
+        prln("model started");
+
+        model.waitNS(1000);
+        prln("deasserting master clear");
+        if (model instanceof SimulationModel)
+            ((SimulationModel)model).setNodeState(Marina.MASTER_CLEAR, 0);
+        else
+            marina.masterClear();
+        model.waitNS(1000);
+
+        if (cmdArgs.testNum!=0 && cmdArgs.testNum!=1) {
+            cc.resetInBits();
+            cc.shift(Marina.CONTROL_CHAIN, false, true);
+        }
+        
+        doOneTest(cmdArgs.testNum);
+
+        if (model instanceof SimulationModel)
+            ((SimulationModel)model).finish();
+    }
 
     public static float vdd = 1.0f;
 
     //--------------------------  constants -----------------------------------
     private static final String SCAN_CHAIN_XML = "marina.xml";
-    private static final String NET_LIST = "marina.spi";
 
     public static final int INSTR_SZ = 36;
 
        
-    public static final Instruction.Set.FlagFunction CLEAR_FLAG 
+    public final Instruction.Set.FlagFunction CLEAR_FLAG 
         = Instruction.Set.FlagFunction.ZERO;
-    public static final Instruction.Set.FlagFunction SET_FLAG 
+    public final Instruction.Set.FlagFunction SET_FLAG 
         = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA)
         .add(Predicate.NotFlagA);
-    public static final Instruction.Set.FlagFunction A_FLAG 
+    public final Instruction.Set.FlagFunction A_FLAG 
         = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA);
 
-    public static final Instruction.Set.FlagFunction B_FLAG 
+    public final Instruction.Set.FlagFunction B_FLAG 
         = Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB);
     
     // COLUMN_LATENCY is a delay that is larger than the latency through an Infinity column
@@ -92,18 +124,17 @@ public class MarinaTest {
     private static long startTime;
 
     public static Indenter indenter = new Indenter();
-    private Marina marina;
-    private ChipModel model;
+    private static ChipModel model;
     //private ChainControl cc;
     //private JtagTester tester;
-    private CmdArgs cmdArgs;
+    private static CmdArgs cmdArgs;
     private PowerChannel corePowerSupply, padsPowerSupply;
     private VoltageReadable coreVoltmeter, voltmeterForCurrent;
 
 
 
-    private ChainTest ctD, ctR, ctC, ct;
-    private ChainControl ccD, ccR, ccC, cc;
+    private static ChainTest ctD, ctR, ctC, ct;
+    private static ChainControl ccD, ccR, ccC, cc;
         
     //--------------------------  private methods -----------------------------
     /** @return true if simulation. Return false if we're testing silicon. */
@@ -155,187 +186,23 @@ public class MarinaTest {
         }
     }
 
-    private MarinaTest(String[] args) throws Exception {
-        cmdArgs = new CmdArgs(args);
-        reportTask(cmdArgs);
-        doSim();
-    }
         
     static PowerChannel vdd18;
     static PowerChannel vdd10;
     static PowerChannel vdds;
 
-    private void setVdd10(float v) {
+    private static void setVdd10(float v) {
         if (vdd10==null) return;
         vdd10.setVoltageWait(v);
     }
 
-    private void doSim() throws Exception {
-        String netListName;
-        switch (cmdArgs.mode) {
-            case WHOLE_CHIP_SCHEMATIC_PARASITICS:
-                netListName = NET_LIST; 
-                break;
-            case WHOLE_CHIP_LAYOUT_PARASITICS:
-                netListName = "marina_pads_guts.spi"; 
-                break;
-            default:
-                fatal(true, "unrecognized CmdArgs.Mode");
-                return;
-        }
-
-
-        Infrastructure.gpibControllers = new int[]{1};
-        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()
-            : cmdArgs.useHsim
-            ? new HsimModel()
-            : cmdArgs.silicon
-            ? new SiliconChip()
-            : new NanosimModel();
-            
-        if (model instanceof SimulationModel)
-            ((SimulationModel)model).setOptimizedDirectReadsWrites(true);
-
-        CYCLE_TIME_NS = cmdArgs.useVerilog ? (100*20) : 0.250;
-        int khz   =
-            model instanceof VerilogModel
-            ? 100000
-            : cmdArgs.jtagShift
-            ? 20000
-            : model instanceof ChipModel
-            ? 1000
-            : 1000000;
-
-        System.err.println("constructing jtag controller");
-        JtagTester tester =
-            model instanceof SimulationModel
-            ? ((SimulationModel)model).createJtagTester("TCK", "TMS", "TRSTb", "TDI", "TDO")
-            : new Netscan("jtag2");
-        //: new Netscan("10.0.0.200");
-        //: new Signalyzer();
-        //: new Netscan("jtag2");
-        JtagLogicLevel mc0=null;
-        JtagLogicLevel mc1=null;
-        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;
-        */
-        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;
-
-          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);
-        */        
-        /*
-          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);
-        */
-
-
-        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);
-        ccs.addChain(Marina.CONTROL_CHAIN, cc);
-        ccs.addChain(Marina.DUKE_CHAIN, cc);
-
-        marina = new Marina(ccs, model, !cmdArgs.jtagShift, indenter);
-        marina.mc0=mc0;
-        marina.mc1=mc1;
-
-        if (model instanceof NanosimModel) {
-            NanosimLogicSettable mc = (NanosimLogicSettable)
-                ((SimulationModel)model).createLogicSettable(Marina.MASTER_CLEAR);
-            mc.setInitState(true);
-        }
-
-        prln("starting model");
-        if (model instanceof VerilogModel)
-            ((SimulationModel)model).start("verilog", "marina.v", VerilogModel.DUMPVARS, !cmdArgs.jtagShift);
-        else if (model instanceof HsimModel)
-            ((SimulationModel)model).start("hsim64", netListName, 0, !cmdArgs.jtagShift);
-        else if (model instanceof NanosimModel)
-            ((SimulationModel)model).start("nanosim -c cfg", netListName, 0, !cmdArgs.jtagShift);
-        else
-            {}
-        prln("model started");
-
-        model.waitNS(1000);
-        prln("deasserting master clear");
-        if (model instanceof SimulationModel)
-            ((SimulationModel)model).setNodeState(Marina.MASTER_CLEAR, 0);
-        else
-            marina.masterClear();
-        model.waitNS(1000);
-
-        if (cmdArgs.testNum!=0 && cmdArgs.testNum!=1) {
-            cc.resetInBits();
-            cc.shift(Marina.CONTROL_CHAIN, false, true);
-        }
-        
-        doOneTest(cmdArgs.testNum);
-
-        if (model instanceof SimulationModel)
-            ((SimulationModel)model).finish();
-    }
 
     /** In the absence of looping, the longest path through Infinity is 4 column delays */
     private void waitUntilQuiescent() {
         model.waitNS(4*COLUMN_LATENCY);
     }
     
-    private double readCurrent() {
-        return voltmeterForCurrent.readVoltage() / cmdArgs.station.ammeterShuntResistance;
-    }
-    
+   
     /** Generate List of BitVectors where Token=true, high 25 data bits  
      * are alternating ones and zeros, low 12 data bits increment from 
      * zero, and address is given by addr. */
@@ -355,14 +222,13 @@ public class MarinaTest {
         return ans;
     }
     private void stopToStop(ProperStopper s1, ProperStopper s2, 
-                            Counter ctr,
                             List<BitVector> din) {
         prln("Begin stopToStop");
         adjustIndent(2);
         
         s1.stop();
         
-        long ctrStart = ctr==null ? 0 : ctr.getCount();
+        long ctrStart = 0;
         
         s1.fillMany(din);
         waitUntilQuiescent();
@@ -371,15 +237,6 @@ public class MarinaTest {
         
         MarinaUtils.compareItemsOrdered(din, dout);
         
-        if (ctr!=null) {
-            long ctrEnd = ctr.getCount();
-            long delta = ctrEnd - ctrStart;
-            long expect = din.size();
-            fatal(delta!=expect, 
-                  "counter delta wrong: expected delta: "+expect+
-                  " counter before:"+ctrStart+" counter after:"+ctrEnd);
-        }
-        
         adjustIndent(-2);
         prln("End stopToStop");
     }
@@ -387,7 +244,6 @@ public class MarinaTest {
      * is then run to allow the burst to flow. */
     private void stopToStopBurst(ProperStopper src, ProperStopper gate, 
                                  ProperStopper dst,
-                                 Counter ctr,
                                  List<BitVector> din) {
         prln("Begin stopToStopBurst test");
         adjustIndent(2);
@@ -395,7 +251,7 @@ public class MarinaTest {
         src.stop();
         gate.stop();
                 
-        long ctrStart = ctr==null ? 0 : ctr.getCount();
+        long ctrStart = 0;
                 
         src.fillMany(din);
         waitUntilQuiescent();
@@ -408,39 +264,29 @@ public class MarinaTest {
                 
         MarinaUtils.compareItemsOrdered(din, dout);
                 
-        if (ctr!=null) {
-            long ctrEnd = ctr.getCount();
-            long delta = ctrEnd - ctrStart;
-                
-            long expectA = din.size();
-            fatal(delta!=expectA, 
-                  "counter delta wrong: expected delta: "+expectA+
-                  " counter before:"+ctrStart+" counter after:"+ctrEnd);
-        }
-                
         adjustIndent(-2);
         prln("End stopToStopBurst test");
     }
 
     private void stopToStopOne(ProperStopper s1, ProperStopper s2, 
-                               Counter ctr, int adr) {
+                               int adr) {
         prln("Begin stopToStopOne");
         adjustIndent(2);
         
         List<BitVector> din = makeIncrDataConstAdr(1, adr);
-        stopToStop(s1, s2, ctr, din);
+        stopToStop(s1, s2, din);
 
         adjustIndent(-2);
         prln("End stopToStopOne");
     }
     
     private void stopToStopThree(ProperStopper s1, ProperStopper s2, 
-                                 Counter ctr, int adr) {
+                                 int adr) {
         prln("Begin stopToStopOne");
         adjustIndent(2);
         
         List<BitVector> din = makeIncrDataConstAdr(3, adr);
-        stopToStop(s1, s2, ctr, din);
+        stopToStop(s1, s2, din);
 
         adjustIndent(-2);
         prln("End stopToStopOne");
@@ -508,9 +354,9 @@ public class MarinaTest {
         prln("Begin testProperStoppers");
         adjustIndent(2);
 
-        for(ProperStopper ps : new ProperStopper[] { marina.data, marina.instrIn }) {
+        for(ProperStopper ps : new ProperStopper[] { marina.northRing, marina.southRing }) {
 
-            prln("testing " + (ps == marina.data ? "data" : "instruction") + " stopper");
+            prln("testing " + (ps == marina.northRing ? "data" : "instruction") + " stopper");
             adjustIndent(2);
 
             prln("un-stopping stopper");
@@ -543,7 +389,7 @@ public class MarinaTest {
         }
 
         for(BitVector d : din)
-            marina.instrIn.fill(new MarinaPacket(d, false, MarinaPacket.null_path));
+            marina.southRing.fill(new MarinaPacket(d, false, MarinaPacket.null_path));
 
         adjustIndent(-2);
         prln("End sendInstructions");
@@ -558,8 +404,8 @@ public class MarinaTest {
         int nbToks = marina.getNumTokens();
         fatal(nbToks!=0, "Expected no tokens on initialization but got: "+nbToks+" tokens");
 
-        marina.instrIn.fill(setIlc(1));
-        marina.instrIn.fill(SEND_TOKEN);
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(SEND_TOKEN);
         nbToks = marina.getNumTokens();
         fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
         
@@ -573,12 +419,12 @@ public class MarinaTest {
         
         edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
         for(int i=0; i<bv.length(); i+=2) bv.set(i, false);
-        MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
+        MarinaPath path = new MarinaPath(marina, bv);
 
-        marina.instrIn.fill(setIlc(1));
-        marina.instrIn.fill(SEND_DATA);
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(SEND_DATA);
         
-        List<BitVector> dataItems = marina.data.drainMany();
+        List<BitVector> dataItems = marina.northRing.drainMany();
         fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
 
         MarinaPacket mp = new MarinaPacket(dataItems.get(0));
@@ -592,14 +438,14 @@ public class MarinaTest {
         prln("Begin sendDataIlcInfinite");
         adjustIndent(2);
         
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
                 SEND_DATA,
             });
         
         // more than MAX_ILC
         int howmany = 70;
-        List<BitVector> dataItems = marina.data.drainMany(howmany);
+        List<BitVector> dataItems = marina.northRing.drainMany(howmany);
         fatal(dataItems.size()!=howmany,
               "Expected an unending supply of data items to emerge but only got got: "+dataItems.size());
 
@@ -608,13 +454,13 @@ public class MarinaTest {
     }
 
     private Instruction setOlc(int olc) {
-        return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, olc);
+        return new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, olc);
     }
     private Instruction setOlcIfZero(int olc) {
-        return new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter, olc);
+        return new Instruction.Set(marina.getOnlyDock(),Predicate.Default,SetDest.OuterLoopCounter, olc);
     }
     private Instruction setIlc(int ilc) {
-        return new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, ilc);
+        return new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, ilc);
     }
 
     private void testFlagD(Marina marina) {
@@ -626,7 +472,7 @@ public class MarinaTest {
         Predicate only_if_olc_zero    = Predicate.FlagD;
         Predicate only_if_olc_nonzero = Predicate.Default;
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
 
         for(int olc : new int[] { 1, 0 }) {
             for(boolean predicate_olc_nonzero : new boolean[] { true, false }) {
@@ -635,9 +481,9 @@ public class MarinaTest {
                      "predicate olc"+(predicate_olc_nonzero?"!=0":"==0"));
                 adjustIndent(2);
 
-                marina.fillSouthProperStopper(new Instruction[] {
+                marina.southRing.fill(new Instruction[] {
                         setOlc(olc),
-                        new Instruction.Move(dock,
+                        new Instruction.Move(marina.getOnlyDock(),
                                              predicate_olc_nonzero  // predicate   
                                              ? only_if_olc_nonzero
                                              : only_if_olc_zero
@@ -655,7 +501,7 @@ public class MarinaTest {
                 expectNorthFifoExactly((predicate_olc_nonzero == (olc!=0)) ? 1 : 0);
 
                 for(int i=0; i<olc; i++)
-                    marina.instrIn.fill(DEC);
+                    marina.southRing.fill(DEC);
 
                 adjustIndent(-2);
             }
@@ -670,13 +516,13 @@ public class MarinaTest {
         
         List<BitVector> dItems;
 
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 1));
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 1));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 1));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 1));
 
         for(boolean flag_a : new boolean[] { false, true }) {
             for(boolean flag_b : new boolean[] { false, true }) {
                 prln("Setting flags, a="+flag_a+" b="+flag_b);
-                marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                                         flag_a
                                                         ? Instruction.Set.FlagFunction.ONE
                                                         : Instruction.Set.FlagFunction.ZERO,
@@ -697,7 +543,7 @@ public class MarinaTest {
 
                     prln("Attempting send data with a="+flag_a+", b="+flag_b+", predicate="+predicate);
                     adjustIndent(2);
-                    marina.instrIn.fill(new Instruction.Move(dock,
+                    marina.southRing.fill(new Instruction.Move(marina.getOnlyDock(),
                                                              predicate,  // predicate   
                                                              false,      // torpedoable 
                                                              null,       // path        
@@ -709,7 +555,7 @@ public class MarinaTest {
                                                              false       // tokenOut    
                                                              ));
                     adjustIndent(-2);
-                    dItems = marina.data.drainMany();
+                    dItems = marina.northRing.drainMany();
                     int expected = predicate.evaluate(flag_a, flag_b, false, false) ? 1 : 0;
                     fatal(dItems.size()!=expected, "Expected "+expected+" data items to emerge but got: "+
                           dItems.size()+" items(s)");
@@ -735,10 +581,9 @@ public class MarinaTest {
         adjustIndent(2);
         
         showOlc();
-        Ilc ilc = marina.getILC();
-        prln("ILC.done=="+ilc.getDone()+
-             " ILC.infinity=="+ilc.getInfinity()+
-             " ILC.count=="+ilc.getCount());
+        prln("ILC.done=="+marina.getILCDone()+
+             " ILC.infinity=="+marina.getILCInfinity()+
+             " ILC.count=="+marina.getILC());
         prln("flagA=="+marina.getFlagA());
         prln("flagB=="+marina.getFlagB());
         adjustIndent(-2);
@@ -747,14 +592,14 @@ public class MarinaTest {
 
     private void walkOneOLC(Marina marina) {
         prln("Begin walkOneOLC");
-        adjustIndent(2);
         /*
+        adjustIndent(2);
         //for (int i=-1; i<6; i++) {
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(new Instruction[] {
 
-        new Instruction.Head(dock),
+        new Instruction.Head(marina.getOnlyDock()),
 
-        //                new Instruction.Set(dock,Predicate.IgnoreFlagD, SetDest.OuterLoopCounter, 1),
+        //                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD, SetDest.OuterLoopCounter, 1),
         FLAG_NOP,
         FLAG_NOP,
         FLAG_NOP,
@@ -764,11 +609,11 @@ public class MarinaTest {
         FLAG_NOP,
 
 
-        //new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement),
+        //new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement),
                 
-        new Instruction.Tail(dock),
+        new Instruction.Tail(marina.getOnlyDock()),
         });
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(new Instruction[] {
         null,
         },
         true);
@@ -790,7 +635,7 @@ public class MarinaTest {
                   System.out.println("master-clearing...");
                   // master clear on each iteration; otherwise we'd need to "run down" the olc
                   marina.masterClear();
-                  marina.enableInstructionSend(true);
+                  marina.southRing.enableInstructionSend(true);
                   }
 
                   expectTokensExactly(0);
@@ -798,10 +643,10 @@ public class MarinaTest {
 
                   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);
+                  marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc));
+                  marina.southRing.fill(SEND_DATA_IF_D_SET);
+                  marina.southRing.fill(SEND_DATA_IF_D_NOT_SET);
+                  marina.southRing.fill(SEND_DATA);
 
                   model.waitNS(128 * CYCLE_TIME_NS);
 
@@ -820,16 +665,14 @@ public class MarinaTest {
             // Mask off the "zero" bit position
             int inIlc = 1 << i;
             prln("inIlc="+inIlc);
-            marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, inIlc));
-            Ilc ilc = marina.getILC();
-            int outIlc = ilc.getCount();
+            marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, inIlc));
+            int outIlc = marina.getILC();
             fatal(outIlc!=inIlc, "bad ILC count: "+outIlc+" expected: "+inIlc);
-            fatal(ilc.getInfinity(), "bad Infinity bit: true");
+            fatal(marina.getILCInfinity(), "bad Infinity bit: true");
         }
         prln("Now test the infinity bit");
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity));
-        Ilc ilc = marina.getILC();
-        fatal(!ilc.getInfinity(), "bad Infinity bit: false");
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity));
+        fatal(!marina.getILCInfinity(), "bad Infinity bit: false");
         adjustIndent(-2);
         prln("End walkOneILC");
     }
@@ -838,15 +681,15 @@ public class MarinaTest {
         prln("Begin countIlc");
         adjustIndent(2);
         
-        marina.instrIn.fill(new 
-                            Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, maxIlc));
+        marina.southRing.fill(new 
+                            Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, maxIlc));
 
-        int ilc = marina.getILC().getCount();
+        int ilc = marina.getILC();
         fatal(ilc!=maxIlc, "bad ILC count: "+ilc+" expected: "+maxIlc);
                 
         prln("execute a move instruction that does nothing except decrement the ILC to zero");
-        marina.instrIn.fill(
-                            new Instruction.Move(dock,
+        marina.southRing.fill(
+                            new Instruction.Move(marina.getOnlyDock(),
                                                  Predicate.IgnoreFlagD, // predicate   
                                                  false,                 // torpedoable 
                                                  null,                  // path        
@@ -863,7 +706,7 @@ public class MarinaTest {
         //model.waitNS(10000);
 
         prln("Check that ILC==0");
-        ilc = marina.getILC().getCount();
+        ilc = marina.getILC();
         fatal(ilc!=0, "bad ILC count: "+ilc+" expected: "+0);
         
         adjustIndent(-2);
@@ -875,14 +718,14 @@ public class MarinaTest {
         prln("Begin countOlc");
         adjustIndent(2);
 
-        marina.instrIn.fill(setOlc(maxOlc));
+        marina.southRing.fill(setOlc(maxOlc));
 
         for (int i=maxOlc; i>=0; i--) {
             model.waitNS(128 * CYCLE_TIME_NS);
             prln("OLC should be: "+i);
             expectOlc(i);
-            marina.instrIn.fill(new 
-                                Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement));
+            marina.southRing.fill(new 
+                                Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, SetSource.Decrement));
         }
 
         adjustIndent(-2);
@@ -897,11 +740,11 @@ public class MarinaTest {
                 System.out.println("master-clearing...");
                 // master clear on each iteration; otherwise we'd need to "run down" the olc
                 marina.masterClear();
-                marina.enableInstructionSend(true);
+                marina.southRing.enableInstructionSend(true);
             }
 
             int inOlc = i;
-            marina.fillSouthProperStopper(new Instruction[] {
+            marina.southRing.fill(new Instruction[] {
 
                     setIlc(1),
 
@@ -909,16 +752,16 @@ public class MarinaTest {
                     RECV_DATA,
 
                     // the Set-OLC instruction
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, inOlc),
 
                     // put a Set-ILC instruction right behind it with inverted bits to be sure we're
                     // not capturing the instruction-latch value too late in the cycle
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, (inOlc ^ (~(-1<<6)))),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, (inOlc ^ (~(-1<<6)))),
                     
                 });
 
             model.waitNS(128 * CYCLE_TIME_NS);
-            marina.fillNorthProperStopper();
+            marina.northRing.fill();
             model.waitNS(128 * CYCLE_TIME_NS);
 
             expectOlc(inOlc);
@@ -933,8 +776,8 @@ public class MarinaTest {
         int i=0;
         for(i=0; i<quantity; i++) {
             prln("Inserting instruction " + (i+1) +"/"+ quantity);
-            marina.instrIn.fill(instruction);
-            boolean jammed = (marina.instrIn.getFillStateWire()==MarinaUtils.StateWireState.FULL);
+            marina.southRing.fill(instruction);
+            boolean jammed = (marina.southRing.getFillStateWire()==MarinaUtils.StateWireState.FULL);
             if (jammed && expect_it_to_jam_up) {
                 prln("Stopper remained full after inserting instruction; this was expected; we are happy.");
                 adjustIndent(-2);
@@ -947,24 +790,36 @@ public class MarinaTest {
         prln("Successfully inserted " + i + " instructions");
     }
 
-    private static MarinaPath null_path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(),
-                                                         MarinaUtils.sunToBerk(MarinaPacket.null_path));
+    private MarinaPath null_path = new MarinaPath(marina, MarinaUtils.sunToBerk(MarinaPacket.null_path));
 
-    private static final Instruction DEC = 
-        new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter, SetSource.Decrement);
+    private final Instruction DEC = 
+        new Instruction.Set(marina.getOnlyDock(),Predicate.Default,SetDest.OuterLoopCounter, SetSource.Decrement);
 
-    private static final Instruction FLAG_NOP =
-        new Instruction.Set(dock, Predicate.IgnoreFlagD,
+    private final Instruction FLAG_NOP =
+        new Instruction.Set(marina.getOnlyDock(), Predicate.IgnoreFlagD,
                             CLEAR_FLAG.add(Predicate.FlagA),
                             CLEAR_FLAG.add(Predicate.FlagB));
 
-    private static final Instruction FLAG_NOP_IF_FLAG_A =
-        new Instruction.Set(dock, Predicate.FlagA,
+    private final Instruction FLAG_NOP_IF_FLAG_A =
+        new Instruction.Set(marina.getOnlyDock(), Predicate.FlagA,
                             CLEAR_FLAG.add(Predicate.FlagA),
                             CLEAR_FLAG.add(Predicate.FlagB));
 
-    private static final Instruction NOP =
-        new Instruction.Move(dock,
+    private final Instruction NOP_IF_FLAG_A =
+        new Instruction.Move(marina.getOnlyDock(),
+                             Predicate.FlagA,       /* predicate   */
+                             false,                 /* torpedoable */
+                             null,                  /* path        */
+                             false,                 /* tokenIn     */
+                             false,                 /* dataIn      */
+                             false,                 /* latchData   */
+                             false,                 /* latchPath   */
+                             false,                 /* dataOut     */
+                             false                  /* tokenOut    */
+                             );
+
+    private final Instruction NOP =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.IgnoreFlagD, /* predicate   */
                              false,                 /* torpedoable */
                              null,                  /* path        */
@@ -976,8 +831,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction SEND_DATA =
-        new Instruction.Move(dock,
+    private final Instruction SEND_DATA =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.IgnoreFlagD,   /* predicate   */
                              false,                 /* torpedoable */
                              null_path,                  /* path        */
@@ -989,8 +844,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction SEND_DATA_IF_D_NOT_SET =
-        new Instruction.Move(dock,
+    private final Instruction SEND_DATA_IF_D_NOT_SET =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.Default,     /* predicate   */
                              false,                 /* torpedoable */
                              null_path,             /* path        */
@@ -1002,8 +857,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction SEND_DATA_IF_A_SET_AND_D_NOT_SET =
-        new Instruction.Move(dock,
+    private final Instruction SEND_DATA_IF_A_SET_AND_D_NOT_SET =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.FlagA,       /* predicate   */
                              false,                 /* torpedoable */
                              null_path,             /* path        */
@@ -1015,8 +870,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction SEND_DATA_IF_D_SET =
-        new Instruction.Move(dock,
+    private final Instruction SEND_DATA_IF_D_SET =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.FlagD,       /* predicate   */
                              false,                 /* torpedoable */
                              null_path,             /* path        */
@@ -1028,8 +883,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction SEND_TOKEN_IF_D_SET =
-        new Instruction.Move(dock,
+    private final Instruction SEND_TOKEN_IF_D_SET =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.FlagD,       /* predicate   */
                              false,                 /* torpedoable */
                              null_path,             /* path        */
@@ -1041,8 +896,8 @@ public class MarinaTest {
                              true                   /* tokenOut    */
                              );
 
-    private static final Instruction SEND_TOKEN_IF_D_NOT_SET =
-        new Instruction.Move(dock,
+    private final Instruction SEND_TOKEN_IF_D_NOT_SET =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.Default,     /* predicate   */
                              false,                 /* torpedoable */
                              null_path,             /* path        */
@@ -1054,8 +909,8 @@ public class MarinaTest {
                              true                   /* tokenOut    */
                              );
 
-    private static final Instruction TORPEDOABLE_RECV_DATA =
-        new Instruction.Move(dock,
+    private final Instruction TORPEDOABLE_RECV_DATA =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.IgnoreFlagD, /* predicate   */
                              true,                  /* torpedoable */
                              null,                  /* path        */
@@ -1067,8 +922,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction RECV_DATA =
-        new Instruction.Move(dock,
+    private final Instruction RECV_DATA =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.IgnoreFlagD,   /* predicate   */
                              false,                 /* torpedoable */
                              null,                  /* path        */
@@ -1080,8 +935,8 @@ public class MarinaTest {
                              false                  /* tokenOut    */
                              );
 
-    private static final Instruction SEND_TOKEN =
-        new Instruction.Move(dock,
+    private final Instruction SEND_TOKEN =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.IgnoreFlagD,   /* predicate   */
                              false,                 /* torpedoable */
                              null_path,                  /* path        */
@@ -1093,8 +948,8 @@ public class MarinaTest {
                              true                   /* tokenOut    */
                              );
 
-    private static final Instruction RECV_TOKEN =
-        new Instruction.Move(dock,
+    private final Instruction RECV_TOKEN =
+        new Instruction.Move(marina.getOnlyDock(),
                              Predicate.IgnoreFlagD,   /* predicate   */
                              false,                 /* torpedoable */
                              null,                  /* path        */
@@ -1109,28 +964,28 @@ public class MarinaTest {
 
     private void expectNorthFifoNoMoreThan(int num) {
         model.waitNS(128 * CYCLE_TIME_NS);
-        List<BitVector> dataItems = marina.data.drainMany(num+1);
+        List<BitVector> dataItems = marina.northRing.drainMany(num+1);
         fatal(dataItems.size()>num,
               "Expected no more than "+num+
               " data items to emerge but got at least: "+dataItems.size());
     }
     private void expectNorthFifoExactly(int num) {
         model.waitNS(128 * CYCLE_TIME_NS);
-        List<BitVector> dataItems = marina.data.drainMany(num+1);
+        List<BitVector> dataItems = marina.northRing.drainMany(num+1);
         fatal(dataItems.size()!=num,
               "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);
+        List<BitVector> dataItems = marina.northRing.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);
+        List<BitVector> dataItems = marina.northRing.drainMany(num+1);
         fatal(x>num,
               "Expected no more than "+num+
               " tokens to emerge but got at least: "+x);
@@ -1143,102 +998,102 @@ public class MarinaTest {
     }
 
     private void testFlagDRecomputationTime(Marina marina) {
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
                 RECV_DATA,
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
                 SEND_DATA_IF_D_NOT_SET
             });
-        marina.fillNorthProperStopper();
+        marina.northRing.fill();
         expectNorthFifoNoMoreThan(0);
 
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(new Instruction[] {
                 RECV_DATA,
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
                 SEND_DATA_IF_D_NOT_SET
             });
-        marina.fillNorthProperStopper();
+        marina.northRing.fill();
         expectNorthFifoNoMoreThan(0);
 
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(new Instruction[] {
                 RECV_DATA,
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.Decrement),
                 SEND_DATA_IF_D_NOT_SET
             });
-        marina.fillNorthProperStopper();
+        marina.northRing.fill();
         expectNorthFifoExactly(1);
-        marina.instrIn.fill(DEC);
+        marina.southRing.fill(DEC);
 
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(new Instruction[] {
                 RECV_DATA,
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,0),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,1),
                 SEND_DATA_IF_D_NOT_SET
             });
-        marina.fillNorthProperStopper();
+        marina.northRing.fill();
         expectNorthFifoExactly(1);
     }
 
     private void testTailWaitsForHead(Marina marina) {
-        marina.instrIn.fill(setIlc(1));
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
         
-        marina.enableInstructionSend(false);
-        marina.enableInstructionRecirculate(true);
+        marina.southRing.enableInstructionSend(false);
+        marina.southRing.enableInstructionRecirculate(true);
         
-        marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
-        marina.instrIn.fill(new Instruction.Head(dock));
-        marina.instrIn.fill(SEND_DATA);
-        marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
-        marina.instrIn.fill(SEND_TOKEN);
-        marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
-        marina.instrIn.fill(new Instruction.Tail(dock));
-        marina.instrIn.fillTorpedo();
+        marina.southRing.fill(TORPEDOABLE_RECV_DATA);
+        marina.southRing.fill(new Instruction.Head(marina.getOnlyDock()));
+        marina.southRing.fill(SEND_DATA);
+        marina.southRing.fill(TORPEDOABLE_RECV_DATA);
+        marina.southRing.fill(SEND_TOKEN);
+        marina.southRing.fill(TORPEDOABLE_RECV_DATA);
+        marina.southRing.fill(new Instruction.Tail(marina.getOnlyDock()));
+        marina.southRing.fillTorpedo();
         
-        marina.enableInstructionRecirculate(false);
-        marina.enableInstructionSend(true);
-        marina.instrIn.run();
+        marina.southRing.enableInstructionRecirculate(false);
+        marina.southRing.enableInstructionSend(true);
+        marina.southRing.run();
         
         expectNorthFifoNoMoreThan(0);
         prln("inserting into north proper stopper");
-        marina.fillNorthProperStopper();
+        marina.northRing.fill();
         expectNorthFifoExactly(1);
         int nbToks = marina.getNumTokens();
         fatal(nbToks!=1, "Expected one token to emerge but got: "+nbToks+" tokens");
     }
 
     /*
-      marina.instrIn.fill(setIlc(1));
-      marina.instrIn.fill(setOlc(1));
+      marina.southRing.fill(setIlc(1));
+      marina.southRing.fill(setOlc(1));
 
       // this makes the head wait for the torpedo
-      marina.instrIn.fill(TORPEDOABLE_RECV_DATA);
+      marina.southRing.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);
+      marina.southRing.fill(new Instruction.Head(marina.getOnlyDock()));
+      marina.southRing.fill(NOP);
+      marina.southRing.fill(SEND_DATA);
+      marina.southRing.fill(RECV_DATA);
 
       expectNorthFifoNoMoreThan(0);
 
-      marina.instrIn.fillTorpedo();
+      marina.southRing.fillTorpedo();
       expectNorthFifoNoMoreThan(0);
 
-      marina.instrIn.fill(new Instruction.Tail(dock));
+      marina.southRing.fill(new Instruction.Tail(marina.getOnlyDock()));
       expectNorthFifoExactly(1);
     */
 
     private void testTailWithoutHead(Marina marina) {
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
-                new Instruction.Tail(dock),
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
+                new Instruction.Tail(marina.getOnlyDock()),
                 SEND_DATA,
             });
-        List<BitVector> dataItems = marina.data.drainMany(1);
+        List<BitVector> dataItems = marina.northRing.drainMany(1);
         fatal(dataItems.size()!=0, "Expected exactly no data items to emerge but got at least: "+dataItems.size());
     }
 
@@ -1248,16 +1103,16 @@ public class MarinaTest {
         prln("Begin testHeadWaitsForTail");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
-                new Instruction.Head(dock),
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63),
+                new Instruction.Head(marina.getOnlyDock()),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
                 SEND_DATA,
             });
 
         expectNorthFifoExactly(0);
-        marina.instrIn.fill(new Instruction.Tail(dock));
+        marina.southRing.fill(new Instruction.Tail(marina.getOnlyDock()));
         expectNorthFifoAtLeast(1);
 
         adjustIndent(-2);
@@ -1265,10 +1120,10 @@ public class MarinaTest {
     }
 
     private void testNonTorpedoableMoveDoesNotResetDFlag(Marina marina) {
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,63),
-                new Instruction.Move(dock,
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,63),
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.IgnoreFlagD, // predicate   
                                      true,                  // torpedoable 
                                      null,                  // path        
@@ -1279,7 +1134,7 @@ public class MarinaTest {
                                      false,                 // dataOut     
                                      false                  // tokenOut    
                                      ),
-                new Instruction.Move(dock,
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.FlagD,       // predicate   
                                      false,                 // torpedoable 
                                      null,                  // path        
@@ -1291,10 +1146,10 @@ public class MarinaTest {
                                      false                  // tokenOut    
                                      ),
             });
-        marina.instrIn.fillTorpedo();
+        marina.southRing.fillTorpedo();
         expectNorthFifoExactly(1);
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Move(dock,
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.Default,     // predicate   
                                      false,                 // torpedoable 
                                      null,                  // path        
@@ -1311,36 +1166,36 @@ public class MarinaTest {
 
     private void testAbort(Marina marina) {
         
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,1),
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.DataLatch,1),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,2),
                 SEND_DATA_IF_D_NOT_SET,
-                new Instruction.Head(dock),
+                new Instruction.Head(marina.getOnlyDock()),
                 SEND_DATA_IF_D_NOT_SET,
-                new Instruction.Set(dock,Predicate.Default,SetDest.DataLatch,2),
-                new Instruction.Abort(dock, Predicate.FlagD),
-                new Instruction.Set(dock,Predicate.Default,SetDest.OuterLoopCounter,SetSource.Decrement),
-                new Instruction.Tail(dock),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.Default,SetDest.DataLatch,2),
+                new Instruction.Abort(marina.getOnlyDock(), Predicate.FlagD),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.Default,SetDest.OuterLoopCounter,SetSource.Decrement),
+                new Instruction.Tail(marina.getOnlyDock()),
             }, true);
         
         for(int i=0; i<4; i++) {
             BitVector bv;
             
             model.waitNS(128 * CYCLE_TIME_NS);
-            bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
+            bv = new MarinaPacket(marina.northRing.drain()).data.bitReverse();
             fatal(bv==null, "no data item found");
             prln("got " + bv.toLong());
             fatal(bv.toLong()!=1, "expected 1, got " + bv.toLong());
             
             model.waitNS(128 * CYCLE_TIME_NS);
-            bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
+            bv = new MarinaPacket(marina.northRing.drain()).data.bitReverse();
             fatal(bv==null, "no data item found");
             prln("got " + bv.toLong());
             fatal(bv.toLong()!=1, "expected 1, got " + bv.toLong());
             
             model.waitNS(128 * CYCLE_TIME_NS);
-            bv = new MarinaPacket(marina.data.drain()).data.bitReverse();
+            bv = new MarinaPacket(marina.northRing.drain()).data.bitReverse();
             fatal(bv==null, "no data item found");
             prln("got " + bv.toLong());
             fatal(bv.toLong()!=2, "expected 2, got " + bv.toLong());
@@ -1349,10 +1204,10 @@ public class MarinaTest {
     }
 
     private void testAbortOutsideOfLoop(Marina marina) {
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
                 // ensure that an abort doesn't cause problems if no loop is in progress
-                new Instruction.Abort(dock, Predicate.IgnoreFlagD),
+                new Instruction.Abort(marina.getOnlyDock(), Predicate.IgnoreFlagD),
                 SEND_DATA,
             });
         expectNorthFifoExactly(1);
@@ -1377,27 +1232,27 @@ public class MarinaTest {
         one = one.add(Predicate.FlagC);
         one = one.add(Predicate.NotFlagC);
 
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1));
         for(boolean fast : new boolean[] { true, false }) {
             // clear the flags to a known state, then check both 0->1 and 1->0 transitions
             for(boolean b : new boolean[] { false, true, false }) {
                 prln("state: a="+marina.getFlagA()+", b="+marina.getFlagB());
                 prln((b?"Setting":"Clearing")+" flags");
                 
-                Instruction inst = new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                Instruction inst = new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                                        b ? one : zero,
                                                        b ? one : zero
                                                        );
                 if (fast) {
-                    marina.fillSouthProperStopper(new Instruction[] {
+                    marina.southRing.fill(new Instruction[] {
                             RECV_DATA,
                             inst,
                             NOP,
                         });
                     model.waitNS(64 * CYCLE_TIME_NS);
-                    marina.fillNorthProperStopper();
+                    marina.northRing.fill();
                 } else {
-                    marina.instrIn.fill(inst);
+                    marina.southRing.fill(inst);
                 }
 
                 fatal(marina.getFlagA()!=b,
@@ -1419,7 +1274,7 @@ public class MarinaTest {
         prln("Begin testFlagTruthTable");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
         Instruction.Set.FlagFunction zero = Instruction.Set.FlagFunction.ZERO;
         Instruction.Set.FlagFunction one  = zero.add(Predicate.FlagA).add(Predicate.NotFlagA);
 
@@ -1433,8 +1288,8 @@ public class MarinaTest {
 
                                     prln("before instruction: a="+a_state+", b="+b_state+", c="+c_state);
                                     // set A,B flags to a_state and b_state
-                                    marina.instrIn.fill(new 
-                                                        Instruction.Set(dock,Predicate.IgnoreFlagD,
+                                    marina.southRing.fill(new 
+                                                        Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                                                         a_state ? one : zero,
                                                                         b_state ? one : zero
                                                                         ));
@@ -1445,8 +1300,8 @@ public class MarinaTest {
                                     for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
                                     for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
                                     addr.set(Marina.INDEX_OF_ADDRESS_BIT_COPIED_TO_C_FLAG_WHEN_DC_EQUALS_ONE, c_state);
-                                    marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
-                                    marina.instrIn.fill(RECV_DATA);
+                                    marina.northRing.fill(new MarinaPacket(data, false, addr));
+                                    marina.southRing.fill(RECV_DATA);
                                     
                                     Instruction.Set.FlagFunction func = zero;
                                     if (a_input!=null) func = func.add(a_input);
@@ -1454,12 +1309,12 @@ public class MarinaTest {
                                     if (c_input!=null) func = func.add(c_input);
 
                                     Instruction inst = new 
-                                        Instruction.Set(dock,Predicate.IgnoreFlagD,
+                                        Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                                         !which ? func : zero.add(Predicate.FlagA),
                                                         which  ? func : zero.add(Predicate.FlagB)
                                                         );
 
-                                    marina.instrIn.fill(inst);
+                                    marina.southRing.fill(inst);
 
                                     boolean expected_a = !which ? func.evaluate(a_state, b_state, c_state, false) : a_state;
                                     boolean expected_b =  which ? func.evaluate(a_state, b_state, c_state, false) : b_state;
@@ -1477,10 +1332,10 @@ public class MarinaTest {
         prln("Begin recvData");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
-                new Instruction.Move(dock,
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.IgnoreFlagD, // predicate   
                                      false,                 // torpedoable 
                                      null,                  // path        
@@ -1491,7 +1346,7 @@ public class MarinaTest {
                                      false,                 // dataOut     
                                      false                  // tokenOut    
                                      ),
-                new Instruction.Set(dock,Predicate.IgnoreFlagD, SET_FLAG, SET_FLAG),
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD, SET_FLAG, SET_FLAG),
             });
         model.waitNS(64 * CYCLE_TIME_NS);
 
@@ -1503,7 +1358,7 @@ public class MarinaTest {
         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);
-        marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
+        marina.northRing.fill(new MarinaPacket(data, false, addr));
         model.waitNS(64 * CYCLE_TIME_NS);
 
         prln("checking to see if A flag got set");
@@ -1518,7 +1373,7 @@ public class MarinaTest {
         prln("Begin testRecvAndSendWalkingOne");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
 
         List<BitVector> dataItems;
         for(int bit=0; bit<37; bit++) {
@@ -1531,16 +1386,16 @@ public class MarinaTest {
             prln("testing with bit pattern " + data);
 
             prln("inserting data item into north fifo ring");
-            marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
+            marina.northRing.fill(new MarinaPacket(data, false, addr));
 
             prln("stopping the north proper stopper");
-            marina.data.stop();
+            marina.northRing.stop();
 
-            dataItems = marina.data.drainMany(1);
+            dataItems = marina.northRing.drainMany(1);
             fatal(dataItems.size()!=0,
                   "found a data item waiting in the north proper stopper, but should not have");
 
-            marina.instrIn.fill(new Instruction.Move(dock,
+            marina.southRing.fill(new Instruction.Move(marina.getOnlyDock(),
                                                      Predicate.IgnoreFlagD,  // predicate   
                                                      false,                  // torpedoable 
                                                      null_path,              // path        
@@ -1552,7 +1407,7 @@ public class MarinaTest {
                                                      false                   // tokenOut    
                                                      ));
 
-            dataItems = marina.data.drainMany(2);
+            dataItems = marina.northRing.drainMany(2);
             fatal(dataItems.size()!=1,
                   "found "+dataItems.size()+" data items in north fifo; expected one");
             MarinaPacket mp = new MarinaPacket(dataItems.get(0));
@@ -1569,7 +1424,7 @@ public class MarinaTest {
         prln("Begin setOlcFromDataLatch");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
 
         // walk a bit from 0 to 5
         for(int bit=0; bit<6; bit++) {
@@ -1579,12 +1434,12 @@ public class MarinaTest {
             for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
             for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
             data.set(bit, true);
-            marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
+            marina.northRing.fill(new MarinaPacket(data, false, addr));
 
-            marina.fillSouthProperStopper(new Instruction[] {
+            marina.southRing.fill(new Instruction[] {
                     RECV_DATA,
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.DataLatch),
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.DataLatch,-1),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,SetSource.DataLatch),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.DataLatch,-1),
                 });
 
             model.waitNS(CYCLE_TIME_NS * 64);
@@ -1594,7 +1449,7 @@ public class MarinaTest {
             if (marina.kesselsCounter) {
                 // master clear on each iteration; otherwise we'd need to "run down" the olc
                 marina.masterClear();
-                marina.enableInstructionSend(true);
+                marina.southRing.enableInstructionSend(true);
             }
         }
 
@@ -1606,7 +1461,7 @@ public class MarinaTest {
         prln("Begin setIlcFromDataLatch");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
 
         // walk a bit from 0 to 5
         for(int bit=5; bit>=0; bit--) {
@@ -1616,16 +1471,16 @@ public class MarinaTest {
             for(int i=0; i<data.getNumBits(); i++) data.set(i, false);
             for(int i=0; i<addr.getNumBits(); i++) addr.set(i, false);
             data.set(bit, true);
-            marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
+            marina.northRing.fill(new MarinaPacket(data, false, addr));
 
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
                     RECV_DATA,
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.DataLatch),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.DataLatch),
                 });
             model.waitNS(CYCLE_TIME_NS * 64);
 
-            int ilc = marina.getILC().getCount();
+            int ilc = marina.getILC();
             fatal(ilc != (1<<bit), "expected ilc to be " + (1<<bit) + ", but got " + ilc); 
         }
 
@@ -1637,8 +1492,8 @@ public class MarinaTest {
         prln("Begin testSendAndRecvToken");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction[] {
                 SEND_TOKEN,
                 RECV_TOKEN,
                 SEND_DATA,
@@ -1653,18 +1508,18 @@ public class MarinaTest {
         prln("Begin testSignExtendedLiteral");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
         for(long val : new long[] { (-1L << 14), -1, 0, 1 }) {
 
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                         Instruction.Set.SetDest.DataLatch,
                                         val),
                     SEND_DATA,
                 });
             model.waitNS(CYCLE_TIME_NS * 64);
 
-            List<BitVector> dataItems = marina.data.drainMany(3);
+            List<BitVector> dataItems = marina.northRing.drainMany(3);
             fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
 
             MarinaPacket mp = new MarinaPacket(dataItems.get(0));
@@ -1690,8 +1545,8 @@ public class MarinaTest {
         prln("Begin testShiftedLiteral");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                                 Instruction.Set.SetDest.DataLatch,
                                                 0));
 
@@ -1711,13 +1566,13 @@ public class MarinaTest {
             for(int i=0; i<19; i++)
                 dreg.set(i, immediate.get(i));
 
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Shift(dock,Predicate.IgnoreFlagD,immediate),
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Shift(marina.getOnlyDock(),Predicate.IgnoreFlagD,immediate),
                     SEND_DATA,
                 });
 
             model.waitNS(CYCLE_TIME_NS * 64);
-            List<BitVector> dataItems = marina.data.drainMany(3);
+            List<BitVector> dataItems = marina.northRing.drainMany(3);
             fatal(dataItems.size()!=1, "expected exactly one data item, got " + dataItems.size());
 
             BitVector bv = new MarinaPacket(dataItems.get(0)).data;
@@ -1742,7 +1597,7 @@ public class MarinaTest {
         // Dc=1 => sigS is copied into C-flag
         // Dc=0 => sigA is copied into C-flag
        
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
         for(boolean dc : new boolean[] { false, true }) {
             for(boolean c_flag : new boolean[] { true, false, true }) {
 
@@ -1760,14 +1615,14 @@ public class MarinaTest {
                 addr.set(whichbit, c_flag);
 
                 prln("... and filling north fifo proper stopper");
-                marina.fillNorthProperStopper(new MarinaPacket(data, false, addr));
+                marina.northRing.fill(new MarinaPacket(data, false, addr));
                 
                 prln("clearing flags");
                 prln("executing recv data with Dc="+dc);
                 prln("copying c-flag to a-flag");
-                marina.fillSouthProperStopper(new Instruction[] {
-                        new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
-                        new Instruction.Move(dock,
+                marina.southRing.fill(new Instruction[] {
+                        new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG),
+                        new Instruction.Move(marina.getOnlyDock(),
                                              Predicate.IgnoreFlagD,   /* predicate   */
                                              true,                  /* torpedoable */
                                              null,                  /* path        */
@@ -1779,7 +1634,7 @@ public class MarinaTest {
                                              false                  /* tokenOut    */
                                              ),
                         FLAG_NOP,
-                        new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                        new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                             Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagC),
                                             CLEAR_FLAG
                                             ),
@@ -1800,7 +1655,7 @@ public class MarinaTest {
         adjustIndent(2);
 
         edu.berkeley.fleet.api.BitVector bv = new edu.berkeley.fleet.api.BitVector(13);
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
 
         // alternating ones and zeroes
         for(int i=0; i<bv.length(); i+=2)
@@ -1809,11 +1664,11 @@ public class MarinaTest {
         for(int i=0; i<4; i++)
             bv.set(i, true);
 
-        MarinaPath path = new MarinaPath((MarinaFleet)dock.getShip().getFleet(), bv);
+        MarinaPath path = new MarinaPath(marina, bv);
 
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
-                new Instruction.Move(dock,
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.IgnoreFlagD, /* predicate   */
                                      false,                 /* torpedoable */
                                      path,                  /* path        */
@@ -1829,7 +1684,7 @@ public class MarinaTest {
         List<BitVector> dataItems;
         MarinaPacket mp;
 
-        dataItems = marina.data.drainMany();
+        dataItems = marina.northRing.drainMany();
         fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
         mp = new MarinaPacket(dataItems.get(0));
 
@@ -1838,7 +1693,7 @@ public class MarinaTest {
         fatalIfBitVectorsDoNotMatch(MarinaUtils.berkToSun(bv), mp.path.get(0,13));
 
         prln("send data with no change to path");
-        marina.instrIn.fill(new Instruction.Move(dock,
+        marina.southRing.fill(new Instruction.Move(marina.getOnlyDock(),
                                                  Predicate.IgnoreFlagD, /* predicate   */
                                                  false,                 /* torpedoable */
                                                  null,                  /* path        */
@@ -1850,7 +1705,7 @@ public class MarinaTest {
                                                  false                  /* tokenOut    */
                                                  ));
 
-        dataItems = marina.data.drainMany();
+        dataItems = marina.northRing.drainMany();
         fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
         mp = new MarinaPacket(dataItems.get(0));
 
@@ -1866,7 +1721,7 @@ public class MarinaTest {
         prln("Begin recvPath");
         adjustIndent(2);
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
         for(int bit=0; bit<11; bit++) {
             BitVector packet_data = new BitVector(37, "inbound data item");
             for(int i=0; i<37; i++) packet_data.set(i, false);
@@ -1874,10 +1729,10 @@ public class MarinaTest {
             BitVector packet_path = new BitVector(14, "inbound data item");
             for(int i=0; i<14; i++) packet_path.set(i, false);
 
-            marina.fillNorthProperStopper(new MarinaPacket(packet_data, false, packet_path));
+            marina.northRing.fill(new MarinaPacket(packet_data, false, packet_path));
                                            
             prln("recv path, send data (using recv'd path)");
-            marina.instrIn.fill(new Instruction.Move(dock,
+            marina.southRing.fill(new Instruction.Move(marina.getOnlyDock(),
                                                      Predicate.IgnoreFlagD,   /* predicate   */
                                                      false,                 /* torpedoable */
                                                      null,                  /* path        */
@@ -1889,7 +1744,7 @@ public class MarinaTest {
                                                      false                  /* tokenOut    */
                                                      ));
 
-            List<BitVector> dataItems = marina.data.drainMany();
+            List<BitVector> dataItems = marina.northRing.drainMany();
             fatal(dataItems.size()!=1, "Expected one data item to emerge but got: "+dataItems.size()+" data items");
             MarinaPacket mp = new MarinaPacket(dataItems.get(0));
             
@@ -1907,11 +1762,11 @@ public class MarinaTest {
 
         for(int bit=0; bit<6; bit++) {
             int ilc = bit<0 ? 0 : (1<<bit);
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,ilc),
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,ilc),
                     SEND_DATA,
                 });
-            List<BitVector> dataItems = marina.data.drainMany();
+            List<BitVector> dataItems = marina.northRing.drainMany();
             fatal(dataItems.size()!=ilc, "Expected "+ilc+" data item(s) to emerge but got: "+dataItems.size()+" data items");
         }
 
@@ -1921,8 +1776,8 @@ public class MarinaTest {
 
     private void testILCZero(Marina marina) {
         adjustIndent(2);
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,0),
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,0),
                 SEND_DATA,
                 SEND_TOKEN,
             });
@@ -1934,14 +1789,14 @@ public class MarinaTest {
     private void sendTorpedo(Marina marina) {
         prln("Begin sendTorpedo");
         adjustIndent(2);
-        marina.instrIn.fill(setIlc(1));
-        marina.instrIn.fill(setOlc(63));
+        marina.southRing.fill(setIlc(1));
+        marina.southRing.fill(setOlc(63));
 
         model.waitNS(128 * CYCLE_TIME_NS);
         expectOlc(63);
 
-        marina.instrIn.fill(new 
-                            Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
+        marina.southRing.fill(new 
+                            Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
         fatal(marina.getFlagA(), "bad A flag: true");
         fatal(marina.getFlagB(), "bad B flag: true");
 
@@ -1951,9 +1806,9 @@ public class MarinaTest {
 
         model.waitNS(128 * CYCLE_TIME_NS);
 
-        marina.fillSouthProperStopper(new Instruction[] {
-                new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity),
-                new Instruction.Move(dock,
+        marina.southRing.fill(new Instruction[] {
+                new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, SetSource.Infinity),
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.IgnoreFlagD, // predicate   
                                      true,                  // torpedoable 
                                      null,                  // path        
@@ -1964,11 +1819,11 @@ public class MarinaTest {
                                      false,                 // dataOut     
                                      false                  // tokenOut    
                                      ),
-                new Instruction.Set(dock,Predicate.Default,
+                new Instruction.Set(marina.getOnlyDock(),Predicate.Default,
                                     SET_FLAG,
                                     Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagB)
                                     ),
-                new Instruction.Set(dock, Predicate.FlagD,
+                new Instruction.Set(marina.getOnlyDock(), Predicate.FlagD,
                                     Instruction.Set.FlagFunction.ZERO.add(Predicate.FlagA),
                                     SET_FLAG
                                     ),
@@ -1977,7 +1832,7 @@ public class MarinaTest {
         model.waitNS(128 * CYCLE_TIME_NS);
 
         prln("send torpedo. This should clear the OLC");
-        marina.instrIn.fillTorpedo();
+        marina.southRing.fillTorpedo();
         model.waitNS(128 * CYCLE_TIME_NS);
 
         model.waitNS(128 * CYCLE_TIME_NS);
@@ -1989,15 +1844,15 @@ public class MarinaTest {
         model.waitNS(128 * CYCLE_TIME_NS);
 
         prln("Reload OLC after torpedo, clears D-flag");
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 63));
 
         // FIXME: find another way to test this
         model.waitNS(128 * CYCLE_TIME_NS);
         expectOlc(63);
                 
         prln("Set A=1, B=1 This instruction should execute because OLC!=0");
-        marina.instrIn.fill(new 
-                            Instruction.Set(dock,Predicate.Default, SET_FLAG, SET_FLAG));
+        marina.southRing.fill(new 
+                            Instruction.Set(marina.getOnlyDock(),Predicate.Default, SET_FLAG, SET_FLAG));
 
         prln("A and B should be true");
         fatal(!marina.getFlagA(), "bad A flag: false");
@@ -2013,11 +1868,11 @@ public class MarinaTest {
 
         List<BitVector> dataItems;
 
-        marina.instrIn.fill(setIlc(1));
+        marina.southRing.fill(setIlc(1));
         for(boolean torpedoable : new boolean[] { true, false }) {
             
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Move(dock,
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Move(marina.getOnlyDock(),
                                          Predicate.IgnoreFlagD, // predicate   
                                          false,                 // torpedoable 
                                          null,                  // path        
@@ -2028,8 +1883,8 @@ public class MarinaTest {
                                          false,                 // dataOut     
                                          true                   // tokenOut    
                                          ),
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
-                    new Instruction.Move(dock,
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,SetSource.Infinity),
+                    new Instruction.Move(marina.getOnlyDock(),
                                          Predicate.IgnoreFlagD, // predicate   
                                          torpedoable,           // torpedoable 
                                          null,                  // path        
@@ -2041,22 +1896,22 @@ public class MarinaTest {
                                          true                   // tokenOut    
                                          ),
                     // FIXME: this probably should be removed, unless Ivan doesn't want to change the behavior
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
 
                     SEND_DATA,
                 });
             
             // expect nothing to come out, because the NOP is executing
-            dataItems = marina.data.drainMany(2);
+            dataItems = marina.northRing.drainMany(2);
             fatal(dataItems.size()!=0, "Expected no data item(s) to emerge but got at least: "+dataItems.size()+" data items");
             
-            marina.instrIn.fillTorpedo();
+            marina.southRing.fillTorpedo();
             
             int expected = torpedoable?1:0;
-            dataItems = marina.data.drainMany(2);
+            dataItems = marina.northRing.drainMany(2);
             fatal(dataItems.size()!=expected, "Expected "+expected+" item to emerge but got: "+dataItems.size()+" data items");
 
-            fatal(!marina.getILC().getDone(), "Expected ilc=done, but got "+marina.getILC());
+            fatal(!marina.getILCDone(), "Expected ilc=done, but got "+marina.getILC());
         }
 
         adjustIndent(-2);
@@ -2064,7 +1919,7 @@ public class MarinaTest {
     }
 
     private void testDFlagWhenTorpedoLyingInWait(Marina marina) {
-        marina.fillSouthProperStopper(new Instruction[] {
+        marina.southRing.fill(new Instruction[] {
                 setOlc(1),
                 RECV_DATA,
                 TORPEDOABLE_RECV_DATA,
@@ -2077,8 +1932,8 @@ public class MarinaTest {
         expectTokensExactly(0);
 
         // changing the order of these lines should work, but it does not
-        marina.fillNorthProperStopper();
-        marina.instrIn.fillTorpedo();
+        marina.northRing.fill();
+        marina.southRing.fillTorpedo();
 
         expectTokensExactly(1);
     }
@@ -2086,7 +1941,7 @@ public class MarinaTest {
     private void testSetOlcFollowedByDPredicated(Marina marina) {
         for(boolean d_set : new boolean[] { false, true }) {
             prln("");
-            marina.fillSouthProperStopper(new Instruction[] {
+            marina.southRing.fill(new Instruction[] {
                     setOlc(0),
                     marina.kesselsCounter ? null : FLAG_NOP,
                     d_set ? SEND_DATA_IF_D_SET : SEND_DATA_IF_D_NOT_SET,
@@ -2094,7 +1949,7 @@ public class MarinaTest {
             expectNorthFifoExactly(d_set ? 1 : 0);
 
             prln("");
-            marina.fillSouthProperStopper(new Instruction[] {
+            marina.southRing.fill(new Instruction[] {
                     setOlc(32),
                     marina.kesselsCounter ? null : FLAG_NOP,
                     d_set ? SEND_DATA_IF_D_SET : SEND_DATA_IF_D_NOT_SET,
@@ -2103,7 +1958,7 @@ public class MarinaTest {
 
             if (marina.kesselsCounter) {
                 marina.masterClear();
-                marina.enableInstructionSend(true);
+                marina.southRing.enableInstructionSend(true);
             }
         }
     }
@@ -2129,9 +1984,9 @@ public class MarinaTest {
 
             prln("inserting set olc="+olc);
             prln("inserting set ilc=1");
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,olc),
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter,1),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter,olc),
                 });
 
             // commenting the following four lines causes this test to pass
@@ -2141,12 +1996,12 @@ public class MarinaTest {
             Instruction[] instructions = new Instruction[decr_amount+1];
             for(int i=0; i<decr_amount; i++)
                 instructions[i] =
-                    new Instruction.Set(dock,
+                    new Instruction.Set(marina.getOnlyDock(),
                                         Predicate.Default,
                                         SetDest.OuterLoopCounter,
                                         SetSource.Decrement);
             instructions[instructions.length-1] =
-                new Instruction.Move(dock,
+                new Instruction.Move(marina.getOnlyDock(),
                                      Predicate.Default,     // predicate   
                                      false,                 // torpedoable 
                                      null,                  // path        
@@ -2158,18 +2013,18 @@ public class MarinaTest {
                                      false                  // tokenOut    
                                      );
 
-            marina.fillSouthProperStopper(instructions);
+            marina.southRing.fill(instructions);
             model.waitNS(64 * CYCLE_TIME_NS);
 
             int expected = decr_amount>=olc ? 0 : 1;
-            dataItems = marina.data.drainMany(2);
+            dataItems = marina.northRing.drainMany(2);
             fatal(dataItems.size()!=expected, "Expected "+expected+" item to emerge but got: "+dataItems.size()+" data items");
             expectOlc(Math.max(0,olc-decr_amount));
 
             if (marina.kesselsCounter) {
                 // master clear on each iteration; otherwise we'd need to "run down" the olc
                 marina.masterClear();
-                marina.enableInstructionSend(true);
+                marina.southRing.enableInstructionSend(true);
             }
         }
 
@@ -2187,31 +2042,29 @@ public class MarinaTest {
             int notZero = 1<<i;
 
             prln("Then immediately set ILC="+notZero);
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
                 });
                 
             model.waitNS(64 * CYCLE_TIME_NS);
 
             prln("Verify ILC using scan chain");
-            Ilc ilc = marina.getILC();
-            int ilcCount = ilc.getCount();
+            int ilcCount = marina.getILC();
             fatal(ilcCount!=notZero, "bad ILC count: "+ilcCount+" expected: "+notZero);
-            fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
+            fatal(marina.getILCInfinity(), "bad ILC Infinity bit: true");
                    
-            marina.fillSouthProperStopper(new Instruction[] {     
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
+            marina.southRing.fill(new Instruction[] {     
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, notZero),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.InnerLoopCounter, 0),
                 });
 
             model.waitNS(64 * CYCLE_TIME_NS);
                         
             prln("Verify ILC using scan chain");
-            ilc = marina.getILC();
-            ilcCount = ilc.getCount();
+            ilcCount = marina.getILC();
             fatal(ilcCount!=0, "bad ILC count: "+ilcCount+" expected: 0");
-            fatal(ilc.getInfinity(), "bad ILC Infinity bit: true");
+            fatal(marina.getILCInfinity(), "bad ILC Infinity bit: true");
         }
 
         adjustIndent(-2);
@@ -2223,7 +2076,7 @@ public class MarinaTest {
         prln("Using the set OLC instruction, toggle a single bit between zero and one. \n" +
              "Check correct setting of the OLC zero bit");
 
-        marina.instrIn.fill(new Instruction.Set(dock,Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
+        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD, CLEAR_FLAG, CLEAR_FLAG));
 
         for (int i=0; i<6; i++) {
             int notZero = 32 >> i;
@@ -2231,15 +2084,15 @@ public class MarinaTest {
             if (marina.kesselsCounter) {
                 // master clear on each iteration; otherwise we'd need to "run down" the olc
                 marina.masterClear();
-                marina.enableInstructionSend(true);
+                marina.southRing.enableInstructionSend(true);
             }
 
             int outOlc;
             prln("Set OLC=0");
             prln("Then immediately set OLC="+notZero);
-            marina.fillSouthProperStopper(new Instruction[] {
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
-                    new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
+            marina.southRing.fill(new Instruction[] {
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
+                    new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
                 });
 
             model.waitNS(64 * CYCLE_TIME_NS);
@@ -2249,9 +2102,9 @@ public class MarinaTest {
             if (!marina.kesselsCounter) {
                 prln("Set OLC="+notZero);
                 prln("Then immediately set OLC=0");
-                marina.fillSouthProperStopper(new Instruction[] {
-                        new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
-                        new Instruction.Set(dock,Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
+                marina.southRing.fill(new Instruction[] {
+                        new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, notZero),
+                        new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,SetDest.OuterLoopCounter, 0),
                     });
                 
                 model.waitNS(64 * CYCLE_TIME_NS);
@@ -2267,8 +2120,8 @@ public class MarinaTest {
         prln("Begin testSouthRecirculate("+AMOUNT+")");
         adjustIndent(2);
 
-        marina.enableInstructionSend(false);
-        marina.enableInstructionRecirculate(true);
+        marina.southRing.enableInstructionSend(false);
+        marina.southRing.enableInstructionRecirculate(true);
         
         prln("Completely fill south ring");
         adjustIndent(2);
@@ -2278,13 +2131,13 @@ public class MarinaTest {
             BitVector data = new BitVector(MarinaPacket.WORD_WIDTH, "path");
             path.set(0, MarinaPacket.PATH_WIDTH, false);
             data.setFromLong(i+9);
-            marina.instrIn.fill(new MarinaPacket(data, false, path));
+            marina.southRing.fill(new MarinaPacket(data, false, path));
         }
         adjustIndent(-2);
 
         prln("Drain south ring and check contents");
         adjustIndent(2);
-        List<BitVector> out = marina.instrIn.drainMany();
+        List<BitVector> out = marina.southRing.drainMany();
         boolean bad = false;
         for (int i=0; i<AMOUNT; i++) {
             prln("extracting item " + (i+1) + " / " + AMOUNT);
@@ -2313,8 +2166,8 @@ public class MarinaTest {
         adjustIndent(2);
 
         for(int i=0; i<marina.TOKEN_FIFO_CAPACITY + 3; i++)
-            marina.instrIn.fill(SEND_TOKEN);
-        marina.instrIn.fill(SEND_DATA);
+            marina.southRing.fill(SEND_TOKEN);
+        marina.southRing.fill(SEND_DATA);
         expectNorthFifoExactly(0);
         
         adjustIndent(-2);
@@ -2332,6 +2185,7 @@ public class MarinaTest {
             System.out.println("******************************************************************************");
             System.out.println("******************************************************************************");
             fe.printStackTrace();
+            System.exit(-1);
         }
     }
 
@@ -2366,7 +2220,7 @@ public class MarinaTest {
 
         if (testNum!=0) {
             marina.masterClear();
-            marina.enableInstructionSend(true);
+            marina.southRing.enableInstructionSend(true);
         }
 
         MarinaUtils.testnum = testNum;
@@ -2487,9 +2341,11 @@ public class MarinaTest {
             case 3031: testOverfillTokens(marina); break;
 
             case 3040: loadEveryValueOLC(marina); break;
+
+                // Duke Test //////////////////////////////////////////////////////////////////////////////
             case 6666: {
                 SubchainNode chainNode =
-                    (SubchainNode)marina.cc.getChainControlFromPath(Marina.DUKE_CHAIN)
+                    (SubchainNode)marina.dukeChain
                     .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();
@@ -2499,12 +2355,13 @@ public class MarinaTest {
                     for(int j=0; j<12; j++)
                         root.getInBits().set(bitIndex+j, false);
                     root.getInBits().set(bitIndex+i, true);
-                    marina.shiftDuke(false, true);
+                    marina.dukeChain.shift(Marina.DUKE_CHAIN, false, true);
                     System.in.read();
                 }
                 break;
             }
 
+                // Kessels Counter //////////////////////////////////////////////////////////////////////////////
             case 7777: {
 
                 int wait = 300;
@@ -2520,18 +2377,18 @@ public class MarinaTest {
 
                 for(int xx=1; xx<65; xx++) {
                 marina.masterClear();
-                marina.data.sink();
+                marina.northRing.sink();
                 marina.stopAndResetCounters();
                     
-                marina.enableInstructionSend(true);
-                marina.fillSouthProperStopper(new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                marina.southRing.enableInstructionSend(true);
+                marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),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),
+                marina.southRing.fill(new Instruction[] {
+                        new Instruction.Head(marina.getOnlyDock()),
                         setOlc(xx),
                         FLAG_NOP,
                         FLAG_NOP,
@@ -2539,12 +2396,12 @@ public class MarinaTest {
                         FLAG_NOP,
                         FLAG_NOP,
                         SEND_DATA,
-                        new Instruction.Tail(dock),
+                        new Instruction.Tail(marina.getOnlyDock()),
                     }, false, false);
 
-                marina.fillSouthProperStopper(new Instruction[] {
+                marina.southRing.fill(new Instruction[] {
                         /*
-                          new Instruction.Set(dock,Predicate.FlagD,
+                          new Instruction.Set(marina.getOnlyDock(),Predicate.FlagD,
                           Instruction.Set.FlagFunction.ZERO.add(Predicate.NotFlagA),
                           Instruction.Set.FlagFunction.ZERO),
                           setOlcIfZero(32),
@@ -2570,13 +2427,13 @@ public class MarinaTest {
 
                 //marina.startCounters(false, false);
                     
-                marina.instrIn.run();
+                marina.southRing.run();
 
                 vdd10.setVoltageWait(vdd);
                 marina.startCounters(false, true);
 
                 try { Thread.sleep(wait); } catch (Exception e) { }
-                //marina.instrIn.stop();
+                //marina.southRing.stop();
                     
                 marina.stopAndResetCounters();
                 int countNorth = marina.getNorthCount();
@@ -2588,6 +2445,9 @@ public class MarinaTest {
                 pw.close();
                 break;
             }
+
+
+                // General Purpose //////////////////////////////////////////////////////////////////////////////
             case 8888: {
 
                 //int wait = 1000;
@@ -2595,31 +2455,53 @@ public class MarinaTest {
                 //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;
+                        int MAX_ITER = 1;
                         double total = 0;
                         for(int iter = 0; iter < MAX_ITER; iter++) {
 
                             marina.masterClear();
-                            marina.data.sink();
+                            marina.northRing.sink();
                             marina.stopAndResetCounters();
                                 
-                            marina.enableInstructionSend(true);
-                            marina.fillSouthProperStopper(setOlc(1));
-                            marina.fillSouthProperStopper(new Instruction.Head(dock));
+                            marina.southRing.enableInstructionSend(true);
+                            marina.southRing.fill(setOlc(1));
+                            /*
+                            marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),
+                                                                      Predicate.IgnoreFlagD,
+                                                                      Instruction.Set.FlagFunction.ONE,
+                                                                      Instruction.Set.FlagFunction.ZERO
+                                                                      ));
+                            */
+                            marina.southRing.fill(new Instruction.Head(marina.getOnlyDock()));
                             for(int i=0; i<toks; i++)
-                                marina.fillSouthProperStopper(/*SEND_DATA*/NOP);
-                            marina.fillSouthProperStopper(new Instruction[] {
-                                    new Instruction.Tail(dock),
+                                marina.southRing.fill(NOP);
+                                /*
+                                marina.southRing.fill(setOlc(32));
+                                marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),
+                                                                          Predicate.IgnoreFlagD,
+                                                                          Instruction.Set.SetDest.DataLatch,
+                                                                          0));
+                            marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),
+                                                                      Predicate.IgnoreFlagD,
+                                                                      Instruction.Set.FlagFunction.ZERO.add(Predicate.NotFlagA),
+                                                                      Instruction.Set.FlagFunction.ZERO
+                                                                      ));
+                                */
+
+                            marina.southRing.fill(new Instruction[] {
+                                    new Instruction.Tail(marina.getOnlyDock()),
                                 }, false, true);
                                 
-                            marina.instrIn.run();
+                            marina.southRing.run();
 
                             // have to set the voltage while drawing current
                             vdd10.setVoltageWait(vdd);
@@ -2627,7 +2509,7 @@ public class MarinaTest {
                             marina.startCounters();
                             try { Thread.sleep(wait); } catch (Exception e) { }
                             marina.stopAndResetCounters();
-                            //marina.instrIn.stop();
+                            //marina.southRing.stop();
 
                             int countNorth = marina.getNorthCount();
                             int countSouth = marina.getSouthCount();
@@ -2641,12 +2523,6 @@ public class MarinaTest {
 
                             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();
@@ -2656,14 +2532,16 @@ public class MarinaTest {
                         pw.println(vdd + " " +
                                    toks + " " +
                                    (((double)total) / MAX_ITER) + " " +
-                                   //vddsv  + " " + 
                                    vdd10c + " " +
+
                                    vdd18v + " " +
                                    vdd18c + " " +
                                    "");
                         pw.flush();
                     }
+                    /*
                 }
+                    */
                 break;
             }
             case 8889: {
@@ -2679,27 +2557,27 @@ public class MarinaTest {
                     for(int iter = 0; iter < MAX_ITER; iter++) {
                             
                         marina.masterClear();
-                        marina.data.sink();
+                        marina.northRing.sink();
                         marina.stopAndResetCounters();
                             
-                        marina.enableInstructionSend(true);
-                        marina.fillSouthProperStopper(setOlc(1));
-                        marina.fillSouthProperStopper(new Instruction.Set(dock,Predicate.IgnoreFlagD,
+                        marina.southRing.enableInstructionSend(true);
+                        marina.southRing.fill(setOlc(1));
+                        marina.southRing.fill(new Instruction.Set(marina.getOnlyDock(),Predicate.IgnoreFlagD,
                                                                           Instruction.Set.FlagFunction.ZERO,
                                                                           Instruction.Set.FlagFunction.ZERO));
-                        marina.fillSouthProperStopper(new Instruction.Head(dock));
-                        //marina.fillSouthProperStopper(setIlc(31));
-                        marina.fillSouthProperStopper(SEND_DATA);
+                        marina.southRing.fill(new Instruction.Head(marina.getOnlyDock()));
+                        //marina.southRing.fill(setIlc(31));
+                        marina.southRing.fill(SEND_DATA);
                         for(int i=0; i<toks+1; i++) {
-                            //marina.fillSouthProperStopper(FLAG_NOP_IF_FLAG_A);
-                            marina.fillSouthProperStopper(FLAG_NOP);
+                            //marina.southRing.fill(FLAG_NOP_IF_FLAG_A);
+                            marina.southRing.fill(FLAG_NOP);
                         }
-                        marina.fillSouthProperStopper(new Instruction[] {
-                                new Instruction.Tail(dock),
+                        marina.southRing.fill(new Instruction[] {
+                                new Instruction.Tail(marina.getOnlyDock()),
                             }, false, true);
                         marina.startCounters();
                             
-                        marina.instrIn.run();
+                        marina.southRing.run();
                         try { Thread.sleep(wait); } catch (Exception e) { }
                             
                         marina.stopAndResetCounters();
@@ -2730,23 +2608,74 @@ public class MarinaTest {
                 fatal(true, "Test number: "+testNum+" doesn't exist.");
                 break;
         }
-        // If we get here then test passed
         prln("Test Result: Passed");
         printTestTime();
-        //Infrastructure.exit(0);
     }
 
-
-    //============================ for public use =============================
-
-    /** Exit codes:
-     * 0: test detected success
-     * 2: test detected failure
-     * 1: test crashed
-     */ 
     public static void main(String[] args) throws Exception {
         startTime = System.currentTimeMillis();
-        new MarinaTest(args);
+        cmdArgs = new CmdArgs(args);
+        reportTask(cmdArgs);
+        Infrastructure.gpibControllers = new int[]{1};
+        vdds  = new Pst3202Channel("ch1", "tiPST3202", 1);
+        vdd18 = new Pst3202Channel("ch3", "tiPST3202", 3);
+        vdd10 = new PowerChannelResistorVoltageReadable(new Pst3202Channel("ch2", "tiPST3202", 2),
+                                                        250, 
+                                                        new HP34401A("HP34970"),
+                                                        true);
+        if (vdd10!=null) setVdd10(vdd);
+        if (vdd18!=null) vdd18.setVoltageNoWait(1.8f);
+
+        model = cmdArgs.useVerilog
+            ? new VerilogModel()
+            : cmdArgs.useHsim
+            ? new HsimModel()
+            : cmdArgs.silicon
+            ? new SiliconChip()
+            : new NanosimModel();
+            
+        if (model instanceof SimulationModel)
+            ((SimulationModel)model).setOptimizedDirectReadsWrites(true);
+
+        CYCLE_TIME_NS = cmdArgs.useVerilog ? (100*20) : 0.250;
+        int khz   =
+            model instanceof VerilogModel
+            ? 100000
+            : cmdArgs.jtagShift
+            ? 20000
+            : model instanceof ChipModel
+            ? 1000
+            : 1000000;
+
+        System.err.println("constructing jtag controller");
+        JtagTester tester =
+            model instanceof SimulationModel
+            ? ((SimulationModel)model).createJtagTester("TCK", "TMS", "TRSTb", "TDI", "TDO")
+            : new Netscan("jtag2");
+        //: new Netscan("10.0.0.200");
+        //: new Signalyzer();
+        //: new Netscan("jtag2");
+        JtagLogicLevel mc0=null;
+        JtagLogicLevel mc1=null;
+        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);
+        }
+        tester.printInfo = false;
+        PowerChannel pc = new ManualPowerChannel("pc", false);
+        cc = new ChainControl(SCAN_CHAIN_XML, tester, 1.8f, khz);
+        cc.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE;
+        ct = new ChainTest(cc, pc);
+        marina = new Marina(cc, cc, cc, cc, model, !cmdArgs.jtagShift, indenter);
+        marina.mc0=mc0;
+        marina.mc1=mc1;
+        new MarinaTest(marina);
     }
 
 }