armodel 1.8.2__py3-none-any.whl → 1.8.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. armodel/cli/format_xml_cli.py +62 -0
  2. armodel/cli/uuid_checker_cli.py +94 -0
  3. armodel/models/M2/AUTOSARTemplates/AutosarTopLevelStructure.py +4 -1
  4. armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswBehavior.py +7 -0
  5. armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswInterfaces.py +7 -4
  6. armodel/models/M2/AUTOSARTemplates/CommonStructure/ImplementationDataTypes.py +17 -15
  7. armodel/models/M2/AUTOSARTemplates/CommonStructure/TriggerDeclaration.py +1 -1
  8. armodel/models/M2/AUTOSARTemplates/CommonStructure/__init__.py +44 -28
  9. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/Identifiable.py +5 -5
  10. armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +15 -3
  11. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Communication.py +247 -45
  12. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/AutosarVariableRef.py +9 -6
  13. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/DataElements.py +7 -5
  14. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/RTEEvents.py +3 -3
  15. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/Trigger.py +43 -2
  16. armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +40 -43
  17. armodel/models/M2/MSR/AsamHdo/ComputationMethod.py +13 -12
  18. armodel/models/M2/MSR/DataDictionary/DataDefProperties.py +40 -9
  19. armodel/models/utils/uuid_mgr.py +6 -0
  20. armodel/parser/abstract_arxml_parser.py +5 -1
  21. armodel/parser/arxml_parser.py +111 -62
  22. armodel/tests/test_armodel/models/test_common_structure.py +2 -2
  23. armodel/tests/test_armodel/parser/test_arxml_parser.py +38 -0
  24. armodel/tests/test_armodel/parser/test_implementation_data_type.py +247 -0
  25. armodel/tests/test_armodel/parser/test_rte_event.py +142 -0
  26. armodel/tests/test_armodel/parser/test_runnable_entity.py +135 -0
  27. armodel/writer/abstract_arxml_writer.py +2 -0
  28. armodel/writer/arxml_writer.py +106 -28
  29. {armodel-1.8.2.dist-info → armodel-1.8.4.dist-info}/METADATA +19 -1
  30. {armodel-1.8.2.dist-info → armodel-1.8.4.dist-info}/RECORD +34 -29
  31. {armodel-1.8.2.dist-info → armodel-1.8.4.dist-info}/entry_points.txt +2 -0
  32. {armodel-1.8.2.dist-info → armodel-1.8.4.dist-info}/LICENSE +0 -0
  33. {armodel-1.8.2.dist-info → armodel-1.8.4.dist-info}/WHEEL +0 -0
  34. {armodel-1.8.2.dist-info → armodel-1.8.4.dist-info}/top_level.txt +0 -0
@@ -7,6 +7,7 @@ from .....M2.AUTOSARTemplates.SWComponentTemplate.Datatype.DataPrototypes import
7
7
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.IncludedDataTypes import IncludedDataTypeSet
8
8
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.PerInstanceMemory import PerInstanceMemory
9
9
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import AsynchronousServerCallReturnsEvent, BackgroundEvent
10
+ from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import DataSendCompletedEvent
10
11
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import DataReceivedEvent, InitEvent, InternalTriggerOccurredEvent
11
12
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import ModeSwitchedAckEvent, OperationInvokedEvent, RTEEvent
12
13
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.RTEEvents import SwcModeSwitchEvent, TimingEvent
@@ -16,7 +17,7 @@ from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.DataElemen
16
17
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.ServerCall import ServerCallPoint
17
18
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.ModeDeclarationGroup import IncludedModeDeclarationGroupSet, ModeAccessPoint
18
19
  from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.ModeDeclarationGroup import ModeSwitchPoint
19
- from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.Trigger import InternalTriggeringPoint
20
+ from .....M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.Trigger import ExternalTriggeringPoint, InternalTriggeringPoint
20
21
  from .....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArObject import ARObject
21
22
  from .....M2.AUTOSARTemplates.CommonStructure.InternalBehavior import ExecutableEntity
