add commented-out version of UnPunctuatorNode2 to UnPunctuatorNode until I have time...
[fleet.git] / src / edu / berkeley / fleet / Main.java
index a65c608..885e0c1 100644 (file)
@@ -1,9 +1,10 @@
 package edu.berkeley.fleet;
 import edu.berkeley.sbp.util.ANSI;
 import edu.berkeley.fleet.api.*;
-import edu.berkeley.fleet.slipway.*;
-import edu.berkeley.fleet.doc.*;
+import edu.berkeley.fleet.fpga.*;
 import edu.berkeley.fleet.interpreter.*;
+import edu.berkeley.fleet.two.*;
+import edu.berkeley.fleet.util.*;
 import java.io.*;
 import java.util.*;
 
@@ -33,54 +34,44 @@ public class Main {
         }
 
         String target = options.get("target");
-        Fleet fleet;
-        if ("fpga".equals(target)) {
-            String bitfile = options.get("bitfile");
-            fleet = bitfile == null ? new Slipway() : new Slipway(bitfile);
-        } else if ("sim".equals(target) || "fleetsim".equals(target)) {
-            fleet = (Fleet)Class.forName("com.sunlabs.fleetsim.fleet.FleetDescription").newInstance();
-        } else {
-            fleet = new Interpreter();
-        }
+        Fleet fleet = Fleet.getDefaultImpl();
 
         if (!"yes".equals(options.get("verbose")))
             Log.log = null;
 
         if (command.equals("run")) {
             InputStream is;
-            if (args.size()==0) {
-                ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                Reader r = new InputStreamReader(System.in);
-                edu.berkeley.fleet.assembler.Main.assemble(fleet, r, baos);
-                is = new ByteArrayInputStream(baos.toByteArray());
-            } else {
-                String filename = args.get(0);
-                if (filename.endsWith(".fa") || filename.endsWith(".fleet")) {
-                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-                    Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
-                    edu.berkeley.fleet.assembler.Main.assemble(fleet, r, baos);
-                    is = new ByteArrayInputStream(baos.toByteArray());
-                } else {
-                    is = new FileInputStream(args.get(0));
-                }
-            }
-            run(fleet, is);
+            String filename = args.get(0);
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
+            run(fleet, edu.berkeley.fleet.assembler.Main.assemble(fleet, r));
 
         } else if (command.equals("expand")) {
-            fleet.expand(new ShipDescription(args.get(0), new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
+            String name = new File(args.get(0)).getName();
+            if (name.endsWith(".ship"))
+                name = name.substring(0, name.length() - ".ship".length());
+            if (fleet instanceof edu.berkeley.fleet.fpga.Fpga) {
+                ((edu.berkeley.fleet.fpga.Fpga)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
+            } else {
+                ((Interpreter)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
+            }
 
         } else if (command.equals("doc")) {
-            Doc.print();
+            if (!new File(".tmp").exists())
+                new File(".tmp").mkdirs();
+            PrintWriter pw = new PrintWriter(new FileOutputStream(".tmp/FleetTwo.Manual.tex"));
+            BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("doc/archman.tex")));
+            for(String ss = br.readLine(); ss!=null; ss = br.readLine())
+                pw.println(ss);
+            for(String f : new File("ships").list()) {
+                new ShipDescription(fleet, f, new BufferedReader(new InputStreamReader(new FileInputStream(new File("ships/"+f))))).printTeX(pw);
+            }
+            pw.println("\\end{document}");
+            pw.close();
 
         } else if (command.equals("test")) {
-            test(fleet, new File(args.get(0)));
-        } else if (command.equals("asm")) {
-            String filename = args.get(0);
-            FileOutputStream out = new FileOutputStream("fleet.fo");
-            Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
-            edu.berkeley.fleet.assembler.Main.assemble(fleet, r, out);
-            out.flush();
-
+            for(int i=0; i<args.size(); i++)
+                test(fleet, new File(args.get(i)));
         } else {
             usage();
             System.exit(-1);
@@ -88,14 +79,22 @@ public class Main {
     }
 
     static void runTest(Fleet fleet, Reader reader, String title) throws Exception {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        edu.berkeley.fleet.assembler.Main.assemble(fleet, reader, baos);
+        Instruction[] instructions = null;
+        System.out.print("\r[    ] "  + ANSI.yellow(title)+": ");
+        try {
+            instructions = edu.berkeley.fleet.assembler.Main.assemble(fleet, reader);
+        } finally {
+            if (instructions==null)
+                System.out.println();
+        }
         if (edu.berkeley.fleet.assembler.Parser.skip) {
             System.out.println("\r[" + ANSI.yellow("SKIP") +
                                "] "  + ANSI.yellow(title));
+            edu.berkeley.fleet.assembler.Parser.skip = false;
             return;
         }
-        FleetProcess fp = fleet.run(baos.toByteArray());
+        FleetProcess fp = fleet.run(instructions);
+        //long now = System.currentTimeMillis();
         try {
             ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
             String output = "";
@@ -105,14 +104,19 @@ public class Main {
             while(true) {
                 if (output.length() > 60 && !failed)
                     output = "..."+output.substring(output.length()-57, output.length());
-                if (expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
+                if (!failed && expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
                 System.out.print("\r" + verdict + " " + ANSI.yellow(title) + ": " + output);
                 if (failed) break;
                 if (expect.size() == 0) break;
-                long l = fp.readWord();
+                //if (now!=0) { System.err.println(); System.err.println(System.currentTimeMillis()-now); now=0;}
+                long l = unBitSet(fp.recvWord());
                 long l2 = expect.remove(0);
 
                 // FIXME, this is ugly and not size-independent
+                if ((l & (1L << 36)) != 0) {
+                    l = l | (0xffffffffffffffffL << 37);
+                }
+                // FIXME, this is ugly and not size-independent
                 if ((l2 & (1L << 36)) != 0) {
                     l2 = l2 | (0xffffffffffffffffL << 37);
                 }
@@ -138,25 +142,24 @@ public class Main {
             for(String s : f.list())
                 test(fleet, new File(f.getPath() + File.separatorChar + s));
             return;
-        } else if (f.getPath().endsWith(".fleet")) {
+        } else if (f.getPath().endsWith(".fleet") || f.getPath().endsWith(".test")) {
             runTest(fleet, new InputStreamReader(new FileInputStream(f)), f.getPath());
         } else if (f.getPath().endsWith(".ship")) {
-            ShipDescription sd = new ShipDescription(f.getName(), new BufferedReader(new InputStreamReader(new FileInputStream(f))));
-            runTest(fleet, new StringReader(sd.getSection("test")), sd.getName());
+            ShipDescription sd = new ShipDescription(fleet, f.getName(), new BufferedReader(new InputStreamReader(new FileInputStream(f))));
+            String testsection = sd.getSection("test");
+            if (testsection == null)
+                System.out.println("no test for " + sd.getName() + "!");
+            else if (fleet.getShip(sd.getName(),0)==null && !(fleet instanceof edu.berkeley.fleet.assembler.Parser.FleetWithDynamicShips))
+                System.out.println("specified Fleet does not have any ships of type " + sd.getName());
+            else
+                runTest(fleet, new StringReader(testsection), sd.getName());
         }
     }
 
-    public static void run(Fleet fleet, InputStream is) throws IOException {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        byte[] buf = new byte[1024];
-        while(true) {
-            int numread = is.read(buf, 0, buf.length);
-            if (numread==-1) break;
-            baos.write(buf, 0, numread);
-        }
-        FleetProcess client = fleet.run(baos.toByteArray());
+    public static void run(Fleet fleet, Instruction[] instructions) throws IOException {
+        FleetProcess client = fleet.run(instructions);
         while(true) {
-            long result = client.readWord();
+            long result = unBitSet(client.recvWord());
             System.err.print(result);
             System.err.print(" 0x");
             System.err.print(Long.toString(result, 16));
@@ -164,6 +167,17 @@ public class Main {
         }
     }
 
+    public static long unBitSet(BitVector bs) {
+        long val = 0;
+        for(int i=0; i<37; i++) {
+            if (bs.get(i))
+                val |= (1L << i);
+        }
+        if ((val & (1L << 36)) != 0)
+            val = val | (0xffffffffffffffffL << 36);
+        return val;
+    }
+
     static void usage() {
         System.err.println(".........................................................................");
         System.err.println("Fleet Framework                              UC Berkeley, Sun Labs / 2007");