Nodes now has a state flag which is true if the node has a state.

Combinatorial elements don't have a state, flipflops do.
This commit is contained in:
hneemann 2016-06-03 11:35:59 +02:00
parent a19c191076
commit 3848d8985a
14 changed files with 58 additions and 40 deletions

View File

@ -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<FlipflopD> flipflops = model.findNode(FlipflopD.class);
for (FlipflopD ff : flipflops) {

View File

@ -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<Node> {
/**
* Maximal number of calculation loops before oscillating behaviour is detected
*/
@ -47,10 +43,10 @@ public class Model {
private final ArrayList<Clock> clocks;
private final ArrayList<Break> breaks;
private final ArrayList<Reset> resets;
private final ArrayList<Signal> signals;
private final ArrayList<Signal> inputs;
private final ArrayList<Signal> outputs;
private final ArrayList<ROM> roms;
private final ArrayList<Node> nodes;
private final ArrayList<ModelStateObserver> 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<ROM> 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<Node> iterator() {
return nodes.iterator();
}
}

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;
}
/**

View File

@ -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);

View File

@ -625,7 +625,8 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
if (settings.get(Keys.SHOW_LISTING)) {
int i = 0;
for (ROM rom : model.getRoms())
for (ROM rom : model.findNode(ROM.class))
if (rom.showListing())
try {
windowPosManager.register("rom" + (i++), new ROMListingDialog(this, rom)).setVisible(true);
} catch (IOException e) {

View File

@ -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

View File

@ -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