From 3848d8985a9a8b5ab009e7dc204c166a11a994c9 Mon Sep 17 00:00:00 2001 From: hneemann Date: Fri, 3 Jun 2016 11:35:59 +0200 Subject: [PATCH] Nodes now has a state flag which is true if the node has a state. Combinatorial elements don't have a state, flipflops do. --- .../digital/analyse/ModelAnalyser.java | 9 ++--- .../java/de/neemann/digital/core/Model.java | 33 +++++-------------- .../java/de/neemann/digital/core/Node.java | 24 ++++++++++++++ .../digital/core/flipflops/FlipflopD.java | 1 + .../digital/core/flipflops/FlipflopJK.java | 1 + .../digital/core/flipflops/FlipflopRS.java | 1 + .../digital/core/flipflops/FlipflopT.java | 1 + .../neemann/digital/core/memory/Counter.java | 1 + .../digital/core/memory/RAMDualPort.java | 1 + .../de/neemann/digital/core/memory/ROM.java | 10 +++--- .../neemann/digital/core/memory/Register.java | 1 + .../java/de/neemann/digital/gui/Main.java | 13 ++++---- src/main/resources/lang/lang_de.properties | 1 + src/main/resources/lang/lang_en.properties | 1 + 14 files changed, 58 insertions(+), 40 deletions(-) diff --git a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java index 44b597867..5d0c2304a 100644 --- a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java +++ b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java @@ -2,10 +2,7 @@ package de.neemann.digital.analyse; import de.neemann.digital.analyse.expression.BitSetter; import de.neemann.digital.analyse.quinemc.BoolTableIntArray; -import de.neemann.digital.core.Model; -import de.neemann.digital.core.NodeException; -import de.neemann.digital.core.ObservableValue; -import de.neemann.digital.core.Signal; +import de.neemann.digital.core.*; import de.neemann.digital.core.flipflops.FlipflopD; import de.neemann.digital.lang.Lang; @@ -36,6 +33,10 @@ public class ModelAnalyser { inputs = checkBinary(model.getInputs()); outputs = checkBinary(model.getOutputs()); + for (Node n : model) + if (n.hasState() && !(n instanceof FlipflopD)) + throw new AnalyseException(Lang.get("err_cannotAnalyse_N", n.getClass().getSimpleName())); + int i = 0; List flipflops = model.findNode(FlipflopD.class); for (FlipflopD ff : flipflops) { diff --git a/src/main/java/de/neemann/digital/core/Model.java b/src/main/java/de/neemann/digital/core/Model.java index 261080f5e..8d49583fb 100644 --- a/src/main/java/de/neemann/digital/core/Model.java +++ b/src/main/java/de/neemann/digital/core/Model.java @@ -1,15 +1,11 @@ package de.neemann.digital.core; -import de.neemann.digital.core.memory.ROM; import de.neemann.digital.core.wiring.Break; import de.neemann.digital.core.wiring.Clock; import de.neemann.digital.core.wiring.Reset; import de.neemann.digital.lang.Lang; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; +import java.util.*; /** * The Model contains all the nodes of the model. @@ -38,7 +34,7 @@ import java.util.List; * @author hneemann * @see de.neemann.digital.core.element.Element#registerNodes(Model) */ -public class Model { +public class Model implements Iterable { /** * Maximal number of calculation loops before oscillating behaviour is detected */ @@ -47,10 +43,10 @@ public class Model { private final ArrayList clocks; private final ArrayList breaks; private final ArrayList resets; + private final ArrayList signals; private final ArrayList inputs; private final ArrayList outputs; - private final ArrayList roms; private final ArrayList nodes; private final ArrayList observers; @@ -69,7 +65,6 @@ public class Model { this.signals = new ArrayList<>(); this.outputs = new ArrayList<>(); this.inputs = new ArrayList<>(); - this.roms = new ArrayList<>(); this.nodes = new ArrayList<>(); this.nodesToUpdateAct = new ArrayList<>(); this.nodesToUpdateNext = new ArrayList<>(); @@ -433,23 +428,6 @@ public class Model { return n; } - - /** - * registers a ROM to the model - * - * @param rom the ROM - */ - public void addRomListing(ROM rom) { - roms.add(rom); - } - - /** - * @return all registered Roms - */ - public ArrayList getRoms() { - return roms; - } - /** * fires a model changed event to all listeners */ @@ -478,4 +456,9 @@ public class Model { found.add((NODE) n); return found; } + + @Override + public Iterator iterator() { + return nodes.iterator(); + } } diff --git a/src/main/java/de/neemann/digital/core/Node.java b/src/main/java/de/neemann/digital/core/Node.java index d3f53cfb9..ed68d0f40 100644 --- a/src/main/java/de/neemann/digital/core/Node.java +++ b/src/main/java/de/neemann/digital/core/Node.java @@ -9,9 +9,26 @@ package de.neemann.digital.core; */ public abstract class Node implements Observer { + private final boolean hasState; private Model model; private int version; + /** + * Creates new stateless Node + */ + public Node() { + this(false); + } + + /** + * Creates a new node + * + * @param hasState true if node has a state + */ + public Node(boolean hasState) { + this.hasState = hasState; + } + /** * Sets the model for this node. * @@ -58,4 +75,11 @@ public abstract class Node implements Observer { model.add(this); } + /** + * @return true if the element has a state and is not only combinatorial + */ + public boolean hasState() { + return hasState; + } + } diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java index e7eaa4bcf..72c84d786 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopD.java @@ -44,6 +44,7 @@ public class FlipflopD extends Node implements Element { * @param attributes the attributes */ public FlipflopD(ElementAttributes attributes) { + super(true); bits = attributes.getBits(); this.q = new ObservableValue("Q", bits); this.qn = new ObservableValue("\u00ACQ", bits); diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java index f0313db6e..1f79059b0 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopJK.java @@ -43,6 +43,7 @@ public class FlipflopJK extends Node implements Element { * @param attributes the attributes */ public FlipflopJK(ElementAttributes attributes) { + super(true); this.q = new ObservableValue("Q", 1); this.qn = new ObservableValue("\u00ACQ", 1); isProbe = attributes.get(Keys.VALUE_IS_PROBE); diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopRS.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopRS.java index 77c59b4c2..bc4912fc5 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopRS.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopRS.java @@ -43,6 +43,7 @@ public class FlipflopRS extends Node implements Element { * @param attributes the attributes */ public FlipflopRS(ElementAttributes attributes) { + super(true); this.q = new ObservableValue("Q", 1); this.qn = new ObservableValue("\u00ACQ", 1); isProbe = attributes.get(Keys.VALUE_IS_PROBE); diff --git a/src/main/java/de/neemann/digital/core/flipflops/FlipflopT.java b/src/main/java/de/neemann/digital/core/flipflops/FlipflopT.java index 610c6c8a1..75d76ec38 100644 --- a/src/main/java/de/neemann/digital/core/flipflops/FlipflopT.java +++ b/src/main/java/de/neemann/digital/core/flipflops/FlipflopT.java @@ -41,6 +41,7 @@ public class FlipflopT extends Node implements Element { * @param attributes the attributes */ public FlipflopT(ElementAttributes attributes) { + super(true); this.q = new ObservableValue("Q", 1); this.qn = new ObservableValue("\u00ACQ", 1); isProbe = attributes.get(Keys.VALUE_IS_PROBE); diff --git a/src/main/java/de/neemann/digital/core/memory/Counter.java b/src/main/java/de/neemann/digital/core/memory/Counter.java index 8a9f61550..91dec380c 100644 --- a/src/main/java/de/neemann/digital/core/memory/Counter.java +++ b/src/main/java/de/neemann/digital/core/memory/Counter.java @@ -39,6 +39,7 @@ public class Counter extends Node implements Element { * @param attributes the elements attributes */ public Counter(ElementAttributes attributes) { + super(true); int bits = attributes.getBits(); this.out = new ObservableValue("out", bits); this.ovf = new ObservableValue("ovf", 1); diff --git a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java index 813ae54b4..cd05679c5 100644 --- a/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java +++ b/src/main/java/de/neemann/digital/core/memory/RAMDualPort.java @@ -53,6 +53,7 @@ public class RAMDualPort extends Node implements Element, RAMInterface { * @param attr the elemets attributes */ public RAMDualPort(ElementAttributes attr) { + super(true); bits = attr.get(Keys.BITS); output = createOutput(); addrBits = attr.get(Keys.ADDR_BITS); diff --git a/src/main/java/de/neemann/digital/core/memory/ROM.java b/src/main/java/de/neemann/digital/core/memory/ROM.java index b779a7b57..54ff79623 100644 --- a/src/main/java/de/neemann/digital/core/memory/ROM.java +++ b/src/main/java/de/neemann/digital/core/memory/ROM.java @@ -106,11 +106,11 @@ public class ROM extends Node implements Element { return listFile; } - @Override - public void setModel(Model model) { - super.setModel(model); - if (showList && listFile != null) - model.addRomListing(this); + /** + * @return true if there is a listing to show + */ + public boolean showListing() { + return showList && listFile != null; } /** diff --git a/src/main/java/de/neemann/digital/core/memory/Register.java b/src/main/java/de/neemann/digital/core/memory/Register.java index 95c919e28..4eb19cb6a 100644 --- a/src/main/java/de/neemann/digital/core/memory/Register.java +++ b/src/main/java/de/neemann/digital/core/memory/Register.java @@ -42,6 +42,7 @@ public class Register extends Node implements Element { * @param attributes the elements attributes */ public Register(ElementAttributes attributes) { + super(true); bits = attributes.getBits(); this.q = new ObservableValue("Q", bits); isProbe = attributes.get(Keys.VALUE_IS_PROBE); diff --git a/src/main/java/de/neemann/digital/gui/Main.java b/src/main/java/de/neemann/digital/gui/Main.java index 332b6b513..cce758f05 100644 --- a/src/main/java/de/neemann/digital/gui/Main.java +++ b/src/main/java/de/neemann/digital/gui/Main.java @@ -625,12 +625,13 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E if (settings.get(Keys.SHOW_LISTING)) { int i = 0; - for (ROM rom : model.getRoms()) - try { - windowPosManager.register("rom" + (i++), new ROMListingDialog(this, rom)).setVisible(true); - } catch (IOException e) { - new ErrorMessage(Lang.get("msg_errorReadingListing_N0", rom.getListFile().toString())).addCause(e).show(this); - } + for (ROM rom : model.findNode(ROM.class)) + if (rom.showListing()) + try { + windowPosManager.register("rom" + (i++), new ROMListingDialog(this, rom)).setVisible(true); + } catch (IOException e) { + new ErrorMessage(Lang.get("msg_errorReadingListing_N0", rom.getListFile().toString())).addCause(e).show(this); + } } diff --git a/src/main/resources/lang/lang_de.properties b/src/main/resources/lang/lang_de.properties index 86ae55299..90f8ecf6a 100644 --- a/src/main/resources/lang/lang_de.properties +++ b/src/main/resources/lang/lang_de.properties @@ -196,6 +196,7 @@ err_pinMap_noEqualsfound=Kein \"=\" gefunden! err_pinMap_NoNameForPin_N=Kein Name f\u00FCr Pin {0} err_pinMap_input_N_notAllowed=Eingang {0} ist nicht erlaubt! err_pinMap_output_N_notAllowed=Ausgang {0} ist nicht erlaubt! +err_cannotAnalyse_N=Element {0} kann nicht analysiert werden. attr_dialogTitle=Eigenschaften msg_errorEditingValue=Fehler bei der Eingabe eines Wertes diff --git a/src/main/resources/lang/lang_en.properties b/src/main/resources/lang/lang_en.properties index fa2b5a5d1..fe9079b3d 100644 --- a/src/main/resources/lang/lang_en.properties +++ b/src/main/resources/lang/lang_en.properties @@ -176,6 +176,7 @@ err_pinMap_noEqualsfound=No = found! err_pinMap_NoNameForPin_N=No Name for pin {0} err_pinMap_input_N_notAllowed=Input {0} not allowed! err_pinMap_output_N_notAllowed=Output {0} not allowed! +err_cannotAnalyse_N=Cannot analyse Node {0} attr_dialogTitle=Attributes