CBMC
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
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>();
29 descriptor + " operand is expected to have a bit-vector sort.");
30}
31
36
37static 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{
49}
50
53
55{
56 return "extract";
57}
58
64
65std::vector<smt_indext> smt_bit_vector_theoryt::extractt::indices() const
66{
68}
69
77
79smt_bit_vector_theoryt::extract(std::size_t i, std::size_t j)
80{
81 PRECONDITION(i >= j);
83}
84
85static 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
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
107
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
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
283
290
294
299
306
313
317
319{
320 return "bvugt";
321}
322
329
336
340
341const char *
346
353
360
364
366{
367 return "bvslt";
368}
369
376
383
387
389{
390 return "bvsle";
391}
392
399
406
410
412{
413 return "bvsgt";
414}
415
422
429
433
438
445
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
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
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
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
612
616
618{
619 return "bvneg";
620}
621
626
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
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
699
703
705{
706 return "repeat";
707}
708
711{
712 const std::size_t operand_width =
713 operand.get_sort().cast<smt_bit_vector_sortt>()->bit_width();
715}
716
717std::vector<smt_indext> smt_bit_vector_theoryt::repeatt::indices() const
718{
719 return {smt_numeral_indext{i}};
720}
721
727
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();
746}
747
749{
750 return {smt_numeral_indext{i}};
751}
752
757
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();
775}
776
778{
779 return {smt_numeral_indext{i}};
780}
781
786
792
794{
795 return "rotate_left";
796}
797
803
805{
806 return {smt_numeral_indext{i}};
807}
808
813
819
821{
822 return "rotate_right";
823}
824
830
832{
833 return {smt_numeral_indext{i}};
834}
835
840
ait supplies three of the four components needed: an abstract interpreter (in this case handling func...
Definition ai.h:562
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 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
#define INVARIANT(CONDITION, REASON)
This macro uses the wrapper function 'invariant_violated_string'.
Definition invariant.h:423
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