1 package edu.berkeley.fleet.dataflow;
3 import edu.berkeley.fleet.loops.*;
4 import edu.berkeley.fleet.api.*;
5 import edu.berkeley.fleet.fpga.*;
6 import edu.berkeley.fleet.api.Instruction.*;
7 import edu.berkeley.fleet.api.Instruction.Set;
8 import edu.berkeley.fleet.api.Instruction.Set.*;
9 import static edu.berkeley.fleet.api.Predicate.*;
12 public class MemoryNode extends Node {
13 private final Ship ship;
14 public final InPort inCBD;
15 public final InPort inAddrRead1;
16 public final InPort inAddrRead2;
17 public final InPort inAddrWrite;
18 public final InPort inDataWrite;
19 public final OutPort outRead1;
20 public final OutPort outRead2;
21 public final OutPort outWrite;
22 public MemoryNode(DataFlowGraph dfg, Ship memoryShip) {
24 this.ship = memoryShip;
27 if (ship.getType().equals("Dvi")) {
28 new DockInPort("inPixelX", ship.getDock("inPixelX"), 0, new BitVector[] { null });
29 new DockInPort("inPixelY", ship.getDock("inPixelY"), 0, new BitVector[] { null });
30 new DockInPort("inPixelValue", ship.getDock("inPixelValue"), 0, new BitVector[] { null });
33 this.inCBD = ship.getType().equals("Memory") ? new DockInPort("inCBD", ship.getDock("inCBD")) : null;
34 this.inDataWrite = new DockInPort("inDataWrite", ship.getDock("inDataWrite"));
35 this.inAddrWrite = new InPort("inAddrWrite") {
36 public void recvToken(LoopFactory lf) { lf.recvToken(); }
37 public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrWrite").getDataDestination()); }
38 public void build(CodeBag ctx) {
39 LoopFactory lf = ctx.loopFactory(ship.getDock("inAddrWrite"), 0);
40 lf.abortLoopIfTorpedoPresent();
44 public int getTokensToAbsorb() { return outWrite.peer.getTokensToAbsorb(); }
45 public int reset(CodeBag ctx, int phase, Destination ackDestination) {
46 return DoneNode.doReset(ctx, phase, ship.getDock("inAddrWrite"), this, null, ackDestination, false);
49 this.inAddrRead1 = new InPort("inAddrRead1") {
50 public void recvToken(LoopFactory lf) { lf.recvToken(); }
51 public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(0)); }
52 public void build(CodeBag ctx) { }
53 public int getTokensToAbsorb() { return outRead1.peer.getTokensToAbsorb(); }
54 public int reset(CodeBag ctx, int phase, Destination ackDestination) {
55 return DoneNode.doReset(ctx, phase, ship.getDock("inAddrRead"), this, null, ackDestination, false);
58 this.inAddrRead2 = new InPort("inAddrRead2") {
59 public void recvToken(LoopFactory lf) { lf.recvToken(); }
60 public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(1)); }
61 public void build(CodeBag ctx) { }
62 public int getTokensToAbsorb() { return outRead2.peer.getTokensToAbsorb(); }
63 public int reset(CodeBag ctx, int phase, Destination ackDestination) { return 0; }
65 this.outRead1 = new OutPort("outRead1") {
66 public void sendToken(LoopFactory lf) { inAddrRead1.peer.sendToken(lf); }
67 public void recvWord(LoopFactory lf) { lf.recvWord(); }
68 public int getNumInitialTokens() { return Math.max(1,Node.CAPACITY/2); }
69 public void build(CodeBag ctx) { }
70 public int reset(CodeBag ctx, int phase, Destination ackDestination) { return 0; }
72 this.outRead2 = new OutPort("outRead2") {
73 public void sendToken(LoopFactory lf) { inAddrRead2.peer.sendToken(lf); }
74 public void recvWord(LoopFactory lf) { lf.recvWord(); }
75 public int getNumInitialTokens() { return Math.max(1,Node.CAPACITY/2); }
76 public void build(CodeBag ctx) { }
77 public int reset(CodeBag ctx, int phase, Destination ackDestination) { return 0; }
79 this.outWrite = new DockOutPort("out", ship.getDock("out")) {
80 public void sendToken(LoopFactory lf) { inAddrWrite.peer.sendToken(lf); }
81 public void recvWord(LoopFactory lf) { lf.recvWord(); }
82 public int getTokensToAbsorb() { return 0; }
83 protected void build(CodeBag ctx, LoopFactory lf) {
85 lf.abortLoopIfTorpedoPresent();
88 lf.setFlags(FlagFunction.ONE, FlagFunction.ZERO.add(FlagC));
89 if (this.peer != null) {
90 lf.setPredicate(Predicate.FlagB);
92 lf.abortLoopIfTorpedoPresent();
93 this.peer.sendWord(lf);
96 lf.setPredicate(Predicate.NotFlagB);
97 lf.abortLoopIfTorpedoPresent();
99 lf.setFlags(FlagFunction.ZERO.add(NotFlagC).add(FlagB), FlagFunction.ZERO.add(FlagC).add(FlagB));
100 if (outRead1.peer != null) {
101 lf.setPredicate(Predicate.NotFlagB);
102 outRead1.peer.sendWord(lf);
104 if (outRead2.peer != null) {
105 lf.setPredicate(Predicate.NotFlagA);
106 outRead2.peer.sendWord(lf);
108 lf.setPredicate(null);
112 public void build(CodeBag ctx) {
116 lf = ctx.loopFactory(ship.getDock("inAddrRead"), 0);
117 lf.abortLoopIfTorpedoPresent();
119 lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
120 lf.setPredicate(Predicate.NotFlagA);
121 lf.sendToken(ship.getDock("out").getDataDestination(), new BitVector(1).set(0));
122 lf.setPredicate(Predicate.FlagA);
123 lf.sendToken(ship.getDock("out").getDataDestination(), new BitVector(1).set(1));
124 lf.setPredicate(null);
130 public static void clearMem(FleetProcess fp,
134 long count) throws RuntimeException {
136 DataFlowGraph dfg = new DataFlowGraph(fp.getFleet(), pool);
138 MemoryNode mem = new MemoryNode(dfg, memory);
139 UnPunctuatorNode discard = new UnPunctuatorNode(dfg, true);
140 discard.count.connect(new OnceNode(dfg, (int)(count)).out);
141 DebugNode debug = new DebugNode(dfg);
142 DownCounterNode c1 = new DownCounterNode(dfg);
143 c1.start.connect(new OnceNode(dfg, count).out);
144 c1.incr.connect(new OnceNode(dfg, 1).out);
145 mem.inAddrWrite.connect(c1.out);
146 mem.inDataWrite.connect(new ForeverNode(dfg, 0).out);
147 mem.outWrite.connect(discard.val);
148 discard.out.connect(debug.in);
150 CodeBag ctx = new CodeBag(fp.getFleet());
152 ctx.dispatch(fp, true);
153 System.out.println("waiting...");
155 System.out.println("... done");
160 public static void main(String[] s) throws Exception {
161 Fleet fleet = new Fpga();
163 ShipPool pool = new ShipPool(fleet);
164 Ship mem1 = pool.allocateShip("Memory");
165 Ship mem2 = pool.allocateShip("Memory");
166 Ship mem3 = pool.allocateShip("Memory");
168 fp = fleet.run(new Instruction[0]);
169 clearMem(fp, mem1, new ShipPool(fleet), 0, 16 * 1024);
172 fp = fleet.run(new Instruction[0]);
173 clearMem(fp, mem2, new ShipPool(fleet), 0, 16 * 1024);
176 fp = fleet.run(new Instruction[0]);
177 clearMem(fp, mem3, new ShipPool(fleet), 0, 16 * 1024);