add Mask.setval(BitVector,long)
[fleet.git] / src / edu / berkeley / fleet / util / Mask.java
index 267879d..19f1fb0 100644 (file)
@@ -5,6 +5,8 @@ import java.io.*;
 
 public class Mask {
 
+    private final String str;
+
     public final long mask;
     public final long val;
     public final long valmask;
@@ -16,16 +18,38 @@ public class Mask {
 
     public String verilog(String var) {
         // FIXME: throw an exception if this is called when no 1-bits or 0-bits were specified (ie only v-bits)
-        return "(("+var+" & "+allmax+"'b"+Long.toString(mask,2)+")=="+allmax+"'b"+Long.toString(val,2)+")";
-    }
-    public String verilogVal(String var) {
-        //return "(("+var+" & "+allmax+"'b"+Long.toString(valmask,2)+") >> "+valmaskmin+")";
-        return ""+var+"["+valmaskmax+":"+valmaskmin+"]";
+
+        StringBuffer sb = new StringBuffer();
+        sb.append("{");
+        boolean first = true;
+        int count = 0;
+        for(int i=63; i>=0; i--) {
+            if ((mask & (1L << i)) == 0) continue;
+            if (!first) sb.append(",");
+            first = false;
+            sb.append(var+"["+i+"]");
+            count++;
+        }
+        sb.append("}=="+count+"'b");
+        for(int i=63; i>=0; i--) {
+            if ((mask & (1L << i)) == 0) continue;
+            sb.append( (val & (1L << i))==0 ? "0" : "1" );
+        }
+        return "("+sb.toString()+")";
+        //return "(("+var+" & "+allmax+"'b"+Long.toString(mask,2)+")=="+allmax+"'b"+Long.toString(val,2)+")";
     }
 
     public long getval(long in) {
         return (in & valmask) >>> valmaskmin;
     }
+    public BitVector getvalAsBitVector(long in) {
+        // FIXME
+        return new BitVector(getWidth()).set(getval(in));
+    }
+    public BitVector getvalAsBitVector(BitVector in) {
+        // FIXME
+        return new BitVector(getWidth()).set(getval(in.toLong()));
+    }
     public long getval(BitVector targ) {
         long in = 0;
         for(int i=0; i<targ.length(); i++)
@@ -34,13 +58,19 @@ public class Mask {
         return (in & valmask) >>> valmaskmin;
     }
     public long setval(long in, BitVector targ) {
-        long ret = 0;
-        for(int i=0; i<targ.length(); i++)
-            if (targ.get(i))
+        long ret = in;
+        if (targ.length() != (1+valmaskmax-valmaskmin))
+            throw new RuntimeException("size mismatch trying to do "+this+".setval("+targ+")");
+        for(int i=valmaskmin; i<=valmaskmax; i++)
+            if (targ.get(i-valmaskmin))
                 ret |= (1L << i);
-        if (targ.get(targ.length()-1))
-            ret |= (-1L << targ.length());
-        return setval(in, ret);
+            else
+                ret &= ~(1L << i);
+        return ret;
+    }
+    public void setval(BitVector targ, long val) {
+        for(int i=valmaskmin; i<=valmaskmax; i++)
+            targ.set(i, ((1L<<(i-valmaskmin)) & val)!=0);
     }
     public long setval(long in, long targ) {
         if (((targ << valmaskmin) & ~valmask) != 0) throw new RuntimeException("setval() with argument bigger than mask field");
@@ -53,6 +83,10 @@ public class Mask {
         return (in & mask) == val;
     }
 
+    public String toString() {
+        return str;
+    }
+
     public int getWidth() {
         int ret = 0;
         long m = 1;
@@ -64,6 +98,7 @@ public class Mask {
     }
 
     public Mask(String s) {
+        this.str = s;
         long mask = 0;
         long valmask = 0;
         long val = 0;