Migrated BarrelShifter, BitCount and BitExtender to new Bits helper.

This commit is contained in:
hneemann 2018-01-03 19:59:34 +01:00
parent 6257946a23
commit 501e18b512
5 changed files with 36 additions and 18 deletions

View File

@ -58,4 +58,17 @@ public final class Bits {
public static long signedFlagMask(int bits) {
return up(1, bits - 1);
}
/**
* Calculates the number of bits needed to store the given value b.
*
* @param b number
* @return number of bits needed to store b
*/
public static int binLn2(int b) {
int outBits = 1;
while ((1 << outBits) <= b)
outBits++;
return outBits;
}
}

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.arithmetic;
import de.neemann.digital.core.Node;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -51,9 +48,7 @@ public class BarrelShifter extends Node implements Element {
bits = attributes.get(Keys.BITS);
signed = attributes.get(Keys.BARREL_SIGNED);
int sBits = 1;
while ((1 << sBits) <= bits)
sBits++;
int sBits = Bits.binLn2(bits);
if (signed)
sBits++;

View File

@ -1,9 +1,6 @@
package de.neemann.digital.core.arithmetic;
import de.neemann.digital.core.Node;
import de.neemann.digital.core.NodeException;
import de.neemann.digital.core.ObservableValue;
import de.neemann.digital.core.ObservableValues;
import de.neemann.digital.core.*;
import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
@ -37,9 +34,7 @@ public class BitCount extends Node implements Element {
*/
public BitCount(ElementAttributes attributes) {
inBits = attributes.get(Keys.BITS);
int outBits = 1;
while ((1 << outBits) <= inBits)
outBits++;
int outBits = Bits.binLn2(inBits);
output = new ObservableValue("out", outBits).setPinDescription(DESCRIPTION);
}

View File

@ -5,7 +5,6 @@ import de.neemann.digital.core.element.Element;
import de.neemann.digital.core.element.ElementAttributes;
import de.neemann.digital.core.element.ElementTypeDescription;
import de.neemann.digital.core.element.Keys;
import de.neemann.digital.draw.elements.PinException;
import de.neemann.digital.lang.Lang;
import static de.neemann.digital.core.element.PinInfo.input;
@ -46,8 +45,8 @@ public class BitExtender implements Element {
if (inBits >= outBits)
throw new NodeException(Lang.get("err_notMoreOutBitsThanInBits"));
final long signMask = 1L << (inBits - 1);
final long extendMask = ~((1L << inBits) - 1);
final long signMask = Bits.signedFlagMask(inBits);
final long extendMask = ~Bits.mask(inBits);
in.addObserver(() -> {
long inValue = in.getValue();
@ -59,7 +58,7 @@ public class BitExtender implements Element {
}
@Override
public ObservableValues getOutputs() throws PinException {
public ObservableValues getOutputs() {
return out.asList();
}

View File

@ -29,4 +29,20 @@ public class BitsTest extends TestCase {
assertEquals(1, Bits.signedFlagMask(1));
assertEquals(0x8000000000000000L, Bits.signedFlagMask(64));
}
public void testBitsLn2() {
assertEquals(1, Bits.binLn2(0));
assertEquals(1, Bits.binLn2(1));
assertEquals(2, Bits.binLn2(2));
assertEquals(2, Bits.binLn2(3));
assertEquals(3, Bits.binLn2(4));
assertEquals(3, Bits.binLn2(5));
assertEquals(3, Bits.binLn2(6));
assertEquals(3, Bits.binLn2(7));
assertEquals(4, Bits.binLn2(8));
assertEquals(4, Bits.binLn2(15));
assertEquals(5, Bits.binLn2(16));
assertEquals(5, Bits.binLn2(31));
assertEquals(6, Bits.binLn2(32));
}
}