1 package com.sun.vlsi.chips.marina.test;
3 import java.util.ArrayList;
6 import com.sun.async.test.BitVector;
7 import com.sun.async.test.ChainControl;
8 import com.sun.async.test.ChipModel;
10 import edu.berkeley.fleet.api.Dock;
11 import edu.berkeley.fleet.api.Instruction;
12 import edu.berkeley.fleet.marina.MarinaFleet;
14 /** InstructionStopper is a scaffold that lets us create a 36 bit propperStopper
15 * by using a 52 bit propperStopper and throwing away the unused bits. */
16 public class InstructionStopper extends ProperStopper {
17 public static final BitVector TORPEDO;
18 public static final int INSTR_SZ = 36;
19 public static final MarinaFleet MARINA = new MarinaFleet();
20 public static final Dock DOCK = MARINA.getOnlyInputDock();
23 BitVector d = new BitVector(37, "token"); d.setFromLong(0);
24 BitVector t = new BitVector(1, "token"); t.setFromLong(0);
25 BitVector a = new BitVector(14, "addr"); a.setFromLong(0);
26 TORPEDO = d.cat(t).cat(a);
28 // Convert a Berkeley BitVector into a Sun BitVector
29 private BitVector berkToSun(edu.berkeley.fleet.api.BitVector berkBits) {
30 BitVector sunBits = new BitVector(INSTR_SZ, "instr");
31 for(int i=0; i<INSTR_SZ; i++) sunBits.set(i, berkBits.get(i));
34 private String formatDecodedInstr(BitVector dta) {
35 BitVector instr = dta.get(0, INSTR_SZ).bitReverse();
36 StringBuffer sb = new StringBuffer();
37 String pred = instr.get(0, 6) .getState();
38 String rq = instr.get(6, 1).getState();
39 String unused2 = instr.get(7, 2).getState();
40 String op = instr.get(9, 6).getState();
41 String tail = instr.get(15, 1).getState();
42 String rest = instr.get(16, 20).getState();
44 return pred+" "+rq+" "+unused2+" "+op+" "+tail+" "+rest;
46 public InstructionStopper(String propInst,
47 String controlChain, String dataChain,
49 ChainControls cc, ChipModel model,
52 super(propInst, controlChain, dataChain, reportChain, cc, model, clockHack, indenter);
55 public void fill(BitVector instr) {
56 // allow user to pass in complete item: data + token + addr
57 if (instr.getNumBits()==(37+1+14)) {super.fill(instr); return;}
59 int n = instr.getNumBits();
60 fatal(n!=INSTR_SZ, "InstructionStopper.fill: wrong num bits: "+n+", expect: "+INSTR_SZ);
61 fatal(INSTR_SZ>37, "Instructions can't be more than 37 bits");
63 BitVector pad = new BitVector(37-INSTR_SZ, "pad");
65 instr = instr.cat(pad);
67 BitVector t = new BitVector(1, "token"); t.setFromLong(1);
68 BitVector a = new BitVector(14, "addr"); a.setFromLong(0);
69 super.fill(instr.cat(t).cat(a));
72 public BitVector drain() {
73 BitVector dta = super.drain();
74 return dta.get(0, INSTR_SZ);
77 public String formatDataTokAddr(BitVector dta) {
78 return formatDecodedInstr(dta);
80 /** put one Instruction into InstructionStopper */
81 public void fill(Instruction instr) {
82 fill(berkToSun(MARINA.encodeInstruction(DOCK, instr)));