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