22
23
 
@@ -72,44 +73,32 @@ class RunnableEntity(ExecutableEntity):
72
73
  def __init__(self, parent: ARObject, short_name: str):
73
74
  super().__init__(parent, short_name)
74
75
 
75
- # type: List[RunnableEntityArgument]
76
- self.arguments = []
77
- # type: List[AsynchronousServerCallResultPoint]
78
- self.asynchronousServerCallResultPoints = []
79
- self.canBeInvokedConcurrently = None # type: ARBoolean
80
- # type: Dict[str, VariableAccess]
81
- self.dataReadAccesses = {}
82
- # type: Dict[str, VariableAccess]
83
- self.dataReceivePointByArguments = {}
84
- # type: Dict[str, VariableAccess]
85
- self.dataReceivePointByValues = {}
86
- # type: Dict[str, VariableAccess]
87
- self.dataSendPoints = {}
88
- # type: Dict[str, VariableAccess]
89
- self.dataWriteAccesses = {}
90
- # type: Dict[str, ExternalTriggeringPoint]
91
- self.externalTriggeringPoints = {}
92
- # type: Dict[str, InternalTriggeringPoint]
93
- self.internalTriggeringPoints = {}
94
- self.modeAccessPoints = [] # type: List[ModeAccessPoint]
95
- self.modeSwitchPoints = [] # type: List[ModeSwitchPoint]
96
- # type: Dict[str, ParameterAccess]
97
- self.parameterAccesses = {}
98
- # type: Dict[str, VariableAccess]
99
- self.readLocalVariables = {}
100
- # type: Dict[str, ServerCallPoint]
101
- self.serverCallPoints = {}
102
- self.symbol = None # type: ARLiteral
76
+ self.arguments: List[RunnableEntityArgument] = []
77
+ self.asynchronousServerCallResultPoints: List[AsynchronousServerCallResultPoint] = []
78
+ self.canBeInvokedConcurrently: ARBoolean = None
79
+ self.dataReadAccesses: List[VariableAccess] = []
80
+ self.dataReceivePointByArguments: List[VariableAccess] = []
81
+ self.dataReceivePointByValues: List[VariableAccess] = []
82
+ self.dataSendPoints: List[VariableAccess] = []
83
+ self.dataWriteAccesses: List[VariableAccess] = []
84
+ self.externalTriggeringPoints: List[ExternalTriggeringPoint] = []
85
+ self.internalTriggeringPoints: List[InternalTriggeringPoint] = []
86
+ self.modeAccessPoints: List[ModeAccessPoint] = []
87
+ self.modeSwitchPoints: List[ModeSwitchPoint] = []
88
+ self.parameterAccesses: List[ParameterAccess] = []
89
+ self.readLocalVariables: List[VariableAccess] = []
90
+ self.serverCallPoints: List[ServerCallPoint] = []
91
+ self.symbol: ARLiteral = None
103
92
  # type: Dict[str, WaitPoint]
104
93
  self.waitPoints = {}
105
- # type: Dict[str, VariableAccess]
106
- self.writtenLocalVariables = {}
94
+ self.writtenLocalVariables: List[VariableAccess] = []
107
95
 
108
- def _createVariableAccess(self, short_name, variable_accesses: Dict[str, VariableAccess]):
96
+ def _createVariableAccess(self, short_name, variable_accesses: List[VariableAccess]):
109
97
  if not self.IsElementExists(short_name):
110
98
  variable_access = VariableAccess(self, short_name)
111
- variable_accesses[short_name] = variable_access
112
- return variable_accesses[short_name]
99
+ self.addElement(variable_access)
100
+ variable_accesses.append(variable_access)
101
+ return self.getElement(short_name, VariableAccess)
113
102
 
114
103
  def getArguments(self):
115
104
  return self.arguments
@@ -129,46 +118,45 @@ class RunnableEntity(ExecutableEntity):
129
118
  return self._createVariableAccess(short_name, self.dataReadAccesses)
130
119
 
131
120
  def getDataReadAccesses(self) -> List[VariableAccess]:
