Skip to content

Commit 3c17453

Browse files
authored
Merge pull request #1882 from tautschnig/address_bits
address_bits need not return an arbitrary-sized integer
2 parents 96bf623 + f59092c commit 3c17453

File tree

7 files changed

+28
-30
lines changed

7 files changed

+28
-30
lines changed

src/goto-symex/partial_order_concurrency.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -166,9 +166,8 @@ void partial_order_concurrencyt::build_clock_type(
166166
{
167167
assert(!numbering.empty());
168168

169-
mp_integer width=address_bits(numbering.size());
170-
assert(width<std::numeric_limits<unsigned>::max());
171-
clock_type=unsignedbv_typet(integer2unsigned(width));
169+
std::size_t width = address_bits(numbering.size());
170+
clock_type = unsignedbv_typet(width);
172171
}
173172

174173
exprt partial_order_concurrencyt::before(

src/solvers/flattening/boolbv_extractbit.cpp

+2-4
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,8 @@ literalt boolbvt::convert_extractbit(const extractbit_exprt &expr)
5252
if(width_op0==0 || width_op1==0)
5353
return SUB::convert_rest(expr);
5454

55-
mp_integer index_width=
56-
std::max(address_bits(width_op0), mp_integer(width_op1));
57-
58-
unsignedbv_typet index_type(integer2size_t(index_width));
55+
std::size_t index_width = std::max(address_bits(width_op0), width_op1);
56+
unsignedbv_typet index_type(index_width);
5957

6058
equal_exprt equality;
6159
equality.lhs()=operands[1]; // index operand

src/solvers/flattening/boolbv_width.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ const boolbv_widtht::entryt &boolbv_widtht::get_entry(const typet &type) const
122122

123123
if(size>=1)
124124
{
125-
entry.total_width=integer2unsigned(address_bits(size));
125+
entry.total_width = address_bits(size);
126126
assert(entry.total_width!=0);
127127
}
128128
}
@@ -180,7 +180,7 @@ const boolbv_widtht::entryt &boolbv_widtht::get_entry(const typet &type) const
180180
{
181181
// get number of necessary bits
182182
std::size_t size=to_enumeration_type(type).elements().size();
183-
entry.total_width=integer2unsigned(address_bits(size));
183+
entry.total_width = address_bits(size);
184184
assert(entry.total_width!=0);
185185
}
186186
else if(type_id==ID_c_enum)

src/solvers/floatbv/float_bv.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ exprt float_bvt::from_signed_integer(
233233
result.exponent=
234234
from_integer(
235235
src_width-1,
236-
signedbv_typet(address_bits(src_width-1).to_long()+1));
236+
signedbv_typet(address_bits(src_width - 1) + 1));
237237

238238
return rounder(result, rm, spec);
239239
}
@@ -253,7 +253,7 @@ exprt float_bvt::from_unsigned_integer(
253253
result.exponent=
254254
from_integer(
255255
src_width-1,
256-
signedbv_typet(address_bits(src_width-1).to_long()+1));
256+
signedbv_typet(address_bits(src_width - 1) + 1));
257257

258258
result.sign=false_exprt();
259259

