update with ZOMA and new memread/memwrite
[fleet.git] / src / edu / berkeley / fleet / MemReadShip.java
index 96060fc..24e9ce7 100644 (file)
@@ -5,17 +5,41 @@ import java.io.*;
 
 public class MemReadShip extends Ship {
 
-    Inbox addr  = new Inbox("addr");
-    Outbox data = new Outbox("data");
+    boolean _loaded = false;
+    int _count = 0;
+    int _stride = 0;
+    int _addr = 0;
+
+    Inbox  addr   = new Inbox("addr");
+    Inbox  token  = new Inbox("token");
+    Inbox  stride = new Inbox("stride");
+    Inbox  count  = new Inbox("count");
+    Outbox data   = new Outbox("data");
+    Outbox done   = new Outbox("done");
 
     public MemReadShip(Fleet fleet, String name) {
         super(fleet, name);
     }
 
     public void service() {
-        // note that the memory interface is pipelined (buffered)
-        if (!addr.empty())
-            data.add(fleet.mem[addr.remove()]);
+        if (_loaded) {
+            if (_count <= 0) { _count = 0; _loaded = false; done.add(0); return; }
+            if (token.empty()) return;
+            token.remove();
+        } else {
+            if (addr.empty() || stride.empty() || count.empty()) return;
+            _count = count.remove();
+            _addr = addr.remove();
+            _stride = stride.remove();
+            if (_count > 0) {
+                _loaded = true;
+                return;
+            }
+        }
+        System.out.println("read_mem["+_addr+"]");
+        data.add(_addr>=fleet.mem.length ? 0 : fleet.mem[_addr]);
+        _count--;
+        _addr += _stride;
     }
 
 }