Skip to content

Commit c6d43ab

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 79a2e1e commit c6d43ab

File tree

4 files changed

+27
-39
lines changed

4 files changed

+27
-39
lines changed

src/verilog/parser.y

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

src/verilog/verilog_expr.h

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

906+
bool has_instance_array() const
907+
{
908+
return instance_array().is_not_nil();
909+
}
910+
906911
const typet &instance_array() const
907912
{
908913
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
@@ -206,28 +206,15 @@ Function: verilog_typecheckt::typecheck_builtin_port_connections
206206
void verilog_typecheckt::typecheck_builtin_port_connections(
207207
verilog_inst_baset::instancet &inst)
208208
{
209-
exprt &range_expr = static_cast<exprt &>(inst.add(ID_range));
210-
211-
ranget range;
212-
213-
if(range_expr.is_nil() || range_expr.id() == irep_idt{})
214-
range = ranget{0, 0};
215-
else
216-
range = convert_range(range_expr);
217-
218-
if(range.lsb > range.msb)
219-
std::swap(range.lsb, range.msb);
220-
mp_integer width = range.length();
221-
222-
inst.remove(ID_range);
223-
224-
typet &type=inst.type();
225-
if(width==1)
226-
type.id(ID_bool);
209+
if(!inst.has_instance_array())
210+
inst.type() = bool_typet{};
227211
else
228212
{
229-
type.id(ID_unsignedbv);
230-
type.set(ID_width, integer2string(width));
213+
// We'll turn a one-dimensional array into a bit-vector
214+
auto &array_type = to_array_type(inst.instance_array());
215+
auto width =
216+
numeric_cast_v<mp_integer>(to_constant_expr(array_type.size()));
217+
inst.type() = unsignedbv_typet{width};
231218
}
232219

233220
for(auto &connection : inst.connections())
@@ -247,7 +234,7 @@ void verilog_typecheckt::typecheck_builtin_port_connections(
247234
}
248235

249236
// like an assignment
250-
assignment_conversion(connection, type);
237+
assignment_conversion(connection, inst.type());
251238
}
252239
}
253240

@@ -543,10 +530,16 @@ Function: verilog_typecheckt::convert_inst_builtin
543530
void verilog_typecheckt::convert_inst_builtin(
544531
verilog_inst_builtint &inst)
545532
{
546-
const irep_idt &inst_module=inst.get_module();
547-
533+
const irep_idt &inst_module = inst.get_module();
548534
for(auto &instance : inst.instances())
549535
{
536+
// typecheck the instance array type, if any
537+
if(instance.has_instance_array())
538+
{
539+
auto &instance_array = instance.instance_array();
540+
instance_array = elaborate_type(instance_array);
541+
}
542+
550543
typecheck_builtin_port_connections(instance);
551544

552545
// check built-in ones

0 commit comments

Comments
 (0)