Fixed issue with Wire fusion
[Mograsim.git] / net.mograsim.logic.core / test / net / mograsim / logic / core / tests / ComponentTest.java
1 package net.mograsim.logic.core.tests;
2
3 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
4 import static org.junit.jupiter.api.Assertions.assertEquals;
5 import static org.junit.jupiter.api.Assertions.fail;
6
7 import java.math.BigInteger;
8 import java.util.Random;
9 import java.util.function.LongConsumer;
10
11 import org.junit.Ignore;
12 import org.junit.jupiter.api.BeforeAll;
13 import org.junit.jupiter.api.BeforeEach;
14 import org.junit.jupiter.api.Disabled;
15 import org.junit.jupiter.api.Test;
16 import org.junit.jupiter.api.TestInstance;
17 import org.junit.jupiter.api.TestInstance.Lifecycle;
18
19 import net.mograsim.logic.core.components.Connector;
20 import net.mograsim.logic.core.components.Demux;
21 import net.mograsim.logic.core.components.Merger;
22 import net.mograsim.logic.core.components.Mux;
23 import net.mograsim.logic.core.components.Splitter;
24 import net.mograsim.logic.core.components.TriStateBuffer;
25 import net.mograsim.logic.core.components.gates.AndGate;
26 import net.mograsim.logic.core.components.gates.NandGate;
27 import net.mograsim.logic.core.components.gates.NorGate;
28 import net.mograsim.logic.core.components.gates.NotGate;
29 import net.mograsim.logic.core.components.gates.OrGate;
30 import net.mograsim.logic.core.components.gates.XorGate;
31 import net.mograsim.logic.core.timeline.Timeline;
32 import net.mograsim.logic.core.types.Bit;
33 import net.mograsim.logic.core.types.BitVector;
34 import net.mograsim.logic.core.wires.Wire;
35 import net.mograsim.logic.core.wires.Wire.ReadEnd;
36 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
37
38 @SuppressWarnings("unused")
39 class ComponentTest
40 {
41         private Timeline t = new Timeline(11);
42
43         @BeforeEach
44         void resetTimeline()
45         {
46                 t.reset();
47         }
48
49         @Test
50         void circuitExampleTest()
51         {
52                 Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), c = new Wire(t, 1, 10), d = new Wire(t, 2, 1), e = new Wire(t, 1, 1),
53                                 f = new Wire(t, 1, 1), g = new Wire(t, 1, 1), h = new Wire(t, 2, 1), i = new Wire(t, 2, 1), j = new Wire(t, 1, 1),
54                                 k = new Wire(t, 1, 1);
55                 new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
56                 new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());
57                 new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());
58                 new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());
59                 new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());
60
61                 a.createReadWriteEnd().feedSignals(Bit.ZERO);
62                 b.createReadWriteEnd().feedSignals(Bit.ONE);
63                 c.createReadWriteEnd().feedSignals(Bit.ZERO);
64                 d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);
65                 e.createReadWriteEnd().feedSignals(Bit.ZERO);
66
67                 t.executeAll();
68
69                 assertEquals(Bit.ONE, j.getValue());
70                 assertEquals(Bit.ZERO, k.getValue());
71         }
72
73         @Test
74         void splitterTest()
75         {
76                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 2, 1), c = new Wire(t, 3, 1), in = new Wire(t, 8, 1);
77                 in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
78                 new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());
79
80                 t.executeAll();
81
82                 assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
83                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);
84                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
85         }
86
87         @Test
88         void mergerTest()
89         {
90                 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);
91                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
92                 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);
93                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
94
95                 new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
96
97                 t.executeAll();
98
99                 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
100         }
101
102         @Test
103         void fusionTest1()
104         {
105                 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);
106                 Wire.fuse(a, out, 0, 0, a.width);
107                 Wire.fuse(b, out, 0, a.width, b.width);
108                 Wire.fuse(c, out, 0, a.width + b.width, c.width);
109                 ReadWriteEnd rA = a.createReadWriteEnd();
110                 rA.feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);
111                 ReadWriteEnd rB = b.createReadWriteEnd();
112                 rB.feedSignals(Bit.ONE, Bit.ZERO);
113                 ReadWriteEnd rC = c.createReadWriteEnd();
114                 rC.feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
115
116                 t.executeAll();
117                 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
118                 out.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
119                 t.executeAll();
120                 assertBitArrayEquals(rA.getValues(), Bit.X, Bit.X, Bit.X);
121                 assertBitArrayEquals(rB.getValues(), Bit.X, Bit.X);
122                 assertBitArrayEquals(rC.getValues(), Bit.X, Bit.X, Bit.X);
123                 rA.clearSignals();
124                 rB.clearSignals();
125                 rC.clearSignals();
126                 t.executeAll();
127                 assertBitArrayEquals(rA.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);
128                 assertBitArrayEquals(rB.getValues(), Bit.ZERO, Bit.ONE);
129                 assertBitArrayEquals(rC.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);
130         }
131
132         @Test
133         void fusionTest2()
134         {
135                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
136                 Wire.fuse(a, b);
137                 ReadWriteEnd rw = a.createReadWriteEnd();
138                 t.executeAll();
139                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
140
141                 rw.feedSignals(Bit.ONE, Bit.U, Bit.Z);
142                 t.executeAll();
143                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);
144         }
145
146         @Test
147         void fusionTest3()
148         {
149                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
150                 a.createReadWriteEnd().feedSignals(Bit.Z, Bit.U, Bit.X);
151                 t.executeAll();
152                 Wire.fuse(a, b);
153                 t.executeAll();
154                 assertBitArrayEquals(b.getValues(), Bit.Z, Bit.U, Bit.X);
155         }
156
157         @Test
158         void fusionTest4()
159         {
160                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
161                 a.createReadWriteEnd();
162                 t.executeAll();
163
164                 Wire.fuse(a, b);
165                 t.executeAll();
166                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
167         }
168
169 //      @Test
170 //      void connectorTest()
171 //      {
172 //              t.reset();
173 //              Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);
174 //              new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
175 ////            b.createReadWriteEnd();
176 //              a.createReadWriteEnd();
177 //              t.executeAll();
178 //              assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U);
179 //      }
180
181         @Test
182         void triStateBufferTest()
183         {
184                 Wire a = new Wire(t, 1, 1), b = new Wire(t, 1, 1), en = new Wire(t, 1, 1), notEn = new Wire(t, 1, 1);
185                 new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());
186                 new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());
187                 new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());
188
189                 ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();
190                 enI.feedSignals(Bit.ONE);
191                 aI.feedSignals(Bit.ONE);
192                 bI.feedSignals(Bit.Z);
193
194                 t.executeAll();
195
196                 assertEquals(Bit.ONE, b.getValue());
197
198                 bI.feedSignals(Bit.ZERO);
199
200                 t.executeAll();
201
202                 assertEquals(Bit.X, b.getValue());
203                 assertEquals(Bit.ONE, a.getValue());
204
205                 aI.clearSignals();
206                 enI.feedSignals(Bit.ZERO);
207
208                 t.executeAll();
209
210                 assertEquals(Bit.ZERO, a.getValue());
211
212         }
213
214         @Test
215         void muxTest()
216         {
217                 Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), out = new Wire(t, 4, 1);
218                 ReadWriteEnd selectIn = select.createReadWriteEnd();
219
220                 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
221                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
222                 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
223
224                 new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),
225                                 c.createReadOnlyEnd());
226                 t.executeAll();
227
228                 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
229                 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
230                 t.executeAll();
231
232                 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
233
234                 selectIn.feedSignals(Bit.ONE, Bit.ONE);
235                 t.executeAll();
236
237                 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
238
239         }
240
241         @Test
242         void demuxTest()
243         {
244                 Wire a = new Wire(t, 4, 3), b = new Wire(t, 4, 6), c = new Wire(t, 4, 4), select = new Wire(t, 2, 5), in = new Wire(t, 4, 1);
245                 ReadWriteEnd selectIn = select.createReadWriteEnd();
246
247                 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);
248                 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
249
250                 new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),
251                                 c.createReadWriteEnd());
252                 t.executeAll();
253
254                 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
255                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
256                 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
257                 selectIn.feedSignals(Bit.ZERO, Bit.ONE);
258                 t.executeAll();
259
260                 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
261                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
262                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);
263
264                 selectIn.feedSignals(Bit.ONE, Bit.ONE);
265                 t.executeAll();
266
267                 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
268                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);
269                 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);
270
271         }
272
273         @Test
274         void andTest()
275         {
276                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
277                 new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
278                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
279                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
280
281                 t.executeAll();
282
283                 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);
284         }
285
286         @Test
287         void orTest()
288         {
289                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);
290                 new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());
291                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
292                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
293
294                 t.executeAll();
295
296                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);
297         }
298
299         @Test
300         void nandTest()
301         {
302                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1), d = new Wire(t, 4, 1);
303                 new NandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
304                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
305                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
306                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
307
308                 t.executeAll();
309
310                 assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);
311         }
312
313         @Test
314         void norTest()
315         {
316                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1), d = new Wire(t, 4, 1);
317                 new NorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
318                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
319                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);
320                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);
321
322                 t.executeAll();
323
324                 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);
325         }
326
327         @Test
328         void xorTest()
329         {
330                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2), c = new Wire(t, 3, 1), d = new Wire(t, 3, 1);
331                 new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());
332                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
333                 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
334                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);
335
336                 t.executeAll();
337
338                 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);
339         }
340
341         @Test
342         void notTest()
343         {
344                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);
345                 new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());
346                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);
347
348                 t.executeAll();
349
350                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);
351         }
352
353         @Test
354         void rsLatchCircuitTest()
355         {
356                 Wire r = new Wire(t, 1, 1), s = new Wire(t, 1, 1), t1 = new Wire(t, 1, 15), t2 = new Wire(t, 1, 1), q = new Wire(t, 1, 1),
357                                 nq = new Wire(t, 1, 1);
358
359                 new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());
360                 new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());
361                 new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());
362                 new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());
363
364                 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();
365
366                 sIn.feedSignals(Bit.ONE);
367                 rIn.feedSignals(Bit.ZERO);
368
369                 t.executeAll();
370
371                 assertEquals(Bit.ONE, q.getValue());
372                 assertEquals(Bit.ZERO, nq.getValue());
373
374                 sIn.feedSignals(Bit.ZERO);
375
376                 t.executeAll();
377                 assertEquals(Bit.ONE, q.getValue());
378                 assertEquals(Bit.ZERO, nq.getValue());
379
380                 rIn.feedSignals(Bit.ONE);
381
382                 t.executeAll();
383
384                 assertEquals(Bit.ZERO, q.getValue());
385                 assertEquals(Bit.ONE, nq.getValue());
386         }
387
388         @Test
389         void numericValueTest()
390         {
391                 Wire a = new Wire(t, 4, 1);
392                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);
393
394                 t.executeAll();
395
396                 assertEquals(15, a.getUnsignedValue());
397                 assertEquals(-1, a.getSignedValue());
398         }
399
400         boolean flag = false;
401
402         @Test
403         void simpleTimelineTest()
404         {
405                 Timeline t = new Timeline(3);
406                 flag = false;
407                 t.addEvent((e) ->
408                 {
409                         if (!flag)
410                                 fail("Events executed out of order!");
411                         flag = false;
412                 }, 15);
413                 t.addEvent((e) ->
414                 {
415                         if (flag)
416                                 fail("Events executed out of order!");
417                         flag = true;
418                 }, 10);
419                 t.addEvent((e) ->
420                 {
421                         if (flag)
422                                 fail("Events executed out of order!");
423                         flag = true;
424                 }, 20);
425                 t.addEvent((e) ->
426                 {
427                         fail("Only supposed to execute until timestamp 20, not 25");
428                 }, 25);
429
430                 t.executeUntil(t.laterThan(20), 100);
431
432                 if (!flag)
433                         fail("Not all events were executed in order!");
434         }
435
436         // TODO: Adapt this test, now that update notifications are issued whenever any input to a wire changes
437         @Disabled("Out of date")
438         @Test
439         void multipleInputs()
440         {
441                 Wire w = new Wire(t, 2, 1);
442                 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();
443                 wI1.feedSignals(Bit.ONE, Bit.Z);
444                 wI2.feedSignals(Bit.Z, Bit.X);
445                 t.executeAll();
446                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);
447
448                 wI2.feedSignals(Bit.ZERO, Bit.Z);
449                 t.executeAll();
450                 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);
451
452                 wI2.feedSignals(Bit.Z, Bit.Z);
453                 t.executeAll();
454                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
455
456                 wI2.feedSignals(Bit.ONE, Bit.Z);
457                 ReadEnd rE = w.createReadOnlyEnd();
458                 rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));
459                 t.executeAll();
460                 rE.close();
461                 wI1.feedSignals(Bit.X, Bit.X);
462                 t.executeAll();
463                 wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));
464                 wI1.close();
465                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);
466         }
467
468         @Disabled("Braucht den Connector noch irgendjemand?")
469         @Test
470         void wireConnections()
471         {
472                 // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde
473
474                 Wire a = new Wire(t, 1, 2);
475                 Wire b = new Wire(t, 1, 2);
476                 Wire c = new Wire(t, 1, 2);
477                 ReadWriteEnd aI = a.createReadWriteEnd();
478                 ReadWriteEnd bI = b.createReadWriteEnd();
479                 ReadWriteEnd cI = c.createReadWriteEnd();
480
481                 TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());
482                 TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());
483                 LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);
484
485                 cI.feedSignals(Bit.ONE);
486                 test.assertAfterSimulationIs(print, Bit.ONE);
487
488                 cI.feedSignals(Bit.X);
489                 test.assertAfterSimulationIs(print, Bit.X);
490
491                 cI.feedSignals(Bit.X);
492                 cI.feedSignals(Bit.Z);
493                 test.assertAfterSimulationIs(print, Bit.Z);
494
495                 new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();
496                 test.assertAfterSimulationIs(print, Bit.Z);
497                 System.err.println("ONE");
498                 bI.feedSignals(Bit.ONE);
499                 test.assertAfterSimulationIs(print, Bit.ONE);
500                 System.err.println("ZERO");
501                 bI.feedSignals(Bit.ZERO);
502                 test.assertAfterSimulationIs(print, Bit.ZERO);
503                 System.err.println("Z");
504                 bI.feedSignals(Bit.Z);
505                 test.assertAfterSimulationIs(print, Bit.Z);
506
507                 new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();
508                 System.err.println("Z 2");
509                 aI.feedSignals(Bit.Z);
510                 test.assertAfterSimulationIs(print, Bit.Z);
511                 test2.assertAfterSimulationIs(Bit.Z);
512                 System.err.println("ONE 2");
513                 aI.feedSignals(Bit.ONE);
514                 test.assertAfterSimulationIs(print, Bit.ONE);
515                 test2.assertAfterSimulationIs(Bit.ONE);
516                 System.err.println("ZERO 2");
517                 aI.feedSignals(Bit.ZERO);
518                 test.assertAfterSimulationIs(print, Bit.ZERO);
519                 test2.assertAfterSimulationIs(Bit.ZERO);
520                 System.err.println("Z 2 II");
521                 aI.feedSignals(Bit.Z);
522                 test.assertAfterSimulationIs(print, Bit.Z);
523                 test2.assertAfterSimulationIs(Bit.Z);
524
525                 System.err.println("No Conflict yet");
526                 bI.feedSignals(Bit.ONE);
527                 test.assertAfterSimulationIs(print, Bit.ONE);
528                 test2.assertAfterSimulationIs(Bit.ONE);
529                 aI.feedSignals(Bit.ONE);
530                 test.assertAfterSimulationIs(print, Bit.ONE);
531                 test2.assertAfterSimulationIs(Bit.ONE);
532                 System.err.println("Conflict");
533                 aI.feedSignals(Bit.ZERO);
534                 test.assertAfterSimulationIs(print, Bit.X);
535                 test2.assertAfterSimulationIs(Bit.X);
536                 aI.feedSignals(Bit.ONE);
537                 test.assertAfterSimulationIs(print, Bit.ONE);
538                 test2.assertAfterSimulationIs(Bit.ONE);
539         }
540
541         private static void assertBitArrayEquals(BitVector actual, Bit... expected)
542         {
543                 assertArrayEquals(expected, actual.getBits());
544         }
545 }