ParameterNode: deal gracefully with the case where the node has no peer
[fleet.git] / src / edu / berkeley / fleet / dataflow / ParameterNode.java
1 package edu.berkeley.fleet.dataflow;
2 import java.util.*;
3 import edu.berkeley.fleet.loops.*;
4 import edu.berkeley.fleet.api.*;
5
6 // derived from OnceNode
7 public class ParameterNode extends Node {
8
9     private boolean forever;
10
11     public void set(CodeBag ctx, long l) {
12         set(ctx, new BitVector(ctx.fleet.getWordWidth()).set(l));
13     }
14     public void set(CodeBag ctx, BitVector bv) {
15         if (out==null || out.peer==null) return;
16         ctx.sendWord(bv, ((DockInPort)out.peer).dock.getDataDestination());
17     }
18
19     public final OutPort out = new OutPort("out") {
20             public void sendToken(LoopFactory lf) { }
21             public void recvWord(LoopFactory lf) { if (!forever) lf.recvWord(); }
22             public void build(CodeBag ctx) { }
23             public int  reset(CodeBag ctx, int phase,
24                               Destination ackDestination) {
25                 return 0; }
26             public void setPeer(InPort peer) {
27                 this.peer = peer;
28                 DockInPort pip = ((DockInPort)peer);
29                 BitVector[] pip_pattern = pip.pattern;
30
31                 if (forever) {
32                     pip.sticky = true;
33                     return;
34                 }
35
36                 BitVector[] temp = new BitVector[pip_pattern.length * 2];
37                 int j = 0;
38                 int i = 0;
39                 boolean done = false;
40                 // FIXME: if peer.count is already 1, this gets simpler and different
41                 for(i=0; i<temp.length; i++) {
42                     if (pip_pattern[j] != null) {
43                         temp[i] = pip_pattern[j];
44                     } else {
45                         if (done) break;
46                         done = true;
47                         //temp[i] = bv;
48                     }
49                     j++;
50                     if (j >= pip_pattern.length) j = 0;
51                 }
52                 pip.pattern = new BitVector[i];
53                 System.arraycopy(temp, 0, pip.pattern, 0, i);
54                 pip.count = 1;
55             }
56         };
57     public ParameterNode(DataFlowGraph dfg) { this(dfg, false); }
58     public ParameterNode(DataFlowGraph dfg, boolean forever) { super(dfg); this.forever = forever; }
59 }