From 0cea738d74dd689e7bfadee55e20bfbf4e1ed45e Mon Sep 17 00:00:00 2001 From: hneemann Date: Mon, 21 Jan 2019 14:17:50 +0100 Subject: [PATCH] fixed 64 bit bugs in basic gates, closes #234 --- .../java/de/neemann/digital/core/basic/And.java | 4 ++-- .../de/neemann/digital/core/basic/Function.java | 2 +- .../java/de/neemann/digital/core/basic/NAnd.java | 2 +- .../java/de/neemann/digital/core/basic/NOr.java | 2 +- .../java/de/neemann/digital/core/basic/Or.java | 4 ++-- .../java/de/neemann/digital/core/basic/XNOr.java | 2 +- .../java/de/neemann/digital/core/basic/XOr.java | 4 ++-- .../de/neemann/digital/core/basic/AndTest.java | 12 ++++++++++++ .../de/neemann/digital/core/basic/NAndTest.java | 15 ++++++++++++++- .../de/neemann/digital/core/basic/NOrTest.java | 13 +++++++++++++ .../de/neemann/digital/core/basic/NotTest.java | 11 +++++++++++ .../de/neemann/digital/core/basic/OrTest.java | 13 +++++++++++++ .../de/neemann/digital/core/basic/XNOrTest.java | 16 +++++++++++++++- .../de/neemann/digital/core/basic/XOrTest.java | 13 +++++++++++++ 14 files changed, 101 insertions(+), 12 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/basic/And.java b/src/main/java/de/neemann/digital/core/basic/And.java index de58ff690..51803140f 100644 --- a/src/main/java/de/neemann/digital/core/basic/And.java +++ b/src/main/java/de/neemann/digital/core/basic/And.java @@ -33,8 +33,8 @@ public class And extends Function { } @Override - protected int calculate(ArrayList inputs) throws NodeException { - int f = -1; + protected long calculate(ArrayList inputs) throws NodeException { + long f = -1; for (ObservableValue i : inputs) { f &= i.getValue(); } diff --git a/src/main/java/de/neemann/digital/core/basic/Function.java b/src/main/java/de/neemann/digital/core/basic/Function.java index 1634bc379..38f1a1d6b 100644 --- a/src/main/java/de/neemann/digital/core/basic/Function.java +++ b/src/main/java/de/neemann/digital/core/basic/Function.java @@ -30,6 +30,6 @@ abstract class Function extends FanIn { getOutput().setValue(value); } - protected abstract int calculate(ArrayList inputs) throws NodeException; + protected abstract long calculate(ArrayList inputs) throws NodeException; } diff --git a/src/main/java/de/neemann/digital/core/basic/NAnd.java b/src/main/java/de/neemann/digital/core/basic/NAnd.java index 840b09706..8ec69a369 100644 --- a/src/main/java/de/neemann/digital/core/basic/NAnd.java +++ b/src/main/java/de/neemann/digital/core/basic/NAnd.java @@ -33,7 +33,7 @@ public class NAnd extends And { } @Override - protected int calculate(ArrayList inputs) throws NodeException { + protected long calculate(ArrayList inputs) throws NodeException { return ~super.calculate(inputs); } } diff --git a/src/main/java/de/neemann/digital/core/basic/NOr.java b/src/main/java/de/neemann/digital/core/basic/NOr.java index 168e35c98..c697ed3e4 100644 --- a/src/main/java/de/neemann/digital/core/basic/NOr.java +++ b/src/main/java/de/neemann/digital/core/basic/NOr.java @@ -33,7 +33,7 @@ public class NOr extends Or { } @Override - protected int calculate(ArrayList inputs) throws NodeException { + protected long calculate(ArrayList inputs) throws NodeException { return ~super.calculate(inputs); } } diff --git a/src/main/java/de/neemann/digital/core/basic/Or.java b/src/main/java/de/neemann/digital/core/basic/Or.java index 88b04e430..3efd191cc 100644 --- a/src/main/java/de/neemann/digital/core/basic/Or.java +++ b/src/main/java/de/neemann/digital/core/basic/Or.java @@ -33,8 +33,8 @@ public class Or extends Function { } @Override - protected int calculate(ArrayList inputs) throws NodeException { - int f = 0; + protected long calculate(ArrayList inputs) throws NodeException { + long f = 0; for (ObservableValue i : inputs) { f |= i.getValue(); } diff --git a/src/main/java/de/neemann/digital/core/basic/XNOr.java b/src/main/java/de/neemann/digital/core/basic/XNOr.java index 1faeb0a97..fb5627028 100644 --- a/src/main/java/de/neemann/digital/core/basic/XNOr.java +++ b/src/main/java/de/neemann/digital/core/basic/XNOr.java @@ -33,7 +33,7 @@ public class XNOr extends XOr { } @Override - protected int calculate(ArrayList inputs) throws NodeException { + protected long calculate(ArrayList inputs) throws NodeException { return ~super.calculate(inputs); } } diff --git a/src/main/java/de/neemann/digital/core/basic/XOr.java b/src/main/java/de/neemann/digital/core/basic/XOr.java index fe069c59d..2b3761768 100644 --- a/src/main/java/de/neemann/digital/core/basic/XOr.java +++ b/src/main/java/de/neemann/digital/core/basic/XOr.java @@ -33,8 +33,8 @@ public class XOr extends Function { } @Override - protected int calculate(ArrayList inputs) throws NodeException { - int f = 0; + protected long calculate(ArrayList inputs) throws NodeException { + long f = 0; for (ObservableValue i : inputs) { f ^= i.getValue(); } diff --git a/src/test/java/de/neemann/digital/core/basic/AndTest.java b/src/test/java/de/neemann/digital/core/basic/AndTest.java index 7c5b88706..2376396cd 100644 --- a/src/test/java/de/neemann/digital/core/basic/AndTest.java +++ b/src/test/java/de/neemann/digital/core/basic/AndTest.java @@ -33,4 +33,16 @@ public class AndTest extends TestCase { sc.check(1, 0, 0); sc.check(0, 1, 0); } + + public void testAnd64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + ObservableValue b = new ObservableValue("b", 64); + + Model model = new Model(); + FanIn out = model.add(new And(new ElementAttributes().setBits(64))); + out.setInputs(ovs(a, b)); + + TestExecuter sc = new TestExecuter(model).setInputs(a, b).setOutputs(out.getOutputs()); + sc.check(0xff00000000000000L, 0x2200000000000000L, 0x2200000000000000L); + } } diff --git a/src/test/java/de/neemann/digital/core/basic/NAndTest.java b/src/test/java/de/neemann/digital/core/basic/NAndTest.java index 9d4c3b4d8..29efc541b 100644 --- a/src/test/java/de/neemann/digital/core/basic/NAndTest.java +++ b/src/test/java/de/neemann/digital/core/basic/NAndTest.java @@ -17,7 +17,7 @@ import static de.neemann.digital.core.ObservableValues.ovs; */ public class NAndTest extends TestCase { - public void testAnd() throws Exception { + public void testNAnd() throws Exception { ObservableValue a = new ObservableValue("a", 1); ObservableValue b = new ObservableValue("b", 1); @@ -34,4 +34,17 @@ public class NAndTest extends TestCase { sc.check(1, 0, 1); sc.check(0, 1, 1); } + + public void testNAnd64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + ObservableValue b = new ObservableValue("b", 64); + + Model model = new Model(); + FanIn out = model.add(new NAnd(new ElementAttributes().setBits(64))); + out.setInputs(ovs(a, b)); + + + TestExecuter sc = new TestExecuter(model).setInputs(a, b).setOutputs(out.getOutputs()); + sc.check(0xff00000000000000L, 0x2200000000000000L, 0xddffffffffffffffL); + } } diff --git a/src/test/java/de/neemann/digital/core/basic/NOrTest.java b/src/test/java/de/neemann/digital/core/basic/NOrTest.java index 33359feb4..371fb446c 100644 --- a/src/test/java/de/neemann/digital/core/basic/NOrTest.java +++ b/src/test/java/de/neemann/digital/core/basic/NOrTest.java @@ -34,4 +34,17 @@ public class NOrTest extends TestCase { sc.check(0, 1, 0); sc.check(0, 0, 1); } + + public void testNOr64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + ObservableValue b = new ObservableValue("b", 64); + + Model model = new Model(); + FanIn and = model.add(new NOr(new ElementAttributes().setBits(64))); + and.setInputs(ovs(a, b)); + + TestExecuter sc = new TestExecuter(model).setInputs(a, b).setOutputs(and.getOutput()); + sc.check(0xff00000000000000L, 0x2200000000000000L, 0x00ffffffffffffffL); + } + } diff --git a/src/test/java/de/neemann/digital/core/basic/NotTest.java b/src/test/java/de/neemann/digital/core/basic/NotTest.java index 9d224d269..b0e0ec0c2 100644 --- a/src/test/java/de/neemann/digital/core/basic/NotTest.java +++ b/src/test/java/de/neemann/digital/core/basic/NotTest.java @@ -28,4 +28,15 @@ public class NotTest extends TestCase { sc.check(2, 1); sc.check(3, 0); } + + public void testNot64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + + Model model = new Model(); + Not out = model.add(new Not(new ElementAttributes().setBits(64))); + out.setInputs(a.asList()); + + TestExecuter sc = new TestExecuter(model).setInputs(a).setOutputs(out.getOutputs()); + sc.check(0xff00000000000000L, 0x00ffffffffffffffL); + } } diff --git a/src/test/java/de/neemann/digital/core/basic/OrTest.java b/src/test/java/de/neemann/digital/core/basic/OrTest.java index c79ba0d00..d3b477da8 100644 --- a/src/test/java/de/neemann/digital/core/basic/OrTest.java +++ b/src/test/java/de/neemann/digital/core/basic/OrTest.java @@ -34,4 +34,17 @@ public class OrTest extends TestCase { sc.check(0, 1, 1); sc.check(0, 0, 0); } + + + public void testOr64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + ObservableValue b = new ObservableValue("b", 64); + + Model model = new Model(); + FanIn and = model.add(new Or(new ElementAttributes().setBits(64))); + and.setInputs(ovs(a, b)); + + TestExecuter sc = new TestExecuter(model).setInputs(a, b).setOutputs(and.getOutput()); + sc.check(0xff00000000000000L, 0x2200000000000000L, 0xff00000000000000L); + } } diff --git a/src/test/java/de/neemann/digital/core/basic/XNOrTest.java b/src/test/java/de/neemann/digital/core/basic/XNOrTest.java index 485526e65..23787d80b 100644 --- a/src/test/java/de/neemann/digital/core/basic/XNOrTest.java +++ b/src/test/java/de/neemann/digital/core/basic/XNOrTest.java @@ -17,7 +17,7 @@ import static de.neemann.digital.core.ObservableValues.ovs; */ public class XNOrTest extends TestCase { - public void testXor() throws Exception { + public void testXNor() throws Exception { ObservableValue a = new ObservableValue("a", 1); ObservableValue b = new ObservableValue("b", 1); @@ -32,4 +32,18 @@ public class XNOrTest extends TestCase { sc.check(0, 1, 0); sc.check(1, 1, 1); } + + public void testXNor64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + ObservableValue b = new ObservableValue("b", 64); + + + Model model = new Model(); + XOr out = model.add(new XNOr(new ElementAttributes().setBits(64))); + out.setInputs(ovs(a, b)); + + TestExecuter sc = new TestExecuter(model).setInputs(a, b).setOutputs(out.getOutputs()); + sc.check(0x7e00000000000000L, 0x2200000000000000L, ~0x5c00000000000000L); + } + } diff --git a/src/test/java/de/neemann/digital/core/basic/XOrTest.java b/src/test/java/de/neemann/digital/core/basic/XOrTest.java index 53aabe1e4..1416617a4 100644 --- a/src/test/java/de/neemann/digital/core/basic/XOrTest.java +++ b/src/test/java/de/neemann/digital/core/basic/XOrTest.java @@ -32,4 +32,17 @@ public class XOrTest extends TestCase { sc.check(0, 1, 1); sc.check(1, 1, 0); } + + public void testXor64() throws Exception { + ObservableValue a = new ObservableValue("a", 64); + ObservableValue b = new ObservableValue("b", 64); + + + Model model = new Model(); + XOr out = model.add(new XOr(new ElementAttributes().setBits(64))); + out.setInputs(ovs(a, b)); + + TestExecuter sc = new TestExecuter(model).setInputs(a, b).setOutputs(out.getOutputs()); + sc.check(0x7e00000000000000L, 0x2200000000000000L, 0x5c00000000000000L); + } }