mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-19 09:54:49 -04:00
fixed a bug in the splitter consistency check, fixes #95
This commit is contained in:
parent
04c62b6081
commit
61db55104c
@ -288,9 +288,12 @@ public class Splitter implements Element {
|
||||
}
|
||||
|
||||
void checkInputConsistency() throws BitsException {
|
||||
long fullMask = (1L << bits) - 1;
|
||||
long fullMask = -1;
|
||||
if (bits < 64) fullMask = (1L << bits) - 1;
|
||||
for (Port p : ports) {
|
||||
long mask = ((1L << p.bits) - 1) << p.pos;
|
||||
long m = -1;
|
||||
if (p.bits < 64) m = (1L << p.bits) - 1;
|
||||
long mask = m << p.pos;
|
||||
|
||||
if ((fullMask & mask) != mask)
|
||||
throw new BitsException(Lang.get("err_splitterNotUnambiguously"), null);
|
||||
|
@ -0,0 +1,62 @@
|
||||
package de.neemann.digital.core.wiring;
|
||||
|
||||
import de.neemann.digital.TestExecuter;
|
||||
import de.neemann.digital.core.NodeException;
|
||||
import de.neemann.digital.core.ObservableValue;
|
||||
import de.neemann.digital.core.ObservableValues;
|
||||
import de.neemann.digital.core.element.ElementAttributes;
|
||||
import de.neemann.digital.core.element.Keys;
|
||||
import de.neemann.digital.draw.elements.PinException;
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import static de.neemann.digital.core.ObservableValues.ovs;
|
||||
|
||||
public class Splitter64BitTest extends TestCase {
|
||||
|
||||
public void test64Bit() throws NodeException, PinException {
|
||||
ObservableValue a = new ObservableValue("a", 16);
|
||||
ObservableValue b = new ObservableValue("b", 16);
|
||||
ObservableValue c = new ObservableValue("c", 16);
|
||||
ObservableValue d = new ObservableValue("d", 16);
|
||||
|
||||
Splitter splitter = new Splitter(new ElementAttributes()
|
||||
.set(Keys.INPUT_SPLIT, "16,16,16,16")
|
||||
.set(Keys.OUTPUT_SPLIT, "64"));
|
||||
|
||||
splitter.setInputs(ovs(d, c, b, a));
|
||||
|
||||
ObservableValues outputs = splitter.getOutputs();
|
||||
assertEquals(1, outputs.size());
|
||||
|
||||
TestExecuter sc = new TestExecuter().setInputs(a, b, c, d).setOutputsOf(splitter);
|
||||
sc.check(0x0, 0x0, 0x0, 0x0, 0x00);
|
||||
sc.check(0x1, 0x1, 0x1, 0x1, 0x0001000100010001L);
|
||||
sc.check(0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFFFFFFFFFFFFFFL);
|
||||
sc.check(0xFFFF, 0xFFFF, 0xFFFF, 0x0000, 0xFFFFFFFFFFFF0000L);
|
||||
sc.check(0xFFFF, 0xFFFF, 0x0000, 0xFFFF, 0xFFFFFFFF0000FFFFL);
|
||||
sc.check(0xFFFF, 0x0000, 0xFFFF, 0xFFFF, 0xFFFF0000FFFFFFFFL);
|
||||
sc.check(0x0000, 0xFFFF, 0xFFFF, 0xFFFF, 0x0000FFFFFFFFFFFFL);
|
||||
}
|
||||
|
||||
public void test64Bit2() throws NodeException, PinException {
|
||||
ObservableValue a = new ObservableValue("a", 64);
|
||||
|
||||
Splitter splitter = new Splitter(new ElementAttributes()
|
||||
.set(Keys.INPUT_SPLIT, "64")
|
||||
.set(Keys.OUTPUT_SPLIT, "16,16,16,16"));
|
||||
|
||||
splitter.setInputs(ovs(a));
|
||||
|
||||
ObservableValues outputs = splitter.getOutputs();
|
||||
assertEquals(4, outputs.size());
|
||||
|
||||
TestExecuter sc = new TestExecuter().setInputs(a).setOutputsOf(splitter);
|
||||
sc.check(0x0, 0x0, 0x0, 0x0, 0x0);
|
||||
sc.check(-1, 0xffff, 0xffff, 0xffff, 0xffff);
|
||||
sc.check(0xffffffffffffffffL, 0xffff, 0xffff, 0xffff, 0xffff);
|
||||
sc.check(0xffffffffffff0000L, 0, 0xffff, 0xffff, 0xffff);
|
||||
sc.check(0xffffffff0000ffffL, 0xffff, 0, 0xffff, 0xffff);
|
||||
sc.check(0xffff0000ffffffffL, 0xffff, 0xffff, 0, 0xffff);
|
||||
sc.check(0x0000ffffffffffffL, 0xffff, 0xffff, 0xffff, 0);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user