major refactoring of edu.berkeley.fleet.dataflow
[fleet.git] / src / edu / berkeley / fleet / dataflow / UnPunctuatorNode.java
index 038b388..62bf886 100644 (file)
@@ -2,16 +2,35 @@ package edu.berkeley.fleet.dataflow;
 import java.util.*;
 import edu.berkeley.fleet.loops.*;
 import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
 
+/**
+ *  Takes an item from the "count" port, then passes/drops through count-1
+ *  items from "val" to "out" and drops/passes the count-th item.
+ */
 public class UnPunctuatorNode extends Node {
     private final Ship    ship  = dfg.pool.allocateShip("Counter");
-    private final InPort  op    = new DockInPort("op",    ship.getDock("inOp"), 0, new BitVector[] {
-            ship.getDock("inOp").getConstant("PASS_C2_V1"),
-            ship.getDock("inOp").getConstant("DROP_C2_V1") } );
-
-    public  final OutPort out   = new DockOutPort("out",  ship.getDock("out"));
+    private final InPort  op    = new DockInPort("op",    ship.getDock("inOp"), "PASS_C2_V1");
     public  final InPort  val   = new DockInPort("val",   ship.getDock("in1"));
-    public  final InPort  count = new DockInPort("count", ship.getDock("in2"), 0, new BitVector[] { null, bv(1) });
+    public  final InPort  count = new DockInPort("count", ship.getDock("in2"));
+    public  final OutPort out   = new DockOutPort("out", ship.getDock("out")) {
+            protected void build(CodeBag ctx, LoopFactory lf) {
+                lf = lf.makeNext(0);
+                lf.abortLoopIfTorpedoPresent();
+                lf.collectWord();
+                lf.setFlags(FlagFunction.ZERO.add(Predicate.FlagC), FlagFunction.ZERO);
+                lf.setPredicate(passPunctuationInsteadOfValues ? Predicate.FlagA : Predicate.NotFlagA);
+                lf.abortLoopIfTorpedoPresent();
+                peer.recvToken(lf);
+                peer.sendWord(lf);
+                lf.setPredicate(null);
+            }
+        };
 
-    public UnPunctuatorNode(DataFlowGraph dfg) { super(dfg); }
+    private boolean passPunctuationInsteadOfValues;
+    public UnPunctuatorNode(DataFlowGraph dfg) { this(dfg, false); }
+    public UnPunctuatorNode(DataFlowGraph dfg, boolean passPunctuationInsteadOfValues) {
+        super(dfg);
+        this.passPunctuationInsteadOfValues = passPunctuationInsteadOfValues;
+    }
 }