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