major refactoring of edu.berkeley.fleet.dataflow
[fleet.git] / src / edu / berkeley / fleet / Main.java
index 65d53bf..f8e5956 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.*;
 
@@ -36,108 +37,139 @@ public class Main {
         Fleet fleet;
         if ("fpga".equals(target)) {
             String bitfile = options.get("bitfile");
-            fleet = bitfile == null ? new Slipway() : new Slipway(bitfile);
+            fleet = new Fpga();
         } else if ("sim".equals(target) || "fleetsim".equals(target)) {
             fleet = (Fleet)Class.forName("com.sunlabs.fleetsim.fleet.FleetDescription").newInstance();
+        } else if (command.equals("expand")) {
+            fleet = new Interpreter(new String[0], false);
         } else {
             fleet = new Interpreter();
         }
 
-        if (!"true".equals(options.get("verbose")))
+        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(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);
         }
     }
 
+    static void runTest(Fleet fleet, Reader reader, String title) throws Exception {
+        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(instructions);
+        //long now = System.currentTimeMillis();
+        try {
+            ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
+            String output = "";
+            // FIXME: check for extraneous stuff at the end
+            String verdict = "[    ]";
+            boolean failed = false;
+            while(true) {
+                if (output.length() > 60 && !failed)
+                    output = "..."+output.substring(output.length()-57, output.length());
+                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;
+                //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);
+                }
+
+                if (l!=l2) {
+                    verdict = "["+ANSI.red("FAIL")+"]";
+                    output += ANSI.red("0x"+Long.toString(l, 16)) +
+                        ANSI.yellow(" (expected ")+ANSI.green("0x"+Long.toString(l2, 16))+ANSI.yellow(")");
+                    failed = true;
+                    continue;
+                } else {
+                    output += ("0x"+Long.toString(l2, 16) + " ");
+                }
+            }
+            System.out.println();
+        } finally {
+            fp.terminate();
+        }
+    }
+
     static void test(Fleet fleet, File f) throws Exception {
         if (f.isDirectory()) {
             for(String s : f.list())
                 test(fleet, new File(f.getPath() + File.separatorChar + s));
-        } else if (f.getPath().endsWith(".fleet")) {
-            ByteArrayOutputStream baos = new ByteArrayOutputStream();
-            edu.berkeley.fleet.assembler.Main.assemble(fleet, new InputStreamReader(new FileInputStream(f)), baos);
-            FleetProcess fp = fleet.run(baos.toByteArray());
-            try {
-                ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
-                String output = "";
-                // FIXME: check for extraneous stuff at the end
-                String verdict = "[    ]";
-                boolean failed = false;
-                while(true) {
-                    if (output.length() > 60 && !failed)
-                        output = "..."+output.substring(output.length()-57, output.length());
-                    if (expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
-                    System.out.print("\r" + verdict + " " + ANSI.yellow(f.getPath()) + ": " + output);
-                    if (failed) break;
-                    if (expect.size() == 0) break;
-                    long l = fp.readWord();
-                    long l2 = expect.remove(0);
-                    if (l!=l2) {
-                        verdict = "["+ANSI.red("FAIL")+"]";
-                        output += ANSI.red("0x"+Long.toString(l, 16)) +
-                            ANSI.yellow(" (expected ")+ANSI.green("0x"+Long.toString(l2, 16))+ANSI.yellow(")");
-                        failed = true;
-                        continue;
-                    } else {
-                        output += ("0x"+Long.toString(l2, 16) + " ");
-                    }
-                }
-                System.out.println();
-            } finally {
-                fp.terminate();
-            }
+            return;
+        } 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(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];
+    public static void run(Fleet fleet, Instruction[] instructions) throws IOException {
+        FleetProcess client = fleet.run(instructions);
         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());
-        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));
@@ -145,6 +177,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");