add Mask.setval(BitVector,long)
[fleet.git] / src / edu / berkeley / fleet / util / Mask.java
index 6aadf39..19f1fb0 100644 (file)
@@ -38,17 +38,17 @@ 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) {
-        long ret = getval(in);
-        return new BitVector(getWidth()).set(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;
@@ -58,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");