Fixed a bug in Am2900; created dlatch8/80; relayouted some components
[Mograsim.git] / net.mograsim.logic.model / src / net / mograsim / logic / model / model / LogicModel.java
index 839d5f9..17d0a44 100644 (file)
@@ -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,24 +117,64 @@ public class LogicModel
                return wiresUnmodifiable;
        }
 
+       public ModelComponent getComponentByName(String name)
+       {
+               return components.get(name);
+       }
+
+       @SuppressWarnings("unchecked")
+       public <T extends ModelComponent> T getComponentByName(String name, Class<T> expectedComponentClass)
+       {
+               ModelComponent comp = components.get(name);
+               Objects.requireNonNull(comp, "Invaild path, component " + name + " not found");
+               if (expectedComponentClass.isInstance(comp))
+                       return (T) comp;
+               throw new IllegalArgumentException("The component " + name + " is not an instance of " + expectedComponentClass);
+       }
+
+       public ModelWire getWireByName(String name)
+       {
+               return wires.get(name);
+       }
+
+       public <T extends ModelComponent> T getComponentBySubmodelPath(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.getComponentBySubmodelPath(rest, modelClass);
+       }
+
+       public ModelWire getWireBySubmodelPath(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.getWireBySubmodelPath(rest);
+       }
+
        // @formatter:off
        public void addComponentAddedListener         (Consumer<? super ModelComponent> listener) {componentAddedListeners      .add   (listener);}
        public void addComponentRemovedListener       (Consumer<? super ModelComponent> listener) {componentRemovedListeners    .add   (listener);}
        public void addWireAddedListener              (Consumer<? super ModelWire     > listener) {wireAddedListeners           .add   (listener);}
        public void addWireRemovedListener            (Consumer<? super ModelWire     > listener) {wireRemovedListeners         .add   (listener);}
-       public void addRedrawHandlerChangedListener   (Consumer<? super Runnable    > listener) {redrawHandlerChangedListeners.add   (listener);}
+       public void addRedrawHandlerChangedListener   (Consumer<? super Runnable      > listener) {redrawHandlerChangedListeners.add   (listener);}
 
        public void removeComponentAddedListener      (Consumer<? super ModelComponent> listener) {componentAddedListeners      .remove(listener);}
        public void removeComponentRemovedListener    (Consumer<? super ModelComponent> listener) {componentRemovedListeners    .remove(listener);}
        public void removeWireAddedListener           (Consumer<? super ModelWire     > listener) {wireAddedListeners           .remove(listener);}
        public void removeWireRemovedListener         (Consumer<? super ModelWire     > listener) {wireRemovedListeners         .remove(listener);}
-       public void removeRedrawHandlerChangedListener(Consumer<? super Runnable    > listener) {redrawHandlerChangedListeners.remove(listener);}
+       public void removeRedrawHandlerChangedListener(Consumer<? super Runnable      > listener) {redrawHandlerChangedListeners.remove(listener);}
 
        private void callComponentAddedListeners     (ModelComponent c) {componentAddedListeners      .forEach(l -> l.accept(c));}
        private void callComponentRemovedListeners   (ModelComponent c) {componentRemovedListeners    .forEach(l -> l.accept(c));}
        private void callWireAddedListeners          (ModelWire      w) {wireAddedListeners           .forEach(l -> l.accept(w));}
        private void callWireRemovedListeners        (ModelWire      w) {wireRemovedListeners         .forEach(l -> l.accept(w));}
-       private void callRedrawHandlerChangedListener(Runnable     r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));}
+       private void callRedrawHandlerChangedListener(Runnable       r) {redrawHandlerChangedListeners.forEach(l -> l.accept(r));}
        // @formatter:on
 
        public void setRedrawHandler(Runnable handler)