update with ZOMA and new memread/memwrite
[fleet.git] / src / edu / berkeley / fleet / MemWriteShip.java
index 7c02b4b..994b16e 100644 (file)
@@ -5,19 +5,49 @@ import java.io.*;
 
 public class MemWriteShip extends Ship {
 
-    Inbox addr  = new Inbox("addr");
-    Inbox data  = new Inbox("data");
-    Outbox done = new Outbox("done");
+    boolean _loaded = false;
+    int     _count  = 0;
+    int     _stride = 0;
+    int     _addr   = 0;
+
+    Inbox  addr   = new Inbox("addr");
+    Inbox  data   = new Inbox("data");
+    Inbox  stride = new Inbox("stride");
+    Inbox  count  = new Inbox("count");
+    Outbox token  = new Outbox("token");
+    Outbox done   = new Outbox("done");
 
     public MemWriteShip(Fleet fleet, String name) {
         super(fleet, name);
     }
 
     public void service() {
-        // note that the memory interface is pipelined (buffered)
-        if (!addr.empty() && !data.empty()) {
-            fleet.mem[addr.remove()] = data.remove();
-            done.add(0);
+        if (_loaded) {
+            if (_count <= 0) { _count = 0; _loaded = false; done.add(0); return; }
+            if (data.empty()) return;
+            if (!token.empty()) return;
+        } else {
+            if (addr.empty() || stride.empty() || count.empty() || data.empty()) return;
+            _count = count.remove();
+            _addr = addr.remove();
+            _stride = stride.remove();
+            if (_count > 0) {
+                _loaded = true;
+                return;
+            }
+        }
+        int dat = data.remove();
+        if (_addr >= fleet.mem.length) {
+            int[] mem2 = new int[_addr + 100];
+            System.arraycopy(fleet.mem, 0, mem2, 0, fleet.mem.length);
+            fleet.mem = mem2;
+        }
+        System.out.println("write_mem["+_addr+"] = " + dat);
+        fleet.mem[_addr] = dat;
+        _count--;
+        _addr += _stride;
+        if (_loaded) {
+            token.add(0);
         }
     }