From: Christian Femers Date: Fri, 10 May 2019 17:21:50 +0000 (+0200) Subject: added some convenience methods that make our lives easier X-Git-Url: https://mograsim.net/gitweb/?a=commitdiff_plain;h=33d4533c5e48fbb5d1d0057f2b08d3d6f8e29a87;p=Mograsim.git added some convenience methods that make our lives easier --- diff --git a/era.mi/src/era/mi/logic/Bit.java b/era.mi/src/era/mi/logic/Bit.java index b18c5974..e7c93968 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; - 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 + // 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 not() { - switch(this) - { - case ONE: - return Bit.ZERO; - case ZERO: - return Bit.ONE; - default: - return Bit.X; - } + switch (this) + { + case ONE: + return Bit.ZERO; + case ZERO: + return Bit.ONE; + default: + return Bit.X; + } + } + + /** + * 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; + } + + public static Bit combine(Bit a, Bit b) + { + return a.combineWith(b); } } diff --git a/era.mi/src/era/mi/logic/timeline/Timeline.java b/era.mi/src/era/mi/logic/timeline/Timeline.java index 125b69c3..2392f4c2 100644 --- a/era.mi/src/era/mi/logic/timeline/Timeline.java +++ b/era.mi/src/era/mi/logic/timeline/Timeline.java @@ -33,6 +33,12 @@ public class Timeline currentTime = first.getTiming(); first.run(); } + + public void executeAll() + { + while (hasNext()) + executeNext(); + } public long getSimulationTime() { diff --git a/era.mi/src/era/mi/logic/wires/WireArray.java b/era.mi/src/era/mi/logic/wires/WireArray.java index cf960e08..8cceebef 100644 --- a/era.mi/src/era/mi/logic/wires/WireArray.java +++ b/era.mi/src/era/mi/logic/wires/WireArray.java @@ -291,5 +291,17 @@ public class WireArray bits[i] = Bit.Z; feedSignals(bits); } + + @Override + public String toString() + { + return Arrays.toString(values); + } + } + + @Override + public String toString() + { + return String.format("wire 0x%08x value: %s inputs: %s", hashCode(), Arrays.toString(values), inputs); } }