mCRL2
Loading...
Searching...
No Matches
machine_word.h
Go to the documentation of this file.
1// Author(s): Jan Friso Groote
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
11
12#ifndef MCRL2_DATA_DETAIL_MACHINE_WORD_H
13#define MCRL2_DATA_DETAIL_MACHINE_WORD_H
14
15#include <limits>
16#include "mcrl2/data/bool.h"
19
20namespace mcrl2
21{
22
23namespace data
24{
25
26namespace sort_machine_word
27{
28
29namespace detail
30{
31
32/* Below standard operations on machine numbers are implemented. */
33
35{
36 static const machine_number zero=machine_number(0);
37 return zero;
38}
39
40inline const machine_number& one_word()
41{
42 static const machine_number one=machine_number(1);
43 return one;
44}
45
46inline const machine_number& two_word()
47{
48 static const machine_number two=machine_number(2);
49 return two;
50}
51
53{
54 static const machine_number three=machine_number(3);
55 return three;
56}
57
59{
60 static const machine_number four=machine_number(4);
61 return four;
62}
63
64inline const machine_number& max_word()
65{
66 static const machine_number max=machine_number(std::numeric_limits<std::size_t>::max());
67 return max;
68}
69
70inline bool equals_zero_word(const std::size_t n)
71{
72 return n==0;
73}
74
75inline bool equals_one_word(const std::size_t n)
76{
77 return n==1;
78}
79
80inline bool equals_max_word(const std::size_t n)
81{
82 return n==std::numeric_limits<std::size_t>::max();
83}
84
85inline std::size_t succ_word(const std::size_t n)
86{
87 return 1+n;
88}
89
90inline bool equal_word(const std::size_t n1, const std::size_t n2)
91{
92 return n1==n2;
93}
94
95inline bool less_word(const std::size_t n1, const std::size_t n2)
96{
97 return n1<n2;
98}
99
100inline bool less_equal_word(const std::size_t n1, const std::size_t n2)
101{
102 return n1<=n2;
103}
104
105inline std::size_t add_word(const std::size_t n1, const std::size_t n2)
106{
107 return n1+n2;
108}
109
110inline std::size_t add_with_carry_word(const std::size_t n1, const std::size_t n2)
111{
112 return n1+n2+1;
113}
114
115inline bool add_overflow_word(const std::size_t n1, const std::size_t n2)
116{
117 if (n1+n2<n1)
118 {
119 return true; // In this case there is an overflow.
120 }
121 return false; // No overflow.
122}
123
124inline bool add_with_carry_overflow_word(const std::size_t n1, const std::size_t n2)
125{
126 if (n1+n2+1<n1)
127 {
128 return true; // In this case there is an overflow.
129 }
130 return false; // No overflow.
131}
132
133inline std::size_t times_word(const std::size_t n1, const std::size_t n2)
134{
135 return n1*n2;
136}
137
138inline std::size_t times_with_carry_word(const std::size_t n1, const std::size_t n2, const std::size_t n3)
139{
140 return n1*n2+n3;
141}
142
143std::size_t times_overflow_word(const std::size_t n1, const std::size_t n2);
144
145std::size_t times_with_carry_overflow_word(const std::size_t n1, const std::size_t n2, std::size_t n3);
146
147inline std::size_t minus_word(const std::size_t n1, const std::size_t n2)
148{
149 return n1-n2;
150}
151
152inline std::size_t monus_word(const std::size_t n1, const std::size_t n2)
153{
154 if (n1>n2)
155 {
156 return n1-n2;
157 }
158 return 0;
159}
160
161inline std::size_t div_word(const std::size_t n1, const std::size_t n2)
162{
163 return n1/n2;
164}
165
166inline std::size_t mod_word(const std::size_t n1, const std::size_t n2)
167{
168 return n1 % n2;
169}
170
171std::size_t div_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3);
172
173std::size_t mod_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3);
174
175std::size_t div_double_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4);
176
177std::size_t mod_double_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4);
178
179std::size_t div_triple_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4, const std::size_t n5);
180
181inline std::size_t sqrt_word(const std::size_t n)
182{
183 return sqrt(n);
184}
185
186std::size_t sqrt_doubleword(const std::size_t n1, const std::size_t n2);
187
188std::size_t sqrt_tripleword(const std::size_t n1, const std::size_t n2, const std::size_t n3);
189
190std::size_t sqrt_tripleword_overflow(const std::size_t n1, const std::size_t n2, const std::size_t n3);
191
192std::size_t sqrt_quadrupleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4);
193
194std::size_t sqrt_quadrupleword_overflow(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4);
195
196inline std::size_t pred_word(const std::size_t n)
197{
198 return n-1;
199}
200
201inline void rightmost_bit(data_expression& result, const std::size_t n)
202{
203 if ((n & 1) == 1)
204 {
205 result=sort_bool::true_();
206 return;
207 }
208 result=sort_bool::false_();
209}
210
211inline std::size_t shift_right(const data_expression& e1, const std::size_t n)
212{
213 std::size_t m = n>>1;
214 if (e1==sort_bool::true_())
215 {
216 return m | static_cast<std::size_t>(1)<<((8*sizeof(std::size_t))-1);
217 }
218 return m;
219}
220
221} // end namespace detail
222
227{
228 result=detail::zero_word();
229}
230
235{
236 result=detail::one_word();
237}
238
243{
244 result=detail::two_word();
245}
246
251{
252 result=detail::three_word();
253}
254
259{
260 result=detail::four_word();
261}
262
267{
268 result=detail::max_word();
269}
270
276{
277 assert(is_machine_number(e));
278 if (detail::equals_zero_word(atermpp::down_cast<machine_number>(e).value()))
279 {
280 result=sort_bool::true_();
281 return;
282 }
283 result=sort_bool::false_();
284 return;
285}
286
292{
293 assert(is_machine_number(e));
294 if (detail::equals_zero_word(atermpp::down_cast<machine_number>(e).value()))
295 {
296 result=sort_bool::false_();
297 return;
298 }
299 result=sort_bool::true_();
300 return;
301}
302
308{
309 assert(is_machine_number(e));
310 if (detail::equals_one_word(atermpp::down_cast<machine_number>(e).value()))
311 {
312 result=sort_bool::true_();
313 return;
314 }
315 result=sort_bool::false_();
316 return;
317}
318
324{
325 assert(is_machine_number(e));
326 if (detail::equals_max_word(atermpp::down_cast<machine_number>(e).value()))
327 {
328 result=sort_bool::true_();
329 return;
330 }
331 result=sort_bool::false_();
332 return;
333}
334
340{
341 assert(is_machine_number(e));
342 make_machine_number(result, detail::succ_word(atermpp::down_cast<machine_number>(e).value()));
343}
344
351{
352 assert(is_machine_number(e1) && is_machine_number(e2));
353 const bool b=detail::equal_word(
354 atermpp::down_cast<machine_number>(e1).value(),
355 atermpp::down_cast<machine_number>(e2).value());
356 result=(b? sort_bool::true_(): sort_bool::false_());
357}
358
365{
366 assert(is_machine_number(e1) && is_machine_number(e2));
367 const bool b=detail::equal_word(
368 atermpp::down_cast<machine_number>(e1).value(),
369 atermpp::down_cast<machine_number>(e2).value());
370 result=(b? sort_bool::false_(): sort_bool::true_());
371}
372
379{
380 assert(is_machine_number(e1) && is_machine_number(e2));
381 const bool b=detail::less_word(atermpp::down_cast<machine_number>(e1).value(),atermpp::down_cast<machine_number>(e2).value());
382 result=(b? sort_bool::true_(): sort_bool::false_());
383}
384
391{
392 assert(is_machine_number(e1) && is_machine_number(e2));
393 const bool b=detail::less_equal_word(atermpp::down_cast<machine_number>(e1).value(),atermpp::down_cast<machine_number>(e2).value());
394 result=(b? sort_bool::true_(): sort_bool::false_());
395}
396
403{
404 assert(is_machine_number(e1) && is_machine_number(e2));
405 const bool b=detail::less_word(atermpp::down_cast<machine_number>(e2).value(),atermpp::down_cast<machine_number>(e1).value());
406 result=(b? sort_bool::true_(): sort_bool::false_());
407}
408
415{
416 assert(is_machine_number(e1) && is_machine_number(e2));
417 const bool b=detail::less_equal_word(atermpp::down_cast<machine_number>(e2).value(),atermpp::down_cast<machine_number>(e1).value());
418 result=(b? sort_bool::true_(): sort_bool::false_());
419}
420
427{
428 assert(is_machine_number(e1) && is_machine_number(e2));
430 atermpp::down_cast<machine_number>(e1).value(),
431 atermpp::down_cast<machine_number>(e2).value()));
432}
433
440{
441 assert(is_machine_number(e1) && is_machine_number(e2));
443 atermpp::down_cast<machine_number>(e1).value(),
444 atermpp::down_cast<machine_number>(e2).value()));
445}
446
453{
454 assert(is_machine_number(e1) && is_machine_number(e2));
456 atermpp::down_cast<machine_number>(e1).value(),
457 atermpp::down_cast<machine_number>(e2).value()))
458 {
459 result=sort_bool::true_();
460 return;
461 }
462 result=sort_bool::false_();
463}
464
471{
472 assert(is_machine_number(e1) && is_machine_number(e2));
474 atermpp::down_cast<machine_number>(e1).value(),
475 atermpp::down_cast<machine_number>(e2).value()))
476 {
477 result=sort_bool::true_();
478 return;
479 }
480 result=sort_bool::false_();
481}
482
489{
490 assert(is_machine_number(e1) && is_machine_number(e2));
492 atermpp::down_cast<machine_number>(e1).value(),
493 atermpp::down_cast<machine_number>(e2).value()));
494}
495
502{
503 assert(is_machine_number(e1) && is_machine_number(e2) && is_machine_number(e3));
505 atermpp::down_cast<machine_number>(e1).value(),
506 atermpp::down_cast<machine_number>(e2).value(),
507 atermpp::down_cast<machine_number>(e3).value()));
508}
509
516{
517 assert(is_machine_number(e1) && is_machine_number(e2));
519 atermpp::down_cast<machine_number>(e1).value(),
520 atermpp::down_cast<machine_number>(e2).value()));
521}
522
529{
530 assert(is_machine_number(e1) && is_machine_number(e2) && is_machine_number(e3));
532 atermpp::down_cast<machine_number>(e1).value(),
533 atermpp::down_cast<machine_number>(e2).value(),
534 atermpp::down_cast<machine_number>(e3).value()));
535}
536
543{
544 assert(is_machine_number(e1) && is_machine_number(e2));
546 atermpp::down_cast<machine_number>(e1).value(),
547 atermpp::down_cast<machine_number>(e2).value()));
548}
549
556{
557 assert(is_machine_number(e1) && is_machine_number(e2));
559 atermpp::down_cast<machine_number>(e1).value(),
560 atermpp::down_cast<machine_number>(e2).value()));
561}
562
569{
570 assert(is_machine_number(e1) && is_machine_number(e2));
572 atermpp::down_cast<machine_number>(e1).value(),
573 atermpp::down_cast<machine_number>(e2).value()));
574}
575
582{
583 assert(is_machine_number(e1) && is_machine_number(e2));
585 atermpp::down_cast<machine_number>(e1).value(),
586 atermpp::down_cast<machine_number>(e2).value()));
587}
588
594{
595 assert(is_machine_number(e));
596 make_machine_number(result, detail::sqrt_word(atermpp::down_cast<machine_number>(e).value()));
597}
598
606{
607 assert(is_machine_number(e1) && is_machine_number(e2) && is_machine_number(e3));
609 atermpp::down_cast<machine_number>(e1).value(),
610 atermpp::down_cast<machine_number>(e2).value(),
611 atermpp::down_cast<machine_number>(e3).value()));
612}
613
622{
625 atermpp::down_cast<machine_number>(e1).value(),
626 atermpp::down_cast<machine_number>(e2).value(),
627 atermpp::down_cast<machine_number>(e3).value(),
628 atermpp::down_cast<machine_number>(e4).value()));
629}
630
640 data_expression& result,
641 const data_expression& e1,
642 const data_expression& e2,
643 const data_expression& e3,
644 const data_expression& e4,
645 const data_expression& e5)
646{
649 atermpp::down_cast<machine_number>(e1).value(),
650 atermpp::down_cast<machine_number>(e2).value(),
651 atermpp::down_cast<machine_number>(e3).value(),
652 atermpp::down_cast<machine_number>(e4).value(),
653 atermpp::down_cast<machine_number>(e5).value()));
654}
655
664{
667 atermpp::down_cast<machine_number>(e1).value(),
668 atermpp::down_cast<machine_number>(e2).value(),
669 atermpp::down_cast<machine_number>(e3).value(),
670 atermpp::down_cast<machine_number>(e4).value()));
671}
672
679{
680 assert(is_machine_number(e1) && is_machine_number(e2));
682 atermpp::down_cast<machine_number>(e1).value(),
683 atermpp::down_cast<machine_number>(e2).value()));
684}
685
693{
694 assert(is_machine_number(e1) && is_machine_number(e2) && is_machine_number(e3));
696 atermpp::down_cast<machine_number>(e1).value(),
697 atermpp::down_cast<machine_number>(e2).value(),
698 atermpp::down_cast<machine_number>(e3).value()));
699}
700
708{
709 assert(is_machine_number(e1) && is_machine_number(e2) && is_machine_number(e3));
711 atermpp::down_cast<machine_number>(e1).value(),
712 atermpp::down_cast<machine_number>(e2).value(),
713 atermpp::down_cast<machine_number>(e3).value()));
714}
715
723{
724 assert(is_machine_number(e1) && is_machine_number(e2) && is_machine_number(e3));
726 atermpp::down_cast<machine_number>(e1).value(),
727 atermpp::down_cast<machine_number>(e2).value(),
728 atermpp::down_cast<machine_number>(e3).value()));
729}
730
739 data_expression& result,
740 const data_expression& e1,
741 const data_expression& e2,
742 const data_expression& e3,
743 const data_expression& e4)
744{
747 atermpp::down_cast<machine_number>(e1).value(),
748 atermpp::down_cast<machine_number>(e2).value(),
749 atermpp::down_cast<machine_number>(e3).value(),
750 atermpp::down_cast<machine_number>(e4).value()));
751}
752
761 data_expression& result,
762 const data_expression& e1,
763 const data_expression& e2,
764 const data_expression& e3,
765 const data_expression& e4)
766{
769 atermpp::down_cast<machine_number>(e1).value(),
770 atermpp::down_cast<machine_number>(e2).value(),
771 atermpp::down_cast<machine_number>(e3).value(),
772 atermpp::down_cast<machine_number>(e4).value()));
773}
774
780{
781 make_machine_number(result, detail::pred_word(atermpp::down_cast<machine_number>(e).value()));
782}
783
789{
790 detail::rightmost_bit(result, atermpp::down_cast<machine_number>(e).value());
791}
792
799{
800 assert(e1==sort_bool::true_() || e1==sort_bool::false_());
801 make_machine_number(result, detail::shift_right(e1, atermpp::down_cast<machine_number>(e2).value()));
802}
803
804
805} // namespace sort_machine_word
806
807} // namespace data
808
809} // namespace mcrl2
810
811#endif // MCRL2_DATA_MACHINE_NUMBER_H
812
The standard sort bool_.
\brief A machine number
The class machine_number, which is a subclass of data_expression.
The standard sort machine_word.
const function_symbol & false_()
Constructor for function symbol false.
Definition bool.h:109
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:77
std::size_t sqrt_quadrupleword_overflow(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
const machine_number & four_word()
std::size_t shift_right(const data_expression &e1, const std::size_t n)
std::size_t sqrt_tripleword(const std::size_t n1, const std::size_t n2, const std::size_t n3)
std::size_t times_with_carry_overflow_word(const std::size_t n1, const std::size_t n2, std::size_t n3)
bool equals_zero_word(const std::size_t n)
std::size_t div_word(const std::size_t n1, const std::size_t n2)
std::size_t succ_word(const std::size_t n)
bool less_word(const std::size_t n1, const std::size_t n2)
std::size_t div_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3)
std::size_t pred_word(const std::size_t n)
std::size_t add_word(const std::size_t n1, const std::size_t n2)
const machine_number & one_word()
std::size_t mod_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3)
bool equals_max_word(const std::size_t n)
std::size_t sqrt_word(const std::size_t n)
std::size_t times_overflow_word(const std::size_t n1, const std::size_t n2)
const machine_number & max_word()
bool equal_word(const std::size_t n1, const std::size_t n2)
std::size_t times_word(const std::size_t n1, const std::size_t n2)
bool add_overflow_word(const std::size_t n1, const std::size_t n2)
std::size_t div_double_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
bool add_with_carry_overflow_word(const std::size_t n1, const std::size_t n2)
std::size_t minus_word(const std::size_t n1, const std::size_t n2)
std::size_t add_with_carry_word(const std::size_t n1, const std::size_t n2)
const machine_number & three_word()
bool less_equal_word(const std::size_t n1, const std::size_t n2)
bool equals_one_word(const std::size_t n)
std::size_t mod_double_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
std::size_t mod_word(const std::size_t n1, const std::size_t n2)
std::size_t div_triple_doubleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4, const std::size_t n5)
const machine_number & two_word()
std::size_t sqrt_doubleword(const std::size_t n1, const std::size_t n2)
std::size_t sqrt_tripleword_overflow(const std::size_t n1, const std::size_t n2, const std::size_t n3)
std::size_t times_with_carry_word(const std::size_t n1, const std::size_t n2, const std::size_t n3)
const machine_number & zero_word()
void rightmost_bit(data_expression &result, const std::size_t n)
std::size_t sqrt_quadrupleword(const std::size_t n1, const std::size_t n2, const std::size_t n3, const std::size_t n4)
const function_symbol & sqrt_word()
Constructor for function symbol @sqrt_word.
void times_with_carry_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
The result of multiplying two words and adding a third divided by the maximal representable machine w...
void sqrt_tripleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates the least significant word of the square root of base*(base*e1+e2)+e3.
void pred_word_manual_implementation(data_expression &result, const data_expression &e)
The predecessor function on a machine numbers, that wraps around.
void add_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of adding two words modulo the maximal representable machine word plus 1.
void two_word_manual_implementation(data_expression &result)
The machine number representing 2.
const function_symbol & add_word()
Constructor for function symbol @add_word.
void shift_right_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The machine word shifted one position to the right.
const function_symbol & div_double_doubleword()
Constructor for function symbol @div_double_doubleword.
void times_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of multiplying two words modulo the maximal representable machine word plus 1.
const function_symbol & div_word()
Constructor for function symbol @div_word.
void equals_zero_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is equal to 0.
void div_triple_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4, const data_expression &e5)
Calculates (base*(base*e1 + e2)+e3) div (base*e4 + e5).
const function_symbol & pred_word()
Constructor for function symbol @pred_word.
const function_symbol & equals_max_word()
Constructor for function symbol @equals_max_word.
const function_symbol & equals_one_word()
Constructor for function symbol @equals_one_word.
void zero_word_manual_implementation(data_expression &result)
The machine number representing 0.
const function_symbol & mod_word()
Constructor for function symbol @mod_word.
const function_symbol & div_doubleword()
Constructor for function symbol @div_doubleword.
const function_symbol & succ_word()
Constructor for function symbol @succ_word.
void times_with_carry_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
The result of multiplying two words and adding the third modulo the maximal representable machine wor...
const function_symbol & sqrt_quadrupleword_overflow()
Constructor for function symbol @sqrt_quadrupleword_overflow.
const function_symbol & less_word()
Constructor for function symbol @less.
void three_word_manual_implementation(data_expression &result)
The machine number representing 3.
const function_symbol & add_with_carry_word()
Constructor for function symbol @add_with_carry_word.
void times_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of multiplying two words divided by the maximal representable machine word plus 1.
void sqrt_quadrupleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates the least significant word of the square root of base*(base*(base*e1+e2)+e3)+e4.
const function_symbol & monus_word()
Constructor for function symbol @monus_word.
void not_equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The non equality function on two machine words.
const function_symbol & sqrt_tripleword_overflow()
Constructor for function symbol @sqrt_tripleword_overflow.
const function_symbol & sqrt_quadrupleword()
Constructor for function symbol @sqrt_quadrupleword.
void less_equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The less than or equal function on two machine words.
const function_symbol & equals_zero_word()
Constructor for function symbol @equals_zero_word.
const function_symbol & minus_word()
Constructor for function symbol @minus_word.
const function_symbol & add_with_carry_overflow_word()
Constructor for function symbol @add_with_carry_overflow_word.
const function_symbol & times_with_carry_word()
Constructor for function symbol @times_with_carry_word.
void sqrt_tripleword_overflow_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates the most significant word of the square root of base*(base*e1+e2)+e3.
void sqrt_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The square root of base*e1+e2 rounded down.
void greater_equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The greater than or equal function on two machine words.
const function_symbol & times_with_carry_overflow_word()
Constructor for function symbol @times_with_carry_overflow_word.
void div_double_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates (base*e1 + e2) div (base*e3 + e4).
const function_symbol & div_triple_doubleword()
Constructor for function symbol @div_triple_doubleword.
void equals_one_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is equal to 1.
const function_symbol & times_overflow_word()
Constructor for function symbol @times_overflow_word.
void div_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates (base*e1 + e2) div e3.
void mod_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
Calculates e1 modulo e2.
void sqrt_quadrupleword_overflow_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates the most significant word of the square root of base*(base*(base*e1+e2)+e3)+e4.
void not_equals_zero_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is not equal to 0.
void less_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The less than function on two machine words.
void max_word_manual_implementation(data_expression &result)
The largest representable machine number.
const function_symbol & equal_word()
Constructor for function symbol @equal.
const function_symbol & mod_doubleword()
Constructor for function symbol @mod_doubleword.
void add_with_carry_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of adding two words plus 1 modulo the maximal representable machine word plus 1.
const function_symbol & sqrt_tripleword()
Constructor for function symbol @sqrt_tripleword.
const function_symbol & rightmost_bit()
Constructor for function symbol @rightmost_bit.
void one_word_manual_implementation(data_expression &result)
The machine number representing 1.
const function_symbol & less_equal_word()
Constructor for function symbol @less_equal.
void equal_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The equality function on two machine words.
void four_word_manual_implementation(data_expression &result)
The machine number representing 4.
void minus_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of subtracting two words modulo the maximal representable machine word plus 1.
void succ_word_manual_implementation(data_expression &result, const data_expression &e)
The successor function on a machine numbers, that wraps around.
void equals_max_word_manual_implementation(data_expression &result, const data_expression &e)
Checks whether the argument is equal to the largest 64 bit number.
void mod_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3)
Calculates (base*e1 + e2) mod e3. The result fits in one word.
void add_with_carry_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
An indication whether an overflow occurs when e1 and e2 are added.
void add_overflow_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
An indication whether an overflow occurs when e1 and e2 are added.
void mod_double_doubleword_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4)
Calculates (base*e1 + e2) mod (base*e3 + e4).
void sqrt_word_manual_implementation(data_expression &result, const data_expression &e)
The square root of e, rounded down to a machine word.
const function_symbol & times_word()
Constructor for function symbol @times_word.
void rightmost_bit_manual_implementation(data_expression &result, const data_expression &e)
The right most bit of a machine number.
void greater_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The greater than function on two machine words.
const function_symbol & sqrt_doubleword()
Constructor for function symbol @sqrt_doubleword.
void div_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
Calculates the division of the first word by the second.
const function_symbol & shift_right()
Constructor for function symbol @shift_right.
void monus_word_manual_implementation(data_expression &result, const data_expression &e1, const data_expression &e2)
The result of subtracting two words. If the result is negative 0 is returned.
const function_symbol & add_overflow_word()
Constructor for function symbol @add_overflow_word.
void make_machine_number(atermpp::aterm &t, size_t n)
data_expression max(const data_expression &e1, const data_expression &e2, const rewriter &)
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
Definition indexed_set.h:72