major overhaul: update dock to am33
[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
13
14     public String verilog(String var) {
15         return "(("+var+" & "+mask+")=="+val+")";
16     }
17     public String verilogVal(String var) {
18         return "(("+var+" & "+valmask+") >> "+valmaskmin+")";
19     }
20
21     public long getval(long in) {
22         return (in & valmask) >>> valmaskmin;
23     }
24     public long setval(long in, long targ) {
25         if (((targ << valmaskmin) & ~valmask) != 0) throw new RuntimeException("setval() with argument bigger than mask field");
26         return (in & ~valmask) | ((targ << valmaskmin) & valmask);
27     }
28     public long set(long in) {
29         return (in & ~mask) | val;
30     }
31     public boolean get(long in) {
32         return (in & mask) == val;
33     }
34
35     public Mask(String s) {
36         long mask = 0;
37         long valmask = 0;
38         long val = 0;
39         int valmaskmin = Integer.MAX_VALUE;
40         for(int i=0; i<s.length(); i++) {
41             char c = s.charAt(s.length()-1-i);
42             switch(c) {
43                 case '.': break;
44                 case '0': mask |= (1<<i); val |= (0<<i); break;
45                 case '1': mask |= (1<<i); val |= (1<<i); break;
46                 case 'v': valmask |= (1<<i); valmaskmin = Math.min(valmaskmin,i);            break;
47                 default: throw new Error(""+c);
48             }
49         }
50         this.mask = mask;
51         this.val = val;
52         this.valmask = valmask;
53         this.valmaskmin = valmaskmin;
54     }
55
56 }