68414ca2a39648cadfc05b93d63270553e120332
[fleet.git] / src / edu / berkeley / fleet / dataflow / MemoryNode.java
1 package edu.berkeley.fleet.dataflow;
2 import java.util.*;
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.*;
9
10
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) {
22         super(dfg);
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);
34                 }
35             };
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; }
42             };
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; }
48             };
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; }
54             };
55         this.outWrite = new DockOutPort("out", ship.getDock("out")) {
56                 protected void build(Context ctx, LoopFactory lf) {
57                     lf = lf.makeNext(0);
58                     lf.abortLoopIfTorpedoPresent();
59                     lf.collectWord();
60                         
61                     lf.setFlags(FlagFunction.ZERO, FlagFunction.ZERO.add(FlagC));
62                     if (this.peer != null) {
63                         lf.setPredicate(Predicate.FlagB);
64                         lf.literal(77);
65                         lf.abortLoopIfTorpedoPresent();
66                         this.peer.recvToken(lf);
67                         this.peer.sendWord(lf);
68                     }
69                         
70                     lf.setPredicate(Predicate.NotFlagB);
71                     lf.abortLoopIfTorpedoPresent();
72                     lf.recvToken();
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);
77                     }
78                     if (outRead2.peer != null) {
79                         lf.setPredicate(Predicate.NotFlagA);
80                         outRead2.peer.sendWord(lf);
81                     }
82                     lf.setPredicate(null);
83                 }
84             };
85     }
86     public void build(Context ctx) {
87         super.build(ctx);
88         LoopFactory lf;
89
90         lf = new LoopFactory(ctx, ship.getDock("inAddrRead"), 0);
91         lf.abortLoopIfTorpedoPresent();
92         lf.recvWord();
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);
99         lf.deliver();
100     }
101 }