add Mask.getval(BitVector)
[fleet.git] / src / edu / berkeley / fleet / util / Mask.java
1 package edu.berkeley.fleet.util;
2 import edu.berkeley.fleet.api.*;
3 import edu.berkeley.fleet.*;
4 import java.io.*;
5
6 public class Mask {
7
8     public final long mask;
9     public final long val;
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;
16
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)+")";
20     }
21     public String verilogVal(String var) {
22         //return "(("+var+" & "+allmax+"'b"+Long.toString(valmask,2)+") >> "+valmaskmin+")";
23         return ""+var+"["+valmaskmax+":"+valmaskmin+"]";
24     }
25
26     public long getval(long in) {
27         return (in & valmask) >>> valmaskmin;
28     }
29     public long getval(BitVector targ) {
30         long in = 0;
31         for(int i=0; i<targ.length(); i++)
32             if (targ.get(i))
33                 in |= (1L << i);
34         return (in & valmask) >>> valmaskmin;
35     }
36     public long setval(long in, BitVector targ) {
37         long ret = 0;
38         for(int i=0; i<targ.length(); i++)
39             if (targ.get(i))
40                 ret |= (1L << i);
41         if (targ.get(targ.length()-1))
42             ret |= (-1L << targ.length());
43         return setval(in, ret);
44     }
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);
48     }
49     public long set(long in) {
50         return (in & ~mask) | val;
51     }
52     public boolean get(long in) {
53         return (in & mask) == val;
54     }
55
56     public int getWidth() {
57         int ret = 0;
58         long m = 1;
59         for(int i=0; i<64; i++) {
60             if ((valmask & m)!=0) ret++;
61             m = m << 1;
62         }
63         return ret;
64     }
65
66     public Mask(String s) {
67         long mask = 0;
68         long valmask = 0;
69         long val = 0;
70         int valmaskmin = Integer.MAX_VALUE;
71         int valmaskmax = 0;
72         int allmax = 0;
73         this.width = s.length();
74         for(int i=0; i<s.length(); i++) {
75             char c = s.charAt(s.length()-1-i);
76             switch(c) {
77                 case '.': break;
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);
82             }
83             if (c!='.') allmax = Math.max(allmax,i);
84         }
85         this.mask = mask;
86         this.val = val;
87         this.valmask = valmask;
88         this.valmaskmin = valmaskmin;
89         this.valmaskmax = valmaskmax;
90         this.allmax = allmax+1;
91         this.valmaskwidth = 1 + valmaskmax - valmaskmin;
92     }
93
94     public static long signExtend(long input, int wordWidth) {
95         if ((input & (1L << (wordWidth-1)))!=0)
96             input |= (-1L) << wordWidth;
97         return input;
98     }
99
100 }