2 * ezSAT -- A simple and easy to use CNF generator for SAT solvers
4 * Copyright (C) 2013 Clifford Wolf <clifford@clifford.at>
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20 #include "ezminisat.h"
23 #define INIT_X 123456789
24 #define INIT_Y 362436069
25 #define INIT_Z 521288629
26 #define INIT_W 88675123
28 uint32_t xorshift128() {
29 static uint32_t x
= INIT_X
;
30 static uint32_t y
= INIT_Y
;
31 static uint32_t z
= INIT_Z
;
32 static uint32_t w
= INIT_W
;
33 uint32_t t
= x
^ (x
<< 11);
35 w
^= (w
>> 19) ^ t
^ (t
>> 8);
39 void test_cmp(uint32_t a
, uint32_t b
)
43 printf("A = %10u (%10d)\n", a
, int32_t(a
));
44 printf("B = %10u (%10d)\n", b
, int32_t(b
));
47 std::vector
<int> va
= sat
.vec_var("a", 32);
48 std::vector
<int> vb
= sat
.vec_var("b", 32);
50 sat
.vec_set_unsigned(va
, a
);
51 sat
.vec_set_unsigned(vb
, b
);
53 #define MONITOR_VARS \
54 X(carry) X(overflow) X(sign) X(zero) \
55 X(lt_signed) X(le_signed) X(ge_signed) X(gt_signed) \
56 X(lt_unsigned) X(le_unsigned) X(ge_unsigned) X(gt_unsigned)
58 #define X(_n) int _n; bool _n ## _master;
62 carry_master
= ((uint64_t(a
) - uint64_t(b
)) >> 32) & 1;
63 overflow_master
= (int32_t(a
) - int32_t(b
)) != (int64_t(int32_t(a
)) - int64_t(int32_t(b
)));
64 sign_master
= ((a
- b
) >> 31) & 1;
67 sat
.vec_cmp(va
, vb
, carry
, overflow
, sign
, zero
);
69 lt_signed_master
= int32_t(a
) < int32_t(b
);
70 le_signed_master
= int32_t(a
) <= int32_t(b
);
71 ge_signed_master
= int32_t(a
) >= int32_t(b
);
72 gt_signed_master
= int32_t(a
) > int32_t(b
);
74 lt_unsigned_master
= a
< b
;
75 le_unsigned_master
= a
<= b
;
76 ge_unsigned_master
= a
>= b
;
77 gt_unsigned_master
= a
> b
;
79 lt_signed
= sat
.vec_lt_signed(va
, vb
);
80 le_signed
= sat
.vec_le_signed(va
, vb
);
81 ge_signed
= sat
.vec_ge_signed(va
, vb
);
82 gt_signed
= sat
.vec_gt_signed(va
, vb
);
84 lt_unsigned
= sat
.vec_lt_unsigned(va
, vb
);
85 le_unsigned
= sat
.vec_le_unsigned(va
, vb
);
86 ge_unsigned
= sat
.vec_ge_unsigned(va
, vb
);
87 gt_unsigned
= sat
.vec_gt_unsigned(va
, vb
);
89 std::vector
<int> modelExpressions
;
90 std::vector
<bool> modelValues
, modelMaster
;
91 std::vector
<std::string
> modelNames
;
93 #define X(_n) modelExpressions.push_back(_n); modelNames.push_back(#_n); modelMaster.push_back(_n ## _master);
97 std::vector
<int> add_ab
= sat
.vec_add(va
, vb
);
98 std::vector
<int> sub_ab
= sat
.vec_sub(va
, vb
);
99 std::vector
<int> sub_ba
= sat
.vec_sub(vb
, va
);
101 sat
.vec_append(modelExpressions
, add_ab
);
102 sat
.vec_append(modelExpressions
, sub_ab
);
103 sat
.vec_append(modelExpressions
, sub_ba
);
105 if (!sat
.solve(modelExpressions
, modelValues
)) {
106 fprintf(stderr
, "SAT solver failed to find a model!\n");
110 bool found_error
= false;
112 for (size_t i
= 0; i
< modelMaster
.size(); i
++) {
113 if (modelMaster
.at(i
) != int(modelValues
.at(i
)))
115 printf("%-20s %d%s\n", modelNames
.at(i
).c_str(), int(modelValues
.at(i
)),
116 modelMaster
.at(i
) != modelValues
.at(i
) ? " !!!" : "");
120 uint32_t add_ab_value
= sat
.vec_model_get_unsigned(modelExpressions
, modelValues
, add_ab
);
121 uint32_t sub_ab_value
= sat
.vec_model_get_unsigned(modelExpressions
, modelValues
, sub_ab
);
122 uint32_t sub_ba_value
= sat
.vec_model_get_unsigned(modelExpressions
, modelValues
, sub_ba
);
124 printf("%-20s %10u %10u%s\n", "result(a+b)", add_ab_value
, a
+b
, add_ab_value
!= a
+b
? " !!!" : "");
125 printf("%-20s %10u %10u%s\n", "result(a-b)", sub_ab_value
, a
-b
, sub_ab_value
!= a
-b
? " !!!" : "");
126 printf("%-20s %10u %10u%s\n", "result(b-a)", sub_ba_value
, b
-a
, sub_ba_value
!= b
-a
? " !!!" : "");
129 if (found_error
|| add_ab_value
!= a
+b
|| sub_ab_value
!= a
-b
|| sub_ba_value
!= b
-a
)
136 for (int i
= 0; i
< 1024; i
++) {
137 printf("************** %d **************\n\n", i
);
138 uint32_t a
= xorshift128();
139 uint32_t b
= xorshift128();
140 if (xorshift128() % 16 == 0)