preliminary support for constants
authoradam <adam@megacz.com>
Wed, 8 Aug 2007 06:05:22 +0000 (07:05 +0100)
committeradam <adam@megacz.com>
Wed, 8 Aug 2007 06:05:22 +0000 (07:05 +0100)
ships/BitFifo.ship
src/edu/berkeley/fleet/doc/BenkoBoxDescription.java
src/edu/berkeley/fleet/doc/Constant.java [new file with mode: 0644]
src/edu/berkeley/fleet/doc/ShipDescription.java

index 21fb528..acb9e33 100644 (file)
@@ -2,8 +2,6 @@ ship: BitFifo
 
 == Ports ===========================================================
 in:   inEnqueue
-  sibling: inEnqueueOp
-
 in:   inEnqueueOp
   constant rev:      .......................1.............
   constant inv:      ........................1............
index 990555d..7b689ac 100644 (file)
@@ -21,6 +21,9 @@ public class BenkoBoxDescription implements Iterable<String> {
     private final boolean tokenOnly;
     private ArrayList<String> destinations = new ArrayList<String>();
 
+    // FIXME
+    public HashMap<String,Constant> constants = new HashMap<String,Constant>();
+
     BenkoBoxDescription(ShipDescription ship, String name, boolean tokenOnly, boolean inbox) {
         this(ship, name, tokenOnly, inbox, null);
     }
@@ -35,4 +38,10 @@ public class BenkoBoxDescription implements Iterable<String> {
 
     void addDest(String dest) { destinations.add(dest); }
 
+
+    public Constant getConstant(String name) {
+        Constant ret = constants.get(name);
+        if (ret == null) ret = ship.getConstant(name);
+        return ret;
+    }
 }
diff --git a/src/edu/berkeley/fleet/doc/Constant.java b/src/edu/berkeley/fleet/doc/Constant.java
new file mode 100644 (file)
index 0000000..959e88c
--- /dev/null
@@ -0,0 +1,58 @@
+package edu.berkeley.fleet.doc;
+
+import java.io.*;
+import java.util.*;
+
+public class Constant {
+
+    long setbits   = 0;
+    long clearbits = 0;
+    boolean signExtend = false;
+    int numberOffset = 0;
+    int numberWidth = 0;
+
+    public Constant(String s) {
+        if (s.startsWith("0x")) {
+            setbits = Long.parseLong(s.substring(2), 16);
+            clearbits = ~setbits;
+        } else if (s.length() == 37) {
+            for(int i=0; i<37; i++) {
+                char c = s.charAt(36-i);
+                switch(c) {
+                    case '0': clearbits |= (1<<i); break;
+                    case '1': setbits   |= (1<<i); break;
+                    case '.': break;
+                    case 's': signExtend = true;  numberOffset = i; numberWidth++; break;
+                    case 'u': signExtend = false; numberOffset = i; numberWidth++; break;
+                }
+            }
+        } else {
+            setbits = Long.parseLong(s);
+            clearbits = ~setbits;
+        }
+    }
+
+    public static long resolveConstant(String exp, BenkoBoxDescription bbd) {
+        long ret = 0;
+        for(StringTokenizer st = new StringTokenizer(exp, ",");
+            st.hasMoreTokens();) {
+            String s = st.nextToken();
+            long val = 0;
+            if (s.indexOf('=') != -1) {
+                val = Long.parseLong(s.substring(s.indexOf('=')+1));
+                s = s.substring(0, s.indexOf('='));
+            }
+            Constant c = bbd.getConstant(s);
+            if (c==null) {
+                if (s.startsWith("0x")) ret |= Long.parseLong(s, 16);
+                else                    ret |= Long.parseLong(s);
+            } else {
+                ret |= c.setbits;
+                ret &= ~c.clearbits;
+                // FIXME: val
+            }
+        }
+        return ret;
+    }
+
+}
\ No newline at end of file
index 37d78ef..bb203fb 100644 (file)
@@ -47,6 +47,13 @@ public class ShipDescription implements Iterable<BenkoBoxDescription> {
 
     private HashMap<String,String> sections = new HashMap<String,String>();
 
+    // FIXME
+    public HashMap<String,Constant> constants = new HashMap<String,Constant>();
+
+    public Constant getConstant(String name) {
+        return constants.get(name);
+    }
+
     private void processSection(String section) throws IOException {
         if (section.equals("")) {
             BufferedReader br = new BufferedReader(new StringReader(sections.get(section)));
@@ -57,6 +64,17 @@ public class ShipDescription implements Iterable<BenkoBoxDescription> {
                 if (key.toLowerCase().equals("ship"))
                     name = val.trim();
             }
+        } else if (section.equals("constants")) {
+            BufferedReader br = new BufferedReader(new StringReader(sections.get(section)));
+            for(String s = br.readLine(); s != null; s = br.readLine()) {
+                if (s.indexOf(':')==-1) continue;
+                String key = s.substring(0, s.indexOf(':')).trim();
+                if (key.startsWith("constant")) {
+                    String constname = key.substring("constant".length()+1).trim();
+                    String val       = s.substring(s.indexOf(':')+1).trim();
+                    constants.put(constname, new Constant(val));
+                }
+            }
         } else if (section.equals("ports")) {
             BufferedReader br = new BufferedReader(new StringReader(sections.get(section)));
             boolean rightSide = false;
@@ -75,9 +93,9 @@ public class ShipDescription implements Iterable<BenkoBoxDescription> {
                 else if (key.equals("in"))        { tokenOnly = false;  inbox = true;  }
                 else if (key.equals("out"))       { tokenOnly = false;  inbox = false; }
                 else if (key.startsWith("constant")) {
-                    continue;
-                } else if (key.startsWith("sibling")) {
-                    continue;
+                    String constname = key.substring("constant".length()+1).trim();
+                    String val       = s.substring(s.indexOf(':')+1).trim();
+                    p.constants.put(constname, new Constant(val));
                 } else if (key.startsWith("shortcut to")) {
                     continue;
                 }
@@ -96,5 +114,4 @@ public class ShipDescription implements Iterable<BenkoBoxDescription> {
     }
 
     void add(BenkoBoxDescription b) { benkoBoxes.add(b); }
-
 }
\ No newline at end of file