mirror of
https://github.com/Z3Prover/z3
synced 2025-06-06 14:13:23 +00:00
fixes to fixed
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
9fcddc5774
commit
6488e33915
2 changed files with 73 additions and 70 deletions
|
@ -363,13 +363,13 @@ namespace bv {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_CONCAT: {
|
case OP_CONCAT: {
|
||||||
SASSERT(e->get_num_args() == 2);
|
unsigned bw = 0;
|
||||||
auto const& a = wval(e->get_arg(0));
|
for (unsigned i = e->get_num_args(); i-- > 0; ) {
|
||||||
auto const& b = wval(e->get_arg(1));
|
auto const& a = wval(e->get_arg(i));
|
||||||
for (unsigned i = 0; i < b.bw; ++i)
|
for (unsigned j = 0; j < a.bw; ++j)
|
||||||
val.eval.set(i, b.get_bit(i));
|
val.eval.set(j + bw, a.get_bit(j));
|
||||||
for (unsigned i = 0; i < a.bw; ++i)
|
bw += a.bw;
|
||||||
val.eval.set(i + b.bw, a.get_bit(i));
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_EXTRACT: {
|
case OP_EXTRACT: {
|
||||||
|
|
|
@ -340,26 +340,18 @@ namespace bv {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_BADD: {
|
case OP_BADD: {
|
||||||
SASSERT(e->get_num_args() == 2);
|
|
||||||
auto& a = ev.wval(e->get_arg(0));
|
|
||||||
auto& b = ev.wval(e->get_arg(1));
|
|
||||||
bool pfixed = true;
|
bool pfixed = true;
|
||||||
for (unsigned i = 0; i < v.bw; ++i) {
|
for (unsigned i = 0; i < v.bw; ++i) {
|
||||||
if (pfixed && a.fixed.get(i) && b.fixed.get(i))
|
for (unsigned j = 0; pfixed && j < e->get_num_args(); ++j) {
|
||||||
v.fixed.set(i, true);
|
auto& a = ev.wval(e->get_arg(j));
|
||||||
else if (!pfixed && a.fixed.get(i) && b.fixed.get(i) &&
|
pfixed &= a.fixed.get(i);
|
||||||
!a.get_bit(i) && !b.get_bit(i)) {
|
|
||||||
pfixed = true;
|
|
||||||
v.fixed.set(i, false);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
pfixed = false;
|
|
||||||
v.fixed.set(i, false);
|
|
||||||
}
|
}
|
||||||
|
v.fixed.set(i, pfixed);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_BMUL: {
|
case OP_BMUL: {
|
||||||
|
if (e->get_num_args() == 2) {
|
||||||
SASSERT(e->get_num_args() == 2);
|
SASSERT(e->get_num_args() == 2);
|
||||||
auto& a = ev.wval(e->get_arg(0));
|
auto& a = ev.wval(e->get_arg(0));
|
||||||
auto& b = ev.wval(e->get_arg(1));
|
auto& b = ev.wval(e->get_arg(1));
|
||||||
|
@ -409,16 +401,27 @@ namespace bv {
|
||||||
v.fixed.set(i, true);
|
v.fixed.set(i, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bool pfixed = true;
|
||||||
|
for (unsigned i = 0; i < v.bw; ++i) {
|
||||||
|
for (unsigned j = 0; pfixed && j < e->get_num_args(); ++j) {
|
||||||
|
auto& a = ev.wval(e->get_arg(j));
|
||||||
|
pfixed &= a.fixed.get(i);
|
||||||
|
}
|
||||||
|
v.fixed.set(i, pfixed);
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_CONCAT: {
|
case OP_CONCAT: {
|
||||||
SASSERT(e->get_num_args() == 2);
|
unsigned bw = 0;
|
||||||
auto& a = ev.wval(e->get_arg(0));
|
for (unsigned i = e->get_num_args(); i-- > 0; ) {
|
||||||
auto& b = ev.wval(e->get_arg(1));
|
auto& a = ev.wval(e->get_arg(i));
|
||||||
for (unsigned i = 0; i < b.bw; ++i)
|
for (unsigned j = 0; j < a.bw; ++j)
|
||||||
v.fixed.set(i, b.fixed.get(i));
|
v.fixed.set(bw + j, a.fixed.get(j));
|
||||||
for (unsigned i = 0; i < a.bw; ++i)
|
bw += a.bw;
|
||||||
v.fixed.set(i + b.bw, a.fixed.get(i));
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case OP_EXTRACT: {
|
case OP_EXTRACT: {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue