Skip to content

Commit

Permalink
Enable code generation for parameterized messages
Browse files Browse the repository at this point in the history
Ref. #609
  • Loading branch information
treiher committed Sep 7, 2021
1 parent 2ac15a5 commit 0062787
Show file tree
Hide file tree
Showing 7 changed files with 210 additions and 85 deletions.
38 changes: 37 additions & 1 deletion rflx/generator/common.py
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,18 @@ def field_size(field: model.Field) -> expr.Expr:
expr.Number(1),
)

def parameter_value(parameter: model.Field, parameter_type: model.Type) -> expr.Expr:
if isinstance(parameter_type, model.Enumeration):
if embedded:
return expr.Call("To_Base", [expr.Variable(parameter.name)])
return expr.Call("To_Base", [expr.Variable("Ctx" * parameter.identifier)])
if isinstance(parameter_type, model.Scalar):
if embedded:
return expr.Variable(parameter.name)
return expr.Variable("Ctx" * parameter.identifier)

assert False, f'unexpected type "{type(parameter_type).__name__}"'

def field_value(field: model.Field, field_type: model.Type) -> expr.Expr:
if isinstance(field_type, model.Enumeration):
if public:
Expand Down Expand Up @@ -186,9 +198,13 @@ def type_conversion(expression: expr.Expr) -> expr.Expr:
**{expr.First(f.name): type_conversion(field_first(f)) for f in message.fields},
**{expr.Last(f.name): type_conversion(field_last(f)) for f in message.fields},
**{expr.Size(f.name): type_conversion(field_size(f)) for f in message.fields},
**{
expr.Variable(p.identifier): type_conversion(parameter_value(p, t))
for p, t in message.parameter_types.items()
},
**{
expr.Variable(f.name): type_conversion(field_value(f, t))
for f, t in message.types.items()
for f, t in message.field_types.items()
},
**{
expr.Variable(l): type_conversion(expr.Call("To_Base", [expr.Variable(l)]))
Expand Down Expand Up @@ -508,6 +524,19 @@ def public_context_predicate() -> ada.Expr:
)


def context_invariant(message: model.Message) -> Sequence[ada.Expr]:
return [
ada.Equal(e, ada.Old(e))
for e in [
ada.Variable("Ctx.Buffer_First"),
ada.Variable("Ctx.Buffer_Last"),
ada.Variable("Ctx.First"),
ada.Variable("Ctx.Last"),
*[ada.Variable("Ctx" * ada.ID(p.name)) for p in message.parameters],
]
]


def valid_path_to_next_field_condition(
message: model.Message, field: model.Field, prefix: str
) -> Sequence[ada.Expr]:
Expand Down Expand Up @@ -696,6 +725,13 @@ def field_condition_call(message: model.Message, field: model.Field, value: ada.
)


def ada_type_identifier(type_identifier: rid.ID) -> ada.ID:
if model.is_builtin_type(type_identifier):
return ada.ID(type_identifier.name)

return ada.ID(type_identifier)


def prefixed_type_identifier(type_identifier: ada.ID, prefix: str) -> ada.ID:
if model.is_builtin_type(type_identifier):
return type_identifier.name
Expand Down
10 changes: 0 additions & 10 deletions rflx/generator/const.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,16 +49,6 @@
TYPES_OFFSET = TYPES * "Offset"
TYPES_U64 = TYPES * "U64"

CONTEXT_INVARIANT = [
ada.Equal(e, ada.Old(e))
for e in (
ada.Variable("Ctx.Buffer_First"),
ada.Variable("Ctx.Buffer_Last"),
ada.Variable("Ctx.First"),
ada.Variable("Ctx.Last"),
)
]

UNREACHABLE = ada.Raise("Program_Error")

CONFIGURATION_PRAGMAS = [
Expand Down
Loading

0 comments on commit 0062787

Please sign in to comment.