From f0c92969e8bc338c203b95fcaaf0f62a1101dbc9 Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 4 Dec 2006 04:22:39 +0100 Subject: [PATCH] added Tommy Kho memory patch --- flow-control-example.fleet | 4 +- src/edu/berkeley/fleet/Fleet.java | 15 ++++++- src/edu/berkeley/fleet/FleetParser.java | 28 +++++++++++- src/edu/berkeley/fleet/Log.java | 2 +- src/edu/berkeley/fleet/ships/MemoryWriteShip.java | 49 +++++++++++++++++++++ 5 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 src/edu/berkeley/fleet/ships/MemoryWriteShip.java diff --git a/flow-control-example.fleet b/flow-control-example.fleet index be44680..d1c23be 100644 --- a/flow-control-example.fleet +++ b/flow-control-example.fleet @@ -1,6 +1,6 @@ #import edu.berkeley.fleet.ships -#ship math : ArithmeticShip +//#ship math : ArithmeticShip #ship helper : FifoShip #ship source : FifoShip #ship dest : FifoShip @@ -11,7 +11,7 @@ // NOTE: "accept" is a synonym for "move" it is less confusing in the case // of inboxes, but is otherwise identical -"foo" -> math.din +//"foo" -> math.din ////////////////////////////////////////////////////////////////////////////// // The following three instructions simply produce one hundred "3"s diff --git a/src/edu/berkeley/fleet/Fleet.java b/src/edu/berkeley/fleet/Fleet.java index 7a9cc9e..2c570be 100644 --- a/src/edu/berkeley/fleet/Fleet.java +++ b/src/edu/berkeley/fleet/Fleet.java @@ -39,13 +39,24 @@ public class Fleet { } public void dumpMem() { + Log.print(Log.cyan(" MEMORY: ")); for(int i=0; i= mem.length) { + int[] mem2 = new int[addr*2+1]; + System.arraycopy(mem, 0, mem2, 0, mem2.length); + mem = mem2; + } + mem[addr] = data; + } + public Ship getShip(String name) { Ship s = ships.get(name); if (s == null) throw new RuntimeException("unknown ship \""+name+"\""); diff --git a/src/edu/berkeley/fleet/FleetParser.java b/src/edu/berkeley/fleet/FleetParser.java index 5132605..78934e3 100644 --- a/src/edu/berkeley/fleet/FleetParser.java +++ b/src/edu/berkeley/fleet/FleetParser.java @@ -10,6 +10,10 @@ import java.util.*; import java.io.*; import static edu.berkeley.fleet.Instruction.IgnoreCopyTake.*; +/** + * @author Adam Megacz + * @author Thomas Kho + */ public class FleetParser { public static void main(String[] s) throws Exception { @@ -33,11 +37,21 @@ public class FleetParser { DataInbox.defaultInstruction = null; continue; } + } else if (s[i].startsWith("--memory=")) { + String val = s[i].substring(s[i].indexOf('=')+1); + if (val.equals("hide")) { + debugMemory = false; + continue; + } else if (val.equals("show")) { + debugMemory = true; + continue; + } } System.out.println("Fleeterpreter usage:"); System.out.println(""); System.out.println(" --color={on|off}"); System.out.println(" --inboxes={configured|unconfigured}"); + System.out.println(" --memory={hide|show}"); System.exit(-1); } go(new InputStreamReader(System.in)); @@ -63,6 +77,7 @@ public class FleetParser { private Fleet fleet; private ArrayList imports = new ArrayList(); private CodeBag rootCodeBag; + private static boolean debugMemory = true; public FleetParser(Fleet fleet) { this.fleet = fleet; @@ -70,8 +85,11 @@ public class FleetParser { public void done() { if (rootCodeBag != null) { + if (debugMemory) { fleet.dumpMem(); } + System.out.println(rootCodeBag); rootCodeBag.dispatch(fleet); fleet.go(); + if (debugMemory) { fleet.dumpMem(); } } } @@ -84,7 +102,6 @@ public class FleetParser { CodeBag cb = new CodeBag(null, null); for(Tree statement : t.child(1)) fillCodeBag(statement, cb); - System.out.println(cb); rootCodeBag = cb; } else if (head.equals("Import")) { @@ -101,6 +118,15 @@ public class FleetParser { } if (!good) throw new RuntimeException("couldn't find a ship called \""+classname+"\""); + + } 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 + */ +public class MemoryWriteShip extends Ship { + + int _count = 0; + int _stride = 0; + int _addr = 0; + + DataInbox addr = new DataInbox(this, "addr"); + DataInbox stride = new DataInbox(this, "stride"); + DataInbox count = new DataInbox(this, "count"); + DataInbox data = new DataInbox(this, "data"); + TokenOutbox done = new TokenOutbox(this, "done"); + + public MemoryWriteShip(Fleet fleet, String name) { + super(fleet, name); + } + + public void service() { + if (_count > 0) { + if (!data.dataReadyForShip()) return; + if (_addr<=getFleet().mem.length) + getFleet().writeMem(_addr, data.removeDataForShip()); + _count--; + _addr += _stride; + if (_count==0) + done.addTokenFromShip(); + } else { + if (count.dataReadyForShip() && + addr.dataReadyForShip() && + stride.dataReadyForShip() && + done.readyForTokenFromShip() && + data.dataReadyForShip()) { + + _count = count.removeDataForShip(); + _addr = addr.removeDataForShip(); + _stride = stride.removeDataForShip(); + } + } + } + +} -- 1.7.10.4