From: adam Date: Mon, 5 Feb 2007 19:08:41 +0000 (+0100) Subject: major fpga code reorg; added icache+dcache X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=db258c81c7c4545383adb902e5895a54ce3096bd;p=fleet.git major fpga code reorg; added icache+dcache --- diff --git a/src/edu/berkeley/fleet/slipway/Client.java b/src/edu/berkeley/fleet/slipway/Client.java index a7041cc..2630a1b 100644 --- a/src/edu/berkeley/fleet/slipway/Client.java +++ b/src/edu/berkeley/fleet/slipway/Client.java @@ -14,14 +14,27 @@ public class Client { pw.print(Server.pass_string+" "+bitfile+"\n"); pw.flush(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; while(true) { int numread = System.in.read(buf, 0, buf.length); if (numread==-1) break; - os.write(buf, 0, numread); + baos.write(buf, 0, numread); } + byte[] program = baos.toByteArray(); + int numinstrs = (program.length / 6); + os.write((numinstrs >> (5*8)) & 0xff); + os.write((numinstrs >> (4*8)) & 0xff); + os.write((numinstrs >> (3*8)) & 0xff); + os.write((numinstrs >> (2*8)) & 0xff); + os.write((numinstrs >> (1*8)) & 0xff); + os.write((numinstrs >> (0*8)) & 0xff); + os.write(program); + os.flush(); InputStream is = s.getInputStream(); + System.err.println("program uploaded..."); + while(true) { long result = 0; int val = 0; diff --git a/src/edu/berkeley/fleet/slipway/Server.java b/src/edu/berkeley/fleet/slipway/Server.java index 7b21569..cabbeda 100644 --- a/src/edu/berkeley/fleet/slipway/Server.java +++ b/src/edu/berkeley/fleet/slipway/Server.java @@ -6,28 +6,44 @@ import java.util.*; public class Server { + public static ServerSocket ss; public static void main(String[] args) throws Exception { - ServerSocket ss = new ServerSocket(3133); - while(true) { - System.err.println("listening"); - Socket s = ss.accept(); - System.err.println("connection"); - //new Handler(s).start(); - new Handler(s).run(); - } + ss = new ServerSocket(3133); + new Listener(1).start(); + new Listener(2).start(); + new Listener(3).start(); + new Listener(4).start(); } public static String pass_string = "password=security_is_for_wimps "; + static class Listener extends Thread { + private int devnum; + public Listener(int devnum) { this.devnum = devnum; } + public void run() { + try { + while(true) { + Socket s = null; + synchronized(Server.class) { + System.err.println("thread " + devnum + " listening"); + s = ss.accept(); + System.err.println("connection"); + } + new Handler(s, devnum).run(); + } + } catch (Exception e) { throw new RuntimeException(e); } + } + } + static class Handler extends Thread { private Socket socket; boolean closed = false; - public Handler(Socket s) { this.socket = s; } + private int devnum; + public Handler(Socket s, int devnum) { this.socket = s; this.devnum = devnum; } public void run() { RandomAccessFile raf = null; FileInputStream fis = null; try { - final InputStream is = socket.getInputStream(); byte[] buf = new byte[1024]; StringBuffer sb = new StringBuffer(); @@ -42,14 +58,14 @@ public class Server { String file = sb.toString().substring(pass_string.length()).trim(); System.err.println("unprogramming..."); - int ret = Runtime.getRuntime().exec(new String[] { "/usr/bin/user_unprogram", "2" }).waitFor(); + int ret = Runtime.getRuntime().exec(new String[] { "/usr/bin/user_unprogram", ""+devnum }).waitFor(); if (ret != 0) { System.err.println("programming error: " + ret); return; } System.err.println("programming..."); ret = Runtime.getRuntime().exec(new String[] { - "/usr/bin/user_program", "2", "/var/slipway/"+file }).waitFor(); + "/usr/bin/user_program", ""+devnum, "/var/slipway/"+file }).waitFor(); if (ret != 0) { System.err.println("programming error: " + ret); return; @@ -58,7 +74,7 @@ public class Server { try { Thread.sleep(2000); } catch(Exception e) { } final OutputStream os = socket.getOutputStream(); System.err.println("sending instructions..."); - raf = new RandomAccessFile("/dev/selectmap2", "rw"); + raf = new RandomAccessFile("/dev/selectmap"+devnum, "rw"); final RandomAccessFile raf2 = raf; diff --git a/src/edu/berkeley/fleet/slipway/Slipway.java b/src/edu/berkeley/fleet/slipway/Slipway.java new file mode 100644 index 0000000..ec1dba3 --- /dev/null +++ b/src/edu/berkeley/fleet/slipway/Slipway.java @@ -0,0 +1,288 @@ +package edu.berkeley.fleet.slipway; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.ies44.*; +import edu.berkeley.fleet.*; +import java.lang.reflect.*; +import edu.berkeley.sbp.chr.*; +import edu.berkeley.sbp.misc.*; +import edu.berkeley.sbp.meta.*; +import edu.berkeley.sbp.bind.*; +import edu.berkeley.sbp.util.*; +import java.util.*; +import java.io.*; +import edu.berkeley.fleet.ships.*; + +public class Slipway extends Interpreter { + + public Slipway() { + createShip("Alu2", "alu2"); + createShip("Debug", "debug"); + createShip("Execute", "execute"); + createShip("Fifo", "fifo"); + createShip("Icache", "icache"); + createShip("Dcache", "dcache"); + /* + createShip("Alu2", "alu2a"); + createShip("Alu2", "alu2b"); + createShip("Alu2", "alu2c"); + createShip("Alu2", "alu2d"); + createShip("Debug", "debug"); + createShip("Execute", "execute"); + createShip("Fifo", "fifo1"); + createShip("Fifo", "fifo2"); + createShip("Fifo", "fifo3"); + createShip("Fifo", "fifo4"); + createShip("Icache", "icache1"); + //createShip("Icache", "icache2"); + createShip("Dcache", "dcache1"); + createShip("Dcache", "dcache2"); + */ + } + + public void dumpFabric(boolean quiet) { + // FIXME: this is really ugly: the order of port declarations in + // the XXXShip.java file must match the order in the .balsa file! + + ArrayList instructionports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special()) + instructionports.add(port); + FabricTree instructions = + new FabricTree((InterpreterBenkoBox[])instructionports.toArray(new InterpreterBenkoBox[0]), + "ihorn", + "instruction"); + + ArrayList inputports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special()) + inputports.add(port); + FabricTree inputs = + new FabricTree((InterpreterBenkoBox[])inputports.toArray(new InterpreterBenkoBox[0]), + "horn", + "dest"); + + ArrayList outputports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special() || ((InterpreterBenkoBox)port).dhorn()) + outputports.add(port); + FabricTree outputs = + new FabricTree((InterpreterBenkoBox[])outputports.toArray(new InterpreterBenkoBox[0]), + "funnel", + "source"); + + ArrayList ihornports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (((InterpreterBenkoBox)port).ihorn()) + ihornports.add(port); + FabricTree ihorns = + new FabricTree((InterpreterBenkoBox[])ihornports.toArray(new InterpreterBenkoBox[0]), + "funnel", + "ihorn"); + + if (quiet) return; + System.out.println("`include \"macros.v\""); + System.out.println("module fabric(clk, data_Icache0_command_r, data_Icache0_command_a, data_Icache0_command,"); + System.out.println(" data_Debug0_out_r, data_Debug0_out_a, data_Debug0_out);"); + System.out.println(" input clk;"); + System.out.println(" input data_Icache0_command_r;"); + System.out.println(" output data_Icache0_command_a;"); + System.out.println(" output data_Debug0_out_r;"); + System.out.println(" input data_Debug0_out_a;"); + System.out.println(" output [(`PACKET_WIDTH-1):0] data_Debug0_out;"); + System.out.println(" input [(`PACKET_WIDTH-1):0] data_Icache0_command;"); + //System.out.println(" wire [(`INSTRUCTION_WIDTH-1):0] data_Icache0_ihorn;"); + //System.out.println(" wire [(`PACKET_WIDTH-1):0] data_Icache0_dhorn;"); + System.out.println(); + + System.out.println(); + + instructions.dumpChannels(true); + outputs.dumpChannels(true); + inputs.dumpChannels(true); + ihorns.dumpChannels(true); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special() || ((InterpreterBenkoBox)port).dhorn()) + System.out.println(" wire [(`PACKET_WIDTH-1):0] data_" + +getUniqueName(ship)+"_"+port.getName()+";"); + + System.out.println(""); + instructions.dumpChannels(false); + System.out.println(""); + outputs.dumpChannels(false); + System.out.println(""); + inputs.dumpChannels(false); + System.out.println(""); + ihorns.dumpChannels(false); + System.out.println(""); + for(InterpreterShip ship : shiplist) { + System.out.print(ship.getClass().getSimpleName().toLowerCase()); + System.out.print(" "); + System.out.print("krunk"+(krunk++)); + System.out.print("(clk, "); + boolean first = true; + for(BenkoBox port : ship.getBenkoBoxes()) { + if (!first) System.out.print(", "); + first = false; + String prefix = "data_"; + if (((InterpreterBenkoBox)port).ihorn()) prefix = "ihorn_"; + if (((InterpreterBenkoBox)port).dhorn()) prefix = "source_"; + System.out.print(prefix+getUniqueName(port.getShip())+"_"+port.getName()+"_r, "); + System.out.print(prefix+getUniqueName(port.getShip())+"_"+port.getName()+"_a, "); + System.out.print(prefix+getUniqueName(port.getShip())+"_"+port.getName()); + System.out.print(" "); + } + System.out.println(");"); + + for(BenkoBox port : ship.getBenkoBoxes()) { + if (((InterpreterBenkoBox)port).special()) continue; + if (port instanceof Inbox) { + System.out.print("inbox"); + } else { + System.out.print("outbox"); + } + System.out.print(" krunk"+(krunk++)+"(clk, "); + System.out.print("instruction_"+getUniqueName(port.getShip())+"_"+port.getName()+"_r, "); + System.out.print("instruction_"+getUniqueName(port.getShip())+"_"+port.getName()+"_a, "); + System.out.print("instruction_"+getUniqueName(port.getShip())+"_"+port.getName()+", "); + System.out.print("dest_"+getUniqueName(port.getShip())+"_"+port.getName()+"_r, "); + System.out.print("dest_"+getUniqueName(port.getShip())+"_"+port.getName()+"_a, "); + System.out.print("dest_"+getUniqueName(port.getShip())+"_"+port.getName()+", "); + System.out.print("source_"+getUniqueName(port.getShip())+"_"+port.getName()+"_r, "); + System.out.print("source_"+getUniqueName(port.getShip())+"_"+port.getName()+"_a, "); + System.out.print("source_"+getUniqueName(port.getShip())+"_"+port.getName()+", "); + System.out.print("data_"+getUniqueName(port.getShip())+"_"+port.getName()+"_r, "); + System.out.print("data_"+getUniqueName(port.getShip())+"_"+port.getName()+"_a, "); + System.out.print("data_"+getUniqueName(port.getShip())+"_"+port.getName()); + System.out.print(");"); + System.out.println(); + } + + } + /* + System.out.println("funnel topfun(clk,"+ + " dest_r, dest_a, dest,"+ + " source_r, source_a, source,"+ + " data_Icache0_dhorn_r, data_Icache0_dhorn_a, data_Icache0_dhorn);"); + */ + System.out.println("assign instruction_r = ihorn_r;"); + System.out.println("assign ihorn_a = instruction_a;"); + System.out.println("assign instruction = ihorn;"); + System.out.println("assign dest_r = source_r;"); + System.out.println("assign source_a = dest_a;"); + System.out.println("assign dest = source;"); + System.out.println("endmodule"); + } + + private static class FabricTree { + int master_idx = 1; + String prefix; + Node root; + public void dumpChannels(boolean decl) { root.dumpChannels(0, decl); } + public FabricTree(InterpreterBenkoBox[] ports, String component, String prefix) { + this.prefix = prefix; + root = (Node)mkNode("", component, ports, 0, ports.length, 0, 0); + } + private Object mkNode(String name, String component, InterpreterBenkoBox[] ports, + int start, int end, int addr, int bits) { + if (end-start == 0) return null; + if (end-start == 1) { + InterpreterBenkoBox p = ports[start]; + if (prefix.equals("instruction")) { + p.instr_addr = addr; + p.instr_bits = bits; + } else if (prefix.equals("dest")) { + p.addr = addr; + p.bits = bits; + } + return p; + } + int len = end-start; + return new Node(name, + component, + mkNode(name+"_0", component, ports, start, start+len/2, addr, bits+1), + mkNode(name+"_1", component, ports, start+len/2, end, addr | (1 << bits), bits+1), + addr, + bits); + } + private String describe(String prefix, Object o) { + if (o==null) return null; + if (o instanceof InterpreterBenkoBox) { + InterpreterBenkoBox p = (InterpreterBenkoBox)o; + return prefix+"_"+getUniqueName(p.getShip())+"_"+p.getName(); + } + if (o instanceof Node) { + return ((Node)o).describe(prefix); + } + return null; + } + private class Node { + Object left; + Object right; + String name; + String component; + int addr; + int bits; + public Node(String name, String component, Object left, Object right, int addr, int bits) { + this.left = left; + this.right = right; + this.name = name; + this.component = component; + this.addr = addr; + this.bits = bits; + } + public void dumpChannels(int indentamount, boolean decl) { + String indent = ""; + for(int i=0; i