Skip to content

Commit c14b8c8

Browse files
committed
Add error message if struct is not fully defined (#192).
Fix omission of 6.3.2.3.2-b: Auto-assign default values to unset members of struct literals
1 parent 43300c1 commit c14b8c8

17 files changed

+1078
-940
lines changed

systemrdl/core/ExprVisitor.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,38 @@ def visitStruct_literal(self, ctx: SystemRDLParser.Struct_literalContext):
261261

262262
values[member_name] = (member_expr, member_name_src_ref)
263263

264+
missing_members = set(struct_type._members.keys()) - set(values.keys())
265+
undefined_members = []
266+
for member_name in missing_members:
267+
# 6.3.2.3.2-b: When defining struct member values, unassigned members
268+
# shall receive a default value depending on their type, when available:
269+
t = struct_type._members[member_name]
270+
if t == bool:
271+
values[member_name] = (ast.BoolLiteral(self.compiler.env, None, False), None)
272+
elif t == str:
273+
values[member_name] = (ast.StringLiteral(self.compiler.env, None, ""), None)
274+
elif t == rdltypes.AccessType:
275+
v = ast.BuiltinEnumLiteral(self.compiler.env, None, rdltypes.AccessType.rw)
276+
values[member_name] = (v, None)
277+
elif t == rdltypes.AddressingType:
278+
v = ast.BuiltinEnumLiteral(self.compiler.env, None, rdltypes.AddressingType.regalign)
279+
values[member_name] = (v, None)
280+
elif isinstance(t, rdltypes.ArrayedType):
281+
v = ast.ArrayLiteral(self.compiler.env, None, [])
282+
values[member_name] = (v, None)
283+
else:
284+
undefined_members.append(member_name)
285+
286+
if undefined_members:
287+
# 6.3.2.3.2-c: All the members from a struct instance shall be assigned
288+
# a value, either explicitly or by default.
289+
# Undefined struct members shall raise an error
290+
self.msg.fatal(
291+
"Incomplete struct literal '%s'. The following members are undefined: %s"
292+
% (struct_type_name, ", ".join(undefined_members)),
293+
src_ref_from_antlr(ctx.ID())
294+
)
295+
264296
expr = ast.StructLiteral(
265297
self.compiler.env,
266298
src_ref_from_antlr(ctx.ID()),

systemrdl/node.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -937,11 +937,10 @@ def total_size(self) -> int:
937937
"""
938938
assert isinstance(self.inst, comp.AddressableComponent)
939939
if self.is_array:
940-
# Total size of arrays is technically supposed to be:
941-
# self.inst.array_stride * (self.inst.n_elements-1) + self.size
942-
# However this opens up a whole slew of ugly corner cases that the
943-
# spec designers may not have anticipated.
944-
# Using a simplified calculation for now until someone actually cares
940+
# RDL spec does not explicitly clarify this, but total size for arrays
941+
# should include any additional trailing padding implied by the stride.
942+
# This makes it consistent with IP-XACT.
943+
# See discussion here: https://forums.accellera.org/topic/7529-interpretation-of-total-array-size-implicit-address-allocation/
945944
return self.array_stride * self.inst.n_elements
946945

947946
else:

systemrdl/parser/SystemRDL.g4

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/SystemRDL.interp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/SystemRDLParser.py

Lines changed: 494 additions & 472 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/ext/SystemRDL.interp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/ext/SystemRDLParser.cpp

Lines changed: 479 additions & 454 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/ext/sa_systemrdl_cpp_parser.cpp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/ext/sa_systemrdl_translator.cpp

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

systemrdl/parser/ext/sa_systemrdl_translator.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)