+package edu.berkeley.fleet.loops;
+import edu.berkeley.fleet.loops.*;
+import java.util.concurrent.Semaphore;
+import java.util.*;
+import java.net.*;
+import edu.berkeley.fleet.two.*;
+import edu.berkeley.fleet.fpga.*;
+import edu.berkeley.fleet.api.*;
+import edu.berkeley.fleet.api.Instruction.*;
+import edu.berkeley.fleet.api.Instruction.Set;
+import edu.berkeley.fleet.api.Instruction.Set.*;
+import edu.berkeley.fleet.api.Instruction.Set.SetDest;
+import edu.berkeley.fleet.api.Instruction.Set.FlagFunction;
+import static edu.berkeley.fleet.api.Predicate.*;
+
+public class CleanupUtils {
+
+ public static void verifyClean(FleetProcess fp) {
+ Ship debug = fp.getFleet().getShip("Debug", 0);
+ Dock debugIn = debug.getDock("in");
+
+ Context ctx;
+ LoopFactory lf;
+
+ ctx = new Context(fp.getFleet());
+ lf = new LoopFactory(ctx, debugIn, 1);
+ lf.literal(12);
+ lf.deliver();
+ lf.literal(5);
+ lf.deliver();
+ ctx.dispatch(fp);
+ fp.flush();
+
+ System.out.println("checking debug.in");
+ if (fp.recvWord().toLong() != 12) throw new RuntimeException("debug dock not properly initialized");
+ if (fp.recvWord().toLong() != 5) throw new RuntimeException("debug dock not properly initialized");
+
+ long k = 0;
+ for(Ship ship : fp.getFleet())
+ if (!"Debug".equals(ship.getType()))
+ for (Dock dock : ship) {
+ System.out.print("checking " + dock + " ");
+
+ k = (k + 23) % 65535;
+ ctx = new Context(fp.getFleet());
+
+ boolean reverse = (k%2)==0;
+
+ lf = new LoopFactory(ctx, debugIn, 4);
+ lf.recvToken();
+ lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
+ lf.setPredicate(Predicate.NotFlagA);
+ lf.literal(k);
+ lf.setPredicate(Predicate.FlagA);
+ lf.literal(k+1);
+ lf.setPredicate(null);
+ lf.deliver();
+
+ lf = new LoopFactory(ctx, dock, 1);
+ lf.sendToken(debugIn.getDataDestination(), new BitVector(1).set(reverse ? 1 : 0));
+ lf.sendToken(debugIn.getDataDestination(), new BitVector(1).set(reverse ? 0 : 1));
+ lf.sendToken(dock.getDataDestination(), new BitVector(1).set(reverse ? 1 : 0));
+ lf.sendToken(dock.getDataDestination(), new BitVector(1).set(reverse ? 0 : 1));
+ lf = lf.makeNext(2);
+
+ // if a torpedo was lying in wait, the problem will be manifest as a "freezup"
+ lf.abortLoopIfTorpedoPresent();
+
+ lf.recvToken();
+ lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
+ lf.setPredicate(Predicate.NotFlagA);
+ lf.sendToken(debugIn.getDataDestination(), new BitVector(1).set(0));
+ lf.setPredicate(Predicate.FlagA);
+ lf.sendToken(debugIn.getDataDestination(), new BitVector(1).set(1));
+ lf.setPredicate(null);
+
+ ctx.dispatch(fp);
+ fp.flush();
+
+ long kk;
+ for(int i=0; i<4; i++) {
+ kk = fp.recvWord().toLong();
+ System.out.print("\rchecking " + dock + " (got "+(i+1)+")");
+ if (kk != ((reverse ^ (i%2!=0)) ? k+1 : k)) {
+ System.out.println();
+ throw new RuntimeException(dock+" not properly initialized ("+(i+1)+")");
+ }
+ }
+ System.out.println();
+ }
+ }
+
+}