package edu.berkeley.fleet;
import edu.berkeley.sbp.util.ANSI;
import edu.berkeley.fleet.api.*;
-import edu.berkeley.fleet.slipway.*;
-import edu.berkeley.fleet.doc.*;
+import edu.berkeley.fleet.fpga.*;
import edu.berkeley.fleet.interpreter.*;
+import edu.berkeley.fleet.two.*;
+import edu.berkeley.fleet.util.*;
import java.io.*;
import java.util.*;
Fleet fleet;
if ("fpga".equals(target)) {
String bitfile = options.get("bitfile");
- fleet = bitfile == null ? new Slipway() : new Slipway(bitfile);
+ fleet = new Fpga();
} else if ("sim".equals(target) || "fleetsim".equals(target)) {
fleet = (Fleet)Class.forName("com.sunlabs.fleetsim.fleet.FleetDescription").newInstance();
+ } else if (command.equals("expand")) {
+ fleet = new Interpreter(new String[0], false);
} else {
fleet = new Interpreter();
}
- if (!"true".equals(options.get("verbose")))
+ if (!"yes".equals(options.get("verbose")))
Log.log = null;
if (command.equals("run")) {
InputStream is;
- if (args.size()==0) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- Reader r = new InputStreamReader(System.in);
- edu.berkeley.fleet.assembler.Main.assemble(fleet, r, baos);
- is = new ByteArrayInputStream(baos.toByteArray());
- } else {
- String filename = args.get(0);
- if (filename.endsWith(".fa") || filename.endsWith(".fleet")) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
- edu.berkeley.fleet.assembler.Main.assemble(fleet, r, baos);
- is = new ByteArrayInputStream(baos.toByteArray());
- } else {
- is = new FileInputStream(args.get(0));
- }
- }
- run(fleet, is);
+ String filename = args.get(0);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
+ run(fleet, edu.berkeley.fleet.assembler.Main.assemble(fleet, r));
} else if (command.equals("expand")) {
- fleet.expand(new ShipDescription(new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
+ String name = new File(args.get(0)).getName();
+ if (name.endsWith(".ship"))
+ name = name.substring(0, name.length() - ".ship".length());
+ if (fleet instanceof edu.berkeley.fleet.fpga.Fpga) {
+ ((edu.berkeley.fleet.fpga.Fpga)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
+ } else {
+ ((Interpreter)fleet).expand(new ShipDescription(fleet, name, new BufferedReader(new InputStreamReader(new FileInputStream(args.get(0))))));
+ }
} else if (command.equals("doc")) {
- Doc.print();
+ if (!new File(".tmp").exists())
+ new File(".tmp").mkdirs();
+ PrintWriter pw = new PrintWriter(new FileOutputStream(".tmp/FleetTwo.Manual.tex"));
+ BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("doc/archman.tex")));
+ for(String ss = br.readLine(); ss!=null; ss = br.readLine())
+ pw.println(ss);
+ for(String f : new File("ships").list()) {
+ new ShipDescription(fleet, f, new BufferedReader(new InputStreamReader(new FileInputStream(new File("ships/"+f))))).printTeX(pw);
+ }
+ pw.println("\\end{document}");
+ pw.close();
} else if (command.equals("test")) {
- test(fleet, new File(args.get(0)));
- } else if (command.equals("asm")) {
- String filename = args.get(0);
- FileOutputStream out = new FileOutputStream("fleet.fo");
- Reader r = new InputStreamReader(new FileInputStream(args.get(0)));
- edu.berkeley.fleet.assembler.Main.assemble(fleet, r, out);
- out.flush();
-
+ for(int i=0; i<args.size(); i++)
+ test(fleet, new File(args.get(i)));
} else {
usage();
System.exit(-1);
}
}
+ static void runTest(Fleet fleet, Reader reader, String title) throws Exception {
+ Instruction[] instructions = null;
+ System.out.print("\r[ ] " + ANSI.yellow(title)+": ");
+ try {
+ instructions = edu.berkeley.fleet.assembler.Main.assemble(fleet, reader);
+ } finally {
+ if (instructions==null)
+ System.out.println();
+ }
+ if (edu.berkeley.fleet.assembler.Parser.skip) {
+ System.out.println("\r[" + ANSI.yellow("SKIP") +
+ "] " + ANSI.yellow(title));
+ edu.berkeley.fleet.assembler.Parser.skip = false;
+ return;
+ }
+ FleetProcess fp = fleet.run(instructions);
+ //long now = System.currentTimeMillis();
+ try {
+ ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
+ String output = "";
+ // FIXME: check for extraneous stuff at the end
+ String verdict = "[ ]";
+ boolean failed = false;
+ while(true) {
+ if (output.length() > 60 && !failed)
+ output = "..."+output.substring(output.length()-57, output.length());
+ if (!failed && expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
+ System.out.print("\r" + verdict + " " + ANSI.yellow(title) + ": " + output);
+ if (failed) break;
+ if (expect.size() == 0) break;
+ //if (now!=0) { System.err.println(); System.err.println(System.currentTimeMillis()-now); now=0;}
+ long l = unBitSet(fp.recvWord());
+ long l2 = expect.remove(0);
+
+ // FIXME, this is ugly and not size-independent
+ if ((l & (1L << 36)) != 0) {
+ l = l | (0xffffffffffffffffL << 37);
+ }
+ // FIXME, this is ugly and not size-independent
+ if ((l2 & (1L << 36)) != 0) {
+ l2 = l2 | (0xffffffffffffffffL << 37);
+ }
+
+ if (l!=l2) {
+ verdict = "["+ANSI.red("FAIL")+"]";
+ output += ANSI.red("0x"+Long.toString(l, 16)) +
+ ANSI.yellow(" (expected ")+ANSI.green("0x"+Long.toString(l2, 16))+ANSI.yellow(")");
+ failed = true;
+ continue;
+ } else {
+ output += ("0x"+Long.toString(l2, 16) + " ");
+ }
+ }
+ System.out.println();
+ } finally {
+ fp.terminate();
+ }
+ }
+
static void test(Fleet fleet, File f) throws Exception {
if (f.isDirectory()) {
for(String s : f.list())
test(fleet, new File(f.getPath() + File.separatorChar + s));
- } else if (f.getPath().endsWith(".fleet")) {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- edu.berkeley.fleet.assembler.Main.assemble(fleet, new InputStreamReader(new FileInputStream(f)), baos);
- FleetProcess fp = fleet.run(baos.toByteArray());
- try {
- ArrayList<Long> expect = edu.berkeley.fleet.assembler.Parser.expect;
- String output = "";
- // FIXME: check for extraneous stuff at the end
- String verdict = "[ ]";
- boolean failed = false;
- while(true) {
- if (output.length() > 60 && !failed)
- output = "..."+output.substring(output.length()-57, output.length());
- if (expect.size() == 0) verdict = "["+ANSI.green("PASS")+"]";
- System.out.print("\r" + verdict + " " + ANSI.yellow(f.getPath()) + ": " + output);
- if (failed) break;
- if (expect.size() == 0) break;
- long l = fp.readWord();
- long l2 = expect.remove(0);
- if (l!=l2) {
- verdict = "["+ANSI.red("FAIL")+"]";
- output += ANSI.red("0x"+Long.toString(l, 16)) +
- ANSI.yellow(" (expected ")+ANSI.green("0x"+Long.toString(l2, 16))+ANSI.yellow(")");
- failed = true;
- continue;
- } else {
- output += ("0x"+Long.toString(l2, 16) + " ");
- }
- }
- System.out.println();
- } finally {
- fp.terminate();
- }
+ return;
+ } else if (f.getPath().endsWith(".fleet") || f.getPath().endsWith(".test")) {
+ runTest(fleet, new InputStreamReader(new FileInputStream(f)), f.getPath());
+ } else if (f.getPath().endsWith(".ship")) {
+ ShipDescription sd = new ShipDescription(fleet, f.getName(), new BufferedReader(new InputStreamReader(new FileInputStream(f))));
+ String testsection = sd.getSection("test");
+ if (testsection == null)
+ System.out.println("no test for " + sd.getName() + "!");
+ else if (fleet.getShip(sd.getName(),0)==null && !(fleet instanceof edu.berkeley.fleet.assembler.Parser.FleetWithDynamicShips))
+ System.out.println("specified Fleet does not have any ships of type " + sd.getName());
+ else
+ runTest(fleet, new StringReader(testsection), sd.getName());
}
}
- public static void run(Fleet fleet, InputStream is) throws IOException {
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- byte[] buf = new byte[1024];
+ public static void run(Fleet fleet, Instruction[] instructions) throws IOException {
+ FleetProcess client = fleet.run(instructions);
while(true) {
- int numread = is.read(buf, 0, buf.length);
- if (numread==-1) break;
- baos.write(buf, 0, numread);
- }
- FleetProcess client = fleet.run(baos.toByteArray());
- while(true) {
- long result = client.readWord();
+ long result = unBitSet(client.recvWord());
System.err.print(result);
System.err.print(" 0x");
System.err.print(Long.toString(result, 16));
}
}
+ public static long unBitSet(BitVector bs) {
+ long val = 0;
+ for(int i=0; i<37; i++) {
+ if (bs.get(i))
+ val |= (1L << i);
+ }
+ if ((val & (1L << 36)) != 0)
+ val = val | (0xffffffffffffffffL << 36);
+ return val;
+ }
+
static void usage() {
System.err.println(".........................................................................");
System.err.println("Fleet Framework UC Berkeley, Sun Labs / 2007");