Timeline now passed via constructor
[Mograsim.git] / era.mi / src / era / mi / logic / tests / ComponentTest.java
1 package era.mi.logic.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 era.mi.logic.components.Connector;\r
12 import era.mi.logic.components.Demux;\r
13 import era.mi.logic.components.Merger;\r
14 import era.mi.logic.components.Mux;\r
15 import era.mi.logic.components.Splitter;\r
16 import era.mi.logic.components.TriStateBuffer;\r
17 import era.mi.logic.components.gates.AndGate;\r
18 import era.mi.logic.components.gates.NotGate;\r
19 import era.mi.logic.components.gates.OrGate;\r
20 import era.mi.logic.components.gates.XorGate;\r
21 import era.mi.logic.timeline.Timeline;\r
22 import era.mi.logic.types.Bit;\r
23 import era.mi.logic.types.BitVector;\r
24 import era.mi.logic.wires.Wire;\r
25 import era.mi.logic.wires.Wire.ReadEnd;\r
26 import era.mi.logic.wires.Wire.ReadWriteEnd;\r
27 \r
28 class ComponentTest\r
29 {\r
30         private Timeline t = new Timeline(11);\r
31 \r
32         @Test\r
33         void circuitExampleTest()\r
34         {\r
35                 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
36                                 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
37                                 k = new Wire(t, 1, 1);\r
38                 new AndGate(t, 1, f.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
39                 new NotGate(t, 1, f.createReadOnlyEnd(), g.createReadWriteEnd());\r
40                 new Merger(t, h.createReadWriteEnd(), c.createReadOnlyEnd(), g.createReadOnlyEnd());\r
41                 new Mux(t, 1, i.createReadWriteEnd(), e.createReadOnlyEnd(), h.createReadOnlyEnd(), d.createReadOnlyEnd());\r
42                 new Splitter(t, i.createReadOnlyEnd(), k.createReadWriteEnd(), j.createReadWriteEnd());\r
43 \r
44                 a.createReadWriteEnd().feedSignals(Bit.ZERO);\r
45                 b.createReadWriteEnd().feedSignals(Bit.ONE);\r
46                 c.createReadWriteEnd().feedSignals(Bit.ZERO);\r
47                 d.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE);\r
48                 e.createReadWriteEnd().feedSignals(Bit.ZERO);\r
49 \r
50                 t.executeAll();\r
51 \r
52                 assertEquals(Bit.ONE, j.getValue());\r
53                 assertEquals(Bit.ZERO, k.getValue());\r
54         }\r
55 \r
56         @Test\r
57         void splitterTest()\r
58         {\r
59                 t.reset();\r
60                 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
61                 in.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
62                 new Splitter(t, in.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(), c.createReadWriteEnd());\r
63 \r
64                 t.executeAll();\r
65 \r
66                 assertBitArrayEquals(a.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO);\r
67                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO);\r
68                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE);\r
69         }\r
70 \r
71         @Test\r
72         void mergerTest()\r
73         {\r
74                 t.reset();\r
75                 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
76                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO);\r
77                 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO);\r
78                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
79 \r
80                 new Merger(t, out.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
81 \r
82                 t.executeAll();\r
83 \r
84                 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
85         }\r
86 \r
87         @Test\r
88         void triStateBufferTest()\r
89         {\r
90                 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
91                 new NotGate(t, 1, en.createReadOnlyEnd(), notEn.createReadWriteEnd());\r
92                 new TriStateBuffer(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd(), en.createReadOnlyEnd());\r
93                 new TriStateBuffer(t, 1, b.createReadOnlyEnd(), a.createReadWriteEnd(), notEn.createReadOnlyEnd());\r
94 \r
95                 ReadWriteEnd enI = en.createReadWriteEnd(), aI = a.createReadWriteEnd(), bI = b.createReadWriteEnd();\r
96                 enI.feedSignals(Bit.ONE);\r
97                 aI.feedSignals(Bit.ONE);\r
98                 bI.feedSignals(Bit.Z);\r
99 \r
100                 t.executeAll();\r
101 \r
102                 assertEquals(Bit.ONE, b.getValue());\r
103 \r
104                 bI.feedSignals(Bit.ZERO);\r
105 \r
106                 t.executeAll();\r
107 \r
108                 assertEquals(Bit.X, b.getValue());\r
109                 assertEquals(Bit.ONE, a.getValue());\r
110 \r
111                 aI.clearSignals();\r
112                 enI.feedSignals(Bit.ZERO);\r
113 \r
114                 t.executeAll();\r
115 \r
116                 assertEquals(Bit.ZERO, a.getValue());\r
117 \r
118         }\r
119 \r
120         @Test\r
121         void muxTest()\r
122         {\r
123                 t.reset();\r
124                 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
125                 ReadWriteEnd selectIn = select.createReadWriteEnd();\r
126 \r
127                 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
128                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
129                 c.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
130 \r
131                 new Mux(t, 1, out.createReadWriteEnd(), select.createReadOnlyEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(),\r
132                                 c.createReadOnlyEnd());\r
133                 t.executeAll();\r
134 \r
135                 assertBitArrayEquals(out.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
136                 selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
137                 t.executeAll();\r
138 \r
139                 assertBitArrayEquals(out.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
140 \r
141                 selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
142                 t.executeAll();\r
143 \r
144                 assertBitArrayEquals(out.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
145 \r
146         }\r
147 \r
148         @Test\r
149         void demuxTest()\r
150         {\r
151                 t.reset();\r
152                 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
153                 ReadWriteEnd selectIn = select.createReadWriteEnd();\r
154 \r
155                 selectIn.feedSignals(Bit.ZERO, Bit.ZERO);\r
156                 in.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
157 \r
158                 new Demux(t, 1, in.createReadOnlyEnd(), select.createReadOnlyEnd(), a.createReadWriteEnd(), b.createReadWriteEnd(),\r
159                                 c.createReadWriteEnd());\r
160                 t.executeAll();\r
161 \r
162                 assertBitArrayEquals(a.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
163                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
164                 assertBitArrayEquals(c.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
165                 selectIn.feedSignals(Bit.ZERO, Bit.ONE);\r
166                 t.executeAll();\r
167 \r
168                 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
169                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
170                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ZERO, Bit.ONE, Bit.ZERO);\r
171 \r
172                 selectIn.feedSignals(Bit.ONE, Bit.ONE);\r
173                 t.executeAll();\r
174 \r
175                 assertBitArrayEquals(a.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
176                 assertBitArrayEquals(b.getValues(), Bit.U, Bit.U, Bit.U, Bit.U);\r
177                 assertBitArrayEquals(c.getValues(), Bit.Z, Bit.Z, Bit.Z, Bit.Z);\r
178 \r
179         }\r
180 \r
181         @Test\r
182         void andTest()\r
183         {\r
184                 t.reset();\r
185                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);\r
186                 new AndGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
187                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
188                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
189 \r
190                 t.executeAll();\r
191 \r
192                 assertBitArrayEquals(c.getValues(), Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
193         }\r
194 \r
195         @Test\r
196         void orTest()\r
197         {\r
198                 t.reset();\r
199                 Wire a = new Wire(t, 4, 1), b = new Wire(t, 4, 3), c = new Wire(t, 4, 1);\r
200                 new OrGate(t, 1, c.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd());\r
201                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ZERO);\r
202                 b.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ZERO, Bit.ONE);\r
203 \r
204                 t.executeAll();\r
205 \r
206                 assertBitArrayEquals(c.getValues(), Bit.ONE, Bit.ONE, Bit.ZERO, Bit.ONE);\r
207         }\r
208 \r
209         @Test\r
210         void xorTest()\r
211         {\r
212                 t.reset();\r
213                 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
214                 new XorGate(t, 1, d.createReadWriteEnd(), a.createReadOnlyEnd(), b.createReadOnlyEnd(), c.createReadOnlyEnd());\r
215                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
216                 b.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
217                 c.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ZERO, Bit.ONE);\r
218 \r
219                 t.executeAll();\r
220 \r
221                 assertBitArrayEquals(d.getValues(), Bit.ZERO, Bit.ONE, Bit.ONE);\r
222         }\r
223 \r
224         @Test\r
225         void notTest()\r
226         {\r
227                 t.reset();\r
228                 Wire a = new Wire(t, 3, 1), b = new Wire(t, 3, 2);\r
229                 new NotGate(t, 1, a.createReadOnlyEnd(), b.createReadWriteEnd());\r
230                 a.createReadWriteEnd().feedSignals(Bit.ZERO, Bit.ONE, Bit.ONE);\r
231 \r
232                 t.executeAll();\r
233 \r
234                 assertBitArrayEquals(b.getValues(), Bit.ONE, Bit.ZERO, Bit.ZERO);\r
235         }\r
236 \r
237         @Test\r
238         void rsLatchCircuitTest()\r
239         {\r
240                 t.reset();\r
241                 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
242                                 nq = new Wire(t, 1, 1);\r
243 \r
244                 new OrGate(t, 1, t2.createReadWriteEnd(), r.createReadOnlyEnd(), nq.createReadOnlyEnd());\r
245                 new OrGate(t, 1, t1.createReadWriteEnd(), s.createReadOnlyEnd(), q.createReadOnlyEnd());\r
246                 new NotGate(t, 1, t2.createReadOnlyEnd(), q.createReadWriteEnd());\r
247                 new NotGate(t, 1, t1.createReadOnlyEnd(), nq.createReadWriteEnd());\r
248 \r
249                 ReadWriteEnd sIn = s.createReadWriteEnd(), rIn = r.createReadWriteEnd();\r
250 \r
251                 sIn.feedSignals(Bit.ONE);\r
252                 rIn.feedSignals(Bit.ZERO);\r
253 \r
254                 t.executeAll();\r
255 \r
256                 assertEquals(Bit.ONE, q.getValue());\r
257                 assertEquals(Bit.ZERO, nq.getValue());\r
258 \r
259                 sIn.feedSignals(Bit.ZERO);\r
260 \r
261                 t.executeAll();\r
262                 assertEquals(Bit.ONE, q.getValue());\r
263                 assertEquals(Bit.ZERO, nq.getValue());\r
264 \r
265                 rIn.feedSignals(Bit.ONE);\r
266 \r
267                 t.executeAll();\r
268 \r
269                 assertEquals(Bit.ZERO, q.getValue());\r
270                 assertEquals(Bit.ONE, nq.getValue());\r
271         }\r
272 \r
273         @Test\r
274         void numericValueTest()\r
275         {\r
276                 t.reset();\r
277 \r
278                 Wire a = new Wire(t, 4, 1);\r
279                 a.createReadWriteEnd().feedSignals(Bit.ONE, Bit.ONE, Bit.ONE, Bit.ONE);\r
280 \r
281                 t.executeAll();\r
282 \r
283                 assertEquals(15, a.getUnsignedValue());\r
284                 assertEquals(-1, a.getSignedValue());\r
285         }\r
286 \r
287         @Test\r
288         void multipleInputs()\r
289         {\r
290                 t.reset();\r
291                 Wire w = new Wire(t, 2, 1);\r
292                 ReadWriteEnd wI1 = w.createReadWriteEnd(), wI2 = w.createReadWriteEnd();\r
293                 wI1.feedSignals(Bit.ONE, Bit.Z);\r
294                 wI2.feedSignals(Bit.Z, Bit.X);\r
295                 t.executeAll();\r
296                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.X);\r
297 \r
298                 wI2.feedSignals(Bit.ZERO, Bit.Z);\r
299                 t.executeAll();\r
300                 assertBitArrayEquals(w.getValues(), Bit.X, Bit.Z);\r
301 \r
302                 wI2.feedSignals(Bit.Z, Bit.Z);\r
303                 t.executeAll();\r
304                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
305 \r
306                 wI2.feedSignals(Bit.ONE, Bit.Z);\r
307                 ReadEnd rE = w.createReadOnlyEnd();\r
308                 rE.addObserver((i, oldValues) -> fail("WireEnd notified observer, although value did not change."));\r
309                 t.executeAll();\r
310                 rE.close();\r
311                 wI1.feedSignals(Bit.X, Bit.X);\r
312                 t.executeAll();\r
313                 wI1.addObserver((i, oldValues) -> fail("WireEnd notified observer, although it was closed."));\r
314                 wI1.close();\r
315                 assertBitArrayEquals(w.getValues(), Bit.ONE, Bit.Z);\r
316         }\r
317 \r
318         @Test\r
319         void wireConnections()\r
320         {\r
321                 // Nur ein Experiment, was über mehrere 'passive' Bausteine hinweg passieren würde\r
322 \r
323                 t.reset();\r
324 \r
325                 Wire a = new Wire(t, 1, 2);\r
326                 Wire b = new Wire(t, 1, 2);\r
327                 Wire c = new Wire(t, 1, 2);\r
328                 ReadWriteEnd aI = a.createReadWriteEnd();\r
329                 ReadWriteEnd bI = b.createReadWriteEnd();\r
330                 ReadWriteEnd cI = c.createReadWriteEnd();\r
331 \r
332                 TestBitDisplay test = new TestBitDisplay(t, c.createReadOnlyEnd());\r
333                 TestBitDisplay test2 = new TestBitDisplay(t, a.createReadOnlyEnd());\r
334                 LongConsumer print = time -> System.out.format("Time %2d\n   a: %s\n   b: %s\n   c: %s\n", time, a, b, c);\r
335 \r
336                 cI.feedSignals(Bit.ONE);\r
337                 test.assertAfterSimulationIs(print, Bit.ONE);\r
338 \r
339                 cI.feedSignals(Bit.X);\r
340                 test.assertAfterSimulationIs(print, Bit.X);\r
341 \r
342                 cI.feedSignals(Bit.X);\r
343                 cI.feedSignals(Bit.Z);\r
344                 test.assertAfterSimulationIs(print, Bit.Z);\r
345 \r
346                 new Connector(t, b.createReadWriteEnd(), c.createReadWriteEnd()).connect();\r
347                 test.assertAfterSimulationIs(print, Bit.Z);\r
348                 System.err.println("ONE");\r
349                 bI.feedSignals(Bit.ONE);\r
350                 test.assertAfterSimulationIs(print, Bit.ONE);\r
351                 System.err.println("ZERO");\r
352                 bI.feedSignals(Bit.ZERO);\r
353                 test.assertAfterSimulationIs(print, Bit.ZERO);\r
354                 System.err.println("Z");\r
355                 bI.feedSignals(Bit.Z);\r
356                 test.assertAfterSimulationIs(print, Bit.Z);\r
357 \r
358                 new Connector(t, a.createReadWriteEnd(), b.createReadWriteEnd()).connect();\r
359                 System.err.println("Z 2");\r
360                 aI.feedSignals(Bit.Z);\r
361                 test.assertAfterSimulationIs(print, Bit.Z);\r
362                 test2.assertAfterSimulationIs(Bit.Z);\r
363                 System.err.println("ONE 2");\r
364                 aI.feedSignals(Bit.ONE);\r
365                 test.assertAfterSimulationIs(print, Bit.ONE);\r
366                 test2.assertAfterSimulationIs(Bit.ONE);\r
367                 System.err.println("ZERO 2");\r
368                 aI.feedSignals(Bit.ZERO);\r
369                 test.assertAfterSimulationIs(print, Bit.ZERO);\r
370                 test2.assertAfterSimulationIs(Bit.ZERO);\r
371                 System.err.println("Z 2 II");\r
372                 aI.feedSignals(Bit.Z);\r
373                 test.assertAfterSimulationIs(print, Bit.Z);\r
374                 test2.assertAfterSimulationIs(Bit.Z);\r
375 \r
376                 System.err.println("No Conflict yet");\r
377                 bI.feedSignals(Bit.ONE);\r
378                 test.assertAfterSimulationIs(print, Bit.ONE);\r
379                 test2.assertAfterSimulationIs(Bit.ONE);\r
380                 aI.feedSignals(Bit.ONE);\r
381                 test.assertAfterSimulationIs(print, Bit.ONE);\r
382                 test2.assertAfterSimulationIs(Bit.ONE);\r
383                 System.err.println("Conflict");\r
384                 aI.feedSignals(Bit.ZERO);\r
385                 test.assertAfterSimulationIs(print, Bit.X);\r
386                 test2.assertAfterSimulationIs(Bit.X);\r
387                 aI.feedSignals(Bit.ONE);\r
388                 test.assertAfterSimulationIs(print, Bit.ONE);\r
389                 test2.assertAfterSimulationIs(Bit.ONE);\r
390         }\r
391 \r
392         private static void assertBitArrayEquals(BitVector actual, Bit... expected)\r
393         {\r
394                 assertArrayEquals(expected, actual.getBits());\r
395         }\r
396 }\r