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