diff --git a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java index b4bb139de..a70f1fa7d 100644 --- a/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java +++ b/src/main/java/de/neemann/digital/analyse/ModelAnalyser.java @@ -33,6 +33,7 @@ public class ModelAnalyser { private final ArrayList inputs; private final ArrayList outputs; private final int rows; + private int uniqueIndex = 0; /** * Creates a new instance @@ -69,7 +70,7 @@ public class ModelAnalyser { ff.getDInput().removeObserver(ff); // turn off flipflop String label = ff.getLabel(); if (label.length() == 0) - throw new AnalyseException(Lang.get("err_DFlipflopWithoutALabel")); + label = createUniqueName(ff); if (!label.endsWith("n")) label += "n"; @@ -95,6 +96,21 @@ public class ModelAnalyser { rows = 1 << inputs.size(); } + private String createUniqueName(FlipflopD ff) { + ObservableValue q = ff.getOutputs().get(0); + for (Signal o : outputs) { + if (o.getValue() == q) + return o.getName(); + } + + String name; + do { + name = "Z" + uniqueIndex; + uniqueIndex++; + } while (inputs.contains(new Signal(name, null))); + return name; + } + private void checkUnique(ArrayList signals) throws AnalyseException { for (int i = 0; i < signals.size() - 1; i++) for (int j = i + 1; j < signals.size(); j++) @@ -127,31 +143,35 @@ public class ModelAnalyser { Splitter insp = Splitter.createOneToN(ff.getBits()); insp.setInputs(new ObservableValues(ff.getDInput())); + ff.getDInput().fireHasChanged(); Splitter outsp = Splitter.createNToOne(ff.getBits()); - Splitter noutsp = Splitter.createNToOne(ff.getBits()); - ObservableValues.Builder spinput = new ObservableValues.Builder(); - ObservableValues.Builder spninput = new ObservableValues.Builder(); + String label = ff.getLabel(); + if (label.length() == 0) + label = createUniqueName(ff); for (int i = 0; i < ff.getBits(); i++) { ObservableValue qn = new ObservableValue("", 1); ObservableValue nqn = new ObservableValue("", 1); - FlipflopD newff = new FlipflopD(ff.getLabel() + i, qn, nqn); + FlipflopD newff = new FlipflopD(label + i, qn, nqn); spinput.add(qn); - spninput.add(nqn); - newff.setInputs(new ObservableValues(insp.getOutputs().get(i), getClock())); model.add(newff); + newff.setInputs(new ObservableValues(insp.getOutputs().get(i), getClock())); out.add(newff); } outsp.setInputs(spinput.build()); - noutsp.setInputs(spninput.build()); + for (ObservableValue v : spinput) + v.fireHasChanged(); - final FlipflopD oldff = ff; + final ObservableValue qout = ff.getOutputs().get(0); + final ObservableValue nqout = ff.getOutputs().get(1); ObservableValue spq = outsp.getOutputs().get(0); - spq.addObserver(() -> oldff.getOutputs().get(0).setValue(spq.getValue())); - ObservableValue spnq = noutsp.getOutputs().get(0); - spnq.addObserver(() -> oldff.getOutputs().get(1).setValue(spnq.getValue())); + spq.addObserver(() -> { + final long value = spq.getValue(); + qout.setValue(value); + nqout.setValue(~value); + }); } catch (NodeException e) { throw new AnalyseException(e); diff --git a/src/main/java/de/neemann/digital/core/ObservableValues.java b/src/main/java/de/neemann/digital/core/ObservableValues.java index 0b18eff4d..c5f165519 100644 --- a/src/main/java/de/neemann/digital/core/ObservableValues.java +++ b/src/main/java/de/neemann/digital/core/ObservableValues.java @@ -5,6 +5,7 @@ import de.neemann.digital.core.element.ImmutableList; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Iterator; /** * @author hneemann @@ -14,7 +15,7 @@ public class ObservableValues extends ImmutableList { /** * Builder for ObservableValues */ - public static class Builder { + public static class Builder implements Iterable { private ArrayList values; /** @@ -52,6 +53,11 @@ public class ObservableValues extends ImmutableList { public ObservableValues build() { return new ObservableValues(values); } + + @Override + public Iterator iterator() { + return values.iterator(); + } } diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index db98fd72b..72b8ce3d7 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -432,7 +432,6 @@ Die gesammte Speichergröße beträgt damit damit dx*dy*2 Speicherworte.Steuereingang, invertiert Fehler - Flipflop hat keine Bezeichnung! Pin {0} in Element {1} ist werder Eingang noch Ausgang Es muss genau ein Taktelement geben. Alle Flipflops müssen an diesem Takt hängen. Die Schaltung hat keine benannten Eingänge diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index a3c852453..4e8cfc84a 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -422,7 +422,6 @@ inverted control input Error - D-flip-flop has no label set Pin {0} in component {1} is not a input or output A single clock component is necessary. All flip-flops must use this clock signal. The circuit has no Inputs