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