1
0
Fork 0
mirror of synced 2025-09-23 12:18:44 +00:00

Add two's complement

This commit is contained in:
Dennis Kuhnert 2017-02-06 18:09:44 +01:00
parent e3727858ab
commit 4c68fc8f47
2 changed files with 16 additions and 4 deletions

View file

@ -93,9 +93,14 @@ impl Expression {
if var.contains("_b") {
let var_name = var.split("_b").collect::<Vec<_>>()[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);

View file

@ -35,7 +35,7 @@ fn flatten_condition(statements_flattened: &mut Vec<Statement>, 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<Statement>, 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);