1 package net.mograsim.logic.model.am2900.components.am2904;
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;
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.model.wires.PinUsage;
18 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
19 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
21 public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComponent
23 public GUIAm2904ShiftInstrDecode(ViewModelModifiable model, String name)
25 super(model, name, "Shift \ninstruction\ndecode");
27 addPin(new Pin(this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT);
28 addPin(new Pin(this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT);
35 addPin(new Pin(this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT);
45 addPin(new Pin(this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT);
52 addPin(new Pin(this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT);
59 addPin(new Pin(this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT);
60 addPin(new Pin(this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT);
61 addPin(new Pin(this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT);
65 addPin(new Pin(this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT);
66 addPin(new Pin(this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT);
70 public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
72 Bit _SE = readEnds.get("_SE").getValue();
73 Bit[] IBits = readEnds.get("I").getValues().getBits();
74 readWriteEnds.get("OEn").feedSignals(IBits[0].not().and(_SE.not()));
75 readWriteEnds.get("OE0").feedSignals(IBits[0].and(_SE.not()));
76 if (_SE == Z || _SE == X)
78 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
79 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
80 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
81 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
82 readWriteEnds.get("MC_MUX").feedSignals(X, X);
83 readWriteEnds.get("MC_EN").feedSignals(X);
88 readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U);
89 readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U);
90 readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U);
91 readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U);
92 readWriteEnds.get("MC_MUX").feedSignals(U, U);
93 readWriteEnds.get("MC_EN").feedSignals(U);
95 } else if (_SE == ONE)
97 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
98 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
99 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
100 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
101 readWriteEnds.get("MC_MUX").feedSignals(X, X);
102 readWriteEnds.get("MC_EN").feedSignals(ZERO);
105 // TODO move the following loop to BitVector.
107 for (int i = 0; i < 5; i++)
108 switch (IBits[4 - i])
114 readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U);
115 readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U);
116 readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U);
117 readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U);
118 readWriteEnds.get("MC_MUX").feedSignals(U, U);
119 readWriteEnds.get("MC_EN").feedSignals(U);
123 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
124 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
125 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
126 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
127 readWriteEnds.get("MC_MUX").feedSignals(X, X);
128 readWriteEnds.get("MC_EN").feedSignals(X);
133 throw new IllegalArgumentException("Unknown enum constant: " + IBits[i]);
137 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
138 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
145 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
149 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE);
154 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO);
157 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE);
161 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO);
164 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO);
168 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE);
171 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE);
174 throw new IllegalStateException("can't happen");
179 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
182 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE);
185 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X);
197 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X);
202 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X);
205 throw new IllegalStateException("can't happen");
209 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
210 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
215 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
219 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE);
229 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
233 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
237 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X);
240 throw new IllegalStateException("can't happen");
249 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
255 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE);
260 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
264 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
268 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X);
271 throw new IllegalStateException("can't happen");
295 readWriteEnds.get("MC_EN").feedSignals(ZERO);
296 readWriteEnds.get("MC_MUX").feedSignals(X, X);
301 readWriteEnds.get("MC_EN").feedSignals(ONE);
302 readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO);
307 readWriteEnds.get("MC_EN").feedSignals(ONE);
308 readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE);
318 readWriteEnds.get("MC_EN").feedSignals(ONE);
319 readWriteEnds.get("MC_MUX").feedSignals(ONE, X);
322 throw new IllegalStateException("can't happen");
329 IndirectGUIComponentCreator.setComponentSupplier(GUIAm2904ShiftInstrDecode.class.getCanonicalName(),
330 (m, p, n) -> new GUIAm2904ShiftInstrDecode(m, n));