diff --git a/src/main/java/de/neemann/digital/lang/Lang.java b/src/main/java/de/neemann/digital/lang/Lang.java
index f70df61d8..8440fce06 100644
--- a/src/main/java/de/neemann/digital/lang/Lang.java
+++ b/src/main/java/de/neemann/digital/lang/Lang.java
@@ -5,6 +5,7 @@ import de.neemann.gui.language.Language;
import de.neemann.gui.language.Resources;
import java.text.MessageFormat;
+import java.util.Arrays;
import java.util.Locale;
import java.util.prefs.Preferences;
@@ -90,6 +91,7 @@ public final class Lang {
else
currentLanguage = new Language("en");
}
+
/**
* Only used for generation of documentation
*
@@ -111,9 +113,9 @@ public final class Lang {
// if the 'testdata' system property is set, let the test fail!
// If we are in production usage, don't let the program crash, simply return the key itself instead!
if (System.getProperty("testdata") != null)
- throw new Error("missing laguage key '" + key + "'");
+ throw new Error("missing language key '" + key + "'");
- return key;
+ return key + " " + Arrays.asList(params).toString();
}
}
diff --git a/src/main/java/de/neemann/digital/testing/TestResult.java b/src/main/java/de/neemann/digital/testing/TestResult.java
index 7c41fef55..6cb370a5a 100644
--- a/src/main/java/de/neemann/digital/testing/TestResult.java
+++ b/src/main/java/de/neemann/digital/testing/TestResult.java
@@ -61,14 +61,14 @@ public class TestResult {
final int index = getIndexOf(s.getName());
if (index >= 0) {
inputs.add(new TestSignal(index, s.getValue()));
- usedSignals.add(s.getName());
+ addTo(usedSignals, s.getName());
}
}
for (Clock c : model.getClocks()) {
final int index = getIndexOf(c.getLabel());
if (index >= 0) {
inputs.add(new TestSignal(index, c.getClockOutput()));
- usedSignals.add(c.getLabel());
+ addTo(usedSignals, c.getLabel());
}
}
@@ -77,7 +77,7 @@ public class TestResult {
final int index = getIndexOf(s.getName());
if (index >= 0) {
outputs.add(new TestSignal(index, s.getValue()));
- usedSignals.add(s.getName());
+ addTo(usedSignals, s.getName());
}
}
@@ -107,6 +107,12 @@ public class TestResult {
return this;
}
+ private void addTo(HashSet signals, String name) throws TestingDataException {
+ if (signals.contains(name))
+ throw new TestingDataException(Lang.get("err_nameUsedTwice_N", name));
+ signals.add(name);
+ }
+
private void checkRow(Model model, Value[] row) {
Value[] res = new Value[row.length];
diff --git a/src/main/java/de/neemann/digital/testing/parser/Parser.java b/src/main/java/de/neemann/digital/testing/parser/Parser.java
index 9ac0cd6fd..eec58085d 100644
--- a/src/main/java/de/neemann/digital/testing/parser/Parser.java
+++ b/src/main/java/de/neemann/digital/testing/parser/Parser.java
@@ -54,7 +54,10 @@ public class Parser {
Tokenizer.Token token = tok.simpleIdent();
switch (token) {
case IDENT:
- names.add(tok.getIdent());
+ final String name = tok.getIdent();
+ if (names.contains(name))
+ throw new ParserException(Lang.get("err_nameUsedTwice_N", name));
+ names.add(name);
break;
case EOL:
return;
diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml
index 44fd7ad89..db98fd72b 100644
--- a/src/main/resources/lang/lang_de.xml
+++ b/src/main/resources/lang/lang_de.xml
@@ -424,7 +424,8 @@ Die gesammte Speichergröße beträgt damit damit dx*dy*2 Speicherworte.Die Nummer der aktuellen Spalte, dessen Zustand gerade am anderen Eingang anliegt.
Transmissionsgatter
- Ein reales Transmissionsgatter ist aus nur zwei Transistoren aufgebaut.
+ Ein reales Transmissionsgatter ist aus nur zwei Transistoren aufgebaut.
+ Daher wird es oft eingesetzt um Transistoren einzusparen.
Eingang A
Eingang_B
Steuereingang
@@ -523,6 +524,7 @@ Sind evtl. die Namen der Variablen nicht eindeutig?
Es sind nur {1} Bits erlaubt, es sind jedoch {0} Bits angegeben!
Es sind keine Flipflops mit mehr als einem Bit erlaubt!
Die Steuereingänge eines Transmission-Gates müssen invertiert beschaltet werden!
+ Signal {0} wurde mehrfach verwendet!
Adress-Bits
Anzahl der Adress-Bits die verwendet werden.
diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml
index ec20fc728..a3c852453 100644
--- a/src/main/resources/lang/lang_en.xml
+++ b/src/main/resources/lang/lang_en.xml
@@ -414,7 +414,8 @@
The number of the current column whose state is currently visible at the other input.
Transmission-Gate
- A real transmission-gate is build from only two transistors.
+ A real transmission-gate is build from only two transistors.
+ Therefore, it is often used to save transistors during implementation on silicon.
input A
input B
control input.
@@ -513,6 +514,7 @@ The names of the variables may not be unique.
Only {1} bits allowed, but {0} bits found!
Flipflops with more then one bits are not allowed!
The two control inputs of a transmission gate must be inverted!
+ Signal {0} is used twice!
Address Bits
Number of address bits used.