@@ -573,7 +573,7 @@ exprt float_bvt::limit_distance(
573573
const exprt &dist,
574574
mp_integer limit)
575575
{
576-
std::size_t nb_bits=integer2unsigned(address_bits(limit));
576+
std::size_t nb_bits = address_bits(limit);
577577
std::size_t dist_width=to_unsignedbv_type(dist.type()).get_width();
578578

579579
if(dist_width<=nb_bits)
@@ -889,7 +889,7 @@ void float_bvt::normalization_shift(
889889
std::size_t exponent_bits=to_signedbv_type(exponent.type()).get_width();
890890
assert(fraction_bits!=0);
891891

892-
unsigned depth=integer2unsigned(address_bits(fraction_bits-1));
892+
std::size_t depth = address_bits(fraction_bits - 1);
893893

894894
if(exponent_bits<depth)
895895
exponent=typecast_exprt(exponent, signedbv_typet(depth));
@@ -1019,9 +1019,7 @@ exprt float_bvt::rounder(
10191019
aligned_exponent=src.exponent;
10201020

10211021
{
1022-
std::size_t exponent_bits=
1023-
std::max((std::size_t)integer2size_t(address_bits(spec.f)),
1024-
(std::size_t)spec.e)+1;
1022+
std::size_t exponent_bits = std::max(address_bits(spec.f), spec.e) + 1;
10251023

10261024
// before normalization, make sure exponent is large enough
10271025
if(to_signedbv_type(aligned_exponent.type()).get_width()<exponent_bits)

src/solvers/floatbv/float_utils.cpp

+5-7
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ bvt float_utilst::from_signed_integer(const bvt &src)
4343
result.exponent=
4444
bv_utils.build_constant(
4545
src.size()-1,
46-
address_bits(src.size()-1).to_long()+1);
46+
address_bits(src.size() - 1) + 1);
4747

4848
return rounder(result);
4949
}
@@ -58,7 +58,7 @@ bvt float_utilst::from_unsigned_integer(const bvt &src)
5858
result.exponent=
5959
bv_utils.build_constant(
6060
src.size()-1,
61-
address_bits(src.size()-1).to_long()+1);
61+
address_bits(src.size() - 1) + 1);
6262

6363
result.sign=const_literal(false);
6464

@@ -388,7 +388,7 @@ bvt float_utilst::limit_distance(
388388
const bvt &dist,
389389
mp_integer limit)
390390
{
391-
std::size_t nb_bits=integer2unsigned(address_bits(limit));
391+
std::size_t nb_bits = address_bits(limit);
392392

393393
bvt upper_bits=dist;
394394
upper_bits.erase(upper_bits.begin(), upper_bits.begin()+nb_bits);
@@ -790,7 +790,7 @@ void float_utilst::normalization_shift(bvt &fraction, bvt &exponent)
790790
// The worst-case shift is the number of fraction
791791
// bits minus one, in case the faction is one exactly.
792792
assert(!fraction.empty());
793-
unsigned depth=integer2unsigned(address_bits(fraction.size()-1));
793+
std::size_t depth = address_bits(fraction.size() - 1);
794794

795795
if(exponent.size()<depth)
796796
exponent=bv_utils.sign_extension(exponent, depth);
@@ -903,9 +903,7 @@ bvt float_utilst::rounder(const unbiased_floatt &src)
903903
aligned_exponent=src.exponent;
904904

905905
{
906-
std::size_t exponent_bits=
907-
std::max((std::size_t)integer2size_t(address_bits(spec.f)),
908-
(std::size_t)spec.e)+1;
906+
std::size_t exponent_bits = std::max(address_bits(spec.f), spec.e) + 1;
909907

910908
// before normalization, make sure exponent is large enough
911909
if(aligned_exponent.size()<exponent_bits)

src/util/arith_tools.cpp

+11-6
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,9 @@ Author: Daniel Kroening, [email protected]
88

99
#include "arith_tools.h"
1010

11-
#include <cassert>
12-
1311
#include "fixedbv.h"
1412
#include "ieee_float.h"
13+
#include "invariant.h"
1514
#include "std_types.h"
1615
#include "std_expr.h"
1716

@@ -207,11 +206,17 @@ constant_exprt from_integer(
207206
}
208207

209208
/// ceil(log2(size))
210-
mp_integer address_bits(const mp_integer &size)
209+
std::size_t address_bits(const mp_integer &size)
211210
{
212-
mp_integer result, x=2;
211+
// in theory an arbitrary-precision integer could be as large as
212+
// numeric_limits<std::size_t>::max() * CHAR_BIT (but then we would only be
213+
// able to store 2^CHAR_BIT many of those; the implementation of mp_integer as
214+
// BigInt is much more restricted as its size is stored as an unsigned int
215+
std::size_t result = 1;
216+
217+
for(mp_integer x = 2; x < size; ++result, x *= 2) {}
213218

214-
for(result=1; x<size; result+=1, x*=2) {}
219+
INVARIANT(power(2, result) >= size, "address_bits(size) >= log2(size)");
215220

216221
return result;
217222
}
@@ -222,7 +227,7 @@ mp_integer address_bits(const mp_integer &size)
222227
mp_integer power(const mp_integer &base,
223228
const mp_integer &exponent)
224229
{
225-
assert(exponent>=0);
230+
PRECONDITION(exponent >= 0);
226231

227232
/* There are a number of special cases which are:
228233
* A. very common

src/util/arith_tools.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ Target numeric_cast_v(const exprt &arg)
155155
constant_exprt from_integer(const mp_integer &int_value, const typet &type);
156156

157157
// ceil(log2(size))
158-
mp_integer address_bits(const mp_integer &size);
158+
std::size_t address_bits(const mp_integer &size);
159159

160160
mp_integer power(const mp_integer &base, const mp_integer &exponent);
161161

0 commit comments

Comments
 (0)