From ff3b8ab52b405f86201614688fc26d3726a3030d Mon Sep 17 00:00:00 2001 From: lianah Date: Thu, 13 Dec 2012 15:28:44 -0500 Subject: [PATCH] more slicer bug fixes --- src/theory/bv/slicer.cpp | 19 ++++++++++--------- src/theory/bv/slicer.h | 4 ++-- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/theory/bv/slicer.cpp b/src/theory/bv/slicer.cpp index 9eb0548d2..ad8dbaf78 100644 --- a/src/theory/bv/slicer.cpp +++ b/src/theory/bv/slicer.cpp @@ -139,9 +139,9 @@ void SliceBlock::computeBlockBase(std::vector& queue) { SplinterPointer sp; slice->split(i, sp, bottom, top); Assert (bottom != NULL && top != NULL); - Assert (i > bottom->getLow()); - unsigned delta = i - bottom->getLow(); + Assert (i >= bottom->getLow()); if (sp != Undefined) { + unsigned delta = i - bottom->getLow(); // if we do need to split something else split it Debug("bv-slicer") <<" must split " << sp.debugPrint(); Slice* other_slice = d_slicer->getSlice(sp); @@ -216,8 +216,9 @@ void Slicer::splitEqualities(TNode node, std::vector& equalities) { Base base1(width); if (t1.getKind() == kind::BITVECTOR_CONCAT) { - unsigned size = 0; - for (int i = t1.getNumChildren(); i >= 0; --i) { + int size = -1; + // no need to count the last child since the end cut point is implicit + for (int i = t1.getNumChildren() - 1; i >= 1 ; --i) { size = size + utils::getSize(t1[i]); base1.sliceAt(size); } @@ -225,8 +226,8 @@ void Slicer::splitEqualities(TNode node, std::vector& equalities) { Base base2(width); if (t2.getKind() == kind::BITVECTOR_CONCAT) { - unsigned size = 0; - for (int i = t2.getNumChildren(); i >= 0; --i) { + unsigned size = -1; + for (int i = t2.getNumChildren() - 1; i >= 1; --i) { size = size + utils::getSize(t2[i]); base2.sliceAt(size); } @@ -238,9 +239,9 @@ void Slicer::splitEqualities(TNode node, std::vector& equalities) { int last = 0; for (unsigned i = 1; i < utils::getSize(t1); ++i) { if (base1.isCutPoint(i)) { - Node extract1 = Rewriter::rewrite(utils::mkExtract(t1, last, i - 1)); - Node extract2 = Rewriter::rewrite(utils::mkExtract(t2, last, i - 1)); - last = i; + Node extract1 = Rewriter::rewrite(utils::mkExtract(t1, i, last)); + Node extract2 = Rewriter::rewrite(utils::mkExtract(t2, i, last)); + last = i + 1; Assert (utils::getSize(extract1) == utils::getSize(extract2)); equalities.push_back(utils::mkNode(kind::EQUAL, extract1, extract2)); } diff --git a/src/theory/bv/slicer.h b/src/theory/bv/slicer.h index 33bc26b5a..cb4636fef 100644 --- a/src/theory/bv/slicer.h +++ b/src/theory/bv/slicer.h @@ -43,14 +43,14 @@ class Base { public: Base(uint32_t size) : d_size(size) { - Assert (size > 1); + Assert (size > 0); d_repr = BitVector(size - 1, 0u); } Base(const BitVector& repr) : d_size(repr.getSize() + 1), d_repr(repr) { - Assert (d_size > 1); + Assert (d_size > 0); } /** -- 2.30.2