package era.mi.logic;
+import java.util.Arrays;
public enum Bit
{
ONE, ZERO, Z, X;
-
+
public static Bit and(Bit a, Bit b)
{
return a.and(b);
}
-
+
public Bit and(Bit other)
{
- if(equals(Bit.ZERO) || other.equals(Bit.ZERO))
+ if (equals(Bit.ZERO) || other.equals(Bit.ZERO))
return Bit.ZERO;
- else if(equals(other) && equals(Bit.ONE))
+ else if (equals(other) && equals(Bit.ONE))
return Bit.ONE;
else
return Bit.X;
}
-
+
public static Bit or(Bit a, Bit b)
{
return a.or(b);
}
-
+
public Bit or(Bit other)
{
- if(equals(Bit.ONE) || other.equals(Bit.ONE))
+ if (equals(Bit.ONE) || other.equals(Bit.ONE))
return Bit.ONE;
- else if(equals(other) && equals(Bit.ZERO))
+ else if (equals(other) && equals(Bit.ZERO))
return Bit.ZERO;
else
return Bit.X;
}
-
+
public static Bit xor(Bit a, Bit b)
{
return a.xor(b);
}
-
+
public Bit xor(Bit other)
{
- //I'm uncertain how this should behave for cases where one value is neither 1 nor 0.
- //TODO: Implement xor
- return Bit.X;
+ if(this == Bit.X || this == Bit.Z
+ || other == Bit.X || other == Bit.Z)
+ return Bit.X;
+ else
+ return this == other ? Bit.ZERO : Bit.ONE;
+ }
+
+ public Bit not()
+ {
+ switch (this)
+ {
+ case ONE:
+ return Bit.ZERO;
+ case ZERO:
+ return Bit.ONE;
+ default:
+ return Bit.X;
+ }
}
- public Bit not()
+ public Bit[] makeArray(int length)
{
- switch(this)
- {
- case ONE:
- return Bit.ZERO;
- case ZERO:
- return Bit.ONE;
- default:
- return Bit.X;
- }
+ Bit[] bits = new Bit[length];
+ Arrays.fill(bits, this);
+ return bits;
+ }
+
+ /**
+ * Rules for two bits that get directly connected<br>
+ * <code><table>
+ * <tbody>
+ * <tr><td><td>X<td>0<td>1<td>Z</tr>
+ * <tr><td>X<td>X<td>X<td>X<td>X</tr>
+ * <tr><td>0<td>X<td>0<td>X<td>0</tr>
+ * <tr><td>1<td>X<td>X<td>1<td>1</tr>
+ * <tr><td>Z<td>X<td>0<td>1<td>Z</tr>
+ * </tbody>
+ * </table><code>
+ *
+ * @return the result according to the table
+ *
+ * @author Christian Femers
+ */
+ public Bit combineWith(Bit other)
+ {
+ if (this == other)
+ return this;
+ if (this == X || other == X)
+ return X;
+ if (other == Z)
+ return this;
+ if (this == Z)
+ return other;
+ return X;
+ }
+
+ public static Bit combine(Bit a, Bit b)
+ {
+ return a.combineWith(b);
}
}