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.*;
12 static String command;
13 static HashMap<String,String> options = new HashMap<String,String>();
14 static ArrayList<String> args = new ArrayList<String>();
16 public static void main(String[] s) throws Exception {
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));
27 } else if (!optionsDone) {
35 String target = options.get("target");
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();
43 fleet = new Interpreter();
46 if (!"yes".equals(options.get("verbose")))
49 if (command.equals("run")) {
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());
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());
64 is = new FileInputStream(args.get(0));
69 } else if (command.equals("expand")) {
70 fleet.expand(new ShipDescription(args.get(0), new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
72 } else if (command.equals("doc")) {
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);
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;
100 FleetProcess fp = fleet.run(baos.toByteArray());
102 ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
104 // FIXME: check for extraneous stuff at the end
105 String verdict = "[ ]";
106 boolean failed = false;
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);
113 if (expect.size() == 0) break;
114 long l = fp.readWord();
115 long l2 = expect.remove(0);
117 // FIXME, this is ugly and not size-independent
118 if ((l & (1L << 36)) != 0) {
119 l = l | (0xffffffffffffffffL << 37);
121 // FIXME, this is ugly and not size-independent
122 if ((l2 & (1L << 36)) != 0) {
123 l2 = l2 | (0xffffffffffffffffL << 37);
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(")");
133 output += ("0x"+Long.toString(l2, 16) + " ");
136 System.out.println();
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));
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());
155 System.out.println("no test for " + sd.getName() + "!");
159 public static void run(Fleet fleet, InputStream is) throws IOException {
160 ByteArrayOutputStream baos = new ByteArrayOutputStream();
161 byte[] buf = new byte[1024];
163 int numread = is.read(buf, 0, buf.length);
164 if (numread==-1) break;
165 baos.write(buf, 0, numread);
167 FleetProcess client = fleet.run(baos.toByteArray());
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();
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("");