コード例 #1
0
 def create_internal_functions(
     self, message: Message, scalar_fields: Mapping[Field, Scalar]
 ) -> UnitPart:
     return UnitPart(
         [],
         [
             SubprogramBody(
                 ProcedureSpecification(
                     "Set_Field_Value",
                     [
                         InOutParameter(["Ctx"], "Context"),
                         Parameter(["Val"], "Field_Dependent_Value"),
                         OutParameter(["Fst", "Lst"], self.types.bit_index),
                     ],
                 ),
                 [
                     *self.common.field_bit_location_declarations(Selected("Val", "Fld")),
                     *self.common.field_byte_location_declarations(),
                 ],
                 [
                     Assignment("Fst", Name("First")),
                     Assignment("Lst", Name("Last")),
                     CaseStatement(
                         Selected("Val", "Fld"),
                         [
                             (
                                 Name(f.affixed_name),
                                 [
                                     CallStatement(
                                         "Insert",
                                         [
                                             Selected("Val", f"{f.name}_Value"),
                                             Slice(
                                                 Selected(Selected("Ctx", "Buffer"), "all"),
                                                 Name("Buffer_First"),
                                                 Name("Buffer_Last"),
                                             ),
                                             Name("Offset"),
                                         ],
                                     )
                                     if f in scalar_fields
                                     else NullStatement()
                                 ],
                             )
                             for f in message.all_fields
                         ],
                     ),
                 ],
                 [
                     Precondition(
                         AndThen(
                             Not(Constrained("Ctx")),
                             Call("Has_Buffer", [Name("Ctx")]),
                             In(Selected("Val", "Fld"), Range("Field")),
                             Call("Valid_Next", [Name("Ctx"), Selected("Val", "Fld")]),
                             self.common.sufficient_space_for_field_condition(
                                 Selected("Val", "Fld")
                             ),
                             ForAllIn(
                                 "F",
                                 Range("Field"),
                                 If(
                                     [
                                         (
                                             Call(
                                                 "Structural_Valid",
                                                 [
                                                     Indexed(
                                                         Selected("Ctx", "Cursors"), Name("F"),
                                                     )
                                                 ],
                                             ),
                                             LessEqual(
                                                 Selected(
                                                     Indexed(
                                                         Selected("Ctx", "Cursors"), Name("F"),
                                                     ),
                                                     "Last",
                                                 ),
                                                 Call(
                                                     "Field_Last",
                                                     [Name("Ctx"), Selected("Val", "Fld")],
                                                 ),
                                             ),
                                         )
                                     ]
                                 ),
                             ),
                         )
                     ),
                     Postcondition(
                         And(
                             Call("Has_Buffer", [Name("Ctx")]),
                             Equal(
                                 Name("Fst"),
                                 Call("Field_First", [Name("Ctx"), Selected("Val", "Fld")]),
                             ),
                             Equal(
                                 Name("Lst"),
                                 Call("Field_Last", [Name("Ctx"), Selected("Val", "Fld")]),
                             ),
                             GreaterEqual(Name("Fst"), Selected("Ctx", "First")),
                             LessEqual(Name("Fst"), Add(Name("Lst"), Number(1))),
                             LessEqual(
                                 Call(self.types.byte_index, [Name("Lst")]),
                                 Selected("Ctx", "Buffer_Last"),
                             ),
                             ForAllIn(
                                 "F",
                                 Range("Field"),
                                 If(
                                     [
                                         (
                                             Call(
                                                 "Structural_Valid",
                                                 [
                                                     Indexed(
                                                         Selected("Ctx", "Cursors"), Name("F"),
                                                     )
                                                 ],
                                             ),
                                             LessEqual(
                                                 Selected(
                                                     Indexed(
                                                         Selected("Ctx", "Cursors"), Name("F"),
                                                     ),
                                                     "Last",
                                                 ),
                                                 Name("Lst"),
                                             ),
                                         )
                                     ]
                                 ),
                             ),
                             *[
                                 Equal(e, Old(e))
                                 for e in [
                                     Selected("Ctx", "Buffer_First"),
                                     Selected("Ctx", "Buffer_Last"),
                                     Selected("Ctx", "First"),
                                     Selected("Ctx", "Cursors"),
                                 ]
                             ],
                         )
                     ),
                 ],
             )
         ],
     )
コード例 #2
0
ファイル: test_expression.py プロジェクト: senier/RecordFlux
 def test_in_str(self) -> None:
     self.assertEqual(str(In(Variable("X"), Variable("Y"))), "X in Y")
コード例 #3
0
ファイル: test_expression.py プロジェクト: senier/RecordFlux
 def test_not_in_neg(self) -> None:
     self.assertEqual(-NotIn(Variable("X"), Number(1)), In(Variable("X"), Number(1)))
コード例 #4
0
ファイル: test_expression.py プロジェクト: senier/RecordFlux
 def test_in_simplified(self) -> None:
     self.assertEqual(
         In(Variable("X"), Add(Number(21), Number(21))).simplified(),
         In(Variable("X"), Number(42)),
     )
