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