Quickfix for Wire.fuse(...)
[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 fusionTest1()\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 fusionTest2()\r
122         {\r
123                 t.reset();\r
124                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 1);\r
125                 Wire.fuse(a, b);\r
126                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.U, Bit.Z);\r
127                 t.executeAll();\r
128                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.U, Bit.Z);\r
129         }\r
130 \r
131         @Test\r
132         void triStateBufferTest()\r
133         {\r
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);\r
135                 new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());\r
136                 new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());\r
137                 new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());\r
138 \r
139                 ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();\r
140                 enI.feedSignals(Bit.ONE);\r
141                 aI.feedSignals(Bit.ONE);\r
142                 bI.feedSignals(Bit.Z);\r
143 \r
144                 t.executeAll();\r
145 \r
146                 assertEquals(Bit.ONE, b.getValue());\r
147 \r
148                 bI.feedSignals(Bit.ZERO);\r
149 \r
150                 t.executeAll();\r
151 \r
152                 assertEquals(Bit.X, b.getValue());\r
153                 assertEquals(Bit.ONE, a.getValue());\r
154 \r
155                 aI.clearSignals();\r
156                 enI.feedSignals(Bit.ZERO);\r
157 \r
158                 t.executeAll();\r
159 \r
160                 assertEquals(Bit.ZERO, a.getValue());\r
161 \r
162         }\r
163 \r
164         @Test\r
165         void muxTest()\r
166         {\r
167                 t.reset();\r
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);\r
169                 ReadWriteEnd selectIn = select.createReadWriteEnd();\r
170 \r
171                 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
172                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
173                 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
174 \r
175                 new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),\r
176                                 c.createReadOnlyEnd());\r
177                 t.executeAll();\r
178 \r
179                 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
180                 selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
181                 t.executeAll();\r
182 \r
183                 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
184 \r
185                 selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
186                 t.executeAll();\r
187 \r
188                 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
189 \r
190         }\r
191 \r
192         @Test\r
193         void demuxTest()\r
194         {\r
195                 t.reset();\r
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);\r
197                 ReadWriteEnd selectIn = select.createReadWriteEnd();\r
198 \r
199                 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
200                 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
201 \r
202                 new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),\r
203                                 c.createReadWriteEnd());\r
204                 t.executeAll();\r
205 \r
206                 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
207                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
208                 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
209                 selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
210                 t.executeAll();\r
211 \r
212                 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
213                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
214                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
215 \r
216                 selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
217                 t.executeAll();\r
218 \r
219                 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
220                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
221                 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
222 \r
223         }\r
224 \r
225         @Test\r
226         void andTest()\r
227         {\r
228                 t.reset();\r
229                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);\r
230                 new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
231                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
232                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
233 \r
234                 t.executeAll();\r
235 \r
236                 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
237         }\r
238 \r
239         @Test\r
240         void orTest()\r
241         {\r
242                 t.reset();\r
243                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);\r
244                 new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
245                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
246                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
247 \r
248                 t.executeAll();\r
249 \r
250                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);\r
251         }\r
252 \r
253         @Test\r
254         void nandTest()\r
255         {\r
256                 t.reset();\r
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);\r
258                 new NandGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
259                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
260                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
261                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
262 \r
263                 t.executeAll();\r
264 \r
265                 assertBitArrayEquals(d.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ONE);\r
266         }\r
267 \r
268         @Test\r
269         void norTest()\r
270         {\r
271                 t.reset();\r
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);\r
273                 new NorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
274                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
275                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
276                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
277 \r
278                 t.executeAll();\r
279 \r
280                 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
281         }\r
282 \r
283         @Test\r
284         void xorTest()\r
285         {\r
286                 t.reset();\r
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);\r
288                 new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
289                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
290                 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
291                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
292 \r
293                 t.executeAll();\r
294 \r
295                 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);\r
296         }\r
297 \r
298         @Test\r
299         void notTest()\r
300         {\r
301                 t.reset();\r
302                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);\r
303                 new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());\r
304                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
305 \r
306                 t.executeAll();\r
307 \r
308                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);\r
309         }\r
310 \r
311         @Test\r
312         void rsLatchCircuitTest()\r
313         {\r
314                 t.reset();\r
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),\r
316                                 nq = new Wire(t, 1, 1);\r
317 \r
318                 new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());\r
319                 new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());\r
320                 new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());\r
321                 new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());\r
322 \r
323                 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();\r
324 \r
325                 sIn.feedSignals(Bit.ONE);\r
326                 rIn.feedSignals(Bit.ZERO);\r
327 \r
328                 t.executeAll();\r
329 \r
330                 assertEquals(Bit.ONE, q.getValue());\r
331                 assertEquals(Bit.ZERO, nq.getValue());\r
332 \r
333                 sIn.feedSignals(Bit.ZERO);\r
334 \r
335                 t.executeAll();\r
336                 assertEquals(Bit.ONE, q.getValue());\r
337                 assertEquals(Bit.ZERO, nq.getValue());\r
338 \r
339                 rIn.feedSignals(Bit.ONE);\r
340 \r
341                 t.executeAll();\r
342 \r
343                 assertEquals(Bit.ZERO, q.getValue());\r
344                 assertEquals(Bit.ONE, nq.getValue());\r
345         }\r
346 \r
347         @Test\r
348         void numericValueTest()\r
349         {\r
350                 t.reset();\r
351 \r
352                 Wire a = new Wire(t, 4, 1);\r
353                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);\r
354 \r
355                 t.executeAll();\r
356 \r
357                 assertEquals(15, a.getUnsignedValue());\r
358                 assertEquals(-1, a.getSignedValue());\r
359         }\r
360 \r
361         boolean flag = false;\r
362 \r
363         @Test\r
364         void simpleTimelineTest()\r
365         {\r
366                 Timeline t = new Timeline(3);\r
367                 flag = false;\r
368                 t.addEvent((e) ->\r
369                 {\r
370                         if (!flag)\r
371                                 fail("Events executed out of order!");\r
372                         flag = false;\r
373                 }, 15);\r
374                 t.addEvent((e) ->\r
375                 {\r
376                         if (flag)\r
377                                 fail("Events executed out of order!");\r
378                         flag = true;\r
379                 }, 10);\r
380                 t.addEvent((e) ->\r
381                 {\r
382                         if (flag)\r
383                                 fail("Events executed out of order!");\r
384                         flag = true;\r
385                 }, 20);\r
386                 t.addEvent((e) ->\r
387                 {\r
388                         fail("Only supposed to execute until timestamp 20, not 25");\r
389                 }, 25);\r
390 \r
391                 t.executeUntil(t.laterThan(20), 100);\r
392 \r
393                 if (!flag)\r
394                         fail("Not all events were executed in order!");\r
395         }\r
396 \r
397         @Test\r
398         void multipleInputs()\r
399         {\r
400                 t.reset();\r
401                 Wire w = new Wire(t, 2, 1);\r
402                 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();\r
403                 wI1.feedSignals(Bit.ONE, Bit.Z);\r
404                 wI2.feedSignals(Bit.Z, Bit.X);\r
405                 t.executeAll();\r
406                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);\r
407 \r
408                 wI2.feedSignals(Bit.ZERO, Bit.Z);\r
409                 t.executeAll();\r
410                 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);\r
411 \r
412                 wI2.feedSignals(Bit.Z, Bit.Z);\r
413                 t.executeAll();\r
414                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
415 \r
416                 wI2.feedSignals(Bit.ONE, Bit.Z);\r
417                 ReadEnd rE = w.createReadOnlyEnd();\r
418                 rE.registerObserver((i) -> fail("WireEnd notified observer, although value did not change."));\r
419                 t.executeAll();\r
420                 rE.close();\r
421                 wI1.feedSignals(Bit.X, Bit.X);\r
422                 t.executeAll();\r
423                 wI1.registerObserver((i) -> fail("WireEnd notified observer, although it was closed."));\r
424                 wI1.close();\r
425                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
426         }\r
427 \r
428         @Test\r
429         void wireConnections()\r
430         {\r
431                 // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde\r
432 \r
433                 t.reset();\r
434 \r
435                 Wire a = new Wire(t, 1, 2);\r
436                 Wire b = new Wire(t, 1, 2);\r
437                 Wire c = new Wire(t, 1, 2);\r
438                 ReadWriteEnd aI = a.createReadWriteEnd();\r
439                 ReadWriteEnd bI = b.createReadWriteEnd();\r
440                 ReadWriteEnd cI = c.createReadWriteEnd();\r
441 \r
442                 TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());\r
443                 TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());\r
444                 LongConsumer print = time -> System.out.format("Time %2d\n a: %s\n b: %s\n c: %s\n", time, a, b, c);\r
445 \r
446                 cI.feedSignals(Bit.ONE);\r
447                 test.assertAfterSimulationIs(print, Bit.ONE);\r
448 \r
449                 cI.feedSignals(Bit.X);\r
450                 test.assertAfterSimulationIs(print, Bit.X);\r
451 \r
452                 cI.feedSignals(Bit.X);\r
453                 cI.feedSignals(Bit.Z);\r
454                 test.assertAfterSimulationIs(print, Bit.Z);\r
455 \r
456                 new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();\r
457                 test.assertAfterSimulationIs(print, Bit.Z);\r
458                 System.err.println("ONE");\r
459                 bI.feedSignals(Bit.ONE);\r
460                 test.assertAfterSimulationIs(print, Bit.ONE);\r
461                 System.err.println("ZERO");\r
462                 bI.feedSignals(Bit.ZERO);\r
463                 test.assertAfterSimulationIs(print, Bit.ZERO);\r
464                 System.err.println("Z");\r
465                 bI.feedSignals(Bit.Z);\r
466                 test.assertAfterSimulationIs(print, Bit.Z);\r
467 \r
468                 new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();\r
469                 System.err.println("Z 2");\r
470                 aI.feedSignals(Bit.Z);\r
471                 test.assertAfterSimulationIs(print, Bit.Z);\r
472                 test2.assertAfterSimulationIs(Bit.Z);\r
473                 System.err.println("ONE 2");\r
474                 aI.feedSignals(Bit.ONE);\r
475                 test.assertAfterSimulationIs(print, Bit.ONE);\r
476                 test2.assertAfterSimulationIs(Bit.ONE);\r
477                 System.err.println("ZERO 2");\r
478                 aI.feedSignals(Bit.ZERO);\r
479                 test.assertAfterSimulationIs(print, Bit.ZERO);\r
480                 test2.assertAfterSimulationIs(Bit.ZERO);\r
481                 System.err.println("Z 2 II");\r
482                 aI.feedSignals(Bit.Z);\r
483                 test.assertAfterSimulationIs(print, Bit.Z);\r
484                 test2.assertAfterSimulationIs(Bit.Z);\r
485 \r
486                 System.err.println("No Conflict yet");\r
487                 bI.feedSignals(Bit.ONE);\r
488                 test.assertAfterSimulationIs(print, Bit.ONE);\r
489                 test2.assertAfterSimulationIs(Bit.ONE);\r
490                 aI.feedSignals(Bit.ONE);\r
491                 test.assertAfterSimulationIs(print, Bit.ONE);\r
492                 test2.assertAfterSimulationIs(Bit.ONE);\r
493                 System.err.println("Conflict");\r
494                 aI.feedSignals(Bit.ZERO);\r
495                 test.assertAfterSimulationIs(print, Bit.X);\r
496                 test2.assertAfterSimulationIs(Bit.X);\r
497                 aI.feedSignals(Bit.ONE);\r
498                 test.assertAfterSimulationIs(print, Bit.ONE);\r
499                 test2.assertAfterSimulationIs(Bit.ONE);\r
500         }\r
501 \r
502         private static void assertBitArrayEquals(BitVector actual, Bit... expected)\r
503         {\r
504                 assertArrayEquals(expected, actual.getBits());\r
505         }\r
506 }\r