added a description to signals

This commit is contained in:
hneemann 2016-06-02 21:30:58 +02:00
parent f4a23ced0e
commit dc95600749
19 changed files with 157 additions and 142 deletions

View File

@ -5,6 +5,7 @@ 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.flipflops.FlipflopD;
import de.neemann.digital.lang.Lang;
@ -20,8 +21,8 @@ import java.util.List;
public class ModelAnalyser {
private final Model model;
private final ArrayList<Model.Signal> inputs;
private final ArrayList<Model.Signal> outputs;
private final ArrayList<Signal> inputs;
private final ArrayList<Signal> outputs;
private final int rows;
/**
@ -46,10 +47,10 @@ public class ModelAnalyser {
if (!label.endsWith("n"))
label += "n";
outputs.add(i++, new Model.Signal(label + "+1", ff.getDInput()));
outputs.add(i++, new Signal(label + "+1", ff.getDInput()));
ObservableValue q = ff.getOutputs().get(0);
inputs.add(new Model.Signal(label, q));
inputs.add(new Signal(label, q));
ObservableValue notQ = ff.getOutputs().get(1);
if (notQ.observerCount() > 0)
@ -65,8 +66,8 @@ public class ModelAnalyser {
rows = 1 << inputs.size();
}
private ArrayList<Model.Signal> checkBinary(ArrayList<Model.Signal> list) throws AnalyseException {
for (Model.Signal s : list)
private ArrayList<Signal> checkBinary(ArrayList<Signal> list) throws AnalyseException {
for (Signal s : list)
if (s.getValue().getBits() != 1)
throw new AnalyseException(Lang.get("err_analyseValue_N_IsNotBinary", s.getName()));
return list;
@ -88,11 +89,11 @@ public class ModelAnalyser {
};
TruthTable tt = new TruthTable();
for (Model.Signal s : inputs)
for (Signal s : inputs)
tt.addVariable(s.getName());
ArrayList<BoolTableIntArray> data = new ArrayList<>();
for (Model.Signal s : outputs) {
for (Signal s : outputs) {
BoolTableIntArray e = new BoolTableIntArray(rows);
data.add(e);
tt.addResult(s.getName(), e);

View File

@ -372,27 +372,20 @@ public class Model {
/**
* registers a Signal to the model
*
* @param name the signals name
* @param value the signals value
* @param signal the signal
*/
public void addSignal(String name, ObservableValue value) {
if (isSignal(name, value))
signals.add(new Signal(name, value));
}
private static boolean isSignal(String name, ObservableValue value) {
return name != null && name.length() > 0 && value != null;
public void addSignal(Signal signal) {
if (signal.isValid())
signals.add(signal);
}
/**
* registers a input to the model
*
* @param name the signals name
* @param value the signals value
* @param signal the signal
*/
public void addInput(String name, ObservableValue value) {
if (isSignal(name, value)) {
Signal signal = new Signal(name, value);
public void addInput(Signal signal) {
if (signal.isValid()) {
signals.add(signal);
inputs.add(signal);
}
@ -408,12 +401,10 @@ public class Model {
/**
* registers a output to the model
*
* @param name the signals name
* @param value the signals value
* @param signal the signal
*/
public void addOutput(String name, ObservableValue value) {
if (isSignal(name, value)) {
Signal signal = new Signal(name, value);
public void addOutput(Signal signal) {
if (signal.isValid()) {
signals.add(signal);
outputs.add(signal);
}
@ -473,65 +464,6 @@ public class Model {
return nodes.size();
}
/**
* A simple storage bean for signals
*/
public static final class Signal implements Comparable<Signal> {
private final String name;
private final ObservableValue value;
/**
* Creates a new Instance
*
* @param name the name of the Signal
* @param value the signals value
*/
public Signal(String name, ObservableValue value) {
this.name = name;
this.value = value;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the value
*/
public ObservableValue getValue() {
return value;
}
@Override
public int compareTo(Signal o) {
return name.compareTo(o.name);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Signal signal = (Signal) o;
return name.equals(signal.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public String toString() {
return name;
}
}
/**
* Returns all nodes of the given class
*

View File

@ -0,0 +1,89 @@
package de.neemann.digital.core;
/**
* A simple storage bean for signals
*/
public final class Signal implements Comparable<Signal> {
private final String name;
private final ObservableValue value;
private String description;
/**
* Creates a new Instance
*
* @param name the name of the Signal
* @param value the signals value
*/
public Signal(String name, ObservableValue value) {
this.name = name;
this.value = value;
}
/**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the signals description
*/
public String getDescription() {
return description;
}
/**
* Sets the description
*
* @param description the description
* @return this for chained calls
*/
public Signal setDescription(String description) {
this.description = description;
return this;
}
/**
* @return the value
*/
public ObservableValue getValue() {
return value;
}
@Override
public int compareTo(Signal o) {
return name.compareTo(o.name);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Signal signal = (Signal) o;
return name.equals(signal.name);
}
@Override
public int hashCode() {
return name.hashCode();
}
@Override
public String toString() {
return name;
}
/**
* Returns true if this signal is a valid signal.
* Valid means there is a name and the value is non null
*
* @return true if signal is valid
*/
public boolean isValid() {
return name != null && name.length() > 0 && value != null;
}
}

View File

@ -84,7 +84,7 @@ public class FlipflopD extends Node implements Element {
public void registerNodes(Model model) {
super.registerNodes(model);
if (isProbe)
model.addSignal(label, q);
model.addSignal(new Signal(label, q));
}
/**

View File

@ -90,7 +90,7 @@ public class FlipflopJK extends Node implements Element {
public void registerNodes(Model model) {
super.registerNodes(model);
if (isProbe)
model.addSignal(label, q);
model.addSignal(new Signal(label, q));
}
}

View File

@ -84,7 +84,7 @@ public class FlipflopRS extends Node implements Element {
public void registerNodes(Model model) {
super.registerNodes(model);
if (isProbe)
model.addSignal(label, q);
model.addSignal(new Signal(label, q));
}
}

View File

@ -76,7 +76,7 @@ public class FlipflopT extends Node implements Element {
public void registerNodes(Model model) {
super.registerNodes(model);
if (isProbe)
model.addSignal(label, q);
model.addSignal(new Signal(label, q));
}
}

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.io;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -49,6 +46,6 @@ public class Button implements Element {
@Override
public void registerNodes(Model model) {
model.addSignal(label, output);
model.addSignal(new Signal(label, output));
}
}

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.io;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -39,6 +36,7 @@ public class In implements Element {
private final ObservableValue output;
private final String label;
private final String description;
/**
* Create a new instance
@ -50,6 +48,7 @@ public class In implements Element {
output = new ObservableValue("out", attributes.get(Keys.BITS), highZ);
output.setValue(attributes.get(Keys.DEFAULT));
label = attributes.getCleanLabel();
description = attributes.get(Keys.DESCRIPTION);
}
@Override
@ -64,6 +63,6 @@ public class In implements Element {
@Override
public void registerNodes(Model model) {
model.addInput(label, output);
model.addInput(new Signal(label, output).setDescription(description));
}
}

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.io;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -27,7 +24,7 @@ public class Out implements Element {
@Override
public String getDescription(ElementAttributes elementAttributes) {
String d = elementAttributes.get(Keys.DESCRIPTION);
if (d.length()>0)
if (d.length() > 0)
return d;
else
return Lang.get("elem_Out");
@ -72,6 +69,7 @@ public class Out implements Element {
private final int[] bits;
private final String label;
private final String description;
private ObservableValue value;
/**
@ -82,6 +80,7 @@ public class Out implements Element {
public Out(ElementAttributes attributes) {
bits = new int[]{attributes.getBits()};
label = attributes.getCleanLabel();
description = attributes.get(Keys.DESCRIPTION);
}
/**
@ -92,6 +91,7 @@ public class Out implements Element {
public Out(int... bits) {
this.bits = bits;
label = null;
description = null;
}
@Override
@ -110,6 +110,6 @@ public class Out implements Element {
@Override
public void registerNodes(Model model) {
model.addOutput(label, value);
model.addOutput(new Signal(label, value).setDescription(description));
}
}

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.io;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -51,7 +48,7 @@ public class Probe implements Element {
@Override
public void registerNodes(Model model) {
model.addSignal(label, value);
model.addSignal(new Signal(label, value));
}
}

View File

@ -78,6 +78,6 @@ public class Register extends Node implements Element {
public void registerNodes(Model model) {
super.registerNodes(model);
if (isProbe)
model.addSignal(label, q);
model.addSignal(new Signal(label, q));
}
}

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.wiring;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -57,7 +54,7 @@ public class Clock implements Element {
@Override
public void registerNodes(Model model) {
model.addClock(this);
model.addSignal(label, output);
model.addSignal(new Signal(label, output));
}
/**

View File

@ -2,6 +2,7 @@ package de.neemann.digital.draw.shapes;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.Observer;
import de.neemann.digital.core.Signal;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.Keys;
@ -68,10 +69,10 @@ public class DataShape implements Shape {
@Override
public void registerModel(ModelDescription modelDescription, Model model, ModelEntry element) {
ArrayList<Model.Signal> signals = model.getSignalsCopy();
new OrderMerger<String, Model.Signal>(modelDescription.getCircuit().getMeasurementOrdering()) {
ArrayList<Signal> signals = model.getSignalsCopy();
new OrderMerger<String, Signal>(modelDescription.getCircuit().getMeasurementOrdering()) {
@Override
public boolean equals(Model.Signal a, String b) {
public boolean equals(Signal a, String b) {
return a.getName().equals(b);
}
}.order(signals);

View File

@ -513,7 +513,7 @@ public class Main extends JFrame implements ClosingWindowListener.ConfirmSave, E
Model m = new ModelDescription(circuitComponent.getCircuit(), library).createModel(false);
elementState.activate();
ArrayList<String> names = new ArrayList<>();
for (Model.Signal s : m.getSignals())
for (Signal s : m.getSignals())
names.add(s.getName());
new OrderMerger<String, String>(circuitComponent.getCircuit().getMeasurementOrdering()).order(names);
ElementOrderer.ListOrder<String> o = new ElementOrderer.ListOrder<>(names);

View File

@ -3,6 +3,7 @@ package de.neemann.digital.gui.components;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelStateObserver;
import de.neemann.digital.core.Signal;
import de.neemann.digital.lang.Lang;
import javax.swing.*;
@ -36,10 +37,10 @@ public class ProbeDialog extends JDialog implements ModelStateObserver {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
this.type = type;
ArrayList<Model.Signal> signals = model.getSignalsCopy();
new OrderMerger<String, Model.Signal>(ordering) {
ArrayList<Signal> signals = model.getSignalsCopy();
new OrderMerger<String, Signal>(ordering) {
@Override
public boolean equals(Model.Signal a, String b) {
public boolean equals(Signal a, String b) {
return a.getName().equals(b);
}
}.order(signals);
@ -75,10 +76,10 @@ public class ProbeDialog extends JDialog implements ModelStateObserver {
}
private static class SignalTableModel implements TableModel {
private final ArrayList<Model.Signal> signals;
private final ArrayList<Signal> signals;
private ArrayList<TableModelListener> listeners = new ArrayList<>();
SignalTableModel(ArrayList<Model.Signal> signals) {
SignalTableModel(ArrayList<Signal> signals) {
this.signals = signals;
}

View File

@ -1,6 +1,6 @@
package de.neemann.digital.gui.components.data;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.Signal;
import java.io.BufferedWriter;
import java.io.IOException;
@ -71,7 +71,7 @@ public class DataSample {
* @param signals the signals to create a sample from
* @return the sample to allow chained calls
*/
public DataSample fillWith(ArrayList<Model.Signal> signals) {
public DataSample fillWith(ArrayList<Signal> signals) {
for (int i = 0; i < signals.size(); i++)
values[i] = signals.get(i).getValue().getValueIgnoreBurn();
return this;

View File

@ -1,6 +1,6 @@
package de.neemann.digital.gui.components.data;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.Signal;
import de.neemann.digital.draw.graphics.Graphic;
import de.neemann.digital.draw.graphics.Orientation;
import de.neemann.digital.draw.graphics.Style;
@ -18,7 +18,7 @@ import java.util.Iterator;
* @author hneemann
*/
public class DataSet implements Iterable<DataSample>, Drawable {
private final ArrayList<Model.Signal> signals;
private final ArrayList<Signal> signals;
private final int maxSize;
private final ArrayList<DataSample> samples;
private final int maxTextLength;
@ -34,11 +34,11 @@ public class DataSet implements Iterable<DataSample>, Drawable {
add(new DataSample(1, signalSize()).setValue(1, 1));
}
private static ArrayList<Model.Signal> createDummy() {
ArrayList<Model.Signal> list = new ArrayList<>();
list.add(new Model.Signal("A", null));
list.add(new Model.Signal("B", null));
list.add(new Model.Signal("C", null));
private static ArrayList<Signal> createDummy() {
ArrayList<Signal> list = new ArrayList<>();
list.add(new Signal("A", null));
list.add(new Signal("B", null));
list.add(new Signal("C", null));
return list;
}
@ -48,7 +48,7 @@ public class DataSet implements Iterable<DataSample>, Drawable {
* @param signals the signals used to collect DataSamples
* @param maxSize max size of data elements
*/
public DataSet(ArrayList<Model.Signal> signals, int maxSize) {
public DataSet(ArrayList<Signal> signals, int maxSize) {
this.signals = signals;
this.maxSize = maxSize;
samples = new ArrayList<>();
@ -142,7 +142,7 @@ public class DataSet implements Iterable<DataSample>, Drawable {
* @param i the index
* @return the signal
*/
public Model.Signal getSignal(int i) {
public Signal getSignal(int i) {
return signals.get(i);
}
@ -213,7 +213,7 @@ public class DataSet implements Iterable<DataSample>, Drawable {
/**
* @return the signals stored
*/
public ArrayList<Model.Signal> getSignals() {
public ArrayList<Signal> getSignals() {
return signals;
}
@ -236,7 +236,7 @@ public class DataSet implements Iterable<DataSample>, Drawable {
public void saveCSV(BufferedWriter w) throws IOException {
try {
w.write("\"step\"");
for (Model.Signal s : signals)
for (Signal s : signals)
w.write(",\"" + s.getName() + '"');
w.write("\n");
for (DataSample s : samples) {

View File

@ -3,6 +3,7 @@ package de.neemann.digital.gui.components.data;
import de.neemann.digital.core.Model;
import de.neemann.digital.core.ModelEvent;
import de.neemann.digital.core.ModelStateObserver;
import de.neemann.digital.core.Signal;
import de.neemann.digital.gui.components.OrderMerger;
import de.neemann.digital.lang.Lang;
import de.neemann.gui.ErrorMessage;
@ -44,10 +45,10 @@ public class DataSetDialog extends JDialog implements ModelStateObserver {
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
setAlwaysOnTop(true);
ArrayList<Model.Signal> signals = model.getSignalsCopy();
new OrderMerger<String, Model.Signal>(ordering) {
ArrayList<Signal> signals = model.getSignalsCopy();
new OrderMerger<String, Signal>(ordering) {
@Override
public boolean equals(Model.Signal a, String b) {
public boolean equals(Signal a, String b) {
return a.getName().equals(b);
}
}.order(signals);