pub enum Bits<const N: usize> {
// some variants omitted
}
Expand description
The Bits type holds a bit array of size [N].
Implementations
sourceimpl<const N: usize> Bits<N>
impl<const N: usize> Bits<N>
sourcepub fn any(&self) -> bool
pub fn any(&self) -> bool
The [any] function returns true if any of the individual bits are true, and false otherwise. This reduction operation is equivalent to a logical OR of all the bits in the vector.
let x : Bits<14> = bits(0xDEA);
assert_eq!(x.any(), true);
let y : Bits<14> = Bits::default();
assert_eq!(y.any(), false);
sourcepub fn all(&self) -> bool
pub fn all(&self) -> bool
The [all] function returns true if all of the individual bits are true, and false otherwise. This reduction operation is equivalent to a logical AND of all the bits in the vector.
let x : Bits<14> = bits(0xDEA);
assert_eq!(x.all(), false);
let y : Bits<14> = bits(0x3FFF);
assert_eq!(y.all(), true);
sourcepub fn xor(&self) -> bool
pub fn xor(&self) -> bool
The [xor] function computes the exclusive OR of all the bits in the vector. This is equivalent to counting the number of ones. If the number is odd, the XOR will be true. If even, it will be false.
let x: Bits<12> = bits(0b1100_0100_1100);
assert_eq!(x.xor(), true);
let y: Bits<12> = bits(0b1100_0110_1100);
assert_eq!(y.xor(), false);
sourcepub fn index(&self) -> usize
pub fn index(&self) -> usize
The [index] function is used when a Bits is going to be used to index into an array or some other bit vector. This is typically a very specialized hardware operation, so there are limited cases in which it can be used. Also, there is an assumption that the Bits being used as an index is sufficiently small to fit in a natural word (assume 32 bits, here for safety). In practice, that means, that if you are indexing into a register using some other register/value, the length of the register is limited to a few billion bits.
let x: Bits<12> = bits(0b1100_0100_1100);
assert_eq!(x.index(), 0b1100_0100_1100_usize);
sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
Return the number of bits in the current Bits. Because this is determined at compile time, it is of limited use as a runtime function, but is there nonetheless.
let x : Bits<14> = Bits::default();
assert_eq!(x.len(), 14);
sourcepub fn count() -> u128
pub fn count() -> u128
Compute the number of possible values that a Bits can take. This is basically 2 raised to the Nth power. Because the result is returned as a usize, you must be careful, since this can easily overflow. A Bits<256> for example, cannot represent [count] on a normal 64 bit machine.
assert_eq!(Bits::<16>::count(), 1 << 16);
sourcepub fn get_bit(&self, index: usize) -> bool
pub fn get_bit(&self, index: usize) -> bool
Extract the [index] bit from the given Bits. This will cause a runtime panic if the [index] bit is out of range of the width of the bitvector.
let x : Bits<14> = bits(0b10110);
assert_eq!(x.get_bit(0), false);
assert_eq!(x.get_bit(1), true);
assert_eq!(x.get_bit(2), true); // You get the idea
sourcepub fn replace_bit(&self, index: usize, val: bool) -> Self
pub fn replace_bit(&self, index: usize, val: bool) -> Self
Replace the given bit of a Bits with a new bit value. This method leaves the original value alone, and returns a new Bits with all bits except the designated one left alone.
let x: Bits<16> = bits(0b1100_0000);
let x = x.replace_bit(0, true);
let x = x.replace_bit(7, false);
assert_eq!(x, bits(0b0100_0001));
sourcepub fn get_bits<const M: usize>(&self, index: usize) -> Bits<M>
pub fn get_bits<const M: usize>(&self, index: usize) -> Bits<M>
Return a subset of bits from a Bits value, with a given offset. To preserve the feasibility of representing this in hardware, the width of the result must be fixed (the argument [M]), and only the offset can be computed.
let x: Bits<40> = bits(0xDEAD_BEEF_CA);
let y = x.get_bits::<32>(8);
assert_eq!(y, bits(0xDEAD_BEEF))
sourcepub fn set_bits<const M: usize>(&mut self, index: usize, rhs: Bits<M>)
pub fn set_bits<const M: usize>(&mut self, index: usize, rhs: Bits<M>)
Set a group of bits in a value. This operation modifies the value in place.
let mut x: Bits<40> = bits(0xDEAD_BEEF_CA);
x.set_bits::<16>(8, bits(0xCAFE));
assert_eq!(x, bits(0xDEAD_CAFE_CA));
sourcepub fn mask() -> Bits<N>
pub fn mask() -> Bits<N>
Returns a Bits value that contains [N] ones.
let x = Bits::<40>::mask();
assert_eq!(x, bits(0xFF_FFFF_FFFF));
sourcepub const fn width() -> usize
pub const fn width() -> usize
Returns the width in bits of the [BitVec]. Note that this is the number of bits allocated. It does not depend on the value at all.
assert_eq!(Bits::<40>::width(), 40);
Trait Implementations
sourceimpl<const N: usize> Add<Bits<N>> for LiteralType
impl<const N: usize> Add<Bits<N>> for LiteralType
sourceimpl<const N: usize> Binary for Bits<N>
impl<const N: usize> Binary for Bits<N>
Allows you to format a Bits as a binary string
let y = Bits::<16>::from(0b1011_0100_0010_0000);
println!("y = {:b}", y); // Prints y = 1011010000100000
sourceimpl<const N: usize> BitAnd<Bits<N>> for LiteralType
impl<const N: usize> BitAnd<Bits<N>> for LiteralType
sourceimpl<const N: usize> BitOr<Bits<N>> for LiteralType
impl<const N: usize> BitOr<Bits<N>> for LiteralType
sourceimpl<const N: usize> BitXor<Bits<N>> for LiteralType
impl<const N: usize> BitXor<Bits<N>> for LiteralType
sourceimpl<const N: usize> Default for Bits<N>
impl<const N: usize> Default for Bits<N>
Construct a default Bits - i.e., a zero bit vector of length N.
let x : Bits<200> = Default::default();
assert_eq!(x, bits(0));
sourceimpl<const N: usize> From<BigUint> for Bits<N>
impl<const N: usize> From<BigUint> for Bits<N>
Convert from a BigUint to a Bits. Will panic if the number of bits needed to represent the value are greater than the width of the Bits.
let x = BigUint::parse_bytes(b"10111000101", 2).unwrap();
let y : Bits<16> = x.into();
println!("y = {:x}", y); // Prints y = 02c5
The following will panic, because the value cannot be represented in the given number of bits.
let x = BigUint::parse_bytes(b"10111000101", 2).unwrap();
let y : Bits<12> = x.into(); // Panics
sourceimpl<const N: usize> From<Bits<N>> for BigUint
impl<const N: usize> From<Bits<N>> for BigUint
sourceimpl<const N: usize> From<Bits<N>> for LiteralType
impl<const N: usize> From<Bits<N>> for LiteralType
Convert a Bits back to u128. Until Rust supports larger integers, the u128 is the largest integer type you can use without resorting to BigUint. RustHDL will panic if you try to convert a Bits that is more than 128 bits to a literal. Even if the value in the bitvector would fit.
let x: Bits<16> = 0xDEAD.into();
let y: u128 = x.to_u128();
assert_eq!(y, 0xDEAD);
The following will panic even through the literal value stored in the 256 bit vector is less than 128 bits.
let x : Bits<256> = 42.into();
let y: u128 = x.to_u128(); // Panics!
sourceimpl<const N: usize> From<Wrapping<u64>> for Bits<N>
impl<const N: usize> From<Wrapping<u64>> for Bits<N>
sourcefn from(x: Wrapping<LiteralType>) -> Self
fn from(x: Wrapping<LiteralType>) -> Self
Converts to this type from the input type.
sourceimpl<const N: usize> From<u64> for Bits<N>
impl<const N: usize> From<u64> for Bits<N>
Convert from LiteralType to Bits. Because of some restrictions on
how Rust’s type inference works, when you work with unsized
literals (e.g., x = 3
), there must either be a unique integer type
that can fit the expression, or it will default to i32
. Unfortunately,
in general, Bits are used to represent unsigned types. The upshot
of all this is that RustHDL selects one unsigned integer type to represent
literals. Although not ideal, RustHDL uses a LiteralType (currently ‘u64’) to represent literals
so as to make HDL expressions close to Verilog or VHDL. This choice should not affect
any hardware implementation, as hardware registers need to be of Bits type.
let x: Bits<16> = 0xDEAD.into(); // This is interpreteed as a 128 bit constant by Rust
This example is the largest bit width literal you can express using current edition Rust:
let x: Bits<128> = 0xDEADBEEF_CAFEBABE_1234ABCD_00005EA1_u128.to_bits();
From a safety perspective, RustHDL will panic if the argument is too large to fit into the bit vector. Thus, this example will panic, since the literal cannot be fit into 16 bits without truncation:
let x: Bits<16> = 0xDEADBEEF.into(); // This will panic!
sourcefn from(x: LiteralType) -> Self
fn from(x: LiteralType) -> Self
Converts to this type from the input type.
sourceimpl Into<Bits<LogicState>> for I2CControllerCmd
impl Into<Bits<LogicState>> for I2CControllerCmd
sourceimpl Into<Bits<LogicState>> for I2CDriverCmd
impl Into<Bits<LogicState>> for I2CDriverCmd
sourceimpl Into<Bits<LogicState>> for SDRAMCommand
impl Into<Bits<LogicState>> for SDRAMCommand
sourceimpl<const N: usize> LowerHex for Bits<N>
impl<const N: usize> LowerHex for Bits<N>
Allows you to format a Bits as a lowercase hex string
let y = Bits::<16>::from(0xcafe);
println!("y = {:x}", y); // Prints y = cafe
sourceimpl Mul<Bits<16>> for Bits<16>
impl Mul<Bits<16>> for Bits<16>
Multipliers are special, so we only implement multipliers that we think are synthesizable. In this case, we implement a 16 x 16 bit multiplier which yields a 32 bit result.
sourceimpl<const N: usize> Not for Bits<N>
impl<const N: usize> Not for Bits<N>
sourceimpl<const N: usize> Shl<Bits<N>> for LiteralType
impl<const N: usize> Shl<Bits<N>> for LiteralType
sourceimpl<const N: usize> Shr<Bits<N>> for LiteralType
impl<const N: usize> Shr<Bits<N>> for LiteralType
sourceimpl<const N: usize> Sub<Bits<N>> for LiteralType
impl<const N: usize> Sub<Bits<N>> for LiteralType
sourceimpl<const N: usize> UpperHex for Bits<N>
impl<const N: usize> UpperHex for Bits<N>
Allows you to format a Bits as an uppercase hex string
let y = Bits::<16>::from(0xcafe);
println!("y = {:X}", y); // Prints y = CAFE
impl<const N: usize> Copy for Bits<N>
Auto Trait Implementations
impl<const N: usize> RefUnwindSafe for Bits<N>
impl<const N: usize> Send for Bits<N>
impl<const N: usize> Sync for Bits<N>
impl<const N: usize> Unpin for Bits<N>
impl<const N: usize> UnwindSafe for Bits<N>
Blanket Implementations
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
sourceimpl<Q, K> Equivalent<K> for Q where
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
impl<Q, K> Equivalent<K> for Q where
Q: Eq + ?Sized,
K: Borrow<Q> + ?Sized,
sourcefn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
Compare self to key
and return true
if they are equal.