Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model.am2900 / test / net / mograsim / logic / model / am2900 / am2904 / TestableAm2904Impl.java
1 package net.mograsim.logic.model.am2900.am2904;
2
3 import net.mograsim.logic.core.components.CoreBitDisplay;
4 import net.mograsim.logic.core.components.CoreManualSwitch;
5 import net.mograsim.logic.core.types.Bit;
6 import net.mograsim.logic.core.types.BitVector;
7 import net.mograsim.logic.model.am2900.util.SwitchWithDisplay;
8 import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper;
9 import net.mograsim.logic.model.am2900.util.TestEnvironmentHelper.DebugState;
10 import net.mograsim.logic.model.model.components.ModelComponent;
11
12 public class TestableAm2904Impl implements TestableAm2904
13 {
14
15         private ModelComponent am2904;
16         private CoreManualSwitch I_5_0;
17         private CoreManualSwitch I_6_9;
18         private CoreManualSwitch I_10;
19         private CoreManualSwitch I_11_12;
20         private CoreManualSwitch C;
21         private CoreManualSwitch Cx;
22         private CoreManualSwitch IC, IN, IOVR, IZ;
23         private CoreManualSwitch _CEM, _CEmu;
24         private CoreManualSwitch _EC, _EN, _EOVR, _EZ;
25         private CoreManualSwitch _OECT, _OEY;
26         private CoreManualSwitch _SE;
27         private CoreBitDisplay C0;
28         private CoreBitDisplay CT;
29         private SwitchWithDisplay SIO0, SIOn, QIO0, QIOn;
30         private SwitchWithDisplay YC, YN, YOVR, YZ;
31
32         private final TestEnvironmentHelper testHelper = new TestEnvironmentHelper(this,
33                         "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/am2904/TestableAm2904.json");
34
35         @Override
36         public void setup()
37         {
38                 testHelper.setup(DebugState.NO_DEBUG);
39         }
40
41         @Override
42         public Result run()
43         {
44                 return testHelper.run();
45         }
46
47         @Override
48         public void clockOn(boolean isClockOn)
49         {
50                 if (isClockOn)
51                         C.switchFullOn();
52                 else
53                         C.switchFullOff();
54         }
55
56         @Override
57         public void setInstruction(Am2904_Inst inst)
58         {
59                 I_5_0.setState(BitVector.from(inst.ordinal(), 6));
60         }
61
62         @Override
63         public void setShiftCode(String val_4_bit)
64         {
65                 I_6_9.setState(BitVector.parse(val_4_bit));
66         }
67
68         @Override
69         public void setI10(Am2904_ShiftDir dir)
70         {
71                 I_10.setState(BitVector.from(dir.ordinal(), 1));
72         }
73
74         @Override
75         public void setCarry(Am2904_Carry carry)
76         {
77                 I_11_12.setState(BitVector.from(carry.ordinal(), 2));
78         }
79
80         @Override
81         public void setCX(String val_1_bit)
82         {
83                 Cx.setState(BitVector.parse(val_1_bit));
84         }
85
86         @Override
87         public void setY(String z_c_n_ovr)
88         {
89                 var bv = BitVector.parse(z_c_n_ovr);
90                 // correct order apparently unknown, most likely Z-C-N-OVR
91                 YZ.setState(bv.getLSBit(3).toVector());
92                 YC.setState(bv.getLSBit(2).toVector());
93                 YN.setState(bv.getLSBit(1).toVector());
94                 YOVR.setState(bv.getLSBit(0).toVector());
95         }
96
97         @Override
98         public void setIZ(String val_1_bit)
99         {
100                 IZ.setState(BitVector.parse(val_1_bit));
101         }
102
103         @Override
104         public void setIC(String val_1_bit)
105         {
106                 IC.setState(BitVector.parse(val_1_bit));
107         }
108
109         @Override
110         public void setIOVR(String val_1_bit)
111         {
112                 IOVR.setState(BitVector.parse(val_1_bit));
113         }
114
115         @Override
116         public void setIN(String val_1_bit)
117         {
118                 IN.setState(BitVector.parse(val_1_bit));
119         }
120
121         @Override
122         public void set_CEM(String val_1_bit)
123         {
124                 _CEM.setState(BitVector.parse(val_1_bit));
125         }
126
127         @Override
128         public void set_CEĀµ(String val_1_bit)
129         {
130                 _CEmu.setState(BitVector.parse(val_1_bit));
131         }
132
133         @Override
134         public void set_OEY(String val_1_bit)
135         {
136                 _OEY.setState(BitVector.parse(val_1_bit));
137         }
138
139         @Override
140         public void set_OECT(String val_1_bit)
141         {
142                 _OECT.setState(BitVector.parse(val_1_bit));
143         }
144
145         @Override
146         public void set_SE(String val_1_bit)
147         {
148                 _SE.setState(BitVector.parse(val_1_bit));
149         }
150
151         @Override
152         public void set_EZ(String val_1_bit)
153         {
154                 _EZ.setState(BitVector.parse(val_1_bit));
155         }
156
157         @Override
158         public void set_EC(String val_1_bit)
159         {
160                 _EC.setState(BitVector.parse(val_1_bit));
161         }
162
163         @Override
164         public void set_EOVR(String val_1_bit)
165         {
166                 _EOVR.setState(BitVector.parse(val_1_bit));
167         }
168
169         @Override
170         public void set_EN(String val_1_bit)
171         {
172                 _EN.setState(BitVector.parse(val_1_bit));
173         }
174
175         @Override
176         public void setSIO0(String val_1_bit)
177         {
178                 SIO0.setState(BitVector.parse(val_1_bit));
179         }
180
181         @Override
182         public void setSIO3(String val_1_bit)
183         {
184                 SIOn.setState(BitVector.parse(val_1_bit));
185         }
186
187         @Override
188         public void setQIO0(String val_1_bit)
189         {
190                 QIO0.setState(BitVector.parse(val_1_bit));
191         }
192
193         @Override
194         public void setQIO3(String val_1_bit)
195         {
196                 QIOn.setState(BitVector.parse(val_1_bit));
197         }
198
199         @Override
200         public void setDirectly(Register r, String val_1_bit)
201         {
202                 var bv = (BitVector) am2904.getHighLevelState(regToStateID(r));
203                 bv = bv.withBitChanged(r.ordinal() % 4, b -> Bit.parse(val_1_bit));
204                 am2904.setHighLevelState(regToStateID(r), bv);
205         }
206
207         @Override
208         public void setDirectly(CompleteStatus r, String z_c_n_ovr)
209         {
210                 am2904.setHighLevelState(regToStateID(r), BitVector.parse(z_c_n_ovr));
211         }
212
213         @Override
214         public String getC0()
215         {
216                 return C0.getDisplayedValue().toString();
217         }
218
219         @Override
220         public String getCT()
221         {
222                 return CT.getDisplayedValue().toString();
223         }
224
225         @Override
226         public String getY()
227         {
228                 // correct order apparently unknown, most likely Z-C-N-OVR
229                 var y3 = YZ.getDisplayedValue();
230                 var y2 = YC.getDisplayedValue();
231                 var y1 = YN.getDisplayedValue();
232                 var y0 = YOVR.getDisplayedValue();
233                 return y3.concat(y2).concat(y1).concat(y0).toString();
234         }
235
236         @Override
237         public String getSIO0()
238         {
239                 return SIO0.getDisplayedValue().toString();
240         }
241
242         @Override
243         public String getSIO3()
244         {
245                 return SIOn.getDisplayedValue().toString();
246         }
247
248         @Override
249         public String getQIO0()
250         {
251                 return QIO0.getDisplayedValue().toString();
252         }
253
254         @Override
255         public String getQIO3()
256         {
257                 return QIOn.getDisplayedValue().toString();
258         }
259
260         @Override
261         public String getDirectly(Register r)
262         {
263                 var bv = (BitVector) am2904.getHighLevelState(regToStateID(r));
264                 return bv.getMSBit(r.ordinal() % 4).getSymbol();
265         }
266
267         @Override
268         public String getDirectly(CompleteStatus r)
269         {
270                 var bv = (BitVector) am2904.getHighLevelState(regToStateID(r));
271                 return bv.toString();
272         }
273
274         private static String regToStateID(Register r)
275         {
276                 if (r.ordinal() < 4)
277                         return "musr.q";
278                 return "msr.q";
279         }
280
281         private static String regToStateID(CompleteStatus r)
282         {
283                 if (r == CompleteStatus.micro)
284                         return "musr.q";
285                 return "msr.q";
286         }
287
288         @Override
289         public TestEnvironmentHelper getTestEnvironmentHelper()
290         {
291                 return testHelper;
292         }
293 }