X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=era.mi%2Fsrc%2Fera%2Fmi%2Flogic%2FBit.java;h=8010ca760b852ad3cf99f4018f48a93549c233e2;hb=de79184d60c80d6775b368e61d3368de032952e8;hp=b18c5974f9d576442eb2e13256654fbf23dc8f1b;hpb=a4c5cfb856026771dfcf31eb22434b8b6ff20ad4;p=Mograsim.git diff --git a/era.mi/src/era/mi/logic/Bit.java b/era.mi/src/era/mi/logic/Bit.java index b18c5974..8010ca76 100644 --- a/era.mi/src/era/mi/logic/Bit.java +++ b/era.mi/src/era/mi/logic/Bit.java @@ -1,62 +1,95 @@ package era.mi.logic; +import java.util.Arrays; -public enum Bit -{ - ONE, ZERO, Z, X; - - public static Bit and(Bit a, Bit b) - { +/** + * stdlogic according to IEEE 1164 + */ +public enum Bit { + U, X, ZERO, ONE, Z; + + 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)) - return Bit.ZERO; - else if(equals(other) && equals(Bit.ONE)) - return Bit.ONE; - else - return Bit.X; + + public Bit and(Bit other) { + return fromTable(AND_TABLE, this, other); } - - public static Bit or(Bit a, Bit b) - { + + 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)) - return Bit.ONE; - else if(equals(other) && equals(Bit.ZERO)) - return Bit.ZERO; - else - return Bit.X; + + public Bit or(Bit other) { + return fromTable(OR_TABLE, this, other); } - - public static Bit xor(Bit a, Bit b) - { + + 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; + + public Bit xor(Bit other) { + return fromTable(XOR_TABLE, this, other); } - - public Bit not() - { - switch(this) - { + + public Bit not() { + switch (this) { + case U: + return U; case ONE: - return Bit.ZERO; + return ZERO; case ZERO: - return Bit.ONE; + return ONE; default: - return Bit.X; + return X; } } -} + + public Bit[] makeArray(int length) { + Bit[] bits = new Bit[length]; + Arrays.fill(bits, this); + return bits; + } + + public Bit combineWith(Bit other) { + 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 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 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 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 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