numba-cuda 0.21.1__cp313-cp313-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (488) hide show
  1. _numba_cuda_redirector.pth +4 -0
  2. _numba_cuda_redirector.py +89 -0
  3. numba_cuda/VERSION +1 -0
  4. numba_cuda/__init__.py +6 -0
  5. numba_cuda/_version.py +11 -0
  6. numba_cuda/numba/cuda/__init__.py +70 -0
  7. numba_cuda/numba/cuda/_internal/cuda_bf16.py +16394 -0
  8. numba_cuda/numba/cuda/_internal/cuda_fp16.py +8112 -0
  9. numba_cuda/numba/cuda/api.py +577 -0
  10. numba_cuda/numba/cuda/api_util.py +76 -0
  11. numba_cuda/numba/cuda/args.py +72 -0
  12. numba_cuda/numba/cuda/bf16.py +397 -0
  13. numba_cuda/numba/cuda/cache_hints.py +287 -0
  14. numba_cuda/numba/cuda/cext/__init__.py +2 -0
  15. numba_cuda/numba/cuda/cext/_devicearray.cp313-win_amd64.pyd +0 -0
  16. numba_cuda/numba/cuda/cext/_devicearray.cpp +159 -0
  17. numba_cuda/numba/cuda/cext/_devicearray.h +29 -0
  18. numba_cuda/numba/cuda/cext/_dispatcher.cp313-win_amd64.pyd +0 -0
  19. numba_cuda/numba/cuda/cext/_dispatcher.cpp +1098 -0
  20. numba_cuda/numba/cuda/cext/_hashtable.cpp +532 -0
  21. numba_cuda/numba/cuda/cext/_hashtable.h +135 -0
  22. numba_cuda/numba/cuda/cext/_helperlib.c +71 -0
  23. numba_cuda/numba/cuda/cext/_helperlib.cp313-win_amd64.pyd +0 -0
  24. numba_cuda/numba/cuda/cext/_helpermod.c +82 -0
  25. numba_cuda/numba/cuda/cext/_pymodule.h +38 -0
  26. numba_cuda/numba/cuda/cext/_typeconv.cp313-win_amd64.pyd +0 -0
  27. numba_cuda/numba/cuda/cext/_typeconv.cpp +206 -0
  28. numba_cuda/numba/cuda/cext/_typeof.cpp +1159 -0
  29. numba_cuda/numba/cuda/cext/_typeof.h +19 -0
  30. numba_cuda/numba/cuda/cext/capsulethunk.h +111 -0
  31. numba_cuda/numba/cuda/cext/mviewbuf.c +385 -0
  32. numba_cuda/numba/cuda/cext/mviewbuf.cp313-win_amd64.pyd +0 -0
  33. numba_cuda/numba/cuda/cext/typeconv.cpp +212 -0
  34. numba_cuda/numba/cuda/cext/typeconv.hpp +101 -0
  35. numba_cuda/numba/cuda/cg.py +67 -0
  36. numba_cuda/numba/cuda/cgutils.py +1294 -0
  37. numba_cuda/numba/cuda/cloudpickle/__init__.py +21 -0
  38. numba_cuda/numba/cuda/cloudpickle/cloudpickle.py +1598 -0
  39. numba_cuda/numba/cuda/cloudpickle/cloudpickle_fast.py +17 -0
  40. numba_cuda/numba/cuda/codegen.py +541 -0
  41. numba_cuda/numba/cuda/compiler.py +1396 -0
  42. numba_cuda/numba/cuda/core/analysis.py +758 -0
  43. numba_cuda/numba/cuda/core/annotations/__init__.py +0 -0
  44. numba_cuda/numba/cuda/core/annotations/pretty_annotate.py +288 -0
  45. numba_cuda/numba/cuda/core/annotations/type_annotations.py +305 -0
  46. numba_cuda/numba/cuda/core/base.py +1332 -0
  47. numba_cuda/numba/cuda/core/boxing.py +1411 -0
  48. numba_cuda/numba/cuda/core/bytecode.py +728 -0
  49. numba_cuda/numba/cuda/core/byteflow.py +2346 -0
  50. numba_cuda/numba/cuda/core/caching.py +744 -0
  51. numba_cuda/numba/cuda/core/callconv.py +392 -0
  52. numba_cuda/numba/cuda/core/codegen.py +171 -0
  53. numba_cuda/numba/cuda/core/compiler.py +199 -0
  54. numba_cuda/numba/cuda/core/compiler_lock.py +85 -0
  55. numba_cuda/numba/cuda/core/compiler_machinery.py +497 -0
  56. numba_cuda/numba/cuda/core/config.py +650 -0
  57. numba_cuda/numba/cuda/core/consts.py +124 -0
  58. numba_cuda/numba/cuda/core/controlflow.py +989 -0
  59. numba_cuda/numba/cuda/core/entrypoints.py +57 -0
  60. numba_cuda/numba/cuda/core/environment.py +66 -0
  61. numba_cuda/numba/cuda/core/errors.py +917 -0
  62. numba_cuda/numba/cuda/core/event.py +511 -0
  63. numba_cuda/numba/cuda/core/funcdesc.py +330 -0
  64. numba_cuda/numba/cuda/core/generators.py +387 -0
  65. numba_cuda/numba/cuda/core/imputils.py +509 -0
  66. numba_cuda/numba/cuda/core/inline_closurecall.py +1787 -0
  67. numba_cuda/numba/cuda/core/interpreter.py +3617 -0
  68. numba_cuda/numba/cuda/core/ir.py +1812 -0
  69. numba_cuda/numba/cuda/core/ir_utils.py +2638 -0
  70. numba_cuda/numba/cuda/core/optional.py +129 -0
  71. numba_cuda/numba/cuda/core/options.py +262 -0
  72. numba_cuda/numba/cuda/core/postproc.py +249 -0
  73. numba_cuda/numba/cuda/core/pythonapi.py +1859 -0
  74. numba_cuda/numba/cuda/core/registry.py +46 -0
  75. numba_cuda/numba/cuda/core/removerefctpass.py +123 -0
  76. numba_cuda/numba/cuda/core/rewrites/__init__.py +26 -0
  77. numba_cuda/numba/cuda/core/rewrites/ir_print.py +91 -0
  78. numba_cuda/numba/cuda/core/rewrites/registry.py +104 -0
  79. numba_cuda/numba/cuda/core/rewrites/static_binop.py +41 -0
  80. numba_cuda/numba/cuda/core/rewrites/static_getitem.py +189 -0
  81. numba_cuda/numba/cuda/core/rewrites/static_raise.py +100 -0
  82. numba_cuda/numba/cuda/core/sigutils.py +68 -0
  83. numba_cuda/numba/cuda/core/ssa.py +498 -0
  84. numba_cuda/numba/cuda/core/targetconfig.py +330 -0
  85. numba_cuda/numba/cuda/core/tracing.py +231 -0
  86. numba_cuda/numba/cuda/core/transforms.py +956 -0
  87. numba_cuda/numba/cuda/core/typed_passes.py +867 -0
  88. numba_cuda/numba/cuda/core/typeinfer.py +1950 -0
  89. numba_cuda/numba/cuda/core/unsafe/__init__.py +0 -0
  90. numba_cuda/numba/cuda/core/unsafe/bytes.py +67 -0
  91. numba_cuda/numba/cuda/core/unsafe/eh.py +67 -0
  92. numba_cuda/numba/cuda/core/unsafe/refcount.py +98 -0
  93. numba_cuda/numba/cuda/core/untyped_passes.py +1979 -0
  94. numba_cuda/numba/cuda/cpython/builtins.py +1153 -0
  95. numba_cuda/numba/cuda/cpython/charseq.py +1218 -0
  96. numba_cuda/numba/cuda/cpython/cmathimpl.py +560 -0
  97. numba_cuda/numba/cuda/cpython/enumimpl.py +103 -0
  98. numba_cuda/numba/cuda/cpython/iterators.py +167 -0
  99. numba_cuda/numba/cuda/cpython/listobj.py +1326 -0
  100. numba_cuda/numba/cuda/cpython/mathimpl.py +499 -0
  101. numba_cuda/numba/cuda/cpython/numbers.py +1475 -0
  102. numba_cuda/numba/cuda/cpython/rangeobj.py +289 -0
  103. numba_cuda/numba/cuda/cpython/slicing.py +322 -0
  104. numba_cuda/numba/cuda/cpython/tupleobj.py +456 -0
  105. numba_cuda/numba/cuda/cpython/unicode.py +2865 -0
  106. numba_cuda/numba/cuda/cpython/unicode_support.py +1597 -0
  107. numba_cuda/numba/cuda/cpython/unsafe/__init__.py +0 -0
  108. numba_cuda/numba/cuda/cpython/unsafe/numbers.py +64 -0
  109. numba_cuda/numba/cuda/cpython/unsafe/tuple.py +92 -0
  110. numba_cuda/numba/cuda/cuda_paths.py +691 -0
  111. numba_cuda/numba/cuda/cudadecl.py +556 -0
  112. numba_cuda/numba/cuda/cudadrv/__init__.py +14 -0
  113. numba_cuda/numba/cuda/cudadrv/devicearray.py +951 -0
  114. numba_cuda/numba/cuda/cudadrv/devices.py +249 -0
  115. numba_cuda/numba/cuda/cudadrv/driver.py +3222 -0
  116. numba_cuda/numba/cuda/cudadrv/drvapi.py +435 -0
  117. numba_cuda/numba/cuda/cudadrv/dummyarray.py +558 -0
  118. numba_cuda/numba/cuda/cudadrv/enums.py +613 -0
  119. numba_cuda/numba/cuda/cudadrv/error.py +48 -0
  120. numba_cuda/numba/cuda/cudadrv/libs.py +220 -0
  121. numba_cuda/numba/cuda/cudadrv/linkable_code.py +184 -0
  122. numba_cuda/numba/cuda/cudadrv/mappings.py +14 -0
  123. numba_cuda/numba/cuda/cudadrv/ndarray.py +26 -0
  124. numba_cuda/numba/cuda/cudadrv/nvrtc.py +193 -0
  125. numba_cuda/numba/cuda/cudadrv/nvvm.py +756 -0
  126. numba_cuda/numba/cuda/cudadrv/rtapi.py +13 -0
  127. numba_cuda/numba/cuda/cudadrv/runtime.py +34 -0
  128. numba_cuda/numba/cuda/cudaimpl.py +995 -0
  129. numba_cuda/numba/cuda/cudamath.py +149 -0
  130. numba_cuda/numba/cuda/datamodel/__init__.py +7 -0
  131. numba_cuda/numba/cuda/datamodel/cuda_manager.py +66 -0
  132. numba_cuda/numba/cuda/datamodel/cuda_models.py +1446 -0
  133. numba_cuda/numba/cuda/datamodel/cuda_packer.py +224 -0
  134. numba_cuda/numba/cuda/datamodel/cuda_registry.py +22 -0
  135. numba_cuda/numba/cuda/datamodel/cuda_testing.py +153 -0
  136. numba_cuda/numba/cuda/datamodel/manager.py +11 -0
  137. numba_cuda/numba/cuda/datamodel/models.py +9 -0
  138. numba_cuda/numba/cuda/datamodel/packer.py +9 -0
  139. numba_cuda/numba/cuda/datamodel/registry.py +11 -0
  140. numba_cuda/numba/cuda/datamodel/testing.py +11 -0
  141. numba_cuda/numba/cuda/debuginfo.py +903 -0
  142. numba_cuda/numba/cuda/decorators.py +294 -0
  143. numba_cuda/numba/cuda/descriptor.py +35 -0
  144. numba_cuda/numba/cuda/device_init.py +158 -0
  145. numba_cuda/numba/cuda/deviceufunc.py +1021 -0
  146. numba_cuda/numba/cuda/dispatcher.py +2463 -0
  147. numba_cuda/numba/cuda/errors.py +72 -0
  148. numba_cuda/numba/cuda/extending.py +697 -0
  149. numba_cuda/numba/cuda/flags.py +178 -0
  150. numba_cuda/numba/cuda/fp16.py +357 -0
  151. numba_cuda/numba/cuda/include/12/cuda_bf16.h +5118 -0
  152. numba_cuda/numba/cuda/include/12/cuda_bf16.hpp +3865 -0
  153. numba_cuda/numba/cuda/include/12/cuda_fp16.h +5363 -0
  154. numba_cuda/numba/cuda/include/12/cuda_fp16.hpp +3483 -0
  155. numba_cuda/numba/cuda/include/13/cuda_bf16.h +5118 -0
  156. numba_cuda/numba/cuda/include/13/cuda_bf16.hpp +3865 -0
  157. numba_cuda/numba/cuda/include/13/cuda_fp16.h +5363 -0
  158. numba_cuda/numba/cuda/include/13/cuda_fp16.hpp +3483 -0
  159. numba_cuda/numba/cuda/initialize.py +24 -0
  160. numba_cuda/numba/cuda/intrinsic_wrapper.py +41 -0
  161. numba_cuda/numba/cuda/intrinsics.py +382 -0
  162. numba_cuda/numba/cuda/itanium_mangler.py +214 -0
  163. numba_cuda/numba/cuda/kernels/__init__.py +2 -0
  164. numba_cuda/numba/cuda/kernels/reduction.py +265 -0
  165. numba_cuda/numba/cuda/kernels/transpose.py +65 -0
  166. numba_cuda/numba/cuda/libdevice.py +3386 -0
  167. numba_cuda/numba/cuda/libdevicedecl.py +20 -0
  168. numba_cuda/numba/cuda/libdevicefuncs.py +1060 -0
  169. numba_cuda/numba/cuda/libdeviceimpl.py +88 -0
  170. numba_cuda/numba/cuda/locks.py +19 -0
  171. numba_cuda/numba/cuda/lowering.py +1951 -0
  172. numba_cuda/numba/cuda/mathimpl.py +374 -0
  173. numba_cuda/numba/cuda/memory_management/__init__.py +4 -0
  174. numba_cuda/numba/cuda/memory_management/memsys.cu +99 -0
  175. numba_cuda/numba/cuda/memory_management/memsys.cuh +22 -0
  176. numba_cuda/numba/cuda/memory_management/nrt.cu +212 -0
  177. numba_cuda/numba/cuda/memory_management/nrt.cuh +48 -0
  178. numba_cuda/numba/cuda/memory_management/nrt.py +390 -0
  179. numba_cuda/numba/cuda/memory_management/nrt_context.py +438 -0
  180. numba_cuda/numba/cuda/misc/appdirs.py +594 -0
  181. numba_cuda/numba/cuda/misc/cffiimpl.py +24 -0
  182. numba_cuda/numba/cuda/misc/coverage_support.py +43 -0
  183. numba_cuda/numba/cuda/misc/dump_style.py +41 -0
  184. numba_cuda/numba/cuda/misc/findlib.py +75 -0
  185. numba_cuda/numba/cuda/misc/firstlinefinder.py +96 -0
  186. numba_cuda/numba/cuda/misc/gdb_hook.py +240 -0
  187. numba_cuda/numba/cuda/misc/literal.py +28 -0
  188. numba_cuda/numba/cuda/misc/llvm_pass_timings.py +412 -0
  189. numba_cuda/numba/cuda/misc/special.py +94 -0
  190. numba_cuda/numba/cuda/models.py +56 -0
  191. numba_cuda/numba/cuda/np/arraymath.py +5130 -0
  192. numba_cuda/numba/cuda/np/arrayobj.py +7635 -0
  193. numba_cuda/numba/cuda/np/extensions.py +11 -0
  194. numba_cuda/numba/cuda/np/linalg.py +3087 -0
  195. numba_cuda/numba/cuda/np/math/__init__.py +0 -0
  196. numba_cuda/numba/cuda/np/math/cmathimpl.py +558 -0
  197. numba_cuda/numba/cuda/np/math/mathimpl.py +487 -0
  198. numba_cuda/numba/cuda/np/math/numbers.py +1461 -0
  199. numba_cuda/numba/cuda/np/npdatetime.py +969 -0
  200. numba_cuda/numba/cuda/np/npdatetime_helpers.py +217 -0
  201. numba_cuda/numba/cuda/np/npyfuncs.py +1808 -0
  202. numba_cuda/numba/cuda/np/npyimpl.py +1027 -0
  203. numba_cuda/numba/cuda/np/numpy_support.py +798 -0
  204. numba_cuda/numba/cuda/np/polynomial/__init__.py +4 -0
  205. numba_cuda/numba/cuda/np/polynomial/polynomial_core.py +242 -0
  206. numba_cuda/numba/cuda/np/polynomial/polynomial_functions.py +380 -0
  207. numba_cuda/numba/cuda/np/ufunc/__init__.py +4 -0
  208. numba_cuda/numba/cuda/np/ufunc/decorators.py +203 -0
  209. numba_cuda/numba/cuda/np/ufunc/sigparse.py +68 -0
  210. numba_cuda/numba/cuda/np/ufunc/ufuncbuilder.py +65 -0
  211. numba_cuda/numba/cuda/np/ufunc_db.py +1282 -0
  212. numba_cuda/numba/cuda/np/unsafe/__init__.py +0 -0
  213. numba_cuda/numba/cuda/np/unsafe/ndarray.py +84 -0
  214. numba_cuda/numba/cuda/nvvmutils.py +254 -0
  215. numba_cuda/numba/cuda/printimpl.py +126 -0
  216. numba_cuda/numba/cuda/random.py +308 -0
  217. numba_cuda/numba/cuda/reshape_funcs.cu +156 -0
  218. numba_cuda/numba/cuda/serialize.py +267 -0
  219. numba_cuda/numba/cuda/simulator/__init__.py +63 -0
  220. numba_cuda/numba/cuda/simulator/_internal/__init__.py +4 -0
  221. numba_cuda/numba/cuda/simulator/_internal/cuda_bf16.py +2 -0
  222. numba_cuda/numba/cuda/simulator/api.py +179 -0
  223. numba_cuda/numba/cuda/simulator/bf16.py +4 -0
  224. numba_cuda/numba/cuda/simulator/compiler.py +38 -0
  225. numba_cuda/numba/cuda/simulator/cudadrv/__init__.py +11 -0
  226. numba_cuda/numba/cuda/simulator/cudadrv/devicearray.py +462 -0
  227. numba_cuda/numba/cuda/simulator/cudadrv/devices.py +122 -0
  228. numba_cuda/numba/cuda/simulator/cudadrv/driver.py +66 -0
  229. numba_cuda/numba/cuda/simulator/cudadrv/drvapi.py +7 -0
  230. numba_cuda/numba/cuda/simulator/cudadrv/dummyarray.py +7 -0
  231. numba_cuda/numba/cuda/simulator/cudadrv/error.py +10 -0
  232. numba_cuda/numba/cuda/simulator/cudadrv/libs.py +10 -0
  233. numba_cuda/numba/cuda/simulator/cudadrv/linkable_code.py +61 -0
  234. numba_cuda/numba/cuda/simulator/cudadrv/nvrtc.py +11 -0
  235. numba_cuda/numba/cuda/simulator/cudadrv/nvvm.py +32 -0
  236. numba_cuda/numba/cuda/simulator/cudadrv/runtime.py +22 -0
  237. numba_cuda/numba/cuda/simulator/dispatcher.py +11 -0
  238. numba_cuda/numba/cuda/simulator/kernel.py +320 -0
  239. numba_cuda/numba/cuda/simulator/kernelapi.py +509 -0
  240. numba_cuda/numba/cuda/simulator/memory_management/__init__.py +4 -0
  241. numba_cuda/numba/cuda/simulator/memory_management/nrt.py +21 -0
  242. numba_cuda/numba/cuda/simulator/reduction.py +19 -0
  243. numba_cuda/numba/cuda/simulator/tests/support.py +4 -0
  244. numba_cuda/numba/cuda/simulator/vector_types.py +65 -0
  245. numba_cuda/numba/cuda/simulator_init.py +18 -0
  246. numba_cuda/numba/cuda/stubs.py +635 -0
  247. numba_cuda/numba/cuda/target.py +505 -0
  248. numba_cuda/numba/cuda/testing.py +347 -0
  249. numba_cuda/numba/cuda/tests/__init__.py +62 -0
  250. numba_cuda/numba/cuda/tests/benchmarks/__init__.py +0 -0
  251. numba_cuda/numba/cuda/tests/benchmarks/test_kernel_launch.py +119 -0
  252. numba_cuda/numba/cuda/tests/cloudpickle_main_class.py +9 -0
  253. numba_cuda/numba/cuda/tests/core/serialize_usecases.py +113 -0
  254. numba_cuda/numba/cuda/tests/core/test_itanium_mangler.py +83 -0
  255. numba_cuda/numba/cuda/tests/core/test_serialize.py +371 -0
  256. numba_cuda/numba/cuda/tests/cudadrv/__init__.py +9 -0
  257. numba_cuda/numba/cuda/tests/cudadrv/test_array_attr.py +147 -0
  258. numba_cuda/numba/cuda/tests/cudadrv/test_context_stack.py +161 -0
  259. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_array_slicing.py +397 -0
  260. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_auto_context.py +24 -0
  261. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_devicerecord.py +180 -0
  262. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_driver.py +313 -0
  263. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_memory.py +187 -0
  264. numba_cuda/numba/cuda/tests/cudadrv/test_cuda_ndarray.py +621 -0
  265. numba_cuda/numba/cuda/tests/cudadrv/test_deallocations.py +247 -0
  266. numba_cuda/numba/cuda/tests/cudadrv/test_detect.py +100 -0
  267. numba_cuda/numba/cuda/tests/cudadrv/test_emm_plugins.py +198 -0
  268. numba_cuda/numba/cuda/tests/cudadrv/test_events.py +53 -0
  269. numba_cuda/numba/cuda/tests/cudadrv/test_host_alloc.py +72 -0
  270. numba_cuda/numba/cuda/tests/cudadrv/test_init.py +138 -0
  271. numba_cuda/numba/cuda/tests/cudadrv/test_inline_ptx.py +43 -0
  272. numba_cuda/numba/cuda/tests/cudadrv/test_is_fp16.py +15 -0
  273. numba_cuda/numba/cuda/tests/cudadrv/test_linkable_code.py +58 -0
  274. numba_cuda/numba/cuda/tests/cudadrv/test_linker.py +348 -0
  275. numba_cuda/numba/cuda/tests/cudadrv/test_managed_alloc.py +128 -0
  276. numba_cuda/numba/cuda/tests/cudadrv/test_module_callbacks.py +301 -0
  277. numba_cuda/numba/cuda/tests/cudadrv/test_nvjitlink.py +174 -0
  278. numba_cuda/numba/cuda/tests/cudadrv/test_nvrtc.py +28 -0
  279. numba_cuda/numba/cuda/tests/cudadrv/test_nvvm_driver.py +185 -0
  280. numba_cuda/numba/cuda/tests/cudadrv/test_pinned.py +39 -0
  281. numba_cuda/numba/cuda/tests/cudadrv/test_profiler.py +23 -0
  282. numba_cuda/numba/cuda/tests/cudadrv/test_reset_device.py +38 -0
  283. numba_cuda/numba/cuda/tests/cudadrv/test_runtime.py +48 -0
  284. numba_cuda/numba/cuda/tests/cudadrv/test_select_device.py +44 -0
  285. numba_cuda/numba/cuda/tests/cudadrv/test_streams.py +127 -0
  286. numba_cuda/numba/cuda/tests/cudapy/__init__.py +9 -0
  287. numba_cuda/numba/cuda/tests/cudapy/cache_usecases.py +231 -0
  288. numba_cuda/numba/cuda/tests/cudapy/cache_with_cpu_usecases.py +50 -0
  289. numba_cuda/numba/cuda/tests/cudapy/cg_cache_usecases.py +36 -0
  290. numba_cuda/numba/cuda/tests/cudapy/complex_usecases.py +116 -0
  291. numba_cuda/numba/cuda/tests/cudapy/enum_usecases.py +59 -0
  292. numba_cuda/numba/cuda/tests/cudapy/extensions_usecases.py +62 -0
  293. numba_cuda/numba/cuda/tests/cudapy/jitlink.ptx +28 -0
  294. numba_cuda/numba/cuda/tests/cudapy/overload_usecases.py +33 -0
  295. numba_cuda/numba/cuda/tests/cudapy/recursion_usecases.py +104 -0
  296. numba_cuda/numba/cuda/tests/cudapy/test_alignment.py +47 -0
  297. numba_cuda/numba/cuda/tests/cudapy/test_analysis.py +1122 -0
  298. numba_cuda/numba/cuda/tests/cudapy/test_array.py +344 -0
  299. numba_cuda/numba/cuda/tests/cudapy/test_array_alignment.py +268 -0
  300. numba_cuda/numba/cuda/tests/cudapy/test_array_args.py +203 -0
  301. numba_cuda/numba/cuda/tests/cudapy/test_array_methods.py +63 -0
  302. numba_cuda/numba/cuda/tests/cudapy/test_array_reductions.py +360 -0
  303. numba_cuda/numba/cuda/tests/cudapy/test_atomics.py +1815 -0
  304. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16.py +599 -0
  305. numba_cuda/numba/cuda/tests/cudapy/test_bfloat16_bindings.py +377 -0
  306. numba_cuda/numba/cuda/tests/cudapy/test_blackscholes.py +160 -0
  307. numba_cuda/numba/cuda/tests/cudapy/test_boolean.py +27 -0
  308. numba_cuda/numba/cuda/tests/cudapy/test_byteflow.py +98 -0
  309. numba_cuda/numba/cuda/tests/cudapy/test_cache_hints.py +210 -0
  310. numba_cuda/numba/cuda/tests/cudapy/test_caching.py +683 -0
  311. numba_cuda/numba/cuda/tests/cudapy/test_casting.py +265 -0
  312. numba_cuda/numba/cuda/tests/cudapy/test_cffi.py +42 -0
  313. numba_cuda/numba/cuda/tests/cudapy/test_compiler.py +718 -0
  314. numba_cuda/numba/cuda/tests/cudapy/test_complex.py +370 -0
  315. numba_cuda/numba/cuda/tests/cudapy/test_complex_kernel.py +23 -0
  316. numba_cuda/numba/cuda/tests/cudapy/test_const_string.py +142 -0
  317. numba_cuda/numba/cuda/tests/cudapy/test_constmem.py +178 -0
  318. numba_cuda/numba/cuda/tests/cudapy/test_cooperative_groups.py +193 -0
  319. numba_cuda/numba/cuda/tests/cudapy/test_copy_propagate.py +131 -0
  320. numba_cuda/numba/cuda/tests/cudapy/test_cuda_array_interface.py +438 -0
  321. numba_cuda/numba/cuda/tests/cudapy/test_cuda_jit_no_types.py +94 -0
  322. numba_cuda/numba/cuda/tests/cudapy/test_datetime.py +101 -0
  323. numba_cuda/numba/cuda/tests/cudapy/test_debug.py +105 -0
  324. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo.py +889 -0
  325. numba_cuda/numba/cuda/tests/cudapy/test_debuginfo_types.py +476 -0
  326. numba_cuda/numba/cuda/tests/cudapy/test_device_func.py +500 -0
  327. numba_cuda/numba/cuda/tests/cudapy/test_dispatcher.py +820 -0
  328. numba_cuda/numba/cuda/tests/cudapy/test_enums.py +152 -0
  329. numba_cuda/numba/cuda/tests/cudapy/test_errors.py +111 -0
  330. numba_cuda/numba/cuda/tests/cudapy/test_exception.py +170 -0
  331. numba_cuda/numba/cuda/tests/cudapy/test_extending.py +1088 -0
  332. numba_cuda/numba/cuda/tests/cudapy/test_extending_types.py +71 -0
  333. numba_cuda/numba/cuda/tests/cudapy/test_fastmath.py +265 -0
  334. numba_cuda/numba/cuda/tests/cudapy/test_flow_control.py +1433 -0
  335. numba_cuda/numba/cuda/tests/cudapy/test_forall.py +57 -0
  336. numba_cuda/numba/cuda/tests/cudapy/test_freevar.py +34 -0
  337. numba_cuda/numba/cuda/tests/cudapy/test_frexp_ldexp.py +69 -0
  338. numba_cuda/numba/cuda/tests/cudapy/test_globals.py +62 -0
  339. numba_cuda/numba/cuda/tests/cudapy/test_gufunc.py +474 -0
  340. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scalar.py +167 -0
  341. numba_cuda/numba/cuda/tests/cudapy/test_gufunc_scheduling.py +92 -0
  342. numba_cuda/numba/cuda/tests/cudapy/test_idiv.py +39 -0
  343. numba_cuda/numba/cuda/tests/cudapy/test_inline.py +170 -0
  344. numba_cuda/numba/cuda/tests/cudapy/test_inspect.py +255 -0
  345. numba_cuda/numba/cuda/tests/cudapy/test_intrinsics.py +1219 -0
  346. numba_cuda/numba/cuda/tests/cudapy/test_ipc.py +263 -0
  347. numba_cuda/numba/cuda/tests/cudapy/test_ir.py +598 -0
  348. numba_cuda/numba/cuda/tests/cudapy/test_ir_utils.py +276 -0
  349. numba_cuda/numba/cuda/tests/cudapy/test_iterators.py +101 -0
  350. numba_cuda/numba/cuda/tests/cudapy/test_lang.py +68 -0
  351. numba_cuda/numba/cuda/tests/cudapy/test_laplace.py +123 -0
  352. numba_cuda/numba/cuda/tests/cudapy/test_libdevice.py +194 -0
  353. numba_cuda/numba/cuda/tests/cudapy/test_lineinfo.py +220 -0
  354. numba_cuda/numba/cuda/tests/cudapy/test_localmem.py +173 -0
  355. numba_cuda/numba/cuda/tests/cudapy/test_make_function_to_jit_function.py +364 -0
  356. numba_cuda/numba/cuda/tests/cudapy/test_mandel.py +47 -0
  357. numba_cuda/numba/cuda/tests/cudapy/test_math.py +842 -0
  358. numba_cuda/numba/cuda/tests/cudapy/test_matmul.py +76 -0
  359. numba_cuda/numba/cuda/tests/cudapy/test_minmax.py +78 -0
  360. numba_cuda/numba/cuda/tests/cudapy/test_montecarlo.py +25 -0
  361. numba_cuda/numba/cuda/tests/cudapy/test_multigpu.py +145 -0
  362. numba_cuda/numba/cuda/tests/cudapy/test_multiprocessing.py +39 -0
  363. numba_cuda/numba/cuda/tests/cudapy/test_multithreads.py +82 -0
  364. numba_cuda/numba/cuda/tests/cudapy/test_nondet.py +53 -0
  365. numba_cuda/numba/cuda/tests/cudapy/test_operator.py +504 -0
  366. numba_cuda/numba/cuda/tests/cudapy/test_optimization.py +93 -0
  367. numba_cuda/numba/cuda/tests/cudapy/test_overload.py +402 -0
  368. numba_cuda/numba/cuda/tests/cudapy/test_powi.py +128 -0
  369. numba_cuda/numba/cuda/tests/cudapy/test_print.py +193 -0
  370. numba_cuda/numba/cuda/tests/cudapy/test_py2_div_issue.py +37 -0
  371. numba_cuda/numba/cuda/tests/cudapy/test_random.py +117 -0
  372. numba_cuda/numba/cuda/tests/cudapy/test_record_dtype.py +614 -0
  373. numba_cuda/numba/cuda/tests/cudapy/test_recursion.py +130 -0
  374. numba_cuda/numba/cuda/tests/cudapy/test_reduction.py +94 -0
  375. numba_cuda/numba/cuda/tests/cudapy/test_retrieve_autoconverted_arrays.py +83 -0
  376. numba_cuda/numba/cuda/tests/cudapy/test_serialize.py +86 -0
  377. numba_cuda/numba/cuda/tests/cudapy/test_slicing.py +40 -0
  378. numba_cuda/numba/cuda/tests/cudapy/test_sm.py +457 -0
  379. numba_cuda/numba/cuda/tests/cudapy/test_sm_creation.py +233 -0
  380. numba_cuda/numba/cuda/tests/cudapy/test_ssa.py +454 -0
  381. numba_cuda/numba/cuda/tests/cudapy/test_stream_api.py +56 -0
  382. numba_cuda/numba/cuda/tests/cudapy/test_sync.py +277 -0
  383. numba_cuda/numba/cuda/tests/cudapy/test_tracing.py +200 -0
  384. numba_cuda/numba/cuda/tests/cudapy/test_transpose.py +90 -0
  385. numba_cuda/numba/cuda/tests/cudapy/test_typeconv.py +333 -0
  386. numba_cuda/numba/cuda/tests/cudapy/test_typeinfer.py +538 -0
  387. numba_cuda/numba/cuda/tests/cudapy/test_ufuncs.py +585 -0
  388. numba_cuda/numba/cuda/tests/cudapy/test_userexc.py +42 -0
  389. numba_cuda/numba/cuda/tests/cudapy/test_vector_type.py +485 -0
  390. numba_cuda/numba/cuda/tests/cudapy/test_vectorize.py +312 -0
  391. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_complex.py +23 -0
  392. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_decor.py +183 -0
  393. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_device.py +40 -0
  394. numba_cuda/numba/cuda/tests/cudapy/test_vectorize_scalar_arg.py +40 -0
  395. numba_cuda/numba/cuda/tests/cudapy/test_warning.py +206 -0
  396. numba_cuda/numba/cuda/tests/cudapy/test_warp_ops.py +331 -0
  397. numba_cuda/numba/cuda/tests/cudasim/__init__.py +9 -0
  398. numba_cuda/numba/cuda/tests/cudasim/support.py +9 -0
  399. numba_cuda/numba/cuda/tests/cudasim/test_cudasim_issues.py +111 -0
  400. numba_cuda/numba/cuda/tests/data/__init__.py +2 -0
  401. numba_cuda/numba/cuda/tests/data/cta_barrier.cu +28 -0
  402. numba_cuda/numba/cuda/tests/data/cuda_include.cu +10 -0
  403. numba_cuda/numba/cuda/tests/data/error.cu +12 -0
  404. numba_cuda/numba/cuda/tests/data/include/add.cuh +8 -0
  405. numba_cuda/numba/cuda/tests/data/jitlink.cu +28 -0
  406. numba_cuda/numba/cuda/tests/data/jitlink.ptx +49 -0
  407. numba_cuda/numba/cuda/tests/data/warn.cu +12 -0
  408. numba_cuda/numba/cuda/tests/doc_examples/__init__.py +9 -0
  409. numba_cuda/numba/cuda/tests/doc_examples/ffi/__init__.py +2 -0
  410. numba_cuda/numba/cuda/tests/doc_examples/ffi/functions.cu +54 -0
  411. numba_cuda/numba/cuda/tests/doc_examples/ffi/include/mul.cuh +8 -0
  412. numba_cuda/numba/cuda/tests/doc_examples/ffi/saxpy.cu +14 -0
  413. numba_cuda/numba/cuda/tests/doc_examples/test_cg.py +86 -0
  414. numba_cuda/numba/cuda/tests/doc_examples/test_cpointer.py +68 -0
  415. numba_cuda/numba/cuda/tests/doc_examples/test_cpu_gpu_compat.py +81 -0
  416. numba_cuda/numba/cuda/tests/doc_examples/test_ffi.py +141 -0
  417. numba_cuda/numba/cuda/tests/doc_examples/test_laplace.py +160 -0
  418. numba_cuda/numba/cuda/tests/doc_examples/test_matmul.py +180 -0
  419. numba_cuda/numba/cuda/tests/doc_examples/test_montecarlo.py +119 -0
  420. numba_cuda/numba/cuda/tests/doc_examples/test_random.py +66 -0
  421. numba_cuda/numba/cuda/tests/doc_examples/test_reduction.py +80 -0
  422. numba_cuda/numba/cuda/tests/doc_examples/test_sessionize.py +206 -0
  423. numba_cuda/numba/cuda/tests/doc_examples/test_ufunc.py +53 -0
  424. numba_cuda/numba/cuda/tests/doc_examples/test_vecadd.py +76 -0
  425. numba_cuda/numba/cuda/tests/nocuda/__init__.py +9 -0
  426. numba_cuda/numba/cuda/tests/nocuda/test_dummyarray.py +391 -0
  427. numba_cuda/numba/cuda/tests/nocuda/test_function_resolution.py +48 -0
  428. numba_cuda/numba/cuda/tests/nocuda/test_import.py +63 -0
  429. numba_cuda/numba/cuda/tests/nocuda/test_library_lookup.py +252 -0
  430. numba_cuda/numba/cuda/tests/nocuda/test_nvvm.py +59 -0
  431. numba_cuda/numba/cuda/tests/nrt/__init__.py +9 -0
  432. numba_cuda/numba/cuda/tests/nrt/test_nrt.py +387 -0
  433. numba_cuda/numba/cuda/tests/nrt/test_nrt_refct.py +124 -0
  434. numba_cuda/numba/cuda/tests/support.py +900 -0
  435. numba_cuda/numba/cuda/typeconv/__init__.py +4 -0
  436. numba_cuda/numba/cuda/typeconv/castgraph.py +137 -0
  437. numba_cuda/numba/cuda/typeconv/rules.py +63 -0
  438. numba_cuda/numba/cuda/typeconv/typeconv.py +121 -0
  439. numba_cuda/numba/cuda/types/__init__.py +233 -0
  440. numba_cuda/numba/cuda/types/__init__.pyi +167 -0
  441. numba_cuda/numba/cuda/types/abstract.py +9 -0
  442. numba_cuda/numba/cuda/types/common.py +9 -0
  443. numba_cuda/numba/cuda/types/containers.py +9 -0
  444. numba_cuda/numba/cuda/types/cuda_abstract.py +533 -0
  445. numba_cuda/numba/cuda/types/cuda_common.py +110 -0
  446. numba_cuda/numba/cuda/types/cuda_containers.py +971 -0
  447. numba_cuda/numba/cuda/types/cuda_function_type.py +230 -0
  448. numba_cuda/numba/cuda/types/cuda_functions.py +798 -0
  449. numba_cuda/numba/cuda/types/cuda_iterators.py +120 -0
  450. numba_cuda/numba/cuda/types/cuda_misc.py +569 -0
  451. numba_cuda/numba/cuda/types/cuda_npytypes.py +690 -0
  452. numba_cuda/numba/cuda/types/cuda_scalars.py +280 -0
  453. numba_cuda/numba/cuda/types/ext_types.py +101 -0
  454. numba_cuda/numba/cuda/types/function_type.py +11 -0
  455. numba_cuda/numba/cuda/types/functions.py +9 -0
  456. numba_cuda/numba/cuda/types/iterators.py +9 -0
  457. numba_cuda/numba/cuda/types/misc.py +9 -0
  458. numba_cuda/numba/cuda/types/npytypes.py +9 -0
  459. numba_cuda/numba/cuda/types/scalars.py +9 -0
  460. numba_cuda/numba/cuda/typing/__init__.py +19 -0
  461. numba_cuda/numba/cuda/typing/arraydecl.py +939 -0
  462. numba_cuda/numba/cuda/typing/asnumbatype.py +130 -0
  463. numba_cuda/numba/cuda/typing/bufproto.py +70 -0
  464. numba_cuda/numba/cuda/typing/builtins.py +1209 -0
  465. numba_cuda/numba/cuda/typing/cffi_utils.py +219 -0
  466. numba_cuda/numba/cuda/typing/cmathdecl.py +47 -0
  467. numba_cuda/numba/cuda/typing/collections.py +138 -0
  468. numba_cuda/numba/cuda/typing/context.py +782 -0
  469. numba_cuda/numba/cuda/typing/ctypes_utils.py +125 -0
  470. numba_cuda/numba/cuda/typing/dictdecl.py +63 -0
  471. numba_cuda/numba/cuda/typing/enumdecl.py +74 -0
  472. numba_cuda/numba/cuda/typing/listdecl.py +147 -0
  473. numba_cuda/numba/cuda/typing/mathdecl.py +158 -0
  474. numba_cuda/numba/cuda/typing/npdatetime.py +322 -0
  475. numba_cuda/numba/cuda/typing/npydecl.py +749 -0
  476. numba_cuda/numba/cuda/typing/setdecl.py +115 -0
  477. numba_cuda/numba/cuda/typing/templates.py +1446 -0
  478. numba_cuda/numba/cuda/typing/typeof.py +301 -0
  479. numba_cuda/numba/cuda/ufuncs.py +746 -0
  480. numba_cuda/numba/cuda/utils.py +724 -0
  481. numba_cuda/numba/cuda/vector_types.py +214 -0
  482. numba_cuda/numba/cuda/vectorizers.py +260 -0
  483. numba_cuda-0.21.1.dist-info/METADATA +109 -0
  484. numba_cuda-0.21.1.dist-info/RECORD +488 -0
  485. numba_cuda-0.21.1.dist-info/WHEEL +5 -0
  486. numba_cuda-0.21.1.dist-info/licenses/LICENSE +26 -0
  487. numba_cuda-0.21.1.dist-info/licenses/LICENSE.numba +24 -0
  488. numba_cuda-0.21.1.dist-info/top_level.txt +1 -0
