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