Fixed and added a lot of tests
[Mograsim.git] / net.mograsim.logic.ui.am2900 / test / net / mograsim / logic / ui / am2900 / TestableAm2901.java
1 package net.mograsim.logic.ui.am2900;
2
3 import static org.junit.jupiter.api.Assertions.assertEquals;
4
5 import java.util.Arrays;
6 import java.util.stream.Stream;
7
8 import org.junit.jupiter.api.extension.ExtensionContext;
9 import org.junit.jupiter.params.provider.Arguments;
10 import org.junit.jupiter.params.provider.ArgumentsProvider;
11
12 public interface TestableAm2901
13 {
14         void setup();
15
16         Result run();
17
18         void setDest(Am2901_Dest dest);
19
20         void setFunc(Am2901_Func func);
21
22         void setSrc(Am2901_Src src);
23
24         void setReg_A(String val_4_bit);
25
26         void setReg_B(String val_4_bit);
27
28         void setCarryIn(String val_1_bit);
29
30         void setNotOutEnable(String val_1_bit);
31
32         void setD(String val_4_bit);
33
34         void setQ_0(String val_1_bit);
35
36         void setQ_3(String val_1_bit);
37
38         void setRAM_0(String val_1_bit);
39
40         void setRAM_3(String val_1_bit);
41
42         void clockOn(boolean isClockOn);
43
44         void setDirectly(Register r, String val_4_bit);
45
46         String getQ_0();
47
48         String getQ_3();
49
50         String getRAM_0();
51
52         String getRAM_3();
53
54         String getNotP();
55
56         String getNotG();
57
58         String getCarryOut();
59
60         String getSign();
61
62         String getZero();
63
64         String getOverflow();
65
66         String getY();
67
68         String getDirectly(Register r);
69
70         default void assertRunSuccess()
71         {
72                 assertEquals(Result.SUCCESS, run());
73         }
74
75         default void assertFullCycleSuccess()
76         {
77                 assertRunSuccess();
78                 clockOn(false);
79                 assertRunSuccess();
80                 clockOn(true);
81                 assertRunSuccess();
82         }
83
84         public enum Result
85         {
86                 SUCCESS, OUT_OF_TIME, ERROR;
87         }
88
89         public enum Am2901_Dest
90         {
91                 QREG, NOP, RAMA, RAMF, RAMQD, RAMD, RAMQU, RAMU;
92
93                 public boolean doesShift()
94                 {
95                         return ordinal() >= 4;
96                 }
97
98                 public int getShiftDir()
99                 {
100                         return doesShift() ? (ordinal() < 6 ? -1 : 1) : 0;
101                 }
102
103                 public int getI7()
104                 {
105                         return this.ordinal() >> 1 & 1;
106                 }
107         }
108
109         public enum Am2901_Func
110         {
111                 ADD, SUBR, SUBS, OR, AND, NOTRS, EXOR, EXNOR;
112         }
113
114         public enum Am2901_Src
115         {
116                 AQ, AB, ZQ, ZB, ZA, DA, DQ, DZ;
117         }
118
119         public enum Register
120         {
121                 r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, rA, rB, rC, rD, rE, rF, Q;
122
123                 public String toBitString()
124                 {
125                         if (this.ordinal() > 0xF)
126                                 throw new UnsupportedOperationException();
127                         return TestUtil.to4bitBin(this.ordinal());
128                 }
129
130                 public static Stream<Register> stream()
131                 {
132                         return Arrays.stream(values());
133                 }
134         }
135
136         public static class RegisterProvider implements ArgumentsProvider
137         {
138
139                 @Override
140                 public Stream<? extends Arguments> provideArguments(ExtensionContext context) throws Exception
141                 {
142                         return Register.stream().map(Arguments::of);
143                 }
144
145         }
146 }