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