-package edu.berkeley.fleet.interpreter;
-import edu.berkeley.fleet.api.*;
+package edu.berkeley.fleet.interpreter;
import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.two.*;
import java.util.*;
import java.io.*;
-/** a ship, which belongs to a fleet and which may have many ports */
-public abstract class InterpreterShip extends Ship {
+/** a ship, which belongs to a fleet and which may have many docks */
+abstract class InterpreterShip extends FleetTwoShip {
- /** You should instantiate a bunch of Inboxes and Outboxes in your constructor */
- public InterpreterShip(Interpreter fleet, String name) { this.fleet = fleet; }
+ LinkedHashMap<String,InterpreterDock> docks = new LinkedHashMap<String,InterpreterDock>();
- private Interpreter fleet;
-
- // this is dumb, the fpga fleet currently requires these in declaration-order; it shouldn't
- private ArrayList<InterpreterBenkoBox> portlist = new ArrayList<InterpreterBenkoBox>();
- private HashMap<String,InterpreterBenkoBox> ports = new HashMap<String,InterpreterBenkoBox>();
+ /** You should instantiate a bunch of Inboxes and Outboxes in your constructor */
+ public InterpreterShip(Interpreter fleet, ShipDescription sd) {
+ super(fleet, sd);
+ }
- public Iterable<BenkoBox> getBenkoBoxes() { return (Iterable<BenkoBox>)(Object)portlist; }
- public String getType() { return getClass().getSimpleName(); }
- public Fleet getFleet() { return fleet; }
- public Interpreter getInterpreter() { return fleet; }
+ public Iterator<Dock> iterator() {
+ return (Iterator<Dock>)(Object)docks.values().iterator();
+ }
/**
* Override this method, check inboxes for the data you need, and
public abstract void service();
public final void _service() {
- for(InterpreterBenkoBox p : ports.values()) p.service();
+
+ // service all the docks
+ for(InterpreterDock p : docks.values()) p.service();
+
+ // flushing logic (must come between dock servicing and subclass)
+ boolean someflushing = false;
+ boolean allflushing = true;
+ boolean someempty = false;
+ for(InterpreterDock d : docks.values()) {
+ if (!d.isInputDock()) continue;
+ if (d.flushing) someflushing = true;
+ else allflushing = false;
+ if (!d.flushing && !d.dataReadyForShip) someempty = true;
+ }
+ if (allflushing && someflushing) {
+ for(InterpreterDock d : docks.values())
+ if (d.isInputDock())
+ d.flushing = false;
+ return;
+ } else if (someflushing && !someempty) {
+ for(InterpreterDock d : docks.values())
+ if (d.isInputDock() && !d.flushing && d.dataReadyForShip)
+ d.dataReadyForShip = false;
+ }
+
+ // now pass control to the subclass
service();
}
- void addBenkoBox(String name, InterpreterBenkoBox port) { ports.put(name, port); portlist.add(port); }
-
- public void shutdown() {
- for(InterpreterBenkoBox p : ports.values())
- p.shutdown();
+ public void reset() {
+ for(InterpreterDock p : docks.values())
+ p.reset();
}
+
+ public Interpreter getInterpreter() { return (Interpreter)getFleet(); }
}