diff --git a/crates/fayalite/src/int.rs b/crates/fayalite/src/int.rs index 68f1cac..b80c2b6 100644 --- a/crates/fayalite/src/int.rs +++ b/crates/fayalite/src/int.rs @@ -488,7 +488,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"), @@ -772,3 +775,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); + } +}