lots of changes to Marina test code, mostly for scan chain counters
[fleet.git] / misc / obsolete-ships / MemoryReadShip.java
1 package edu.berkeley.fleet.interpreter.ships;
2 import edu.berkeley.fleet.interpreter.*;
3
4 import edu.berkeley.fleet.*;
5 import java.util.*;
6 import java.io.*;
7
8 public class MemoryReadShip extends InterpreterShip {
9
10     boolean _loaded = false;
11     int _count = 0;
12     int _stride = 0;
13     int _addr = 0;
14
15     DataInbox  addr   = new DataInbox(this, "addr");
16     DataInbox  stride = new DataInbox(this, "stride");
17     DataInbox  count  = new DataInbox(this, "count");
18     DataOutbox data   = new DataOutbox(this, "data");
19     TokenOutbox done  = new TokenOutbox(this, "done");
20
21     public MemoryReadShip(Interpreter fleet, String name) {
22         super(fleet, name);
23     }
24
25     public void service() {
26         if (_count > 0) {
27             if (!data.readyForDataFromShip()) return;
28             data.addDataFromShip(_addr>=getInterpreter().mem.length ? 0 : getInterpreter().mem[_addr]);
29             _count--;
30             _addr += _stride;
31             if (_count==0)
32                 done.addTokenFromShip();
33         } else {
34             if (count.dataReadyForShip() &&
35                 addr.dataReadyForShip() &&
36                 stride.dataReadyForShip() &&
37                 done.readyForTokenFromShip() &&
38                 data.readyForDataFromShip()) {
39
40                 _count  = count.removeDataForShip();
41                 _addr   = addr.removeDataForShip();
42                 _stride = stride.removeDataForShip();
43             }
44         }
45     }
46
47 }