major refactoring of edu.berkeley.fleet.dataflow
[fleet.git] / src / edu / berkeley / fleet / dataflow / PunctuatorNode.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.Set.FlagFunction;
6
7 /**
8  *  Takes an item from "count", passes that many items from "val" to
9  *  "out", and then supplies one instance of "punc" at "out".
10  */
11 public class PunctuatorNode extends Node {
12     private final long    punc;
13     public  final InPort  count;
14     private final Ship    ship  = dfg.pool.allocateShip("Counter");
15     private final InPort  op    = new DockInPort("inOp", ship.getDock("inOp"), "PASS_C2_V1");
16     public  final InPort  val   = new DockInPort("val",  ship.getDock("in1"));
17     public  final OutPort out   = new DockOutPort("out", ship.getDock("out")) {
18             protected void build(CodeBag ctx, LoopFactory lf) {
19                 lf = lf.makeNext(0);
20                 lf.abortLoopIfTorpedoPresent();
21                 peer.recvToken(lf);
22                 lf.collectWord();
23                 peer.sendWord(lf);
24
25                 lf.literal(punc);
26                 lf.setFlags(FlagFunction.ZERO.add(Predicate.FlagC), FlagFunction.ZERO);
27                 lf.setPredicate(Predicate.FlagA);
28                 peer.recvToken(lf);
29                 peer.sendWord(lf);
30                 lf.setPredicate(null);
31             }
32         };
33
34     public PunctuatorNode(DataFlowGraph dfg, long punc) {
35         super(dfg);
36         this.punc = punc;
37         this.count = new DockInPort("in2", ship.getDock("in2"));
38     }
39 }