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