From 30b24889d4ae001113c6cac543fb8c29d15d0ff2 Mon Sep 17 00:00:00 2001 From: Daniel Kirschten Date: Sat, 31 Aug 2019 22:11:01 +0200 Subject: [PATCH] SimpleRectangularHardcodedGUIComponent now supports HighLevelStates --- .../model/am2900/components/GUIdff12.java | 2 +- .../am2900/components/GUIdff4_finewe.java | 2 +- .../model/am2900/components/GUIinc12.java | 2 +- .../model/am2900/components/GUInor12.java | 2 +- .../model/am2900/components/GUIram5_12.java | 2 +- .../model/am2900/components/GUIsel4_12.java | 2 +- .../am2904/GUIAm2904RegCTInstrDecode.java | 2 +- .../am2904/GUIAm2904ShiftInstrDecode.java | 2 +- .../components/am2910/GUIAm2910InstrPLA.java | 2 +- .../components/am2910/GUIAm2910RegCntr.java | 2 +- .../am2900/components/am2910/GUIAm2910SP.java | 2 +- ...impleRectangularHardcodedGUIComponent.java | 53 ++++++++++++++++++- ...ctangularHardcodedGUIComponentAdapter.java | 22 ++------ 13 files changed, 66 insertions(+), 31 deletions(-) diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java index b4cfb897..8f836fab 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java @@ -29,7 +29,7 @@ public class GUIdff12 extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit[] QC = (Bit[]) lastState; if (QC == null) diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java index a96f400f..db696f3d 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java @@ -40,7 +40,7 @@ public class GUIdff4_finewe extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit[] QC = (Bit[]) lastState; if (QC == null) diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java index 11f7f93a..a20745b8 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java @@ -30,7 +30,7 @@ public class GUIinc12 extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit[] ABits = readEnds.get("A").getValues().getBits(); Bit CIVal = readEnds.get("CI").getValue(); diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java index 2c746658..1948c676 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java @@ -29,7 +29,7 @@ public class GUInor12 extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { readWriteEnds.get("Y").feedSignals(getResult(readEnds.get("D").getValues().getBits())); return null; diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java index 173b2ee9..abc8355d 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java @@ -35,7 +35,7 @@ public class GUIram5_12 extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { BitVector[] memC = (BitVector[]) lastState; if (memC == null) diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java index d59b63f0..ee7bc0ef 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java @@ -37,7 +37,7 @@ public class GUIsel4_12 extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit SAVal = readEnds.get("SA").getValue(); Bit SBVal = readEnds.get("SB").getValue(); diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java index 596d8a8e..24068108 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java @@ -72,7 +72,7 @@ public class GUIAm2904RegCTInstrDecode extends SimpleRectangularHardcodedGUIComp } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit[] I5_0Bits = readEnds.get("I5-0").getValues().getBits(); Bit[] I12_11Bits = readEnds.get("I12-11").getValues().getBits(); diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java index 48d6f7f7..2a3ce4ef 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java @@ -67,7 +67,7 @@ public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComp } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit _SE = readEnds.get("_SE").getValue(); Bit[] IBits = readEnds.get("I").getValues().getBits(); diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java index 2be428d4..5ae7240a 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java @@ -40,7 +40,7 @@ public class GUIAm2910InstrPLA extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { ReadEnd PASS = readEnds.get("PASS"); ReadEnd I = readEnds.get("I"); diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java index 29136425..49e4a4ca 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java @@ -32,7 +32,7 @@ public class GUIAm2910RegCntr extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { Bit[] QC = (Bit[]) lastState; if (QC == null) 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 index 247c94f9..a7470646 100644 --- 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 @@ -33,7 +33,7 @@ public class GUIAm2910SP extends SimpleRectangularHardcodedGUIComponent } @Override - protected Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) + public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds) { BitAndInt SPC = (BitAndInt) lastState; if (SPC == null) diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java index c384b540..c06ec149 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java @@ -1,6 +1,7 @@ package net.mograsim.logic.model.model.components.atomic; import java.util.Map; +import java.util.concurrent.atomic.AtomicReference; import net.haspamelodica.swt.helper.gcs.GeneralGC; import net.haspamelodica.swt.helper.swtobjectwrappers.Rectangle; @@ -11,6 +12,8 @@ import net.mograsim.logic.model.model.components.GUIComponent; import net.mograsim.logic.model.model.wires.Pin; import net.mograsim.logic.model.modeladapter.ViewLogicModelAdapter; import net.mograsim.logic.model.modeladapter.componentadapters.SimpleRectangularHardcodedGUIComponentAdapter; +import net.mograsim.logic.model.serializing.IdentifierGetter; +import net.mograsim.logic.model.snippets.HighLevelStateHandler; import net.mograsim.logic.model.snippets.outlinerenderers.DefaultOutlineRenderer; import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer; import net.mograsim.logic.model.snippets.symbolrenderers.CenteredTextSymbolRenderer.CenteredTextParams; @@ -28,6 +31,9 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen private final CenteredTextSymbolRenderer centerTextRenderer; private final PinNamesSymbolRenderer pinNamesRenderer; + private AtomicReference state; + private Runnable recalculate; + // creation and destruction public SimpleRectangularHardcodedGUIComponent(ViewModelModifiable model, String name, String centerText) @@ -43,6 +49,27 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen pinNamesParams.pinLabelMargin = pinNamesMargin; this.pinNamesRenderer = new PinNamesSymbolRenderer(this, pinNamesParams); addPinRemovedListener(this::pinRemoved); + setHighLevelStateHandler(new HighLevelStateHandler() + { + @Override + public Object getParamsForSerializing(IdentifierGetter idGetter) + { + return null; + } + + @Override + public Object getHighLevelState(String stateID) + { + return SimpleRectangularHardcodedGUIComponent.this.getHighLevelState(state.get(), stateID); + } + + @Override + public void setHighLevelState(String stateID, Object newState) + { + state.updateAndGet(s -> SimpleRectangularHardcodedGUIComponent.this.setHighLevelState(s, stateID, newState)); + recalculate.run(); + } + }); } // pins @@ -58,9 +85,31 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen pinNamesRenderer.setPinPosition(pin, null); } + // high-level access + + @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden + protected Object getHighLevelState(Object state, String stateID) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + + @SuppressWarnings({ "static-method", "unused" }) // this method is intended to be overridden + protected Object setHighLevelState(Object lastState, String stateID, Object newHighLevelState) + { + throw new IllegalArgumentException("No high level state with ID " + stateID); + } + // logic - protected abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); + public abstract Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); + + // logic model binding + + public void setLogicModelBindingAndResetState(AtomicReference state, Runnable recalculate) + { + this.state = state; + this.recalculate = recalculate; + } // "graphical" operations @@ -82,6 +131,6 @@ public abstract class SimpleRectangularHardcodedGUIComponent extends GUIComponen static { - ViewLogicModelAdapter.addComponentAdapter(new SimpleRectangularHardcodedGUIComponentAdapter(c -> c::recalculate)); + ViewLogicModelAdapter.addComponentAdapter(new SimpleRectangularHardcodedGUIComponentAdapter()); } } \ No newline at end of file diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java index 2ccc0d65..8ca38c08 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java @@ -3,7 +3,6 @@ package net.mograsim.logic.model.modeladapter.componentadapters; import java.util.HashMap; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Function; import net.mograsim.logic.core.LogicObserver; import net.mograsim.logic.core.timeline.Timeline; @@ -15,17 +14,8 @@ import net.mograsim.logic.model.model.wires.Pin; import net.mograsim.logic.model.model.wires.PinUsage; import net.mograsim.logic.model.modeladapter.LogicModelParameters; -//TODO support HighLevelStates public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentAdapter { - private final Function recalculateFunctionGenerator; - - public SimpleRectangularHardcodedGUIComponentAdapter( - Function recalculateFunctionGenerator) - { - this.recalculateFunctionGenerator = recalculateFunctionGenerator; - } - @Override public Class getSupportedClass() { @@ -36,14 +26,15 @@ public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentA public void createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularHardcodedGUIComponent guiComponent, Map logicWiresPerPin) { - RecalculateFunction recalculate = recalculateFunctionGenerator.apply(guiComponent); Map readEnds = new HashMap<>(); Map readWriteEnds = new HashMap<>(); AtomicReference state = new AtomicReference<>(); - LogicObserver logicObs = c -> timeline.addEvent(e -> state.set(recalculate.recalculate(state.get(), readEnds, readWriteEnds)), - params.gateProcessTime); + Runnable recalculate = () -> state.updateAndGet(s -> guiComponent.recalculate(s, readEnds, readWriteEnds)); + LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime); + + guiComponent.setLogicModelBindingAndResetState(state, recalculate); for (Pin pin : guiComponent.getPins().values()) { @@ -61,9 +52,4 @@ public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentA end.registerObserver(logicObs); } } - - public static interface RecalculateFunction - { - public Object recalculate(Object lastState, Map readEnds, Map readWriteEnds); - } } \ No newline at end of file -- 2.17.1