CBMC
smt_bit_vector_theory.cpp
Go to the documentation of this file.
1 // Author: Diffblue Ltd.
2 
4 
5 #include <util/invariant.h>
6 
8 {
9  return "concat";
10 }
11 
13  const smt_termt &lhs,
14  const smt_termt &rhs)
15 {
16  const auto get_width = [](const smt_termt &term) {
17  return term.get_sort().cast<smt_bit_vector_sortt>()->bit_width();
18  };
19  return smt_bit_vector_sortt{get_width(lhs) + get_width(rhs)};
20 }
21 
23  const std::string &descriptor,
24  const smt_termt &operand)
25 {
26  const auto operand_sort = operand.get_sort().cast<smt_bit_vector_sortt>();
27  INVARIANT(
28  operand_sort,
29  descriptor + " operand is expected to have a bit-vector sort.");
30 }
31 
32 static void validate_bit_vector_sort(const smt_termt &operand)
33 {
34  validate_bit_vector_sort("The", operand);
35 }
36 
37 static void
39 {
40  validate_bit_vector_sort("Left", lhs);
41  validate_bit_vector_sort("Right", rhs);
42 }
43 
45  const smt_termt &lhs,
46  const smt_termt &rhs)
47 {
48  validate_bit_vector_sorts(lhs, rhs);
49 }
50 
53 
55 {
56  return "extract";
57 }
58 
61 {
62  return smt_bit_vector_sortt{i - j + 1};
63 }
64 
65 std::vector<smt_indext> smt_bit_vector_theoryt::extractt::indices() const
66 {
67  return {smt_numeral_indext{i}, smt_numeral_indext{j}};
68 }
69 
71 {
72  PRECONDITION(i >= j);
73  const auto bit_vector_sort = operand.get_sort().cast<smt_bit_vector_sortt>();
74  PRECONDITION(bit_vector_sort);
75  PRECONDITION(i < bit_vector_sort->bit_width());
76 }
77 
79 smt_bit_vector_theoryt::extract(std::size_t i, std::size_t j)
80 {
81  PRECONDITION(i >= j);
83 }
84 
85 static void
87 {
88  validate_bit_vector_sorts(left, right);
89  // The below invariant is based on the smtlib standard.
90  // See http://smtlib.cs.uiowa.edu/logics-all.shtml#QF_BV
91  INVARIANT(
92  left.get_sort() == right.get_sort(),
93  "Left and right operands must have the same bit width.");
94 }
95 
96 // Bitwise operator definitions
97 
99 {
100  return "bvnot";
101 }
102 
104 {
105  return operand.get_sort();
106 }
107 
109 {
110  validate_bit_vector_sort(operand);
111 }
112 
115 
117 {
118  return "bvand";
119 }
120 
122  const smt_termt &lhs,
123  const smt_termt &rhs)
124 {
125  return lhs.get_sort();
126 }
127 
129  const smt_termt &lhs,
130  const smt_termt &rhs)
131 {
133 }
134 
137 
139 {
140  return "bvor";
141 }
142 
144  const smt_termt &lhs,
145  const smt_termt &rhs)
146 {
147  return lhs.get_sort();
148 }
149 
151  const smt_termt &lhs,
152  const smt_termt &rhs)
153 {
155 }
156 
159 
161 {
162  return "bvnand";
163 }
164 
166  const smt_termt &lhs,
167  const smt_termt &rhs)
168 {
169  return lhs.get_sort();
170 }
171 
173  const smt_termt &lhs,
174  const smt_termt &rhs)
175 {
177 }
178 
181 
183 {
184  return "bvnor";
185 }
186 
188  const smt_termt &lhs,
189  const smt_termt &rhs)
190 {
191  return lhs.get_sort();
192 }
193 
195  const smt_termt &lhs,
196  const smt_termt &rhs)
197 {
199 }
200 
203 
205 {
206  return "bvxor";
207 }
208 
210  const smt_termt &lhs,
211  const smt_termt &rhs)
212 {
213  return lhs.get_sort();
214 }
215 
217  const smt_termt &lhs,
218  const smt_termt &rhs)
219 {
221 }
222 
225 
227 {
228  return "bvxnor";
229 }
230 
232  const smt_termt &lhs,
233  const smt_termt &rhs)
234 {
235  return lhs.get_sort();
236 }
237 
239  const smt_termt &lhs,
240  const smt_termt &rhs)
241 {
243 }
244 
247 
249 {
250  return "bvcomp";
251 }
252 
254  const smt_termt &lhs,
255  const smt_termt &rhs)
256 {
257  return smt_bit_vector_sortt{1};
258 }
259 
261  const smt_termt &lhs,
262  const smt_termt &rhs)
263 {
265 }
266 
269 
270 // Relational operator definitions
271 
273 {
274  return "bvult";
275 }
276 
278  const smt_termt &lhs,
279  const smt_termt &rhs)
280 {
281  return smt_bool_sortt{};
282 }
283 
285  const smt_termt &lhs,
286  const smt_termt &rhs)
287 {
289 }
290 
294 
296 {
297  return "bvule";
298 }
299 
301  const smt_termt &lhs,
302  const smt_termt &rhs)
303 {
304  return smt_bool_sortt{};
305 }
306 
308  const smt_termt &lhs,
309  const smt_termt &rhs)
310 {
312 }
313 
317 
319 {
320  return "bvugt";
321 }
322 
324  const smt_termt &lhs,
325  const smt_termt &rhs)
326 {
327  return smt_bool_sortt{};
328 }
329 
331  const smt_termt &lhs,
332  const smt_termt &rhs)
333 {
335 }
336 
340 
341 const char *
343 {
344  return "bvuge";
345 }
346 
348  const smt_termt &lhs,
349  const smt_termt &rhs)
350 {
351  return smt_bool_sortt{};
352 }
353 
355  const smt_termt &lhs,
356  const smt_termt &rhs)
357 {
359 }
360 
364 
366 {
367  return "bvslt";
368 }
369 
371  const smt_termt &lhs,
372  const smt_termt &rhs)
373 {
374  return smt_bool_sortt{};
375 }
376 
378  const smt_termt &lhs,
379  const smt_termt &rhs)
380 {
382 }
383 
387 
389 {
390  return "bvsle";
391 }
392 
394  const smt_termt &lhs,
395  const smt_termt &rhs)
396 {
397  return smt_bool_sortt{};
398 }
399 
401  const smt_termt &lhs,
402  const smt_termt &rhs)
403 {
405 }
406 
410 
412 {
413  return "bvsgt";
414 }
415 
417  const smt_termt &lhs,
418  const smt_termt &rhs)
419 {
420  return smt_bool_sortt{};
421 }
422 
424  const smt_termt &lhs,
425  const smt_termt &rhs)
426 {
428 }
429 
433 
435 {
436  return "bvsge";
437 }
438 
440  const smt_termt &lhs,
441  const smt_termt &rhs)
442 {
443  return smt_bool_sortt{};
444 }
445 
447  const smt_termt &lhs,
448  const smt_termt &rhs)
449 {
451 }
452 
456 
458 {
459  return "bvadd";
460 }
461 
463  const smt_termt &lhs,
464  const smt_termt &rhs)
465 {
466  return lhs.get_sort();
467 }
468 
470  const smt_termt &lhs,
471  const smt_termt &rhs)
472 {
474 }
475 
478 
480 {
481  return "bvsub";
482 }
483 
485  const smt_termt &lhs,
486  const smt_termt &rhs)
487 {
488  return lhs.get_sort();
489 }
490 
492  const smt_termt &lhs,
493  const smt_termt &rhs)
494 {
496 }
497 
501 
503 {
504  return "bvmul";
505 }
506 
508  const smt_termt &lhs,
509  const smt_termt &rhs)
510 {
511  return lhs.get_sort();
512 }
513 
515  const smt_termt &lhs,
516  const smt_termt &rhs)
517 {
519 }
520 
524 
526 {
527  return "bvudiv";
528 }
529 
531  const smt_termt &lhs,
532  const smt_termt &rhs)
533 {
534  return lhs.get_sort();
535 }
536 
538  const smt_termt &lhs,
539  const smt_termt &rhs)
540 {
542 }
543 
547 
549 {
550  return "bvsdiv";
551 }
552 
554  const smt_termt &lhs,
555  const smt_termt &rhs)
556 {
557  return lhs.get_sort();
558 }
559 
561  const smt_termt &lhs,
562  const smt_termt &rhs)
563 {
565 }
566 
570 
572 {
573  return "bvurem";
574 }
575 
577  const smt_termt &lhs,
578  const smt_termt &rhs)
579 {
580  return lhs.get_sort();
581 }
582 
584  const smt_termt &lhs,
585  const smt_termt &rhs)
586 {
588 }
589 
593 
595 {
596  return "bvsrem";
597 }
598 
600  const smt_termt &lhs,
601  const smt_termt &rhs)
602 {
603  return lhs.get_sort();
604 }
605 
607  const smt_termt &lhs,
608  const smt_termt &rhs)
609 {
611 }
612 
616 
618 {
619  return "bvneg";
620 }
621 
623 {
624  return operand.get_sort();
625 }
626 
628 {
629  validate_bit_vector_sort(operand);
630 }
631 
634 
636 {
637  return "bvshl";
638 }
639 
641  const smt_termt &lhs,
642  const smt_termt &rhs)
643 {
644  return lhs.get_sort();
645 }
646 
648  const smt_termt &lhs,
649  const smt_termt &rhs)
650 {
652 }
653 
657 
659 {
660  return "bvlshr";
661 }
662 
664  const smt_termt &lhs,
665  const smt_termt &rhs)
666 {
667  return lhs.get_sort();
668 }
669 
671  const smt_termt &lhs,
672  const smt_termt &rhs)
673 {
675 }
676 
680 
682 {
683  return "bvashr";
684 }
685 
687  const smt_termt &lhs,
688  const smt_termt &rhs)
689 {
690  return lhs.get_sort();
691 }
692 
694  const smt_termt &lhs,
695  const smt_termt &rhs)
696 {
698 }
699 
703 
705 {
706  return "repeat";
707 }
708 
709 smt_sortt
711 {
712  const std::size_t operand_width =
713  operand.get_sort().cast<smt_bit_vector_sortt>()->bit_width();
714  return smt_bit_vector_sortt{i * operand_width};
715 }
716 
717 std::vector<smt_indext> smt_bit_vector_theoryt::repeatt::indices() const
718 {
719  return {smt_numeral_indext{i}};
720 }
721 
723 {
724  PRECONDITION(i >= 1);
726 }
727 
730 {
731  PRECONDITION(i >= 1);
733 }
734 
736 {
737  return "zero_extend";
738 }
739 
741  const smt_termt &operand) const
742 {
743  const std::size_t operand_width =
744  operand.get_sort().cast<smt_bit_vector_sortt>()->bit_width();
745  return smt_bit_vector_sortt{i + operand_width};
746 }
747 
748 std::vector<smt_indext> smt_bit_vector_theoryt::zero_extendt::indices() const
749 {
750  return {smt_numeral_indext{i}};
751 }
752 
754 {
756 }
757 
760 {
762 }
763 
765 {
766  return "sign_extend";
767 }
768 
770  const smt_termt &operand) const
771 {
772  const std::size_t operand_width =
773  operand.get_sort().cast<smt_bit_vector_sortt>()->bit_width();
774  return smt_bit_vector_sortt{i + operand_width};
775 }
776 
777 std::vector<smt_indext> smt_bit_vector_theoryt::sign_extendt::indices() const
778 {
779  return {smt_numeral_indext{i}};
780 }
781 
783 {
785 }
786 
789 {
791 }
792 
794 {
795  return "rotate_left";
796 }
797 
798 smt_sortt
800 {
801  return operand.get_sort();
802 }
803 
804 std::vector<smt_indext> smt_bit_vector_theoryt::rotate_leftt::indices() const
805 {
806  return {smt_numeral_indext{i}};
807 }
808 
810 {
812 }
813 
816 {
818 }
819 
821 {
822  return "rotate_right";
823 }
824 
825 smt_sortt
827 {
828  return operand.get_sort();
829 }
830 
831 std::vector<smt_indext> smt_bit_vector_theoryt::rotate_rightt::indices() const
832 {
833  return {smt_numeral_indext{i}};
834 }
835 
837 {
839 }
840 
843 {
845 }
static const smt_function_application_termt::factoryt< xnort > xnor
static const smt_function_application_termt::factoryt< ort > make_or
static const smt_function_application_termt::factoryt< unsigned_less_than_or_equalt > unsigned_less_than_or_equal
static const smt_function_application_termt::factoryt< signed_less_than_or_equalt > signed_less_than_or_equal
static const smt_function_application_termt::factoryt< nort > nor
static const smt_function_application_termt::factoryt< addt > add
static const smt_function_application_termt::factoryt< arithmetic_shift_rightt > arithmetic_shift_right
static const smt_function_application_termt::factoryt< signed_greater_than_or_equalt > signed_greater_than_or_equal
static const smt_function_application_termt::factoryt< unsigned_greater_thant > unsigned_greater_than
static const smt_function_application_termt::factoryt< unsigned_remaindert > unsigned_remainder
static const smt_function_application_termt::factoryt< unsigned_greater_than_or_equalt > unsigned_greater_than_or_equal
static const smt_function_application_termt::factoryt< xort > make_xor
static const smt_function_application_termt::factoryt< nott > make_not
static const smt_function_application_termt::factoryt< shift_leftt > shift_left
static const smt_function_application_termt::factoryt< multiplyt > multiply
static smt_function_application_termt::factoryt< sign_extendt > sign_extend(std::size_t i)
static const smt_function_application_termt::factoryt< signed_less_thant > signed_less_than
static smt_function_application_termt::factoryt< zero_extendt > zero_extend(std::size_t i)
static smt_function_application_termt::factoryt< extractt > extract(std::size_t i, std::size_t j)
Makes a factory for extract function applications.
static const smt_function_application_termt::factoryt< signed_greater_thant > signed_greater_than
static smt_function_application_termt::factoryt< rotate_rightt > rotate_right(std::size_t i)
static smt_function_application_termt::factoryt< repeatt > repeat(std::size_t i)
static const smt_function_application_termt::factoryt< nandt > nand
static const smt_function_application_termt::factoryt< logical_shift_rightt > logical_shift_right
static const smt_function_application_termt::factoryt< comparet > compare
static const smt_function_application_termt::factoryt< negatet > negate
Arithmetic negation in two's complement.
static const smt_function_application_termt::factoryt< concatt > concat
static const smt_function_application_termt::factoryt< unsigned_dividet > unsigned_divide
static const smt_function_application_termt::factoryt< unsigned_less_thant > unsigned_less_than
static const smt_function_application_termt::factoryt< signed_dividet > signed_divide
static const smt_function_application_termt::factoryt< signed_remaindert > signed_remainder
static const smt_function_application_termt::factoryt< subtractt > subtract
static const smt_function_application_termt::factoryt< andt > make_and
static smt_function_application_termt::factoryt< rotate_leftt > rotate_left(std::size_t i)
const sub_classt * cast() const &
const smt_sortt & get_sort() const
Definition: smt_terms.cpp:36
static void validate_bit_vector_sort(const std::string &descriptor, const smt_termt &operand)
static void validate_matched_bit_vector_sorts(const smt_termt &left, const smt_termt &right)
static void validate_bit_vector_sorts(const smt_termt &lhs, const smt_termt &rhs)
#define PRECONDITION(CONDITION)
Definition: invariant.h:463
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
void validate(const smt_termt &operand) const
smt_sortt return_sort(const smt_termt &operand) const
std::vector< smt_indext > indices() const
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &operand)
static smt_sortt return_sort(const smt_termt &operand)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &operand)
static void validate(const smt_termt &operand)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
std::vector< smt_indext > indices() const
smt_sortt return_sort(const smt_termt &operand) const
void validate(const smt_termt &operand) const
static void validate(const smt_termt &operand)
static smt_sortt return_sort(const smt_termt &operand)
std::vector< smt_indext > indices() const
static smt_sortt return_sort(const smt_termt &operand)
std::vector< smt_indext > indices() const
static void validate(const smt_termt &operand)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &operand)
smt_sortt return_sort(const smt_termt &operand) const
std::vector< smt_indext > indices() const
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static smt_sortt return_sort(const smt_termt &lhs, const smt_termt &rhs)
static void validate(const smt_termt &lhs, const smt_termt &rhs)
std::vector< smt_indext > indices() const
static void validate(const smt_termt &operand)
smt_sortt return_sort(const smt_termt &operand) const