mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-19 09:54:49 -04:00
Migrated BarrelShifter, BitCount and BitExtender to new Bits helper.
This commit is contained in:
parent
6257946a23
commit
501e18b512
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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++;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user