6e42d2e8af08130290be939ee7288dcab1b11ee6
[Mograsim.git] / net.mograsim.logic.model.am2900 / src / net / mograsim / logic / model / am2900 / components / am2910 / GUIAm2910InstrPLA.java
1 package net.mograsim.logic.model.am2900.components.am2910;
2
3 import static net.mograsim.logic.core.types.Bit.ONE;
4 import static net.mograsim.logic.core.types.Bit.U;
5 import static net.mograsim.logic.core.types.Bit.X;
6 import static net.mograsim.logic.core.types.Bit.ZERO;
7
8 import java.util.Map;
9
10 import net.mograsim.logic.core.types.Bit;
11 import net.mograsim.logic.core.wires.Wire.ReadEnd;
12 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
13 import net.mograsim.logic.model.model.ViewModelModifiable;
14 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent;
15 import net.mograsim.logic.model.model.wires.Pin;
16 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
17 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
18
19 public class GUIAm2910InstrPLA extends SimpleRectangularHardcodedGUIComponent
20 {
21         public GUIAm2910InstrPLA(ViewModelModifiable model, String name)
22         {
23                 super(model, name, "Instr.\nPLA");
24                 setSize(30, 85);
25                 addPin(new Pin(this, "PASS", 1, 0, 5), Usage.INPUT, Position.RIGHT);
26                 addPin(new Pin(this, "I", 4, 0, 20), Usage.INPUT, Position.RIGHT);
27                 addPin(new Pin(this, "R=0", 1, 15, 0), Usage.INPUT, Position.BOTTOM);
28                 addPin(new Pin(this, "_PL", 1, 5, 85), Usage.OUTPUT, Position.TOP);
29                 addPin(new Pin(this, "_MAP", 1, 15, 85), Usage.OUTPUT, Position.TOP);
30                 addPin(new Pin(this, "_VECT", 1, 25, 85), Usage.OUTPUT, Position.TOP);
31                 addPin(new Pin(this, "RWE", 1, 30, 5), Usage.OUTPUT, Position.LEFT);
32                 addPin(new Pin(this, "RDEC", 1, 30, 15), Usage.OUTPUT, Position.LEFT);
33                 addPin(new Pin(this, "YD", 1, 30, 25), Usage.OUTPUT, Position.LEFT);
34                 addPin(new Pin(this, "YR", 1, 30, 35), Usage.OUTPUT, Position.LEFT);
35                 addPin(new Pin(this, "YF", 1, 30, 45), Usage.OUTPUT, Position.LEFT);
36                 addPin(new Pin(this, "YmuPC", 1, 30, 55), Usage.OUTPUT, Position.LEFT);
37                 addPin(new Pin(this, "STKI0", 1, 30, 65), Usage.OUTPUT, Position.LEFT);
38                 addPin(new Pin(this, "STKI1", 1, 30, 75), Usage.OUTPUT, Position.LEFT);
39         }
40
41         @Override
42         protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
43         {
44                 ReadEnd PASS = readEnds.get("PASS");
45                 ReadEnd I = readEnds.get("I");
46                 ReadEnd Req0 = readEnds.get("R=0");
47                 ReadWriteEnd _PL = readWriteEnds.get("_PL");
48                 ReadWriteEnd _MAP = readWriteEnds.get("_MAP");
49                 ReadWriteEnd _VECT = readWriteEnds.get("_VECT");
50                 ReadWriteEnd RWE = readWriteEnds.get("RWE");
51                 ReadWriteEnd RDEC = readWriteEnds.get("RDEC");
52                 ReadWriteEnd YD = readWriteEnds.get("YD");
53                 ReadWriteEnd YR = readWriteEnds.get("YR");
54                 ReadWriteEnd YF = readWriteEnds.get("YF");
55                 ReadWriteEnd YmuPC = readWriteEnds.get("YmuPC");
56                 ReadWriteEnd STKI0 = readWriteEnds.get("STKI0");
57                 ReadWriteEnd STKI1 = readWriteEnds.get("STKI1");
58
59                 Bit PASSVal = PASS.getValue();
60                 Bit I3Val = I.getValue(3);
61                 Bit I2Val = I.getValue(2);
62                 Bit I1Val = I.getValue(1);
63                 Bit I0Val = I.getValue(0);
64                 Bit Req0Val = Req0.getValue();
65
66                 if (!I3Val.isBinary() || !I2Val.isBinary() || !I1Val.isBinary() || !I0Val.isBinary())
67                         if ((I3Val == U || I3Val.isBinary()) || (I2Val == U || I2Val.isBinary()) || (I1Val == U || I1Val.isBinary())
68                                         || (I0Val == U || I0Val.isBinary()))
69                         {
70                                 _PL.feedSignals(U);
71                                 _MAP.feedSignals(U);
72                                 _VECT.feedSignals(U);
73                                 RWE.feedSignals(U);
74                                 RDEC.feedSignals(U);
75                                 YD.feedSignals(U);
76                                 YR.feedSignals(U);
77                                 YF.feedSignals(U);
78                                 YmuPC.feedSignals(U);
79                                 STKI0.feedSignals(U);
80                                 STKI1.feedSignals(U);
81                         } else
82                         {
83                                 _PL.feedSignals(X);
84                                 _MAP.feedSignals(X);
85                                 _VECT.feedSignals(X);
86                                 RWE.feedSignals(X);
87                                 RDEC.feedSignals(X);
88                                 YD.feedSignals(X);
89                                 YR.feedSignals(X);
90                                 YF.feedSignals(X);
91                                 YmuPC.feedSignals(X);
92                                 STKI0.feedSignals(X);
93                                 STKI1.feedSignals(X);
94                         }
95                 else
96                 {
97                         int IAsInt = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0);
98                         Bit _PLVal = ONE;
99                         Bit _MAPVal = ONE;
100                         Bit _VECTVal = ONE;
101                         if (IAsInt == 2)
102                                 _MAPVal = ZERO;
103                         else if (IAsInt == 6)
104                                 _VECTVal = ZERO;
105                         else
106                                 _PLVal = ZERO;
107                         _PL.feedSignals(_PLVal);
108                         _MAP.feedSignals(_MAPVal);
109                         _VECT.feedSignals(_VECTVal);
110                         if (IAsInt == 8 || IAsInt == 9 || IAsInt == 15)
111                         {
112                                 RWE.feedSignals(Req0Val);
113                                 RDEC.feedSignals(Req0Val);// "forward" X/U/Z
114                         } else if (IAsInt == 4)
115                         {
116                                 RWE.feedSignals(PASSVal);
117                                 RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z
118                         } else
119                         {
120                                 RWE.feedSignals(ZERO);
121                                 RDEC.feedSignals(ZERO);
122                         }
123                         if (!PASSVal.isBinary())
124                         {
125                                 YD.feedSignals(PASSVal);// "forward" X/U/Z
126                                 YR.feedSignals(PASSVal);// "forward" X/U/Z
127                                 YF.feedSignals(PASSVal);// "forward" X/U/Z
128                                 YmuPC.feedSignals(PASSVal);// "forward" X/U/Z
129                         } else
130                         {
131                                 Bit YDVal = ZERO;
132                                 Bit YRVal = ZERO;
133                                 Bit YFVal = ZERO;
134                                 Bit YmuPCVal = ZERO;
135                                 switch (IAsInt + (PASSVal == ONE ? 16 : 0))
136                                 {
137                                 case 0:
138                                 case 0 + 16:
139                                         break;
140                                 case 2:
141                                 case 1 + 16:
142                                 case 2 + 16:
143                                 case 3 + 16:
144                                 case 5 + 16:
145                                 case 6 + 16:
146                                 case 7 + 16:
147                                 case 11 + 16:
148                                         YDVal = ONE;
149                                         break;
150                                 case 5:
151                                 case 7:
152                                         YRVal = ONE;
153                                         break;
154                                 case 13:
155                                 case 10 + 16:
156                                         YFVal = ONE;
157                                         break;
158                                 case 1:
159                                 case 3:
160                                 case 4:
161                                 case 6:
162                                 case 10:
163                                 case 11:
164                                 case 12:
165                                 case 14:
166                                 case 4 + 16:
167                                 case 12 + 16:
168                                 case 13 + 16:
169                                 case 14 + 16:
170                                 case 15 + 16:
171                                         YmuPCVal = ONE;
172                                         break;
173                                 case 8:
174                                 case 8 + 16:
175                                         YFVal = Req0Val.not();// "forward" X/U/Z
176                                         YmuPCVal = Req0Val;// "forward" X/U/Z
177                                         break;
178                                 case 9:
179                                 case 9 + 16:
180                                         YDVal = Req0Val.not();// "forward" X/U/Z
181                                         YmuPCVal = Req0Val;// "forward" X/U/Z
182                                         break;
183                                 case 15:
184                                         YFVal = Req0Val.not();// "forward" X/U/Z
185                                         YDVal = Req0Val;// "forward" X/U/Z
186                                         break;
187                                 default:
188                                         throw new IllegalStateException("shouldn't happen");
189                                 }
190                                 YD.feedSignals(YDVal);
191                                 YR.feedSignals(YRVal);
192                                 YF.feedSignals(YFVal);
193                                 YmuPC.feedSignals(YmuPCVal);
194                                 Bit STKI0Val;
195                                 Bit STKI1Val;
196                                 switch (IAsInt + (PASSVal == ONE ? 16 : 0))
197                                 {
198                                 case 1:
199                                 case 2:
200                                 case 3:
201                                 case 6:
202                                 case 7:
203                                 case 9:
204                                 case 10:
205                                 case 11:
206                                 case 12:
207                                 case 13:
208                                 case 14:
209                                 case 2 + 16:
210                                 case 3 + 16:
211                                 case 6 + 16:
212                                 case 7 + 16:
213                                 case 9 + 16:
214                                 case 12 + 16:
215                                 case 14 + 16:
216                                         // HOLD
217                                         STKI1Val = ZERO;
218                                         STKI0Val = ZERO;
219                                         break;
220                                 case 4:
221                                 case 5:
222                                 case 1 + 16:
223                                 case 4 + 16:
224                                 case 5 + 16:
225                                         // PUSH
226                                         STKI1Val = ZERO;
227                                         STKI0Val = ONE;
228                                         break;
229                                 case 0:
230                                 case 0 + 16:
231                                         // CLEAR
232                                         STKI1Val = ONE;
233                                         STKI0Val = ZERO;
234                                         break;
235                                 case 10 + 16:
236                                 case 11 + 16:
237                                 case 13 + 16:
238                                 case 15 + 16:
239                                         // POP
240                                         STKI1Val = ONE;
241                                         STKI0Val = ONE;
242                                         break;
243                                 case 8:
244                                 case 15:
245                                 case 8 + 16:
246                                         STKI1Val = Req0Val;// "forward" X/U/Z
247                                         STKI0Val = Req0Val;// "forward" X/U/Z
248                                         break;
249                                 default:
250                                         throw new IllegalStateException("shouldn't happen");
251                                 }
252                                 STKI0.feedSignals(STKI0Val);
253                                 STKI1.feedSignals(STKI1Val);
254                         }
255                 }
256                 return null;
257         }
258
259         static
260         {
261                 IndirectGUIComponentCreator.setComponentSupplier(GUIAm2910InstrPLA.class.getCanonicalName(),
262                                 (m, p, n) -> new GUIAm2910InstrPLA(m, n));
263         }
264 }