Added 'U' to Bit and made code IEEE 1164 compliant (w.o. W,H,L,-)
[Mograsim.git] / era.mi / src / era / mi / logic / Bit.java
1 package era.mi.logic;\r
2 \r
3 import java.util.Arrays;\r
4 \r
5 /**\r
6  * stdlogic according to IEEE 1164\r
7  */\r
8 public enum Bit {\r
9         U, X, ZERO, ONE, Z;\r
10 \r
11         public static Bit and(Bit a, Bit b) {\r
12                 return a.and(b);\r
13         }\r
14 \r
15         public Bit and(Bit other) {\r
16                 return fromTable(AND_TABLE, this, other);\r
17         }\r
18 \r
19         public static Bit or(Bit a, Bit b) {\r
20                 return a.or(b);\r
21         }\r
22 \r
23         public Bit or(Bit other) {\r
24                 return fromTable(OR_TABLE, this, other);\r
25         }\r
26 \r
27         public static Bit xor(Bit a, Bit b) {\r
28                 return a.xor(b);\r
29         }\r
30 \r
31         public Bit xor(Bit other) {\r
32                 return fromTable(XOR_TABLE, this, other);\r
33         }\r
34 \r
35         public Bit not() {\r
36                 switch (this) {\r
37                 case U:\r
38                         return U;\r
39                 case ONE:\r
40                         return ZERO;\r
41                 case ZERO:\r
42                         return ONE;\r
43                 default:\r
44                         return X;\r
45                 }\r
46         }\r
47 \r
48         public Bit[] makeArray(int length) {\r
49                 Bit[] bits = new Bit[length];\r
50                 Arrays.fill(bits, this);\r
51                 return bits;\r
52         }\r
53 \r
54         public Bit combineWith(Bit other) {\r
55                 return fromTable(JOIN_TABLE, this, other);\r
56         }\r
57 \r
58         public static Bit combine(Bit a, Bit b) {\r
59                 return a.combineWith(b);\r
60         }\r
61 \r
62         private static Bit fromTable(Bit[][] table, Bit a, Bit b) {\r
63                 return table[a.ordinal()][b.ordinal()];\r
64         }\r
65 \r
66         // @formatter:off\r
67         private static Bit[][] JOIN_TABLE = \r
68                 { { U, U, U,    U,   U    }, \r
69                   { U, X, X,    X,   X    }, \r
70                   { U, X, ZERO, X,   ZERO },\r
71                   { U, X, X,    ONE, ONE  }, \r
72                   { U, X, ZERO, ONE, Z    } };\r
73 \r
74         private static Bit[][] AND_TABLE = \r
75                 { { U,    U,    ZERO, U,    U    }, \r
76                   { U,    X,    ZERO, X,    X    },\r
77                   { ZERO, ZERO, ZERO, ZERO, ZERO }, \r
78                   { U,    X,    ZERO, ONE,  X    }, \r
79                   { U,    X,    ZERO, X,    X    } };\r
80 \r
81         private static Bit[][] OR_TABLE =\r
82         { { U,   U,   U,    ONE, U    },    \r
83           { U,   X,   X,    ONE, X    },    \r
84           { U,   X,   ZERO, ONE, X    },    \r
85           { ONE, ONE, ONE,  ONE, ONE  },    \r
86           { U,   X,   X,    ONE, X    } };\r
87         \r
88         private static Bit[][] XOR_TABLE =\r
89         { { U, U, U,    U,    U },    \r
90           { U, X, X,    X,    X },    \r
91           { U, X, ZERO, ONE,  X },    \r
92           { U, X, ONE,  ZERO, X },    \r
93           { U, X, X,    X,    X } }; \r
94         // @formatter:on\r
95 }