3f25d77e6545e799913ce97b0188cd41db0316a3
[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 public enum Bit\r
6 {\r
7         ONE, ZERO, Z, X;\r
8 \r
9         public static Bit and(Bit a, Bit b)\r
10         {\r
11                 return a.and(b);\r
12         }\r
13 \r
14         public Bit and(Bit other)\r
15         {\r
16                 if (this == ZERO || other == ZERO)\r
17                         return ZERO;\r
18                 else if (this == other && this == ONE)\r
19                         return ONE;\r
20                 else if (this == X || other == X)\r
21                         return X;\r
22                 else\r
23                         return ZERO;\r
24         }\r
25 \r
26         public static Bit or(Bit a, Bit b)\r
27         {\r
28                 return a.or(b);\r
29         }\r
30 \r
31         public Bit or(Bit other)\r
32         {\r
33                 if (this == ONE || other == ONE)\r
34                         return ONE;\r
35                 else if (this == other && this == ZERO)\r
36                         return ZERO;\r
37                 else if (this == X || other == X)\r
38                         return X;\r
39                 else\r
40                         return ZERO;\r
41         }\r
42 \r
43         public static Bit xor(Bit a, Bit b)\r
44         {\r
45                 return a.xor(b);\r
46         }\r
47 \r
48         public Bit xor(Bit other)\r
49         {\r
50                 if(this == X || this == Z || other == X || other == Z)\r
51                         return Bit.X;\r
52                 else\r
53                         return this == other ? ZERO : ONE;\r
54         }\r
55 \r
56         public Bit not()\r
57         {\r
58                 switch (this)\r
59                         {\r
60                         case ONE:\r
61                                 return Bit.ZERO;\r
62                         case ZERO:\r
63                                 return Bit.ONE;\r
64                         default:\r
65                                 return Bit.X;\r
66                         }\r
67         }\r
68         \r
69         public Bit[] makeArray(int length)\r
70         {\r
71                 Bit[] bits = new Bit[length];\r
72                 Arrays.fill(bits, this);\r
73                 return bits;\r
74         }\r
75 \r
76         /**\r
77          * Rules for two bits that get directly connected<br>\r
78          * <code><table>\r
79          * <tbody>\r
80          * <tr><td><td>X<td>0<td>1<td>Z</tr>\r
81          * <tr><td>X<td>X<td>X<td>X<td>X</tr>\r
82          * <tr><td>0<td>X<td>0<td>X<td>0</tr>\r
83          * <tr><td>1<td>X<td>X<td>1<td>1</tr>\r
84          * <tr><td>Z<td>X<td>0<td>1<td>Z</tr>\r
85          * </tbody>\r
86          * </table><code>\r
87          * \r
88          * @return the result according to the table\r
89          * \r
90          * @author Christian Femers\r
91          */\r
92         public Bit combineWith(Bit other)\r
93         {\r
94                 if (this == other)\r
95                         return this;\r
96                 if (this == X || other == X)\r
97                         return X;\r
98                 if (other == Z)\r
99                         return this;\r
100                 if (this == Z)\r
101                         return other;\r
102                 return X;\r
103         }\r
104 \r
105         public static Bit combine(Bit a, Bit b)\r
106         {\r
107                 return a.combineWith(b);\r
108         }\r
109 }\r