1 package edu.berkeley.fleet.loops;
2 import edu.berkeley.fleet.loops.*;
3 import java.util.concurrent.Semaphore;
7 import edu.berkeley.fleet.two.*;
8 import edu.berkeley.fleet.fpga.*;
9 import edu.berkeley.fleet.api.*;
10 import edu.berkeley.fleet.api.Instruction.*;
11 import edu.berkeley.fleet.api.Instruction.Set;
12 import edu.berkeley.fleet.api.Instruction.Set.*;
13 import edu.berkeley.fleet.api.Instruction.Set.SetDest;
14 import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
15 import static edu.berkeley.fleet.api.Predicate.*;
17 public class MemoryUtils {
19 public static void readMem(FleetProcess fp,
23 BitVector[] vals) throws RuntimeException {
25 Ship alu = pool.allocateShip("Alu");
26 pool.assertAllocated(memory);
27 MemoryInputStream mos = new MemoryInputStream(fp, pool, memory, alu, offset, 1);
29 for(int i=0; i<vals.length; i++) {
30 int pct = (int)Math.ceil(100.0*((double)(i)/((double)(vals.length-1))));
31 String status = i + "/" + (vals.length-1) + "= " + pct + "%";
32 System.out.print("\rreading from address: " + status + "...");
33 vals[i] = mos.readWord();
34 System.out.print("\rread from address: " + status + ", got " + vals[i] + " = " + vals[i].toLong()+" ");
37 pool.releaseShip(alu);
38 } catch (IOException e) {
39 throw new RuntimeException(e);
43 public static void writeMem(FleetProcess fp,
47 BitVector[] vals) throws RuntimeException {
49 Ship alu = pool.allocateShip("Alu");
50 pool.assertAllocated(memory);
51 MemoryOutputStream mos = new MemoryOutputStream(fp, pool, memory, alu, offset);
52 for(int i=0; i<vals.length; i++) {
53 int pct = (int)Math.ceil(100.0*((double)(i)/((double)(vals.length-1))));
54 String status = i + "/" + (vals.length-1) + "= " + pct + "%";
55 System.out.print("\rwrote to address: " + status +" ");
56 mos.writeWord(vals[i]);
59 pool.releaseShip(alu);
60 } catch (IOException e) {
61 throw new RuntimeException(e);
65 public static class MemoryOutputStream extends DockOutputStream {
67 private FleetProcess fp;
71 public MemoryOutputStream(FleetProcess fp,
75 long offset) throws IOException {
77 super(fp, pool, memory.getDock("inDataWrite"), alu.getDock("out").getDataDestination());
78 pool.assertAllocated(memory);
79 pool.assertAllocated(alu);
85 buildIt(fp, memory, alu, memory.getDock("inAddrWrite"), offset);
86 CodeBag cb = new CodeBag(fp.getFleet());
88 lf = cb.loopFactory(memory.getDock("out"), 0);
89 lf.abortLoopIfTorpedoPresent();
96 fp.sendTorpedo(memory.getDock("inAddrWrite"));
97 fp.sendTorpedo(memory.getDock("out"));
98 fp.sendTorpedo(alu.getDock("in1"));
99 fp.sendTorpedo(alu.getDock("in2"));
100 fp.sendTorpedo(alu.getDock("inOp"));
101 fp.sendTorpedo(alu.getDock("out"));
107 public static class MemoryInputStream extends DockInputStream {
109 private FleetProcess fp;
113 public MemoryInputStream(FleetProcess fp,
118 int inflight) throws IOException {
119 super(fp, pool, memory.getDock("out"), alu.getDock("out").getDataDestination(), inflight);
120 pool.assertAllocated(memory);
121 pool.assertAllocated(alu);
123 this.memory = memory;
125 buildIt(fp, memory, alu, memory.getDock("inAddrRead"), offset);
128 public void close() {
130 fp.sendTorpedo(memory.getDock("inAddrRead"));
131 fp.sendTorpedo(alu.getDock("in1"));
132 fp.sendTorpedo(alu.getDock("in2"));
133 fp.sendTorpedo(alu.getDock("inOp"));
134 fp.sendTorpedo(alu.getDock("out"));
138 private static void buildIt(FleetProcess fp, Ship memory, Ship alu, Dock dest, long offset) {
140 CodeBag ctx = new CodeBag(fp.getFleet());
143 // alu.in1: receive and deliver
144 lf = ctx.loopFactory(alu.getDock("in1"), 0);
145 lf.abortLoopIfTorpedoPresent();
149 // alu.in2: receive tokens, deliver 1's
150 lf = ctx.loopFactory(alu.getDock("in2"), 1);
153 lf.abortLoopIfTorpedoPresent();
157 // alu.inOp: receive tokens, deliver ADD's
158 lf = ctx.loopFactory(alu.getDock("inOp"), 1);
161 lf.abortLoopIfTorpedoPresent();
165 // alu.out: for each token, provide a word of count-data
166 lf = ctx.loopFactory(alu.getDock("out"), 1);
169 lf.abortLoopIfTorpedoPresent();
172 lf.sendWord(alu.getDock("in1"));
173 lf.sendToken(alu.getDock("in2"));
174 lf.sendToken(alu.getDock("inOp"));
177 lf = ctx.loopFactory(dest, 0);
178 lf.abortLoopIfTorpedoPresent();
185 public static void putMemoryShipInDispatchMode(FleetProcess fp, Ship memoryShip) {
186 CodeBag ctx = new CodeBag(fp.getFleet());
189 lf = ctx.loopFactory(memoryShip.getDock("out"), 0);
190 lf.abortLoopIfTorpedoPresent();
194 lf = ctx.loopFactory(memoryShip.getDock("inCBD"), 0);
195 lf.abortLoopIfTorpedoPresent();
202 public static void removeMemoryShipFromDispatchMode(FleetProcess fp, Ship memoryShip) {
203 fp.sendToken(memoryShip.getDock("out").getInstructionDestination());
204 fp.sendToken(memoryShip.getDock("inCBD").getInstructionDestination());
207 public static void main(String[] s) throws Exception {
208 Random random = new Random(System.currentTimeMillis());
209 Fleet fleet = new Fpga();
210 FleetProcess fp = fleet.run(new Instruction[0]);
211 Ship memory = fleet.getShip("DDR2",0);
212 //Ship memory = fleet.getShip("Dvi",0);
213 //Ship memory = fleet.getShip("Memory",0);
215 //int size = (548 * 478) / 2;
218 BitVector[] vals = new BitVector[size];
219 BitVector[] vals2 = new BitVector[size];
221 for(int i=0; i<vals.length; i++) {
222 vals[i] = new BitVector(fleet.getWordWidth()).set(random.nextLong());
223 for(int j=36; j<vals[i].length(); j++)
224 vals[i].set(j, false);
227 ShipPool pool = new ShipPool(fleet);
228 pool.allocateShip(memory);
229 writeMem(fp, pool, memory, 0, vals);
230 readMem(fp, pool, memory, 0, vals2);
231 System.out.println();
233 for(int i=0; i<vals.length; i++)
234 if (!vals[i].equals(vals2[i])) {
235 System.out.println("disagreement! on index " + i + "\n expected="+vals[i]+"\n got="+vals2[i]);
238 System.out.println("done! ("+fails+" failures)");
239 if (fails>0) System.exit(-1);