@@ -33,26 +33,27 @@ namespace bv {
33
33
for (unsigned i = 0 ; i < nw; ++i)
34
34
lo[i] = 0 , hi[i] = 0 , bits[i] = 0 , fixed[i] = 0 ;
35
35
for (unsigned i = bw; i < 8 * sizeof (digit_t ) * nw; ++i)
36
- set (fixed, i, true );
36
+ set (fixed, i, false );
37
37
}
38
38
39
39
sls_valuation::~sls_valuation () {
40
40
}
41
41
42
- bool sls_valuation::is_feasible () const {
43
- return true ;
44
- mpn_manager m;
45
- unsigned nb = (bw + 7 ) / 8 ;
46
- auto c = m.compare (lo.data (), nb, hi.data (), nb);
42
+ bool sls_valuation::in_range (svector<digit_t > const & bits) const {
43
+ mpn_manager m;
44
+ auto c = m.compare (lo.data (), nw, hi.data (), nw);
45
+ // full range
47
46
if (c == 0 )
48
47
return true ;
48
+ // lo < hi: then lo <= bits & bits < hi
49
49
if (c < 0 )
50
- return
51
- m.compare (lo.data (), nb, bits.data (), nb) <= 0 &&
52
- m.compare (bits.data (), nb, hi.data (), nb) < 0 ;
53
- return
54
- m.compare (lo.data (), nb, bits.data (), nb) <= 0 ||
55
- m.compare (bits.data (), nb, hi.data (), nb) < 0 ;
50
+ return
51
+ m.compare (lo.data (), nw, bits.data (), nw) <= 0 &&
52
+ m.compare (bits.data (), nw, hi.data (), nw) < 0 ;
53
+ // hi < lo: bits < hi or lo <= bits
54
+ return
55
+ m.compare (lo.data (), nw, bits.data (), nw) <= 0 ||
56
+ m.compare (bits.data (), nw, hi.data (), nw) < 0 ;
56
57
}
57
58
58
59
bool sls_valuation::eq (svector<digit_t > const & other) const {
@@ -65,11 +66,34 @@ namespace bv {
65
66
return true ;
66
67
}
67
68
69
+ bool sls_valuation::gt (svector<digit_t > const & a, svector<digit_t > const & b) const {
70
+ mpn_manager m;
71
+ return m.compare (a.data (), nw, b.data (), nw) > 0 ;
72
+ }
73
+
68
74
void sls_valuation::clear_overflow_bits (svector<digit_t >& bits) const {
69
75
for (unsigned i = bw; i < nw * sizeof (digit_t ) * 8 ; ++i)
70
76
set (bits, i, false );
71
77
}
72
78
79
+ bool sls_valuation::get_below (svector<digit_t > const & src, svector<digit_t >& dst) {
80
+ for (unsigned i = 0 ; i < nw; ++i)
81
+ dst[i] = (src[i] & ~fixed[i]) | (fixed[i] & bits[i]);
82
+ for (unsigned i = 0 ; i < nw; ++i)
83
+ dst[i] = fixed[i] & bits[i];
84
+ if (gt (dst, src))
85
+ return false ;
86
+ if (!in_range (dst)) {
87
+ // lo < hi:
88
+ // set dst to lo, except for fixed bits
89
+ //
90
+ if (gt (hi, lo)) {
91
+
92
+ }
93
+ }
94
+ return true ;
95
+ }
96
+
73
97
void sls_valuation::set_value (svector<digit_t >& bits, rational const & n) {
74
98
for (unsigned i = 0 ; i < bw; ++i)
75
99
set (bits, i, n.get_bit (i));
@@ -94,11 +118,16 @@ namespace bv {
94
118
set (bits, i, true );
95
119
}
96
120
97
- bool sls_valuation::can_set (svector<digit_t > const & new_bits) const {
121
+ //
122
+ // new_bits != bits => ~fixed
123
+ // 0 = (new_bits ^ bits) & fixed
124
+ // also check that new_bits are in range
125
+ //
126
+ bool sls_valuation::can_set (svector<digit_t > const & new_bits) const {
98
127
for (unsigned i = 0 ; i < nw; ++i)
99
- if (bits[i] != ((new_bits[i] & ~fixed [i]) | (bits[i] & fixed[i]) ))
100
- return true ;
101
- return false ;
128
+ if (0 != ((new_bits[i] ^ bits [i]) & fixed[i]))
129
+ return false ;
130
+ return in_range (new_bits) ;
102
131
}
103
132
104
133
unsigned sls_valuation::to_nat (svector<digit_t > const & d, unsigned max_n) {
@@ -124,10 +153,15 @@ namespace bv {
124
153
h = mod (h, rational::power_of_two (bw));
125
154
if (h == l)
126
155
return ;
127
- set_value (this ->lo , l);
128
- set_value (this ->hi , h);
156
+ if (eq (lo, hi)) {
157
+ set_value (lo, l);
158
+ set_value (hi, h);
159
+ return ;
160
+ }
161
+
129
162
// TODO: intersect with previous range, if any
130
-
163
+ set_value (lo, l);
164
+ set_value (hi, h);
131
165
}
132
166
133
167
}
0 commit comments