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.serializing.IndirectGUIComponentCreator;
18 import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position;
20 public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComponent
22 public GUIAm2904ShiftInstrDecode(ViewModelModifiable model, String name)
24 super(model, name, "Shift \ninstruction\ndecode");
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);
34 addPin(new Pin(this, "SIO0_MUX", 3, 60, 5), Usage.OUTPUT, Position.LEFT);
44 addPin(new Pin(this, "SIOn_MUX", 3, 60, 15), Usage.OUTPUT, Position.LEFT);
51 addPin(new Pin(this, "QIO0_MUX", 3, 60, 25), Usage.OUTPUT, Position.LEFT);
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);
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);
69 protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
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)
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);
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);
94 } else if (_SE == ONE)
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);
104 // TODO move the following loop to BitVector.
106 for (int i = 0; i < 5; i++)
107 switch (IBits[4 - i])
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);
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);
132 throw new IllegalArgumentException("Unknown enum constant: " + IBits[i]);
136 readWriteEnds.get("SIO0_MUX").feedSignals(X, X, X);
137 readWriteEnds.get("QIO0_MUX").feedSignals(X, X, X);
144 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
148 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ZERO, ONE);
153 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ZERO);
156 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ZERO, ONE);
160 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ZERO);
163 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ZERO);
167 readWriteEnds.get("SIOn_MUX").feedSignals(ZERO, ONE, ONE);
170 readWriteEnds.get("SIOn_MUX").feedSignals(ONE, ONE, ONE);
173 throw new IllegalStateException("can't happen");
178 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ZERO);
181 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ZERO, ONE);
184 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ONE, X);
196 readWriteEnds.get("QIOn_MUX").feedSignals(ZERO, ONE, X);
201 readWriteEnds.get("QIOn_MUX").feedSignals(ONE, ZERO, X);
204 throw new IllegalStateException("can't happen");
208 readWriteEnds.get("SIOn_MUX").feedSignals(X, X, X);
209 readWriteEnds.get("QIOn_MUX").feedSignals(X, X, X);
214 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
218 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ZERO, ONE);
228 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
232 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
236 readWriteEnds.get("SIO0_MUX").feedSignals(ZERO, ONE, X);
239 throw new IllegalStateException("can't happen");
248 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ZERO);
254 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ZERO, ONE);
259 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ZERO, X);
263 readWriteEnds.get("SIO0_MUX").feedSignals(ONE, ONE, X);
267 readWriteEnds.get("QIO0_MUX").feedSignals(ZERO, ONE, X);
270 throw new IllegalStateException("can't happen");
294 readWriteEnds.get("MC_EN").feedSignals(ZERO);
295 readWriteEnds.get("MC_MUX").feedSignals(X, X);
300 readWriteEnds.get("MC_EN").feedSignals(ONE);
301 readWriteEnds.get("MC_MUX").feedSignals(ZERO, ZERO);
306 readWriteEnds.get("MC_EN").feedSignals(ONE);
307 readWriteEnds.get("MC_MUX").feedSignals(ZERO, ONE);
317 readWriteEnds.get("MC_EN").feedSignals(ONE);
318 readWriteEnds.get("MC_MUX").feedSignals(ONE, X);
321 throw new IllegalStateException("can't happen");
328 IndirectGUIComponentCreator.setComponentSupplier(GUIAm2904ShiftInstrDecode.class.getCanonicalName(),
329 (m, p, n) -> new GUIAm2904ShiftInstrDecode(m, n));