Quickfix for Wire.fuse(...)
authorFabian Stemmler <stemmler@in.tum.de>
Fri, 21 Jun 2019 13:02:41 +0000 (15:02 +0200)
committerFabian Stemmler <stemmler@in.tum.de>
Fri, 21 Jun 2019 13:02:41 +0000 (15:02 +0200)
The fusion of Wires caused an exception upon updating Wire values, if
one of the fused Wires had no inputs, other than the Wire it was fused
with.

The Connector Component still has this issue.

net.mograsim.logic.core/src/net/mograsim/logic/core/tests/ComponentTest.java
net.mograsim.logic.core/src/net/mograsim/logic/core/wires/Wire.java

index a595f05..b80b2f3 100644 (file)
@@ -88,7 +88,7 @@ class ComponentTest
        }
 
        @Test
-       void fusionTest()
+       void fusionTest1()
        {
                t.reset();
                Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), out = new Wire(t, 8, 1);
@@ -117,6 +117,17 @@ class ComponentTest
                assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
        }
 
+       @Test
+       void fusionTest2()
+       {
+               t.reset();
+               Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
+               Wire.fuse(a, b);
+               a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.U, Bit.Z);
+               t.executeAll();
+               assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);
+       }
+
        @Test
        void triStateBufferTest()
        {
@@ -430,7 +441,7 @@ class ComponentTest
 
                TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
                TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
-               LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);
+               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);
index 04ca9ce..ec30040 100644 (file)
@@ -567,8 +567,11 @@ public class Wire
                @Override
                public void update(LogicObservable initiator)
                {
-                       ReadWriteEnd read = (ReadWriteEnd) initiator;
-                       target.setValues(fromTarget, read.wireValuesExcludingMe().subVector(fromSource, fromSource + length));
+                       ReadWriteEnd source = (ReadWriteEnd) initiator;
+                       BitVector targetInput = (source.getWire().inputs.size() > 1)
+                                       ? source.wireValuesExcludingMe().subVector(fromSource, fromSource + length)
+                                       : BitVector.of(Bit.Z, length);
+                       target.setValues(fromTarget, targetInput);
                }
        }
 }
\ No newline at end of file