From aeb37a7bcc75c673fd0dd00743cf90227583db18 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Sat, 10 Aug 2019 19:25:58 +0200 Subject: [PATCH] Implemented GUIAm2910SP --- .../am2900/components/am2910/GUIAm2910SP.java | 87 +++++++++++++++++++ .../model/examples/GUIComponentTestbench.java | 4 +- 2 files changed, 89 insertions(+), 2 deletions(-) create mode 100644 net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java new file mode 100644 index 00000000..b19e3bb0 --- /dev/null +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java @@ -0,0 +1,87 @@ +package net.mograsim.logic.model.am2900.components.am2910; + +import java.util.Map; +import static net.mograsim.logic.core.types.Bit.*; + +import net.mograsim.logic.core.types.Bit; +import net.mograsim.logic.core.types.BitVector; +import net.mograsim.logic.core.wires.Wire.ReadEnd; +import net.mograsim.logic.core.wires.Wire.ReadWriteEnd; +import net.mograsim.logic.model.model.ViewModelModifiable; +import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent; +import net.mograsim.logic.model.model.wires.Pin; +import net.mograsim.logic.model.snippets.symbolrenderers.PinNamesSymbolRenderer.PinNamesParams.Position; + +public class GUIAm2910SP extends SimpleRectangularHardcodedGUIComponent +{ + public GUIAm2910SP(ViewModelModifiable model, String name) + { + super(model, name, "Stack\npointer"); + setSize(40, 30); + addPin(new Pin(this, "STKI0", 1, 0, 5), Usage.INPUT, Position.RIGHT); + addPin(new Pin(this, "STKI1", 1, 0, 15), Usage.INPUT, Position.RIGHT); + addPin(new Pin(this, "C", 1, 0, 25), Usage.INPUT, Position.RIGHT); + addPin(new Pin(this, "A", 3, 10, 30), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "B", 3, 30, 30), Usage.OUTPUT, Position.TOP); + addPin(new Pin(this, "_FULL", 1, 40, 15), Usage.OUTPUT, Position.LEFT); + } + + @Override + protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + { + BitAndInt SPC = (BitAndInt) lastState; + if (SPC == null) + { + SPC = new BitAndInt(); + SPC.bit = U; + SPC.i = -2; + } + int SP = SPC.i; + + Bit STKI0Val = readEnds.get("STKI0").getValue(); + Bit STKI1Val = readEnds.get("STKI1").getValue(); + Bit CVal = readEnds.get("C").getValue(); + if (SPC.bit == ZERO && CVal == ONE) + if (STKI0Val == U && STKI1Val == U) + SP = -2; + else if (!STKI0Val.isBinary() || !STKI1Val.isBinary()) + SP = -1; + else if (STKI0Val == ONE && STKI1Val == ZERO) + { + // PUSH + if (SP >= 0) + SP = SP == 5 ? 5 : SP + 1; + } else if (STKI0Val == ZERO && STKI1Val == ONE) + // CLEAR + SP = 0; + else if (STKI0Val == ONE && STKI1Val == ONE) + // POP + SP = SP <= 0 ? SP : SP - 1; + readWriteEnds.get("A").feedSignals(getAsBitVector(SP == 0 ? 7 : SP - 1)); + readWriteEnds.get("B").feedSignals(getAsBitVector(SP == 5 ? 4 : SP)); + readWriteEnds.get("_FULL").feedSignals(SP == -2 ? U : SP == -1 ? X : SP == 5 ? ZERO : ONE); + + SPC.i = SP; + SPC.bit = CVal; + return SPC; + } + + private static class BitAndInt + { + Bit bit; + int i; + } + + /** + * -1 means X, -2 means U + */ + private static BitVector getAsBitVector(int i) + { + if (i == -1) + return BitVector.of(X, 3); + if (i == -2) + return BitVector.of(U, 3); + // TODO maybe this is the wrong way around + return BitVector.of((i & 0b100) > 0 ? ONE : ZERO, (i & 0b10) > 0 ? ONE : ZERO, (i & 0b1) > 0 ? ONE : ZERO); + } +} \ No newline at end of file diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java index b745891d..0f0f73c9 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/examples/GUIComponentTestbench.java @@ -5,7 +5,7 @@ import java.util.Comparator; import java.util.List; import net.mograsim.logic.model.SimpleLogicUIStandalone; -import net.mograsim.logic.model.am2900.components.GUIram5_12; +import net.mograsim.logic.model.am2900.components.am2910.GUIAm2910SP; import net.mograsim.logic.model.model.ViewModelModifiable; import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.components.atomic.GUIBitDisplay; @@ -26,7 +26,7 @@ public class GUIComponentTestbench public static void createTestbench(ViewModelModifiable model) { // GUIComponent comp = IndirectGUIComponentCreator.createComponent(model, "GUIAm2901", "Am2901"); - GUIComponent comp = new GUIram5_12(model, "c"); + GUIComponent comp = new GUIAm2910SP(model, "c"); // guess which pins are outputs and which are inputs // TODO this code exists four times... but it seems too "hacky" to put it in a helper class -- 2.17.1