X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2FBit.java;h=992c729594837db2747256e550b167f86d2cdb7a;hb=c18c04011cab0040c2287608eeefc9c3cc4536c2;hp=804ecc94824a6b74c04aac8bee6a0b1fc4abce8f;hpb=7f37c7b2431309e49a0ee116d1ee6c173272e926;p=Mograsim.git diff --git a/era.mi/src/era/mi/logic/Bit.java b/era.mi/src/era/mi/logic/Bit.java index 804ecc94..992c7295 100644 --- a/era.mi/src/era/mi/logic/Bit.java +++ b/era.mi/src/era/mi/logic/Bit.java @@ -2,9 +2,12 @@ package era.mi.logic; import java.util.Arrays; +/** + * stdlogic according to IEEE 1164 + */ public enum Bit { - ONE, ZERO, Z, X; + U, X, ZERO, ONE, Z; public static Bit and(Bit a, Bit b) { @@ -13,12 +16,7 @@ public enum Bit public Bit and(Bit other) { - if (equals(Bit.ZERO) || other.equals(Bit.ZERO)) - return Bit.ZERO; - else if (equals(other) && equals(Bit.ONE)) - return Bit.ONE; - else - return Bit.X; + return fromTable(AND_TABLE, this, other); } public static Bit or(Bit a, Bit b) @@ -28,12 +26,7 @@ public enum Bit public Bit or(Bit other) { - if (equals(Bit.ONE) || other.equals(Bit.ONE)) - return Bit.ONE; - else if (equals(other) && equals(Bit.ZERO)) - return Bit.ZERO; - else - return Bit.X; + return fromTable(OR_TABLE, this, other); } public static Bit xor(Bit a, Bit b) @@ -43,26 +36,24 @@ public enum Bit public Bit xor(Bit other) { - if(this == Bit.X || this == Bit.Z - || other == Bit.X || other == Bit.Z) - return Bit.X; - else - return this == other ? Bit.ZERO : Bit.ONE; + return fromTable(XOR_TABLE, this, other); } public Bit not() { switch (this) - { - case ONE: - return Bit.ZERO; - case ZERO: - return Bit.ONE; - default: - return Bit.X; - } + { + case U: + return U; + case ONE: + return ZERO; + case ZERO: + return ONE; + default: + return X; + } } - + public Bit[] makeArray(int length) { Bit[] bits = new Bit[length]; @@ -70,37 +61,48 @@ public enum Bit return bits; } - /** - * Rules for two bits that get directly connected
- * - * - * - * - * - * - * - * - *
X01Z
XXXXX
0X0X0
1XX11
ZX01Z
- * - * @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; + return fromTable(JOIN_TABLE, this, other); } public static Bit combine(Bit a, Bit b) { return a.combineWith(b); } -} + + private static Bit fromTable(Bit[][] table, Bit a, Bit b) + { + return table[a.ordinal()][b.ordinal()]; + } + + // @formatter:off + private static final Bit[][] JOIN_TABLE = + { { U, U, U, U, U }, + { U, X, X, X, X }, + { U, X, ZERO, X, ZERO }, + { U, X, X, ONE, ONE }, + { U, X, ZERO, ONE, Z } }; + + private static final Bit[][] AND_TABLE = + { { U, U, ZERO, U, U }, + { U, X, ZERO, X, X }, + { ZERO, ZERO, ZERO, ZERO, ZERO }, + { U, X, ZERO, ONE, X }, + { U, X, ZERO, X, X } }; + + private static final Bit[][] OR_TABLE = + { { U, U, U, ONE, U }, + { U, X, X, ONE, X }, + { U, X, ZERO, ONE, X }, + { ONE, ONE, ONE, ONE, ONE }, + { U, X, X, ONE, X } }; + + private static final Bit[][] XOR_TABLE = + { { U, U, U, U, U }, + { U, X, X, X, X }, + { U, X, ZERO, ONE, X }, + { U, X, ONE, ZERO, X }, + { U, X, X, X, X } }; + // @formatter:on +} \ No newline at end of file