py-eb-model 1.1.6__py3-none-any.whl → 1.1.7__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.
- eb_model/cli/rte_xdm_2_xls_cli.py +28 -27
- eb_model/models/abstract.py +20 -8
- eb_model/models/os_xdm.py +320 -55
- eb_model/models/rte_xdm.py +16 -11
- eb_model/parser/eb_parser.py +28 -20
- eb_model/parser/os_xdm_parser.py +47 -3
- eb_model/parser/rte_xdm_parser.py +11 -11
- eb_model/reporter/excel_reporter/abstract.py +14 -6
- eb_model/reporter/excel_reporter/os_xdm.py +104 -20
- eb_model/reporter/excel_reporter/rte_xdm.py +15 -4
- eb_model/tests/models/test_abstract.py +201 -0
- eb_model/tests/models/test_eb_doc.py +66 -0
- eb_model/tests/models/test_eclipse_project.py +21 -0
- eb_model/tests/models/test_importer_xdm.py +45 -40
- eb_model/tests/parser/__init__.py +0 -0
- eb_model/tests/parser/test_os_xdm_parser.py +150 -0
- {py_eb_model-1.1.6.dist-info → py_eb_model-1.1.7.dist-info}/METADATA +7 -1
- {py_eb_model-1.1.6.dist-info → py_eb_model-1.1.7.dist-info}/RECORD +22 -17
- {py_eb_model-1.1.6.dist-info → py_eb_model-1.1.7.dist-info}/LICENSE +0 -0
- {py_eb_model-1.1.6.dist-info → py_eb_model-1.1.7.dist-info}/WHEEL +0 -0
- {py_eb_model-1.1.6.dist-info → py_eb_model-1.1.7.dist-info}/entry_points.txt +0 -0
- {py_eb_model-1.1.6.dist-info → py_eb_model-1.1.7.dist-info}/top_level.txt +0 -0
eb_model/models/rte_xdm.py
CHANGED
@@ -21,6 +21,11 @@ class AbstractEventToTaskMapping(EcucParamConfContainerDef):
|
|
21
21
|
|
22
22
|
def getRtePositionInTask(self):
|
23
23
|
return self.rtePositionInTask
|
24
|
+
|
25
|
+
def getRtePositionInTaskNumber(self) -> int:
|
26
|
+
if self.rtePositionInTask is None:
|
27
|
+
return 0
|
28
|
+
return self.rtePositionInTask
|
24
29
|
|
25
30
|
def setRtePositionInTask(self, value):
|
26
31
|
self.rtePositionInTask = value
|
@@ -185,7 +190,7 @@ class RteEventToTaskMappingV3(RteEventToTaskMapping):
|
|
185
190
|
def __init__(self, parent, name):
|
186
191
|
super().__init__(parent, name)
|
187
192
|
|
188
|
-
self.rteEventRef = None
|
193
|
+
self.rteEventRef: EcucParamConfContainerDef = None
|
189
194
|
|
190
195
|
def getRteEventRef(self) -> EcucRefType:
|
191
196
|
return self.rteEventRef
|
@@ -199,17 +204,17 @@ class RteEventToTaskMappingV4(RteEventToTaskMapping):
|
|
199
204
|
def __init__(self, parent, name):
|
200
205
|
super().__init__(parent, name)
|
201
206
|
|
202
|
-
self.rteEventRefs = []
|
207
|
+
self.rteEventRefs: List[EcucRefType] = []
|
203
208
|
|
204
|
-
def getRteEventRefs(self):
|
209
|
+
def getRteEventRefs(self) -> List[EcucRefType]:
|
205
210
|
return self.rteEventRefs
|
206
211
|
|
207
|
-
def addRteEventRef(self, value):
|
212
|
+
def addRteEventRef(self, value: EcucRefType):
|
208
213
|
if value is not None:
|
209
214
|
self.rteEventRefs.append(value)
|
210
215
|
return self
|
211
216
|
|
212
|
-
def getRteEventRef(self):
|
217
|
+
def getRteEventRef(self) -> EcucRefType:
|
213
218
|
if len(self.rteEventRefs) != 1:
|
214
219
|
raise ValueError("Unsupported RteEventRef of RteEventToTaskMapping <%s> " % self.name)
|
215
220
|
return self.rteEventRefs[0]
|
@@ -341,12 +346,12 @@ class RteBswEventToTaskMappingV3(RteBswEventToTaskMapping):
|
|
341
346
|
def __init__(self, parent, name):
|
342
347
|
super().__init__(parent, name)
|
343
348
|
|
344
|
-
self.rteBswEventRef = None
|
349
|
+
self.rteBswEventRef: EcucRefType = None
|
345
350
|
|
346
|
-
def getRteBswEventRef(self):
|
351
|
+
def getRteBswEventRef(self) -> EcucRefType:
|
347
352
|
return self.rteBswEventRef
|
348
353
|
|
349
|
-
def setRteBswEventRef(self, value):
|
354
|
+
def setRteBswEventRef(self, value: EcucRefType):
|
350
355
|
if value is not None:
|
351
356
|
self.rteBswEventRef = value
|
352
357
|
return self
|
@@ -356,16 +361,16 @@ class RteBswEventToTaskMappingV4(RteBswEventToTaskMapping):
|
|
356
361
|
def __init__(self, parent, name):
|
357
362
|
super().__init__(parent, name)
|
358
363
|
|
359
|
-
self.rteBswEventRefs
|
364
|
+
self.rteBswEventRefs: List[EcucRefType] = []
|
360
365
|
|
361
|
-
def getRteBswEventRefs(self) -> EcucRefType:
|
366
|
+
def getRteBswEventRefs(self) -> List[EcucRefType]:
|
362
367
|
return self.rteBswEventRefs
|
363
368
|
|
364
369
|
def addRteBswEventRef(self, value: EcucRefType):
|
365
370
|
self.rteBswEventRefs.append(value)
|
366
371
|
return self
|
367
372
|
|
368
|
-
def getRteBswEventRef(self):
|
373
|
+
def getRteBswEventRef(self) -> EcucRefType:
|
369
374
|
if len(self.rteBswEventRefs) != 1:
|
370
375
|
raise ValueError("Unsupported RteEventRef of RteEventToTaskMapping <%s> " % self.name)
|
371
376
|
return self.rteBswEventRefs[0]
|
eb_model/parser/eb_parser.py
CHANGED
@@ -8,14 +8,15 @@ from typing import List
|
|
8
8
|
from ..models.eb_doc import EBModel, PreferenceModel
|
9
9
|
from ..models.abstract import EcucRefType, Module
|
10
10
|
|
11
|
-
|
11
|
+
|
12
|
+
class AbstractEbModelParser(metaclass=ABCMeta):
|
12
13
|
|
13
14
|
def __init__(self) -> None:
|
14
15
|
self.nsmap = {}
|
15
16
|
|
16
17
|
self.logger = logging.getLogger()
|
17
18
|
|
18
|
-
if type(self)
|
19
|
+
if type(self) is AbstractEbModelParser:
|
19
20
|
raise ValueError("Abstract EBModelParser cannot be initialized.")
|
20
21
|
|
21
22
|
def validate_root(self, element: ET.Element):
|
@@ -39,7 +40,6 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
39
40
|
'''
|
40
41
|
Internal function and please call _read_ref_value instead of it
|
41
42
|
'''
|
42
|
-
#match = re.match(r'ASPath.*\/(.*)', value)
|
43
43
|
match = re.match(r'ASPath:(.*)', value)
|
44
44
|
if (match):
|
45
45
|
return match.group(1)
|
@@ -60,18 +60,20 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
60
60
|
|
61
61
|
def read_value(self, parent: ET.Element, name: str) -> str:
|
62
62
|
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
63
|
-
if tag
|
63
|
+
if tag is None:
|
64
64
|
raise KeyError("XPath d:var[@name='%s'] is invalid" % name)
|
65
65
|
return self._convert_value(tag)
|
66
66
|
|
67
|
-
def read_optional_value(self, parent: ET.Element, name: str, default_value
|
67
|
+
def read_optional_value(self, parent: ET.Element, name: str, default_value=None) -> str:
|
68
68
|
tag = parent.find(".//d:var[@name='%s']" % name, self.nsmap)
|
69
69
|
if tag is None:
|
70
70
|
return default_value
|
71
|
-
if
|
71
|
+
if 'value' not in tag.attrib:
|
72
72
|
return default_value
|
73
73
|
enable = self.read_attrib(tag, 'ENABLE')
|
74
|
-
if
|
74
|
+
if enable is None:
|
75
|
+
return default_value
|
76
|
+
if enable.upper() == "FALSE":
|
75
77
|
return default_value
|
76
78
|
return self._convert_value(tag)
|
77
79
|
|
@@ -85,7 +87,7 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
85
87
|
def read_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
86
88
|
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
87
89
|
if tag is None:
|
88
|
-
|
90
|
+
raise KeyError("XPath d:ref[@name='%s'] is invalid" % name)
|
89
91
|
if 'value' in tag.attrib:
|
90
92
|
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
91
93
|
return None
|
@@ -93,8 +95,11 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
93
95
|
def read_optional_ref_value(self, parent: ET.Element, name: str) -> EcucRefType:
|
94
96
|
tag = parent.find(".//d:ref[@name='%s']" % name, self.nsmap)
|
95
97
|
enable = self.read_attrib(tag, 'ENABLE')
|
96
|
-
if
|
98
|
+
if enable is None:
|
99
|
+
return None
|
100
|
+
if enable.upper() == "FALSE":
|
97
101
|
return None
|
102
|
+
|
98
103
|
return EcucRefType(self.read_ref_raw_value(tag.attrib['value']))
|
99
104
|
|
100
105
|
def read_ref_value_list(self, parent: ET.Element, name: str) -> List[EcucRefType]:
|
@@ -102,7 +107,7 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
102
107
|
for tag in parent.findall(".//d:lst[@name='%s']/d:ref" % name, self.nsmap):
|
103
108
|
ref_value_list.append(EcucRefType(self.read_ref_raw_value(tag.attrib['value'])))
|
104
109
|
return ref_value_list
|
105
|
-
|
110
|
+
|
106
111
|
def find_ctr_tag_list(self, parent: ET.Element, name: str) -> List[ET.Element]:
|
107
112
|
return parent.findall(".//d:lst[@name='%s']/d:ctr" % name, self.nsmap)
|
108
113
|
|
@@ -111,26 +116,26 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
111
116
|
|
112
117
|
def find_ctr_tag(self, parent: ET.Element, name: str) -> ET.Element:
|
113
118
|
'''
|
114
|
-
Read the child ctr tag.
|
119
|
+
Read the child ctr tag.
|
115
120
|
'''
|
116
121
|
tag = parent.find(".//d:ctr[@name='%s']" % name, self.nsmap)
|
117
122
|
if tag is None:
|
118
123
|
return None
|
119
124
|
enable = self.read_attrib(tag, 'ENABLE')
|
120
|
-
# ctr has the value if
|
125
|
+
# ctr has the value if
|
121
126
|
# 1. enable attribute do not exist
|
122
127
|
# 2. enable attribute is not false
|
123
|
-
if enable is not None and enable == "
|
128
|
+
if enable is not None and enable.upper() == "FALSE":
|
124
129
|
return None
|
125
130
|
return tag
|
126
131
|
|
127
|
-
def create_ctr_tag(self, name: str, type: str)-> ET.Element:
|
132
|
+
def create_ctr_tag(self, name: str, type: str) -> ET.Element:
|
128
133
|
ctr_tag = ET.Element("d:ctr")
|
129
134
|
ctr_tag.attrib['name'] = name
|
130
135
|
ctr_tag.attrib['type'] = type
|
131
136
|
return ctr_tag
|
132
137
|
|
133
|
-
def create_ref_tag(self, name:str, type: str, value = "")-> ET.Element:
|
138
|
+
def create_ref_tag(self, name: str, type: str, value: str = "") -> ET.Element:
|
134
139
|
ref_tag = ET.Element("d:ref")
|
135
140
|
ref_tag.attrib['name'] = name
|
136
141
|
ref_tag.attrib['type'] = type
|
@@ -138,20 +143,20 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
138
143
|
ref_tag.attrib['value'] = "ASPath:%s" % value
|
139
144
|
return ref_tag
|
140
145
|
|
141
|
-
def create_choice_tag(self, name:str, type:str, value: str)-> ET.Element:
|
146
|
+
def create_choice_tag(self, name: str, type: str, value: str) -> ET.Element:
|
142
147
|
choice_tag = ET.Element("d:chc")
|
143
148
|
choice_tag.attrib['name'] = name
|
144
149
|
choice_tag.attrib['type'] = type
|
145
150
|
choice_tag.attrib['value'] = value
|
146
151
|
return choice_tag
|
147
152
|
|
148
|
-
def create_attrib_tag(self, name:str, value: str) -> ET.Element:
|
153
|
+
def create_attrib_tag(self, name: str, value: str) -> ET.Element:
|
149
154
|
attrib_tag = ET.Element("a:a")
|
150
155
|
attrib_tag.attrib['name'] = name
|
151
156
|
attrib_tag.attrib['value'] = value
|
152
157
|
return attrib_tag
|
153
158
|
|
154
|
-
def create_ref_lst_tag(self, name:str, type:str = "", ref_list: List[str] = []) -> ET.Element:
|
159
|
+
def create_ref_lst_tag(self, name: str, type: str = "", ref_list: List[str] = []) -> ET.Element:
|
155
160
|
lst_tag = ET.Element("d:lst")
|
156
161
|
lst_tag.attrib['name'] = name
|
157
162
|
for ref in ref_list:
|
@@ -169,7 +174,7 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
169
174
|
return parent.find(".//d:lst[@name='%s']" % name, self.nsmap)
|
170
175
|
|
171
176
|
def read_attrib(self, parent: ET.Element, name: str) -> str:
|
172
|
-
attrib_tag = parent.find("
|
177
|
+
attrib_tag = parent.find("a:a[@name='%s']" % name, self.nsmap)
|
173
178
|
if attrib_tag is None:
|
174
179
|
return None
|
175
180
|
return attrib_tag.attrib['value']
|
@@ -177,6 +182,9 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
177
182
|
def read_namespaces(self, xdm: str):
|
178
183
|
self.nsmap = dict([node for _, node in ET.iterparse(xdm, events=['start-ns'])])
|
179
184
|
|
185
|
+
# def set_namespace(self, key: str, value: str):
|
186
|
+
# self.nsmap[key] = value
|
187
|
+
|
180
188
|
def parse(self, element: ET.Element, doc: EBModel):
|
181
189
|
pass
|
182
190
|
|
@@ -199,4 +207,4 @@ class AbstractEbModelParser(metaclass = ABCMeta):
|
|
199
207
|
|
200
208
|
def parse_preference_xdm(self, filename: str, doc: EBModel):
|
201
209
|
root_tag = self.load_xdm(filename)
|
202
|
-
self.parse_preference(root_tag, doc)
|
210
|
+
self.parse_preference(root_tag, doc)
|
eb_model/parser/os_xdm_parser.py
CHANGED
@@ -3,7 +3,7 @@ from ..models.eb_doc import EBModel
|
|
3
3
|
from ..models.os_xdm import Os, OsAlarm, OsAlarmActivateTask, OsAlarmCallback, OsAlarmIncrementCounter, OsAlarmSetEvent, OsCounter, OsResource
|
4
4
|
from ..models.os_xdm import OsScheduleTable
|
5
5
|
from ..models.os_xdm import OsTask, OsIsr, OsApplication, OsScheduleTableEventSetting, OsScheduleTableExpiryPoint, OsScheduleTableTaskActivation
|
6
|
-
from ..models.os_xdm import OsScheduleTblAdjustableExpPoint, OsTaskAutostart
|
6
|
+
from ..models.os_xdm import OsScheduleTblAdjustableExpPoint, OsTaskAutostart, OsMicrokernel, MkMemoryProtection, MkMemoryRegion
|
7
7
|
from ..parser.eb_parser import AbstractEbModelParser
|
8
8
|
|
9
9
|
|
@@ -32,6 +32,7 @@ class OsXdmParser(AbstractEbModelParser):
|
|
32
32
|
self.read_os_counters(element, os)
|
33
33
|
self.read_os_applications(element, os)
|
34
34
|
self.read_os_resources(element, os)
|
35
|
+
self.read_os_microkernel(element, os)
|
35
36
|
|
36
37
|
def read_os_task_autostart(self, element: ET.Element, os_task: OsTask):
|
37
38
|
ctr_tag = self.find_ctr_tag(element, "OsTaskAutostart")
|
@@ -66,11 +67,21 @@ class OsXdmParser(AbstractEbModelParser):
|
|
66
67
|
.setOsStacksize(int(self.read_value(ctr_tag, "OsStacksize"))) \
|
67
68
|
.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsIsrPriority"))
|
68
69
|
|
69
|
-
#
|
70
|
+
# Infineon Aurix Tricore
|
70
71
|
os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
|
71
|
-
|
72
|
+
os_isr.setOsIsrVector(self.read_optional_value(ctr_tag, "OsTricoreVector"))
|
73
|
+
os_isr.setOsTricoreIrqLevel(self.read_optional_value(ctr_tag, "OsTricoreIrqLevel"))
|
74
|
+
os_isr.setOsTricoreVector(self.read_optional_value(ctr_tag, "OsTricoreVector"))
|
75
|
+
|
76
|
+
# ARM Core
|
72
77
|
os_isr.setOsIsrPriority(self.read_optional_value(ctr_tag, "OsARMIrqLevel"))
|
73
78
|
os_isr.setOsIsrVector(self.read_optional_value(ctr_tag, "OsARMVector"))
|
79
|
+
os_isr.setOsARMIrqLevel(self.read_optional_value(ctr_tag, "OsARMIrqLevel"))
|
80
|
+
os_isr.setOsARMVector(self.read_optional_value(ctr_tag, "OsARMVector"))
|
81
|
+
|
82
|
+
# EB Safety OS
|
83
|
+
for ref in self.read_ref_value_list(ctr_tag, "OsIsrMkMemoryRegionRef"):
|
84
|
+
os_isr.addOsIsrMkMemoryRegionRef(ref)
|
74
85
|
|
75
86
|
self.logger.debug("Read OsIsr <%s>" % os_isr.getName())
|
76
87
|
os.addOsIsr(os_isr)
|
@@ -190,9 +201,42 @@ class OsXdmParser(AbstractEbModelParser):
|
|
190
201
|
def read_os_resources(self, element: ET.Element, os: Os):
|
191
202
|
for ctr_tag in self.find_ctr_tag_list(element, "OsResource"):
|
192
203
|
os_res = OsResource(os, ctr_tag.attrib["name"])
|
204
|
+
os_res.setImporterInfo(self.read_attrib(ctr_tag, "IMPORTER_INFO"))
|
193
205
|
os_res.setOsResourceProperty(self.read_value(ctr_tag, "OsResourceProperty"))
|
194
206
|
|
195
207
|
for ref in self.read_ref_value_list(ctr_tag, "OsResourceAccessingApplication"):
|
196
208
|
os_res.addOsResourceAccessingApplicationRefs(ref)
|
197
209
|
|
198
210
|
os.addOsResource(os_res)
|
211
|
+
|
212
|
+
def read_mk_memory_regions(self, element: ET.Element, protection: MkMemoryProtection):
|
213
|
+
for ctr_tag in self.find_ctr_tag_list(element, "MkMemoryRegion"):
|
214
|
+
# self.logger.info("Read MkMemoryRegion %s" % ctr_tag.attrib["name"])
|
215
|
+
region = MkMemoryRegion(protection, ctr_tag.attrib["name"])
|
216
|
+
region.setMkMemoryRegionFlags(self.read_value(ctr_tag, "MkMemoryRegionFlags"))
|
217
|
+
region.setMkMemoryRegionInitialize(self.read_value(ctr_tag, "MkMemoryRegionInitialize"))
|
218
|
+
region.setMkMemoryRegionGlobal(self.read_value(ctr_tag, "MkMemoryRegionGlobal"))
|
219
|
+
region.setMkMemoryRegionInitThreadAccess(self.read_value(ctr_tag, "MkMemoryRegionInitThreadAccess"))
|
220
|
+
region.setMkMemoryRegionIdleThreadAccess(self.read_value(ctr_tag, "MkMemoryRegionIdleThreadAccess"))
|
221
|
+
region.setMkMemoryRegionOsThreadAccess(self.read_value(ctr_tag, "MkMemoryRegionOsThreadAccess"))
|
222
|
+
region.setMkMemoryRegionErrorHookAccess(self.read_value(ctr_tag, "MkMemoryRegionErrorHookAccess"))
|
223
|
+
region.setMkMemoryRegionProtHookAccess(self.read_value(ctr_tag, "MkMemoryRegionProtHookAccess"))
|
224
|
+
region.setMkMemoryRegionShutdownHookAccess(self.read_value(ctr_tag, "MkMemoryRegionShutdownHookAccess"))
|
225
|
+
region.setMkMemoryRegionShutdownAccess(self.read_value(ctr_tag, "MkMemoryRegionShutdownAccess"))
|
226
|
+
region.setMkMemoryRegionInitializePerCore(self.read_value(ctr_tag, "MkMemoryRegionInitializePerCore"))
|
227
|
+
protection.addMkMemoryRegion(region)
|
228
|
+
|
229
|
+
def read_mk_memory_protection(self, element: ET.Element, kernel: OsMicrokernel):
|
230
|
+
ctr_tag = self.find_ctr_tag(element, "MkMemoryProtection")
|
231
|
+
if ctr_tag is not None:
|
232
|
+
# self.logger.info("Read MkMemoryProtection")
|
233
|
+
protection = MkMemoryProtection(kernel, ctr_tag.attrib["name"])
|
234
|
+
self.read_mk_memory_regions(ctr_tag, protection)
|
235
|
+
kernel.setMkMemoryProtection(protection)
|
236
|
+
|
237
|
+
def read_os_microkernel(self, element: ET.Element, os: Os):
|
238
|
+
ctr_tag = self.find_ctr_tag(element, "OsMicrokernel")
|
239
|
+
if ctr_tag is not None:
|
240
|
+
kernel = OsMicrokernel(os, ctr_tag.attrib["name"])
|
241
|
+
self.read_mk_memory_protection(ctr_tag, kernel)
|
242
|
+
os.setOsMicrokernel(kernel)
|
@@ -1,9 +1,11 @@
|
|
1
1
|
import xml.etree.ElementTree as ET
|
2
2
|
|
3
|
-
from ..models.rte_xdm import Rte, RteBswEventToTaskMapping, RteBswEventToTaskMappingV3, RteBswEventToTaskMappingV4, RteBswModuleInstance
|
3
|
+
from ..models.rte_xdm import Rte, RteBswEventToTaskMapping, RteBswEventToTaskMappingV3, RteBswEventToTaskMappingV4, RteBswModuleInstance
|
4
|
+
from ..models.rte_xdm import RteEventToTaskMapping, RteEventToTaskMappingV3, RteEventToTaskMappingV4, RteSwComponentInstance
|
4
5
|
from ..models.eb_doc import EBModel
|
5
6
|
from ..parser.eb_parser import AbstractEbModelParser
|
6
7
|
|
8
|
+
|
7
9
|
class RteXdmParser(AbstractEbModelParser):
|
8
10
|
def __init__(self, ) -> None:
|
9
11
|
super().__init__()
|
@@ -16,16 +18,12 @@ class RteXdmParser(AbstractEbModelParser):
|
|
16
18
|
rte = doc.getRte()
|
17
19
|
self.read_version(element, rte)
|
18
20
|
|
19
|
-
self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" %
|
20
|
-
(rte.getArVersion().getVersion(), rte.getSwVersion().getVersion()))
|
21
|
-
|
21
|
+
self.logger.info("Parse Rte ARVersion:<%s> SwVersion:<%s>" % (rte.getArVersion().getVersion(), rte.getSwVersion().getVersion()))
|
22
22
|
self.rte = rte
|
23
23
|
|
24
24
|
self.read_rte_bsw_module_instances(element, rte)
|
25
25
|
self.read_rte_sw_component_instances(element, rte)
|
26
26
|
|
27
|
-
|
28
|
-
|
29
27
|
def read_rte_bsw_module_instance_event_to_task_mappings(self, element: ET.Element, instance: RteBswModuleInstance):
|
30
28
|
for ctr_tag in self.find_ctr_tag_list(element, "RteBswEventToTaskMapping"):
|
31
29
|
self.logger.debug("Read RteBswEventToTaskMapping <%s>" % ctr_tag.attrib['name'])
|
@@ -38,7 +36,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
38
36
|
mapping.setRteBswActivationOffset(self.read_optional_value(ctr_tag, "RteBswActivationOffset")) \
|
39
37
|
.setRteBswEventPeriod(self.read_optional_value(ctr_tag, "RteBswPeriod")) \
|
40
38
|
.setRteBswPositionInTask(self.read_optional_value(ctr_tag, "RteBswPositionInTask")) \
|
41
|
-
.setRteBswServerQueueLength(self.read_optional_value(ctr_tag, "RteBswServerQueueLength"))
|
39
|
+
.setRteBswServerQueueLength(self.read_optional_value(ctr_tag, "RteBswServerQueueLength"))
|
42
40
|
|
43
41
|
if isinstance(mapping, RteBswEventToTaskMappingV4):
|
44
42
|
for resource_ref in self.read_ref_value_list(ctr_tag, "RteBswEventRef"):
|
@@ -56,7 +54,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
56
54
|
instance = RteBswModuleInstance(rte, ctr_tag.attrib['name'])
|
57
55
|
instance.setRteBswImplementationRef(self.read_ref_value(ctr_tag, "RteBswImplementationRef")) \
|
58
56
|
.setRteMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "RteMappedToOsApplicationRef"))
|
59
|
-
|
57
|
+
|
60
58
|
self.read_rte_bsw_module_instance_event_to_task_mappings(ctr_tag, instance)
|
61
59
|
rte.addRteBswModuleInstance(instance)
|
62
60
|
|
@@ -71,7 +69,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
71
69
|
mapping.setRteActivationOffset(self.read_optional_value(ctr_tag, "RteActivationOffset")) \
|
72
70
|
.setRtePeriod(self.read_optional_value(ctr_tag, "RtePeriod")) \
|
73
71
|
.setRtePositionInTask(self.read_optional_value(ctr_tag, "RtePositionInTask")) \
|
74
|
-
.setRteServerQueueLength(self.read_optional_value(ctr_tag, "RteServerQueueLength"))
|
72
|
+
.setRteServerQueueLength(self.read_optional_value(ctr_tag, "RteServerQueueLength"))
|
75
73
|
|
76
74
|
if isinstance(mapping, RteEventToTaskMappingV4):
|
77
75
|
for resource_ref in self.read_ref_value_list(ctr_tag, "RteEventRef"):
|
@@ -80,6 +78,8 @@ class RteXdmParser(AbstractEbModelParser):
|
|
80
78
|
mapping.setRteEventRef(self.read_ref_value(ctr_tag, "RteEventRef"))
|
81
79
|
|
82
80
|
mapping.setRteMappedToTaskRef(self.read_optional_ref_value(ctr_tag, "RteMappedToTaskRef"))
|
81
|
+
|
82
|
+
self.logger.debug("Rte Event %s" % mapping.getRteEventRef().getShortName())
|
83
83
|
|
84
84
|
instance.addRteEventToTaskMapping(mapping)
|
85
85
|
|
@@ -89,7 +89,7 @@ class RteXdmParser(AbstractEbModelParser):
|
|
89
89
|
|
90
90
|
instance = RteSwComponentInstance(rte, ctr_tag.attrib['name'])
|
91
91
|
instance.setMappedToOsApplicationRef(self.read_optional_ref_value(ctr_tag, "MappedToOsApplicationRef")) \
|
92
|
-
|
92
|
+
.setRteSoftwareComponentInstanceRef(self.read_optional_ref_value(ctr_tag, "RteSoftwareComponentInstanceRef"))
|
93
93
|
|
94
94
|
self.read_rte_sw_component_instance_event_to_task_mappings(ctr_tag, instance)
|
95
|
-
rte.addRteSwComponentInstance(instance)
|
95
|
+
rte.addRteSwComponentInstance(instance)
|
@@ -10,24 +10,26 @@ class ExcelReporter:
|
|
10
10
|
self.wb = Workbook()
|
11
11
|
self.logger = logging.getLogger()
|
12
12
|
|
13
|
-
def auto_width(self, worksheet
|
13
|
+
def auto_width(self, worksheet, customized={}):
|
14
14
|
dims = {}
|
15
15
|
for row in worksheet.rows:
|
16
16
|
for cell in row:
|
17
17
|
if cell.value:
|
18
|
-
alignment = cell.alignment # type: Alignment
|
19
|
-
if (alignment.wrapText is True):
|
20
|
-
continue
|
21
18
|
dims[cell.column_letter] = max((dims.get(cell.column_letter, 0), len(str(cell.value))))
|
22
19
|
|
23
20
|
for col, value in dims.items():
|
24
|
-
|
25
|
-
|
21
|
+
self.logger.debug("Sheet:%s , column: %s, width: %d" % (str(worksheet), col, value))
|
22
|
+
if col in customized:
|
23
|
+
if customized[col] != 0:
|
24
|
+
worksheet.column_dimensions[col].width = customized[col]
|
25
|
+
else:
|
26
|
+
worksheet.column_dimensions[col].width = value + 4
|
26
27
|
|
27
28
|
def write_title_row(self, sheet: Worksheet, title_row):
|
28
29
|
for idx in range(0, len(title_row)):
|
29
30
|
cell = sheet.cell(row=1, column=idx + 1)
|
30
31
|
cell.value = title_row[idx]
|
32
|
+
cell.alignment = Alignment(horizontal="center")
|
31
33
|
|
32
34
|
def write_cell(self, sheet: Worksheet, row: int, column: int, value, format=None) -> Cell:
|
33
35
|
cell = sheet.cell(row=row, column=column) # type: Cell
|
@@ -38,6 +40,12 @@ class ExcelReporter:
|
|
38
40
|
if ('number_format' in format):
|
39
41
|
cell.number_format = format['number_format']
|
40
42
|
return cell
|
43
|
+
|
44
|
+
def format_boolean(self, value: bool) -> str:
|
45
|
+
if value is True:
|
46
|
+
return "Y"
|
47
|
+
else:
|
48
|
+
return "N"
|
41
49
|
|
42
50
|
def save(self, name: str):
|
43
51
|
self.wb.save(name)
|
@@ -49,24 +49,37 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
49
49
|
def write_os_isrs(self, doc: EBModel):
|
50
50
|
sheet = self.wb.create_sheet("OsIsr", 1)
|
51
51
|
|
52
|
-
title_row = [
|
52
|
+
title_row = [
|
53
|
+
"Name", "OsApplication", "OsIsrCategory", "OsStacksize", "OsIsrPriority",
|
54
|
+
"OsIsrVector", "MkMemoryRegion"]
|
53
55
|
self.write_title_row(sheet, title_row)
|
54
56
|
|
55
57
|
row = 2
|
56
58
|
for os_isr in doc.getOs().getOsIsrList():
|
57
|
-
self.write_cell(sheet, row, 1, os_isr.getName())
|
59
|
+
self.write_cell(sheet, row, 1, os_isr.getName(), {'alignment': Alignment(vertical="top")})
|
58
60
|
os_app = doc.getOs().getOsIsrOsApplication(os_isr.getName())
|
59
61
|
if os_app is not None:
|
60
|
-
self.write_cell(sheet, row, 2, os_app.getName()
|
61
|
-
|
62
|
-
self.write_cell(sheet, row,
|
63
|
-
|
64
|
-
self.write_cell(sheet, row,
|
62
|
+
self.write_cell(sheet, row, 2, os_app.getName(),
|
63
|
+
format={'alignment': Alignment(horizontal="center", vertical="top")})
|
64
|
+
self.write_cell(sheet, row, 3, os_isr.getOsIsrCategory(),
|
65
|
+
format={'alignment': Alignment(horizontal="center", vertical="top")})
|
66
|
+
self.write_cell(sheet, row, 4, os_isr.getOsStacksize(),
|
67
|
+
format={'alignment': Alignment(horizontal="center", vertical="top")})
|
68
|
+
self.write_cell(sheet, row, 5, os_isr.getOsIsrPriority(),
|
69
|
+
format={'alignment': Alignment(horizontal="center", vertical="top")})
|
70
|
+
self.write_cell(sheet, row, 6, os_isr.getOsIsrVector(),
|
71
|
+
format={'alignment': Alignment(horizontal="center", vertical="top")})
|
72
|
+
if len(os_isr.getOsIsrMkMemoryRegionRefs()) > 1:
|
73
|
+
self.write_cell(sheet, row, 7, "\n".join(map(lambda a: a.getShortName(), os_isr.getOsIsrMkMemoryRegionRefs())),
|
74
|
+
{'alignment': Alignment(wrapText=True, vertical="top")})
|
75
|
+
else:
|
76
|
+
self.write_cell(sheet, row, 7, "\n".join(map(lambda a: a.getShortName(), os_isr.getOsIsrMkMemoryRegionRefs())),
|
77
|
+
{'alignment': Alignment(vertical="top")})
|
65
78
|
row += 1
|
66
79
|
|
67
80
|
self.logger.debug("Write OsIsr <%s>" % os_isr.getName())
|
68
81
|
|
69
|
-
self.auto_width(sheet)
|
82
|
+
self.auto_width(sheet, {"G": 25})
|
70
83
|
|
71
84
|
def write_os_schedule_tables(self, doc: EBModel):
|
72
85
|
sheet = self.wb.create_sheet("OsScheduleTable", 2)
|
@@ -77,9 +90,12 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
77
90
|
row = 2
|
78
91
|
for os_schedule_table in doc.getOs().getOsScheduleTableList():
|
79
92
|
self.write_cell(sheet, row, 1, os_schedule_table.getName())
|
80
|
-
self.write_cell(sheet, row, 2, os_schedule_table.getOsScheduleTableDuration()
|
81
|
-
|
82
|
-
self.write_cell(sheet, row,
|
93
|
+
self.write_cell(sheet, row, 2, os_schedule_table.getOsScheduleTableDuration(),
|
94
|
+
format={'alignment': Alignment(horizontal="center")})
|
95
|
+
self.write_cell(sheet, row, 3, os_schedule_table.getOsScheduleTableRepeating(),
|
96
|
+
format={'alignment': Alignment(horizontal="center")})
|
97
|
+
self.write_cell(sheet, row, 4, os_schedule_table.getOsScheduleTableCounterRef().getShortName(),
|
98
|
+
format={'alignment': Alignment(horizontal="center")})
|
83
99
|
row += 1
|
84
100
|
|
85
101
|
self.logger.debug("Write OsScheduleTable <%s>" % os_schedule_table.getName())
|
@@ -95,11 +111,16 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
95
111
|
row = 2
|
96
112
|
for os_counter in doc.getOs().getOsCounterList():
|
97
113
|
self.write_cell(sheet, row, 1, os_counter.getName())
|
98
|
-
self.write_cell(sheet, row, 2, os_counter.getOsCounterMaxAllowedValue()
|
99
|
-
|
100
|
-
self.write_cell(sheet, row,
|
101
|
-
|
102
|
-
self.write_cell(sheet, row,
|
114
|
+
self.write_cell(sheet, row, 2, os_counter.getOsCounterMaxAllowedValue(),
|
115
|
+
format={'alignment': Alignment(horizontal="center")})
|
116
|
+
self.write_cell(sheet, row, 3, os_counter.getOsCounterMinCycle(),
|
117
|
+
format={'alignment': Alignment(horizontal="center")})
|
118
|
+
self.write_cell(sheet, row, 4, os_counter.getOsCounterTicksPerBase(),
|
119
|
+
format={'alignment': Alignment(horizontal="center")})
|
120
|
+
self.write_cell(sheet, row, 5, os_counter.getOsCounterType(),
|
121
|
+
format={'alignment': Alignment(horizontal="center")})
|
122
|
+
self.write_cell(sheet, row, 6, os_counter.getOsSecondsPerTick(),
|
123
|
+
format={'alignment': Alignment(horizontal="center")})
|
103
124
|
row += 1
|
104
125
|
|
105
126
|
self.logger.debug("Write OsScheduleTable <%s>" % os_counter.getName())
|
@@ -109,7 +130,7 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
109
130
|
def write_expiry_points(self, doc: EBModel):
|
110
131
|
sheet = self.wb.create_sheet("OsScheduleTableExpiryPoint", 4)
|
111
132
|
|
112
|
-
title_row = ["ExpiryPoint", "OsScheduleTable", "OsCounter" "Offset (ms)", "Task"]
|
133
|
+
title_row = ["ExpiryPoint", "OsScheduleTable", "OsCounter", "Offset (ms)", "Task"]
|
113
134
|
self.write_title_row(sheet, title_row)
|
114
135
|
|
115
136
|
row = 2
|
@@ -119,15 +140,77 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
119
140
|
for expiry_point in expiry_point_list:
|
120
141
|
self.write_cell(sheet, row, 1, expiry_point.getName())
|
121
142
|
self.write_cell(sheet, row, 2, table.getName())
|
122
|
-
self.write_cell(sheet, row, 3, table.getOsScheduleTableCounterRef().getShortName()
|
123
|
-
|
124
|
-
self.write_cell(sheet, row,
|
143
|
+
self.write_cell(sheet, row, 3, table.getOsScheduleTableCounterRef().getShortName(),
|
144
|
+
format={'alignment': Alignment(horizontal="center")})
|
145
|
+
self.write_cell(sheet, row, 4, expiry_point.getOsScheduleTblExpPointOffset(),
|
146
|
+
format={'alignment': Alignment(horizontal="center")})
|
147
|
+
self.write_cell(sheet, row, 5, len(expiry_point.getOsScheduleTableTaskActivationList()),
|
148
|
+
format={'alignment': Alignment(horizontal="center")})
|
125
149
|
row += 1
|
126
150
|
|
127
151
|
self.logger.debug("Write OsScheduleTable <%s>" % table.getName())
|
128
152
|
|
129
153
|
self.auto_width(sheet)
|
130
154
|
|
155
|
+
def mk_memory_region_exists(self, doc: EBModel) -> bool:
|
156
|
+
mk = doc.getOs().getOsMicrokernel()
|
157
|
+
if mk is None:
|
158
|
+
return False
|
159
|
+
|
160
|
+
protection = mk.getMkMemoryProtection()
|
161
|
+
if protection is None:
|
162
|
+
return False
|
163
|
+
|
164
|
+
if len(protection.getMkMemoryRegionList()) <= 0:
|
165
|
+
return False
|
166
|
+
|
167
|
+
return True
|
168
|
+
|
169
|
+
def write_mk_memory_regions(self, doc: EBModel):
|
170
|
+
if self.mk_memory_region_exists(doc) is True:
|
171
|
+
sheet = self.wb.create_sheet("MkMemoryRegion", 5)
|
172
|
+
|
173
|
+
title_row = [
|
174
|
+
"Name", "Flags", "Initialize", "Global", "InitThread",
|
175
|
+
"IdleThread", "OsThread", "ErrorHook", "ProtHook", "ShutdownHook",
|
176
|
+
"Shutdown", "Kernel", "InitializePerCore"
|
177
|
+
]
|
178
|
+
self.write_title_row(sheet, title_row)
|
179
|
+
|
180
|
+
row = 2
|
181
|
+
for region in doc.getOs().getOsMicrokernel().getMkMemoryProtection().getMkMemoryRegionList():
|
182
|
+
self.write_cell(sheet, row, 1, region.getName())
|
183
|
+
self.write_cell(sheet, row, 2, region.getMkMemoryRegionFlags(),
|
184
|
+
format={'alignment': Alignment(horizontal="center")})
|
185
|
+
self.write_cell(sheet, row, 3, self.format_boolean(region.getMkMemoryRegionInitialize()),
|
186
|
+
format={'alignment': Alignment(horizontal="center")})
|
187
|
+
self.write_cell(sheet, row, 4, self.format_boolean(region.getMkMemoryRegionGlobal()),
|
188
|
+
format={'alignment': Alignment(horizontal="center")})
|
189
|
+
self.write_cell(sheet, row, 5, self.format_boolean(region.getMkMemoryRegionInitThreadAccess()),
|
190
|
+
format={'alignment': Alignment(horizontal="center")})
|
191
|
+
self.write_cell(sheet, row, 6, self.format_boolean(region.getMkMemoryRegionIdleThreadAccess()),
|
192
|
+
format={'alignment': Alignment(horizontal="center")})
|
193
|
+
self.write_cell(sheet, row, 7, self.format_boolean(region.getMkMemoryRegionOsThreadAccess()),
|
194
|
+
format={'alignment': Alignment(horizontal="center")})
|
195
|
+
self.write_cell(sheet, row, 8, self.format_boolean(region.getMkMemoryRegionErrorHookAccess()),
|
196
|
+
format={'alignment': Alignment(horizontal="center")})
|
197
|
+
self.write_cell(sheet, row, 9, self.format_boolean(region.getMkMemoryRegionProtHookAccess()),
|
198
|
+
format={'alignment': Alignment(horizontal="center")})
|
199
|
+
self.write_cell(sheet, row, 10, self.format_boolean(region.getMkMemoryRegionShutdownHookAccess()),
|
200
|
+
format={'alignment': Alignment(horizontal="center")})
|
201
|
+
self.write_cell(sheet, row, 11, self.format_boolean(region.getMkMemoryRegionShutdownAccess()),
|
202
|
+
format={'alignment': Alignment(horizontal="center")})
|
203
|
+
self.write_cell(sheet, row, 12, self.format_boolean(region.getMkMemoryRegionKernelAccess()),
|
204
|
+
format={'alignment': Alignment(horizontal="center")})
|
205
|
+
self.write_cell(sheet, row, 13, self.format_boolean(region.getMkMemoryRegionInitializePerCore()),
|
206
|
+
format={'alignment': Alignment(horizontal="center")})
|
207
|
+
|
208
|
+
row += 1
|
209
|
+
|
210
|
+
self.logger.debug("Write MkMemoryRegion <%s>" % region.getName())
|
211
|
+
|
212
|
+
self.auto_width(sheet, {"B": 15})
|
213
|
+
|
131
214
|
def write(self, filename, doc: EBModel, options={"skip_os_task": False}):
|
132
215
|
self.logger.info("Writing <%s>" % filename)
|
133
216
|
|
@@ -137,5 +220,6 @@ class OsXdmXlsWriter(ExcelReporter):
|
|
137
220
|
self.write_os_schedule_tables(doc)
|
138
221
|
self.write_os_counters(doc)
|
139
222
|
self.write_expiry_points(doc)
|
223
|
+
self.write_mk_memory_regions(doc)
|
140
224
|
|
141
225
|
self.save(filename)
|