From 001225f0c21ce9dc476b89d3c77563f1bd1c4c2c Mon Sep 17 00:00:00 2001 From: adam Date: Fri, 26 Jan 2007 03:44:20 +0100 Subject: [PATCH] updated to AM14, AM15 --- Makefile | 41 +++- contrib/demo.fleet | 55 ++--- contrib/demo.ships | 4 +- contrib/misc.fleet | 40 ++++ src/edu/berkeley/fleet/CodeBag.java | 125 ----------- src/edu/berkeley/fleet/DataOutbox.java | 20 -- src/edu/berkeley/fleet/FleetParser.java | 229 -------------------- src/edu/berkeley/fleet/Instruction.java | 74 ------- src/edu/berkeley/fleet/InstructionPort.java | 83 ------- src/edu/berkeley/fleet/Literal.java | 80 ------- src/edu/berkeley/fleet/PortReference.java | 22 -- src/edu/berkeley/fleet/Ship.java | 65 ------ src/edu/berkeley/fleet/TokenOutbox.java | 22 -- src/edu/berkeley/fleet/api/BenkoBox.java | 8 +- src/edu/berkeley/fleet/api/Instruction.java | 62 ++++-- src/edu/berkeley/fleet/api/Ship.java | 21 ++ src/edu/berkeley/fleet/interpreter/CodeBag.java | 83 +++++++ .../fleet/{ => interpreter}/DataInbox.java | 7 +- src/edu/berkeley/fleet/interpreter/DataOutbox.java | 22 ++ .../fleet/{ => interpreter}/Dispatchable.java | 3 +- .../berkeley/fleet/{ => interpreter}/Inbox.java | 32 ++- .../fleet/interpreter/InstructionPort.java | 86 ++++++++ .../{Fleet.java => interpreter/Interpreter.java} | 212 ++++++++++++------ .../InterpreterBenkoBox.java} | 26 ++- .../fleet/interpreter/InterpreterShip.java | 43 ++++ src/edu/berkeley/fleet/{ => interpreter}/Log.java | 17 +- src/edu/berkeley/fleet/interpreter/Main.java | 77 +++++++ .../berkeley/fleet/{ => interpreter}/Outbox.java | 24 +- .../fleet/{ => interpreter}/TokenInbox.java | 6 +- .../berkeley/fleet/interpreter/TokenOutbox.java | 24 ++ src/edu/berkeley/fleet/parser/Parser.java | 204 +++++++++++++++++ fleet.g => src/edu/berkeley/fleet/parser/fleet.g | 7 +- .../fleet/ships/{AdderShip.java => Adder.java} | 5 +- src/edu/berkeley/fleet/ships/Alu1.java | 37 ++++ src/edu/berkeley/fleet/ships/Alu2.java | 41 ++++ src/edu/berkeley/fleet/ships/ArithmeticShip.java | 5 +- src/edu/berkeley/fleet/ships/BitBucketShip.java | 21 -- .../fleet/ships/{CommandShip.java => Command.java} | 5 +- .../fleet/ships/{CounterShip.java => Counter.java} | 5 +- src/edu/berkeley/fleet/ships/DeMux.java | 34 +++ .../fleet/ships/{DebugShip.java => Debug.java} | 5 +- src/edu/berkeley/fleet/ships/Dup.java | 29 +++ src/edu/berkeley/fleet/ships/Dup3.java | 31 +++ src/edu/berkeley/fleet/ships/DuplicatorShip.java | 5 +- src/edu/berkeley/fleet/ships/FetchShip.java | 7 +- .../fleet/ships/{FifoShip.java => Fifo.java} | 7 +- src/edu/berkeley/fleet/ships/HaltShip.java | 7 +- src/edu/berkeley/fleet/ships/HomeworkCounter.java | 5 +- src/edu/berkeley/fleet/ships/Lut.java | 33 +++ src/edu/berkeley/fleet/ships/MemoryReadShip.java | 7 +- src/edu/berkeley/fleet/ships/MemoryWriteShip.java | 7 +- src/edu/berkeley/fleet/ships/MultiplierShip.java | 5 +- src/edu/berkeley/fleet/ships/Mux.java | 28 +++ src/edu/berkeley/fleet/ships/ScatterShip.java | 5 +- src/edu/berkeley/fleet/ships/Shifter.java | 32 +++ src/edu/berkeley/fleet/ships/Sort2.java | 28 +++ src/edu/berkeley/fleet/ships/TokenFifo.java | 30 --- src/edu/berkeley/fleet/ships/TokenSourceShip.java | 23 -- 58 files changed, 1259 insertions(+), 1012 deletions(-) create mode 100644 contrib/misc.fleet delete mode 100644 src/edu/berkeley/fleet/CodeBag.java delete mode 100644 src/edu/berkeley/fleet/DataOutbox.java delete mode 100644 src/edu/berkeley/fleet/FleetParser.java delete mode 100644 src/edu/berkeley/fleet/Instruction.java delete mode 100644 src/edu/berkeley/fleet/InstructionPort.java delete mode 100644 src/edu/berkeley/fleet/Literal.java delete mode 100644 src/edu/berkeley/fleet/PortReference.java delete mode 100644 src/edu/berkeley/fleet/Ship.java delete mode 100644 src/edu/berkeley/fleet/TokenOutbox.java create mode 100644 src/edu/berkeley/fleet/interpreter/CodeBag.java rename src/edu/berkeley/fleet/{ => interpreter}/DataInbox.java (66%) create mode 100644 src/edu/berkeley/fleet/interpreter/DataOutbox.java rename src/edu/berkeley/fleet/{ => interpreter}/Dispatchable.java (54%) rename src/edu/berkeley/fleet/{ => interpreter}/Inbox.java (80%) create mode 100644 src/edu/berkeley/fleet/interpreter/InstructionPort.java rename src/edu/berkeley/fleet/{Fleet.java => interpreter/Interpreter.java} (52%) rename src/edu/berkeley/fleet/{Port.java => interpreter/InterpreterBenkoBox.java} (72%) create mode 100644 src/edu/berkeley/fleet/interpreter/InterpreterShip.java rename src/edu/berkeley/fleet/{ => interpreter}/Log.java (76%) create mode 100644 src/edu/berkeley/fleet/interpreter/Main.java rename src/edu/berkeley/fleet/{ => interpreter}/Outbox.java (73%) rename src/edu/berkeley/fleet/{ => interpreter}/TokenInbox.java (63%) create mode 100644 src/edu/berkeley/fleet/interpreter/TokenOutbox.java create mode 100644 src/edu/berkeley/fleet/parser/Parser.java rename fleet.g => src/edu/berkeley/fleet/parser/fleet.g (88%) rename src/edu/berkeley/fleet/ships/{AdderShip.java => Adder.java} (84%) create mode 100644 src/edu/berkeley/fleet/ships/Alu1.java create mode 100644 src/edu/berkeley/fleet/ships/Alu2.java delete mode 100644 src/edu/berkeley/fleet/ships/BitBucketShip.java rename src/edu/berkeley/fleet/ships/{CommandShip.java => Command.java} (83%) rename src/edu/berkeley/fleet/ships/{CounterShip.java => Counter.java} (85%) create mode 100644 src/edu/berkeley/fleet/ships/DeMux.java rename src/edu/berkeley/fleet/ships/{DebugShip.java => Debug.java} (84%) create mode 100644 src/edu/berkeley/fleet/ships/Dup.java create mode 100644 src/edu/berkeley/fleet/ships/Dup3.java rename src/edu/berkeley/fleet/ships/{FifoShip.java => Fifo.java} (79%) create mode 100644 src/edu/berkeley/fleet/ships/Lut.java create mode 100644 src/edu/berkeley/fleet/ships/Mux.java create mode 100644 src/edu/berkeley/fleet/ships/Shifter.java create mode 100644 src/edu/berkeley/fleet/ships/Sort2.java delete mode 100644 src/edu/berkeley/fleet/ships/TokenFifo.java delete mode 100644 src/edu/berkeley/fleet/ships/TokenSourceShip.java diff --git a/Makefile b/Makefile index 1567639..723fc51 100644 --- a/Makefile +++ b/Makefile @@ -1,29 +1,52 @@ go: fleeterpreter.jar - java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.FleetParser + java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.interpreter.Main + +run: fleeterpreter.jar + java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.interpreter.Main < contrib/demo.fleet code: fleeterpreter.jar - java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.FleetParser --dump-code < contrib/demo.fleet + java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.interpreter.Main --dump-code < contrib/demo.fleet fabric: make fleeterpreter.jar - java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.FleetParser --dump-fabric < contrib/demo.ships | tee ../fleet3/src/fabric.v + java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.interpreter.Main --dump-fabric < contrib/demo.ships | tee ../fleet3/src/fabric.v fabric.balsa: fleeterpreter.jar - java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.FleetParser --dump-fabric < contrib/demo.ships > fabric.balsa + java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.interpreter.Main --dump-fabric < contrib/demo.ships > fabric.balsa cat fabric.balsa applet: fleeterpreter.jar java -Xmx500m -cp lib/edu.berkeley.sbp.jar:fleeterpreter.jar edu.berkeley.fleet.FleetApplet < test.fleet -fleeterpreter.jar: $(shell find src -name \*.java) fleet.g - mkdir -p bin - cp fleet.g bin +fleeterpreter.jar: $(shell find src -name \*.java) src/edu/berkeley/fleet/parser/fleet.g + mkdir -p bin/edu/berkeley/fleet/parser/ + cp src/edu/berkeley/fleet/parser/fleet.g bin/edu/berkeley/fleet/parser/ javac -cp lib/edu.berkeley.sbp.jar -d bin $(shell find src -name \*.java) cd bin; jar xvf ../lib/edu.berkeley.sbp.jar - echo 'Main-Class: edu.berkeley.fleet.FleetParser' > bin/manifest + echo 'Main-Class: edu.berkeley.fleet.interpreter.Main' > bin/manifest cd bin; jar cvmf manifest ../$@ . program: make code scp fleet.bin root@bee441.cs.berkeley.edu: -# ssh root@bee441.cs.berkeley.edu 'user_unprogram 1;user_program 1 main.bit; echo ok; ./a.out /dev/selectmap1 fleet.bin' \ No newline at end of file +# ssh root@bee441.cs.berkeley.edu 'user_unprogram 1;user_program 1 main.bit; echo ok; ./a.out /dev/selectmap1 fleet.bin' + +clean:; rm -rf bin fleeterpreter.jar + +javadoc: + mkdir -p doc/api + javadoc \ + -classpath lib/edu.berkeley.sbp.jar \ + -linksource \ + -windowtitle "Fleet API" \ + -sourcepath src \ + -header "Fleet
API" \ + -public \ + -notree \ + -noindex \ + -nonavbar \ + -stylesheetfile doc/javadoc.css \ + -noqualifier all \ + -d doc/api \ + edu.berkeley.fleet.api \ + edu.berkeley.fleet.parser diff --git a/contrib/demo.fleet b/contrib/demo.fleet index c16c68b..e926afb 100644 --- a/contrib/demo.fleet +++ b/contrib/demo.fleet @@ -1,47 +1,20 @@ #include "contrib/demo.ships" -//22: sendto debug.data -//22: sendto debug.data -//alu1.out: ack debug.data +0: sendto alu2.a; +1: sendto alu2.b; +2: sendto alu2.b; +3: sendto alu2.b; -299: sendto alu2.a -120: sendto alu2.b -0: sendto alu2.op -alu2.out: take, sendto debug.data +0: sendto alu2.op; +alu2.op: + take; + [*] deliver; +alu2.out: + [*r] take, sendto debug.data; + [*r] sendto alu2.a; -//22: sendto alu3.b +alu2.a: [*] take, deliver; +alu2.b: [*] take, deliver; -// route the "max" output to the demux, and that to either -// the finished-value output (debug.data) or the subtractor -//sort.max: [*] take, sendto demux1.in -// demux1.false: [*] take, sendto debug.data -// demux1.true: [*] take, sendto alu.a -// -//// route the "min" value to the demux selector to decide if we are -//// done; also send copies to the ALU and the secondary sort input -//sort.min: [*] take, sendto dup3.in -// dup3.a: [*] take, sendto demux1.select -// dup3.b: [*] take, sendto alu.b -// dup3.c: [*] take, sendto sort.b -// -//// "plug up" the ALU opcode input with a "1" (subtraction) -//1: sendto alu.op -// alu.op: take [*] accept -// -//// route all data emerging from the ALU back to the primary sort input -//alu.out: [*] take, sendto sort.a -// -//// all other inputs are in default mode -//sort.a: [*] take, accept -//sort.b: [*] take, accept -//alu.a: [*] take, accept -//alu.b: [*] take, accept -//dup3.in: [*] take, accept -//demux1.select: [*] take, accept -//demux1.in: [*] take, accept -// -//// gcd(377,221)=13 (we hope!) -////377: sendto sort.a -////221: sendto sort.b -// +debug.data: [*] take, deliver; diff --git a/contrib/demo.ships b/contrib/demo.ships index f3e1abc..b4f8e77 100644 --- a/contrib/demo.ships +++ b/contrib/demo.ships @@ -15,8 +15,8 @@ #ship alu1 : Alu1 #ship alu2 : Alu2 -#ship debug : DebugShip -#ship command : CommandShip +#ship debug : Debug +#ship command : Command //#ship command : CommandShip //#ship dup1 : Dup diff --git a/contrib/misc.fleet b/contrib/misc.fleet new file mode 100644 index 0000000..8510634 --- /dev/null +++ b/contrib/misc.fleet @@ -0,0 +1,40 @@ +//22: sendto debug.data +//22: sendto debug.data +//alu1.out: ack debug.data + + +//22: sendto alu3.b + +// route the "max" output to the demux, and that to either +// the finished-value output (debug.data) or the subtractor +//sort.max: [*] take, sendto demux1.in +// demux1.false: [*] take, sendto debug.data +// demux1.true: [*] take, sendto alu.a +// +//// route the "min" value to the demux selector to decide if we are +//// done; also send copies to the ALU and the secondary sort input +//sort.min: [*] take, sendto dup3.in +// dup3.a: [*] take, sendto demux1.select +// dup3.b: [*] take, sendto alu.b +// dup3.c: [*] take, sendto sort.b +// +//// "plug up" the ALU opcode input with a "1" (subtraction) +//1: sendto alu.op +// alu.op: take [*] accept +// +//// route all data emerging from the ALU back to the primary sort input +//alu.out: [*] take, sendto sort.a +// +//// all other inputs are in default mode +//sort.a: [*] take, accept +//sort.b: [*] take, accept +//alu.a: [*] take, accept +//alu.b: [*] take, accept +//dup3.in: [*] take, accept +//demux1.select: [*] take, accept +//demux1.in: [*] take, accept +// +//// gcd(377,221)=13 (we hope!) +////377: sendto sort.a +////221: sendto sort.b +// diff --git a/src/edu/berkeley/fleet/CodeBag.java b/src/edu/berkeley/fleet/CodeBag.java deleted file mode 100644 index b267ed5..0000000 --- a/src/edu/berkeley/fleet/CodeBag.java +++ /dev/null @@ -1,125 +0,0 @@ -package edu.berkeley.fleet; - -import java.util.*; -import java.io.*; - -/** a codebag */ -public class CodeBag { - - private static int max_allocated_descriptor = 1; - private static HashMap codeBagsByDescriptor = new HashMap(); - - public static CodeBag getCodeBagByDescriptor(int descriptor) { - return codeBagsByDescriptor.get(descriptor); - } - - private final int descriptor; - private final CodeBag parent; - private final String name; - private ArrayList dispatchables = new ArrayList(); - private HashMap codeBags = new HashMap(); - - public CodeBag(CodeBag parent, String name) { - this.parent = parent; - this.name = name; - this.descriptor = max_allocated_descriptor++; - codeBagsByDescriptor.put(descriptor, this); - if (parent != null && name != null) - parent.add(name, this); - } - - public void dispatch(Fleet fleet) { - for(Dispatchable d : dispatchables) { - Log.dispatch(d); - d.dispatch(fleet); - } - } - - public void add(Dispatchable instr) { - dispatchables.add(instr); - } - - public void add(String name, CodeBag instr) { - codeBags.put(name, instr); - } - - public int getDescriptor() { - return descriptor; - } - - public CodeBag getCodeBag(String name) { - CodeBag ret = codeBags.get(name); - if (ret != null) return ret; - if (parent==null) return null; - return parent.getCodeBag(name); - } - - public void dump(OutputStream os, long data_) throws Exception { - int data = (int)data_; - os.write((byte)data); - //System.out.println("0x"+Integer.toString(data,16)+" "); - System.out.println(data); - } - public void dump(Fleet fleet) throws Exception { - OutputStream os = new FileOutputStream("fleet.bin"); - - for(Dispatchable d : dispatchables) { - if (d instanceof Instruction) { - Instruction inst = (Instruction)d; - - long instr = inst.destination.resolve(fleet).addr << 1; - - instr |= (((long)inst.count) << (11+1)); - if (inst.ack) instr |= (1L << (11+1+7+0)); - if (inst.dataOut) instr |= (1L << (11+1+7+1)); - if (inst.latch) instr |= (1L << (11+1+7+2)); - if (inst.dataIn) instr |= (1L << (11+1+7+3)); - if (inst.trigger) instr |= (1L << (11+1+7+4)); - instr |= ((long)inst.source.resolve(fleet).instr_addr) << (11+5+7+1); - // 1111 00001 0000001 00000001110 0 - // 1111 00001 0000001 00000001110 0 - // 110000010000001000000011100 - long out = 0; - out |= new PortReference("command", "data").resolve(fleet).addr; - out |= instr << 11; - dump(os, (out >> (5*8)) & 0xff); - dump(os, (out >> (4*8)) & 0xff); - dump(os, (out >> (3*8)) & 0xff); - dump(os, (out >> (2*8)) & 0xff); - dump(os, (out >> (1*8)) & 0xff); - dump(os, (out >> (0*8)) & 0xff); - } else if (d instanceof Literal.LiteralDatum) { - Literal.LiteralDatum ld = (Literal.LiteralDatum)d; - long out = 0; - out |= ld.destination.resolve(fleet).addr; - out |= ((long)ld.data) << 11; - dump(os, (out >> (5*8)) & 0xff); - dump(os, (out >> (4*8)) & 0xff); - dump(os, (out >> (3*8)) & 0xff); - dump(os, (out >> (2*8)) & 0xff); - dump(os, (out >> (1*8)) & 0xff); - dump(os, (out >> (0*8)) & 0xff); - } - - } - os.flush(); - os.close(); - } - - public String toString() { - if (name != null) return name; - StringBuffer ret = new StringBuffer(); - for(Dispatchable d : dispatchables) { - ret.append(d); - ret.append("\n"); - } - for(String n : codeBags.keySet()) { - ret.append(n + ": "); - ret.append(codeBags.get(n)); - ret.append("\n"); - } - return "{\n "+Log.indent(ret.toString(), " ")+"\n}"; - } - - -} diff --git a/src/edu/berkeley/fleet/DataOutbox.java b/src/edu/berkeley/fleet/DataOutbox.java deleted file mode 100644 index e7859fa..0000000 --- a/src/edu/berkeley/fleet/DataOutbox.java +++ /dev/null @@ -1,20 +0,0 @@ -package edu.berkeley.fleet; - -public class DataOutbox extends Outbox { - - public DataOutbox(Ship ship, String name) { super(ship, name); } - public DataOutbox(Ship ship, String name, boolean special) { - super(ship, name); this.special = special; } - - public void addDataFromShip(int data) { - addItemFromShip(data); - } - - public boolean readyForDataFromShip() { - return super.readyForItemFromShip(); - } - - protected void send(Port port, int data) { - getFleet().sendData(this, data, port); - } -} diff --git a/src/edu/berkeley/fleet/FleetParser.java b/src/edu/berkeley/fleet/FleetParser.java deleted file mode 100644 index 209889c..0000000 --- a/src/edu/berkeley/fleet/FleetParser.java +++ /dev/null @@ -1,229 +0,0 @@ -package edu.berkeley.fleet; - -import edu.berkeley.sbp.*; -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.*; - -/** - * @author Adam Megacz - * @author Thomas Kho - */ -public class FleetParser { - - public static boolean dump_fabric = false; - public static boolean dump_code = false; - - public static void main(String[] s) throws Exception { - for(int i=0; i)parse(r)); - fp.done(); - } - - public static Tree parse(Reader r) throws Exception { - InputStream grammarStream = - FleetParser.class.getClassLoader().getResourceAsStream("fleet.g"); - Parser metaGrammarParser = new CharParser(MetaGrammar.newInstance()); - Tree parsedGrammar = metaGrammarParser.parse(new CharInput(grammarStream)).expand1(); - Union grammar = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { }); - Parser parser = new CharParser(grammar); - Tree tree = parser.parse(new CharInput(r)).expand1(); - return tree; - } - - private Fleet fleet; - private ArrayList imports = new ArrayList(); - private CodeBag rootCodeBag; - private static boolean debugMemory = true; - - public FleetParser(Fleet fleet) { - this.fleet = fleet; - } - - public void done() { - if (dump_fabric) { - fleet.dumpFabric(false); - - } else if (dump_code) { - fleet.dumpFabric(true); - try { - rootCodeBag.dump(fleet); - } catch (Exception e) { throw new RuntimeException(e); } - - } else if (rootCodeBag != null) { - if (debugMemory) { fleet.dumpMem(); } - System.out.println(rootCodeBag); - rootCodeBag.dispatch(fleet); - fleet.go(); - if (debugMemory) { fleet.dumpMem(); } - } - } - - public void walk(Tree t) { - String head = t.head(); - if (head==null) { - } else if (head.equals("Program")) { - for(Tree tc : t.child(0)) - walk(tc); - CodeBag cb = new CodeBag(null, null); - if (t.size()>1) - for(Tree statement : t.child(1)) - fillCodeBag(statement, cb); - rootCodeBag = cb; - - } else if (head.equals("Import")) { - imports.add(string(t.child(0))); - - } else if (head.equals("Ship")) { - String name = name(t.child(0)); - String classname = string(t.child(1)); - boolean good = false; - for(String s : imports) - if (fleet.tryCreate(s+"."+classname, name)) { - good = true; - break; - } - if (!good) - throw new RuntimeException("couldn't find a ship called \""+classname+"\""); - - } else if (head.equals("Include")) { - try { - walk(parse(new InputStreamReader(new FileInputStream(string(t.child(0)))))); - } catch (Exception e) { - throw new RuntimeException(e); - } - - } else if (head.equals("Memory")) { - if (fleet.mem.length != 0) - throw new RuntimeException("multiple memory directives found"); - Tree m = t.child(0); - int[] mem = new int[m.size()]; - for(int i=0; i t) { - String ret = ""; - if (t.head() != null) ret += t.head(); - for(Tree c : t) - ret += string(c); - return ret; - } - - public String name(Tree t) { - return string(t.child(0))+string(t.child(1)); - } - - public PortReference portReference(Tree t) { - if (!"Port".equals(t.head())) return null; - return new PortReference(name(t.child(0)), name(t.child(1))); - } - - public void fillCodeBag(Tree t, CodeBag cb) { - if (t.head()==null) return; - else if (t.head().equals("NamedCodeBag")) { - CodeBag cb2 = new CodeBag(cb, name(t.child(0))); - for(Tree statement : t.child(1)) - fillCodeBag(statement, cb2); - - } else if (t.head().equals("Literal")) { - int literal = Integer.parseInt(string(t.child(0))); - PortReference benkobox = portReference(t.child(1)); - cb.add(new Literal.LiteralDatum(literal, benkobox, false, 1)); - - } else if (t.head().equals("Fiber")) { - PortReference benkobox = portReference(t.child(0)); - - for(Tree tt : t.child(1)) { - int count = 1; - Tree ttx = null; - if (tt.size() > 1 && tt.child(0).size()>0) { - System.out.println(tt.child(0)); - if (tt.child(0).size() > 0 && "Star".equals(tt.child(0).child(0).head())) count=Integer.MAX_VALUE; - else count = Integer.parseInt(string(tt.child(0))); - } - ttx = tt.child(1); - boolean tokenIn = false; - boolean dataIn = false; - boolean latch = false; - boolean dataOut = false; - boolean tokenOut = false; - PortReference dest = null; - for(int i=0; i tc : t.child(1).child(0)) - fillCodeBag(tc, cb3); - cb.add(new Literal.LiteralDatum(cb3.getDescriptor(), d, true)); - - } else if ("CodeBagRef".equals(t.child(1).head())) { - cb.add(new Literal.CodeBagRef(name(t.child(1).child(0)), cb, d)); - - } else if ("ShipSpecific".equals(t.child(1).head())) { - cb.add(new Literal.ShipSpecific(string(t.child(1).child(0)), d, count)); - */ - } -} diff --git a/src/edu/berkeley/fleet/Instruction.java b/src/edu/berkeley/fleet/Instruction.java deleted file mode 100644 index 400b865..0000000 --- a/src/edu/berkeley/fleet/Instruction.java +++ /dev/null @@ -1,74 +0,0 @@ -package edu.berkeley.fleet; - -/** an instruction within a codebag, as specified in am10; this class is immutable */ -public class Instruction extends Dispatchable { - - public final PortReference source; - public final PortReference destination; - public final int count; - - public final boolean trigger; - public final boolean dataIn; - public final boolean latch; - public final boolean dataOut; - public final boolean ack; - public final boolean recycle; - - public Instruction(PortReference source, - PortReference destination, - int count, - boolean dataIn, - boolean latch, - boolean ack, - boolean trigger, - boolean dataOut) { - this(source, destination, count, dataIn, latch, ack, trigger, dataOut, false); - } - public Instruction(PortReference source, - PortReference destination, - int count, - boolean dataIn, - boolean latch, - boolean ack, - boolean trigger, - boolean dataOut, - boolean recycle) { - this.source = source; - this.destination = destination; - this.count = count; - this.dataIn = dataIn; - this.latch = latch; - this.ack = ack; - this.trigger = trigger; - this.dataOut = dataOut; - this.recycle = recycle; - if (count <= 0) - throw new RuntimeException("count field of an instruction must be >0"); - } - - public void dispatch(Fleet fleet) { - Port sourcePort = source.resolve(fleet); - if (!(sourcePort instanceof InstructionPort)) - throw new RuntimeException(sourcePort + " is not an InstructionPort!"); - ((InstructionPort)sourcePort).addInstruction(this); - } - - public String toString() { - StringBuffer ret = new StringBuffer(); - ret.append(source); - ret.append(": "); - boolean more=false; - switch(count) { - case 1: break; - case Integer.MAX_VALUE: ret.append("[*] "); - default: ret.append("["+count+"] "); - } - if (trigger) { ret.append("wait"); more=true; } - if (dataIn && latch) { if (more) ret.append(", "); ret.append("take"); more = true; } - if (dataIn && !latch) { if (more) ret.append(", "); ret.append("discard"); more = true; } - if (dataOut && destination!=null) { if (more) ret.append(", "); ret.append("sendto "+destination); more = true; } - if (dataOut && destination==null) { if (more) ret.append(", "); ret.append("accept"); more = true; } - if (ack) { if (more) ret.append(", "); ret.append("ack "+destination); more = true; } - return ret.toString(); - } -} diff --git a/src/edu/berkeley/fleet/InstructionPort.java b/src/edu/berkeley/fleet/InstructionPort.java deleted file mode 100644 index 7f9db45..0000000 --- a/src/edu/berkeley/fleet/InstructionPort.java +++ /dev/null @@ -1,83 +0,0 @@ -package edu.berkeley.fleet; - -import java.util.*; - -/** anything that has a source (instruction horn) address on the switch fabric */ -public abstract class InstructionPort extends Port { - - /** the currently executing instruction */ - Instruction currentlyExecuting = null; - - /** all instructions waiting to be executed (excludes currentlyExecuting) */ - Queue instructions = new LinkedList(); - - /** the count field of currentlyExecuting, taking into account actions already performed */ - int currentlyExecutingCount; - - InstructionPort(Ship ship, String name) { - super(ship, name); - } - - /** an instruction arrives from the instruction horn */ - void addInstruction(Instruction instr) { - if (currentlyExecuting != null && currentlyExecuting.count == Integer.MAX_VALUE) { - currentlyExecuting = null; - currentlyExecutingCount = 0; - } - if (currentlyExecuting == null) { - currentlyExecuting = instr; - currentlyExecutingCount = currentlyExecuting.count; - } else { - instructions.add(instr); - } - } - - protected void shutdown(boolean leaveAsInbox) { - if (leaveAsInbox && DataInbox.defaultInstruction != null) { - if (currentlyExecuting == null) { - Log.println(Log.red(" WARNING: you did not leave a standing move on inbox-port " + this)); - return; - } - /* - if (currentlyExecuting.count != Integer.MAX_VALUE - || currentlyExecuting.dataIn != Instruction.IgnoreCopyTake.TAKE - || currentlyExecuting.ack - || currentlyExecuting.trigger - || !currentlyExecuting.dataOut) { - Log.println(Log.red(" WARNING: you did not leave the correct standing move on inbox-port " + this)+ - "\n found: " + currentlyExecuting - ); - return; - } - */ - currentlyExecuting = null; - } - if (currentlyExecuting != null || instructions.size() > 0) { - Log.println(Log.red(" WARNING: you left instructions on the instruction queue of port " + - this + "; they are:")); - if (currentlyExecuting != null) - Log.println(" " + currentlyExecuting); - for(Instruction i : instructions) - Log.println(" " + i); - } - } - - // interface to subclass /////////////////////////////////////////////////////////////////////// - - /** this will be invoked periodically; should return true to "consume" an instruction, false to leave it executing */ - protected abstract boolean service(Instruction instr); - - protected final void service() { - if (currentlyExecutingCount <= 0) - currentlyExecuting = null; - if (currentlyExecuting == null && instructions.size() > 0) { - currentlyExecuting = instructions.remove(); - currentlyExecutingCount = currentlyExecuting.count; - } - boolean ret = service(currentlyExecuting); - if (ret && currentlyExecuting != null && currentlyExecutingCount != Integer.MAX_VALUE) - currentlyExecutingCount--; - } - - -} diff --git a/src/edu/berkeley/fleet/Literal.java b/src/edu/berkeley/fleet/Literal.java deleted file mode 100644 index 74972c5..0000000 --- a/src/edu/berkeley/fleet/Literal.java +++ /dev/null @@ -1,80 +0,0 @@ -package edu.berkeley.fleet; - -/** represents a literal; currently handled in an extremely hoakey fashion */ -public class Literal { - - public static class LiteralDatum extends Dispatchable { - int data; - PortReference destination; - private boolean isCodeBag; - private int count; - public LiteralDatum(int data, PortReference destination, boolean isCodeBag) { this(data, destination, isCodeBag, 1); } - public LiteralDatum(int data, PortReference destination, boolean isCodeBag, int count) { - this.data = data; - this.destination = destination; - this.isCodeBag = isCodeBag; - this.count = count; - } - protected int getData() { return data; } - public void dispatch(Fleet fleet) { - for(int i=0; i "+destination; - } - } - - public static class CodeBagRef extends LiteralDatum { - private String name; - private CodeBag parent; - public CodeBagRef(String name, CodeBag parent, PortReference destination) { - super(0, destination, true); - this.parent = parent; - this.name = name; - } - protected int getData() { - if (parent.getCodeBag(name)==null) - throw new RuntimeException("[invalid codebag, name="+name+"]"); - return parent.getCodeBag(name).getDescriptor(); - } - } - - public static class LiteralToken extends Dispatchable { - private PortReference destination; - public LiteralToken(PortReference destination) { - this.destination = destination; - } - public void dispatch(Fleet fleet) { - destination.resolve(fleet).addTokenFromFabric(); - } - public String toString() { - return "token -> "+destination; - } - } - - public static class ShipSpecific extends Dispatchable { - private String data; - private PortReference destination; - private int count; - public ShipSpecific(String data, PortReference destination, int count) { - this.data = data; - this.destination = destination; - this.count = count; - } - public void dispatch(Fleet fleet) { - for(int i=0; i "+destination); - } - } -} diff --git a/src/edu/berkeley/fleet/PortReference.java b/src/edu/berkeley/fleet/PortReference.java deleted file mode 100644 index 60c87c0..0000000 --- a/src/edu/berkeley/fleet/PortReference.java +++ /dev/null @@ -1,22 +0,0 @@ -package edu.berkeley.fleet; - -/** an "unresolved" reference to a port -- one which may not exist */ -public class PortReference { - - public final String portname; - public final String shipname; - - public PortReference(String shipname, String portname) { - this.shipname = shipname; - this.portname = portname; - } - - public Port resolve(Fleet fleet) { - return fleet.getShip(shipname).getPort(portname); - } - - public String toString() { - return shipname+"."+portname; - } - -} diff --git a/src/edu/berkeley/fleet/Ship.java b/src/edu/berkeley/fleet/Ship.java deleted file mode 100644 index 07c1b28..0000000 --- a/src/edu/berkeley/fleet/Ship.java +++ /dev/null @@ -1,65 +0,0 @@ -package edu.berkeley.fleet; - -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.*; - -/** a ship, which belongs to a fleet and which may have many ports */ -public abstract class Ship { - - ArrayList portlist = new ArrayList(); - private HashMap ports = new HashMap(); - - private String name; - private Fleet fleet; - - /** You should instantiate a bunch of Inboxes and Outboxes in your constructor */ - public Ship(Fleet fleet, String name) { - this.name = name; - this.fleet = fleet; - fleet.shiplist.add(this); - fleet.ships.put(name, this); - } - - public Port getPort(String s) { - Port p = ports.get(s); - if (p == null) throw new RuntimeException("unknown port \""+name+"."+s+"\""); - return p; - } - - public String getBalsaName() { return name; } - public String getName() { return name; } - public String toString() { return name; } - - public Fleet getFleet() { return fleet; } - - /** - * Override this method, check inboxes for the data you need, and - * if you find it, deposit results in an outbox; we'll take care - * of the rest. - */ - public abstract void service(); - - public final void _service() { - for(Port p : ports.values()) p.service(); - service(); - } - - void addPort(String name, Port port) { - portlist.add(port); - ports.put(name, port); - } - - public void shutdown() { - for(Port p : ports.values()) - p.shutdown(); - } - - public int resolveShipSpecificConstant(String shipSpecificData) { - throw new RuntimeException("don't know how to resolve \""+shipSpecificData+"\""); - } -} diff --git a/src/edu/berkeley/fleet/TokenOutbox.java b/src/edu/berkeley/fleet/TokenOutbox.java deleted file mode 100644 index 0e2c0e0..0000000 --- a/src/edu/berkeley/fleet/TokenOutbox.java +++ /dev/null @@ -1,22 +0,0 @@ -package edu.berkeley.fleet; - -/** a port which outputs only tokens */ -public class TokenOutbox extends Outbox { - - public TokenOutbox(Ship ship, String name) { - super(ship, name); - } - - protected void send(Port port, int data) { - getFleet().sendToken(this, port); - } - - public boolean readyForTokenFromShip() { - return super.readyForItemFromShip(); - } - - public void addTokenFromShip() { - addItemFromShip(0); - } - -} diff --git a/src/edu/berkeley/fleet/api/BenkoBox.java b/src/edu/berkeley/fleet/api/BenkoBox.java index 23ec414..1e93825 100644 --- a/src/edu/berkeley/fleet/api/BenkoBox.java +++ b/src/edu/berkeley/fleet/api/BenkoBox.java @@ -3,11 +3,15 @@ package edu.berkeley.fleet.api; public abstract class BenkoBox { /** you should extend subclasses, not this class directly */ - BenkoBox() { } + //FIXME + public BenkoBox() { } /** the descriptive name of this benkobox (relative to its ship) */ public abstract String getName(); - + + /** return the Ship to which this BenkoBox belongs */ + public abstract Ship getShip(); + /** the maximum number of instructions we can put in the BenkoBox instruction fifo, * or Integer.MAX_VALUE if unbounded */ public abstract int getInstructionFifoLength(); diff --git a/src/edu/berkeley/fleet/api/Instruction.java b/src/edu/berkeley/fleet/api/Instruction.java index 99e2c1b..9e7dc14 100644 --- a/src/edu/berkeley/fleet/api/Instruction.java +++ b/src/edu/berkeley/fleet/api/Instruction.java @@ -11,39 +11,69 @@ public abstract class Instruction { } - public static class Normal extends Instruction { + public static class Executable extends Instruction { public final BenkoBox benkoBox; public final BenkoBox dest; public final int count; - public final boolean wait; + public final boolean tokenIn; public final boolean dataIn; public final boolean latch; public final boolean dataOut; - public final boolean ack; + public final boolean tokenOut; public final boolean recycle; - public Normal(BenkoBox benkoBox, - BenkoBox dest, - int count, - boolean dataIn, - boolean latch, - boolean ack, - boolean wait, - boolean dataOut, - boolean recycle) { + /** count=0 denotes a standing move */ + public Executable(BenkoBox benkoBox, + BenkoBox dest, + int count, + boolean tokenIn, + boolean dataIn, + boolean latch, + boolean dataOut, + boolean tokenOut, + boolean recycle) { this.benkoBox = benkoBox; this.dest = dest; this.count = count; + this.tokenIn = tokenIn; this.dataIn = dataIn; this.latch = latch; - this.ack = ack; - this.wait = wait; this.dataOut = dataOut; + this.tokenOut = tokenOut; this.recycle = recycle; - if (count <= 0) - throw new RuntimeException("count field of an instruction must be >0"); + if (count < 0) + throw new RuntimeException("count field of an instruction must be >=0"); + } + + public Instruction.Executable decrementCount() { + if (count==1) return null; + return new Executable(benkoBox, dest, count==0 ? 0 : count-0, tokenIn, dataIn, latch, dataOut, tokenOut, recycle); + } + + public String toString() { + String ret = ""; + if (count==0 || count>1 || recycle) { + ret += "["; + if (count>1) ret += count; + if (count==0) ret += "*"; + if (recycle) ret += "r"; + ret += "] "; + } + boolean needcomma = false; + if (tokenIn) { ret += (needcomma ? ", " : "") + "wait"; needcomma = true; } + if (dataIn && latch) { ret += (needcomma ? ", " : "") + "take"; needcomma = true; } + if (dataIn && !latch) { ret += (needcomma ? ", " : "") + "discard"; needcomma = true; } + if (dataOut) { + if (benkoBox instanceof BenkoBox.Inbox || dest==null) + ret += (needcomma ? ", " : "") + "deliver"; + else + ret += (needcomma ? ", " : "") + "sendto "+dest; + needcomma = true; + } + if (tokenOut) { ret += (needcomma ? ", " : "") + "ack "+dest; needcomma = true; } + return ret; } } diff --git a/src/edu/berkeley/fleet/api/Ship.java b/src/edu/berkeley/fleet/api/Ship.java index d25083c..787b1c2 100644 --- a/src/edu/berkeley/fleet/api/Ship.java +++ b/src/edu/berkeley/fleet/api/Ship.java @@ -4,10 +4,31 @@ import java.util.*; public abstract class Ship { + /** return the Fleet that this Ship belongs to */ + public abstract Fleet getFleet(); + /** returns the type of the ship ("Fetch", "ALU", etc) */ public abstract String getType(); /** return all benkoboxes which feed this ship; order is NOT significant */ public abstract Iterable getBenkoBoxes(); + public BenkoBox getBenkoBox(String s) { + for(BenkoBox b : getBenkoBoxes()) + if (b.getName().equals(s)) + return b; + throw new RuntimeException("unknown port \""+getType()+"."+s+"\""); + } + + public int getOrdinal() { + int ord = 0; + for(Ship s : getFleet()) { + if (s==this) return ord; + if (s.getType() != null && s.getType().equals(getType())) ord++; + } + throw new RuntimeException("inconsistency: Ship does not belong to its own Fleet!"); + } + + public String toString() { return getType() + "[" + getOrdinal() + "]"; } + } diff --git a/src/edu/berkeley/fleet/interpreter/CodeBag.java b/src/edu/berkeley/fleet/interpreter/CodeBag.java new file mode 100644 index 0000000..1e4c1be --- /dev/null +++ b/src/edu/berkeley/fleet/interpreter/CodeBag.java @@ -0,0 +1,83 @@ +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.Instruction; + +import java.util.*; +import java.io.*; + +/** a codebag */ +public class CodeBag { + + private static int max_allocated_descriptor = 1; + private static HashMap codeBagsByDescriptor = new HashMap(); + + public static CodeBag getCodeBagByDescriptor(int descriptor) { + return codeBagsByDescriptor.get(descriptor); + } + + private final int descriptor; + private final CodeBag parent; + private final String name; + private ArrayList dispatchables = new ArrayList(); + private HashMap codeBags = new HashMap(); + + public CodeBag(CodeBag parent, String name) { + this.parent = parent; + this.name = name; + this.descriptor = max_allocated_descriptor++; + codeBagsByDescriptor.put(descriptor, this); + if (parent != null && name != null) + parent.add(name, this); + } + + public void dispatch(Fleet fleet) { + for(Instruction d : dispatchables) { + Log.dispatch(d); + ((Interpreter)fleet).dispatch(d); + } + } + + public void add(Instruction instr) { + dispatchables.add(instr); + } + + public void add(String name, CodeBag instr) { + codeBags.put(name, instr); + } + + public int getDescriptor() { + return descriptor; + } + + public CodeBag getCodeBag(String name) { + CodeBag ret = codeBags.get(name); + if (ret != null) return ret; + if (parent==null) return null; + return parent.getCodeBag(name); + } + + public void dump(Fleet fleet) throws Exception { + DataOutputStream os = new DataOutputStream(new FileOutputStream("fleet.bin")); + for(Instruction i : dispatchables) + fleet.writeInstruction(os, i); + os.flush(); + os.close(); + } + + public String toString() { + if (name != null) return name; + StringBuffer ret = new StringBuffer(); + for(Instruction d : dispatchables) { + ret.append(d); + ret.append("\n"); + } + for(String n : codeBags.keySet()) { + ret.append(n + ": "); + ret.append(codeBags.get(n)); + ret.append("\n"); + } + return "{\n "+Log.indent(ret.toString(), " ")+"\n}"; + } + + +} diff --git a/src/edu/berkeley/fleet/DataInbox.java b/src/edu/berkeley/fleet/interpreter/DataInbox.java similarity index 66% rename from src/edu/berkeley/fleet/DataInbox.java rename to src/edu/berkeley/fleet/interpreter/DataInbox.java index 77f7133..3936405 100644 --- a/src/edu/berkeley/fleet/DataInbox.java +++ b/src/edu/berkeley/fleet/interpreter/DataInbox.java @@ -1,13 +1,14 @@ -package edu.berkeley.fleet; +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; import java.util.*; public class DataInbox extends Inbox { - public DataInbox(Ship ship, String name) { + public DataInbox(InterpreterShip ship, String name) { super(ship, name); } - public DataInbox(Ship ship, String name, boolean noInbox, boolean noChannelDef) { + public DataInbox(InterpreterShip ship, String name, boolean noInbox, boolean noChannelDef) { super(ship, name); this.noInbox = noInbox; this.noChannelDef = noChannelDef; diff --git a/src/edu/berkeley/fleet/interpreter/DataOutbox.java b/src/edu/berkeley/fleet/interpreter/DataOutbox.java new file mode 100644 index 0000000..e524417 --- /dev/null +++ b/src/edu/berkeley/fleet/interpreter/DataOutbox.java @@ -0,0 +1,22 @@ +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; + +public class DataOutbox extends Outbox { + + public DataOutbox(InterpreterShip ship, String name) { super(ship, name); } + public DataOutbox(InterpreterShip ship, String name, boolean special) { + super(ship, name); this.special = special; } + + private Interpreter getInterpreter() { return ((InterpreterShip)getShip()).getInterpreter(); } + public void addDataFromShip(int data) { + addItemFromShip(data); + } + + public boolean readyForDataFromShip() { + return super.readyForItemFromShip(); + } + + protected void send(InterpreterBenkoBox port, int data) { + getInterpreter().sendData(this, data, port); + } +} diff --git a/src/edu/berkeley/fleet/Dispatchable.java b/src/edu/berkeley/fleet/interpreter/Dispatchable.java similarity index 54% rename from src/edu/berkeley/fleet/Dispatchable.java rename to src/edu/berkeley/fleet/interpreter/Dispatchable.java index 224c37b..e73572c 100644 --- a/src/edu/berkeley/fleet/Dispatchable.java +++ b/src/edu/berkeley/fleet/interpreter/Dispatchable.java @@ -1,4 +1,5 @@ -package edu.berkeley.fleet; +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; public abstract class Dispatchable { public abstract void dispatch(Fleet fleet); diff --git a/src/edu/berkeley/fleet/Inbox.java b/src/edu/berkeley/fleet/interpreter/Inbox.java similarity index 80% rename from src/edu/berkeley/fleet/Inbox.java rename to src/edu/berkeley/fleet/interpreter/Inbox.java index ad8492f..cc74b83 100644 --- a/src/edu/berkeley/fleet/Inbox.java +++ b/src/edu/berkeley/fleet/interpreter/Inbox.java @@ -1,12 +1,12 @@ -package edu.berkeley.fleet; +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.Instruction; import java.util.*; /** this is a generic inbox which stores <32-bit items (tokens or data) */ public class Inbox extends InstructionPort { - static Instruction defaultInstruction = null; - // private data ////////////////////////////////////////////////////////////////////////////// /** data which has arrived from the switch fabric but not been acted on */ @@ -19,18 +19,12 @@ public class Inbox extends InstructionPort { private boolean itemReadyForShip = false; /** if an ack token is pending, this is where it should be sent once the item is accepted */ - private Port ackDestinationUponAccept; + private InterpreterBenkoBox ackDestinationUponAccept; // protected methods ///////////////////////////////////////////////////////////////////////// - Inbox(Ship ship, String name) { - super(ship, name); - - // default standing move - if (defaultInstruction != null) - addInstruction(defaultInstruction); - } + Inbox(InterpreterShip ship, String name) { super(ship, name); } /** subclasses invoke this when items arrive from the fabric */ protected final void addItemFromFabric(int data) { @@ -42,13 +36,15 @@ public class Inbox extends InstructionPort { return itemReadyForShip; } + private Interpreter getInterpreter() { return ((InterpreterShip)getShip()).getInterpreter(); } + /** accpets (removes) an item -- invoked by the ship */ protected final int accept() { if (!itemReadyForShip) throw new RuntimeException("invoked accept() on an inbox which does not have items ready; your ship is buggy"); itemReadyForShip = false; if (ackDestinationUponAccept != null) { - getFleet().sendToken(this, ackDestinationUponAccept); + getInterpreter().sendToken(this, ackDestinationUponAccept); ackDestinationUponAccept = null; } return register; @@ -56,7 +52,7 @@ public class Inbox extends InstructionPort { int register = 0; /** invoked by superclass */ - protected final boolean service(Instruction instruction) { + protected final boolean service(Instruction.Executable instruction) { // if data is stuck on itemPresentedToShip, wait for it to go somewhere before // considering additional instructions @@ -66,7 +62,7 @@ public class Inbox extends InstructionPort { if (instruction == null) return false; // check firing conditions - if (instruction.trigger) + if (instruction.tokenIn) throw new RuntimeException("invalid instruction: " + instruction + " (attempts to use trigger on an inbox)"); if (instruction.dataIn && itemsFromFabric.size()==0) return false; @@ -84,13 +80,13 @@ public class Inbox extends InstructionPort { itemReadyForShip = true; // and make note of the fact that we need to send an ack (if requested) - if (instruction.ack) - ackDestinationUponAccept = instruction.destination.resolve(getShip().getFleet()); + if (instruction.tokenIn) + ackDestinationUponAccept = (InterpreterBenkoBox)instruction.dest; - } else if (instruction.ack) { + } else if (instruction.tokenIn) { // if dataOut is not set, we can send the data immediately - getFleet().sendToken(this, instruction.destination.resolve(getShip().getFleet())); + getInterpreter().sendToken(this, (InterpreterBenkoBox)instruction.dest); } return true; } diff --git a/src/edu/berkeley/fleet/interpreter/InstructionPort.java b/src/edu/berkeley/fleet/interpreter/InstructionPort.java new file mode 100644 index 0000000..4fb0c78 --- /dev/null +++ b/src/edu/berkeley/fleet/interpreter/InstructionPort.java @@ -0,0 +1,86 @@ +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.Instruction; + +import java.util.*; + +/** anything that has a source (instruction horn) address on the switch fabric */ +public abstract class InstructionPort extends InterpreterBenkoBox { + + /** the currently executing instruction */ + Instruction.Executable currentlyExecuting = null; + + /** all instructions waiting to be executed (excludes currentlyExecuting) */ + Queue instructions = new LinkedList(); + + /** the count field of currentlyExecuting, taking into account actions already performed */ + int currentlyExecutingCount; + + InstructionPort(InterpreterShip ship, String name) { + super(ship, name); + } + + public void kill(int count) { + if (currentlyExecuting != null) { + currentlyExecuting = null; + count--; + } + for(; count > 0; count--) { + if (instructions.size() == 0) { + if (currentlyExecuting == null) { + Log.error("You have deadlocked ship " + this + + " by sending a kill to an empty ififo. I feel sorry for you."); + return; + } + } else { + instructions.remove(); + } + } + } + + /** an instruction arrives from the instruction horn */ + void addInstruction(Instruction.Executable instr) { + instructions.add(instr); + } + + protected void shutdown(boolean leaveAsInbox) { + if (currentlyExecuting != null || instructions.size() > 0) { + Log.println(Log.red(" WARNING: you left instructions on the instruction queue of port " + + this + "; they are:")); + if (currentlyExecuting != null) + Log.println(" " + currentlyExecuting); + for(Instruction.Executable i : instructions) + Log.println(" " + i); + } + } + + // interface to subclass /////////////////////////////////////////////////////////////////////// + + /** this will be invoked periodically; should return true to "consume" an instruction, false to leave it executing */ + protected abstract boolean service(Instruction.Executable instr); + + protected final void service() { + if (currentlyExecutingCount <= 0) + currentlyExecuting = null; + if (currentlyExecuting == null && instructions.size() > 0) { + currentlyExecuting = instructions.remove(); + currentlyExecutingCount = currentlyExecuting.count; + if (currentlyExecutingCount == 0) currentlyExecutingCount = Integer.MAX_VALUE; + } + + boolean ret = service(currentlyExecuting); + if (!ret) return; + if (currentlyExecuting.recycle) { + currentlyExecuting = currentlyExecuting.decrementCount(); + if (currentlyExecuting != null) + addInstruction(currentlyExecuting); + currentlyExecuting = null; + + } else { + if (currentlyExecuting != null && currentlyExecutingCount != Integer.MAX_VALUE) + currentlyExecutingCount--; + } + } + + +} diff --git a/src/edu/berkeley/fleet/Fleet.java b/src/edu/berkeley/fleet/interpreter/Interpreter.java similarity index 52% rename from src/edu/berkeley/fleet/Fleet.java rename to src/edu/berkeley/fleet/interpreter/Interpreter.java index 13e53eb..1126de7 100644 --- a/src/edu/berkeley/fleet/Fleet.java +++ b/src/edu/berkeley/fleet/interpreter/Interpreter.java @@ -1,5 +1,8 @@ -package edu.berkeley.fleet; +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.*; import java.lang.reflect.*; import edu.berkeley.sbp.chr.*; import edu.berkeley.sbp.misc.*; @@ -10,7 +13,33 @@ import java.util.*; import java.io.*; import edu.berkeley.fleet.ships.*; -public class Fleet { +public class Interpreter extends Fleet implements Iterable { + + public InterpreterBenkoBox resolve(edu.berkeley.fleet.api.BenkoBox bb) { return (InterpreterBenkoBox)bb; } + + public void dispatch(Instruction i) { + + if (i instanceof Instruction.Executable) { + InterpreterBenkoBox sourceBenkoBox = resolve(((Instruction.Executable)i).benkoBox); + if (!(sourceBenkoBox instanceof InstructionPort)) + throw new RuntimeException(sourceBenkoBox + " is not an InstructionPort!"); + ((InstructionPort)sourceBenkoBox).addInstruction(((Instruction.Executable)i)); + + } else if (i instanceof Instruction.Literal.Absolute) { + InterpreterBenkoBox destBenkoBox = resolve(((Instruction.Literal.Absolute)i).dest); + Log.data(((Instruction.Literal.Absolute)i).value+"", null, destBenkoBox); + destBenkoBox.addDataFromFabric((int)((Instruction.Literal.Absolute)i).value); + + } else if (i instanceof Instruction.Kill) { + InterpreterBenkoBox benkoBox = resolve(((Instruction.Kill)i).benkoBox); + if (!(benkoBox instanceof InstructionPort)) + throw new RuntimeException(benkoBox + " is not an InstructionPort!"); + ((InstructionPort)benkoBox).kill(((Instruction.Kill)i).count); + + } else { + throw new Error("unsupported!"); + } + } /** some "halt ship" can turn this on to stop the interpreter */ public boolean halt = false; @@ -18,23 +47,79 @@ public class Fleet { public int[] mem = new int[0]; public ArrayList imports = new ArrayList(); - public ArrayList shiplist = new ArrayList(); - public HashMap ships = new HashMap(); + private static String getUniqueName(Ship ship) { + return ship.getType() + ship.getOrdinal(); + } + + public ArrayList shiplist = new ArrayList(); + public HashMap ships = new HashMap(); + + /** read a machine-formatted instruction from a file (into a Java object) */ + public Instruction readInstruction(DataInputStream is) throws IOException { + // FIXME + return null; + } + + public void writeInstruction(DataOutputStream os, Instruction d) throws IOException { + if (d instanceof Instruction.Executable) { + Instruction.Executable inst = (Instruction.Executable)d; + + InterpreterBenkoBox dest = resolve(inst.dest); + long instr = dest==null ? 0 : (dest.addr << 1); + + instr |= (((long)inst.count) << (11+1)); + if (inst.tokenIn) instr |= (1L << (11+1+7+0)); + if (inst.dataOut) instr |= (1L << (11+1+7+1)); + if (inst.latch) instr |= (1L << (11+1+7+2)); + if (inst.dataIn) instr |= (1L << (11+1+7+3)); + if (inst.tokenOut) instr |= (1L << (11+1+7+4)); + instr |= ((long)resolve(inst.benkoBox).instr_addr) << (11+5+7+1); + long out = 0; + out |= ((InterpreterBenkoBox)ships.get("command").getBenkoBox("data")).addr; + out |= instr << 11; + dump(os, (out >> (5*8)) & 0xff); + dump(os, (out >> (4*8)) & 0xff); + dump(os, (out >> (3*8)) & 0xff); + dump(os, (out >> (2*8)) & 0xff); + dump(os, (out >> (1*8)) & 0xff); + dump(os, (out >> (0*8)) & 0xff); + } else if (d instanceof Instruction.Literal.Absolute) { + Instruction.Literal.Absolute ld = (Instruction.Literal.Absolute)d; + long out = 0; + out |= resolve(ld.dest).addr; + out |= ((long)ld.value) << 11; + dump(os, (out >> (5*8)) & 0xff); + dump(os, (out >> (4*8)) & 0xff); + dump(os, (out >> (3*8)) & 0xff); + dump(os, (out >> (2*8)) & 0xff); + dump(os, (out >> (1*8)) & 0xff); + dump(os, (out >> (0*8)) & 0xff); + } + } + public void dump(OutputStream os, long data_) throws IOException { + int data = (int)data_; + os.write((byte)data); + System.out.println(data); + } + + public Iterator iterator() { + return (Iterator)(Object)shiplist.iterator(); + } public void go() { while(!halt) - for(Ship ship : ships.values()) + for(InterpreterShip ship : ships.values()) for(int j=0; j<10; j++) ship._service(); // run the ships a bit longer for good measure for(int i=0; i<100; i++) - for(Ship ship : ships.values()) + for(InterpreterShip ship : ships.values()) for(int j=0; j<10; j++) ship._service(); // check the state of the ships - for(Ship ship : ships.values()) + for(InterpreterShip ship : ships.values()) ship.shutdown(); Log.println(Log.yellow(" DONE: ====== FLEET is halted. Have a nice day. ======")); @@ -59,29 +144,31 @@ public class Fleet { mem[addr] = data; } - public Ship getShip(String name) { - Ship s = ships.get(name); + public InterpreterShip getShip(String name) { + InterpreterShip s = ships.get(name); if (s == null) throw new RuntimeException("unknown ship \""+name+"\""); return s; } - boolean tryCreate(String classname, String shipname) { + public InterpreterShip tryCreate(String classname, String shipname) { try { Class c = Class.forName(classname); - Constructor con = c.getConstructor(new Class[] { Fleet.class, String.class }); - con.newInstance(new Object[] { this, shipname }); - return true; + Constructor con = c.getConstructor(new Class[] { Interpreter.class, String.class }); + InterpreterShip ret = (InterpreterShip)con.newInstance(new Object[] { this, shipname }); + ships.put(shipname, ret); + shiplist.add(ret); + return ret; } catch (Exception e) { - return false; + return null; } } - public void sendToken(Port source, Port dest) { + public void sendToken(InterpreterBenkoBox source, InterpreterBenkoBox dest) { Log.token(source, dest); dest.addTokenFromFabric(); } - public void sendData(Port source, int data, Port dest) { + public void sendData(InterpreterBenkoBox source, int data, InterpreterBenkoBox dest) { Log.data(data+"", source, dest); dest.addDataFromFabric(data); } @@ -90,33 +177,33 @@ public class Fleet { // 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(Ship ship : shiplist) - for(Port port : ship.portlist) - if (!port.special()) + ArrayList instructionports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special()) instructionports.add(port); FabricTree instructions = - new FabricTree((Port[])instructionports.toArray(new Port[0]), + new FabricTree((InterpreterBenkoBox[])instructionports.toArray(new InterpreterBenkoBox[0]), "ihorn", "instruction"); - ArrayList inputports = new ArrayList(); - for(Ship ship : shiplist) - for(Port port : ship.portlist) - if (!port.special()) + ArrayList inputports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special()) inputports.add(port); FabricTree inputs = - new FabricTree((Port[])inputports.toArray(new Port[0]), + new FabricTree((InterpreterBenkoBox[])inputports.toArray(new InterpreterBenkoBox[0]), "horn", "dest"); - ArrayList outputports = new ArrayList(); - for(Ship ship : shiplist) - for(Port port : ship.portlist) - if (!port.special()) + ArrayList outputports = new ArrayList(); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) + if (!((InterpreterBenkoBox)port).special()) outputports.add(port); FabricTree outputs = - new FabricTree((Port[])outputports.toArray(new Port[0]), + new FabricTree((InterpreterBenkoBox[])outputports.toArray(new InterpreterBenkoBox[0]), "funnel", "source"); @@ -136,7 +223,6 @@ public class Fleet { System.out.println(" input top_r;"); System.out.println(" output top_a;"); System.out.println(" input [(`PACKET_WIDTH-1):0] top;"); - // System.out.println(" wire [(`PACKET_WIDTH-1):0] dest;"); System.out.println(" output data_debug_out_r;"); System.out.println(" input data_debug_out_a;"); System.out.println(" output [(`PACKET_WIDTH-1):0] data_debug_out;"); @@ -148,10 +234,10 @@ public class Fleet { instructions.dumpChannels(true); outputs.dumpChannels(true); inputs.dumpChannels(true); - for(Ship ship : shiplist) - for(Port port : ship.portlist) { - if (ship instanceof CommandShip && port instanceof Outbox) continue; - System.out.println(" wire [(`PACKET_WIDTH-1):0] data_"+ship.getName()+"_"+port.getName()+";"); + for(InterpreterShip ship : shiplist) + for(BenkoBox port : ship.getBenkoBoxes()) { + if (ship instanceof Command && port instanceof Outbox) continue; + System.out.println(" wire [(`PACKET_WIDTH-1):0] data_"+getUniqueName(ship)+"_"+port.getName()+";"); } System.out.println(""); @@ -161,26 +247,26 @@ public class Fleet { System.out.println(""); inputs.dumpChannels(false); System.out.println(""); - for(Ship ship : shiplist) { - System.out.print(ship.getBalsaName()); + 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(Port port : ship.portlist) { + for(BenkoBox port : ship.getBenkoBoxes()) { if (!first) System.out.print(", "); first = false; - System.out.print("data_"+port.getShip().getName()+"_"+port.getName()+"_r, "); - System.out.print("data_"+port.getShip().getName()+"_"+port.getName()+"_a, "); - System.out.print("data_"+port.getShip().getName()+"_"+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(");"); - for(Port port : ship.portlist) { - if (port.special()) continue; + for(BenkoBox port : ship.getBenkoBoxes()) { + if (((InterpreterBenkoBox)port).special()) continue; if (port instanceof Inbox) { - if (port.noInbox()) + if (((InterpreterBenkoBox)port).noInbox()) System.out.print("stupidinbox"); else System.out.print("inbox"); @@ -188,18 +274,18 @@ public class Fleet { System.out.print("outbox"); } System.out.print(" krunk"+(krunk++)+"(clk, "); - System.out.print("instruction_"+port.getShip().getName()+"_"+port.getName()+"_r, "); - System.out.print("instruction_"+port.getShip().getName()+"_"+port.getName()+"_a, "); - System.out.print("instruction_"+port.getShip().getName()+"_"+port.getName()+", "); - System.out.print("dest_"+port.getShip().getName()+"_"+port.getName()+"_r, "); - System.out.print("dest_"+port.getShip().getName()+"_"+port.getName()+"_a, "); - System.out.print("dest_"+port.getShip().getName()+"_"+port.getName()+", "); - System.out.print("source_"+port.getShip().getName()+"_"+port.getName()+"_r, "); - System.out.print("source_"+port.getShip().getName()+"_"+port.getName()+"_a, "); - System.out.print("source_"+port.getShip().getName()+"_"+port.getName()+", "); - System.out.print("data_"+port.getShip().getName()+"_"+port.getName()+"_r, "); - System.out.print("data_"+port.getShip().getName()+"_"+port.getName()+"_a, "); - System.out.print("data_"+port.getShip().getName()+"_"+port.getName()); + 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(); } @@ -218,14 +304,14 @@ public class Fleet { String prefix; Node root; public void dumpChannels(boolean decl) { root.dumpChannels(0, decl); } - public FabricTree(Port[] ports, String component, String prefix) { + 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, Port[] ports, int start, int end, int addr, int bits) { + 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) { - Port p = ports[start]; + InterpreterBenkoBox p = ports[start]; if (prefix.equals("instruction")) { p.instr_addr = addr; p.instr_bits = bits; @@ -245,9 +331,9 @@ public class Fleet { } private String describe(String prefix, Object o) { if (o==null) return null; - if (o instanceof Port) { - Port p = (Port)o; - return prefix+"_"+p.getShip().getName()+"_"+p.getName(); + if (o instanceof InterpreterBenkoBox) { + InterpreterBenkoBox p = (InterpreterBenkoBox)o; + return prefix+"_"+getUniqueName(p.getShip())+"_"+p.getName(); } if (o instanceof Node) { return ((Node)o).describe(prefix); diff --git a/src/edu/berkeley/fleet/Port.java b/src/edu/berkeley/fleet/interpreter/InterpreterBenkoBox.java similarity index 72% rename from src/edu/berkeley/fleet/Port.java rename to src/edu/berkeley/fleet/interpreter/InterpreterBenkoBox.java index 5a6bad3..d9d3311 100644 --- a/src/edu/berkeley/fleet/Port.java +++ b/src/edu/berkeley/fleet/interpreter/InterpreterBenkoBox.java @@ -1,17 +1,23 @@ -package edu.berkeley.fleet; +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.BenkoBox; /** anything that has a destination address on the switch fabric */ -public abstract class Port { +public abstract class InterpreterBenkoBox extends BenkoBox { private final String name; - private final Ship ship; + private final InterpreterShip ship; - public Port(Ship ship, String name) { + public InterpreterBenkoBox(InterpreterShip ship, String name) { this.ship = ship; this.name = name; - ship.addPort(name, this); + ship.addBenkoBox(name, this); } + int bits; + int addr; + int instr_bits; + int instr_addr; protected boolean special = false; protected boolean noInbox = false; protected boolean noChannelDef = false; @@ -21,13 +27,13 @@ public abstract class Port { public boolean noChannelDef() { return noChannelDef; } /** adds one token to the port from the switch fabric side */ - void addTokenFromFabric() { /*throw new RuntimeException("this should never happen!");*/ addDataFromFabric(0); } + void addTokenFromFabric() { addDataFromFabric(0); } /** adds the included datum to the port from the switch fabric side */ void addDataFromFabric(int datum) { throw new RuntimeException("this should never happen!"); } /** adds one token to the port from the ship side */ - public void addTokenFromShip() { /*throw new RuntimeException("this should never happen!");*/ addDataFromShip(0); } + public void addTokenFromShip() { addDataFromShip(0); } /** adds the included datum to the port from the switch fabric side */ public void addDataFromShip(int datum) { throw new RuntimeException("this should never happen!"); } @@ -42,8 +48,6 @@ public abstract class Port { public String getName() { return name; } - int bits; - int addr; - int instr_bits; - int instr_addr; + public int getInstructionFifoLength() { return 4; } + } diff --git a/src/edu/berkeley/fleet/interpreter/InterpreterShip.java b/src/edu/berkeley/fleet/interpreter/InterpreterShip.java new file mode 100644 index 0000000..d4465ab --- /dev/null +++ b/src/edu/berkeley/fleet/interpreter/InterpreterShip.java @@ -0,0 +1,43 @@ +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; + +import edu.berkeley.fleet.api.*; +import java.util.*; +import java.io.*; + +/** a ship, which belongs to a fleet and which may have many ports */ +public abstract class InterpreterShip extends Ship { + + /** You should instantiate a bunch of Inboxes and Outboxes in your constructor */ + public InterpreterShip(Interpreter fleet, String name) { this.fleet = fleet; } + + private Interpreter fleet; + + // this is dumb, the fpga fleet currently requires these in declaration-order; it shouldn't + private ArrayList portlist = new ArrayList(); + private HashMap ports = new HashMap(); + + public Iterable getBenkoBoxes() { return (Iterable)(Object)portlist; } + public String getType() { return getClass().getSimpleName(); } + public Fleet getFleet() { return fleet; } + public Interpreter getInterpreter() { return fleet; } + + /** + * Override this method, check inboxes for the data you need, and + * if you find it, deposit results in an outbox; we'll take care + * of the rest. + */ + public abstract void service(); + + public final void _service() { + for(InterpreterBenkoBox p : ports.values()) p.service(); + service(); + } + + void addBenkoBox(String name, InterpreterBenkoBox port) { ports.put(name, port); portlist.add(port); } + + public void shutdown() { + for(InterpreterBenkoBox p : ports.values()) + p.shutdown(); + } +} diff --git a/src/edu/berkeley/fleet/Log.java b/src/edu/berkeley/fleet/interpreter/Log.java similarity index 76% rename from src/edu/berkeley/fleet/Log.java rename to src/edu/berkeley/fleet/interpreter/Log.java index d6eb662..f3bc864 100644 --- a/src/edu/berkeley/fleet/Log.java +++ b/src/edu/berkeley/fleet/interpreter/Log.java @@ -1,4 +1,6 @@ -package edu.berkeley.fleet; +package edu.berkeley.fleet.interpreter; +import edu.berkeley.fleet.api.*; +import edu.berkeley.fleet.api.Instruction; import java.io.*; public class Log { @@ -27,12 +29,17 @@ public class Log { public static void dispatch(Dispatchable d) { println(green("dispatch: " + indent(d+"", " "))); } + public static void dispatch(Instruction d) { + println(green("dispatch: " + indent(d+"", " "))); + } - public static void data(String data, Port source, Port dest) { - println((" data: ") + indent(purple(data) + (source==null ? "" : (" : " + source))+(" -> "+purple(""+dest)), " ")); + public static void data(String data, BenkoBox source, BenkoBox dest) { + println((" data: ") + indent(purple(data) + + (source==null ? "" : + (" : " + source))+(" -> "+purple(""+dest)), " ")); } - public static void token(Port source, Port dest) { + public static void token(BenkoBox source, BenkoBox dest) { println(purple(" token: ") + (source + " -> " + purple(dest+""))); } @@ -48,6 +55,8 @@ public class Log { public static String invert(Object o) { if (!ansi_color) return o+""; return "\033[7m"+o+"\033[0m"; } public static String bold(Object o) { if (!ansi_color) return o+""; return "\033[1m"+o+"\033[0m"; } + public static void error(Object o) { println(red(o)); } + public static String indent(String s, String indent) { StringBuffer ret = new StringBuffer(); for(int i=0; i + * @author Thomas Kho + */ +public class Parser { + + public Parser(Fleet fleet) { + this.fleet = fleet; + } + + ////////////////////////////////////////////////////////////////////////////// + + private HashMap shipMap = + new HashMap(); + + static Tree parse(Reader r) throws Exception { + InputStream grammarStream = + Parser.class.getClassLoader().getResourceAsStream("edu/berkeley/fleet/parser/fleet.g"); + CharParser metaGrammarParser = new CharParser(MetaGrammar.newInstance()); + Tree parsedGrammar = metaGrammarParser.parse(new CharInput(grammarStream)).expand1(); + Union grammar = Grammar.create(parsedGrammar, "s", new Grammar.Bindings() { }); + CharParser parser = new CharParser(grammar); + Tree tree = parser.parse(new CharInput(r)).expand1(); + return tree; + } + + private Fleet fleet; + private ArrayList imports = new ArrayList(); + + + public CodeBag walk(Reader r) throws Exception { + return walk((Tree)parse(r)); + } + + CodeBag walk(Tree t) { + CodeBag rootCodeBag = null; + String head = t.head(); + if (head==null) { + } else if (head.equals("Program")) { + for(Tree tc : t.child(0)) + walk(tc); + CodeBag cb = new CodeBag(null, null); + if (t.size()>1) + for(Tree statement : t.child(1)) + fillCodeBag(statement, cb); + rootCodeBag = cb; + + } else if (head.equals("Import")) { + imports.add(string(t.child(0))); + + } else if (head.equals("Ship")) { + String name = name(t.child(0)); + String type = string(t.child(1)); + Ship ship = null; + if (fleet instanceof Fleet) { + String classname = type; + boolean good = false; + for(String s : imports) + if ((ship = ((Interpreter)fleet).tryCreate(s+"."+classname, name)) != null) + break; + if (ship==null) + throw new RuntimeException("couldn't find a ship called \""+classname+"\""); + } else { + ship = allocateShip(type); + } + shipMap.put(name, ship); + + } else if (head.equals("Include")) { + try { + walk(parse(new InputStreamReader(new FileInputStream(string(t.child(0)))))); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } else if (head.equals("Memory")) { + if (((Interpreter)fleet).mem.length != 0) + throw new RuntimeException("multiple memory directives found"); + Tree m = t.child(0); + int[] mem = new int[m.size()]; + for(int i=0; i t) { + String ret = ""; + if (t.head() != null) ret += t.head(); + for(Tree c : t) + ret += string(c); + return ret; + } + + String name(Tree t) { + return string(t.child(0))+string(t.child(1)); + } + + BenkoBox portReference(Tree t) { + if (!"Port".equals(t.head())) return null; + String shipName = name(t.child(0)); + String portName = name(t.child(1)); + Ship ship = shipMap.get(shipName); + if (ship==null) throw new RuntimeException("no such ship \""+shipName+"\""); + for(BenkoBox b : ship.getBenkoBoxes()) + if (b.getName().equals(portName)) + return b; + throw new RuntimeException("no such benkobox \""+portName+"\" on ships of type \""+ship.getType()+"\""); + } + + private HashMap numAllocated = new HashMap(); + Ship allocateShip(String shipType) { + int allocated = 0; + if (numAllocated.get(shipType) != null) + allocated = numAllocated.get(shipType); + numAllocated.put(shipType, allocated+1); + for(Iterator it = fleet.iterator(); + it.hasNext(); + ) { + Ship s = it.next(); + if (s.getType().equals(shipType)) { + if (allocated == 0) return s; + allocated--; + } + } + throw new RuntimeException("no more ships of type \""+shipType+"\""); + } + + void fillCodeBag(Tree t, CodeBag cb) { + if (t.head()==null) return; + else if (t.head().equals("NamedCodeBag")) { + CodeBag cb2 = new CodeBag(cb, name(t.child(0))); + for(Tree statement : t.child(1)) + fillCodeBag(statement, cb2); + + } else if (t.head().equals("Literal")) { + int literal = Integer.parseInt(string(t.child(0))); + BenkoBox benkobox = portReference(t.child(1)); + cb.add(new Instruction.Literal.Absolute(benkobox, literal)); + + } else if (t.head().equals("Fiber")) { + BenkoBox benkobox = portReference(t.child(0)); + + OUTER: for(Tree tt : t.child(1)) { + int count = 1; + Tree ttx = null; + boolean recycle = false; + ttx = tt.child(1); + if (tt.size() > 1) { + tt = tt.child(0); + if (tt.size() > 0 && tt.child(0).size()>0) { + tt = tt.child(0); + if (tt.child(0).size() == 0) count=1; + else if (tt.child(0).size() > 0 && "Star".equals(tt.child(0).child(0).head())) count=0; + else count = Integer.parseInt(string(tt.child(0))); + if (tt.size() > 1 && tt.child(1).size() > 0) + recycle = true; + } + } + boolean tokenIn = false; + boolean dataIn = false; + boolean latch = false; + boolean dataOut = false; + boolean tokenOut = false; + BenkoBox dest = null; + for(int i=0; i */ -public class AdderShip extends Ship { +public class Adder extends InterpreterShip { private int link; @@ -17,7 +18,7 @@ public class AdderShip extends Ship { public String getBalsaName() { return "adder"; } - public AdderShip(Fleet fleet, String name) { + public Adder(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/Alu1.java b/src/edu/berkeley/fleet/ships/Alu1.java new file mode 100644 index 0000000..b2b6648 --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Alu1.java @@ -0,0 +1,37 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Alu1 extends InterpreterShip { + + DataInbox in = new DataInbox(this, "in"); + DataInbox op = new DataInbox(this, "op"); + DataOutbox out = new DataOutbox(this, "out"); + + public Alu1(Interpreter fleet, String name) { super(fleet, name); } + + public String getBalsaName() { return "alu1"; } + + public void service() { + if (in.dataReadyForShip() && op.dataReadyForShip()) { + int data = in.removeDataForShip(); + int opcode = in.removeDataForShip(); + switch(opcode) { + case 0: out.addDataFromShip(-1 * data); // NEG + break; + case 1: out.addDataFromShip(data+1); // INC + break; + case 2: out.addDataFromShip(data-1); // DEC + break; + case 3: out.addDataFromShip(Math.abs(data)); // ABS + break; + default: out.addDataFromShip(0); + break; + } + } + } + +} diff --git a/src/edu/berkeley/fleet/ships/Alu2.java b/src/edu/berkeley/fleet/ships/Alu2.java new file mode 100644 index 0000000..442cf84 --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Alu2.java @@ -0,0 +1,41 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Alu2 extends InterpreterShip { + + DataInbox ap = new DataInbox(this, "a"); + DataInbox bp = new DataInbox(this, "b"); + DataInbox opp = new DataInbox(this, "op"); + DataOutbox out = new DataOutbox(this, "out"); + + public Alu2(Interpreter fleet, String name) { super(fleet, name); } + + public String getBalsaName() { return "alu2"; } + + public void service() { + if (ap.dataReadyForShip() && bp.dataReadyForShip() && opp.dataReadyForShip()) { + int a = ap.removeDataForShip(); + int b = bp.removeDataForShip(); + int op = opp.removeDataForShip(); + switch(op) { + case 0: out.addDataFromShip(a+b); // ADD + break; + case 1: out.addDataFromShip(a-b); // SUB + break; + case 2: out.addDataFromShip(a*b); // MUL + break; + case 3: out.addDataFromShip(a/b); // DIV + break; + case 4: out.addDataFromShip(a%b); // REM + break; + default: out.addDataFromShip(0); + break; + } + } + } + +} diff --git a/src/edu/berkeley/fleet/ships/ArithmeticShip.java b/src/edu/berkeley/fleet/ships/ArithmeticShip.java index 7d104d0..f41e2f3 100644 --- a/src/edu/berkeley/fleet/ships/ArithmeticShip.java +++ b/src/edu/berkeley/fleet/ships/ArithmeticShip.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; @@ -17,7 +18,7 @@ make much sense. /** * @author Dominic Antonelli */ -public class ArithmeticShip extends Ship { +public class ArithmeticShip extends InterpreterShip { private int link; @@ -26,7 +27,7 @@ public class ArithmeticShip extends Ship { DataInbox cmd = new DataInbox(this, "cmd"); DataOutbox out = new DataOutbox(this, "out"); - public ArithmeticShip(Fleet fleet, String name) { + public ArithmeticShip(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/BitBucketShip.java b/src/edu/berkeley/fleet/ships/BitBucketShip.java deleted file mode 100644 index 36e61e3..0000000 --- a/src/edu/berkeley/fleet/ships/BitBucketShip.java +++ /dev/null @@ -1,21 +0,0 @@ -package edu.berkeley.fleet.ships; -import edu.berkeley.fleet.*; - -import java.util.*; -import java.io.*; - -public class BitBucketShip extends Ship { - - TokenInbox token = new TokenInbox(this, "token"); - DataInbox data = new DataInbox(this, "data"); - - public BitBucketShip(Fleet fleet, String name) { - super(fleet, name); - } - - public void service() { - if (token.tokenReadyForShip()) token.removeTokenForShip(); - if (data.dataReadyForShip()) data.removeDataForShip(); - } - -} diff --git a/src/edu/berkeley/fleet/ships/CommandShip.java b/src/edu/berkeley/fleet/ships/Command.java similarity index 83% rename from src/edu/berkeley/fleet/ships/CommandShip.java rename to src/edu/berkeley/fleet/ships/Command.java index dc00a0e..5b3df01 100644 --- a/src/edu/berkeley/fleet/ships/CommandShip.java +++ b/src/edu/berkeley/fleet/ships/Command.java @@ -1,17 +1,18 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class CommandShip extends Ship { +public class Command extends InterpreterShip { DataInbox data = new DataInbox(this, "data", true, false); DataOutbox out = new DataOutbox(this, "out", true); public String getBalsaName() { return "command"; } - public CommandShip(Fleet fleet, String name) { + public Command(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/CounterShip.java b/src/edu/berkeley/fleet/ships/Counter.java similarity index 85% rename from src/edu/berkeley/fleet/ships/CounterShip.java rename to src/edu/berkeley/fleet/ships/Counter.java index 8022ba6..c3d4fa7 100644 --- a/src/edu/berkeley/fleet/ships/CounterShip.java +++ b/src/edu/berkeley/fleet/ships/Counter.java @@ -1,10 +1,11 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class CounterShip extends Ship { +public class Counter extends InterpreterShip { private int count = 0; @@ -12,7 +13,7 @@ public class CounterShip extends Ship { TokenInbox decrement = new TokenInbox(this, "decrement"); TokenOutbox zero = new TokenOutbox(this, "zero"); - public CounterShip(Fleet fleet, String name) { + public Counter(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/DeMux.java b/src/edu/berkeley/fleet/ships/DeMux.java new file mode 100644 index 0000000..d5c081c --- /dev/null +++ b/src/edu/berkeley/fleet/ships/DeMux.java @@ -0,0 +1,34 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class DeMux extends InterpreterShip { + + DataInbox inp = new DataInbox(this, "in"); + DataInbox selp = new DataInbox(this, "select"); + DataOutbox truep = new DataOutbox(this, "true"); + DataOutbox falsep = new DataOutbox(this, "false"); + + public String getBalsaName() { return "demux"; } + + public DeMux (Interpreter fleet, String name) { + super(fleet, name); + } + + public void service() { + if (inp.dataReadyForShip() && selp.dataReadyForShip() && + truep.readyForDataFromShip() && falsep.readyForDataFromShip()) { + int in = inp.removeDataForShip(); + int sel = selp.removeDataForShip(); + if (sel==0) + falsep.addDataFromShip(in); + else + truep.addDataFromShip(in); + } + } + +} + diff --git a/src/edu/berkeley/fleet/ships/DebugShip.java b/src/edu/berkeley/fleet/ships/Debug.java similarity index 84% rename from src/edu/berkeley/fleet/ships/DebugShip.java rename to src/edu/berkeley/fleet/ships/Debug.java index 43284a8..43862e5 100644 --- a/src/edu/berkeley/fleet/ships/DebugShip.java +++ b/src/edu/berkeley/fleet/ships/Debug.java @@ -1,10 +1,11 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class DebugShip extends Ship { +public class Debug extends InterpreterShip { //TokenInbox token = new TokenInbox(this, "token"); DataInbox data = new DataInbox(this, "data", true, false); @@ -12,7 +13,7 @@ public class DebugShip extends Ship { public String getBalsaName() { return "debug"; } - public DebugShip(Fleet fleet, String name) { + public Debug(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/Dup.java b/src/edu/berkeley/fleet/ships/Dup.java new file mode 100644 index 0000000..0e982bc --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Dup.java @@ -0,0 +1,29 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Dup extends InterpreterShip { + + DataInbox in = new DataInbox(this, "in"); + DataOutbox a = new DataOutbox(this, "a"); + DataOutbox b = new DataOutbox(this, "b"); + + public String getBalsaName() { return "dup"; } + + public Dup (Interpreter fleet, String name) { + super(fleet, name); + } + + public void service() { + if (in.dataReadyForShip() && a.readyForDataFromShip() && b.readyForDataFromShip()) { + int data = in.removeDataForShip(); + a.addDataFromShip(data); + b.addDataFromShip(data); + } + } + +} + diff --git a/src/edu/berkeley/fleet/ships/Dup3.java b/src/edu/berkeley/fleet/ships/Dup3.java new file mode 100644 index 0000000..0060cd9 --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Dup3.java @@ -0,0 +1,31 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Dup3 extends InterpreterShip { + + DataInbox in = new DataInbox(this, "in"); + DataOutbox a = new DataOutbox(this, "a"); + DataOutbox b = new DataOutbox(this, "b"); + DataOutbox c = new DataOutbox(this, "c"); + + public String getBalsaName() { return "dup3"; } + + public Dup3 (Interpreter fleet, String name) { + super(fleet, name); + } + + public void service() { + if (in.dataReadyForShip() && a.readyForDataFromShip() && b.readyForDataFromShip() && c.readyForDataFromShip()) { + int data = in.removeDataForShip(); + a.addDataFromShip(data); + b.addDataFromShip(data); + c.addDataFromShip(data); + } + } + +} + diff --git a/src/edu/berkeley/fleet/ships/DuplicatorShip.java b/src/edu/berkeley/fleet/ships/DuplicatorShip.java index 271dd16..276074b 100644 --- a/src/edu/berkeley/fleet/ships/DuplicatorShip.java +++ b/src/edu/berkeley/fleet/ships/DuplicatorShip.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; @@ -7,7 +8,7 @@ import java.io.*; /** * @author Dominic Antonelli */ -public class DuplicatorShip extends Ship { +public class DuplicatorShip extends InterpreterShip { DataInbox in = new DataInbox(this, "in"); DataOutbox out0 = new DataOutbox(this, "out0"); @@ -15,7 +16,7 @@ public class DuplicatorShip extends Ship { DataOutbox out2 = new DataOutbox(this, "out2"); DataOutbox out3 = new DataOutbox(this, "out3"); - public DuplicatorShip (Fleet fleet, String name) { + public DuplicatorShip (Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/FetchShip.java b/src/edu/berkeley/fleet/ships/FetchShip.java index fc21c93..f6d1656 100644 --- a/src/edu/berkeley/fleet/ships/FetchShip.java +++ b/src/edu/berkeley/fleet/ships/FetchShip.java @@ -1,17 +1,18 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class FetchShip extends Ship { +public class FetchShip extends InterpreterShip { DataInbox codebag = new DataInbox(this, "codebag"); TokenInbox release = new TokenInbox(this, "release"); TokenInbox revoke = new TokenInbox(this, "revoke"); TokenOutbox done = new TokenOutbox(this, "done"); - public FetchShip(Fleet fleet, String name) { + public FetchShip(Interpreter fleet, String name) { super(fleet, name); } @@ -29,7 +30,7 @@ public class FetchShip extends Ship { release.removeTokenForShip(); if (cb==null) throw new RuntimeException("bogus codebag -- this should not happen"); - cb.dispatch(getFleet()); + cb.dispatch(getInterpreter()); } done.addTokenFromShip(); diff --git a/src/edu/berkeley/fleet/ships/FifoShip.java b/src/edu/berkeley/fleet/ships/Fifo.java similarity index 79% rename from src/edu/berkeley/fleet/ships/FifoShip.java rename to src/edu/berkeley/fleet/ships/Fifo.java index 195444f..b0fb610 100644 --- a/src/edu/berkeley/fleet/ships/FifoShip.java +++ b/src/edu/berkeley/fleet/ships/Fifo.java @@ -1,19 +1,20 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class FifoShip extends Ship { +public class Fifo extends InterpreterShip { DataInbox in = new DataInbox(this, "in"); DataOutbox out = new DataOutbox(this, "out"); - public String getBalsaName() { return "fifoship"; } + public String getBalsaName() { return "fifo"; } private Queue fifo = new LinkedList(); - public FifoShip(Fleet fleet, String name) { + public Fifo(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/HaltShip.java b/src/edu/berkeley/fleet/ships/HaltShip.java index d10e43f..d5d72e3 100644 --- a/src/edu/berkeley/fleet/ships/HaltShip.java +++ b/src/edu/berkeley/fleet/ships/HaltShip.java @@ -1,21 +1,22 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class HaltShip extends Ship { +public class HaltShip extends InterpreterShip { TokenInbox in = new TokenInbox(this, "in"); - public HaltShip(Fleet fleet, String name) { + public HaltShip(Interpreter fleet, String name) { super(fleet, name); } public void service() { if (!in.tokenReadyForShip()) return; in.removeTokenForShip(); - getFleet().halt = true; + ((Interpreter)getInterpreter()).halt = true; Log.println(Log.yellow(" HALT: ====== halt ship got a token; halting the fleet ======")); } diff --git a/src/edu/berkeley/fleet/ships/HomeworkCounter.java b/src/edu/berkeley/fleet/ships/HomeworkCounter.java index c8e9fb5..04eac70 100644 --- a/src/edu/berkeley/fleet/ships/HomeworkCounter.java +++ b/src/edu/berkeley/fleet/ships/HomeworkCounter.java @@ -1,10 +1,11 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class HomeworkCounter extends Ship { +public class HomeworkCounter extends InterpreterShip { private int count = -1; @@ -13,7 +14,7 @@ public class HomeworkCounter extends Ship { DataInbox load = new DataInbox(this, "load"); TokenInbox ask = new TokenInbox(this, "ask"); - public HomeworkCounter(Fleet fleet, String name) { + public HomeworkCounter(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/Lut.java b/src/edu/berkeley/fleet/ships/Lut.java new file mode 100644 index 0000000..4fa1a9d --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Lut.java @@ -0,0 +1,33 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Lut extends InterpreterShip { + + DataInbox ap = new DataInbox(this, "a"); + DataInbox bp = new DataInbox(this, "b"); + DataInbox lutp = new DataInbox(this, "lut"); + DataOutbox out = new DataOutbox(this, "out"); + + public Lut(Interpreter fleet, String name) { super(fleet, name); } + + public String getBalsaName() { return "lut"; } + + public void service() { + if (ap.dataReadyForShip() && bp.dataReadyForShip() && lutp.dataReadyForShip()) { + int a = ap.removeDataForShip(); + int b = bp.removeDataForShip(); + int lut = lutp.removeDataForShip(); + int ret = 0; + if ((lut & 1) != 0) ret |= (~a) & (~b); + if ((lut & 2) != 0) ret |= (a) & (~b); + if ((lut & 4) != 0) ret |= (~a) & (b); + if ((lut & 8) != 0) ret |= a & b; + out.addDataFromShip(ret); + } + } + +} diff --git a/src/edu/berkeley/fleet/ships/MemoryReadShip.java b/src/edu/berkeley/fleet/ships/MemoryReadShip.java index 632d88d..3ffb974 100644 --- a/src/edu/berkeley/fleet/ships/MemoryReadShip.java +++ b/src/edu/berkeley/fleet/ships/MemoryReadShip.java @@ -1,10 +1,11 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; import java.io.*; -public class MemoryReadShip extends Ship { +public class MemoryReadShip extends InterpreterShip { boolean _loaded = false; int _count = 0; @@ -17,14 +18,14 @@ public class MemoryReadShip extends Ship { DataOutbox data = new DataOutbox(this, "data"); TokenOutbox done = new TokenOutbox(this, "done"); - public MemoryReadShip(Fleet fleet, String name) { + public MemoryReadShip(Interpreter fleet, String name) { super(fleet, name); } public void service() { if (_count > 0) { if (!data.readyForDataFromShip()) return; - data.addDataFromShip(_addr>=getFleet().mem.length ? 0 : getFleet().mem[_addr]); + data.addDataFromShip(_addr>=getInterpreter().mem.length ? 0 : getInterpreter().mem[_addr]); _count--; _addr += _stride; if (_count==0) diff --git a/src/edu/berkeley/fleet/ships/MemoryWriteShip.java b/src/edu/berkeley/fleet/ships/MemoryWriteShip.java index 6541638..ed171c7 100644 --- a/src/edu/berkeley/fleet/ships/MemoryWriteShip.java +++ b/src/edu/berkeley/fleet/ships/MemoryWriteShip.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; @@ -7,7 +8,7 @@ import java.io.*; /** * @author Thomas Kho */ -public class MemoryWriteShip extends Ship { +public class MemoryWriteShip extends InterpreterShip { int _count = 0; int _stride = 0; @@ -19,14 +20,14 @@ public class MemoryWriteShip extends Ship { DataInbox data = new DataInbox(this, "data"); TokenOutbox done = new TokenOutbox(this, "done"); - public MemoryWriteShip(Fleet fleet, String name) { + public MemoryWriteShip(Interpreter fleet, String name) { super(fleet, name); } public void service() { if (_count > 0) { if (!data.dataReadyForShip()) return; - getFleet().writeMem(_addr, data.removeDataForShip()); + getInterpreter().writeMem(_addr, data.removeDataForShip()); _count--; _addr += _stride; if (_count==0) diff --git a/src/edu/berkeley/fleet/ships/MultiplierShip.java b/src/edu/berkeley/fleet/ships/MultiplierShip.java index f5a8945..ceb6b5b 100644 --- a/src/edu/berkeley/fleet/ships/MultiplierShip.java +++ b/src/edu/berkeley/fleet/ships/MultiplierShip.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; @@ -7,7 +8,7 @@ import java.io.*; /** * @author Dominic Antonelli */ -public class MultiplierShip extends Ship { +public class MultiplierShip extends InterpreterShip { private int link; @@ -16,7 +17,7 @@ public class MultiplierShip extends Ship { DataOutbox out0 = new DataOutbox(this, "out0"); DataOutbox out1 = new DataOutbox(this, "out1"); - public MultiplierShip(Fleet fleet, String name) { + public MultiplierShip(Interpreter fleet, String name) { super(fleet, name); } diff --git a/src/edu/berkeley/fleet/ships/Mux.java b/src/edu/berkeley/fleet/ships/Mux.java new file mode 100644 index 0000000..7701a6d --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Mux.java @@ -0,0 +1,28 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Mux extends InterpreterShip { + + DataInbox ap = new DataInbox(this, "a"); + DataInbox bp = new DataInbox(this, "b"); + DataInbox choicep = new DataInbox(this, "select"); + DataOutbox out = new DataOutbox(this, "out"); + + public Mux(Interpreter fleet, String name) { super(fleet, name); } + + public String getBalsaName() { return "mux"; } + + public void service() { + if (ap.dataReadyForShip() && bp.dataReadyForShip() && choicep.dataReadyForShip()) { + int a = ap.removeDataForShip(); + int b = bp.removeDataForShip(); + int choice = choicep.removeDataForShip(); + out.addDataFromShip(choice==0 ? a : b); + } + } + +} diff --git a/src/edu/berkeley/fleet/ships/ScatterShip.java b/src/edu/berkeley/fleet/ships/ScatterShip.java index a1919ef..81a08fe 100644 --- a/src/edu/berkeley/fleet/ships/ScatterShip.java +++ b/src/edu/berkeley/fleet/ships/ScatterShip.java @@ -1,4 +1,5 @@ package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; import edu.berkeley.fleet.*; import java.util.*; @@ -7,7 +8,7 @@ import java.io.*; /** * @author Dominic Antonelli */ -public class ScatterShip extends Ship { +public class ScatterShip extends InterpreterShip { DataInbox in = new DataInbox(this, "in"); Vector out = new Vector(); @@ -15,7 +16,7 @@ public class ScatterShip extends Ship { private int size = 2; private int state = 0; - public ScatterShip(Fleet fleet, String name) { + public ScatterShip(Interpreter fleet, String name) { super(fleet, name); init(); } diff --git a/src/edu/berkeley/fleet/ships/Shifter.java b/src/edu/berkeley/fleet/ships/Shifter.java new file mode 100644 index 0000000..f532e7f --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Shifter.java @@ -0,0 +1,32 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Shifter extends InterpreterShip { + + private int count = 0; + + DataInbox valp = new DataInbox(this, "val"); + DataInbox shamtp = new DataInbox(this, "shamt"); + DataOutbox out = new DataOutbox(this, "out"); + + public Shifter(Interpreter fleet, String name) { + super(fleet, name); + } + + public String getBalsaName() { return "shift"; } + + public void service() { + if (valp.dataReadyForShip() && shamtp.dataReadyForShip()) { + int val = valp.removeDataForShip(); + int shamt = shamtp.removeDataForShip(); + if (shamt < 0) val = val >> (-1 * shamt); + else val = val << shamt; + out.addDataFromShip(val); + } + } + +} diff --git a/src/edu/berkeley/fleet/ships/Sort2.java b/src/edu/berkeley/fleet/ships/Sort2.java new file mode 100644 index 0000000..1d2c8e3 --- /dev/null +++ b/src/edu/berkeley/fleet/ships/Sort2.java @@ -0,0 +1,28 @@ +package edu.berkeley.fleet.ships; +import edu.berkeley.fleet.interpreter.*; +import edu.berkeley.fleet.*; + +import java.util.*; +import java.io.*; + +public class Sort2 extends InterpreterShip { + + DataInbox ap = new DataInbox(this, "a"); + DataInbox bp = new DataInbox(this, "b"); + DataOutbox min = new DataOutbox(this, "min"); + DataOutbox max = new DataOutbox(this, "max"); + + public Sort2(Interpreter fleet, String name) { super(fleet, name); } + + public String getBalsaName() { return "sort2"; } + + public void service() { + if (ap.dataReadyForShip() && bp.dataReadyForShip()) { + int a = ap.removeDataForShip(); + int b = bp.removeDataForShip(); + max.addDataFromShip(Math.max(a,b)); + min.addDataFromShip(Math.min(a,b)); + } + } + +} diff --git a/src/edu/berkeley/fleet/ships/TokenFifo.java b/src/edu/berkeley/fleet/ships/TokenFifo.java deleted file mode 100644 index e2fad3f..0000000 --- a/src/edu/berkeley/fleet/ships/TokenFifo.java +++ /dev/null @@ -1,30 +0,0 @@ -package edu.berkeley.fleet.ships; -import edu.berkeley.fleet.*; - -import java.util.*; -import java.io.*; - -public class TokenFifo extends Ship { - - private int count = 0; - - TokenOutbox out = new TokenOutbox(this, "out"); - TokenInbox in = new TokenInbox(this, "in"); - - public TokenFifo(Fleet fleet, String name) { - super(fleet, name); - } - - public void service() { - if (in.tokenReadyForShip()) { - count++; - in.removeTokenForShip(); - return; - } - if (count > 0 && out.readyForTokenFromShip()) { - count--; - out.addTokenFromShip(); - } - } - -} diff --git a/src/edu/berkeley/fleet/ships/TokenSourceShip.java b/src/edu/berkeley/fleet/ships/TokenSourceShip.java deleted file mode 100644 index c65d0ff..0000000 --- a/src/edu/berkeley/fleet/ships/TokenSourceShip.java +++ /dev/null @@ -1,23 +0,0 @@ -package edu.berkeley.fleet.ships; -import edu.berkeley.fleet.*; - -import java.util.*; -import java.io.*; - -public class TokenSourceShip extends Ship { - - TokenOutbox out = new TokenOutbox(this, "out"); - - public TokenSourceShip(Fleet fleet, String name) { - super(fleet, name); - } - - public void service() { - if (out.readyForTokenFromShip()) - out.addTokenFromShip(); - } - - public void shutdown() { - } - -} -- 1.7.10.4