rename slipway=>fpga
[fleet.git] / src / edu / berkeley / fleet / Main.java
1 package edu.berkeley.fleet;
2 import edu.berkeley.sbp.util.ANSI;
3 import edu.berkeley.fleet.api.*;
4 import edu.berkeley.fleet.fpga.*;
5 import edu.berkeley.fleet.doc.*;
6 import edu.berkeley.fleet.interpreter.*;
7 import java.io.*;
8 import java.util.*;
9
10 public class Main {
11
12     static String command;
13     static HashMap<String,String> options = new HashMap<String,String>();
14     static ArrayList<String> args = new ArrayList<String>();
15
16     public static void main(String[] s) throws Exception {
17         if (s.length == 0) {
18             usage();
19             System.exit(-1);
20         }
21         boolean optionsDone = false;
22         for(int i=0; i<s.length; i++) {
23             if (!optionsDone && s[i].indexOf('=') != -1) {
24                 options.put(s[i].substring(0, s[i].indexOf('=')),
25                             s[i].substring(s[i].indexOf('=')+1));
26                
27             } else if (!optionsDone) {
28                 optionsDone = true;
29                 command = s[i];
30             } else {
31                 args.add(s[i]);
32             }
33         }
34
35         String target = options.get("target");
36         Fleet fleet;
37         if ("fpga".equals(target)) {
38             String bitfile = options.get("bitfile");
39             fleet = bitfile == null ? new Slipway() : new Slipway(bitfile);
40         } else if ("sim".equals(target) || "fleetsim".equals(target)) {
41             fleet = (Fleet)Class.forName("com.sunlabs.fleetsim.fleet.FleetDescription").newInstance();
42         } else {
43             fleet = new Interpreter();
44         }
45
46         if (!"yes".equals(options.get("verbose")))
47             Log.log = null;
48
49         if (command.equals("run")) {
50             InputStream is;
51             if (args.size()==0) {
52                 ByteArrayOutputStream baos = new ByteArrayOutputStream();
53                 Reader r = new InputStreamReader(System.in);
54                 edu.berkeley.fleet.assembler.Main.assemble(fleet, r, baos);
55                 is = new ByteArrayInputStream(baos.toByteArray());
56             } else {
57                 String filename = args.get(0);
58                 if (filename.endsWith(".fa") || filename.endsWith(".fleet")) {
59                     ByteArrayOutputStream baos = new ByteArrayOutputStream();
60                     Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
61                     edu.berkeley.fleet.assembler.Main.assemble(fleet, r, baos);
62                     is = new ByteArrayInputStream(baos.toByteArray());
63                 } else {
64                     is = new FileInputStream(args.get(0));
65                 }
66             }
67             run(fleet, is);
68
69         } else if (command.equals("expand")) {
70             fleet.expand(new ShipDescription(args.get(0), new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
71
72         } else if (command.equals("doc")) {
73             Doc.print();
74
75         } else if (command.equals("test")) {
76             for(int i=0; i<args.size(); i++)
77                 test(fleet, new File(args.get(i)));
78         } else if (command.equals("asm")) {
79             String filename = args.get(0);
80             FileOutputStream out = new FileOutputStream("fleet.fo");
81             Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
82             edu.berkeley.fleet.assembler.Main.assemble(fleet, r, out);
83             out.flush();
84
85         } else {
86             usage();
87             System.exit(-1);
88         }
89     }
90
91     static void runTest(Fleet fleet, Reader reader, String title) throws Exception {
92             ByteArrayOutputStream baos = new ByteArrayOutputStream();
93         edu.berkeley.fleet.assembler.Main.assemble(fleet, reader, baos);
94         if (edu.berkeley.fleet.assembler.Parser.skip) {
95             System.out.println("\r[" + ANSI.yellow("SKIP") +
96                                "] "  + ANSI.yellow(title));
97             edu.berkeley.fleet.assembler.Parser.skip = false;
98             return;
99         }
100         FleetProcess fp = fleet.run(baos.toByteArray());
101         try {
102             ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
103             String output = "";
104             // FIXME: check for extraneous stuff at the end
105             String verdict = "[    ]";
106             boolean failed = false;
107             while(true) {
108                 if (output.length() > 60 && !failed)
109                     output = "..."+output.substring(output.length()-57, output.length());
110                 if (expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
111                 System.out.print("\r" + verdict + " " + ANSI.yellow(title) + ": " + output);
112                 if (failed) break;
113                 if (expect.size() == 0) break;
114                 long l = fp.readWord();
115                 long l2 = expect.remove(0);
116
117                 // FIXME, this is ugly and not size-independent
118                 if ((l & (1L << 36)) != 0) {
119                     l = l | (0xffffffffffffffffL << 37);
120                 }
121                 // FIXME, this is ugly and not size-independent
122                 if ((l2 & (1L << 36)) != 0) {
123                     l2 = l2 | (0xffffffffffffffffL << 37);
124                 }
125
126                 if (l!=l2) {
127                     verdict = "["+ANSI.red("FAIL")+"]";
128                     output += ANSI.red("0x"+Long.toString(l, 16)) +
129                         ANSI.yellow(" (expected ")+ANSI.green("0x"+Long.toString(l2, 16))+ANSI.yellow(")");
130                     failed = true;
131                     continue;
132                 } else {
133                     output += ("0x"+Long.toString(l2, 16) + " ");
134                 }
135             }
136             System.out.println();
137         } finally {
138             fp.terminate();
139         }
140     }
141
142     static void test(Fleet fleet, File f) throws Exception {
143         if (f.isDirectory()) {
144             for(String s : f.list())
145                 test(fleet, new File(f.getPath() + File.separatorChar + s));
146             return;
147         } else if (f.getPath().endsWith(".fleet") || f.getPath().endsWith(".test")) {
148             runTest(fleet, new InputStreamReader(new FileInputStream(f)), f.getPath());
149         } else if (f.getPath().endsWith(".ship")) {
150             ShipDescription sd = new ShipDescription(f.getName(), new BufferedReader(new InputStreamReader(new FileInputStream(f))));
151             String testsection = sd.getSection("test");
152             if (testsection != null)
153                 runTest(fleet, new StringReader(testsection), sd.getName());
154             else
155                 System.out.println("no test for " + sd.getName() + "!");
156         }
157     }
158
159     public static void run(Fleet fleet, InputStream is) throws IOException {
160         ByteArrayOutputStream baos = new ByteArrayOutputStream();
161         byte[] buf = new byte[1024];
162         while(true) {
163             int numread = is.read(buf, 0, buf.length);
164             if (numread==-1) break;
165             baos.write(buf, 0, numread);
166         }
167         FleetProcess client = fleet.run(baos.toByteArray());
168         while(true) {
169             long result = client.readWord();
170             System.err.print(result);
171             System.err.print(" 0x");
172             System.err.print(Long.toString(result, 16));
173             System.err.println();
174         }
175     }
176
177     static void usage() {
178         System.err.println(".........................................................................");
179         System.err.println("Fleet Framework                              UC Berkeley, Sun Labs / 2007");
180         System.err.println("");
181         System.err.println("usage:  java -jar fleet.jar [options] [command] [filename] [args]");
182         System.err.println("");
183         System.err.println("[options] is in the form key=val; supported keys are:");
184         System.err.println("   target={sim,fpga,interp}");
185         System.err.println("   bitfile=(hardware image for fpga)");
186         System.err.println("   verbose={yes,no}");
187         System.err.println("");
188         System.err.println("[command] is one of:");
189         System.err.println("   asm");
190         System.err.println("   disasm");
191         System.err.println("   typeset");
192         System.err.println("   extract [section]");
193         System.err.println("   run");
194         System.err.println("");
195         System.err.println("[filename] is one of:");
196         System.err.println("   *.fa          Fleet assembler");
197         System.err.println("   *.f0          F0 code (not yet supported)");
198         System.err.println("   *.fo          Fleet binary object");
199         System.err.println("   *.ship        Ship description");
200         System.err.println("");
201         System.err.println("All [args] not consumed by [command] are passed to target");
202         System.err.println("");
203     }
204
205 }