add write capability to Process.MemoryModule
authoradam <adam@megacz.com>
Mon, 3 Nov 2008 13:31:55 +0000 (14:31 +0100)
committeradam <adam@megacz.com>
Mon, 3 Nov 2008 13:31:55 +0000 (14:31 +0100)
src/edu/berkeley/fleet/ir/Process.java

index 7527121..4938b43 100644 (file)
@@ -127,7 +127,10 @@ public class Process {
             }
             public void recvToken(Context.LoopFactory lf) { lf.recvToken(); }
             public void sendWord(Context.LoopFactory lf) { lf.sendWord(dock.getDataDestination()); }
-            public void build(Context ctx) { build(ctx, ctx.new LoopFactory(dock, 1)); }
+            public void build(Context ctx) {
+                if (peer==null && pattern.length==1 && pattern[0]==null) return;
+                build(ctx, ctx.new LoopFactory(dock, 1));
+            }
             // number-in-flight is considered a property of the input dock in a pair
             //public int getInflight() { return 4; }
             public int getInflight() { return 1; }
@@ -136,6 +139,7 @@ public class Process {
                 if (dock.getShip().getType().equals("Debug")) {
                     return;
                 }
+                if (peer==null && pattern.length==1 && pattern[0]==null) return;
                 switch(phase) {
                     case 0: {
                         torpedoes.add(dock);
@@ -164,6 +168,7 @@ public class Process {
                 }
             }
             protected void build(Context ctx, Context.LoopFactory lf) {
+                if (peer==null && pattern.length==1 && pattern[0]==null) return;
                 int inflight = (count != 0 && count < getInflight()) ? count : getInflight();
 
                 if (peer!=null)
@@ -375,12 +380,14 @@ public class Process {
         public final Ship    ship;
         public final InPort  inAddrRead1;
         public final InPort  inAddrRead2;
-        //public final InPort  inAddrWrite;
-        //public final InPort  inDataWrite;
+        public final InPort  inAddrWrite;
+        public final InPort  inDataWrite;
         public final OutPort outRead1;
         public final OutPort outRead2;
         public MemoryModule(Ship memoryShip) {
             this.ship = memoryShip;
+            this.inAddrWrite  = new DockInPort("inAddrWrite", ship.getDock("inAddrWrite"));
+            this.inDataWrite  = new DockInPort("inDataWrite", ship.getDock("inDataWrite"));
             this.inAddrRead1  = new InPort("inAddrRead1") {
                     public void recvToken(Context.LoopFactory lf) { lf.recvToken(); }
                     public void sendWord(Context.LoopFactory lf) { lf.sendWord(ship.getDock("inAddrRead").getDataDestination(), new BitVector(1).set(0)); }
@@ -436,15 +443,19 @@ public class Process {
             lf = ctx.new LoopFactory(ship.getDock("out"), 0);
             lf.abortLoopIfTorpedoPresent();
             lf.collectWord();
+            lf.setFlags(FlagFunction.ZERO, FlagFunction.ZERO.add(FlagC));
+            lf.setPredicate(Predicate.FlagB);
+            // here: any code to be executed when inDataWrite gets completed
+            lf.setPredicate(Predicate.NotFlagB);
             lf.abortLoopIfTorpedoPresent();
             lf.recvToken();
-            lf.setFlags(FlagFunction.ZERO.add(FlagC), FlagFunction.ZERO);
+            lf.setFlags(FlagFunction.ZERO.add(NotFlagC).add(FlagB), FlagFunction.ZERO.add(FlagC).add(FlagB));
             if (outRead1.peer != null) {
-                lf.setPredicate(Predicate.NotFlagA);
+                lf.setPredicate(Predicate.NotFlagB);
                 outRead1.peer.sendWord(lf);
             }
             if (outRead2.peer != null) {
-                lf.setPredicate(Predicate.FlagA);
+                lf.setPredicate(Predicate.NotFlagA);
                 outRead2.peer.sendWord(lf);
             }
             lf.setPredicate(null);