132
- return sorted(self.dataReadAccesses.values(), key=lambda v: v.short_name)
121
+ return sorted(self.dataReadAccesses, key=lambda v: v.short_name)
133
122
 
134
123
  def createDataWriteAccess(self, short_name: str) -> VariableAccess:
135
124
  return self._createVariableAccess(short_name, self.dataWriteAccesses)
136
125
 
137
126
  def getDataWriteAccesses(self) -> List[VariableAccess]:
138
- return sorted(self.dataWriteAccesses.values(), key=lambda v: v.short_name)
127
+ return sorted(self.dataWriteAccesses, key=lambda v: v.short_name)
139
128
 
140
129
  def createDataReceivePointByArgument(self, short_name: str) -> VariableAccess:
141
130
  return self._createVariableAccess(short_name, self.dataReceivePointByArguments)
142
131
 
143
132
  def getDataReceivePointByArguments(self) -> List[VariableAccess]:
144
- return sorted(self.dataReceivePointByArguments.values(), key=lambda v: v.short_name)
133
+ return sorted(self.dataReceivePointByArguments, key=lambda v: v.short_name)
145
134
 
146
135
  def createDataReceivePointByValue(self, short_name: str) -> VariableAccess:
147
136
  return self._createVariableAccess(short_name, self.dataReceivePointByValues)
148
137
 
149
138
  def getDataReceivePointByValues(self) -> List[VariableAccess]:
150
- return sorted(self.dataReceivePointByValues.values(), key=lambda v: v.short_name)
139
+ return sorted(self.dataReceivePointByValues, key=lambda v: v.short_name)
151
140
 
152
141
  def createDataSendPoint(self, short_name: str) -> VariableAccess:
153
142
  return self._createVariableAccess(short_name, self.dataSendPoints)
154
143
 
155
144
  def getDataSendPoints(self) -> List[VariableAccess]:
156
145
  # return sorted(self.dataSendPoints.values(), key=lambda v: v.short_name)
157
- return self.dataSendPoints.values()
146
+ return self.dataSendPoints
158
147
 
159
148
  def createReadLocalVariable(self, short_name: str) -> VariableAccess:
160
149
  return self._createVariableAccess(short_name, self.readLocalVariables)
161
150
 
162
151
  def getReadLocalVariables(self) -> List[VariableAccess]:
163
152
  # return sorted(self.readLocalVariables.values(), key=lambda v: v.short_name)
164
- return self.readLocalVariables.values()
153
+ return self.readLocalVariables
165
154
 
166
155
  def createWrittenLocalVariable(self, short_name: str) -> VariableAccess:
167
156
  return self._createVariableAccess(short_name, self.writtenLocalVariables)
168
157
 
169
158
  def getWrittenLocalVariables(self) -> List[VariableAccess]:
170
- # return sorted(self.writtenLocalVariables.values(), key=lambda v: v.short_name)
171
- return self.writtenLocalVariables.values()
159
+ return self.writtenLocalVariables
172
160
 
173
161
  def getParameterAccesses(self) -> List[ParameterAccess]:
174
162
  return list(sorted(filter(lambda a: isinstance(a, ParameterAccess), self.elements), key=lambda o: o.short_name))
@@ -191,7 +179,7 @@ class RunnableEntity(ExecutableEntity):
191
179
  if (short_name not in self.serverCallPoints):
192
180
  point = AsynchronousServerCallPoint(self, short_name)
193
181
  self.addElement(point)
194
- return self.getElement(short_name)
182
+ return self.getElement(short_name, AsynchronousServerCallPoint)
195
183
  # self.serverCallPoints[short_name] = server_call_point
196
184
  # return self.serverCallPoints[short_name]
197
185
 
@@ -398,6 +386,12 @@ class SwcInternalBehavior(InternalBehavior):
398
386
  event = BackgroundEvent(self, short_name)
399
387
  self.addElement(event)
400
388
  return self.getElement(short_name, BackgroundEvent)
