add Mask.setval(BitVector,long)
[fleet.git] / src / edu / berkeley / fleet / util / Mask.java
index b289cc6..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;
@@ -36,14 +38,18 @@ public class Mask {
         return "("+sb.toString()+")";
         //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+"]";
-    }
 
     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++)
@@ -52,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");
@@ -71,6 +83,10 @@ public class Mask {
         return (in & mask) == val;
     }
 
+    public String toString() {
+        return str;
+    }
+
     public int getWidth() {
         int ret = 0;
         long m = 1;
@@ -82,6 +98,7 @@ public class Mask {
     }
 
     public Mask(String s) {
+        this.str = s;
         long mask = 0;
         long valmask = 0;
         long val = 0;