X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodeladapter%2FViewLogicModelAdapter.java;h=cedb12799541915f63991fbfee1f8e2d962ba7c7;hb=f14ea37d69488dd51518a36413af7176916b8bd7;hp=80c2898a6164e20252fe462a60a95629506d1451;hpb=95d72ebf4ebc8b9aca649d3e604709fa9daaca24;p=Mograsim.git diff --git a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java index 80c2898a..cedb1279 100644 --- a/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java +++ b/net.mograsim.logic.ui/src/net/mograsim/logic/ui/modeladapter/ViewLogicModelAdapter.java @@ -10,44 +10,25 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; -import net.mograsim.logic.core.components.Component; -import net.mograsim.logic.core.components.gates.AndGate; -import net.mograsim.logic.core.components.gates.NotGate; -import net.mograsim.logic.core.components.gates.OrGate; 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.ui.model.ViewModel; -import net.mograsim.logic.ui.model.components.GUIAndGate; import net.mograsim.logic.ui.model.components.GUIComponent; -import net.mograsim.logic.ui.model.components.GUINotGate; -import net.mograsim.logic.ui.model.components.GUIOrGate; import net.mograsim.logic.ui.model.components.SubmodelComponent; import net.mograsim.logic.ui.model.components.SubmodelInterface; import net.mograsim.logic.ui.model.wires.GUIWire; import net.mograsim.logic.ui.model.wires.Pin; import net.mograsim.logic.ui.model.wires.WireCrossPoint; -import net.mograsim.logic.ui.modeladapter.componentadapters.Am2901NANDBasedAdapter; -import net.mograsim.logic.ui.modeladapter.componentadapters.BitDisplayAdapter; import net.mograsim.logic.ui.modeladapter.componentadapters.ComponentAdapter; -import net.mograsim.logic.ui.modeladapter.componentadapters.ManualSwitchAdapter; -import net.mograsim.logic.ui.modeladapter.componentadapters.SimpleGateAdapter; public class ViewLogicModelAdapter { - private final static Map, ComponentAdapter> componentAdapters; - static + private final static Map, ComponentAdapter> componentAdapters = new HashMap<>(); + + public static void addComponentAdapter(ComponentAdapter componentAdapter) { - Set> componentAdaptersModifiable = new HashSet<>(); - componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIOrGate.class, OrGate::new)); - componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUIAndGate.class, AndGate::new)); - componentAdaptersModifiable.add(new SimpleGateAdapter<>(GUINotGate.class, (t, p, o, i) -> new NotGate(t, p, i[0], o))); - componentAdaptersModifiable.add(new ManualSwitchAdapter()); - componentAdaptersModifiable.add(new BitDisplayAdapter()); - componentAdaptersModifiable.add(new Am2901NANDBasedAdapter()); - // TODO list all adapters here - componentAdapters = Collections.unmodifiableMap( - componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity()))); + componentAdapters.put(componentAdapter.getSupportedClass(), componentAdapter); } public static Timeline convert(ViewModel viewModel, LogicModelParameters params) @@ -70,9 +51,9 @@ public class ViewLogicModelAdapter if (guiComp instanceof SubmodelComponent) { SubmodelComponent guiCompCasted = (SubmodelComponent) guiComp; - Map supermodelPinsPerSubmodelPin = guiCompCasted.getSupermodelPinsPerSubmodelPin(); - Map externalWiresForSubmodel = supermodelPinsPerSubmodelPin.entrySet().stream() - .collect(Collectors.toMap(Entry::getKey, e -> logicWiresPerPin.get(e.getValue()))); + 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) { @@ -85,7 +66,7 @@ public class ViewLogicModelAdapter private static Set getAllPins(ViewModel viewModel) { - return viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()); + return viewModel.getComponents().stream().flatMap(component -> component.getPins().values().stream()).collect(Collectors.toSet()); } private static Map convertWires(Set allPins, List wires, Map externalWires, @@ -112,10 +93,13 @@ public class ViewLogicModelAdapter if (externalWireCandidate != null) if (externalWire == null) externalWire = externalWireCandidate; + else if (externalWire.length == externalWireCandidate.length) + Wire.fuse(externalWire, externalWireCandidate); else - throw new IllegalArgumentException("Two pins to external wires can't be connected directly"); + throw new IllegalArgumentException( + "Two pins to external wires with different logicWidths can't be connected directly"); } - return new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime); + return externalWire == null ? new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; })); return logicWiresPerPin; } @@ -157,12 +141,12 @@ public class ViewLogicModelAdapter } @SuppressWarnings("unchecked") - private static Component createAndLinkComponent(Timeline timeline, LogicModelParameters params, + private static void createAndLinkComponent(Timeline timeline, LogicModelParameters params, GUIComponent guiComponent, Map logicWiresPerPin, ComponentAdapter adapter) { if (adapter == null) throw new IllegalArgumentException("Unknown component class: " + guiComponent.getClass()); - return adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin); + adapter.createAndLinkComponent(timeline, params, (G) guiComponent, logicWiresPerPin); } private ViewLogicModelAdapter()