From d7557aae31a791cc29d3a636d67beecdf805c559 Mon Sep 17 00:00:00 2001 From: hneemann Date: Mon, 5 Oct 2020 10:38:40 +0200 Subject: [PATCH] adds an option to the div component, to select if the remainder of a signed division should always be positive or not, closes #525 --- .../java/de/neemann/digital/core/arithmetic/Div.java | 7 +++++-- .../java/de/neemann/digital/core/element/Keys.java | 6 ++++++ src/main/resources/lang/lang_de.xml | 10 ++++++++-- src/main/resources/lang/lang_en.xml | 5 ++++- 4 files changed, 23 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/neemann/digital/core/arithmetic/Div.java b/src/main/java/de/neemann/digital/core/arithmetic/Div.java index ebd4f11cc..c443af691 100644 --- a/src/main/java/de/neemann/digital/core/arithmetic/Div.java +++ b/src/main/java/de/neemann/digital/core/arithmetic/Div.java @@ -30,12 +30,14 @@ public class Div extends Node implements Element, Countable { .addAttribute(Keys.ROTATE) .addAttribute(Keys.LABEL) .addAttribute(Keys.BITS) - .addAttribute(Keys.SIGNED); + .addAttribute(Keys.SIGNED) + .addAttribute(Keys.REMAINDER_POSITIVE); private final ObservableValue quotient; private final ObservableValue remainder; private final int bits; private final boolean signed; + private final boolean remainderPositive; private ObservableValue a; private ObservableValue b; private long q; @@ -51,6 +53,7 @@ public class Div extends Node implements Element, Countable { bits = attributes.get(Keys.BITS); this.quotient = new ObservableValue("q", bits).setPinDescription(DESCRIPTION); this.remainder = new ObservableValue("r", bits).setPinDescription(DESCRIPTION); + remainderPositive = attributes.get(Keys.REMAINDER_POSITIVE); } @Override @@ -64,7 +67,7 @@ public class Div extends Node implements Element, Countable { r = av % bv; // make the remainder positive - if (r < 0) { + if (remainderPositive && r < 0) { if (bv >= 0) { r += bv; q--; diff --git a/src/main/java/de/neemann/digital/core/element/Keys.java b/src/main/java/de/neemann/digital/core/element/Keys.java index a9555d89b..869952ce3 100644 --- a/src/main/java/de/neemann/digital/core/element/Keys.java +++ b/src/main/java/de/neemann/digital/core/element/Keys.java @@ -274,6 +274,12 @@ public final class Keys { public static final Key SIGNED = new Key<>("Signed", false).allowGroupEdit(); + /** + * Selects if the reminder of the division is always positive + */ + public static final Key REMAINDER_POSITIVE + = new Key<>("remainderPositive", true).setDependsOn(SIGNED); + /** * the data key for memory */ diff --git a/src/main/resources/lang/lang_de.xml b/src/main/resources/lang/lang_de.xml index ecfbb5ba0..7667bcaa1 100644 --- a/src/main/resources/lang/lang_de.xml +++ b/src/main/resources/lang/lang_de.xml @@ -1172,16 +1172,22 @@ Sind evtl. die Namen der Variablen nicht eindeutig? Die Eingangsbits müssen vollständig und eindeutig angegeben werden. Ausgangsaufteilung Sollen z.B. je vier Bits, zwei Bits und noch einmal zwei Bits als Ausgänge - verwendet werden, kann das mit der Eingabe "4,2,2" konfiguriert werden. Die Zahl gibt dabei jeweils die Bitanzahl an. + verwendet werden, kann das mit der Eingabe "4,2,2" konfiguriert werden. Die Zahl gibt dabei jeweils die + Bitanzahl an. Als Vereinfachung kann das *-Zeichen verwendet werden: Mit "[Bits]*[Anzahl]" wie "1*16" können 16 einzelne Bits konfiguriert werden. Es können auch die zu verwendenden Bits direkt und in beliebiger Reihenfolge angegeben werden. So werden mit der Eingabe"4-7,0-3" die Bits 4-7 und 0-3 konfiguriert. Diese Notation erlaubt eine beliebige Bit-Anordnung. - Ausgangsbits können auch mehrfach ausgegeben werden: "0-7,1-6,4-7" + Ausgangsbits können auch mehrfach ausgegeben werden: "0-7,1-6,4-7" + Anzahl der Auswahlbits Anzahl der Bits, die in der Auswahlleitung vorhanden sind. Operation mit Vorzeichen Wenn gesetzt, findet die Operation vorzeichenrichtig (2-er Komplement) statt. + Rest immer positiv + Wenn gesetzt, ist der Rest einer vorzeichenbehafteten Division immer + positiv. + Geschlossen Gibt an, ob der Schalter bei Modelstart offen oder geschlossen ist. Wert diff --git a/src/main/resources/lang/lang_en.xml b/src/main/resources/lang/lang_en.xml index 57fdbeba8..ee388b76c 100644 --- a/src/main/resources/lang/lang_en.xml +++ b/src/main/resources/lang/lang_en.xml @@ -1150,11 +1150,14 @@ can be used: 16 bits can be configured with "[Bits]*[Number]" as "1*16". It is also possible to specify the bits to be used directly and in any order. For example, "4-7,0-3" configures bits 4-7 and 0-3. This notation allows any bit arrangement. - Output bits can also be output several times: "0-7,1-6,4-7" + Output bits can also be output several times: "0-7,1-6,4-7" + Number of Selector Bits Number of bits used for the selector input. Signed Operation If selected the operation is performed with signed (2th complement) values. + Remainder always positive + If set, the remainder of a signed division is always positive. Closed Sets the initial state of the switch. Value