SimpleRectangularHardcodedGUIComponent now supports HighLevelStates
authorDaniel Kirschten <daniel.kirschten@gmx.de>
Sat, 31 Aug 2019 20:11:01 +0000 (22:11 +0200)
committerDaniel Kirschten <daniel.kirschten@gmx.de>
Sat, 31 Aug 2019 20:19:37 +0000 (22:19 +0200)
13 files changed:
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff12.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIdff4_finewe.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIinc12.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUInor12.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIram5_12.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/GUIsel4_12.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904RegCTInstrDecode.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2904/GUIAm2904ShiftInstrDecode.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910InstrPLA.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910RegCntr.java
net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/components/am2910/GUIAm2910SP.java
net.mograsim.logic.model/src/net/mograsim/logic/model/model/components/atomic/SimpleRectangularHardcodedGUIComponent.java
net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/componentadapters/SimpleRectangularHardcodedGUIComponentAdapter.java

index b4cfb89..8f836fa 100644 (file)
@@ -29,7 +29,7 @@ public class GUIdff12 extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit[] QC = (Bit[]) lastState;
                if (QC == null)
index a96f400..db696f3 100644 (file)
@@ -40,7 +40,7 @@ public class GUIdff4_finewe extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit[] QC = (Bit[]) lastState;
                if (QC == null)
index 11f7f93..a20745b 100644 (file)
@@ -30,7 +30,7 @@ public class GUIinc12 extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit[] ABits = readEnds.get("A").getValues().getBits();
                Bit CIVal = readEnds.get("CI").getValue();
index 2c74665..1948c67 100644 (file)
@@ -29,7 +29,7 @@ public class GUInor12 extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                readWriteEnds.get("Y").feedSignals(getResult(readEnds.get("D").getValues().getBits()));
                return null;
index 173b2ee..abc8355 100644 (file)
@@ -35,7 +35,7 @@ public class GUIram5_12 extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                BitVector[] memC = (BitVector[]) lastState;
                if (memC == null)
index d59b63f..ee7bc0e 100644 (file)
@@ -37,7 +37,7 @@ public class GUIsel4_12 extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit SAVal = readEnds.get("SA").getValue();
                Bit SBVal = readEnds.get("SB").getValue();
index 596d8a8..2406810 100644 (file)
@@ -72,7 +72,7 @@ public class GUIAm2904RegCTInstrDecode extends SimpleRectangularHardcodedGUIComp
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit[] I5_0Bits = readEnds.get("I5-0").getValues().getBits();
                Bit[] I12_11Bits = readEnds.get("I12-11").getValues().getBits();
index 48d6f7f..2a3ce4e 100644 (file)
@@ -67,7 +67,7 @@ public class GUIAm2904ShiftInstrDecode extends SimpleRectangularHardcodedGUIComp
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit _SE = readEnds.get("_SE").getValue();
                Bit[] IBits = readEnds.get("I").getValues().getBits();
index 2be428d..5ae7240 100644 (file)
@@ -40,7 +40,7 @@ public class GUIAm2910InstrPLA extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                ReadEnd PASS = readEnds.get("PASS");
                ReadEnd I = readEnds.get("I");
index 2913642..49e4a4c 100644 (file)
@@ -32,7 +32,7 @@ public class GUIAm2910RegCntr extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                Bit[] QC = (Bit[]) lastState;
                if (QC == null)
index 247c94f..a747064 100644 (file)
@@ -33,7 +33,7 @@ public class GUIAm2910SP extends SimpleRectangularHardcodedGUIComponent
        }
 
        @Override
-       protected Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
+       public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds)
        {
                BitAndInt SPC = (BitAndInt) lastState;
                if (SPC == null)
index c384b54..c06ec14 100644 (file)
@@ -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<Object> 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<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds);
+       public abstract Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds);
+
+       // logic model binding
+
+       public void setLogicModelBindingAndResetState(AtomicReference<Object> 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
index 2ccc0d6..8ca38c0 100644 (file)
@@ -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<SimpleRectangularHardcodedGUIComponent>
 {
-       private final Function<SimpleRectangularHardcodedGUIComponent, RecalculateFunction> recalculateFunctionGenerator;
-
-       public SimpleRectangularHardcodedGUIComponentAdapter(
-                       Function<SimpleRectangularHardcodedGUIComponent, RecalculateFunction> recalculateFunctionGenerator)
-       {
-               this.recalculateFunctionGenerator = recalculateFunctionGenerator;
-       }
-
        @Override
        public Class<SimpleRectangularHardcodedGUIComponent> getSupportedClass()
        {
@@ -36,14 +26,15 @@ public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentA
        public void createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularHardcodedGUIComponent guiComponent,
                        Map<Pin, Wire> logicWiresPerPin)
        {
-               RecalculateFunction recalculate = recalculateFunctionGenerator.apply(guiComponent);
                Map<String, ReadEnd> readEnds = new HashMap<>();
                Map<String, ReadWriteEnd> readWriteEnds = new HashMap<>();
 
                AtomicReference<Object> 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<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds);
-       }
 }
\ No newline at end of file