diff --git a/docs/docs/wires/img/wire-colors-pt-2-blue-wire.PNG b/docs/docs/wires/img/wire-colors-pt-2-blue-wire.PNG index 9ebb4427..70da0437 100644 Binary files a/docs/docs/wires/img/wire-colors-pt-2-blue-wire.PNG and b/docs/docs/wires/img/wire-colors-pt-2-blue-wire.PNG differ diff --git a/docs/docs/wires/img/wire-colors-pt-3-black-wire-uninit.PNG b/docs/docs/wires/img/wire-colors-pt-3-black-wire-uninit.PNG deleted file mode 100644 index c61585c4..00000000 Binary files a/docs/docs/wires/img/wire-colors-pt-3-black-wire-uninit.PNG and /dev/null differ diff --git a/docs/docs/wires/img/wire-colors-pt-3-dark-blue-wire-uninit.PNG b/docs/docs/wires/img/wire-colors-pt-3-dark-blue-wire-uninit.PNG new file mode 100644 index 00000000..9e8945e6 Binary files /dev/null and b/docs/docs/wires/img/wire-colors-pt-3-dark-blue-wire-uninit.PNG differ diff --git a/docs/docs/wires/img/wire-colors-pt-4-orange-wire.PNG b/docs/docs/wires/img/wire-colors-pt-4-orange-wire.PNG index 7f80c417..4a78f14b 100644 Binary files a/docs/docs/wires/img/wire-colors-pt-4-orange-wire.PNG and b/docs/docs/wires/img/wire-colors-pt-4-orange-wire.PNG differ diff --git a/docs/docs/wires/wire-colors.md b/docs/docs/wires/wire-colors.md index 343b031e..0231c68a 100644 --- a/docs/docs/wires/wire-colors.md +++ b/docs/docs/wires/wire-colors.md @@ -28,38 +28,37 @@ light green wire - 1-bit wire with value of 1 ![pt-1-light-green-wire] -### Part 2: Blue +### Part 2: Light Blue / Dark Blue -blue indicates an unitialized 1-bit wire +Light blue indicates a 1-bit wire that is "floating" or in a "high impedance +state" — in other words, the wire is not connected to anything. -The wire below is unitialized because no value is being driven onto it. +The wire below is floating because no value is being driven onto it. ![pt-2-blue-wire] -Since you may have both initialized and unitialized wires in a -properly functioning circuit, an unitialized wire is not considered an error. +Dark blue indicates a floating multi-bit wire. +![pt-3-dark-blue-wire-uninit] + +Since you may have both floating wires and wires with 0/1 on them in a properly +functioning circuit, a floating wire is not considered an error. ### Part 3: Black -black indicates either an initialized or unitialized multi-bit wire +Black indicates a multi-bit wire carrying no floating values (only 0s and 1s). -black wire - multi-bit wire, initialized +Black wire - multi-bit wire carrying only 0s and 1s: ![pt-3-black-wire] -black wire - multi-bit wire, unitialized - -![pt-3-black-wire-unint] - -Also note that a multi-bit wire can have both initialized and unitialized bits. -This error usually pops up when you combine wires together with a splitter, and -some of the individual wires that make up the multi-bit wire are unitialized. - -As stated above, since you may have both initialized and unitialized wires in a -properly functioning circuit, an unitialized wire is not considered an error. - +Also note that a multi-bit wire can carry both floating and 0/1 bits. +This usually pops up when you combine wires together with a splitter, and +some of the individual wires that make up the multi-bit wire are floating. +As stated above, since you may have both floating wires and wires with 0/1 on +them in a properly functioning circuit, a floating wire is not considered an +error. ## Error State Wires @@ -101,6 +100,6 @@ These multi-bit wires are known as "wire bundles" in industry. [pt-1-dark-green-wire]: img/wire-colors-pt-1-dark-green-wire.PNG "dark green CircuitSim wire" [pt-2-blue-wire]: img/wire-colors-pt-2-blue-wire.PNG "blue CircuitSim wire" [pt-3-black-wire]: img/wire-colors-pt-3-black-wire.PNG "black CircuitSim wire" -[pt-3-black-wire-unint]: img/wire-colors-pt-3-black-wire-uninit.PNG "black CircuitSim wire uninitialized" +[pt-3-dark-blue-wire-uninit]: img/wire-colors-pt-3-dark-blue-wire-uninit.PNG "dark blue CircuitSim wire" [pt-4-orange-wire]: img/wire-colors-pt-4-orange-wire.PNG "orange CircuitSim wire" [pt-5-red-wire]: img/wire-colors-pt-5-red-wire.PNG "red CircuitSim wire" diff --git a/src/main/java/com/ra4king/circuitsim/gui/GuiUtils.java b/src/main/java/com/ra4king/circuitsim/gui/GuiUtils.java index ec75f78f..768a1127 100644 --- a/src/main/java/com/ra4king/circuitsim/gui/GuiUtils.java +++ b/src/main/java/com/ra4king/circuitsim/gui/GuiUtils.java @@ -220,7 +220,7 @@ public static void setBitColor(GraphicsContext graphics, CircuitState circuitSta setBitColor(graphics, circuitState.getMergedValue(link)); } } else { - setBitColor(graphics, State.X); + setBitColor(graphics, State.Z); } } else { graphics.setStroke(Color.ORANGE); @@ -230,8 +230,8 @@ public static void setBitColor(GraphicsContext graphics, CircuitState circuitSta private static final Color ONE_COLOR = Color.GREEN.brighter(); private static final Color ZERO_COLOR = Color.GREEN.darker(); - private static final Color X_1BIT_COLOR = Color.BLUE; - private static final Color X_MULTIBIT_COLOR = Color.BLUE.darker(); + private static final Color Z_1BIT_COLOR = Color.BLUE; + private static final Color Z_MULTIBIT_COLOR = Color.BLUE.darker(); public static void setBitColor(GraphicsContext graphics, WireValue value) { if (value.getBitSize() == 1) { @@ -240,8 +240,8 @@ public static void setBitColor(GraphicsContext graphics, WireValue value) { graphics.setStroke(Color.BLACK); graphics.setFill(Color.BLACK); } else { - graphics.setStroke(X_MULTIBIT_COLOR); - graphics.setFill(X_MULTIBIT_COLOR); + graphics.setStroke(Z_MULTIBIT_COLOR); + graphics.setFill(Z_MULTIBIT_COLOR); } } @@ -255,9 +255,9 @@ public static void setBitColor(GraphicsContext graphics, State bitState) { graphics.setStroke(ZERO_COLOR); graphics.setFill(ZERO_COLOR); } - case X -> { - graphics.setStroke(X_1BIT_COLOR); - graphics.setFill(X_1BIT_COLOR); + case Z -> { + graphics.setStroke(Z_1BIT_COLOR); + graphics.setFill(Z_1BIT_COLOR); } } } diff --git a/src/main/java/com/ra4king/circuitsim/simulator/CircuitState.java b/src/main/java/com/ra4king/circuitsim/simulator/CircuitState.java index 3f777965..1de26cb3 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/CircuitState.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/CircuitState.java @@ -353,7 +353,7 @@ void link(LinkState other) { cachedMergedValue = null; isShortCircuited = null; - participants.forEach((port, info) -> info.lastPropagated.setAllBits(State.X)); + participants.forEach((port, info) -> info.lastPropagated.setAllBits(State.Z)); linkStates.remove(other.link); getCircuit().getSimulator().linkRemoved(other.link); diff --git a/src/main/java/com/ra4king/circuitsim/simulator/WireValue.java b/src/main/java/com/ra4king/circuitsim/simulator/WireValue.java index f567b512..556635b6 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/WireValue.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/WireValue.java @@ -7,7 +7,7 @@ */ public class WireValue { public enum State { - ONE('1'), ZERO('0'), X('x'); + ONE('1'), ZERO('0'), Z('z'); public final char repr; @@ -16,14 +16,14 @@ public enum State { } public State negate() { - return this == X ? X : this == ONE ? ZERO : ONE; + return this == Z ? Z : this == ONE ? ZERO : ONE; } } private State[] bits; public WireValue(int bitSize) { - this(bitSize, State.X); + this(bitSize, State.Z); } public WireValue(int bitSize, State state) { @@ -53,9 +53,9 @@ public WireValue merge(WireValue value) { } for (int i = 0; i < getBitSize(); i++) { - if (getBit(i) == State.X) { + if (getBit(i) == State.Z) { setBit(i, value.getBit(i)); - } else if (value.getBit(i) == State.X) { + } else if (value.getBit(i) == State.Z) { setBit(i, getBit(i)); } else if (value.getBit(i) != getBit(i)) { throw new ShortCircuitException(this, value); @@ -81,7 +81,7 @@ public void setBitSize(int bitSize) { State[] oldBits = bits; bits = new State[bitSize]; - setAllBits(State.X); + setAllBits(State.Z); System.arraycopy(oldBits, 0, bits, 0, Math.min(bitSize, oldBits.length)); } @@ -129,7 +129,7 @@ public boolean isValidValue() { } for (State bit : bits) { - if (bit == State.X) { + if (bit == State.Z) { return false; } } @@ -140,7 +140,7 @@ public boolean isValidValue() { public int getValue() { int value = 0; for (int i = 0; i < bits.length; i++) { - if (bits[i] == State.X) { + if (bits[i] == State.Z) { throw new IllegalStateException("Invalid value"); } @@ -153,14 +153,14 @@ public int getValue() { * Converts the value held on this wire to a hex string. * * @return a lowercase hex string if all bits are defined, otherwise - * getBitSize() 'x's + * getBitSize() 'z's */ public String toHexString() { int hexDigits = 1 + (getBitSize() - 1) / 4; if (isValidValue()) { return String.format("%0" + hexDigits + "x", getValue()); } else { - return "x".repeat(Math.max(0, hexDigits)); + return "z".repeat(Math.max(0, hexDigits)); } } @@ -168,14 +168,14 @@ public String toHexString() { * Converts the value held on this wire to a decimal string. * * @return a decimal string if all bits are defined, otherwise - * getBitSize() 'x's + * getBitSize() 'z's */ public String toDecString() { int decDigits = (int)Math.ceil(getBitSize() / 3.322); if (isValidValue()) { return String.format("%0" + decDigits + "d", getValue()); } else { - return "x".repeat(Math.max(0, decDigits)); + return "z".repeat(Math.max(0, decDigits)); } } diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/arithmetic/Comparator.java b/src/main/java/com/ra4king/circuitsim/simulator/components/arithmetic/Comparator.java index fc69a0ca..c5cae18f 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/arithmetic/Comparator.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/arithmetic/Comparator.java @@ -46,7 +46,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { state.pushValue(getPort(PORT_EQ), new WireValue(1, valueA == valueB ? State.ONE : State.ZERO)); state.pushValue(getPort(PORT_GT), new WireValue(1, valueA > valueB ? State.ONE : State.ZERO)); } else { - WireValue xValue = new WireValue(1, State.X); + WireValue xValue = new WireValue(1, State.Z); state.pushValue(getPort(PORT_LT), xValue); state.pushValue(getPort(PORT_EQ), xValue); state.pushValue(getPort(PORT_GT), xValue); diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/gates/ControlledBuffer.java b/src/main/java/com/ra4king/circuitsim/simulator/components/gates/ControlledBuffer.java index 7b4d543a..b7334a82 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/gates/ControlledBuffer.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/gates/ControlledBuffer.java @@ -9,7 +9,7 @@ * @author Roi Atalla */ public class ControlledBuffer extends Component { - private final WireValue X_VALUE; + private final WireValue Z_VALUE; public static final int PORT_IN = 0; public static final int PORT_ENABLE = 1; @@ -17,7 +17,7 @@ public class ControlledBuffer extends Component { public ControlledBuffer(String name, int bitSize) { super(name, new int[] { bitSize, 1, bitSize }); - X_VALUE = new WireValue(bitSize); + Z_VALUE = new WireValue(bitSize); } @Override @@ -29,7 +29,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { if (state.getLastReceived(getPort(PORT_ENABLE)).getBit(0) == State.ONE) { state.pushValue(getPort(PORT_OUT), state.getLastReceived(getPort(PORT_IN))); } else { - state.pushValue(getPort(PORT_OUT), X_VALUE); + state.pushValue(getPort(PORT_OUT), Z_VALUE); } } } diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/gates/Gate.java b/src/main/java/com/ra4king/circuitsim/simulator/components/gates/Gate.java index f29dec97..41792bcb 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/gates/Gate.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/gates/Gate.java @@ -71,7 +71,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { } result.setBit(bit, portBit); - boolean isX = result.getBit(bit) == State.X; + boolean isX = result.getBit(bit) == State.Z; for (int port = 1; port < numInputs; port++) { portBit = state.getLastReceived(getPort(port)).getBit(bit); @@ -79,12 +79,12 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { portBit = portBit.negate(); } - isX &= portBit == State.X; + isX &= portBit == State.Z; result.setBit(bit, operate(result.getBit(bit), portBit)); } if (isX) { - result.setBit(bit, State.X); + result.setBit(bit, State.Z); } else if (negateOutput) { result.setBit(bit, result.getBit(bit) == State.ONE ? State.ZERO : State.ONE); } diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/gates/XorGate.java b/src/main/java/com/ra4king/circuitsim/simulator/components/gates/XorGate.java index 9183ff8e..c53de812 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/gates/XorGate.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/gates/XorGate.java @@ -24,6 +24,6 @@ protected XorGate(String name, int bitSize, int numInputs, boolean[] negateInput @Override protected State operate(State acc, State bit) { - return acc != State.X && bit != State.X && acc != bit ? State.ONE : State.ZERO; + return acc != State.Z && bit != State.Z && acc != bit ? State.ONE : State.ZERO; } } diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/memory/DFlipFlop.java b/src/main/java/com/ra4king/circuitsim/simulator/components/memory/DFlipFlop.java index fa2235ed..e9d19cfc 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/memory/DFlipFlop.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/memory/DFlipFlop.java @@ -49,7 +49,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { pushValue(state, State.ONE); } else if (enable != State.ZERO && portIndex == PORT_CLOCK && value.getBit(0) == State.ONE) { State d = state.getLastReceived(getPort(PORT_D)).getBit(0); - if (d != State.X) { + if (d != State.Z) { pushValue(state, d); } } diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/plexers/PriorityEncoder.java b/src/main/java/com/ra4king/circuitsim/simulator/components/plexers/PriorityEncoder.java index 1078087a..32779172 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/plexers/PriorityEncoder.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/plexers/PriorityEncoder.java @@ -42,7 +42,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { // The only other input Port are the indexed inputs if (!this.isEnabled) { state.pushValue(getEnabledOutPort(), new WireValue(1, State.ZERO)); - state.pushValue(out, new WireValue(out.getLink().getBitSize(), State.X)); + state.pushValue(out, new WireValue(out.getLink().getBitSize(), State.Z)); state.pushValue(getGroupSignalPort(), new WireValue(1, State.ZERO)); return; } @@ -59,7 +59,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { if (highest == -1) { state.pushValue(getEnabledOutPort(), new WireValue(1, State.ONE)); - state.pushValue(out, new WireValue(out.getLink().getBitSize(), State.X)); + state.pushValue(out, new WireValue(out.getLink().getBitSize(), State.Z)); state.pushValue(getGroupSignalPort(), new WireValue(1, State.ZERO)); } else { diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/SimpleTransistor.java b/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/SimpleTransistor.java index 78c72110..5576dbcd 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/SimpleTransistor.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/SimpleTransistor.java @@ -93,7 +93,7 @@ public class SimpleTransistor extends Component { public static final int PORT_GATE = 1; public static final int PORT_DRAIN = 2; - private static final WireValue X_VALUE = new WireValue(1); + private static final WireValue Z_VALUE = new WireValue(1); private boolean isIllegallyWired; private boolean isPType; @@ -124,7 +124,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { if (pTypeOk && nTypeOk && state.getLastReceived(getPort(PORT_GATE)).getBit(0) == enableBit) { state.pushValue(getPort(PORT_DRAIN), new WireValue(sourceBit)); } else { - state.pushValue(getPort(PORT_DRAIN), X_VALUE); + state.pushValue(getPort(PORT_DRAIN), Z_VALUE); if (!nTypeOk) { throw new SimulationException("N-type transistor must not be connected to logic-level high!"); diff --git a/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/Transistor.java b/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/Transistor.java index cbe32d49..7a36c41e 100644 --- a/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/Transistor.java +++ b/src/main/java/com/ra4king/circuitsim/simulator/components/wiring/Transistor.java @@ -13,7 +13,7 @@ public class Transistor extends Component { public static final int PORT_GATE = 1; public static final int PORT_OUT = 2; - private static final WireValue X_VALUE = new WireValue(1); + private static final WireValue Z_VALUE = new WireValue(1); private State enableBit; @@ -32,7 +32,7 @@ public void valueChanged(CircuitState state, WireValue value, int portIndex) { if (state.getLastReceived(getPort(PORT_GATE)).getBit(0) == enableBit) { state.pushValue(getPort(PORT_OUT), state.getLastReceived(getPort(PORT_IN))); } else { - state.pushValue(getPort(PORT_OUT), X_VALUE); + state.pushValue(getPort(PORT_OUT), Z_VALUE); } } } diff --git a/src/test/java/com/ra4king/circuitsim/simulator/WireValueTest.java b/src/test/java/com/ra4king/circuitsim/simulator/WireValueTest.java index 4011369a..6f4a7ee9 100644 --- a/src/test/java/com/ra4king/circuitsim/simulator/WireValueTest.java +++ b/src/test/java/com/ra4king/circuitsim/simulator/WireValueTest.java @@ -15,7 +15,7 @@ public class WireValueTest { public void testBasic() { WireValue value = new WireValue(10); assertThat(value.getBitSize()).isEqualTo(10); - assertThat(WireValueUtils.allBitsEqualTo(value, State.X)).isTrue(); + assertThat(WireValueUtils.allBitsEqualTo(value, State.Z)).isTrue(); value = new WireValue(15, State.ONE); assertThat(value.getBitSize()).isEqualTo(15); @@ -44,7 +44,7 @@ public void testMerge() { value2.setBit(2, State.ZERO); WireValue merge = new WireValue(value1).merge(value2); - assertThat(WireValueUtils.allBitsEqualTo(merge, State.ONE, State.ZERO, State.ZERO, State.X)).isTrue(); + assertThat(WireValueUtils.allBitsEqualTo(merge, State.ONE, State.ZERO, State.ZERO, State.Z)).isTrue(); } @Test