1 package edu.berkeley.fleet.util;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.*;
8 public final long mask;
10 public final long valmask;
11 public final int valmaskmin;
12 public final int valmaskmax;
13 public final int valmaskwidth;
14 public final int allmax;
15 public final int width;
17 public String verilog(String var) {
18 // FIXME: throw an exception if this is called when no 1-bits or 0-bits were specified (ie only v-bits)
19 return "(("+var+" & "+allmax+"'b"+Long.toString(mask,2)+")=="+allmax+"'b"+Long.toString(val,2)+")";
21 public String verilogVal(String var) {
22 //return "(("+var+" & "+allmax+"'b"+Long.toString(valmask,2)+") >> "+valmaskmin+")";
23 return ""+var+"["+valmaskmax+":"+valmaskmin+"]";
26 public long getval(long in) {
27 return (in & valmask) >>> valmaskmin;
29 public long getval(BitVector targ) {
31 for(int i=0; i<targ.length(); i++)
34 return (in & valmask) >>> valmaskmin;
36 public long setval(long in, BitVector targ) {
38 for(int i=0; i<targ.length(); i++)
41 if (targ.get(targ.length()-1))
42 ret |= (-1L << targ.length());
43 return setval(in, ret);
45 public long setval(long in, long targ) {
46 if (((targ << valmaskmin) & ~valmask) != 0) throw new RuntimeException("setval() with argument bigger than mask field");
47 return (in & ~valmask) | ((targ << valmaskmin) & valmask);
49 public long set(long in) {
50 return (in & ~mask) | val;
52 public boolean get(long in) {
53 return (in & mask) == val;
56 public int getWidth() {
59 for(int i=0; i<64; i++) {
60 if ((valmask & m)!=0) ret++;
66 public Mask(String s) {
70 int valmaskmin = Integer.MAX_VALUE;
73 this.width = s.length();
74 for(int i=0; i<s.length(); i++) {
75 char c = s.charAt(s.length()-1-i);
78 case '0': mask |= (1L<<i); val |= (0L<<i); break;
79 case '1': mask |= (1L<<i); val |= (1L<<i); break;
80 case 'v': valmask |= (1L<<i); valmaskmin = Math.min(valmaskmin,i); valmaskmax = Math.max(valmaskmax,i); break;
81 default: throw new Error(""+c);
83 if (c!='.') allmax = Math.max(allmax,i);
87 this.valmask = valmask;
88 this.valmaskmin = valmaskmin;
89 this.valmaskmax = valmaskmax;
90 this.allmax = allmax+1;
91 this.valmaskwidth = 1 + valmaskmax - valmaskmin;
94 public static long signExtend(long input, int wordWidth) {
95 if ((input & (1L << (wordWidth-1)))!=0)
96 input |= (-1L) << wordWidth;