}
@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)
}
@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)
}
@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();
}
@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;
}
@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)
}
@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();
}
@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();
}
@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();
}
@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");
}
@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)
}
@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)
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;
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;
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)
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
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
static
{
- ViewLogicModelAdapter.addComponentAdapter(new SimpleRectangularHardcodedGUIComponentAdapter(c -> c::recalculate));
+ ViewLogicModelAdapter.addComponentAdapter(new SimpleRectangularHardcodedGUIComponentAdapter());
}
}
\ No newline at end of file
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;
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()
{
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())
{
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