move Gadgets to MemoryUtils, discard a ton of obsolete junk
[fleet.git] / src / edu / berkeley / fleet / loops / MemoryUtils.java
1 package edu.berkeley.fleet.loops;
2 import edu.berkeley.fleet.loops.*;
3 import java.util.concurrent.Semaphore;
4 import java.util.*;
5 import java.net.*;
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.*;
15
16 public class MemoryUtils {
17
18     public static void readMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException {
19         doMem(true, fp, memory, offset, vals);
20     }
21     public static void writeMem(FleetProcess fp, Ship memory, long offset, BitVector[] vals) throws RuntimeException {
22         doMem(false, fp, memory, offset, vals);
23     }
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");
27
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();
33
34         final Semaphore sem = new Semaphore(12 /* FIXME */);
35
36         Context ctx = new Context(fp.getFleet());
37         LoopFactory lf;
38         if (read) {
39             lf = new LoopFactory(ctx, inAddrRead, 0);
40             lf.abortLoopIfTorpedoPresent();
41             lf.recvWord();
42             lf.deliver();
43         } else {
44             lf = new LoopFactory(ctx, inAddrWrite, 0);
45             lf.abortLoopIfTorpedoPresent();
46             lf.recvWord();
47             lf.deliver();
48             lf = new LoopFactory(ctx, inDataWrite, 0);
49             lf.abortLoopIfTorpedoPresent();
50             lf.recvWord();
51             lf.deliver();
52         }
53
54         lf = new LoopFactory(ctx, out, 0);
55         lf.abortLoopIfTorpedoPresent();
56         lf.collectWord();
57         lf.sendWord(debugIn.getDataDestination());
58
59         lf = new LoopFactory(ctx, debugIn, 0);
60         lf.abortLoopIfTorpedoPresent();
61         lf.recvWord();
62         lf.deliver();
63
64         ArrayList<Instruction> ai = new ArrayList<Instruction>();
65         ctx.emit(ai);
66         for(Instruction ins : ai)
67             fp.sendInstruction(ins);
68
69         new Thread() {
70             public void run() { try {
71                     for(int i=0; i<vals.length; i++) {
72                         if (!sem.tryAcquire()) {
73                             fp.flush();
74                             sem.acquire();
75                         }
76                         if (read) {
77                             fp.sendWord(inAddrRead.getDataDestination(), new BitVector(fp.getFleet().getWordWidth()).set(i+offset));
78                         } else {
79                             fp.sendWord(inAddrWrite.getDataDestination(), new BitVector(fp.getFleet().getWordWidth()).set(i+offset));
80                             fp.sendWord(inDataWrite.getDataDestination(), vals[i]);
81                         }
82                     }
83                     fp.flush();
84                 } catch (Exception e) { throw new RuntimeException(e); }
85                 }
86         }.start();
87
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+"           ");
93             sem.release();
94         }
95
96         if (read) {
97             fp.sendToken(inAddrRead.getInstructionDestination());
98         } else {
99             fp.sendToken(inAddrWrite.getInstructionDestination());
100             fp.sendToken(inDataWrite.getInstructionDestination());
101         }
102         fp.sendToken(out.getInstructionDestination());
103         fp.sendToken(debugIn.getInstructionDestination());
104         System.out.println();
105     }
106
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!");
123     }
124 }