@@ -99,6 +99,8 @@ namespace bv {
99
99
for (unsigned i = 0 ; i < nw; ++i)
100
100
if (0 != (fixed[i] & (m_bits[i] ^ eval[i])))
101
101
return false ;
102
+ if (!in_range (eval))
103
+ return false ;
102
104
for (unsigned i = 0 ; i < nw; ++i)
103
105
m_bits[i] = eval[i];
104
106
SASSERT (well_formed ());
@@ -110,6 +112,7 @@ namespace bv {
110
112
auto c = m.compare (m_lo.data (), nw, m_hi.data (), nw);
111
113
SASSERT (!has_overflow (bits));
112
114
// full range
115
+
113
116
if (c == 0 )
114
117
return true ;
115
118
// lo < hi: then lo <= bits & bits < hi
@@ -328,13 +331,35 @@ namespace bv {
328
331
bool sls_valuation::set_repair (bool try_down, bvect& dst) {
329
332
for (unsigned i = 0 ; i < nw; ++i)
330
333
dst[i] = (~fixed[i] & dst[i]) | (fixed[i] & m_bits[i]);
331
- bool ok = try_down ? round_down (dst) : round_up (dst);
332
- if (!ok)
333
- VERIFY (try_down ? round_up (dst) : round_down (dst));
334
- DEBUG_CODE (SASSERT (0 == (mask & (fixed[nw-1 ] & (m_bits[nw-1 ] ^ dst[nw-1 ])))); for (unsigned i = 0 ; i + 1 < nw; ++i) SASSERT (0 == (fixed[i] & (m_bits[i] ^ dst[i]))););
335
- set (eval, dst);
336
- SASSERT (well_formed ());
337
- return true ;
334
+
335
+ if (in_range (dst)) {
336
+ set (eval, dst);
337
+ return true ;
338
+ }
339
+ bool repaired = false ;
340
+ dst.set_bw (bw);
341
+ if (m_lo < m_hi) {
342
+ for (unsigned i = bw; m_hi <= dst && !in_range (dst) && i-- > 0 ; )
343
+ if (!fixed.get (i) && dst.get (i))
344
+ dst.set (i, false );
345
+ for (unsigned i = 0 ; i < bw && dst < m_lo && !in_range (dst); ++i)
346
+ if (!fixed.get (i) && !dst.get (i))
347
+ dst.set (i, true );
348
+ }
349
+ else {
350
+ for (unsigned i = 0 ; !in_range (dst); ++i)
351
+ if (!fixed.get (i) && !dst.get (i))
352
+ dst.set (i, true );
353
+ for (unsigned i = bw; !in_range (dst) && i-- > 0 ;)
354
+ if (!fixed.get (i) && dst.get (i))
355
+ dst.set (i, false );
356
+ }
357
+ if (in_range (dst)) {
358
+ set (eval, dst);
359
+ repaired = true ;
360
+ }
361
+ dst.set_bw (0 );
362
+ return repaired;
338
363
}
339
364
340
365
void sls_valuation::min_feasible (bvect& out) const {
@@ -406,6 +431,7 @@ namespace bv {
406
431
//
407
432
bool sls_valuation::can_set (bvect const & new_bits) const {
408
433
SASSERT (!has_overflow (new_bits));
434
+ // verbose_stream() << "can set " << bw << " " << new_bits[0] << " " << in_range(new_bits) << "\n";
409
435
for (unsigned i = 0 ; i < nw; ++i)
410
436
if (0 != ((new_bits[i] ^ m_bits[i]) & fixed[i]))
411
437
return false ;
@@ -446,10 +472,8 @@ namespace bv {
446
472
if (h == l)
447
473
return ;
448
474
449
- verbose_stream () << " [" << l << " , " << h << " [\n " ;
450
- verbose_stream () << *this << " \n " ;
451
-
452
- SASSERT (is_zero (fixed)); // ranges can only be added before fixed bits are set.
475
+ // verbose_stream() << "[" << l << ", " << h << "[\n";
476
+ // verbose_stream() << *this << "\n";
453
477
454
478
if (m_lo == m_hi) {
455
479
set_value (m_lo, l);
@@ -481,13 +505,14 @@ namespace bv {
481
505
482
506
SASSERT (!has_overflow (m_lo));
483
507
SASSERT (!has_overflow (m_hi));
484
- if (! in_range (m_bits))
485
- set (m_bits, m_lo );
508
+
509
+ tighten_range ( );
486
510
SASSERT (well_formed ());
487
- verbose_stream () << *this << " \n " ;
511
+ // verbose_stream() << *this << "\n";
488
512
}
489
513
490
514
//
515
+ // update bits based on ranges
491
516
// tighten lo/hi based on fixed bits.
492
517
// lo[bit_i] != fixedbit[bit_i]
493
518
// let bit_i be most significant bit position of disagreement.
@@ -502,35 +527,19 @@ namespace bv {
502
527
//
503
528
void sls_valuation::tighten_range () {
504
529
505
- verbose_stream () << " tighten " << *this << " \n " ;
530
+ // verbose_stream() << "tighten " << *this << "\n";
506
531
if (m_lo == m_hi)
507
532
return ;
508
- for (unsigned i = bw; i-- > 0 ; ) {
509
- if (!fixed.get (i))
510
- continue ;
511
- if (m_bits.get (i) == m_lo.get (i))
512
- continue ;
513
- if (m_bits.get (i)) {
514
- m_lo.set (i, true );
515
- for (unsigned j = i; j-- > 0 ; )
516
- m_lo.set (j, fixed.get (j) && m_bits.get (j));
517
- }
518
- else {
519
- for (unsigned j = bw; j-- > 0 ; )
520
- m_lo.set (j, fixed.get (j) && m_bits.get (j));
521
- }
522
- break ;
523
- }
524
533
525
534
if (!in_range (m_bits)) {
526
- verbose_stream () << " not in range\n " ;
535
+ // verbose_stream() << "not in range\n";
527
536
bool compatible = true ;
528
537
for (unsigned i = 0 ; i < nw && compatible; ++i)
529
- compatible = 0 == (fixed[i] && (m_bits[i] ^ m_lo[i]));
530
- verbose_stream () << (fixed[0 ] & & (m_bits[0 ] ^ m_lo[0 ])) << " \n " ;
531
-
538
+ compatible = 0 == (fixed[i] & (m_bits[i] ^ m_lo[i]));
539
+ // verbose_stream() << (fixed[0] & (m_bits[0] ^ m_lo[0])) << "\n";
540
+ // verbose_stream() << bw << " " << m_lo[0] << " " << m_bits[0] << "\n";
532
541
if (compatible) {
533
- verbose_stream () << " compatible\n " ;
542
+ // verbose_stream() << "compatible\n";
534
543
set (m_bits, m_lo);
535
544
}
536
545
else {
@@ -561,6 +570,24 @@ namespace bv {
561
570
set (m_bits, tmp);
562
571
}
563
572
}
573
+ // update lo, hi to be feasible.
574
+
575
+ for (unsigned i = bw; i-- > 0 ; ) {
576
+ if (!fixed.get (i))
577
+ continue ;
578
+ if (m_bits.get (i) == m_lo.get (i))
579
+ continue ;
580
+ if (m_bits.get (i)) {
581
+ m_lo.set (i, true );
582
+ for (unsigned j = i; j-- > 0 ; )
583
+ m_lo.set (j, fixed.get (j) && m_bits.get (j));
584
+ }
585
+ else {
586
+ for (unsigned j = bw; j-- > 0 ; )
587
+ m_lo.set (j, fixed.get (j) && m_bits.get (j));
588
+ }
589
+ break ;
590
+ }
564
591
565
592
SASSERT (well_formed ());
566
593
}
0 commit comments