f8e5956470f43cd9ae568f7e2f99dd6b4e3c6a54
[fleet.git] / src / edu / berkeley / fleet / Main.java
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.*;
8 import java.io.*;
9 import java.util.*;
10
11 public class Main {
12
13     static String command;
14     static HashMap<String,String> options = new HashMap<String,String>();
15     static ArrayList<String> args = new ArrayList<String>();
16
17     public static void main(String[] s) throws Exception {
18         if (s.length == 0) {
19             usage();
20             System.exit(-1);
21         }
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));
27                
28             } else if (!optionsDone) {
29                 optionsDone = true;
30                 command = s[i];
31             } else {
32                 args.add(s[i]);
33             }
34         }
35
36         String target = options.get("target");
37         Fleet fleet;
38         if ("fpga".equals(target)) {
39             String bitfile = options.get("bitfile");
40             fleet = new Fpga();
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);
45         } else {
46             fleet = new Interpreter();
47         }
48
49         if (!"yes".equals(options.get("verbose")))
50             Log.log = null;
51
52         if (command.equals("run")) {
53             InputStream is;
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));
58
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))))));
65             } else {
66                 ((Interpreter)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
67             }
68
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())
75                 pw.println(ss);
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);
78             }
79             pw.println("\\end{document}");
80             pw.close();
81
82         } else if (command.equals("test")) {
83             for(int i=0; i<args.size(); i++)
84                 test(fleet, new File(args.get(i)));
85         } else {
86             usage();
87             System.exit(-1);
88         }
89     }
90
91     static void runTest(Fleet fleet, Reader reader, String title) throws Exception {
92         Instruction[] instructions = null;
93         System.out.print("\r[    ] "  + ANSI.yellow(title)+": ");
94         try {
95             instructions = edu.berkeley.fleet.assembler.Main.assemble(fleet, reader);
96         } finally {
97             if (instructions==null)
98                 System.out.println();
99         }
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;
104             return;
105         }
106         FleetProcess fp = fleet.run(instructions);
107         //long now = System.currentTimeMillis();
108         try {
109             ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
110             String output = "";
111             // FIXME: check for extraneous stuff at the end
112             String verdict = "[    ]";
113             boolean failed = false;
114             while(true) {
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);
119                 if (failed) break;
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);
124
125                 // FIXME, this is ugly and not size-independent
126                 if ((l & (1L << 36)) != 0) {
127                     l = l | (0xffffffffffffffffL << 37);
128                 }
129                 // FIXME, this is ugly and not size-independent
130                 if ((l2 & (1L << 36)) != 0) {
131                     l2 = l2 | (0xffffffffffffffffL << 37);
132                 }
133
134                 if (l!=l2) {
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(")");
138                     failed = true;
139                     continue;
140                 } else {
141                     output += ("0x"+Long.toString(l2, 16) + " ");
142                 }
143             }
144             System.out.println();
145         } finally {
146             fp.terminate();
147         }
148     }
149
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));
154             return;
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());
164             else
165                 runTest(fleet, new StringReader(testsection), sd.getName());
166         }
167     }
168
169     public static void run(Fleet fleet, Instruction[] instructions) throws IOException {
170         FleetProcess client = fleet.run(instructions);
171         while(true) {
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();
177         }
178     }
179
180     public static long unBitSet(BitVector bs) {
181         long val = 0;
182         for(int i=0; i<37; i++) {
183             if (bs.get(i))
184                 val |= (1L << i);
185         }
186         if ((val & (1L << 36)) != 0)
187             val = val | (0xffffffffffffffffL << 36);
188         return val;
189     }
190
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("");
217     }
218
219 }