From 1056dc84c64f0b04d6a968310f1d5546b21fb2f9 Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 22 Mar 2016 22:30:12 +0100 Subject: [PATCH] Preparartion of Traces --- .../java/de/neemann/digital/core/Model.java | 4 +- .../de/neemann/digital/core/ModelEvent.java | 4 +- .../neemann/digital/gui/LibrarySelector.java | 8 +-- .../java/de/neemann/digital/gui/Main.java | 14 ++++- .../neemann/digital/gui/TraceGenerator.java | 58 +++++++++++++++++++ .../gui/components/CircuitComponent.java | 6 +- .../digital/gui/draw/elements/Pins.java | 8 +++ .../{PartLibrary.java => ElementLibrary.java} | 10 ++-- .../gui/draw/model/ModelDescription.java | 17 +++--- .../digital/gui/draw/model/ModelEntry.java | 4 ++ .../digital/gui/draw/shapes/ShapeFactory.java | 6 +- 11 files changed, 112 insertions(+), 27 deletions(-) create mode 100644 src/main/java/de/neemann/digital/gui/TraceGenerator.java rename src/main/java/de/neemann/digital/gui/draw/library/{PartLibrary.java => ElementLibrary.java} (89%) diff --git a/src/main/java/de/neemann/digital/core/Model.java b/src/main/java/de/neemann/digital/core/Model.java index 2b52a6f12..95f6356a5 100644 --- a/src/main/java/de/neemann/digital/core/Model.java +++ b/src/main/java/de/neemann/digital/core/Model.java @@ -103,6 +103,8 @@ public class Model { if (!isInitialized) throw new RuntimeException("notInitialized!"); + fireEvent(ModelEvent.STEP); + version++; // swap lists ArrayList nl = nodesToUpdateNext; @@ -149,7 +151,7 @@ public class Model { } public void removeObserver(ModelStateObserver observer) { - observers.add(observer); + observers.remove(observer); } private void fireEvent(ModelEvent event) { diff --git a/src/main/java/de/neemann/digital/core/ModelEvent.java b/src/main/java/de/neemann/digital/core/ModelEvent.java index 591b9f8c1..751bbeaee 100644 --- a/src/main/java/de/neemann/digital/core/ModelEvent.java +++ b/src/main/java/de/neemann/digital/core/ModelEvent.java @@ -10,7 +10,9 @@ import java.util.ArrayList; public class ModelEvent { - public enum Event {STARTED, STOPPED, FETCHCLOCK} + public static final ModelEvent STEP = new ModelEvent(Event.STEP); + + public enum Event {STARTED, STOPPED, FETCHCLOCK, STEP} ; diff --git a/src/main/java/de/neemann/digital/gui/LibrarySelector.java b/src/main/java/de/neemann/digital/gui/LibrarySelector.java index 032e41367..e99c2292e 100644 --- a/src/main/java/de/neemann/digital/gui/LibrarySelector.java +++ b/src/main/java/de/neemann/digital/gui/LibrarySelector.java @@ -3,7 +3,7 @@ package de.neemann.digital.gui; import de.neemann.digital.gui.components.CircuitComponent; import de.neemann.digital.gui.draw.elements.VisualElement; import de.neemann.digital.gui.draw.graphics.Vector; -import de.neemann.digital.gui.draw.library.PartLibrary; +import de.neemann.digital.gui.draw.library.ElementLibrary; import de.process.utils.gui.ToolTipAction; import javax.swing.*; @@ -13,9 +13,9 @@ import java.awt.event.ActionEvent; * @author hneemann */ public class LibrarySelector { - private final PartLibrary library; + private final ElementLibrary library; - public LibrarySelector(PartLibrary library) { + public LibrarySelector(ElementLibrary library) { this.library = library; } @@ -24,7 +24,7 @@ public class LibrarySelector { JMenu subMenu = null; String lastPath = null; - for (PartLibrary.PartContainer pc : library) { + for (ElementLibrary.PartContainer pc : library) { String path = pc.getTreePath(); if (!path.equals(lastPath)) { subMenu = new JMenu(path); diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 87e260856..f9e209fe4 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -15,7 +15,7 @@ import de.neemann.digital.gui.draw.elements.PinException; import de.neemann.digital.gui.draw.elements.VisualElement; import de.neemann.digital.gui.draw.elements.Wire; import de.neemann.digital.gui.draw.graphics.Vector; -import de.neemann.digital.gui.draw.library.PartLibrary; +import de.neemann.digital.gui.draw.library.ElementLibrary; import de.neemann.digital.gui.draw.model.ModelDescription; import de.neemann.digital.gui.draw.shapes.ShapeFactory; import de.process.utils.gui.ClosingWindowListener; @@ -38,8 +38,9 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { private static final String MESSAGE = "Digital\n\nA simple simulator for digital circuits.\nWritten bei H.Neemann in 2016"; private final CircuitComponent circuitComponent; private final ToolTipAction save; - private final PartLibrary library = ShapeFactory.getInstance().setLibrary(new PartLibrary()); + private final ElementLibrary library = ShapeFactory.getInstance().setLibrary(new ElementLibrary()); private final ToolTipAction doStep; + private final JCheckBoxMenuItem traceEnable; private File filename; private Model model; private ModelDescription modelDescription; @@ -176,13 +177,15 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { new ErrorMessage("SpeedTestError").addCause(e1).show(); } } - }.setToolTip("Runs the Model"); + }.setToolTip("Performs a speed test by calculating the max. clock frequency."); + traceEnable = new JCheckBoxMenuItem("Trace"); run.add(runModel.createJMenuItem()); run.add(runModelMicro.createJMenuItem()); run.add(doStep.createJMenuItem()); run.add(speedTest.createJMenuItem()); + run.add(traceEnable); doStep.setEnabled(false); JToolBar toolBar = new JToolBar(); @@ -228,6 +231,11 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave { modelDescription = new ModelDescription(circuitComponent.getCircuit(), library); model = modelDescription.createModel(true); modelDescription.connectToGui(circuitComponent); + + if (traceEnable.isSelected()) { + + } + model.init(); } catch (NodeException e) { if (modelDescription != null) { diff --git a/src/main/java/de/neemann/digital/gui/TraceGenerator.java b/src/main/java/de/neemann/digital/gui/TraceGenerator.java new file mode 100644 index 000000000..11d1136f6 --- /dev/null +++ b/src/main/java/de/neemann/digital/gui/TraceGenerator.java @@ -0,0 +1,58 @@ +package de.neemann.digital.gui; + +import de.neemann.digital.core.Model; +import de.neemann.digital.core.ModelEvent; +import de.neemann.digital.core.ModelStateObserver; +import de.neemann.digital.core.ObservableValue; +import de.neemann.digital.core.element.AttributeKey; +import de.neemann.digital.core.io.In; +import de.neemann.digital.core.io.Out; +import de.neemann.digital.gui.draw.library.ElementLibrary; +import de.neemann.digital.gui.draw.model.ModelDescription; +import de.neemann.digital.gui.draw.model.ModelEntry; + +/** + * @author hneemann + */ +public class TraceGenerator implements ModelStateObserver { + + private final Model model; + + public TraceGenerator(ModelDescription modelDescription, Model model, ElementLibrary library) { + this.model = model; + for (ModelEntry me : modelDescription) { + String name = me.getVisualElement().getElementName(); + if (library.getElementType(name) == In.DESCRIPTION) + register(me); + if (library.getElementType(name) == Out.DESCRIPTION) + register(me); + if (library.getElementType(name) == Out.LEDDESCRIPTION) + register(me); + if (library.getElementType(name) == Out.PROBEDESCRIPTION) + register(me); + } + model.addObserver(this); + } + + private void register(ModelEntry me) { + ObservableValue value = me.getPins().get(0).getValue(); + String labelName = me.getVisualElement().getElementAttributes().get(AttributeKey.Label); + if (value != null && labelName != null && labelName.length() > 0) { + + + } + } + + + @Override + public void handleEvent(ModelEvent event) { + switch (event.getType()) { + case STEP: + break; + case STOPPED: + model.removeObserver(this); + break; + } + } + +} diff --git a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java index d2868c8a6..824ffd9a3 100644 --- a/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java +++ b/src/main/java/de/neemann/digital/gui/components/CircuitComponent.java @@ -8,7 +8,7 @@ import de.neemann.digital.gui.draw.elements.VisualElement; import de.neemann.digital.gui.draw.elements.Wire; import de.neemann.digital.gui.draw.graphics.*; import de.neemann.digital.gui.draw.graphics.Polygon; -import de.neemann.digital.gui.draw.library.PartLibrary; +import de.neemann.digital.gui.draw.library.ElementLibrary; import de.neemann.digital.gui.draw.shapes.Drawable; import de.neemann.digital.gui.draw.shapes.GenericShape; @@ -26,13 +26,13 @@ import java.util.ArrayList; public class CircuitComponent extends JComponent implements Observer { private static final String delAction = "myDelAction"; - private final PartLibrary library; + private final ElementLibrary library; private Circuit circuit; private Mouse listener; private AffineTransform transform = new AffineTransform(); private Observer manualChangeObserver; - public CircuitComponent(Circuit aCircuit, PartLibrary library) { + public CircuitComponent(Circuit aCircuit, ElementLibrary library) { this.library = library; setCircuit(aCircuit); diff --git a/src/main/java/de/neemann/digital/gui/draw/elements/Pins.java b/src/main/java/de/neemann/digital/gui/draw/elements/Pins.java index 6cd7689ab..935f71fab 100644 --- a/src/main/java/de/neemann/digital/gui/draw/elements/Pins.java +++ b/src/main/java/de/neemann/digital/gui/draw/elements/Pins.java @@ -54,4 +54,12 @@ public class Pins implements Iterable { return true; return false; } + + public int size() { + return allPins.size(); + } + + public Pin get(int index) { + return allPins.get(index); + } } diff --git a/src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java b/src/main/java/de/neemann/digital/gui/draw/library/ElementLibrary.java similarity index 89% rename from src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java rename to src/main/java/de/neemann/digital/gui/draw/library/ElementLibrary.java index c7c2d285a..e42de83a2 100644 --- a/src/main/java/de/neemann/digital/gui/draw/library/PartLibrary.java +++ b/src/main/java/de/neemann/digital/gui/draw/library/ElementLibrary.java @@ -23,12 +23,12 @@ import java.util.Iterator; /** * @author hneemann */ -public class PartLibrary implements Iterable { +public class ElementLibrary implements Iterable { private final HashMap map = new HashMap<>(); private ArrayList list = new ArrayList<>(); - public PartLibrary() { + public ElementLibrary() { add(And.DESCRIPTION, "Logic"); add(NAnd.DESCRIPTION, "Logic"); add(Or.DESCRIPTION, "Logic"); @@ -67,10 +67,10 @@ public class PartLibrary implements Iterable { list.add(new PartContainer(name, treePath)); } - public ElementTypeDescription getElementType(String partName) { - ElementTypeDescription pd = map.get(partName); + public ElementTypeDescription getElementType(String elementName) { + ElementTypeDescription pd = map.get(elementName); if (pd == null) - throw new RuntimeException("element " + partName + " not found"); + throw new RuntimeException("element " + elementName + " not found"); return pd; } diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java index 8207c8b79..d9ed879ba 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelDescription.java @@ -1,20 +1,18 @@ package de.neemann.digital.gui.draw.model; import de.neemann.digital.core.*; +import de.neemann.digital.core.Observer; import de.neemann.digital.core.element.Element; import de.neemann.digital.core.element.ElementTypeDescription; import de.neemann.digital.gui.draw.elements.*; -import de.neemann.digital.gui.draw.library.PartLibrary; +import de.neemann.digital.gui.draw.library.ElementLibrary; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; +import java.util.*; /** * @author hneemann */ -public class ModelDescription { +public class ModelDescription implements Iterable { private final NetList netList; private final ArrayList entries; @@ -30,7 +28,7 @@ public class ModelDescription { * @param library the library * @throws PinException */ - public ModelDescription(Circuit circuit, PartLibrary library) throws PinException { + public ModelDescription(Circuit circuit, ElementLibrary library) throws PinException { entries = new ArrayList<>(); netList = new NetList(circuit.getWires()); for (VisualElement vp : circuit.getParts()) { @@ -117,4 +115,9 @@ public class ModelDescription { for (Net net : netList) net.setHighLight(false); } + + @Override + public Iterator iterator() { + return entries.iterator(); + } } diff --git a/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java b/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java index 5280e5cd0..d73759f36 100644 --- a/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java +++ b/src/main/java/de/neemann/digital/gui/draw/model/ModelEntry.java @@ -58,6 +58,10 @@ public class ModelEntry { visualElement.setState(ioState, guiObserver); } + public Pins getPins() { + return pins; + } + public Element getElement() { return element; } diff --git a/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java b/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java index 58df6512d..c40d291d7 100644 --- a/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java +++ b/src/main/java/de/neemann/digital/gui/draw/shapes/ShapeFactory.java @@ -14,7 +14,7 @@ import de.neemann.digital.core.io.Out; import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.core.wiring.Delay; import de.neemann.digital.core.wiring.Splitter; -import de.neemann.digital.gui.draw.library.PartLibrary; +import de.neemann.digital.gui.draw.library.ElementLibrary; import java.util.HashMap; @@ -32,7 +32,7 @@ public final class ShapeFactory { } public HashMap map = new HashMap<>(); - private PartLibrary library; + private ElementLibrary library; private ShapeFactory() { map.put(And.DESCRIPTION.getName(), new CreatorSimple("&", And.DESCRIPTION, false)); @@ -61,7 +61,7 @@ public final class ShapeFactory { } - public PartLibrary setLibrary(PartLibrary library) { + public ElementLibrary setLibrary(ElementLibrary library) { this.library = library; return library; }