diff --git a/src/absy.rs b/src/absy.rs index 4b9bddc1..b2732fc0 100644 --- a/src/absy.rs +++ b/src/absy.rs @@ -93,9 +93,14 @@ impl Expression { if var.contains("_b") { let var_name = var.split("_b").collect::>()[0]; let mut num = inputs[var_name]; - assert!(num >= 0, format!("num < 0: {}", num)); - // TODO support negative numbers with two's complement!? - for i in (0..8).rev() { + let bits = 8; + if num < 0 { + num += 2i32.pow(bits - 1); + inputs.insert(format!("{}_b{}", &var_name, bits - 1), 1); + } else { + inputs.insert(format!("{}_b{}", &var_name, bits - 1), 0); + } + for i in (0..bits - 1).rev() { if 2i32.pow(i) <= num { num -= 2i32.pow(i); inputs.insert(format!("{}_b{}", &var_name, i), 1); diff --git a/src/flatten.rs b/src/flatten.rs index 1600f620..e19978bb 100644 --- a/src/flatten.rs +++ b/src/flatten.rs @@ -35,7 +35,7 @@ fn flatten_condition(statements_flattened: &mut Vec, num_variables: & )); } let mut expr = VariableReference(format!("{}_b0", &cond_result)); // * 2^0 - for i in 1..bits { + for i in 1..bits - 1 { expr = Add( box Mult( box VariableReference(format!("{}_b{}", &cond_result, i)), @@ -44,6 +44,13 @@ fn flatten_condition(statements_flattened: &mut Vec, num_variables: & box expr ); } + expr = Add( + box Mult( + box VariableReference(format!("{}_b{}", &cond_result, bits - 1)), + box NumberLiteral(-2i32.pow(bits - 1)) + ), + box expr + ); statements_flattened.push(Statement::Definition(cond_result.to_string(), expr)); let cond_true = format!("{}_b{}", &cond_result, bits - 1);