winIDEA SDK
trace_controller.py
1# This script is licensed under BSD License, see file LICENSE.txt.
2#
3# (c) TASKING Germany GmbH, 2023
4
5"""
6This script demonstrates usage of trace with isystem.connect API.
7"""
8
9from __future__ import print_function
10
11import os
12import time
13import isystem.connect as ic
14
15winidea_id = ''
16
17
18print('isystem.connect version: ' + ic.getModuleVersion())
19
20
21def initTarget(cmgr):
22
23 debugCtrl = ic.CDebugFacade(cmgr)
24
25 debugCtrl.download()
26 debugCtrl.runUntilFunction("main")
27 debugCtrl.waitUntilStopped()
28
29 return debugCtrl
30
31
32def recordTrace(debugCtrl, traceDoc):
33
34 # We could use existing predefined trigger, but
35 # let's try to create a new one. First we have to make sure, that
36 # the trigger does not already exist.
37 traceDoc.removeTrigger('testTraceTrigger')
38 triggerIdx = traceDoc.createTrigger('testTraceTrigger')
39
40 # make the created trigger the active one
41 traceDoc.select(triggerIdx)
42
43 # configure trace with wizard
44 traceCfgWizard = ic.CTraceConfigWizard.createCodeExecTrigger('test_fibonacci')
45
46 # Uncomment the following line to set a data access trigger
47 # traceCfgWizard = ic.CTraceConfigWizard.createDataAccessTrigger('main_loop_counter',
48 # True, '',
49 # ic.CTraceConfigWizard.EWrite)
50
51 # Uncomment the following line to set AUX state trigger
52 #traceCfgWizard = ic.CTraceConfigWizard.createAUXStateTrigger(0xfe, 0x5a)
53
54 traceDoc.applyTriggerWizard(traceCfgWizard, triggerIdx)
55
56 # decrease the default buffer size. 1 Mb is enough for demo.
57 traceDoc.setTriggerOption(triggerIdx, 'HW.Recorder.BufferSize', '1 MB')
58
59 print('Target is running, trace_doc is recording data...')
60 traceDoc.start()
61 debugCtrl.run()
62 time.sleep(1)
63 debugCtrl.stop()
64
65 print('Target stopped, loading trace data...')
66 traceDoc.waitUntilLoaded()
67
68
69def recordTraceAdvanced(debugCtrl, traceDoc):
70 traceDoc.removeTrigger('testTraceTrigger')
71 triggerIdx = traceDoc.createTrigger('testTraceTrigger')
72 traceDoc.select(triggerIdx)
73
74 # configure trace with wizard
75 traceCfgWizard = ic.CTraceConfigWizard.createImmediateTrigger()
76 traceCfgWizard.setRecordingContent(ic.CTraceConfigWizard.ERecordProgramFlow,
77 'test_fibonacci',
78 'test_fibonacci',
79 ic.CTraceConfigWizard.EReadWrite)
80
81 traceDoc.applyTriggerWizard(traceCfgWizard, triggerIdx)
82
83 # decrease the default buffer size. 1 Mb is enough for demo.
84 traceDoc.setTriggerOption(triggerIdx, 'HW.Recorder.BufferSize', '1 MB')
85
86 print('Target is running, trace_doc is recording data...')
87 traceDoc.start()
88 debugCtrl.run()
89 time.sleep(3)
90 debugCtrl.stop()
91
92 print('Target stopped, loading trace data...')
93 traceDoc.waitUntilLoaded()
94
95
96def exportTrace(traceDoc):
97
98 exportCfg = ic.CTraceExportConfig()
99 print(exportCfg.toString())
100
101 print('-------------------------\nWriting export file in XML format with default settings:\n')
102 formatter = ic.CTraceXMLExportFormat()
103 exportCfg.setFileName('traceSample-default.xml') \
104 .setFormatter(formatter)
105 traceDoc.exportData(exportCfg)
106
107 print('-------------------------\nWriting export file in binary format with full contents:\n')
108 formatter = ic.CTraceBinExportFormat()
109 # It is highly recommended to use header version 2, because
110 # this way file format is described in the header.
111 formatter.setTraceItemFlags(0) # resets all trace item flags
112 formatter.setHeader(True) \
113 .setHeaderVersion(ic.CTraceBinExportFormat.EHeaderVer2) \
114 .addTraceItem(ic.CTraceBinExportFormat.EPresenceFlagsItem) \
115 .addTraceItem(ic.CTraceBinExportFormat.EDataItem) \
116 .addTraceItem(ic.CTraceBinExportFormat.EAddressItem) \
117 .addTraceItem(ic.CTraceBinExportFormat.EMemAreaItem) \
118 .addTraceItem(ic.CTraceBinExportFormat.ETimeStampItem) \
119 .addTraceItem(ic.CTraceBinExportFormat.ETraceSourceIdItem) \
120 .addTraceItem(ic.CTraceBinExportFormat.EBusStatusItem) \
121 .addTraceItem(ic.CTraceBinExportFormat.ESampleIndexItem) \
122 .addTraceItem(ic.CTraceBinExportFormat.EOCDItem) \
123 .addTraceItem(ic.CTraceBinExportFormat.EAUXItem)
124
125 exportCfg.setFileName('traceSample-full.bin') \
126 .setFormatter(formatter)
127
128 startTime = time.time()
129 traceDoc.exportData(exportCfg)
130 print('t[s] = ', time.time() - startTime, ' ', exportCfg.getFileName())
131
132 print('-------------------------\nWriting export file in XML format with '
133 + 'customized settings (same info as bin export):\n')
134 formatter = ic.CTraceXMLExportFormat()
135 formatter.setIndex(True) \
136 .setTime(True) \
137 .setTraceSourceId(True) \
138 .setAddress(True) \
139 .setMemArea(True) \
140 .setData(True) \
141 .setDasm(True) \
142 .setDasmData(False) \
143 .setDasmAddress(False) \
144 .setFunction(False) \
145 .setLabel(False) \
146 .setActivity(False) \
147 .setBusStatus(False)
148
149 exportCfg.setFileName('traceSample-customized.xml') \
150 .setFormatter(formatter)
151
152 startTime = time.time()
153 traceDoc.exportData(exportCfg)
154 print('t[s] = ', time.time() - startTime, ' ', exportCfg.getFileName())
155
156
157def parse(trace_doc: ic.CTraceController):
158 # export and print trace binary data
159 binTraceData = ic.CTraceData.createInstance(trace_doc,
160 'traceSample-full.bin',
161 -12000, -11000,
162 True)
163
164 warnings = binTraceData.getParserWarnings()
165 if warnings:
166 print('WARNING(S) (bin): ', warnings)
167
168 binExportFromFile = binTraceData.getBinaryExportConfig()
169 print('header version: ', binExportFromFile.getHeaderVersionAsStr())
170 print('is data: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EDataItem))
171 print('is address: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EAddressItem))
172 print('is mem area: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EMemAreaItem))
173 print('is time: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.ETimeStampItem))
174 print('is source ID: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.ETraceSourceIdItem))
175 print('is bus status: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EBusStatusItem))
176 print('is index: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.ESampleIndexItem))
177 print('is OCD: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EOCDItem))
178 print('is AUX: ', binExportFromFile.isTraceItem(ic.CTraceBinExportFormat.EAUXItem))
179
180
181 binIter = binTraceData.getTimelineIterator()
182
183 print("Binary export:")
184 while binIter.hasNext():
185 binEvent = binIter.next()
186 print(binEvent.toString(), '\n')
187
188 binTraceData.closeParser()
189
190 # export and print XML trace data
191 print("\n\n\n---------------------------------------------------\n\nXML export:\n")
192
193 xmlTraceData = ic.CTraceData.createInstance(trace_doc,
194 'traceSample-default.xml',
195 11000, 12000,
196 False)
197
198 warnings = xmlTraceData.getParserWarnings()
199 if warnings:
200 print('WARNING(S) (bin): ', warnings)
201
202
203 xmlIter = xmlTraceData.getTimelineIterator()
204 while xmlIter.hasNext():
205 xmlEvent = xmlIter.next()
206 print(xmlEvent.toString(), '\n')
207
208 xmlTraceData.closeParser()
209
210
211def printStatus(doc):
212 status = doc.getStatus()
213
214 print('Status after tracing:')
215 print('Was there an error?', status.isErrorInBuffer())
216 print('Was there a buffer overrun?', status.isBufferOverrun())
217 print('Was there a recording error?', status.isRecordingError())
218 print('Was there an error?', status.isError() )
219 print('Full status:')
220 print(status.toString())
221
222
223# main
224cmgr = ic.ConnectionMgr()
225cmgr.connect(ic.CConnectionConfig().instanceId(winidea_id))
226
227debugCtrl = initTarget(cmgr)
228
229# create trace document and record
230traceDoc = ic.CTraceController(cmgr, 'sample_trace.trd', 'w')
231recordTrace(debugCtrl, traceDoc)
232
233exportTrace(traceDoc)
234parse(traceDoc)
235
236printStatus(traceDoc)
237
238print("Recording trace with custom range setting...")
239recordTraceAdvanced(debugCtrl, traceDoc)
240exportCfg = ic.CTraceExportConfig()
241exportCfg.setFileName('traceAdvanced.xml')
242traceDoc.exportData(exportCfg)