Skip to content

Commit 315ad2e

Browse files
authored
Merge pull request #1306 from diffblue/smv-extractbits
SMV: conversion for extractbits operator
2 parents 36e3f17 + 9a46e54 commit 315ad2e

File tree

4 files changed

+71
-0
lines changed

4 files changed

+71
-0
lines changed
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
CORE
2+
verilog4.sv
3+
--smv-word-level
4+
^LTLSPEC X X extend\(main\.x\[31:1\], 1\) = unsigned\(0sd32_1\)$
5+
^EXIT=0$
6+
^SIGNAL=0$
7+
--
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module main(input clk);
2+
3+
reg [31:0] x;
4+
5+
initial x = 0;
6+
7+
always @(posedge clk)
8+
x = x + 1;
9+
10+
initial assert property (nexttime[2] x[31:1] == 1);
11+
12+
endmodule

src/smvlang/expr2smv.cpp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,52 @@ expr2smvt::convert_index(const index_exprt &src, precedencet precedence)
479479

480480
/*******************************************************************\
481481
482+
Function: expr2smvt::convert_extractbits
483+
484+
Inputs:
485+
486+
Outputs:
487+
488+
Purpose:
489+
490+
\*******************************************************************/
491+
492+
expr2smvt::resultt expr2smvt::convert_extractbits(const extractbits_exprt &expr)
493+
{
494+
const precedencet precedence = precedencet::INDEX;
495+
auto op_rec = convert_rec(expr.src());
496+
497+
std::string dest;
498+
499+
if(precedence >= op_rec.p)
500+
dest += '(';
501+
dest += op_rec.s;
502+
if(precedence >= op_rec.p)
503+
dest += ')';
504+
505+
dest += '[';
506+
507+
// We can only do constant indices.
508+
if(expr.index().is_constant())
509+
{
510+
auto index_int = numeric_cast_v<mp_integer>(to_constant_expr(expr.index()));
511+
auto width = to_unsignedbv_type(expr.type()).get_width();
512+
dest += integer2string(index_int + width - 1);
513+
dest += ':';
514+
dest += integer2string(index_int);
515+
}
516+
else
517+
{
518+
dest += "?:?";
519+
}
520+
521+
dest += ']';
522+
523+
return {precedence, std::move(dest)};
524+
}
525+
526+
/*******************************************************************\
527+
482528
Function: expr2smvt::convert_if
483529
484530
Inputs:
@@ -825,6 +871,9 @@ expr2smvt::resultt expr2smvt::convert_rec(const exprt &src)
825871
return convert_binary(to_binary_expr(src), ">>", precedencet::SHIFT);
826872
}
827873

874+
else if(src.id() == ID_extractbits)
875+
return convert_extractbits(to_extractbits_expr(src));
876+
828877
else if(src.id() == ID_smv_extend)
829878
return convert_function_application("extend", src);
830879

src/smvlang/expr2smv_class.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ Author: Daniel Kroening, [email protected]
1010
#define CPROVER_SMV_EXPR2SMV_CLASS_H
1111

1212
#include <util/arith_tools.h>
13+
#include <util/bitvector_expr.h>
1314
#include <util/bitvector_types.h>
1415
#include <util/namespace.h>
1516
#include <util/std_expr.h>
@@ -111,6 +112,8 @@ class expr2smvt
111112
resultt
112113
convert_unary(const unary_exprt &, const std::string &symbol, precedencet);
113114

115+
resultt convert_extractbits(const extractbits_exprt &);
116+
114117
resultt convert_index(const index_exprt &, precedencet);
115118

116119
resultt convert_if(const if_exprt &, precedencet);

0 commit comments

Comments
 (0)