From e50b7afc081c893d915e7f28f0c0c5b30b218568 Mon Sep 17 00:00:00 2001 From: trevor_hansen Date: Thu, 2 Feb 2012 11:40:05 +0000 Subject: [PATCH] Improvement. 10x better min and max value out of the sets of fixed bits. git-svn-id: https://stp-fast-prover.svn.sourceforge.net/svnroot/stp-fast-prover/trunk/stp@1547 e59a4935-1847-0410-ae03-e826735625c1 --- src/simplifier/constantBitP/FixedBits.cpp | 54 ++++++++++++----------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/src/simplifier/constantBitP/FixedBits.cpp b/src/simplifier/constantBitP/FixedBits.cpp index 88604ca..f829762 100644 --- a/src/simplifier/constantBitP/FixedBits.cpp +++ b/src/simplifier/constantBitP/FixedBits.cpp @@ -362,43 +362,47 @@ namespace simplifier return true; } - // Gets the minimum and maximum unsigned values that are represented by the set "shift". + // Gets the minimum and maximum unsigned values that are held in the current + // set. It saturates to UINT_MAX. void FixedBits::getUnsignedMinMax(unsigned &minShift, unsigned &maxShift) const { - const FixedBits& shift = *this; + const int bitWidth = this->getWidth(); + int unsignedBW = sizeof(unsigned)*8; - // Get the unsigned minimum and maximum of the shift. - BEEV::CBV minCBV = CONSTANTBV::BitVector_Create(shift.getWidth(), true); - BEEV::CBV maxCBV = CONSTANTBV::BitVector_Create(shift.getWidth(), true); + minShift = 0; + maxShift = 0; - setUnsignedMinMax(shift, minCBV, maxCBV); + bool bigMax = false; + bool bigMin = false; - BEEV::CBV maxValue = CONSTANTBV::BitVector_Create(shift.getWidth(), true); - for (unsigned i = 0; i < sizeof(unsigned) * 8; i++) - CONSTANTBV::BitVector_Bit_On(maxValue, i); - - if (unsignedCompare(minCBV, maxValue) > 0) - { - minShift = UINT_MAX; - } - else + for (int i = unsignedBW; i < bitWidth; i++) { - minShift = cbvTOInt(minCBV); - } + if ((*this)[i] == '1' || (*this)[i] == '*') + bigMax = true; - if (unsignedCompare(maxCBV, maxValue) > 0) - { - maxShift = UINT_MAX; + if ((*this)[i] == '1') + bigMin = true; } - else + + for (int i = 0; i < unsignedBW; i++) { - maxShift = cbvTOInt(maxCBV); + if ((*this)[i] == '1') + { + minShift |= (1 <