From aee85d3dd0435554e14e03b97f268752843a441f Mon Sep 17 00:00:00 2001 From: Adam Megacz Date: Thu, 19 Nov 2009 20:41:59 -0800 Subject: [PATCH] get rid of ChainControls --- src/edu/berkeley/fleet/marina/ChainControls.java | 57 --------------- .../berkeley/fleet/marina/InstructionStopper.java | 7 +- src/edu/berkeley/fleet/marina/Marina.java | 74 +++++++++++++------- src/edu/berkeley/fleet/marina/MarinaTest.java | 9 +-- src/edu/berkeley/fleet/marina/MergeExperiment.java | 6 +- src/edu/berkeley/fleet/marina/ProperStopper.java | 69 +++++++++--------- 6 files changed, 89 insertions(+), 133 deletions(-) delete mode 100644 src/edu/berkeley/fleet/marina/ChainControls.java diff --git a/src/edu/berkeley/fleet/marina/ChainControls.java b/src/edu/berkeley/fleet/marina/ChainControls.java deleted file mode 100644 index 6c5ea2d..0000000 --- a/src/edu/berkeley/fleet/marina/ChainControls.java +++ /dev/null @@ -1,57 +0,0 @@ -package edu.berkeley.fleet.marina; - -import java.util.HashMap; -import java.util.Map; -import com.sun.electric.tool.simulation.test.*; - -/** One or more ChainControl. If we have a JTAG controller then one - * ChainControl. If we don't have a JTAG controller then we need - * one ChainControl per scan chain. - * - * ChainControls duplicates much of the ChainControl interface. It - * allows the testing code to remain oblivious of whether or not the - * JTAG controller exists. - */ -public class ChainControls { - private Map chainToControl = - new HashMap(); - - /** The path has the form: - * chipName.chainName.instanceName1.instanceName2 ... - */ - public ChainControl getChainControlFromPath(String path) { - for (String chainName : chainToControl.keySet()) { - if (path.startsWith(chainName)) return chainToControl.get(chainName); - } - MarinaTest.fatal(true, "Can't find chain for path: "+path); - return null; - } - public void addChain(String chain, ChainControl control) { - chainToControl.put(chain, control); - } - - //-------------------------------------------------------------------------------- - // Replicate interface of ChainControl - public BitVector getInBits(String path) { - ChainControl cc = getChainControlFromPath(path); - return cc.getInBits(path); - } - public BitVector getOutBits(String path) { - ChainControl cc = getChainControlFromPath(path); - return cc.getOutBits(path); - } - public void setInBits(String path, BitVector bits) { - ChainControl cc = getChainControlFromPath(path); - cc.setInBits(path, bits); - } - public void shift(String chainName, boolean readEnable, boolean writeEnable) { - ChainControl cc = getChainControlFromPath(chainName); - cc.shift(chainName, readEnable, writeEnable); - } - public void resetInBits() { - for (String chainName : chainToControl.keySet()) { - ChainControl cc = chainToControl.get(chainName); - cc.resetInBits(); - } - } -} diff --git a/src/edu/berkeley/fleet/marina/InstructionStopper.java b/src/edu/berkeley/fleet/marina/InstructionStopper.java index ca65a44..f88d0c4 100644 --- a/src/edu/berkeley/fleet/marina/InstructionStopper.java +++ b/src/edu/berkeley/fleet/marina/InstructionStopper.java @@ -19,10 +19,13 @@ public class InstructionStopper extends ProperStopper { public InstructionStopper(String name, String propInst, - ChainControls cc, ChipModel model, + ChainControl controlChain, + ChainControl dataChain, + ChainControl reportChain, + ChipModel model, boolean clockHack, Indenter indenter, String counterPath) { - super(name, propInst, cc, model, clockHack, indenter, counterPath); + super(name, propInst, controlChain, dataChain, reportChain, model, clockHack, indenter, counterPath); } /** put one Instruction into InstructionStopper */ diff --git a/src/edu/berkeley/fleet/marina/Marina.java b/src/edu/berkeley/fleet/marina/Marina.java index 9ef38ac..28e293c 100644 --- a/src/edu/berkeley/fleet/marina/Marina.java +++ b/src/edu/berkeley/fleet/marina/Marina.java @@ -75,8 +75,8 @@ public class Marina { private int value; private Ilc() { shiftReport(true, false); - BitVector odd = cc.getOutBits(REPORT_CHAIN+"."+ILC_PATH_ODD).bitReverse().not(); - BitVector even = cc.getOutBits(REPORT_CHAIN+"."+ILC_PATH_EVEN).bitReverse().not(); + BitVector odd = reportChain.getOutBits(REPORT_CHAIN+"."+ILC_PATH_ODD).bitReverse().not(); + BitVector even = reportChain.getOutBits(REPORT_CHAIN+"."+ILC_PATH_EVEN).bitReverse().not(); BitVector ret = new BitVector(8, "olc"); for(int i=0; i<4; i++) { ret.set(i*2+1, odd.get(i)); @@ -105,7 +105,11 @@ public class Marina { // The name of the scan chain // The instance path, from the top cell of the netlist, of the instance of infinityWithCover - public final ChainControls cc; // specifies the scan chain + public final ChainControl controlChain; + public final ChainControl dataChain; + public final ChainControl dukeChain; + public final ChainControl reportChain; + private final ChipModel model; public final ProperStopper data; public final InstructionStopper instrIn; @@ -115,35 +119,48 @@ public class Marina { /** Shift the report scan chain */ public void shiftReport(boolean readEnable, boolean writeEnable) { - cc.shift(REPORT_CHAIN, readEnable, writeEnable); + reportChain.shift(REPORT_CHAIN, readEnable, writeEnable); } /** Shift the report scan chain */ private void shiftControl(boolean readEnable, boolean writeEnable) { - cc.shift(CONTROL_CHAIN, readEnable, writeEnable); + controlChain.shift(CONTROL_CHAIN, readEnable, writeEnable); } /** Shift the data scan chain */ private void shiftData(boolean readEnable, boolean writeEnable) { - cc.shift(DATA_CHAIN, readEnable, writeEnable); + dataChain.shift(DATA_CHAIN, readEnable, writeEnable); } /** Shift the data scan chain */ public void shiftDuke(boolean readEnable, boolean writeEnable) { - cc.shift(DUKE_CHAIN, readEnable, writeEnable); + dukeChain.shift(DUKE_CHAIN, readEnable, writeEnable); } - public Marina(ChainControls cc, ChipModel model, boolean clockHack, Indenter indenter) { - this.cc = cc; + public Marina(ChainControl controlChain, + ChainControl dataChain, + ChainControl dukeChain, + ChainControl reportChain, + ChipModel model, boolean clockHack, Indenter indenter) { + this.controlChain = controlChain; + this.dataChain = dataChain; + this.dukeChain = dukeChain; + this.reportChain = reportChain; this.model = model; this.indenter = indenter; data = new ProperStopper("north fifo", prefix+"northFif@1.fillDrai@1.properSt@1", - cc, model, clockHack, indenter, + controlChain, + dataChain, + reportChain, + model, clockHack, indenter, prefix+"northFif@1.fillDrai@1.instruct@0.cntScnTh@1.cntScnOn@1"); instrIn = new InstructionStopper("south fifo", prefix+"southFif@1.tapPropS@1.properSt@1", - cc, model, clockHack, indenter, + controlChain, + dataChain, + reportChain, + model, clockHack, indenter, prefix+"southFif@1.tapPropS@1.instruct@0.cntScnTh@1.cntScnOn@1"); } @@ -153,7 +170,7 @@ public class Marina { public void stopAndResetCounters() { instrIn.setCounterEnable(false); data.setCounterEnable(false); - cc.shift(DATA_CHAIN, true, false); + dataChain.shift(DATA_CHAIN, true, false); northCount = data.getCounterValue(); southCount = instrIn.getCounterValue(); data.setCounterValue(0); @@ -307,7 +324,10 @@ public class Marina { // If you forget, then the inBits member initializes // with random data. Then when you do your first write, // some bits are written randomly. - cc.resetInBits(); + dataChain.resetInBits(); + dukeChain.resetInBits(); + reportChain.resetInBits(); + controlChain.resetInBits(); // For reset, I want to clear all the stoppers simultaneously data.clear(); @@ -330,7 +350,7 @@ public class Marina { if (omegaCounter) { BitVector bits = null; for(int i=0; i<4; i++) { - BitVector x = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_KESSEL+i); + BitVector x = reportChain.getOutBits(REPORT_CHAIN+"."+OLC_PATH_KESSEL+i); //System.out.println("bits are: " + x); bits = bits==null ? x : bits.cat(x); } @@ -365,7 +385,7 @@ public class Marina { } else if (kesselsCounter) { BitVector bits = null; for(int i=0; i<4; i++) { - BitVector x = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_KESSEL+i); + BitVector x = reportChain.getOutBits(REPORT_CHAIN+"."+OLC_PATH_KESSEL+i); //System.out.println("bits are: " + x); bits = bits==null ? x : bits.cat(x); } @@ -402,8 +422,8 @@ public class Marina { ); return (first+second); } else { - BitVector odd = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_ODD).bitReverse(); - BitVector even = cc.getOutBits(REPORT_CHAIN+"."+OLC_PATH_EVEN).bitReverse(); + BitVector odd = reportChain.getOutBits(REPORT_CHAIN+"."+OLC_PATH_ODD).bitReverse(); + BitVector even = reportChain.getOutBits(REPORT_CHAIN+"."+OLC_PATH_EVEN).bitReverse(); odd = odd.not(); even = even.not(); BitVector bv = new BitVector(6, "olc"); @@ -422,12 +442,12 @@ public class Marina { /** Get the A flag */ public boolean getFlagA() { shiftReport(true, false); - return cc.getOutBits(REPORT_CHAIN+"."+FLAGS_PATH).get(A_FLAG_NDX); + return reportChain.getOutBits(REPORT_CHAIN+"."+FLAGS_PATH).get(A_FLAG_NDX); } /** Get the B flag */ public boolean getFlagB() { shiftReport(true, false); - return cc.getOutBits(REPORT_CHAIN+"."+FLAGS_PATH).get(B_FLAG_NDX); + return reportChain.getOutBits(REPORT_CHAIN+"."+FLAGS_PATH).get(B_FLAG_NDX); } /** return value of instruction counter. Instruction counter counts * the instructions flowing through 1/2 of alternating FIFO. @@ -435,7 +455,7 @@ public class Marina { * regardless of readEnable or writeEnable! */ public long getInstructionCounter() { shiftData(true, false); - BitVector count = cc.getOutBits(DATA_CHAIN+"."+INSTRUCTION_COUNTER_PATH); + BitVector count = dataChain.getOutBits(DATA_CHAIN+"."+INSTRUCTION_COUNTER_PATH); int sz = count.getNumBits(); MarinaTest.fatal(sz!=COUNTER_LENGTH, "wrong number of counter bits: "+sz+ " expected: "+COUNTER_LENGTH); @@ -447,7 +467,7 @@ public class Marina { * regardless of readEnable or writeEnable! */ public long getDataCounter() { shiftData(true, false); - BitVector count = cc.getOutBits(DATA_CHAIN+"."+DATA_COUNTER_PATH); + BitVector count = dataChain.getOutBits(DATA_CHAIN+"."+DATA_COUNTER_PATH); int sz = count.getNumBits(); MarinaTest.fatal(sz!=COUNTER_LENGTH, "wrong number of counter bits: "+sz+ " expected: "+COUNTER_LENGTH); @@ -469,16 +489,16 @@ public class Marina { /** Enable the transmission of instructions from the instruction * ring test structure to the EPI FIFO. */ public void enableInstructionSend(boolean b) { - BitVector bv = cc.getInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH); + BitVector bv = controlChain.getInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH); bv.set(INSTRUCTION_SEND_NDX, b); - cc.setInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH, bv); + controlChain.setInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH, bv); shiftControl(false, true); } /** Enable the recirculation of instructions within the South FIFO */ public void enableInstructionRecirculate(boolean b) { - BitVector bv = cc.getInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH); + BitVector bv = controlChain.getInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH); bv.set(INSTRUCTION_RECIRCULATE_NDX, b); - cc.setInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH, bv); + controlChain.setInBits(CONTROL_CHAIN+"."+INSTR_RING_CONTROL_PATH, bv); shiftControl(false, true); } /** get the number of tokens in the token FIFO. @@ -488,12 +508,12 @@ public class Marina { public int getNumTokens() { shiftReport(true, false); // get the token successor and token FIFO wires - BitVector bv = cc.getOutBits(REPORT_CHAIN+"."+TOK_FIFO_PATH); + BitVector bv = reportChain.getOutBits(REPORT_CHAIN+"."+TOK_FIFO_PATH); int sz = bv.getNumBits(); MarinaTest.fatal(sz!=3, "wrong token FIFO size: "+sz+" expected: 3"); // get the token predecessor wire - BitVector pred = cc.getOutBits(REPORT_CHAIN+"."+TOK_PRED_PATH); + BitVector pred = reportChain.getOutBits(REPORT_CHAIN+"."+TOK_PRED_PATH); sz = pred.getNumBits(); MarinaTest.fatal(sz!=1, "wrong token predecessor size: "+sz+" expected: 1"); diff --git a/src/edu/berkeley/fleet/marina/MarinaTest.java b/src/edu/berkeley/fleet/marina/MarinaTest.java index 23e48ef..1d279aa 100644 --- a/src/edu/berkeley/fleet/marina/MarinaTest.java +++ b/src/edu/berkeley/fleet/marina/MarinaTest.java @@ -246,7 +246,6 @@ public class MarinaTest { */ tester.printInfo = false; - ChainControls ccs = new ChainControls(); PowerChannel pc = new ManualPowerChannel("pc", false); /* JtagTester testerD, testerR, testerC; @@ -282,12 +281,8 @@ public class MarinaTest { cc = new ChainControl(SCAN_CHAIN_XML, tester, 1.8f, khz); cc.noTestSeverity = Infrastructure.SEVERITY_NOMESSAGE; ct = new ChainTest(cc, pc); - ccs.addChain(Marina.DATA_CHAIN, cc); - ccs.addChain(Marina.REPORT_CHAIN, cc); - ccs.addChain(Marina.CONTROL_CHAIN, cc); - ccs.addChain(Marina.DUKE_CHAIN, cc); - marina = new Marina(ccs, model, !cmdArgs.jtagShift, indenter); + marina = new Marina(cc, cc, cc, cc, model, !cmdArgs.jtagShift, indenter); marina.mc0=mc0; marina.mc1=mc1; @@ -2465,7 +2460,7 @@ public class MarinaTest { case 3040: loadEveryValueOLC(marina); break; 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(); diff --git a/src/edu/berkeley/fleet/marina/MergeExperiment.java b/src/edu/berkeley/fleet/marina/MergeExperiment.java index c41de62..64809d1 100644 --- a/src/edu/berkeley/fleet/marina/MergeExperiment.java +++ b/src/edu/berkeley/fleet/marina/MergeExperiment.java @@ -9,11 +9,11 @@ public class MergeExperiment { ProperStopper bottomRing; ProperStopper topRing; - public MergeExperiment(ChainControls cc, ChipModel model, boolean clockHack, Indenter indenter) { + public MergeExperiment(ChipModel model, boolean clockHack, Indenter indenter) { bottomRing = new ProperStopper("bottom ring", "marinaGu@0.outDockW@.compareW@1.marinaCo@0.bottomFI@0.tapPropS@1.properSt@1", - cc, + model, clockHack, indenter, @@ -22,7 +22,7 @@ public class MergeExperiment { topRing = new ProperStopper("top ring", "marinaGu@0.outDockW@.compareW@1.marinaCo@0.topFIFO0@.tapPropS@1.properSt@1", - cc, + model, clockHack, indenter, diff --git a/src/edu/berkeley/fleet/marina/ProperStopper.java b/src/edu/berkeley/fleet/marina/ProperStopper.java index 7c78fd5..b97d491 100644 --- a/src/edu/berkeley/fleet/marina/ProperStopper.java +++ b/src/edu/berkeley/fleet/marina/ProperStopper.java @@ -34,15 +34,11 @@ public class ProperStopper { private boolean traceFill = false; private boolean traceDrain = false; - private final String - controlChain = Marina.CONTROL_CHAIN, - controlPath, - dataChain = Marina.DATA_CHAIN, - dataPath, - reportChain = Marina.REPORT_CHAIN, - reportPath; + private final String controlPath, dataPath, reportPath; + private final ChainControl controlChain; + private final ChainControl dataChain; + private final ChainControl reportChain; private final String captureClock; - private final ChainControls cc; private final ChipModel model; private final Indenter indenter; @@ -69,13 +65,10 @@ public class ProperStopper { } private void shiftControl(boolean readEnable, boolean writeEnable) { - //System.out.println("start shiftcontrol"); - cc.shift(controlChain, readEnable, writeEnable); - //System.out.println(" end shiftcontrol"); + controlChain.shift(Marina.CONTROL_CHAIN, readEnable, writeEnable); } private void shiftData(boolean readEnable, boolean writeEnable) { - //System.out.println("start shiftdata"); - cc.shift(dataChain, readEnable, writeEnable); + dataChain.shift(Marina.DATA_CHAIN, readEnable, writeEnable); if (writeEnable) { if (clockHack && model instanceof NanosimModel) { NanosimModel nanoModel = (NanosimModel) model; @@ -89,12 +82,9 @@ public class ProperStopper { nanoModel.setNodeState(captureClock, 0); } } - //System.out.println(" end shiftdata"); } private void shiftReport(boolean readEnable, boolean writeEnable) { - //System.out.println("start shiftreport"); - cc.shift(reportChain, readEnable, writeEnable); - //System.out.println(" end shiftreport"); + reportChain.shift(Marina.REPORT_CHAIN, readEnable, writeEnable); } private StateWireState boolToState(boolean b) { @@ -109,7 +99,7 @@ public class ProperStopper { } public void setCounterValue(int val) { - SubchainNode chainNode = (SubchainNode) cc.getChainControlFromPath(dataChain).findNode(pathToCounter); + SubchainNode chainNode = (SubchainNode) dataChain.findNode(pathToCounter); int bitIndex = chainNode.getBitIndex(); ChainNode root = chainNode.getParentChain(); for(int i=0; i<31; i++) @@ -119,7 +109,7 @@ public class ProperStopper { // DOES NOT SHIFT THE CHAIN!!!! public int getCounterValue() { - SubchainNode chainNode = (SubchainNode) cc.getChainControlFromPath(dataChain).findNode(pathToCounter); + SubchainNode chainNode = (SubchainNode) dataChain.findNode(pathToCounter); int bitIndex = chainNode.getBitIndex(); ChainNode root = chainNode.getParentChain(); return (int)root.getOutBits().get(bitIndex, 30).bitReverse().toLong(); @@ -130,17 +120,17 @@ public class ProperStopper { BitVector fdCtl = ccc.bits(extra); fdcstate = ccc; fatal(fdCtl.getNumBits()!=6, "expect 6 proper stopper control bits"); - BitVector val = cc.getInBits(controlPath); + BitVector val = controlChain.getInBits(controlPath); for (int i=0; i