package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
-import java.util.concurrent.Semaphore;
+import edu.berkeley.fleet.api.*;
import java.util.*;
import java.net.*;
-import edu.berkeley.fleet.two.*;
-import edu.berkeley.fleet.api.*;
-import edu.berkeley.fleet.fpga.*;
-import edu.berkeley.fleet.api.Instruction.*;
-import edu.berkeley.fleet.api.Instruction.Set;
-import edu.berkeley.fleet.api.Instruction.Set.*;
-import static edu.berkeley.fleet.api.Predicate.*;
-import static edu.berkeley.fleet.util.BitManipulations.*;
-
-// does peer.recvWord() have to honor the currently-set predicate?
// public class ReplaceNode extends Node { }
// public class CountMergeNode extends Node { }
// public class SortMergeNode extends Node { }
// public class FanOutNode extends Node { }
-// public class MemoryNode extends Node { }
// public class DoneNode extends Node { }
public class DataFlowGraph {
public final ShipPool pool;
private HashSet<Node> nodes = new HashSet<Node>();
- public static HashSet<Dock> torpedoes = new HashSet<Dock>();
-
- public DataFlowGraph(Fleet fleet) {
- this(fleet, new ShipPool(fleet));
- }
+ public DataFlowGraph(Fleet fleet) { this(fleet, new ShipPool(fleet)); }
public DataFlowGraph(Fleet fleet, ShipPool pool) {
this.fleet = fleet;
this.pool = pool;
for(Node mod : nodes)
mod.build(ctx);
}
- public int reset(Context ctx, int phase, Destination ackDestination) {
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) {
int ret = 0;
- torpedoes.clear();
for(Node mod : nodes)
- ret += mod.reset(ctx, phase, ackDestination);
+ ret += mod.reset(ctx, phase, ackDestination, sendTorpedoesTo);
return ret;
}
}
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
public void sendToken(LoopFactory lf) { }
public void recvWord(LoopFactory lf) { }
public void build(Context ctx) { }
- public int reset(Context ctx, int phase, Destination ackDestination) { return 0; }
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
public void setPeer(InPort peer) {
this.peer = peer;
DockInPort pip = ((DockInPort)peer);
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
import edu.berkeley.fleet.api.Instruction.*;
public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(0)); }
public void build(Context ctx) { }
public int getTokensToAbsorb() { return outRead1.peer.getTokensToAbsorb(); }
- public int reset(Context ctx, int phase, Destination ackDestination) {
- return doReset(ctx, phase, ship.getDock("inAddrRead"), null, ackDestination, false);
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) {
+ return doReset(ctx, phase, ship.getDock("inAddrRead"), null, ackDestination, sendTorpedoesTo, false);
}
};
this.inAddrRead2 = new InPort("inAddrRead2") {
public void sendWord(LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(1)); }
public void build(Context ctx) { }
public int getTokensToAbsorb() { return outRead2.peer.getTokensToAbsorb(); }
- public int reset(Context ctx, int phase, Destination ackDestination) { return 0; }
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
};
this.outRead1 = new OutPort("outRead1") {
public void sendToken(LoopFactory lf) { inAddrRead1.peer.sendToken(lf); }
public void recvWord(LoopFactory lf) { lf.recvWord(); }
public void build(Context ctx) { }
- public int reset(Context ctx, int phase, Destination ackDestination) { return 0; }
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
};
this.outRead2 = new OutPort("outRead2") {
public void sendToken(LoopFactory lf) { inAddrRead2.peer.sendToken(lf); }
public void recvWord(LoopFactory lf) { lf.recvWord(); }
public void build(Context ctx) { }
- public int reset(Context ctx, int phase, Destination ackDestination) { return 0; }
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
};
this.outWrite = new DockOutPort("out", ship.getDock("out")) {
protected void build(Context ctx, LoopFactory lf) {
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
import edu.berkeley.fleet.fpga.*;
ctx2 = new Context(fp.getFleet());
Destination ackDestination = counter.getDock("in2").getDataDestination();
- int expected_tokens = proc.reset(ctx2, phase, ackDestination);
+ HashSet<Dock> sendTorpedoesTo = new HashSet<Dock>();
+ int expected_tokens = proc.reset(ctx2, phase, ackDestination, sendTorpedoesTo);
Context ctx3 = new Context(fp.getFleet());
lf = new LoopFactory(ctx3, counter.getDock("inOp"), 1);
lf.sendToken(debugIn.getDataDestination());
ctx3.dispatch(fp); // HACK: we don't check to make sure that this is "firmly in place"
- for(Dock dock : DataFlowGraph.torpedoes) fp.sendToken(dock.getInstructionDestination());
+ for(Dock dock : sendTorpedoesTo) fp.sendToken(dock.getInstructionDestination());
ctx2.dispatch(fp);
fp.flush();
System.out.println("flushed");
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import java.util.concurrent.Semaphore;
import java.util.*;
public class Node {
- int doReset(Context ctx, int phase, Dock dock, Port peer, Destination ackDestination, boolean peerUsed) {
+ int doReset(Context ctx, int phase, Dock dock, Port peer, Destination ackDestination, HashSet<Dock> sendTorpedoesTo, boolean peerUsed) {
int ret = 0;
if (dock.getShip().getType().equals("Debug")) return ret;
// the switch fabric.
case 0: {
if (!dock.isInputDock()) {
- DataFlowGraph.torpedoes.add(dock);
+ sendTorpedoesTo.add(dock);
LoopFactory lf = new LoopFactory(ctx, dock, 1);
lf.sendToken(ackDestination);
lf = lf.makeNext(0);
// Phase 1: torpedo every input dock, put it in loopback mode
case 1: {
if (dock.isInputDock()) {
- DataFlowGraph.torpedoes.add(dock);
+ sendTorpedoesTo.add(dock);
LoopFactory lf = new LoopFactory(ctx, dock, 1);
lf.sendToken(ackDestination);
// Phase 2: torpedo every output dock, have it absorb tokens
case 2: {
if (!dock.isInputDock()) {
- DataFlowGraph.torpedoes.add(dock);
+ sendTorpedoesTo.add(dock);
LoopFactory lf = new LoopFactory(ctx, dock, 1);
if (peer != null)
for(int i=0; i<((InPort)peer).getTokensToAbsorb(); i++)
case 3: {
if (dock.isInputDock()) {
if (peerUsed && peer!=null) {
- DataFlowGraph.torpedoes.add(dock);
+ sendTorpedoesTo.add(dock);
}
LoopFactory lf = new LoopFactory(ctx, dock, 1);
lf.sendToken(ackDestination);
public OutPort getOutPort(String name) { return (OutPort)ports.get(name); }
public void build(Context ctx) { for(Port p : ports.values()) p.build(ctx); }
- public int reset(Context ctx, int phase, Destination ackDestination) {
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) {
int ret = 0;
- for(Port p : ports.values()) ret += p.reset(ctx, phase, ackDestination);
+ for(Port p : ports.values()) ret += p.reset(ctx, phase, ackDestination, sendTorpedoesTo);
return ret;
}
Node.this.ports.put(name,this);
}
public abstract void build(Context ctx);
- public abstract int reset(Context ctx, int phase, Destination ackDestination);
+ public abstract int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo);
}
public abstract class InPort extends Port {
for(int i=0; i<pattern.length; i++) if (pattern[i]==null) return true;
return false;
}
- public int reset(Context ctx, int phase, Destination ackDestination) {
- return doReset(ctx, phase, dock, peer, ackDestination, peerUsed());
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) {
+ return doReset(ctx, phase, dock, peer, ackDestination, sendTorpedoesTo, peerUsed());
}
protected void build(Context ctx, LoopFactory lf) {
int inflight = (count != 0 && count < getInflight()) ? count : getInflight();
lf.collectWord();
peer.sendWord(lf);
}
- public int reset(Context ctx, int phase, Destination ackDestination) {
- return doReset(ctx, phase, dock, peer, ackDestination, true);
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) {
+ return doReset(ctx, phase, dock, peer, ackDestination, sendTorpedoesTo, true);
}
}
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
public void sendToken(LoopFactory lf) { }
public void recvWord(LoopFactory lf) { }
public void build(Context ctx) { }
- public int reset(Context ctx, int phase, Destination ackDestination) { return 0; }
+ public int reset(Context ctx, int phase, Destination ackDestination, HashSet<Dock> sendTorpedoesTo) { return 0; }
public void setPeer(InPort peer) {
this.peer = peer;
DockInPort pip = ((DockInPort)peer);
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;
package edu.berkeley.fleet.dataflow;
+import java.util.*;
import edu.berkeley.fleet.loops.*;
import edu.berkeley.fleet.api.*;