X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fsnippets%2Fhighlevelstatehandlers%2Fstandard%2Fatomic%2FWireForcingAtomicHighLevelStateHandler.java;h=276f5415c5302da08de79b5dc50e891afa56e700;hb=c306a7b193d4191d2d531b8ed9840d79c44dcbc8;hp=ecf3a4d9391c9e9b8e80497c4b00c115f458155d;hpb=552986fd8718d5f2db00802015fdd1ecd58a5a2f;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java index ecf3a4d9..276f5415 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/snippets/highlevelstatehandlers/standard/atomic/WireForcingAtomicHighLevelStateHandler.java @@ -1,6 +1,7 @@ package net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.atomic; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.function.Function; @@ -12,32 +13,40 @@ import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.ModelWire; import net.mograsim.logic.model.serializing.IdentifyParams; import net.mograsim.logic.model.snippets.SnippetDefinintion; -import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.HighLevelStateHandlerContext; import net.mograsim.logic.model.snippets.highlevelstatehandlers.standard.StandardHighLevelStateHandlerSnippetSuppliers; public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelStateHandler { - private SubmodelComponent component; + private final SubmodelComponent component; private int logicWidth; private final List wiresToForce; + private final List wiresToForceUnmodifiable; private final List wiresToForceInverted; + private final List wiresToForceInvertedUnmodifiable; - public WireForcingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context) + public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component) { - this(context, null); + this(component, null); } - public WireForcingAtomicHighLevelStateHandler(HighLevelStateHandlerContext context, WireForcingAtomicHighLevelStateHandlerParams params) + public WireForcingAtomicHighLevelStateHandler(SubmodelComponent component, WireForcingAtomicHighLevelStateHandlerParams params) { - this.component = context.component; + this.component = component; this.wiresToForce = new ArrayList<>(); + this.wiresToForceUnmodifiable = Collections.unmodifiableList(wiresToForce); this.wiresToForceInverted = new ArrayList<>(); + this.wiresToForceInvertedUnmodifiable = Collections.unmodifiableList(wiresToForceInverted); if (params != null) { Map wiresByName = component.submodel.getWiresByName(); setWiresToForce(params.wiresToForce.stream().map((Function) wiresByName::get).collect(Collectors.toList()), params.wiresToForceInverted.stream().map((Function) wiresByName::get).collect(Collectors.toList())); } + component.submodel.addWireRemovedListener(w -> + { + wiresToForce.removeIf(w::equals); + wiresToForceInverted.removeIf(w::equals); + }); } public void set(List wiresToForce, List wiresToForceInverted) @@ -62,6 +71,8 @@ public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelSt logicWidth = wire.logicWidth; else if (wire.logicWidth != logicWidth) throw new IllegalArgumentException("Can only force wires of the same logic width"); + // this can add the same wire multiple times, but maybe there is a weird configuration where it is neccessary, due to race + // conditions, to force the same wire twice. if (inverted) wiresToForceInverted.add(wire); else @@ -75,6 +86,16 @@ public class WireForcingAtomicHighLevelStateHandler implements AtomicHighLevelSt logicWidth = 0; } + public List getWiresToForce() + { + return wiresToForceUnmodifiable; + } + + public List getWiresToForceInverted() + { + return wiresToForceInvertedUnmodifiable; + } + @Override public Object getHighLevelState() {