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.interpreter.*;
10 import edu.berkeley.fleet.api.*;
11 import edu.berkeley.fleet.api.Instruction.*;
12 import edu.berkeley.fleet.api.Instruction.Set;
13 import edu.berkeley.fleet.api.Instruction.Set.*;
14 import edu.berkeley.fleet.api.Instruction.Set.SetDest;
15 import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
16 import static edu.berkeley.fleet.api.Predicate.*;
18 public class MemoryUtils {
20 public static void readMem(FleetProcess fp,
24 BitVector[] vals) throws RuntimeException {
26 Ship alu = pool.allocateShip("Alu");
27 pool.assertAllocated(memory);
28 MemoryInputStream mos = new MemoryInputStream(fp, pool, memory, alu, offset, 1);
30 for(int i=0; i<vals.length; i++) {
31 int pct = (int)Math.ceil(100.0*((double)(i)/((double)(vals.length-1))));
32 String status = i + "/" + (vals.length-1) + "= " + pct + "%";
33 System.out.print("\rreading from address: " + status + "...");
34 vals[i] = mos.readWord();
35 System.out.print("\rread from address: " + status + ", got " + vals[i] + " = " + vals[i].toLong()+" ");
38 pool.releaseShip(alu);
39 } catch (IOException e) {
40 throw new RuntimeException(e);
44 public static void writeMem(FleetProcess fp,
48 BitVector[] vals) throws RuntimeException {
50 Ship alu = pool.allocateShip("Alu");
51 pool.assertAllocated(memory);
52 MemoryOutputStream mos = new MemoryOutputStream(fp, pool, memory, alu, offset);
53 for(int i=0; i<vals.length; i++) {
54 int pct = (int)Math.ceil(100.0*((double)(i)/((double)(vals.length-1))));
55 String status = i + "/" + (vals.length-1) + "= " + pct + "%";
56 System.out.print("\rwrote to address: " + status +" ");
57 mos.writeWord(vals[i]);
60 pool.releaseShip(alu);
61 } catch (IOException e) {
62 throw new RuntimeException(e);
66 public static class MemoryOutputStream extends DockOutputStream {
68 private FleetProcess fp;
72 public MemoryOutputStream(FleetProcess fp,
76 long offset) throws IOException {
78 super(fp, pool, memory.getDock("inDataWrite"), alu.getDock("out").getDataDestination());
79 pool.assertAllocated(memory);
80 pool.assertAllocated(alu);
86 buildIt(fp, memory, alu, memory.getDock("inAddrWrite"), offset);
87 CodeBag cb = new CodeBag(fp.getFleet());
89 lf = cb.loopFactory(memory.getDock("out"), 0);
90 lf.abortLoopIfTorpedoPresent();
97 fp.sendTorpedo(memory.getDock("inAddrWrite"));
98 fp.sendTorpedo(memory.getDock("out"));
99 fp.sendTorpedo(alu.getDock("in1"));
100 fp.sendTorpedo(alu.getDock("in2"));
101 fp.sendTorpedo(alu.getDock("inOp"));
102 fp.sendTorpedo(alu.getDock("out"));
108 public static class MemoryInputStream extends DockInputStream {
110 private FleetProcess fp;
114 public MemoryInputStream(FleetProcess fp,
119 int inflight) throws IOException {
120 super(fp, pool, memory.getDock("out"), alu.getDock("out").getDataDestination(), inflight);
121 pool.assertAllocated(memory);
122 pool.assertAllocated(alu);
124 this.memory = memory;
126 buildIt(fp, memory, alu, memory.getDock("inAddrRead"), offset);
129 public void close() {
131 fp.sendTorpedo(memory.getDock("inAddrRead"));
132 fp.sendTorpedo(alu.getDock("in1"));
133 fp.sendTorpedo(alu.getDock("in2"));
134 fp.sendTorpedo(alu.getDock("inOp"));
135 fp.sendTorpedo(alu.getDock("out"));
139 private static void buildIt(FleetProcess fp, Ship memory, Ship alu, Dock dest, long offset) {
141 CodeBag ctx = new CodeBag(fp.getFleet());
144 // alu.in1: receive and deliver
145 lf = ctx.loopFactory(alu.getDock("in1"), 0);
146 lf.abortLoopIfTorpedoPresent();
150 // alu.in2: receive tokens, deliver 1's
151 lf = ctx.loopFactory(alu.getDock("in2"), 1);
154 lf.abortLoopIfTorpedoPresent();
158 // alu.inOp: receive tokens, deliver ADD's
159 lf = ctx.loopFactory(alu.getDock("inOp"), 1);
162 lf.abortLoopIfTorpedoPresent();
166 // alu.out: for each token, provide a word of count-data
167 lf = ctx.loopFactory(alu.getDock("out"), 1);
170 lf.abortLoopIfTorpedoPresent();
173 lf.sendWord(alu.getDock("in1"));
174 lf.sendToken(alu.getDock("in2"));
175 lf.sendToken(alu.getDock("inOp"));
178 lf = ctx.loopFactory(dest, 0);
179 lf.abortLoopIfTorpedoPresent();
186 public static void putMemoryShipInDispatchMode(FleetProcess fp, Ship memoryShip) {
187 CodeBag ctx = new CodeBag(fp.getFleet());
190 lf = ctx.loopFactory(memoryShip.getDock("out"), 0);
191 lf.abortLoopIfTorpedoPresent();
195 lf = ctx.loopFactory(memoryShip.getDock("inCBD"), 0);
196 lf.abortLoopIfTorpedoPresent();
203 public static void removeMemoryShipFromDispatchMode(FleetProcess fp, Ship memoryShip) {
204 fp.sendToken(memoryShip.getDock("out").getInstructionDestination());
205 fp.sendToken(memoryShip.getDock("inCBD").getInstructionDestination());
208 public static void main(String[] s) throws Exception {
209 Random random = new Random(System.currentTimeMillis());
210 Fleet fleet = Fleet.getDefaultImpl();
211 FleetProcess fp = fleet.run(new Instruction[0]);
212 Ship memory = fleet.getShip(s[0],0);
214 //int size = (548 * 478) / 2;
217 BitVector[] vals = new BitVector[size];
218 BitVector[] vals2 = new BitVector[size];
220 for(int i=0; i<vals.length; i++) {
221 vals[i] = new BitVector(fleet.getWordWidth()).set(random.nextLong());
222 for(int j=36; j<vals[i].length(); j++)
223 vals[i].set(j, false);
226 ShipPool pool = new ShipPool(fleet);
227 pool.allocateShip(memory);
228 writeMem(fp, pool, memory, 0, vals);
229 readMem(fp, pool, memory, 0, vals2);
230 System.out.println();
232 for(int i=0; i<vals.length; i++)
233 if (!vals[i].equals(vals2[i])) {
234 System.out.println("disagreement! on index " + i + "\n expected="+vals[i]+"\n got="+vals2[i]);
237 System.out.println("done! ("+fails+" failures)");
238 if (fails>0) System.exit(-1);