Skip to content

Commit de340f2

Browse files
committed
SystemVerilog: extract typechecking for SVA
1 parent fde337d commit de340f2

File tree

4 files changed

+14
-207
lines changed

4 files changed

+14
-207
lines changed

src/verilog/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ SRC = aval_bval_encoding.cpp \
2121
verilog_typecheck.cpp \
2222
verilog_typecheck_base.cpp \
2323
verilog_typecheck_expr.cpp \
24+
verilog_typecheck_sva.cpp \
2425
verilog_y.tab.cpp \
2526
vtype.cpp
2627

src/verilog/verilog_typecheck.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,7 +1046,7 @@ void verilog_typecheckt::convert_assert_assume_cover(
10461046
{
10471047
exprt &cond = module_item.condition();
10481048

1049-
convert_expr(cond);
1049+
convert_sva(cond);
10501050
make_boolean(cond);
10511051

10521052
// We create a symbol for the property.
@@ -1111,7 +1111,7 @@ void verilog_typecheckt::convert_assert_assume_cover(
11111111
{
11121112
exprt &cond = statement.condition();
11131113

1114-
convert_expr(cond);
1114+
convert_sva(cond);
11151115
make_boolean(cond);
11161116

11171117
// We create a symbol for the property.
@@ -1184,7 +1184,7 @@ void verilog_typecheckt::convert_assume(verilog_assume_statementt &statement)
11841184
{
11851185
exprt &cond = statement.condition();
11861186

1187-
convert_expr(cond);
1187+
convert_sva(cond);
11881188
make_boolean(cond);
11891189
}
11901190

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 0 additions & 204 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ Author: Daniel Kroening, kroening@kroening.com
2020
#include <util/string2int.h>
2121

2222
#include "expr2verilog.h"
23-
#include "sva_expr.h"
2423
#include "verilog_expr.h"
2524
#include "verilog_types.h"
2625
#include "vtype.h"
@@ -2540,13 +2539,6 @@ exprt verilog_typecheck_exprt::convert_unary_expr(unary_exprt expr)
25402539
make_boolean(expr.op());
25412540
}
25422541
}
2543-
else if(expr.id() == ID_sva_not)
2544-
{
2545-
convert_expr(expr.op());
2546-
make_boolean(expr.op());
2547-
expr.type() = bool_typet(); // always boolean, never x
2548-
return std::move(expr);
2549-
}
25502542
else if(expr.id()==ID_reduction_or || expr.id()==ID_reduction_and ||
25512543
expr.id()==ID_reduction_nor || expr.id()==ID_reduction_nand ||
25522544
expr.id()==ID_reduction_xor || expr.id()==ID_reduction_xnor)
@@ -2567,20 +2559,6 @@ exprt verilog_typecheck_exprt::convert_unary_expr(unary_exprt expr)
25672559
no_bool_ops(expr);
25682560
expr.type() = expr.op().type();
25692561
}
2570-
else if(
2571-
expr.id() == ID_sva_always || expr.id() == ID_sva_s_eventually ||
2572-
expr.id() == ID_sva_cycle_delay_plus ||
2573-
expr.id() == ID_sva_cycle_delay_star || expr.id() == ID_sva_weak ||
2574-
expr.id() == ID_sva_strong || expr.id() == ID_sva_nexttime ||
2575-
expr.id() == ID_sva_s_nexttime ||
2576-
expr.id() == ID_sva_sequence_first_match ||
2577-
expr.id() == ID_sva_sequence_repetition_plus ||
2578-
expr.id() == ID_sva_sequence_repetition_star)
2579-
{
2580-
convert_expr(expr.op());
2581-
make_boolean(expr.op());
2582-
expr.type()=bool_typet();
2583-
}
25842562
else if(expr.id() == ID_verilog_explicit_cast)
25852563
{
25862564
// SystemVerilog has got type'(expr). This is an explicit
@@ -2859,21 +2837,6 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
28592837

28602838
return std::move(expr);
28612839
}
2862-
else if(
2863-
expr.id() == ID_sva_and || expr.id() == ID_sva_or ||
2864-
expr.id() == ID_sva_implies || expr.id() == ID_sva_iff)
2865-
{
2866-
for(auto &op : expr.operands())
2867-
{
2868-
convert_expr(op);
2869-
make_boolean(op);
2870-
}
2871-
2872-
// always boolean, never x
2873-
expr.type() = bool_typet();
2874-
2875-
return std::move(expr);
2876-
}
28772840
else if(expr.id()==ID_equal || expr.id()==ID_notequal)
28782841
{
28792842
expr.type()=bool_typet();
@@ -3014,95 +2977,6 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
30142977

30152978
return std::move(expr);
30162979
}
3017-
else if(
3018-
expr.id() == ID_sva_disable_iff || expr.id() == ID_sva_accept_on ||
3019-
expr.id() == ID_sva_reject_on || expr.id() == ID_sva_sync_accept_on ||
3020-
expr.id() == ID_sva_sync_reject_on)
3021-
{
3022-
convert_expr(to_sva_abort_expr(expr).condition());
3023-
make_boolean(to_sva_abort_expr(expr).condition());
3024-
convert_expr(to_sva_abort_expr(expr).property());
3025-
make_boolean(to_sva_abort_expr(expr).property());
3026-
expr.type() = bool_typet();
3027-
return std::move(expr);
3028-
}
3029-
else if(expr.id() == ID_sva_indexed_nexttime)
3030-
{
3031-
convert_expr(to_sva_indexed_nexttime_expr(expr).index());
3032-
3033-
auto &op = to_sva_indexed_nexttime_expr(expr).op();
3034-
convert_expr(op);
3035-
make_boolean(op);
3036-
expr.type() = bool_typet();
3037-
3038-
return std::move(expr);
3039-
}
3040-
else if(expr.id() == ID_sva_indexed_s_nexttime)
3041-
{
3042-
convert_expr(to_sva_indexed_s_nexttime_expr(expr).index());
3043-
3044-
auto &op = to_sva_indexed_s_nexttime_expr(expr).op();
3045-
convert_expr(op);
3046-
make_boolean(op);
3047-
expr.type() = bool_typet();
3048-
3049-
return std::move(expr);
3050-
}
3051-
else if(
3052-
expr.id() == ID_sva_overlapped_implication ||
3053-
expr.id() == ID_sva_non_overlapped_implication ||
3054-
expr.id() == ID_sva_overlapped_followed_by ||
3055-
expr.id() == ID_sva_nonoverlapped_followed_by ||
3056-
expr.id() == ID_sva_until || expr.id() == ID_sva_s_until ||
3057-
expr.id() == ID_sva_until_with || expr.id() == ID_sva_s_until_with)
3058-
{
3059-
convert_expr(expr.op0());
3060-
make_boolean(expr.op0());
3061-
convert_expr(expr.op1());
3062-
make_boolean(expr.op1());
3063-
expr.type()=bool_typet();
3064-
3065-
return std::move(expr);
3066-
}
3067-
else if(
3068-
expr.id() == ID_sva_sequence_intersect ||
3069-
expr.id() == ID_sva_sequence_throughout ||
3070-
expr.id() == ID_sva_sequence_within)
3071-
{
3072-
auto &binary_expr = to_binary_expr(expr);
3073-
3074-
convert_expr(binary_expr.lhs());
3075-
make_boolean(binary_expr.lhs());
3076-
convert_expr(binary_expr.rhs());
3077-
make_boolean(binary_expr.rhs());
3078-
3079-
expr.type() = bool_typet();
3080-
3081-
return std::move(expr);
3082-
}
3083-
else if(
3084-
expr.id() == ID_sva_sequence_consecutive_repetition ||
3085-
expr.id() == ID_sva_sequence_non_consecutive_repetition ||
3086-
expr.id() == ID_sva_sequence_goto_repetition)
3087-
{
3088-
auto &binary_expr = to_binary_expr(expr);
3089-
3090-
convert_expr(binary_expr.lhs());
3091-
make_boolean(binary_expr.lhs());
3092-
3093-
convert_expr(binary_expr.rhs());
3094-
3095-
mp_integer n = elaborate_constant_integer_expression(binary_expr.rhs());
3096-
if(n < 0)
3097-
throw errort().with_location(binary_expr.rhs().source_location())
3098-
<< "number of repetitions must not be negative";
3099-
3100-
binary_expr.rhs() = from_integer(n, integer_typet{});
3101-
3102-
expr.type() = bool_typet();
3103-
3104-
return std::move(expr);
3105-
}
31062980
else if(expr.id()==ID_hierarchical_identifier)
31072981
{
31082982
return convert_hierarchical_identifier(
@@ -3133,28 +3007,6 @@ exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
31333007
<< "cannot perform size cast on " << to_string(op_type);
31343008
}
31353009
}
3136-
else if(expr.id() == ID_sva_case)
3137-
{
3138-
auto &case_expr = to_sva_case_expr(expr);
3139-
convert_expr(case_expr.case_op());
3140-
3141-
for(auto &case_item : case_expr.case_items())
3142-
{
3143-
// same rules as case statement
3144-
for(auto &pattern : case_item.patterns())
3145-
{
3146-
convert_expr(pattern);
3147-
typet t = max_type(pattern.type(), case_expr.case_op().type());
3148-
propagate_type(pattern, t);
3149-
}
3150-
3151-
convert_expr(case_item.result());
3152-
make_boolean(case_item.result());
3153-
}
3154-
3155-
expr.type() = bool_typet();
3156-
return std::move(expr);
3157-
}
31583010
else if(
31593011
expr.id() == ID_verilog_streaming_concatenation_left_to_right ||
31603012
expr.id() == ID_verilog_streaming_concatenation_right_to_left)
@@ -3352,62 +3204,6 @@ exprt verilog_typecheck_exprt::convert_trinary_expr(ternary_exprt expr)
33523204
expr.type()=expr.op1().type();
33533205
return std::move(expr);
33543206
}
3355-
else if(expr.id()==ID_sva_cycle_delay) // #[1:2] something
3356-
{
3357-
expr.type()=bool_typet();
3358-
convert_expr(expr.op0());
3359-
if(expr.op1().is_not_nil()) convert_expr(expr.op1());
3360-
convert_expr(expr.op2());
3361-
make_boolean(expr.op2());
3362-
return std::move(expr);
3363-
}
3364-
else if(
3365-
expr.id() == ID_sva_eventually || expr.id() == ID_sva_ranged_s_eventually ||
3366-
expr.id() == ID_sva_s_always || expr.id() == ID_sva_ranged_always)
3367-
{
3368-
auto lower = convert_integer_constant_expression(expr.op0());
3369-
3370-
expr.op0() =
3371-
from_integer(lower, natural_typet()).with_source_location(expr.op0());
3372-
3373-
if(expr.op1().id() == ID_infinity)
3374-
{
3375-
}
3376-
else
3377-
{
3378-
auto upper = convert_integer_constant_expression(expr.op1());
3379-
if(lower > upper)
3380-
{
3381-
throw errort().with_location(expr.source_location())
3382-
<< "range must be lower <= upper";
3383-
}
3384-
3385-
expr.op1() =
3386-
from_integer(upper, natural_typet()).with_source_location(expr.op1());
3387-
}
3388-
3389-
convert_expr(expr.op2());
3390-
make_boolean(expr.op2());
3391-
expr.type() = bool_typet();
3392-
3393-
return std::move(expr);
3394-
}
3395-
else if(expr.id() == ID_sva_if)
3396-
{
3397-
convert_expr(expr.op0());
3398-
make_boolean(expr.op0());
3399-
3400-
convert_expr(expr.op1());
3401-
make_boolean(expr.op1());
3402-
3403-
if(expr.op2().is_not_nil())
3404-
{
3405-
convert_expr(expr.op2());
3406-
make_boolean(expr.op2());
3407-
}
3408-
3409-
return std::move(expr);
3410-
}
34113207
else
34123208
{
34133209
throw errort().with_location(expr.source_location())

src/verilog/verilog_typecheck_expr.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,16 @@ class verilog_typecheck_exprt:public verilog_typecheck_baset
188188
void typecheck_relation(binary_exprt &);
189189
void no_bool_ops(exprt &);
190190

191+
void convert_sva(exprt &expr)
192+
{
193+
expr = convert_sva_rec(std::move(expr));
194+
}
195+
196+
[[nodiscard]] exprt convert_sva_rec(exprt);
197+
[[nodiscard]] exprt convert_unary_sva(unary_exprt);
198+
[[nodiscard]] exprt convert_binary_sva(binary_exprt);
199+
[[nodiscard]] exprt convert_ternary_sva(ternary_exprt);
200+
191201
// system functions
192202
exprt bits(const exprt &);
193203
std::optional<mp_integer> bits_rec(const typet &) const;

0 commit comments

Comments
 (0)