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, long[] vals) throws RuntimeException {
22 doMem(false, fp, memory, offset, long2bv(fp.getFleet(), vals));
24 public static void writeMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException {
25 doMem(false, fp, memory, offset, vals);
27 public static void doMem(final boolean read, final FleetProcess fp, final Ship memory, final long offset, final BitVector[] vals) throws RuntimeException {
28 if (fp.getFleet() != memory.getFleet())
29 throw new RuntimeException("Fleet mismatch");
31 final Dock inAddrWrite = memory.getDock("inAddrWrite");
32 final Dock inDataWrite = memory.getDock("inDataWrite");
33 final Dock inAddrRead = memory.getDock("inAddrRead");
34 final Dock out = memory.getDock("out");
35 final Dock debugIn = fp.getDebugInputDock();
37 final Semaphore sem = new Semaphore(12 /* FIXME */);
39 Context ctx = new Context(fp.getFleet());
42 lf = new LoopFactory(ctx, inAddrRead, 0);
43 lf.abortLoopIfTorpedoPresent();
47 lf = new LoopFactory(ctx, inAddrWrite, 0);
48 lf.abortLoopIfTorpedoPresent();
51 lf = new LoopFactory(ctx, inDataWrite, 0);
52 lf.abortLoopIfTorpedoPresent();
57 lf = new LoopFactory(ctx, out, 0);
58 lf.abortLoopIfTorpedoPresent();
60 lf.sendWord(debugIn.getDataDestination());
62 lf = new LoopFactory(ctx, debugIn, 0);
63 lf.abortLoopIfTorpedoPresent();
67 ArrayList<Instruction> ai = new ArrayList<Instruction>();
69 for(Instruction ins : ai)
70 fp.sendInstruction(ins);
73 public void run() { try {
74 for(int i=0; i<vals.length; i++) {
75 if (!sem.tryAcquire()) {
80 fp.sendWord(inAddrRead.getDataDestination(), new BitVector(fp.getFleet().getWordWidth()).set(i+offset));
82 fp.sendWord(inAddrWrite.getDataDestination(), new BitVector(fp.getFleet().getWordWidth()).set(i+offset));
83 fp.sendWord(inDataWrite.getDataDestination(), vals[i]);
87 } catch (Exception e) { throw new RuntimeException(e); }
91 for(int i=0; i<vals.length; i++) {
92 BitVector outv = fp.recvWord();
93 if (read) vals[i] = outv;
94 if (read) System.out.print("\rread from address: " + i + ", got " + vals[i] + " = " + vals[i].toLong()+" ");
95 else System.out.print("\rwrote to address: " + i+" ");
100 fp.sendToken(inAddrRead.getInstructionDestination());
102 fp.sendToken(inAddrWrite.getInstructionDestination());
103 fp.sendToken(inDataWrite.getInstructionDestination());
105 fp.sendToken(out.getInstructionDestination());
106 fp.sendToken(debugIn.getInstructionDestination());
107 System.out.println();
110 private static BitVector[] long2bv(Fleet fleet, long[] initialValues) {
111 BitVector[] bv = new BitVector[initialValues.length];
112 for(int i=0; i<initialValues.length; i++)
113 bv[i] = new BitVector(fleet.getWordWidth()).set(initialValues[i]);
117 public static void putMemoryShipInDispatchMode(FleetProcess fp, Ship memoryShip) {
118 Context ctx = new Context(fp.getFleet());
121 lf = new LoopFactory(ctx, memoryShip.getDock("out"), 0);
122 lf.abortLoopIfTorpedoPresent();
126 lf = new LoopFactory(ctx, memoryShip.getDock("inCBD"), 0);
127 lf.abortLoopIfTorpedoPresent();
134 public static void removeMemoryShipFromDispatchMode(FleetProcess fp, Ship memoryShip) {
135 fp.sendToken(memoryShip.getDock("out").getInstructionDestination());
136 fp.sendToken(memoryShip.getDock("inCBD").getInstructionDestination());
139 public static void main(String[] s) throws Exception {
140 Random random = new Random(System.currentTimeMillis());
141 Fleet fleet = new Fpga();
142 FleetProcess fp = fleet.run(new Instruction[0]);
143 Ship memory = fleet.getShip("DDR2",0);
144 //Ship memory = fleet.getShip("Memory",0);
145 BitVector[] vals = new BitVector[2 * 1024];
146 BitVector[] vals2 = new BitVector[2 * 1024];
147 for(int i=0; i<vals.length; i++)
148 vals[i] = new BitVector(fleet.getWordWidth()).set(random.nextLong());
149 writeMem(fp, memory, 0, vals);
150 readMem(fp, memory, 0, vals2);
151 for(int i=0; i<vals.length; i++)
152 if (!vals[i].equals(vals2[i]))
153 System.out.println("disagreement! on index " + i + "\n "+vals[i]+"\n "+vals2[i]);
154 System.out.println("done!");