Squashed commit of the following:

commit 253a31d82050650345c893d43083eebe28a293e4
Author: hneemann <helmut.neemann@arcor.de>
Date:   Tue Jan 30 17:51:25 2018 +0100

    moved delay to wiring menu

commit 21cc87424340cbea36c31919179d75c09fe94a5b
Author: hneemann <helmut.neemann@arcor.de>
Date:   Tue Jan 30 17:40:52 2018 +0100

    added testcase for new variable delay

commit 2b70d72f24734960daab0bf2795cc3453725997e
Author: hneemann <helmut.neemann@arcor.de>
Date:   Sun Jan 28 19:46:49 2018 +0100

    delay gate has a configurable delay time
This commit is contained in:
hneemann 2018-01-30 18:01:54 +01:00
parent 267e16575f
commit 6dd76bec3d
6 changed files with 86 additions and 12 deletions

View File

@ -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
*/

View File

@ -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

View File

@ -100,8 +100,7 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
.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<ElementLibrary.ElementContainer>
.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)

View File

@ -107,8 +107,9 @@
die Adresse des gewünschten Ausgabewertes fest.</string>
<string name="elem_LookUpTable_pin_out">Gibt den Wert an der ausgewählten Adresse aus.</string>
<string name="elem_Delay">Verzögerung</string>
<string name="elem_Delay_tt">Verzögert ein Signal für eine Gatterlaufzeit. In Digital haben alle Gatter die
selbe Gatterlaufzeit.
<string name="elem_Delay_tt">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.
</string>
<string name="elem_Delay_pin_in">Eingang für das zu verzögernde Signal.</string>
<string name="elem_Delay_pin_out">Das um eine Gatterlaufzeit verzögerte Eingangssignal.</string>
@ -998,6 +999,8 @@ Sind evtl. die Namen der Variablen nicht eindeutig?</string>
<string name="key_outputBits_tt">Die Anzahl der Ausgangsbits muss größer sein als die Anzahl der Eingangsbits.</string>
<string name="key_textFontSize">Schriftgröße</string>
<string name="key_textFontSize_tt">Legt die für diesen Text zu verwendende Schriftgröße fest.</string>
<string name="key_delayTime">Dauer</string>
<string name="key_delayTime_tt">Dauer der Verzögerung in Gatterlaufzeiten.</string>
<string name="mod_insertWire">Leitung eingefügt.</string>
<string name="mod_insertCopied">Aus Zwischenablage eingefügt.</string>

View File

@ -109,7 +109,9 @@
<string name="elem_LookUpTable_pin_out">Returns the stored value at the address set via the inputs.</string>
<string name="elem_Delay">Delay</string>
<string name="elem_Delay_tt">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.
</string>
<string name="elem_Delay_pin_in">Input of the signal to be delayed.</string>
<string name="elem_Delay_pin_out">The input signal delayed by one gate delay time.</string>
@ -989,6 +991,9 @@ The names of the variables may not be unique.</string>
<string name="key_outputBits_tt">The number of output bits must be greater than the number of input bits.</string>
<string name="key_textFontSize">Font Size</string>
<string name="key_textFontSize_tt">Sets the font size to use for this text.</string>
<string name="key_delayTime">Duration</string>
<string name="key_delayTime_tt">Delay time in units of the common gate propagation delay.</string>
<string name="mod_insertWire">Inserted wire.</string>
<string name="mod_insertCopied">Insert from clipboard.</string>

View File

@ -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());
}
}
}