Skip to content

Commit 1a54d5c

Browse files
committed
Verilog: use zero_extend_exprt
This replaces two typecasts by zero_extend_exprt.
1 parent 1a93509 commit 1a54d5c

6 files changed

+53
-16
lines changed

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+
}

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

src/verilog/expr2verilog.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,25 @@ expr2verilogt::convert_typecast(const typecast_exprt &src)
694694

695695
/*******************************************************************\
696696
697+
Function: expr2verilogt::convert_zero_extend
698+
699+
Inputs:
700+
701+
Outputs:
702+
703+
Purpose:
704+
705+
\*******************************************************************/
706+
707+
expr2verilogt::resultt
708+
expr2verilogt::convert_zero_extend(const zero_extend_exprt &src)
709+
{
710+
// added by the type checker; igore
711+
return convert_rec(src.op());
712+
}
713+
714+
/*******************************************************************\
715+
697716
Function: expr2verilogt::convert_index
698717
699718
Inputs:
@@ -1453,6 +1472,9 @@ expr2verilogt::resultt expr2verilogt::convert_rec(const exprt &src)
14531472
else if(src.id()==ID_typecast)
14541473
return convert_typecast(to_typecast_expr(src));
14551474

1475+
else if(src.id() == ID_zero_extend)
1476+
return convert_zero_extend(to_zero_extend_expr(src));
1477+
14561478
else if(src.id()==ID_and)
14571479
return convert_binary(
14581480
to_multi_ary_expr(src), "&&", precedence = verilog_precedencet::AND);

src/verilog/expr2verilog_class.h

+2
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ class expr2verilogt
107107

108108
resultt convert_typecast(const typecast_exprt &);
109109

110+
resultt convert_zero_extend(const zero_extend_exprt &);
111+
110112
resultt
111113
convert_concatenation(const concatenation_exprt &, verilog_precedencet);
112114

src/verilog/verilog_lowering.cpp

+14
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,20 @@ exprt verilog_lowering(exprt expr)
366366
return implies_exprt{lhs_boolean, rhs_boolean};
367367
}
368368
}
369+
else if(expr.id() == ID_zero_extend)
370+
{
371+
auto &zero_extend = to_zero_extend_expr(expr);
372+
373+
if(
374+
is_four_valued(zero_extend.type()) ||
375+
is_four_valued(zero_extend.op().type()))
376+
{
377+
// encode into aval/bval
378+
return aval_bval(zero_extend);
379+
}
380+
else
381+
return expr; // leave as is
382+
}
369383
else
370384
return expr; // leave as is
371385

src/verilog/verilog_typecheck_expr.cpp

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

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

2115-
return typecast_exprt::conditional_cast(
2116-
typecast_exprt::conditional_cast(expr, tmp_type), type);
2107+
return zero_extend_exprt{std::move(result), type};
21172108
}
21182109

21192110
/*******************************************************************\

0 commit comments

Comments
 (0)