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