diff --git a/src/main/dig/74xx/lib/74116.dig b/src/main/dig/74xx/lib/74116.dig
index 0a324aba2..033194b9b 100644
--- a/src/main/dig/74xx/lib/74116.dig
+++ b/src/main/dig/74xx/lib/74116.dig
@@ -6,6 +6,10 @@
isDIL
true
+
+ Description
+ Dual 4-bit D-type latches
+
lockedMode
true
diff --git a/src/main/dig/74xx/lib/74138.dig b/src/main/dig/74xx/lib/74138.dig
index 058bd6c8d..9a50b5c8a 100644
--- a/src/main/dig/74xx/lib/74138.dig
+++ b/src/main/dig/74xx/lib/74138.dig
@@ -8,7 +8,7 @@
Description
- 3-line to 8-line decoder/demultiplexer
+ 3-line to 8-line decoder/demultiplexer, inverted out
lockedMode
diff --git a/src/main/dig/74xx/lib/74139.dig b/src/main/dig/74xx/lib/74139.dig
index ab3f28194..5f2ff6907 100644
--- a/src/main/dig/74xx/lib/74139.dig
+++ b/src/main/dig/74xx/lib/74139.dig
@@ -8,7 +8,11 @@
Description
- 3-line to 8-line decoder/demultiplexer
+ Dual 2-line to 4-line decoder/demultiplexer
+
+
+ lockedMode
+ true
diff --git a/src/main/dig/74xx/lib/74147.dig b/src/main/dig/74xx/lib/74147.dig
new file mode 100644
index 000000000..4d23aae37
--- /dev/null
+++ b/src/main/dig/74xx/lib/74147.dig
@@ -0,0 +1,1016 @@
+
+
+ 1
+
+
+ isDIL
+ true
+
+
+ pinCount
+ 16
+
+
+ Description
+ 10-line to 4-line priority encoder
+
+
+ lockedMode
+ true
+
+
+
+
+ Or
+
+
+ Inputs
+ 5
+
+
+
+
+
+ And
+
+
+ Inputs
+ 5
+
+
+
+
+
+ And
+
+
+ Inputs
+ 5
+
+
+
+
+
+ And
+
+
+ Inputs
+ 4
+
+
+
+
+
+ And
+
+
+ Inputs
+ 3
+
+
+
+
+
+ And
+
+
+
+
+ Or
+
+
+ Inputs
+ 5
+
+
+
+
+
+ And
+
+
+ Inputs
+ 4
+
+
+
+
+
+ And
+
+
+ Inputs
+ 3
+
+
+
+
+
+ And
+
+
+ Inputs
+ 3
+
+
+
+
+
+ Or
+
+
+ Inputs
+ 3
+
+
+
+
+
+ And
+
+
+ Inputs
+ 4
+
+
+
+
+
+ And
+
+
+
+
+ Not
+
+
+ rotation
+
+
+
+
+
+
+ Not
+
+
+ rotation
+
+
+
+
+
+
+ Not
+
+
+ rotation
+
+
+
+
+
+
+ Not
+
+
+ rotation
+
+
+
+
+
+
+ Not
+
+
+ rotation
+
+
+
+
+
+
+ Not
+
+
+ rotation
+
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I9
+
+
+ pinNumber
+ 10
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I8
+
+
+ pinNumber
+ 5
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I7
+
+
+ pinNumber
+ 4
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I6
+
+
+ pinNumber
+ 3
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I5
+
+
+ pinNumber
+ 2
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I4
+
+
+ pinNumber
+ 1
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I3
+
+
+ pinNumber
+ 13
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I2
+
+
+ pinNumber
+ 12
+
+
+
+
+
+ In
+
+
+ rotation
+
+
+
+ Label
+ I1
+
+
+ pinNumber
+ 11
+
+
+
+
+
+ Out
+
+
+ Label
+ A
+
+
+ pinNumber
+ 9
+
+
+ Inputs
+ 1
+
+
+
+
+
+ Out
+
+
+ Label
+ B
+
+
+ pinNumber
+ 7
+
+
+ Inputs
+ 1
+
+
+
+
+
+ Out
+
+
+ Label
+ C
+
+
+ pinNumber
+ 6
+
+
+ Inputs
+ 1
+
+
+
+
+
+ Out
+
+
+ Label
+ D
+
+
+ pinNumber
+ 14
+
+
+ Inputs
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/dig/74xx/lib/74162.dig b/src/main/dig/74xx/lib/74162.dig
index d1205aab9..96cf0947f 100644
--- a/src/main/dig/74xx/lib/74162.dig
+++ b/src/main/dig/74xx/lib/74162.dig
@@ -20,6 +20,10 @@ counter; synchronous reset
255
+
+ lockedMode
+ true
+
diff --git a/src/main/dig/74xx/lib/74198.dig b/src/main/dig/74xx/lib/74198.dig
index 271408898..67c4e0f8d 100644
--- a/src/main/dig/74xx/lib/74198.dig
+++ b/src/main/dig/74xx/lib/74198.dig
@@ -6,6 +6,10 @@
isDIL
true
+
+ Description
+ 8-BIT SHIFT REGISTERS
+
lockedMode
true
diff --git a/src/main/dig/74xx/lib/74238.dig b/src/main/dig/74xx/lib/74238.dig
index 62e65c628..470f6c82c 100644
--- a/src/main/dig/74xx/lib/74238.dig
+++ b/src/main/dig/74xx/lib/74238.dig
@@ -10,6 +10,10 @@
Description
3-line to 8-line decoder/demultiplexer
+
+ lockedMode
+ true
+
diff --git a/src/main/dig/74xx/lib/74260.dig b/src/main/dig/74xx/lib/74260.dig
index 5de240591..921c10dda 100644
--- a/src/main/dig/74xx/lib/74260.dig
+++ b/src/main/dig/74xx/lib/74260.dig
@@ -10,6 +10,10 @@
Description
DUAL 5-INPUT NOR GATE
+
+ lockedMode
+ true
+
diff --git a/src/main/dig/74xx/lib/7447.dig b/src/main/dig/74xx/lib/7447.dig
index 3e943de81..3825f1fa4 100644
--- a/src/main/dig/74xx/lib/7447.dig
+++ b/src/main/dig/74xx/lib/7447.dig
@@ -8,7 +8,11 @@
Description
- BCD to 7-segment decoder
+ BCD to 7-segment decoder, active high
+
+
+ lockedMode
+ true
diff --git a/src/main/dig/74xx/lib/7448.dig b/src/main/dig/74xx/lib/7448.dig
index aa01ba894..5f3ab38bd 100644
--- a/src/main/dig/74xx/lib/7448.dig
+++ b/src/main/dig/74xx/lib/7448.dig
@@ -8,7 +8,11 @@
Description
- BCD to 7-segment decoder
+ BCD to 7-segment decoder, active low
+
+
+ lockedMode
+ true
diff --git a/src/main/dig/74xx/lib/7451.dig b/src/main/dig/74xx/lib/7451.dig
index 8234f5d40..930d12a0c 100644
--- a/src/main/dig/74xx/lib/7451.dig
+++ b/src/main/dig/74xx/lib/7451.dig
@@ -10,6 +10,10 @@
Description
2-Input/3-Input And-Or invert Gate
+
+ lockedMode
+ true
+
diff --git a/src/main/dig/74xx/lib/7476.dig b/src/main/dig/74xx/lib/7476.dig
index 467556888..a5c778af6 100644
--- a/src/main/dig/74xx/lib/7476.dig
+++ b/src/main/dig/74xx/lib/7476.dig
@@ -10,6 +10,10 @@
Description
DUAL J-K FLIP-FLOPS WITH PRESET AND CLEAR
+
+ lockedMode
+ true
+
diff --git a/src/test/java/de/neemann/digital/integration/FileScanner.java b/src/test/java/de/neemann/digital/integration/FileScanner.java
index b90a8b482..462f13e75 100644
--- a/src/test/java/de/neemann/digital/integration/FileScanner.java
+++ b/src/test/java/de/neemann/digital/integration/FileScanner.java
@@ -44,7 +44,7 @@ public class FileScanner {
if (f.getName().endsWith(".dig")) {
try {
test.check(f);
- } catch (Exception e) {
+ } catch (Throwable e) {
errors.add(new Error(f, e));
}
count++;
@@ -62,9 +62,9 @@ public class FileScanner {
private static class Error {
private final File f;
- private final Exception e;
+ private final Throwable e;
- private Error(File f, Exception e) {
+ private Error(File f, Throwable e) {
this.f = f;
this.e = e;
}
diff --git a/src/test/java/de/neemann/digital/integration/Test74xx.java b/src/test/java/de/neemann/digital/integration/Test74xx.java
new file mode 100644
index 000000000..e376719f5
--- /dev/null
+++ b/src/test/java/de/neemann/digital/integration/Test74xx.java
@@ -0,0 +1,79 @@
+package de.neemann.digital.integration;
+
+import de.neemann.digital.core.NodeException;
+import de.neemann.digital.core.element.Keys;
+import de.neemann.digital.core.io.In;
+import de.neemann.digital.core.io.Out;
+import de.neemann.digital.draw.elements.Circuit;
+import de.neemann.digital.draw.elements.PinException;
+import de.neemann.digital.draw.elements.VisualElement;
+import de.neemann.digital.draw.library.ElementNotFoundException;
+import junit.framework.TestCase;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+
+/**
+ * Tests the files in the 74xx/lib folder for consistency.
+ * Created by hneemann on 13.05.17.
+ */
+public class Test74xx extends TestCase {
+ private HashMap descrMap;
+
+ public void test74xx() throws Exception {
+ File examples = new File(Resources.getRoot().getParentFile().getParentFile(), "/main/dig/74xx/lib");
+ descrMap = new HashMap<>();
+ new FileScanner(this::check).scan(examples);
+ }
+
+ private void check(File dig) throws PinException, NodeException, ElementNotFoundException, IOException {
+ System.out.println(dig);
+ Circuit circuit = new ToBreakRunner(dig).getCircuit();
+ assertTrue("is not DIL", circuit.getAttributes().get(Keys.IS_DIL));
+ assertTrue("is not locked", circuit.getAttributes().get(Keys.LOCKED_MODE));
+
+ final String descr = circuit.getAttributes().get(Keys.DESCRIPTION);
+ assertTrue("missing description", descr.length() > 0);
+
+ File f = descrMap.get(descr);
+ if (f != null)
+ fail("duplicate description '"+descr+"' in " + f + " and " + dig);
+ descrMap.put(descr, dig);
+
+ PinChecker pc = new PinChecker();
+ for (VisualElement e : circuit.getElements()) {
+ if (e.equalsDescription(In.DESCRIPTION))
+ pc.checkPin(e);
+ if (e.equalsDescription(Out.DESCRIPTION))
+ pc.checkPin(e);
+ }
+ }
+
+
+ private class PinChecker {
+ private final HashSet pinMap;
+ private final HashSet nameMap;
+
+ private PinChecker() {
+ pinMap = new HashSet<>();
+ nameMap = new HashSet<>();
+ }
+
+ private void checkPin(VisualElement e) {
+ int pn = e.getElementAttributes().get(Keys.PINNUMBER);
+ final String label = e.getElementAttributes().getLabel();
+ assertTrue("missing pin number: " + label, pn != 0);
+
+ assertFalse("non unique pin number: " + pn, pinMap.contains(pn));
+ pinMap.add(pn);
+
+ assertFalse("non unique pin name: " + label, nameMap.contains(label));
+ nameMap.add(label);
+
+ assertTrue("missing pin label", label.length() > 0);
+ }
+
+ }
+}
diff --git a/src/test/java/de/neemann/digital/integration/TestExamples.java b/src/test/java/de/neemann/digital/integration/TestExamples.java
index ce1026515..15e9eae83 100644
--- a/src/test/java/de/neemann/digital/integration/TestExamples.java
+++ b/src/test/java/de/neemann/digital/integration/TestExamples.java
@@ -28,7 +28,7 @@ public class TestExamples extends TestCase {
*/
public void testDistExamples() throws Exception {
File examples = new File(Resources.getRoot().getParentFile().getParentFile(), "/main/dig");
- assertEquals(144, new FileScanner(this::check).scan(examples));
+ assertEquals(145, new FileScanner(this::check).scan(examples));
assertEquals(74, testCasesInFiles);
}