24 Nov design
[fleet.git] / testCode / com / sun / vlsi / chips / marina / test / InstructionStopper.java
1 package com.sun.vlsi.chips.marina.test;
2
3 import java.util.ArrayList;
4 import java.util.List;
5
6 import com.sun.async.test.BitVector;
7 import com.sun.async.test.ChainControl;
8 import com.sun.async.test.ChipModel;
9
10 import edu.berkeley.fleet.api.Dock;
11 import edu.berkeley.fleet.api.Instruction;
12 import edu.berkeley.fleet.marina.MarinaFleet;
13
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();
21
22     static {
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); 
27     }
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));
32         return sunBits;
33         }
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();
43                 
44                 return pred+" "+rq+" "+unused2+" "+op+" "+tail+" "+rest;
45         }
46         public InstructionStopper(String propInst,
47                                           String controlChain, String dataChain,
48                                           String reportChain,
49                                           ChainControls cc, ChipModel model,
50                                           boolean clockHack,
51                                           Indenter indenter) {
52                 super(propInst, controlChain, dataChain, reportChain, cc, model, clockHack, indenter);
53         }
54         @Override
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;}
58                 
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");
62                 if (INSTR_SZ<37) {
63                         BitVector pad = new BitVector(37-INSTR_SZ, "pad");
64                         pad.setFromLong(0);
65                         instr = instr.cat(pad);
66                 }
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));
70     }
71         @Override 
72         public BitVector drain() {
73                 BitVector dta = super.drain();
74                 return dta.get(0, INSTR_SZ);
75         }
76         @Override
77         public String formatDataTokAddr(BitVector dta) {
78                 return formatDecodedInstr(dta);
79         }
80         /** put one Instruction into InstructionStopper */
81         public void fill(Instruction instr) {
82                 fill(berkToSun(MARINA.encodeInstruction(DOCK, instr)));
83         }
84 }