コード例 #5
0
 def create_internal_functions(
         self, message: Message,
         scalar_fields: Mapping[Field, Scalar]) -> UnitPart:
     return UnitPart(
         [],
         [
             SubprogramBody(
                 ProcedureSpecification(
                     "Set_Field_Value",
                     [
                         InOutParameter(["Ctx"], "Context"),
                         Parameter(["Val"], "Field_Dependent_Value"),
                         OutParameter(["Fst", "Lst"],
                                      const.TYPES_BIT_INDEX),
                     ],
                 ),
                 [
                     *common.field_bit_location_declarations(
                         Variable("Val.Fld")),
                     *common.field_byte_location_declarations(),
                     *unique(
                         self.insert_function(common.full_base_type_name(t))
                         for t in message.types.values()
                         if isinstance(t, Scalar)),
                 ],
                 [
                     Assignment("Fst", Variable("First")),
                     Assignment("Lst", Variable("Last")),
                     CaseStatement(
                         Variable("Val.Fld"),
                         [(
                             Variable(f.affixed_name),
                             [
                                 CallStatement(
                                     "Insert",
                                     [
                                         Variable(f"Val.{f.name}_Value"),
                                         Slice(
                                             Variable("Ctx.Buffer.all"),
                                             Variable("Buffer_First"),
                                             Variable("Buffer_Last"),
                                         ),
                                         Variable("Offset"),
                                     ],
                                 )
                                 if f in scalar_fields else NullStatement()
                             ],
                         ) for f in message.all_fields],
                     ),
                 ],
                 [
                     Precondition(
                         AndThen(
                             Not(Constrained("Ctx")),
                             Call("Has_Buffer", [Variable("Ctx")]),
                             In(Variable("Val.Fld"), Range("Field")),
                             Call("Valid_Next",
                                  [Variable("Ctx"),
                                   Variable("Val.Fld")]),
                             common.sufficient_space_for_field_condition(
                                 Variable("Val.Fld")),
                             ForAllIn(
                                 "F",
                                 Range("Field"),
                                 If([(
                                     Call(
                                         "Structural_Valid",
                                         [
                                             Indexed(
                                                 Variable("Ctx.Cursors"),
                                                 Variable("F"),
                                             )
                                         ],
                                     ),
                                     LessEqual(
                                         Selected(
                                             Indexed(
                                                 Variable("Ctx.Cursors"),
                                                 Variable("F"),
                                             ),
                                             "Last",
                                         ),
                                         Call(
                                             "Field_Last",
                                             [
                                                 Variable("Ctx"),
                                                 Variable("Val.Fld")
                                             ],
                                         ),
                                     ),
                                 )]),
                             ),
                         )),
                     Postcondition(
                         And(
                             Call("Has_Buffer", [Variable("Ctx")]),
                             Equal(
                                 Variable("Fst"),
                                 Call(
                                     "Field_First",
                                     [Variable("Ctx"),
                                      Variable("Val.Fld")]),
                             ),
                             Equal(
                                 Variable("Lst"),
                                 Call(
                                     "Field_Last",
                                     [Variable("Ctx"),
                                      Variable("Val.Fld")]),
                             ),
                             GreaterEqual(Variable("Fst"),
                                          Variable("Ctx.First")),
                             LessEqual(Variable("Fst"),
                                       Add(Variable("Lst"), Number(1))),
                             LessEqual(
                                 Call(const.TYPES_BYTE_INDEX,
                                      [Variable("Lst")]),
                                 Variable("Ctx.Buffer_Last"),
                             ),
                             ForAllIn(
                                 "F",
                                 Range("Field"),
                                 If([(
                                     Call(
                                         "Structural_Valid",
                                         [
                                             Indexed(
                                                 Variable("Ctx.Cursors"),
                                                 Variable("F"),
                                             )
                                         ],
                                     ),
                                     LessEqual(
                                         Selected(
                                             Indexed(
                                                 Variable("Ctx.Cursors"),
                                                 Variable("F"),
                                             ),
                                             "Last",
                                         ),
                                         Variable("Lst"),
                                     ),
                                 )]),
                             ),
                             *[
                                 Equal(e, Old(e)) for e in [
                                     Variable("Ctx.Buffer_First"),
                                     Variable("Ctx.Buffer_Last"),
                                     Variable("Ctx.First"),
                                     Variable("Ctx.Cursors"),
                                 ]
                             ],
                         )),
                 ],
             )
         ] if scalar_fields else [],
     )
コード例 #6
0
ファイル: test_expression.py プロジェクト: kug1977/RecordFlux
def test_not_in_neg() -> None:
    assert -NotIn(Variable("X"), Number(1)) == In(Variable("X"), Number(1))
コード例 #7
0
ファイル: test_expression.py プロジェクト: kug1977/RecordFlux
def test_in_str() -> None:
    assert str(In(Variable("X"), Variable("Y"))) == "X in Y"
コード例 #8
0
ファイル: test_expression.py プロジェクト: kug1977/RecordFlux
def test_in_simplified() -> None:
    assert_equal(
        In(Variable("X"), Add(Number(21), Number(21))).simplified(), In(Variable("X"), Number(42)),
    )