refactoring of InstructionStopper
[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 import static com.sun.vlsi.chips.marina.test.Marina.INSTRUCTION_LENGTH;
15
16 /**
17  * InstructionStopper is a scaffold that lets us create a 36 bit propperStopper
18  * by using a 52 bit propperStopper and throwing away the unused bits.
19  */
20 public class InstructionStopper extends ProperStopper {
21
22     private String formatDecodedInstr(BitVector dta) {
23         BitVector instr = dta.get(0, INSTRUCTION_LENGTH).bitReverse(); 
24         StringBuffer sb = new StringBuffer();
25         String pred = instr.get(0, 6)  .getState();
26         String rq = instr.get(6, 1).getState();
27         String unused2 = instr.get(7, 2).getState();
28         String op = instr.get(9, 6).getState();
29         String tail = instr.get(15, 1).getState();
30         String rest = instr.get(16, 20).getState();
31                 
32         return pred+" "+rq+" "+unused2+" "+op+" "+tail+" "+rest;
33     }
34     public InstructionStopper(String propInst,
35                               String controlChain, String dataChain,
36                               String reportChain,
37                               ChainControls cc, ChipModel model,
38                               boolean clockHack,
39                               Indenter indenter) {
40         super(propInst, controlChain, dataChain, reportChain, cc, model, clockHack, indenter);
41     }
42
43     @Override
44     public void fill(BitVector instr) {
45         // allow user to pass in complete item: data + token + addr
46         if (instr.getNumBits()==(37+1+14)) {super.fill(instr); return;}
47                 
48         int n = instr.getNumBits();
49         fatal(n!=INSTRUCTION_LENGTH, "InstructionStopper.fill: wrong num bits: "+n+", expect: "+INSTRUCTION_LENGTH);
50         fatal(INSTRUCTION_LENGTH>37, "Instructions can't be more than 37 bits");
51         if (INSTRUCTION_LENGTH<37) {
52             BitVector pad = new BitVector(37-INSTRUCTION_LENGTH, "pad");
53             pad.setFromLong(0);
54             instr = instr.cat(pad);
55         }
56         BitVector t = new BitVector(1, "token");   t.setFromLong(1);
57         BitVector a = new BitVector(14, "addr");   a.setFromLong(0);
58         //super.fill(instr.cat(t).cat(a));
59         super.fill(t.cat(a).cat(instr));
60     }
61
62     public BitVector drainNoCheck() {
63         BitVector dta = super.drainNoCheck();
64         return dta.get(15, INSTRUCTION_LENGTH);
65     }
66
67     /** put one Instruction into InstructionStopper */
68     public void fill(Instruction instr) {
69         fill(MarinaUtils.berkToSun(MarinaTest.marinaFleet.encodeInstruction(MarinaTest.marinaFleet.getOnlyInputDock(), instr)));
70     }
71
72     /* put a torpedo into the InstructionStopper */
73     public void fillTorpedo() {
74         throw new RuntimeException("currently not implemented");
75     }
76 }