1 package edu.berkeley.fleet.dataflow;
3 import edu.berkeley.fleet.loops.*;
4 import edu.berkeley.fleet.api.*;
5 import edu.berkeley.fleet.api.Instruction.*;
6 import edu.berkeley.fleet.api.Instruction.Set;
7 import edu.berkeley.fleet.api.Instruction.Set.*;
8 import static edu.berkeley.fleet.api.Predicate.*;
11 public class MemoryNode extends Node {
12 public final Ship ship;
13 public final InPort inCBD;
14 public final InPort inAddrRead1;
15 public final InPort inAddrRead2;
16 public final InPort inAddrWrite;
17 public final InPort inDataWrite;
18 public final OutPort outRead1;
19 public final OutPort outRead2;
20 public final OutPort outWrite;
21 public MemoryNode(DataFlowGraph dfg, Ship memoryShip) {
23 this.ship = memoryShip;
24 this.inCBD = ship.getType().equals("Memory") ? new DockInPort("inCBD", ship.getDock("inCBD")) : null;
25 this.inAddrWrite = new DockInPort("inAddrWrite", ship.getDock("inAddrWrite"));
26 this.inDataWrite = new DockInPort("inDataWrite", ship.getDock("inDataWrite"));
27 this.inAddrRead1 = new InPort("inAddrRead1") {
28 public void recvToken(LoopFactory lf) { lf.recvToken(); }
29 public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(0)); }
30 public void build(Context ctx) { }
31 public int getTokensToAbsorb() { return outRead1.peer.getTokensToAbsorb(); }
32 public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) {
33 return doReset(ctx, phase, ship.getDock("inAddrRead"), null, ackDestination, sendTorpedoesTo, false);
36 this.inAddrRead2 = new InPort("inAddrRead2") {
37 public void recvToken(LoopFactory lf) { lf.recvToken(); }
38 public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(1)); }
39 public void build(Context ctx) { }
40 public int getTokensToAbsorb() { return outRead2.peer.getTokensToAbsorb(); }
41 public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
43 this.outRead1 = new OutPort("outRead1") {
44 public void sendToken(LoopFactory lf) { inAddrRead1.peer.sendToken(lf); }
45 public void recvWord(LoopFactory lf) { lf.recvWord(); }
46 public void build(Context ctx) { }
47 public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
49 this.outRead2 = new OutPort("outRead2") {
50 public void sendToken(LoopFactory lf) { inAddrRead2.peer.sendToken(lf); }
51 public void recvWord(LoopFactory lf) { lf.recvWord(); }
52 public void build(Context ctx) { }
53 public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
55 this.outWrite = new DockOutPort("out", ship.getDock("out")) {
56 protected void build(Context ctx, LoopFactory lf) {
58 lf.abortLoopIfTorpedoPresent();
61 lf.setFlags(FlagFunction.ZERO, FlagFunction.ZERO.add(FlagC));
62 if (this.peer != null) {
63 lf.setPredicate(Predicate.FlagB);
65 lf.abortLoopIfTorpedoPresent();
66 this.peer.recvToken(lf);
67 this.peer.sendWord(lf);
70 lf.setPredicate(Predicate.NotFlagB);
71 lf.abortLoopIfTorpedoPresent();
73 lf.setFlags(FlagFunction.ZERO.add(NotFlagC).add(FlagB), FlagFunction.ZERO.add(FlagC).add(FlagB));
74 if (outRead1.peer != null) {
75 lf.setPredicate(Predicate.NotFlagB);
76 outRead1.peer.sendWord(lf);
78 if (outRead2.peer != null) {
79 lf.setPredicate(Predicate.NotFlagA);
80 outRead2.peer.sendWord(lf);
82 lf.setPredicate(null);
86 public void build(Context ctx) {
90 lf = new LoopFactory(ctx, ship.getDock("inAddrRead"), 0);
91 lf.abortLoopIfTorpedoPresent();
93 lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
94 lf.setPredicate(Predicate.NotFlagA);
95 lf.sendToken(ship.getDock("out").getDataDestination(), new BitVector(1).set(0));
96 lf.setPredicate(Predicate.FlagA);
97 lf.sendToken(ship.getDock("out").getDataDestination(), new BitVector(1).set(1));
98 lf.setPredicate(null);