Added first test structures for Am2904 and Am2910
[Mograsim.git] / net.mograsim.logic.model.am2900 / test / net / mograsim / logic / model / am2900 / am2904 / TestableAm2904.java
1 package net.mograsim.logic.model.am2900.am2904;\r
2 \r
3 import java.util.Collections;\r
4 import java.util.HashMap;\r
5 import java.util.Map;\r
6 \r
7 import net.mograsim.logic.model.am2900.TestableCircuit;\r
8 \r
9 public interface TestableAm2904 extends TestableCircuit\r
10 {\r
11 \r
12         void setInstruction(Am2904_Inst inst);\r
13 \r
14         void setCarry(Am2904_Carry carry);\r
15 \r
16         void setShiftCode(String val_4_bit);\r
17 \r
18         void setI10(Am2904_ShiftDir dir);\r
19 \r
20         void setCX(String val_1_bit);\r
21 \r
22         void setY3(String val_1_bit);\r
23 \r
24         void setIZ(String val_1_bit);\r
25 \r
26         void setIC(String val_1_bit);\r
27 \r
28         void setIOVR(String val_1_bit);\r
29 \r
30         void setIN(String val_1_bit);\r
31 \r
32         default void setI(String z_c_ovr_n)\r
33         {\r
34                 setIZ(z_c_ovr_n.substring(0, 1));\r
35                 setIC(z_c_ovr_n.substring(1, 2));\r
36                 setIOVR(z_c_ovr_n.substring(2, 3));\r
37                 setIN(z_c_ovr_n.substring(3, 4));\r
38         }\r
39 \r
40         void set_CEM(String val_1_bit);\r
41 \r
42         void set_CEµ(String val_1_bit);\r
43 \r
44         void set_OEY(String val_1_bit);\r
45 \r
46         void set_OECT(String val_1_bit);\r
47 \r
48         void set_SE(String val_1_bit);\r
49 \r
50         void set_EZ(String val_1_bit);\r
51 \r
52         void set_EC(String val_1_bit);\r
53 \r
54         void set_EOVR(String val_1_bit);\r
55 \r
56         void set_EN(String val_1_bit);\r
57 \r
58         default void set_E(String z_c_ovr_n)\r
59         {\r
60                 set_EZ(z_c_ovr_n.substring(0, 1));\r
61                 set_EC(z_c_ovr_n.substring(1, 2));\r
62                 set_EOVR(z_c_ovr_n.substring(2, 3));\r
63                 set_EN(z_c_ovr_n.substring(3, 4));\r
64         }\r
65 \r
66         void setSIO0(String val_1_bit);\r
67 \r
68         void setSIO3(String val_1_bit);\r
69 \r
70         void setQIO0(String val_1_bit);\r
71 \r
72         void setQIO3(String val_1_bit);\r
73 \r
74         String getC0();\r
75 \r
76         String getCT();\r
77 \r
78         String getY3();\r
79 \r
80         String getSIO0();\r
81 \r
82         String getSIO3();\r
83 \r
84         String getQIO0();\r
85 \r
86         String getQIO3();\r
87 \r
88         public enum Am2904_ShiftDir\r
89         {\r
90                 RIGHT, LEFT;\r
91         }\r
92 \r
93         public enum Am2904_Carry\r
94         {\r
95                 CI0, CI1, CX, USE_SR;\r
96         }\r
97 \r
98         /**\r
99          * Pattern:<br>\r
100          * [microSR]_[machineSR]_[condCodeSource]_[condCode]<br>\r
101          * <ul>\r
102          * <li>Load = load from I inputs (Am2904s)</li>\r
103          * <li>condCodeSource = µ, M, I (and a special case: I and M)</li>\r
104          * <li>condCode = the boolean term defining the CT output</li>\r
105          * </ul>\r
106          */\r
107         public enum Am2904_Inst\r
108         {\r
109                 // @formatter:off\r
110                 LoadM_LoadY_µ_NxorOVRorZ(0_00),\r
111                 Set_Set_µ_NxnorOVRornotZ(0_01),\r
112                 Swap_Swap_µ_NxorOVR(0_02),\r
113                 Reset_Reset_µ_NxnorOVR(0_03),\r
114                 Load_LoadForShiftThroughOvr_µ_Z(0_04),\r
115                 Load_Invert_µ_notZ(0_05),\r
116                 LoadOvrRetain_Load_µ_OVR(0_06),\r
117                 LoadOvrRetain_Load_µ_notOVR(0_07),\r
118                 ResetZ_LoadCarryInvert_µ_CorZ(0_10),\r
119                 SetZ_LoadCarryInvert_µ_notCandnotZ(0_11),\r
120                 ResetC_Load_µ_C(0_12),\r
121                 SetC_Load_µ_notC(0_13),\r
122                 ResetN_Load_µ_notCorZ(0_14),\r
123                 SetN_Load_µ_CandnotZ(0_15),\r
124                 ResetOvr_Load_IM_NxorN(0_16),\r
125                 SetOvr_Load_IM_NxnorN(0_17),\r
126                 Load_Load_µ_NxorOVRorZ(0_20),\r
127                 Load_Load_µ_NxnorOVRornotZ(0_21),\r
128                 Load_Load_µ_NxorOVR(0_22),\r
129                 Load_Load_µ_NxnorOVR(0_23),\r
130                 Load_Load_µ_Z(0_24),\r
131                 Load_Load_µ_notZ(0_25),\r
132                 Load_Load_µ_OVR(0_26),\r
133                 Load_Load_µ_notOVR(0_27),\r
134                 LoadCarryInvert_LoadCarryInvert_µ_CorZ(0_30),\r
135                 LoadCarryInvert_LoadCarryInvert_µ_notCandnotZ(0_31),\r
136                 Load_Load_µ_C(0_32),\r
137                 Load_Load_µ_notC(0_33),\r
138                 Load_Load_µ_notCorZ(0_34),\r
139                 Load_Load_µ_CandnotZ(0_35),\r
140                 Load_Load_µ_N(0_36),\r
141                 Load_Load_µ_notN(0_37),\r
142                 Load_Load_M_NxorOVRorZ(0_40),\r
143                 Load_Load_M_NxnorOVRornotZ(0_41),\r
144                 Load_Load_M_NxorOVR(0_42),\r
145                 Load_Load_M_NxnorOVR(0_43),\r
146                 Load_Load_M_Z(0_44),\r
147                 Load_Load_M_notZ(0_45),\r
148                 Load_Load_M_OVR(0_46),\r
149                 Load_Load_M_notOVR(0_47),\r
150                 LoadCarryInvert_LoadCarryInvert_M_CorZ(0_50),\r
151                 LoadCarryInvert_LoadCarryInvert_M_notCandnotZ(0_51),\r
152                 Load_Load_M_C(0_52),\r
153                 Load_Load_M_notC(0_53),\r
154                 Load_Load_M_notCorZ(0_54),\r
155                 Load_Load_M_CandnotZ(0_55),\r
156                 Load_Load_M_N(0_56),\r
157                 Load_Load_M_notN(0_57),\r
158                 Load_Load_I_NxorOVRorZ(0_60),\r
159                 Load_Load_I_NxnorOVRornotZ(0_61),\r
160                 Load_Load_I_NxorOVR(0_62),\r
161                 Load_Load_I_NxnorOVR(0_63),\r
162                 Load_Load_I_Z(0_64),\r
163                 Load_Load_I_notZ(0_65),\r
164                 Load_Load_I_OVR(0_66),\r
165                 Load_Load_I_notOVR(0_67),\r
166                 LoadCarryInvert_LoadCarryInvert_I_notCorZ(0_70),\r
167                 LoadCarryInvert_LoadCarryInvert_I_CandnotZ(0_71),\r
168                 Load_Load_I_C(0_72),\r
169                 Load_Load_I_notC(0_73),\r
170                 Load_Load_I_notCorZ(0_74),\r
171                 Load_Load_I_CandnotZ(0_75),\r
172                 Load_Load_I_N(0_76),\r
173                 Load_Load_I_notN(0_77);\r
174                 // @formatter:on\r
175 \r
176                 public final int code;\r
177 \r
178                 private Am2904_Inst(int code)\r
179                 {\r
180                         this.code = code;\r
181                 }\r
182 \r
183                 private static final Map<Integer, Am2904_Inst> instCodes;\r
184 \r
185                 static\r
186                 {\r
187                         Map<Integer, Am2904_Inst> instCodesMod = new HashMap<>();\r
188                         Am2904_Inst[] vals = values();\r
189                         for (Am2904_Inst inst : vals)\r
190                         {\r
191                                 assert inst.code == inst.ordinal();\r
192                                 instCodesMod.put(inst.code, inst);\r
193                         }\r
194                         if (instCodesMod.size() != 64)\r
195                                 throw new IllegalStateException("There must be exactly 64 Am2904 instruction codes, but was " + instCodesMod.size());\r
196                         instCodes = Collections.unmodifiableMap(instCodesMod);\r
197                 }\r
198 \r
199                 public static Am2904_Inst getInstFor(int I_543210)\r
200                 {\r
201                         Am2904_Inst inst = instCodes.get(I_543210);\r
202                         if (inst != null)\r
203                                 return inst;\r
204                         throw new IllegalArgumentException("Invaild Am2904 instruction code: " + I_543210);\r
205                 }\r
206 \r
207                 public int getBlock()\r
208                 {\r
209                         return code >> 4;\r
210                 }\r
211 \r
212                 public boolean isLoadCarryInvert()\r
213                 {\r
214                         return (code & 0b001_110) == 0b001_000;\r
215                 }\r
216         }\r
217 }\r