X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.model%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fmodel%2Fmodeladapter%2FViewLogicModelAdapter.java;h=ffeff19ae8903d9238b27878ac134a52584e3962;hb=93b398d6271a538a2a4c9f4de07a3b4a8a2a7fd4;hp=f41c407f08f7495268799c61bac93a13b2300832;hpb=a86976434d00dce2652d93256cc12b6e3a0f324a;p=Mograsim.git diff --git a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/ViewLogicModelAdapter.java b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/ViewLogicModelAdapter.java index f41c407f..ffeff19a 100644 --- a/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/ViewLogicModelAdapter.java +++ b/net.mograsim.logic.model/src/net/mograsim/logic/model/modeladapter/ViewLogicModelAdapter.java @@ -11,22 +11,22 @@ import java.util.function.Function; import java.util.stream.Collectors; import net.mograsim.logic.core.timeline.Timeline; -import net.mograsim.logic.core.wires.Wire; -import net.mograsim.logic.core.wires.Wire.ReadEnd; +import net.mograsim.logic.core.wires.CoreWire; +import net.mograsim.logic.core.wires.CoreWire.ReadEnd; import net.mograsim.logic.model.model.ViewModel; -import net.mograsim.logic.model.model.components.GUIComponent; +import net.mograsim.logic.model.model.components.ModelComponent; import net.mograsim.logic.model.model.components.submodels.SubmodelComponent; import net.mograsim.logic.model.model.components.submodels.SubmodelInterface; -import net.mograsim.logic.model.model.wires.GUIWire; +import net.mograsim.logic.model.model.wires.ModelWire; import net.mograsim.logic.model.model.wires.Pin; -import net.mograsim.logic.model.model.wires.WireCrossPoint; +import net.mograsim.logic.model.model.wires.ModelWireCrossPoint; import net.mograsim.logic.model.modeladapter.componentadapters.ComponentAdapter; public class ViewLogicModelAdapter { - private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); + private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); - public static void addComponentAdapter(ComponentAdapter componentAdapter) + public static void addComponentAdapter(ComponentAdapter componentAdapter) { componentAdapters.put(componentAdapter.getSupportedClass(), componentAdapter); } @@ -41,27 +41,27 @@ public class ViewLogicModelAdapter return timeline; } - private static void convert(ViewModel viewModel, LogicModelParameters params, Timeline timeline, Map externalWires) + private static void convert(ViewModel viewModel, LogicModelParameters params, Timeline timeline, Map externalWires) { - Map logicWiresPerPin = convertWires(getAllPins(viewModel), viewModel.getWiresByName().values(), externalWires, params, - timeline); - Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); + Map logicWiresPerPin = convertWires(getAllPins(viewModel), viewModel.getWiresByName().values(), externalWires, + params, timeline); + Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); - for (GUIComponent guiComp : viewModel.getComponentsByName().values()) + for (ModelComponent modelComp : viewModel.getComponentsByName().values()) { - if (guiComp instanceof SubmodelComponent) + if (modelComp instanceof SubmodelComponent) { - SubmodelComponent guiCompCasted = (SubmodelComponent) guiComp; - Map supermodelPins = guiCompCasted.getSupermodelPins(); - Map externalWiresForSubmodel = supermodelPins.entrySet().stream() - .collect(Collectors.toMap(e -> guiCompCasted.getSubmodelPin(e.getKey()), e -> logicWiresPerPin.get(e.getValue()))); - convert(guiCompCasted.submodel, params, timeline, externalWiresForSubmodel); - } else if (guiComp instanceof WireCrossPoint) + SubmodelComponent modelCompCasted = (SubmodelComponent) modelComp; + Map supermodelPins = modelCompCasted.getSupermodelPins(); + Map externalWiresForSubmodel = supermodelPins.entrySet().stream().collect( + Collectors.toMap(e -> modelCompCasted.getSubmodelPin(e.getKey()), e -> logicWiresPerPin.get(e.getValue()))); + convert(modelCompCasted.submodel, params, timeline, externalWiresForSubmodel); + } else if (modelComp instanceof ModelWireCrossPoint) { - WireCrossPoint guiCompCasted = (WireCrossPoint) guiComp; - guiCompCasted.setLogicModelBinding(logicWiresPerPin.get(guiCompCasted.getPin()).createReadOnlyEnd()); - } else if (!(guiComp instanceof SubmodelInterface))// nothing to do for SubmodelInterfaces - createAndLinkComponent(timeline, params, guiComp, logicWiresPerPinUnmodifiable, componentAdapters.get(guiComp.getClass())); + ModelWireCrossPoint modelCompCasted = (ModelWireCrossPoint) modelComp; + modelCompCasted.setLogicModelBinding(logicWiresPerPin.get(modelCompCasted.getPin()).createReadOnlyEnd()); + } else if (!(modelComp instanceof SubmodelInterface))// nothing to do for SubmodelInterfaces + createAndLinkComponent(timeline, params, modelComp, logicWiresPerPinUnmodifiable); } } @@ -71,50 +71,50 @@ public class ViewLogicModelAdapter .collect(Collectors.toSet()); } - private static Map convertWires(Set allPins, Collection wires, Map externalWires, + private static Map convertWires(Set allPins, Collection wires, Map externalWires, LogicModelParameters params, Timeline timeline) { Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); - Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); - setGUIWiresLogicModelBinding(wires, logicWiresPerPin); + Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); + setModelWiresLogicModelBinding(wires, logicWiresPerPin); return logicWiresPerPin; } - private static Map createLogicWires(LogicModelParameters params, Timeline timeline, Map> connectedPinGroups, - Map externalWires) + private static Map createLogicWires(LogicModelParameters params, Timeline timeline, + Map> connectedPinGroups, Map externalWires) { - Map logicWiresPerPin = new HashMap<>(); - Map, Wire> logicWiresPerPinGroup = new HashMap<>(); + Map logicWiresPerPin = new HashMap<>(); + Map, CoreWire> logicWiresPerPinGroup = new HashMap<>(); for (Entry> e : connectedPinGroups.entrySet()) logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), set -> { - Wire externalWire = null; + CoreWire externalWire = null; for (Pin p : set) { - Wire externalWireCandidate = externalWires.get(p); + CoreWire externalWireCandidate = externalWires.get(p); if (externalWireCandidate != null) if (externalWire == null) externalWire = externalWireCandidate; - else if (externalWire.length == externalWireCandidate.length) - Wire.fuse(externalWire, externalWireCandidate); + else if (externalWire.width == externalWireCandidate.width) + CoreWire.fuse(externalWire, externalWireCandidate); else throw new IllegalArgumentException( "Two pins to external wires with different logicWidths can't be connected directly"); } - return externalWire == null ? new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; + return externalWire == null ? new CoreWire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; })); return logicWiresPerPin; } - private static void setGUIWiresLogicModelBinding(Collection wires, Map logicWiresPerPin) + private static void setModelWiresLogicModelBinding(Collection wires, Map logicWiresPerPin) { - Map guiWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() - .collect(Collectors.toMap(Function.identity(), Wire::createReadOnlyEnd)); - for (GUIWire guiWire : wires) - guiWire.setLogicModelBinding(guiWireSharedReadEnd.get(logicWiresPerPin.get(guiWire.getPin1()))); + Map modelWireSharedReadEnd = logicWiresPerPin.values().stream().distinct() + .collect(Collectors.toMap(Function.identity(), CoreWire::createReadOnlyEnd)); + for (ModelWire modelWire : wires) + modelWire.setLogicModelBinding(modelWireSharedReadEnd.get(logicWiresPerPin.get(modelWire.getPin1()))); } - private static Map> getConnectedPinGroups(Set allPins, Collection wires) + private static Map> getConnectedPinGroups(Set allPins, Collection wires) { Map> connectedPinsPerPin = new HashMap<>(); @@ -143,12 +143,19 @@ public class ViewLogicModelAdapter } @SuppressWarnings("unchecked") - private static void createAndLinkComponent(Timeline timeline, LogicModelParameters params, - GUIComponent guiComponent, Map logicWiresPerPin, ComponentAdapter adapter) + private static void createAndLinkComponent(Timeline timeline, LogicModelParameters params, + ModelComponent modelComponent, Map logicWiresPerPin) { + Class cls = modelComponent.getClass(); + ComponentAdapter adapter = null; + while (cls != ModelComponent.class && adapter == null) + { + adapter = (ComponentAdapter) componentAdapters.get(cls); + cls = cls.getSuperclass(); + } if (adapter == null) - throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass()); - adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin); + throw new IllegalArgumentException("Unknown component class: " + modelComponent.getClass()); + adapter.createAndLinkComponent(timeline, params, (G) modelComponent, logicWiresPerPin); } private ViewLogicModelAdapter()