import static java.lang.String.format;
+import java.math.BigInteger;
import java.util.Arrays;
import java.util.Iterator;
import java.util.NoSuchElementException;
*/
public final class BitVector implements StrictLogicType<BitVector>, Iterable<Bit>, RandomAccess
{
+ public static final BitVector SINGLE_U = new BitVector(Bit.U);
+ public static final BitVector SINGLE_X = new BitVector(Bit.X);
+ public static final BitVector SINGLE_0 = new BitVector(Bit.ZERO);
+ public static final BitVector SINGLE_1 = new BitVector(Bit.ONE);
+ public static final BitVector SINGLE_Z = new BitVector(Bit.Z);
+
+ private static final BitVector[] SINGLE_BIT_MAPPING = { SINGLE_U, SINGLE_X, SINGLE_0, SINGLE_1, SINGLE_Z };
+
private final Bit[] bits;
+ private BitVector(Bit single)
+ {
+ Objects.requireNonNull(single);
+ bits = new Bit[] { single };
+ }
+
private BitVector(Bit[] bits)
{
this.bits = Objects.requireNonNull(bits); // do this first to "catch" bits==null before the foreach loop
public static BitVector of(Bit... bits)
{
+ if (bits.length == 1)
+ return SINGLE_BIT_MAPPING[bits[0].ordinal()];
return new BitVector(bits.clone());
}
public static BitVector of(Bit bit, int length)
{
+ if (length == 1)
+ return SINGLE_BIT_MAPPING[bit.ordinal()];
return new BitVector(bit.makeArray(length));
}
public BitVector join(BitVector t)
{
checkCompatibility(t);
+ if (bits.length == 1)
+ return SINGLE_BIT_MAPPING[bits[0].join(t.bits[0]).ordinal()];
return new BitVector(binOp(bits.clone(), t.bits, Bit::join));
}
public BitVector and(BitVector t)
{
checkCompatibility(t);
+ if (bits.length == 1)
+ return SINGLE_BIT_MAPPING[bits[0].and(t.bits[0]).ordinal()];
return new BitVector(binOp(bits.clone(), t.bits, Bit::and));
}
public BitVector or(BitVector t)
{
checkCompatibility(t);
+ if (bits.length == 1)
+ return SINGLE_BIT_MAPPING[bits[0].or(t.bits[0]).ordinal()];
return new BitVector(binOp(bits.clone(), t.bits, Bit::or));
}
public BitVector xor(BitVector t)
{
checkCompatibility(t);
+ if (bits.length == 1)
+ return SINGLE_BIT_MAPPING[bits[0].xor(t.bits[0]).ordinal()];
return new BitVector(binOp(bits.clone(), t.bits, Bit::xor));
}
@Override
public BitVector not()
{
+ if (bits.length == 1)
+ return SINGLE_BIT_MAPPING[bits[0].not().ordinal()];
return new BitVector(unOp(bits.clone(), Bit::not));
}
return new BitVector(values);
}
+ public static BitVector of(long value, int bits)
+ {
+ return of(BigInteger.valueOf(value), bits);
+ }
+
+ public static BitVector of(BigInteger value, int bits)
+ {
+ Bit[] values = new Bit[bits];
+ for (int i = 0; i < bits; i++)
+ {
+ values[bits - i - 1] = Bit.of(value.testBit(i));
+ }
+ return new BitVector(values);
+ }
+
/**
* Iterate over the {@link Bit}s of the BitVector <b>from MSB to LSB</b> (left to right).
*/