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.types.BitVector;
13 import net.mograsim.logic.core.wires.Wire.ReadEnd;
14 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
15 import net.mograsim.logic.model.model.ViewModelModifiable;
16 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent;
17 import net.mograsim.logic.model.model.wires.Pin;
18 import net.mograsim.logic.model.model.wires.PinUsage;
19 import net.mograsim.logic.model.serializing.IndirectGUIComponentCreator;
20 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
22 public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComponent
24 public GUIAm2904ShiftInstrDecode(ViewModelModifiable model, String name)
26 super(model, "GUIAm2904ShiftInstrDecode", name, "Shift \ninstruction\ndecode");
28 addPin(new Pin(this, "I", 5, PinUsage.INPUT, 0, 25), Position.RIGHT);
29 addPin(new Pin(this, "_SE", 1, PinUsage.INPUT, 0, 55), Position.RIGHT);
36 addPin(new Pin(this, "SIO0_MUX", 3, PinUsage.OUTPUT, 60, 5), Position.LEFT);
46 addPin(new Pin(this, "SIOn_MUX", 3, PinUsage.OUTPUT, 60, 15), Position.LEFT);
53 addPin(new Pin(this, "QIO0_MUX", 3, PinUsage.OUTPUT, 60, 25), Position.LEFT);
60 addPin(new Pin(this, "QIOn_MUX", 3, PinUsage.OUTPUT, 60, 35), Position.LEFT);
61 addPin(new Pin(this, "OEn", 1, PinUsage.OUTPUT, 60, 45), Position.LEFT);
62 addPin(new Pin(this, "OE0", 1, PinUsage.OUTPUT, 60, 55), Position.LEFT);
66 addPin(new Pin(this, "MC_MUX", 2, PinUsage.OUTPUT, 60, 65), Position.LEFT);
67 addPin(new Pin(this, "MC_EN", 1, PinUsage.OUTPUT, 60, 75), Position.LEFT);
71 public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
73 Bit _SE = readEnds.get("_SE").getValue();
74 BitVector I = readEnds.get("I").getValues();
75 readWriteEnds.get("OEn").feedSignals(I.getMSBit(0).not().and(_SE.not()));
76 readWriteEnds.get("OE0").feedSignals(I.getMSBit(0).and(_SE.not()));
77 if (_SE == Z || _SE == X)
79 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
80 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
81 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
82 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
83 readWriteEnds.get("MC_MUX").feedSignals(X, X);
84 readWriteEnds.get("MC_EN").feedSignals(X);
89 readWriteEnds.get("SIO0_MUX").feedSignals(U, U, U);
90 readWriteEnds.get("SIOn_MUX").feedSignals(U, U, U);
91 readWriteEnds.get("QIO0_MUX").feedSignals(U, U, U);
92 readWriteEnds.get("QIOn_MUX").feedSignals(U, U, U);
93 readWriteEnds.get("MC_MUX").feedSignals(U, U);
94 readWriteEnds.get("MC_EN").feedSignals(U);
96 } else if (_SE == ONE)
98 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
99 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
100 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
101 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
102 readWriteEnds.get("MC_MUX").feedSignals(X, X);
103 readWriteEnds.get("MC_EN").feedSignals(ZERO);
109 for (Bit b : I.getBits())
115 readWriteEnds.get("SIO0_MUX").feedSignals(val, val, val);
116 readWriteEnds.get("SIOn_MUX").feedSignals(val, val, val);
117 readWriteEnds.get("QIO0_MUX").feedSignals(val, val, val);
118 readWriteEnds.get("QIOn_MUX").feedSignals(val, val, val);
119 readWriteEnds.get("MC_MUX").feedSignals(val, val);
120 readWriteEnds.get("MC_EN").feedSignals(val);
123 int IAsInt = I.getUnsignedValue().intValue();
126 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
127 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
134 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
138 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE);
143 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO);
146 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE);
150 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO);
153 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO);
157 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE);
160 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE);
163 throw new IllegalStateException("can't happen");
168 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
171 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE);
174 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X);
186 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X);
191 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X);
194 throw new IllegalStateException("can't happen");
198 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
199 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
204 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
208 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE);
218 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
222 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
226 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X);
229 throw new IllegalStateException("can't happen");
238 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
244 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE);
249 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
253 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
257 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X);
260 throw new IllegalStateException("can't happen");
284 readWriteEnds.get("MC_EN").feedSignals(ZERO);
285 readWriteEnds.get("MC_MUX").feedSignals(X, X);
290 readWriteEnds.get("MC_EN").feedSignals(ONE);
291 readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO);
296 readWriteEnds.get("MC_EN").feedSignals(ONE);
297 readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE);
307 readWriteEnds.get("MC_EN").feedSignals(ONE);
308 readWriteEnds.get("MC_MUX").feedSignals(ONE, X);
311 throw new IllegalStateException("can't happen");
318 IndirectGUIComponentCreator.setComponentSupplier(GUIAm2904ShiftInstrDecode.class.getCanonicalName(),
319 (m, p, n) -> new GUIAm2904ShiftInstrDecode(m, n));