new WireEnds as in/outputs are now initialized with U again
[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 {\r
10         U, X, ZERO, ONE, Z;\r
11 \r
12         public static Bit and(Bit a, Bit b)\r
13         {\r
14                 return a.and(b);\r
15         }\r
16 \r
17         public Bit and(Bit other)\r
18         {\r
19                 return fromTable(AND_TABLE, this, other);\r
20         }\r
21 \r
22         public static Bit or(Bit a, Bit b)\r
23         {\r
24                 return a.or(b);\r
25         }\r
26 \r
27         public Bit or(Bit other)\r
28         {\r
29                 return fromTable(OR_TABLE, this, other);\r
30         }\r
31 \r
32         public static Bit xor(Bit a, Bit b)\r
33         {\r
34                 return a.xor(b);\r
35         }\r
36 \r
37         public Bit xor(Bit other)\r
38         {\r
39                 return fromTable(XOR_TABLE, this, other);\r
40         }\r
41 \r
42         public Bit not()\r
43         {\r
44                 switch (this)\r
45                 {\r
46                 case U:\r
47                         return U;\r
48                 case ONE:\r
49                         return ZERO;\r
50                 case ZERO:\r
51                         return ONE;\r
52                 default:\r
53                         return X;\r
54                 }\r
55         }\r
56 \r
57         public Bit[] makeArray(int length)\r
58         {\r
59                 Bit[] bits = new Bit[length];\r
60                 Arrays.fill(bits, this);\r
61                 return bits;\r
62         }\r
63 \r
64         public Bit combineWith(Bit other)\r
65         {\r
66                 return fromTable(JOIN_TABLE, this, other);\r
67         }\r
68 \r
69         public static Bit combine(Bit a, Bit b)\r
70         {\r
71                 return a.combineWith(b);\r
72         }\r
73 \r
74         private static Bit fromTable(Bit[][] table, Bit a, Bit b)\r
75         {\r
76                 return table[a.ordinal()][b.ordinal()];\r
77         }\r
78 \r
79         // @formatter:off\r
80         private static Bit[][] JOIN_TABLE = \r
81                 { { U, U, U,    U,   U    }, \r
82                   { U, X, X,    X,   X    }, \r
83                   { U, X, ZERO, X,   ZERO },\r
84                   { U, X, X,    ONE, ONE  }, \r
85                   { U, X, ZERO, ONE, Z    } };\r
86 \r
87         private static Bit[][] AND_TABLE = \r
88                 { { U,    U,    ZERO, U,    U    }, \r
89                   { U,    X,    ZERO, X,    X    },\r
90                   { ZERO, ZERO, ZERO, ZERO, ZERO }, \r
91                   { U,    X,    ZERO, ONE,  X    }, \r
92                   { U,    X,    ZERO, X,    X    } };\r
93 \r
94         private static Bit[][] OR_TABLE =\r
95         { { U,   U,   U,    ONE, U    },    \r
96           { U,   X,   X,    ONE, X    },    \r
97           { U,   X,   ZERO, ONE, X    },    \r
98           { ONE, ONE, ONE,  ONE, ONE  },    \r
99           { U,   X,   X,    ONE, X    } };\r
100         \r
101         private static Bit[][] XOR_TABLE =\r
102         { { U, U, U,    U,    U },    \r
103           { U, X, X,    X,    X },    \r
104           { U, X, ZERO, ONE,  X },    \r
105           { U, X, ONE,  ZERO, X },    \r
106           { U, X, X,    X,    X } }; \r
107         // @formatter:on\r
108 }