break out dataflow nodes into separate classes
[fleet.git] / src / edu / berkeley / fleet / dataflow / OnceNode.java
1 package edu.berkeley.fleet.dataflow;
2 import edu.berkeley.fleet.loops.*;
3 import edu.berkeley.fleet.api.*;
4
5 public class OnceNode extends Node {
6     private BitVector bv;
7     public final OutPort out = new OutPort("out") {
8             public void sendToken(LoopFactory lf) { }
9             public void recvWord(LoopFactory lf) { }
10             public void build(Context ctx) { }
11             public void reset(Context ctx, int phase, Destination ackDestination) { }
12             public void setPeer(InPort peer) {
13                 this.peer = peer;
14                 DockInPort pip = ((DockInPort)peer);
15                 BitVector[] pip_pattern = pip.pattern;
16                 BitVector[] temp = new BitVector[pip_pattern.length * 2];
17                 int j = 0;
18                 int i = 0;
19                 boolean done = false;
20                 // FIXME: if peer.count is already 1, this gets simpler and different
21                 for(i=0; i<temp.length; i++) {
22                     if (pip_pattern[j] != null) {
23                         temp[i] = pip_pattern[j];
24                     } else {
25                         if (done) break;
26                         done = true;
27                         temp[i] = bv;
28                     }
29                     j++;
30                     if (j >= pip_pattern.length) j = 0;
31                 }
32                 pip.pattern = new BitVector[i];
33                 System.arraycopy(temp, 0, pip.pattern, 0, i);
34                 pip.count = 1;
35             }
36         };
37     public OnceNode(DataFlowGraph dfg, long l) { this(dfg, new BitVector(dfg.fleet.getWordWidth()).set(l)); }
38     public OnceNode(DataFlowGraph dfg, final BitVector bv) { super(dfg); this.bv = bv; }
39 }