Merge branch 'development' of https://gitlab.lrz.de/lrr-tum/students/eragp-misim...
[Mograsim.git] / net.mograsim.logic.model.am2900 / src / net / mograsim / logic / model / am2900 / components / am2904 / GUIAm2904ShiftInstrDecode.java
1 package net.mograsim.logic.model.am2900.components.am2904;
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.Z;
7 import static net.mograsim.logic.core.types.Bit.ZERO;
8
9 import java.util.Map;
10
11 import net.mograsim.logic.core.types.Bit;
12 import net.mograsim.logic.core.wires.Wire.ReadEnd;
13 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
14 import net.mograsim.logic.model.model.ViewModelModifiable;
15 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent;
16 import net.mograsim.logic.model.model.wires.Pin;
17 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
18 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
19
20 public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComponent
21 {
22         public GUIAm2904ShiftInstrDecode(ViewModelModifiable model, String name)
23         {
24                 super(model, name, "Shift \ninstruction\ndecode");
25                 setSize(60, 80);
26                 addPin(new Pin(this, "I", 5, 0, 25), Usage.INPUT, Position.RIGHT);
27                 addPin(new Pin(this, "_SE", 1, 0, 55), Usage.INPUT, Position.RIGHT);
28                 // SIO0 MUX:
29                 // 000: 0
30                 // 001: 1
31                 // 01x: SIOn
32                 // 10x: QIOn
33                 // 11x: MC
34                 addPin(new Pin(this, "SIO0_MUX", 3, 60, 5), Usage.OUTPUT, Position.LEFT);
35                 // SIOn MUX:
36                 // 000: 0
37                 // 001: 1
38                 // 010: SIO0
39                 // 011: QIO0
40                 // 100: MC
41                 // 101: MN
42                 // 110: IC
43                 // 111: IN xor IVOR
44                 addPin(new Pin(this, "SIOn_MUX", 3, 60, 15), Usage.OUTPUT, Position.LEFT);
45                 // QIO0 MUX:
46                 // 000: 0
47                 // 001: 1
48                 // 01x: SIOn
49                 // 10x: QIOn
50                 // 11x: MC
51                 addPin(new Pin(this, "QIO0_MUX", 3, 60, 25), Usage.OUTPUT, Position.LEFT);
52                 // QIOn MUX:
53                 // 000: 0
54                 // 001: 1
55                 // 01x: SIO0
56                 // 10x: QIO0
57                 // 11x: MN
58                 addPin(new Pin(this, "QIOn_MUX", 3, 60, 35), Usage.OUTPUT, Position.LEFT);
59                 addPin(new Pin(this, "OEn", 1, 60, 45), Usage.OUTPUT, Position.LEFT);
60                 addPin(new Pin(this, "OE0", 1, 60, 55), Usage.OUTPUT, Position.LEFT);
61                 // 00: SIO0
62                 // 01: QIO0
63                 // 1x: SIOn
64                 addPin(new Pin(this, "MC_MUX", 2, 60, 65), Usage.OUTPUT, Position.LEFT);
65                 addPin(new Pin(this, "MC_EN", 1, 60, 75), Usage.OUTPUT, Position.LEFT);
66         }
67
68         @Override
69         protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
70         {
71                 Bit _SE = readEnds.get("_SE").getValue();
72                 Bit[] IBits = readEnds.get("I").getValues().getBits();
73                 readWriteEnds.get("OEn").feedSignals(IBits[0].not().and(_SE.not()));
74                 readWriteEnds.get("OE0").feedSignals(IBits[0].and(_SE.not()));
75                 if (_SE == Z || _SE == X)
76                 {
77                         readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
78                         readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
79                         readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
80                         readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
81                         readWriteEnds.get("MC_MUX").feedSignals(X, X);
82                         readWriteEnds.get("MC_EN").feedSignals(X);
83                         return null;
84                 } else if (_SE == U)
85                 {
86
87                         readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U);
88                         readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U);
89                         readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U);
90                         readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U);
91                         readWriteEnds.get("MC_MUX").feedSignals(U, U);
92                         readWriteEnds.get("MC_EN").feedSignals(U);
93                         return null;
94                 } else if (_SE == ONE)
95                 {
96                         readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
97                         readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
98                         readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
99                         readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
100                         readWriteEnds.get("MC_MUX").feedSignals(X, X);
101                         readWriteEnds.get("MC_EN").feedSignals(ZERO);
102                         return null;
103                 }
104                 // TODO move the following loop to BitVector.
105                 int IAsInt = 0;
106                 for (int i = 0; i < 5; i++)
107                         switch (IBits[4 - i])
108                         {
109                         case ONE:
110                                 IAsInt |= 1 << i;
111                                 break;
112                         case U:
113                                 readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U);
114                                 readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U);
115                                 readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U);
116                                 readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U);
117                                 readWriteEnds.get("MC_MUX").feedSignals(U, U);
118                                 readWriteEnds.get("MC_EN").feedSignals(U);
119                                 return null;
120                         case X:
121                         case Z:
122                                 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
123                                 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
124                                 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
125                                 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
126                                 readWriteEnds.get("MC_MUX").feedSignals(X, X);
127                                 readWriteEnds.get("MC_EN").feedSignals(X);
128                                 return null;
129                         case ZERO:
130                                 break;
131                         default:
132                                 throw new IllegalArgumentException("Unknown enum constant: " + IBits[i]);
133                         }
134                 if (IAsInt < 16)
135                 {
136                         readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
137                         readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
138                         switch (IAsInt)
139                         {
140                         case 0:
141                         case 2:
142                         case 6:
143                         case 7:
144                                 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
145                                 break;
146                         case 1:
147                         case 3:
148                                 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE);
149                                 break;
150                         case 4:
151                         case 9:
152                         case 12:
153                                 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO);
154                                 break;
155                         case 5:
156                                 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE);
157                                 break;
158                         case 8:
159                         case 10:
160                                 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO);
161                                 break;
162                         case 11:
163                                 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO);
164                                 break;
165                         case 13:
166                         case 15:
167                                 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE);
168                                 break;
169                         case 14:
170                                 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE);
171                                 break;
172                         default:
173                                 throw new IllegalStateException("can't happen");
174                         }
175                         switch (IAsInt)
176                         {
177                         case 0:
178                                 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
179                                 break;
180                         case 1:
181                                 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE);
182                                 break;
183                         case 2:
184                                 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X);
185                                 break;
186                         case 3:
187                         case 4:
188                         case 5:
189                         case 6:
190                         case 7:
191                         case 11:
192                         case 12:
193                         case 13:
194                         case 14:
195                         case 15:
196                                 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X);
197                                 break;
198                         case 8:
199                         case 9:
200                         case 10:
201                                 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X);
202                                 break;
203                         default:
204                                 throw new IllegalStateException("can't happen");
205                         }
206                 } else
207                 {
208                         readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
209                         readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
210                         switch (IAsInt)
211                         {
212                         case 16:
213                         case 18:
214                                 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
215                                 break;
216                         case 17:
217                         case 19:
218                                 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE);
219                                 break;
220                         case 20:
221                         case 21:
222                         case 22:
223                         case 23:
224                         case 28:
225                         case 29:
226                         case 30:
227                         case 31:
228                                 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
229                                 break;
230                         case 24:
231                         case 26:
232                                 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
233                                 break;
234                         case 25:
235                         case 27:
236                                 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X);
237                                 break;
238                         default:
239                                 throw new IllegalStateException("can't happen");
240                         }
241                         switch (IAsInt)
242                         {
243                         case 16:
244                         case 18:
245                         case 20:
246                         case 22:
247                         case 27:
248                                 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
249                                 break;
250                         case 17:
251                         case 19:
252                         case 21:
253                         case 23:
254                                 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE);
255                                 break;
256                         case 24:
257                         case 25:
258                         case 26:
259                                 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
260                                 break;
261                         case 28:
262                         case 30:
263                                 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
264                                 break;
265                         case 29:
266                         case 31:
267                                 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X);
268                                 break;
269                         default:
270                                 throw new IllegalStateException("can't happen");
271                         }
272                 }
273                 // MC
274                 switch (IAsInt)
275                 {
276                 case 0:
277                 case 1:
278                 case 3:
279                 case 4:
280                 case 5:
281                 case 6:
282                 case 10:
283                 case 11:
284                 case 14:
285                 case 15:
286                 case 18:
287                 case 19:
288                 case 22:
289                 case 23:
290                 case 26:
291                 case 27:
292                 case 30:
293                 case 31:
294                         readWriteEnds.get("MC_EN").feedSignals(ZERO);
295                         readWriteEnds.get("MC_MUX").feedSignals(X, X);
296                         break;
297                 case 2:
298                 case 8:
299                 case 9:
300                         readWriteEnds.get("MC_EN").feedSignals(ONE);
301                         readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO);
302                         break;
303                 case 7:
304                 case 12:
305                 case 13:
306                         readWriteEnds.get("MC_EN").feedSignals(ONE);
307                         readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE);
308                         break;
309                 case 16:
310                 case 17:
311                 case 20:
312                 case 21:
313                 case 24:
314                 case 25:
315                 case 28:
316                 case 29:
317                         readWriteEnds.get("MC_EN").feedSignals(ONE);
318                         readWriteEnds.get("MC_MUX").feedSignals(ONE, X);
319                         break;
320                 default:
321                         throw new IllegalStateException("can't happen");
322                 }
323                 return null;
324         }
325
326         static
327         {
328                 IndirectGUIComponentCreator.setComponentSupplier(GUIAm2904ShiftInstrDecode.class.getCanonicalName(),
329                                 (m, p, n) -> new GUIAm2904ShiftInstrDecode(m, n));
330         }
331 }