From: Christian Femers Date: Sat, 11 May 2019 18:36:40 +0000 (+0200) Subject: fixed Connector and added some useful methods to WireArray and Util X-Git-Url: https://mograsim.net/gitweb/?a=commitdiff_plain;h=830af2a47f501b4d31f68663b609d225eae603cd;p=Mograsim.git fixed Connector and added some useful methods to WireArray and Util --- diff --git a/era.mi/src/era/mi/logic/Util.java b/era.mi/src/era/mi/logic/Util.java index 6bca6d0e..6aec8844 100644 --- a/era.mi/src/era/mi/logic/Util.java +++ b/era.mi/src/era/mi/logic/Util.java @@ -84,6 +84,29 @@ public final class Util } return out; } + + public static Bit[] arrayOfZ(int length) + { + Bit[] out = new Bit[length]; + Arrays.fill(out, Bit.Z); + return out; + } + + /** + * uses the {@link Bit#combineWith(Bit)} method, does not create a new array, + * the result is stored in the fist array. + * + * @author Christian Femers + */ + public static Bit[] combineInto(Bit[] dest, Bit[] addition) + { + if (dest.length != addition.length) + throw new IllegalArgumentException("Bit Arrays were not of equal length."); + for (int i = 0; i < addition.length; i++) { + dest[i] = dest[i].combineWith(addition[i]); + } + return dest; + } interface BitOp { diff --git a/era.mi/src/era/mi/logic/components/BitDisplay.java b/era.mi/src/era/mi/logic/components/BitDisplay.java index 940f69c0..f783c627 100644 --- a/era.mi/src/era/mi/logic/components/BitDisplay.java +++ b/era.mi/src/era/mi/logic/components/BitDisplay.java @@ -15,6 +15,7 @@ public class BitDisplay extends BasicComponent super(1); this.in = in; in.addObserver(this); + compute(); } @Override diff --git a/era.mi/src/era/mi/logic/tests/ComponentTest.java b/era.mi/src/era/mi/logic/tests/ComponentTest.java index c1f0e199..a407b8df 100644 --- a/era.mi/src/era/mi/logic/tests/ComponentTest.java +++ b/era.mi/src/era/mi/logic/tests/ComponentTest.java @@ -1,11 +1,9 @@ package era.mi.logic.tests; -import static org.junit.jupiter.api.Assertions.assertArrayEquals; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.*; import java.util.Arrays; +import java.util.function.LongConsumer; import org.junit.jupiter.api.Test; @@ -241,45 +239,79 @@ class ComponentTest assertArrayEquals(new Bit[] { Bit.ONE, Bit.Z }, w.getValues()); } -// @Test -// void wireConnections() -// { -// // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde -// -// Simulation.TIMELINE.reset(); -// -// WireArray a = new WireArray(1, 2); -// WireArray b = new WireArray(1, 2); -// WireArray c = new WireArray(1, 2); -// WireArrayInput aI = a.createInput(); -// WireArrayInput bI = b.createInput(); -// WireArrayInput cI = c.createInput(); -// -// TestBitDisplay test = new TestBitDisplay(c); -// LongConsumer print = time -> System.out.format("Time %2d\n %s\n %s\n %s\n", time, a, b, c); -// -// cI.feedSignals(Bit.ONE); -// test.assertAfterSimulationIs(print, Bit.ONE); -// -// cI.feedSignals(Bit.X); -// test.assertAfterSimulationIs(print, Bit.X); -// -// cI.feedSignals(Bit.X); -// cI.feedSignals(Bit.Z); -// test.assertAfterSimulationIs(print, Bit.Z); -// -// Connector c1 = new Connector(b, c); -// test.assertAfterSimulationIs(print, Bit.Z); -// System.out.println("ONE"); -// bI.feedSignals(Bit.ONE); -// test.assertAfterSimulationIs(print, Bit.ONE); -// System.out.println("ZERO"); -// bI.feedSignals(Bit.ZERO); -// test.assertAfterSimulationIs(print, Bit.ZERO); -// System.out.println("Z"); -// bI.feedSignals(Bit.Z); -// test.assertAfterSimulationIs(Bit.Z); -// } + @Test + void wireConnections() + { + // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde + + Simulation.TIMELINE.reset(); + + WireArray a = new WireArray(1, 2); + WireArray b = new WireArray(1, 2); + WireArray c = new WireArray(1, 2); + WireArrayInput aI = a.createInput(); + WireArrayInput bI = b.createInput(); + WireArrayInput cI = c.createInput(); + + TestBitDisplay test = new TestBitDisplay(c); + TestBitDisplay test2 = new TestBitDisplay(a); + LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c); + + cI.feedSignals(Bit.ONE); + test.assertAfterSimulationIs(print, Bit.ONE); + + cI.feedSignals(Bit.X); + test.assertAfterSimulationIs(print, Bit.X); + + cI.feedSignals(Bit.X); + cI.feedSignals(Bit.Z); + test.assertAfterSimulationIs(print, Bit.Z); + + Connector c1 = new Connector(b, c); + test.assertAfterSimulationIs(print, Bit.Z); + System.err.println("ONE"); + bI.feedSignals(Bit.ONE); + test.assertAfterSimulationIs(print, Bit.ONE); + System.err.println("ZERO"); + bI.feedSignals(Bit.ZERO); + test.assertAfterSimulationIs(print, Bit.ZERO); + System.err.println("Z"); + bI.feedSignals(Bit.Z); + test.assertAfterSimulationIs(print, Bit.Z); + + Connector c2 = new Connector(a, b); + System.err.println("Z 2"); + aI.feedSignals(Bit.Z); + test.assertAfterSimulationIs(print, Bit.Z); + test2.assertAfterSimulationIs(Bit.Z); + System.err.println("ONE 2"); + aI.feedSignals(Bit.ONE); + test.assertAfterSimulationIs(print, Bit.ONE); + test2.assertAfterSimulationIs(Bit.ONE); + System.err.println("ZERO 2"); + aI.feedSignals(Bit.ZERO); + test.assertAfterSimulationIs(print, Bit.ZERO); + test2.assertAfterSimulationIs(Bit.ZERO); + System.err.println("Z 2 II"); + aI.feedSignals(Bit.Z); + test.assertAfterSimulationIs(print, Bit.Z); + test2.assertAfterSimulationIs(Bit.Z); + + System.err.println("No Conflict yet"); + bI.feedSignals(Bit.ONE); + test.assertAfterSimulationIs(print, Bit.ONE); + test2.assertAfterSimulationIs(Bit.ONE); + aI.feedSignals(Bit.ONE); + test.assertAfterSimulationIs(print, Bit.ONE); + test2.assertAfterSimulationIs(Bit.ONE); + System.err.println("Conflict"); + aI.feedSignals(Bit.ZERO); + test.assertAfterSimulationIs(print, Bit.X); + test2.assertAfterSimulationIs(Bit.X); + aI.feedSignals(Bit.ONE); + test.assertAfterSimulationIs(print, Bit.ONE); + test2.assertAfterSimulationIs(Bit.ONE); + } private static void assertBitArrayEquals(Bit[] actual, Bit... expected) { diff --git a/era.mi/src/era/mi/logic/tests/Connector.java b/era.mi/src/era/mi/logic/tests/Connector.java index d59ee8c0..23ec1bca 100644 --- a/era.mi/src/era/mi/logic/tests/Connector.java +++ b/era.mi/src/era/mi/logic/tests/Connector.java @@ -30,9 +30,9 @@ public class Connector implements WireArrayObserver Simulation.TIMELINE.addEvent((e) -> { if (initiator == a) - bI.feedSignals(a.getValues()); + bI.feedSignals(aI.wireValuesExcludingMe()); else - aI.feedSignals(b.getValues()); + aI.feedSignals(bI.wireValuesExcludingMe()); }, 1); } } diff --git a/era.mi/src/era/mi/logic/wires/WireArray.java b/era.mi/src/era/mi/logic/wires/WireArray.java index 44cd7515..370cbbd5 100644 --- a/era.mi/src/era/mi/logic/wires/WireArray.java +++ b/era.mi/src/era/mi/logic/wires/WireArray.java @@ -7,6 +7,7 @@ import java.util.List; import era.mi.logic.Bit; import era.mi.logic.Simulation; +import era.mi.logic.Util; /** * Represents an array of wires that can store n bits of information. @@ -317,6 +318,18 @@ public class WireArray { return values.clone(); } + + public Bit[] wireValuesExcludingMe() + { + Bit[] bits = Util.arrayOfZ(length); + for (WireArrayInput wai : inputs) + { + if(wai == this) + continue; + Util.combineInto(bits, wai.getValues()); + } + return bits; + } public void clearSignals() {