+package edu.berkeley.fleet.loops;
+import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
+import static edu.berkeley.fleet.api.Predicate.*;
+import java.io.*;
+
+public class DockOutputStream {
+ private FleetProcess fp;
+ private ShipPool pool;
+ private Dock dock;
+
+ private static final BitVector zero_bv = new BitVector(1).set(0);
+
+ public DockOutputStream(FleetProcess fp,
+ ShipPool pool,
+ Dock dock,
+ Destination sendTokenTo) throws IOException {
+
+ if (fp.getFleet() != dock.getShip().getFleet())
+ throw new RuntimeException("Fleet mismatch");
+ this.fp = fp;
+ this.pool = pool;
+ this.dock = dock;
+ pool.assertAllocated(dock.getShip());
+ pool.allocateShip(fp.getDebugInputDock().getShip());
+
+ CodeBag cb = new CodeBag(fp.getFleet());
+ LoopFactory lf;
+ lf = cb.loopFactory(dock, 0);
+ lf.abortLoopIfTorpedoPresent();
+ lf.recvWord();
+ lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
+ lf.setPredicate(Predicate.FlagA);
+ lf.sendToken(fp.getDebugInputDock());
+ lf.setPredicate(Predicate.NotFlagA);
+ if (sendTokenTo!=null) lf.sendToken(sendTokenTo);
+ lf.deliver();
+ lf.setPredicate(null);
+
+ cb.dispatch(fp);
+ }
+
+ public void writeWord(BitVector bv) {
+ fp.sendWord(dock.getDataDestination(), bv, zero_bv);
+ }
+
+ public void close() {
+ CodeBag cb = new CodeBag(fp.getFleet());
+ LoopFactory lf;
+ lf = cb.loopFactory(fp.getDebugInputDock(), 1);
+ lf.literal(0);
+ lf.recvToken();
+ lf.deliver();
+ fp.sendWord(dock.getDataDestination(),
+ new BitVector(fp.getFleet().getWordWidth()),
+ new BitVector(1).set(1));
+ cb.dispatch(fp);
+ fp.flush();
+ fp.recvWord();
+
+ fp.sendTorpedo(dock);
+ pool.releaseShip(fp.getDebugInputDock().getShip());
+ }
+}