Skip to content

Commit b20299a

Browse files
committed
Verilog: use zero_extend_exprt
This replaces two typecasts by zero_extend_exprt.
1 parent 090d419 commit b20299a

6 files changed

+53
-16
lines changed

Diff for: src/verilog/aval_bval_encoding.cpp

+5
Original file line numberDiff line numberDiff line change
@@ -392,3 +392,8 @@ exprt aval_bval(const typecast_exprt &expr)
392392
auto op_aval_zero = to_bv_type(op_aval.type()).all_zeros_expr();
393393
return and_exprt{not_exprt{op_has_xz}, notequal_exprt{op_aval, op_aval_zero}};
394394
}
395+
396+
exprt aval_bval(const zero_extend_exprt &expr)
397+
{
398+
abort();
399+
}

Diff for: src/verilog/aval_bval_encoding.h

+3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ Author: Daniel Kroening, [email protected]
99
#ifndef CPROVER_VERILOG_AVAL_BVAL_H
1010
#define CPROVER_VERILOG_AVAL_BVAL_H
1111

12+
#include <util/bitvector_expr.h>
1213
#include <util/bitvector_types.h>
1314
#include <util/mathematical_expr.h>
1415

@@ -58,5 +59,7 @@ exprt aval_bval(const verilog_iff_exprt &);
5859
exprt aval_bval(const verilog_implies_exprt &);
5960
/// lowering for typecasts
6061
exprt aval_bval(const typecast_exprt &);
62+
/// lowering for zero extension
63+
exprt aval_bval(const zero_extend_exprt &);
6164

6265
#endif

Diff for: src/verilog/expr2verilog.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,25 @@ expr2verilogt::resultt expr2verilogt::convert_explicit_size_cast(
773773

774774
/*******************************************************************\
775775
776+
Function: expr2verilogt::convert_zero_extend
777+
778+
Inputs:
779+
780+
Outputs:
781+
782+
Purpose:
783+
784+
\*******************************************************************/
785+
786+
expr2verilogt::resultt
787+
expr2verilogt::convert_zero_extend(const zero_extend_exprt &src)
788+
{
789+
// added by the type checker; igore
790+
return convert_rec(src.op());
791+
}
792+
793+
/*******************************************************************\
794+
776795
Function: expr2verilogt::convert_index
777796
778797
Inputs:
@@ -1546,6 +1565,9 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
15461565
else if(src.id()==ID_typecast)
15471566
return convert_typecast(to_typecast_expr(src));
15481567

1568+
else if(src.id() == ID_zero_extend)
1569+
return convert_zero_extend(to_zero_extend_expr(src));
1570+
15491571
else if(src.id()==ID_and)
15501572
return convert_binary(
15511573
to_multi_ary_expr(src), "&&", precedence = verilog_precedencet::AND);

Diff for: src/verilog/expr2verilog_class.h

+2
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class expr2verilogt
116116

117117
resultt convert_typecast(const typecast_exprt &);
118118

119+
resultt convert_zero_extend(const zero_extend_exprt &);
120+
119121
resultt
120122
convert_explicit_size_cast(const class verilog_explicit_size_cast_exprt &);
121123

Diff for: src/verilog/verilog_lowering.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,20 @@ exprt verilog_lowering(exprt expr)
399399
else
400400
return expr;
401401
}
402+
else if(expr.id() == ID_zero_extend)
403+
{
404+
auto &zero_extend = to_zero_extend_expr(expr);
405+
406+
if(
407+
is_four_valued(zero_extend.type()) ||
408+
is_four_valued(zero_extend.op().type()))
409+
{
410+
// encode into aval/bval
411+
return aval_bval(zero_extend);
412+
}
413+
else
414+
return expr; // leave as is
415+
}
402416
else
403417
return expr; // leave as is
404418

Diff for: src/verilog/verilog_typecheck_expr.cpp

+7-16
Original file line numberDiff line numberDiff line change
@@ -2094,23 +2094,14 @@ Function: zero_extend
20942094

20952095
static exprt zero_extend(const exprt &expr, const typet &type)
20962096
{
2097-
auto old_width = expr.type().id() == ID_bool ? 1
2098-
: expr.type().id() == ID_integer
2099-
? 32
2100-
: to_bitvector_type(expr.type()).get_width();
2101-
2102-
// first make unsigned
2103-
typet tmp_type;
2104-
2105-
if(type.id() == ID_unsignedbv)
2106-
tmp_type = unsignedbv_typet{old_width};
2107-
else if(type.id() == ID_verilog_unsignedbv)
2108-
tmp_type = verilog_unsignedbv_typet{old_width};
2109-
else
2110-
PRECONDITION(false);
2097+
exprt result = expr;
2098+
2099+
if(expr.type().id() == ID_bool)
2100+
result = typecast_exprt{expr, unsignedbv_typet{1}};
2101+
else if(expr.type().id() == ID_integer)
2102+
result = typecast_exprt{expr, unsignedbv_typet{32}};
21112103

2112-
return typecast_exprt::conditional_cast(
2113-
typecast_exprt::conditional_cast(expr, tmp_type), type);
2104+
return zero_extend_exprt{std::move(result), type};
21142105
}
21152106

21162107
/*******************************************************************\

0 commit comments

Comments
 (0)