Add two's complement
This commit is contained in:
parent
e3727858ab
commit
4c68fc8f47
2 changed files with 16 additions and 4 deletions
11
src/absy.rs
11
src/absy.rs
|
@ -93,9 +93,14 @@ impl Expression {
|
||||||
if var.contains("_b") {
|
if var.contains("_b") {
|
||||||
let var_name = var.split("_b").collect::<Vec<_>>()[0];
|
let var_name = var.split("_b").collect::<Vec<_>>()[0];
|
||||||
let mut num = inputs[var_name];
|
let mut num = inputs[var_name];
|
||||||
assert!(num >= 0, format!("num < 0: {}", num));
|
let bits = 8;
|
||||||
// TODO support negative numbers with two's complement!?
|
if num < 0 {
|
||||||
for i in (0..8).rev() {
|
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 {
|
if 2i32.pow(i) <= num {
|
||||||
num -= 2i32.pow(i);
|
num -= 2i32.pow(i);
|
||||||
inputs.insert(format!("{}_b{}", &var_name, i), 1);
|
inputs.insert(format!("{}_b{}", &var_name, i), 1);
|
||||||
|
|
|
@ -35,7 +35,7 @@ fn flatten_condition(statements_flattened: &mut Vec<Statement>, num_variables: &
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
let mut expr = VariableReference(format!("{}_b0", &cond_result)); // * 2^0
|
let mut expr = VariableReference(format!("{}_b0", &cond_result)); // * 2^0
|
||||||
for i in 1..bits {
|
for i in 1..bits - 1 {
|
||||||
expr = Add(
|
expr = Add(
|
||||||
box Mult(
|
box Mult(
|
||||||
box VariableReference(format!("{}_b{}", &cond_result, i)),
|
box VariableReference(format!("{}_b{}", &cond_result, i)),
|
||||||
|
@ -44,6 +44,13 @@ fn flatten_condition(statements_flattened: &mut Vec<Statement>, num_variables: &
|
||||||
box expr
|
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));
|
statements_flattened.push(Statement::Definition(cond_result.to_string(), expr));
|
||||||
|
|
||||||
let cond_true = format!("{}_b{}", &cond_result, bits - 1);
|
let cond_true = format!("{}_b{}", &cond_result, bits - 1);
|
||||||
|
|
Loading…
Reference in a new issue