X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.ui%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fui%2Fmodeladapter%2FViewLogicModelAdapter.java;h=8c478ae08e961ddb6e6f5b70486d924d38d83c19;hb=27e409f74763ec63f931d7afdea78420973d6a37;hp=6f4e7b739d55e077cc91161d4f76333fa680ecdc;hpb=07faf07e3acb8b2afdc2bf65a46bc868faaed0f8;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 6f4e7b73..8c478ae0 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 @@ -1,6 +1,5 @@ package net.mograsim.logic.ui.modeladapter; -import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; @@ -11,24 +10,29 @@ import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; +import net.mograsim.logic.core.components.gates.AndGate; +import net.mograsim.logic.core.components.gates.NandGate; +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.GUINandGate; 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.AtomicAm2901NANDBasedAdapter; +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; -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; public class ViewLogicModelAdapter { @@ -39,8 +43,11 @@ public class ViewLogicModelAdapter 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 SimpleGateAdapter<>(GUINandGate.class, NandGate::new)); componentAdaptersModifiable.add(new ManualSwitchAdapter()); - // TODO list all "primitive" adapters here + componentAdaptersModifiable.add(new BitDisplayAdapter()); + componentAdaptersModifiable.add(new AtomicAm2901NANDBasedAdapter()); + // TODO list all adapters here componentAdapters = Collections.unmodifiableMap( componentAdaptersModifiable.stream().collect(Collectors.toMap(ComponentAdapter::getSupportedClass, Function.identity()))); } @@ -50,47 +57,68 @@ public class ViewLogicModelAdapter // TODO replace Timeline with LogicModel as soon as it exists Timeline timeline = new Timeline(10); - Map logicWiresPerPin = convertWires( - viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()), - viewModel.getWires(), params, timeline); + convert(viewModel, params, timeline, Map.of()); + + return timeline; + } + + private static void convert(ViewModel viewModel, LogicModelParameters params, Timeline timeline, Map externalWires) + { + Map logicWiresPerPin = convertWires(getAllPins(viewModel), viewModel.getWires(), externalWires, params, timeline); Map logicWiresPerPinUnmodifiable = Collections.unmodifiableMap(logicWiresPerPin); - Map oneToOneComponents = new HashMap<>(); for (GUIComponent guiComp : viewModel.getComponents()) { - if (!(guiComp instanceof WireCrossPoint)) - oneToOneComponents.put(guiComp, createAndLinkComponent(timeline, params, guiComp, logicWiresPerPinUnmodifiable, - componentAdapters.get(guiComp.getClass()))); - else + 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()))); + convert(guiCompCasted.submodel, params, timeline, externalWiresForSubmodel); + } else if (guiComp instanceof WireCrossPoint) { 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())); } + } - // TODO handle complex components - - List logicComponents = new ArrayList<>(); - logicComponents.addAll(oneToOneComponents.values()); - - return timeline; + private static Set getAllPins(ViewModel viewModel) + { + return viewModel.getComponents().stream().flatMap(component -> component.getPins().stream()).collect(Collectors.toSet()); } - private static Map convertWires(Set allPins, List wires, LogicModelParameters params, Timeline timeline) + private static Map convertWires(Set allPins, List wires, Map externalWires, + LogicModelParameters params, Timeline timeline) { Map> connectedPinGroups = getConnectedPinGroups(allPins, wires); - Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups); + Map logicWiresPerPin = createLogicWires(params, timeline, connectedPinGroups, externalWires); setGUIWiresLogicModelBinding(wires, logicWiresPerPin); return logicWiresPerPin; } - private static Map createLogicWires(LogicModelParameters params, Timeline timeline, Map> connectedPinGroups) + private static Map createLogicWires(LogicModelParameters params, Timeline timeline, Map> connectedPinGroups, + Map externalWires) { Map logicWiresPerPin = new HashMap<>(); Map, Wire> logicWiresPerPinGroup = new HashMap<>(); for (Entry> e : connectedPinGroups.entrySet()) - logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), - set -> new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime))); + logicWiresPerPin.put(e.getKey(), logicWiresPerPinGroup.computeIfAbsent(e.getValue(), set -> + { + Wire externalWire = null; + for (Pin p : set) + { + Wire externalWireCandidate = externalWires.get(p); + if (externalWireCandidate != null) + if (externalWire == null) + externalWire = externalWireCandidate; + else + throw new IllegalArgumentException("Two pins to external wires can't be connected directly"); + } + return externalWire == null ? new Wire(timeline, e.getKey().logicWidth, params.wireTravelTime) : externalWire; + })); return logicWiresPerPin; } @@ -131,12 +159,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()