1 package net.mograsim.logic.model.modeladapter.componentadapters;
3 import java.util.HashMap;
5 import java.util.concurrent.atomic.AtomicReference;
6 import java.util.function.Function;
8 import net.mograsim.logic.core.LogicObserver;
9 import net.mograsim.logic.core.timeline.Timeline;
10 import net.mograsim.logic.core.wires.Wire;
11 import net.mograsim.logic.core.wires.Wire.ReadEnd;
12 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
13 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent;
14 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent.Usage;
15 import net.mograsim.logic.model.model.wires.Pin;
16 import net.mograsim.logic.model.modeladapter.LogicModelParameters;
18 //TODO support HighLevelStates
19 public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentAdapter<SimpleRectangularHardcodedGUIComponent>
21 private final Function<SimpleRectangularHardcodedGUIComponent, RecalculateFunction> recalculateFunctionGenerator;
23 public SimpleRectangularHardcodedGUIComponentAdapter(
24 Function<SimpleRectangularHardcodedGUIComponent, RecalculateFunction> recalculateFunctionGenerator)
26 this.recalculateFunctionGenerator = recalculateFunctionGenerator;
30 public Class<SimpleRectangularHardcodedGUIComponent> getSupportedClass()
32 return SimpleRectangularHardcodedGUIComponent.class;
36 public void createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularHardcodedGUIComponent guiComponent,
37 Map<Pin, Wire> logicWiresPerPin)
39 RecalculateFunction recalculate = recalculateFunctionGenerator.apply(guiComponent);
40 Map<String, ReadEnd> readEnds = new HashMap<>();
41 Map<String, ReadWriteEnd> readWriteEnds = new HashMap<>();
43 AtomicReference<Object> state = new AtomicReference<>();
45 LogicObserver logicObs = c -> timeline.addEvent(e -> state.set(recalculate.recalculate(state.get(), readEnds, readWriteEnds)),
46 params.gateProcessTime);
48 for (Pin pin : guiComponent.getPins().values())
50 Wire wire = logicWiresPerPin.get(pin);
52 if (guiComponent.getPinUsage(pin) != Usage.INPUT)
54 ReadWriteEnd rwEnd = wire.createReadWriteEnd();
55 readWriteEnds.put(pin.name, rwEnd);
58 end = wire.createReadOnlyEnd();
59 readEnds.put(pin.name, end);
60 if (guiComponent.getPinUsage(pin) != Usage.OUTPUT)
61 end.registerObserver(logicObs);
65 public static interface RecalculateFunction
67 public Object recalculate(Object lastState, Map<String, ReadEnd> readEnds, Map<String, ReadWriteEnd> readWriteEnds);