text: """
  Copyright (c) 2015-2017 Advanced Micro Devices, Inc. All rights reserved.
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:
  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.
  """
  
  """
  1. This files uses Python3 to run
  
  List of device functions:
  acosf
  acoshf
  asinf
  asinhf
  atan2f
  atanf
  atanhf
  cbrtf
  ceilf
  copysignf
  cosf
  coshf
  cospif
  cyl_bessel_i0f
  cyl_bessel_i1f
  erfcf
  erfcinvf
  erfcxf
  erff
  erfinvf
  exp10f
  exp2f
  expf
  expm1f
  fabsf
  fdimf
  fdividef
  floorf
  fmaf
  fmaxf
  fminf
  fmodf
  frexpf
  hypotf
  ilogbf
  isfinite
  isinf
  isnan
  j0f
  j1f
  jnf
  ldexpf
  lgammaf
  llrintf
  llroundf
  log10f
  log1pf
  logbf
  lrintf
  lroundf
  modff
  nanf
  nearbyintf
  nextafterf
  norm3df
  norm4df
  normcdff
  normcdfinvf
  normf
  powf
  rcbrtf
  remainderf
  remquof
  rhypotf
  rintf
  rnorm3df
  rnorm4df
  rnormf
  roundf
  rsqrtf
  scalblnf
  scalbnf
  signbit
  sincosf
  sincospif
  sinf
  sinhf
  sinpif
  sqrtf
  tanf
  tanhf
  tgammaf
  truncf
  y0f
  y1f
  ynf
  acos
  acosh
  asin
  asinh
  atan
  atan2
  atanh
  cbrt
  ceil
  copysign
  cos
  cosh
  cospi
  cyl_bessel_i0
  cyl_bessel_i1
  erf
  erfc
  erfcinv
  erfcx
  erfinv
  exp
  exp10
  exp2
  expm1
  fabs
  fdim
  floor
  fma
  fmax
  fmin
  fmod
  frexp
  hypot
  ilogb
  isfinite
  isinf
  isnan
  j0
  j1
  jn
  ldexp
  lgamma
  llrint
  llround
  log
  log10
  log1p
  log2
  logb
  lrint
  lround
  modf
  nan
  nearbyint
  nextafter
  norm
  norm3d
  norm4d
  normcdf
  normcdfinv
  pow
  rcbrt
  remainder
  remquo
  rhypot
  rint
  rnorm
  rnorm3d
  rnorm4d
  round
  rsqrt
  scalbln
  scalbn
  signbit
  sin
  sincos
  sincospi
  sinh
  sinpi
  sqrt
  tan
  tanh
  tgamma
  trunc
  y0
  y1
  yn
  __cosf
  __exp10f
  __expf
  __fadd_rd
  __fadd_rn
  __fadd_ru
  __fadd_rz
  __fdiv_rd
  __fdiv_rn
  __fdiv_ru
  __fdiv_rz
  __fdividef
  __fmaf_rd
  __fmaf_rn
  __fmaf_ru
  __fmaf_rz
  __fmul_rd
  __fmul_rn
  __fmul_ru
  __fmul_rz
  __frcp_rd
  __frcp_rn
  __frcp_ru
  __frcp_rz
  __frsqrt_rn
  __fsqrt_rd
  __fsqrt_rn
  __fsqrt_ru
  __fsqrt_rz
  __fsub_rd
  __fsub_rn
  __fsub_ru
  __log10f
  __log2f
  __logf
  __powf
  __saturatef
  __sincosf
  __sinf
  __tanf
  __dadd_rd
  __dadd_rn
  __dadd_ru
  __dadd_rz
  __ddiv_rd
  __ddiv_rn
  __ddiv_ru
  __ddiv_rz
  __dmul_rd
  __dmul_rn
  __dmul_ru
  __dmul_rz
  __drcp_rd
  __drcp_rn
  __drcp_ru
  __drcp_rz
  __dsqrt_rd
  __dsqrt_rn
  __dsqrt_ru
  __dsqrt_rz
  __dsub_rd
  __dsub_rn
  __dsub_ru
  __dsub_rz
  __fma_rd
  __fma_rn
  __fma_ru
  __fma_rz
  __brev
  __brevll
  __byte_perm
  __clz
  __clzll
  __ffs
  __ffsll
  __hadd
  __mul24
  __mul64hi
  __mulhi
  __popc
  __popcll
  __rhadd
  __sad
  __uhadd
  __umul24
  __umul64hi
  __umulhi
  __urhadd
  __usad
  __double2float_rd
  __double2float_rn
  __double2float_ru
  __double2float_rz
  __double2hiint
  __double2int_rd
  __double2int_rn
  __double2int_ru
  __double2int_rz
  __double2ll_rd
  __double2ll_rn
  __double2ll_ru
  __double2ll_rz
  __double2loint
  __double2uint_rd
  __double2uint_rn
  __double2uint_ru
  __double2uint_rz
  __double2ull_rd
  __double2ull_rn
  __double2ull_ru
  __double2ull_rz
  __double_as_longlong
  __float2half_rn
  __half2float
  __float2half_rn
  __half2float
  __float2int_rd
  __float2int_rn
  __float2int_ru
  __float2int_rz
  __float2ll_rd
  __float2ll_rn
  __float2ll_ru
  __float2ll_rz
  __float2uint_rd
  __float2uint_rn
  __float2uint_ru
  __float2uint_rz
  __float2ull_rd
  __float2ull_rn
  __float2ull_ru
  __float2ull_rz
  __float_as_int
  __float_as_uint
  __hiloint2double
  __int2double_rn
  __int2float_rd
  __int2float_rn
  __int2float_ru
  __int2float_rz
  __int_as_float
  __ll2double_rd
  __ll2double_rn
  __ll2double_ru
  __ll2double_rz
  __ll2float_rd
  __ll2float_rn
  __ll2float_ru
  __ll2float_rz
  __longlong_as_double
  __uint2double_rn
  __uint2float_rd
  __uint2float_rn
  __uint2float_ru
  __uint2float_rz
  __uint_as_float
  __ull2double_rd
  __ull2double_rn
  __ull2double_ru
  __ull2double_rz
  __ull2float_rd
  __ull2float_rn
  __ull2float_ru
  __ull2float_rz
  __heq
  __hge
  __hgt
  __hisinf
  __hisnan
  __hle
  __hlt
  __hne
  __hbeq2
  __hbge2
  __hbgt2
  __hble2
  __hblt2
  __hbne2
  __heq2
  __hge2
  __hgt2
  __hisnan2
  __hle2
  __hlt2
  __hne2
  __float22half2_rn
  __float2half
  __float2half2_rn
  __float2half_rd
  __float2half_rn
  __float2half_ru
  __float2half_rz
  __floats2half2_rn
  __half22float2
  __half2float
  half2half2
  __half2int_rd
  __half2int_rn
  __half2int_ru
  __half2int_rz
  __half2ll_rd
  __half2ll_rn
  __half2ll_ru
  __half2ll_rz
  __half2short_rd
  __half2short_rn
  __half2short_ru
  __half2short_rz
  __half2uint_rd
  __half2uint_rn
  __half2uint_ru
  __half2uint_rz
  __half2ull_rd
  __half2ull_rn
  __half2ull_ru
  __half2ull_rz
  __half2ushort_rd
  __half2ushort_rn
  __half2ushort_ru
  __half2ushort_rz
  __half_as_short
  __half_as_ushort
  __halves2half2
  __high2float
  __high2half
  __high2half2
  __highs2half2
  __int2half_rd
  __int2half_rn
  __int2half_ru
  __int2half_rz
  __ll2half_rd
  __ll2half_rn
  __ll2half_ru
  __ll2half_rz
  __low2float
  __low2half
  __low2half2
  __low2half2
  __lowhigh2highlow
  __lows2half2
  __short2half_rd
  __short2half_rn
  __short2half_ru
  __short2half_rz
  __uint2half_rd
  __uint2half_rn
  __uint2half_ru
  __uint2half_rz
  __ull2half_rd
  __ull2half_rn
  __ull2half_ru
  __ull2half_rz
  __ushort2half_rd
  __ushort2half_rn
  __ushort2half_ru
  __ushort2half_rz
  __ushort_as_half
  """
  # The dictionary is to place description of each device function. Expand it to all the device functions
  deviceFuncDesc = {'acosf': "This function returns floating point of arc cosine from a floating point input"}
  
  fnames = ["../../include/hip/hcc_detail/math_functions.h","../../include/hip/hcc_detail/device_functions.h","../../include/hip/hcc_detail/hip_fp16.h"]
  markdownFileName = "./hip-math-api.md"
  
  preamble = "# HIP MATH APIs Documentation \n"+\
  "HIP supports most of the device functions supported by CUDA. Way to find the unsupported one is to search for the function and check its description\n" + \
  "Note: This document is not human generated. Any changes to this file will be discarded. Please make changes to Python3 script docs/markdown/device_md_gen.py\n\n" + \
  "## For Developers \n" + \
  "If you add or fixed a device function, make sure to add a signature of the function and definition later.\n" + \
  "For example, if you want to add `__device__ float __dotf(float4, float4)`, which does a dot product on 4 float vector components \n" + \
  "The way to add to the header is, \n" + \
  "```cpp \n" + \
  "__device__ static float __dotf(float4, float4); \n" + \
  "/*Way down in the file....*/\n" + \
  "__device__ static inline float __dotf(float4 x, float4 y) { \n" + \
  " /*implementation*/\n}\n" + \
  "```\n\n" + \
  "This helps python script to add the device function newly declared into markdown documentation (as it looks at functions with `;` at the end and `__device__` at the beginning)\n\n" + \
  "The next step would be to add Description to  `deviceFuncDesc` dictionary in python script.\n" + \
  "From the above example, it can be writtern as,\n`deviceFuncDesc['__dotf'] = 'This functions takes 2 4 component float vector and outputs dot product across them'`\n\n"
  
  def generateSnippet(name, description, signature):
      return "### " + name + "\n" + \
      "```cpp \n" + signature + "\n```\n" + \
      "**Description:**  " + description + "\n\n\n"
  
  def getName(line):
      l1 = line.split('(')
      l2 = l1[0].split(' ')
      return l2[-1]
  
  with open(markdownFileName, 'w') as mdfd:
      mdfd.truncate()
      mdfd.write(preamble)
      for fname in fnames:
          with open(fname) as fd:
              lines = fd.readlines()
              for line in lines:
                  if line.find('HIP_FAST_MATH') != -1:
                      break;
                  if line.find('__device__') != -1 and line.find(';') != -1 and line.find('hip') == -1:
                      name = getName(line)
                      if line.find('//') == -1:
                          if name in deviceFuncDesc:
                              mdfd.write(generateSnippet(name, deviceFuncDesc[name], line))
                          else:
                              mdfd.write(generateSnippet(name, "Supported", line))
                      else:
                          mdfd.write(generateSnippet(name, "**NOT Supported**", line))
              fd.close()
      mdfd.close()
  