From 6dd76bec3df727ca225c5464bd61f183da854d8a Mon Sep 17 00:00:00 2001 From: hneemann Date: Tue, 30 Jan 2018 18:01:54 +0100 Subject: [PATCH] Squashed commit of the following: commit 253a31d82050650345c893d43083eebe28a293e4 Author: hneemann Date: Tue Jan 30 17:51:25 2018 +0100 moved delay to wiring menu commit 21cc87424340cbea36c31919179d75c09fe94a5b Author: hneemann Date: Tue Jan 30 17:40:52 2018 +0100 added testcase for new variable delay commit 2b70d72f24734960daab0bf2795cc3453725997e Author: hneemann Date: Sun Jan 28 19:46:49 2018 +0100 delay gate has a configurable delay time --- .../de/neemann/digital/core/element/Keys.java | 10 ++++++ .../de/neemann/digital/core/wiring/Delay.java | 32 ++++++++++++++++--- .../digital/draw/library/ElementLibrary.java | 10 +++--- src/main/resources/lang/lang_de.xml | 7 ++-- src/main/resources/lang/lang_en.xml | 7 +++- .../neemann/digital/core/basic/DelayTest.java | 32 +++++++++++++++++++ 6 files changed, 86 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/element/Keys.java b/src/main/java/de/neemann/digital/core/element/Keys.java index 7e15b5691..35b04fd96 100644 --- a/src/main/java/de/neemann/digital/core/element/Keys.java +++ b/src/main/java/de/neemann/digital/core/element/Keys.java @@ -52,6 +52,16 @@ public final class Keys { .setComboBoxValues(new Integer[]{2, 3, 4, 5}) .setMin(2); + + /** + * the delay time used by the delay component + */ + public static final Key.KeyInteger DELAY_TIME + = new Key.KeyInteger("delayTime", 1) + .setComboBoxValues(new Integer[]{1, 2, 3, 4, 5}) + .setMin(1) + .setMax(20); + /** * The elements label */ diff --git a/src/main/java/de/neemann/digital/core/wiring/Delay.java b/src/main/java/de/neemann/digital/core/wiring/Delay.java index 337fa9eff..8081a9d96 100644 --- a/src/main/java/de/neemann/digital/core/wiring/Delay.java +++ b/src/main/java/de/neemann/digital/core/wiring/Delay.java @@ -23,12 +23,15 @@ public class Delay extends Node implements Element { */ public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Delay.class, input("in")) .addAttribute(Keys.ROTATE) - .addAttribute(Keys.BITS); + .addAttribute(Keys.BITS) + .addAttribute(Keys.DELAY_TIME); private final ObservableValue output; private final int bits; + private final int delayTime; private ObservableValue input; - private long value; + private long[] value; + private int pos; /** * Creates a new instance @@ -38,16 +41,37 @@ public class Delay extends Node implements Element { public Delay(ElementAttributes attributes) { bits = attributes.get(Keys.BITS); output = new ObservableValue("out", bits).setPinDescription(DESCRIPTION); + int dt = attributes.get(Keys.DELAY_TIME); + if (dt < 1) + delayTime = 1; + else + delayTime = dt; + + value = new long[delayTime]; } @Override public void readInputs() throws NodeException { - value = input.getValue(); + value[pos] = input.getValue(); + pos++; + if (pos >= delayTime) + pos = 0; } @Override public void writeOutputs() throws NodeException { - output.setValue(value); + output.setValue(value[pos]); + + if (delayTime > 1) { + boolean same = true; + for (int i = 1; i < delayTime; i++) + if (value[0] != value[i]) { + same = false; + break; + } + if (!same) + hasChanged(); + } } @Override diff --git a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java index da1c73e82..0f3d012bc 100644 --- a/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java +++ b/src/main/java/de/neemann/digital/draw/library/ElementLibrary.java @@ -100,8 +100,7 @@ public class ElementLibrary implements Iterable .add(XOr.DESCRIPTION) .add(XNOr.DESCRIPTION) .add(Not.DESCRIPTION) - .add(LookUpTable.DESCRIPTION) - .add(Delay.DESCRIPTION)) + .add(LookUpTable.DESCRIPTION)) .add(new LibraryNode(Lang.get("lib_io")) .add(Out.DESCRIPTION) .add(Out.LEDDESCRIPTION) @@ -125,10 +124,11 @@ public class ElementLibrary implements Iterable .add(Const.DESCRIPTION) .add(Tunnel.DESCRIPTION) .add(Splitter.DESCRIPTION) - .add(PullUp.DESCRIPTION) - .add(PullDown.DESCRIPTION) .add(Driver.DESCRIPTION) - .add(DriverInvSel.DESCRIPTION)) + .add(DriverInvSel.DESCRIPTION) + .add(Delay.DESCRIPTION) + .add(PullUp.DESCRIPTION) + .add(PullDown.DESCRIPTION)) .add(new LibraryNode(Lang.get("lib_mux")) .add(Multiplexer.DESCRIPTION) .add(Demultiplexer.DESCRIPTION) diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 2526e6248..0e8ca4e3c 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -107,8 +107,9 @@ die Adresse des gewünschten Ausgabewertes fest. Gibt den Wert an der ausgewählten Adresse aus. Verzögerung - Verzögert ein Signal für eine Gatterlaufzeit. In Digital haben alle Gatter die - selbe Gatterlaufzeit. + Verzögert ein Signal für eine einstellbare Anzahl an Gatterlaufzeiten. + Alle übrigen Bauteile in Digital haben genau eine Gatterlaufzeit Verzögerung. + Mit diesem Bauteil lassen sich damit beliebige Laufzeiten realisieren. Eingang für das zu verzögernde Signal. Das um eine Gatterlaufzeit verzögerte Eingangssignal. @@ -998,6 +999,8 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Die Anzahl der Ausgangsbits muss größer sein als die Anzahl der Eingangsbits. Schriftgröße Legt die für diesen Text zu verwendende Schriftgröße fest. + Dauer + Dauer der Verzögerung in Gatterlaufzeiten. Leitung eingefügt. Aus Zwischenablage eingefügt. diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 5377ac7c8..bf802408f 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -109,7 +109,9 @@ Returns the stored value at the address set via the inputs. Delay Delays the signal by on propagation delay time. - In Digital all gates have the same propagation delay. + Delays a signal for an adjustable number of gate delays. + All other components in Digital have a gate delay of on propagation delay time. + This component can be used to realize any necessary propagation delay. Input of the signal to be delayed. The input signal delayed by one gate delay time. @@ -989,6 +991,9 @@ The names of the variables may not be unique. The number of output bits must be greater than the number of input bits. Font Size Sets the font size to use for this text. + Duration + Delay time in units of the common gate propagation delay. + Inserted wire. Insert from clipboard. diff --git a/src/test/java/de/neemann/digital/core/basic/DelayTest.java b/src/test/java/de/neemann/digital/core/basic/DelayTest.java index 3e99df343..413f1fa22 100644 --- a/src/test/java/de/neemann/digital/core/basic/DelayTest.java +++ b/src/test/java/de/neemann/digital/core/basic/DelayTest.java @@ -4,6 +4,7 @@ import de.neemann.digital.TestExecuter; import de.neemann.digital.core.Model; import de.neemann.digital.core.ObservableValue; import de.neemann.digital.core.element.ElementAttributes; +import de.neemann.digital.core.element.Keys; import de.neemann.digital.core.wiring.Delay; import junit.framework.TestCase; @@ -25,4 +26,35 @@ public class DelayTest extends TestCase { sc.check(2, 2); sc.check(3, 3); } + + + public void testDelayVar() throws Exception { + for (int delayTime = 0; delayTime < 5; delayTime++) { + ObservableValue in = new ObservableValue("in", 1); + + Model model = new Model(); + Delay delay = model.add(new Delay(new ElementAttributes().set(Keys.DELAY_TIME, delayTime))); + delay.setInputs(in.asList()); + assertEquals(1, delay.getOutputs().size()); + ObservableValue out = delay.getOutputs().get(0); + + model.init(); + + in.setValue(0); + model.doStep(); + assertEquals(0, out.getValue()); + + in.setValue(1); + for (int i = 1; i < delayTime; i++) { + assertTrue(model.needsUpdate()); + model.doMicroStep(false); + assertEquals(0, out.getValue()); + } + assertTrue(model.needsUpdate()); + model.doMicroStep(false); + assertEquals(1, out.getValue()); + assertFalse(model.needsUpdate()); + } + } + } \ No newline at end of file