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);
}
}