From fa5e3151a923b6cb6120f62436e24ac103a9290c Mon Sep 17 00:00:00 2001 From: Christian Femers Date: Sun, 15 Sep 2019 00:28:09 +0200 Subject: [PATCH] Added methods to LogicModel for easy Component/Wire retrieval. --- .../model/am2900/machine/Am2900Machine.java | 5 ++- .../logic/model/model/LogicModel.java | 42 +++++++++++++++++++ 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java index 84703433..5aa348ca 100644 --- a/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java +++ b/net.mograsim.logic.model.am2900/src/net/mograsim/logic/model/am2900/machine/Am2900Machine.java @@ -5,6 +5,8 @@ import net.mograsim.logic.core.timeline.Timeline; import net.mograsim.logic.core.types.BitVector; import net.mograsim.logic.model.model.LogicModel; import net.mograsim.logic.model.model.LogicModelModifiable; +import net.mograsim.logic.model.model.components.atomic.ModelClock; +import net.mograsim.logic.model.model.components.atomic.ModelManualSwitch; import net.mograsim.logic.model.modeladapter.CoreModelParameters; import net.mograsim.logic.model.modeladapter.LogicCoreAdapter; import net.mograsim.logic.model.serializing.IndirectModelComponentCreator; @@ -30,13 +32,14 @@ public class Am2900Machine implements Machine this.machineDefinition = am2900MachineDefinition; logicModel = new LogicModelModifiable(); IndirectModelComponentCreator.createComponent(logicModel, - "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json"); + "resloader:Am2900Loader:jsonres:net/mograsim/logic/model/am2900/components/Am2900.json", "Am2900"); CoreModelParameters params = new CoreModelParameters(); params.gateProcessTime = 50; params.wireTravelTime = 10; mainMemory = new WordAddressableMemory(am2900MachineDefinition.getMainMemoryDefinition()); instMemory = new StandardMicroInstructionMemory(am2900MachineDefinition.getMicroInstructionMemoryDefinition()); timeline = LogicCoreAdapter.convert(logicModel, params); + logicModel.getComponentByPath("Am2900.@c", ModelManualSwitch.class).getManualSwitch(); } @Override diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java index 839d5f9a..33cc22e2 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/model/LogicModel.java @@ -5,9 +5,11 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.function.Consumer; import net.mograsim.logic.model.model.components.ModelComponent; +import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.wires.ModelWire; public class LogicModel @@ -115,6 +117,46 @@ public class LogicModel return wiresUnmodifiable; } + public T getComponentByName(String name, Class modelClass) + { + return getByName(name, modelClass, components); + } + + public ModelWire getWireByName(String name) + { + return getByName(name, ModelWire.class, wires); + } + + @SuppressWarnings("unchecked") + private static T getByName(String name, Class modelClass, Map map) + { + Object comp = map.get(name); + Objects.requireNonNull(comp, "Invaild path, component " + name + " not found"); + if (modelClass.isInstance(comp)) + return (T) comp; + throw new IllegalArgumentException("The component " + name + " is not an instance of " + modelClass); + } + + public T getComponentByPath(String path, Class modelClass) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getComponentByName(path, modelClass); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getComponentByPath(rest, modelClass); + } + + public ModelWire getWireByPath(String path) + { + int firstDot = path.indexOf('.'); + if (firstDot == -1) + return getWireByName(path); + String first = path.substring(0, firstDot); + String rest = path.substring(firstDot + 1); + return getComponentByName(first, SubmodelComponent.class).submodel.getWireByPath(rest); + } + // @formatter:off public void addComponentAddedListener (Consumer listener) {componentAddedListeners .add (listener);} public void addComponentRemovedListener (Consumer listener) {componentRemovedListeners .add (listener);} -- 2.17.1