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