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;
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>
{
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);
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.hardcodedComponentProcessTime);
+ 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);