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;
+ }
}