update with ZOMA and new memread/memwrite
[fleet.git] / src / edu / berkeley / fleet / Program.java
index 9515a1a..d67d394 100644 (file)
@@ -55,12 +55,18 @@ public class Program {
     }
 
     public static @bind.as("LiteralMove")    Statement move(String value, Port[] dest) {
-        return new LiteralMove(Integer.parseInt(value), dest);
+        return new Move(Integer.parseInt(value), dest);
+    }
+    public static @bind.as("LiteralCountMove")    Statement move(String value, String count,
+                                                                 Port[] dest) {
+        return new Move(Integer.parseInt(value), dest, Integer.parseInt(count));
     }
 
-    public static @bind.as("->*")      Statement smove(Port source, Port[] dest) {
-        //return new SMove(source, dest);
-        return null;
+    public static @bind.as("-(*)->")      Statement smove(Port source, Port[] dest) {
+        return new Move(source, dest, Integer.MAX_VALUE);
+    }
+    public static @bind.as("-(")      Statement smove(Port source, String count, Port[] dest) {
+        return new Move(source, dest, Integer.parseInt(count));
     }
 
     public static @bind.as("<-")       Statement gets(Port dest, Port source) {
@@ -77,6 +83,7 @@ public class Program {
 
     public static @bind.as("ShipName") String    shipname(String name, String index) { return index==null?name:name+index; }
     public static @bind.as("PortName") String    portname(String name, String index) { return index==null?name:name+index; }
+    public static @bind.as("Name") String name(String a, String b) { return a+b; }
 
     public static interface Source { }
     public static interface Destination { }
@@ -150,40 +157,39 @@ public class Program {
     public static class Move implements Statement {
         Port source;
         Port[] dest;
-        public Move(Port source, Port[] dest) { this.source = source; this.dest = dest; }
-        public void dispatch(Fleet fleet) {
-            Ship.Outbox ob = fleet.getOutbox(source.ship, source.port);
-            for(Port d : dest) {
-                Ship.Inbox ib = fleet.getInbox(d.ship, d.port);
-                ob.addDestination(ib);
-                Log.println("instr: " + ob + " -> " + ib);
-            }
-        }
-        public String toString() {
-            StringBuffer sb = new StringBuffer();
-            sb.append(source + " -> ");
-            sb.append(dest[0]);
-            for(int i=1; i<dest.length; i++) {
-                sb.append(", " + dest[i]);
-            }
-            return sb.toString();
-        }
-    }
-
-    public static class LiteralMove implements Statement {
+        int count;
         int val;
-        Port[] dest;
-        public LiteralMove(int val, Port[] dest) { this.val = val; this.dest = dest; }
+        public Move(Port source, Port[] dest) { this(source, dest, 1); }
+        public Move(Port source, Port[] dest, int count) { this(0, source, dest, count); }
+        public Move(int val, Port[] dest) { this(val, dest, 1); }
+        public Move(int val, Port[] dest, int count) { this(val, null, dest, count); }
+        public Move(int val, Port source, Port[] dest, int count) {
+            this.source = source;
+            this.dest = dest;
+            this.count = count;
+            this.val = val;
+        }
         public void dispatch(Fleet fleet) {
-            for(Port d : dest) {
-                Ship.Inbox ib = fleet.getInbox(d.ship, d.port);
-                ib.add(val);
-                Log.println("instr: " + val + " -> " + ib);
-            }
+            Ship.Outbox ob = source==null ? null : fleet.getOutbox(source.ship, source.port);
+            int repcount = count;
+            if (repcount == 0 || repcount == Integer.MAX_VALUE) repcount = 1;
+            for(int i=0; i<repcount; i++)
+                for(Port d : dest) {
+                    Ship.Inbox ib = fleet.getInbox(d.ship, d.port);
+                    if (ob==null) {
+                        ib.add(val);
+                        Log.println("instr: " + val + " -> " + ib);
+                    } else {
+                        if (count==0)                      ob.addTokenDestination(ib);
+                        else if (count==Integer.MAX_VALUE) ob.addStandingDestination(ib);
+                        else                               ob.addDestination(ib);
+                        Log.println("instr: " + ob + " -> " + ib);
+                    }
+                }
         }
         public String toString() {
             StringBuffer sb = new StringBuffer();
-            sb.append(val + " -> ");
+            sb.append((source==null ? (val+"") : source+"") + " -"+(count<=1?"":("("+count+")"))+"-> ");
             sb.append(dest[0]);
             for(int i=1; i<dest.length; i++) {
                 sb.append(", " + dest[i]);