1 package com.sun.vlsi.chips.marina.test;
2 import com.sun.async.test.BitVector;
3 import com.sun.async.test.Infrastructure;
6 import java.util.Random;
7 import java.util.ArrayList;
10 * Miscellaneous routines to generate BitVectors as test inputs.
13 public class BitVectorGenerators {
15 private static void fatal(boolean pred, String msg) { MarinaUtils.fatal(pred, msg); }
17 public static BitVector generateBits(int start, boolean alternate, int n) {
19 String bits = Integer.toString(start);
21 for (int i = 2; i<= n; i++) {
23 bits += Integer.toString (temp);
27 for (int i = 2; i <= n; i++){
28 bits += Integer.toString(start);
31 BitVector bv = new BitVector (n, bits);
37 public static String generateTokenContent(int i) {
38 BitVector data0 = generateBits(0, true, 37); // 37 bits, alternating
39 BitVector tag0 = generateBits(1, false, 1);
40 BitVector addr0 = generateBits(0, true, 14); // 14 bits, alternating
41 //BitVector addr0 = new BitVector ("00000001111111", "addr0"); // 14 bits, alternating
42 BitVector data1 = generateBits(1, true, 37); // 37 bits, alternating
43 BitVector tag1 = generateBits(1, false, 1);
44 //BitVector addr1 = generateBits(1, true, 14); // 14 bits, alternating
45 BitVector addr1 = new BitVector ("00101010101011", "addr1"); // 14 bits, alternating
47 return generateBits(0, false, 37).getState()+"1"+addr0.getState();
50 return data1.getState()+tag1.getState()+addr1.getState();// the addr data MAY enable cross: bit 0 (cross active high for Ring 1) and 13 (cross active low for Ring 2)
51 //return data1.getState()+tag1.getState()+addr0.getState();//
54 return data0.getState()+tag1.getState()+addr0.getState();
57 return data1.getState()+tag0.getState()+addr1.getState();
58 //return data1.getState()+tag0.getState()+addr0.getState();
61 return data0.getState()+tag0.getState()+addr0.getState();
64 public static boolean compareTags(BitVector inputContent, BitVector exitContent){
65 return inputContent.get(37) == exitContent.get(37); //bit 37 is the tag bit
68 public static boolean compareData(BitVector inputContent, BitVector exitContent){
69 return inputContent.get(0, 37).getState().equals(exitContent.get(0, 37).getState()); //bits 0:36 are the data bits
72 public static boolean compareAddress(BitVector inputContent, BitVector exitContent){
73 return inputContent.get(38, 14).getState().equals(exitContent.get(38, 14).getState()); //bits 38:38+14 are the data bits
76 public static boolean insertedVsRemoved(BitVector [] insertedTokenContent, BitVector [] removedTokenContent, int numTokens){
77 for (int i = 0; i < numTokens; i++) {
78 if (insertedTokenContent[i].get(37)){ //tag = 1 meaning data is valid
80 if (!insertedTokenContent[i].getState().equals(removedTokenContent[i].getState())){
81 System.out.println ("Inserted vs removed data, tag and address @ stage " + i + " does NOT match!");
84 System.out.println ("Inserted vs removed data, tag and address @ stage " + i + " matches!");
86 else {//if tag=0, just need to make sure tag bit is still the same as inserted but data and address are no longer important
87 if (!compareTags(insertedTokenContent[i], removedTokenContent[i])){
88 System.out.println ("Inserted vs removed tag @ stage " + i + " does NOT match!");
91 System.out.println ("Inserted vs removed tag @ stage " + i + " matches!");
94 System.out.println("Inserted tokens match removed tokens...All is well!");
98 public static void checkRingData(String ringNm, List<BitVector> dIn,
99 List<BitVector> dOut) {
102 fatal(dOut.size()!=sz, ringNm+
103 " wrong number of items. Expected:"+sz+", got:"+dOut.size());
106 BitVector first = dIn.get(0);
108 for (; offset<sz; offset++) {
109 if (dOut.get(offset).equals(first)) break;
111 fatal(offset==sz, "first input item not found in output: "+first.getState());
112 //prln("Output item offset: "+offset);
113 System.out.println("Output item offset: "+offset);
116 for (int i=0; i<sz; i++) {
117 int outNdx = (i + offset + sz) % sz;
118 BitVector out = dOut.get(outNdx);
119 BitVector in = dIn.get(i);
121 fatal(!in.equals(out), i+"th input item:"+in.getState()+"\n"+
122 "doesn't match "+outNdx+"th output item: "+out.getState());
125 /** Generate List of BitVectors where Token=true, high 25 data bits
126 * are alternating ones and zeros, low 12 data bits increment from
127 * zero, and address is given by random number generator. */
128 public static List<BitVector> makeIncrDataRandAdr(int num, Random rand) {
129 List<BitVector> ans = new ArrayList<BitVector>();
130 BitVector dHi = new BitVector(25, "dataHi");
131 BitVector dLo = new BitVector(12, "dataLo");
132 BitVector t = new BitVector("1", "token");
133 BitVector a = new BitVector(14, "addr");
134 dHi.setFromLong(0x00aaaaa);
135 for (int i=0; i<num; i++) {
137 a.setFromLong((long)rand.nextInt());
138 ans.add(dHi.cat(dLo).cat(t).cat(a));
144 /** Generate List of BitVectors where Token=true, high 25 data bits
145 * are alternating ones and zeros, low 12 data bits increment from
146 * zero, and address is given by addr. */
148 public static List<BitVector> makeIncrDataConstAdr(int num, int addr) {
149 List<BitVector> ans = new ArrayList<BitVector>();
150 BitVector dHi = new BitVector(25, "dataHi");
151 BitVector dLo = new BitVector(12, "dataLo");
152 BitVector t = new BitVector("1", "token");
153 BitVector a = new BitVector(14, "addr");
154 dHi.setFromLong(0x00aaaaa);
156 for (int i=0; i<num; i++) {
158 ans.add(dHi.cat(dLo).cat(t).cat(a));
163 public static List<BitVector> makeIncrDataConstAdr(int num, String addr) {
164 List<BitVector> ans = new ArrayList<BitVector>();
165 BitVector dHi = new BitVector(25, "dataHi");
166 BitVector dLo = new BitVector(12, "dataLo");
167 BitVector t = new BitVector("1", "token");
168 BitVector a = new BitVector(addr, "addr");
169 dHi.setFromLong(0x00aaaaa);
170 //a.setFromLong(addr);
171 for (int i=0; i<num; i++) {
173 ans.add(dHi.cat(dLo).cat(t).cat(a));
178 public static List<BitVector> makeConstDataConstAdr(int num, boolean dataValue, String addr) {
179 List<BitVector> ans = new ArrayList<BitVector>();
180 BitVector d = new BitVector(37, "dataHi");
181 BitVector t = new BitVector("1", "token");
182 BitVector a = new BitVector(addr, "addr");
183 Long dat = dataValue ? -1L : 0L;
185 for (int i=0; i<num; i++) {
186 ans.add(d.cat(t).cat(a));
190 public static List<BitVector> make0TokenAdd(int num, int addrMsb, int addrLsb) {
191 List<BitVector> ans = new ArrayList<BitVector>();
192 BitVector d = new BitVector(37, "data");
193 BitVector t = new BitVector("0", "token");
194 BitVector aHi = new BitVector(1, "addrHi");
195 BitVector aLo = new BitVector(1, "addrLo");
196 BitVector aMid = new BitVector(12, "addrMid");
197 d.setFromLong(0x0000000000L);
198 aHi.setFromLong(addrMsb);
199 aLo.setFromLong(addrLsb);
200 aMid.setFromLong(0x000);
201 for (int i=0; i<num; i++) {
202 ans.add(d.cat(t).cat(aHi).cat(aMid).cat(aLo));
207 /** Generate List of BitVectors where Token=true, the address MSB
208 * is given by addrMsb, the address LSB is set by addrLSB,
209 * data bits alternate between 0xaaaa and 0x5555.
210 * 12 insignificant address bits to crosser alternate between 0xaaa and 0x555 */
212 public static List<BitVector> makeAltDataAdd(int num, Long longValue, int addrMsb, int addrLsb, boolean crosser) {
213 List<BitVector> ans = new ArrayList<BitVector>();
214 BitVector d = new BitVector(37, "data");
215 BitVector t = new BitVector("1", "token");
216 BitVector aHi = new BitVector(1, "addrHi");
217 BitVector aLo = new BitVector(1, "addrLo");
218 BitVector aMid = new BitVector(12, "addrMid");
219 BitVector aRing = new BitVector(14, "addrRing"); //address bits for ring, bit 0 and 13 do not need to be anything specific b/c there isn't a cross element in the ring
220 //d.setFromLong(0xaaaaaaaaaaL);
221 d.setFromLong(longValue);
222 aHi.setFromLong(addrMsb);
223 aLo.setFromLong(addrLsb);
224 aMid.setFromLong(0xaaa);
225 aRing.setFromLong(0xaaaa);
226 for (int i=0; i<num; i++) {
228 ans.add(d.cat(t).cat(aHi).cat(aMid).cat(aLo));
230 ans.add(d.cat(t).cat(aRing));
238 public static void compareJUSTDataTag(List<BitVector> din, List<BitVector> dout) {
239 fatal(din.size()!=dout.size(),
240 "in count="+din.size()+" out count="+dout.size());
241 for (int i=0; i<din.size(); i++) {
242 BitVector dI = din.get(i);
243 BitVector dO = dout.get(i);
244 //prln("Count = " + i + ", dI = " + dI + ", dO = " + dO);
245 fatal(!dI.get(0,37).equals(dO.get(0,37)),
246 "data mismatch! in data + tag:"+dI.get(0,37).getState()+" out data + tag:"+dO.get(0,37).getState());
250 public static void checkUnorderedData(List<BitVector> din, List<BitVector> dout) {
252 fatal(dout.size()!=sz, "found "+dout.size()+" items, Expected: "+sz);
253 for (BitVector in : din) {
254 boolean found = false;
255 for (BitVector out : dout) {
256 if (in.equals(out)) {
261 fatal(!found, "Can't find vector in output: "+in.getState());
264 public static void checkUnorderedJUSTDataTag(List<BitVector> din, List<BitVector> dout) {
266 fatal(dout.size()!=sz, "found "+dout.size()+" items, Expected: "+sz);
267 for (BitVector in : din) {
268 boolean found = false;
269 for (BitVector out : dout) {
270 if (in.get(0,37).equals(out.get(0,37))) {
275 fatal(!found, "Can't find vector in output: "+in.getState());
279 public static void checkToken0Add(List<BitVector> din, List<BitVector> dout) {
281 fatal(dout.size()!=sz, "found "+dout.size()+" items, Expected: "+sz);
282 for (BitVector in : din) {
283 boolean found = false;
284 for (BitVector out : dout) {
285 if (in.get(38,14).equals(out.get(38,14))) {
290 fatal(!found, "Can't find vector in output: "+in.getState());
294 public static int findBitVectorIndex(List<BitVector> din, BitVector findThis) {
298 for (BitVector in : din) {
299 if (in.equals(findThis)) {
304 fatal(!found, "Can't find vector in output: "+findThis.getState());