Skip to content

Commit 9e68c85

Browse files
authored
Merge pull request #435 from diffblue/verilog_bit_select
Verilog: use `ID_verilog_bit_select` for bit-select expressions
2 parents b86b687 + 24658cf commit 9e68c85

File tree

4 files changed

+19
-32
lines changed

4 files changed

+19
-32
lines changed

src/hw_cbmc_irep_ids.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ IREP_ID_ONE(reg)
4242
IREP_ID_ONE(macromodule)
4343
IREP_ID_ONE(output_register)
4444
IREP_ID_ONE(inout)
45-
IREP_ID_ONE(bit_select)
45+
IREP_ID_ONE(verilog_bit_select)
4646
IREP_ID_ONE(generate_block)
4747
IREP_ID_ONE(generate_skip)
4848
IREP_ID_ONE(generate_if)

src/verilog/parser.y

Lines changed: 7 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -129,25 +129,6 @@ inline static void new_symbol(YYSTYPE &dest, YYSTYPE &src)
129129

130130
/*******************************************************************\
131131
132-
Function: extractbit
133-
134-
Inputs:
135-
136-
Outputs:
137-
138-
Purpose:
139-
140-
\*******************************************************************/
141-
142-
static void extractbit(YYSTYPE &expr, YYSTYPE &identifier, YYSTYPE &part)
143-
{
144-
init(expr, ID_extractbit);
145-
mto(expr, identifier);
146-
stack_expr(expr).add_to_operands(std::move(to_unary_expr(stack_expr(part)).op()));
147-
}
148-
149-
/*******************************************************************\
150-
151132
Function: add_as_subtype
152133
153134
Inputs:
@@ -1099,13 +1080,13 @@ port_expression_opt:
10991080

11001081
port_reference:
11011082
port_identifier
1102-
| port_identifier bit_select { make_nil($$); /* Not supported */ }
1083+
| port_identifier constant_bit_select { make_nil($$); /* Not supported */ }
11031084
| port_identifier part_select { make_nil($$); /* Not supported */ }
11041085
;
11051086

1106-
bit_select:
1087+
constant_bit_select:
11071088
'[' expression ']'
1108-
{ init($$, ID_bit_select); mto($$, $2); }
1089+
{ $$ = $2; }
11091090
;
11101091

11111092
part_select:
@@ -3105,8 +3086,10 @@ hierarchical_identifier_select:
31053086

31063087
hierarchical_identifier_bit_select_brace:
31073088
hierarchical_variable_identifier
3108-
| hierarchical_identifier_bit_select_brace bit_select
3109-
{ extractbit($$, $1, $2); }
3089+
| hierarchical_identifier_bit_select_brace constant_bit_select
3090+
{ init($$, ID_verilog_bit_select);
3091+
mto($$, $1);
3092+
mto($$, $2); }
31103093
;
31113094

31123095
time_literal: TOK_TIME_LITERAL

src/verilog/verilog_typecheck_expr.cpp

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1939,7 +1939,7 @@ exprt verilog_typecheck_exprt::convert_unary_expr(unary_exprt expr)
19391939

19401940
/*******************************************************************\
19411941
1942-
Function: verilog_typecheck_exprt::convert_extractbit_expr
1942+
Function: verilog_typecheck_exprt::convert_bit_select_expr
19431943
19441944
Inputs:
19451945
@@ -1949,8 +1949,11 @@ Function: verilog_typecheck_exprt::convert_extractbit_expr
19491949
19501950
\*******************************************************************/
19511951

1952-
exprt verilog_typecheck_exprt::convert_extractbit_expr(extractbit_exprt expr)
1952+
exprt verilog_typecheck_exprt::convert_bit_select_expr(binary_exprt expr)
19531953
{
1954+
// Verilog's bit select expression may map onto an extractbit
1955+
// or an array index expression, depending on the type of the first
1956+
// operand.
19541957
exprt &op0 = expr.op0();
19551958
convert_expr(op0);
19561959

@@ -1962,7 +1965,7 @@ exprt verilog_typecheck_exprt::convert_extractbit_expr(extractbit_exprt expr)
19621965

19631966
if(op0.type().id()==ID_array)
19641967
{
1965-
exprt &op1 = to_extractbit_expr(expr).index();
1968+
exprt &op1 = expr.op1();
19661969
convert_expr(op1);
19671970
if(op1.type().id() == ID_verilog_real)
19681971
{
@@ -2001,7 +2004,7 @@ exprt verilog_typecheck_exprt::convert_extractbit_expr(extractbit_exprt expr)
20012004
return false_exprt().with_source_location<exprt>(expr);
20022005

20032006
op1 -= offset;
2004-
to_extractbit_expr(expr).op1() = from_integer(op1, natural_typet());
2007+
expr.op1() = from_integer(op1, natural_typet());
20052008
}
20062009
else
20072010
{
@@ -2014,6 +2017,7 @@ exprt verilog_typecheck_exprt::convert_extractbit_expr(extractbit_exprt expr)
20142017
}
20152018

20162019
expr.type()=bool_typet();
2020+
expr.id(ID_extractbit);
20172021
}
20182022

20192023
return std::move(expr);
@@ -2116,8 +2120,8 @@ Function: verilog_typecheck_exprt::convert_binary_expr
21162120

21172121
exprt verilog_typecheck_exprt::convert_binary_expr(binary_exprt expr)
21182122
{
2119-
if(expr.id()==ID_extractbit)
2120-
return convert_extractbit_expr(to_extractbit_expr(expr));
2123+
if(expr.id() == ID_verilog_bit_select)
2124+
return convert_bit_select_expr(to_binary_expr(expr));
21212125
else if(expr.id()==ID_replication)
21222126
return convert_replication_expr(to_replication_expr(expr));
21232127
else if(

src/verilog/verilog_typecheck_expr.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ class verilog_typecheck_exprt:public verilog_typecheck_baset
128128
[[nodiscard]] exprt
129129
convert_system_function(const irep_idt &identifier, function_call_exprt);
130130
[[nodiscard]] exprt convert_constraint_select_one(exprt);
131-
[[nodiscard]] exprt convert_extractbit_expr(extractbit_exprt);
131+
[[nodiscard]] exprt convert_bit_select_expr(binary_exprt);
132132
[[nodiscard]] exprt convert_replication_expr(replication_exprt);
133133
[[nodiscard]] exprt convert_shl_expr(shl_exprt);
134134
void implicit_typecast(exprt &, const typet &type);

0 commit comments

Comments
 (0)