public class Mask {
+ private final String str;
+
public final long mask;
public final long val;
public final long valmask;
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++)
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");
return (in & mask) == val;
}
+ public String toString() {
+ return str;
+ }
+
public int getWidth() {
int ret = 0;
long m = 1;
}
public Mask(String s) {
+ this.str = s;
long mask = 0;
long valmask = 0;
long val = 0;