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.CoreWire;
10 import net.mograsim.logic.core.wires.CoreWire.ReadEnd;
11 import net.mograsim.logic.core.wires.CoreWire.ReadWriteEnd;
12 import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcodedModelComponent;
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.CoreModelParameters;
17 public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter<SimpleRectangularHardcodedModelComponent>
20 public Class<SimpleRectangularHardcodedModelComponent> getSupportedClass()
22 return SimpleRectangularHardcodedModelComponent.class;
26 public void createAndLinkComponent(Timeline timeline, CoreModelParameters params,
27 SimpleRectangularHardcodedModelComponent modelComponent, Map<Pin, CoreWire> 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 -> modelComponent.recalculate(s, readEnds, readWriteEnds));
35 LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime);
37 modelComponent.setCoreModelBindingAndResetState(state, recalculate);
39 for (Pin pin : modelComponent.getPins().values())
41 CoreWire 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);