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