armodel 1.4.0__py3-none-any.whl → 1.5.0__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.
- armodel/__init__.py +2 -1
- armodel/cli/arxml_dump_cli.py +9 -7
- armodel/cli/arxml_format_cli.py +72 -0
- armodel/cli/connector_update_cli.py +11 -4
- armodel/data_models/__init__.py +0 -0
- armodel/data_models/sw_connector.py +22 -0
- armodel/lib/data_analyzer.py +1 -1
- armodel/models/__init__.py +3 -2
- armodel/models/annotation.py +20 -0
- armodel/models/ar_object.py +163 -18
- armodel/models/ar_package.py +228 -24
- armodel/models/ar_ref.py +85 -6
- armodel/models/bsw_module_template.py +113 -27
- armodel/models/calibration.py +107 -4
- armodel/models/common_structure.py +142 -52
- armodel/models/communication.py +10 -1
- armodel/models/data_def_properties.py +16 -0
- armodel/models/data_dictionary.py +46 -9
- armodel/models/data_prototype.py +24 -5
- armodel/models/datatype.py +69 -20
- armodel/models/end_to_end_protection.py +67 -0
- armodel/models/fibex/__init__.py +0 -0
- armodel/models/fibex/can_communication.py +6 -0
- armodel/models/fibex/fibex_4_multiplatform.py +145 -0
- armodel/models/fibex/fibex_core.py +341 -0
- armodel/models/fibex/lin_communication.py +17 -0
- armodel/models/fibex/lin_topology.py +7 -0
- armodel/models/general_structure.py +44 -18
- armodel/models/global_constraints.py +4 -4
- armodel/models/implementation.py +79 -32
- armodel/models/internal_behavior.py +63 -0
- armodel/models/m2_msr.py +6 -4
- armodel/models/mode_declaration.py +8 -0
- armodel/models/multilanguage_data.py +42 -0
- armodel/models/per_instance_memory.py +14 -0
- armodel/models/port_interface.py +27 -4
- armodel/models/port_prototype.py +57 -19
- armodel/models/record_layout.py +118 -0
- armodel/models/rpt_scenario.py +20 -0
- armodel/models/service_mapping.py +11 -0
- armodel/models/service_needs.py +48 -0
- armodel/models/sw_component.py +293 -45
- armodel/models/system_template/__init__.py +0 -0
- armodel/models/system_template/network_management.py +7 -0
- armodel/models/system_template/transport_protocols.py +7 -0
- armodel/models/timing.py +91 -0
- armodel/parser/abstract_arxml_parser.py +248 -0
- armodel/parser/arxml_parser.py +1571 -844
- armodel/parser/connector_xlsx_parser.py +190 -0
- armodel/parser/excel_parser.py +18 -0
- armodel/tests/test_armodel/models/test_ar_object.py +152 -0
- armodel/tests/test_armodel/models/test_ar_package.py +1 -1
- armodel/tests/test_armodel/models/test_common_structure.py +2 -2
- armodel/tests/test_armodel/models/test_data_dictionary.py +7 -7
- armodel/tests/test_armodel/models/test_data_prototype.py +3 -3
- armodel/tests/test_armodel/models/test_datatype.py +11 -11
- armodel/tests/test_armodel/models/test_general_structure.py +1 -1
- armodel/tests/test_armodel/models/test_implementation.py +26 -0
- armodel/tests/test_armodel/models/test_m2_msr.py +4 -4
- armodel/tests/test_armodel/models/test_port_interface.py +5 -5
- armodel/tests/test_armodel/parser/test_arxml_parser.py +15 -0
- armodel/tests/test_armodel/parser/test_parse_bswmd.py +74 -42
- armodel/tests/test_armodel/parser/test_sw_components.py +93 -0
- armodel/writer/abstract_arxml_writer.py +123 -0
- armodel/writer/arxml_writer.py +1701 -358
- {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/METADATA +114 -3
- armodel-1.5.0.dist-info/RECORD +91 -0
- {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/WHEEL +1 -1
- {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/entry_points.txt +2 -0
- armodel-1.4.0.dist-info/RECORD +0 -60
- {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/LICENSE +0 -0
- {armodel-1.4.0.dist-info → armodel-1.5.0.dist-info}/top_level.txt +0 -0
armodel/models/sw_component.py
CHANGED
|
@@ -1,30 +1,46 @@
|
|
|
1
1
|
from typing import List, Dict
|
|
2
2
|
from abc import ABCMeta
|
|
3
|
+
|
|
4
|
+
from .rpt_scenario import ModeAccessPointIdent
|
|
5
|
+
|
|
6
|
+
from .internal_behavior import IncludedDataTypeSet, InternalBehavior
|
|
7
|
+
from .service_mapping import RoleBasedPortAssignment
|
|
8
|
+
from .per_instance_memory import PerInstanceMemory
|
|
9
|
+
from .service_needs import NvBlockNeeds, RoleBasedDataAssignment, ServiceNeeds
|
|
10
|
+
from .ar_object import ARBoolean, ARLiteral
|
|
3
11
|
from .general_structure import ARElement, Identifiable, ARObject
|
|
4
|
-
from .ar_ref import AutosarVariableRef,
|
|
5
|
-
from .ar_ref import PortInCompositionTypeInstanceRef, PPortInCompositionInstanceRef, RPortInCompositionInstanceRef
|
|
12
|
+
from .ar_ref import AutosarParameterRef, AutosarVariableRef, InnerPortGroupInCompositionInstanceRef, POperationInAtomicSwcInstanceRef, RModeGroupInAtomicSWCInstanceRef, ROperationInAtomicSwcInstanceRef, TRefType
|
|
13
|
+
from .ar_ref import RefType, PortInCompositionTypeInstanceRef, PPortInCompositionInstanceRef, RPortInCompositionInstanceRef
|
|
6
14
|
from .ar_ref import RVariableInAtomicSwcInstanceRef, RModeInAtomicSwcInstanceRef
|
|
7
15
|
from .port_prototype import RPortPrototype, PPortPrototype, PortPrototype
|
|
8
|
-
from .data_prototype import VariableDataPrototype
|
|
9
|
-
from .common_structure import ExecutableEntity,
|
|
16
|
+
from .data_prototype import ParameterDataPrototype, VariableDataPrototype
|
|
17
|
+
from .common_structure import ExecutableEntity, ValueSpecification
|
|
10
18
|
|
|
11
19
|
class VariableAccess(Identifiable):
|
|
12
20
|
def __init__(self, parent: ARObject, short_name):
|
|
13
21
|
super().__init__(parent, short_name)
|
|
14
22
|
self.accessed_variable_ref = AutosarVariableRef()
|
|
15
23
|
self.accessed_variable_ref.parent = self
|
|
16
|
-
self.
|
|
24
|
+
self._parent = parent
|
|
17
25
|
self.local_variable_ref = None # type: RefType
|
|
18
26
|
|
|
19
|
-
class
|
|
27
|
+
class AbstractAccessPoint(Identifiable):
|
|
28
|
+
__metaclass__ = ABCMeta
|
|
29
|
+
|
|
20
30
|
def __init__(self, parent: ARObject, short_name: str):
|
|
31
|
+
if type(self) == AbstractAccessPoint:
|
|
32
|
+
raise NotImplementedError("ARObject is an abstract class.")
|
|
33
|
+
|
|
21
34
|
super().__init__(parent, short_name)
|
|
22
35
|
|
|
23
|
-
|
|
24
|
-
__metaclass__ = ABCMeta
|
|
36
|
+
self.return_value_provision = None
|
|
25
37
|
|
|
38
|
+
class ParameterAccess(AbstractAccessPoint):
|
|
26
39
|
def __init__(self, parent: ARObject, short_name: str):
|
|
27
|
-
super().__init__(parent, short_name)
|
|
40
|
+
super().__init__(parent, short_name)
|
|
41
|
+
|
|
42
|
+
self.accessed_parameter = None # type: AutosarParameterRef
|
|
43
|
+
self.sw_data_def_props = None #
|
|
28
44
|
|
|
29
45
|
class ServerCallPoint(AbstractAccessPoint):
|
|
30
46
|
__metaclass__ = ABCMeta
|
|
@@ -32,13 +48,28 @@ class ServerCallPoint(AbstractAccessPoint):
|
|
|
32
48
|
def __init__(self, parent: ARObject, short_name: str):
|
|
33
49
|
super().__init__(parent, short_name)
|
|
34
50
|
self.operation_iref = None # type: ROperationInAtomicSwcInstanceRef
|
|
35
|
-
self.timeout =
|
|
51
|
+
self.timeout = None # type: float
|
|
36
52
|
|
|
37
53
|
class SynchronousServerCallPoint(ServerCallPoint):
|
|
38
54
|
def __init__(self, parent: ARObject, short_name: str):
|
|
39
55
|
super().__init__(parent, short_name)
|
|
40
56
|
|
|
41
|
-
self.called_from_within_exclusive_area_ref = None
|
|
57
|
+
self.called_from_within_exclusive_area_ref = None # type: RefType
|
|
58
|
+
|
|
59
|
+
class ModeAccessPoint(ARObject):
|
|
60
|
+
def __init__(self):
|
|
61
|
+
super().__init__()
|
|
62
|
+
|
|
63
|
+
self.ident = None # type: ModeAccessPointIdent
|
|
64
|
+
self.mode_group_iref = None # type: RModeGroupInAtomicSWCInstanceRef
|
|
65
|
+
|
|
66
|
+
@property
|
|
67
|
+
def modeGroupIRef(self) -> RModeGroupInAtomicSWCInstanceRef:
|
|
68
|
+
return self.mode_group_iref
|
|
69
|
+
|
|
70
|
+
@modeGroupIRef.setter
|
|
71
|
+
def modeGroupIRef(self, value: RModeGroupInAtomicSWCInstanceRef):
|
|
72
|
+
self.mode_group_iref = value
|
|
42
73
|
|
|
43
74
|
class AsynchronousServerCallPoint(ServerCallPoint):
|
|
44
75
|
def __init__(self, parent: ARObject, short_name: str):
|
|
@@ -48,7 +79,15 @@ class AsynchronousServerCallResultPoint(ServerCallPoint):
|
|
|
48
79
|
def __init__(self, parent: ARObject, short_name: str):
|
|
49
80
|
super().__init__(parent, short_name)
|
|
50
81
|
|
|
51
|
-
self.asynchronous_server_call_point_ref = None
|
|
82
|
+
self.asynchronous_server_call_point_ref = None # type: RefType
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def asynchronousServerCallPointRef(self) -> RefType:
|
|
86
|
+
return self.asynchronous_server_call_point_ref
|
|
87
|
+
|
|
88
|
+
@asynchronousServerCallPointRef.setter
|
|
89
|
+
def asynchronousServerCallPointRef(self, value: RefType):
|
|
90
|
+
self.asynchronous_server_call_point_ref = value
|
|
52
91
|
|
|
53
92
|
class InternalTriggeringPoint(AbstractAccessPoint):
|
|
54
93
|
def __init__(self, parent: ARObject, short_name: str):
|
|
@@ -59,23 +98,31 @@ class InternalTriggeringPoint(AbstractAccessPoint):
|
|
|
59
98
|
class RunnableEntity(ExecutableEntity):
|
|
60
99
|
def __init__(self, parent: ARObject, short_name: str):
|
|
61
100
|
super().__init__(parent, short_name)
|
|
62
|
-
self.can_be_invoked_concurrently =
|
|
63
|
-
self.data_read_accesses = {} #
|
|
64
|
-
self.data_received_point_by_arguments = {} #
|
|
65
|
-
self.data_received_point_by_values = {} #
|
|
66
|
-
self.data_send_points = {} #
|
|
67
|
-
self.data_write_accesses = {} #
|
|
68
|
-
self.written_local_variables = {} #
|
|
69
|
-
self.read_local_variables = {} #
|
|
70
|
-
self.external_triggering_points = {} #
|
|
101
|
+
self.can_be_invoked_concurrently = None # type: ARBoolean
|
|
102
|
+
self.data_read_accesses = {} # type: Dict[str, VariableAccess]
|
|
103
|
+
self.data_received_point_by_arguments = {} # type: Dict[str, VariableAccess]
|
|
104
|
+
self.data_received_point_by_values = {} # type: Dict[str, VariableAccess]
|
|
105
|
+
self.data_send_points = {} # type: Dict[str, VariableAccess]
|
|
106
|
+
self.data_write_accesses = {} # type: Dict[str, VariableAccess]
|
|
107
|
+
self.written_local_variables = {} # type: Dict[str, VariableAccess]
|
|
108
|
+
self.read_local_variables = {} # type: Dict[str, VariableAccess]
|
|
109
|
+
self.external_triggering_points = {} # type: Dict[InternalTriggeringPoint]
|
|
71
110
|
self.internal_triggering_points = {}
|
|
72
|
-
self.mode_access_points =
|
|
111
|
+
self.mode_access_points = [] # type: List[ModeAccessPoint]
|
|
73
112
|
self.mode_switch_points = {}
|
|
74
|
-
self.parameter_accesses = {}
|
|
75
|
-
self.server_call_points = {} #
|
|
76
|
-
self.wait_points = {} #
|
|
113
|
+
self.parameter_accesses = {} # type: Dict[str, ParameterAccess]
|
|
114
|
+
self.server_call_points = {} # type: Dict[str, ServerCallPoint]
|
|
115
|
+
self.wait_points = {} # type: Dict[str, WaitPoint]
|
|
77
116
|
self.symbol = ""
|
|
78
117
|
|
|
118
|
+
@property
|
|
119
|
+
def canBeInvokedConcurrently(self) -> ARBoolean:
|
|
120
|
+
return self.can_be_invoked_concurrently
|
|
121
|
+
|
|
122
|
+
@canBeInvokedConcurrently.setter
|
|
123
|
+
def canBeInvokedConcurrently(self, value: ARBoolean):
|
|
124
|
+
self.can_be_invoked_concurrently = value
|
|
125
|
+
|
|
79
126
|
def _createVariableAccess(self, short_name, variable_accesses: Dict[str, VariableAccess]):
|
|
80
127
|
if (short_name not in variable_accesses):
|
|
81
128
|
variable_access = VariableAccess(self, short_name)
|
|
@@ -87,6 +134,12 @@ class RunnableEntity(ExecutableEntity):
|
|
|
87
134
|
|
|
88
135
|
def getDataReadAccesses(self) -> List[VariableAccess]:
|
|
89
136
|
return sorted(self.data_read_accesses.values(), key=lambda v: v.short_name)
|
|
137
|
+
|
|
138
|
+
def createDataWriteAccess(self, short_name: str) -> VariableAccess:
|
|
139
|
+
return self._createVariableAccess(short_name, self.data_write_accesses)
|
|
140
|
+
|
|
141
|
+
def getDataWriteAccesses(self) -> List[VariableAccess]:
|
|
142
|
+
return sorted(self.data_write_accesses.values(), key=lambda v: v.short_name)
|
|
90
143
|
|
|
91
144
|
def createDataReceivePointByArgument(self, short_name: str) -> VariableAccess:
|
|
92
145
|
return self._createVariableAccess(short_name, self.data_received_point_by_arguments)
|
|
@@ -118,6 +171,15 @@ class RunnableEntity(ExecutableEntity):
|
|
|
118
171
|
def getWrittenLocalVariables(self) -> List[VariableAccess]:
|
|
119
172
|
return sorted(self.written_local_variables.values(), key=lambda v: v.short_name)
|
|
120
173
|
|
|
174
|
+
def createParameterAccess(self, short_name: str) -> ParameterAccess:
|
|
175
|
+
if (short_name not in self.server_call_points):
|
|
176
|
+
parameter_access = ParameterAccess(self, short_name)
|
|
177
|
+
self.parameter_accesses[short_name] = parameter_access
|
|
178
|
+
return self.parameter_accesses[short_name]
|
|
179
|
+
|
|
180
|
+
def getParameterAccesses(self) -> List[ParameterAccess]:
|
|
181
|
+
return sorted(self.parameter_accesses.values(), key= lambda o: o.short_name)
|
|
182
|
+
|
|
121
183
|
def createSynchronousServerCallPoint(self, short_name: str) -> SynchronousServerCallPoint:
|
|
122
184
|
if (short_name not in self.server_call_points):
|
|
123
185
|
server_call_point = SynchronousServerCallPoint(self, short_name)
|
|
@@ -147,6 +209,12 @@ class RunnableEntity(ExecutableEntity):
|
|
|
147
209
|
|
|
148
210
|
def getInternalTriggeringPoints(self) -> List[InternalTriggeringPoint]:
|
|
149
211
|
return filter(lambda o: isinstance(o, InternalTriggeringPoint), self.elements)
|
|
212
|
+
|
|
213
|
+
def addModeAccessPoint(self, point: ModeAccessPoint):
|
|
214
|
+
self.mode_access_points.append(point)
|
|
215
|
+
|
|
216
|
+
def getModeAccessPoints(self) -> List[ModeAccessPoint]:
|
|
217
|
+
return self.mode_access_points
|
|
150
218
|
|
|
151
219
|
class AbstractEvent(Identifiable):
|
|
152
220
|
def __init__(self, parent: ARObject, short_name: str):
|
|
@@ -155,7 +223,15 @@ class AbstractEvent(Identifiable):
|
|
|
155
223
|
class RTEEvent(AbstractEvent):
|
|
156
224
|
def __init__(self, parent: ARObject, short_name: str):
|
|
157
225
|
super().__init__(parent, short_name)
|
|
158
|
-
|
|
226
|
+
|
|
227
|
+
self.start_on_event_ref = None # type: RefType
|
|
228
|
+
self.disabled_mode_irefs = [] # type: List[RModeInAtomicSwcInstanceRef]
|
|
229
|
+
|
|
230
|
+
def addDisabledModeIRef(self, iref: RModeInAtomicSwcInstanceRef):
|
|
231
|
+
self.disabled_mode_irefs.append(iref)
|
|
232
|
+
|
|
233
|
+
def getDisabledModeIRefs(self) -> List[RModeInAtomicSwcInstanceRef]:
|
|
234
|
+
return self.disabled_mode_irefs
|
|
159
235
|
|
|
160
236
|
class AsynchronousServerCallReturnsEvent(RTEEvent):
|
|
161
237
|
def __init__(self, parent: ARObject, short_name: str):
|
|
@@ -173,22 +249,36 @@ class DataReceivedEvent(RTEEvent):
|
|
|
173
249
|
def __init__(self, parent: ARObject, short_name: str):
|
|
174
250
|
super().__init__(parent, short_name)
|
|
175
251
|
|
|
176
|
-
self.data_iref = None
|
|
252
|
+
self.data_iref = None # type: RVariableInAtomicSwcInstanceRef
|
|
253
|
+
|
|
254
|
+
@property
|
|
255
|
+
def dataIRef(self) -> RVariableInAtomicSwcInstanceRef:
|
|
256
|
+
return self.data_iref
|
|
257
|
+
|
|
258
|
+
@dataIRef.setter
|
|
259
|
+
def dataIRef(self, value: RVariableInAtomicSwcInstanceRef):
|
|
260
|
+
self.data_iref = value
|
|
177
261
|
|
|
178
262
|
class SwcModeSwitchEvent(RTEEvent):
|
|
179
263
|
def __init__(self, parent: ARObject, short_name: str):
|
|
180
264
|
super().__init__(parent, short_name)
|
|
181
265
|
|
|
182
|
-
self._activation =
|
|
183
|
-
self.mode_irefs = []
|
|
266
|
+
self._activation = None # type: ARLiteral
|
|
267
|
+
self.mode_irefs = [] # type: List[RModeInAtomicSwcInstanceRef]
|
|
268
|
+
|
|
269
|
+
def addModeIRef(self, iref: RModeInAtomicSwcInstanceRef):
|
|
270
|
+
self.mode_irefs.append(iref)
|
|
271
|
+
|
|
272
|
+
def getModeIRefs(self) -> List[RModeInAtomicSwcInstanceRef]:
|
|
273
|
+
return self.mode_irefs
|
|
184
274
|
|
|
185
275
|
@property
|
|
186
|
-
def activation(self) ->
|
|
276
|
+
def activation(self) -> ARLiteral:
|
|
187
277
|
return self._activation
|
|
188
278
|
|
|
189
279
|
@activation.setter
|
|
190
|
-
def activation(self, value:
|
|
191
|
-
if value not in ("ON-ENTRY", "ON-EXIT", "ON-TRANSITION"):
|
|
280
|
+
def activation(self, value: ARLiteral):
|
|
281
|
+
if value.getValue() not in ("ON-ENTRY", "ON-EXIT", "ON-TRANSITION"):
|
|
192
282
|
raise ValueError("Invalid activation <%s> of SwcModeSwitchEvent <%s>" % (value, self.short_name))
|
|
193
283
|
self._activation = value
|
|
194
284
|
|
|
@@ -206,6 +296,14 @@ class OperationInvokedEvent(RTEEvent):
|
|
|
206
296
|
super().__init__(parent, short_name)
|
|
207
297
|
self.operation_iref = None # type: POperationInAtomicSwcInstanceRef
|
|
208
298
|
|
|
299
|
+
@property
|
|
300
|
+
def operationIRef(self) -> POperationInAtomicSwcInstanceRef:
|
|
301
|
+
return self.operation_iref
|
|
302
|
+
|
|
303
|
+
@operationIRef.setter
|
|
304
|
+
def operationIRef(self, value: POperationInAtomicSwcInstanceRef):
|
|
305
|
+
self.operation_iref = value
|
|
306
|
+
|
|
209
307
|
class InitEvent(RTEEvent):
|
|
210
308
|
def __init__(self, parent: ARObject, short_name: str):
|
|
211
309
|
super().__init__(parent, short_name)
|
|
@@ -229,10 +327,100 @@ class InternalTriggerOccurredEvent(RTEEvent):
|
|
|
229
327
|
|
|
230
328
|
self.event_source_ref = None # type: RefType
|
|
231
329
|
|
|
330
|
+
class PortDefinedArgumentValue(ARObject):
|
|
331
|
+
def __init__(self):
|
|
332
|
+
super().__init__()
|
|
333
|
+
|
|
334
|
+
self.value = None # type: ValueSpecification
|
|
335
|
+
self.value_type = None # type: TRefType
|
|
336
|
+
|
|
337
|
+
class PortAPIOption(ARObject):
|
|
338
|
+
def __init__(self):
|
|
339
|
+
super().__init__()
|
|
340
|
+
|
|
341
|
+
self.enable_take_address = None # type: ARBoolean
|
|
342
|
+
self.indirect_api = None # type: ARBoolean
|
|
343
|
+
self.port_ref = None # type: RefType
|
|
344
|
+
self._port_arg_values = [] # type: List[PortDefinedArgumentValue]
|
|
345
|
+
|
|
346
|
+
def addPortArgValue(self, value:PortDefinedArgumentValue):
|
|
347
|
+
self._port_arg_values.append(value)
|
|
348
|
+
|
|
349
|
+
def getPortArgValues(self) -> List[PortDefinedArgumentValue]:
|
|
350
|
+
return self._port_arg_values
|
|
351
|
+
|
|
352
|
+
class ServiceDependency(Identifiable):
|
|
353
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
354
|
+
super().__init__(parent, short_name)
|
|
355
|
+
|
|
356
|
+
class SwcServiceDependency(ServiceDependency):
|
|
357
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
358
|
+
super().__init__(parent, short_name)
|
|
359
|
+
|
|
360
|
+
self._assigned_data = []
|
|
361
|
+
self._assigned_ports = []
|
|
362
|
+
|
|
363
|
+
def AddAssignedData(self, data: RoleBasedDataAssignment):
|
|
364
|
+
self._assigned_data.append(data)
|
|
365
|
+
|
|
366
|
+
def getAssignedData(self) -> List[RoleBasedDataAssignment]:
|
|
367
|
+
return self._assigned_data
|
|
368
|
+
|
|
369
|
+
def AddAssignedPort(self, data: RoleBasedPortAssignment):
|
|
370
|
+
self._assigned_ports.append(data)
|
|
371
|
+
|
|
372
|
+
def getAssignedPorts(self) -> List[RoleBasedPortAssignment]:
|
|
373
|
+
return self._assigned_ports
|
|
374
|
+
|
|
375
|
+
def createNvBlockNeeds(self, short_name: str) -> NvBlockNeeds:
|
|
376
|
+
if (short_name not in self.elements):
|
|
377
|
+
event = NvBlockNeeds(self, short_name)
|
|
378
|
+
self.elements[short_name] = event
|
|
379
|
+
return self.elements[short_name]
|
|
380
|
+
|
|
381
|
+
def getNvBlockNeeds(self) -> List[NvBlockNeeds]:
|
|
382
|
+
return sorted(filter(lambda c: isinstance(c, NvBlockNeeds), self.elements.values()), key=lambda e: e.short_name)
|
|
383
|
+
|
|
384
|
+
def getServiceNeeds(self) -> List[ServiceNeeds]:
|
|
385
|
+
return sorted(filter(lambda c: isinstance(c, ServiceNeeds), self.elements.values()), key=lambda e: e.short_name)
|
|
386
|
+
|
|
232
387
|
class SwcInternalBehavior(InternalBehavior):
|
|
233
388
|
def __init__(self, parent: ARObject, short_name: str):
|
|
234
389
|
super().__init__(parent, short_name)
|
|
235
390
|
|
|
391
|
+
self.handle_termination_and_restart = None # type: str
|
|
392
|
+
self.supports_multiple_instantiation = None # type: ARBoolean
|
|
393
|
+
self.explicit_inter_runnable_variables = [] # type: List[VariableDataPrototype]
|
|
394
|
+
self.implicit_inter_runnable_variables = [] # type: List[VariableDataPrototype]
|
|
395
|
+
self.per_instance_memories = [] # type: List[PerInstanceMemory]
|
|
396
|
+
self.per_instance_parameters = [] # type: List[ParameterDataPrototype]
|
|
397
|
+
self.port_api_options = [] # type: List[PortAPIOption]
|
|
398
|
+
self.included_data_type_sets = [] # type: List[IncludedDataTypeSet]
|
|
399
|
+
|
|
400
|
+
def getExplicitInterRunnableVariables(self) -> List[VariableDataPrototype]:
|
|
401
|
+
return self.explicit_inter_runnable_variables
|
|
402
|
+
|
|
403
|
+
def getImplicitInterRunnableVariables(self) -> List[VariableDataPrototype]:
|
|
404
|
+
return self.implicit_inter_runnable_variables
|
|
405
|
+
|
|
406
|
+
def getPerInstanceMemories(self) -> List[PerInstanceMemory]:
|
|
407
|
+
return self.per_instance_memories
|
|
408
|
+
|
|
409
|
+
def getPerInstanceParameters(self) -> List[ParameterDataPrototype]:
|
|
410
|
+
return self.per_instance_parameters
|
|
411
|
+
|
|
412
|
+
def addPortAPIOption(self, option: PortAPIOption):
|
|
413
|
+
self.port_api_options.append(option)
|
|
414
|
+
|
|
415
|
+
def getPortAPIOptions(self) -> List[PortAPIOption]:
|
|
416
|
+
return self.port_api_options
|
|
417
|
+
|
|
418
|
+
def addIncludedDataTypeSet(self, set: IncludedDataTypeSet):
|
|
419
|
+
self.included_data_type_sets.append(set)
|
|
420
|
+
|
|
421
|
+
def getIncludedDataTypeSets(self) -> List[IncludedDataTypeSet]:
|
|
422
|
+
return self.included_data_type_sets
|
|
423
|
+
|
|
236
424
|
def createOperationInvokedEvent(self, short_name: str) -> OperationInvokedEvent:
|
|
237
425
|
if (short_name not in self.elements):
|
|
238
426
|
event = OperationInvokedEvent(self, short_name)
|
|
@@ -268,8 +456,14 @@ class SwcInternalBehavior(InternalBehavior):
|
|
|
268
456
|
event = InternalTriggerOccurredEvent(self, short_name)
|
|
269
457
|
self.elements[short_name] = event
|
|
270
458
|
return self.elements[short_name]
|
|
459
|
+
|
|
460
|
+
def createSwcServiceDependency(self, short_name: str) -> SwcServiceDependency:
|
|
461
|
+
if (short_name not in self.elements):
|
|
462
|
+
event = SwcServiceDependency(self, short_name)
|
|
463
|
+
self.elements[short_name] = event
|
|
464
|
+
return self.elements[short_name]
|
|
271
465
|
|
|
272
|
-
def
|
|
466
|
+
def getRteEvents(self) -> List[RTEEvent]:
|
|
273
467
|
return sorted(filter(lambda c: isinstance(c, RTEEvent), self.elements.values()), key=lambda e: e.short_name)
|
|
274
468
|
|
|
275
469
|
def getOperationInvokedEvents(self) -> List[OperationInvokedEvent]:
|
|
@@ -290,6 +484,9 @@ class SwcInternalBehavior(InternalBehavior):
|
|
|
290
484
|
def getInternalTriggerOccurredEvents(self) -> List[InternalTriggerOccurredEvent]:
|
|
291
485
|
return sorted(filter(lambda c: isinstance(c, InternalTriggerOccurredEvent), self.elements.values()), key= lambda e: e.short_name)
|
|
292
486
|
|
|
487
|
+
def getSwcServiceDependencies(self) -> List[SwcServiceDependency]:
|
|
488
|
+
return sorted(filter(lambda c: isinstance(c, SwcServiceDependency), self.elements.values()), key= lambda e: e.short_name)
|
|
489
|
+
|
|
293
490
|
def getEvent(self, short_name: str) -> RTEEvent:
|
|
294
491
|
if (not isinstance(self.elements[short_name], RTEEvent)):
|
|
295
492
|
raise ValueError("Invalid Event Type <%s> of <%s>" % type(self.elements[short_name]), short_name)
|
|
@@ -299,6 +496,28 @@ class SwcInternalBehavior(InternalBehavior):
|
|
|
299
496
|
if (short_name not in self.elements):
|
|
300
497
|
prototype = VariableDataPrototype(self, short_name)
|
|
301
498
|
self.elements[short_name] = prototype
|
|
499
|
+
self.explicit_inter_runnable_variables.append(prototype)
|
|
500
|
+
return self.elements[short_name]
|
|
501
|
+
|
|
502
|
+
def createImplicitInterRunnableVariable(self, short_name: str) -> VariableDataPrototype:
|
|
503
|
+
if (short_name not in self.elements):
|
|
504
|
+
prototype = VariableDataPrototype(self, short_name)
|
|
505
|
+
self.elements[short_name] = prototype
|
|
506
|
+
self.implicit_inter_runnable_variables.append(prototype)
|
|
507
|
+
return self.elements[short_name]
|
|
508
|
+
|
|
509
|
+
def createPerInstanceMemory(self, short_name: str) -> PerInstanceMemory:
|
|
510
|
+
if (short_name not in self.elements):
|
|
511
|
+
memory = PerInstanceMemory(self, short_name)
|
|
512
|
+
self.elements[short_name] = memory
|
|
513
|
+
self.per_instance_memories.append(memory)
|
|
514
|
+
return self.elements[short_name]
|
|
515
|
+
|
|
516
|
+
def createPerInstanceParameter(self, short_name: str) -> ParameterDataPrototype:
|
|
517
|
+
if (short_name not in self.elements):
|
|
518
|
+
prototype = ParameterDataPrototype(self, short_name)
|
|
519
|
+
self.elements[short_name] = prototype
|
|
520
|
+
self.per_instance_parameters.append(prototype)
|
|
302
521
|
return self.elements[short_name]
|
|
303
522
|
|
|
304
523
|
def getVariableDataPrototypes(self) -> List[VariableDataPrototype]:
|
|
@@ -315,6 +534,25 @@ class SwcInternalBehavior(InternalBehavior):
|
|
|
315
534
|
|
|
316
535
|
def getRunnableEntity(self, short_name) -> RunnableEntity:
|
|
317
536
|
return self.elements[short_name]
|
|
537
|
+
|
|
538
|
+
class PortGroup(Identifiable):
|
|
539
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
540
|
+
super().__init__(parent, short_name)
|
|
541
|
+
|
|
542
|
+
self._inner_group_iref = [] # type: List[InnerPortGroupInCompositionInstanceRef]
|
|
543
|
+
self._outer_port_ref = [] # type: List[RefType]
|
|
544
|
+
|
|
545
|
+
def addInnerGroupIRef(self, iref: InnerPortGroupInCompositionInstanceRef):
|
|
546
|
+
self._inner_group_iref.append(iref)
|
|
547
|
+
|
|
548
|
+
def getInnerGroupIRefs(self) -> List[InnerPortGroupInCompositionInstanceRef]:
|
|
549
|
+
return self._inner_group_iref
|
|
550
|
+
|
|
551
|
+
def addOuterPortRef(self, ref: RefType):
|
|
552
|
+
self._outer_port_ref.append(ref)
|
|
553
|
+
|
|
554
|
+
def getOuterPortRefs(self) -> List[RefType]:
|
|
555
|
+
return self._outer_port_ref
|
|
318
556
|
|
|
319
557
|
class SwComponentType(ARElement):
|
|
320
558
|
__metaclass__ = ABCMeta
|
|
@@ -322,33 +560,35 @@ class SwComponentType(ARElement):
|
|
|
322
560
|
def __init__(self, parent: ARObject, short_name: str):
|
|
323
561
|
super().__init__(parent, short_name)
|
|
324
562
|
|
|
325
|
-
self.ports = [] # List[PortPrototype]
|
|
326
|
-
|
|
327
563
|
def createPPortPrototype(self, short_name: str) -> PPortPrototype:
|
|
328
564
|
prototype = PPortPrototype(self, short_name)
|
|
329
|
-
self.ports.append(prototype)
|
|
330
565
|
if (short_name not in self.elements):
|
|
331
566
|
self.elements[short_name] = prototype
|
|
332
567
|
return self.elements[short_name]
|
|
333
568
|
|
|
334
569
|
def createRPortPrototype(self, short_name) -> RPortPrototype:
|
|
335
570
|
prototype = RPortPrototype(self, short_name)
|
|
336
|
-
self.ports.append(prototype)
|
|
337
571
|
if (short_name not in self.elements):
|
|
338
572
|
self.elements[short_name] = prototype
|
|
339
573
|
return self.elements[short_name]
|
|
574
|
+
|
|
575
|
+
def createPortGroup(self, short_name) -> PortGroup:
|
|
576
|
+
port_group = PortGroup(self, short_name)
|
|
577
|
+
if (short_name not in self.elements):
|
|
578
|
+
self.elements[short_name] = port_group
|
|
579
|
+
return self.elements[short_name]
|
|
340
580
|
|
|
341
581
|
def getPPortPrototypes(self) -> List[PPortPrototype]:
|
|
342
|
-
|
|
343
|
-
return list(sorted(filter(lambda c: isinstance(c, PPortPrototype), self.ports), key= lambda o: o.short_name))
|
|
582
|
+
return list(sorted(filter(lambda c: isinstance(c, PPortPrototype), self.elements.values()), key= lambda o: o.short_name))
|
|
344
583
|
|
|
345
584
|
def getRPortPrototypes(self) -> List[RPortPrototype]:
|
|
346
|
-
|
|
347
|
-
return list(sorted(filter(lambda c: isinstance(c, RPortPrototype), self.ports), key= lambda o: o.short_name))
|
|
585
|
+
return list(sorted(filter(lambda c: isinstance(c, RPortPrototype), self.elements.values()), key= lambda o: o.short_name))
|
|
348
586
|
|
|
349
|
-
def
|
|
350
|
-
|
|
351
|
-
|
|
587
|
+
def getPortPrototypes(self) -> List[PortPrototype]:
|
|
588
|
+
return list(sorted(filter(lambda c: isinstance(c, PortPrototype), self.elements.values()), key= lambda o: o.short_name))
|
|
589
|
+
|
|
590
|
+
def getPortGroups(self) -> List[PortGroup]:
|
|
591
|
+
return list(sorted(filter(lambda c: isinstance(c, PortGroup), self.elements.values()), key= lambda o: o.short_name))
|
|
352
592
|
|
|
353
593
|
class AtomicSwComponentType(SwComponentType):
|
|
354
594
|
__metaclass__ = ABCMeta
|
|
@@ -415,7 +655,7 @@ class DelegationSwConnector(SwConnector):
|
|
|
415
655
|
def __init__(self, parent: ARObject, short_name: str):
|
|
416
656
|
super().__init__(parent, short_name)
|
|
417
657
|
|
|
418
|
-
self.inner_port_iref = None # type:
|
|
658
|
+
self.inner_port_iref = None # type: PortInCompositionTypeInstanceRef
|
|
419
659
|
self.outer_port_ref = None # type: RefType
|
|
420
660
|
|
|
421
661
|
class PassThroughSwConnector(SwConnector):
|
|
@@ -439,6 +679,14 @@ class CompositionSwComponentType(SwComponentType):
|
|
|
439
679
|
self._data_type_mapping_refs = [] # type: List[RefType]
|
|
440
680
|
self.instantiation_rte_event_props = [] # type: List[InstantiationRTEEventProps]
|
|
441
681
|
|
|
682
|
+
def removeAllAssemblySwConnector(self):
|
|
683
|
+
for sw_connector in self.getAssemblySwConnectors():
|
|
684
|
+
self.elements.pop(sw_connector.short_name)
|
|
685
|
+
|
|
686
|
+
def removeAllDelegationSwConnector(self):
|
|
687
|
+
for sw_connector in self.getDelegationSwConnectors():
|
|
688
|
+
self.elements.pop(sw_connector.short_name)
|
|
689
|
+
|
|
442
690
|
def createAssemblySwConnector(self, short_name: str) -> AssemblySwConnector:
|
|
443
691
|
if (short_name not in self.elements):
|
|
444
692
|
connector = AssemblySwConnector(self, short_name)
|
|
File without changes
|
armodel/models/timing.py
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
|
|
2
|
+
from abc import ABCMeta
|
|
3
|
+
from typing import List
|
|
4
|
+
|
|
5
|
+
from armodel.models.ar_ref import RefType
|
|
6
|
+
|
|
7
|
+
from ..models.general_structure import Identifiable
|
|
8
|
+
from ..models.ar_object import ARObject
|
|
9
|
+
|
|
10
|
+
class EOCExecutableEntityRefAbstract(Identifiable):
|
|
11
|
+
__metaclass__ = ABCMeta
|
|
12
|
+
|
|
13
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
14
|
+
if type(self) == TimingConstraint:
|
|
15
|
+
raise NotImplementedError("TimingExtension is an abstract class.")
|
|
16
|
+
|
|
17
|
+
super().__init__(parent, short_name)
|
|
18
|
+
|
|
19
|
+
class EOCExecutableEntityRef(EOCExecutableEntityRefAbstract):
|
|
20
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
21
|
+
super().__init__(parent, short_name)
|
|
22
|
+
|
|
23
|
+
self.successor_refs = [] # List[RefType]
|
|
24
|
+
|
|
25
|
+
def addSuccessorRef(self, ref: RefType):
|
|
26
|
+
self.successor_refs.append(ref)
|
|
27
|
+
|
|
28
|
+
def getSuccessorRefs(self) -> List[RefType]:
|
|
29
|
+
return self.successor_refs
|
|
30
|
+
|
|
31
|
+
class TimingConstraint(Identifiable):
|
|
32
|
+
__metaclass__ = ABCMeta
|
|
33
|
+
|
|
34
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
35
|
+
if type(self) == TimingConstraint:
|
|
36
|
+
raise NotImplementedError("TimingExtension is an abstract class.")
|
|
37
|
+
|
|
38
|
+
super().__init__(parent, short_name)
|
|
39
|
+
|
|
40
|
+
self.timing_condition_ref = None # type: RefType
|
|
41
|
+
|
|
42
|
+
@property
|
|
43
|
+
def timingConditionRef(self) -> RefType:
|
|
44
|
+
return self.timing_condition_ref
|
|
45
|
+
|
|
46
|
+
@timingConditionRef.setter
|
|
47
|
+
def timingConditionRef(self, ref: RefType):
|
|
48
|
+
self.timing_condition_ref = ref
|
|
49
|
+
|
|
50
|
+
class ExecutionOrderConstraint(TimingConstraint):
|
|
51
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
52
|
+
super().__init__(parent, short_name)
|
|
53
|
+
|
|
54
|
+
self.ordered_elements = [] # type: List[EOCExecutableEntityRefAbstract]
|
|
55
|
+
|
|
56
|
+
def createEOCExecutableEntityRef(self, short_name: str)-> EOCExecutableEntityRef:
|
|
57
|
+
if short_name not in self.elements:
|
|
58
|
+
entity_ref = EOCExecutableEntityRef(self, short_name)
|
|
59
|
+
self.elements[short_name] = entity_ref
|
|
60
|
+
self.ordered_elements.append(entity_ref)
|
|
61
|
+
return self.elements[short_name]
|
|
62
|
+
|
|
63
|
+
def getOrderedElements(self) -> List[EOCExecutableEntityRefAbstract]:
|
|
64
|
+
return self.ordered_elements
|
|
65
|
+
|
|
66
|
+
class TimingExtension(Identifiable):
|
|
67
|
+
__metaclass__ = ABCMeta
|
|
68
|
+
|
|
69
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
70
|
+
if type(self) == TimingExtension:
|
|
71
|
+
raise NotImplementedError("TimingExtension is an abstract class.")
|
|
72
|
+
|
|
73
|
+
super().__init__(parent, short_name)
|
|
74
|
+
|
|
75
|
+
self.timing_requirements = [] # Type: List[TimingConstraint]
|
|
76
|
+
|
|
77
|
+
def createExecutionOrderConstraint(self, short_name: str)-> ExecutionOrderConstraint:
|
|
78
|
+
if short_name not in self.elements:
|
|
79
|
+
constraint = ExecutionOrderConstraint(self, short_name)
|
|
80
|
+
self.elements[short_name] = constraint
|
|
81
|
+
self.timing_requirements.append(constraint)
|
|
82
|
+
return self.elements[short_name]
|
|
83
|
+
|
|
84
|
+
def getTimingRequirements(self) -> List[TimingConstraint]:
|
|
85
|
+
return self.timing_requirements
|
|
86
|
+
|
|
87
|
+
class SwcTiming(TimingExtension):
|
|
88
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
89
|
+
super().__init__(parent, short_name)
|
|
90
|
+
|
|
91
|
+
|