def bounded_composite_setter_preconditions(message: Message, field: Field) -> Sequence[Expr]: return [ Call( "Field_Condition", [ Variable("Ctx"), NamedAggregate(("Fld", Variable(field.affixed_name))) ] + ([Variable("Length")] if common.length_dependent_condition(message) else []), ), GreaterEqual( Call("Available_Space", [Variable("Ctx"), Variable(field.affixed_name)]), Variable("Length"), ), LessEqual( Add( Call("Field_First", [Variable("Ctx"), Variable(field.affixed_name)]), Variable("Length"), ), Div(Last(const.TYPES_BIT_INDEX), Number(2)), ), Or(*[ And( *[ Call("Valid", [Variable("Ctx"), Variable(field.affixed_name)]) for field in message.fields if Variable(field.name) in l.condition.variables() ], l.condition.substituted( mapping={ Variable(field.name): Call(f"Get_{field.name}", [Variable("Ctx")]) for field in message.fields if Variable(field.name) in l.condition.variables() }), ) for l in message.incoming(field) if Last("Message") in l.length ]), Equal( Mod( Call("Field_First", [Variable("Ctx"), Variable(field.affixed_name)]), Size(const.TYPES_BYTE), ), Number(1), ), Equal( Mod(Variable("Length"), Size(const.TYPES_BYTE)), Number(0), ), ]
def valid_message_condition(self, message: Message, structural: bool = False) -> Expr: return (expr.Or(*[ expr.AndThen( expr.Call( "Structural_Valid" if structural and isinstance( message.field_types[l.source], Composite) else "Valid", [ expr.Variable("Ctx"), expr.Variable(l.source.affixed_name, immutable=True), ], ), l.condition, ) for l in message.incoming(FINAL) if l.target == FINAL ]).substituted(common.substitution( message, self.prefix)).simplified().ada_expr())
def conditional_field_size(field: model.Field, message: model.Message, prefix: str) -> Expr: def substituted(expression: expr.Expr) -> Expr: return ( expression.substituted( substitution(message, prefix, target_type=const.TYPES_BIT_LENGTH) ) .simplified() .ada_expr() ) field_type = message.field_types[field] if isinstance(field_type, model.Scalar): return field_type.size.ada_expr() links = message.incoming(field) if len(links) == 1: return substituted(links[0].size) return If( [ ( AndThen( Equal( Selected( Indexed(Variable("Ctx.Cursors"), Variable("Fld")), "Predecessor", ), Variable(l.source.affixed_name), ), *([substituted(l.condition)] if l.condition != expr.TRUE else []), ), substituted(l.size), ) for l in links ], const.UNREACHABLE, )
def bounded_composite_setter_preconditions( self, message: Message, field: Field ) -> Sequence[Expr]: return [ Call( "Field_Condition", [Name("Ctx"), NamedAggregate(("Fld", Name(field.affixed_name)))] + ([Name("Length")] if length_dependent_condition(message) else []), ), GreaterEqual( Call("Available_Space", [Name("Ctx"), Name(field.affixed_name)]), Name("Length"), ), LessEqual( Add(Call("Field_First", [Name("Ctx"), Name(field.affixed_name)]), Name("Length"),), Div(Last(self.types.bit_index), Number(2)), ), Or( *[ And( *[ Call("Valid", [Name("Ctx"), Name(field.affixed_name)]) for field in message.fields if Variable(field.name) in l.condition.variables() ], l.condition.simplified( { Variable(field.name): Call(f"Get_{field.name}", [Name("Ctx")]) for field in message.fields if Variable(field.name) in l.condition.variables() } ), ) for l in message.incoming(field) if Last("Message") in l.length ] ), ]
def bounded_setter_required(message: Message, field: Field) -> bool: return any(True for l in message.incoming(field) if Last("Message") in l.length)