202 def __init__(self, module="ext1", core="c66", env_var='VISION_APPS_PATH', include_subpath="TI", include_filename="") :
205 if type(module)
is Module :
206 self.
module = module.value
208 print(
"WARNING: module argument should use the Module class to avoid potential name clashes")
209 self.
module = module.lower()
210 if include_filename :
214 if type(core)
is Core :
215 self.
core = core.value
216 elif type(core)
is str :
217 print(
"WARNING: core argument should use the Core class to avoid potential name clashes")
220 sys.exit(
"core argument has invalid type.")
225 if module == Module.TEST_KERNELS:
226 self.
idirs_path =
"$(HOST_ROOT)/conformance_tests/kernels" 231 print(
"ERROR: You must define %s environment variable as the root of the kernel workarea." % self.
env_var);
232 sys.exit(
"Try typing “export CUSTOM_APPLICATION_PATH=<path to where you want the output kernels generated>” in your terminal window and try again.");
234 if self.
env_var ==
'CUSTOM_KERNEL_PATH':
239 def getDataColor(self, ref) :
242 def outputData(self, data) :
243 self.
file.write(
' %s [color=%s, style=filled]\n' % (data.name_lower, self.
getDataColor(data)))
245 def outputDataList(self, kernel) :
246 self.
file.write(
'\n')
247 self.
file.write(
' /* DATA OBJECTS */\n')
248 for ref
in kernel.params :
250 self.
file.write(
'\n')
252 def getTargetColor(self, target) :
253 if target == Target.DSP1 :
255 if target == Target.DSP2 :
256 return "darkturquoise" 257 if target == Target.MCU2_0 :
259 if target == Target.MCU2_1 :
263 def outputNode(self, kernel) :
265 self.
file.write(
' %s [label=\"%s\", color=%s, style=filled]\n' % (kernel.name_lower, kernel.name_lower, self.
getTargetColor(kernel.targets[0])) )
267 self.
file.write(
' %s [label=\"%s\", color=%s, style=filled]\n' % (kernel.name_lower, kernel.name_lower, self.
getTargetColor(
"white")) )
269 def outputNodeList(self, kernel) :
270 self.
file.write(
'\n')
271 self.
file.write(
' /* NODE OBJECTS */\n')
273 self.
file.write(
'\n')
275 def outputNodeConnection(self, kernel) :
277 for prm
in kernel.params :
278 if prm.direction == Direction.INPUT :
279 self.
file.write(
' %s -> %s [taillabel=%d, labeldistance=3]\n' % (prm.name_lower, kernel.name_lower, idx))
281 self.
file.write(
' %s -> %s [headlabel=%d, labeldistance=3]\n' % (kernel.name_lower, prm.name_lower, idx))
284 def outputNodeConnectionList(self, kernel) :
285 self.
file.write(
'\n')
286 self.
file.write(
' /* NODE CONNECTIONS */\n')
288 self.
file.write(
'\n')
293 print (
'Generating image from OpenVX kernel ...')
295 self.
filename = kernel.name_lower +
"_img.txt" 300 self.
file.write(
'digraph %s {\n' % kernel.name_lower)
301 self.
file.write(
'\n')
302 self.
file.write(
' label = \"%s\"\n' % kernel.name_lower)
306 self.
file.write(
'\n')
307 self.
file.write(
'}\n')
313 print(
'Executing dot tool command ... [' + command_str +
']')
314 subprocess.call(command_args)
315 print (
'Generating image from OpenVX context ... DONE !!!')
316 except FileNotFoundError:
317 print(
'ERROR: \'dot\' tool not found. Make sure \'graphviz\' is installed and \'dot\' command is added to system PATH !!!')
318 print(
'ERROR: Cannot generate .jpg file !!!')
321 def setCompanyDirectory(self, company) :
324 def setTopHeaderName(self, header) :
327 def setModuleDirectory(self, module) :
328 if type(module)
is Module :
329 self.
module = module.value
330 elif type(core)
is str :
334 def setCoreDirectory(self, core) :
335 if type(core)
is Core :
336 self.
core = core.value
337 elif type(core)
is str :
340 sys.exit(
"core argument has invalid type.")
342 def create_all_directories(self):
345 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
355 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
362 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
382 def create_directory(self, directory):
388 def generate_h_file_code(self):
391 self.
h_code.write_ifndef_define(
"_" + self.
kernel.enum_str_prefix + self.
kernel.name_upper +
"_")
392 self.
h_code.write_extern_c_top()
393 self.
h_code.write_newline();
394 for prm
in self.
kernel.params :
395 self.
h_code.write_line(
"#define %s%s_%s_IDX (%dU)" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper, prm.index))
396 self.
h_code.write_newline();
397 self.
h_code.write_line(
"#define %s%s_MAX_PARAMS (%dU)" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper, len(self.
kernel.params)))
398 self.
h_code.write_newline();
399 self.
h_code.write_extern_c_bottom()
400 self.
h_code.write_newline()
401 self.
h_code.write_endif(
"_" + self.
kernel.enum_str_prefix + self.
kernel.name_upper +
"_")
404 def generate_host_c_add_func_code(self):
405 self.
host_c_code.write_line(
"vx_status tivxAddKernel%s(vx_context context)" % (self.
kernel.name_camel))
412 self.
host_c_code.write_line(
"status = vxAllocateUserKernelId(context, &kernel_id);")
413 self.
host_c_code.write_line(
"if(status != (vx_status)VX_SUCCESS)")
415 self.
host_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate user kernel ID\\n\");")
420 self.
host_c_code.write_line(
"kernel = vxAddUserKernel(");
426 self.
host_c_code.write_line(
" tivxAddKernel%sValidate," % (self.
kernel.name_camel) )
427 self.
host_c_code.write_line(
" tivxAddKernel%sInitialize," % (self.
kernel.name_camel) )
430 self.
host_c_code.write_line(
"status = vxGetStatus((vx_reference)kernel);")
436 for prm
in self.
kernel.params :
437 if prm != self.
kernel.params[0] :
440 self.
host_c_code.write_line(
"status = vxAddParameterToKernel(kernel,")
442 self.
host_c_code.write_line(
" (vx_enum)%s," % (Direction.get_vx_enum_name(prm.direction)) )
443 if Type.is_scalar_type(prm.type) :
444 self.
host_c_code.write_line(
" (vx_enum)VX_TYPE_SCALAR,")
446 self.
host_c_code.write_line(
" (vx_enum)%s," % (Type.get_vx_enum_name(prm.type)) )
447 self.
host_c_code.write_line(
" (vx_enum)%s" % (ParamState.get_vx_enum_name(prm.state)) )
454 self.
host_c_code.write_comment_line(
"add supported target's")
455 for target
in self.
kernel.targets :
456 self.
host_c_code.write_line(
"tivxAddKernelTarget(kernel, %s);" % (Target.get_vx_enum_name(target)))
461 self.
host_c_code.write_line(
"status = vxFinalizeKernel(kernel);")
464 self.
host_c_code.write_line(
"if (status != (vx_status)VX_SUCCESS)")
466 self.
host_c_code.write_line(
"vxReleaseKernel(&kernel);")
481 def generate_host_c_remove_func_code(self):
482 self.
host_c_code.write_line(
"vx_status tivxRemoveKernel%s(vx_context context)" % (self.
kernel.name_camel))
485 self.
host_c_code.write_line(
"vx_kernel kernel = vx_%s_kernel;" % self.
kernel.name_lower)
487 self.
host_c_code.write_line(
"status = vxRemoveKernel(kernel);")
494 def verify_parameter_relationship_items(self, relationship_list, prm, attribute, name) :
495 for rel
in relationship_list :
496 if prm
in rel.prm_list :
497 if attribute
in rel.attribute_list :
500 for local_name
in rel.attribute_list :
501 if local_name.name == name :
503 if attribute == ImageAttribute.FORMAT :
505 elif attribute == UserDataObjectAttribute.NAME :
507 elif attribute == UserDataObjectAttribute.SIZE :
509 elif attribute == ArrayAttribute.ITEMSIZE :
511 elif attribute == ArrayAttribute.ITEMTYPE :
513 elif attribute == PyramidAttribute.FORMAT :
515 elif attribute == MatrixAttribute.TYPE :
517 elif attribute == LutAttribute.TYPE :
522 def convert_string_to_array_type(self, print_type):
523 if print_type.startswith(
'VX_TYPE_') :
524 string_length = len(print_type)
525 substring = print_type[8:string_length]
527 if t.name == substring :
532 def check_array_type(self, print_type):
534 return Type.is_array_type(array_type)
536 def generate_host_c_validate_func_code(self):
537 self.
host_c_code.write_line(
"static vx_status VX_CALLBACK tivxAddKernel%sValidate(vx_node node," % self.
kernel.name_camel)
538 self.
host_c_code.write_line(
" const vx_reference parameters[ ],")
540 self.
host_c_code.write_line(
" vx_meta_format metas[])")
544 self.
host_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
546 for prm
in self.
kernel.params :
549 attr = Attribute.from_type(prm.type)
550 if Type.is_scalar_type(prm.type) :
551 self.
host_c_code.write_line(
"vx_scalar %s = NULL;" % prm.name_lower)
552 self.
host_c_code.write_line(
"vx_enum %s_scalar_type;" % (prm.name_lower))
554 self.
host_c_code.write_line(
"%s %s = NULL;" % (Type.get_vx_name(prm.type), prm.name_lower))
555 for name, member
in attr.__members__.items() :
557 if member == UserDataObjectAttribute.NAME :
558 self.
host_c_code.write_line(
"%s %s_%s[VX_MAX_REFERENCE_NAME];" % (member.value[1], prm.name_lower, member.value[0]))
560 self.
host_c_code.write_line(
"%s %s_%s;" % (member.value[1], prm.name_lower, member.value[0]))
564 self.
host_c_code.write_line(
"if ( (num != %s%s_MAX_PARAMS)" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper) )
565 for prm
in self.
kernel.params :
566 if prm.state
is ParamState.REQUIRED :
567 self.
host_c_code.write_line(
" || (NULL == parameters[%s%s_%s_IDX])" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper))
570 self.
host_c_code.write_line(
"status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
571 self.
host_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"One or more REQUIRED parameters are set to NULL\\n\");")
576 self.
host_c_code.write_line(
"if ((vx_status)VX_SUCCESS == status)")
580 for prm
in self.
kernel.params :
581 if Type.is_scalar_type(prm.type) :
582 self.
host_c_code.write_line(
"%s = (%s)parameters[%s%s_%s_IDX];" %
583 (prm.name_lower, Type.get_vx_name(Type.SCALAR), self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper) )
585 self.
host_c_code.write_line(
"%s = (%s)parameters[%s%s_%s_IDX];" %
586 (prm.name_lower, Type.get_vx_name(prm.type), self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper) )
591 self.
host_c_code.write_line(
"/* PARAMETER ATTRIBUTE FETCH */")
598 self.
host_c_code.write_line(
"if ((vx_status)VX_SUCCESS == status)")
600 for prm
in self.
kernel.params :
601 if prm.state
is ParamState.OPTIONAL :
602 self.
host_c_code.write_line(
"if (NULL != %s)" % prm.name_lower)
605 attr = Attribute.from_type(prm.type)
606 if Type.is_scalar_type(prm.type) :
607 self.
host_c_code.write_line(
"tivxCheckStatus(&status, vxQueryScalar(%s, (vx_enum)VX_SCALAR_TYPE, &%s_scalar_type, sizeof(%s_scalar_type)));" % (prm.name_lower, prm.name_lower, prm.name_lower))
609 for name, member
in attr.__members__.items() :
611 if prm.type == Type.RAW_IMAGE :
612 self.
host_c_code.write_line(
"tivxCheckStatus(&status, tivxQuery%s(%s, (vx_enum)TIVX_%s_%s, &%s_%s, sizeof(%s_%s)));" % (toCamelCase(prm.type.name), prm.name_lower, prm.type.name, name, prm.name_lower, member.value[0], prm.name_lower, member.value[0]))
613 elif prm.type == Type.LUT:
614 self.
host_c_code.write_line(
"tivxCheckStatus(&status, vxQueryLUT(%s, (vx_enum)VX_%s_%s, &%s_%s, sizeof(%s_%s)));" % (prm.name_lower, prm.type.name, name, prm.name_lower, member.value[0], prm.name_lower, member.value[0]))
616 self.
host_c_code.write_line(
"tivxCheckStatus(&status, vxQuery%s(%s, (vx_enum)VX_%s_%s, &%s_%s, sizeof(%s_%s)));" % (toCamelCase(prm.type.name), prm.name_lower, prm.type.name, name, prm.name_lower, member.value[0], prm.name_lower, member.value[0]))
618 if prm.state
is ParamState.OPTIONAL :
620 if prm
is not self.
kernel.params[-1] :
625 self.
host_c_code.write_line(
"/* PARAMETER CHECKING */")
629 self.
host_c_code.write_line(
"if ((vx_status)VX_SUCCESS == status)")
631 for prm
in self.
kernel.params :
632 if Type.IMAGE == prm.type
or Type.PYRAMID == prm.type
or Type.ARRAY == prm.type
or Type.MATRIX == prm.type
or Type.LUT == prm.type
or Type.USER_DATA_OBJECT == prm.type
or Type.is_scalar_type(prm.type)
is True :
633 if prm.state
is ParamState.OPTIONAL :
634 self.
host_c_code.write_line(
"if (NULL != %s)" % (prm.name_lower))
636 if len(prm.data_types) == 0 :
637 self.
host_c_code.write_comment_line(
"< DEVELOPER_TODO: Replace <Add type here> with correct data type >")
641 if Type.IMAGE == prm.type :
642 if len(prm.data_types) > 1 :
645 self.
host_c_code.write_line(
" ((vx_df_image)%s != %s_fmt) &&" % (dt, prm.name_lower))
649 elif Type.PYRAMID == prm.type :
650 if len(prm.data_types) > 1 :
653 self.
host_c_code.write_line(
" ((vx_df_image)%s != %s_fmt) &&" % (dt, prm.name_lower))
657 elif Type.ARRAY == prm.type :
658 if len(prm.data_types) > 1 :
665 self.
host_c_code.write_line(
" (%s_item_type != %s) &&" % (prm.name_lower, dt))
667 self.
host_c_code.write_line(
" (%s_item_size != sizeof(%s)) &&" % (prm.name_lower, dt))
677 elif Type.MATRIX == prm.type
or Type.LUT == prm.type:
678 if len(prm.data_types) > 1 :
681 self.
host_c_code.write_line(
" ((vx_enum)%s != %s_type) &&" % (dt, prm.name_lower))
685 elif Type.is_scalar_type(prm.type) :
686 if len(prm.data_types) > 1 :
689 self.
host_c_code.write_line(
" ((vx_enum)%s != %s_scalar_type) &&" % (dt, prm.name_lower))
693 elif Type.USER_DATA_OBJECT == prm.type :
694 if len(prm.data_types) > 1 :
696 self.
host_c_code.write_line(
" (strncmp(%s_name, \"%s\", sizeof(%s_name)) != 0)) &&" % (prm.name_lower, self.
print_data_type[0], prm.name_lower))
698 self.
host_c_code.write_line(
" ((%s_size != sizeof(%s)) ||" % (prm.name_lower, dt))
699 self.
host_c_code.write_line(
" (strncmp(%s_name, \"%s\", sizeof(%s_name)) != 0)) &&" % (prm.name_lower, dt, prm.name_lower))
701 self.
host_c_code.write_line(
" (strncmp(%s_name, \"%s\", sizeof(%s_name)) != 0)))" % (prm.name_lower, self.
print_data_type[-1], prm.name_lower))
704 self.
host_c_code.write_line(
" (strncmp(%s_name, \"%s\", sizeof(%s_name)) != 0))" % (prm.name_lower, self.
print_data_type[0], prm.name_lower))
707 self.
host_c_code.write_line(
"status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
708 vowel = [
"a",
"e",
"i",
"o"]
709 if Type.is_scalar_type(prm.type) :
710 self.
host_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"'%s' should be a scalar of type:\\n " % (prm.name_lower), new_line=
False)
713 if prm.type.name[0].lower()
in vowel :
715 self.
host_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"'%s' should be %s %s of type:\\n " % (prm.name_lower, article, prm.type.name.lower()), new_line=
False)
718 self.
host_c_code.write_line(
"or %s " % (dt), new_line=
False, indent=
False)
719 self.
host_c_code.write_line(
"\\n\");", indent=
False)
721 if prm.state
is ParamState.OPTIONAL :
723 if prm
is not self.
kernel.params[-1] :
728 if len(self.
kernel.relationship_list) :
730 self.
host_c_code.write_line(
"/* PARAMETER RELATIONSHIP CHECKING */")
732 self.
host_c_code.write_line(
"if ((vx_status)VX_SUCCESS == status)")
735 for rel
in self.
kernel.relationship_list :
736 if rel.state
is ParamState.OPTIONAL :
737 self.
host_c_code.write_line(
"if (NULL != %s)" % (rel.prm_list[0].name_lower))
739 for attr
in rel.attribute_list :
740 if attr.vx_enum_name() ==
"VX_MATRIX_ORIGIN":
741 self.
host_c_code.write_line(
"if( (%s_%s.x != %s_%s.x) ||" % (rel.prm_list[0].name_lower, attr.value[0], rel.prm_list[1].name_lower, attr.value[0]))
742 self.
host_c_code.write_line(
" (%s_%s.y != %s_%s.y) )" % (rel.prm_list[0].name_lower, attr.value[0], rel.prm_list[1].name_lower, attr.value[0]))
744 if len(rel.prm_list) > 2 :
745 self.
host_c_code.write_line(
"if( (%s_%s != %s_%s) ||" % (rel.prm_list[0].name_lower, attr.value[0], rel.prm_list[1].name_lower, attr.value[0]))
746 for prm
in rel.prm_list[2:-1] :
747 self.
host_c_code.write_line(
" (%s_%s != %s_%s) ||" % (rel.prm_list[0].name_lower, attr.value[0], prm.name_lower, attr.value[0]))
748 self.
host_c_code.write_line(
" (%s_%s != %s_%s))" % (rel.prm_list[0].name_lower, attr.value[0], rel.prm_list[-1].name_lower, attr.value[0]))
749 elif len(rel.prm_list) == 2 :
750 self.
host_c_code.write_line(
"if (%s_%s != %s_%s)" % (rel.prm_list[0].name_lower, attr.value[0], rel.prm_list[1].name_lower, attr.value[0]))
753 self.
host_c_code.write_line(
"status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
754 self.
host_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"Parameters '%s' and '%s' " % (rel.prm_list[0].name_lower, rel.prm_list[1].name_lower), new_line=
False)
755 for prm
in rel.prm_list[2:] :
756 self.
host_c_code.write_line(
"and '%s' " % (prm.name_lower), new_line=
False, indent=
False)
757 self.
host_c_code.write_line(
"should have the same value for %s\\n\");" % attr.vx_enum_name(), indent=
False)
759 if rel.state
is ParamState.OPTIONAL :
761 if rel
is not self.
kernel.relationship_list[-1] :
766 self.
host_c_code.write_line(
"/* CUSTOM PARAMETER CHECKING */")
768 self.
host_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Add any custom parameter type or range checking not")
769 self.
host_c_code.write_comment_line(
" covered by the code-generation script.) >")
772 self.
host_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) If intending to use a virtual data object, set metas using appropriate TI API.")
773 self.
host_c_code.write_comment_line(
" For a code example, please refer to the validate callback of the follow file:")
774 self.
host_c_code.write_comment_line(
" tiovx/kernels/openvx-core/host/vx_absdiff_host.c. For further information regarding metas,")
775 self.
host_c_code.write_comment_line(
" please refer to the OpenVX 1.1 spec p. 260, or search for vx_kernel_validate_f. >")
782 def generate_host_c_initialize_func_code(self):
783 self.
host_c_code.write_line(
"static vx_status VX_CALLBACK tivxAddKernel%sInitialize(vx_node node," % self.
kernel.name_camel)
784 self.
host_c_code.write_line(
" const vx_reference parameters[ ],")
785 self.
host_c_code.write_line(
" vx_uint32 num_params)")
787 self.
host_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
788 if self.
kernel.getNumImages() > 0 :
789 self.
host_c_code.write_line(
"tivxKernelValidRectParams prms;")
793 self.
host_c_code.write_line(
"if ( (num_params != %s%s_MAX_PARAMS)" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper) )
794 for prm
in self.
kernel.params :
795 if prm.state
is ParamState.REQUIRED :
796 self.
host_c_code.write_line(
" || (NULL == parameters[%s%s_%s_IDX])" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper))
799 self.
host_c_code.write_line(
"status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
800 self.
host_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"One or more REQUIRED parameters are set to NULL\\n\");")
807 for prm
in self.
kernel.params :
808 if Type.IMAGE == prm.type:
809 if Direction.INPUT == prm.direction:
810 self.
temp_buffer += (
" prms.in_img[%sU] = (vx_image)parameters[%s%s_%s_IDX];\n" %
811 (num_input_image, self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper) )
813 if Direction.OUTPUT == prm.direction:
814 self.
temp_buffer += (
" prms.out_img[%sU] = (vx_image)parameters[%s%s_%s_IDX];\n" %
815 (num_output_image, self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper) )
819 if num_input_image > 0
or num_output_image > 0 :
820 self.
host_c_code.write_line(
"if ((vx_status)VX_SUCCESS == status)")
822 self.
host_c_code.write_line(
"tivxKernelValidRectParams_init(&prms);")
825 self.
host_c_code.write_line(
"prms.num_input_images = %s;" % self.
kernel.getNumInputImages())
826 self.
host_c_code.write_line(
"prms.num_output_images = %s;" % self.
kernel.getNumOutputImages())
828 self.
host_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Set padding values based on valid region if border mode is")
829 self.
host_c_code.write_comment_line(
" set to VX_BORDER_UNDEFINED and remove the #if 0 and #endif lines.")
830 self.
host_c_code.write_comment_line(
" Else, remove this entire #if 0 ... #endif block >")
836 self.
host_c_code.write_line(
"prms.border_mode = VX_BORDER_UNDEFINED;")
839 self.
host_c_code.write_line(
"status = tivxKernelConfigValidRect(&prms);")
847 def generate_host_c_file_code(self):
854 self.
host_c_code.write_include(
"TI/tivx_target_kernel.h")
856 self.
host_c_code.write_line(
"static vx_kernel vx_%s_kernel = NULL;" % (self.
kernel.name_lower))
859 self.
host_c_code.write_line(
"static vx_status VX_CALLBACK tivxAddKernel%sValidate(vx_node node," % self.
kernel.name_camel)
860 self.
host_c_code.write_line(
" const vx_reference parameters[ ],")
862 self.
host_c_code.write_line(
" vx_meta_format metas[]);")
863 self.
host_c_code.write_line(
"static vx_status VX_CALLBACK tivxAddKernel%sInitialize(vx_node node," % self.
kernel.name_camel)
864 self.
host_c_code.write_line(
" const vx_reference parameters[ ],")
865 self.
host_c_code.write_line(
" vx_uint32 num_params);")
866 self.
host_c_code.write_line(
"vx_status tivxAddKernel%s(vx_context context);" % (self.
kernel.name_camel))
867 self.
host_c_code.write_line(
"vx_status tivxRemoveKernel%s(vx_context context);" % (self.
kernel.name_camel))
876 def generate_target_c_add_func_code(self):
877 self.
target_c_code.write_line(
"void tivxAddTargetKernel%s(void)" % self.
kernel.name_camel, files=0)
878 self.
target_c_code.write_line(
"void tivxAddTargetKernelBam%s(void)" % self.
kernel.name_camel, files=1)
880 self.
target_c_code.write_line(
"vx_status status = (vx_status)VX_FAILURE;")
881 self.
target_c_code.write_line(
"char target_name[TIVX_TARGET_MAX_NAME];")
884 self.
target_c_code.write_line(
"self_cpu = tivxGetSelfCpuId();")
886 for target
in self.
kernel.targets :
887 if type(target)
is Target :
888 cpu = Target.get_cpu(target)
889 self.
target_c_code.write_line(
"if ( self_cpu == (vx_enum)%s )" % Cpu.get_vx_enum_name(cpu) )
891 self.
target_c_code.write_line(
"strncpy(target_name, %s, TIVX_TARGET_MAX_NAME);" % Target.get_vx_enum_name(target))
892 self.
target_c_code.write_line(
"status = (vx_status)VX_SUCCESS;")
896 self.
target_c_code.write_line(
"status = (vx_status)VX_FAILURE;")
902 self.
target_c_code.write_line(
"vx_%s_target_kernel = tivxAddTargetKernelByName(" % self.
kernel.name_lower)
915 def generate_target_c_remove_func_code(self):
916 self.
target_c_code.write_line(
"void tivxRemoveTargetKernel%s(void)" % self.
kernel.name_camel, files=0)
917 self.
target_c_code.write_line(
"void tivxRemoveTargetKernelBam%s(void)" % self.
kernel.name_camel, files=1)
919 self.
target_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
921 self.
target_c_code.write_line(
"status = tivxRemoveTargetKernel(vx_%s_target_kernel);" % self.
kernel.name_lower)
930 def extract_local_mem_string_error_check(self, new_str, type, name):
933 if type != Type.ARRAY :
934 if "capacity" in new_str :
936 invalid_str =
"capacity" 937 elif "itemsize" in new_str :
939 invalid_str =
"itemsize" 940 elif "itemtype" in new_str :
942 invalid_str =
"itemtype" 943 if type != Type.ARRAY
and type != Type.OBJECT_ARRAY:
944 if "numitems" in new_str :
946 invalid_str =
"numitems" 947 if type != Type.IMAGE
and type != Type.REMAP:
948 if "width" in new_str :
950 invalid_str =
"width" 951 elif "height" in new_str :
953 invalid_str =
"height" 954 if type != Type.IMAGE :
955 if "stride_x" in new_str :
957 invalid_str =
"stride_x" 958 elif "stride_y" in new_str :
960 invalid_str =
"stride_y" 961 if type != Type.PYRAMID :
962 if "levels" in new_str :
964 invalid_str =
"levels" 965 if type != Type.MATRIX
and type != Type.CONVOLUTION:
966 if "rows" in new_str :
969 elif "columns" in new_str :
971 invalid_str =
"columns" 972 if type != Type.DISTRIBUTION :
973 if "dimensions" in new_str :
975 invalid_str =
"dimensions" 976 elif "range" in new_str :
978 invalid_str =
"range" 979 elif "bins" in new_str :
982 elif "win" in new_str :
985 if type != Type.DISTRIBUTION
and type != Type.LUT:
986 if "offset" in new_str :
988 invalid_str =
"offset" 990 if "count" in new_str :
992 invalid_str =
"count" 993 assert found ==
False,
"'%s' is in invalid string for parameter %s" % (invalid_str, name)
996 def extract_local_mem_string(self, type, attribute, local):
998 if type == Type.IMAGE :
1000 new_str = new_str.replace(
"width",
"%s_desc->imagepatch_addr[0].dim_x" % local.prm.name_lower)
1001 new_str = new_str.replace(
"height",
"%s_desc->imagepatch_addr[0].dim_y" % local.prm.name_lower)
1002 new_str = new_str.replace(
"stride_x",
"%s_desc->imagepatch_addr[0].stride_x" % local.prm.name_lower)
1003 new_str = new_str.replace(
"stride_y",
"%s_desc->imagepatch_addr[0].stride_y" % local.prm.name_lower)
1005 elif type == Type.ARRAY :
1007 new_str = new_str.replace(
"capacity",
"%s_desc->capacity" % local.prm.name_lower)
1008 new_str = new_str.replace(
"itemsize",
"%s_desc->item_size" % local.prm.name_lower)
1009 new_str = new_str.replace(
"itemtype",
"%s_desc->item_type" % local.prm.name_lower)
1010 new_str = new_str.replace(
"numitems",
"%s_desc->num_items" % local.prm.name_lower)
1012 elif type == Type.PYRAMID :
1015 new_str = new_str.replace(
"levels",
"%s_desc->num_levels" % local.prm.name_lower)
1017 elif type == Type.MATRIX :
1019 new_str = new_str.replace(
"rows",
"%s_desc->rows" % local.prm.name_lower)
1020 new_str = new_str.replace(
"columns",
"%s_desc->columns" % local.prm.name_lower)
1021 new_str = new_str.replace(
"size",
"%s_desc->mem_size" % local.prm.name_lower)
1023 elif type == Type.DISTRIBUTION :
1025 new_str = new_str.replace(
"dimensions",
"1")
1026 new_str = new_str.replace(
"offset",
"%s_desc->offset" % local.prm.name_lower)
1027 new_str = new_str.replace(
"range",
"%s_desc->range" % local.prm.name_lower)
1028 new_str = new_str.replace(
"bins",
"%s_desc->num_bins" % local.prm.name_lower)
1029 new_str = new_str.replace(
"window",
"%s_desc->num_win" % local.prm.name_lower)
1030 new_str = new_str.replace(
"size",
"%s_desc->mem_size" % local.prm.name_lower)
1032 elif type == Type.LUT :
1034 new_str = new_str.replace(
"count",
"%s_desc->num_items" % local.prm.name_lower)
1035 new_str = new_str.replace(
"size",
"%s_desc->mem_size" % local.prm.name_lower)
1037 elif type == Type.REMAP :
1039 new_str = new_str.replace(
"source_width",
"%s_desc->src_width" % local.prm.name_lower)
1040 new_str = new_str.replace(
"source_height",
"%s_desc->src_height" % local.prm.name_lower)
1041 new_str = new_str.replace(
"destination_width",
"%s_desc->dst_width" % local.prm.name_lower)
1042 new_str = new_str.replace(
"destination_height",
"%s_desc->dst_height" % local.prm.name_lower)
1044 elif type == Type.CONVOLUTION :
1046 new_str = new_str.replace(
"rows",
"%s_desc->rows" % local.prm.name_lower)
1047 new_str = new_str.replace(
"columns",
"%s_desc->columns" % local.prm.name_lower)
1048 new_str = new_str.replace(
"size",
"%s_desc->mem_size" % local.prm.name_lower)
1049 new_str = new_str.replace(
"scale",
"%s_desc->scale" % local.prm.name_lower)
1051 elif type == Type.OBJECT_ARRAY :
1053 new_str = new_str.replace(
"numitems",
"%s_desc->num_items" % local.prm.name_lower)
1057 def is_supported_type(self, type):
1058 if type == Type.IMAGE :
1060 elif type == Type.ARRAY :
1062 elif type == Type.PYRAMID :
1064 elif type == Type.MATRIX :
1066 elif type == Type.DISTRIBUTION :
1068 elif type == Type.REMAP :
1070 elif type == Type.CONVOLUTION :
1072 elif type == Type.LUT :
1074 elif type == Type.OBJECT_ARRAY :
1076 elif type == Type.NULL :
1082 def extract_attribute(self, local, is_first_prm):
1083 invalid_type =
False 1084 if not is_first_prm :
1085 self.
target_c_code.write_line(
"if ((vx_status)VX_SUCCESS == status)")
1087 if local.prm.type != Type.NULL :
1089 if ParamState.OPTIONAL == local.state :
1090 self.
target_c_code.write_line(
"if( %s_desc != NULL)" % local.prm.name_lower)
1092 if local.prm.type == Type.IMAGE :
1095 for num, attr
in enumerate(local.attribute_list, start=1):
1096 if type(attr)
is ImageAttribute :
1097 if Attribute.Image.WIDTH == attr :
1098 append_str = (
"%s_desc->imagepatch_addr[0].dim_x" % local.prm.name_lower)
1099 size_str+=append_str
1100 elif Attribute.Image.HEIGHT == attr :
1101 append_str = (
"%s_desc->imagepatch_addr[0].dim_y" % local.prm.name_lower)
1102 size_str+=append_str
1103 elif type(attr)
is int :
1104 append_str = (
"%s" % attr)
1105 size_str+=append_str
1106 elif type(attr)
is str :
1108 size_str+=append_str
1111 if num < len(local.attribute_list) :
1113 size_str+=append_str
1114 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1115 elif local.prm.type == Type.ARRAY :
1118 for num, attr
in enumerate(local.attribute_list, start=1):
1119 if type(attr)
is ArrayAttribute :
1120 if Attribute.Array.CAPACITY == attr :
1121 append_str = (
"%s_desc->capacity" % local.prm.name_lower)
1122 size_str+=append_str
1123 elif Attribute.Array.ITEMTYPE == attr :
1124 append_str = (
"%s_desc->item_type" % local.prm.name_lower)
1125 size_str+=append_str
1126 elif Attribute.Array.NUMITEMS == attr :
1127 append_str = (
"%s_desc->num_items" % local.prm.name_lower)
1128 size_str+=append_str
1129 elif Attribute.Array.ITEMSIZE == attr :
1130 append_str = (
"%s_desc->item_size" % local.prm.name_lower)
1131 size_str+=append_str
1132 elif type(attr)
is int :
1133 append_str = (
"%s" % attr)
1134 size_str+=append_str
1135 elif type(attr)
is str :
1137 size_str+=append_str
1140 if num < len(local.attribute_list) :
1142 size_str+=append_str
1143 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1144 elif local.prm.type == Type.PYRAMID :
1147 for num, attr
in enumerate(local.attribute_list, start=1):
1148 if type(attr)
is PyramidAttribute :
1149 if Attribute.Pyramid.LEVELS == attr :
1150 append_str = (
"%s_desc->num_levels" % local.prm.name_lower)
1151 size_str+=append_str
1152 elif type(attr)
is int :
1153 append_str = (
"%s" % attr)
1154 size_str+=append_str
1155 elif type(attr)
is str :
1157 size_str+=append_str
1160 if num < len(local.attribute_list) :
1162 size_str+=append_str
1163 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1164 elif local.prm.type == Type.MATRIX :
1167 for num, attr
in enumerate(local.attribute_list, start=1):
1168 if type(attr)
is MatrixAttribute :
1169 if Attribute.Matrix.ROWS == attr :
1170 append_str = (
"%s_desc->rows" % local.prm.name_lower)
1171 size_str+=append_str
1172 elif Attribute.Matrix.COLUMNS == attr :
1173 append_str = (
"%s_desc->columns" % local.prm.name_lower)
1174 size_str+=append_str
1175 elif Attribute.Matrix.SIZE == attr :
1176 append_str = (
"%s_desc->mem_size" % local.prm.name_lower)
1177 size_str+=append_str
1178 elif type(attr)
is int :
1179 append_str = (
"%s" % attr)
1180 size_str+=append_str
1181 elif type(attr)
is str :
1183 size_str+=append_str
1186 if num < len(local.attribute_list) :
1188 size_str+=append_str
1189 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1190 elif local.prm.type == Type.DISTRIBUTION :
1193 for num, attr
in enumerate(local.attribute_list, start=1):
1194 if type(attr)
is DistributionAttribute :
1195 if Attribute.Distribution.DIMENSIONS == attr :
1197 size_str+=append_str
1198 elif Attribute.Distribution.OFFSET == attr :
1199 append_str = (
"%s_desc->offset" % local.prm.name_lower)
1200 size_str+=append_str
1201 elif Attribute.Distribution.RANGE == attr :
1202 append_str = (
"%s_desc->range" % local.prm.name_lower)
1203 size_str+=append_str
1204 elif Attribute.Distribution.BINS == attr :
1205 append_str = (
"%s_desc->num_bins" % local.prm.name_lower)
1206 size_str+=append_str
1207 elif Attribute.Distribution.WINDOW == attr :
1208 append_str = (
"%s_desc->num_win" % local.prm.name_lower)
1209 size_str+=append_str
1210 elif Attribute.Distribution.SIZE == attr :
1211 append_str = (
"%s_desc->mem_size" % local.prm.name_lower)
1212 size_str+=append_str
1213 elif type(attr)
is int :
1214 append_str = (
"%s" % attr)
1215 size_str+=append_str
1216 elif type(attr)
is str :
1218 size_str+=append_str
1221 if num < len(local.attribute_list) :
1223 size_str+=append_str
1224 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1225 elif local.prm.type == Type.LUT :
1228 for num, attr
in enumerate(local.attribute_list, start=1):
1229 if type(attr)
is LutAttribute :
1230 if Attribute.Lut.COUNT == attr :
1231 append_str = (
"%s_desc->num_items" % local.prm.name_lower)
1232 size_str+=append_str
1233 elif Attribute.Lut.SIZE == attr :
1234 append_str = (
"%s_desc->mem_size" % local.prm.name_lower)
1235 size_str+=append_str
1236 elif type(attr)
is int :
1237 append_str = (
"%s" % attr)
1238 size_str+=append_str
1239 elif type(attr)
is str :
1241 size_str+=append_str
1244 if num < len(local.attribute_list) :
1246 size_str+=append_str
1247 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1248 elif local.prm.type == Type.REMAP :
1251 for num, attr
in enumerate(local.attribute_list, start=1):
1252 if type(attr)
is RemapAttribute :
1253 if Attribute.Remap.SOURCE_WIDTH == attr :
1254 append_str = (
"%s_desc->src_width" % local.prm.name_lower)
1255 size_str+=append_str
1256 elif Attribute.Remap.SOURCE_HEIGHT == attr :
1257 append_str = (
"%s_desc->src_height" % local.prm.name_lower)
1258 size_str+=append_str
1259 elif Attribute.Remap.DESTINATION_WIDTH == attr :
1260 append_str = (
"%s_desc->dst_width" % local.prm.name_lower)
1261 size_str+=append_str
1262 elif Attribute.Remap.DESTINATION_HEIGHT == attr :
1263 append_str = (
"%s_desc->dst_height" % local.prm.name_lower)
1264 size_str+=append_str
1265 elif type(attr)
is int :
1266 append_str = (
"%s" % attr)
1267 size_str+=append_str
1268 elif type(attr)
is str :
1270 size_str+=append_str
1273 if num < len(local.attribute_list) :
1275 size_str+=append_str
1276 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1277 elif local.prm.type == Type.OBJECT_ARRAY :
1280 for num, attr
in enumerate(local.attribute_list, start=1):
1281 if type(attr)
is ObjectArrayAttribute :
1282 if Attribute.ObjectArray.NUMITEMS == attr :
1283 append_str = (
"%s_desc->num_items" % local.prm.name_lower)
1284 size_str+=append_str
1285 elif type(attr)
is int :
1286 append_str = (
"%s" % attr)
1287 size_str+=append_str
1288 elif type(attr)
is str :
1290 size_str+=append_str
1293 if num < len(local.attribute_list) :
1295 size_str+=append_str
1296 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1297 elif local.prm.type == Type.CONVOLUTION :
1300 for num, attr
in enumerate(local.attribute_list, start=1):
1301 if type(attr)
is ConvolutionAttribute :
1302 if Attribute.Convolution.ROWS == attr :
1303 append_str = (
"%s_desc->rows" % local.prm.name_lower)
1304 size_str+=append_str
1305 elif Attribute.Convolution.COLUMNS == attr :
1306 append_str = (
"%s_desc->columns" % local.prm.name_lower)
1307 size_str+=append_str
1308 elif Attribute.Convolution.SCALE == attr :
1309 append_str = (
"%s_desc->scale" % local.prm.name_lower)
1310 size_str+=append_str
1311 elif Attribute.Convolution.SIZE == attr :
1312 append_str = (
"%s_desc->mem_size" % local.prm.name_lower)
1313 size_str+=append_str
1314 elif type(attr)
is int :
1315 append_str = (
"%s" % attr)
1316 size_str+=append_str
1317 elif type(attr)
is str :
1319 size_str+=append_str
1322 if num < len(local.attribute_list) :
1324 size_str+=append_str
1325 assert invalid_type ==
False,
"'%s' contains an invalid attribute" % (local.prm.name_lower)
1326 elif local.prm.type == Type.NULL :
1329 for num, attr
in enumerate(local.attribute_list, start=1):
1330 if type(attr)
is int :
1331 append_str = (
"%s" % attr)
1332 size_str+=append_str
1333 elif type(attr)
is str :
1335 size_str+=append_str
1336 if num < len(local.attribute_list) :
1338 size_str+=append_str
1340 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Verify correct amount of memory is allocated >")
1341 self.
target_c_code.write_line(
"prms->%s_size = %s;" % (local.name, size_str) )
1342 self.
target_c_code.write_line(
"prms->%s_ptr = tivxMemAlloc(prms->%s_size, (vx_enum)TIVX_MEM_EXTERNAL);" % (local.name, local.name) )
1344 self.
target_c_code.write_line(
"if (NULL == prms->%s_ptr)" % (local.name) )
1346 self.
target_c_code.write_line(
"status = (vx_status)VX_ERROR_NO_MEMORY;")
1347 self.
target_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate local memory\\n\");")
1351 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Verify memory setting to clear the correct amount of memory >")
1352 self.
target_c_code.write_line(
"memset(prms->%s_ptr, 0, %s);" % (local.name, size_str) )
1354 if not is_first_prm :
1358 if local.prm.type != Type.NULL :
1360 if ParamState.OPTIONAL == local.state :
1363 def generate_target_c_create_func_code(self):
1364 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sCreate(" % self.
kernel.name_camel)
1365 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
1366 self.
target_c_code.write_line(
" tivx_obj_desc_t *obj_desc[],")
1367 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg)")
1369 self.
target_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
1370 contains_user_data_object =
False 1371 for prm
in self.
kernel.params :
1372 if Type.USER_DATA_OBJECT == prm.type :
1373 contains_user_data_object =
True 1376 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1382 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Add any target kernel create code here (e.g. allocating")
1383 self.
target_c_code.write_comment_line(
" local memory buffers, one time initialization, etc) >")
1384 if self.
prms_needed or contains_user_data_object :
1387 for prm
in self.
kernel.params :
1388 if prm.state
is ParamState.REQUIRED :
1400 for local
in self.
kernel.local_mem_list :
1401 if local.prm.type != Type.NULL :
1402 if not (local.prm.name_lower
in duplicates) :
1403 self.
target_c_code.write_line(
"%s *%s_desc;" % (Type.get_obj_desc_name(local.prm.type), local.prm.name_lower) , files=self.
prms_write)
1404 duplicates.append(local.prm.name_lower)
1405 for prm
in self.
kernel.params :
1406 if Type.USER_DATA_OBJECT == prm.type :
1407 if not (prm.name_lower
in duplicates) :
1408 self.
target_c_code.write_line(
"%s *%s_desc;" % (Type.get_obj_desc_name(prm.type), prm.name_lower) , files=self.
prms_write)
1409 duplicates.append(prm.name_lower)
1414 for local
in self.
kernel.local_mem_list :
1415 if local.prm.type != Type.NULL :
1416 if not (local.prm.name_lower
in duplicates) :
1417 self.
target_c_code.write_line(
"%s_desc = (%s *)obj_desc[%s%s_%s_IDX];" %
1418 (local.prm.name_lower, Type.get_obj_desc_name(local.prm.type), self.
kernel.enum_str_prefix, self.
kernel.name_upper, local.prm.name_upper) , files=self.
prms_write)
1419 duplicates.append(local.prm.name_lower)
1420 for prm
in self.
kernel.params :
1421 if Type.USER_DATA_OBJECT == prm.type :
1422 if not (prm.name_lower
in duplicates) :
1423 self.
target_c_code.write_line(
"%s_desc = (%s *)obj_desc[%s%s_%s_IDX];" %
1424 (prm.name_lower, Type.get_obj_desc_name(prm.type), self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper) , files=self.
prms_write)
1425 duplicates.append(prm.name_lower)
1428 if contains_user_data_object :
1429 for prm
in self.
kernel.params :
1430 if Type.USER_DATA_OBJECT == prm.type :
1431 if len(prm.data_types) == 0 :
1432 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Replace <Add type here> with correct data type >", files=self.
prms_write)
1438 self.
target_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"User data object size on target does not match the size on host, possibly due to misalignment in data structure\\n\");", files=self.
prms_write)
1445 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1447 self.
target_c_code.write_line(
"prms = tivxMemAlloc(sizeof(tivx%sParams), (vx_enum)TIVX_MEM_EXTERNAL);" % self.
kernel.name_camel, files=self.
prms_write)
1452 for local
in self.
kernel.local_mem_list :
1455 is_first_prm =
False 1462 self.
target_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate local memory\\n\");", files=self.
prms_write)
1469 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Create BAM graph using graph_handle >", files=1)
1481 self.
target_c_code.write_line(
"VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate local memory\\n\");", files=self.
prms_write)
1493 def generate_target_c_delete_func_code(self):
1494 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sDelete(" % self.
kernel.name_camel)
1495 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
1496 self.
target_c_code.write_line(
" tivx_obj_desc_t *obj_desc[],")
1497 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg)")
1499 self.
target_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
1502 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1509 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Add any target kernel delete code here (e.g. freeing")
1510 self.
target_c_code.write_comment_line(
" local memory buffers, etc) >")
1513 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1517 for prm
in self.
kernel.params :
1518 if prm.state
is ParamState.REQUIRED :
1527 self.
target_c_code.write_line(
"tivxGetTargetKernelInstanceContext(kernel, (void **)&prms, &size);", files=self.
prms_write)
1532 for local
in self.
kernel.local_mem_list :
1536 self.
target_c_code.write_line(
"tivxMemFree(prms->%s_ptr, prms->%s_size, (vx_enum)TIVX_MEM_EXTERNAL);" %
1537 (local.name, local.name) , files=self.
prms_write)
1541 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1542 self.
target_c_code.write_comment_line(
"tivxBamDestroyHandle(prms->graph_handle);", files=1)
1553 def generate_target_c_control_func_code(self):
1554 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sControl(" % self.
kernel.name_camel)
1555 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
1556 self.
target_c_code.write_line(
" uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[],")
1557 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg)")
1559 self.
target_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
1561 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Add any target kernel control code here (e.g. commands")
1562 self.
target_c_code.write_comment_line(
" the user can call to modify the processing of the kernel at run-time) >")
1568 def generate_target_c_struct(self):
1571 for local
in self.
kernel.local_mem_list :
1575 self.
target_c_code.write_line(
" tivx_bam_graph_handle graph_handle;" , files=1)
1579 def generate_bam_pointers(self, kernel_params):
1581 for prm
in kernel_params :
1582 if prm.type == Type.IMAGE :
1583 self.
target_c_code.write_line(
"img_ptrs[%s] = %s_addr;" % (idx, prm.name_lower), files=1)
1585 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1586 self.
target_c_code.write_comment_line(
"tivxBamUpdatePointers(prms->graph_handle, %sU, %sU, img_ptrs);" % (self.
kernel.getNumInputImages(), self.
kernel.getNumOutputImages()), files=1)
1589 def generate_optional_bam_pointers(self, num_scenarios) :
1590 first_scenario =
True 1592 binary_mask = num_scenarios
1593 for scenario
in range(num_scenarios) :
1596 num_included_optional_input = 0
1597 num_included_optional_output = 0
1599 if binary_mask & (2**idx) :
1600 included_str.append(prm.name_lower)
1601 if first_scenario ==
True and first_param ==
True:
1602 self.
target_c_code.write_line (
"if ( (%s_desc != NULL)" % prm.name_lower, files=1)
1603 first_scenario =
False 1605 elif first_param ==
True :
1606 self.
target_c_code.write_line (
"else if ( (%s_desc != NULL)" % prm.name_lower, files=1)
1607 first_scenario =
False 1610 self.
target_c_code.write_line (
" && (%s_desc != NULL)" % prm.name_lower, files=1)
1611 if prm.direction == Direction.INPUT :
1612 num_included_optional_input += 1
1613 elif prm.direction == Direction.OUTPUT :
1614 num_included_optional_output += 1
1618 for prm
in self.
kernel.params :
1619 if (prm.type == Type.IMAGE
and prm.state == ParamState.REQUIRED)
or \
1620 (prm.name_lower
in included_str):
1621 self.
target_c_code.write_line(
"img_ptrs[%s] = %s_addr;" % (idx, prm.name_lower), files=1)
1623 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1624 self.
target_c_code.write_comment_line(
"tivxBamUpdatePointers(prms->graph_handle, %sU, %sU, img_ptrs);" % (self.
kernel.getNumRequiredInputImages()+num_included_optional_input, \
1625 self.
kernel.getNumRequiredOutputImages()+num_included_optional_output), files=1)
1632 for prm
in self.
kernel.params :
1633 if (prm.type == Type.IMAGE
and prm.state == ParamState.REQUIRED) :
1634 self.
target_c_code.write_line(
"img_ptrs[%s] = %s_addr;" % (idx, prm.name_lower), files=1)
1636 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1637 self.
target_c_code.write_comment_line(
"tivxBamUpdatePointers(prms->graph_handle, %sU, %sU, img_ptrs);" % (self.
kernel.getNumRequiredInputImages(), \
1638 self.
kernel.getNumRequiredOutputImages()), files=1)
1642 def generate_optional_list(self, kernel_params) :
1644 for prm
in kernel_params :
1645 if prm.type == Type.IMAGE
and prm.state == ParamState.OPTIONAL :
1648 def generate_target_c_process_func_code(self):
1650 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sProcess(" % self.
kernel.name_camel)
1651 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
1652 self.
target_c_code.write_line(
" tivx_obj_desc_t *obj_desc[],")
1653 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg)")
1657 self.
target_c_code.write_line(
"vx_status status = (vx_status)VX_SUCCESS;")
1660 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1665 need_plane_idx_var =
False 1666 need_exposure_idx_var =
False 1667 need_pyramid_idx_var =
False 1668 printed_incrementer =
False 1669 for prm
in self.
kernel.params :
1670 if Type.IMAGE == prm.type
or Type.PYRAMID == prm.type:
1671 if len(prm.data_types) > 1 :
1672 for dt
in prm.data_types[0:-1] :
1673 if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1674 need_plane_idx_var =
True 1676 if Type.PYRAMID == prm.type:
1677 need_pyramid_idx_var =
True 1678 if Type.RAW_IMAGE == prm.type :
1679 need_exposure_idx_var =
True 1680 self.
target_c_code.write_line(
"%s *%s_desc;" % (Type.get_obj_desc_name(prm.type), prm.name_lower) )
1681 if prm.type == Type.PYRAMID :
1682 self.
target_c_code.write_line(
"%s *img_%s_desc[TIVX_PYRAMID_MAX_LEVEL_OBJECTS];" % (Type.get_obj_desc_name(Type.IMAGE), prm.name_lower) )
1683 if printed_incrementer
is False :
1685 printed_incrementer =
True 1687 if prm.type == Type.OBJECT_ARRAY :
1688 self.
target_c_code.write_line(
"%s *img_%s_desc[TIVX_OBJECT_ARRAY_MAX_ITEMS];" % (Type.get_obj_desc_name(Type.IMAGE), prm.name_lower) )
1689 if printed_incrementer
is False :
1691 printed_incrementer =
True 1692 if need_plane_idx_var
is True :
1694 if need_exposure_idx_var
is True :
1696 if need_pyramid_idx_var
is True and printed_incrementer
is False :
1702 self.
target_c_code.write_line(
"if ( (num_params != %s%s_MAX_PARAMS)" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper) )
1703 for prm
in self.
kernel.params :
1704 if prm.state
is ParamState.REQUIRED :
1705 self.
target_c_code.write_line(
" || (NULL == obj_desc[%s%s_%s_IDX])" % (self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper))
1711 self.
target_c_code.write_line(
"status = (vx_status)VX_FAILURE;")
1715 self.
target_c_code.write_line(
"if((vx_status)VX_SUCCESS == status)")
1720 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1727 for prm
in self.
kernel.params :
1728 self.
target_c_code.write_line(
"%s_desc = (%s *)obj_desc[%s%s_%s_IDX];" %
1729 (prm.name_lower, Type.get_obj_desc_name(prm.type), self.
kernel.enum_str_prefix, self.
kernel.name_upper, prm.name_upper) )
1735 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1739 self.
target_c_code.write_line(
"if (((vx_status)VX_SUCCESS != status) || (NULL == prms) ||", files=self.
prms_write)
1751 self.
target_c_code.write_line(
"if((vx_status)VX_SUCCESS == status)")
1755 for prm
in self.
kernel.params :
1756 if Type.is_scalar_type(prm.type)
is True :
1757 self.
target_c_code.write_line(
"%s %s_value;" % (Type.get_vx_name(prm.type), prm.name_lower ))
1761 for prm
in self.
kernel.params :
1762 if prm.type == Type.PYRAMID:
1763 self.
target_c_code.write_line(
"void *%s_target_ptr[TIVX_PYRAMID_MAX_LEVEL_OBJECTS] = {NULL};" % prm.name_lower )
1764 elif prm.type == Type.OBJECT_ARRAY :
1765 self.
target_c_code.write_line(
"void *%s_target_ptr[TIVX_OBJECT_ARRAY_MAX_ITEMS] = {NULL};" % prm.name_lower )
1766 elif prm.type == Type.RAW_IMAGE :
1767 self.
target_c_code.write_line(
"void *%s_target_ptr[TIVX_RAW_IMAGE_MAX_EXPOSURES] = {NULL};" % prm.name_lower )
1768 elif prm.type == Type.IMAGE :
1769 if len(prm.data_types) > 1 :
1770 for dt
in prm.data_types[0:-1] :
1771 if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1772 self.
target_c_code.write_line(
"void *%s_target_ptr[TIVX_IMAGE_MAX_PLANES] = {NULL};" % prm.name_lower )
1774 self.
target_c_code.write_line(
"void *%s_target_ptr;" % prm.name_lower )
1776 self.
target_c_code.write_line(
"void *%s_target_ptr;" % prm.name_lower )
1778 self.
target_c_code.write_line(
"void *%s_target_ptr;" % prm.name_lower )
1782 for prm
in self.
kernel.params :
1783 desc = prm.name_lower +
"_desc" 1784 if Type.is_scalar_type(prm.type)
is False :
1785 if prm.state
is ParamState.OPTIONAL:
1788 if Type.IMAGE == prm.type
or Type.PYRAMID == prm.type
or Type.OBJECT_ARRAY == prm.type
or Type.RAW_IMAGE == prm.type:
1791 if len(prm.data_types) > 1 :
1792 for dt
in prm.data_types[0:-1] :
1793 if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1796 if prm.type == Type.IMAGE :
1798 self.
target_c_code.write_line(
"for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1800 self.
target_c_code.write_line(
"%s_target_ptr[plane_idx] = tivxMemShared2TargetPtr(&%s->mem_ptr[plane_idx]);" % (prm.name_lower, desc))
1802 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[plane_idx]," % prm.name_lower )
1803 self.
target_c_code.write_line(
" %s->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1804 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1807 self.
target_c_code.write_line(
"%s_target_ptr = tivxMemShared2TargetPtr(&%s->mem_ptr[0]);" % (prm.name_lower, desc))
1809 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr," % prm.name_lower )
1810 self.
target_c_code.write_line(
" %s->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1811 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1812 elif prm.type == Type.RAW_IMAGE :
1813 self.
target_c_code.write_line(
"for(exposure_idx=0; exposure_idx<%s->params.num_exposures; exposure_idx++)" % desc )
1815 self.
target_c_code.write_line(
"%s_target_ptr[exposure_idx] = tivxMemShared2TargetPtr(&%s->mem_ptr[exposure_idx]);" % (prm.name_lower, desc))
1817 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[exposure_idx]," % prm.name_lower )
1818 self.
target_c_code.write_line(
" %s->mem_size[exposure_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1819 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1821 elif prm.type == Type.PYRAMID
or prm.type == Type.OBJECT_ARRAY:
1822 if prm.type == Type.PYRAMID :
1823 self.
target_c_code.write_line(
"tivxGetObjDescList(%s->obj_desc_id, (tivx_obj_desc_t**)img_%s, %s->num_levels);" % (desc, desc, desc) )
1825 self.
target_c_code.write_line(
"tivxGetObjDescList(%s->obj_desc_id, (tivx_obj_desc_t**)img_%s, %s->num_items);" % (desc, desc, desc) )
1827 if prm.type == Type.PYRAMID :
1828 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_levels; i++)" % desc )
1830 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_items; i++)" % desc )
1832 self.
target_c_code.write_line(
"for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1834 self.
target_c_code.write_line(
"%s_target_ptr[i] = tivxMemShared2TargetPtr(&img_%s[i]->mem_ptr[plane_idx]);" % (prm.name_lower, desc))
1836 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[i]," % prm.name_lower )
1837 self.
target_c_code.write_line(
" img_%s[i]->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1838 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1842 if prm.type == Type.PYRAMID :
1843 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_levels; i++)" % desc )
1845 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_items; i++)" % desc )
1847 self.
target_c_code.write_line(
"%s_target_ptr[i] = tivxMemShared2TargetPtr(&img_%s[i]->mem_ptr[0]);" % (prm.name_lower, desc))
1849 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[i]," % prm.name_lower )
1850 self.
target_c_code.write_line(
" img_%s[i]->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1851 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1853 elif prm.type != Type.THRESHOLD:
1854 self.
target_c_code.write_line(
"%s_target_ptr = tivxMemShared2TargetPtr(&%s->mem_ptr);" % (prm.name_lower, desc))
1856 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr," % prm.name_lower )
1857 self.
target_c_code.write_line(
" %s->mem_size, (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1858 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1859 if prm.state
is ParamState.OPTIONAL:
1865 for prm
in self.
kernel.params :
1866 desc = prm.name_lower +
"_desc" 1867 if (Type.is_scalar_type(prm.type)
is True)
and prm.direction != Direction.OUTPUT :
1868 if prm.state
is ParamState.OPTIONAL:
1871 if "invalid" != Type.get_scalar_obj_desc_data_name(prm.type):
1872 self.
target_c_code.write_line(
"%s_value = %s->data.%s;" % (prm.name_lower, desc, Type.get_scalar_obj_desc_data_name(prm.type)))
1874 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Modify 'scalar data type' below to be correct type >")
1875 self.
target_c_code.write_line(
"/*%s_value = %s->data.<scalar data type>;*/" % (prm.name_lower, desc))
1876 if prm.state
is ParamState.OPTIONAL:
1882 if self.
kernel.getNumImages() > 0:
1883 self.
target_c_code.write_line(
"void *img_ptrs[%s];" % self.
kernel.getNumImages(), files=1)
1886 for prm
in self.
kernel.params :
1887 if prm.type == Type.IMAGE
and (prm.do_map
or prm.do_unmap):
1888 self.
target_c_code.write_line(
"VXLIB_bufParams2D_t vxlib_%s;" % prm.name_lower)
1889 self.
target_c_code.write_line(
"uint8_t *%s_addr = NULL;" % prm.name_lower)
1891 for prm
in self.
kernel.params :
1892 desc = prm.name_lower +
"_desc" 1893 if prm.type == Type.IMAGE
and (prm.do_map
or prm.do_unmap):
1894 if prm.state
is ParamState.OPTIONAL:
1897 self.
target_c_code.write_line(
"tivxInitBufParams(%s, &vxlib_%s);" % (desc, prm.name_lower) )
1898 self.
target_c_code.write_line(
"tivxSetPointerLocation(%s, &%s_target_ptr, &%s_addr);" % (desc, prm.name_lower, prm.name_lower) )
1899 if prm.state
is ParamState.OPTIONAL:
1904 if self.
kernel.getNumImages() > 0:
1906 if self.
kernel.getNumOptionalImages() > 0 :
1907 num_scenarios = (2 ** self.
kernel.getNumOptionalImages()) - 1
1910 if num_scenarios == 1
and self.
kernel.getNumOptionalImages() == 0 :
1912 elif num_scenarios == 1
and self.
kernel.getNumOptionalImages() > 0 :
1916 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1917 self.
target_c_code.write_comment_line(
"status = tivxBamProcessGraph(prms->graph_handle);", files=1)
1920 self.
target_c_code.write_comment_line(
"call kernel processing function")
1922 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Add target kernel processing code here >")
1924 self.
target_c_code.write_comment_line(
"kernel processing function complete")
1929 for prm
in self.
kernel.params :
1930 desc = prm.name_lower +
"_desc" 1932 if prm.state
is ParamState.OPTIONAL:
1935 if Type.IMAGE == prm.type
or Type.PYRAMID == prm.type
or Type.OBJECT_ARRAY == prm.type
or Type.RAW_IMAGE == prm.type:
1938 if len(prm.data_types) > 1 :
1939 for dt
in prm.data_types[0:-1] :
1940 if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1943 if prm.type == Type.IMAGE :
1945 self.
target_c_code.write_line(
"for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1947 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[plane_idx]," % prm.name_lower )
1948 self.
target_c_code.write_line(
" %s->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1949 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1952 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr," % prm.name_lower )
1953 self.
target_c_code.write_line(
" %s->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1954 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1955 elif prm.type == Type.RAW_IMAGE :
1956 self.
target_c_code.write_line(
"for(exposure_idx=0; exposure_idx<%s->params.num_exposures; exposure_idx++)" % desc )
1958 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[exposure_idx]," % prm.name_lower )
1959 self.
target_c_code.write_line(
" %s->mem_size[exposure_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1960 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1962 elif prm.type == Type.PYRAMID
or prm.type == Type.OBJECT_ARRAY :
1964 if prm.type == Type.PYRAMID :
1965 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_levels; i++)" % desc )
1967 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_items; i++)" % desc )
1969 self.
target_c_code.write_line(
"for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1971 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[i]," % prm.name_lower )
1972 self.
target_c_code.write_line(
" img_%s[i]->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1973 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1977 if prm.type == Type.PYRAMID :
1978 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_levels; i++)" % desc )
1980 self.
target_c_code.write_line(
"for(i=0U; i<%s->num_items; i++)" % desc )
1982 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[i]," % prm.name_lower )
1983 self.
target_c_code.write_line(
" img_%s[i]->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1984 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1986 elif prm.type != Type.THRESHOLD :
1987 self.
target_c_code.write_line(
"tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr," % prm.name_lower )
1988 self.
target_c_code.write_line(
" %s->mem_size, (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1989 self.
target_c_code.write_line(
" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1990 if prm.state
is ParamState.OPTIONAL:
1996 for prm
in self.
kernel.params :
1997 desc = prm.name_lower +
"_desc" 1998 if (Type.is_scalar_type(prm.type)
is True)
and prm.direction != Direction.INPUT :
1999 if "invalid" != Type.get_scalar_obj_desc_data_name(prm.type):
2000 self.
target_c_code.write_line(
"%s->data.%s = %s_value;" % (desc, Type.get_scalar_obj_desc_data_name(prm.type), prm.name_lower))
2002 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: (Optional) Modify 'scalar data type' below to be correct type >")
2003 self.
target_c_code.write_line(
"/*%s->data.<scalar data type> = %s_value;*/" % (prm.name_lower, desc))
2013 def generate_target_c_file_code(self):
2026 self.
target_c_code.write_include(
"tivx_kernels_target_utils.h")
2028 self.
target_c_code.write_include(
"tivx_bam_kernel_wrapper.h", files=1)
2033 self.
target_c_code.write_comment_line(
"< DEVELOPER_TODO: Uncomment if kernel context is needed >")
2038 self.
target_c_code.write_line(
"static tivx_target_kernel vx_%s_target_kernel = NULL;" % (self.
kernel.name_lower))
2041 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sProcess(" % self.
kernel.name_camel)
2042 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
2043 self.
target_c_code.write_line(
" tivx_obj_desc_t *obj_desc[],")
2044 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg);")
2045 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sCreate(" % self.
kernel.name_camel)
2046 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
2047 self.
target_c_code.write_line(
" tivx_obj_desc_t *obj_desc[],")
2048 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg);")
2049 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sDelete(" % self.
kernel.name_camel)
2050 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
2051 self.
target_c_code.write_line(
" tivx_obj_desc_t *obj_desc[],")
2052 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg);")
2053 self.
target_c_code.write_line(
"static vx_status VX_CALLBACK tivx%sControl(" % self.
kernel.name_camel)
2054 self.
target_c_code.write_line(
" tivx_target_kernel_instance kernel,")
2055 self.
target_c_code.write_line(
" uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[],")
2056 self.
target_c_code.write_line(
" uint16_t num_params, void *priv_arg);")
2067 def generate_make_files(self, kernel) :
2068 if self.
env_var ==
'CUSTOM_KERNEL_PATH' or self.
env_var ==
'CUSTOM_APPLICATION_PATH':
2073 self.
concerto_inc_code.write_line(
"# This file contains a list of extension kernel specific static libraries")
2074 self.
concerto_inc_code.write_line(
"# to be included in the PC executables. It is put in this separate file")
2075 self.
concerto_inc_code.write_line(
"# to make it easier to add/extend kernels without needing to modify")
2076 self.
concerto_inc_code.write_line(
"# several concerto.mak files which depend on kernel libraries.")
2079 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2092 self.
concerto_inc_code.write_line(
"# < DEVELOPER_TODO: Add any additional dependent libraries >")
2095 if self.
env_var ==
'CUSTOM_KERNEL_PATH' or self.
env_var ==
'CUSTOM_APPLICATION_PATH':
2100 self.
tools_path_code.write_line(
"# This file can optionally be used to define environment variables which")
2101 self.
tools_path_code.write_line(
"# are needed by the kernel libraries defined in this folder, or can be")
2102 self.
tools_path_code.write_line(
"# used to overwrite environment variables from the psdk_tools_path.mak")
2103 self.
tools_path_code.write_line(
"# and vsdk_tools_path.mak files from the tiovx directory.")
2105 self.
tools_path_code.write_line(
"# < DEVELOPER_TODO: Add any custom PATH environment variables >")
2119 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2138 targetCpuListString =
"x86_64 " 2139 for tar
in kernel.targets :
2140 if (tar == Target.DSP1
or tar == Target.DSP2)
and (dspAdded ==
False) :
2141 targetCpuListString+=
"C66 " 2143 if (tar == Target.A15_0)
and (armAdded ==
False) :
2144 targetCpuListString+=
"A72 " 2146 if (tar == Target.MCU2_0
or tar == Target.MCU2_1
or tar == Target.IPU2)
and (ipuAdded ==
False) :
2147 targetCpuListString+=
"R5F " 2149 if (tar == Target.DSP_C7_1)
and (c7xAdded ==
False) :
2150 targetCpuListString+=
"C71 " 2156 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2162 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2168 if self.
env_var !=
"VISION_APPS_PATH" :
2174 self.
module_target_concerto_code.write_line(
"# < DEVELOPER_TODO: Add any custom preprocessor defines or build options needed using")
2176 self.
module_target_concerto_code.write_line(
"# < DEVELOPER_TODO: Adjust which cores this library gets built on using 'SKIPBUILD'. >")
2201 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2207 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2213 if self.
env_var !=
"VISION_APPS_PATH" :
2262 if self.
env_var !=
"VISION_APPS_PATH" :
2268 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2273 if self.
env_var ==
"CUSTOM_KERNEL_PATH" :
2275 if self.
env_var ==
"CUSTOM_APPLICATION_PATH" :
2286 self.
module_test_concerto_code.write_line(
"ifeq ($(HOST_COMPILER),$(filter $(HOST_COMPILER),GCC GCC_WINDOWS GCC_LINUX GCC_LINUX_ARM))")
2300 def generate_headers(self) :
2301 if( self.
env_var ==
'CUSTOM_KERNEL_PATH' ) :
2363 self.
include_customer_kernels_code.write_line(
" * \\arg <tt>\\ref VX_TYPE_IMAGE</tt> for a <tt>\\ref vx_image</tt> in the size field of <tt>\\ref vxGetParameterByIndex</tt> or <tt>\\ref vxSetParameterByIndex</tt>")
2364 self.
include_customer_kernels_code.write_line(
" * \\arg <tt>\\ref VX_TYPE_ARRAY</tt> for a <tt>\\ref vx_array</tt> in the size field of <tt>\\ref vxGetParameterByIndex</tt> or <tt>\\ref vxSetParameterByIndex</tt>")
2392 self.
include_customer_kernels_code.write_line(
"void tivx" + toCamelCase(self.
module) +
"PrintPerformance(vx_perf_t performance, uint32_t numPixels, const char* testName);")
2408 for prm
in self.
kernel.params :
2409 if(prm.state == ParamState.OPTIONAL) :
2417 self.
include_customer_nodes_code.write_line(
" * \\retval vx_node A node reference. Any possible errors preventing a successful creation should be checked using <tt>\\ref vxGetStatus</tt>")
2420 for prm
in self.
kernel.params[:-1] :
2421 if Type.is_scalar_type(prm.type) :
2474 def generate_sources(self) :
2482 self.
host_node_api_code.write_line(
"VX_API_ENTRY vx_node VX_API_CALL tivx" + self.
kernel.name_camel +
"Node(vx_graph graph,")
2483 for prm
in self.
kernel.params[:-1] :
2484 if Type.is_scalar_type(prm.type) :
2485 self.
host_node_api_code.write_line(
"%-37s %-20s %s," % (
"",
"vx_scalar", prm.name_lower))
2487 self.
host_node_api_code.write_line(
"%-37s %-20s %s," % (
"", prm.type.get_vx_name(), prm.name_lower))
2491 for prm
in self.
kernel.params[:-1] :
2495 self.
host_node_api_code.write_line(
"vx_node node = tivxCreateNodeByKernelName(graph,")
2512 self.
host_kernels_code.write_line(
"static vx_status VX_CALLBACK publishKernels(vx_context context);")
2513 self.
host_kernels_code.write_line(
"static vx_status VX_CALLBACK unPublishKernels(vx_context context);")
2517 self.
host_kernels_code.write_line(
"vx_status tivxAddKernel" + self.
kernel.name_camel +
"(vx_context context);")
2519 self.
host_kernels_code.write_line(
"vx_status tivxRemoveKernel" + self.
kernel.name_camel +
"(vx_context context);")
2521 self.
host_kernels_code.write_line(
"static Tivx_Host_Kernel_List gTivx_host_kernel_list[] = {")
2525 self.
host_kernels_code.write_line(
"static vx_status VX_CALLBACK publishKernels(vx_context context)")
2527 self.
host_kernels_code.write_line(
"return tivxPublishKernels(context, gTivx_host_kernel_list, dimof(gTivx_host_kernel_list));")
2530 self.
host_kernels_code.write_line(
"static vx_status VX_CALLBACK unPublishKernels(vx_context context)")
2532 self.
host_kernels_code.write_line(
"return tivxUnPublishKernels(context, gTivx_host_kernel_list, dimof(gTivx_host_kernel_list));")
2537 self.
host_kernels_code.write_line(
"tivxRegisterModule(TIVX_MODULE_NAME_" + self.
module.upper() +
", publishKernels, unPublishKernels);")
2547 self.
host_kernels_code.write_line(
"if ((0 == gIs" + toCamelCase(self.
module) +
"KernelsLoad) && (NULL != context))")
2552 self.
host_kernels_code.write_line(
"/* These three lines only work on PC emulation mode ...")
2553 self.
host_kernels_code.write_line(
" * this will need to be updated when moving to target */")
2557 for target
in self.
kernel.targets :
2558 self.
host_kernels_code.write_line(
"tivxSetSelfCpuId(%s);" % Cpu.get_vx_enum_name(Target.get_cpu(target)))
2566 self.
host_kernels_code.write_line(
"void tivx" + toCamelCase(self.
module) +
"UnLoadKernels(vx_context context)")
2571 self.
host_kernels_code.write_line(
"if ((0u == gIs" + toCamelCase(self.
module) +
"KernelsLoad) && (NULL != context))")
2576 self.
host_kernels_code.write_line(
"/* This line only work on PC emulation mode ...")
2577 self.
host_kernels_code.write_line(
" * this will need to be updated when moving to target */")
2623 self.
target_kernels_code.write_line(
"static Tivx_Target_Kernel_List gTivx_target_kernel_list[] = {")
2627 self.
target_kernels_code.write_line(
" {&tivxAddTargetKernelBam" + self.
kernel.name_camel +
", &tivxRemoveTargetKernelBam" + self.
kernel.name_camel +
"},")
2640 self.
target_kernels_code.write_line(
"tivxRegisterTargetKernels(gTivx_target_kernel_list, dimof(gTivx_target_kernel_list));")
2645 self.
target_kernels_code.write_line(
"tivxUnRegisterTargetKernels(gTivx_target_kernel_list, dimof(gTivx_target_kernel_list));")
2651 def modify_files(self) :
2661 def modify_test_header(self) :
2666 "TESTCASE(tivx" + toCamelCase(self.
module) + self.
kernel.name_camel +
")",
2669 "TESTCASE(tivx" + toCamelCase(self.
module) + self.
kernel.name_camel +
")\n")
2671 def modify_make_file(self) :
2672 if self.
env_var ==
'CUSTOM_KERNEL_PATH' :
2675 "vx_kernels_" + self.
module,
2676 "STATIC_LIBS += vx_conformance_engine",
2677 "STATIC_LIBS += vx_target_kernels_" + self.
core +
"\n",
2678 "STATIC_LIBS += vx_conformance_engine",
2679 "STATIC_LIBS += vx_conformance_engine",
2680 "STATIC_LIBS += vx_target_kernels_" + self.
core +
"\n")
2683 "vx_kernels_" + self.
module,
2684 "STATIC_LIBS += vx_conformance_engine",
2685 "STATIC_LIBS += vx_target_kernels_" + self.
core +
"_bam\n",
2686 "STATIC_LIBS += vx_conformance_engine",
2687 "STATIC_LIBS += vx_conformance_engine",
2688 "STATIC_LIBS += vx_target_kernels_" + self.
core +
"_bam\n")
2689 elif self.
env_var ==
'CUSTOM_APPLICATION_PATH' :
2692 "vx_kernels_" + self.
module,
2693 "STATIC_LIBS += vx_conformance_engine",
2694 "STATIC_LIBS += vx_target_kernels_" + self.
module +
"_" + self.
core +
"\n",
2695 "STATIC_LIBS += vx_conformance_engine",
2696 "STATIC_LIBS += vx_conformance_engine",
2697 "STATIC_LIBS += vx_target_kernels_" + self.
module +
"_" + self.
core +
"\n")
2700 "vx_kernels_" + self.
module,
2701 "STATIC_LIBS += vx_conformance_engine",
2702 "STATIC_LIBS += vx_target_kernels_" + self.
module +
"_" + self.
core +
"_bam\n",
2703 "STATIC_LIBS += vx_conformance_engine",
2704 "STATIC_LIBS += vx_conformance_engine",
2705 "STATIC_LIBS += vx_target_kernels_" + self.
module +
"_" + self.
core +
"_bam\n")
2708 def modify_kernel_header_file(self) :
2711 self.
insert = (
r"! \\brief Name for OpenVX Extension kernel module: " + self.
module +
"\n" +
2712 " * \\ingroup group_tivx_ext\n" +
2714 "#define TIVX_MODULE_NAME_" + self.
module.upper() +
" \"" + self.
module +
"\"\n\n")
2717 "vxGetKernelByName",
2718 "#define TIVX_MODULE_NAME_" + self.
module.upper() +
" \"" + self.
module +
"\"",
2719 r"/*! \\brief The list of kernels supported",
2720 r"/*! \\brief The list of kernels supported",
2724 r" \\brief The list of kernels supported in " + self.
module +
" module" +
"\n" +
2726 r" * Each kernel listed here can be used with the <tt>\\ref vxGetKernelByEnum</tt> call." +
"\n" +
2727 " * When programming the parameters, use" +
"\n" +
2728 r" * \\arg <tt>\\ref VX_INPUT</tt> for [in]" +
"\n" +
2729 r" * \\arg <tt>\\ref VX_OUTPUT</tt> for [out]" +
"\n" +
2730 r" * \\arg <tt>\\ref VX_BIDIRECTIONAL</tt> for [in,out]" +
"\n" +
2732 " * When programming the parameters, use" +
"\n" +
2733 r" * \\arg <tt>\\ref VX_TYPE_IMAGE</tt> for a <tt>\\ref vx_image</tt> in the size field of <tt>\\ref vxGetParameterByIndex</tt> or <tt>\\ref vxSetParameterByIndex</tt>" +
"\n" +
2734 r" * \\arg <tt>\\ref VX_TYPE_ARRAY</tt> for a <tt>\\ref vx_array</tt> in the size field of <tt>\\ref vxGetParameterByIndex</tt> or <tt>\\ref vxSetParameterByIndex</tt>" +
"\n" +
2735 r" * \\arg or other appropriate types in \\ref vx_type_e." +
"\n" +
2736 " * \\ingroup group_kernel" +
"\n" +
2738 r"/*! \\brief " + self.
kernel.name_lower +
" kernel name" +
"\n" +
2739 " * \\see group_vision_function_" + self.
module +
"\n" +
2741 "#define " + self.
kernel.enum_str_prefix + self.
kernel.name_upper +
"_NAME \"" + self.
kernel.name_str_prefix + self.
module.lower() +
"." + self.
kernel.name_lower +
"\"\n\n" +
2742 "/*! End of group_vision_function_" + self.
module +
" */\n\n" 2745 "The list of kernels supported in",
2746 " Used for the Application to load the",
2747 "The list of kernels supported in " + self.
module +
" module",
2748 r" * \\brief Used for the Application to load the",
2749 r" * \\brief Used for the Application to load the",
2754 r" * \\brief Used for the Application to load the " + self.
module +
" kernels into the context." +
"\n" +
2755 " * \\ingroup group_kernel" +
"\n" +
2757 "void tivx" + toCamelCase(self.
module) +
"LoadKernels(vx_context context);" +
"\n" +
"\n" +
2759 r" * \\brief Used for the Application to unload the " + self.
module +
" kernels from the context." +
"\n" +
2760 " * \\ingroup group_kernel" +
"\n" +
2762 "void tivx" + toCamelCase(self.
module) +
"UnLoadKernels(vx_context context);" +
"\n" +
"\n" +
2764 r" * \\brief Used to print the performance of the kernels." +
"\n" +
2765 " * \\ingroup group_kernel" +
"\n" +
2767 "void tivx" + toCamelCase(self.
module) +
"PrintPerformance(vx_perf_t performance, uint32_t numPixels, const char* testName);" +
"\n" +
"\n" 2771 "#ifdef __cplusplus",
2772 "void tivx" + toCamelCase(self.
module) +
"LoadKernels",
2773 "#ifdef __cplusplus",
2774 "#ifdef __cplusplus",
2778 self.
insert = (
r"/*! \\brief " + self.
kernel.name_lower +
" kernel name\n" +
2779 " * \\see group_vision_function_" + self.
module +
"\n" +
2781 "#define " + self.
kernel.enum_str_prefix + self.
kernel.name_upper +
"_NAME \"" + self.
kernel.name_str_prefix + self.
module.lower() +
"." + self.
kernel.name_lower +
"\"\n\n")
2783 "The list of kernels supported in " + self.
module +
" module",
2784 " End of group_vision_function_" + self.
module,
2785 " " +self.
kernel.enum_str_prefix + self.
kernel.name_upper +
"_NAME",
2786 r"\/\*\! End of group_vision_function_" + self.
module +
" \*\/",
2787 r"/*! End of group_vision_function_" + self.
module +
" */",
2790 def modify_node_header_file(self) :
2792 self.
insert = (
r"/*! \\brief [Graph] Creates a " + self.
kernel.name_upper +
" Node.\n")
2793 self.
insert += (
r" * \\param [in] graph The reference to the graph.\n")
2794 for prm
in self.
kernel.params :
2795 if(prm.state == ParamState.OPTIONAL) :
2799 self.
insert += (
" * \param [" + prm.direction.get_doxygen_name() +
"] " + prm.name_lower + self.
paramstate +
"\n")
2800 self.
insert += (
r" * \\see <tt>" + self.
kernel.enum_str_prefix + self.
kernel.name_upper +
"_NAME</tt>" +
"\n")
2801 self.
insert += (
r" * \\ingroup group_vision_function_" + self.
kernel.name_lower +
"\n")
2802 self.
insert += (
r" * \\return <tt>\\ref vx_node</tt>.\n")
2803 self.
insert += (
r" * \\retval vx_node A node reference. Any possible errors preventing a successful creation should be checked using <tt>\\ref vxGetStatus</tt>\n")
2804 self.
insert += (
r" */\n")
2805 self.
insert += (
"VX_API_ENTRY vx_node VX_API_CALL tivx" + self.
kernel.name_camel +
"Node(vx_graph graph,\n")
2806 for prm
in self.
kernel.params[:-1] :
2807 if Type.is_scalar_type(prm.type) :
2808 self.
insert += (
"%-37s %-20s %s,\n" % (
"",
"vx_scalar", prm.name_lower))
2810 self.
insert += (
"%-37s %-20s %s,\n" % (
"", prm.type.get_vx_name(), prm.name_lower))
2811 if Type.is_scalar_type(self.
kernel.params[-1].type) :
2812 self.
insert += (
"%-37s %-20s %s);\n" % (
"",
"vx_scalar", self.
kernel.params[-1].name_lower))
2814 self.
insert += (
"%-37s %-20s %s);\n" % (
"", self.
kernel.params[-1].type.get_vx_name(), self.
kernel.params[-1].name_lower))
2819 "#ifdef __cplusplus",
2820 " tivx" + self.
kernel.name_camel +
"Node(vx_graph graph,",
2821 "#ifdef __cplusplus",
2822 "#ifdef __cplusplus",
2825 def modify_node_api_source_file(self) :
2828 self.
insert = (
"VX_API_ENTRY vx_node VX_API_CALL tivx" + self.
kernel.name_camel +
"Node(vx_graph graph,\n")
2829 for prm
in self.
kernel.params[:-1] :
2830 if Type.is_scalar_type(prm.type) :
2831 self.
insert += (
"%-37s %-20s %s,\n" % (
"",
"vx_scalar", prm.name_lower))
2833 self.
insert += (
"%-37s %-20s %s,\n" % (
"", prm.type.get_vx_name(), prm.name_lower))
2834 if Type.is_scalar_type(self.
kernel.params[-1].type) :
2835 self.
insert += (
"%-37s %-20s %s)\n" % (
"",
"vx_scalar", self.
kernel.params[-1].name_lower))
2837 self.
insert += (
"%-37s %-20s %s)\n" % (
"", self.
kernel.params[-1].type.get_vx_name(), self.
kernel.params[-1].name_lower))
2839 self.
insert += (
" vx_reference prms[] = {\n")
2840 for prm
in self.
kernel.params[:-1] :
2841 self.
insert += (
"%-11s (vx_reference)%s,\n" % (
"", prm.name_lower))
2842 self.
insert += (
"%-11s (vx_reference)%s\n" % (
"", self.
kernel.params[-1].name_lower))
2844 self.
insert += (
" vx_node node = tivxCreateNodeByKernelName(graph,\n")
2845 self.
insert += (
"%-42s %s_NAME,\n" % (
"", self.
kernel.enum_str_prefix + self.
kernel.name_upper))
2846 self.
insert += (
"%-42s prms,\n" % (
""))
2847 self.
insert += (
"%-42s dimof(prms));\n" % (
""))
2848 self.
insert += (
" return node;\n}\n\n")
2852 def modify_module_host_header_file(self) :
2856 self.
insert += (
r" * \\brief Function to register " + self.
module.upper() +
" Kernels on the " + self.
core +
" Target\n")
2857 self.
insert += (
r" * \\ingroup group_tivx_ext\n")
2858 self.
insert += (
r" */\n")
2859 self.
insert += (
r"void tivxRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels(void);\n\n")
2860 self.
insert += (
r"/*!\n")
2861 self.
insert += (
r" * \\brief Function to un-register " + self.
module.upper() +
" Kernels on the " + self.
core +
" Target\n")
2862 self.
insert += (
r" * \\ingroup group_tivx_ext\n")
2863 self.
insert += (
r" */\n")
2864 self.
insert += (
r"void tivxUnRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels(void);\n\n")
2866 "Interface file for the " + self.
module.upper() +
" kernels",
2867 "#ifdef __cplusplus",
2868 "void tivxRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels(void);",
2869 "\n#ifdef __cplusplus",
2870 "\n#ifdef __cplusplus",
2873 def modify_module_host_source_file(self) :
2876 "vx_status tivxAddKernel",
2877 "vx_status tivxRemoveKernel",
2878 "vx_status tivxAddKernel" + self.
kernel.name_camel +
"(vx_context context);",
2879 "\nvx_status tivxRemoveKernel",
2880 "\nvx_status tivxRemoveKernel",
2881 "vx_status tivxAddKernel" + self.
kernel.name_camel +
"(vx_context context);\n")
2884 "vx_status tivxRemoveKernel",
2885 "Tivx_Host_Kernel_List",
2886 "vx_status tivxRemoveKernel" + self.
kernel.name_camel +
"(vx_context context);",
2887 "\nstatic Tivx_Host_Kernel_List",
2888 "\nstatic Tivx_Host_Kernel_List",
2889 "vx_status tivxRemoveKernel" + self.
kernel.name_camel +
"(vx_context context);\n")
2892 "Tivx_Host_Kernel_List",
2894 " {&tivxAddKernel" + self.
kernel.name_camel +
", &tivxRemoveKernel" + self.
kernel.name_camel +
"}",
2897 " {&tivxAddKernel" + self.
kernel.name_camel +
", &tivxRemoveKernel" + self.
kernel.name_camel +
"},\n")
2900 "tivx" + toCamelCase(self.
module) +
"LoadKernels",
2902 " tivxRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels();",
2903 " tivxSetSelfCpuId\(TIVX_CPU_ID_DSP1\);",
2904 " tivxSetSelfCpuId(TIVX_CPU_ID_DSP1);",
2905 " tivxRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels();\n")
2908 "tivx" + toCamelCase(self.
module) +
"UnLoadKernels",
2910 " tivxUnRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels();",
2911 "\n gIs" + toCamelCase(self.
module) +
"KernelsLoad",
2912 "\n gIs" + toCamelCase(self.
module) +
"KernelsLoad",
2913 " tivxUnRegister" + toCamelCase(self.
module) +
"Target" + toCamelCase(self.
core) +
"Kernels();\n")
2915 def modify_module_target_source_file(self) :
2920 "void tivxAddTargetKernel",
2922 "void tivxAddTargetKernelBam" + self.
kernel.name_camel +
"(void);",
2925 "void tivxAddTargetKernelBam" + self.
kernel.name_camel +
"(void);\n")
2928 "void tivxAddTargetKernel",
2930 "void tivxAddTargetKernel" + self.
kernel.name_camel +
"(void);",
2933 "void tivxAddTargetKernel" + self.
kernel.name_camel +
"(void);\n")
2936 "void tivxAddTargetKernel",
2938 "void tivxAddTargetKernel" + self.
kernel.name_camel +
"(void);",
2945 "void tivxRemoveTargetKernel",
2946 "static Tivx_Target_Kernel_List",
2947 "void tivxRemoveTargetKernelBam" + self.
kernel.name_camel +
"(void);",
2950 "void tivxRemoveTargetKernelBam" + self.
kernel.name_camel +
"(void);\n")
2953 "void tivxRemoveTargetKernel",
2954 "static Tivx_Target_Kernel_List",
2955 "void tivxRemoveTargetKernel" + self.
kernel.name_camel +
"(void);",
2958 "void tivxRemoveTargetKernel" + self.
kernel.name_camel +
"(void);\n")
2961 "void tivxRemoveTargetKernel",
2963 "void tivxRemoveTargetKernel" + self.
kernel.name_camel +
"(void);",
2970 "Tivx_Target_Kernel_List",
2972 " {&tivxAddTargetKernelBam" + self.
kernel.name_camel +
", &tivxRemoveTargetKernelBam" + self.
kernel.name_camel +
"},",
2975 " {&tivxAddTargetKernelBam" + self.
kernel.name_camel +
", &tivxRemoveTargetKernelBam" + self.
kernel.name_camel +
"},\n")
2978 "Tivx_Target_Kernel_List",
2980 " {&tivxAddTargetKernel" + self.
kernel.name_camel +
", &tivxRemoveTargetKernel" + self.
kernel.name_camel +
"},",
2983 " {&tivxAddTargetKernel" + self.
kernel.name_camel +
", &tivxRemoveTargetKernel" + self.
kernel.name_camel +
"},\n")
2986 "Tivx_Target_Kernel_List",
2988 " {&tivxAddTargetKernel" + self.
kernel.name_camel +
", &tivxRemoveTargetKernel" + self.
kernel.name_camel +
"},",
2994 if self.
env_var ==
'CUSTOM_KERNEL_PATH' or self.
env_var ==
'CUSTOM_APPLICATION_PATH':
3005 self.
todo_code.write_line(
"# This file lists the places in the generated code where the developer is expected")
3006 self.
todo_code.write_line(
"# to add custom code beyond what the script can generate. This is generated as ")
3007 self.
todo_code.write_line(
"# part of the KernelExportCode.export() function, but may also be called independently ")
3008 self.
todo_code.write_line(
"# by calling the KernelExportCode.todo() function with the requirement that the ")
3009 self.
todo_code.write_line(
"# "+self.
env_var+
" environment variable is defined. This function simply searches")
3010 self.
todo_code.write_line(
"# for the \"< DEVELOPER_TODO ...>\" string in all the files from this path, and lists them.")
3011 self.
todo_code.write_line(
"# Removing the \"< DEVELOPER_TODO ...>\" comment block from the files will effectively remove those")
3012 self.
todo_code.write_line(
"# lines from showing up in this file the next time KernelExportCode.todo() is run.")
3013 if self.
env_var ==
'CUSTOM_KERNEL_PATH' or self.
env_var ==
'CUSTOM_APPLICATION_PATH':
3018 with open(file,
'rb')
as f:
3019 for num, line
in enumerate(f, 1):
3020 if 'DEVELOPER_TODO'.encode()
in line:
3021 if '>'.encode()
in line:
3025 self.
modLine = re.sub(
"^.*?DEVELOPER_TODO:".encode(),
"".encode(), line)
3030 self.
todo_code.write_line(
"\n" + file, new_line=
False)
3031 self.
todo_code.write_line(
"\n " + str(num) +
": " + self.
modLine.decode(
'utf-8'), new_line=
False)
3035 if '>'.encode()
in line :
3037 self.
modLine = re.sub(
"^.*?DEVELOPER_TODO:".encode(),
"".encode(), line)
3044 self.
todo_code.write_line(
" " + str(num) +
": " + self.
modLine.decode(
'utf-8'), new_line=
False)
3054 self.
h_filename =
"tivx_kernel_" + kernel.name_lower +
".h";
3063 for target in self.kernel.targets : 3064 if target == Target.DSP1 or target == Target.DSP2 : 3065 self.target_uses_dsp = True 3069 if self.
kernel.localMem ==
True :
3083 print (
'Generating C code for OpenVX kernel ...')
3085 print (
'Creating new directories ...')
3087 print (
'Creating new makefiles ...')
3089 print (
'Creating new headers ...')
3091 print (
'Creating new module-level sources ...')
3096 print (
'Creating new kernel-specific files ...')
3103 print (
'Generating C code for OpenVX kernel ... DONE !!!')
include_customer_nodes_code
def generate_headers(self)
def modify_node_header_file(self)
module_test_concerto_filename
def generate_h_file_code(self)
module_host_concerto_code
def generate_target_c_control_func_code(self)
def generate_host_c_remove_func_code(self)
include_customer_kernels_code
def outputNodeList(self, kernel)
def generate_target_c_remove_func_code(self)
def generate_target_c_process_func_code(self)
def generate_target_c_create_func_code(self)
def modify_module_host_header_file(self)
def create_all_directories(self)
def generate_bam_pointers(self, kernel_params)
def generate_host_c_initialize_func_code(self)
def generate_target_c_file_code(self)
def convert_string_to_array_type(self, print_type)
def generate_target_c_add_func_code(self)
def generate_optional_bam_pointers(self, num_scenarios)
def generate_optional_list(self, kernel_params)
module_target_bam_concerto_filename
def getTargetColor(self, target)
def modify_node_api_source_file(self)
def generate_sources(self)
include_custom_kernel_library_tests_code
def create_directory(self, directory)
include_custom_kernel_library_tests_filename
def generate_host_c_file_code(self)
def modify_make_file(self)
def modify_module_host_source_file(self)
def outputNodeConnectionList(self, kernel)
def exportDiagram(self, kernel)
Export object as C source code.
include_customer_header_code
Code object used to generate custom kernel.
module_include_kernels_filename
def check_array_type(self, print_type)
module_include_kernels_code
def modify_kernel_header_file(self)
def is_supported_type(self, type)
def extract_local_mem_string_error_check(self, new_str, type, name)
def generate_host_c_add_func_code(self)
def generate_target_c_delete_func_code(self)
module_test_concerto_code
def outputNode(self, kernel)
include_customer_nodes_filename
def modify_test_header(self)
def extract_attribute(self, local, is_first_prm)
def outputNodeConnection(self, kernel)
def modify_module_target_source_file(self)
def export(self, kernel)
Method for generating files from kernel.
module_target_concerto_code
def generate_make_files(self, kernel)
def extract_local_mem_string(self, type, attribute, local)
module_test_main_filename
include_customer_kernels_filename
def generate_target_c_struct(self)
module_host_concerto_filename
module_target_bam_concerto_code
def getDataColor(self, ref)
module_target_concerto_filename
include_customer_header_filename
def outputData(self, data)
def __init__(self, module="ext1", core="c66", env_var='VISION_APPS_PATH', include_subpath="TI", include_filename="")
Constructor used to create this object.
def outputDataList(self, kernel)
def generate_host_c_validate_func_code(self)
def verify_parameter_relationship_items(self, relationship_list, prm, attribute, name)