3 == Ports ===========================================================
7 constant rev: .......................1.............
8 constant inv: ........................1............
9 constant count: .........................nnnnnn......
10 constant offset: ...............................nnnnnn
15 == Sample Code ======================================================
18 == Constants ========================================================
20 == TeX ==============================================================
23 +-------------+ +---------------+ +------------+
24 | inEnqueue |-->| |-->| outDequeue |
25 +-------------+ | | +------------+
27 +-------------+ | | +-------------+
28 | inEnqueueOp |-->| |<--| inDequeueOp |
29 +-------------+ +---------------+ +-------------+
32 \section*{inEnqueueOp}
33 \setlength{\bitwidth}{6mm}
36 \bitheader[b]{0,5,6,11,12,13}\\
45 \item [\tt Rev] ({\bf Reverse Before Enqueue})
46 \item [\tt Inv] ({\bf Invert Count}) -- treat {\tt Count} as {\tt 37-Offset-Count}
47 \item [\tt Count] ({\bf Count of Bits To Enqueue})
48 \item [\tt Offset] ({\bf Offset of Bits To Enqueue})
51 By default, bits are enqueued {\it most significant bit first} (bits
52 in Sun byte order). If {\tt Rev=1}, the bits are reversed before
53 performing the directions below.
55 If {\tt Inv=1}, then the {\tt Count} field is treated as if its value
56 was actually {\tt 37-Offset-Count} for all directions below.
62 \section*{inDequeueOp}
63 \setlength{\bitwidth}{6mm}
66 \bitheader[b]{0,5,6,11-21,22}\\
73 \bitbox{2}{Left\\ Fill}
74 \bitbox{2}{Right\\ Fill}
81 \item [\tt Until] ({\bf Shift until you see a (0, 1)})
82 \item [\tt Sort] ({\bf Sort the Bits})
83 \item [\tt Get] ({\bf Get the value of the counter})
84 \item [\tt Rev] ({\bf Reverse Before Enqueue})
85 \item [\tt Inv] ({\bf Invert Count}) -- treat {\tt Count} as {\tt 37-Offset-Count}
86 \item [\tt Rst] ({\bf Reset Counter Before Operation})
87 \item [\tt Left Fill] ({\bf Left Fill (0, 1, sign)})
88 \item [\tt Right Fill] ({\bf Right Fill (0, 1, sign)})
89 \item [\tt Count] ({\bf Count of Bits To Enqueue})
90 \item [\tt Offset] ({\bf Offset of Bits To Enqueue})
94 == Fleeterpreter ====================================================
96 static class BitStorage {
100 BitStorage(int size) {
101 bits = new long[size / 64 + (size % 64 != 0 ? 1 : 0)];
106 boolean hasSpace(int num) {
107 return bits.length * 64 - numbits >= num;
109 boolean add(long data, int num) {
110 if (!hasSpace(num)) return false;
111 int entry = ((numbits + start) / 64) % bits.length;
112 int off = (numbits + start) % 64;
113 int maxadd = 64 - off;
114 long mask = maxadd < 64 ? (-1L >>> maxadd) : 0L;
115 bits[entry] = (bits[entry] & mask) | (data << off);
118 return add(data >>> maxadd, num - maxadd);
125 assert size() >= num : "too few bits in storage";
126 int entry = start / 64;
127 int off = start % 64;
129 int n = num > max ? max : num;
130 long mask = n > 0 ? (-1L >>> (64 - n)) : 0L;
131 long res = (bits[entry] >>> off) & mask;
132 int oldstart = start;
135 long mask2 = n2 > 0 ? (-1L >>> (64 - n2)) : 0L;
136 res |= (bits[(entry + 1) % bits.length] & mask2) << n;
138 start = (start + num) % (64 * bits.length);
143 return 64 * bits.length;
145 // Test code for BitStorage
146 static void test3(String[] args) {
147 BitStorage bs = new BitStorage(37);
148 Random rand = new Random();
149 Vector ins = new Vector();
150 Vector ret = new Vector();
151 StringBuffer sbi = new StringBuffer();
152 StringBuffer sbr = new StringBuffer();
153 System.out.println("==== Test #3 ====");
154 System.out.println("inserting...");
155 long data = rand.nextLong();
157 ins.add(new Integer(0));
158 data = rand.nextLong();
159 int num = rand.nextInt(37);
162 assert bs.size() - s == num : "bad size: " + s + " + " + num + " != " + bs.size();
163 ins.add(new Integer(num));
166 System.out.println("\nretrieving...");
169 ret.add(new Integer(num));
172 System.out.println("\ninsertion sequence:");
173 for (int i = 0; i < ins.size(); i++) {
174 System.out.print(" " + ins.get(i));
176 System.out.println("\nretrieval sequence:");
177 for (int i = 0; i < ret.size(); i++) {
178 System.out.print(" " + ret.get(i));
180 System.out.println();
183 static void test2(String[] args) {
184 int iters = (args.length > 0 ? Integer.parseInt(args[0]) : 10);
185 BitStorage bs = new BitStorage(37 * iters);
186 Random rand = new Random();
187 Vector ins = new Vector();
188 Vector ret = new Vector();
189 StringBuffer sbi = new StringBuffer();
190 StringBuffer sbr = new StringBuffer();
191 System.out.println("==== Test #2 ====");
192 for (int i = 0; i < iters; i++) {
193 long data = rand.nextLong();
194 int num = rand.nextInt(37);
197 assert bs.size() - s == num : "bad size: " + s + " + " + num + " != " + bs.size();
198 ins.add(new Integer(num));
200 num = rand.nextInt(Math.min(37, bs.size()));
203 assert s - bs.size() == num : "bad size: " + s + " - " + num + " != " + bs.size();
204 ret.add(new Integer(num));
207 //for (int i = 0; i < iters; i++) {
208 while (bs.size() > 0) {
209 int num = Math.min(rand.nextInt(37), bs.size());
210 //int num = Math.min(33, bs.size());
212 long data = bs.get(num);
213 assert s - bs.size() == num : "bad size: " + s + " - " + num + " != " + bs.size();
214 ret.add(new Integer(num));
217 System.out.println("inserted:");
218 System.out.println(sbi);
219 System.out.println("retrieved:");
220 System.out.println(sbr);
221 System.out.println("insertion sequence:");
222 for (int i = 0; i < ins.size(); i++) {
223 System.out.print(" " + ins.get(i));
225 System.out.println("\nretrieval sequence:");
226 for (int i = 0; i < ret.size(); i++) {
227 System.out.print(" " + ret.get(i));
229 System.out.println();
232 static void test1(String[] args) {
233 int iters = (args.length > 0 ? Integer.parseInt(args[0]) : 10);
234 BitStorage bs = new BitStorage(37 * iters);
235 Random rand = new Random();
236 Vector ins = new Vector();
237 Vector ret = new Vector();
238 StringBuffer sbi = new StringBuffer();
239 StringBuffer sbr = new StringBuffer();
240 System.out.println("==== Test #1 ====");
241 System.out.println("inserting...");
242 for (int i = 0; i < iters; i++) {
243 long data = rand.nextLong();
244 int num = rand.nextInt(37);
247 assert bs.size() - s == num : "bad size: " + s + " + " + num + " != " + bs.size();
248 ins.add(new Integer(num));
252 System.out.println("\nretrieving...");
253 //for (int i = 0; i < iters; i++) {
254 while (bs.size() > 0) {
255 int num = Math.min(rand.nextInt(37), bs.size());
256 //int num = Math.min(33, bs.size());
258 long data = bs.get(num);
259 assert s - bs.size() == num : "bad size: " + s + " - " + num + " != " + bs.size();
260 ret.add(new Integer(num));
264 System.out.println("\ninsertion sequence:");
265 for (int i = 0; i < ins.size(); i++) {
266 System.out.print(" " + ins.get(i));
268 System.out.println("\nretrieval sequence:");
269 for (int i = 0; i < ret.size(); i++) {
270 System.out.print(" " + ret.get(i));
272 System.out.println();
275 static void print(long data, int num) {
276 for (int i = 0; i < num; i++) {
277 System.out.print((data >>> i) & 0x1);
280 static void add(StringBuffer sb, long data, int num) {
281 for (int i = 0; i < num; i++) {
282 sb.append((int) ((data >>> i) & 0x1));
285 static void check(StringBuffer sb1, StringBuffer sb2) {
286 int len = sb2.length();
287 if (len > sb1.length()) {
288 System.out.println("error: retrieval sequence is longer than insertion sequence");
291 for (int i = 0; i < sb2.length(); i++) {
292 if (sb1.charAt(i) != sb2.charAt(i)) {
293 System.out.println("error: bit at position " + i + " does not match");
299 // Run BitStorage tests
300 public static void main(String[] args) {
301 BitStorage.test1(args);
302 BitStorage.test2(args);
303 BitStorage.test3(args);
306 // Ship implementation
307 private Packet selector;
308 private static final int MAXBITS = 128;
309 private static final int WORDSIZE = 37;
310 private BitStorage bits = new BitStorage(MAXBITS);
312 public void service() {
313 if (!box_outDequeue.readyForDataFromShip() && !box_inEnqueue.dataReadyForShip()) return;
314 if (box_inEnqueue.dataReadyForShip() && bits.hasSpace(WORDSIZE)) {
315 long data = box_inEnqueue.removeDataForShip();
316 bits.add(data, WORDSIZE);
318 if (selector == null && !box_inEnqueueOp.dataReadyForShip()) return;
319 if (selector == null) selector = box_inEnqueueOp.removePacketForShip();
321 String port = selector.destination.getDestinationName();
322 long val = selector.value; // check if <= 37?
324 if (port.startsWith("takeInv") || port.startsWith("dropInv")) {
327 if (val < bits.size()) {
331 if (port.startsWith("take")) {
332 if (!box_outDequeue.readyForDataFromShip()) return;
333 long data = bits.get((int) val);
334 if (port.endsWith("FillOnes")) {
335 data |= (-1L << val);
336 } else if (port.endsWith("SignExtend")) {
337 data = (data << (64 - val)) >> (64 - val);
339 box_outDequeue.addDataFromShip(data);
349 == FleetSim ==============================================================
351 == FPGA ==============================================================
353 == Contributors =========================================================
354 Amir Kamil <kamil@cs.berkeley.edu>