1 package net.mograsim.logic.model.modeladapter.componentadapters;
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.LogicObserver;
11 import net.mograsim.logic.core.timeline.Timeline;
12 import net.mograsim.logic.core.types.Bit;
13 import net.mograsim.logic.core.wires.Wire;
14 import net.mograsim.logic.core.wires.Wire.ReadEnd;
15 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
16 import net.mograsim.logic.model.am2900.components.am2910.GUIAm2910InstrPLA;
17 import net.mograsim.logic.model.model.wires.Pin;
18 import net.mograsim.logic.model.modeladapter.LogicModelParameters;
20 public class Am2910InstrPLAAdapter implements ComponentAdapter<GUIAm2910InstrPLA>
23 public Class<GUIAm2910InstrPLA> getSupportedClass()
25 return GUIAm2910InstrPLA.class;
29 public void createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIAm2910InstrPLA guiComponent,
30 Map<Pin, Wire> logicWiresPerPin)
32 ReadEnd PASS = logicWiresPerPin.get(guiComponent.getPin("PASS")).createReadOnlyEnd();
33 ReadEnd I3 = logicWiresPerPin.get(guiComponent.getPin("I3")).createReadOnlyEnd();
34 ReadEnd I2 = logicWiresPerPin.get(guiComponent.getPin("I2")).createReadOnlyEnd();
35 ReadEnd I1 = logicWiresPerPin.get(guiComponent.getPin("I1")).createReadOnlyEnd();
36 ReadEnd I0 = logicWiresPerPin.get(guiComponent.getPin("I0")).createReadOnlyEnd();
37 ReadEnd Req0 = logicWiresPerPin.get(guiComponent.getPin("R=0")).createReadOnlyEnd();
38 ReadWriteEnd _PL = logicWiresPerPin.get(guiComponent.getPin("_PL")).createReadWriteEnd();
39 ReadWriteEnd _MAP = logicWiresPerPin.get(guiComponent.getPin("_MAP")).createReadWriteEnd();
40 ReadWriteEnd _VECT = logicWiresPerPin.get(guiComponent.getPin("_VECT")).createReadWriteEnd();
41 ReadWriteEnd RWE = logicWiresPerPin.get(guiComponent.getPin("RWE")).createReadWriteEnd();
42 ReadWriteEnd RDEC = logicWiresPerPin.get(guiComponent.getPin("RDEC")).createReadWriteEnd();
43 ReadWriteEnd YD = logicWiresPerPin.get(guiComponent.getPin("YD")).createReadWriteEnd();
44 ReadWriteEnd YR = logicWiresPerPin.get(guiComponent.getPin("YR")).createReadWriteEnd();
45 ReadWriteEnd YF = logicWiresPerPin.get(guiComponent.getPin("YF")).createReadWriteEnd();
46 ReadWriteEnd YmuPC = logicWiresPerPin.get(guiComponent.getPin("YmuPC")).createReadWriteEnd();
47 ReadWriteEnd STKI0 = logicWiresPerPin.get(guiComponent.getPin("STKI0")).createReadWriteEnd();
48 ReadWriteEnd STKI1 = logicWiresPerPin.get(guiComponent.getPin("STKI1")).createReadWriteEnd();
50 LogicObserver updateOutputs = o ->
52 Bit PASSVal = PASS.getValue();
53 Bit I3Val = I3.getValue();
54 Bit I2Val = I2.getValue();
55 Bit I1Val = I1.getValue();
56 Bit I0Val = I0.getValue();
57 Bit Req0Val = Req0.getValue();
59 if (!I3Val.isBinary() || !I2Val.isBinary() || !I1Val.isBinary() || !I0Val.isBinary())
60 if ((I3Val == U || I3Val.isBinary()) || (I2Val == U || I2Val.isBinary()) || (I1Val == U || I1Val.isBinary())
61 || (I0Val == U || I0Val.isBinary()))
90 int I = (I3Val == ONE ? 8 : 0) + (I2Val == ONE ? 4 : 0) + (I1Val == ONE ? 2 : 0) + (I0Val == ONE ? 1 : 0);
100 _PL.feedSignals(_PLVal);
101 _MAP.feedSignals(_MAPVal);
102 _VECT.feedSignals(_VECTVal);
103 if (I == 8 || I == 9 || I == 15)
105 RWE.feedSignals(Req0Val);
106 RDEC.feedSignals(Req0Val);// "forward" X/U/Z
109 RWE.feedSignals(PASSVal);
110 RDEC.feedSignals(PASSVal == ONE ? ZERO : PASSVal);// "forward" X/U/Z
113 RWE.feedSignals(ZERO);
114 RDEC.feedSignals(ZERO);
116 if (!PASSVal.isBinary())
118 YD.feedSignals(PASSVal);// "forward" X/U/Z
119 YR.feedSignals(PASSVal);// "forward" X/U/Z
120 YF.feedSignals(PASSVal);// "forward" X/U/Z
121 YmuPC.feedSignals(PASSVal);// "forward" X/U/Z
128 switch (I + (PASSVal == ONE ? 16 : 0))
168 YFVal = Req0Val.not();// "forward" X/U/Z
169 YmuPCVal = Req0Val;// "forward" X/U/Z
173 YDVal = Req0Val.not();// "forward" X/U/Z
174 YmuPCVal = Req0Val;// "forward" X/U/Z
177 YFVal = Req0Val.not();// "forward" X/U/Z
178 YDVal = Req0Val;// "forward" X/U/Z
181 throw new IllegalStateException("shouldn't happen");
183 YD.feedSignals(YDVal);
184 YR.feedSignals(YRVal);
185 YF.feedSignals(YFVal);
186 YmuPC.feedSignals(YmuPCVal);
189 switch (I + (PASSVal == ONE ? 16 : 0))
235 STKI1Val = Req0Val;// "forward" X/U/Z
236 STKI0Val = Req0Val;// "forward" X/U/Z
239 throw new IllegalStateException("shouldn't happen");
241 STKI0.feedSignals(STKI0Val);
242 STKI1.feedSignals(STKI1Val);
247 PASS.registerObserver(updateOutputs);
248 I3.registerObserver(updateOutputs);
249 I2.registerObserver(updateOutputs);
250 I1.registerObserver(updateOutputs);
251 I0.registerObserver(updateOutputs);
252 Req0.registerObserver(updateOutputs);