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;
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
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
return wiresUnmodifiable;
}
+ public <T extends ModelComponent> T getComponentByName(String name, Class<T> modelClass)
+ {
+ return getByName(name, modelClass, components);
+ }
+
+ public ModelWire getWireByName(String name)
+ {
+ return getByName(name, ModelWire.class, wires);
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T> T getByName(String name, Class<T> modelClass, Map<String, ? super T> 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 extends ModelComponent> T getComponentByPath(String path, Class<T> 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<? super ModelComponent> listener) {componentAddedListeners .add (listener);}
public void addComponentRemovedListener (Consumer<? super ModelComponent> listener) {componentRemovedListeners .add (listener);}