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