1 package edu.berkeley.fleet.loops;
2 import edu.berkeley.fleet.loops.*;
3 import java.util.concurrent.Semaphore;
6 import edu.berkeley.fleet.two.*;
7 import edu.berkeley.fleet.fpga.*;
8 import edu.berkeley.fleet.api.*;
9 import edu.berkeley.fleet.api.Instruction.*;
10 import edu.berkeley.fleet.api.Instruction.Set;
11 import edu.berkeley.fleet.api.Instruction.Set.*;
12 import edu.berkeley.fleet.api.Instruction.Set.SetDest;
13 import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
14 import static edu.berkeley.fleet.api.Predicate.*;
16 public class MemoryUtils {
18 public static void readMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException {
19 doMem(true, fp, memory, offset, vals);
21 public static void writeMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException {
22 doMem(false, fp, memory, offset, vals);
24 public static void doMem(final boolean read, final FleetProcess fp, final Ship memory, final long offset, final BitVector[] vals) throws RuntimeException {
25 if (fp.getFleet() != memory.getFleet())
26 throw new RuntimeException("Fleet mismatch");
28 final Dock inAddrWrite = memory.getDock("inAddrWrite");
29 final Dock inDataWrite = memory.getDock("inDataWrite");
30 final Dock inAddrRead = memory.getDock("inAddrRead");
31 final Dock out = memory.getDock("out");
32 final Dock debugIn = fp.getDebugInputDock();
34 final Semaphore sem = new Semaphore(12 /* FIXME */);
36 Context ctx = new Context(fp.getFleet());
39 lf = new LoopFactory(ctx, inAddrRead, 0);
40 lf.abortLoopIfTorpedoPresent();
44 lf = new LoopFactory(ctx, inAddrWrite, 0);
45 lf.abortLoopIfTorpedoPresent();
48 lf = new LoopFactory(ctx, inDataWrite, 0);
49 lf.abortLoopIfTorpedoPresent();
54 lf = new LoopFactory(ctx, out, 0);
55 lf.abortLoopIfTorpedoPresent();
57 lf.sendWord(debugIn.getDataDestination());
59 lf = new LoopFactory(ctx, debugIn, 0);
60 lf.abortLoopIfTorpedoPresent();
64 ArrayList<Instruction> ai = new ArrayList<Instruction>();
66 for(Instruction ins : ai)
67 fp.sendInstruction(ins);
70 public void run() { try {
71 for(int i=0; i<vals.length; i++) {
72 if (!sem.tryAcquire()) {
77 fp.sendWord(inAddrRead.getDataDestination(), new BitVector(fp.getFleet().getWordWidth()).set(i+offset));
79 fp.sendWord(inAddrWrite.getDataDestination(), new BitVector(fp.getFleet().getWordWidth()).set(i+offset));
80 fp.sendWord(inDataWrite.getDataDestination(), vals[i]);
84 } catch (Exception e) { throw new RuntimeException(e); }
88 for(int i=0; i<vals.length; i++) {
89 BitVector outv = fp.recvWord();
90 if (read) vals[i] = outv;
91 if (read) System.out.print("\rread from address: " + i + ", got " + vals[i] + " = " + vals[i].toLong()+" ");
92 else System.out.print("\rwrote to address: " + i+" ");
97 fp.sendToken(inAddrRead.getInstructionDestination());
99 fp.sendToken(inAddrWrite.getInstructionDestination());
100 fp.sendToken(inDataWrite.getInstructionDestination());
102 fp.sendToken(out.getInstructionDestination());
103 fp.sendToken(debugIn.getInstructionDestination());
104 System.out.println();
107 public static void main(String[] s) throws Exception {
108 Random random = new Random(System.currentTimeMillis());
109 Fleet fleet = new Fpga();
110 FleetProcess fp = fleet.run(new Instruction[0]);
111 Ship memory = fleet.getShip("DDR2",0);
112 //Ship memory = fleet.getShip("Memory",0);
113 BitVector[] vals = new BitVector[2 * 1024];
114 BitVector[] vals2 = new BitVector[2 * 1024];
115 for(int i=0; i<vals.length; i++)
116 vals[i] = new BitVector(fleet.getWordWidth()).set(random.nextLong());
117 writeMem(fp, memory, 0, vals);
118 readMem(fp, memory, 0, vals2);
119 for(int i=0; i<vals.length; i++)
120 if (!vals[i].equals(vals2[i]))
121 System.out.println("disagreement! on index " + i + "\n "+vals[i]+"\n "+vals2[i]);
122 System.out.println("done!");