The final restructured version for automatic build using maven tycho
[Mograsim.git] / plugins / net.mograsim.logic.model / src / net / mograsim / logic / model / modeladapter / componentadapters / SimpleRectangularHardcodedModelComponentAdapter.java
1 package net.mograsim.logic.model.modeladapter.componentadapters;
2
3 import java.util.HashMap;
4 import java.util.Map;
5 import java.util.concurrent.atomic.AtomicReference;
6
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;
16
17 public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter<SimpleRectangularHardcodedModelComponent>
18 {
19         @Override
20         public Class<SimpleRectangularHardcodedModelComponent> getSupportedClass()
21         {
22                 return SimpleRectangularHardcodedModelComponent.class;
23         }
24
25         @Override
26         public void createAndLinkComponent(Timeline timeline, CoreModelParameters params,
27                         SimpleRectangularHardcodedModelComponent modelComponent, Map<Pin, CoreWire> logicWiresPerPin)
28         {
29                 Map<String, ReadEnd> readEnds = new HashMap<>();
30                 Map<String, ReadWriteEnd> readWriteEnds = new HashMap<>();
31
32                 AtomicReference<Object> state = new AtomicReference<>();
33
34                 Runnable recalculate = () -> state.updateAndGet(s -> modelComponent.recalculate(s, readEnds, readWriteEnds));
35                 LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime);
36
37                 modelComponent.setCoreModelBindingAndResetState(state, recalculate);
38
39                 for (Pin pin : modelComponent.getPins().values())
40                 {
41                         CoreWire wire = logicWiresPerPin.get(pin);
42                         ReadEnd end;
43                         if (pin.usage != PinUsage.INPUT)
44                         {
45                                 ReadWriteEnd rwEnd = wire.createReadWriteEnd();
46                                 readWriteEnds.put(pin.name, rwEnd);
47                                 end = rwEnd;
48                         } else
49                                 end = wire.createReadOnlyEnd();
50                         readEnds.put(pin.name, end);
51                         if (pin.usage != PinUsage.OUTPUT)
52                                 end.registerObserver(logicObs);
53                 }
54         }
55 }