mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-18 09:24: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})
|
.setComboBoxValues(new Integer[]{2, 3, 4, 5})
|
||||||
.setMin(2);
|
.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
|
* 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"))
|
public static final ElementTypeDescription DESCRIPTION = new ElementTypeDescription(Delay.class, input("in"))
|
||||||
.addAttribute(Keys.ROTATE)
|
.addAttribute(Keys.ROTATE)
|
||||||
.addAttribute(Keys.BITS);
|
.addAttribute(Keys.BITS)
|
||||||
|
.addAttribute(Keys.DELAY_TIME);
|
||||||
|
|
||||||
private final ObservableValue output;
|
private final ObservableValue output;
|
||||||
private final int bits;
|
private final int bits;
|
||||||
|
private final int delayTime;
|
||||||
private ObservableValue input;
|
private ObservableValue input;
|
||||||
private long value;
|
private long[] value;
|
||||||
|
private int pos;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new instance
|
* Creates a new instance
|
||||||
@ -38,16 +41,37 @@ public class Delay extends Node implements Element {
|
|||||||
public Delay(ElementAttributes attributes) {
|
public Delay(ElementAttributes attributes) {
|
||||||
bits = attributes.get(Keys.BITS);
|
bits = attributes.get(Keys.BITS);
|
||||||
output = new ObservableValue("out", bits).setPinDescription(DESCRIPTION);
|
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
|
@Override
|
||||||
public void readInputs() throws NodeException {
|
public void readInputs() throws NodeException {
|
||||||
value = input.getValue();
|
value[pos] = input.getValue();
|
||||||
|
pos++;
|
||||||
|
if (pos >= delayTime)
|
||||||
|
pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void writeOutputs() throws NodeException {
|
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
|
@Override
|
||||||
|
@ -100,8 +100,7 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
.add(XOr.DESCRIPTION)
|
.add(XOr.DESCRIPTION)
|
||||||
.add(XNOr.DESCRIPTION)
|
.add(XNOr.DESCRIPTION)
|
||||||
.add(Not.DESCRIPTION)
|
.add(Not.DESCRIPTION)
|
||||||
.add(LookUpTable.DESCRIPTION)
|
.add(LookUpTable.DESCRIPTION))
|
||||||
.add(Delay.DESCRIPTION))
|
|
||||||
.add(new LibraryNode(Lang.get("lib_io"))
|
.add(new LibraryNode(Lang.get("lib_io"))
|
||||||
.add(Out.DESCRIPTION)
|
.add(Out.DESCRIPTION)
|
||||||
.add(Out.LEDDESCRIPTION)
|
.add(Out.LEDDESCRIPTION)
|
||||||
@ -125,10 +124,11 @@ public class ElementLibrary implements Iterable<ElementLibrary.ElementContainer>
|
|||||||
.add(Const.DESCRIPTION)
|
.add(Const.DESCRIPTION)
|
||||||
.add(Tunnel.DESCRIPTION)
|
.add(Tunnel.DESCRIPTION)
|
||||||
.add(Splitter.DESCRIPTION)
|
.add(Splitter.DESCRIPTION)
|
||||||
.add(PullUp.DESCRIPTION)
|
|
||||||
.add(PullDown.DESCRIPTION)
|
|
||||||
.add(Driver.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(new LibraryNode(Lang.get("lib_mux"))
|
||||||
.add(Multiplexer.DESCRIPTION)
|
.add(Multiplexer.DESCRIPTION)
|
||||||
.add(Demultiplexer.DESCRIPTION)
|
.add(Demultiplexer.DESCRIPTION)
|
||||||
|
@ -107,8 +107,9 @@
|
|||||||
die Adresse des gewünschten Ausgabewertes fest.</string>
|
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_LookUpTable_pin_out">Gibt den Wert an der ausgewählten Adresse aus.</string>
|
||||||
<string name="elem_Delay">Verzögerung</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
|
<string name="elem_Delay_tt">Verzögert ein Signal für eine einstellbare Anzahl an Gatterlaufzeiten.
|
||||||
selbe Gatterlaufzeit.
|
Alle übrigen Bauteile in Digital haben genau eine Gatterlaufzeit Verzögerung.
|
||||||
|
Mit diesem Bauteil lassen sich damit beliebige Laufzeiten realisieren.
|
||||||
</string>
|
</string>
|
||||||
<string name="elem_Delay_pin_in">Eingang für das zu verzögernde Signal.</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>
|
<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_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">Schriftgröße</string>
|
||||||
<string name="key_textFontSize_tt">Legt die für diesen Text zu verwendende Schriftgröße fest.</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_insertWire">Leitung eingefügt.</string>
|
||||||
<string name="mod_insertCopied">Aus Zwischenablage 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_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">Delay</string>
|
||||||
<string name="elem_Delay_tt">Delays the signal by on propagation delay time.
|
<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>
|
||||||
<string name="elem_Delay_pin_in">Input of the signal to be delayed.</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>
|
<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_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">Font Size</string>
|
||||||
<string name="key_textFontSize_tt">Sets the font size to use for this text.</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_insertWire">Inserted wire.</string>
|
||||||
<string name="mod_insertCopied">Insert from clipboard.</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.Model;
|
||||||
import de.neemann.digital.core.ObservableValue;
|
import de.neemann.digital.core.ObservableValue;
|
||||||
import de.neemann.digital.core.element.ElementAttributes;
|
import de.neemann.digital.core.element.ElementAttributes;
|
||||||
|
import de.neemann.digital.core.element.Keys;
|
||||||
import de.neemann.digital.core.wiring.Delay;
|
import de.neemann.digital.core.wiring.Delay;
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
@ -25,4 +26,35 @@ public class DelayTest extends TestCase {
|
|||||||
sc.check(2, 2);
|
sc.check(2, 2);
|
||||||
sc.check(3, 3);
|
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