mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-17 17:04:42 -04:00
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:
parent
267e16575f
commit
6dd76bec3d
@ -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
|
||||
*/
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user