389
+
390
+ def createDataSendCompletedEvent(self, short_name: str) -> DataSendCompletedEvent:
391
+ if not self.IsElementExists(short_name):
392
+ event = DataSendCompletedEvent(self, short_name)
393
+ self.addElement(event)
394
+ return self.getElement(short_name, DataSendCompletedEvent)
401
395
 
402
396
  def getRteEvents(self) -> List[RTEEvent]:
403
397
  return sorted(filter(lambda c: isinstance(c, RTEEvent), self.elements), key=lambda e: e.short_name)
@@ -425,6 +419,9 @@ class SwcInternalBehavior(InternalBehavior):
425
419
 
426
420
  def getBackgroundEvents(self) -> List[BackgroundEvent]:
427
421
  return sorted(filter(lambda c: isinstance(c, BackgroundEvent), self.elements), key=lambda e: e.short_name)
422
+
423
+ def getDataSendCompletedEvents(self) -> List[DataSendCompletedEvent]:
424
+ return sorted(filter(lambda c: isinstance(c, DataSendCompletedEvent), self.elements), key=lambda e: e.short_name)
428
425
 
429
426
  def getSwcServiceDependencies(self) -> List[SwcServiceDependency]:
430
427
  return sorted(filter(lambda c: isinstance(c, SwcServiceDependency), self.elements), key=lambda e: e.short_name)
@@ -202,15 +202,15 @@ class CompuScale(Compu):
202
202
  def __init__(self):
203
203
  super().__init__()
204
204
 
205
- self.a2lDisplayText = None # type: String
206
- self.compuInverseValue = None # type: CompuConst
207
- self.compuScaleContents = None # type: CompuScaleContents
208
- self.desc = None # type: MultiLanguageOverviewParagraph
209
- self.lowerLimit = None # type: Limit
210
- self.mask = None # type: PositiveUnlimitedInteger
211
- self.shortLabel = None # type: Identifier
212
- self.symbol = None # type: CIdentifier
213
- self.upperLimit = None # type: Limit
205
+ self.a2lDisplayText: String = None
206
+ self.compuInverseValue: CompuConst = None
207
+ self.compuScaleContents: CompuScaleContents = None
208
+ self.desc: MultiLanguageOverviewParagraph = None
209
+ self.lowerLimit: Limit = None
210
+ self.mask: PositiveUnlimitedInteger = None
211
+ self.shortLabel: Identifier = None
212
+ self.symbol: CIdentifier = None
213
+ self.upperLimit: Limit = None
214
214
 
215
215
  def getA2lDisplayText(self):
216
216
  return self.a2lDisplayText
@@ -247,11 +247,12 @@ class CompuScale(Compu):
247
247
  self.lowerLimit = value
248
248
  return self
249
249
 
250
- def getMask(self):
250
+ def getMask(self) -> PositiveUnlimitedInteger:
251
251
  return self.mask
252
252
 
253
- def setMask(self, value):
254
- self.mask = value
253
+ def setMask(self, value: PositiveUnlimitedInteger):
254
+ if value is not None:
255
+ self.mask = value
255
256
  return self
256
257
 
257
258
  def getShortLabel(self):
@@ -6,6 +6,44 @@ from ....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTy
6
6
  from ....M2.AUTOSARTemplates.CommonStructure import ValueSpecification
7
7
 
8
8
 
