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.interpreter.*;
6 import edu.berkeley.fleet.two.*;
7 import edu.berkeley.fleet.util.*;
13 static String command;
14 static HashMap<String,String> options = new HashMap<String,String>();
15 static ArrayList<String> args = new ArrayList<String>();
17 public static void main(String[] s) throws Exception {
22 boolean optionsDone = false;
23 for(int i=0; i<s.length; i++) {
24 if (!optionsDone && s[i].indexOf('=') != -1) {
25 options.put(s[i].substring(0, s[i].indexOf('=')),
26 s[i].substring(s[i].indexOf('=')+1));
28 } else if (!optionsDone) {
36 String target = options.get("target");
38 if ("fpga".equals(target)) {
39 String bitfile = options.get("bitfile");
41 } else if ("sim".equals(target) || "fleetsim".equals(target)) {
42 fleet = (Fleet)Class.forName("com.sunlabs.fleetsim.fleet.FleetDescription").newInstance();
43 } else if (command.equals("expand")) {
44 fleet = new Interpreter(new String[0], false);
46 fleet = new Interpreter();
49 if (!"yes".equals(options.get("verbose")))
52 if (command.equals("run")) {
54 String filename = args.get(0);
55 ByteArrayOutputStream baos = new ByteArrayOutputStream();
56 Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
57 run(fleet, edu.berkeley.fleet.assembler.Main.assemble(fleet, r));
59 } else if (command.equals("expand")) {
60 String name = new File(args.get(0)).getName();
61 if (name.endsWith(".ship"))
62 name = name.substring(0, name.length() - ".ship".length());
63 if (fleet instanceof edu.berkeley.fleet.fpga.Fpga) {
64 ((edu.berkeley.fleet.fpga.Fpga)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
66 ((Interpreter)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
69 } else if (command.equals("doc")) {
70 if (!new File(".tmp").exists())
71 new File(".tmp").mkdirs();
72 PrintWriter pw = new PrintWriter(new FileOutputStream(".tmp/FleetTwo.Manual.tex"));
73 BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("doc/archman.tex")));
74 for(String ss = br.readLine(); ss!=null; ss = br.readLine())
76 for(String f : new File("ships").list()) {
77 new ShipDescription(fleet, f, new BufferedReader(new InputStreamReader(new FileInputStream(new File("ships/"+f))))).printTeX(pw);
79 pw.println("\\end{document}");
82 } else if (command.equals("test")) {
83 for(int i=0; i<args.size(); i++)
84 test(fleet, new File(args.get(i)));
91 static void runTest(Fleet fleet, Reader reader, String title) throws Exception {
92 Instruction[] instructions = null;
93 System.out.print("\r[ ] " + ANSI.yellow(title)+": ");
95 instructions = edu.berkeley.fleet.assembler.Main.assemble(fleet, reader);
97 if (instructions==null)
100 if (edu.berkeley.fleet.assembler.Parser.skip) {
101 System.out.println("\r[" + ANSI.yellow("SKIP") +
102 "] " + ANSI.yellow(title));
103 edu.berkeley.fleet.assembler.Parser.skip = false;
106 FleetProcess fp = fleet.run(instructions);
107 //long now = System.currentTimeMillis();
109 ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
111 // FIXME: check for extraneous stuff at the end
112 String verdict = "[ ]";
113 boolean failed = false;
115 if (output.length() > 60 && !failed)
116 output = "..."+output.substring(output.length()-57, output.length());
117 if (!failed && expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
118 System.out.print("\r" + verdict + " " + ANSI.yellow(title) + ": " + output);
120 if (expect.size() == 0) break;
121 //if (now!=0) { System.err.println(); System.err.println(System.currentTimeMillis()-now); now=0;}
122 long l = unBitSet(fp.recvWord());
123 long l2 = expect.remove(0);
125 // FIXME, this is ugly and not size-independent
126 if ((l & (1L << 36)) != 0) {
127 l = l | (0xffffffffffffffffL << 37);
129 // FIXME, this is ugly and not size-independent
130 if ((l2 & (1L << 36)) != 0) {
131 l2 = l2 | (0xffffffffffffffffL << 37);
135 verdict = "["+ANSI.red("FAIL")+"]";
136 output += ANSI.red("0x"+Long.toString(l, 16)) +
137 ANSI.yellow(" (expected ")+ANSI.green("0x"+Long.toString(l2, 16))+ANSI.yellow(")");
141 output += ("0x"+Long.toString(l2, 16) + " ");
144 System.out.println();
150 static void test(Fleet fleet, File f) throws Exception {
151 if (f.isDirectory()) {
152 for(String s : f.list())
153 test(fleet, new File(f.getPath() + File.separatorChar + s));
155 } else if (f.getPath().endsWith(".fleet") || f.getPath().endsWith(".test")) {
156 runTest(fleet, new InputStreamReader(new FileInputStream(f)), f.getPath());
157 } else if (f.getPath().endsWith(".ship")) {
158 ShipDescription sd = new ShipDescription(fleet, f.getName(), new BufferedReader(new InputStreamReader(new FileInputStream(f))));
159 String testsection = sd.getSection("test");
160 if (testsection == null)
161 System.out.println("no test for " + sd.getName() + "!");
162 else if (fleet.getShip(sd.getName(),0)==null && !(fleet instanceof edu.berkeley.fleet.assembler.Parser.FleetWithDynamicShips))
163 System.out.println("specified Fleet does not have any ships of type " + sd.getName());
165 runTest(fleet, new StringReader(testsection), sd.getName());
169 public static void run(Fleet fleet, Instruction[] instructions) throws IOException {
170 FleetProcess client = fleet.run(instructions);
172 long result = unBitSet(client.recvWord());
173 System.err.print(result);
174 System.err.print(" 0x");
175 System.err.print(Long.toString(result, 16));
176 System.err.println();
180 public static long unBitSet(BitVector bs) {
182 for(int i=0; i<37; i++) {
186 if ((val & (1L << 36)) != 0)
187 val = val | (0xffffffffffffffffL << 36);
191 static void usage() {
192 System.err.println(".........................................................................");
193 System.err.println("Fleet Framework UC Berkeley, Sun Labs / 2007");
194 System.err.println("");
195 System.err.println("usage: java -jar fleet.jar [options] [command] [filename] [args]");
196 System.err.println("");
197 System.err.println("[options] is in the form key=val; supported keys are:");
198 System.err.println(" target={sim,fpga,interp}");
199 System.err.println(" bitfile=(hardware image for fpga)");
200 System.err.println(" verbose={yes,no}");
201 System.err.println("");
202 System.err.println("[command] is one of:");
203 System.err.println(" asm");
204 System.err.println(" disasm");
205 System.err.println(" typeset");
206 System.err.println(" extract [section]");
207 System.err.println(" run");
208 System.err.println("");
209 System.err.println("[filename] is one of:");
210 System.err.println(" *.fa Fleet assembler");
211 System.err.println(" *.f0 F0 code (not yet supported)");
212 System.err.println(" *.fo Fleet binary object");
213 System.err.println(" *.ship Ship description");
214 System.err.println("");
215 System.err.println("All [args] not consumed by [command] are passed to target");
216 System.err.println("");