1 package net.mograsim.logic.model.am2900.components.am2910;
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;
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;
19 public class GUIAm2910InstrPLA extends SimpleRectangularHardcodedGUIComponent
21 public GUIAm2910InstrPLA(ViewModelModifiable model, String name)
23 super(model, name, "Instr.\nPLA");
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);
42 protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
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");
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();
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()))
97 int IAsInt = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0);
103 else if (IAsInt == 6)
107 _PL.feedSignals(_PLVal);
108 _MAP.feedSignals(_MAPVal);
109 _VECT.feedSignals(_VECTVal);
110 if (IAsInt == 8 || IAsInt == 9 || IAsInt == 15)
112 RWE.feedSignals(Req0Val);
113 RDEC.feedSignals(Req0Val);// "forward" X/U/Z
114 } else if (IAsInt == 4)
116 RWE.feedSignals(PASSVal);
117 RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z
120 RWE.feedSignals(ZERO);
121 RDEC.feedSignals(ZERO);
123 if (!PASSVal.isBinary())
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
135 switch (IAsInt + (PASSVal == ONE ? 16 : 0))
175 YFVal = Req0Val.not();// "forward" X/U/Z
176 YmuPCVal = Req0Val;// "forward" X/U/Z
180 YDVal = Req0Val.not();// "forward" X/U/Z
181 YmuPCVal = Req0Val;// "forward" X/U/Z
184 YFVal = Req0Val.not();// "forward" X/U/Z
185 YDVal = Req0Val;// "forward" X/U/Z
188 throw new IllegalStateException("shouldn't happen");
190 YD.feedSignals(YDVal);
191 YR.feedSignals(YRVal);
192 YF.feedSignals(YFVal);
193 YmuPC.feedSignals(YmuPCVal);
196 switch (IAsInt + (PASSVal == ONE ? 16 : 0))
246 STKI1Val = Req0Val;// "forward" X/U/Z
247 STKI0Val = Req0Val;// "forward" X/U/Z
250 throw new IllegalStateException("shouldn't happen");
252 STKI0.feedSignals(STKI0Val);
253 STKI1.feedSignals(STKI1Val);
261 IndirectGUIComponentCreator.setComponentSupplier(GUIAm2910InstrPLA.class.getCanonicalName(),
262 (m, p, n) -> new GUIAm2910InstrPLA(m, n));