9
+ class SwImplPolicyEnum(AREnum):
10
+ """
11
+ Enumeration for software implementation policy.
12
+ * const
13
+ forced implementation such that the running software within the ECU shall not modify it. For example
14
+ implemented with the "const" modifier in C. This can be applied for parameters (not for those in
15
+ NVRAM) as well as argument data prototypes.
16
+ * fixed
17
+ This data element is fixed. In particular this indicates, that it might also be implemented e.g. as in
18
+ place data, (#DEFINE).
19
+ * measurementPoint
20
+ The data element is created for measurement purposes only. The data element is never read directly
21
+ within the ECU software. In contrast to a "standard" data element in an unconnected provide port is,
22
+ this unconnection is guaranteed for measurementPoint data elements.
23
+ * queued
24
+ The content of the data element is queued and the data element has 'event' semantics, i.e. data
25
+ elements are stored in a queue and all data elements are processed in 'first in first out' order. The
26
+ queuing is intended to be implemented by RTE Generator. This value is not applicable for parameters.
27
+ * standard
28
+ This is applicable for all kinds of data elements. For variable data prototypes the 'last is best'
29
+ semantics applies. For parameter there is no specific implementation directive.
30
+ """
31
+ CONST = "const"
32
+ FIXED = "fixed"
33
+ MEASUREMENT_POINT = "measurementPoint"
34
+ QUEUED = "queued"
35
+ STANDARD = "standard"
36
+
37
+ def __init__(self):
38
+ super().__init__([
39
+ SwImplPolicyEnum.CONST,
40
+ SwImplPolicyEnum.FIXED,
41
+ SwImplPolicyEnum.MEASUREMENT_POINT,
42
+ SwImplPolicyEnum.QUEUED,
43
+ SwImplPolicyEnum.STANDARD
44
+ ])
45
+
46
+
9
47
  class SwDataDefPropsConditional(ARObject):
10
48
  '''
11
49
  Patch for the time-stamp
@@ -14,18 +52,11 @@ class SwDataDefPropsConditional(ARObject):
14
52
  super().__init__()
15
53
 
16
54
 
17
- class SwImplPolicyEnum(AREnum):
18
- def __init__(self, enum_values):
19
- super().__init__([
20
-
21
- ])
22
-
23
-
24
55
  class SwDataDefProps(ARObject):
25
56
  def __init__(self):
26
57
  super().__init__()
27
58
 
28
- self.additionalNativeTypeQualifier = None
59
+ self.additionalNativeTypeQualifier = None
29
60
  self.annotations = [] # type: List[Annotation]
30
61
  self.baseTypeRef = None # type: RefType
31
62
  self.compuMethodRef = None # type: RefType
@@ -268,6 +299,7 @@ class SwDataDefProps(ARObject):
268
299
  self.valueAxisDataTypeRef = value
269
300
  return self
270
301
 
302
+
271
303
  class SwPointerTargetProps(ARObject):
272
304
  def __init__(self):
273
305
  super().__init__()
@@ -317,4 +349,3 @@ class ValueList(ARObject):
317
349
 
318
350
  def getVfs(self) -> List[ARLiteral]:
319
351
  return sorted(self._vf)
320
-
@@ -21,3 +21,9 @@ class UUIDMgr:
21
21
  if uuid in self.uuid_object_mappings:
22
22
  result = self.uuid_object_mappings[uuid]
23
23
  return result
24
+
25
+ def getDuplicateUUIDs(self):
26
+ if len(self.uuid_object_mappings) > 0:
27
+ return self.uuid_object_mappings.keys()
28
+ else:
29
+ return []
@@ -175,7 +175,7 @@ class AbstractARXMLParser:
175
175
  return None
176
176
  bool_value = Boolean()
177
177
  bool_value.timestamp = literal.timestamp
178
- bool_value.setValue(literal.getValue())
178
+ bool_value.setValue(literal.getText())
179
179
  return bool_value
180
180
 
181
181
  def _convertStringToNumberValue(self, value) -> int:
@@ -190,6 +190,8 @@ class AbstractARXMLParser:
190
190
  return None
191
191
  numerical = ARNumerical()
192
192
  self.readARObjectAttributes(child_element, numerical)
193
+ if "SHORT-LABEL" in child_element.attrib:
194
+ numerical.setShortLabel(child_element.attrib["SHORT-LABEL"])
193
195
  numerical.setValue(child_element.text)
194
196
  return numerical
195
197
 
@@ -206,6 +208,8 @@ class AbstractARXMLParser:
206
208
  child_element = self.find(element, key)
207
209
  if child_element is None:
208
210
  return None
211
+ if child_element.text is None:
212
+ return None
209
213
  numerical = PositiveInteger()
210
214
  self.readARObjectAttributes(child_element, numerical)
211
215
  numerical.setValue(child_element.text)