TIOVX User Guide
kernel_code.py
1 #
2 # Copyright (c) 2017 Texas Instruments Incorporated
3 #
4 # All rights reserved not granted herein.
5 #
6 # Limited License.
7 #
8 # Texas Instruments Incorporated grants a world-wide, royalty-free, non-exclusive
9 # license under copyrights and patents it now or hereafter owns or controls to make,
10 # have made, use, import, offer to sell and sell ("Utilize") this software subject to the
11 # terms herein. With respect to the foregoing patent license, such license is granted
12 # solely to the extent that any such patent is necessary to Utilize the software alone.
13 # The patent license shall not apply to any combinations which include this software,
14 # other than combinations with devices manufactured by or for TI ("TI Devices").
15 # No hardware patent is licensed hereunder.
16 #
17 # Redistributions must preserve existing copyright notices and reproduce this license
18 # (including the above copyright notice and the disclaimer and (if applicable) source
19 # code license limitations below) in the documentation and/or other materials provided
20 # with the distribution
21 #
22 # Redistribution and use in binary form, without modification, are permitted provided
23 # that the following conditions are met:
24 #
25 # No reverse engineering, decompilation, or disassembly of this software is
26 # permitted with respect to any software provided in binary form.
27 #
28 # any redistribution and use are licensed by TI for use only with TI Devices.
29 #
30 # Nothing shall obligate TI to provide you with source code for the software
31 # licensed and provided to you in object code.
32 #
33 # If software source code is provided to you, modification and redistribution of the
34 # source code are permitted provided that the following conditions are met:
35 #
36 # any redistribution and use of the source code, including any resulting derivative
37 # works, are licensed by TI for use only with TI Devices.
38 #
39 # any redistribution and use of any object code compiled from the source code
40 # and any resulting derivative works, are licensed by TI for use only with TI Devices.
41 #
42 # Neither the name of Texas Instruments Incorporated nor the names of its suppliers
43 #
44 # may be used to endorse or promote products derived from this software without
45 # specific prior written permission.
46 #
47 # DISCLAIMER.
48 #
49 # THIS SOFTWARE IS PROVIDED BY TI AND TI'S LICENSORS "AS IS" AND ANY EXPRESS
50 # OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
51 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
52 # IN NO EVENT SHALL TI AND TI'S LICENSORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54 # BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
55 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
56 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
57 # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
58 # OF THE POSSIBILITY OF SUCH DAMAGE.
59 #
60 #
61 
62 import os, sys, re
63 
64 from . import *
65 from glob import glob
66 
67 
195 
202  def __init__(self, module="ext1", core="c66", env_var='VISION_APPS_PATH', include_subpath="TI", include_filename="") :
203  self.company = include_subpath
204  self.module = ""
205  if type(module) is Module :
206  self.module = module.value
207  else :
208  print("WARNING: module argument should use the Module class to avoid potential name clashes")
209  self.module = module.lower()
210  if include_filename :
211  self.top_header_name = include_filename
212  else :
213  self.top_header_name = include_subpath.lower()+"vx_"+self.module.lower()
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")
218  self.core = core
219  else :
220  sys.exit("core argument has invalid type.")
221  self.env_var = env_var
222 
223  self.workarea = os.environ.get(self.env_var)
224 
225  if module == Module.TEST_KERNELS:
226  self.idirs_path = "$(HOST_ROOT)/conformance_tests/kernels"
227  else:
228  self.idirs_path = "$("+self.env_var+")"
229 
230  if self.workarea == None or self.workarea == "":
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.");
233 
234  if self.env_var == 'CUSTOM_KERNEL_PATH':
235  self.kernels_header_extension = "";
236  else:
237  self.kernels_header_extension = "_priv";
238 
239  def getDataColor(self, ref) :
240  return "GhostWhite"
241 
242  def outputData(self, data) :
243  self.file.write(' %s [color=%s, style=filled]\n' % (data.name_lower, self.getDataColor(data)))
244 
245  def outputDataList(self, kernel) :
246  self.file.write('\n')
247  self.file.write(' /* DATA OBJECTS */\n')
248  for ref in kernel.params :
249  self.outputData(ref)
250  self.file.write('\n')
251 
252  def getTargetColor(self, target) :
253  if target == Target.DSP1 :
254  return "palegreen"
255  if target == Target.DSP2 :
256  return "darkturquoise"
257  if target == Target.EVE1 :
258  return "yellow"
259  if target == Target.EVE2 :
260  return "gold"
261  if target == Target.EVE3 :
262  return "orange"
263  if target == Target.EVE4 :
264  return "goldenrod4"
265  if target == Target.A15_0 :
266  return "lightblue"
267  if target == Target.MCU2_0 :
268  return "grey"
269  if target == Target.MCU2_1 :
270  return "LightSalmon"
271  if target == Target.IPU2 :
272  return "MediumOrchid"
273  return "white"
274 
275  def outputNode(self, kernel) :
276  if kernel.targets :
277  self.file.write(' %s [label=\"%s\", color=%s, style=filled]\n' % (kernel.name_lower, kernel.name_lower, self.getTargetColor(kernel.targets[0])) )
278  else :
279  self.file.write(' %s [label=\"%s\", color=%s, style=filled]\n' % (kernel.name_lower, kernel.name_lower, self.getTargetColor("white")) )
280 
281  def outputNodeList(self, kernel) :
282  self.file.write('\n')
283  self.file.write(' /* NODE OBJECTS */\n')
284  self.outputNode(kernel)
285  self.file.write('\n')
286 
287  def outputNodeConnection(self, kernel) :
288  idx = 0
289  for prm in kernel.params :
290  if prm.direction == Direction.INPUT :
291  self.file.write(' %s -> %s [taillabel=%d, labeldistance=3]\n' % (prm.name_lower, kernel.name_lower, idx))
292  else :
293  self.file.write(' %s -> %s [headlabel=%d, labeldistance=3]\n' % (kernel.name_lower, prm.name_lower, idx))
294  idx = idx + 1
295 
296  def outputNodeConnectionList(self, kernel) :
297  self.file.write('\n')
298  self.file.write(' /* NODE CONNECTIONS */\n')
299  self.outputNodeConnection(kernel)
300  self.file.write('\n')
301 
302 
304  def exportDiagram(self, kernel) :
305  print ('Generating image from OpenVX kernel ...')
306  self.filename_prefix = kernel.name_lower
307  self.filename = kernel.name_lower + "_img.txt"
308  self.filenameJpg = kernel.name_lower + ".jpg"
309  self.file = None
310 
311  self.file = open(self.filename, 'w')
312  self.file.write('digraph %s {\n' % kernel.name_lower)
313  self.file.write('\n')
314  self.file.write(' label = \"%s\"\n' % kernel.name_lower)
315  self.outputDataList(kernel)
316  self.outputNodeList(kernel)
317  self.outputNodeConnectionList(kernel)
318  self.file.write('\n')
319  self.file.write('}\n')
320  self.file.close()
321 
322  try :
323  command_str = 'dot %s -Tjpg -o%s' % (self.filename, self.filenameJpg)
324  command_args = ['dot', self.filename, '-Tjpg','-o%s' % self.filenameJpg]
325  print('Executing dot tool command ... [' + command_str + ']')
326  subprocess.call(command_args)
327  print ('Generating image from OpenVX context ... DONE !!!')
328  except FileNotFoundError:
329  print('ERROR: \'dot\' tool not found. Make sure \'graphviz\' is installed and \'dot\' command is added to system PATH !!!')
330  print('ERROR: Cannot generate .jpg file !!!')
331 
332 
333  def setCompanyDirectory(self, company) :
334  self.company = company
335 
336  def setTopHeaderName(self, header) :
337  self.top_header_name = header
338 
339  def setModuleDirectory(self, module) :
340  if type(module) is Module :
341  self.module = module.value
342  elif type(core) is str :
343  self.module is module
344  self.top_header_name = include_subpath.lower()+"vx_"+self.module.lower()
345 
346  def setCoreDirectory(self, core) :
347  if type(core) is Core :
348  self.core = core.value
349  elif type(core) is str :
350  self.core = core
351  else :
352  sys.exit("core argument has invalid type.")
353 
354  def create_all_directories(self):
355  self.create_directory(self.workarea)
356 
357  if self.env_var == 'CUSTOM_KERNEL_PATH' :
358  self.workarea_include = self.workarea + "/include"
359  else :
360  self.workarea_include = self.workarea + "/kernels/" + self.module + "/include"
361 
363 
364  self.workarea_include_company = self.workarea_include + "/" + self.company
366 
367  if self.env_var == 'CUSTOM_KERNEL_PATH' :
368  self.workarea_module = self.workarea + "/" + self.module
369  else :
370  self.workarea_module = self.workarea + "/kernels/" + self.module
371 
373 
374  if self.env_var == 'CUSTOM_KERNEL_PATH' :
375  self.workarea_module_include = self.workarea_module + "/include"
376  else :
377  self.workarea_module_include = self.workarea_module + "/host"
378 
380 
381  self.workarea_module_host = self.workarea_module + "/host"
383 
384  self.workarea_module_core = self.workarea_module + "/" + self.core
386 
387  if self.target_uses_dsp :
388  self.workarea_module_core_bam = self.workarea_module + "/" + self.core + "/bam"
390 
391  self.workarea_module_test = self.workarea_module + "/test"
393 
394  def create_directory(self, directory):
395  self.directory = directory
396  if not os.path.exists(self.directory):
397  print("Creating " + self.directory)
398  os.makedirs(self.directory)
399 
400  def generate_h_file_code(self):
401  print("Creating " + self.workarea_module_include + "/" + self.h_filename)
402  self.h_code = CodeGenerate(self.workarea_module_include + "/" + self.h_filename)
403  self.h_code.write_ifndef_define("_" + self.kernel.enum_str_prefix + self.kernel.name_upper + "_")
404  self.h_code.write_extern_c_top()
405  self.h_code.write_newline();
406  for prm in self.kernel.params :
407  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))
408  self.h_code.write_newline();
409  self.h_code.write_line("#define %s%s_MAX_PARAMS (%dU)" % (self.kernel.enum_str_prefix, self.kernel.name_upper, len(self.kernel.params)))
410  self.h_code.write_newline();
411  self.h_code.write_extern_c_bottom()
412  self.h_code.write_newline()
413  self.h_code.write_endif("_" + self.kernel.enum_str_prefix + self.kernel.name_upper + "_")
414  self.h_code.close()
415 
416  def generate_host_c_add_func_code(self):
417  self.host_c_code.write_line("vx_status tivxAddKernel%s(vx_context context)" % (self.kernel.name_camel))
418  self.host_c_code.write_open_brace()
419  self.host_c_code.write_line("vx_kernel kernel;")
420  self.host_c_code.write_line("vx_status status;")
421  self.host_c_code.write_line("uint32_t index;")
422  self.host_c_code.write_line("vx_enum kernel_id;")
423  self.host_c_code.write_newline()
424  self.host_c_code.write_line("status = vxAllocateUserKernelId(context, &kernel_id);")
425  self.host_c_code.write_line("if(status != (vx_status)VX_SUCCESS)")
426  self.host_c_code.write_open_brace()
427  self.host_c_code.write_line("VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate user kernel ID\\n\");")
428  self.host_c_code.write_close_brace()
429  self.host_c_code.write_newline()
430  self.host_c_code.write_if_status()
431  self.host_c_code.write_open_brace()
432  self.host_c_code.write_line("kernel = vxAddUserKernel(");
433  self.host_c_code.write_line(" context,")
434  self.host_c_code.write_line(" %s%s_NAME," % (self.kernel.enum_str_prefix, self.kernel.name_upper))
435  self.host_c_code.write_line(" kernel_id," )
436  self.host_c_code.write_line(" NULL,")
437  self.host_c_code.write_line(" %s%s_MAX_PARAMS," % (self.kernel.enum_str_prefix, self.kernel.name_upper) )
438  self.host_c_code.write_line(" tivxAddKernel%sValidate," % (self.kernel.name_camel) )
439  self.host_c_code.write_line(" tivxAddKernel%sInitialize," % (self.kernel.name_camel) )
440  self.host_c_code.write_line(" NULL);")
441  self.host_c_code.write_newline()
442  self.host_c_code.write_line("status = vxGetStatus((vx_reference)kernel);")
443  self.host_c_code.write_close_brace()
444  self.host_c_code.write_if_status()
445  self.host_c_code.write_open_brace()
446  self.host_c_code.write_line("index = 0;")
447  self.host_c_code.write_newline()
448  for prm in self.kernel.params :
449  if prm != self.kernel.params[0] :
450  self.host_c_code.write_if_status()
451  self.host_c_code.write_open_brace()
452  self.host_c_code.write_line("status = vxAddParameterToKernel(kernel,")
453  self.host_c_code.write_line(" index,")
454  self.host_c_code.write_line(" (vx_enum)%s," % (Direction.get_vx_enum_name(prm.direction)) )
455  if Type.is_scalar_type(prm.type) :
456  self.host_c_code.write_line(" (vx_enum)VX_TYPE_SCALAR,")
457  else :
458  self.host_c_code.write_line(" (vx_enum)%s," % (Type.get_vx_enum_name(prm.type)) )
459  self.host_c_code.write_line(" (vx_enum)%s" % (ParamState.get_vx_enum_name(prm.state)) )
460  self.host_c_code.write_line(");")
461  self.host_c_code.write_line("index++;")
462  self.host_c_code.write_close_brace()
463 
464  self.host_c_code.write_if_status()
465  self.host_c_code.write_open_brace()
466  self.host_c_code.write_comment_line("add supported target's")
467  for target in self.kernel.targets :
468  self.host_c_code.write_line("tivxAddKernelTarget(kernel, %s);" % (Target.get_vx_enum_name(target)))
469  self.host_c_code.write_close_brace()
470 
471  self.host_c_code.write_if_status()
472  self.host_c_code.write_open_brace()
473  self.host_c_code.write_line("status = vxFinalizeKernel(kernel);")
474  self.host_c_code.write_close_brace()
475 
476  self.host_c_code.write_line("if (status != (vx_status)VX_SUCCESS)")
477  self.host_c_code.write_open_brace()
478  self.host_c_code.write_line("vxReleaseKernel(&kernel);")
479  self.host_c_code.write_line("kernel = NULL;")
480  self.host_c_code.write_close_brace()
481 
482  self.host_c_code.write_close_brace()
483  self.host_c_code.write_line("else")
484  self.host_c_code.write_open_brace()
485  self.host_c_code.write_line("kernel = NULL;")
486  self.host_c_code.write_close_brace()
487  self.host_c_code.write_line("vx_%s_kernel = kernel;" % (self.kernel.name_lower))
488  self.host_c_code.write_newline()
489  self.host_c_code.write_line("return status;")
490  self.host_c_code.write_close_brace()
491  self.host_c_code.write_newline()
492 
493  def generate_host_c_remove_func_code(self):
494  self.host_c_code.write_line("vx_status tivxRemoveKernel%s(vx_context context)" % (self.kernel.name_camel))
495  self.host_c_code.write_open_brace()
496  self.host_c_code.write_line("vx_status status;")
497  self.host_c_code.write_line("vx_kernel kernel = vx_%s_kernel;" % self.kernel.name_lower)
498  self.host_c_code.write_newline()
499  self.host_c_code.write_line("status = vxRemoveKernel(kernel);")
500  self.host_c_code.write_line("vx_%s_kernel = NULL;" % self.kernel.name_lower)
501  self.host_c_code.write_newline()
502  self.host_c_code.write_line("return status;")
503  self.host_c_code.write_close_brace()
504  self.host_c_code.write_newline()
505 
506  def verify_parameter_relationship_items(self, relationship_list, prm, attribute, name) :
507  for rel in relationship_list :
508  if prm in rel.prm_list :
509  if attribute in rel.attribute_list :
510  return True
511  # Sometimes we want to compare attributes from different object types (e.g. image and pyramid width)
512  for local_name in rel.attribute_list :
513  if local_name.name == name :
514  return True
515  if attribute == ImageAttribute.FORMAT :
516  return True
517  elif attribute == UserDataObjectAttribute.NAME :
518  return True
519  elif attribute == UserDataObjectAttribute.SIZE :
520  return True
521  elif attribute == ArrayAttribute.ITEMSIZE :
522  return True
523  elif attribute == ArrayAttribute.ITEMTYPE :
524  return True
525  elif attribute == PyramidAttribute.FORMAT :
526  return True
527  elif attribute == MatrixAttribute.TYPE :
528  return True
529  elif attribute == LutAttribute.TYPE :
530  return True
531  return False
532 
533  # performs conversion from string to array type
534  def convert_string_to_array_type(self, print_type):
535  if print_type.startswith('VX_TYPE_') :
536  string_length = len(print_type)
537  substring = print_type[8:string_length]
538  for t in Type :
539  if t.name == substring :
540  return t
541  return Type.NULL
542 
543  # performs check on array type to see if it is a non-enum type
544  def check_array_type(self, print_type):
545  array_type = self.convert_string_to_array_type(print_type)
546  return Type.is_array_type(array_type)
547 
548  def generate_host_c_validate_func_code(self):
549  self.host_c_code.write_line("static vx_status VX_CALLBACK tivxAddKernel%sValidate(vx_node node," % self.kernel.name_camel)
550  self.host_c_code.write_line(" const vx_reference parameters[ ],")
551  self.host_c_code.write_line(" vx_uint32 num,")
552  self.host_c_code.write_line(" vx_meta_format metas[])")
553  self.host_c_code.write_open_brace()
554 
555  # Initial parameters
556  self.host_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
557  self.num_params = 0
558  for prm in self.kernel.params :
559  self.host_c_code.write_newline()
560 
561  attr = Attribute.from_type(prm.type)
562  if Type.is_scalar_type(prm.type) :
563  self.host_c_code.write_line("vx_scalar %s = NULL;" % prm.name_lower)
564  self.host_c_code.write_line("vx_enum %s_scalar_type;" % (prm.name_lower))
565  else :
566  self.host_c_code.write_line("%s %s = NULL;" % (Type.get_vx_name(prm.type), prm.name_lower))
567  for name, member in attr.__members__.items() :
568  if self.verify_parameter_relationship_items(self.kernel.relationship_list, prm, member, name) :
569  if member == UserDataObjectAttribute.NAME :
570  self.host_c_code.write_line("%s %s_%s[VX_MAX_REFERENCE_NAME];" % (member.value[1], prm.name_lower, member.value[0]))
571  else :
572  self.host_c_code.write_line("%s %s_%s;" % (member.value[1], prm.name_lower, member.value[0]))
573  self.num_params += 1
574 
575  self.host_c_code.write_newline()
576  self.host_c_code.write_line("if ( (num != %s%s_MAX_PARAMS)" % (self.kernel.enum_str_prefix, self.kernel.name_upper) )
577  for prm in self.kernel.params :
578  if prm.state is ParamState.REQUIRED :
579  self.host_c_code.write_line(" || (NULL == parameters[%s%s_%s_IDX])" % (self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper))
580  self.host_c_code.write_line(")")
581  self.host_c_code.write_open_brace()
582  self.host_c_code.write_line("status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
583  self.host_c_code.write_line("VX_PRINT(VX_ZONE_ERROR, \"One or more REQUIRED parameters are set to NULL\\n\");")
584  self.host_c_code.write_close_brace()
585  self.host_c_code.write_newline()
586 
587  # Query all types here
588  self.host_c_code.write_line("if ((vx_status)VX_SUCCESS == status)")
589  self.host_c_code.write_open_brace()
590  # find code from target for here
591  # assigned descriptors to local variables
592  for prm in self.kernel.params :
593  if Type.is_scalar_type(prm.type) :
594  self.host_c_code.write_line("%s = (%s)parameters[%s%s_%s_IDX];" %
595  (prm.name_lower, Type.get_vx_name(Type.SCALAR), self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper) )
596  else :
597  self.host_c_code.write_line("%s = (%s)parameters[%s%s_%s_IDX];" %
598  (prm.name_lower, Type.get_vx_name(prm.type), self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper) )
599  self.host_c_code.write_close_brace()
600  self.host_c_code.write_newline()
601 
602  self.host_c_code.write_newline()
603  self.host_c_code.write_line("/* PARAMETER ATTRIBUTE FETCH */")
604  self.host_c_code.write_newline()
605 
606  # for loop writing each query here around if statements checking the status
607  num_image = 0
608  num_nonimage = 0
609  num_scalar = 0
610  self.host_c_code.write_line("if ((vx_status)VX_SUCCESS == status)")
611  self.host_c_code.write_open_brace()
612  for prm in self.kernel.params :
613  if prm.state is ParamState.OPTIONAL :
614  self.host_c_code.write_line("if (NULL != %s)" % prm.name_lower)
615  self.host_c_code.write_open_brace()
616 
617  attr = Attribute.from_type(prm.type)
618  if Type.is_scalar_type(prm.type) :
619  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))
620  else :
621  for name, member in attr.__members__.items() :
622  if self.verify_parameter_relationship_items(self.kernel.relationship_list, prm, member, name) :
623  if prm.type == Type.RAW_IMAGE :
624  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]))
625  elif prm.type == Type.LUT:
626  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]))
627  else :
628  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]))
629 
630  if prm.state is ParamState.OPTIONAL :
631  self.host_c_code.write_close_brace()
632  if prm is not self.kernel.params[-1] :
633  self.host_c_code.write_newline()
634  self.host_c_code.write_close_brace()
635 
636  self.host_c_code.write_newline()
637  self.host_c_code.write_line("/* PARAMETER CHECKING */")
638  self.host_c_code.write_newline()
639 
640  # Check for sizeof array, and data type (format) of other objects
641  self.host_c_code.write_line("if ((vx_status)VX_SUCCESS == status)")
642  self.host_c_code.write_open_brace()
643  for prm in self.kernel.params :
644  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 :
645  if prm.state is ParamState.OPTIONAL :
646  self.host_c_code.write_line("if (NULL != %s)" % (prm.name_lower))
647  self.host_c_code.write_open_brace()
648  if len(prm.data_types) == 0 :
649  self.host_c_code.write_comment_line("< DEVELOPER_TODO: Replace <Add type here> with correct data type >")
650  self.print_data_type = ['<Add type here>']
651  else :
652  self.print_data_type = prm.data_types
653  if Type.IMAGE == prm.type :
654  if len(prm.data_types) > 1 :
655  self.host_c_code.write_line("if( ((vx_df_image)%s != %s_fmt) &&" % (self.print_data_type[0], prm.name_lower))
656  for dt in self.print_data_type[1:-1] :
657  self.host_c_code.write_line(" ((vx_df_image)%s != %s_fmt) &&" % (dt, prm.name_lower))
658  self.host_c_code.write_line(" ((vx_df_image)%s != %s_fmt))" % (self.print_data_type[-1], prm.name_lower))
659  else :
660  self.host_c_code.write_line("if ((vx_df_image)%s != %s_fmt)" % (self.print_data_type[0], prm.name_lower))
661  elif Type.PYRAMID == prm.type :
662  if len(prm.data_types) > 1 :
663  self.host_c_code.write_line("if( ((vx_df_image)%s != %s_fmt) &&" % (self.print_data_type[0], prm.name_lower))
664  for dt in self.print_data_type[1:-1] :
665  self.host_c_code.write_line(" ((vx_df_image)%s != %s_fmt) &&" % (dt, prm.name_lower))
666  self.host_c_code.write_line(" ((vx_df_image)%s != %s_fmt))" % (self.print_data_type[-1], prm.name_lower))
667  else :
668  self.host_c_code.write_line("if ((vx_df_image)%s != %s_fmt)" % (self.print_data_type[0], prm.name_lower))
669  elif Type.ARRAY == prm.type :
670  if len(prm.data_types) > 1 :
671  if self.check_array_type(self.print_data_type[0]) :
672  self.host_c_code.write_line("if( ((vx_enum)%s != %s_item_type) &&" % (self.print_data_type[0], prm.name_lower))
673  else :
674  self.host_c_code.write_line("if( (%s_item_size != sizeof(%s)) &&" % (prm.name_lower, self.print_data_type[0]))
675  for dt in self.print_data_type[1:-1] :
676  if self.check_array_type(dt) :
677  self.host_c_code.write_line(" (%s_item_type != %s) &&" % (prm.name_lower, dt))
678  else :
679  self.host_c_code.write_line(" (%s_item_size != sizeof(%s)) &&" % (prm.name_lower, dt))
680  if self.check_array_type(self.print_data_type[-1]) :
681  self.host_c_code.write_line(" (%s_item_type != %s))" % (prm.name_lower, self.print_data_type[-1]))
682  else :
683  self.host_c_code.write_line(" (%s_item_size != sizeof(%s)))" % (prm.name_lower, self.print_data_type[-1]))
684  else :
685  if self.check_array_type(self.print_data_type[0]) :
686  self.host_c_code.write_line("if (%s != %s_item_type )" % (self.print_data_type[0], prm.name_lower))
687  else :
688  self.host_c_code.write_line("if ( %s_item_size != sizeof(%s))" % (prm.name_lower, self.print_data_type[0]))
689  elif Type.MATRIX == prm.type or Type.LUT == prm.type:
690  if len(prm.data_types) > 1 :
691  self.host_c_code.write_line("if( ((vx_enum)%s != %s_type) &&" % (self.print_data_type[0], prm.name_lower))
692  for dt in self.print_data_type[1:-1] :
693  self.host_c_code.write_line(" ((vx_enum)%s != %s_type) &&" % (dt, prm.name_lower))
694  self.host_c_code.write_line(" ((vx_enum)%s != %s_type))" % (self.print_data_type[-1], prm.name_lower))
695  else :
696  self.host_c_code.write_line("if ((vx_enum)%s != %s_type)" % (self.print_data_type[0], prm.name_lower))
697  elif Type.is_scalar_type(prm.type) :
698  if len(prm.data_types) > 1 :
699  self.host_c_code.write_line("if( ((vx_enum)%s != %s_scalar_type) &&" % (self.print_data_type[0], prm.name_lower))
700  for dt in self.print_data_type[1:-1] :
701  self.host_c_code.write_line(" ((vx_enum)%s != %s_scalar_type) &&" % (dt, prm.name_lower))
702  self.host_c_code.write_line(" ((vx_enum)%s != %s_scalar_type))" % (self.print_data_type[-1], prm.name_lower))
703  else :
704  self.host_c_code.write_line("if ((vx_enum)%s != %s_scalar_type)" % (self.print_data_type[0], prm.name_lower))
705  elif Type.USER_DATA_OBJECT == prm.type :
706  if len(prm.data_types) > 1 :
707  self.host_c_code.write_line("if( ((%s_size != sizeof(%s)) ||" % (prm.name_lower, self.print_data_type[0]))
708  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))
709  for dt in self.print_data_type[1:-1] :
710  self.host_c_code.write_line(" ((%s_size != sizeof(%s)) ||" % (prm.name_lower, dt))
711  self.host_c_code.write_line(" (strncmp(%s_name, \"%s\", sizeof(%s_name)) != 0)) &&" % (prm.name_lower, dt, prm.name_lower))
712  self.host_c_code.write_line(" ((%s_size != sizeof(%s)) ||" % (prm.name_lower, self.print_data_type[-1]))
713  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))
714  else :
715  self.host_c_code.write_line("if ((%s_size != sizeof(%s)) ||" % (prm.name_lower, self.print_data_type[0]))
716  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))
717 
718  self.host_c_code.write_open_brace()
719  self.host_c_code.write_line("status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
720  vowel = ["a","e","i","o"]
721  if Type.is_scalar_type(prm.type) :
722  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)
723  else :
724  article = 'a'
725  if prm.type.name[0].lower() in vowel :
726  article = 'an'
727  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)
728  self.host_c_code.write_line("%s " % (self.print_data_type[0]), new_line=False, indent=False)
729  for dt in self.print_data_type[1:] :
730  self.host_c_code.write_line("or %s " % (dt), new_line=False, indent=False)
731  self.host_c_code.write_line("\\n\");", indent=False)
732  self.host_c_code.write_close_brace()
733  if prm.state is ParamState.OPTIONAL :
734  self.host_c_code.write_close_brace()
735  if prm is not self.kernel.params[-1] :
736  self.host_c_code.write_newline()
737  self.host_c_code.write_close_brace()
738  self.host_c_code.write_newline()
739 
740  if len(self.kernel.relationship_list) :
741  self.host_c_code.write_newline()
742  self.host_c_code.write_line("/* PARAMETER RELATIONSHIP CHECKING */")
743  self.host_c_code.write_newline()
744  self.host_c_code.write_line("if ((vx_status)VX_SUCCESS == status)")
745  self.host_c_code.write_open_brace()
746 
747  for rel in self.kernel.relationship_list :
748  if rel.state is ParamState.OPTIONAL :
749  self.host_c_code.write_line("if (NULL != %s)" % (rel.prm_list[0].name_lower))
750  self.host_c_code.write_open_brace()
751  for attr in rel.attribute_list :
752  if attr.vx_enum_name() == "VX_MATRIX_ORIGIN":
753  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]))
754  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]))
755  else :
756  if len(rel.prm_list) > 2 :
757  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]))
758  for prm in rel.prm_list[2:-1] :
759  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]))
760  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]))
761  elif len(rel.prm_list) == 2 :
762  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]))
763 
764  self.host_c_code.write_open_brace()
765  self.host_c_code.write_line("status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
766  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)
767  for prm in rel.prm_list[2:] :
768  self.host_c_code.write_line("and '%s' " % (prm.name_lower), new_line=False, indent=False)
769  self.host_c_code.write_line("should have the same value for %s\\n\");" % attr.vx_enum_name(), indent=False)
770  self.host_c_code.write_close_brace()
771  if rel.state is ParamState.OPTIONAL :
772  self.host_c_code.write_close_brace()
773  if rel is not self.kernel.relationship_list[-1] :
774  self.host_c_code.write_newline()
775  self.host_c_code.write_close_brace()
776 
777  self.host_c_code.write_newline()
778  self.host_c_code.write_line("/* CUSTOM PARAMETER CHECKING */")
779  self.host_c_code.write_newline()
780  self.host_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Add any custom parameter type or range checking not")
781  self.host_c_code.write_comment_line(" covered by the code-generation script.) >")
782  self.host_c_code.write_newline()
783 
784  self.host_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) If intending to use a virtual data object, set metas using appropriate TI API.")
785  self.host_c_code.write_comment_line(" For a code example, please refer to the validate callback of the follow file:")
786  self.host_c_code.write_comment_line(" tiovx/kernels/openvx-core/host/vx_absdiff_host.c. For further information regarding metas,")
787  self.host_c_code.write_comment_line(" please refer to the OpenVX 1.1 spec p. 260, or search for vx_kernel_validate_f. >")
788  self.host_c_code.write_newline()
789 
790  self.host_c_code.write_line("return status;")
791  self.host_c_code.write_close_brace()
792  self.host_c_code.write_newline()
793 
794  def generate_host_c_initialize_func_code(self):
795  self.host_c_code.write_line("static vx_status VX_CALLBACK tivxAddKernel%sInitialize(vx_node node," % self.kernel.name_camel)
796  self.host_c_code.write_line(" const vx_reference parameters[ ],")
797  self.host_c_code.write_line(" vx_uint32 num_params)")
798  self.host_c_code.write_open_brace()
799  self.host_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
800  if self.kernel.getNumImages() > 0 :
801  self.host_c_code.write_line("tivxKernelValidRectParams prms;")
802  self.host_c_code.write_newline()
803 
804  # Check if null params
805  self.host_c_code.write_line("if ( (num_params != %s%s_MAX_PARAMS)" % (self.kernel.enum_str_prefix, self.kernel.name_upper) )
806  for prm in self.kernel.params :
807  if prm.state is ParamState.REQUIRED :
808  self.host_c_code.write_line(" || (NULL == parameters[%s%s_%s_IDX])" % (self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper))
809  self.host_c_code.write_line(")")
810  self.host_c_code.write_open_brace()
811  self.host_c_code.write_line("status = (vx_status)VX_ERROR_INVALID_PARAMETERS;")
812  self.host_c_code.write_line("VX_PRINT(VX_ZONE_ERROR, \"One or more REQUIRED parameters are set to NULL\\n\");")
813  self.host_c_code.write_close_brace()
814 
815  # Set images
816  num_input_image = 0
817  num_output_image = 0
818  self.temp_buffer = ""
819  for prm in self.kernel.params :
820  if Type.IMAGE == prm.type:
821  if Direction.INPUT == prm.direction:
822  self.temp_buffer += (" prms.in_img[%sU] = (vx_image)parameters[%s%s_%s_IDX];\n" %
823  (num_input_image, self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper) )
824  num_input_image+=1
825  if Direction.OUTPUT == prm.direction:
826  self.temp_buffer += (" prms.out_img[%sU] = (vx_image)parameters[%s%s_%s_IDX];\n" %
827  (num_output_image, self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper) )
828  num_output_image+=1
829 
830  # Config valid rectangle
831  if num_input_image > 0 or num_output_image > 0 :
832  self.host_c_code.write_line("if ((vx_status)VX_SUCCESS == status)")
833  self.host_c_code.write_open_brace()
834  self.host_c_code.write_line("tivxKernelValidRectParams_init(&prms);")
835  self.host_c_code.write_newline()
836  self.host_c_code.write_block(self.temp_buffer)
837  self.host_c_code.write_line("prms.num_input_images = %s;" % self.kernel.getNumInputImages())
838  self.host_c_code.write_line("prms.num_output_images = %s;" % self.kernel.getNumOutputImages())
839  self.host_c_code.write_newline()
840  self.host_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Set padding values based on valid region if border mode is")
841  self.host_c_code.write_comment_line(" set to VX_BORDER_UNDEFINED and remove the #if 0 and #endif lines.")
842  self.host_c_code.write_comment_line(" Else, remove this entire #if 0 ... #endif block >")
843  self.host_c_code.write_line("#if 0")
844  self.host_c_code.write_line("prms.top_pad = 0;")
845  self.host_c_code.write_line("prms.bot_pad = 0;")
846  self.host_c_code.write_line("prms.left_pad = 0;")
847  self.host_c_code.write_line("prms.right_pad = 0;")
848  self.host_c_code.write_line("prms.border_mode = VX_BORDER_UNDEFINED;")
849  self.host_c_code.write_line("#endif")
850  self.host_c_code.write_newline()
851  self.host_c_code.write_line("status = tivxKernelConfigValidRect(&prms);")
852  self.host_c_code.write_close_brace()
853  self.host_c_code.write_newline()
854 
855  self.host_c_code.write_line("return status;")
856  self.host_c_code.write_close_brace()
857  self.host_c_code.write_newline()
858 
859  def generate_host_c_file_code(self):
860  print("Creating " + self.workarea_module_host + "/" + self.host_c_filename)
861  self.host_c_code = CodeGenerate(self.workarea_module_host + "/" + self.host_c_filename)
862  self.host_c_code.write_include("TI/tivx.h")
863  self.host_c_code.write_include(self.company + "/" + self.top_header_name + ".h")
864  self.host_c_code.write_include("tivx_" + self.module.lower() + "_kernels" + self.kernels_header_extension + ".h")
865  self.host_c_code.write_include(self.h_filename)
866  self.host_c_code.write_include("TI/tivx_target_kernel.h")
867  self.host_c_code.write_newline()
868  self.host_c_code.write_line("static vx_kernel vx_%s_kernel = NULL;" % (self.kernel.name_lower))
869  self.host_c_code.write_newline()
870 
871  self.host_c_code.write_line("static vx_status VX_CALLBACK tivxAddKernel%sValidate(vx_node node," % self.kernel.name_camel)
872  self.host_c_code.write_line(" const vx_reference parameters[ ],")
873  self.host_c_code.write_line(" vx_uint32 num,")
874  self.host_c_code.write_line(" vx_meta_format metas[]);")
875  self.host_c_code.write_line("static vx_status VX_CALLBACK tivxAddKernel%sInitialize(vx_node node," % self.kernel.name_camel)
876  self.host_c_code.write_line(" const vx_reference parameters[ ],")
877  self.host_c_code.write_line(" vx_uint32 num_params);")
878  self.host_c_code.write_line("vx_status tivxAddKernel%s(vx_context context);" % (self.kernel.name_camel))
879  self.host_c_code.write_line("vx_status tivxRemoveKernel%s(vx_context context);" % (self.kernel.name_camel))
880 
881  self.host_c_code.write_newline()
886  self.host_c_code.close()
887 
888  def generate_target_c_add_func_code(self):
889  self.target_c_code.write_line("void tivxAddTargetKernel%s(void)" % self.kernel.name_camel, files=0)
890  self.target_c_code.write_line("void tivxAddTargetKernelBam%s(void)" % self.kernel.name_camel, files=1)
891  self.target_c_code.write_open_brace()
892  self.target_c_code.write_line("vx_status status = (vx_status)VX_FAILURE;")
893  self.target_c_code.write_line("char target_name[TIVX_TARGET_MAX_NAME];")
894  self.target_c_code.write_line("vx_enum self_cpu;")
895  self.target_c_code.write_newline()
896  self.target_c_code.write_line("self_cpu = tivxGetSelfCpuId();")
897  self.target_c_code.write_newline()
898  for target in self.kernel.targets :
899  if type(target) is Target :
900  cpu = Target.get_cpu(target)
901  self.target_c_code.write_line("if ( self_cpu == (vx_enum)%s )" % Cpu.get_vx_enum_name(cpu) )
902  self.target_c_code.write_open_brace()
903  self.target_c_code.write_line("strncpy(target_name, %s, TIVX_TARGET_MAX_NAME);" % Target.get_vx_enum_name(target))
904  self.target_c_code.write_line("status = (vx_status)VX_SUCCESS;")
905  self.target_c_code.write_close_brace()
906  self.target_c_code.write_line("else")
907  self.target_c_code.write_open_brace()
908  self.target_c_code.write_line("status = (vx_status)VX_FAILURE;")
909  self.target_c_code.write_close_brace()
910  self.target_c_code.write_newline()
911 
912  self.target_c_code.write_if_status()
913  self.target_c_code.write_open_brace()
914  self.target_c_code.write_line("vx_%s_target_kernel = tivxAddTargetKernelByName(" % self.kernel.name_lower)
915  self.target_c_code.write_line(" %s%s_NAME," % (self.kernel.enum_str_prefix, self.kernel.name_upper))
916  self.target_c_code.write_line(" target_name,")
917  self.target_c_code.write_line(" tivx%sProcess," % self.kernel.name_camel)
918  self.target_c_code.write_line(" tivx%sCreate," % self.kernel.name_camel)
919  self.target_c_code.write_line(" tivx%sDelete," % self.kernel.name_camel)
920  self.target_c_code.write_line(" tivx%sControl," % self.kernel.name_camel)
921  self.target_c_code.write_line(" NULL);")
922  self.target_c_code.write_close_brace()
923 
924  self.target_c_code.write_close_brace()
925  self.target_c_code.write_newline()
926 
927  def generate_target_c_remove_func_code(self):
928  self.target_c_code.write_line("void tivxRemoveTargetKernel%s(void)" % self.kernel.name_camel, files=0)
929  self.target_c_code.write_line("void tivxRemoveTargetKernelBam%s(void)" % self.kernel.name_camel, files=1)
930  self.target_c_code.write_open_brace()
931  self.target_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
932  self.target_c_code.write_newline()
933  self.target_c_code.write_line("status = tivxRemoveTargetKernel(vx_%s_target_kernel);" % self.kernel.name_lower)
934  self.target_c_code.write_if_status()
935  self.target_c_code.write_open_brace()
936  self.target_c_code.write_line("vx_%s_target_kernel = NULL;" % self.kernel.name_lower)
937  self.target_c_code.write_close_brace()
938  self.target_c_code.write_close_brace()
939  self.target_c_code.write_newline()
940 
941  # performs error checking on string keywords within the attribute string
942  def extract_local_mem_string_error_check(self, new_str, type, name):
943  found = False
944  invalid_str = ""
945  if type != Type.ARRAY :
946  if "capacity" in new_str :
947  found = True
948  invalid_str = "capacity"
949  elif "itemsize" in new_str :
950  found = True
951  invalid_str = "itemsize"
952  elif "itemtype" in new_str :
953  found = True
954  invalid_str = "itemtype"
955  if type != Type.ARRAY and type != Type.OBJECT_ARRAY:
956  if "numitems" in new_str :
957  found = True
958  invalid_str = "numitems"
959  if type != Type.IMAGE and type != Type.REMAP:
960  if "width" in new_str :
961  found = True
962  invalid_str = "width"
963  elif "height" in new_str :
964  found = True
965  invalid_str = "height"
966  if type != Type.IMAGE :
967  if "stride_x" in new_str :
968  found = True
969  invalid_str = "stride_x"
970  elif "stride_y" in new_str :
971  found = True
972  invalid_str = "stride_y"
973  if type != Type.PYRAMID :
974  if "levels" in new_str :
975  found = True
976  invalid_str = "levels"
977  if type != Type.MATRIX and type != Type.CONVOLUTION:
978  if "rows" in new_str :
979  found = True
980  invalid_str = "rows"
981  elif "columns" in new_str :
982  found = True
983  invalid_str = "columns"
984  if type != Type.DISTRIBUTION :
985  if "dimensions" in new_str :
986  found = True
987  invalid_str = "dimensions"
988  elif "range" in new_str :
989  found = True
990  invalid_str = "range"
991  elif "bins" in new_str :
992  found = True
993  invalid_str = "bins"
994  elif "win" in new_str :
995  found = True
996  invalid_str = "win"
997  if type != Type.DISTRIBUTION and type != Type.LUT:
998  if "offset" in new_str :
999  found = True
1000  invalid_str = "offset"
1001  if type != Type.LUT:
1002  if "count" in new_str :
1003  found = True
1004  invalid_str = "count"
1005  assert found == False, "'%s' is in invalid string for parameter %s" % (invalid_str, name)
1006 
1007  # extracts from string written by user for local mem allocation
1008  def extract_local_mem_string(self, type, attribute, local):
1009  self.extract_local_mem_string_error_check(attribute, type, local.name)
1010  if type == Type.IMAGE :
1011  new_str = attribute
1012  new_str = new_str.replace("width", "%s_desc->imagepatch_addr[0].dim_x" % local.prm.name_lower)
1013  new_str = new_str.replace("height", "%s_desc->imagepatch_addr[0].dim_y" % local.prm.name_lower)
1014  new_str = new_str.replace("stride_x", "%s_desc->imagepatch_addr[0].stride_x" % local.prm.name_lower)
1015  new_str = new_str.replace("stride_y", "%s_desc->imagepatch_addr[0].stride_y" % local.prm.name_lower)
1016  return new_str
1017  elif type == Type.ARRAY :
1018  new_str = attribute
1019  new_str = new_str.replace("capacity", "%s_desc->capacity" % local.prm.name_lower)
1020  new_str = new_str.replace("itemsize", "%s_desc->item_size" % local.prm.name_lower)
1021  new_str = new_str.replace("itemtype", "%s_desc->item_type" % local.prm.name_lower)
1022  new_str = new_str.replace("numitems", "%s_desc->num_items" % local.prm.name_lower)
1023  return new_str
1024  elif type == Type.PYRAMID :
1025  new_str = attribute
1026  # should this support width/height?
1027  new_str = new_str.replace("levels", "%s_desc->num_levels" % local.prm.name_lower)
1028  return new_str
1029  elif type == Type.MATRIX :
1030  new_str = attribute
1031  new_str = new_str.replace("rows", "%s_desc->rows" % local.prm.name_lower)
1032  new_str = new_str.replace("columns", "%s_desc->columns" % local.prm.name_lower)
1033  new_str = new_str.replace("size", "%s_desc->mem_size" % local.prm.name_lower)
1034  return new_str
1035  elif type == Type.DISTRIBUTION :
1036  new_str = attribute
1037  new_str = new_str.replace("dimensions", "1")
1038  new_str = new_str.replace("offset", "%s_desc->offset" % local.prm.name_lower)
1039  new_str = new_str.replace("range", "%s_desc->range" % local.prm.name_lower)
1040  new_str = new_str.replace("bins", "%s_desc->num_bins" % local.prm.name_lower)
1041  new_str = new_str.replace("window", "%s_desc->num_win" % local.prm.name_lower)
1042  new_str = new_str.replace("size", "%s_desc->mem_size" % local.prm.name_lower)
1043  return new_str
1044  elif type == Type.LUT :
1045  new_str = attribute
1046  new_str = new_str.replace("count", "%s_desc->num_items" % local.prm.name_lower)
1047  new_str = new_str.replace("size", "%s_desc->mem_size" % local.prm.name_lower)
1048  return new_str
1049  elif type == Type.REMAP :
1050  new_str = attribute
1051  new_str = new_str.replace("source_width", "%s_desc->src_width" % local.prm.name_lower)
1052  new_str = new_str.replace("source_height", "%s_desc->src_height" % local.prm.name_lower)
1053  new_str = new_str.replace("destination_width", "%s_desc->dst_width" % local.prm.name_lower)
1054  new_str = new_str.replace("destination_height", "%s_desc->dst_height" % local.prm.name_lower)
1055  return new_str
1056  elif type == Type.CONVOLUTION :
1057  new_str = attribute
1058  new_str = new_str.replace("rows", "%s_desc->rows" % local.prm.name_lower)
1059  new_str = new_str.replace("columns", "%s_desc->columns" % local.prm.name_lower)
1060  new_str = new_str.replace("size", "%s_desc->mem_size" % local.prm.name_lower)
1061  new_str = new_str.replace("scale", "%s_desc->scale" % local.prm.name_lower)
1062  return new_str
1063  elif type == Type.OBJECT_ARRAY :
1064  new_str = attribute
1065  new_str = new_str.replace("numitems", "%s_desc->num_items" % local.prm.name_lower)
1066  return new_str
1067 
1068  # extracts from string written by user for local mem allocation
1069  def is_supported_type(self, type):
1070  if type == Type.IMAGE :
1071  return True
1072  elif type == Type.ARRAY :
1073  return True
1074  elif type == Type.PYRAMID :
1075  return True
1076  elif type == Type.MATRIX :
1077  return True
1078  elif type == Type.DISTRIBUTION :
1079  return True
1080  elif type == Type.REMAP :
1081  return True
1082  elif type == Type.CONVOLUTION :
1083  return True
1084  elif type == Type.LUT :
1085  return True
1086  elif type == Type.OBJECT_ARRAY :
1087  return True
1088  elif type == Type.NULL :
1089  return True
1090  else :
1091  return False
1092 
1093  # extracts from string written by user for local mem allocation
1094  def extract_attribute(self, local, is_first_prm):
1095  invalid_type = False
1096  if not is_first_prm :
1097  self.target_c_code.write_line("if ((vx_status)VX_SUCCESS == status)")
1098  self.target_c_code.write_open_brace()
1099  if local.prm.type != Type.NULL :
1100  # verifying that the optional parameter is being used
1101  if ParamState.OPTIONAL == local.state :
1102  self.target_c_code.write_line("if( %s_desc != NULL)" % local.prm.name_lower)
1103  self.target_c_code.write_open_brace()
1104  if local.prm.type == Type.IMAGE :
1105  size_str = ""
1106  append_str = ""
1107  for num, attr in enumerate(local.attribute_list, start=1):
1108  if type(attr) is ImageAttribute :
1109  if Attribute.Image.WIDTH == attr :
1110  append_str = ("%s_desc->imagepatch_addr[0].dim_x" % local.prm.name_lower)
1111  size_str+=append_str
1112  elif Attribute.Image.HEIGHT == attr :
1113  append_str = ("%s_desc->imagepatch_addr[0].dim_y" % local.prm.name_lower)
1114  size_str+=append_str
1115  elif type(attr) is int :
1116  append_str = ("%s" % attr)
1117  size_str+=append_str
1118  elif type(attr) is str :
1119  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1120  size_str+=append_str
1121  else :
1122  invalid_type = True
1123  if num < len(local.attribute_list) :
1124  append_str = " * "
1125  size_str+=append_str
1126  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1127  elif local.prm.type == Type.ARRAY :
1128  size_str = ""
1129  append_str = ""
1130  for num, attr in enumerate(local.attribute_list, start=1):
1131  if type(attr) is ArrayAttribute :
1132  if Attribute.Array.CAPACITY == attr :
1133  append_str = ("%s_desc->capacity" % local.prm.name_lower)
1134  size_str+=append_str
1135  elif Attribute.Array.ITEMTYPE == attr :
1136  append_str = ("%s_desc->item_type" % local.prm.name_lower)
1137  size_str+=append_str
1138  elif Attribute.Array.NUMITEMS == attr :
1139  append_str = ("%s_desc->num_items" % local.prm.name_lower)
1140  size_str+=append_str
1141  elif Attribute.Array.ITEMSIZE == attr :
1142  append_str = ("%s_desc->item_size" % local.prm.name_lower)
1143  size_str+=append_str
1144  elif type(attr) is int :
1145  append_str = ("%s" % attr)
1146  size_str+=append_str
1147  elif type(attr) is str :
1148  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1149  size_str+=append_str
1150  else :
1151  invalid_type = True
1152  if num < len(local.attribute_list) :
1153  append_str = " * "
1154  size_str+=append_str
1155  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1156  elif local.prm.type == Type.PYRAMID :
1157  size_str = ""
1158  append_str = ""
1159  for num, attr in enumerate(local.attribute_list, start=1):
1160  if type(attr) is PyramidAttribute :
1161  if Attribute.Pyramid.LEVELS == attr :
1162  append_str = ("%s_desc->num_levels" % local.prm.name_lower)
1163  size_str+=append_str
1164  elif type(attr) is int :
1165  append_str = ("%s" % attr)
1166  size_str+=append_str
1167  elif type(attr) is str :
1168  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1169  size_str+=append_str
1170  else :
1171  invalid_type = True
1172  if num < len(local.attribute_list) :
1173  append_str = " * "
1174  size_str+=append_str
1175  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1176  elif local.prm.type == Type.MATRIX :
1177  size_str = ""
1178  append_str = ""
1179  for num, attr in enumerate(local.attribute_list, start=1):
1180  if type(attr) is MatrixAttribute :
1181  if Attribute.Matrix.ROWS == attr :
1182  append_str = ("%s_desc->rows" % local.prm.name_lower)
1183  size_str+=append_str
1184  elif Attribute.Matrix.COLUMNS == attr :
1185  append_str = ("%s_desc->columns" % local.prm.name_lower)
1186  size_str+=append_str
1187  elif Attribute.Matrix.SIZE == attr :
1188  append_str = ("%s_desc->mem_size" % local.prm.name_lower)
1189  size_str+=append_str
1190  elif type(attr) is int :
1191  append_str = ("%s" % attr)
1192  size_str+=append_str
1193  elif type(attr) is str :
1194  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1195  size_str+=append_str
1196  else :
1197  invalid_type = True
1198  if num < len(local.attribute_list) :
1199  append_str = " * "
1200  size_str+=append_str
1201  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1202  elif local.prm.type == Type.DISTRIBUTION :
1203  size_str = ""
1204  append_str = ""
1205  for num, attr in enumerate(local.attribute_list, start=1):
1206  if type(attr) is DistributionAttribute :
1207  if Attribute.Distribution.DIMENSIONS == attr :
1208  append_str = ("1")
1209  size_str+=append_str
1210  elif Attribute.Distribution.OFFSET == attr :
1211  append_str = ("%s_desc->offset" % local.prm.name_lower)
1212  size_str+=append_str
1213  elif Attribute.Distribution.RANGE == attr :
1214  append_str = ("%s_desc->range" % local.prm.name_lower)
1215  size_str+=append_str
1216  elif Attribute.Distribution.BINS == attr :
1217  append_str = ("%s_desc->num_bins" % local.prm.name_lower)
1218  size_str+=append_str
1219  elif Attribute.Distribution.WINDOW == attr :
1220  append_str = ("%s_desc->num_win" % local.prm.name_lower)
1221  size_str+=append_str
1222  elif Attribute.Distribution.SIZE == attr :
1223  append_str = ("%s_desc->mem_size" % local.prm.name_lower)
1224  size_str+=append_str
1225  elif type(attr) is int :
1226  append_str = ("%s" % attr)
1227  size_str+=append_str
1228  elif type(attr) is str :
1229  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1230  size_str+=append_str
1231  else :
1232  invalid_type = True
1233  if num < len(local.attribute_list) :
1234  append_str = " * "
1235  size_str+=append_str
1236  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1237  elif local.prm.type == Type.LUT :
1238  size_str = ""
1239  append_str = ""
1240  for num, attr in enumerate(local.attribute_list, start=1):
1241  if type(attr) is LutAttribute :
1242  if Attribute.Lut.COUNT == attr :
1243  append_str = ("%s_desc->num_items" % local.prm.name_lower)
1244  size_str+=append_str
1245  elif Attribute.Lut.SIZE == attr :
1246  append_str = ("%s_desc->mem_size" % local.prm.name_lower)
1247  size_str+=append_str
1248  elif type(attr) is int :
1249  append_str = ("%s" % attr)
1250  size_str+=append_str
1251  elif type(attr) is str :
1252  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1253  size_str+=append_str
1254  else :
1255  invalid_type = True
1256  if num < len(local.attribute_list) :
1257  append_str = " * "
1258  size_str+=append_str
1259  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1260  elif local.prm.type == Type.REMAP :
1261  size_str = ""
1262  append_str = ""
1263  for num, attr in enumerate(local.attribute_list, start=1):
1264  if type(attr) is RemapAttribute :
1265  if Attribute.Remap.SOURCE_WIDTH == attr :
1266  append_str = ("%s_desc->src_width" % local.prm.name_lower)
1267  size_str+=append_str
1268  elif Attribute.Remap.SOURCE_HEIGHT == attr :
1269  append_str = ("%s_desc->src_height" % local.prm.name_lower)
1270  size_str+=append_str
1271  elif Attribute.Remap.DESTINATION_WIDTH == attr :
1272  append_str = ("%s_desc->dst_width" % local.prm.name_lower)
1273  size_str+=append_str
1274  elif Attribute.Remap.DESTINATION_HEIGHT == attr :
1275  append_str = ("%s_desc->dst_height" % local.prm.name_lower)
1276  size_str+=append_str
1277  elif type(attr) is int :
1278  append_str = ("%s" % attr)
1279  size_str+=append_str
1280  elif type(attr) is str :
1281  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1282  size_str+=append_str
1283  else :
1284  invalid_type = True
1285  if num < len(local.attribute_list) :
1286  append_str = " * "
1287  size_str+=append_str
1288  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1289  elif local.prm.type == Type.OBJECT_ARRAY :
1290  size_str = ""
1291  append_str = ""
1292  for num, attr in enumerate(local.attribute_list, start=1):
1293  if type(attr) is ObjectArrayAttribute :
1294  if Attribute.ObjectArray.NUMITEMS == attr :
1295  append_str = ("%s_desc->num_items" % local.prm.name_lower)
1296  size_str+=append_str
1297  elif type(attr) is int :
1298  append_str = ("%s" % attr)
1299  size_str+=append_str
1300  elif type(attr) is str :
1301  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1302  size_str+=append_str
1303  else :
1304  invalid_type = True
1305  if num < len(local.attribute_list) :
1306  append_str = " * "
1307  size_str+=append_str
1308  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1309  elif local.prm.type == Type.CONVOLUTION :
1310  size_str = ""
1311  append_str = ""
1312  for num, attr in enumerate(local.attribute_list, start=1):
1313  if type(attr) is ConvolutionAttribute :
1314  if Attribute.Convolution.ROWS == attr :
1315  append_str = ("%s_desc->rows" % local.prm.name_lower)
1316  size_str+=append_str
1317  elif Attribute.Convolution.COLUMNS == attr :
1318  append_str = ("%s_desc->columns" % local.prm.name_lower)
1319  size_str+=append_str
1320  elif Attribute.Convolution.SCALE == attr :
1321  append_str = ("%s_desc->scale" % local.prm.name_lower)
1322  size_str+=append_str
1323  elif Attribute.Convolution.SIZE == attr :
1324  append_str = ("%s_desc->mem_size" % local.prm.name_lower)
1325  size_str+=append_str
1326  elif type(attr) is int :
1327  append_str = ("%s" % attr)
1328  size_str+=append_str
1329  elif type(attr) is str :
1330  append_str = self.extract_local_mem_string(local.prm.type, attr, local)
1331  size_str+=append_str
1332  else :
1333  invalid_type = True
1334  if num < len(local.attribute_list) :
1335  append_str = " * "
1336  size_str+=append_str
1337  assert invalid_type == False, "'%s' contains an invalid attribute" % (local.prm.name_lower)
1338  elif local.prm.type == Type.NULL :
1339  size_str = ""
1340  append_str = ""
1341  for num, attr in enumerate(local.attribute_list, start=1):
1342  if type(attr) is int :
1343  append_str = ("%s" % attr)
1344  size_str+=append_str
1345  elif type(attr) is str :
1346  append_str = attr
1347  size_str+=append_str
1348  if num < len(local.attribute_list) :
1349  append_str = " * "
1350  size_str+=append_str
1351  # setting 0 is for allocating mem; setting 1 is for setting mem to 0
1352  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Verify correct amount of memory is allocated >")
1353  self.target_c_code.write_line("prms->%s_size = %s;" % (local.name, size_str) )
1354  self.target_c_code.write_line("prms->%s_ptr = tivxMemAlloc(prms->%s_size, (vx_enum)TIVX_MEM_EXTERNAL);" % (local.name, local.name) )
1355  self.target_c_code.write_newline()
1356  self.target_c_code.write_line("if (NULL == prms->%s_ptr)" % (local.name) )
1357  self.target_c_code.write_open_brace()
1358  self.target_c_code.write_line("status = (vx_status)VX_ERROR_NO_MEMORY;")
1359  self.target_c_code.write_line("VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate local memory\\n\");")
1360  self.target_c_code.write_close_brace()
1361  self.target_c_code.write_line("else")
1362  self.target_c_code.write_open_brace()
1363  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Verify memory setting to clear the correct amount of memory >")
1364  self.target_c_code.write_line("memset(prms->%s_ptr, 0, %s);" % (local.name, size_str) )
1365  self.target_c_code.write_close_brace()
1366  if not is_first_prm :
1367  self.target_c_code.write_close_brace()
1368  else :
1369  self.target_c_code.write_newline()
1370  if local.prm.type != Type.NULL :
1371  # verifying that the optional parameter is being used
1372  if ParamState.OPTIONAL == local.state :
1373  self.target_c_code.write_close_brace()
1374 
1375  def generate_target_c_create_func_code(self):
1376  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sCreate(" % self.kernel.name_camel)
1377  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
1378  self.target_c_code.write_line(" tivx_obj_desc_t *obj_desc[],")
1379  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg)")
1380  self.target_c_code.write_open_brace()
1381  self.target_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
1382  contains_user_data_object = False
1383  for prm in self.kernel.params :
1384  if Type.USER_DATA_OBJECT == prm.type :
1385  contains_user_data_object = True
1386  if self.prms_needed:
1387  if self.prms_commented_out:
1388  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1389  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1390  self.target_c_code.write_line("tivx%sParams *prms = NULL;" % self.kernel.name_camel, files=self.prms_write)
1391  if self.prms_commented_out:
1392  self.target_c_code.write_line("#endif" , files=self.prms_write)
1393  self.target_c_code.write_newline()
1394  self.target_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Add any target kernel create code here (e.g. allocating")
1395  self.target_c_code.write_comment_line(" local memory buffers, one time initialization, etc) >")
1396  if self.prms_needed or contains_user_data_object :
1397  # checks function parameters
1398  self.target_c_code.write_line("if ( (num_params != %s%s_MAX_PARAMS)" % (self.kernel.enum_str_prefix, self.kernel.name_upper) , files=self.prms_write)
1399  for prm in self.kernel.params :
1400  if prm.state is ParamState.REQUIRED :
1401  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), files=self.prms_write)
1402  self.target_c_code.write_line(")", files=self.prms_write)
1403  self.target_c_code.write_open_brace(files=self.prms_write)
1404  # function parameters status check failure case
1405  self.target_c_code.write_line("status = (vx_status)VX_FAILURE;", files=self.prms_write)
1406  self.target_c_code.write_close_brace(files=self.prms_write)
1407  self.target_c_code.write_line("else", files=self.prms_write)
1408  self.target_c_code.write_open_brace(files=self.prms_write)
1409 
1410  # declaring variables
1411  duplicates = []
1412  for local in self.kernel.local_mem_list :
1413  if local.prm.type != Type.NULL :
1414  if not (local.prm.name_lower in duplicates) :
1415  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)
1416  duplicates.append(local.prm.name_lower)
1417  for prm in self.kernel.params :
1418  if Type.USER_DATA_OBJECT == prm.type :
1419  if not (prm.name_lower in duplicates) :
1420  self.target_c_code.write_line("%s *%s_desc;" % (Type.get_obj_desc_name(prm.type), prm.name_lower) , files=self.prms_write)
1421  duplicates.append(prm.name_lower)
1422  self.target_c_code.write_newline(files=self.prms_write)
1423 
1424  # populating object descriptors
1425  duplicates = []
1426  for local in self.kernel.local_mem_list :
1427  if local.prm.type != Type.NULL :
1428  if not (local.prm.name_lower in duplicates) :
1429  self.target_c_code.write_line("%s_desc = (%s *)obj_desc[%s%s_%s_IDX];" %
1430  (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)
1431  duplicates.append(local.prm.name_lower)
1432  for prm in self.kernel.params :
1433  if Type.USER_DATA_OBJECT == prm.type :
1434  if not (prm.name_lower in duplicates) :
1435  self.target_c_code.write_line("%s_desc = (%s *)obj_desc[%s%s_%s_IDX];" %
1436  (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)
1437  duplicates.append(prm.name_lower)
1438  self.target_c_code.write_newline(files=self.prms_write)
1439 
1440  if contains_user_data_object :
1441  for prm in self.kernel.params :
1442  if Type.USER_DATA_OBJECT == prm.type :
1443  if len(prm.data_types) == 0 :
1444  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Replace <Add type here> with correct data type >", files=self.prms_write)
1445  self.print_data_type = ['<Add type here>']
1446  else :
1447  self.print_data_type = prm.data_types
1448  self.target_c_code.write_line("if (%s_desc->mem_size != sizeof(%s))" % (prm.name_lower, self.print_data_type[0]) , files=self.prms_write)
1449  self.target_c_code.write_open_brace(files=self.prms_write)
1450  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)
1451  self.target_c_code.write_line("status = (vx_status)VX_FAILURE;", files=self.prms_write)
1452  self.target_c_code.write_close_brace(files=self.prms_write)
1453 
1454  # Allocating memory for local structure
1455  if self.prms_needed:
1456  if self.prms_commented_out:
1457  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1458  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1459  self.target_c_code.write_line("prms = tivxMemAlloc(sizeof(tivx%sParams), (vx_enum)TIVX_MEM_EXTERNAL);" % self.kernel.name_camel, files=self.prms_write)
1460  self.target_c_code.write_line("if (NULL != prms)", files=self.prms_write)
1461  self.target_c_code.write_open_brace(files=self.prms_write)
1462  # Allocating local memory data
1463  is_first_prm = True
1464  for local in self.kernel.local_mem_list :
1465  if self.is_supported_type(local.prm.type) :
1466  self.extract_attribute(local, is_first_prm)
1467  is_first_prm = False
1468  self.target_c_code.write_newline(files=self.prms_write)
1469 
1470  self.target_c_code.write_close_brace(files=self.prms_write)
1471  self.target_c_code.write_line("else", files=self.prms_write)
1472  self.target_c_code.write_open_brace(files=self.prms_write)
1473  self.target_c_code.write_line("status = (vx_status)VX_ERROR_NO_MEMORY;", files=self.prms_write)
1474  self.target_c_code.write_line("VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate local memory\\n\");", files=self.prms_write)
1475  self.target_c_code.write_close_brace(files=self.prms_write)
1476  self.target_c_code.write_newline(files=self.prms_write)
1477 
1478  # Place to create BAM graph
1479  self.target_c_code.write_line("if (NULL != prms)", files=1)
1480  self.target_c_code.write_open_brace(files=1)
1481  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Create BAM graph using graph_handle >", files=1)
1482  self.target_c_code.write_close_brace(files=1)
1483  self.target_c_code.write_newline(files=1)
1484 
1485  self.target_c_code.write_line("if ((vx_status)VX_SUCCESS == status)", files=self.prms_write)
1486  self.target_c_code.write_open_brace(files=self.prms_write)
1487  self.target_c_code.write_line("tivxSetTargetKernelInstanceContext(kernel, prms,", files=self.prms_write)
1488  self.target_c_code.write_line(" sizeof(tivx%sParams));" % self.kernel.name_camel, files=self.prms_write)
1489  self.target_c_code.write_close_brace(files=self.prms_write)
1490  self.target_c_code.write_line("else", files=self.prms_write)
1491  self.target_c_code.write_open_brace(files=self.prms_write)
1492  self.target_c_code.write_line("status = (vx_status)VX_ERROR_NO_MEMORY;", files=self.prms_write)
1493  self.target_c_code.write_line("VX_PRINT(VX_ZONE_ERROR, \"Unable to allocate local memory\\n\");", files=self.prms_write)
1494  self.target_c_code.write_close_brace(files=self.prms_write)
1495  if self.prms_commented_out:
1496  self.target_c_code.write_line("#endif" , files=self.prms_write)
1497  self.target_c_code.write_close_brace(files=self.prms_write)
1498 
1499 
1500  self.target_c_code.write_newline()
1501  self.target_c_code.write_line("return status;")
1502  self.target_c_code.write_close_brace()
1503  self.target_c_code.write_newline()
1504 
1505  def generate_target_c_delete_func_code(self):
1506  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sDelete(" % self.kernel.name_camel)
1507  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
1508  self.target_c_code.write_line(" tivx_obj_desc_t *obj_desc[],")
1509  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg)")
1510  self.target_c_code.write_open_brace()
1511  self.target_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
1512  if self.prms_needed :
1513  if self.prms_commented_out:
1514  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1515  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1516  self.target_c_code.write_line("tivx%sParams *prms = NULL;" % self.kernel.name_camel, files=self.prms_write)
1517  self.target_c_code.write_line("uint32_t size;", files=self.prms_write)
1518  if self.prms_commented_out:
1519  self.target_c_code.write_line("#endif" , files=self.prms_write)
1520  self.target_c_code.write_newline(files=self.prms_write)
1521  self.target_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Add any target kernel delete code here (e.g. freeing")
1522  self.target_c_code.write_comment_line(" local memory buffers, etc) >")
1523  if self.prms_needed :
1524  if self.prms_commented_out:
1525  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1526  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1527  # checks function parameters
1528  self.target_c_code.write_line("if ( (num_params != %s%s_MAX_PARAMS)" % (self.kernel.enum_str_prefix, self.kernel.name_upper) , files=self.prms_write)
1529  for prm in self.kernel.params :
1530  if prm.state is ParamState.REQUIRED :
1531  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), files=self.prms_write)
1532  self.target_c_code.write_line(")", files=self.prms_write)
1533  self.target_c_code.write_open_brace(files=self.prms_write)
1534  # function parameters status check failure case
1535  self.target_c_code.write_line("status = (vx_status)VX_FAILURE;", files=self.prms_write)
1536  self.target_c_code.write_close_brace(files=self.prms_write)
1537  self.target_c_code.write_line("else", files=self.prms_write)
1538  self.target_c_code.write_open_brace(files=self.prms_write)
1539  self.target_c_code.write_line("tivxGetTargetKernelInstanceContext(kernel, (void **)&prms, &size);", files=self.prms_write)
1540  self.target_c_code.write_newline(files=self.prms_write)
1541  self.target_c_code.write_line("if ((NULL != prms) &&", files=self.prms_write)
1542  self.target_c_code.write_line(" (sizeof(tivx%sParams) == size))" % self.kernel.name_camel, files=self.prms_write)
1543  self.target_c_code.write_open_brace(files=self.prms_write)
1544  for local in self.kernel.local_mem_list :
1545  if self.is_supported_type(local.prm.type) :
1546  self.target_c_code.write_line("if (NULL != prms->%s_ptr)" % (local.name), files=self.prms_write)
1547  self.target_c_code.write_open_brace(files=self.prms_write)
1548  self.target_c_code.write_line("tivxMemFree(prms->%s_ptr, prms->%s_size, (vx_enum)TIVX_MEM_EXTERNAL);" %
1549  (local.name, local.name) , files=self.prms_write)
1550  self.target_c_code.write_close_brace(files=self.prms_write)
1551  self.target_c_code.write_newline(files=self.prms_write)
1552 
1553  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1554  self.target_c_code.write_comment_line("tivxBamDestroyHandle(prms->graph_handle);", files=1)
1555  self.target_c_code.write_line("tivxMemFree(prms, size, (vx_enum)TIVX_MEM_EXTERNAL);", files=self.prms_write)
1556  self.target_c_code.write_close_brace(files=self.prms_write)
1557  self.target_c_code.write_close_brace(files=self.prms_write)
1558  if self.prms_commented_out:
1559  self.target_c_code.write_line("#endif" , files=self.prms_write)
1560  self.target_c_code.write_newline()
1561  self.target_c_code.write_line("return status;")
1562  self.target_c_code.write_close_brace()
1563  self.target_c_code.write_newline()
1564 
1565  def generate_target_c_control_func_code(self):
1566  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sControl(" % self.kernel.name_camel)
1567  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
1568  self.target_c_code.write_line(" uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[],")
1569  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg)")
1570  self.target_c_code.write_open_brace()
1571  self.target_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
1572  self.target_c_code.write_newline()
1573  self.target_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Add any target kernel control code here (e.g. commands")
1574  self.target_c_code.write_comment_line(" the user can call to modify the processing of the kernel at run-time) >")
1575  self.target_c_code.write_newline()
1576  self.target_c_code.write_line("return status;")
1577  self.target_c_code.write_close_brace()
1578  self.target_c_code.write_newline()
1579 
1580  def generate_target_c_struct(self):
1581  self.target_c_code.write_line("typedef struct", files=self.prms_write)
1582  self.target_c_code.write_line("{", files=self.prms_write)
1583  for local in self.kernel.local_mem_list :
1584  self.target_c_code.write_line(" void *%s_ptr;" % local.name , files=self.prms_write)
1585  self.target_c_code.write_line(" uint32_t %s_size;" % local.name , files=self.prms_write)
1586  if self.target_uses_dsp :
1587  self.target_c_code.write_line(" tivx_bam_graph_handle graph_handle;" , files=1)
1588  self.target_c_code.write_line("} tivx%sParams;" % self.kernel.name_camel, files=self.prms_write)
1589  self.target_c_code.write_newline(files=self.prms_write)
1590 
1591  def generate_bam_pointers(self, kernel_params):
1592  idx = 0
1593  for prm in kernel_params :
1594  if prm.type == Type.IMAGE :
1595  self.target_c_code.write_line("img_ptrs[%s] = %s_addr;" % (idx, prm.name_lower), files=1)
1596  idx += 1
1597  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1598  self.target_c_code.write_comment_line("tivxBamUpdatePointers(prms->graph_handle, %sU, %sU, img_ptrs);" % (self.kernel.getNumInputImages(), self.kernel.getNumOutputImages()), files=1)
1599  self.target_c_code.write_newline(files=1)
1600 
1601  def generate_optional_bam_pointers(self, num_scenarios) :
1602  first_scenario = True
1603  first_param = True
1604  binary_mask = num_scenarios
1605  for scenario in range(num_scenarios) :
1606  first_param = True
1607  included_str = []
1608  num_included_optional_input = 0
1609  num_included_optional_output = 0
1610  for idx, prm in enumerate(self.optional_img_params) :
1611  if binary_mask & (2**idx) :
1612  included_str.append(prm.name_lower)
1613  if first_scenario == True and first_param == True:
1614  self.target_c_code.write_line ("if ( (%s_desc != NULL)" % prm.name_lower, files=1)
1615  first_scenario = False
1616  first_param = False
1617  elif first_param == True :
1618  self.target_c_code.write_line ("else if ( (%s_desc != NULL)" % prm.name_lower, files=1)
1619  first_scenario = False
1620  first_param = False
1621  else :
1622  self.target_c_code.write_line (" && (%s_desc != NULL)" % prm.name_lower, files=1)
1623  if prm.direction == Direction.INPUT :
1624  num_included_optional_input += 1
1625  elif prm.direction == Direction.OUTPUT :
1626  num_included_optional_output += 1
1627  self.target_c_code.write_line (")", files=1)
1628  self.target_c_code.write_open_brace(files=1)
1629  idx = 0
1630  for prm in self.kernel.params :
1631  if (prm.type == Type.IMAGE and prm.state == ParamState.REQUIRED) or \
1632  (prm.name_lower in included_str):
1633  self.target_c_code.write_line("img_ptrs[%s] = %s_addr;" % (idx, prm.name_lower), files=1)
1634  idx += 1
1635  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1636  self.target_c_code.write_comment_line("tivxBamUpdatePointers(prms->graph_handle, %sU, %sU, img_ptrs);" % (self.kernel.getNumRequiredInputImages()+num_included_optional_input, \
1637  self.kernel.getNumRequiredOutputImages()+num_included_optional_output), files=1)
1638  self.target_c_code.write_close_brace(files=1)
1639  binary_mask -= 1
1640 
1641  self.target_c_code.write_line ("else", files=1)
1642  self.target_c_code.write_open_brace(files=1)
1643  idx = 0
1644  for prm in self.kernel.params :
1645  if (prm.type == Type.IMAGE and prm.state == ParamState.REQUIRED) :
1646  self.target_c_code.write_line("img_ptrs[%s] = %s_addr;" % (idx, prm.name_lower), files=1)
1647  idx += 1
1648  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1649  self.target_c_code.write_comment_line("tivxBamUpdatePointers(prms->graph_handle, %sU, %sU, img_ptrs);" % (self.kernel.getNumRequiredInputImages(), \
1650  self.kernel.getNumRequiredOutputImages()), files=1)
1651  self.target_c_code.write_close_brace(files=1)
1652 
1653 
1654  def generate_optional_list(self, kernel_params) :
1655  self.optional_img_params = []
1656  for prm in kernel_params :
1657  if prm.type == Type.IMAGE and prm.state == ParamState.OPTIONAL :
1658  self.optional_img_params.append(prm)
1659 
1660  def generate_target_c_process_func_code(self):
1661  # define function name, and parameters
1662  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sProcess(" % self.kernel.name_camel)
1663  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
1664  self.target_c_code.write_line(" tivx_obj_desc_t *obj_desc[],")
1665  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg)")
1666  self.target_c_code.write_open_brace()
1667 
1668  # define status variables and obj descriptor variable
1669  self.target_c_code.write_line("vx_status status = (vx_status)VX_SUCCESS;")
1670  if self.prms_needed :
1671  if self.prms_commented_out:
1672  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1673  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1674  self.target_c_code.write_line("tivx%sParams *prms = NULL;" % self.kernel.name_camel, files=self.prms_write)
1675  if self.prms_commented_out:
1676  self.target_c_code.write_line("#endif" , files=self.prms_write)
1677  need_plane_idx_var = False
1678  need_exposure_idx_var = False
1679  need_pyramid_idx_var = False
1680  printed_incrementer = False
1681  for prm in self.kernel.params :
1682  if Type.IMAGE == prm.type or Type.PYRAMID == prm.type:
1683  if len(prm.data_types) > 1 :
1684  for dt in prm.data_types[0:-1] :
1685  if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1686  need_plane_idx_var = True
1687  break
1688  if Type.PYRAMID == prm.type:
1689  need_pyramid_idx_var = True
1690  if Type.RAW_IMAGE == prm.type :
1691  need_exposure_idx_var = True
1692  self.target_c_code.write_line("%s *%s_desc;" % (Type.get_obj_desc_name(prm.type), prm.name_lower) )
1693  if prm.type == Type.PYRAMID :
1694  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) )
1695  if printed_incrementer is False :
1696  self.target_c_code.write_line("vx_uint32 i;")
1697  printed_incrementer = True
1698  #TODO: Object Array is hardcoded to image ... modify for proper type
1699  if prm.type == Type.OBJECT_ARRAY :
1700  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) )
1701  if printed_incrementer is False :
1702  self.target_c_code.write_line("vx_uint32 i;")
1703  printed_incrementer = True
1704  if need_plane_idx_var is True :
1705  self.target_c_code.write_line("uint16_t plane_idx;")
1706  if need_exposure_idx_var is True :
1707  self.target_c_code.write_line("uint16_t exposure_idx;")
1708  if need_pyramid_idx_var is True and printed_incrementer is False :
1709  self.target_c_code.write_line("vx_uint32 i;")
1710 
1711  self.target_c_code.write_newline()
1712 
1713  # checks function parameters
1714  self.target_c_code.write_line("if ( (num_params != %s%s_MAX_PARAMS)" % (self.kernel.enum_str_prefix, self.kernel.name_upper) )
1715  for prm in self.kernel.params :
1716  if prm.state is ParamState.REQUIRED :
1717  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))
1718  self.target_c_code.write_line(")")
1719 
1720  self.target_c_code.write_open_brace()
1721 
1722  # function parameters status check failure case
1723  self.target_c_code.write_line("status = (vx_status)VX_FAILURE;")
1724  self.target_c_code.write_close_brace()
1725  self.target_c_code.write_newline()
1726 
1727  self.target_c_code.write_line("if((vx_status)VX_SUCCESS == status)")
1728  self.target_c_code.write_open_brace()
1729 
1730  if self.prms_needed :
1731  if self.prms_commented_out:
1732  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1733  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1734  self.target_c_code.write_line("uint32_t size;", files=self.prms_write)
1735  if self.prms_commented_out:
1736  self.target_c_code.write_line("#endif" , files=self.prms_write)
1737 
1738  # assigned descriptors to local variables
1739  for prm in self.kernel.params :
1740  self.target_c_code.write_line("%s_desc = (%s *)obj_desc[%s%s_%s_IDX];" %
1741  (prm.name_lower, Type.get_obj_desc_name(prm.type), self.kernel.enum_str_prefix, self.kernel.name_upper, prm.name_upper) )
1742  self.target_c_code.write_newline()
1743 
1744  # retrieving prms struct for use
1745  if self.prms_needed :
1746  if self.prms_commented_out:
1747  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
1748  self.target_c_code.write_line("#if 0" , files=self.prms_write)
1749  self.target_c_code.write_line("status = tivxGetTargetKernelInstanceContext(kernel,", files=self.prms_write)
1750  self.target_c_code.write_line(" (void **)&prms, &size);", files=self.prms_write)
1751  self.target_c_code.write_line("if (((vx_status)VX_SUCCESS != status) || (NULL == prms) ||", files=self.prms_write)
1752  self.target_c_code.write_line(" (sizeof(tivx%sParams) != size))" % self.kernel.name_camel, files=self.prms_write)
1753  self.target_c_code.write_open_brace(files=self.prms_write)
1754  self.target_c_code.write_line("status = (vx_status)VX_FAILURE;", files=self.prms_write)
1755  self.target_c_code.write_close_brace(files=self.prms_write)
1756  if self.prms_commented_out:
1757  self.target_c_code.write_line("#endif" , files=self.prms_write)
1758 
1759  self.target_c_code.write_close_brace()
1760  self.target_c_code.write_newline()
1761  # function parameters status check success case
1762 
1763  self.target_c_code.write_line("if((vx_status)VX_SUCCESS == status)")
1764  self.target_c_code.write_open_brace()
1765 
1766  # define variables to hold scalar values
1767  for prm in self.kernel.params :
1768  if Type.is_scalar_type(prm.type) is True :
1769  self.target_c_code.write_line("%s %s_value;" % (Type.get_vx_name(prm.type), prm.name_lower ))
1770  self.target_c_code.write_newline()
1771 
1772  # assigned descriptors to local variables
1773  for prm in self.kernel.params :
1774  if prm.type == Type.PYRAMID:
1775  self.target_c_code.write_line("void *%s_target_ptr[TIVX_PYRAMID_MAX_LEVEL_OBJECTS] = {NULL};" % prm.name_lower )
1776  elif prm.type == Type.OBJECT_ARRAY :
1777  self.target_c_code.write_line("void *%s_target_ptr[TIVX_OBJECT_ARRAY_MAX_ITEMS] = {NULL};" % prm.name_lower )
1778  elif prm.type == Type.RAW_IMAGE :
1779  self.target_c_code.write_line("void *%s_target_ptr[TIVX_RAW_IMAGE_MAX_EXPOSURES] = {NULL};" % prm.name_lower )
1780  elif prm.type == Type.IMAGE :
1781  if len(prm.data_types) > 1 :
1782  for dt in prm.data_types[0:-1] :
1783  if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1784  self.target_c_code.write_line("void *%s_target_ptr[TIVX_IMAGE_MAX_PLANES] = {NULL};" % prm.name_lower )
1785  else :
1786  self.target_c_code.write_line("void *%s_target_ptr;" % prm.name_lower )
1787  else :
1788  self.target_c_code.write_line("void *%s_target_ptr;" % prm.name_lower )
1789  else :
1790  self.target_c_code.write_line("void *%s_target_ptr;" % prm.name_lower )
1791  self.target_c_code.write_newline()
1792 
1793  # convert descriptors pointer to target pointers
1794  for prm in self.kernel.params :
1795  desc = prm.name_lower + "_desc"
1796  if Type.is_scalar_type(prm.type) is False :
1797  if prm.state is ParamState.OPTIONAL:
1798  self.target_c_code.write_line("if( %s != NULL)" % desc)
1799  self.target_c_code.write_open_brace()
1800  if Type.IMAGE == prm.type or Type.PYRAMID == prm.type or Type.OBJECT_ARRAY == prm.type or Type.RAW_IMAGE == prm.type:
1801  # Check if data type has multi-planes
1802  self.multiplane = False
1803  if len(prm.data_types) > 1 :
1804  for dt in prm.data_types[0:-1] :
1805  if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1806  self.multiplane = True
1807  break
1808  if prm.type == Type.IMAGE :
1809  if self.multiplane :
1810  self.target_c_code.write_line("for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1811  self.target_c_code.write_open_brace()
1812  self.target_c_code.write_line("%s_target_ptr[plane_idx] = tivxMemShared2TargetPtr(&%s->mem_ptr[plane_idx]);" % (prm.name_lower, desc))
1813  if prm.do_map :
1814  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[plane_idx]," % prm.name_lower )
1815  self.target_c_code.write_line(" %s->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1816  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1817  self.target_c_code.write_close_brace()
1818  else :
1819  self.target_c_code.write_line("%s_target_ptr = tivxMemShared2TargetPtr(&%s->mem_ptr[0]);" % (prm.name_lower, desc))
1820  if prm.do_map :
1821  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr," % prm.name_lower )
1822  self.target_c_code.write_line(" %s->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1823  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1824  elif prm.type == Type.RAW_IMAGE :
1825  self.target_c_code.write_line("for(exposure_idx=0; exposure_idx<%s->params.num_exposures; exposure_idx++)" % desc )
1826  self.target_c_code.write_open_brace()
1827  self.target_c_code.write_line("%s_target_ptr[exposure_idx] = tivxMemShared2TargetPtr(&%s->mem_ptr[exposure_idx]);" % (prm.name_lower, desc))
1828  if prm.do_map :
1829  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[exposure_idx]," % prm.name_lower )
1830  self.target_c_code.write_line(" %s->mem_size[exposure_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1831  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1832  self.target_c_code.write_close_brace()
1833  elif prm.type == Type.PYRAMID or prm.type == Type.OBJECT_ARRAY:
1834  if prm.type == Type.PYRAMID :
1835  self.target_c_code.write_line("tivxGetObjDescList(%s->obj_desc_id, (tivx_obj_desc_t**)img_%s, %s->num_levels);" % (desc, desc, desc) )
1836  else :
1837  self.target_c_code.write_line("tivxGetObjDescList(%s->obj_desc_id, (tivx_obj_desc_t**)img_%s, %s->num_items);" % (desc, desc, desc) )
1838  if self.multiplane :
1839  if prm.type == Type.PYRAMID :
1840  self.target_c_code.write_line("for(i=0U; i<%s->num_levels; i++)" % desc )
1841  else :
1842  self.target_c_code.write_line("for(i=0U; i<%s->num_items; i++)" % desc )
1843  self.target_c_code.write_open_brace()
1844  self.target_c_code.write_line("for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1845  self.target_c_code.write_open_brace()
1846  self.target_c_code.write_line("%s_target_ptr[i] = tivxMemShared2TargetPtr(&img_%s[i]->mem_ptr[plane_idx]);" % (prm.name_lower, desc))
1847  if prm.do_map :
1848  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[i]," % prm.name_lower )
1849  self.target_c_code.write_line(" img_%s[i]->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1850  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1851  self.target_c_code.write_close_brace()
1852  self.target_c_code.write_close_brace()
1853  else :
1854  if prm.type == Type.PYRAMID :
1855  self.target_c_code.write_line("for(i=0U; i<%s->num_levels; i++)" % desc )
1856  else :
1857  self.target_c_code.write_line("for(i=0U; i<%s->num_items; i++)" % desc )
1858  self.target_c_code.write_open_brace()
1859  self.target_c_code.write_line("%s_target_ptr[i] = tivxMemShared2TargetPtr(&img_%s[i]->mem_ptr[0]);" % (prm.name_lower, desc))
1860  if prm.do_map :
1861  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr[i]," % prm.name_lower )
1862  self.target_c_code.write_line(" img_%s[i]->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1863  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1864  self.target_c_code.write_close_brace()
1865  elif prm.type != Type.THRESHOLD:
1866  self.target_c_code.write_line("%s_target_ptr = tivxMemShared2TargetPtr(&%s->mem_ptr);" % (prm.name_lower, desc))
1867  if prm.do_map :
1868  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferMap(%s_target_ptr," % prm.name_lower )
1869  self.target_c_code.write_line(" %s->mem_size, (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1870  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1871  if prm.state is ParamState.OPTIONAL:
1872  self.target_c_code.write_close_brace()
1873  self.target_c_code.write_newline()
1874  self.target_c_code.write_newline()
1875 
1876  # set scalar values to local variables for input type scalars
1877  for prm in self.kernel.params :
1878  desc = prm.name_lower + "_desc"
1879  if (Type.is_scalar_type(prm.type) is True) and prm.direction != Direction.OUTPUT :
1880  if prm.state is ParamState.OPTIONAL:
1881  self.target_c_code.write_line("if( %s != NULL)" % desc)
1882  self.target_c_code.write_open_brace()
1883  if "invalid" != Type.get_scalar_obj_desc_data_name(prm.type):
1884  self.target_c_code.write_line("%s_value = %s->data.%s;" % (prm.name_lower, desc, Type.get_scalar_obj_desc_data_name(prm.type)))
1885  else :
1886  self.target_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Modify 'scalar data type' below to be correct type >")
1887  self.target_c_code.write_line("/*%s_value = %s->data.<scalar data type>;*/" % (prm.name_lower, desc))
1888  if prm.state is ParamState.OPTIONAL:
1889  self.target_c_code.write_close_brace()
1890  self.target_c_code.write_newline()
1891 
1892  self.target_c_code.write_open_brace()
1893  if self.target_uses_dsp :
1894  if self.kernel.getNumImages() > 0:
1895  self.target_c_code.write_line("void *img_ptrs[%s];" % self.kernel.getNumImages(), files=1)
1896 
1897  # Setting up bufparams and pointer location in case of image
1898  for prm in self.kernel.params :
1899  if prm.type == Type.IMAGE and (prm.do_map or prm.do_unmap):
1900  self.target_c_code.write_line("VXLIB_bufParams2D_t vxlib_%s;" % prm.name_lower)
1901  self.target_c_code.write_line("uint8_t *%s_addr = NULL;" % prm.name_lower)
1902  self.target_c_code.write_newline()
1903  for prm in self.kernel.params :
1904  desc = prm.name_lower + "_desc"
1905  if prm.type == Type.IMAGE and (prm.do_map or prm.do_unmap):
1906  if prm.state is ParamState.OPTIONAL:
1907  self.target_c_code.write_line("if( %s != NULL)" % desc)
1908  self.target_c_code.write_open_brace()
1909  self.target_c_code.write_line("tivxInitBufParams(%s, &vxlib_%s);" % (desc, prm.name_lower) )
1910  self.target_c_code.write_line("tivxSetPointerLocation(%s, &%s_target_ptr, &%s_addr);" % (desc, prm.name_lower, prm.name_lower) )
1911  if prm.state is ParamState.OPTIONAL:
1912  self.target_c_code.write_close_brace()
1913  self.target_c_code.write_newline()
1914 
1915  if self.target_uses_dsp :
1916  if self.kernel.getNumImages() > 0:
1917  self.generate_optional_list(self.kernel.params)
1918  if self.kernel.getNumOptionalImages() > 0 :
1919  num_scenarios = (2 ** self.kernel.getNumOptionalImages()) - 1
1920  else :
1921  num_scenarios = 1
1922  if num_scenarios == 1 and self.kernel.getNumOptionalImages() == 0 :
1923  self.generate_bam_pointers(self.kernel.params)
1924  elif num_scenarios == 1 and self.kernel.getNumOptionalImages() > 0 :
1925  self.generate_optional_bam_pointers(num_scenarios)
1926  else :
1927  self.generate_optional_bam_pointers(num_scenarios)
1928  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment once BAM graph has been created >", files=1)
1929  self.target_c_code.write_comment_line("status = tivxBamProcessGraph(prms->graph_handle);", files=1)
1930  self.target_c_code.write_newline(files=1)
1931 
1932  self.target_c_code.write_comment_line("call kernel processing function")
1933  self.target_c_code.write_newline()
1934  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Add target kernel processing code here >")
1935  self.target_c_code.write_newline()
1936  self.target_c_code.write_comment_line("kernel processing function complete")
1937  self.target_c_code.write_newline()
1938  self.target_c_code.write_close_brace()
1939 
1940  # unmap descriptors pointer
1941  for prm in self.kernel.params :
1942  desc = prm.name_lower + "_desc"
1943  if prm.do_unmap :
1944  if prm.state is ParamState.OPTIONAL:
1945  self.target_c_code.write_line("if( %s != NULL)" % desc)
1946  self.target_c_code.write_open_brace()
1947  if Type.IMAGE == prm.type or Type.PYRAMID == prm.type or Type.OBJECT_ARRAY == prm.type or Type.RAW_IMAGE == prm.type:
1948  # Check if data type has multi-planes
1949  self.multiplane = False
1950  if len(prm.data_types) > 1 :
1951  for dt in prm.data_types[0:-1] :
1952  if DfImage.get_num_planes(DfImage.get_df_enum_from_string(dt)) > 1 :
1953  self.multiplane = True
1954  break
1955  if prm.type == Type.IMAGE :
1956  if self.multiplane :
1957  self.target_c_code.write_line("for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1958  self.target_c_code.write_open_brace()
1959  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[plane_idx]," % prm.name_lower )
1960  self.target_c_code.write_line(" %s->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1961  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1962  self.target_c_code.write_close_brace()
1963  else :
1964  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr," % prm.name_lower )
1965  self.target_c_code.write_line(" %s->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1966  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1967  elif prm.type == Type.RAW_IMAGE :
1968  self.target_c_code.write_line("for(exposure_idx=0; exposure_idx<%s->params.num_exposures; exposure_idx++)" % desc )
1969  self.target_c_code.write_open_brace()
1970  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[exposure_idx]," % prm.name_lower )
1971  self.target_c_code.write_line(" %s->mem_size[exposure_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1972  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1973  self.target_c_code.write_close_brace()
1974  elif prm.type == Type.PYRAMID or prm.type == Type.OBJECT_ARRAY :
1975  if self.multiplane :
1976  if prm.type == Type.PYRAMID :
1977  self.target_c_code.write_line("for(i=0U; i<%s->num_levels; i++)" % desc )
1978  else :
1979  self.target_c_code.write_line("for(i=0U; i<%s->num_items; i++)" % desc )
1980  self.target_c_code.write_open_brace()
1981  self.target_c_code.write_line("for(plane_idx=0; plane_idx<%s->planes; plane_idx++)" % desc )
1982  self.target_c_code.write_open_brace()
1983  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[i]," % prm.name_lower )
1984  self.target_c_code.write_line(" img_%s[i]->mem_size[plane_idx], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1985  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1986  self.target_c_code.write_close_brace()
1987  self.target_c_code.write_close_brace()
1988  else :
1989  if prm.type == Type.PYRAMID :
1990  self.target_c_code.write_line("for(i=0U; i<%s->num_levels; i++)" % desc )
1991  else :
1992  self.target_c_code.write_line("for(i=0U; i<%s->num_items; i++)" % desc )
1993  self.target_c_code.write_open_brace()
1994  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr[i]," % prm.name_lower )
1995  self.target_c_code.write_line(" img_%s[i]->mem_size[0], (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
1996  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
1997  self.target_c_code.write_close_brace()
1998  elif prm.type != Type.THRESHOLD :
1999  self.target_c_code.write_line("tivxCheckStatus(&status, tivxMemBufferUnmap(%s_target_ptr," % prm.name_lower )
2000  self.target_c_code.write_line(" %s->mem_size, (vx_enum)VX_MEMORY_TYPE_HOST," % desc)
2001  self.target_c_code.write_line(" (vx_enum)%s));" % Direction.get_access_type(prm.direction))
2002  if prm.state is ParamState.OPTIONAL:
2003  self.target_c_code.write_close_brace()
2004  self.target_c_code.write_newline()
2005  self.target_c_code.write_newline()
2006 
2007  # set scalar values from local variables for output type scalars
2008  for prm in self.kernel.params :
2009  desc = prm.name_lower + "_desc"
2010  if (Type.is_scalar_type(prm.type) is True) and prm.direction != Direction.INPUT :
2011  if "invalid" != Type.get_scalar_obj_desc_data_name(prm.type):
2012  self.target_c_code.write_line("%s->data.%s = %s_value;" % (desc, Type.get_scalar_obj_desc_data_name(prm.type), prm.name_lower))
2013  else :
2014  self.target_c_code.write_comment_line("< DEVELOPER_TODO: (Optional) Modify 'scalar data type' below to be correct type >")
2015  self.target_c_code.write_line("/*%s->data.<scalar data type> = %s_value;*/" % (prm.name_lower, desc))
2016  self.target_c_code.write_newline()
2017 
2018  self.target_c_code.write_close_brace()
2019 
2020  self.target_c_code.write_newline()
2021  self.target_c_code.write_line("return status;")
2022  self.target_c_code.write_close_brace()
2023  self.target_c_code.write_newline()
2024 
2025  def generate_target_c_file_code(self):
2026  print("Creating " + self.workarea_module_core + "/" + self.target_c_filename)
2027  if self.target_uses_dsp :
2028  self.target_c_code = CodeGenerate(self.workarea_module_core + "/" + self.target_c_filename, True, self.workarea_module_core_bam + "/" + self.bam_target_c_filename)
2029  print("Creating " + self.workarea_module_core_bam + "/" + self.bam_target_c_filename)
2030  else :
2031  self.target_c_code = CodeGenerate(self.workarea_module_core + "/" + self.target_c_filename)
2032  self.target_c_code.write_include("TI/tivx.h")
2033  self.target_c_code.write_include(self.company + "/" + self.top_header_name + ".h")
2034  self.target_c_code.write_include("VX/vx.h")
2035  self.target_c_code.write_include("tivx_" + self.module.lower() + "_kernels" + self.kernels_header_extension + ".h")
2036  self.target_c_code.write_include(self.h_filename)
2037  self.target_c_code.write_include("TI/tivx_target_kernel.h")
2038  self.target_c_code.write_include("tivx_kernels_target_utils.h")
2039  if self.target_uses_dsp :
2040  self.target_c_code.write_include("tivx_bam_kernel_wrapper.h", files=1)
2041  self.target_c_code.write_newline()
2042  # Calling method for creating struct based on if localMem is needing to be allocated
2043  if self.prms_needed == True :
2044  if self.prms_commented_out:
2045  self.target_c_code.write_comment_line("< DEVELOPER_TODO: Uncomment if kernel context is needed >")
2046  self.target_c_code.write_line("#if 0" , files=self.prms_write)
2048  if self.prms_commented_out:
2049  self.target_c_code.write_line("#endif" , files=self.prms_write)
2050  self.target_c_code.write_line("static tivx_target_kernel vx_%s_target_kernel = NULL;" % (self.kernel.name_lower))
2051  self.target_c_code.write_newline()
2052 
2053  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sProcess(" % self.kernel.name_camel)
2054  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
2055  self.target_c_code.write_line(" tivx_obj_desc_t *obj_desc[],")
2056  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg);")
2057  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sCreate(" % self.kernel.name_camel)
2058  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
2059  self.target_c_code.write_line(" tivx_obj_desc_t *obj_desc[],")
2060  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg);")
2061  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sDelete(" % self.kernel.name_camel)
2062  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
2063  self.target_c_code.write_line(" tivx_obj_desc_t *obj_desc[],")
2064  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg);")
2065  self.target_c_code.write_line("static vx_status VX_CALLBACK tivx%sControl(" % self.kernel.name_camel)
2066  self.target_c_code.write_line(" tivx_target_kernel_instance kernel,")
2067  self.target_c_code.write_line(" uint32_t node_cmd_id, tivx_obj_desc_t *obj_desc[],")
2068  self.target_c_code.write_line(" uint16_t num_params, void *priv_arg);")
2069 
2070  self.target_c_code.write_newline()
2077  self.target_c_code.close()
2078 
2079  def generate_make_files(self, kernel) :
2080  if self.env_var == 'CUSTOM_KERNEL_PATH' or self.env_var == 'CUSTOM_APPLICATION_PATH':
2081  self.concerto_inc_filename = self.workarea + "/concerto_inc.mak"
2082  if not os.path.exists(self.concerto_inc_filename):
2083  print("Creating " + self.concerto_inc_filename)
2084  self.concerto_inc_code = CodeGenerate(self.concerto_inc_filename, header=False)
2085  self.concerto_inc_code.write_line("# This file contains a list of extension kernel specific static libraries")
2086  self.concerto_inc_code.write_line("# to be included in the PC executables. It is put in this separate file")
2087  self.concerto_inc_code.write_line("# to make it easier to add/extend kernels without needing to modify")
2088  self.concerto_inc_code.write_line("# several concerto.mak files which depend on kernel libraries.")
2089  self.concerto_inc_code.write_newline()
2090  self.concerto_inc_code.write_line("STATIC_LIBS += vx_kernels_" + self.module + "_tests " + "vx_kernels_" + self.module)
2091  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2092  self.concerto_inc_code.write_line("STATIC_LIBS += vx_target_kernels_" + self.core)
2093  if self.target_uses_dsp :
2094  self.concerto_inc_code.write_line("ifeq ($(BUILD_BAM),yes)")
2095  self.concerto_inc_code.write_line("STATIC_LIBS += vx_target_kernels_" + self.core + "_bam")
2096  self.concerto_inc_code.write_line("endif")
2097  else:
2098  self.concerto_inc_code.write_line("STATIC_LIBS += vx_target_kernels_" + self.module + "_" + self.core)
2099  if self.target_uses_dsp :
2100  self.concerto_inc_code.write_line("ifeq ($(BUILD_BAM),yes)")
2101  self.concerto_inc_code.write_line("STATIC_LIBS += vx_target_kernels_" + self.module + "_" + self.core + "_bam")
2102  self.concerto_inc_code.write_line("endif")
2103  self.concerto_inc_code.write_line("STATIC_LIBS += vx_conformance_engine")
2104  self.concerto_inc_code.write_line("# < DEVELOPER_TODO: Add any additional dependent libraries >")
2105  self.concerto_inc_code.close()
2106 
2107  if self.env_var == 'CUSTOM_KERNEL_PATH' or self.env_var == 'CUSTOM_APPLICATION_PATH':
2108  self.tools_path_filename = self.workarea + "/custom_tools_path.mak"
2109  if not os.path.exists(self.tools_path_filename):
2110  print("Creating " + self.tools_path_filename)
2111  self.tools_path_code = CodeGenerate(self.tools_path_filename, header=False)
2112  self.tools_path_code.write_line("# This file can optionally be used to define environment variables which")
2113  self.tools_path_code.write_line("# are needed by the kernel libraries defined in this folder, or can be")
2114  self.tools_path_code.write_line("# used to overwrite environment variables from the psdk_tools_path.mak")
2115  self.tools_path_code.write_line("# and vsdk_tools_path.mak files from the tiovx directory.")
2116  self.tools_path_code.write_newline()
2117  self.tools_path_code.write_line("# < DEVELOPER_TODO: Add any custom PATH environment variables >")
2118  self.tools_path_code.close()
2119 
2120  self.module_host_concerto_filename = self.workarea_module_host + "/concerto.mak"
2121  if not os.path.exists(self.module_host_concerto_filename):
2122  print("Creating " + self.module_host_concerto_filename)
2123  self.module_host_concerto_code = CodeGenerate(self.module_host_concerto_filename, header=False)
2124  self.module_host_concerto_code.write_newline()
2125  self.module_host_concerto_code.write_line("ifeq ($(TARGET_CPU), $(filter $(TARGET_CPU), X86 x86_64 A15 M4 A72 A53 R5F))")
2126  self.module_host_concerto_code.write_newline()
2127  self.module_host_concerto_code.write_line("include $(PRELUDE)")
2128  self.module_host_concerto_code.write_line("TARGET := vx_kernels_" + self.module)
2129  self.module_host_concerto_code.write_line("TARGETTYPE := library")
2130  self.module_host_concerto_code.write_line("CSOURCES := $(call all-c-files)")
2131  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2132  self.module_host_concerto_code.write_line("IDIRS += "+self.idirs_path+"/include")
2133  self.module_host_concerto_code.write_line("IDIRS += "+self.idirs_path+"/" + self.module + "/include")
2134  else:
2135  self.module_host_concerto_code.write_line("IDIRS += "+self.idirs_path+"/kernels/" + self.module + "/include")
2136  self.module_host_concerto_code.write_newline()
2137  self.module_host_concerto_code.write_line("include $(FINALE)")
2138  self.module_host_concerto_code.write_newline()
2139  self.module_host_concerto_code.write_line("endif")
2140  self.module_host_concerto_code.close()
2141 
2142  self.module_target_concerto_filename = self.workarea_module_core + "/concerto.mak"
2143  if not os.path.exists(self.module_target_concerto_filename):
2144  print("Creating " + self.module_target_concerto_filename)
2145  self.module_target_concerto_code = CodeGenerate(self.module_target_concerto_filename, header=False)
2146  dspAdded = False
2147  eveAdded = False
2148  armAdded = False
2149  ipuAdded = False
2150  c7xAdded = False
2151  targetCpuListString = "X86 x86_64 "
2152  for tar in kernel.targets :
2153  if (tar == Target.DSP1 or tar == Target.DSP2) and (dspAdded == False) :
2154  targetCpuListString+="C66 "
2155  dspAdded = True
2156  if (tar == Target.EVE1 or tar == Target.EVE2 or tar == Target.EVE3 or tar == Target.EVE4) and (eveAdded == False) :
2157  targetCpuListString+="EVE "
2158  eveAdded = True
2159  if (tar == Target.A15_0) and (armAdded == False) :
2160  targetCpuListString+="A15 A72 "
2161  armAdded = True
2162  if (tar == Target.MCU2_0 or tar == Target.MCU2_1 or tar == Target.IPU2) and (ipuAdded == False) :
2163  targetCpuListString+="M4 R5F "
2164  ipuAdded = True
2165  if (tar == Target.DSP_C7_1) and (c7xAdded == False) :
2166  targetCpuListString+="C71 "
2167  c7xAdded = True
2168  self.module_target_concerto_code.write_newline()
2169  self.module_target_concerto_code.write_line("ifeq ($(TARGET_CPU), $(filter $(TARGET_CPU), " + targetCpuListString + "))")
2170  self.module_target_concerto_code.write_newline()
2171  self.module_target_concerto_code.write_line("include $(PRELUDE)")
2172  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2173  self.module_target_concerto_code.write_line("TARGET := vx_target_kernels_" + self.core)
2174  else:
2175  self.module_target_concerto_code.write_line("TARGET := vx_target_kernels_" + self.module + "_" + self.core);
2176  self.module_target_concerto_code.write_line("TARGETTYPE := library")
2177  self.module_target_concerto_code.write_line("CSOURCES := $(call all-c-files)")
2178  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2179  self.module_target_concerto_code.write_line("IDIRS += "+self.idirs_path+"/include")
2180  self.module_target_concerto_code.write_line("IDIRS += "+self.idirs_path+"/" + self.module + "/include")
2181  else:
2182  self.module_target_concerto_code.write_line("IDIRS += "+self.idirs_path+"/kernels/" + self.module + "/include")
2183  self.module_target_concerto_code.write_line("IDIRS += "+self.idirs_path+"/kernels/" + self.module + "/host")
2184  if self.env_var != "VISION_APPS_PATH" :
2185  self.module_target_concerto_code.write_line("IDIRS += $(HOST_ROOT)/kernels/include")
2186  else :
2187  self.module_target_concerto_code.write_line("IDIRS += $(TIOVX_PATH)/kernels/include")
2188  self.module_target_concerto_code.write_line("IDIRS += $(VXLIB_PATH)/packages")
2189  self.module_target_concerto_code.write_line("# < DEVELOPER_TODO: Add any custom include paths using 'IDIRS' >")
2190  self.module_target_concerto_code.write_line("# < DEVELOPER_TODO: Add any custom preprocessor defines or build options needed using")
2191  self.module_target_concerto_code.write_line("# 'CFLAGS'. >")
2192  self.module_target_concerto_code.write_line("# < DEVELOPER_TODO: Adjust which cores this library gets built on using 'SKIPBUILD'. >")
2193  self.module_target_concerto_code.write_newline()
2194  self.module_target_concerto_code.write_line("ifeq ($(TARGET_CPU),C66)")
2195  self.module_target_concerto_code.write_line("DEFS += CORE_DSP")
2196  self.module_target_concerto_code.write_line("endif")
2197  self.module_target_concerto_code.write_newline();
2198  self.module_target_concerto_code.write_line("ifeq ($(BUILD_BAM),yes)")
2199  self.module_target_concerto_code.write_line("DEFS += BUILD_BAM")
2200  self.module_target_concerto_code.write_line("endif")
2201  self.module_target_concerto_code.write_newline();
2202  self.module_target_concerto_code.write_line("ifeq ($(TARGET_CPU), $(filter $(TARGET_CPU), X86 x86_64))")
2203  self.module_target_concerto_code.write_line("DEFS += _HOST_BUILD _TMS320C6600 TMS320C66X HOST_EMULATION")
2204  self.module_target_concerto_code.write_line("endif")
2205  self.module_target_concerto_code.write_newline()
2206  self.module_target_concerto_code.write_line("include $(FINALE)")
2207  self.module_target_concerto_code.write_line("endif")
2208  self.module_target_concerto_code.close()
2209 
2210  if self.target_uses_dsp :
2212  if not os.path.exists(self.module_target_bam_concerto_filename):
2213  print("Creating " + self.module_target_bam_concerto_filename)
2214  self.module_target_bam_concerto_code = CodeGenerate(self.module_target_bam_concerto_filename, header=False)
2215  self.module_target_bam_concerto_code.write_line("ifeq ($(TARGET_CPU), $(filter $(TARGET_CPU), X86 x86_64 C66))")
2216  self.module_target_bam_concerto_code.write_line("include $(PRELUDE)")
2217  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2218  self.module_target_bam_concerto_code.write_line("TARGET := vx_target_kernels_" + self.core + "_bam")
2219  else:
2220  self.module_target_bam_concerto_code.write_line("TARGET := vx_target_kernels_" + self.module + "_" + self.core + "_bam");
2221  self.module_target_bam_concerto_code.write_line("TARGETTYPE := library")
2222  self.module_target_bam_concerto_code.write_line("CSOURCES := $(call all-c-files)")
2223  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2224  self.module_target_bam_concerto_code.write_line("IDIRS += "+self.idirs_path+"/include")
2225  self.module_target_bam_concerto_code.write_line("IDIRS += "+self.idirs_path+"/" + self.module + "/include")
2226  else:
2227  self.module_target_bam_concerto_code.write_line("IDIRS += "+self.idirs_path+"/kernels/" + self.module + "/include")
2228  self.module_target_bam_concerto_code.write_line("IDIRS += "+self.idirs_path+"/kernels/" + self.module + "/host")
2229  if self.env_var != "VISION_APPS_PATH" :
2230  self.module_target_bam_concerto_code.write_line("IDIRS += $(HOST_ROOT)/kernels/include")
2231  else :
2232  self.module_target_bam_concerto_code.write_line("IDIRS += $(TIOVX_PATH)/kernels/include")
2233  self.module_target_bam_concerto_code.write_line("IDIRS += $(ALGFRAMEWORK_PATH)/inc")
2234  self.module_target_bam_concerto_code.write_line("IDIRS += $(ALGFRAMEWORK_PATH)/src/bam_dma_nodes")
2235  self.module_target_bam_concerto_code.write_line("IDIRS += $(DMAUTILS_PATH)/inc")
2236  self.module_target_bam_concerto_code.write_line("IDIRS += $(DMAUTILS_PATH)")
2237  self.module_target_bam_concerto_code.write_line("IDIRS += $(DMAUTILS_PATH)/inc/edma_utils")
2238  self.module_target_bam_concerto_code.write_line("IDIRS += $(DMAUTILS_PATH)/inc/edma_csl")
2239  self.module_target_bam_concerto_code.write_line("IDIRS += $(DMAUTILS_PATH)/inc/baseaddress/vayu/dsp")
2240  self.module_target_bam_concerto_code.write_line("IDIRS += $(VXLIB_PATH)/packages")
2241  self.module_target_bam_concerto_code.write_line("# < DEVELOPER_TODO: Add any custom include paths using 'IDIRS' >")
2242  self.module_target_bam_concerto_code.write_line("# < DEVELOPER_TODO: Add any custom preprocessor defines or build options needed using")
2243  self.module_target_bam_concerto_code.write_line("# 'CFLAGS'. >")
2244  self.module_target_bam_concerto_code.write_line("# < DEVELOPER_TODO: Adjust which cores this library gets built on using 'SKIPBUILD'. >")
2245  self.module_target_bam_concerto_code.write_newline();
2246  self.module_target_bam_concerto_code.write_line("DEFS += CORE_DSP")
2247  self.module_target_bam_concerto_code.write_newline();
2248  self.module_target_bam_concerto_code.write_line("ifeq ($(BUILD_BAM),yes)")
2249  self.module_target_bam_concerto_code.write_line("DEFS += BUILD_BAM")
2250  self.module_target_bam_concerto_code.write_line("endif")
2251  self.module_target_bam_concerto_code.write_newline();
2252  self.module_target_bam_concerto_code.write_line("ifeq ($(TARGET_CPU), $(filter $(TARGET_CPU), X86 x86_64))")
2253  self.module_target_bam_concerto_code.write_line("DEFS += _HOST_BUILD _TMS320C6600 TMS320C66X HOST_EMULATION")
2254  self.module_target_bam_concerto_code.write_line("endif")
2255  self.module_target_bam_concerto_code.write_newline();
2256  self.module_target_bam_concerto_code.write_line("ifeq ($(BUILD_BAM),yes)")
2257  self.module_target_bam_concerto_code.write_line("SKIPBUILD=0")
2258  self.module_target_bam_concerto_code.write_line("else")
2259  self.module_target_bam_concerto_code.write_line("SKIPBUILD=1")
2260  self.module_target_bam_concerto_code.write_line("endif")
2261  self.module_target_bam_concerto_code.write_newline()
2262  self.module_target_bam_concerto_code.write_line("include $(FINALE)")
2263  self.module_target_bam_concerto_code.write_newline()
2264  self.module_target_bam_concerto_code.write_line("endif")
2265  self.module_target_bam_concerto_code.close()
2266 
2267  self.module_test_concerto_filename = self.workarea_module_test + "/concerto.mak"
2268  if not os.path.exists(self.module_test_concerto_filename):
2269  print("Creating " + self.module_test_concerto_filename)
2270  self.module_test_concerto_code = CodeGenerate(self.module_test_concerto_filename, header=False)
2271  self.module_test_concerto_code.write_newline()
2272  self.module_test_concerto_code.write_line("ifeq ($(TARGET_CPU), $(filter $(TARGET_CPU), X86 x86_64 A15 M4 A72 R5F))")
2273  self.module_test_concerto_code.write_newline()
2274  self.module_test_concerto_code.write_line("include $(PRELUDE)")
2275  self.module_test_concerto_code.write_line("TARGET := vx_kernels_" + self.module + "_tests")
2276  self.module_test_concerto_code.write_line("TARGETTYPE := library")
2277  self.module_test_concerto_code.write_line("CSOURCES := $(call all-c-files)")
2278  if self.env_var != "VISION_APPS_PATH" :
2279  self.module_test_concerto_code.write_line("IDIRS += $(HOST_ROOT)/conformance_tests")
2280  self.module_test_concerto_code.write_line("IDIRS += $(HOST_ROOT)/source/include")
2281  else :
2282  self.module_test_concerto_code.write_line("IDIRS += $(TIOVX_PATH)/include")
2283  self.module_test_concerto_code.write_line("IDIRS += $(TIOVX_PATH)/conformance_tests")
2284  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2285  self.module_test_concerto_code.write_line("IDIRS += "+self.idirs_path+"/include")
2286  self.module_test_concerto_code.write_line("IDIRS += "+self.idirs_path+"/" + self.module + "/include")
2287  else:
2288  self.module_test_concerto_code.write_line("IDIRS += "+self.idirs_path+"/kernels/" + self.module + "/include")
2289  if self.env_var == "CUSTOM_KERNEL_PATH" :
2290  self.module_test_concerto_code.write_line("IDIRS += $(CUSTOM_KERNEL_PATH)")
2291  if self.env_var == "CUSTOM_APPLICATION_PATH" :
2292  self.module_test_concerto_code.write_line("IDIRS += $(CUSTOM_APPLICATION_PATH)")
2293  self.module_test_concerto_code.write_line("CFLAGS += -DHAVE_VERSION_INC")
2294  self.module_test_concerto_code.write_newline()
2295  self.module_test_concerto_code.write_line("ifeq ($(HOST_COMPILER),TIARMCGT)")
2296  self.module_test_concerto_code.write_line("CFLAGS += --display_error_number")
2297  self.module_test_concerto_code.write_line("CFLAGS += --diag_suppress=179")
2298  self.module_test_concerto_code.write_line("CFLAGS += --diag_suppress=112")
2299  self.module_test_concerto_code.write_line("CFLAGS += --diag_suppress=552")
2300  self.module_test_concerto_code.write_line("endif")
2301  self.module_test_concerto_code.write_newline()
2302  self.module_test_concerto_code.write_line("ifeq ($(HOST_COMPILER),$(filter $(HOST_COMPILER),GCC GCC_WINDOWS GCC_LINUX GCC_LINUX_ARM))")
2303  self.module_test_concerto_code.write_line("CFLAGS += -Wno-unused-function")
2304  self.module_test_concerto_code.write_line("CFLAGS += -Wno-unused-variable")
2305  self.module_test_concerto_code.write_line("CFLAGS += -Wno-format-security")
2306  self.module_test_concerto_code.write_line("endif")
2307  self.module_test_concerto_code.write_newline()
2308  self.module_test_concerto_code.write_line("ifeq ($(TARGET_CPU),x86_64)")
2309  self.module_test_concerto_code.write_line("CFLAGS += -DTARGET_X86_64")
2310  self.module_test_concerto_code.write_line("endif")
2311  self.module_test_concerto_code.write_newline()
2312  self.module_test_concerto_code.write_line("include $(FINALE)")
2313  self.module_test_concerto_code.write_line("endif")
2314  self.module_test_concerto_code.close()
2315 
2316  def generate_headers(self) :
2317  if( self.env_var == 'CUSTOM_KERNEL_PATH' ) :
2318  self.include_custom_kernel_library_tests_filename = self.workarea_include + "/custom_kernel_library_tests.h"
2319  else :
2320  self.include_custom_kernel_library_tests_filename = self.workarea + "/kernels" + "/custom_app_kernel_library_tests.h"
2321 
2322  if not os.path.exists(self.include_custom_kernel_library_tests_filename):
2323  print("Creating " + self.include_custom_kernel_library_tests_filename)
2325  self.include_custom_kernel_library_tests_code.write_line("#include \"" + self.module + "/test/test_main.h\"")
2327 
2328  self.module_test_main_filename = self.workarea_module_test + "/test_main.h"
2329  if not os.path.exists(self.module_test_main_filename):
2330  print("Creating " + self.module_test_main_filename)
2331  self.module_test_main_code = CodeGenerate(self.module_test_main_filename)
2332  self.module_test_main_code.write_line("#if 0")
2333  self.module_test_main_code.write_line("TESTCASE(tivx" + toCamelCase(self.module) + self.kernel.name_camel + ")")
2334  self.module_test_main_code.write_line("#endif")
2335  self.module_test_main_code.close()
2336 
2338  if not os.path.exists(self.include_customer_header_filename):
2339  print("Creating " + self.include_customer_header_filename)
2341  self.include_customer_header_code.write_ifndef_define(self.top_header_name.upper() + "_H_")
2342  self.include_customer_header_code.write_line("#include <TI/tivx.h>")
2343  self.include_customer_header_code.write_line("#include <" + self.company + "/" + self.top_header_name +
2344  "_kernels.h>")
2345  self.include_customer_header_code.write_line("#include <" + self.company + "/" + self.top_header_name +
2346  "_nodes.h>")
2347  self.include_customer_header_code.write_newline()
2348  self.include_customer_header_code.write_endif(self.top_header_name.upper() + "_H_")
2349  self.include_customer_header_code.close()
2350 
2351  self.include_customer_kernels_filename = self.workarea_include_company + "/" + self.top_header_name + "_kernels.h"
2352  if not os.path.exists(self.include_customer_kernels_filename):
2353  print("Creating " + self.include_customer_kernels_filename)
2355  self.include_customer_kernels_code.write_ifndef_define(self.top_header_name.upper() + "_KERNELS_H_")
2356  self.include_customer_kernels_code.write_line("#include <VX/vx.h>")
2357  self.include_customer_kernels_code.write_line("#include <VX/vx_kernels.h>")
2358  self.include_customer_kernels_code.write_newline()
2359  self.include_customer_kernels_code.write_extern_c_top()
2360  self.include_customer_kernels_code.write_line("/*!")
2361  self.include_customer_kernels_code.write_line(" * \\file")
2362  self.include_customer_kernels_code.write_line(" * \\brief The list of supported kernels in this kernel extension.")
2363  self.include_customer_kernels_code.write_line(" */")
2364  self.include_customer_kernels_code.write_newline()
2365  self.include_customer_kernels_code.write_line("/*! \\brief Name for OpenVX Extension kernel module: " + self.module)
2366  self.include_customer_kernels_code.write_line(" * \\ingroup group_tivx_ext")
2367  self.include_customer_kernels_code.write_line(" */")
2368  self.include_customer_kernels_code.write_line("#define TIVX_MODULE_NAME_" + self.module.upper() + " \"" + self.module + "\"")
2369  self.include_customer_kernels_code.write_newline()
2370  self.include_customer_kernels_code.write_line("/*! \\brief The list of kernels supported in " + self.module + " module")
2371  self.include_customer_kernels_code.write_line(" *")
2372  self.include_customer_kernels_code.write_line(" * Each kernel listed here can be used with the <tt>\\ref vxGetKernelByName</tt> call.")
2373  self.include_customer_kernels_code.write_line(" * When programming the parameters, use")
2374  self.include_customer_kernels_code.write_line(" * \\arg <tt>\\ref VX_INPUT</tt> for [in]")
2375  self.include_customer_kernels_code.write_line(" * \\arg <tt>\\ref VX_OUTPUT</tt> for [out]")
2376  self.include_customer_kernels_code.write_line(" * \\arg <tt>\\ref VX_BIDIRECTIONAL</tt> for [in,out]")
2377  self.include_customer_kernels_code.write_line(" *")
2378  self.include_customer_kernels_code.write_line(" * When programming the parameters, use")
2379  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>")
2380  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>")
2381  self.include_customer_kernels_code.write_line(" * \\arg or other appropriate types in \\ref vx_type_e.")
2382  self.include_customer_kernels_code.write_line(" * \\ingroup group_kernel")
2383  self.include_customer_kernels_code.write_line(" */")
2384  self.include_customer_kernels_code.write_newline()
2385  self.include_customer_kernels_code.write_line("/*! \\brief " + self.kernel.name_lower + " kernel name")
2386  self.include_customer_kernels_code.write_line(" * \\see group_vision_function_" + self.module)
2387  self.include_customer_kernels_code.write_line(" */")
2388  self.include_customer_kernels_code.write_line("#define " + self.kernel.enum_str_prefix + self.kernel.name_upper + "_NAME \"%s%s.%s\"" % (self.kernel.name_str_prefix, self.module.lower(), self.kernel.name_lower))
2389  self.include_customer_kernels_code.write_newline()
2390  self.include_customer_kernels_code.write_line("/*! End of group_vision_function_" + self.module + " */")
2391  self.include_customer_kernels_code.write_newline()
2392  self.include_customer_kernels_code.write_line("/*!")
2393  self.include_customer_kernels_code.write_line(" * \\brief Used for the Application to load the " + self.module + " kernels into the context.")
2394  self.include_customer_kernels_code.write_line(" * \\ingroup group_kernel")
2395  self.include_customer_kernels_code.write_line(" */")
2396  self.include_customer_kernels_code.write_line("void tivx" + toCamelCase(self.module) + "LoadKernels(vx_context context);")
2397  self.include_customer_kernels_code.write_newline()
2398  self.include_customer_kernels_code.write_line("/*!")
2399  self.include_customer_kernels_code.write_line(" * \\brief Used for the Application to unload the " + self.module + " kernels from the context.")
2400  self.include_customer_kernels_code.write_line(" * \\ingroup group_kernel")
2401  self.include_customer_kernels_code.write_line(" */")
2402  self.include_customer_kernels_code.write_line("void tivx" + toCamelCase(self.module) + "UnLoadKernels(vx_context context);")
2403  self.include_customer_kernels_code.write_newline()
2404  self.include_customer_kernels_code.write_line("/*!")
2405  self.include_customer_kernels_code.write_line(" * \\brief Used to print the performance of the kernels.")
2406  self.include_customer_kernels_code.write_line(" * \\ingroup group_kernel")
2407  self.include_customer_kernels_code.write_line(" */")
2408  self.include_customer_kernels_code.write_line("void tivx" + toCamelCase(self.module) + "PrintPerformance(vx_perf_t performance, uint32_t numPixels, const char* testName);")
2409  self.include_customer_kernels_code.write_newline()
2410  self.include_customer_kernels_code.write_extern_c_bottom()
2411  self.include_customer_kernels_code.write_endif(self.top_header_name.upper() + "_KERNELS_H_")
2412  self.include_customer_kernels_code.close()
2413 
2414  self.include_customer_nodes_filename = self.workarea_include_company + "/" + self.top_header_name + "_nodes.h"
2415  if not os.path.exists(self.include_customer_nodes_filename):
2416  print("Creating " + self.include_customer_nodes_filename)
2418  self.include_customer_nodes_code.write_ifndef_define(self.top_header_name.upper() + "_NODES_H_")
2419  self.include_customer_nodes_code.write_line("#include <VX/vx.h>")
2420  self.include_customer_nodes_code.write_newline()
2421  self.include_customer_nodes_code.write_extern_c_top()
2422  self.include_customer_nodes_code.write_line("/*! \\brief [Graph] Creates a " + self.kernel.name_upper + " Node.")
2423  self.include_customer_nodes_code.write_line(" * \\param [in] graph The reference to the graph.")
2424  for prm in self.kernel.params :
2425  if(prm.state == ParamState.OPTIONAL) :
2426  self.paramstate = " (optional)"
2427  else :
2428  self.paramstate = ""
2429  self.include_customer_nodes_code.write_line(" * \param [" + prm.direction.get_doxygen_name() + "] " + prm.name_lower + self.paramstate)
2430  self.include_customer_nodes_code.write_line(" * \\see <tt>" + self.kernel.enum_str_prefix + self.kernel.name_upper + "_NAME</tt>")
2431  self.include_customer_nodes_code.write_line(" * \\ingroup group_vision_function_" + self.kernel.name_lower)
2432  self.include_customer_nodes_code.write_line(" * \\return <tt>\\ref vx_node</tt>.")
2433  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>")
2434  self.include_customer_nodes_code.write_line(" */")
2435  self.include_customer_nodes_code.write_line("VX_API_ENTRY vx_node VX_API_CALL tivx" + self.kernel.name_camel + "Node(vx_graph graph,")
2436  for prm in self.kernel.params[:-1] :
2437  if Type.is_scalar_type(prm.type) :
2438  self.include_customer_nodes_code.write_line("%-37s %-20s %s," % ("", "vx_scalar", prm.name_lower))
2439  else :
2440  self.include_customer_nodes_code.write_line("%-37s %-20s %s," % ("", prm.type.get_vx_name(), prm.name_lower))
2441  self.include_customer_nodes_code.write_line("%-37s %-20s %s);" % ("", self.kernel.params[-1].type.get_vx_name(), self.kernel.params[-1].name_lower))
2442  self.include_customer_nodes_code.write_newline()
2443  self.include_customer_nodes_code.write_extern_c_bottom()
2444  self.include_customer_nodes_code.write_endif(self.top_header_name.upper() + "_NODES_H_")
2445  self.include_customer_nodes_code.close()
2446 
2447  self.module_include_kernels_filename = self.workarea_module_include + "/tivx_" + self.module + "_kernels" + self.kernels_header_extension + ".h"
2448  if not os.path.exists(self.module_include_kernels_filename):
2449  print("Creating " + self.module_include_kernels_filename)
2451  self.module_include_kernels_code.write_ifndef_define("VX_" + self.module.upper() + "_KERNELS" + self.kernels_header_extension.upper() + "_H_")
2452  self.module_include_kernels_code.write_line("#include \"tivx_kernels_host_utils.h\"")
2453  self.module_include_kernels_code.write_newline()
2454  self.module_include_kernels_code.write_extern_c_top()
2455  self.module_include_kernels_code.write_line("/*!")
2456  self.module_include_kernels_code.write_line(" * \\file")
2457  self.module_include_kernels_code.write_line(" * \\brief Interface file for the " + self.module.upper() + " kernels")
2458  self.module_include_kernels_code.write_line(" */")
2459  self.module_include_kernels_code.write_newline()
2460  self.module_include_kernels_code.write_newline()
2461  self.module_include_kernels_code.write_line("/*!")
2462  self.module_include_kernels_code.write_line(" * \\brief Function to register " + self.module.upper() + " Kernels on the Host")
2463  self.module_include_kernels_code.write_line(" * \\ingroup group_tivx_ext")
2464  self.module_include_kernels_code.write_line(" */")
2465  self.module_include_kernels_code.write_line("void tivxRegister" + toCamelCase(self.module) + "Kernels(void);")
2466  self.module_include_kernels_code.write_newline()
2467  self.module_include_kernels_code.write_line("/*!")
2468  self.module_include_kernels_code.write_line(" * \\brief Function to un-register " + self.module.upper() + " Kernels on the Host")
2469  self.module_include_kernels_code.write_line(" * \\ingroup group_tivx_ext")
2470  self.module_include_kernels_code.write_line(" */")
2471  self.module_include_kernels_code.write_line("void tivxUnRegister" + toCamelCase(self.module) + "Kernels(void);")
2472  self.module_include_kernels_code.write_newline()
2473  self.module_include_kernels_code.write_line("/*!")
2474  self.module_include_kernels_code.write_line(" * \\brief Function to register " + self.module.upper() + " Kernels on the " + self.core + " Target")
2475  self.module_include_kernels_code.write_line(" * \\ingroup group_tivx_ext")
2476  self.module_include_kernels_code.write_line(" */")
2477  self.module_include_kernels_code.write_line("void tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void);")
2478  self.module_include_kernels_code.write_newline()
2479  self.module_include_kernels_code.write_line("/*!")
2480  self.module_include_kernels_code.write_line(" * \\brief Function to un-register " + self.module.upper() + " Kernels on the " + self.core + " Target")
2481  self.module_include_kernels_code.write_line(" * \\ingroup group_tivx_ext")
2482  self.module_include_kernels_code.write_line(" */")
2483  self.module_include_kernels_code.write_line("void tivxUnRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void);")
2484  self.module_include_kernels_code.write_newline()
2485  self.module_include_kernels_code.write_newline()
2486  self.module_include_kernels_code.write_extern_c_bottom()
2487  self.module_include_kernels_code.write_endif("VX_" + self.module.upper() + "_KERNELS" + self.kernels_header_extension.upper() + "_H_")
2488  self.module_include_kernels_code.close()
2489 
2490  def generate_sources(self) :
2491  self.host_node_api_filename = self.workarea_module_host + "/tivx_" + self.module + "_node_api.c"
2492  if not os.path.exists(self.host_node_api_filename):
2493  print("Creating " + self.host_node_api_filename)
2494  self.host_node_api_code = CodeGenerate(self.host_node_api_filename)
2495  self.host_node_api_code.write_line("#include <TI/tivx.h>")
2496  self.host_node_api_code.write_line("#include <" + self.company + "/" + self.top_header_name + ".h>")
2497  self.host_node_api_code.write_newline()
2498  self.host_node_api_code.write_line("VX_API_ENTRY vx_node VX_API_CALL tivx" + self.kernel.name_camel + "Node(vx_graph graph,")
2499  for prm in self.kernel.params[:-1] :
2500  if Type.is_scalar_type(prm.type) :
2501  self.host_node_api_code.write_line("%-37s %-20s %s," % ("", "vx_scalar", prm.name_lower))
2502  else :
2503  self.host_node_api_code.write_line("%-37s %-20s %s," % ("", prm.type.get_vx_name(), prm.name_lower))
2504  self.host_node_api_code.write_line("%-37s %-20s %s)" % ("", self.kernel.params[-1].type.get_vx_name(), self.kernel.params[-1].name_lower))
2505  self.host_node_api_code.write_open_brace()
2506  self.host_node_api_code.write_line("vx_reference prms[] = {")
2507  for prm in self.kernel.params[:-1] :
2508  self.host_node_api_code.write_line("%-7s (vx_reference)%s," % ("", prm.name_lower))
2509  self.host_node_api_code.write_line("%-7s (vx_reference)%s" % ("", self.kernel.params[-1].name_lower))
2510  self.host_node_api_code.write_line("};")
2511  self.host_node_api_code.write_line("vx_node node = tivxCreateNodeByKernelName(graph,")
2512  self.host_node_api_code.write_line("%-38s %s_NAME," % ("", self.kernel.enum_str_prefix + self.kernel.name_upper))
2513  self.host_node_api_code.write_line("%-38s prms," % (""))
2514  self.host_node_api_code.write_line("%-38s dimof(prms));" % (""))
2515  self.host_node_api_code.write_line("return node;")
2516  self.host_node_api_code.write_close_brace()
2517  self.host_node_api_code.close()
2518 
2519  self.host_kernels_filename = self.workarea_module_host + "/vx_kernels_" + self.module.lower() + "_host.c"
2520  if not os.path.exists(self.host_kernels_filename):
2521  print("Creating " + self.host_kernels_filename)
2522  self.host_kernels_code = CodeGenerate(self.host_kernels_filename)
2523  self.host_kernels_code.write_line("#include <TI/tivx.h>")
2524  self.host_kernels_code.write_line("#include <" + self.company + "/" + self.top_header_name + ".h>")
2525  self.host_kernels_code.write_line("#include \"tivx_" + self.module.lower() + "_kernels" + self.kernels_header_extension + ".h\"")
2526  self.host_kernels_code.write_line("#include \"tivx_kernels_host_utils.h\"")
2527  self.host_kernels_code.write_newline()
2528  self.host_kernels_code.write_line("static vx_status VX_CALLBACK publishKernels(vx_context context);")
2529  self.host_kernels_code.write_line("static vx_status VX_CALLBACK unPublishKernels(vx_context context);")
2530  self.host_kernels_code.write_newline()
2531  self.host_kernels_code.write_line("static uint32_t gIs" + toCamelCase(self.module) + "KernelsLoad = 0u;")
2532  self.host_kernels_code.write_newline()
2533  self.host_kernels_code.write_line("vx_status tivxAddKernel" + self.kernel.name_camel + "(vx_context context);")
2534  self.host_kernels_code.write_newline()
2535  self.host_kernels_code.write_line("vx_status tivxRemoveKernel" + self.kernel.name_camel + "(vx_context context);")
2536  self.host_kernels_code.write_newline()
2537  self.host_kernels_code.write_line("static Tivx_Host_Kernel_List gTivx_host_kernel_list[] = {")
2538  self.host_kernels_code.write_line(" {&tivxAddKernel" + self.kernel.name_camel + ", &tivxRemoveKernel" + self.kernel.name_camel + "},")
2539  self.host_kernels_code.write_line("};")
2540  self.host_kernels_code.write_newline()
2541  self.host_kernels_code.write_line("static vx_status VX_CALLBACK publishKernels(vx_context context)")
2542  self.host_kernels_code.write_open_brace()
2543  self.host_kernels_code.write_line("return tivxPublishKernels(context, gTivx_host_kernel_list, dimof(gTivx_host_kernel_list));")
2544  self.host_kernels_code.write_close_brace()
2545  self.host_kernels_code.write_newline()
2546  self.host_kernels_code.write_line("static vx_status VX_CALLBACK unPublishKernels(vx_context context)")
2547  self.host_kernels_code.write_open_brace()
2548  self.host_kernels_code.write_line("return tivxUnPublishKernels(context, gTivx_host_kernel_list, dimof(gTivx_host_kernel_list));")
2549  self.host_kernels_code.write_close_brace()
2550  self.host_kernels_code.write_newline()
2551  self.host_kernels_code.write_line("void tivxRegister" + toCamelCase(self.module) + "Kernels(void)")
2552  self.host_kernels_code.write_open_brace()
2553  self.host_kernels_code.write_line("tivxRegisterModule(TIVX_MODULE_NAME_" + self.module.upper() + ", publishKernels, unPublishKernels);")
2554  self.host_kernels_code.write_close_brace()
2555  self.host_kernels_code.write_newline()
2556  self.host_kernels_code.write_line("void tivxUnRegister" + toCamelCase(self.module) + "Kernels(void)")
2557  self.host_kernels_code.write_open_brace()
2558  self.host_kernels_code.write_line("tivxUnRegisterModule(TIVX_MODULE_NAME_" + self.module.upper() + ");")
2559  self.host_kernels_code.write_close_brace()
2560  self.host_kernels_code.write_newline()
2561  self.host_kernels_code.write_line("void tivx" + toCamelCase(self.module) + "LoadKernels(vx_context context)")
2562  self.host_kernels_code.write_open_brace()
2563  self.host_kernels_code.write_line("if ((0 == gIs" + toCamelCase(self.module) + "KernelsLoad) && (NULL != context))")
2564  self.host_kernels_code.write_open_brace()
2565  self.host_kernels_code.write_line("tivxRegister" + toCamelCase(self.module) + "Kernels();")
2566  self.host_kernels_code.write_line("vxLoadKernels(context, TIVX_MODULE_NAME_" + self.module.upper() + ");")
2567  self.host_kernels_code.write_newline()
2568  self.host_kernels_code.write_line("/* These three lines only work on PC emulation mode ...")
2569  self.host_kernels_code.write_line(" * this will need to be updated when moving to target */")
2570  self.host_kernels_code.write_line("#ifdef x86_64")
2571  self.host_kernels_code.write_line("void tivxSetSelfCpuId(vx_enum cpu_id);")
2572  self.host_kernels_code.write_newline()
2573  for target in self.kernel.targets :
2574  self.host_kernels_code.write_line("tivxSetSelfCpuId(%s);" % Cpu.get_vx_enum_name(Target.get_cpu(target)))
2575  self.host_kernels_code.write_line("tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels();")
2576  self.host_kernels_code.write_line("#endif")
2577  self.host_kernels_code.write_newline()
2578  self.host_kernels_code.write_close_brace()
2579  self.host_kernels_code.write_line("gIs" + toCamelCase(self.module) + "KernelsLoad++;")
2580  self.host_kernels_code.write_close_brace()
2581  self.host_kernels_code.write_newline()
2582  self.host_kernels_code.write_line("void tivx" + toCamelCase(self.module) + "UnLoadKernels(vx_context context)")
2583  self.host_kernels_code.write_open_brace()
2584  self.host_kernels_code.write_line("if (gIs" + toCamelCase(self.module) + "KernelsLoad > 0)")
2585  self.host_kernels_code.write_open_brace()
2586  self.host_kernels_code.write_line("gIs" + toCamelCase(self.module) + "KernelsLoad--;")
2587  self.host_kernels_code.write_line("if ((0u == gIs" + toCamelCase(self.module) + "KernelsLoad) && (NULL != context))")
2588  self.host_kernels_code.write_open_brace()
2589  self.host_kernels_code.write_line("vxUnloadKernels(context, TIVX_MODULE_NAME_" + self.module.upper() + ");")
2590  self.host_kernels_code.write_line("tivxUnRegister" + toCamelCase(self.module) + "Kernels();")
2591  self.host_kernels_code.write_newline()
2592  self.host_kernels_code.write_line("/* This line only work on PC emulation mode ...")
2593  self.host_kernels_code.write_line(" * this will need to be updated when moving to target */")
2594  self.host_kernels_code.write_line("#ifdef x86_64")
2595  self.host_kernels_code.write_line("tivxUnRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels();")
2596  self.host_kernels_code.write_line("#endif")
2597  self.host_kernels_code.write_newline()
2598  self.host_kernels_code.write_close_brace()
2599  self.host_kernels_code.write_close_brace()
2600  self.host_kernels_code.write_close_brace()
2601  self.host_kernels_code.close()
2602 
2603  self.target_kernels_filename = self.workarea_module_core + "/vx_kernels_" + self.module.lower() + "_target.c"
2604  if not os.path.exists(self.target_kernels_filename):
2605  self.target_kernels_created = True
2606  print("Creating " + self.target_kernels_filename)
2607  self.target_kernels_code = CodeGenerate(self.target_kernels_filename)
2608  self.target_kernels_code.write_line("#include <TI/tivx.h>")
2609  self.target_kernels_code.write_line("#include <TI/tivx_target_kernel.h>")
2610  self.target_kernels_code.write_line("#include \"tivx_" + self.module.lower() + "_kernels" + self.kernels_header_extension + ".h\"")
2611  self.target_kernels_code.write_line("#include \"tivx_kernels_target_utils.h\"")
2612  self.target_kernels_code.write_newline()
2613  self.target_kernels_code.write_line("#ifdef BUILD_BAM")
2614  self.target_kernels_code.write_newline()
2615  if self.target_uses_dsp :
2616  self.target_kernels_code.write_line("void tivxAddTargetKernelBam" + self.kernel.name_camel + "(void);")
2617  else :
2618  self.target_kernels_code.write_line("void tivxAddTargetKernel" + self.kernel.name_camel + "(void);")
2619  self.target_kernels_code.write_newline()
2620  self.target_kernels_code.write_line("#else")
2621  self.target_kernels_code.write_newline()
2622  self.target_kernels_code.write_line("void tivxAddTargetKernel" + self.kernel.name_camel + "(void);")
2623  self.target_kernels_code.write_newline()
2624  self.target_kernels_code.write_line("#endif")
2625  self.target_kernels_code.write_newline()
2626  self.target_kernels_code.write_line("#ifdef BUILD_BAM")
2627  self.target_kernels_code.write_newline()
2628  if self.target_uses_dsp :
2629  self.target_kernels_code.write_line("void tivxRemoveTargetKernelBam" + self.kernel.name_camel + "(void);")
2630  else :
2631  self.target_kernels_code.write_line("void tivxRemoveTargetKernel" + self.kernel.name_camel + "(void);")
2632  self.target_kernels_code.write_newline()
2633  self.target_kernels_code.write_line("#else")
2634  self.target_kernels_code.write_newline()
2635  self.target_kernels_code.write_line("void tivxRemoveTargetKernel" + self.kernel.name_camel + "(void);")
2636  self.target_kernels_code.write_newline()
2637  self.target_kernels_code.write_line("#endif")
2638  self.target_kernels_code.write_newline()
2639  self.target_kernels_code.write_line("static Tivx_Target_Kernel_List gTivx_target_kernel_list[] = {")
2640  self.target_kernels_code.write_line("#ifdef BUILD_BAM")
2641  self.target_kernels_code.write_newline()
2642  if self.target_uses_dsp :
2643  self.target_kernels_code.write_line(" {&tivxAddTargetKernelBam" + self.kernel.name_camel + ", &tivxRemoveTargetKernelBam" + self.kernel.name_camel + "},")
2644  else :
2645  self.target_kernels_code.write_line(" {&tivxAddTargetKernel" + self.kernel.name_camel + ", &tivxRemoveTargetKernel" + self.kernel.name_camel + "},")
2646  self.target_kernels_code.write_newline()
2647  self.target_kernels_code.write_line("#else")
2648  self.target_kernels_code.write_newline()
2649  self.target_kernels_code.write_line(" {&tivxAddTargetKernel" + self.kernel.name_camel + ", &tivxRemoveTargetKernel" + self.kernel.name_camel + "},")
2650  self.target_kernels_code.write_newline()
2651  self.target_kernels_code.write_line("#endif")
2652  self.target_kernels_code.write_line("};")
2653  self.target_kernels_code.write_newline()
2654  self.target_kernels_code.write_line("void tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void)")
2655  self.target_kernels_code.write_open_brace()
2656  self.target_kernels_code.write_line("tivxRegisterTargetKernels(gTivx_target_kernel_list, dimof(gTivx_target_kernel_list));")
2657  self.target_kernels_code.write_close_brace()
2658  self.target_kernels_code.write_newline()
2659  self.target_kernels_code.write_line("void tivxUnRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void)")
2660  self.target_kernels_code.write_open_brace()
2661  self.target_kernels_code.write_line("tivxUnRegisterTargetKernels(gTivx_target_kernel_list, dimof(gTivx_target_kernel_list));")
2662  self.target_kernels_code.write_close_brace()
2663  self.target_kernels_code.close()
2664  else :
2665  self.target_kernels_created = False
2666 
2667  def modify_files(self) :
2668  self.modify_make_file()
2675  self.modify_test_header()
2676 
2677  def modify_test_header(self) :
2678  print("Modifying " + self.module_test_main_filename)
2679  CodeModify().block_insert(self.module_test_main_filename,
2680  "#if ",
2681  "#endif",
2682  "TESTCASE(tivx" + toCamelCase(self.module) + self.kernel.name_camel + ")",
2683  "#endif",
2684  "#endif",
2685  "TESTCASE(tivx" + toCamelCase(self.module) + self.kernel.name_camel + ")\n")
2686 
2687  def modify_make_file(self) :
2688  if self.env_var == 'CUSTOM_KERNEL_PATH' :
2689  print("Modifying " + self.concerto_inc_filename)
2690  CodeModify().block_insert(self.concerto_inc_filename,
2691  "vx_kernels_" + self.module,
2692  "STATIC_LIBS += vx_conformance_engine",
2693  "STATIC_LIBS += vx_target_kernels_" + self.core + "\n",
2694  "STATIC_LIBS += vx_conformance_engine",
2695  "STATIC_LIBS += vx_conformance_engine",
2696  "STATIC_LIBS += vx_target_kernels_" + self.core + "\n")
2697  if self.target_uses_dsp :
2698  CodeModify().block_insert(self.concerto_inc_filename,
2699  "vx_kernels_" + self.module,
2700  "STATIC_LIBS += vx_conformance_engine",
2701  "STATIC_LIBS += vx_target_kernels_" + self.core + "_bam\n",
2702  "STATIC_LIBS += vx_conformance_engine",
2703  "STATIC_LIBS += vx_conformance_engine",
2704  "STATIC_LIBS += vx_target_kernels_" + self.core + "_bam\n")
2705  elif self.env_var == 'CUSTOM_APPLICATION_PATH' :
2706  print("Modifying " + self.concerto_inc_filename)
2707  CodeModify().block_insert(self.concerto_inc_filename,
2708  "vx_kernels_" + self.module,
2709  "STATIC_LIBS += vx_conformance_engine",
2710  "STATIC_LIBS += vx_target_kernels_" + self.module + "_" + self.core + "\n",
2711  "STATIC_LIBS += vx_conformance_engine",
2712  "STATIC_LIBS += vx_conformance_engine",
2713  "STATIC_LIBS += vx_target_kernels_" + self.module + "_" + self.core + "\n")
2714  if self.target_uses_dsp :
2715  CodeModify().block_insert(self.concerto_inc_filename,
2716  "vx_kernels_" + self.module,
2717  "STATIC_LIBS += vx_conformance_engine",
2718  "STATIC_LIBS += vx_target_kernels_" + self.module + "_" + self.core + "_bam\n",
2719  "STATIC_LIBS += vx_conformance_engine",
2720  "STATIC_LIBS += vx_conformance_engine",
2721  "STATIC_LIBS += vx_target_kernels_" + self.module + "_" + self.core + "_bam\n")
2722 
2723 
2724  def modify_kernel_header_file(self) :
2725  print("Modifying " + self.include_customer_kernels_filename)
2726  # Update for new modules
2727  self.insert = (r"! \\brief Name for OpenVX Extension kernel module: " + self.module + "\n" +
2728  " * \\ingroup group_tivx_ext\n" +
2729  " */\n" +
2730  "#define TIVX_MODULE_NAME_" + self.module.upper() + " \"" + self.module + "\"\n\n")
2731  CodeModify().block_insert(self.include_customer_kernels_filename,
2732  "extern \"C\" {",
2733  "vxGetKernelByName",
2734  "#define TIVX_MODULE_NAME_" + self.module.upper() + " \"" + self.module + "\"",
2735  r"/*! \\brief The list of kernels supported",
2736  r"/*! \\brief The list of kernels supported",
2737  self.insert)
2738 
2739  self.insert = (
2740  r" \\brief The list of kernels supported in " + self.module + " module" + "\n" +
2741  " *" + "\n" +
2742  r" * Each kernel listed here can be used with the <tt>\\ref vxGetKernelByEnum</tt> call." + "\n" +
2743  " * When programming the parameters, use" + "\n" +
2744  r" * \\arg <tt>\\ref VX_INPUT</tt> for [in]" + "\n" +
2745  r" * \\arg <tt>\\ref VX_OUTPUT</tt> for [out]" + "\n" +
2746  r" * \\arg <tt>\\ref VX_BIDIRECTIONAL</tt> for [in,out]" + "\n" +
2747  " *" + "\n" +
2748  " * When programming the parameters, use" + "\n" +
2749  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" +
2750  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" +
2751  r" * \\arg or other appropriate types in \\ref vx_type_e." + "\n" +
2752  " * \\ingroup group_kernel" + "\n" +
2753  " */" + "\n" +
2754  r"/*! \\brief " + self.kernel.name_lower + " kernel name" + "\n" +
2755  " * \\see group_vision_function_" + self.module + "\n" +
2756  "*/" + "\n" +
2757  "#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" +
2758  "/*! End of group_vision_function_" + self.module + " */\n\n"
2759  "/*! \n")
2760  CodeModify().block_insert(self.include_customer_kernels_filename,
2761  "The list of kernels supported in",
2762  " Used for the Application to load the",
2763  "The list of kernels supported in " + self.module + " module",
2764  r" * \\brief Used for the Application to load the",
2765  r" * \\brief Used for the Application to load the",
2766  self.insert)
2767 
2768  self.insert = (
2769  "/*!" + "\n" +
2770  r" * \\brief Used for the Application to load the " + self.module + " kernels into the context." + "\n" +
2771  " * \\ingroup group_kernel" + "\n" +
2772  " */" + "\n" +
2773  "void tivx" + toCamelCase(self.module) + "LoadKernels(vx_context context);" + "\n" + "\n" +
2774  "/*!" + "\n" +
2775  r" * \\brief Used for the Application to unload the " + self.module + " kernels from the context." + "\n" +
2776  " * \\ingroup group_kernel" + "\n" +
2777  " */" + "\n" +
2778  "void tivx" + toCamelCase(self.module) + "UnLoadKernels(vx_context context);" + "\n" + "\n" +
2779  "/*!" + "\n" +
2780  r" * \\brief Used to print the performance of the kernels." + "\n" +
2781  " * \\ingroup group_kernel" + "\n" +
2782  " */" + "\n" +
2783  "void tivx" + toCamelCase(self.module) + "PrintPerformance(vx_perf_t performance, uint32_t numPixels, const char* testName);" + "\n" + "\n"
2784  )
2785  CodeModify().block_insert(self.include_customer_kernels_filename,
2786  "LoadKernels",
2787  "#ifdef __cplusplus",
2788  "void tivx" + toCamelCase(self.module) + "LoadKernels",
2789  "#ifdef __cplusplus",
2790  "#ifdef __cplusplus",
2791  self.insert)
2792 
2793  # Update for new kernels
2794  self.insert = (r"/*! \\brief " + self.kernel.name_lower + " kernel name\n" +
2795  " * \\see group_vision_function_" + self.module + "\n" +
2796  " */\n" +
2797  "#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")
2798  CodeModify().block_insert(self.include_customer_kernels_filename,
2799  "The list of kernels supported in " + self.module + " module",
2800  " End of group_vision_function_" + self.module,
2801  " " +self.kernel.enum_str_prefix + self.kernel.name_upper + "_NAME",
2802  r"\/\*\! End of group_vision_function_" + self.module + " \*\/",
2803  r"/*! End of group_vision_function_" + self.module + " */",
2804  self.insert)
2805 
2806  def modify_node_header_file(self) :
2807  print("Modifying " + self.include_customer_nodes_filename)
2808  self.insert = (r"/*! \\brief [Graph] Creates a " + self.kernel.name_upper + " Node.\n")
2809  self.insert += (r" * \\param [in] graph The reference to the graph.\n")
2810  for prm in self.kernel.params :
2811  if(prm.state == ParamState.OPTIONAL) :
2812  self.paramstate = " (optional)"
2813  else :
2814  self.paramstate = ""
2815  self.insert += (" * \param [" + prm.direction.get_doxygen_name() + "] " + prm.name_lower + self.paramstate + "\n")
2816  self.insert += (r" * \\see <tt>" + self.kernel.enum_str_prefix + self.kernel.name_upper + "_NAME</tt>" + "\n")
2817  self.insert += (r" * \\ingroup group_vision_function_" + self.kernel.name_lower + "\n")
2818  self.insert += (r" * \\return <tt>\\ref vx_node</tt>.\n")
2819  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")
2820  self.insert += (r" */\n")
2821  self.insert += ("VX_API_ENTRY vx_node VX_API_CALL tivx" + self.kernel.name_camel + "Node(vx_graph graph,\n")
2822  for prm in self.kernel.params[:-1] :
2823  if Type.is_scalar_type(prm.type) :
2824  self.insert += ("%-37s %-20s %s,\n" % ("", "vx_scalar", prm.name_lower))
2825  else :
2826  self.insert += ("%-37s %-20s %s,\n" % ("", prm.type.get_vx_name(), prm.name_lower))
2827  if Type.is_scalar_type(self.kernel.params[-1].type) :
2828  self.insert += ("%-37s %-20s %s);\n" % ("", "vx_scalar", self.kernel.params[-1].name_lower))
2829  else :
2830  self.insert += ("%-37s %-20s %s);\n" % ("", self.kernel.params[-1].type.get_vx_name(), self.kernel.params[-1].name_lower))
2831  self.insert += ("\n")
2832 
2833  CodeModify().block_insert(self.include_customer_nodes_filename,
2834  "VX_API_ENTRY",
2835  "#ifdef __cplusplus",
2836  " tivx" + self.kernel.name_camel + "Node(vx_graph graph,",
2837  "#ifdef __cplusplus",
2838  "#ifdef __cplusplus",
2839  self.insert)
2840 
2841  def modify_node_api_source_file(self) :
2842  print("Modifying " + self.host_node_api_filename)
2843  if not CodeModify().file_search(self.host_node_api_filename, " tivx" + self.kernel.name_camel + "Node(vx_graph graph,") :
2844  self.insert = ("VX_API_ENTRY vx_node VX_API_CALL tivx" + self.kernel.name_camel + "Node(vx_graph graph,\n")
2845  for prm in self.kernel.params[:-1] :
2846  if Type.is_scalar_type(prm.type) :
2847  self.insert += ("%-37s %-20s %s,\n" % ("", "vx_scalar", prm.name_lower))
2848  else :
2849  self.insert += ("%-37s %-20s %s,\n" % ("", prm.type.get_vx_name(), prm.name_lower))
2850  if Type.is_scalar_type(self.kernel.params[-1].type) :
2851  self.insert += ("%-37s %-20s %s)\n" % ("", "vx_scalar", self.kernel.params[-1].name_lower))
2852  else :
2853  self.insert += ("%-37s %-20s %s)\n" % ("", self.kernel.params[-1].type.get_vx_name(), self.kernel.params[-1].name_lower))
2854  self.insert += ("{\n")
2855  self.insert += (" vx_reference prms[] = {\n")
2856  for prm in self.kernel.params[:-1] :
2857  self.insert += ("%-11s (vx_reference)%s,\n" % ("", prm.name_lower))
2858  self.insert += ("%-11s (vx_reference)%s\n" % ("", self.kernel.params[-1].name_lower))
2859  self.insert += (" };\n")
2860  self.insert += (" vx_node node = tivxCreateNodeByKernelName(graph,\n")
2861  self.insert += ("%-42s %s_NAME,\n" % ("", self.kernel.enum_str_prefix + self.kernel.name_upper))
2862  self.insert += ("%-42s prms,\n" % (""))
2863  self.insert += ("%-42s dimof(prms));\n" % (""))
2864  self.insert += (" return node;\n}\n\n")
2865 
2866  CodeModify().file_append(self.host_node_api_filename, self.insert)
2867 
2868  def modify_module_host_header_file(self) :
2869  print("Modifying " + self.module_include_kernels_filename)
2870 
2871  self.insert = (r"/*!\n")
2872  self.insert += (r" * \\brief Function to register " + self.module.upper() + " Kernels on the " + self.core + " Target\n")
2873  self.insert += (r" * \\ingroup group_tivx_ext\n")
2874  self.insert += (r" */\n")
2875  self.insert += (r"void tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void);\n\n")
2876  self.insert += (r"/*!\n")
2877  self.insert += (r" * \\brief Function to un-register " + self.module.upper() + " Kernels on the " + self.core + " Target\n")
2878  self.insert += (r" * \\ingroup group_tivx_ext\n")
2879  self.insert += (r" */\n")
2880  self.insert += (r"void tivxUnRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void);\n\n")
2881  CodeModify().block_insert(self.module_include_kernels_filename,
2882  "Interface file for the " + self.module.upper() + " kernels",
2883  "#ifdef __cplusplus",
2884  "void tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels(void);",
2885  "\n#ifdef __cplusplus",
2886  "\n#ifdef __cplusplus",
2887  self.insert)
2888 
2889  def modify_module_host_source_file(self) :
2890  print("Modifying " + self.host_kernels_filename)
2891  CodeModify().block_insert(self.host_kernels_filename,
2892  "vx_status tivxAddKernel",
2893  "vx_status tivxRemoveKernel",
2894  "vx_status tivxAddKernel" + self.kernel.name_camel + "(vx_context context);",
2895  "\nvx_status tivxRemoveKernel",
2896  "\nvx_status tivxRemoveKernel",
2897  "vx_status tivxAddKernel" + self.kernel.name_camel + "(vx_context context);\n")
2898 
2899  CodeModify().block_insert(self.host_kernels_filename,
2900  "vx_status tivxRemoveKernel",
2901  "Tivx_Host_Kernel_List",
2902  "vx_status tivxRemoveKernel" + self.kernel.name_camel + "(vx_context context);",
2903  "\nstatic Tivx_Host_Kernel_List",
2904  "\nstatic Tivx_Host_Kernel_List",
2905  "vx_status tivxRemoveKernel" + self.kernel.name_camel + "(vx_context context);\n")
2906 
2907  CodeModify().block_insert(self.host_kernels_filename,
2908  "Tivx_Host_Kernel_List",
2909  "};",
2910  " {&tivxAddKernel" + self.kernel.name_camel + ", &tivxRemoveKernel" + self.kernel.name_camel + "}",
2911  "};",
2912  "};",
2913  " {&tivxAddKernel" + self.kernel.name_camel + ", &tivxRemoveKernel" + self.kernel.name_camel + "},\n")
2914 
2915  CodeModify().block_insert(self.host_kernels_filename,
2916  "tivx" + toCamelCase(self.module) + "LoadKernels",
2917  "}",
2918  " tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels();",
2919  " tivxSetSelfCpuId\(TIVX_CPU_ID_DSP1\);",
2920  " tivxSetSelfCpuId(TIVX_CPU_ID_DSP1);",
2921  " tivxRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels();\n")
2922 
2923  CodeModify().block_insert(self.host_kernels_filename,
2924  "tivx" + toCamelCase(self.module) + "UnLoadKernels",
2925  "}",
2926  " tivxUnRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels();",
2927  "\n gIs" + toCamelCase(self.module) + "KernelsLoad",
2928  "\n gIs" + toCamelCase(self.module) + "KernelsLoad",
2929  " tivxUnRegister" + toCamelCase(self.module) + "Target" + toCamelCase(self.core) + "Kernels();\n")
2930 
2931  def modify_module_target_source_file(self) :
2932  print("Modifying " + self.target_kernels_filename)
2933 
2934  if self.target_uses_dsp :
2935  CodeModify().block_insert(self.target_kernels_filename,
2936  "void tivxAddTargetKernel",
2937  "#ifdef BUILD_BAM",
2938  "void tivxAddTargetKernelBam" + self.kernel.name_camel + "(void);",
2939  "\n#else\n\n",
2940  "\n#else\n\n",
2941  "void tivxAddTargetKernelBam" + self.kernel.name_camel + "(void);\n")
2942  else :
2943  CodeModify().block_insert(self.target_kernels_filename,
2944  "void tivxAddTargetKernel",
2945  "#ifdef BUILD_BAM",
2946  "void tivxAddTargetKernel" + self.kernel.name_camel + "(void);",
2947  "\n#else\n\n",
2948  "\n#else\n\n",
2949  "void tivxAddTargetKernel" + self.kernel.name_camel + "(void);\n")
2950 
2951  CodeModify().block_insert(self.target_kernels_filename,
2952  "void tivxAddTargetKernel",
2953  "#ifdef BUILD_BAM",
2954  "void tivxAddTargetKernel" + self.kernel.name_camel + "(void);",
2955  "\n#endif",
2956  "\n#endif",
2957  "void tivxAddTargetKernel" + self.kernel.name_camel + "(void);\n", overrideFind=(not self.target_kernels_created))
2958 
2959  if self.target_uses_dsp :
2960  CodeModify().block_insert(self.target_kernels_filename,
2961  "void tivxRemoveTargetKernel",
2962  "static Tivx_Target_Kernel_List",
2963  "void tivxRemoveTargetKernelBam" + self.kernel.name_camel + "(void);",
2964  "\n#else\n\n",
2965  "\n#else\n\n",
2966  "void tivxRemoveTargetKernelBam" + self.kernel.name_camel + "(void);\n")
2967  else :
2968  CodeModify().block_insert(self.target_kernels_filename,
2969  "void tivxRemoveTargetKernel",
2970  "static Tivx_Target_Kernel_List",
2971  "void tivxRemoveTargetKernel" + self.kernel.name_camel + "(void);",
2972  "\n#else\n\n",
2973  "\n#else\n\n",
2974  "void tivxRemoveTargetKernel" + self.kernel.name_camel + "(void);\n")
2975 
2976  CodeModify().block_insert(self.target_kernels_filename,
2977  "void tivxRemoveTargetKernel",
2978  "#endif",
2979  "void tivxRemoveTargetKernel" + self.kernel.name_camel + "(void);",
2980  "\n#endif",
2981  "\n#endif",
2982  "void tivxRemoveTargetKernel" + self.kernel.name_camel + "(void);\n", overrideFind=(not self.target_kernels_created))
2983 
2984  if self.target_uses_dsp :
2985  CodeModify().block_insert(self.target_kernels_filename,
2986  "Tivx_Target_Kernel_List",
2987  "#else",
2988  " {&tivxAddTargetKernelBam" + self.kernel.name_camel + ", &tivxRemoveTargetKernelBam" + self.kernel.name_camel + "},",
2989  "\n#else",
2990  "\n#else",
2991  " {&tivxAddTargetKernelBam" + self.kernel.name_camel + ", &tivxRemoveTargetKernelBam" + self.kernel.name_camel + "},\n")
2992  else :
2993  CodeModify().block_insert(self.target_kernels_filename,
2994  "Tivx_Target_Kernel_List",
2995  "#else",
2996  " {&tivxAddTargetKernel" + self.kernel.name_camel + ", &tivxRemoveTargetKernel" + self.kernel.name_camel + "},",
2997  "\n#else",
2998  "\n#else",
2999  " {&tivxAddTargetKernel" + self.kernel.name_camel + ", &tivxRemoveTargetKernel" + self.kernel.name_camel + "},\n")
3000 
3001  CodeModify().block_insert(self.target_kernels_filename,
3002  "Tivx_Target_Kernel_List",
3003  "#endif",
3004  " {&tivxAddTargetKernel" + self.kernel.name_camel + ", &tivxRemoveTargetKernel" + self.kernel.name_camel + "},",
3005  "\n#endif",
3006  "\n#endif",
3007  " {&tivxAddTargetKernel" + self.kernel.name_camel + ", &tivxRemoveTargetKernel" + self.kernel.name_camel + "},\n", overrideFind=(not self.target_kernels_created))
3008 
3009  def todo(self) :
3010  if self.env_var == 'CUSTOM_KERNEL_PATH' or self.env_var == 'CUSTOM_APPLICATION_PATH':
3011  self.todo_filename = self.workarea + "/DEVELOPER_TODO.txt"
3012  else :
3013  self.todo_filename = self.workarea_module + "/DEVELOPER_TODO.txt"
3014  print("Creating " + self.todo_filename)
3015  self.todo_code = CodeGenerate(self.todo_filename, header=False)
3016 
3017  self.lineNum = -1
3018  self.fileName = None
3019  self.state = False
3020 
3021  self.todo_code.write_line("# This file lists the places in the generated code where the developer is expected")
3022  self.todo_code.write_line("# to add custom code beyond what the script can generate. This is generated as ")
3023  self.todo_code.write_line("# part of the KernelExportCode.export() function, but may also be called independently ")
3024  self.todo_code.write_line("# by calling the KernelExportCode.todo() function with the requirement that the ")
3025  self.todo_code.write_line("# "+self.env_var+" environment variable is defined. This function simply searches")
3026  self.todo_code.write_line("# for the \"< DEVELOPER_TODO ...>\" string in all the files from this path, and lists them.")
3027  self.todo_code.write_line("# Removing the \"< DEVELOPER_TODO ...>\" comment block from the files will effectively remove those")
3028  self.todo_code.write_line("# lines from showing up in this file the next time KernelExportCode.todo() is run.")
3029  if self.env_var == 'CUSTOM_KERNEL_PATH' or self.env_var == 'CUSTOM_APPLICATION_PATH':
3030  self.all_files = [y for x in os.walk(self.workarea) for y in glob(os.path.join(x[0], '*.*'))]
3031  else :
3032  self.all_files = [y for x in os.walk(self.workarea_module) for y in glob(os.path.join(x[0], '*.*'))]
3033  for file in self.all_files :
3034  with open(file, 'rb') as f:
3035  for num, line in enumerate(f, 1):
3036  if 'DEVELOPER_TODO'.encode() in line:
3037  if '>'.encode() in line:
3038  self.state = False
3039  else:
3040  self.state = True
3041  self.modLine = re.sub("^.*?DEVELOPER_TODO:".encode(),"".encode(), line)
3042  self.modLine = re.sub("^\s+".encode(),"".encode(), self.modLine)
3043  self.modLine = re.sub("\*\/".encode(),"".encode(), self.modLine)
3044  self.modLine = re.sub(">".encode(),"".encode(), self.modLine)
3045  if self.fileName != file :
3046  self.todo_code.write_line("\n" + file, new_line=False)
3047  self.todo_code.write_line("\n " + str(num) + ": " + self.modLine.decode('utf-8'), new_line=False)
3048  self.lineNum = num
3049  self.fileName = file
3050  elif self.state :
3051  if '>'.encode() in line :
3052  self.state = False
3053  self.modLine = re.sub("^.*?DEVELOPER_TODO:".encode(),"".encode(), line)
3054  self.modLine = re.sub("#".encode(),"".encode(), self.modLine)
3055  self.modLine = re.sub("\/\/".encode(),"".encode(), self.modLine)
3056  self.modLine = re.sub("\/\*".encode(),"".encode(), self.modLine)
3057  self.modLine = re.sub("\*\/".encode(),"".encode(), self.modLine)
3058  self.modLine = re.sub("^\s+".encode(),"".encode(), self.modLine)
3059  self.modLine = re.sub(">".encode(),"".encode(), self.modLine)
3060  self.todo_code.write_line(" " + str(num) + ": " + self.modLine.decode('utf-8'), new_line=False)
3061  self.lineNum = num
3062  self.todo_code.close()
3063 
3064 
3065 
3068  def export(self, kernel) :
3069  self.kernel = kernel
3070  self.h_filename = "tivx_kernel_" + kernel.name_lower + ".h";
3071  self.host_c_filename = "vx_" + kernel.name_lower + "_host.c";
3072  self.target_c_filename = "vx_" + kernel.name_lower + "_target.c";
3073  # Disabling BAM generation while this is not supported
3074  #self.bam_target_c_filename = "vx_bam_" + kernel.name_lower + "_target.c";
3075 
3076  self.target_uses_dsp = False
3077  # Disabling BAM generation while this is not supported
3078  '''
3079  for target in self.kernel.targets :
3080  if target == Target.DSP1 or target == Target.DSP2 :
3081  self.target_uses_dsp = True
3082  '''
3083 
3084  self.prms_write = 2
3085  if self.kernel.localMem == True :
3086  self.prms_write = 2
3087  elif self.target_uses_dsp and self.kernel.localMem == False :
3088  self.prms_write = 1
3089 
3090  # TIOVX-815: Setting the kernel instance context regardless of mem being used
3091  self.prms_needed = True
3092 
3093  # TIOVX-815: Adding an #if 0 so the mem alloc doesn't fail on target
3094  self.prms_commented_out = True
3095 
3096  if self.target_uses_dsp or self.kernel.localMem == True :
3097  self.prms_commented_out = False
3098 
3099  print ('Generating C code for OpenVX kernel ...')
3100  print ()
3101  print ('Creating new directories ...')
3102  self.create_all_directories()
3103  print ('Creating new makefiles ...')
3104  self.generate_make_files(kernel)
3105  print ('Creating new headers ...')
3106  self.generate_headers()
3107  print ('Creating new module-level sources ...')
3108  self.generate_sources()
3109 
3110  self.modify_files()
3111 
3112  print ('Creating new kernel-specific files ...')
3113  self.generate_h_file_code()
3116 
3117  print ()
3118  print (self.kernel)
3119  print ('Generating C code for OpenVX kernel ... DONE !!!')
3120  self.todo()
3121 
def generate_bam_pointers(self, kernel_params)
def convert_string_to_array_type(self, print_type)
Definition: kernel_code.py:534
def generate_optional_bam_pointers(self, num_scenarios)
def generate_optional_list(self, kernel_params)
def create_directory(self, directory)
Definition: kernel_code.py:394
def outputNodeConnectionList(self, kernel)
Definition: kernel_code.py:296
def exportDiagram(self, kernel)
Export object as C source code.
Definition: kernel_code.py:304
Code object used to generate custom kernel.
Definition: kernel_code.py:194
def check_array_type(self, print_type)
Definition: kernel_code.py:544
def extract_local_mem_string_error_check(self, new_str, type, name)
Definition: kernel_code.py:942
def extract_attribute(self, local, is_first_prm)
def outputNodeConnection(self, kernel)
Definition: kernel_code.py:287
def export(self, kernel)
Method for generating files from kernel.
def generate_make_files(self, kernel)
def extract_local_mem_string(self, type, attribute, local)
def __init__(self, module="ext1", core="c66", env_var='VISION_APPS_PATH', include_subpath="TI", include_filename="")
Constructor used to create this object.
Definition: kernel_code.py:202
def verify_parameter_relationship_items(self, relationship_list, prm, attribute, name)
Definition: kernel_code.py:506