67 def __init__(self, context, env_var) :
68 self.env_var = env_var
69 self.workarea = os.environ.get(self.env_var)
70 if self.workarea ==
None or self.workarea ==
"":
71 sys.exit(
"ERROR: You must define %s environment variable as the root of the kernel workarea." % self.env_var);
72 if self.env_var ==
"CUSTOM_APPLICATION_PATH" :
73 self.workarea_app = self.workarea +
"/" +
"app_" + context.name
75 self.workarea_app = self.workarea +
"/apps/" + context.name +
"/app_" + context.name
76 self.create_directory(self.workarea_app)
77 self.h_file = CodeGenerate(self.workarea_app +
"/" + context.name +
'.h')
78 self.c_file = CodeGenerate(self.workarea_app +
"/" + context.name +
'.c')
79 self.concerto_file = CodeGenerate(self.workarea_app +
"/" +
'concerto.mak', header=
False)
80 self.workarea_kernel = self.workarea +
"/kernels" 83 if self.env_var ==
"CUSTOM_APPLICATION_PATH" :
84 self.include_custom_kernel_library_tests_filename = self.workarea_kernel +
"/custom_app_kernel_library_tests.h" 85 self.create_directory(self.workarea_kernel)
86 if not os.path.exists(self.include_custom_kernel_library_tests_filename):
87 print(
"Creating " + self.include_custom_kernel_library_tests_filename)
88 self.include_custom_kernel_library_tests_code = CodeGenerate(self.include_custom_kernel_library_tests_filename)
89 self.include_custom_kernel_library_tests_code.close()
91 if self.env_var ==
"CUSTOM_APPLICATION_PATH" :
92 self.tools_path_filename = self.workarea +
"/custom_tools_path.mak" 93 if not os.path.exists(self.tools_path_filename):
94 print(
"Creating " + self.tools_path_filename)
95 self.tools_path_code = CodeGenerate(self.tools_path_filename, header=
False)
96 self.tools_path_code.write_line(
"# This file can optionally be used to define environment variables which")
97 self.tools_path_code.write_line(
"# are needed by the kernel libraries defined in this folder, or can be")
98 self.tools_path_code.write_line(
"# used to overwrite environment variables from the psdk_tools_path.mak")
99 self.tools_path_code.write_line(
"# and vsdk_tools_path.mak files from the tiovx directory.")
100 self.tools_path_code.write_newline()
101 self.tools_path_code.write_line(
"# < DEVELOPER_TODO: Add any custom PATH environment variables >")
102 self.tools_path_code.close()
104 if self.env_var ==
"CUSTOM_APPLICATION_PATH" :
105 self.concerto_inc_filename = self.workarea +
"/concerto_inc.mak" 107 self.concerto_inc_filename_folder = self.workarea +
"/apps/" + context.name
108 self.concerto_inc_filename = self.concerto_inc_filename_folder +
"/concerto_inc.mak" 109 if not os.path.exists(self.concerto_inc_filename):
110 print(
"Creating " + self.concerto_inc_filename)
111 self.concerto_inc_code = CodeGenerate(self.concerto_inc_filename, header=
False)
112 self.concerto_inc_code.write_line(
"# This file contains a list of extension kernel specific static libraries")
113 self.concerto_inc_code.write_line(
"# to be included in the PC executables. It is put in this separate file")
114 self.concerto_inc_code.write_line(
"# to make it easier to add/extend kernels without needing to modify")
115 self.concerto_inc_code.write_line(
"# several concerto.mak files which depend on kernel libraries.")
116 self.concerto_inc_code.write_newline()
117 self.concerto_inc_code.write_line(
"STATIC_LIBS += vx_conformance_engine")
118 self.concerto_inc_code.write_line(
"# < DEVELOPER_TODO: Add any additional dependent libraries >")
119 self.concerto_inc_code.close()
121 self.context = context
122 self.context_code = ContextCode(context)
124 def create_directory(self, directory):
125 self.directory = directory
126 if not os.path.exists(self.directory):
127 print(
"Creating " + self.directory)
128 os.makedirs(self.directory)
130 def generate_h_code(self) :
131 self.h_file.write_ifndef_define(self.context.name.upper())
132 self.h_file.write_include(
"VX/vx.h")
133 self.h_file.write_include(
"TI/tivx.h")
134 self.h_file.write_newline()
135 self.h_file.write_line(
'typedef struct _%s_t *%s;' % (self.context.name, self.context.name))
136 self.h_file.write_newline()
137 self.h_file.write_line(
'typedef struct _%s_t' % self.context.name)
138 self.h_file.write_open_brace()
139 self.context_code.declare_var(self.h_file)
140 self.h_file.write_close_brace(
' %s_t;' % self.context.name)
141 self.h_file.write_newline()
142 self.generate_declare_data_function(
"create")
143 self.generate_declare_data_function(
"delete")
144 self.h_file.write_newline()
145 for graph
in self.context.graph_list :
146 self.generate_declare_graph_functions(graph)
147 self.generate_declare_usecase_function(
"create")
148 self.generate_declare_usecase_function(
"delete")
149 self.generate_declare_usecase_function(
"verify")
150 self.generate_declare_usecase_function(
"run")
151 self.h_file.write_newline()
152 self.h_file.write_endif(self.context.name.upper())
155 def generate_declare_usecase_function(self, function_name) :
156 self.h_file.write_line(
"vx_status %s_%s(%s usecase);" % (self.context.name, function_name, self.context.name) )
158 def generate_declare_data_function(self, function_name) :
159 self.h_file.write_line(
"vx_status %s_data_%s(%s usecase);" % (self.context.name, function_name, self.context.name) )
161 def generate_declare_graph_functions(self, graph) :
162 self.h_file.write_line(
"vx_status %s_%s_create(%s usecase);" % (self.context.name, graph.name, self.context.name) )
163 self.h_file.write_line(
"vx_status %s_%s_delete(%s usecase);" % (self.context.name, graph.name, self.context.name) )
164 self.h_file.write_line(
"vx_status %s_%s_verify(%s usecase);" % (self.context.name, graph.name, self.context.name) )
165 self.h_file.write_line(
"vx_status %s_%s_run(%s usecase);" % (self.context.name, graph.name, self.context.name) )
166 self.h_file.write_newline()
168 def generate_define_node_code(self) :
169 for node
in self.context.node_list :
170 NodeCode(node).define_create(self.c_file)
172 def generate_main_code(self) :
173 self.c_file.write_line(
"/**")
174 self.c_file.write_line(
" * Main function")
175 self.c_file.write_line(
" *")
176 self.c_file.write_line(
" */")
177 self.c_file.write_line(
"int main(int argc, char* argv[])")
178 self.c_file.write_open_brace()
179 self.c_file.write_define_status()
180 self.c_file.write_newline()
181 self.c_file.write_line(
"%s_t uc;" % self.context.name)
182 self.c_file.write_newline()
183 self.c_file.write_line(
"tivxInit();")
184 self.c_file.write_newline()
185 self.c_file.write_line(
"status = %s_create(&uc);" % self.context.name)
186 self.c_file.write_newline()
187 self.c_file.write_if_status()
188 self.c_file.write_open_brace()
189 self.c_file.write_line(
"status = %s_verify(&uc);" % self.context.name)
190 self.c_file.write_close_brace()
191 self.c_file.write_newline()
192 self.c_file.write_if_status()
193 self.c_file.write_open_brace()
194 self.c_file.write_line(
"status = %s_run(&uc);" % self.context.name)
195 self.c_file.write_close_brace()
196 self.c_file.write_newline()
197 self.c_file.write_if_status()
198 self.c_file.write_open_brace()
199 self.c_file.write_line(
"status = %s_delete(&uc);" % self.context.name)
200 self.c_file.write_close_brace()
201 self.c_file.write_newline()
202 self.c_file.write_line(
"tivxDeInit();")
203 self.c_file.write_newline()
204 self.c_file.write_line(
"return 0;")
205 self.c_file.write_close_brace()
206 self.c_file.write_newline()
208 def generate_create_graph_code(self, graph):
209 self.c_file.write_line(
"vx_status %s_%s_create(%s usecase)" % (self.context.name, graph.name, self.context.name) )
210 self.c_file.write_open_brace()
211 self.c_file.write_define_status();
212 self.c_file.write_newline()
213 self.c_file.write_line(
"vx_graph graph = usecase->%s;" % graph.name)
214 self.c_file.write_newline()
215 GraphCode(graph).call_create(self.c_file)
216 self.c_file.write_if_status();
217 self.c_file.write_open_brace();
218 GraphCode(graph).set_ref_name(self.c_file)
219 self.c_file.write_close_brace()
220 self.c_file.write_newline()
221 self.c_file.write_line(
"return status;")
222 self.c_file.write_close_brace()
223 self.c_file.write_newline()
225 def generate_delete_graph_code(self, graph):
226 self.c_file.write_line(
"vx_status %s_%s_delete(%s usecase)" % (self.context.name, graph.name, self.context.name) )
227 self.c_file.write_open_brace()
228 self.c_file.write_define_status();
229 self.c_file.write_newline()
230 self.c_file.write_line(
"vx_graph graph = usecase->%s;" % (graph.name))
231 self.c_file.write_newline()
232 GraphCode(graph).call_delete(self.c_file)
233 self.c_file.write_line(
"usecase->%s = graph;" % (graph.name))
234 self.c_file.write_newline()
235 self.c_file.write_line(
"return status;")
236 self.c_file.write_close_brace()
237 self.c_file.write_newline()
239 def generate_verify_graph_code(self, graph):
240 self.c_file.write_line(
"vx_status %s_%s_verify(%s usecase)" % (self.context.name, graph.name, self.context.name) )
241 self.c_file.write_open_brace()
242 self.c_file.write_define_status();
243 self.c_file.write_newline()
244 self.c_file.write_line(
"vx_graph graph = usecase->%s;" % (graph.name))
245 self.c_file.write_newline()
246 GraphCode(graph).call_verify(self.c_file)
247 self.c_file.write_line(
"return status;")
248 self.c_file.write_close_brace()
249 self.c_file.write_newline()
251 def generate_run_graph_code(self, graph):
252 self.c_file.write_line(
"vx_status %s_%s_run(%s usecase)" % (self.context.name, graph.name, self.context.name) )
253 self.c_file.write_open_brace()
254 self.c_file.write_define_status();
255 self.c_file.write_newline()
256 self.c_file.write_line(
"vx_graph graph = usecase->%s;" % (graph.name))
257 self.c_file.write_newline()
258 GraphCode(graph).call_run(self.c_file)
259 self.c_file.write_line(
"return status;")
260 self.c_file.write_close_brace()
261 self.c_file.write_newline()
263 def generate_create_usecase_code(self) :
264 self.c_file.write_line(
"vx_status %s_create(%s usecase)" % (self.context.name, self.context.name) )
265 self.c_file.write_open_brace()
266 self.c_file.write_define_status();
267 self.c_file.write_newline()
268 self.c_file.write_line(
"memset(usecase, 0, sizeof(%s_t));" % self.context.name);
269 self.c_file.write_newline();
270 self.c_file.write_if_status();
271 self.c_file.write_open_brace()
272 self.c_file.write_line(
"usecase->context = vxCreateContext();")
273 self.c_file.write_line(
"if (usecase->context == NULL)");
274 self.c_file.write_open_brace()
275 self.c_file.write_line(
"status = VX_ERROR_NO_RESOURCES;");
276 self.c_file.write_close_brace()
277 self.c_file.write_close_brace()
278 self.c_file.write_newline();
279 self.c_file.write_line(
"/* < DEVELOPER_TODO: (Optional) Load any custom kernel modules needed for this use case > */")
280 self.c_file.write_newline();
281 for graph
in self.context.graph_list:
283 self.c_file.write_if_status();
284 self.c_file.write_open_brace()
285 self.c_file.write_line(
"usecase->%s = vxCreateGraph(usecase->context);" % graph.name)
286 self.c_file.write_line(
"if (usecase->%s == NULL)" % graph.name);
287 self.c_file.write_open_brace()
288 self.c_file.write_line(
"status = VX_ERROR_NO_RESOURCES;");
289 self.c_file.write_close_brace()
290 self.c_file.write_close_brace()
291 self.c_file.write_if_status();
292 self.c_file.write_open_brace()
293 self.c_file.write_line(
"status = %s_data_create(usecase);" % (self.context.name) )
294 self.c_file.write_close_brace()
296 for graph
in self.context.graph_list :
297 self.c_file.write_if_status();
298 self.c_file.write_open_brace()
299 self.c_file.write_line(
"status = %s_%s_create(usecase);" % (self.context.name, graph.name) )
300 self.c_file.write_close_brace()
302 self.c_file.write_newline()
303 self.c_file.write_line(
"return status;")
304 self.c_file.write_close_brace()
305 self.c_file.write_newline()
307 def generate_delete_usecase_code(self):
308 self.c_file.write_line(
"vx_status %s_delete(%s usecase)" % (self.context.name, self.context.name) )
309 self.c_file.write_open_brace()
310 self.c_file.write_define_status();
311 self.c_file.write_newline()
313 for graph
in self.context.graph_list :
314 self.c_file.write_if_status();
315 self.c_file.write_open_brace()
316 self.c_file.write_line(
"status = %s_%s_delete(usecase);" % (self.context.name, graph.name) )
317 self.c_file.write_close_brace()
319 self.c_file.write_if_status();
320 self.c_file.write_open_brace()
321 self.c_file.write_line(
"status = %s_data_delete(usecase);" % (self.context.name) )
322 self.c_file.write_close_brace()
324 self.c_file.write_newline();
325 self.c_file.write_line(
"/* < DEVELOPER_TODO: (Optional) Unload any custom kernel modules needed for this use case >*/")
326 self.c_file.write_newline();
328 self.c_file.write_if_status();
329 self.c_file.write_open_brace()
330 self.c_file.write_line(
"status = vxReleaseContext(&usecase->context);" )
331 self.c_file.write_close_brace()
333 self.c_file.write_newline()
334 self.c_file.write_line(
"return status;")
335 self.c_file.write_close_brace()
336 self.c_file.write_newline()
338 def generate_usecase_function_code(self, function_name):
339 self.c_file.write_line(
"vx_status %s_%s(%s usecase)" % (self.context.name, function_name, self.context.name) )
340 self.c_file.write_open_brace()
341 self.c_file.write_define_status();
342 self.c_file.write_newline()
344 for graph
in self.context.graph_list :
345 self.c_file.write_if_status();
346 self.c_file.write_open_brace()
347 self.c_file.write_line(
"status = %s_%s_%s(usecase);" % (self.context.name, graph.name, function_name) )
348 self.c_file.write_close_brace()
350 if (function_name==
"delete") :
351 self.c_file.write_if_status();
352 self.c_file.write_open_brace()
353 self.c_file.write_line(
"status = %s_data_%s(usecase);" % (self.context.name, function_name) )
354 self.c_file.write_close_brace()
356 self.c_file.write_newline()
357 self.c_file.write_line(
"return status;")
358 self.c_file.write_close_brace()
359 self.c_file.write_newline()
361 def generate_create_data_code(self) :
362 self.c_file.write_line(
"vx_status %s_data_create(%s usecase)" % (self.context.name, self.context.name) )
363 self.c_file.write_open_brace()
364 self.c_file.write_define_status();
365 self.c_file.write_newline()
366 self.c_file.write_line(
"vx_context context = usecase->context;")
367 self.c_file.write_newline()
368 for data
in self.context.data_list :
369 ContextCode.get_data_code_obj(data).call_create(self.c_file)
370 self.c_file.write_newline()
371 self.c_file.write_line(
"return status;")
372 self.c_file.write_close_brace()
373 self.c_file.write_newline()
375 def generate_delete_data_code(self) :
376 self.c_file.write_line(
"vx_status %s_data_delete(%s usecase)" % (self.context.name, self.context.name) )
377 self.c_file.write_open_brace()
378 self.c_file.write_define_status();
379 self.c_file.write_newline()
380 for data
in self.context.data_list :
381 self.c_file.write_if_status();
382 self.c_file.write_open_brace()
383 if data.type != Type.NULL :
384 self.c_file.write_line(
"status = vxReleaseReference((vx_reference*)&usecase->%s);" % (data.name) )
385 self.c_file.write_close_brace()
386 self.c_file.write_newline()
387 self.c_file.write_line(
"return status;")
388 self.c_file.write_close_brace()
389 self.c_file.write_newline()
391 def generate_c_code(self) :
392 self.c_file.write_include(self.context.name +
'.h')
393 self.c_file.write_line(
"/* < DEVELOPER_TODO: (Optional) Include any custom kernel module header files needed for this use case >*/")
394 self.c_file.write_newline();
395 self.c_file.write_newline()
396 self.generate_create_usecase_code()
397 self.generate_usecase_function_code(
"verify")
398 self.generate_usecase_function_code(
"run")
399 self.generate_delete_usecase_code()
400 self.generate_create_data_code()
401 self.generate_delete_data_code()
402 self.generate_define_node_code()
403 for graph
in self.context.graph_list :
404 self.generate_create_graph_code(graph)
405 self.generate_delete_graph_code(graph)
406 self.generate_verify_graph_code(graph)
407 self.generate_run_graph_code(graph)
408 self.generate_main_code()
411 def generate_concerto(self) :
412 if self.env_var ==
"VISION_APPS_PATH" :
413 self.concerto_file.write_line(
"ifeq ($(TARGET_PLATFORM),PC)")
414 self.concerto_file.write_newline()
415 self.concerto_file.write_line(
"include $(PRELUDE)")
416 self.concerto_file.write_line(
"TARGET := vx_app_%s" % self.context.name)
417 self.concerto_file.write_line(
"TARGETTYPE := exe")
418 self.concerto_file.write_line(
"CSOURCES := $(call all-c-files)")
419 self.concerto_file.write_newline()
420 self.concerto_file.write_line(
"include $(VISION_APPS_PATH)/apps/concerto_inc.mak")
421 self.concerto_file.write_line(
"include $(VISION_APPS_PATH)/apps/%s/concerto_inc.mak" % self.context.name)
422 self.concerto_file.write_newline()
423 self.concerto_file.write_line(
"include $(FINALE)")
424 self.concerto_file.write_newline()
425 self.concerto_file.write_line(
"endif")
426 self.concerto_file.close()
428 self.concerto_file.write_line(
"include $(PRELUDE)")
429 self.concerto_file.write_line(
"TARGET := vx_app_%s" % self.context.name)
430 self.concerto_file.write_line(
"TARGETTYPE := exe")
431 self.concerto_file.write_line(
"CSOURCES := $(call all-c-files)")
432 self.concerto_file.write_newline()
433 self.concerto_file.write_line(
"IDIRS += $(TIOVX_PATH)/utils/include")
434 self.concerto_file.write_line(
"# < DEVELOPER_TODO: Add any custom IDIRS paths, similar to below: >")
435 self.concerto_file.write_line(
"# IDIRS += $(CUSTOM_APPLICATION_PATH)/kernels/<module>/include")
436 self.concerto_file.write_newline()
437 self.concerto_file.write_newline()
438 self.concerto_file.write_line(
"include $(HOST_ROOT)/kernels/concerto_inc.mak")
439 self.concerto_file.write_newline()
440 self.concerto_file.write_line(
"STATIC_LIBS += vx_vxu vx_framework")
441 self.concerto_file.write_line(
"STATIC_LIBS += vx_platform_pc vx_framework")
442 self.concerto_file.write_line(
"STATIC_LIBS += vx_kernels_openvx_core vx_target_kernels_openvx_core")
443 self.concerto_file.write_newline()
444 self.concerto_file.write_line(
"ifeq ($(BUILD_TUTORIAL),yes)")
445 self.concerto_file.write_line(
"STATIC_LIBS += vx_target_kernels_tutorial")
446 self.concerto_file.write_line(
"endif")
447 self.concerto_file.write_newline()
448 self.concerto_file.write_line(
"ifeq ($(BUILD_BAM),yes)")
449 self.concerto_file.write_line(
"STATIC_LIBS += vx_target_kernels_openvx_core_bam vx_target_kernels_openvx_core")
450 self.concerto_file.write_line(
"endif")
451 self.concerto_file.write_newline()
452 self.concerto_file.write_line(
"STATIC_LIBS += vx_kernels_host_utils")
453 self.concerto_file.write_line(
"STATIC_LIBS += vx_kernels_target_utils")
454 self.concerto_file.write_line(
"STATIC_LIBS += vx_framework")
455 self.concerto_file.write_line(
"ifeq ($(BUILD_BAM),yes)")
456 self.concerto_file.write_line(
"STATIC_LIBS += vxlib_bamplugin_$(TARGET_CPU)")
457 self.concerto_file.write_line(
"endif")
458 self.concerto_file.write_line(
"STATIC_LIBS += vxlib_$(TARGET_CPU) c6xsim_$(TARGET_CPU)_C66")
459 self.concerto_file.write_line(
"SYS_SHARED_LIBS += rt")
460 self.concerto_file.write_line(
"ifeq ($(BUILD_BAM),yes)")
461 self.concerto_file.write_line(
"STATIC_LIBS += algframework_$(TARGET_CPU) dmautils_$(TARGET_CPU)")
462 self.concerto_file.write_line(
"endif")
463 self.concerto_file.write_newline()
464 self.concerto_file.write_line(
"include $(FINALE)")
465 self.concerto_file.close()
468 if self.env_var ==
"CUSTOM_APPLICATION_PATH" :
469 self.todo_filename = self.workarea +
"/DEVELOPER_TODO.txt" 471 self.todo_filename = self.concerto_inc_filename_folder +
"/DEVELOPER_TODO.txt" 472 print(
"Creating " + self.todo_filename)
473 self.todo_code = CodeGenerate(self.todo_filename, header=
False)
479 self.todo_code.write_line(
"# This file lists the places in the generated code where the developer is expected")
480 self.todo_code.write_line(
"# to add custom code beyond what the script can generate. This is generated as ")
481 self.todo_code.write_line(
"# part of the KernelExportCode.export() function, but may also be called independently ")
482 self.todo_code.write_line(
"# by calling the KernelExportCode.todo() function with the requirement that the ")
483 self.todo_code.write_line(
"# "+self.env_var+
" environment variable is defined. This function simply searches")
484 self.todo_code.write_line(
"# for the \"< DEVELOPER_TODO ...>\" string in all the files from this path, and lists them.")
485 self.todo_code.write_line(
"# Removing the \"< DEVELOPER_TODO ...>\" comment block from the files will effectively remove those")
486 self.todo_code.write_line(
"# lines from showing up in this file the next time KernelExportCode.todo() is run.")
487 if self.env_var ==
"CUSTOM_APPLICATION_PATH" :
488 self.all_files = [y
for x
in os.walk(self.workarea)
for y
in glob(os.path.join(x[0],
'*.*'))]
490 self.all_files = [y
for x
in os.walk(self.concerto_inc_filename_folder)
for y
in glob(os.path.join(x[0],
'*.*'))]
491 for file
in self.all_files :
492 with open(file,
'rb')
as f:
493 for num, line
in enumerate(f, 1):
494 if 'DEVELOPER_TODO'.encode()
in line:
495 if '>'.encode()
in line:
499 self.modLine = re.sub(
"^.*?DEVELOPER_TODO:".encode(),
"".encode(), line)
500 self.modLine = re.sub(
"^\s+".encode(),
"".encode(), self.modLine)
501 self.modLine = re.sub(
"\*\/".encode(),
"".encode(), self.modLine)
502 self.modLine = re.sub(
">".encode(),
"".encode(), self.modLine)
503 if self.fileName != file :
504 self.todo_code.write_line(
"\n" + file, new_line=
False)
505 self.todo_code.write_line(
"\n " + str(num) +
": " + self.modLine.decode(
'utf-8'), new_line=
False)
509 if '>'.encode()
in line :
511 self.modLine = re.sub(
"^.*?DEVELOPER_TODO:".encode(),
"".encode(), line)
512 self.modLine = re.sub(
"#".encode(),
"".encode(), self.modLine)
513 self.modLine = re.sub(
"\/\/".encode(),
"".encode(), self.modLine)
514 self.modLine = re.sub(
"\/\*".encode(),
"".encode(), self.modLine)
515 self.modLine = re.sub(
"\*\/".encode(),
"".encode(), self.modLine)
516 self.modLine = re.sub(
"^\s+".encode(),
"".encode(), self.modLine)
517 self.modLine = re.sub(
">".encode(),
"".encode(), self.modLine)
518 self.todo_code.write_line(
" " + str(num) +
": " + self.modLine.decode(
'utf-8'), new_line=
False)
520 self.todo_code.close()
522 def generate_code(self) :
523 self.generate_h_code()
524 self.generate_c_code()
525 self.generate_concerto()
def __init__(self, thr_type, data_type, name="default")
Constructor used to create this object.