Fixed a timing bug in SimpleRectangularHardcodedModelComponentAdapter
[Mograsim.git] / plugins / net.mograsim.logic.model / src / net / mograsim / logic / model / modeladapter / componentadapters / SimpleRectangularHardcodedModelComponentAdapter.java
index dbebc0f..716c306 100644 (file)
@@ -2,7 +2,6 @@ package net.mograsim.logic.model.modeladapter.componentadapters;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicReference;
 
 import net.mograsim.logic.core.LogicObserver;
 import net.mograsim.logic.core.timeline.Timeline;
@@ -13,6 +12,7 @@ import net.mograsim.logic.model.model.components.atomic.SimpleRectangularHardcod
 import net.mograsim.logic.model.model.wires.Pin;
 import net.mograsim.logic.model.model.wires.PinUsage;
 import net.mograsim.logic.model.modeladapter.CoreModelParameters;
+import net.mograsim.logic.model.util.ObservableAtomicReference;
 
 public class SimpleRectangularHardcodedModelComponentAdapter implements ComponentAdapter<SimpleRectangularHardcodedModelComponent>
 {
@@ -29,10 +29,10 @@ public class SimpleRectangularHardcodedModelComponentAdapter implements Componen
                Map<String, ReadEnd> readEnds = new HashMap<>();
                Map<String, ReadWriteEnd> readWriteEnds = new HashMap<>();
 
-               AtomicReference<Object> state = new AtomicReference<>();
+               ObservableAtomicReference<Object> state = new ObservableAtomicReference<>();
 
                Runnable recalculate = () -> state.updateAndGet(s -> modelComponent.recalculate(s, readEnds, readWriteEnds));
-               LogicObserver logicObs = c -> timeline.addEvent(e -> recalculate.run(), params.gateProcessTime);
+               LogicObserver logicObs = c -> recalculate.run();
 
                modelComponent.setCoreModelBindingAndResetState(state, recalculate);
 
@@ -42,11 +42,12 @@ public class SimpleRectangularHardcodedModelComponentAdapter implements Componen
                        ReadEnd end;
                        if (pin.usage != PinUsage.INPUT)
                        {
-                               ReadWriteEnd rwEnd = wire.createReadWriteEnd();
-                               readWriteEnds.put(pin.name, rwEnd);
-                               end = rwEnd;
-                       } else
-                               end = wire.createReadOnlyEnd();
+                               // TODO do this prettier
+                               CoreWire pseudoWire = new CoreWire(timeline, wire.width, params.gateProcessTime);
+                               CoreWire.fuse(wire, pseudoWire);
+                               readWriteEnds.put(pin.name, pseudoWire.createReadWriteEnd());
+                       }
+                       end = wire.createReadOnlyEnd();
                        readEnds.put(pin.name, end);
                        if (pin.usage != PinUsage.OUTPUT)
                                end.registerObserver(logicObs);