forked from libre-chip/fayalite
Fix SInt::for_value not accounting for sign bit for positive values
Fixes: #4
This commit is contained in:
parent
3ea0d98924
commit
c45624e3c2
|
@ -453,7 +453,10 @@ impl SInt {
|
|||
v.not().bits().checked_add(1).expect("too big")
|
||||
}
|
||||
Sign::NoSign => 0,
|
||||
Sign::Plus => v.bits(),
|
||||
Sign::Plus => {
|
||||
// account for sign bit
|
||||
v.bits().checked_add(1).expect("too big")
|
||||
}
|
||||
}
|
||||
.try_into()
|
||||
.expect("too big"),
|
||||
|
@ -693,3 +696,31 @@ impl ToLiteralBits for bool {
|
|||
Ok(interned_bit(*self))
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test_uint_for_value() {
|
||||
assert_eq!(UInt::for_value(0u8).width, 0);
|
||||
assert_eq!(UInt::for_value(1u8).width, 1);
|
||||
assert_eq!(UInt::for_value(2u8).width, 2);
|
||||
assert_eq!(UInt::for_value(3u8).width, 2);
|
||||
assert_eq!(UInt::for_value(4u8).width, 3);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_sint_for_value() {
|
||||
assert_eq!(SInt::for_value(-5).width, 4);
|
||||
assert_eq!(SInt::for_value(-4).width, 3);
|
||||
assert_eq!(SInt::for_value(-3).width, 3);
|
||||
assert_eq!(SInt::for_value(-2).width, 2);
|
||||
assert_eq!(SInt::for_value(-1).width, 1);
|
||||
assert_eq!(SInt::for_value(0).width, 0);
|
||||
assert_eq!(SInt::for_value(1).width, 2);
|
||||
assert_eq!(SInt::for_value(2).width, 3);
|
||||
assert_eq!(SInt::for_value(3).width, 3);
|
||||
assert_eq!(SInt::for_value(4).width, 4);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue