Skip to content

Commit 6dc25e2

Browse files
committed
Verilog: use instance_array for width of primitive gates
This switches the "range" annotation on primitive gates to the unpacked array as required by 1800-2017.
1 parent d03e427 commit 6dc25e2

4 files changed

Lines changed: 27 additions & 39 deletions

File tree

src/verilog/parser.y

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3126,12 +3126,7 @@ name_of_gate_instance:
31263126
TOK_NON_TYPE_IDENTIFIER unpacked_dimension_brace
31273127
{ init($$, ID_inst);
31283128
addswap($$, ID_base_name, $1);
3129-
if(stack_expr($2).is_not_nil())
3130-
{
3131-
auto &range = stack_expr($$).add(ID_range);
3132-
range = stack_expr($2).find(ID_range);
3133-
range.id(ID_range);
3134-
}
3129+
addswap($$, ID_verilog_instance_array, $2);
31353130
}
31363131
;
31373132

src/verilog/verilog_expr.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,11 @@ class verilog_inst_baset : public verilog_module_itemt
904904
connections.front().id() == ID_verilog_wildcard_port_connection);
905905
}
906906

907+
bool has_instance_array() const
908+
{
909+
return instance_array().is_not_nil();
910+
}
911+
907912
const typet &instance_array() const
908913
{
909914
return static_cast<const typet &>(find(ID_verilog_instance_array));

src/verilog/verilog_interfaces.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -177,21 +177,16 @@ void verilog_typecheckt::interface_inst(
177177
const verilog_inst_baset &statement,
178178
const verilog_instt::instancet &op)
179179
{
180-
if(op.instance_array().is_not_nil())
180+
bool primitive = statement.id() == ID_inst_builtin;
181+
182+
if(op.has_instance_array() && !primitive)
181183
{
182184
throw errort().with_location(op.source_location())
183185
<< "no support for instance arrays";
184186
}
185187

186-
bool primitive=statement.id()==ID_inst_builtin;
187-
const exprt &range_expr = static_cast<const exprt &>(op.find(ID_range));
188-
189-
ranget range;
190-
191-
if(range_expr.is_nil() || range_expr.id().empty())
192-
range = ranget{0, 0};
193-
else
194-
range = convert_range(range_expr);
188+
if(op.has_instance_array())
189+
(void)elaborate_type(op.instance_array());
195190

196191
irep_idt instantiated_module_identifier =
197192
verilog_module_symbol(id2string(statement.get(ID_module)));

src/verilog/verilog_typecheck.cpp

Lines changed: 16 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -223,28 +223,15 @@ Function: verilog_typecheckt::typecheck_builtin_port_connections
223223
void verilog_typecheckt::typecheck_builtin_port_connections(
224224
verilog_inst_baset::instancet &inst)
225225
{
226-
exprt &range_expr = static_cast<exprt &>(inst.add(ID_range));
227-
228-
ranget range;
229-
230-
if(range_expr.is_nil() || range_expr.id() == irep_idt{})
231-
range = ranget{0, 0};
232-
else
233-
range = convert_range(range_expr);
234-
235-
if(range.lsb > range.msb)
236-
std::swap(range.lsb, range.msb);
237-
mp_integer width = range.length();
238-
239-
inst.remove(ID_range);
240-
241-
typet &type=inst.type();
242-
if(width==1)
243-
type.id(ID_bool);
226+
if(!inst.has_instance_array())
227+
inst.type() = bool_typet{};
244228
else
245229
{
246-
type.id(ID_unsignedbv);
247-
type.set(ID_width, integer2string(width));
230+
// We'll turn a one-dimensional array into a bit-vector
231+
auto &array_type = to_array_type(inst.instance_array());
232+
auto width =
233+
numeric_cast_v<mp_integer>(to_constant_expr(array_type.size()));
234+
inst.type() = unsignedbv_typet{width};
248235
}
249236

250237
for(auto &connection : inst.connections())
@@ -264,7 +251,7 @@ void verilog_typecheckt::typecheck_builtin_port_connections(
264251
}
265252

266253
// like an assignment
267-
assignment_conversion(connection, type);
254+
assignment_conversion(connection, inst.type());
268255
}
269256
}
270257

@@ -560,10 +547,16 @@ Function: verilog_typecheckt::convert_inst_builtin
560547
void verilog_typecheckt::convert_inst_builtin(
561548
verilog_inst_builtint &inst)
562549
{
563-
const irep_idt &inst_module=inst.get_module();
564-
550+
const irep_idt &inst_module = inst.get_module();
565551
for(auto &instance : inst.instances())
566552
{
553+
// typecheck the instance array type, if any
554+
if(instance.has_instance_array())
555+
{
556+
auto &instance_array = instance.instance_array();
557+
instance_array = elaborate_type(instance_array);
558+
}
559+
567560
typecheck_builtin_port_connections(instance);
568561

569562
// check built-in ones

0 commit comments

Comments
 (0)