File without changes
@@ -0,0 +1,288 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ """
5
+ This module implements code highlighting of numba-cuda function annotations.
6
+ """
7
+
8
+ from warnings import warn
9
+
10
+ warn(
11
+ "The pretty_annotate functionality is experimental and might change API",
12
+ FutureWarning,
13
+ )
14
+
15
+
16
+ def hllines(code, style):
17
+ try:
18
+ from pygments import highlight
19
+ from pygments.lexers import PythonLexer
20
+ from pygments.formatters import HtmlFormatter
21
+ except ImportError:
22
+ raise ImportError("please install the 'pygments' package")
23
+ pylex = PythonLexer()
24
+ "Given a code string, return a list of html-highlighted lines"
25
+ hf = HtmlFormatter(noclasses=True, style=style, nowrap=True)
26
+ res = highlight(code, pylex, hf)
27
+ return res.splitlines()
28
+
29
+
30
+ def htlines(code, style):
31
+ try:
32
+ from pygments import highlight
33
+ from pygments.lexers import PythonLexer
34
+
35
+ # TerminalFormatter does not support themes, Terminal256 should,
36
+ # but seem to not work.
37
+ from pygments.formatters import TerminalFormatter
38
+ except ImportError:
39
+ raise ImportError("please install the 'pygments' package")
40
+ pylex = PythonLexer()
41
+ "Given a code string, return a list of ANSI-highlighted lines"
42
+ hf = TerminalFormatter(style=style)
43
+ res = highlight(code, pylex, hf)
44
+ return res.splitlines()
45
+
46
+
47
+ def get_ansi_template():
48
+ try:
49
+ from jinja2 import Template
50
+ except ImportError:
51
+ raise ImportError("please install the 'jinja2' package")
52
+ return Template("""
53
+ {%- for func_key in func_data.keys() -%}
54
+ Function name: \x1b[34m{{func_data[func_key]['funcname']}}\x1b[39;49;00m
55
+ {%- if func_data[func_key]['filename'] -%}
56
+ {{'\n'}}In file: \x1b[34m{{func_data[func_key]['filename'] -}}\x1b[39;49;00m
57
+ {%- endif -%}
58
+ {{'\n'}}With signature: \x1b[34m{{func_key[1]}}\x1b[39;49;00m
59
+ {{- "\n" -}}
60
+ {%- for num, line, hl, hc in func_data[func_key]['pygments_lines'] -%}
61
+ {{-'\n'}}{{ num}}: {{hc-}}
62
+ {%- if func_data[func_key]['ir_lines'][num] -%}
63
+ {%- for ir_line, ir_line_type in func_data[func_key]['ir_lines'][num] %}
64
+ {{-'\n'}}--{{- ' '*func_data[func_key]['python_indent'][num]}}
65
+ {{- ' '*(func_data[func_key]['ir_indent'][num][loop.index0]+4)
66
+ }}{{ir_line }}\x1b[41m{{ir_line_type-}}\x1b[39;49;00m
67
+ {%- endfor -%}
68
+ {%- endif -%}
69
+ {%- endfor -%}
70
+ {%- endfor -%}
71
+ """)
72
+
73
+
74
+ def get_html_template():
75
+ try:
76
+ from jinja2 import Template
77
+ except ImportError:
78
+ raise ImportError("please install the 'jinja2' package")
79
+ return Template("""
80
+ <html>
81
+ <head>
82
+ <style>
83
+
84
+ .annotation_table {
85
+ color: #000000;
86
+ font-family: monospace;
87
+ margin: 5px;
88
+ width: 100%;
89
+ }
90
+
91
+ /* override JupyterLab style */
92
+ .annotation_table td {
93
+ text-align: left;
94
+ background-color: transparent;
95
+ padding: 1px;
96
+ }
97
+
98
+ .annotation_table tbody tr:nth-child(even) {
99
+ background: white;
100
+ }
101
+
102
+ .annotation_table code
103
+ {
104
+ background-color: transparent;
105
+ white-space: normal;
106
+ }
107
+
108
+ /* End override JupyterLab style */
109
+
110
+ tr:hover {
111
+ background-color: rgba(92, 200, 249, 0.25);
112
+ }
113
+
114
+ td.object_tag summary ,
115
+ td.lifted_tag summary{
116
+ font-weight: bold;
117
+ display: list-item;
118
+ }
119
+
120
+ span.lifted_tag {
121
+ color: #00cc33;
122
+ }
123
+
124
+ span.object_tag {
125
+ color: #cc3300;
126
+ }
127
+
128
+
129
+ td.lifted_tag {
130
+ background-color: #cdf7d8;
131
+ }
132
+
133
+ td.object_tag {
134
+ background-color: #fef5c8;
135
+ }
136
+
137
+ code.ir_code {
138
+ color: grey;
139
+ font-style: italic;
140
+ }
141
+
142
+ .metadata {
143
+ border-bottom: medium solid black;
144
+ display: inline-block;
145
+ padding: 5px;
146
+ width: 100%;
147
+ }
148
+
149
+ .annotations {
150
+ padding: 5px;
151
+ }
152
+
153
+ .hidden {
154
+ display: none;
155
+ }
156
+
157
+ .buttons {
158
+ padding: 10px;
159
+ cursor: pointer;
160
+ }
161
+ </style>
162
+ </head>
163
+
164
+ <body>
165
+ {% for func_key in func_data.keys() %}
166
+ <div class="metadata">
167
+ Function name: {{func_data[func_key]['funcname']}}<br />
168
+ {% if func_data[func_key]['filename'] %}
169
+ in file: {{func_data[func_key]['filename']|escape}}<br />
170
+ {% endif %}
171
+ with signature: {{func_key[1]|e}}
172
+ </div>
173
+ <div class="annotations">
174
+ <table class="annotation_table tex2jax_ignore">
175
+ {%- for num, line, hl, hc in func_data[func_key]['pygments_lines'] -%}
176
+ {%- if func_data[func_key]['ir_lines'][num] %}
177
+ <tr><td style="text-align:left;" class="{{func_data[func_key]['python_tags'][num]}}">
178
+ <details>
179
+ <summary>
180
+ <code>
181
+ {{num}}:
182
+ {{'&nbsp;'*func_data[func_key]['python_indent'][num]}}{{hl}}
183
+ </code>
184
+ </summary>
185
+ <table class="annotation_table">
186
+ <tbody>
187
+ {%- for ir_line, ir_line_type in func_data[func_key]['ir_lines'][num] %}
188
+ <tr class="ir_code">
189
+ <td style="text-align: left;"><code>
190
+ &nbsp;
191
+ {{- '&nbsp;'*func_data[func_key]['python_indent'][num]}}
192
+ {{ '&nbsp;'*func_data[func_key]['ir_indent'][num][loop.index0]}}{{ir_line|e -}}
193
+ <span class="object_tag">{{ir_line_type}}</span>
194
+ </code>
195
+ </td>
196
+ </tr>
197
+ {%- endfor -%}
198
+ </tbody>
199
+ </table>
200
+ </details>
201
+ </td></tr>
202
+ {% else -%}
203
+ <tr><td style="text-align:left; padding-left: 22px;" class="{{func_data[func_key]['python_tags'][num]}}">
204
+ <code>
205
+ {{num}}:
206
+ {{'&nbsp;'*func_data[func_key]['python_indent'][num]}}{{hl}}
207
+ </code>
208
+ </td></tr>
209
+ {%- endif -%}
210
+ {%- endfor -%}
211
+ </table>
212
+ </div>
213
+ {% endfor %}
214
+ </body>
215
+ </html>
216
+ """)
217
+
218
+
219
+ def reform_code(annotation):
220
+ """
221
+ Extract the code from the Numba-cuda annotation datastructure.
222
+
223
+ Pygments can only highlight full multi-line strings, the Numba-cuda
224
+ annotation is list of single lines, with indentation removed.
225
+ """
226
+ ident_dict = annotation["python_indent"]
227
+ s = ""
228
+ for n, l in annotation["python_lines"]:
229
+ s = s + " " * ident_dict[n] + l + "\n"
230
+ return s
231
+
232
+
233
+ class Annotate:
234
+ """
235
+ Construct syntax highlighted annotation for a given jitted function:
236
+
237
+ Example:
238
+
239
+ >>> from numba import cuda
240
+ >>> import numpy as np
241
+ >>> from numba.cuda.core.annotations.pretty_annotate import Annotate
242
+ >>> @cuda.jit
243
+ ... def test(a):
244
+ ... tid = cuda.grid(1)
245
+ ... size = len(a)
246
+ ... if tid < size:
247
+ ... a[tid] = 1
248
+ >>> test[(4), (16)](np.ones(100))
249
+ >>> Annotate(test)
250
+
251
+ The last line will return an HTML and/or ANSI representation that will be
252
+ displayed accordingly in Jupyter/IPython.
253
+
254
+ Function annotations persist across compilation for newly encountered
255
+ type signatures and as a result annotations are shown for all signatures
256
+ by default.
257
+
258
+ Annotations for a specific signature can be shown by using the
259
+ ``signature`` parameter. For the above jitted function:
260
+
261
+ >>> test.signatures
262
+ [(Array(float64, 1, 'C', False, aligned=True),)]
263
+ >>> Annotate(f, signature=f.signatures[0])
264
+ # annotation for Array(float64, 1, 'C', False, aligned=True)
265
+ """
266
+
267
+ def __init__(self, function, signature=None, **kwargs):
268
+ style = kwargs.get("style", "default")
269
+ if not function.signatures:
270
+ raise ValueError(
271
+ "function need to be jitted for at least one signature"
272
+ )
273
+ ann = function.get_annotation_info(signature=signature)
274
+ self.ann = ann
275
+
276
+ for k, v in ann.items():
277
+ res = hllines(reform_code(v), style)
278
+ rest = htlines(reform_code(v), style)
279
+ v["pygments_lines"] = [
280
+ (a, b, c, d)
281
+ for (a, b), c, d in zip(v["python_lines"], res, rest)
282
+ ]
283
+
284
+ def _repr_html_(self):
285
+ return get_html_template().render(func_data=self.ann)
286
+
287
+ def __repr__(self):
288
+ return get_ansi_template().render(func_data=self.ann)
@@ -0,0 +1,305 @@
1
+ # SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
+ # SPDX-License-Identifier: BSD-2-Clause
3
+
4
+ from collections import defaultdict, OrderedDict
5
+ from collections.abc import Mapping
6
+ from contextlib import closing
7
+ import copy
8
+ import inspect
9
+ import os
10
+ import re
11
+ import textwrap
12
+ from io import StringIO
13
+
14
+ from numba.cuda.core import ir
15
+
16
+
17
+ class SourceLines(Mapping):
18
+ def __init__(self, func):
19
+ try:
20
+ lines, startno = inspect.getsourcelines(func)
21
+ except OSError:
22
+ self.lines = ()
23
+ self.startno = 0
24
+ else:
25
+ self.lines = textwrap.dedent("".join(lines)).splitlines()
26
+ self.startno = startno
27
+
28
+ def __getitem__(self, lineno):
29
+ try:
30
+ return self.lines[lineno - self.startno].rstrip()
31
+ except IndexError:
32
+ return ""
33
+
34
+ def __iter__(self):
35
+ return iter((self.startno + i) for i in range(len(self.lines)))
36
+
37
+ def __len__(self):
38
+ return len(self.lines)
39
+
40
+ @property
41
+ def avail(self):
42
+ return bool(self.lines)
43
+
44
+
45
+ class TypeAnnotation(object):
46
+ # func_data dict stores annotation data for all functions that are
47
+ # compiled. We store the data in the TypeAnnotation class since a new
48
+ # TypeAnnotation instance is created for each function that is compiled.
49
+ # For every function that is compiled, we add the type annotation data to
50
+ # this dict and write the html annotation file to disk (rewrite the html
51
+ # file for every function since we don't know if this is the last function
52
+ # to be compiled).
53
+ func_data = OrderedDict()
54
+
55
+ def __init__(
56
+ self,
57
+ func_ir,
58
+ typemap,
59
+ calltypes,
60
+ lifted,
61
+ lifted_from,
62
+ args,
63
+ return_type,
64
+ html_output=None,
65
+ ):
66
+ self.func_id = func_ir.func_id
67
+ self.blocks = func_ir.blocks
68
+ self.typemap = typemap
69
+ self.calltypes = calltypes
70
+ self.filename = func_ir.loc.filename
71
+ self.linenum = str(func_ir.loc.line)
72
+ self.signature = str(args) + " -> " + str(return_type)
73
+
74
+ # lifted loop information
75
+ self.lifted = lifted
76
+ self.num_lifted_loops = len(lifted)
77
+
78
+ # If this is a lifted loop function that is being compiled, lifted_from
79
+ # points to annotation data from function that this loop lifted function
80
+ # was lifted from. This is used to stick lifted loop annotations back
81
+ # into original function.
82
+ self.lifted_from = lifted_from
83
+
84
+ def prepare_annotations(self):
85
+ from numba.cuda.dispatcher import LiftedLoop
86
+
87
+ # Prepare annotations
88
+ groupedinst = defaultdict(list)
89
+ found_lifted_loop = False
90
+ # for blkid, blk in self.blocks.items():
91
+ for blkid in sorted(self.blocks.keys()):
92
+ blk = self.blocks[blkid]
93
+ groupedinst[blk.loc.line].append("label %s" % blkid)
94
+ for inst in blk.body:
95
+ lineno = inst.loc.line
96
+
97
+ if isinstance(inst, ir.Assign):
98
+ if found_lifted_loop:
99
+ atype = "XXX Lifted Loop XXX"
100
+ found_lifted_loop = False
101
+ elif (
102
+ isinstance(inst.value, ir.Expr)
103
+ and inst.value.op == "call"
104
+ ):
105
+ atype = self.calltypes[inst.value]
106
+ elif isinstance(inst.value, ir.Const) and isinstance(
107
+ inst.value.value, LiftedLoop
108
+ ):
109
+ atype = "XXX Lifted Loop XXX"
110
+ found_lifted_loop = True
111
+ else:
112
+ # TODO: fix parfor lowering so that typemap is valid.
113
+ atype = self.typemap.get(inst.target.name, "<missing>")
114
+
115
+ aline = "%s = %s :: %s" % (inst.target, inst.value, atype)
116
+ elif isinstance(inst, ir.SetItem):
117
+ atype = self.calltypes[inst]
118
+ aline = "%s :: %s" % (inst, atype)
119
+ else:
120
+ aline = "%s" % inst
121
+ groupedinst[lineno].append(" %s" % aline)
122
+ return groupedinst
123
+
124
+ def annotate(self):
125
+ source = SourceLines(self.func_id.func)
126
+ # if not source.avail:
127
+ # return "Source code unavailable"
128
+
129
+ groupedinst = self.prepare_annotations()
130
+
131
+ # Format annotations
132
+ io = StringIO()
133
+ with closing(io):
134
+ if source.avail:
135
+ print("# File: %s" % self.filename, file=io)
136
+ for num in source:
137
+ srcline = source[num]
138
+ ind = _getindent(srcline)
139
+ print("%s# --- LINE %d --- " % (ind, num), file=io)
140
+ for inst in groupedinst[num]:
141
+ print("%s# %s" % (ind, inst), file=io)
142
+ print(file=io)
143
+ print(srcline, file=io)
144
+ print(file=io)
145
+ if self.lifted:
146
+ print("# The function contains lifted loops", file=io)
147
+ for loop in self.lifted:
148
+ print(
149
+ "# Loop at line %d" % loop.get_source_location(),
150
+ file=io,
151
+ )
152
+ print(
153
+ "# Has %d overloads" % len(loop.overloads), file=io
154
+ )
155
+ for cres in loop.overloads.values():
156
+ print(cres.type_annotation, file=io)
157
+ else:
158
+ print("# Source code unavailable", file=io)
159
+ for num in groupedinst:
160
+ for inst in groupedinst[num]:
161
+ print("%s" % (inst,), file=io)
162
+ print(file=io)
163
+
164
+ return io.getvalue()
165
+
166
+ def html_annotate(self, outfile):
167
+ # ensure that annotation information is assembled
168
+ self.annotate_raw()
169
+ # make a deep copy ahead of the pending mutations
170
+ func_data = copy.deepcopy(self.func_data)
171
+
172
+ key = "python_indent"
173
+ for this_func in func_data.values():
174
+ if key in this_func:
175
+ idents = {}
176
+ for line, amount in this_func[key].items():
177
+ idents[line] = "&nbsp;" * amount
178
+ this_func[key] = idents
179
+
180
+ key = "ir_indent"
181
+ for this_func in func_data.values():
182
+ if key in this_func:
183
+ idents = {}
184
+ for line, ir_id in this_func[key].items():
185
+ idents[line] = ["&nbsp;" * amount for amount in ir_id]
186
+ this_func[key] = idents
187
+
188
+ try:
189
+ from jinja2 import Template
190
+ except ImportError:
191
+ raise ImportError("please install the 'jinja2' package")
192
+
193
+ root = os.path.join(os.path.dirname(__file__))
194
+ template_filename = os.path.join(root, "template.html")
195
+ with open(template_filename, "r") as template:
196
+ html = template.read()
197
+
198
+ template = Template(html)
199
+ rendered = template.render(func_data=func_data)
200
+ outfile.write(rendered)
201
+
202
+ def annotate_raw(self):
203
+ """
204
+ This returns "raw" annotation information i.e. it has no output format
205
+ specific markup included.
206
+ """
207
+ python_source = SourceLines(self.func_id.func)
208
+ ir_lines = self.prepare_annotations()
209
+ line_nums = [num for num in python_source]
210
+ lifted_lines = [l.get_source_location() for l in self.lifted]
211
+
212
+ def add_ir_line(func_data, line):
213
+ line_str = line.strip()
214
+ line_type = ""
215
+ if line_str.endswith("pyobject"):
216
+ line_str = line_str.replace("pyobject", "")
217
+ line_type = "pyobject"
218
+ func_data["ir_lines"][num].append((line_str, line_type))
219
+ indent_len = len(_getindent(line))
220
+ func_data["ir_indent"][num].append(indent_len)
221
+
222
+ func_key = (
223
+ self.func_id.filename + ":" + str(self.func_id.firstlineno + 1),
224
+ self.signature,
225
+ )
226
+ if (
227
+ self.lifted_from is not None
228
+ and self.lifted_from[1]["num_lifted_loops"] > 0
229
+ ):
230
+ # This is a lifted loop function that is being compiled. Get the
231
+ # numba ir for lines in loop function to use for annotating
232
+ # original python function that the loop was lifted from.
233
+ func_data = self.lifted_from[1]
234
+ for num in line_nums:
235
+ if num not in ir_lines.keys():
236
+ continue
237
+ func_data["ir_lines"][num] = []
238
+ func_data["ir_indent"][num] = []
239
+ for line in ir_lines[num]:
240
+ add_ir_line(func_data, line)
241
+ if line.strip().endswith("pyobject"):
242
+ func_data["python_tags"][num] = "object_tag"
243
+ # If any pyobject line is found, make sure original python
244
+ # line that was marked as a lifted loop start line is tagged
245
+ # as an object line instead. Lifted loop start lines should
246
+ # only be marked as lifted loop lines if the lifted loop
247
+ # was successfully compiled in nopython mode.
248
+ func_data["python_tags"][self.lifted_from[0]] = (
249
+ "object_tag"
250
+ )
251
+
252
+ # We're done with this lifted loop, so decrement lifted loop counter.
253
+ # When lifted loop counter hits zero, that means we're ready to write
254
+ # out annotations to html file.
255
+ self.lifted_from[1]["num_lifted_loops"] -= 1
256
+
257
+ elif func_key not in TypeAnnotation.func_data.keys():
258
+ TypeAnnotation.func_data[func_key] = {}
259
+ func_data = TypeAnnotation.func_data[func_key]
260
+
261
+ for i, loop in enumerate(self.lifted):
262
+ # Make sure that when we process each lifted loop function later,
263
+ # we'll know where it originally came from.
264
+ loop.lifted_from = (lifted_lines[i], func_data)
265
+ func_data["num_lifted_loops"] = self.num_lifted_loops
266
+
267
+ func_data["filename"] = self.filename
268
+ func_data["funcname"] = self.func_id.func_name
269
+ func_data["python_lines"] = []
270
+ func_data["python_indent"] = {}
271
+ func_data["python_tags"] = {}
272
+ func_data["ir_lines"] = {}
273
+ func_data["ir_indent"] = {}
274
+
275
+ for num in line_nums:
276
+ func_data["python_lines"].append(
277
+ (num, python_source[num].strip())
278
+ )
279
+ indent_len = len(_getindent(python_source[num]))
280
+ func_data["python_indent"][num] = indent_len
281
+ func_data["python_tags"][num] = ""
282
+ func_data["ir_lines"][num] = []
283
+ func_data["ir_indent"][num] = []
284
+
285
+ for line in ir_lines[num]:
286
+ add_ir_line(func_data, line)
287
+ if num in lifted_lines:
288
+ func_data["python_tags"][num] = "lifted_tag"
289
+ elif line.strip().endswith("pyobject"):
290
+ func_data["python_tags"][num] = "object_tag"
291
+ return self.func_data
292
+
293
+ def __str__(self):
294
+ return self.annotate()
295
+
296
+
297
+ re_longest_white_prefix = re.compile(r"^\s*")
298
+
299
+
300
+ def _getindent(text):
301
+ m = re_longest_white_prefix.match(text)
302
+ if not m:
303
+ return ""
304
+ else:
305
+ return " " * len(m.group(0))