1 /********************* */
2 /*! \file bv_inverter_utils.cpp
4 ** Top contributors (to current version):
5 ** Aina Niemetz, Mathias Preiner
6 ** This file is part of the CVC4 project.
7 ** Copyright (c) 2009-2021 by the authors listed in the file AUTHORS
8 ** in the top-level source directory and their institutional affiliations.
9 ** All rights reserved. See the file COPYING in the top-level source
10 ** directory for licensing information.\endverbatim
12 ** \brief inverse rules for bit-vector operators
15 #include "theory/quantifiers/bv_inverter_utils.h"
16 #include "theory/bv/theory_bv_utils.h"
18 using namespace cvc5::kind
;
22 namespace quantifiers
{
25 Node
getICBvUltUgt(bool pol
, Kind k
, Node x
, Node t
)
27 Assert(k
== BITVECTOR_ULT
|| k
== BITVECTOR_UGT
);
29 NodeManager
* nm
= NodeManager::currentNM();
30 unsigned w
= bv::utils::getSize(t
);
33 if (k
== BITVECTOR_ULT
)
38 * with invertibility condition:
41 * z = 0 with getSize(z) = w */
42 Node scl
= nm
->mkNode(DISTINCT
, t
, bv::utils::mkZero(w
));
43 Node scr
= nm
->mkNode(k
, x
, t
);
44 ic
= nm
->mkNode(IMPLIES
, scl
, scr
);
49 * with invertibility condition:
50 * true (no invertibility condition) */
51 ic
= nm
->mkNode(NOT
, nm
->mkNode(k
, x
, t
));
56 Assert(k
== BITVECTOR_UGT
);
60 * with invertibility condition:
63 * ones = ~0 with getSize(ones) = w */
64 Node scl
= nm
->mkNode(DISTINCT
, t
, bv::utils::mkOnes(w
));
65 Node scr
= nm
->mkNode(k
, x
, t
);
66 ic
= nm
->mkNode(IMPLIES
, scl
, scr
);
71 * with invertibility condition:
72 * true (no invertibility condition) */
73 ic
= nm
->mkNode(NOT
, nm
->mkNode(k
, x
, t
));
76 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
80 Node
getICBvSltSgt(bool pol
, Kind k
, Node x
, Node t
)
82 Assert(k
== BITVECTOR_SLT
|| k
== BITVECTOR_SGT
);
84 NodeManager
* nm
= NodeManager::currentNM();
85 unsigned w
= bv::utils::getSize(t
);
88 if (k
== BITVECTOR_SLT
)
93 * with invertibility condition:
96 * min is the minimum signed value with getSize(min) = w */
97 Node min
= bv::utils::mkMinSigned(w
);
98 Node scl
= nm
->mkNode(DISTINCT
, min
, t
);
99 Node scr
= nm
->mkNode(k
, x
, t
);
100 ic
= nm
->mkNode(IMPLIES
, scl
, scr
);
105 * with invertibility condition:
106 * true (no invertibility condition) */
107 ic
= nm
->mkNode(NOT
, nm
->mkNode(k
, x
, t
));
112 Assert(k
== BITVECTOR_SGT
);
116 * with invertibility condition:
119 * max is the signed maximum value with getSize(max) = w */
120 Node max
= bv::utils::mkMaxSigned(w
);
121 Node scl
= nm
->mkNode(DISTINCT
, t
, max
);
122 Node scr
= nm
->mkNode(k
, x
, t
);
123 ic
= nm
->mkNode(IMPLIES
, scl
, scr
);
128 * with invertibility condition:
129 * true (no invertibility condition) */
130 ic
= nm
->mkNode(NOT
, nm
->mkNode(k
, x
, t
));
133 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
138 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
140 Assert(k
== BITVECTOR_MULT
);
141 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
142 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
144 NodeManager
* nm
= NodeManager::currentNM();
146 unsigned w
= bv::utils::getSize(s
);
147 Assert(w
== bv::utils::getSize(t
));
151 Node z
= bv::utils::mkZero(w
);
156 * with invertibility condition (synthesized):
157 * (= (bvand (bvor (bvneg s) s) t) t)
165 * (bvuge (bvand t (bvneg t)) (bvand s (bvneg s)))
168 * z = 0 with getSize(z) = w */
169 Node o
= nm
->mkNode(BITVECTOR_OR
, nm
->mkNode(BITVECTOR_NEG
, s
), s
);
170 scl
= nm
->mkNode(EQUAL
, nm
->mkNode(BITVECTOR_AND
, o
, t
), t
);
175 * with invertibility condition:
176 * (or (distinct t z) (distinct s z))
178 * z = 0 with getSize(z) = w */
179 scl
= nm
->mkNode(OR
, t
.eqNode(z
).notNode(), s
.eqNode(z
).notNode());
182 else if (litk
== BITVECTOR_ULT
)
187 * with invertibility condition (synthesized):
190 * z = 0 with getSize(z) = w */
191 Node z
= bv::utils::mkZero(w
);
192 scl
= nm
->mkNode(DISTINCT
, t
, z
);
197 * with invertibility condition (synthesized):
198 * (bvuge (bvor (bvneg s) s) t) */
199 Node o
= nm
->mkNode(BITVECTOR_OR
, nm
->mkNode(BITVECTOR_NEG
, s
), s
);
200 scl
= nm
->mkNode(BITVECTOR_UGE
, o
, t
);
203 else if (litk
== BITVECTOR_UGT
)
208 * with invertibility condition (synthesized):
209 * (bvult t (bvor (bvneg s) s)) */
210 Node o
= nm
->mkNode(BITVECTOR_OR
, nm
->mkNode(BITVECTOR_NEG
, s
), s
);
211 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, o
);
216 * true (no invertibility condition) */
217 scl
= nm
->mkConst
<bool>(true);
220 else if (litk
== BITVECTOR_SLT
)
225 * with invertibility condition (synthesized):
226 * (bvslt (bvand (bvnot (bvneg t)) (bvor (bvneg s) s)) t) */
227 Node a1
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_NEG
, t
));
228 Node a2
= nm
->mkNode(BITVECTOR_OR
, nm
->mkNode(BITVECTOR_NEG
, s
), s
);
229 scl
= nm
->mkNode(BITVECTOR_SLT
, nm
->mkNode(BITVECTOR_AND
, a1
, a2
), t
);
234 * with invertibility condition (synthesized):
235 * (bvsge (bvand (bvor (bvneg s) s) max) t)
237 * max is the signed maximum value with getSize(max) = w */
238 Node max
= bv::utils::mkMaxSigned(w
);
239 Node o
= nm
->mkNode(BITVECTOR_OR
, nm
->mkNode(BITVECTOR_NEG
, s
), s
);
240 Node a
= nm
->mkNode(BITVECTOR_AND
, o
, max
);
241 scl
= nm
->mkNode(BITVECTOR_SGE
, a
, t
);
246 Assert(litk
== BITVECTOR_SGT
);
250 * with invertibility condition (synthesized):
251 * (bvslt t (bvsub t (bvor (bvor s t) (bvneg s)))) */
252 Node o
= nm
->mkNode(BITVECTOR_OR
,
253 nm
->mkNode(BITVECTOR_OR
, s
, t
),
254 nm
->mkNode(BITVECTOR_NEG
, s
));
255 Node sub
= nm
->mkNode(BITVECTOR_SUB
, t
, o
);
256 scl
= nm
->mkNode(BITVECTOR_SLT
, t
, sub
);
261 * with invertibility condition (synthesized):
262 * (not (and (= s z) (bvslt t s)))
264 * z = 0 with getSize(z) = w */
265 Node z
= bv::utils::mkZero(w
);
266 scl
= nm
->mkNode(AND
, s
.eqNode(z
), nm
->mkNode(BITVECTOR_SLT
, t
, s
));
272 nm
->mkNode(litk
, idx
== 0 ? nm
->mkNode(k
, x
, s
) : nm
->mkNode(k
, s
, x
), t
);
273 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
274 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
279 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
281 Assert(k
== BITVECTOR_UREM
);
282 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
283 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
285 NodeManager
* nm
= NodeManager::currentNM();
287 unsigned w
= bv::utils::getSize(s
);
288 Assert(w
== bv::utils::getSize(t
));
297 * with invertibility condition (synthesized):
298 * (bvuge (bvnot (bvneg s)) t) */
299 Node neg
= nm
->mkNode(BITVECTOR_NEG
, s
);
300 scl
= nm
->mkNode(BITVECTOR_UGE
, nm
->mkNode(BITVECTOR_NOT
, neg
), t
);
305 * with invertibility condition:
306 * (or (distinct s (_ bv1 w)) (distinct t z))
308 * z = 0 with getSize(z) = w */
309 Node z
= bv::utils::mkZero(w
);
311 OR
, s
.eqNode(bv::utils::mkOne(w
)).notNode(), t
.eqNode(z
).notNode());
319 * with invertibility condition (synthesized):
320 * (bvuge (bvand (bvsub (bvadd t t) s) s) t)
325 * (bvugt (bvsub s t) t)
326 * (or (= t z) (distinct (bvsub s (_ bv1 w)) t))))
328 * z = 0 with getSize(z) = w */
329 Node add
= nm
->mkNode(BITVECTOR_PLUS
, t
, t
);
330 Node sub
= nm
->mkNode(BITVECTOR_SUB
, add
, s
);
331 Node a
= nm
->mkNode(BITVECTOR_AND
, sub
, s
);
332 scl
= nm
->mkNode(BITVECTOR_UGE
, a
, t
);
337 * with invertibility condition:
338 * (or (distinct s z) (distinct t z))
340 * z = 0 with getSize(z) = w */
341 Node z
= bv::utils::mkZero(w
);
342 scl
= nm
->mkNode(OR
, s
.eqNode(z
).notNode(), t
.eqNode(z
).notNode());
346 else if (litk
== BITVECTOR_ULT
)
353 * with invertibility condition:
356 * z = 0 with getSize(z) = w */
357 Node z
= bv::utils::mkZero(w
);
358 scl
= t
.eqNode(z
).notNode();
363 * with invertibility condition (synthesized):
364 * (bvuge (bvnot (bvneg s)) t) */
365 Node neg
= nm
->mkNode(BITVECTOR_NEG
, s
);
366 scl
= nm
->mkNode(BITVECTOR_UGE
, nm
->mkNode(BITVECTOR_NOT
, neg
), t
);
374 * with invertibility condition:
377 * z = 0 with getSize(z) = w */
378 Node z
= bv::utils::mkZero(w
);
379 scl
= t
.eqNode(z
).notNode();
384 * with invertibility condition (combination of = and >):
386 * (bvuge (bvand (bvsub (bvadd t t) s) s) t) ; eq, synthesized
387 * (bvult t s)) ; ugt, synthesized */
388 Node add
= nm
->mkNode(BITVECTOR_PLUS
, t
, t
);
389 Node sub
= nm
->mkNode(BITVECTOR_SUB
, add
, s
);
390 Node a
= nm
->mkNode(BITVECTOR_AND
, sub
, s
);
391 Node sceq
= nm
->mkNode(BITVECTOR_UGE
, a
, t
);
392 Node scugt
= nm
->mkNode(BITVECTOR_ULT
, t
, s
);
393 scl
= nm
->mkNode(OR
, sceq
, scugt
);
397 else if (litk
== BITVECTOR_UGT
)
404 * with invertibility condition (synthesized):
405 * (bvult t (bvnot (bvneg s))) */
406 Node nt
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_NEG
, s
));
407 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, nt
);
412 * true (no invertibility condition) */
413 scl
= nm
->mkConst
<bool>(true);
421 * with invertibility condition (synthesized):
423 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, s
);
428 * true (no invertibility condition) */
429 scl
= nm
->mkConst
<bool>(true);
433 else if (litk
== BITVECTOR_SLT
)
440 * with invertibility condition (synthesized):
441 * (bvslt (bvnot t) (bvor (bvneg s) (bvneg t))) */
442 Node o1
= nm
->mkNode(BITVECTOR_NEG
, s
);
443 Node o2
= nm
->mkNode(BITVECTOR_NEG
, t
);
444 Node o
= nm
->mkNode(BITVECTOR_OR
, o1
, o2
);
445 scl
= nm
->mkNode(BITVECTOR_SLT
, nm
->mkNode(BITVECTOR_NOT
, t
), o
);
450 * with invertibility condition (synthesized):
451 * (or (bvslt t s) (bvsge z s))
453 * z = 0 with getSize(z) = w */
454 Node z
= bv::utils::mkZero(w
);
455 Node s1
= nm
->mkNode(BITVECTOR_SLT
, t
, s
);
456 Node s2
= nm
->mkNode(BITVECTOR_SGE
, z
, s
);
457 scl
= nm
->mkNode(OR
, s1
, s2
);
462 Node z
= bv::utils::mkZero(w
);
467 * with invertibility condition (synthesized):
468 * (or (bvslt s t) (bvslt z t))
470 * z = 0 with getSize(z) = w */
471 Node slt1
= nm
->mkNode(BITVECTOR_SLT
, s
, t
);
472 Node slt2
= nm
->mkNode(BITVECTOR_SLT
, z
, t
);
473 scl
= nm
->mkNode(OR
, slt1
, slt2
);
478 * with invertibility condition:
480 * (=> (bvsge s z) (bvsge s t))
481 * (=> (and (bvslt s z) (bvsge t z)) (bvugt (bvsub s t) t)))
483 * z = 0 with getSize(z) = w */
484 Node i1
= nm
->mkNode(IMPLIES
,
485 nm
->mkNode(BITVECTOR_SGE
, s
, z
),
486 nm
->mkNode(BITVECTOR_SGE
, s
, t
));
487 Node i2
= nm
->mkNode(
490 nm
->mkNode(BITVECTOR_SLT
, s
, z
),
491 nm
->mkNode(BITVECTOR_SGE
, t
, z
)),
492 nm
->mkNode(BITVECTOR_UGT
, nm
->mkNode(BITVECTOR_SUB
, s
, t
), t
));
493 scl
= nm
->mkNode(AND
, i1
, i2
);
499 Assert(litk
== BITVECTOR_SGT
);
502 Node z
= bv::utils::mkZero(w
);
507 * with invertibility condition:
511 * (=> (bvsgt s z) (bvslt t (bvnot (bvneg s))))
512 * (=> (bvsle s z) (distinct t max)))
513 * (or (distinct t z) (distinct s (_ bv1 w))))
515 * z = 0 with getSize(z) = w
516 * and max is the maximum signed value with getSize(max) = w */
517 Node max
= bv::utils::mkMaxSigned(w
);
518 Node nt
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_NEG
, s
));
519 Node i1
= nm
->mkNode(IMPLIES
,
520 nm
->mkNode(BITVECTOR_SGT
, s
, z
),
521 nm
->mkNode(BITVECTOR_SLT
, t
, nt
));
522 Node i2
= nm
->mkNode(
523 IMPLIES
, nm
->mkNode(BITVECTOR_SLE
, s
, z
), t
.eqNode(max
).notNode());
524 Node a1
= nm
->mkNode(AND
, i1
, i2
);
525 Node a2
= nm
->mkNode(
526 OR
, t
.eqNode(z
).notNode(), s
.eqNode(bv::utils::mkOne(w
)).notNode());
527 scl
= nm
->mkNode(AND
, a1
, a2
);
532 * with invertibility condition (synthesized):
533 * (bvslt ones (bvand (bvneg s) t))
535 * z = 0 with getSize(z) = w
536 * and ones = ~0 with getSize(ones) = w */
537 Node a
= nm
->mkNode(BITVECTOR_AND
, nm
->mkNode(BITVECTOR_NEG
, s
), t
);
538 scl
= nm
->mkNode(BITVECTOR_SLT
, bv::utils::mkOnes(w
), a
);
546 * with invertibility condition:
548 * (=> (bvsge s z) (bvsgt s t))
550 * (bvsgt (bvlshr (bvsub s (_ bv1 w)) (_ bv1 w)) t)))
552 * z = 0 with getSize(z) = w */
553 Node z
= bv::utils::mkZero(w
);
554 Node i1
= nm
->mkNode(IMPLIES
,
555 nm
->mkNode(BITVECTOR_SGE
, s
, z
),
556 nm
->mkNode(BITVECTOR_SGT
, s
, t
));
557 Node shr
= nm
->mkNode(
558 BITVECTOR_LSHR
, bv::utils::mkDec(s
), bv::utils::mkOne(w
));
559 Node i2
= nm
->mkNode(IMPLIES
,
560 nm
->mkNode(BITVECTOR_SLT
, s
, z
),
561 nm
->mkNode(BITVECTOR_SGT
, shr
, t
));
562 scl
= nm
->mkNode(AND
, i1
, i2
);
567 * with invertibility condition (synthesized):
568 * (or (bvult t min) (bvsge t s))
570 * min is the minimum signed value with getSize(min) = w */
571 Node min
= bv::utils::mkMinSigned(w
);
572 Node o1
= nm
->mkNode(BITVECTOR_ULT
, t
, min
);
573 Node o2
= nm
->mkNode(BITVECTOR_SGE
, t
, s
);
574 scl
= nm
->mkNode(OR
, o1
, o2
);
580 nm
->mkNode(litk
, idx
== 0 ? nm
->mkNode(k
, x
, s
) : nm
->mkNode(k
, s
, x
), t
);
581 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
582 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
587 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
589 Assert(k
== BITVECTOR_UDIV
);
590 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
591 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
593 NodeManager
* nm
= NodeManager::currentNM();
594 unsigned w
= bv::utils::getSize(s
);
595 Assert(w
== bv::utils::getSize(t
));
597 Node z
= bv::utils::mkZero(w
);
606 * with invertibility condition (synthesized):
607 * (= (bvudiv (bvmul s t) s) t)
611 * (and (= t (bvnot z))
612 * (or (= s z) (= s (_ bv1 w))))
613 * (and (distinct t (bvnot z))
615 * (not (umulo s t))))
618 * umulo(s, t) is true if s * t produces and overflow
619 * and z = 0 with getSize(z) = w */
620 Node mul
= nm
->mkNode(BITVECTOR_MULT
, s
, t
);
621 Node div
= nm
->mkNode(BITVECTOR_UDIV
, mul
, s
);
622 scl
= nm
->mkNode(EQUAL
, div
, t
);
627 * with invertibility condition:
628 * (or (distinct s z) (distinct t ones))
630 * z = 0 with getSize(z) = w
631 * and ones = ~0 with getSize(ones) = w */
632 Node ones
= bv::utils::mkOnes(w
);
633 scl
= nm
->mkNode(OR
, s
.eqNode(z
).notNode(), t
.eqNode(ones
).notNode());
641 * with invertibility condition (synthesized):
642 * (= (bvudiv s (bvudiv s t)) t)
652 * (bvule (bvadd (bvudiv s (bvadd t (_ bv1 w))) (_ bv1 w))
654 * (=> (= s (bvnot (_ bv0 8))) (distinct t (_ bv0 8)))))
657 * z = 0 with getSize(z) = w */
658 Node div
= nm
->mkNode(BITVECTOR_UDIV
, s
, t
);
659 scl
= nm
->mkNode(EQUAL
, nm
->mkNode(BITVECTOR_UDIV
, s
, div
), t
);
664 * with invertibility condition (w > 1):
665 * true (no invertibility condition)
667 * with invertibility condition (w == 1):
671 * z = 0 with getSize(z) = w */
674 scl
= nm
->mkConst
<bool>(true);
678 scl
= nm
->mkNode(BITVECTOR_AND
, s
, t
).eqNode(z
);
683 else if (litk
== BITVECTOR_ULT
)
690 * with invertibility condition (synthesized):
691 * (and (bvult z s) (bvult z t))
693 * z = 0 with getSize(z) = w */
694 Node u1
= nm
->mkNode(BITVECTOR_ULT
, z
, s
);
695 Node u2
= nm
->mkNode(BITVECTOR_ULT
, z
, t
);
696 scl
= nm
->mkNode(AND
, u1
, u2
);
701 * with invertibility condition (synthesized):
702 * (= (bvand (bvudiv (bvmul s t) t) s) s) */
703 Node mul
= nm
->mkNode(BITVECTOR_MULT
, s
, t
);
704 Node div
= nm
->mkNode(BITVECTOR_UDIV
, mul
, t
);
705 scl
= nm
->mkNode(EQUAL
, nm
->mkNode(BITVECTOR_AND
, div
, s
), s
);
713 * with invertibility condition (synthesized):
714 * (and (bvult z (bvnot (bvand (bvneg t) s))) (bvult z t))
716 * z = 0 with getSize(z) = w */
717 Node a
= nm
->mkNode(BITVECTOR_AND
, nm
->mkNode(BITVECTOR_NEG
, t
), s
);
718 Node u1
= nm
->mkNode(BITVECTOR_ULT
, z
, nm
->mkNode(BITVECTOR_NOT
, a
));
719 Node u2
= nm
->mkNode(BITVECTOR_ULT
, z
, t
);
720 scl
= nm
->mkNode(AND
, u1
, u2
);
725 * true (no invertibility condition) */
726 scl
= nm
->mkConst
<bool>(true);
730 else if (litk
== BITVECTOR_UGT
)
737 * with invertibility condition:
738 * (bvugt (bvudiv ones s) t)
740 * ones = ~0 with getSize(ones) = w */
741 Node ones
= bv::utils::mkOnes(w
);
742 Node div
= nm
->mkNode(BITVECTOR_UDIV
, ones
, s
);
743 scl
= nm
->mkNode(BITVECTOR_UGT
, div
, t
);
748 * with invertibility condition (synthesized):
749 * (bvuge (bvor s t) (bvnot (bvneg s))) */
750 Node u1
= nm
->mkNode(BITVECTOR_OR
, s
, t
);
751 Node u2
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_NEG
, s
));
752 scl
= nm
->mkNode(BITVECTOR_UGE
, u1
, u2
);
760 * with invertibility condition (synthesized):
763 * ones = ~0 with getSize(ones) = w */
764 Node ones
= bv::utils::mkOnes(w
);
765 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, ones
);
770 * with invertibility condition (synthesized):
771 * (bvult z (bvor (bvnot s) t))
773 * z = 0 with getSize(z) = w */
777 nm
->mkNode(BITVECTOR_OR
, nm
->mkNode(BITVECTOR_NOT
, s
), t
));
781 else if (litk
== BITVECTOR_SLT
)
788 * with invertibility condition:
789 * (=> (bvsle t z) (bvslt (bvudiv min s) t))
791 * z = 0 with getSize(z) = w
792 * and min is the minimum signed value with getSize(min) = w */
793 Node min
= bv::utils::mkMinSigned(w
);
794 Node sle
= nm
->mkNode(BITVECTOR_SLE
, t
, z
);
795 Node div
= nm
->mkNode(BITVECTOR_UDIV
, min
, s
);
796 Node slt
= nm
->mkNode(BITVECTOR_SLT
, div
, t
);
797 scl
= nm
->mkNode(IMPLIES
, sle
, slt
);
802 * with invertibility condition:
804 * (bvsge (bvudiv ones s) t)
805 * (bvsge (bvudiv max s) t))
807 * ones = ~0 with getSize(ones) = w
808 * and max is the maximum signed value with getSize(max) = w */
809 Node max
= bv::utils::mkMaxSigned(w
);
810 Node ones
= bv::utils::mkOnes(w
);
811 Node udiv1
= nm
->mkNode(BITVECTOR_UDIV
, ones
, s
);
812 Node udiv2
= nm
->mkNode(BITVECTOR_UDIV
, max
, s
);
813 Node sge1
= nm
->mkNode(BITVECTOR_SGE
, udiv1
, t
);
814 Node sge2
= nm
->mkNode(BITVECTOR_SGE
, udiv2
, t
);
815 scl
= nm
->mkNode(OR
, sge1
, sge2
);
823 * with invertibility condition (synthesized):
824 * (or (bvslt s t) (bvsge t z))
826 * z = 0 with getSize(z) = w */
827 Node slt
= nm
->mkNode(BITVECTOR_SLT
, s
, t
);
828 Node sge
= nm
->mkNode(BITVECTOR_SGE
, t
, z
);
829 scl
= nm
->mkNode(OR
, slt
, sge
);
834 * with invertibility condition (w > 1):
836 * (=> (bvsge s z) (bvsge s t))
837 * (=> (bvslt s z) (bvsge (bvlshr s (_ bv1 w)) t)))
839 * with invertibility condition (w == 1):
843 * z = 0 with getSize(z) = w */
847 Node div
= nm
->mkNode(BITVECTOR_LSHR
, s
, bv::utils::mkConst(w
, 1));
848 Node i1
= nm
->mkNode(IMPLIES
,
849 nm
->mkNode(BITVECTOR_SGE
, s
, z
),
850 nm
->mkNode(BITVECTOR_SGE
, s
, t
));
851 Node i2
= nm
->mkNode(IMPLIES
,
852 nm
->mkNode(BITVECTOR_SLT
, s
, z
),
853 nm
->mkNode(BITVECTOR_SGE
, div
, t
));
854 scl
= nm
->mkNode(AND
, i1
, i2
);
858 scl
= nm
->mkNode(BITVECTOR_SGE
, s
, t
);
865 Assert(litk
== BITVECTOR_SGT
);
871 * with invertibility condition:
873 * (bvsgt (bvudiv ones s) t)
874 * (bvsgt (bvudiv max s) t))
876 * ones = ~0 with getSize(ones) = w
877 * and max is the maximum signed value with getSize(max) = w */
878 Node max
= bv::utils::mkMaxSigned(w
);
879 Node ones
= bv::utils::mkOnes(w
);
880 Node div1
= nm
->mkNode(BITVECTOR_UDIV
, ones
, s
);
881 Node sgt1
= nm
->mkNode(BITVECTOR_SGT
, div1
, t
);
882 Node div2
= nm
->mkNode(BITVECTOR_UDIV
, max
, s
);
883 Node sgt2
= nm
->mkNode(BITVECTOR_SGT
, div2
, t
);
884 scl
= nm
->mkNode(OR
, sgt1
, sgt2
);
889 * with invertibility condition (combination of = and <):
891 * (= (bvudiv (bvmul s t) s) t) ; eq, synthesized
892 * (=> (bvsle t z) (bvslt (bvudiv min s) t))) ; slt
894 * z = 0 with getSize(z) = w
895 * and min is the minimum signed value with getSize(min) = w */
896 Node mul
= nm
->mkNode(BITVECTOR_MULT
, s
, t
);
897 Node div1
= nm
->mkNode(BITVECTOR_UDIV
, mul
, s
);
898 Node o1
= nm
->mkNode(EQUAL
, div1
, t
);
899 Node min
= bv::utils::mkMinSigned(w
);
900 Node sle
= nm
->mkNode(BITVECTOR_SLE
, t
, z
);
901 Node div2
= nm
->mkNode(BITVECTOR_UDIV
, min
, s
);
902 Node slt
= nm
->mkNode(BITVECTOR_SLT
, div2
, t
);
903 Node o2
= nm
->mkNode(IMPLIES
, sle
, slt
);
904 scl
= nm
->mkNode(OR
, o1
, o2
);
912 * with invertibility condition (w > 1):
914 * (=> (bvsge s z) (bvsgt s t))
915 * (=> (bvslt s z) (bvsgt (bvlshr s (_ bv1 w)) t)))
917 * with invertibility condition (w == 1):
921 * z = 0 with getSize(z) = w */
924 Node div
= nm
->mkNode(BITVECTOR_LSHR
, s
, bv::utils::mkConst(w
, 1));
925 Node i1
= nm
->mkNode(IMPLIES
,
926 nm
->mkNode(BITVECTOR_SGE
, s
, z
),
927 nm
->mkNode(BITVECTOR_SGT
, s
, t
));
928 Node i2
= nm
->mkNode(IMPLIES
,
929 nm
->mkNode(BITVECTOR_SLT
, s
, z
),
930 nm
->mkNode(BITVECTOR_SGT
, div
, t
));
931 scl
= nm
->mkNode(AND
, i1
, i2
);
935 scl
= nm
->mkNode(BITVECTOR_SGT
, s
, t
);
941 * with invertibility condition (synthesized):
942 * (not (and (bvslt t (bvnot #x0)) (bvslt t s)))
944 * (or (bvsge t ones) (bvsge t s))
946 * ones = ~0 with getSize(ones) = w */
947 Node ones
= bv::utils::mkOnes(w
);
948 Node sge1
= nm
->mkNode(BITVECTOR_SGE
, t
, ones
);
949 Node sge2
= nm
->mkNode(BITVECTOR_SGE
, t
, s
);
950 scl
= nm
->mkNode(OR
, sge1
, sge2
);
956 nm
->mkNode(litk
, idx
== 0 ? nm
->mkNode(k
, x
, s
) : nm
->mkNode(k
, s
, x
), t
);
957 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
958 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
963 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
965 Assert(k
== BITVECTOR_AND
|| k
== BITVECTOR_OR
);
966 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
967 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
969 NodeManager
* nm
= NodeManager::currentNM();
970 unsigned w
= bv::utils::getSize(s
);
971 Assert(w
== bv::utils::getSize(t
));
980 * with invertibility condition:
982 * (= (bvor t s) t) */
983 scl
= nm
->mkNode(EQUAL
, t
, nm
->mkNode(k
, t
, s
));
987 if (k
== BITVECTOR_AND
)
990 * with invertibility condition:
991 * (or (distinct s z) (distinct t z))
993 * z = 0 with getSize(z) = w */
994 Node z
= bv::utils::mkZero(w
);
995 scl
= nm
->mkNode(OR
, s
.eqNode(z
).notNode(), t
.eqNode(z
).notNode());
1000 * with invertibility condition:
1001 * (or (distinct s ones) (distinct t ones))
1003 * ones = ~0 with getSize(ones) = w */
1004 Node n
= bv::utils::mkOnes(w
);
1005 scl
= nm
->mkNode(OR
, s
.eqNode(n
).notNode(), t
.eqNode(n
).notNode());
1009 else if (litk
== BITVECTOR_ULT
)
1013 if (k
== BITVECTOR_AND
)
1016 * with invertibility condition (synthesized):
1019 * z = 0 with getSize(z) = 0 */
1020 Node z
= bv::utils::mkZero(w
);
1021 scl
= t
.eqNode(z
).notNode();
1026 * with invertibility condition (synthesized):
1028 scl
= nm
->mkNode(BITVECTOR_ULT
, s
, t
);
1033 if (k
== BITVECTOR_AND
)
1036 * with invertibility condition (synthesized):
1038 scl
= nm
->mkNode(BITVECTOR_UGE
, s
, t
);
1043 * with invertibility condition (synthesized):
1044 * true (no invertibility condition) */
1045 scl
= nm
->mkConst
<bool>(true);
1049 else if (litk
== BITVECTOR_UGT
)
1053 if (k
== BITVECTOR_AND
)
1056 * with invertibility condition (synthesized):
1058 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, s
);
1063 * with invertibility condition (synthesized):
1066 * ones = ~0 with getSize(ones) = w */
1067 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, bv::utils::mkOnes(w
));
1072 if (k
== BITVECTOR_AND
)
1075 * with invertibility condition (synthesized):
1076 * true (no invertibility condition) */
1077 scl
= nm
->mkConst
<bool>(true);
1082 * with invertibility condition (synthesized):
1084 scl
= nm
->mkNode(BITVECTOR_UGE
, t
, s
);
1088 else if (litk
== BITVECTOR_SLT
)
1092 if (k
== BITVECTOR_AND
)
1095 * with invertibility condition (synthesized):
1096 * (bvslt (bvand (bvnot (bvneg t)) s) t) */
1097 Node nnt
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_NEG
, t
));
1098 scl
= nm
->mkNode(BITVECTOR_SLT
, nm
->mkNode(BITVECTOR_AND
, nnt
, s
), t
);
1103 * with invertibility condition (synthesized):
1104 * (bvslt (bvor (bvnot (bvsub s t)) s) t) */
1105 Node st
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_SUB
, s
, t
));
1106 scl
= nm
->mkNode(BITVECTOR_SLT
, nm
->mkNode(BITVECTOR_OR
, st
, s
), t
);
1111 if (k
== BITVECTOR_AND
)
1114 * with invertibility condition (case = combined with synthesized
1117 * (bvslt t (bvand (bvsub t s) s))) */
1118 Node sc_sgt
= nm
->mkNode(
1121 nm
->mkNode(BITVECTOR_AND
, nm
->mkNode(BITVECTOR_SUB
, t
, s
), s
));
1122 Node sc_eq
= nm
->mkNode(BITVECTOR_AND
, s
, t
).eqNode(t
);
1123 scl
= sc_eq
.orNode(sc_sgt
);
1128 * with invertibility condition (synthesized):
1129 * (bvsge s (bvand s t)) */
1130 scl
= nm
->mkNode(BITVECTOR_SGE
, s
, nm
->mkNode(BITVECTOR_AND
, s
, t
));
1136 Assert(litk
== BITVECTOR_SGT
);
1141 * with invertibility condition (synthesized):
1142 * (bvslt t (bvand s max))
1143 * (bvslt t (bvor s max))
1145 * max is the signed maximum value with getSize(max) = w */
1146 Node max
= bv::utils::mkMaxSigned(w
);
1147 scl
= nm
->mkNode(BITVECTOR_SLT
, t
, nm
->mkNode(k
, s
, max
));
1151 if (k
== BITVECTOR_AND
)
1154 * with invertibility condition (synthesized):
1155 * (bvuge s (bvand t min))
1157 * min is the signed minimum value with getSize(min) = w */
1158 Node min
= bv::utils::mkMinSigned(w
);
1159 scl
= nm
->mkNode(BITVECTOR_UGE
, s
, nm
->mkNode(BITVECTOR_AND
, t
, min
));
1164 * with invertibility condition (synthesized):
1165 * (bvsge t (bvor s min))
1167 * min is the signed minimum value with getSize(min) = w */
1168 Node min
= bv::utils::mkMinSigned(w
);
1169 scl
= nm
->mkNode(BITVECTOR_SGE
, t
, nm
->mkNode(BITVECTOR_OR
, s
, min
));
1173 Node scr
= nm
->mkNode(litk
, nm
->mkNode(k
, x
, s
), t
);
1174 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
1175 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
1180 Node
defaultShiftIC(Kind litk
, Kind shk
, Node s
, Node t
)
1183 NodeBuilder
<> nb(OR
);
1186 nm
= NodeManager::currentNM();
1188 w
= bv::utils::getSize(s
);
1189 Assert(w
== bv::utils::getSize(t
));
1191 nb
<< nm
->mkNode(litk
, s
, t
);
1192 for (unsigned i
= 1; i
<= w
; i
++)
1194 Node sw
= bv::utils::mkConst(w
, i
);
1195 nb
<< nm
->mkNode(litk
, nm
->mkNode(shk
, s
, sw
), t
);
1197 if (nb
.getNumChildren() == 1) return nb
[0];
1198 return nb
.constructNode();
1203 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
1205 Assert(k
== BITVECTOR_LSHR
);
1206 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
1207 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
1209 NodeManager
* nm
= NodeManager::currentNM();
1211 unsigned w
= bv::utils::getSize(s
);
1212 Assert(w
== bv::utils::getSize(t
));
1213 Node z
= bv::utils::mkZero(w
);
1219 Node ww
= bv::utils::mkConst(w
, w
);
1224 * with invertibility condition (synthesized):
1225 * (= (bvlshr (bvshl t s) s) t) */
1226 Node shl
= nm
->mkNode(BITVECTOR_SHL
, t
, s
);
1227 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, shl
, s
);
1228 scl
= lshr
.eqNode(t
);
1233 * with invertibility condition:
1234 * (or (distinct t z) (bvult s w))
1236 * z = 0 with getSize(z) = w
1237 * and w = getSize(s) = getSize(t) */
1239 OR
, t
.eqNode(z
).notNode(), nm
->mkNode(BITVECTOR_ULT
, s
, ww
));
1247 * with invertibility condition:
1248 * (or (= (bvlshr s i) t) ...)
1250 scl
= defaultShiftIC(EQUAL
, BITVECTOR_LSHR
, s
, t
);
1255 * with invertibility condition:
1256 * (or (distinct s z) (distinct t z))
1258 * z = 0 with getSize(z) = w */
1259 scl
= nm
->mkNode(OR
, s
.eqNode(z
).notNode(), t
.eqNode(z
).notNode());
1263 else if (litk
== BITVECTOR_ULT
)
1270 * with invertibility condition (synthesized):
1273 * z = 0 with getSize(z) = w */
1274 scl
= t
.eqNode(z
).notNode();
1279 * with invertibility condition (synthesized):
1280 * (= (bvlshr (bvshl t s) s) t) */
1281 Node ts
= nm
->mkNode(BITVECTOR_SHL
, t
, s
);
1282 scl
= nm
->mkNode(BITVECTOR_LSHR
, ts
, s
).eqNode(t
);
1290 * with invertibility condition (synthesized):
1293 * z = 0 with getSize(z) = w */
1294 scl
= t
.eqNode(z
).notNode();
1299 * with invertibility condition (synthesized):
1301 scl
= nm
->mkNode(BITVECTOR_UGE
, s
, t
);
1305 else if (litk
== BITVECTOR_UGT
)
1312 * with invertibility condition (synthesized):
1313 * (bvult t (bvlshr (bvnot s) s)) */
1314 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, nm
->mkNode(BITVECTOR_NOT
, s
), s
);
1315 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, lshr
);
1320 * with invertibility condition:
1321 * true (no invertibility condition) */
1322 scl
= nm
->mkConst
<bool>(true);
1330 * with invertibility condition (synthesized):
1332 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, s
);
1337 * with invertibility condition:
1338 * true (no invertibility condition) */
1339 scl
= nm
->mkConst
<bool>(true);
1343 else if (litk
== BITVECTOR_SLT
)
1350 * with invertibility condition (synthesized):
1351 * (bvslt (bvlshr (bvnot (bvneg t)) s) t) */
1352 Node nnt
= nm
->mkNode(BITVECTOR_NOT
, nm
->mkNode(BITVECTOR_NEG
, t
));
1353 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, nnt
, s
);
1354 scl
= nm
->mkNode(BITVECTOR_SLT
, lshr
, t
);
1359 * with invertibility condition:
1360 * (=> (not (= s z)) (bvsge (bvlshr ones s) t))
1362 * z = 0 with getSize(z) = w
1363 * and ones = ~0 with getSize(ones) = w */
1364 Node ones
= bv::utils::mkOnes(w
);
1365 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, ones
, s
);
1366 Node nz
= s
.eqNode(z
).notNode();
1367 scl
= nz
.impNode(nm
->mkNode(BITVECTOR_SGE
, lshr
, t
));
1375 * with invertibility condition (synthesized):
1376 * (or (bvslt s t) (bvslt z t))
1378 * z = 0 with getSize(z) = w */
1379 Node st
= nm
->mkNode(BITVECTOR_SLT
, s
, t
);
1380 Node zt
= nm
->mkNode(BITVECTOR_SLT
, z
, t
);
1381 scl
= st
.orNode(zt
);
1386 * with invertibility condition:
1388 * (=> (bvslt s z) (bvsge (bvlshr s (_ bv1 w)) t))
1389 * (=> (bvsge s z) (bvsge s t)))
1391 * z = 0 with getSize(z) = w */
1392 Node one
= bv::utils::mkConst(w
, 1);
1393 Node sz
= nm
->mkNode(BITVECTOR_SLT
, s
, z
);
1394 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, s
, one
);
1395 Node sge1
= nm
->mkNode(BITVECTOR_SGE
, lshr
, t
);
1396 Node sge2
= nm
->mkNode(BITVECTOR_SGE
, s
, t
);
1397 scl
= sz
.impNode(sge1
).andNode(sz
.notNode().impNode(sge2
));
1403 Assert(litk
== BITVECTOR_SGT
);
1409 * with invertibility condition (synthesized):
1410 * (bvslt t (bvlshr (bvshl max s) s))
1412 * max is the signed maximum value with getSize(max) = w */
1413 Node max
= bv::utils::mkMaxSigned(w
);
1414 Node shl
= nm
->mkNode(BITVECTOR_SHL
, max
, s
);
1415 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, shl
, s
);
1416 scl
= nm
->mkNode(BITVECTOR_SLT
, t
, lshr
);
1421 * with invertibility condition (synthesized):
1422 * (bvsge t (bvlshr t s)) */
1423 scl
= nm
->mkNode(BITVECTOR_SGE
, t
, nm
->mkNode(BITVECTOR_LSHR
, t
, s
));
1431 * with invertibility condition:
1433 * (=> (bvslt s z) (bvsgt (bvlshr s one) t))
1434 * (=> (bvsge s z) (bvsgt s t)))
1436 * z = 0 and getSize(z) = w */
1437 Node one
= bv::utils::mkOne(w
);
1438 Node sz
= nm
->mkNode(BITVECTOR_SLT
, s
, z
);
1439 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, s
, one
);
1440 Node sgt1
= nm
->mkNode(BITVECTOR_SGT
, lshr
, t
);
1441 Node sgt2
= nm
->mkNode(BITVECTOR_SGT
, s
, t
);
1442 scl
= sz
.impNode(sgt1
).andNode(sz
.notNode().impNode(sgt2
));
1447 * with invertibility condition (synthesized):
1448 * (or (bvult t min) (bvsge t s))
1450 * min is the minimum signed value with getSize(min) = w */
1451 Node min
= bv::utils::mkMinSigned(w
);
1452 Node ult
= nm
->mkNode(BITVECTOR_ULT
, t
, min
);
1453 Node sge
= nm
->mkNode(BITVECTOR_SGE
, t
, s
);
1454 scl
= ult
.orNode(sge
);
1459 nm
->mkNode(litk
, idx
== 0 ? nm
->mkNode(k
, x
, s
) : nm
->mkNode(k
, s
, x
), t
);
1460 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
1461 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
1466 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
1468 Assert(k
== BITVECTOR_ASHR
);
1469 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
1470 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
1472 NodeManager
* nm
= NodeManager::currentNM();
1474 unsigned w
= bv::utils::getSize(s
);
1475 Assert(w
== bv::utils::getSize(t
));
1476 Node z
= bv::utils::mkZero(w
);
1477 Node n
= bv::utils::mkOnes(w
);
1486 * with invertibility condition:
1488 * (=> (bvult s w) (= (bvashr (bvshl t s) s) t))
1489 * (=> (bvuge s w) (or (= t ones) (= t z)))
1492 * z = 0 with getSize(z) = w
1493 * and ones = ~0 with getSize(ones) = w
1494 * and w = getSize(t) = getSize(s) */
1495 Node ww
= bv::utils::mkConst(w
, w
);
1496 Node shl
= nm
->mkNode(BITVECTOR_SHL
, t
, s
);
1497 Node ashr
= nm
->mkNode(BITVECTOR_ASHR
, shl
, s
);
1498 Node ult
= nm
->mkNode(BITVECTOR_ULT
, s
, ww
);
1499 Node imp1
= ult
.impNode(ashr
.eqNode(t
));
1500 Node to
= t
.eqNode(n
);
1501 Node tz
= t
.eqNode(z
);
1502 Node imp2
= ult
.notNode().impNode(to
.orNode(tz
));
1503 scl
= imp1
.andNode(imp2
);
1508 * true (no invertibility condition) */
1509 scl
= nm
->mkConst
<bool>(true);
1517 * with invertibility condition:
1518 * (or (= (bvashr s i) t) ...)
1520 scl
= defaultShiftIC(EQUAL
, BITVECTOR_ASHR
, s
, t
);
1525 * with invertibility condition:
1527 * (or (not (= t z)) (not (= s z)))
1528 * (or (not (= t ones)) (not (= s ones))))
1530 * z = 0 with getSize(z) = w
1531 * and ones = ~0 with getSize(ones) = w */
1534 nm
->mkNode(OR
, t
.eqNode(z
).notNode(), s
.eqNode(z
).notNode()),
1535 nm
->mkNode(OR
, t
.eqNode(n
).notNode(), s
.eqNode(n
).notNode()));
1539 else if (litk
== BITVECTOR_ULT
)
1546 * with invertibility condition (synthesized):
1549 * z = 0 with getSize(z) = w */
1550 scl
= t
.eqNode(z
).notNode();
1555 * with invertibility condition (synthesized):
1556 * true (no invertibility condition) */
1557 scl
= nm
->mkConst
<bool>(true);
1565 * with invertibility condition (synthesized):
1566 * (and (not (and (bvuge s t) (bvslt s z))) (not (= t z)))
1568 * z = 0 with getSize(z) = w */
1569 Node st
= nm
->mkNode(BITVECTOR_UGE
, s
, t
);
1570 Node sz
= nm
->mkNode(BITVECTOR_SLT
, s
, z
);
1571 Node tz
= t
.eqNode(z
).notNode();
1572 scl
= st
.andNode(sz
).notNode().andNode(tz
);
1577 * with invertibility condition (synthesized):
1578 * (not (and (bvult s (bvnot s)) (bvult s t))) */
1579 Node ss
= nm
->mkNode(BITVECTOR_ULT
, s
, nm
->mkNode(BITVECTOR_NOT
, s
));
1580 Node st
= nm
->mkNode(BITVECTOR_ULT
, s
, t
);
1581 scl
= ss
.andNode(st
).notNode();
1585 else if (litk
== BITVECTOR_UGT
)
1592 * with invertibility condition (synthesized):
1595 * ones = ~0 with getSize(ones) = w */
1596 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, bv::utils::mkOnes(w
));
1601 * with invertibility condition (synthesized):
1602 * true (no invertibility condition) */
1603 scl
= nm
->mkConst
<bool>(true);
1611 * with invertibility condition (synthesized):
1612 * (or (bvslt s (bvlshr s (bvnot t))) (bvult t s)) */
1613 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, s
, nm
->mkNode(BITVECTOR_NOT
, t
));
1614 Node ts
= nm
->mkNode(BITVECTOR_ULT
, t
, s
);
1615 Node slt
= nm
->mkNode(BITVECTOR_SLT
, s
, lshr
);
1616 scl
= slt
.orNode(ts
);
1621 * with invertibility condition (synthesized):
1622 * (or (bvult s min) (bvuge t s))
1624 * min is the minimum signed value with getSize(min) = w */
1625 Node min
= bv::utils::mkMinSigned(w
);
1626 Node ult
= nm
->mkNode(BITVECTOR_ULT
, s
, min
);
1627 Node uge
= nm
->mkNode(BITVECTOR_UGE
, t
, s
);
1628 scl
= ult
.orNode(uge
);
1632 else if (litk
== BITVECTOR_SLT
)
1639 * with invertibility condition:
1640 * (bvslt (bvashr min s) t)
1642 * min is the minimum signed value with getSize(min) = w */
1643 Node min
= bv::utils::mkMinSigned(w
);
1644 scl
= nm
->mkNode(BITVECTOR_SLT
, nm
->mkNode(BITVECTOR_ASHR
, min
, s
), t
);
1649 * with invertibility condition:
1650 * (bvsge (bvlshr max s) t)
1652 * max is the signed maximum value with getSize(max) = w */
1653 Node max
= bv::utils::mkMaxSigned(w
);
1654 scl
= nm
->mkNode(BITVECTOR_SGE
, nm
->mkNode(BITVECTOR_LSHR
, max
, s
), t
);
1662 * with invertibility condition (synthesized):
1663 * (or (bvslt s t) (bvslt z t))
1665 * z = 0 and getSize(z) = w */
1666 Node st
= nm
->mkNode(BITVECTOR_SLT
, s
, t
);
1667 Node zt
= nm
->mkNode(BITVECTOR_SLT
, z
, t
);
1668 scl
= st
.orNode(zt
);
1673 * with invertibility condition (synthesized):
1674 * (not (and (bvult t (bvnot t)) (bvslt s t))) */
1675 Node tt
= nm
->mkNode(BITVECTOR_ULT
, t
, nm
->mkNode(BITVECTOR_NOT
, t
));
1676 Node st
= nm
->mkNode(BITVECTOR_SLT
, s
, t
);
1677 scl
= tt
.andNode(st
).notNode();
1683 Assert(litk
== BITVECTOR_SGT
);
1684 Node max
= bv::utils::mkMaxSigned(w
);
1687 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, max
, s
);
1691 * with invertibility condition (synthesized):
1692 * (bvslt t (bvlshr max s)))
1694 * max is the signed maximum value with getSize(max) = w */
1695 scl
= nm
->mkNode(BITVECTOR_SLT
, t
, lshr
);
1700 * with invertibility condition (synthesized):
1701 * (bvsge t (bvnot (bvlshr max s)))
1703 * max is the signed maximum value with getSize(max) = w */
1704 scl
= nm
->mkNode(BITVECTOR_SGE
, t
, nm
->mkNode(BITVECTOR_NOT
, lshr
));
1712 * with invertibility condition (synthesized):
1713 * (and (bvslt t (bvand s max)) (bvslt t (bvor s max)))
1715 * max is the signed maximum value with getSize(max) = w */
1716 Node sam
= nm
->mkNode(BITVECTOR_AND
, s
, max
);
1717 Node som
= nm
->mkNode(BITVECTOR_OR
, s
, max
);
1718 Node slta
= nm
->mkNode(BITVECTOR_SLT
, t
, sam
);
1719 Node slto
= nm
->mkNode(BITVECTOR_SLT
, t
, som
);
1720 scl
= slta
.andNode(slto
);
1725 * with invertibility condition (synthesized):
1726 * (or (bvsge t z) (bvsge t s))
1728 * z = 0 and getSize(z) = w */
1729 Node tz
= nm
->mkNode(BITVECTOR_SGE
, t
, z
);
1730 Node ts
= nm
->mkNode(BITVECTOR_SGE
, t
, s
);
1731 scl
= tz
.orNode(ts
);
1736 nm
->mkNode(litk
, idx
== 0 ? nm
->mkNode(k
, x
, s
) : nm
->mkNode(k
, s
, x
), t
);
1737 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
1738 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
1743 bool pol
, Kind litk
, Kind k
, unsigned idx
, Node x
, Node s
, Node t
)
1745 Assert(k
== BITVECTOR_SHL
);
1746 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
1747 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
1749 NodeManager
* nm
= NodeManager::currentNM();
1751 unsigned w
= bv::utils::getSize(s
);
1752 Assert(w
== bv::utils::getSize(t
));
1753 Node z
= bv::utils::mkZero(w
);
1759 Node ww
= bv::utils::mkConst(w
, w
);
1764 * with invertibility condition (synthesized):
1765 * (= (bvshl (bvlshr t s) s) t) */
1766 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, t
, s
);
1767 Node shl
= nm
->mkNode(BITVECTOR_SHL
, lshr
, s
);
1768 scl
= shl
.eqNode(t
);
1773 * with invertibility condition:
1774 * (or (distinct t z) (bvult s w))
1776 * w = getSize(s) = getSize(t)
1777 * and z = 0 with getSize(z) = w */
1779 OR
, t
.eqNode(z
).notNode(), nm
->mkNode(BITVECTOR_ULT
, s
, ww
));
1787 * with invertibility condition:
1788 * (or (= (bvshl s i) t) ...)
1790 scl
= defaultShiftIC(EQUAL
, BITVECTOR_SHL
, s
, t
);
1795 * with invertibility condition:
1796 * (or (distinct s z) (distinct t z))
1798 * z = 0 with getSize(z) = w */
1799 scl
= nm
->mkNode(OR
, s
.eqNode(z
).notNode(), t
.eqNode(z
).notNode());
1803 else if (litk
== BITVECTOR_ULT
)
1810 * with invertibility condition (synthesized):
1812 scl
= t
.eqNode(z
).notNode();
1817 * with invertibility condition (synthesized):
1818 * (bvuge (bvshl ones s) t) */
1819 Node shl
= nm
->mkNode(BITVECTOR_SHL
, bv::utils::mkOnes(w
), s
);
1820 scl
= nm
->mkNode(BITVECTOR_UGE
, shl
, t
);
1828 * with invertibility condition (synthesized):
1830 scl
= t
.eqNode(z
).notNode();
1835 * with invertibility condition:
1836 * (or (bvuge (bvshl s i) t) ...)
1838 scl
= defaultShiftIC(BITVECTOR_UGE
, BITVECTOR_SHL
, s
, t
);
1842 else if (litk
== BITVECTOR_UGT
)
1849 * with invertibility condition (synthesized):
1850 * (bvult t (bvshl ones s))
1852 * ones = ~0 with getSize(ones) = w */
1853 Node shl
= nm
->mkNode(BITVECTOR_SHL
, bv::utils::mkOnes(w
), s
);
1854 scl
= nm
->mkNode(BITVECTOR_ULT
, t
, shl
);
1859 * with invertibility condition:
1860 * true (no invertibility condition) */
1861 scl
= nm
->mkConst
<bool>(true);
1869 * with invertibility condition:
1870 * (or (bvugt (bvshl s i) t) ...)
1872 scl
= defaultShiftIC(BITVECTOR_UGT
, BITVECTOR_SHL
, s
, t
);
1877 * with invertibility condition:
1878 * true (no invertibility condition) */
1879 scl
= nm
->mkConst
<bool>(true);
1883 else if (litk
== BITVECTOR_SLT
)
1890 * with invertibility condition (synthesized):
1891 * (bvslt (bvshl (bvlshr min s) s) t)
1893 * min is the signed minimum value with getSize(min) = w */
1894 Node min
= bv::utils::mkMinSigned(w
);
1895 Node lshr
= nm
->mkNode(BITVECTOR_LSHR
, min
, s
);
1896 Node shl
= nm
->mkNode(BITVECTOR_SHL
, lshr
, s
);
1897 scl
= nm
->mkNode(BITVECTOR_SLT
, shl
, t
);
1902 * with invertibility condition (synthesized):
1903 * (bvsge (bvand (bvshl max s) max) t)
1905 * max is the signed maximum value with getSize(max) = w */
1906 Node max
= bv::utils::mkMaxSigned(w
);
1907 Node shl
= nm
->mkNode(BITVECTOR_SHL
, max
, s
);
1908 scl
= nm
->mkNode(BITVECTOR_SGE
, nm
->mkNode(BITVECTOR_AND
, shl
, max
), t
);
1916 * with invertibility condition (synthesized):
1917 * (bvult (bvshl min s) (bvadd t min))
1919 * min is the signed minimum value with getSize(min) = w */
1920 Node min
= bv::utils::mkMinSigned(w
);
1921 Node shl
= nm
->mkNode(BITVECTOR_SHL
, min
, s
);
1922 Node add
= nm
->mkNode(BITVECTOR_PLUS
, t
, min
);
1923 scl
= nm
->mkNode(BITVECTOR_ULT
, shl
, add
);
1928 * with invertibility condition:
1929 * (or (bvsge (bvshl s i) t) ...)
1931 scl
= defaultShiftIC(BITVECTOR_SGE
, BITVECTOR_SHL
, s
, t
);
1937 Assert(litk
== BITVECTOR_SGT
);
1943 * with invertibility condition (synthesized):
1944 * (bvslt t (bvand (bvshl max s) max))
1946 * max is the signed maximum value with getSize(max) = w */
1947 Node max
= bv::utils::mkMaxSigned(w
);
1948 Node shl
= nm
->mkNode(BITVECTOR_SHL
, max
, s
);
1949 scl
= nm
->mkNode(BITVECTOR_SLT
, t
, nm
->mkNode(BITVECTOR_AND
, shl
, max
));
1954 * with invertibility condition (synthesized):
1955 * (bvult (bvlshr t (bvlshr t s)) min)
1957 * min is the signed minimum value with getSize(min) = w */
1958 Node min
= bv::utils::mkMinSigned(w
);
1959 Node ts
= nm
->mkNode(BITVECTOR_LSHR
, t
, s
);
1960 scl
= nm
->mkNode(BITVECTOR_ULT
, nm
->mkNode(BITVECTOR_LSHR
, t
, ts
), min
);
1968 * with invertibility condition:
1969 * (or (bvsgt (bvshl s i) t) ...)
1971 scl
= defaultShiftIC(BITVECTOR_SGT
, BITVECTOR_SHL
, s
, t
);
1976 * with invertibility condition (synthesized):
1977 * (bvult (bvlshr t s) min)
1979 * min is the signed minimum value with getSize(min) = w */
1980 Node min
= bv::utils::mkMinSigned(w
);
1981 scl
= nm
->mkNode(BITVECTOR_ULT
, nm
->mkNode(BITVECTOR_LSHR
, t
, s
), min
);
1986 nm
->mkNode(litk
, idx
== 0 ? nm
->mkNode(k
, x
, s
) : nm
->mkNode(k
, s
, x
), t
);
1987 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
1988 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
1992 Node
getICBvConcat(bool pol
, Kind litk
, unsigned idx
, Node x
, Node sv_t
, Node t
)
1994 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
1995 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
1997 Kind k
= sv_t
.getKind();
1998 Assert(k
== BITVECTOR_CONCAT
);
1999 NodeManager
* nm
= NodeManager::currentNM();
2000 unsigned nchildren
= sv_t
.getNumChildren();
2001 unsigned w1
= 0, w2
= 0;
2002 unsigned w
= bv::utils::getSize(t
), wx
= bv::utils::getSize(x
);
2003 NodeBuilder
<> nbs1(BITVECTOR_CONCAT
), nbs2(BITVECTOR_CONCAT
);
2016 for (unsigned i
= 0; i
< idx
; ++i
)
2020 s1
= nbs1
.constructNode();
2022 w1
= bv::utils::getSize(s1
);
2023 t1
= bv::utils::mkExtract(t
, w
- 1, w
- w1
);
2026 tx
= bv::utils::mkExtract(t
, w
- w1
- 1, w
- w1
- wx
);
2028 if (idx
!= nchildren
- 1)
2030 if (idx
== nchildren
- 2)
2032 s2
= sv_t
[nchildren
- 1];
2036 for (unsigned i
= idx
+ 1; i
< nchildren
; ++i
)
2040 s2
= nbs2
.constructNode();
2042 w2
= bv::utils::getSize(s2
);
2043 Assert(w2
== w
- w1
- wx
);
2044 t2
= bv::utils::mkExtract(t
, w2
- 1, 0);
2047 Assert(!s1
.isNull() || t1
.isNull());
2048 Assert(!s2
.isNull() || t2
.isNull());
2049 Assert(!s1
.isNull() || !s2
.isNull());
2050 Assert(s1
.isNull() || w1
== bv::utils::getSize(t1
));
2051 Assert(s2
.isNull() || w2
== bv::utils::getSize(t2
));
2059 /* x o s2 = t (interpret t as tx o t2)
2060 * with invertibility condition:
2062 scl
= s2
.eqNode(t2
);
2067 * true (no invertibility condition) */
2068 scl
= nm
->mkConst
<bool>(true);
2071 else if (s2
.isNull())
2075 /* s1 o x = t (interpret t as t1 o tx)
2076 * with invertibility condition:
2078 scl
= s1
.eqNode(t1
);
2083 * true (no invertibility condition) */
2084 scl
= nm
->mkConst
<bool>(true);
2091 /* s1 o x o s2 = t (interpret t as t1 o tx o t2)
2092 * with invertibility condition:
2093 * (and (= s1 t1) (= s2 t2)) */
2094 scl
= nm
->mkNode(AND
, s1
.eqNode(t1
), s2
.eqNode(t2
));
2099 * true (no invertibility condition) */
2100 scl
= nm
->mkConst
<bool>(true);
2104 else if (litk
== BITVECTOR_ULT
)
2110 /* x o s2 < t (interpret t as tx o t2)
2111 * with invertibility condition:
2112 * (=> (= tx z) (bvult s2 t2))
2114 * z = 0 with getSize(z) = wx */
2115 Node z
= bv::utils::mkZero(wx
);
2116 Node ult
= nm
->mkNode(BITVECTOR_ULT
, s2
, t2
);
2117 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(z
), ult
);
2121 /* x o s2 >= t (interpret t as tx o t2)
2122 * (=> (= tx ones) (bvuge s2 t2))
2124 * ones = ~0 with getSize(ones) = wx */
2125 Node n
= bv::utils::mkOnes(wx
);
2126 Node uge
= nm
->mkNode(BITVECTOR_UGE
, s2
, t2
);
2127 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(n
), uge
);
2130 else if (s2
.isNull())
2134 /* s1 o x < t (interpret t as t1 o tx)
2135 * with invertibility condition:
2136 * (and (bvule s1 t1) (=> (= s1 t1) (distinct tx z)))
2138 * z = 0 with getSize(z) = wx */
2139 Node z
= bv::utils::mkZero(wx
);
2140 Node ule
= nm
->mkNode(BITVECTOR_ULE
, s1
, t1
);
2141 Node imp
= nm
->mkNode(IMPLIES
, s1
.eqNode(t1
), tx
.eqNode(z
).notNode());
2142 scl
= nm
->mkNode(AND
, ule
, imp
);
2146 /* s1 o x >= t (interpret t as t1 o tx)
2147 * with invertibility condition:
2149 scl
= nm
->mkNode(BITVECTOR_UGE
, s1
, t1
);
2156 /* s1 o x o s2 < t (interpret t as t1 o tx o t2)
2157 * with invertibility condition:
2160 * (=> (and (= s1 t1) (= tx z)) (bvult s2 t2)))
2162 * z = 0 with getSize(z) = wx */
2163 Node z
= bv::utils::mkZero(wx
);
2164 Node ule
= nm
->mkNode(BITVECTOR_ULE
, s1
, t1
);
2165 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(z
));
2166 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_ULT
, s2
, t2
));
2167 scl
= nm
->mkNode(AND
, ule
, imp
);
2171 /* s1 o x o s2 >= t (interpret t as t1 o tx o t2)
2172 * with invertibility condition:
2175 * (=> (and (= s1 t1) (= tx ones)) (bvuge s2 t2)))
2177 * ones = ~0 with getSize(ones) = wx */
2178 Node n
= bv::utils::mkOnes(wx
);
2179 Node uge
= nm
->mkNode(BITVECTOR_UGE
, s1
, t1
);
2180 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(n
));
2181 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_UGE
, s2
, t2
));
2182 scl
= nm
->mkNode(AND
, uge
, imp
);
2186 else if (litk
== BITVECTOR_UGT
)
2192 /* x o s2 > t (interpret t as tx o t2)
2193 * with invertibility condition:
2194 * (=> (= tx ones) (bvugt s2 t2))
2196 * ones = ~0 with getSize(ones) = wx */
2197 Node n
= bv::utils::mkOnes(wx
);
2198 Node ugt
= nm
->mkNode(BITVECTOR_UGT
, s2
, t2
);
2199 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(n
), ugt
);
2203 /* x o s2 <= t (interpret t as tx o t2)
2204 * with invertibility condition:
2205 * (=> (= tx z) (bvule s2 t2))
2207 * z = 0 with getSize(z) = wx */
2208 Node z
= bv::utils::mkZero(wx
);
2209 Node ule
= nm
->mkNode(BITVECTOR_ULE
, s2
, t2
);
2210 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(z
), ule
);
2213 else if (s2
.isNull())
2217 /* s1 o x > t (interpret t as t1 o tx)
2218 * with invertibility condition:
2219 * (and (bvuge s1 t1) (=> (= s1 t1) (distinct tx ones)))
2221 * ones = ~0 with getSize(ones) = wx */
2222 Node n
= bv::utils::mkOnes(wx
);
2223 Node uge
= nm
->mkNode(BITVECTOR_UGE
, s1
, t1
);
2224 Node imp
= nm
->mkNode(IMPLIES
, s1
.eqNode(t1
), tx
.eqNode(n
).notNode());
2225 scl
= nm
->mkNode(AND
, uge
, imp
);
2229 /* s1 o x <= t (interpret t as t1 o tx)
2230 * with invertibility condition:
2232 scl
= nm
->mkNode(BITVECTOR_ULE
, s1
, t1
);
2239 /* s1 o x o s2 > t (interpret t as t1 o tx o t2)
2240 * with invertibility condition:
2243 * (=> (and (= s1 t1) (= tx ones)) (bvugt s2 t2)))
2245 * ones = ~0 with getSize(ones) = wx */
2246 Node n
= bv::utils::mkOnes(wx
);
2247 Node uge
= nm
->mkNode(BITVECTOR_UGE
, s1
, t1
);
2248 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(n
));
2249 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_UGT
, s2
, t2
));
2250 scl
= nm
->mkNode(AND
, uge
, imp
);
2254 /* s1 o x o s2 <= t (interpret t as t1 o tx o t2)
2255 * with invertibility condition:
2258 * (=> (and (= s1 t1) (= tx z)) (bvule s2 t2)))
2260 * z = 0 with getSize(z) = wx */
2261 Node z
= bv::utils::mkZero(wx
);
2262 Node ule
= nm
->mkNode(BITVECTOR_ULE
, s1
, t1
);
2263 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(z
));
2264 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_ULE
, s2
, t2
));
2265 scl
= nm
->mkNode(AND
, ule
, imp
);
2269 else if (litk
== BITVECTOR_SLT
)
2275 /* x o s2 < t (interpret t as tx o t2)
2276 * with invertibility condition:
2277 * (=> (= tx min) (bvult s2 t2))
2279 * min is the signed minimum value with getSize(min) = wx */
2280 Node min
= bv::utils::mkMinSigned(wx
);
2281 Node ult
= nm
->mkNode(BITVECTOR_ULT
, s2
, t2
);
2282 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(min
), ult
);
2286 /* x o s2 >= t (interpret t as tx o t2)
2287 * (=> (= tx max) (bvuge s2 t2))
2289 * max is the signed maximum value with getSize(max) = wx */
2290 Node max
= bv::utils::mkMaxSigned(wx
);
2291 Node uge
= nm
->mkNode(BITVECTOR_UGE
, s2
, t2
);
2292 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(max
), uge
);
2295 else if (s2
.isNull())
2299 /* s1 o x < t (interpret t as t1 o tx)
2300 * with invertibility condition:
2301 * (and (bvsle s1 t1) (=> (= s1 t1) (distinct tx z)))
2303 * z = 0 with getSize(z) = wx */
2304 Node z
= bv::utils::mkZero(wx
);
2305 Node sle
= nm
->mkNode(BITVECTOR_SLE
, s1
, t1
);
2306 Node imp
= nm
->mkNode(IMPLIES
, s1
.eqNode(t1
), tx
.eqNode(z
).notNode());
2307 scl
= nm
->mkNode(AND
, sle
, imp
);
2311 /* s1 o x >= t (interpret t as t1 o tx)
2312 * with invertibility condition:
2314 scl
= nm
->mkNode(BITVECTOR_SGE
, s1
, t1
);
2321 /* s1 o x o s2 < t (interpret t as t1 o tx o t2)
2322 * with invertibility condition:
2325 * (=> (and (= s1 t1) (= tx z)) (bvult s2 t2)))
2327 * z = 0 with getSize(z) = wx */
2328 Node z
= bv::utils::mkZero(wx
);
2329 Node sle
= nm
->mkNode(BITVECTOR_SLE
, s1
, t1
);
2330 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(z
));
2331 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_ULT
, s2
, t2
));
2332 scl
= nm
->mkNode(AND
, sle
, imp
);
2336 /* s1 o x o s2 >= t (interpret t as t1 o tx o t2)
2337 * with invertibility condition:
2340 * (=> (and (= s1 t1) (= tx ones)) (bvuge s2 t2)))
2342 * ones = ~0 with getSize(ones) = wx */
2343 Node n
= bv::utils::mkOnes(wx
);
2344 Node sge
= nm
->mkNode(BITVECTOR_SGE
, s1
, t1
);
2345 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(n
));
2346 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_UGE
, s2
, t2
));
2347 scl
= nm
->mkNode(AND
, sge
, imp
);
2353 Assert(litk
== BITVECTOR_SGT
);
2358 /* x o s2 > t (interpret t as tx o t2)
2359 * with invertibility condition:
2360 * (=> (= tx max) (bvugt s2 t2))
2362 * max is the signed maximum value with getSize(max) = wx */
2363 Node max
= bv::utils::mkMaxSigned(wx
);
2364 Node ugt
= nm
->mkNode(BITVECTOR_UGT
, s2
, t2
);
2365 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(max
), ugt
);
2369 /* x o s2 <= t (interpret t as tx o t2)
2370 * with invertibility condition:
2371 * (=> (= tx min) (bvule s2 t2))
2373 * min is the signed minimum value with getSize(min) = wx */
2374 Node min
= bv::utils::mkMinSigned(wx
);
2375 Node ule
= nm
->mkNode(BITVECTOR_ULE
, s2
, t2
);
2376 scl
= nm
->mkNode(IMPLIES
, tx
.eqNode(min
), ule
);
2379 else if (s2
.isNull())
2383 /* s1 o x > t (interpret t as t1 o tx)
2384 * with invertibility condition:
2385 * (and (bvsge s1 t1) (=> (= s1 t1) (distinct tx ones)))
2387 * ones = ~0 with getSize(ones) = wx */
2388 Node n
= bv::utils::mkOnes(wx
);
2389 Node sge
= nm
->mkNode(BITVECTOR_SGE
, s1
, t1
);
2390 Node imp
= nm
->mkNode(IMPLIES
, s1
.eqNode(t1
), tx
.eqNode(n
).notNode());
2391 scl
= nm
->mkNode(AND
, sge
, imp
);
2395 /* s1 o x <= t (interpret t as t1 o tx)
2396 * with invertibility condition:
2398 scl
= nm
->mkNode(BITVECTOR_SLE
, s1
, t1
);
2405 /* s1 o x o s2 > t (interpret t as t1 o tx o t2)
2406 * with invertibility condition:
2409 * (=> (and (= s1 t1) (= tx ones)) (bvugt s2 t2)))
2411 * ones = ~0 with getSize(ones) = wx */
2412 Node n
= bv::utils::mkOnes(wx
);
2413 Node sge
= nm
->mkNode(BITVECTOR_SGE
, s1
, t1
);
2414 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(n
));
2415 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_UGT
, s2
, t2
));
2416 scl
= nm
->mkNode(AND
, sge
, imp
);
2420 /* s1 o x o s2 <= t (interpret t as t1 o tx o t2)
2421 * with invertibility condition:
2424 * (=> (and (= s1 t1) (= tx z)) (bvule s2 t2)))
2426 * z = 0 with getSize(z) = wx */
2427 Node z
= bv::utils::mkZero(wx
);
2428 Node sle
= nm
->mkNode(BITVECTOR_SLE
, s1
, t1
);
2429 Node a
= nm
->mkNode(AND
, s1
.eqNode(t1
), tx
.eqNode(z
));
2430 Node imp
= nm
->mkNode(IMPLIES
, a
, nm
->mkNode(BITVECTOR_ULE
, s2
, t2
));
2431 scl
= nm
->mkNode(AND
, sle
, imp
);
2435 scr
= s1
.isNull() ? x
: bv::utils::mkConcat(s1
, x
);
2436 if (!s2
.isNull()) scr
= bv::utils::mkConcat(scr
, s2
);
2437 scr
= nm
->mkNode(litk
, scr
, t
);
2438 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
2439 Trace("bv-invert") << "Add SC_" << k
<< "(" << x
<< "): " << ic
<< std::endl
;
2443 Node
getICBvSext(bool pol
, Kind litk
, unsigned idx
, Node x
, Node sv_t
, Node t
)
2445 Assert(litk
== EQUAL
|| litk
== BITVECTOR_ULT
|| litk
== BITVECTOR_SLT
2446 || litk
== BITVECTOR_UGT
|| litk
== BITVECTOR_SGT
);
2448 NodeManager
* nm
= NodeManager::currentNM();
2452 unsigned ws
= bv::utils::getSignExtendAmount(sv_t
);
2453 unsigned w
= bv::utils::getSize(t
);
2460 * with invertibility condition:
2461 * (or (= ((_ extract u l) t) z)
2462 * (= ((_ extract u l) t) ones))
2466 * z = 0 with getSize(z) = ws + 1
2467 * ones = ~0 with getSize(ones) = ws + 1 */
2468 Node ext
= bv::utils::mkExtract(t
, w
- 1, w
- 1 - ws
);
2469 Node z
= bv::utils::mkZero(ws
+ 1);
2470 Node n
= bv::utils::mkOnes(ws
+ 1);
2471 scl
= nm
->mkNode(OR
, ext
.eqNode(z
), ext
.eqNode(n
));
2476 * true (no invertibility condition) */
2477 scl
= nm
->mkConst
<bool>(true);
2480 else if (litk
== BITVECTOR_ULT
)
2485 * with invertibility condition:
2488 * z = 0 with getSize(z) = w */
2489 Node z
= bv::utils::mkZero(w
);
2490 scl
= t
.eqNode(z
).notNode();
2495 * true (no invertibility condition) */
2496 scl
= nm
->mkConst
<bool>(true);
2499 else if (litk
== BITVECTOR_UGT
)
2504 * with invertibility condition:
2507 * ones = ~0 with getSize(ones) = w */
2508 Node n
= bv::utils::mkOnes(w
);
2509 scl
= t
.eqNode(n
).notNode();
2514 * true (no invertibility condition) */
2515 scl
= nm
->mkConst
<bool>(true);
2518 else if (litk
== BITVECTOR_SLT
)
2523 * with invertibility condition:
2524 * (bvslt ((_ sign_extend ws) min) t)
2526 * min is the signed minimum value with getSize(min) = w - ws */
2527 Node min
= bv::utils::mkMinSigned(w
- ws
);
2528 Node ext
= bv::utils::mkSignExtend(min
, ws
);
2529 scl
= nm
->mkNode(BITVECTOR_SLT
, ext
, t
);
2534 * with invertibility condition (combination of sgt and eq):
2537 * (or (= ((_ extract u l) t) z) ; eq
2538 * (= ((_ extract u l) t) ones))
2539 * (bvslt t ((_ zero_extend ws) max))) ; sgt
2543 * z = 0 with getSize(z) = ws + 1
2544 * ones = ~0 with getSize(ones) = ws + 1
2545 * max is the signed maximum value with getSize(max) = w - ws */
2546 Node ext1
= bv::utils::mkExtract(t
, w
- 1, w
- 1 - ws
);
2547 Node z
= bv::utils::mkZero(ws
+ 1);
2548 Node n
= bv::utils::mkOnes(ws
+ 1);
2549 Node o1
= nm
->mkNode(OR
, ext1
.eqNode(z
), ext1
.eqNode(n
));
2550 Node max
= bv::utils::mkMaxSigned(w
- ws
);
2551 Node ext2
= bv::utils::mkConcat(bv::utils::mkZero(ws
), max
);
2552 Node o2
= nm
->mkNode(BITVECTOR_SLT
, t
, ext2
);
2553 scl
= nm
->mkNode(OR
, o1
, o2
);
2558 Assert(litk
== BITVECTOR_SGT
);
2562 * with invertibility condition:
2563 * (bvslt t ((_ zero_extend ws) max))
2565 * max is the signed maximum value with getSize(max) = w - ws */
2566 Node max
= bv::utils::mkMaxSigned(w
- ws
);
2567 Node ext
= bv::utils::mkConcat(bv::utils::mkZero(ws
), max
);
2568 scl
= nm
->mkNode(BITVECTOR_SLT
, t
, ext
);
2573 * with invertibility condition:
2574 * (bvsge t (bvnot ((_ zero_extend ws) max)))
2576 * max is the signed maximum value with getSize(max) = w - ws */
2577 Node max
= bv::utils::mkMaxSigned(w
- ws
);
2578 Node ext
= bv::utils::mkConcat(bv::utils::mkZero(ws
), max
);
2579 scl
= nm
->mkNode(BITVECTOR_SGE
, t
, nm
->mkNode(BITVECTOR_NOT
, ext
));
2582 Node scr
= nm
->mkNode(litk
, bv::utils::mkSignExtend(x
, ws
), t
);
2583 Node ic
= nm
->mkNode(IMPLIES
, scl
, pol
? scr
: scr
.notNode());
2584 Trace("bv-invert") << "Add SC_" << BITVECTOR_SIGN_EXTEND
<< "(" << x
2585 << "): " << ic
<< std::endl
;
2589 } // namespace utils
2590 } // namespace quantifiers
2591 } // namespace theory