mild overhaul of Interpreter; now capable of performing MergeSort
[fleet.git] / src / edu / berkeley / fleet / interpreter / InterpreterShip.java
index d4465ab..85358fa 100644 (file)
@@ -1,26 +1,23 @@
-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
@@ -30,14 +27,39 @@ public abstract class InterpreterShip extends Ship {
     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(); }
 }