From edc114f2a7283ff67f6e9d5379e44959d347cff5 Mon Sep 17 00:00:00 2001 From: hneemann Date: Sat, 8 Jul 2017 09:58:20 +0200 Subject: [PATCH] minor refactoring of comparator Now it also uses new getValueSIgned() method. --- .../digital/core/arithmetic/Comparator.java | 26 +++++-------------- src/main/resources/lang/lang_de.xml | 6 ++--- .../core/arithmetic/ComparatorTest.java | 3 +++ 3 files changed, 13 insertions(+), 22 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java b/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java index 773b3bb49..b3412ecc5 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Comparator.java @@ -31,8 +31,6 @@ public class Comparator extends Node implements Element { private final ObservableValue aklb; private final ObservableValue equals; private final ObservableValue agrb; - private final int maskAnd; - private final int maskOr; private ObservableValue a; private ObservableValue b; private long valueA; @@ -46,8 +44,6 @@ public class Comparator extends Node implements Element { public Comparator(ElementAttributes attributes) { signed = attributes.get(Keys.SIGNED); bits = attributes.get(Keys.BITS); - this.maskAnd = 1 << (bits - 1); - this.maskOr = ~((1 << bits) - 1); this.agrb = new ObservableValue(">", 1).setPinDescription(DESCRIPTION); this.equals = new ObservableValue("=", 1).setPinDescription(DESCRIPTION); @@ -56,8 +52,13 @@ public class Comparator extends Node implements Element { @Override public void readInputs() throws NodeException { - valueA = a.getValue(); - valueB = b.getValue(); + if (signed) { + valueA = a.getValueSigned(); + valueB = b.getValueSigned(); + } else { + valueA = a.getValue(); + valueB = b.getValue(); + } } @Override @@ -68,25 +69,12 @@ public class Comparator extends Node implements Element { agrb.setValue(0); } else { equals.setValue(0); - - if (signed) { - valueA = signeExtend(valueA); - valueB = signeExtend(valueB); - } - boolean kl = valueA < valueB; aklb.setBool(kl); agrb.setBool(!kl); } } - private long signeExtend(long v) { - if ((v & maskAnd) != 0) - return v | maskOr; - else - return v; - } - @Override public void setInputs(ObservableValues inputs) throws BitsException { a = inputs.get(0).addObserverToValue(this).checkBits(bits, this, 0); diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index 4cb778898..e5cac5935 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -211,8 +211,8 @@ Es können sowohl komplette Takte als auch einzelne Gatter-Veränderungen angeze Eingang a für Multiplikation. Eingang b für Multiplikation. Ausgang mit dem Ergebnis der Multiplikation. - Verschieber - Ein Baustein zum Bitschieben. Verschiebt einen Wert um die am Eingang shift angegebene Anzahl von Bits. + Bit-Schieber + Ein Baustein zum Schieben von Bits. Verschiebt einen Wert um die am Eingang shift angegebene Anzahl von Bits. Eingang mit zu verschiebenden Bits. Eingang mit Weite der Verschiebung. Ausgang mit dem Ergebnis der Verschiebeoperation. @@ -616,7 +616,7 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Verschiebeweite hat Vorzeichen Verschiebeweite verwendet Zweierkomplement Modus - Modus des Verschiebung. + Modus der Verschiebung. Normal Rotation Arithmetisch diff --git a/src/test/java/de/neemann/digital/core/arithmetic/ComparatorTest.java b/src/test/java/de/neemann/digital/core/arithmetic/ComparatorTest.java index da90e8a5b..43c12d013 100644 --- a/src/test/java/de/neemann/digital/core/arithmetic/ComparatorTest.java +++ b/src/test/java/de/neemann/digital/core/arithmetic/ComparatorTest.java @@ -53,6 +53,9 @@ public class ComparatorTest extends TestCase { sc.check(8, 2, 0, 0, 1); sc.check(15, 2, 0, 0, 1); sc.check(13, 15, 0, 0, 1); + + sc.check(-2, -3, 1, 0, 0); + sc.check(-7, -8, 1, 0, 0); }