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