Skip to content

Commit 56199ec

Browse files
authored
Merge pull request #526 from diffblue/bump-cbmc2
bump CBMC dependency
2 parents 8b77ac0 + bc13b53 commit 56199ec

File tree

7 files changed

+59
-69
lines changed

7 files changed

+59
-69
lines changed

lib/cbmc

Submodule cbmc updated 202 files

src/ebmc/output_verilog.cpp

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,11 @@ void output_verilog_rtlt::assign_symbol(
279279
auto &lhs_extractbits = to_extractbits_expr(lhs);
280280

281281
// redundant?
282-
mp_integer from, to;
282+
mp_integer index;
283283

284-
if(
285-
!to_integer_non_constant(lhs_extractbits.upper(), to) &&
286-
!to_integer_non_constant(lhs_extractbits.lower(), from))
284+
if(!to_integer_non_constant(lhs_extractbits.index(), index))
287285
{
288-
if(from == 0 && to == width(lhs_extractbits.src().type()) - 1)
286+
if(index == 0 && width(lhs_extractbits.src().type()) == width(lhs.type()))
289287
{
290288
assign_symbol(lhs_extractbits.src(), rhs);
291289
return;
@@ -429,25 +427,17 @@ std::string output_verilog_netlistt::symbol_string(const exprt &expr)
429427
else if(expr.id()==ID_extractbits)
430428
{
431429
auto &src = to_extractbits_expr(expr).src();
432-
auto &upper = to_extractbits_expr(expr).upper();
433-
auto &lower = to_extractbits_expr(expr).lower();
430+
auto &index = to_extractbits_expr(expr).index();
434431

435432
mp_integer from;
436-
if(to_integer_non_constant(upper, from))
433+
if(to_integer_non_constant(index, from))
437434
{
438-
error().source_location = upper.find_source_location();
439-
error() << "failed to convert constant " << upper.pretty() << eom;
440-
throw 0;
441-
}
442-
443-
mp_integer to;
444-
if(to_integer_non_constant(lower, to))
445-
{
446-
error().source_location = lower.find_source_location();
447-
error() << "failed to convert constant " << lower.pretty() << eom;
435+
error().source_location = index.find_source_location();
436+
error() << "failed to convert constant " << index.pretty() << eom;
448437
throw 0;
449438
}
450439

440+
auto to = from + width(expr.type());
451441
std::size_t offset = atoi(src.type().get("#offset").c_str());
452442

453443
assert(from>=offset);

src/hw-cbmc/hw_cbmc_parse_options.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@ Author: Daniel Kroening, kroening@kroening.com
1515
#include <util/unicode.h>
1616
#include <util/version.h>
1717

18-
#include <goto-programs/goto_convert_functions.h>
1918
#include <goto-programs/set_properties.h>
2019
#include <goto-programs/show_properties.h>
2120

21+
#include <ansi-c/goto-conversion/goto_convert_functions.h>
2222
#include <goto-checker/all_properties_verifier_with_trace_storage.h>
2323
#include <goto-checker/goto_verifier.h>
2424
#include <goto-checker/multi_path_symex_checker.h>

src/trans-netlist/trans_to_netlist.cpp

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -570,17 +570,12 @@ void convert_trans_to_netlistt::convert_lhs_rec(
570570
}
571571
else if(expr.id()==ID_extractbits)
572572
{
573-
mp_integer new_from, new_to;
573+
mp_integer new_from;
574574

575-
assert(expr.operands().size()==3);
576-
577-
if(
578-
!to_integer_non_constant(to_extractbits_expr(expr).upper(), new_from) &&
579-
!to_integer_non_constant(to_extractbits_expr(expr).lower(), new_to))
575+
if(!to_integer_non_constant(to_extractbits_expr(expr).index(), new_from))
580576
{
581-
if(new_from>new_to) std::swap(new_from, new_to);
582-
583-
assert(new_from<=new_to);
577+
boolbv_widtht boolbv_width(ns);
578+
mp_integer new_to = new_from + boolbv_width(expr.type());
584579

585580
from = new_from.to_ulong();
586581
to = new_to.to_ulong();
@@ -747,19 +742,16 @@ void convert_trans_to_netlistt::add_equality_rec(
747742
}
748743
else if(lhs.id()==ID_extractbits)
749744
{
750-
mp_integer op1, op2;
751-
752-
if(to_integer_non_constant(to_extractbits_expr(lhs).upper(), op1))
753-
throw std::string("failed to convert extractbits upper");
745+
mp_integer index;
754746

755-
if(to_integer_non_constant(to_extractbits_expr(lhs).lower(), op2))
756-
throw std::string("failed to convert extractbits lower");
747+
if(to_integer_non_constant(to_extractbits_expr(lhs).index(), index))
748+
throw std::string("failed to convert extractbits index");
757749

758-
if(op1<op2)
759-
throw std::string("extractbits op1<op2");
750+
boolbv_widtht boolbv_width(ns);
760751

761-
std::size_t new_lhs_to = lhs_from + op1.to_ulong();
762-
std::size_t new_lhs_from = lhs_from + op2.to_ulong();
752+
std::size_t new_lhs_from = lhs_from + index.to_ulong();
753+
std::size_t new_lhs_to =
754+
lhs_from + index.to_ulong() + boolbv_width(lhs.type());
763755

764756
add_equality_rec(
765757
src, to_extractbits_expr(lhs).src(), new_lhs_from, new_lhs_to, rhs_entry);

src/verilog/expr2verilog.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -629,9 +629,6 @@ std::string expr2verilogt::convert_extractbits(
629629
const extractbits_exprt &src,
630630
unsigned precedence)
631631
{
632-
if(src.operands().size()!=3)
633-
return convert_norep(src, precedence);
634-
635632
unsigned p;
636633
std::string op = convert(src.src(), p);
637634

@@ -640,10 +637,24 @@ std::string expr2verilogt::convert_extractbits(
640637
dest+=op;
641638
if(precedence>p) dest+=')';
642639

640+
auto width = to_bitvector_type(src.type()).get_width();
641+
643642
dest+='[';
644-
dest += convert(src.upper());
643+
644+
if(src.index().is_constant())
645+
{
646+
auto index_int = numeric_cast_v<mp_integer>(to_constant_expr(src.index()));
647+
dest += integer2string(index_int + width);
648+
}
649+
else
650+
{
651+
dest += convert(src.index());
652+
dest += " + ";
653+
dest += std::to_string(width);
654+
}
655+
645656
dest+=':';
646-
dest += convert(src.lower());
657+
dest += convert(src.index());
647658
dest+=']';
648659

649660
return dest;

src/verilog/verilog_synthesis.cpp

Lines changed: 6 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,7 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
144144

145145
// Construct the extractbits expression
146146
return extractbits_exprt{
147-
src_padded,
148-
from_integer(op1, integer_typet()),
149-
from_integer(op2, integer_typet()),
150-
expr.type()}
147+
src_padded, from_integer(op2, integer_typet()), expr.type()}
151148
.with_source_location(expr.source_location());
152149
}
153150
else if(
@@ -187,10 +184,7 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
187184
}
188185

189186
return extractbits_exprt{
190-
std::move(src),
191-
from_integer(top, integer_typet{}),
192-
from_integer(bottom, integer_typet{}),
193-
expr.type()}
187+
std::move(src), from_integer(bottom, integer_typet{}), expr.type()}
194188
.with_source_location(expr);
195189
}
196190
else
@@ -203,10 +197,7 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
203197
auto src_shifted = lshr_exprt(src, index_adjusted);
204198

205199
return extractbits_exprt{
206-
std::move(src_shifted),
207-
from_integer(width - 1, integer_typet{}),
208-
from_integer(0, integer_typet{}),
209-
expr.type()}
200+
std::move(src_shifted), from_integer(0, integer_typet{}), expr.type()}
210201
.with_source_location(expr);
211202
}
212203
}
@@ -507,17 +498,11 @@ void verilog_synthesist::assignment_rec(
507498
else if(it->type().id()==ID_signedbv ||
508499
it->type().id()==ID_unsignedbv)
509500
{
510-
auto width = get_width(it->type());
511-
512-
auto offset_constant2 =
513-
from_integer(offset + width - 1, natural_typet{});
514-
515-
// extractbits requires that upper >= lower, i.e. op1 >= op2
516-
extractbits_exprt bit_extract(rhs, offset_constant2, offset_constant,
517-
it->type());
501+
extractbits_exprt bit_extract(rhs, offset_constant, it->type());
518502

519503
assignment_rec(*it, bit_extract, blocking);
520504

505+
auto width = get_width(it->type());
521506
offset+=width;
522507
}
523508
else
@@ -2006,9 +1991,7 @@ void verilog_synthesist::synth_force_rec(
20061991
it->type().id()==ID_unsignedbv)
20071992
{
20081993
auto width = get_width(it->type());
2009-
auto sum_constant = from_integer(offset + width - 1, natural_typet{});
2010-
extractbits_exprt bit_extract(
2011-
rhs, offset_constant, sum_constant, it->type());
1994+
extractbits_exprt bit_extract(rhs, offset_constant, it->type());
20121995
synth_force_rec(*it, bit_extract);
20131996
offset+=width;
20141997
}

src/vhdl/expr2vhdl.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -343,10 +343,24 @@ std::string expr2vhdlt::convert_extractbits(
343343
dest+=op;
344344
if(precedence>p) dest+=')';
345345

346+
auto width = to_bitvector_type(src.type()).get_width();
347+
346348
dest+='[';
347-
dest += convert(src.upper());
349+
350+
if(src.index().is_constant())
351+
{
352+
auto index_int = numeric_cast_v<mp_integer>(to_constant_expr(src.index()));
353+
dest += integer2string(index_int + width);
354+
}
355+
else
356+
{
357+
dest += convert(src.index());
358+
dest += " + ";
359+
dest += std::to_string(width);
360+
}
361+
348362
dest+=':';
349-
dest += convert(src.lower());
363+
dest += convert(src.index());
350364
dest+=']';
351365

352366
return dest;

0 commit comments

Comments
 (0)