+package era.mi.logic;\r
+\r
+import java.util.Arrays;\r
+\r
+/**\r
+ * stdlogic according to IEEE 1164\r
+ */\r
+public enum Bit\r
+{\r
+ U, X, ZERO, ONE, Z;\r
+\r
+ public static Bit and(Bit a, Bit b)\r
+ {\r
+ return a.and(b);\r
+ }\r
+\r
+ public Bit and(Bit other)\r
+ {\r
+ return fromTable(AND_TABLE, this, other);\r
+ }\r
+\r
+ public static Bit or(Bit a, Bit b)\r
+ {\r
+ return a.or(b);\r
+ }\r
+\r
+ public Bit or(Bit other)\r
+ {\r
+ return fromTable(OR_TABLE, this, other);\r
+ }\r
+\r
+ public static Bit xor(Bit a, Bit b)\r
+ {\r
+ return a.xor(b);\r
+ }\r
+\r
+ public Bit xor(Bit other)\r
+ {\r
+ return fromTable(XOR_TABLE, this, other);\r
+ }\r
+\r
+ public Bit not()\r
+ {\r
+ switch (this)\r
+ {\r
+ case U:\r
+ return U;\r
+ case ONE:\r
+ return ZERO;\r
+ case ZERO:\r
+ return ONE;\r
+ default:\r
+ return X;\r
+ }\r
+ }\r
+\r
+ public Bit[] makeArray(int length)\r
+ {\r
+ Bit[] bits = new Bit[length];\r
+ Arrays.fill(bits, this);\r
+ return bits;\r
+ }\r
+\r
+ public Bit combineWith(Bit other)\r
+ {\r
+ return fromTable(JOIN_TABLE, this, other);\r
+ }\r
+\r
+ public static Bit combine(Bit a, Bit b)\r
+ {\r
+ return a.combineWith(b);\r
+ }\r
+\r
+ private static Bit fromTable(Bit[][] table, Bit a, Bit b)\r
+ {\r
+ return table[a.ordinal()][b.ordinal()];\r
+ }\r
+\r
+ // @formatter:off\r
+ private static final Bit[][] JOIN_TABLE = \r
+ { { U, U, U, U, U }, \r
+ { U, X, X, X, X }, \r
+ { U, X, ZERO, X, ZERO },\r
+ { U, X, X, ONE, ONE }, \r
+ { U, X, ZERO, ONE, Z } };\r
+\r
+ private static final Bit[][] AND_TABLE = \r
+ { { U, U, ZERO, U, U }, \r
+ { U, X, ZERO, X, X },\r
+ { ZERO, ZERO, ZERO, ZERO, ZERO }, \r
+ { U, X, ZERO, ONE, X }, \r
+ { U, X, ZERO, X, X } };\r
+\r
+ private static final Bit[][] OR_TABLE =\r
+ { { U, U, U, ONE, U }, \r
+ { U, X, X, ONE, X }, \r
+ { U, X, ZERO, ONE, X }, \r
+ { ONE, ONE, ONE, ONE, ONE }, \r
+ { U, X, X, ONE, X } };\r
+ \r
+ private static final Bit[][] XOR_TABLE =\r
+ { { U, U, U, U, U }, \r
+ { U, X, X, X, X }, \r
+ { U, X, ZERO, ONE, X }, \r
+ { U, X, ONE, ZERO, X }, \r
+ { U, X, X, X, X } }; \r
+ // @formatter:on\r
+}
\ No newline at end of file