X-Git-Url: https://mograsim.net/gitweb/?a=blobdiff_plain;f=net.mograsim.logic.core%2Fsrc%2Fnet%2Fmograsim%2Flogic%2Fcore%2Ftypes%2FBitVector.java;h=4e0fe0b78744b4325c21ef2d8beb0284cfab1553;hb=76fdc144f22b60491e61a32860fe2e6881751505;hp=cce83f43330a9231ee8a37f1bbcf301784430fe0;hpb=47ea68ed5c444dd14864412639f6a6fd60ab8a0f;p=Mograsim.git diff --git a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java index cce83f43..4e0fe0b7 100644 --- a/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java +++ b/net.mograsim.logic.core/src/net/mograsim/logic/core/types/BitVector.java @@ -2,6 +2,7 @@ package net.mograsim.logic.core.types; import static java.lang.String.format; +import java.math.BigInteger; import java.util.Arrays; import java.util.Iterator; import java.util.NoSuchElementException; @@ -18,8 +19,22 @@ import java.util.function.UnaryOperator; */ public final class BitVector implements StrictLogicType, Iterable, 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 @@ -30,14 +45,31 @@ public final class BitVector implements StrictLogicType, Iterable, Iterable, Iterable, Iterable, Iterable, Iterable + * An empty BitVectorMutator must not be converted to BitVector or used to manipulate single bits until at least one two + * operand logic operation is performed. */ public static BitVectorMutator empty() { return new BitVectorMutator(null); } + /** + * @see #empty() + */ + public boolean isEmpty() + { + return bits == null; + } + /** * Produces the resulting, immutable {@link BitVector}
* @@ -239,6 +307,8 @@ public final class BitVector implements StrictLogicType, Iterable, Iterable, Iterable, Iterable, Iterableoffset to the right.
- * Therefore offset + other.length() <= this.length() needs to be true. + * Therefore offset + other.length() <= this.wdith() needs to be true. * * @throws ArrayIndexOutOfBoundsException if offset + other.length() > this.length() * @@ -332,6 +410,33 @@ public final class BitVector implements StrictLogicType, Iterable= 0; i--) + { + if (Bit.ONE == bits[bits.length - i - 1]) + { + try + { + bytes[bytes.length - (i / 8) - 1] |= 1 << (i % 8); + } + catch (IndexOutOfBoundsException e) + { + e.printStackTrace(); + } + } + } + return new BigInteger(bytes); + } + /** * Parses a String containing solely {@link Bit} symbols (MSB first) *