add DockInputStream, DockOutputStream
[fleet.git] / src / edu / berkeley / fleet / loops / DockOutputStream.java
1 package edu.berkeley.fleet.loops;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
4 import static edu.berkeley.fleet.api.Predicate.*;
5 import java.io.*;
6
7 public class DockOutputStream {
8     private FleetProcess fp;
9     private ShipPool pool;
10     private Dock dock;
11
12     private static final BitVector zero_bv = new BitVector(1).set(0);
13
14     public DockOutputStream(FleetProcess fp,
15                             ShipPool pool,
16                             Dock dock,
17                             Destination sendTokenTo) throws IOException {
18
19         if (fp.getFleet() != dock.getShip().getFleet())
20             throw new RuntimeException("Fleet mismatch");
21         this.fp = fp;
22         this.pool = pool;
23         this.dock = dock;
24         pool.assertAllocated(dock.getShip());
25         pool.allocateShip(fp.getDebugInputDock().getShip());
26
27         CodeBag cb = new CodeBag(fp.getFleet());
28         LoopFactory lf;
29         lf = cb.loopFactory(dock, 0);
30         lf.abortLoopIfTorpedoPresent();
31         lf.recvWord();
32         lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
33         lf.setPredicate(Predicate.FlagA);
34         lf.sendToken(fp.getDebugInputDock());
35         lf.setPredicate(Predicate.NotFlagA);
36         if (sendTokenTo!=null) lf.sendToken(sendTokenTo);
37         lf.deliver();
38         lf.setPredicate(null);
39
40         cb.dispatch(fp);
41     }
42
43     public void writeWord(BitVector bv) {
44         fp.sendWord(dock.getDataDestination(), bv, zero_bv);
45     }
46
47     public void close() {
48         CodeBag cb = new CodeBag(fp.getFleet());
49         LoopFactory lf;
50         lf = cb.loopFactory(fp.getDebugInputDock(), 1);
51         lf.literal(0);
52         lf.recvToken();
53         lf.deliver();
54         fp.sendWord(dock.getDataDestination(),
55                     new BitVector(fp.getFleet().getWordWidth()),
56                     new BitVector(1).set(1));
57         cb.dispatch(fp);
58         fp.flush();
59         fp.recvWord();
60
61         fp.sendTorpedo(dock);
62         pool.releaseShip(fp.getDebugInputDock().getShip());
63     }
64 }