1 package net.mograsim.logic.model.modeladapter.componentadapters;
3 import java.util.HashMap;
5 import java.util.concurrent.atomic.AtomicReference;
7 import net.mograsim.logic.core.LogicObserver;
8 import net.mograsim.logic.core.timeline.Timeline;
9 import net.mograsim.logic.core.wires.Wire;
10 import net.mograsim.logic.core.wires.Wire.ReadEnd;
11 import net.mograsim.logic.core.wires.Wire.ReadWriteEnd;
12 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedGUIComponent;
13 import net.mograsim.logic.model.model.wires.Pin;
14 import net.mograsim.logic.model.model.wires.PinUsage;
15 import net.mograsim.logic.model.modeladapter.LogicModelParameters;
17 public class SimpleRectangularHardcodedGUIComponentAdapter implements ComponentAdapter<SimpleRectangularHardcodedGUIComponent>
20 public Class<SimpleRectangularHardcodedGUIComponent> getSupportedClass()
22 return SimpleRectangularHardcodedGUIComponent.class;
26 public void createAndLinkComponent(Timeline timeline, LogicModelParameters params, SimpleRectangularHardcodedGUIComponent guiComponent,
27 Map<Pin, Wire> logicWiresPerPin)
29 Map<String, ReadEnd> readEnds = new HashMap<>();
30 Map<String, ReadWriteEnd> readWriteEnds = new HashMap<>();
32 AtomicReference<Object> state = new AtomicReference<>();
34 Runnable recalculate = () -> state.updateAndGet(s -> guiComponent.recalculate(s, readEnds, readWriteEnds));
35 LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime);
37 guiComponent.setLogicModelBindingAndResetState(state, recalculate);
39 for (Pin pin : guiComponent.getPins().values())
41 Wire wire = logicWiresPerPin.get(pin);
43 if (pin.usage != PinUsage.INPUT)
45 ReadWriteEnd rwEnd = wire.createReadWriteEnd();
46 readWriteEnds.put(pin.name, rwEnd);
49 end = wire.createReadOnlyEnd();
50 readEnds.put(pin.name, end);
51 if (pin.usage != PinUsage.OUTPUT)
52 end.registerObserver(logicObs);