You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tvm.apache.org by gi...@apache.org on 2025/12/03 22:20:59 UTC
(tvm-site) branch asf-site updated: deploying ffi docs
This is an automated email from the ASF dual-hosted git repository.
github-bot pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/tvm-site.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 9a1f98a775 deploying ffi docs
9a1f98a775 is described below
commit 9a1f98a7757d1bb9aa5d165534324faf7f568158
Author: tvm-bot <95...@users.noreply.github.com>
AuthorDate: Wed Dec 3 22:20:53 2025 +0000
deploying ffi docs
---
ffi/.buildinfo | 2 +-
ffi/_modules/index.html | 138 +-
ffi/_modules/tvm_ffi/_convert.html | 137 +-
ffi/_modules/tvm_ffi/_dtype.html | 137 +-
ffi/_modules/tvm_ffi/_tensor.html | 137 +-
ffi/_modules/tvm_ffi/access_path.html | 137 +-
ffi/_modules/tvm_ffi/container.html | 137 +-
ffi/_modules/tvm_ffi/cpp/extension.html | 340 ++++-
ffi/_modules/tvm_ffi/cpp/nvrtc.html | 1228 +++++++++++++++
ffi/_modules/tvm_ffi/error.html | 137 +-
ffi/_modules/tvm_ffi/module.html | 244 ++-
ffi/_modules/tvm_ffi/registry.html | 137 +-
ffi/_modules/tvm_ffi/serialization.html | 137 +-
ffi/_modules/tvm_ffi/stream.html | 137 +-
ffi/_sources/get_started/quickstart.rst | 3 +-
ffi/_sources/guides/compiler_integration.md | 10 +-
ffi/_sources/guides/cpp_guide.md | 47 +-
ffi/_sources/guides/cubin_launcher.rst | 422 +++++
ffi/_sources/guides/kernel_library_guide.rst | 15 +
ffi/_sources/index.rst | 1 +
.../generated/classtvm_1_1ffi_1_1CubinKernel.rst | 17 +
.../generated/classtvm_1_1ffi_1_1CubinModule.rst | 17 +
...ncher_8h_1a99736a44462543179cb434ebd4512ade.rst | 14 +
...ncher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.rst | 14 +
...2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.rst | 14 +
...ction_8h_1a78c6d17c063fba9ca07175f150838046.rst | 14 +
...ction_8h_1af84cdf62b6c193275db7e63e3bffc8bd.rst | 14 +
.../reference/cpp/generated/dir_tvm_ffi_extra.rst | 6 +
.../cpp/generated/dir_tvm_ffi_extra_cuda.rst | 23 +
.../cpp/generated/file_tvm_ffi_base_details.h.rst | 2 +
.../cpp/generated/file_tvm_ffi_c_api.h.rst | 2 +
.../generated/file_tvm_ffi_container_array.h.rst | 2 +
.../cpp/generated/file_tvm_ffi_container_map.h.rst | 2 +
.../cpp/generated/file_tvm_ffi_error.h.rst | 6 +
.../generated/file_tvm_ffi_extra_c_env_api.h.rst | 6 +
.../generated/file_tvm_ffi_extra_cuda_base.h.rst | 69 +
.../file_tvm_ffi_extra_cuda_cubin_launcher.h.rst | 98 ++
.../file_tvm_ffi_extra_cuda_device_guard.h.rst | 59 +
.../cpp/generated/file_tvm_ffi_extra_module.h.rst | 2 +
.../cpp/generated/file_tvm_ffi_extra_stl.h.rst | 104 ++
.../cpp/generated/file_tvm_ffi_function.h.rst | 8 +
.../cpp/generated/file_tvm_ffi_object.h.rst | 2 +
.../cpp/generated/file_tvm_ffi_string.h.rst | 2 +
.../cpp/generated/file_tvm_ffi_type_traits.h.rst | 2 +
.../reference/cpp/generated/namespace_tvm__ffi.rst | 12 +-
.../cpp/generated/namespace_tvm__ffi__symbol.rst | 2 +
.../program_listing_file_tvm_ffi_c_api.h.rst | 2 +-
...rogram_listing_file_tvm_ffi_container_map.h.rst | 3 +
...gram_listing_file_tvm_ffi_extra_cuda_base.h.rst | 54 +
...ng_file_tvm_ffi_extra_cuda_cubin_launcher.h.rst | 236 +++
...ting_file_tvm_ffi_extra_cuda_device_guard.h.rst | 62 +
...program_listing_file_tvm_ffi_extra_module.h.rst | 1 +
.../program_listing_file_tvm_ffi_extra_stl.h.rst | 646 ++++++++
.../program_listing_file_tvm_ffi_function.h.rst | 72 +-
...ram_listing_file_tvm_ffi_function_details.h.rst | 1 +
.../structtvm_1_1ffi_1_1CUDADeviceGuard.rst | 17 +
.../cpp/generated/structtvm_1_1ffi_1_1dim3.rst | 17 +
.../reference/cpp/generated/unabridged_orphan.rst | 25 +
...odule_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.rst | 14 +
.../generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.rst | 6 +
.../reference/python/generated/tvm_ffi.Module.rst | 2 +
ffi/_sources/reference/python/index.rst | 7 +
ffi/_static/basic.css | 8 -
ffi/_static/documentation_options.js | 2 +-
.../downloads/mermaid-layout-elk.esm.min.mjs | 2 +-
ffi/_static/searchtools.js | 13 +-
ffi/concepts/abi_overview.html | 18 +-
ffi/genindex.html | 206 ++-
ffi/get_started/quickstart.html | 21 +-
ffi/get_started/stable_c_abi.html | 18 +-
ffi/guides/build_from_source.html | 18 +-
ffi/guides/compiler_integration.html | 34 +-
ffi/guides/cpp_guide.html | 62 +-
ffi/guides/cpp_packaging.html | 18 +-
ffi/guides/cubin_launcher.html | 1608 ++++++++++++++++++++
ffi/guides/kernel_library_guide.html | 32 +-
ffi/guides/python_guide.html | 18 +-
ffi/guides/python_packaging.html | 18 +-
ffi/guides/rust_guide.html | 24 +-
ffi/index.html | 19 +-
ffi/objects.inv | Bin 123133 -> 129364 bytes
ffi/py-modindex.html | 137 +-
.../cpp/generated/classtvm_1_1ffi_1_1Any.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1AnyView.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Array.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Bytes.html | 24 +-
...bj.html => classtvm_1_1ffi_1_1CubinKernel.html} | 289 ++--
...es.html => classtvm_1_1ffi_1_1CubinModule.html} | 251 +--
.../generated/classtvm_1_1ffi_1_1DenseMapObj.html | 24 +-
.../cpp/generated/classtvm_1_1ffi_1_1Error.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Function.html | 18 +-
.../generated/classtvm_1_1ffi_1_1FunctionObj.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Map.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1MapObj.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Module.html | 18 +-
.../generated/classtvm_1_1ffi_1_1ModuleObj.html | 59 +-
.../cpp/generated/classtvm_1_1ffi_1_1Object.html | 18 +-
.../generated/classtvm_1_1ffi_1_1ObjectPtr.html | 18 +-
.../generated/classtvm_1_1ffi_1_1ObjectRef.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Optional.html | 18 +-
.../generated/classtvm_1_1ffi_1_1PackedArgs.html | 18 +-
.../generated/classtvm_1_1ffi_1_1RValueRef.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Shape.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1ShapeObj.html | 18 +-
.../generated/classtvm_1_1ffi_1_1ShapeView.html | 18 +-
.../generated/classtvm_1_1ffi_1_1SmallMapObj.html | 18 +-
.../generated/classtvm_1_1ffi_1_1StrictBool.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1String.html | 18 +-
.../classtvm_1_1ffi_1_1StructuralEqual.html | 18 +-
.../classtvm_1_1ffi_1_1StructuralHash.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Tensor.html | 18 +-
.../generated/classtvm_1_1ffi_1_1TensorObj.html | 18 +-
.../generated/classtvm_1_1ffi_1_1TensorView.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Tuple.html | 18 +-
.../classtvm_1_1ffi_1_1TypedFunction.html | 18 +-
...i_1_1TypedFunction_3_01R_07Args_8_8_8_08_4.html | 18 +-
.../cpp/generated/classtvm_1_1ffi_1_1Variant.html | 18 +-
.../classtvm_1_1ffi_1_1WeakObjectPtr.html | 18 +-
...lasstvm_1_1ffi_1_1reflection_1_1AccessPath.html | 18 +-
...stvm_1_1ffi_1_1reflection_1_1AccessPathObj.html | 18 +-
...lasstvm_1_1ffi_1_1reflection_1_1AccessStep.html | 18 +-
...stvm_1_1ffi_1_1reflection_1_1AccessStepObj.html | 18 +-
...vm_1_1ffi_1_1reflection_1_1AttachFieldFlag.html | 18 +-
...sstvm_1_1ffi_1_1reflection_1_1DefaultValue.html | 18 +-
...asstvm_1_1ffi_1_1reflection_1_1FieldGetter.html | 18 +-
...asstvm_1_1ffi_1_1reflection_1_1FieldSetter.html | 18 +-
...classtvm_1_1ffi_1_1reflection_1_1GlobalDef.html | 18 +-
.../classtvm_1_1ffi_1_1reflection_1_1Metadata.html | 18 +-
...stvm_1_1ffi_1_1reflection_1_1ObjectCreator.html | 18 +-
...classtvm_1_1ffi_1_1reflection_1_1ObjectDef.html | 18 +-
...tvm_1_1ffi_1_1reflection_1_1TypeAttrColumn.html | 18 +-
...asstvm_1_1ffi_1_1reflection_1_1TypeAttrDef.html | 18 +-
..._api_8h_1a01871644eed04162005df7faa5442f92.html | 18 +-
..._api_8h_1a4241f838270253b885e1de02534bc273.html | 18 +-
..._api_8h_1a42634cb2690dce4d9af6c2a402fc903c.html | 18 +-
..._api_8h_1a717daddad98d127813ba8ff5a715e929.html | 18 +-
...her_8h_1a99736a44462543179cb434ebd4512ade.html} | 169 +-
...her_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html} | 112 +-
...ase_8h_1a8b7e871d0d7206eacc60705f11827ee1.html} | 64 +-
...dian_8h_1a2ebd9542b313b3b45b2892f2b3d4f26d.html | 18 +-
...dian_8h_1a912dbc7a68913612c723f877acaa8105.html | 18 +-
...rror_8h_1a1a94c8b78e74adec05051abb9055e7b8.html | 18 +-
...rror_8h_1a26827bb8bc9e39255060f6be1d2a37fb.html | 18 +-
...rror_8h_1a288653475dd42db1c715a11ab2972578.html | 18 +-
...rror_8h_1a386641a33bb14802830471a2442ddd7d.html | 18 +-
...rror_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html | 18 +-
...rror_8h_1a64c939463f90816ffc2b70bc89ea3e43.html | 24 +-
...rror_8h_1a6c01470f76c6437edf93ac668ea6242a.html | 24 +-
...rror_8h_1a7205bbaef1c45e57f939af6deefb6449.html | 18 +-
...rror_8h_1a83986fc775d68d4abcc209c2f67dde6e.html | 18 +-
...rror_8h_1a8df4e0ff8a6195274c6f7c031a4f0db4.html | 18 +-
...rror_8h_1a927d4ae2bbf7a08723643993e780f183.html | 18 +-
...rror_8h_1aade00b2e0a9789e3e8bf33441d651455.html | 18 +-
...rror_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html | 24 +-
...rror_8h_1ae5be195e80d32413cbe5e2ad11e146f7.html | 18 +-
...rror_8h_1af1f84686ce5635b3a378567368e89e4d.html | 18 +-
...rror_8h_1afcd5778e656fa2c20aa0b81fbcebc497.html | 18 +-
...tion_8h_1a01777f12f8f99771331d679a0c1d2ed4.html | 39 +-
...tion_8h_1a10bd932564c8e71a3978a061fbb82360.html | 18 +-
...tion_8h_1a14328d95ccda4b1691b9874645aef4bd.html | 18 +-
...ion_8h_1a78c6d17c063fba9ca07175f150838046.html} | 64 +-
...tion_8h_1ae3c016c4bf383aa205b4485edd7ca17c.html | 18 +-
...ion_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html} | 90 +-
...ject_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html | 24 +-
...ject_8h_1a438ff7ee1fc503216d35e156081280c0.html | 18 +-
...ject_8h_1a4ac33631a9b51877808ec7edf010f0d2.html | 18 +-
...ject_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html | 18 +-
...ject_8h_1a9d1c42071de0440f70c7bb5e0bd0f325.html | 18 +-
...ject_8h_1ac593f4065568c8f61cf38d00d585befd.html | 18 +-
ffi/reference/cpp/generated/dir_tvm.html | 18 +-
ffi/reference/cpp/generated/dir_tvm_ffi.html | 18 +-
.../cpp/generated/dir_tvm_ffi_container.html | 18 +-
ffi/reference/cpp/generated/dir_tvm_ffi_extra.html | 27 +-
...reflection.html => dir_tvm_ffi_extra_cuda.html} | 41 +-
.../cpp/generated/dir_tvm_ffi_reflection.html | 18 +-
..._api_8h_1a1925bb5d568a3f5c92a6c28934c9bcc2.html | 18 +-
..._api_8h_1a8eb3fb55f6ec3c46b6e57740af4ca58a.html | 18 +-
..._api_8h_1ad5a608f648c4f86cafdc8dc09f870bc5.html | 18 +-
..._api_8h_1ad6a441d28d4a6406418489609e975a19.html | 18 +-
..._api_8h_1aea0f30bf60e26c1322e525e246ef5be9.html | 18 +-
...type_8h_1a16f66b97fa44d7bd6114324c8b8e1bed.html | 18 +-
...lection_1a9c2cd4d683e7c7065942e36e628a2517.html | 18 +-
.../cpp/generated/file_tvm_ffi_any.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_base_details.h.html | 19 +-
.../cpp/generated/file_tvm_ffi_c_api.h.html | 19 +-
.../cpp/generated/file_tvm_ffi_cast.h.html | 18 +-
.../generated/file_tvm_ffi_container_array.h.html | 19 +-
...file_tvm_ffi_container_container_details.h.html | 18 +-
.../generated/file_tvm_ffi_container_map.h.html | 19 +-
.../generated/file_tvm_ffi_container_shape.h.html | 18 +-
.../generated/file_tvm_ffi_container_tensor.h.html | 18 +-
.../generated/file_tvm_ffi_container_tuple.h.html | 18 +-
.../file_tvm_ffi_container_variant.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_dtype.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_endian.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_error.h.html | 21 +-
.../cpp/generated/file_tvm_ffi_extra_base.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_extra_base64.h.html | 18 +-
.../generated/file_tvm_ffi_extra_c_env_api.h.html | 31 +-
....h.html => file_tvm_ffi_extra_cuda_base.h.html} | 70 +-
... file_tvm_ffi_extra_cuda_cubin_launcher.h.html} | 110 +-
...=> file_tvm_ffi_extra_cuda_device_guard.h.html} | 51 +-
.../cpp/generated/file_tvm_ffi_extra_json.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_extra_module.h.html | 19 +-
.../file_tvm_ffi_extra_serialization.h.html | 18 +-
...string.h.html => file_tvm_ffi_extra_stl.h.html} | 112 +-
.../file_tvm_ffi_extra_structural_equal.h.html | 18 +-
.../file_tvm_ffi_extra_structural_hash.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_function.h.html | 22 +-
.../generated/file_tvm_ffi_function_details.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_memory.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_object.h.html | 19 +-
.../cpp/generated/file_tvm_ffi_optional.h.html | 18 +-
.../file_tvm_ffi_reflection_access_path.h.html | 18 +-
.../file_tvm_ffi_reflection_accessor.h.html | 18 +-
.../file_tvm_ffi_reflection_creator.h.html | 18 +-
.../file_tvm_ffi_reflection_registry.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_rvalue_ref.h.html | 18 +-
.../cpp/generated/file_tvm_ffi_string.h.html | 19 +-
.../cpp/generated/file_tvm_ffi_type_traits.h.html | 19 +-
...tion_8h_1a111e2ed7444eb220e19c7624d0932d89.html | 18 +-
...rray_8h_1a3b56317c7cfb2760cf6c09c303840967.html | 18 +-
...rray_8h_1af5983fd2a31e79635307875b3a216472.html | 18 +-
...se64_8h_1a279b4ba2f4c7ea16291ef24b73e43963.html | 18 +-
...se64_8h_1aa5b2a4531449585b9f079cb170a79f0b.html | 18 +-
...se64_8h_1acb849cdb1d9b9620be10bbcda0257afa.html | 18 +-
...se64_8h_1ae1d4736f7dc56b224acd303ba7bf7a45.html | 18 +-
..._api_8h_1a0d3dcd6ceff356614a6924201c02cf97.html | 18 +-
..._api_8h_1a0ee6d2da9a72749561838bf503f62f93.html | 18 +-
..._api_8h_1a1162f2cbaf1a7628a03ed9488cff858b.html | 18 +-
..._api_8h_1a145f2694254410fd4814541e2cde99c1.html | 18 +-
..._api_8h_1a177d080127ef8f3e338beb7dba4c04fd.html | 18 +-
..._api_8h_1a1a99289a314c6c3de865721bd3efb525.html | 18 +-
..._api_8h_1a1ac76d88e0d79843403ce2e0239d7fe2.html | 18 +-
..._api_8h_1a1dd5584d94f6e00a18f4cfa003dfb93a.html | 18 +-
..._api_8h_1a268d0b5dc89146020c09f77fa0eb8f67.html | 18 +-
..._api_8h_1a31a317a32bfa641180eed1bfb3d5cf01.html | 18 +-
..._api_8h_1a3253bbf35e2ad1361b2ce1de13d2c9b2.html | 18 +-
..._api_8h_1a3479c144d165e717d1464b7b4df84897.html | 18 +-
..._api_8h_1a3bf47f6e1229627902c80217d674ed29.html | 18 +-
..._api_8h_1a3f859b60d99c85f43fce8226c69f3c5e.html | 18 +-
..._api_8h_1a402f64dec7a665f281e55cf946a7481b.html | 18 +-
..._api_8h_1a44604b1d0db208ed82cbc7cf0fd0f47c.html | 18 +-
..._api_8h_1a4ce84fc667040bba425664c78b5f2c69.html | 18 +-
..._api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html | 18 +-
..._api_8h_1a53c5ec2971806966ed96a6add32b5238.html | 18 +-
..._api_8h_1a56ce10d1e6fc2d34a1a496bdace4af33.html | 18 +-
..._api_8h_1a5a7e3fe8a94e066bc1bf897fbf736651.html | 18 +-
..._api_8h_1a63149ed43a6ecffa2146f92914c0bc7b.html | 18 +-
..._api_8h_1a6415c088928d62af8749f3dc57dcf23b.html | 18 +-
..._api_8h_1a724b0d386cf3d50c7d141ca37be19092.html | 18 +-
..._api_8h_1a74c26efdd74840abc3e1581c73a38bfa.html | 18 +-
..._api_8h_1a762fc5c881dc5f66066eb45b65a5781f.html | 18 +-
..._api_8h_1aa26fa16c024c6f2fa15e46aa1333fdb9.html | 18 +-
..._api_8h_1aa2a81275b69ba0f61ce556df85517ef9.html | 18 +-
..._api_8h_1ab691fd5bc4442c631c1f70985a962f50.html | 18 +-
..._api_8h_1aba50ba2cee84b1ef7a718211ab349031.html | 18 +-
..._api_8h_1ac0e2d59d3a8ba7f2b32eac47b1c6fc5d.html | 18 +-
..._api_8h_1ac5a4f48eacde3c69ad3154b6aa39fa3c.html | 18 +-
..._api_8h_1ac64df2793c84fc8ba5d24968d60bcada.html | 18 +-
..._api_8h_1ac66c1d142240be0cdf65c8ba38770eb6.html | 18 +-
..._api_8h_1adaf9a5ab3d30bb3eca58b430f2592fc0.html | 18 +-
..._api_8h_1adec9f8a8f0683caeb9dd194d9a3c62d5.html | 18 +-
..._api_8h_1aedd89f80f73d54dd5904d943dd0690c6.html | 18 +-
..._api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html | 18 +-
..._api_8h_1af108ca4da596c634b4cb9e82c8bec1ce.html | 18 +-
..._api_8h_1af1b8a29eb3f9405982c344f5e572dd65.html | 18 +-
..._api_8h_1afee5a803e22f9baf5ee2ff1f0ace6429.html | 18 +-
..._api_8h_1a0e01ad3ed44c0240f1b76dbed7014234.html | 18 +-
..._api_8h_1a36c15024744584acceaf0233947f9505.html | 18 +-
..._api_8h_1a683191d48d3fdebc98b68f3b717baf6a.html | 18 +-
..._api_8h_1a7451ab18593d70d30a6214d622e200d2.html | 18 +-
..._api_8h_1a8ce2ba89ca1d010a084b4c36ed6b2965.html | 18 +-
..._api_8h_1a9b142b59ab84bc06e4a0f66a3510e8f7.html | 18 +-
..._api_8h_1aaf8960c33546788950b8e35ac18efe39.html | 18 +-
..._api_8h_1abcbbccfc02c57418e757033afce42ece.html | 18 +-
..._api_8h_1ac8f7894c4f205756b7aee01108ab8e84.html | 18 +-
..._api_8h_1ae24b47945440d1c0aca13af13bdaf916.html | 18 +-
...cast_8h_1a3c5fed9bb23b4804b61037c8ac4874f1.html | 18 +-
...cast_8h_1a4dba749dd934d8a7891ad126a8fdcc1f.html | 18 +-
...type_8h_1a8a71c64237efaa13a8d40dfacd6c3165.html | 18 +-
...type_8h_1a94787950883e5a7e97b764ddd342afc3.html | 18 +-
...dian_8h_1ab4e0ed8000c632cd2c7cd089c0a0d1af.html | 18 +-
...json_8h_1a2cd33b0fbc0194eaa803b8a476670587.html | 18 +-
...json_8h_1a86217bda8bfebd85f8265878bc8a59b8.html | 18 +-
..._map_8h_1a611844db41026b7a95846dd316b435af.html | 18 +-
...mory_8h_1a801e8ecc2e3adbc1dac52c714e7cef11.html | 18 +-
...mory_8h_1a8892f2a3cad8dbc51930c464f2ab863b.html | 18 +-
...lection_1a32d91001c82e10566c69e237ab0de50a.html | 18 +-
...lection_1a6b1f837cf822ded72a31f343ce987f4c.html | 18 +-
...lection_1a735285a70c7c4308816450a5b27f03f2.html | 18 +-
...lection_1a80c4984a43d14113b20a67c966833709.html | 18 +-
...lection_1aba4d7fd771bea88a32803dda191b7044.html | 18 +-
...lection_1ac902a725008e348254ee7a2d07c8a95a.html | 18 +-
...lection_1acc0ded3ead1cc6ffc836005d3bb2cc9c.html | 18 +-
...ject_8h_1a0d6e075f219808c4ff7adebd99210a7b.html | 18 +-
...tion_8h_1a24d1febeb5c1026e7fd66dee9dd9915f.html | 18 +-
...tion_8h_1a56baa5d1ca415dbdebf19ac1f54bd5b7.html | 18 +-
...ring_8h_1aa190eed2516ff9a633009cc62f660502.html | 18 +-
...ring_8h_1ad045700080c053c50d68cde298b2b4b2.html | 18 +-
...nsor_8h_1a011d0a2dcbe5702156124d7a7223b3dd.html | 18 +-
...nsor_8h_1a226723176642cde5996498e7da6a6368.html | 18 +-
...nsor_8h_1a65b3a61c540c72d9410150a3a7a76dde.html | 18 +-
...nsor_8h_1a71e4a492b5a03a19a95087771a7e9ed1.html | 18 +-
...nsor_8h_1a93094b6b3f20c2cd5aa1c1c2522bc3e4.html | 18 +-
...nsor_8h_1aa79cf4e1e3873d8947050b3cee41153a.html | 18 +-
...nsor_8h_1aab70a15ca1dde710bc3052c5ce1f6fbd.html | 18 +-
ffi/reference/cpp/generated/index.html | 164 +-
ffi/reference/cpp/generated/namespace_tvm.html | 18 +-
.../cpp/generated/namespace_tvm__ffi.html | 24 +-
.../cpp/generated/namespace_tvm__ffi__json.html | 18 +-
.../generated/namespace_tvm__ffi__reflection.html | 18 +-
.../cpp/generated/namespace_tvm__ffi__symbol.html | 19 +-
.../program_listing_file_tvm_ffi_any.h.html | 18 +-
...rogram_listing_file_tvm_ffi_base_details.h.html | 18 +-
.../program_listing_file_tvm_ffi_c_api.h.html | 20 +-
.../program_listing_file_tvm_ffi_cast.h.html | 18 +-
...ram_listing_file_tvm_ffi_container_array.h.html | 18 +-
...file_tvm_ffi_container_container_details.h.html | 18 +-
...ogram_listing_file_tvm_ffi_container_map.h.html | 21 +-
...ram_listing_file_tvm_ffi_container_shape.h.html | 18 +-
...am_listing_file_tvm_ffi_container_tensor.h.html | 18 +-
...ram_listing_file_tvm_ffi_container_tuple.h.html | 18 +-
...m_listing_file_tvm_ffi_container_variant.h.html | 18 +-
.../program_listing_file_tvm_ffi_dtype.h.html | 18 +-
.../program_listing_file_tvm_ffi_endian.h.html | 18 +-
.../program_listing_file_tvm_ffi_error.h.html | 18 +-
.../program_listing_file_tvm_ffi_extra_base.h.html | 18 +-
...rogram_listing_file_tvm_ffi_extra_base64.h.html | 18 +-
...ram_listing_file_tvm_ffi_extra_c_env_api.h.html | 18 +-
...am_listing_file_tvm_ffi_extra_cuda_base.h.html} | 67 +-
..._file_tvm_ffi_extra_cuda_cubin_launcher.h.html} | 314 ++--
...ng_file_tvm_ffi_extra_cuda_device_guard.h.html} | 78 +-
.../program_listing_file_tvm_ffi_extra_json.h.html | 18 +-
...rogram_listing_file_tvm_ffi_extra_module.h.html | 19 +-
...listing_file_tvm_ffi_extra_serialization.h.html | 18 +-
.../program_listing_file_tvm_ffi_extra_stl.h.html | 1375 +++++++++++++++++
...ting_file_tvm_ffi_extra_structural_equal.h.html | 18 +-
...sting_file_tvm_ffi_extra_structural_hash.h.html | 18 +-
.../program_listing_file_tvm_ffi_function.h.html | 90 +-
...am_listing_file_tvm_ffi_function_details.h.html | 19 +-
.../program_listing_file_tvm_ffi_memory.h.html | 18 +-
.../program_listing_file_tvm_ffi_object.h.html | 18 +-
.../program_listing_file_tvm_ffi_optional.h.html | 18 +-
...ting_file_tvm_ffi_reflection_access_path.h.html | 18 +-
...listing_file_tvm_ffi_reflection_accessor.h.html | 18 +-
..._listing_file_tvm_ffi_reflection_creator.h.html | 18 +-
...listing_file_tvm_ffi_reflection_registry.h.html | 18 +-
.../program_listing_file_tvm_ffi_rvalue_ref.h.html | 18 +-
.../program_listing_file_tvm_ffi_string.h.html | 18 +-
...program_listing_file_tvm_ffi_type_traits.h.html | 18 +-
ffi/reference/cpp/generated/structTVMFFIAny.html | 18 +-
.../cpp/generated/structTVMFFIByteArray.html | 18 +-
.../cpp/generated/structTVMFFIErrorCell.html | 18 +-
.../cpp/generated/structTVMFFIFieldInfo.html | 18 +-
.../cpp/generated/structTVMFFIFunctionCell.html | 18 +-
.../cpp/generated/structTVMFFIMethodInfo.html | 18 +-
.../cpp/generated/structTVMFFIObject.html | 18 +-
.../generated/structTVMFFIOpaqueObjectCell.html | 18 +-
.../cpp/generated/structTVMFFIShapeCell.html | 18 +-
.../cpp/generated/structTVMFFITypeAttrColumn.html | 18 +-
.../cpp/generated/structTVMFFITypeInfo.html | 18 +-
.../cpp/generated/structTVMFFITypeMetadata.html | 18 +-
.../cpp/generated/structTVMFFIVersion.html | 18 +-
.../generated/structtvm_1_1ffi_1_1AnyEqual.html | 18 +-
.../cpp/generated/structtvm_1_1ffi_1_1AnyHash.html | 24 +-
...ml => structtvm_1_1ffi_1_1CUDADeviceGuard.html} | 123 +-
.../structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html | 24 +-
...tructtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html | 18 +-
...tructtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html | 24 +-
.../structtvm_1_1ffi_1_1EnvErrorAlreadySet.html | 24 +-
...structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html | 18 +-
.../structtvm_1_1ffi_1_1ObjectPtrEqual.html | 18 +-
.../structtvm_1_1ffi_1_1ObjectPtrHash.html | 18 +-
..._1_1ffi_1_1ObjectRefWithFallbackTraitsBase.html | 18 +-
.../structtvm_1_1ffi_1_1StaticTypeKey.html | 18 +-
...cttvm_1_1ffi_1_1TypeToFieldStaticTypeIndex.html | 18 +-
...structtvm_1_1ffi_1_1TypeToRuntimeTypeIndex.html | 18 +-
.../generated/structtvm_1_1ffi_1_1UnsafeInit.html | 18 +-
...ItemType.html => structtvm_1_1ffi_1_1dim3.html} | 134 +-
.../structtvm_1_1ffi_1_1is__valid__iterator.html | 18 +-
...valid__iterator_3_01Any_00_01IterType_01_4.html | 18 +-
...3_01Optional_3_01T_01_4_00_01IterType_01_4.html | 18 +-
...m_1_1ffi_1_1reflection_1_1FieldInfoBuilder.html | 18 +-
...tructtvm_1_1ffi_1_1reflection_1_1InfoTrait.html | 18 +-
..._1_1ffi_1_1reflection_1_1MethodInfoBuilder.html | 18 +-
.../structtvm_1_1ffi_1_1reflection_1_1init.html | 18 +-
..._api_8h_1a19fdd3c500a70abb3def842c73694548.html | 18 +-
..._api_8h_1a9eee5afddb1b39723847d67d109c03fe.html | 18 +-
..._api_8h_1aa0abef2444fde82d76337218e5c13b3f.html | 18 +-
..._api_8h_1aba6bf585b03799369fb535db4a5d2e79.html | 18 +-
..._api_8h_1ae22f1a87cbaf7f744d9201948c05d2a5.html | 18 +-
..._api_8h_1aa7abccefa41ac9d3040df689c0c72fa4.html | 18 +-
...json_8h_1a74ca72d0b686c114af683d63e96f2998.html | 18 +-
...json_8h_1a8e808548bb6a99d0a6093ab3e2229ad3.html | 18 +-
...json_8h_1aeb9cdccfbc28034e94e46f9f6bd8d92a.html | 18 +-
...mory_8h_1a65bf625279df21dec5c8097264415113.html | 18 +-
...lection_1a32b044a71a094de492867144ca299c15.html | 18 +-
...lection_1a96513314d45b43eada132d9b96653d9a.html | 18 +-
...ject_8h_1a7ba296d84188e5970ba854332a1f04a6.html | 18 +-
...ject_8h_1ae125f5f5a8a94c7340577c1959805295.html | 18 +-
ffi/reference/cpp/generated/unabridged_orphan.html | 87 +-
...rray_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html | 24 +-
...dule_8h_1a07576e172e0788da4982148edcf53b05.html | 18 +-
...ule_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html} | 48 +-
...dule_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html | 18 +-
...dule_8h_1aae0405c7615139afd4f68b72a862cffe.html | 24 +-
...dule_8h_1ac261d9ce6ffb49dd9878610ce217075e.html | 18 +-
...dule_8h_1ad9c186f1359987cef9278993037b3f66.html | 18 +-
ffi/reference/cpp/index.html | 18 +-
.../python/cpp/generated/tvm_ffi.cpp.build.html | 26 +-
.../cpp/generated/tvm_ffi.cpp.build_inline.html | 36 +-
.../python/cpp/generated/tvm_ffi.cpp.load.html | 20 +-
.../cpp/generated/tvm_ffi.cpp.load_inline.html | 34 +-
...d.html => tvm_ffi.cpp.nvrtc.nvrtc_compile.html} | 166 +-
ffi/reference/python/generated/tvm_ffi.Array.html | 22 +-
.../python/generated/tvm_ffi.DLDeviceType.html | 24 +-
.../python/generated/tvm_ffi.Device_class.html | 24 +-
.../python/generated/tvm_ffi.Function.html | 28 +-
ffi/reference/python/generated/tvm_ffi.Map.html | 22 +-
ffi/reference/python/generated/tvm_ffi.Module.html | 134 +-
ffi/reference/python/generated/tvm_ffi.Object.html | 22 +-
.../generated/tvm_ffi.ObjectConvertible.html | 22 +-
ffi/reference/python/generated/tvm_ffi.Shape.html | 20 +-
.../python/generated/tvm_ffi.StreamContext.html | 22 +-
ffi/reference/python/generated/tvm_ffi.Tensor.html | 26 +-
.../generated/tvm_ffi.access_path.AccessKind.html | 24 +-
.../generated/tvm_ffi.access_path.AccessPath.html | 32 +-
.../generated/tvm_ffi.access_path.AccessStep.html | 28 +-
.../python/generated/tvm_ffi.convert.html | 18 +-
.../python/generated/tvm_ffi.device_function.html | 18 +-
ffi/reference/python/generated/tvm_ffi.dtype.html | 34 +-
.../python/generated/tvm_ffi.from_dlpack.html | 20 +-
.../python/generated/tvm_ffi.get_global_func.html | 18 +-
.../tvm_ffi.get_global_func_metadata.html | 18 +-
.../python/generated/tvm_ffi.get_raw_stream.html | 18 +-
.../python/generated/tvm_ffi.init_ffi_api.html | 18 +-
.../python/generated/tvm_ffi.load_module.html | 18 +-
.../python/generated/tvm_ffi.register_error.html | 18 +-
.../generated/tvm_ffi.register_global_func.html | 18 +-
.../python/generated/tvm_ffi.register_object.html | 18 +-
.../generated/tvm_ffi.remove_global_func.html | 18 +-
.../tvm_ffi.serialization.from_json_graph_str.html | 24 +-
.../tvm_ffi.serialization.to_json_graph_str.html | 18 +-
.../python/generated/tvm_ffi.system_lib.html | 18 +-
.../python/generated/tvm_ffi.use_raw_stream.html | 18 +-
.../python/generated/tvm_ffi.use_torch_stream.html | 18 +-
ffi/reference/python/index.html | 58 +-
ffi/reference/rust/index.html | 18 +-
ffi/search.html | 137 +-
ffi/searchindex.js | 2 +-
453 files changed, 15765 insertions(+), 2799 deletions(-)
diff --git a/ffi/.buildinfo b/ffi/.buildinfo
index f767d49227..d233634bf8 100644
--- a/ffi/.buildinfo
+++ b/ffi/.buildinfo
@@ -1,4 +1,4 @@
# Sphinx build info version 1
# This file records the configuration used when building these files. When it is not found, a full rebuild will be done.
-config: b0ef66ba57dceb419f3dd2f4cc3bd9f8
+config: 98bb29957e8aa479d975c1b03e2b7cfd
tags: 645f666f9bcd5a90fca523b33c5a78b7
diff --git a/ffi/_modules/index.html b/ffi/_modules/index.html
index 303eea819c..5a12c0cae2 100644
--- a/ffi/_modules/index.html
+++ b/ffi/_modules/index.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../_static/documentation_options.js?v=5f86a092"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/index';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -885,6 +964,7 @@ document.write(`
<li><a href="tvm_ffi/container.html">tvm_ffi.container</a></li>
<li><a href="tvm_ffi/core.html">tvm_ffi.core</a></li>
<li><a href="tvm_ffi/cpp/extension.html">tvm_ffi.cpp.extension</a></li>
+<li><a href="tvm_ffi/cpp/nvrtc.html">tvm_ffi.cpp.nvrtc</a></li>
<li><a href="tvm_ffi/error.html">tvm_ffi.error</a></li>
<li><a href="tvm_ffi/module.html">tvm_ffi.module</a></li>
<li><a href="tvm_ffi/registry.html">tvm_ffi.registry</a></li>
@@ -930,7 +1010,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/_convert.html b/ffi/_modules/tvm_ffi/_convert.html
index 2f719e613c..1edf01fe7e 100644
--- a/ffi/_modules/tvm_ffi/_convert.html
+++ b/ffi/_modules/tvm_ffi/_convert.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/_convert';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1061,7 +1140,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/_dtype.html b/ffi/_modules/tvm_ffi/_dtype.html
index cdc76a61aa..495132a5dd 100644
--- a/ffi/_modules/tvm_ffi/_dtype.html
+++ b/ffi/_modules/tvm_ffi/_dtype.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/_dtype';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1278,7 +1357,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/_tensor.html b/ffi/_modules/tvm_ffi/_tensor.html
index 65676bfc61..4a32178f46 100644
--- a/ffi/_modules/tvm_ffi/_tensor.html
+++ b/ffi/_modules/tvm_ffi/_tensor.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/_tensor';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1031,7 +1110,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/access_path.html b/ffi/_modules/tvm_ffi/access_path.html
index 6c9516bf3f..61b70f45dd 100644
--- a/ffi/_modules/tvm_ffi/access_path.html
+++ b/ffi/_modules/tvm_ffi/access_path.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/access_path';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1217,7 +1296,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/container.html b/ffi/_modules/tvm_ffi/container.html
index ef1d7e981a..365d47ab7e 100644
--- a/ffi/_modules/tvm_ffi/container.html
+++ b/ffi/_modules/tvm_ffi/container.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/container';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1304,7 +1383,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/cpp/extension.html b/ffi/_modules/tvm_ffi/cpp/extension.html
index ccc7558533..7541761f8f 100644
--- a/ffi/_modules/tvm_ffi/cpp/extension.html
+++ b/ffi/_modules/tvm_ffi/cpp/extension.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/cpp/extension';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -907,6 +986,7 @@ document.write(`
<span class="kn">from</span><span class="w"> </span><span class="nn">collections.abc</span><span class="w"> </span><span class="kn">import</span> <span class="n">Mapping</span><span class="p">,</span> <span class="n">Sequence</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">contextlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">nullcontext</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">pathlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">Path</span>
+<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Any</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">tvm_ffi.libinfo</span><span class="w"> </span><span class="kn">import</span> <span class="n">find_dlpack_include_path</span><span class="p">,</span> <span class="n">find_include_path</span><span class="p">,</span> <span class="n">find_libtvm_ffi</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">tvm_ffi.module</span><span class="w"> </span><span class="kn">import</span> <span class="n">Module</span><span class="p">,</span> <span class="n">load_module</span>
@@ -925,35 +1005,48 @@ document.write(`
<span class="n">extra_cuda_cflags</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
<span class="n">extra_ldflags</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
<span class="n">extra_include_paths</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
+ <span class="n">embed_cubin</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Generate a unique hash for the given sources and functions."""</span>
<span class="n">m</span> <span class="o">=</span> <span class="n">hashlib</span><span class="o">.</span><span class="n">sha256</span><span class="p">()</span>
- <span class="k">def</span><span class="w"> </span><span class="nf">_maybe_hash_string</span><span class="p">(</span><span class="n">source</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">if</span> <span class="n">source</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
- <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">source</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
-
- <span class="k">def</span><span class="w"> </span><span class="nf">_hash_sequence</span><span class="p">(</span><span class="n">seq</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">seq</span><span class="p">:</span>
- <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">item</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
-
- <span class="k">def</span><span class="w"> </span><span class="nf">_hash_mapping</span><span class="p">(</span><span class="n">mapping</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
- <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">mapping</span><span class="p">):</span>
- <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">key</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
- <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">mapping</span><span class="p">[</span><span class="n">key</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
-
- <span class="n">_maybe_hash_string</span><span class="p">(</span><span class="n">cpp_source</span><span class="p">)</span>
- <span class="n">_maybe_hash_string</span><span class="p">(</span><span class="n">cuda_source</span><span class="p">)</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">cpp_files</span> <span class="ow">or</span> <span class="p">[]))</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">cuda_files</span> <span class="ow">or</span> <span class="p">[]))</span>
- <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">functions</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
- <span class="n">_hash_mapping</span><span class="p">(</span><span class="n">functions</span><span class="p">)</span>
- <span class="k">else</span><span class="p">:</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">functions</span><span class="p">))</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="n">extra_cflags</span><span class="p">)</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="n">extra_cuda_cflags</span><span class="p">)</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="n">extra_ldflags</span><span class="p">)</span>
- <span class="n">_hash_sequence</span><span class="p">(</span><span class="n">extra_include_paths</span><span class="p">)</span>
+ <span class="k">def</span><span class="w"> </span><span class="nf">_hash</span><span class="p">(</span><span class="n">obj</span><span class="p">:</span> <span class="n">Any</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">obj</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s2">"None"</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s2">"str"</span><span class="p">)</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">))</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">):</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s2">"bytes"</span><span class="p">)</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Mapping</span><span class="p">):</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s2">"Mapping"</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">key</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
+ <span class="n">item</span> <span class="o">=</span> <span class="n">obj</span><span class="p">[</span><span class="n">key</span><span class="p">]</span>
+ <span class="n">_hash</span><span class="p">(</span><span class="n">key</span><span class="p">)</span>
+ <span class="n">_hash</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+ <span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">obj</span><span class="p">,</span> <span class="n">Sequence</span><span class="p">):</span>
+ <span class="n">m</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="sa">b</span><span class="s2">"Sequence"</span><span class="p">)</span>
+ <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">obj</span><span class="p">:</span>
+ <span class="n">_hash</span><span class="p">(</span><span class="n">item</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Unsupported type: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="n">_hash</span><span class="p">(</span>
+ <span class="p">(</span>
+ <span class="n">cpp_source</span><span class="p">,</span>
+ <span class="n">cuda_source</span><span class="p">,</span>
+ <span class="nb">sorted</span><span class="p">(</span><span class="n">cpp_files</span><span class="p">)</span> <span class="k">if</span> <span class="n">cpp_files</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="nb">sorted</span><span class="p">(</span><span class="n">cuda_files</span><span class="p">)</span> <span class="k">if</span> <span class="n">cuda_files</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">functions</span><span class="p">,</span>
+ <span class="n">extra_cflags</span><span class="p">,</span>
+ <span class="n">extra_cuda_cflags</span><span class="p">,</span>
+ <span class="n">extra_ldflags</span><span class="p">,</span>
+ <span class="n">extra_include_paths</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="p">,</span>
+ <span class="p">)</span>
+ <span class="p">)</span>
+
<span class="k">return</span> <span class="n">m</span><span class="o">.</span><span class="n">hexdigest</span><span class="p">()[:</span><span class="mi">16</span><span class="p">]</span>
@@ -1087,7 +1180,7 @@ document.write(`
<span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
-<span class="k">def</span><span class="w"> </span><span class="nf">_generate_ninja_build</span><span class="p">(</span> <span class="c1"># noqa: PLR0915</span>
+<span class="k">def</span><span class="w"> </span><span class="nf">_generate_ninja_build</span><span class="p">(</span> <span class="c1"># noqa: PLR0915, PLR0912</span>
<span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
<span class="n">with_cuda</span><span class="p">:</span> <span class="nb">bool</span><span class="p">,</span>
<span class="n">extra_cflags</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
@@ -1096,6 +1189,7 @@ document.write(`
<span class="n">extra_include_paths</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
<span class="n">cpp_files</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
<span class="n">cuda_files</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">],</span>
+ <span class="n">embed_cubin</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Generate the content of build.ninja for building the module."""</span>
<span class="n">default_include_paths</span> <span class="o">=</span> <span class="p">[</span><span class="n">find_include_path</span><span class="p">(),</span> <span class="n">find_dlpack_include_path</span><span class="p">()]</span>
@@ -1135,7 +1229,7 @@ document.write(`
<span class="n">default_cuda_cflags</span> <span class="o">+=</span> <span class="p">[</span><span class="n">_get_cuda_target</span><span class="p">()]</span>
<span class="n">default_ldflags</span> <span class="o">+=</span> <span class="p">[</span>
<span class="s2">"-L</span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">Path</span><span class="p">(</span><span class="n">_find_cuda_home</span><span class="p">())</span> <span class="o">/</span> <span class="s2">"lib64"</span><span class="p">)),</span>
- <span class="s2">"-lcudart"</span><span class="p">,</span>
+ <span class="s2">"-lcudart"</span><span class="p">,</span> <span class="c1"># cuda runtime library</span>
<span class="p">]</span>
<span class="n">cflags</span> <span class="o">=</span> <span class="n">default_cflags</span> <span class="o">+</span> <span class="p">[</span><span class="n">flag</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span> <span class="k">for</span> <span class="n">flag</span> <span class="ow">in</span> <span class="n">extra_cflags</span><span class="p">]</span>
@@ -1181,6 +1275,19 @@ document.write(`
<span class="p">)</span>
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+ <span class="c1"># Add rules for object merging and cubin embedding (Unix only)</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">IS_WINDOWS</span><span class="p">:</span>
+ <span class="k">if</span> <span class="n">embed_cubin</span><span class="p">:</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"rule merge_objects"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">" command = ld -r -o $out $in"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"rule embed_cubin"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
+ <span class="sa">f</span><span class="s2">" command = </span><span class="si">{</span><span class="n">sys</span><span class="o">.</span><span class="n">executable</span><span class="si">}</span><span class="s2"> -m tvm_ffi.utils.embed_cubin --output-obj $out --input-obj $in --cubin $cubin --name $name"</span>
+ <span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"rule link"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">IS_WINDOWS</span><span class="p">:</span>
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">" command = $cxx $in /link $ldflags /out:$out"</span><span class="p">)</span>
@@ -1189,22 +1296,54 @@ document.write(`
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
<span class="c1"># build targets</span>
- <span class="n">link_files</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
+ <span class="n">obj_files</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">cpp_path</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">cpp_files</span><span class="p">)):</span>
<span class="n">obj_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"cpp_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">.o"</span>
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"build </span><span class="si">{}</span><span class="s2">: compile </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj_name</span><span class="p">,</span> <span class="n">cpp_path</span><span class="o">.</span><span class="n">replace</span><span cla [...]
- <span class="n">link_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj_name</span><span class="p">)</span>
+ <span class="n">obj_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj_name</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">cuda_path</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="nb">sorted</span><span class="p">(</span><span class="n">cuda_files</span><span class="p">)):</span>
<span class="n">obj_name</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"cuda_</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">.o"</span>
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">"build </span><span class="si">{}</span><span class="s2">: compile_cuda </span><span class="si">{}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">obj_name</span><span class="p">,</span> <span class="n">cuda_path</span><span class="o">.</span><span class="n">replace</span><sp [...]
- <span class="n">link_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj_name</span><span class="p">)</span>
+ <span class="n">obj_files</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">obj_name</span><span class="p">)</span>
<span class="c1"># Use appropriate extension based on platform</span>
<span class="n">ext</span> <span class="o">=</span> <span class="s2">".dll"</span> <span class="k">if</span> <span class="n">IS_WINDOWS</span> <span class="k">else</span> <span class="s2">".so"</span>
- <span class="n">link_name</span> <span class="o">=</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">link_files</span><span class="p">)</span>
- <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"build </span><span class="si">{</span><span class="n">name</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s2">: link </span><span class="si">{</span><span class="n">link_name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
- <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+
+ <span class="c1"># For Unix systems with embed_cubin, use a 3-step process:</span>
+ <span class="c1"># 1. Merge all object files into a unified object file</span>
+ <span class="c1"># 2. Embed each cubin into the unified object file (chain them)</span>
+ <span class="c1"># 3. Link the final object file into a shared library</span>
+ <span class="k">if</span> <span class="ow">not</span> <span class="n">IS_WINDOWS</span> <span class="ow">and</span> <span class="n">embed_cubin</span><span class="p">:</span>
+ <span class="c1"># Step 1: Merge object files into unified.o</span>
+ <span class="n">unified_obj</span> <span class="o">=</span> <span class="s2">"unified.o"</span>
+ <span class="n">obj_files_str</span> <span class="o">=</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">obj_files</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"build </span><span class="si">{</span><span class="n">unified_obj</span><span class="si">}</span><span class="s2">: merge_objects </span><span class="si">{</span><span class="n">obj_files_str</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+
+ <span class="c1"># Step 2: Chain embed_cubin operations for each cubin</span>
+ <span class="n">current_obj</span> <span class="o">=</span> <span class="n">unified_obj</span>
+ <span class="k">for</span> <span class="n">cubin_name</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">embed_cubin</span><span class="o">.</span><span class="n">keys</span><span class="p">()):</span>
+ <span class="c1"># Create next object file name</span>
+ <span class="n">next_obj</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"unified_with_</span><span class="si">{</span><span class="n">cubin_name</span><span class="si">}</span><span class="s2">.o"</span>
+ <span class="n">cubin_file</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">cubin_name</span><span class="si">}</span><span class="s2">.cubin"</span>
+
+ <span class="c1"># Add ninja build rule</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"build </span><span class="si">{</span><span class="n">next_obj</span><span class="si">}</span><span class="s2">: embed_cubin </span><span class="si">{</span><span class="n">current_obj</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">" cubin = </span><span class="si">{</span><span class="n">cubin_file</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">" name = </span><span class="si">{</span><span class="n">cubin_name</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+
+ <span class="n">current_obj</span> <span class="o">=</span> <span class="n">next_obj</span>
+
+ <span class="c1"># Step 3: Link the final object file</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"build </span><span class="si">{</span><span class="n">name</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s2">: link </span><span class="si">{</span><span class="n">current_obj</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="c1"># Original behavior: directly link object files (for Windows or no cubin embedding)</span>
+ <span class="n">link_files_str</span> <span class="o">=</span> <span class="s2">" "</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">obj_files</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"build </span><span class="si">{</span><span class="n">name</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s2">: link </span><span class="si">{</span><span class="n">link_files_str</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+ <span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
<span class="c1"># default target</span>
<span class="n">ninja</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"default </span><span class="si">{</span><span class="n">name</span><span class="si">}{</span><span class="n">ext</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
@@ -1233,6 +1372,23 @@ document.write(`
<span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">msg</span><span class="p">))</span>
+<span class="c1"># Translation table for escaping C++ string literals</span>
+<span class="n">_CPP_ESCAPE_TABLE</span> <span class="o">=</span> <span class="nb">str</span><span class="o">.</span><span class="n">maketrans</span><span class="p">(</span>
+ <span class="p">{</span>
+ <span class="s2">"</span><span class="se">\\</span><span class="s2">"</span><span class="p">:</span> <span class="s2">"</span><span class="se">\\\\</span><span class="s2">"</span><span class="p">,</span>
+ <span class="s1">'"'</span><span class="p">:</span> <span class="s1">'</span><span class="se">\\</span><span class="s1">"'</span><span class="p">,</span>
+ <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">:</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">n"</span><span class="p">,</span>
+ <span class="s2">"</span><span class="se">\r</span><span class="s2">"</span><span class="p">:</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">r"</span><span class="p">,</span>
+ <span class="s2">"</span><span class="se">\t</span><span class="s2">"</span><span class="p">:</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">t"</span><span class="p">,</span>
+ <span class="p">}</span>
+<span class="p">)</span>
+
+
+<span class="k">def</span><span class="w"> </span><span class="nf">_escape_cpp_string_literal</span><span class="p">(</span><span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">"""Escape special characters for C++ string literals."""</span>
+ <span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="n">translate</span><span class="p">(</span><span class="n">_CPP_ESCAPE_TABLE</span><span class="p">)</span>
+
+
<span class="k">def</span><span class="w"> </span><span class="nf">_decorate_with_tvm_ffi</span><span class="p">(</span><span class="n">source</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">functions</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">str</span><span class="p">])</span> <span class="o">-></span> <span class="nb">str< [...]
<span class="w"> </span><span class="sd">"""Decorate the given source code with TVM FFI export macros."""</span>
<span class="n">sources</span> <span class="o">=</span> <span class="p">[</span>
@@ -1247,7 +1403,11 @@ document.write(`
<span class="k">for</span> <span class="n">func_name</span><span class="p">,</span> <span class="n">func_doc</span> <span class="ow">in</span> <span class="n">functions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="n">sources</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"TVM_FFI_DLL_EXPORT_TYPED_FUNC(</span><span class="si">{</span><span class="n">func_name</span><span class="si">}</span><span class="s2">, </span><span class="si">{</span><span class="n">func_name</span><span class="si">}</span><span class="s2">);"</span><span class="p">)</span>
- <span class="n">_</span> <span class="o">=</span> <span class="n">func_doc</span> <span class="c1"># todo: add support to embed function docstring to the tvm ffi functions.</span>
+
+ <span class="k">if</span> <span class="n">func_doc</span><span class="p">:</span>
+ <span class="c1"># Escape the docstring for C++ string literal</span>
+ <span class="n">escaped_doc</span> <span class="o">=</span> <span class="n">_escape_cpp_string_literal</span><span class="p">(</span><span class="n">func_doc</span><span class="p">)</span>
+ <span class="n">sources</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s1">'TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC(</span><span class="si">{</span><span class="n">func_name</span><span class="si">}</span><span class="s1">, "</span><span class="si">{</span><span class="n">escaped_doc</span><span class="si">}</span><span class="s1">");'</span><span class="p">)</span>
<span class="n">sources</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
@@ -1273,6 +1433,7 @@ document.write(`
<span class="n">extra_include_paths</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">build_directory</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">need_lock</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">True</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Real implementation of build function."""</span>
<span class="c1"># need to resolve the path to make it unique</span>
@@ -1300,12 +1461,24 @@ document.write(`
<span class="n">extra_cuda_cflags_list</span><span class="p">,</span>
<span class="n">extra_ldflags_list</span><span class="p">,</span>
<span class="n">extra_include_paths_list</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">build_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">cache_dir</span><span class="p">)</span><span class="o">.</span><span class="n">expanduser</span><span class="p">()</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">source_hash</ [...]
<span class="k">else</span><span class="p">:</span>
<span class="n">build_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">build_directory</span><span class="p">)</span><span class="o">.</span><span class="n">resolve</span><span class="p">()</span>
<span class="n">build_dir</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">exist_ok</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
+ <span class="c1"># CUBIN embedding is only supported on Unix systems</span>
+ <span class="k">if</span> <span class="n">embed_cubin</span> <span class="ow">and</span> <span class="n">IS_WINDOWS</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="s2">"CUBIN embedding is not yet supported on Windows"</span><span class="p">)</span>
+
+ <span class="c1"># Write CUBIN files to build directory if needed (for Unix systems)</span>
+ <span class="c1"># These will be embedded using the embed_cubin utility during ninja build</span>
+ <span class="k">if</span> <span class="n">embed_cubin</span><span class="p">:</span>
+ <span class="k">for</span> <span class="n">cubin_name</span><span class="p">,</span> <span class="n">cubin_bytes</span> <span class="ow">in</span> <span class="n">embed_cubin</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
+ <span class="n">cubin_path</span> <span class="o">=</span> <span class="n">build_dir</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">cubin_name</span><span class="si">}</span><span class="s2">.cubin"</span>
+ <span class="n">cubin_path</span><span class="o">.</span><span class="n">write_bytes</span><span class="p">(</span><span class="n">cubin_bytes</span><span class="p">)</span>
+
<span class="c1"># generate build.ninja</span>
<span class="n">ninja_source</span> <span class="o">=</span> <span class="n">_generate_ninja_build</span><span class="p">(</span>
<span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span>
@@ -1316,6 +1489,7 @@ document.write(`
<span class="n">extra_include_paths</span><span class="o">=</span><span class="n">extra_include_paths_list</span><span class="p">,</span>
<span class="n">cpp_files</span><span class="o">=</span><span class="n">cpp_path_list</span><span class="p">,</span>
<span class="n">cuda_files</span><span class="o">=</span><span class="n">cuda_path_list</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="o">=</span><span class="n">embed_cubin</span><span class="p">,</span>
<span class="p">)</span>
<span class="c1"># may not hold lock when build_directory is specified, prevent deadlock</span>
@@ -1342,6 +1516,7 @@ document.write(`
<span class="n">extra_ldflags</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">extra_include_paths</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">build_directory</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-></span> <span class="nb">str</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Compile and build a C++/CUDA module from inline source code.</span>
@@ -1378,11 +1553,12 @@ document.write(`
<span class="sd"> The CUDA source code. It can be a list of sources or a single source.</span>
<span class="sd"> functions</span>
<span class="sd"> The functions in cpp_sources or cuda_source that will be exported to the tvm ffi module. When a mapping is</span>
-<span class="sd"> given, the keys are the names of the exported functions, and the values are docstrings for the functions. When</span>
-<span class="sd"> a sequence or a single string is given, they are the functions needed to be exported, and the docstrings are set</span>
-<span class="sd"> to empty strings. A single function name can also be given as a string. When cpp_sources is given, the functions</span>
-<span class="sd"> must be declared (not necessarily defined) in the cpp_sources. When cpp_sources is not given, the functions</span>
-<span class="sd"> must be defined in the cuda_sources. If not specified, no function will be exported.</span>
+<span class="sd"> given, the keys are the names of the exported functions, and the values are docstrings for the functions</span>
+<span class="sd"> (use an empty string to skip documentation for specific functions). When a sequence or a single string is given, they are</span>
+<span class="sd"> the functions needed to be exported, and the docstrings are set to empty strings. A single function name can</span>
+<span class="sd"> also be given as a string. When cpp_sources is given, the functions must be declared (not necessarily defined)</span>
+<span class="sd"> in the cpp_sources. When cpp_sources is not given, the functions must be defined in the cuda_sources. If not</span>
+<span class="sd"> specified, no function will be exported.</span>
<span class="sd"> extra_cflags</span>
<span class="sd"> The extra compiler flags for C++ compilation.</span>
<span class="sd"> The default flags are:</span>
@@ -1408,6 +1584,13 @@ document.write(`
<span class="sd"> cache directory is ``~/.cache/tvm-ffi``. You can also set the ``TVM_FFI_CACHE_DIR`` environment variable to</span>
<span class="sd"> specify the cache directory.</span>
+<span class="sd"> embed_cubin: Mapping[str, bytes], optional</span>
+<span class="sd"> A mapping from CUBIN module names to CUBIN binary data. TVM-FFI provides a macro `TVM_FFI_EMBED_CUBIN(name)` to embed</span>
+<span class="sd"> CUBIN data into the compiled shared library. The keys should match the names used in `TVM_FFI_EMBED_CUBIN(name)` calls</span>
+<span class="sd"> in the C++ source code. The values are the CUBIN binary data bytes. The embedded CUBIN kernels can be accessed by</span>
+<span class="sd"> the macro `TVM_FFI_EMBED_CUBIN_GET_KERNEL(name, kernel_name)` defined in the `tvm/ffi/extra/cuda/cubin_launcher.h` header.</span>
+<span class="sd"> See the `examples/cubin_launcher` directory for examples how to use cubin launcher to launch CUBIN kernels in TVM-FFI.</span>
+
<span class="sd"> Returns</span>
<span class="sd"> -------</span>
<span class="sd"> lib_path: str</span>
@@ -1486,7 +1669,6 @@ document.write(`
<span class="k">else</span><span class="p">:</span>
<span class="n">cpp_source</span> <span class="o">=</span> <span class="n">_decorate_with_tvm_ffi</span><span class="p">(</span><span class="n">cpp_source</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">cuda_source</span> <span class="o">=</span> <span class="n">_decorate_with_tvm_ffi</span><span class="p">(</span><span class="n">cuda_source</span><span class="p">,</span> <span class="n">function_map</span><span class="p">)</span>
-
<span class="c1"># determine the cache dir for the built module</span>
<span class="n">build_dir</span><span class="p">:</span> <span class="n">Path</span>
<span class="k">if</span> <span class="n">build_directory</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
@@ -1501,6 +1683,7 @@ document.write(`
<span class="n">extra_cuda_cflags_list</span><span class="p">,</span>
<span class="n">extra_ldflags_list</span><span class="p">,</span>
<span class="n">extra_include_paths_list</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="p">,</span>
<span class="p">)</span>
<span class="n">build_dir</span> <span class="o">=</span> <span class="n">Path</span><span class="p">(</span><span class="n">cache_dir</span><span class="p">)</span><span class="o">.</span><span class="n">expanduser</span><span class="p">()</span> <span class="o">/</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">name</span><span class="si">}</span><span class="s2">_</span><span class="si">{</span><span class="n">source_hash</ [...]
<span class="k">else</span><span class="p">:</span>
@@ -1526,6 +1709,7 @@ document.write(`
<span class="n">extra_include_paths</span><span class="o">=</span><span class="n">extra_include_paths_list</span><span class="p">,</span>
<span class="n">build_directory</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">build_dir</span><span class="p">),</span>
<span class="n">need_lock</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="c1"># already hold the lock</span>
+ <span class="n">embed_cubin</span><span class="o">=</span><span class="n">embed_cubin</span><span class="p">,</span>
<span class="p">)</span></div>
@@ -1543,6 +1727,7 @@ document.write(`
<span class="n">extra_ldflags</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">extra_include_paths</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="n">build_directory</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="p">:</span> <span class="n">Mapping</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
<span class="p">)</span> <span class="o">-></span> <span class="n">Module</span><span class="p">:</span>
<span class="w"> </span><span class="sd">"""Compile, build and load a C++/CUDA module from inline source code.</span>
@@ -1579,11 +1764,12 @@ document.write(`
<span class="sd"> The CUDA source code. It can be a list of sources or a single source.</span>
<span class="sd"> functions: Mapping[str, str] | Sequence[str] | str, optional</span>
<span class="sd"> The functions in cpp_sources or cuda_source that will be exported to the tvm ffi module. When a mapping is</span>
-<span class="sd"> given, the keys are the names of the exported functions, and the values are docstrings for the functions. When</span>
-<span class="sd"> a sequence or a single string is given, they are the functions needed to be exported, and the docstrings are set</span>
-<span class="sd"> to empty strings. A single function name can also be given as a string. When cpp_sources is given, the functions</span>
-<span class="sd"> must be declared (not necessarily defined) in the cpp_sources. When cpp_sources is not given, the functions</span>
-<span class="sd"> must be defined in the cuda_sources. If not specified, no function will be exported.</span>
+<span class="sd"> given, the keys are the names of the exported functions, and the values are docstrings for the functions</span>
+<span class="sd"> (use an empty string to skip documentation for specific functions). When a sequence or a single string is given, they are</span>
+<span class="sd"> the functions needed to be exported, and the docstrings are set to empty strings. A single function name can</span>
+<span class="sd"> also be given as a string. When cpp_sources is given, the functions must be declared (not necessarily defined)</span>
+<span class="sd"> in the cpp_sources. When cpp_sources is not given, the functions must be defined in the cuda_sources. If not</span>
+<span class="sd"> specified, no function will be exported.</span>
<span class="sd"> extra_cflags: Sequence[str], optional</span>
<span class="sd"> The extra compiler flags for C++ compilation.</span>
<span class="sd"> The default flags are:</span>
@@ -1609,6 +1795,11 @@ document.write(`
<span class="sd"> cache directory is ``~/.cache/tvm-ffi``. You can also set the ``TVM_FFI_CACHE_DIR`` environment variable to</span>
<span class="sd"> specify the cache directory.</span>
+<span class="sd"> embed_cubin: Mapping[str, bytes], optional</span>
+<span class="sd"> A mapping from CUBIN module names to CUBIN binary data. When provided, the CUBIN data will be embedded</span>
+<span class="sd"> into the compiled shared library using objcopy, making it accessible via the TVM_FFI_EMBED_CUBIN macro.</span>
+<span class="sd"> The keys should match the names used in TVM_FFI_EMBED_CUBIN calls in the C++ source code.</span>
+
<span class="sd"> Returns</span>
<span class="sd"> -------</span>
<span class="sd"> mod: Module</span>
@@ -1665,6 +1856,7 @@ document.write(`
<span class="n">extra_ldflags</span><span class="o">=</span><span class="n">extra_ldflags</span><span class="p">,</span>
<span class="n">extra_include_paths</span><span class="o">=</span><span class="n">extra_include_paths</span><span class="p">,</span>
<span class="n">build_directory</span><span class="o">=</span><span class="n">build_directory</span><span class="p">,</span>
+ <span class="n">embed_cubin</span><span class="o">=</span><span class="n">embed_cubin</span><span class="p">,</span>
<span class="p">)</span>
<span class="p">)</span></div>
@@ -1991,7 +2183,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/cpp/nvrtc.html b/ffi/_modules/tvm_ffi/cpp/nvrtc.html
new file mode 100644
index 0000000000..02b24c984f
--- /dev/null
+++ b/ffi/_modules/tvm_ffi/cpp/nvrtc.html
@@ -0,0 +1,1228 @@
+
+<!DOCTYPE html>
+
+
+<html lang="en" data-content_root="../../../" >
+
+ <head>
+ <meta charset="utf-8" />
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
+ <title>tvm_ffi.cpp.nvrtc — tvm-ffi</title>
+
+
+
+ <script data-cfasync="false">
+ document.documentElement.dataset.mode = localStorage.getItem("mode") || "";
+ document.documentElement.dataset.theme = localStorage.getItem("theme") || "";
+ </script>
+
+ <!-- Loaded before other Sphinx assets -->
+ <link href="../../../_static/styles/theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../../_static/styles/bootstrap.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+<link href="../../../_static/styles/pydata-sphinx-theme.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+
+
+ <link href="../../../_static/vendor/fontawesome/6.5.2/css/all.min.css?digest=dfe6caa3a7d634c4db9b" rel="stylesheet" />
+ <link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.2/webfonts/fa-solid-900.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.2/webfonts/fa-brands-400.woff2" />
+<link rel="preload" as="font" type="font/woff2" crossorigin href="../../../_static/vendor/fontawesome/6.5.2/webfonts/fa-regular-400.woff2" />
+
+ <link rel="stylesheet" type="text/css" href="../../../_static/pygments.css?v=03e43079" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/styles/sphinx-book-theme.css?v=eba8b062" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/copybutton.css?v=76b2166b" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/sphinx-design.min.css?v=95c83b7e" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/collapsible-lists/css/tree_view.css?v=a885cde7" />
+ <link rel="stylesheet" type="text/css" href="../../../_static/custom.css?v=38aa6179" />
+
+ <!-- Pre-loaded scripts that we'll load fully later -->
+ <link rel="preload" as="script" href="../../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b" />
+<link rel="preload" as="script" href="../../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
+ <script src="../../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+ <script src="../../../_static/documentation_options.js?v=5f86a092"></script>
+ <script src="../../../_static/doctools.js?v=9bcbadda"></script>
+ <script src="../../../_static/sphinx_highlight.js?v=dc90522c"></script>
+ <script src="../../../_static/clipboard.min.js?v=a7894cd8"></script>
+ <script src="../../../_static/copybutton.js?v=f281be69"></script>
+ <script src="../../../_static/scripts/sphinx-book-theme.js?v=887ef09a"></script>
+ <script src="../../../_static/design-tabs.js?v=f930bc37"></script>
+ <script src="../../../_static/collapsible-lists/js/CollapsibleLists.compressed.js?v=73120307"></script>
+ <script src="../../../_static/collapsible-lists/js/apply-collapsible-lists.js?v=660e4f45"></script>
+ <script crossorigin="anonymous" integrity="sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=" src="../../../_static/downloads/require.min.js"></script>
+ <script type="module" src="../../../_static/downloads/mermaid.esm.min.mjs"></script>
+ <script type="module" src="../../../_static/downloads/mermaid-layout-elk.esm.min.mjs"></script>
+ <script type="module">import mermaid from "../../../_static/downloads/mermaid.esm.min.mjs";import elkLayouts from "../../../_static/downloads/mermaid-layout-elk.esm.min.mjs";mermaid.registerLayoutLoaders(elkLayouts);mermaid.initialize({startOnLoad:false});</script>
+ <script src="../../../_static/downloads/d3.min.js"></script>
+ <script type="module">import mermaid from "../../../_static/downloads/mermaid.esm.min.mjs";
+
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
+ width: 100%;
+}
+
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
+.mermaid-fullscreen-btn {
+ width: 28px;
+ height: 28px;
+ background: rgba(255, 255, 255, 0.95);
+ border: 1px solid rgba(0, 0, 0, 0.3);
+ border-radius: 4px;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ transition: all 0.2s;
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.2);
+ font-size: 14px;
+ line-height: 1;
+ padding: 0;
+ color: #333;
+}
+
+.mermaid-fullscreen-btn:hover {
+ opacity: 100% !important;
+ background: rgba(255, 255, 255, 1);
+ box-shadow: 0 3px 10px rgba(0, 0, 0, 0.3);
+ transform: scale(1.1);
+}
+
+.mermaid-fullscreen-btn.dark-theme {
+ background: rgba(50, 50, 50, 0.95);
+ border: 1px solid rgba(255, 255, 255, 0.3);
+ color: #e0e0e0;
+}
+
+.mermaid-fullscreen-btn.dark-theme:hover {
+ background: rgba(60, 60, 60, 1);
+ box-shadow: 0 3px 10px rgba(255, 255, 255, 0.2);
+}
+
+.mermaid-fullscreen-modal {
+ display: none;
+ position: fixed !important;
+ top: 0 !important;
+ left: 0 !important;
+ width: 95vw;
+ height: 100vh;
+ background: rgba(255, 255, 255, 0.98);
+ z-index: 9999;
+ padding: 20px;
+ overflow: auto;
+}
+
+.mermaid-fullscreen-modal.dark-theme {
+ background: rgba(0, 0, 0, 0.98);
+}
+
+.mermaid-fullscreen-modal.active {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.mermaid-container-fullscreen {
+ position: relative;
+ width: 95vw;
+ height: 90vh;
+ max-width: 95vw;
+ max-height: 90vh;
+ background: white;
+ border-radius: 8px;
+ padding: 20px;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
+ overflow: auto;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.mermaid-container-fullscreen.dark-theme {
+ background: #1a1a1a;
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
+}
+
+.mermaid-container-fullscreen pre.mermaid {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
+ cursor: grab;
+}
+
+.mermaid-fullscreen-close {
+ position: fixed !important;
+ top: 20px !important;
+ right: 20px !important;
+ width: 40px;
+ height: 40px;
+ background: rgba(255, 255, 255, 0.95);
+ border: 1px solid rgba(0, 0, 0, 0.2);
+ border-radius: 50%;
+ cursor: pointer;
+ z-index: 10000;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
+ transition: all 0.2s;
+ font-size: 24px;
+ line-height: 1;
+ color: #333;
+}
+
+.mermaid-fullscreen-close:hover {
+ background: white;
+ box-shadow: 0 6px 16px rgba(0, 0, 0, 0.4);
+ transform: scale(1.1);
+}
+
+.mermaid-fullscreen-close.dark-theme {
+ background: rgba(50, 50, 50, 0.95);
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ color: #e0e0e0;
+}
+
+.mermaid-fullscreen-close.dark-theme:hover {
+ background: rgba(60, 60, 60, 1);
+ box-shadow: 0 6px 16px rgba(255, 255, 255, 0.2);
+}
+
+.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
+ display: none !important;
+}`;
+document.head.appendChild(fullscreenStyle);
+
+// Detect if page has dark background
+const isDarkTheme = () => {
+ const bgColor = window.getComputedStyle(document.body).backgroundColor;
+ const match = bgColor.match(/rgb\((\d+),\s*(\d+),\s*(\d+)/);
+ if (match) {
+ const r = parseInt(match[1]);
+ const g = parseInt(match[2]);
+ const b = parseInt(match[3]);
+ const brightness = (r * 299 + g * 587 + b * 114) / 1000;
+ return brightness < 128;
+ }
+ return false;
+};
+
+const load = async () => {
+ await mermaid.run();
+
+ const all_mermaids = document.querySelectorAll(".mermaid");
+ const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
+
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
+ // Wait for mermaid to process all diagrams
+ setTimeout(load, 200);
+ return;
+ }
+
+ const darkTheme = isDarkTheme();
+
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
+ const modal = document.createElement('div');
+ modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
+ modal.setAttribute('role', 'dialog');
+ modal.setAttribute('aria-modal', 'true');
+ modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
+ modal.innerHTML = `
+ <button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
+ `;
+ document.body.appendChild(modal);
+
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
+ const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
+ const closeModal = () => {
+ modal.classList.remove('active');
+ modalContent.innerHTML = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
+ };
+
+ closeBtn.addEventListener('click', closeModal);
+ modal.addEventListener('click', (e) => {
+ if (e.target === modal) closeModal();
+ });
+ document.addEventListener('keydown', (e) => {
+ if (e.key === 'Escape' && modal.classList.contains('active')) {
+ closeModal();
+ }
+ });
+
+ const allButtons = [];
+
+ document.querySelectorAll('.mermaid').forEach((mermaidDiv) => {
+ if (mermaidDiv.parentNode.classList.contains('mermaid-container') ||
+ mermaidDiv.closest('.mermaid-fullscreen-modal')) {
+ return;
+ }
+
+ const container = document.createElement('div');
+ container.className = 'mermaid-container';
+ mermaidDiv.parentNode.insertBefore(container, mermaidDiv);
+ container.appendChild(mermaidDiv);
+
+ const fullscreenBtn = document.createElement('button');
+ fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
+ fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
+ fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
+
+ // Calculate dynamic position based on diagram's margin and padding
+ const diagramStyle = window.getComputedStyle(mermaidDiv);
+ const marginTop = parseFloat(diagramStyle.marginTop) || 0;
+ const marginRight = parseFloat(diagramStyle.marginRight) || 0;
+ const paddingTop = parseFloat(diagramStyle.paddingTop) || 0;
+ const paddingRight = parseFloat(diagramStyle.paddingRight) || 0;
+ fullscreenBtn.style.top = `${marginTop + paddingTop + 4}px`;
+ fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
+
+ fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
+ const clone = mermaidDiv.cloneNode(true);
+ modalContent.innerHTML = '';
+ modalContent.appendChild(clone);
+
+ const svg = clone.querySelector('svg');
+ if (svg) {
+ svg.removeAttribute('width');
+ svg.removeAttribute('height');
+ svg.style.width = '100%';
+ svg.style.height = 'auto';
+ svg.style.maxWidth = '100%';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
+ }
+
+ modal.classList.add('active');
+ document.body.style.overflow = 'hidden';
+ });
+
+ container.appendChild(fullscreenBtn);
+ allButtons.push(fullscreenBtn);
+ });
+
+ // Update theme classes when theme changes
+ const updateTheme = () => {
+ const dark = isDarkTheme();
+ allButtons.forEach(btn => {
+ if (dark) {
+ btn.classList.add('dark-theme');
+ } else {
+ btn.classList.remove('dark-theme');
+ }
+ });
+ if (dark) {
+ modal.classList.add('dark-theme');
+ modalContent.classList.add('dark-theme');
+ closeBtn.classList.add('dark-theme');
+ } else {
+ modal.classList.remove('dark-theme');
+ modalContent.classList.remove('dark-theme');
+ closeBtn.classList.remove('dark-theme');
+ }
+ };
+
+ // Watch for theme changes
+ const observer = new MutationObserver(updateTheme);
+ observer.observe(document.documentElement, {
+ attributes: true,
+ attributeFilter: ['class', 'style', 'data-theme']
+ });
+ observer.observe(document.body, {
+ attributes: true,
+ attributeFilter: ['class', 'style']
+ });
+};
+
+window.addEventListener("load", load);
+</script>
+ <script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/cpp/nvrtc';</script>
+ <link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
+ <link rel="index" title="Index" href="../../../genindex.html" />
+ <link rel="search" title="Search" href="../../../search.html" />
+ <meta name="viewport" content="width=device-width, initial-scale=1"/>
+ <meta name="docsearch:language" content="en"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
+ </head>
+
+
+ <body data-bs-spy="scroll" data-bs-target=".bd-toc-nav" data-offset="180" data-bs-root-margin="0px 0px -60%" data-default-mode="">
+
+
+
+ <div id="pst-skip-link" class="skip-link d-print-none"><a href="#main-content">Skip to main content</a></div>
+
+ <div id="pst-scroll-pixel-helper"></div>
+
+ <button type="button" class="btn rounded-pill" id="pst-back-to-top">
+ <i class="fa-solid fa-arrow-up"></i>Back to top</button>
+
+
+ <input type="checkbox"
+ class="sidebar-toggle"
+ id="pst-primary-sidebar-checkbox"/>
+ <label class="overlay overlay-primary" for="pst-primary-sidebar-checkbox"></label>
+
+ <input type="checkbox"
+ class="sidebar-toggle"
+ id="pst-secondary-sidebar-checkbox"/>
+ <label class="overlay overlay-secondary" for="pst-secondary-sidebar-checkbox"></label>
+
+ <div class="search-button__wrapper">
+ <div class="search-button__overlay"></div>
+ <div class="search-button__search-container">
+<form class="bd-search d-flex align-items-center"
+ action="../../../search.html"
+ method="get">
+ <i class="fa-solid fa-magnifying-glass"></i>
+ <input type="search"
+ class="form-control"
+ name="q"
+ id="search-input"
+ placeholder="Search..."
+ aria-label="Search..."
+ autocomplete="off"
+ autocorrect="off"
+ autocapitalize="off"
+ spellcheck="false"/>
+ <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd>K</kbd></span>
+</form></div>
+ </div>
+
+ <div class="pst-async-banner-revealer d-none">
+ <aside id="bd-header-version-warning" class="d-none d-print-none" aria-label="Version warning"></aside>
+</div>
+
+
+ <header class="bd-header navbar navbar-expand-lg bd-navbar d-print-none">
+ </header>
+
+
+ <div class="bd-container">
+ <div class="bd-container__inner bd-page-width">
+
+
+
+
+
+ <div class="bd-sidebar-primary bd-sidebar">
+
+
+
+ <div class="sidebar-header-items sidebar-primary__section">
+
+
+
+
+ </div>
+
+ <div class="sidebar-primary-items__start sidebar-primary__section">
+ <div class="sidebar-primary-item">
+
+
+
+
+
+<a class="navbar-brand logo" href="../../../index.html">
+
+
+
+
+
+
+ <p class="title logo__title">tvm-ffi</p>
+
+</a></div>
+ <div class="sidebar-primary-item">
+
+ <script>
+ document.write(`
+ <button class="btn search-button-field search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+ <i class="fa-solid fa-magnifying-glass"></i>
+ <span class="search-button__default-text">Search</span>
+ <span class="search-button__kbd-shortcut"><kbd class="kbd-shortcut__modifier">Ctrl</kbd>+<kbd class="kbd-shortcut__modifier">K</kbd></span>
+ </button>
+ `);
+ </script></div>
+ <div class="sidebar-primary-item"><nav class="bd-links bd-docs-nav" aria-label="Main">
+ <div class="bd-toc-item navbar-nav active">
+ <p aria-level="2" class="caption" role="heading"><span class="caption-text">Get Started</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../../get_started/quickstart.html">Quick Start</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../get_started/stable_c_abi.html">Stable C ABI</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">Guides</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/python_packaging.html">Python Binding and Packaging</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/cpp_packaging.html">C++ Packaging and Distribution</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/cpp_guide.html">C++ Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/python_guide.html">Python Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/compiler_integration.html">Compiler Integration</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/build_from_source.html">Build from Source</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">Concepts</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1"><a class="reference internal" href="../../../concepts/abi_overview.html">ABI Overview</a></li>
+</ul>
+<p aria-level="2" class="caption" role="heading"><span class="caption-text">Reference</span></p>
+<ul class="nav bd-sidenav">
+<li class="toctree-l1 has-children"><a class="reference internal" href="../../../reference/python/index.html">Python API</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Object.html">tvm_ffi.Object</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Tensor.html">tvm_ffi.Tensor</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.from_dlpack.html">tvm_ffi.from_dlpack</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Shape.html">tvm_ffi.Shape</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.dtype.html">tvm_ffi.dtype</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Device_class.html">tvm_ffi.Device</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.DLDeviceType.html">tvm_ffi.DLDeviceType</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.device_function.html">tvm_ffi.device</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Function.html">tvm_ffi.Function</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Module.html">tvm_ffi.Module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.system_lib.html">tvm_ffi.system_lib</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.load_module.html">tvm_ffi.load_module</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Array.html">tvm_ffi.Array</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.Map.html">tvm_ffi.Map</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.register_error.html">tvm_ffi.register_error</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.register_object.html">tvm_ffi.register_object</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.register_global_func.html">tvm_ffi.register_global_func</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.get_global_func.html">tvm_ffi.get_global_func</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.get_global_func_metadata.html">tvm_ffi.get_global_func_metadata</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.init_ffi_api.html">tvm_ffi.init_ffi_api</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.remove_global_func.html">tvm_ffi.remove_global_func</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.StreamContext.html">tvm_ffi.StreamContext</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.use_torch_stream.html">tvm_ffi.use_torch_stream</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.use_raw_stream.html">tvm_ffi.use_raw_stream</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.get_raw_stream.html">tvm_ffi.get_raw_stream</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.load_inline.html">tvm_ffi.cpp.load_inline</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.access_path.AccessPath.html">tvm_ffi.access_path.AccessPath</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.access_path.AccessStep.html">tvm_ffi.access_path.AccessStep</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.convert.html">tvm_ffi.convert</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../../reference/python/generated/tvm_ffi.ObjectConvertible.html">tvm_ffi.ObjectConvertible</a></li>
+</ul>
+</details></li>
+<li class="toctree-l1 has-children"><a class="reference internal" href="../../../reference/cpp/index.html">C++ API</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
+<li class="toctree-l2 has-children"><a class="reference internal" href="../../../reference/cpp/generated/index.html">Full API Index</a><details><summary><span class="toctree-toggle" role="presentation"><i class="fa-solid fa-chevron-down"></i></span></summary><ul>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/namespace_tvm.html">Namespace tvm</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/namespace_tvm__ffi.html">Namespace tvm::ffi</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/namespace_tvm__ffi__json.html">Namespace tvm::ffi::json</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/namespace_tvm__ffi__reflection.html">Namespace tvm::ffi::reflection</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator_3_01Any_00_01IterType_01_4.html">Template Struct is_valid_iterator< Any, IterType ></a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator_3_01Optional_3_01T_01_4_00_01IterType_01_4.html">Template Struct is_valid_iterator< Optional< T >, IterType ></a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1ObjectPtrEqual.html">Struct ObjectPtrEqual</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1ObjectPtrHash.html">Struct ObjectPtrHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1ObjectRefWithFallbackTraitsBase.html">Template Struct ObjectRefWithFallbackTraitsBase</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1reflection_1_1FieldInfoBuilder.html">Struct FieldInfoBuilder</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1reflection_1_1InfoTrait.html">Struct InfoTrait</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1reflection_1_1init.html">Template Struct init</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1reflection_1_1MethodInfoBuilder.html">Struct MethodInfoBuilder</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1StaticTypeKey.html">Struct StaticTypeKey</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1TypeToFieldStaticTypeIndex.html">Template Struct TypeToFieldStaticTypeIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1TypeToRuntimeTypeIndex.html">Template Struct TypeToRuntimeTypeIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structtvm_1_1ffi_1_1UnsafeInit.html">Struct UnsafeInit</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIAny.html">Struct TVMFFIAny</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIByteArray.html">Struct TVMFFIByteArray</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIErrorCell.html">Struct TVMFFIErrorCell</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIFieldInfo.html">Struct TVMFFIFieldInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIFunctionCell.html">Struct TVMFFIFunctionCell</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIMethodInfo.html">Struct TVMFFIMethodInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIObject.html">Struct TVMFFIObject</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIOpaqueObjectCell.html">Struct TVMFFIOpaqueObjectCell</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIShapeCell.html">Struct TVMFFIShapeCell</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFITypeAttrColumn.html">Struct TVMFFITypeAttrColumn</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFITypeInfo.html">Struct TVMFFITypeInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFITypeMetadata.html">Struct TVMFFITypeMetadata</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/structTVMFFIVersion.html">Struct TVMFFIVersion</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Any.html">Class Any</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1AnyView.html">Class AnyView</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Function.html">Class Function</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1FunctionObj.html">Class FunctionObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Map.html">Template Class Map</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1MapObj.html">Class MapObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Module.html">Class Module</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ModuleObj.html">Class ModuleObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Object.html">Class Object</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ObjectPtr.html">Template Class ObjectPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ObjectRef.html">Class ObjectRef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Optional.html">Template Class Optional</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1PackedArgs.html">Class PackedArgs</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1AccessPath.html">Class AccessPath</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1AccessPathObj.html">Class AccessPathObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1AccessStep.html">Class AccessStep</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1AccessStepObj.html">Class AccessStepObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1AttachFieldFlag.html">Class AttachFieldFlag</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1DefaultValue.html">Class DefaultValue</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1FieldGetter.html">Class FieldGetter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1FieldSetter.html">Class FieldSetter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1GlobalDef.html">Class GlobalDef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1Metadata.html">Class Metadata</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1ObjectCreator.html">Class ObjectCreator</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1ObjectDef.html">Template Class ObjectDef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1TypeAttrColumn.html">Class TypeAttrColumn</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1TypeAttrDef.html">Template Class TypeAttrDef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1RValueRef.html">Template Class RValueRef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Shape.html">Class Shape</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ShapeObj.html">Class ShapeObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1ShapeView.html">Class ShapeView</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1SmallMapObj.html">Class SmallMapObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1StrictBool.html">Class StrictBool</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1String.html">Class String</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1StructuralEqual.html">Class StructuralEqual</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1StructuralHash.html">Class StructuralHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Tensor.html">Class Tensor</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1TensorObj.html">Class TensorObj</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1TensorView.html">Class TensorView</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Tuple.html">Template Class Tuple</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1TypedFunction.html">Template Class TypedFunction</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1TypedFunction_3_01R_07Args_8_8_8_08_4.html">Template Class TypedFunction< R(Args…) ></a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1Variant.html">Template Class Variant</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/classtvm_1_1ffi_1_1WeakObjectPtr.html">Template Class WeakObjectPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_dtype_8h_1a16f66b97fa44d7bd6114324c8b8e1bed.html">Enum DLExtDataTypeCode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_namespacetvm_1_1ffi_1_1reflection_1a9c2cd4d683e7c7065942e36e628a2517.html">Enum AccessKind</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_c__api_8h_1ad6a441d28d4a6406418489609e975a19.html">Enum TVMFFIBacktraceUpdateMode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_c__api_8h_1ad5a608f648c4f86cafdc8dc09f870bc5.html">Enum TVMFFIFieldFlagBitMask</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_c__api_8h_1a8eb3fb55f6ec3c46b6e57740af4ca58a.html">Enum TVMFFIObjectDeleterFlagBitMask</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_c__api_8h_1aea0f30bf60e26c1322e525e246ef5be9.html">Enum TVMFFISEqHashKind</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/enum_c__api_8h_1a1925bb5d568a3f5c92a6c28934c9bcc2.html">Enum TVMFFITypeIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_base64_8h_1ae1d4736f7dc56b224acd303ba7bf7a45.html">Function tvm::ffi::Base64Decode(TVMFFIByteArray)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_base64_8h_1acb849cdb1d9b9620be10bbcda0257afa.html">Function tvm::ffi::Base64Decode(const String&)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_base64_8h_1aa5b2a4531449585b9f079cb170a79f0b.html">Function tvm::ffi::Base64Encode(TVMFFIByteArray)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_base64_8h_1a279b4ba2f4c7ea16291ef24b73e43963.html">Function tvm::ffi::Base64Encode(const Bytes&)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_endian_8h_1ab4e0ed8000c632cd2c7cd089c0a0d1af.html">Function tvm::ffi::ByteSwap</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_array_8h_1af5983fd2a31e79635307875b3a216472.html">Template Function tvm::ffi::Concat</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_dtype_8h_1a94787950883e5a7e97b764ddd342afc3.html">Function tvm::ffi::DLDataTypeToString</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_string_8h_1aa190eed2516ff9a633009cc62f660502.html">Function tvm::ffi::EscapeString</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_serialization_8h_1a56baa5d1ca415dbdebf19ac1f54bd5b7.html">Function tvm::ffi::FromJSONGraph</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1a71e4a492b5a03a19a95087771a7e9ed1.html">Function tvm::ffi::GetDataSize(size_t, DLDataType)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1a226723176642cde5996498e7da6a6368.html">Function tvm::ffi::GetDataSize(const DLTensor&)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1a011d0a2dcbe5702156124d7a7223b3dd.html">Function tvm::ffi::GetDataSize(const Tensor&)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1a65b3a61c540c72d9410150a3a7a76dde.html">Function tvm::ffi::GetDataSize(const TensorView&)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_cast_8h_1a4dba749dd934d8a7891ad126a8fdcc1f.html">Template Function tvm::ffi::GetObjectPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_cast_8h_1a3c5fed9bb23b4804b61037c8ac4874f1.html">Template Function tvm::ffi::GetRef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1aa79cf4e1e3873d8947050b3cee41153a.html">Function tvm::ffi::IsAligned</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1a93094b6b3f20c2cd5aa1c1c2522bc3e4.html">Function tvm::ffi::IsContiguous</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_tensor_8h_1aab70a15ca1dde710bc3052c5ce1f6fbd.html">Function tvm::ffi::IsDirectAddressDevice</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_json_8h_1a86217bda8bfebd85f8265878bc8a59b8.html">Function tvm::ffi::json::Parse</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_json_8h_1a2cd33b0fbc0194eaa803b8a476670587.html">Function tvm::ffi::json::Stringify</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_memory_8h_1a801e8ecc2e3adbc1dac52c714e7cef11.html">Template Function tvm::ffi::make_inplace_array_object</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_array_8h_1a3b56317c7cfb2760cf6c09c303840967.html">Specialized Template Function tvm::ffi::make_object()</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_memory_8h_1a8892f2a3cad8dbc51930c464f2ab863b.html">Template Function tvm::ffi::make_object(Args&&…)</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_map_8h_1a611844db41026b7a95846dd316b435af.html">Template Function tvm::ffi::Merge</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1a735285a70c7c4308816450a5b27f03f2.html">Function tvm::ffi::reflection::EnsureTypeAttrColumn</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1a32d91001c82e10566c69e237ab0de50a.html">Template Function tvm::ffi::reflection::ForEachFieldInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1acc0ded3ead1cc6ffc836005d3bb2cc9c.html">Template Function tvm::ffi::reflection::ForEachFieldInfoWithEarlyStop</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1a6b1f837cf822ded72a31f343ce987f4c.html">Template Function tvm::ffi::reflection::GetFieldByteOffsetToObject</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1a80c4984a43d14113b20a67c966833709.html">Function tvm::ffi::reflection::GetFieldInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1aba4d7fd771bea88a32803dda191b7044.html">Function tvm::ffi::reflection::GetMethod</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_namespacetvm_1_1ffi_1_1reflection_1ac902a725008e348254ee7a2d07c8a95a.html">Function tvm::ffi::reflection::GetMethodInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_dtype_8h_1a8a71c64237efaa13a8d40dfacd6c3165.html">Function tvm::ffi::StringToDLDataType</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_serialization_8h_1a24d1febeb5c1026e7fd66dee9dd9915f.html">Function tvm::ffi::ToJSONGraph</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_string_8h_1ad045700080c053c50d68cde298b2b4b2.html">Function tvm::ffi::ToStringView</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_object_8h_1a0d6e075f219808c4ff7adebd99210a7b.html">Function tvm::ffi::TypeIndexToTypeKey</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_8h_1a111e2ed7444eb220e19c7624d0932d89.html">Function tvm::ffi::TypeKeyToIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a63149ed43a6ecffa2146f92914c0bc7b.html">Function TVMFFIAnyViewToOwnedAny</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1ac0e2d59d3a8ba7f2b32eac47b1c6fc5d.html">Function TVMFFIBacktrace</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1aa2a81275b69ba0f61ce556df85517ef9.html">Function TVMFFIBytesFromByteArray</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a1dd5584d94f6e00a18f4cfa003dfb93a.html">Function TVMFFIBytesGetByteArrayPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a44604b1d0db208ed82cbc7cf0fd0f47c.html">Function TVMFFIDataTypeFromString</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a402f64dec7a665f281e55cf946a7481b.html">Function TVMFFIDataTypeToString</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a762fc5c881dc5f66066eb45b65a5781f.html">Function TVMFFIDLDeviceFromIntPair</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1a0e01ad3ed44c0240f1b76dbed7014234.html">Function TVMFFIEnvCheckSignals</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1ac8f7894c4f205756b7aee01108ab8e84.html">Function TVMFFIEnvGetDLPackManagedTensorAllocator</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1a8ce2ba89ca1d010a084b4c36ed6b2965.html">Function TVMFFIEnvGetStream</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1abcbbccfc02c57418e757033afce42ece.html">Function TVMFFIEnvModLookupFromImports</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1a7451ab18593d70d30a6214d622e200d2.html">Function TVMFFIEnvModRegisterContextSymbol</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1a9b142b59ab84bc06e4a0f66a3510e8f7.html">Function TVMFFIEnvModRegisterSystemLibSymbol</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1a36c15024744584acceaf0233947f9505.html">Function TVMFFIEnvRegisterCAPI</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1aaf8960c33546788950b8e35ac18efe39.html">Function TVMFFIEnvSetDLPackManagedTensorAllocator</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1ae24b47945440d1c0aca13af13bdaf916.html">Function TVMFFIEnvSetStream</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__env__api_8h_1a683191d48d3fdebc98b68f3b717baf6a.html">Function TVMFFIEnvTensorAlloc</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a3479c144d165e717d1464b7b4df84897.html">Function TVMFFIErrorCreate</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a0ee6d2da9a72749561838bf503f62f93.html">Function TVMFFIErrorGetCellPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a268d0b5dc89146020c09f77fa0eb8f67.html">Function TVMFFIErrorMoveFromRaised</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1af108ca4da596c634b4cb9e82c8bec1ce.html">Function TVMFFIErrorSetRaised</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1aedd89f80f73d54dd5904d943dd0690c6.html">Function TVMFFIErrorSetRaisedFromCStr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a56ce10d1e6fc2d34a1a496bdace4af33.html">Function TVMFFIErrorSetRaisedFromCStrParts</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a1ac76d88e0d79843403ce2e0239d7fe2.html">Function TVMFFIFunctionCall</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a4ce84fc667040bba425664c78b5f2c69.html">Function TVMFFIFunctionCreate</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a0d3dcd6ceff356614a6924201c02cf97.html">Function TVMFFIFunctionGetCellPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a3bf47f6e1229627902c80217d674ed29.html">Function TVMFFIFunctionGetGlobal</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a177d080127ef8f3e338beb7dba4c04fd.html">Function TVMFFIFunctionSetGlobal</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1aa26fa16c024c6f2fa15e46aa1333fdb9.html">Function TVMFFIFunctionSetGlobalFromMethodInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a53c5ec2971806966ed96a6add32b5238.html">Function TVMFFIGetTypeAttrColumn</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1afee5a803e22f9baf5ee2ff1f0ace6429.html">Function TVMFFIGetTypeInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a145f2694254410fd4814541e2cde99c1.html">Function TVMFFIGetVersion</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a6415c088928d62af8749f3dc57dcf23b.html">Function TVMFFIObjectCreateOpaque</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1aba50ba2cee84b1ef7a718211ab349031.html">Function TVMFFIObjectDecRef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a31a317a32bfa641180eed1bfb3d5cf01.html">Function TVMFFIObjectGetTypeIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1ac66c1d142240be0cdf65c8ba38770eb6.html">Function TVMFFIObjectIncRef</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a3253bbf35e2ad1361b2ce1de13d2c9b2.html">Function TVMFFIOpaqueObjectGetCellPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a74c26efdd74840abc3e1581c73a38bfa.html">Function TVMFFIShapeGetCellPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a724b0d386cf3d50c7d141ca37be19092.html">Function TVMFFISmallBytesGetContentByteArray</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a5a7e3fe8a94e066bc1bf897fbf736651.html">Function TVMFFIStringFromByteArray</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1af1b8a29eb3f9405982c344f5e572dd65.html">Function TVMFFITensorFromDLPack</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1adaf9a5ab3d30bb3eca58b430f2592fc0.html">Function TVMFFITensorFromDLPackVersioned</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1ab691fd5bc4442c631c1f70985a962f50.html">Function TVMFFITensorGetDLTensorPtr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1adec9f8a8f0683caeb9dd194d9a3c62d5.html">Function TVMFFITensorToDLPack</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a1162f2cbaf1a7628a03ed9488cff858b.html">Function TVMFFITensorToDLPackVersioned</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a3f859b60d99c85f43fce8226c69f3c5e.html">Function TVMFFITypeGetOrAllocIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1ac64df2793c84fc8ba5d24968d60bcada.html">Function TVMFFITypeKeyToIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1ac5a4f48eacde3c69ad3154b6aa39fa3c.html">Function TVMFFITypeRegisterAttr</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a1a99289a314c6c3de865721bd3efb525.html">Function TVMFFITypeRegisterField</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1a07576e172e0788da4982148edcf53b05.html">Variable tvm::ffi::symbol::tvm_ffi_metadata_prefix</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/variable_module_8h_1ac261d9ce6ffb49dd9878610ce217075e.html">Variable tvm::ffi::symbol::tvm_ffi_symbol_prefix</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1ac593f4065568c8f61cf38d00d585befd.html">Define TVM_FFI_DECLARE_OBJECT_INFO_FINAL</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a9d1c42071de0440f70c7bb5e0bd0f325.html">Define TVM_FFI_DECLARE_OBJECT_INFO_PREDEFINED_TYPE_KEY</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1ae5be195e80d32413cbe5e2ad11e146f7.html">Define TVM_FFI_ICHECK_GE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1af1f84686ce5635b3a378567368e89e4d.html">Define TVM_FFI_ICHECK_GT</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1aade00b2e0a9789e3e8bf33441d651455.html">Define TVM_FFI_ICHECK_LE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a1a94c8b78e74adec05051abb9055e7b8.html">Define TVM_FFI_ICHECK_LT</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1afcd5778e656fa2c20aa0b81fbcebc497.html">Define TVM_FFI_ICHECK_NE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a26827bb8bc9e39255060f6be1d2a37fb.html">Define TVM_FFI_ICHECK_NOTNULL</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_endian_8h_1a2ebd9542b313b3b45b2892f2b3d4f26d.html">Define TVM_FFI_IO_NO_ENDIAN_SWAP</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_endian_8h_1a912dbc7a68913612c723f877acaa8105.html">Define TVM_FFI_IO_USE_LITTLE_ENDIAN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a927d4ae2bbf7a08723643993e780f183.html">Define TVM_FFI_LOG_AND_THROW</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1a10bd932564c8e71a3978a061fbb82360.html">Define TVM_FFI_SAFE_CALL_BEGIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_function_8h_1ae3c016c4bf383aa205b4485edd7ca17c.html">Define TVM_FFI_SAFE_CALL_END</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a8df4e0ff8a6195274c6f7c031a4f0db4.html">Define TVM_FFI_THROW</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_error_8h_1a386641a33bb14802830471a2442ddd7d.html">Define TVM_FFI_USE_LIBBACKTRACE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_c__api_8h_1a4241f838270253b885e1de02534bc273.html">Define TVM_FFI_VERSION_MAJOR</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_c__api_8h_1a717daddad98d127813ba8ff5a715e929.html">Define TVM_FFI_VERSION_MINOR</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_c__api_8h_1a42634cb2690dce4d9af6c2a402fc903c.html">Define TVM_FFI_VERSION_PATCH</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/define_c__api_8h_1a01871644eed04162005df7faa5442f92.html">Define TVM_FFI_WEAK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_memory_8h_1a65bf625279df21dec5c8097264415113.html">Typedef tvm::ffi::FObjectDeleter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_json_8h_1aeb9cdccfbc28034e94e46f9f6bd8d92a.html">Typedef tvm::ffi::json::Array</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_json_8h_1a74ca72d0b686c114af683d63e96f2998.html">Typedef tvm::ffi::json::Object</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_json_8h_1a8e808548bb6a99d0a6093ab3e2229ad3.html">Typedef tvm::ffi::json::Value</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_namespacetvm_1_1ffi_1_1reflection_1a96513314d45b43eada132d9b96653d9a.html">Typedef tvm::ffi::reflection::_MetadataType</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_namespacetvm_1_1ffi_1_1reflection_1a32b044a71a094de492867144ca299c15.html">Typedef tvm::ffi::reflection::AccessPathPair</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_object_8h_1a7ba296d84188e5970ba854332a1f04a6.html">Typedef tvm::ffi::TypeIndex</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_object_8h_1ae125f5f5a8a94c7340577c1959805295.html">Typedef tvm::ffi::TypeInfo</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_c__api_8h_1ae22f1a87cbaf7f744d9201948c05d2a5.html">Typedef TVMFFIFieldGetter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_c__api_8h_1aba6bf585b03799369fb535db4a5d2e79.html">Typedef TVMFFIFieldSetter</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_c__api_8h_1a19fdd3c500a70abb3def842c73694548.html">Typedef TVMFFIObjectCreator</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_c__api_8h_1aa0abef2444fde82d76337218e5c13b3f.html">Typedef TVMFFIObjectHandle</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_c__api_8h_1a9eee5afddb1b39723847d67d109c03fe.html">Typedef TVMFFISafeCallType</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../../reference/cpp/generated/typedef_c__env__api_8h_1aa7abccefa41ac9d3040df689c0c72fa4.html">Typedef TVMFFIStreamHandle</a></li>
+</ul>
+</details></li>
+</ul>
+</details></li>
+<li class="toctree-l1"><a class="reference internal" href="../../../reference/rust/index.html">Rust API</a></li>
+</ul>
+
+ </div>
+</nav></div>
+ </div>
+
+
+ <div class="sidebar-primary-items__end sidebar-primary__section">
+ </div>
+
+ <div id="rtd-footer-container"></div>
+
+
+ </div>
+
+ <main id="main-content" class="bd-main" role="main">
+
+
+
+<div class="sbt-scroll-pixel-helper"></div>
+
+ <div class="bd-content">
+ <div class="bd-article-container">
+
+ <div class="bd-header-article d-print-none">
+<div class="header-article-items header-article__inner">
+
+ <div class="header-article-items__start">
+
+ <div class="header-article-item"><button class="sidebar-toggle primary-toggle btn btn-sm" title="Toggle primary sidebar" data-bs-placement="bottom" data-bs-toggle="tooltip">
+ <span class="fa-solid fa-bars"></span>
+</button></div>
+
+ </div>
+
+
+ <div class="header-article-items__end">
+
+ <div class="header-article-item">
+
+<div class="article-header-buttons">
+
+
+<a href="https://github.com/apache/tvm-ffi" target="_blank"
+ class="btn btn-sm btn-source-repository-button"
+ title="Source repository"
+ data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+
+
+<span class="btn__icon-container">
+ <i class="fab fa-github"></i>
+ </span>
+
+</a>
+
+
+
+
+<button onclick="toggleFullScreen()"
+ class="btn btn-sm btn-fullscreen-button"
+ title="Fullscreen mode"
+ data-bs-placement="bottom" data-bs-toggle="tooltip"
+>
+
+
+<span class="btn__icon-container">
+ <i class="fas fa-expand"></i>
+ </span>
+
+</button>
+
+
+
+<script>
+document.write(`
+ <button class="btn btn-sm nav-link pst-navbar-icon theme-switch-button" title="light/dark" aria-label="light/dark" data-bs-placement="bottom" data-bs-toggle="tooltip">
+ <i class="theme-switch fa-solid fa-sun fa-lg" data-mode="light"></i>
+ <i class="theme-switch fa-solid fa-moon fa-lg" data-mode="dark"></i>
+ <i class="theme-switch fa-solid fa-circle-half-stroke fa-lg" data-mode="auto"></i>
+ </button>
+`);
+</script>
+
+
+<script>
+document.write(`
+ <button class="btn btn-sm pst-navbar-icon search-button search-button__button" title="Search" aria-label="Search" data-bs-placement="bottom" data-bs-toggle="tooltip">
+ <i class="fa-solid fa-magnifying-glass fa-lg"></i>
+ </button>
+`);
+</script>
+
+</div></div>
+
+ </div>
+
+</div>
+</div>
+
+
+
+<div id="jb-print-docs-body" class="onlyprint">
+ <h1></h1>
+ <!-- Table of contents -->
+ <div id="print-main-content">
+ <div id="jb-print-toc">
+
+ </div>
+ </div>
+</div>
+
+
+
+<div id="searchbox"></div>
+ <article class="bd-article">
+
+ <h1>Source code for tvm_ffi.cpp.nvrtc</h1><div class="highlight"><pre>
+<span></span><span class="c1"># Licensed to the Apache Software Foundation (ASF) under one</span>
+<span class="c1"># or more contributor license agreements. See the NOTICE file</span>
+<span class="c1"># distributed with this work for additional information</span>
+<span class="c1"># regarding copyright ownership. The ASF licenses this file</span>
+<span class="c1"># to you under the Apache License, Version 2.0 (the</span>
+<span class="c1"># "License"); you may not use this file except in compliance</span>
+<span class="c1"># with the License. You may obtain a copy of the License at</span>
+<span class="c1">#</span>
+<span class="c1"># http://www.apache.org/licenses/LICENSE-2.0</span>
+<span class="c1">#</span>
+<span class="c1"># Unless required by applicable law or agreed to in writing,</span>
+<span class="c1"># software distributed under the License is distributed on an</span>
+<span class="c1"># "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span>
+<span class="c1"># KIND, either express or implied. See the License for the</span>
+<span class="c1"># specific language governing permissions and limitations</span>
+<span class="c1"># under the License.</span>
+<span class="sd">"""NVRTC (NVIDIA Runtime Compilation) utilities for compiling CUDA source to CUBIN."""</span>
+
+<span class="kn">from</span><span class="w"> </span><span class="nn">__future__</span><span class="w"> </span><span class="kn">import</span> <span class="n">annotations</span>
+
+<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">Sequence</span>
+
+
+<div class="viewcode-block" id="nvrtc_compile">
+<a class="viewcode-back" href="../../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html#tvm_ffi.cpp.nvrtc.nvrtc_compile">[docs]</a>
+<span class="k">def</span><span class="w"> </span><span class="nf">nvrtc_compile</span><span class="p">(</span> <span class="c1"># noqa: PLR0912, PLR0915</span>
+ <span class="n">source</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
+ <span class="o">*</span><span class="p">,</span>
+ <span class="n">name</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">"kernel.cu"</span><span class="p">,</span>
+ <span class="n">arch</span><span class="p">:</span> <span class="nb">str</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+ <span class="n">extra_opts</span><span class="p">:</span> <span class="n">Sequence</span><span class="p">[</span><span class="nb">str</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
+<span class="p">)</span> <span class="o">-></span> <span class="nb">bytes</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">"""Compile CUDA source code to CUBIN using NVRTC.</span>
+
+<span class="sd"> This function uses the NVIDIA Runtime Compilation (NVRTC) library to compile</span>
+<span class="sd"> CUDA C++ source code into a CUBIN binary that can be loaded and executed</span>
+<span class="sd"> using the CUDA Driver API.</span>
+
+<span class="sd"> Parameters</span>
+<span class="sd"> ----------</span>
+<span class="sd"> source : str</span>
+<span class="sd"> The CUDA C++ source code to compile.</span>
+
+<span class="sd"> name : str, optional</span>
+<span class="sd"> The name to use for the source file (for error messages). Default: "kernel.cu"</span>
+
+<span class="sd"> arch : str, optional</span>
+<span class="sd"> The target GPU architecture (e.g., "sm_75", "sm_80", "sm_89"). If not specified,</span>
+<span class="sd"> attempts to auto-detect from the current GPU.</span>
+
+<span class="sd"> extra_opts : Sequence[str], optional</span>
+<span class="sd"> Additional compilation options to pass to NVRTC (e.g., ["-I/path/to/include", "-DDEFINE=1"]).</span>
+
+<span class="sd"> Returns</span>
+<span class="sd"> -------</span>
+<span class="sd"> bytes</span>
+<span class="sd"> The compiled CUBIN binary data.</span>
+
+<span class="sd"> Raises</span>
+<span class="sd"> ------</span>
+<span class="sd"> RuntimeError</span>
+<span class="sd"> If NVRTC compilation fails or CUDA bindings are not available.</span>
+
+<span class="sd"> Example</span>
+<span class="sd"> -------</span>
+<span class="sd"> .. code-block:: python</span>
+
+<span class="sd"> from tvm_ffi.cpp import nvrtc</span>
+
+<span class="sd"> cuda_source = '''</span>
+<span class="sd"> extern "C" __global__ void add_one(float* x, float* y, int n) {</span>
+<span class="sd"> int idx = blockIdx.x * blockDim.x + threadIdx.x;</span>
+<span class="sd"> if (idx < n) {</span>
+<span class="sd"> y[idx] = x[idx] + 1.0f;</span>
+<span class="sd"> }</span>
+<span class="sd"> }</span>
+<span class="sd"> '''</span>
+
+<span class="sd"> cubin_bytes = nvrtc.nvrtc_compile(cuda_source)</span>
+<span class="sd"> # Use cubin_bytes with tvm_ffi.cpp.load_inline and embed_cubin parameter</span>
+
+<span class="sd"> """</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="kn">from</span><span class="w"> </span><span class="nn">cuda.bindings</span><span class="w"> </span><span class="kn">import</span> <span class="n">driver</span><span class="p">,</span> <span class="n">nvrtc</span> <span class="c1"># type: ignore[import-not-found] # noqa: PLC0415</span>
+ <span class="k">except</span> <span class="ne">ImportError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
+ <span class="s2">"CUDA bindings not available. Install with: pip install cuda-python"</span>
+ <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
+
+ <span class="c1"># Auto-detect architecture if not specified</span>
+ <span class="k">if</span> <span class="n">arch</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">try</span><span class="p">:</span>
+ <span class="c1"># Initialize CUDA driver API</span>
+ <span class="p">(</span><span class="n">result</span><span class="p">,)</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">cuInit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">driver</span><span class="o">.</span><span class="n">CUresult</span><span class="o">.</span><span class="n">CUDA_SUCCESS</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to initialize CUDA driver: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="c1"># Get current device</span>
+ <span class="n">result</span><span class="p">,</span> <span class="n">device</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">cuCtxGetDevice</span><span class="p">()</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">driver</span><span class="o">.</span><span class="n">CUresult</span><span class="o">.</span><span class="n">CUDA_SUCCESS</span><span class="p">:</span>
+ <span class="c1"># Try to get device 0 if no context exists</span>
+ <span class="n">device</span> <span class="o">=</span> <span class="mi">0</span>
+
+ <span class="c1"># Get compute capability</span>
+ <span class="n">result</span><span class="p">,</span> <span class="n">major</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">cuDeviceGetAttribute</span><span class="p">(</span>
+ <span class="n">driver</span><span class="o">.</span><span class="n">CUdevice_attribute</span><span class="o">.</span><span class="n">CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MAJOR</span><span class="p">,</span> <span class="n">device</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">driver</span><span class="o">.</span><span class="n">CUresult</span><span class="o">.</span><span class="n">CUDA_SUCCESS</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to get compute capability major: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="n">result</span><span class="p">,</span> <span class="n">minor</span> <span class="o">=</span> <span class="n">driver</span><span class="o">.</span><span class="n">cuDeviceGetAttribute</span><span class="p">(</span>
+ <span class="n">driver</span><span class="o">.</span><span class="n">CUdevice_attribute</span><span class="o">.</span><span class="n">CU_DEVICE_ATTRIBUTE_COMPUTE_CAPABILITY_MINOR</span><span class="p">,</span> <span class="n">device</span>
+ <span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">driver</span><span class="o">.</span><span class="n">CUresult</span><span class="o">.</span><span class="n">CUDA_SUCCESS</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to get compute capability minor: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="n">arch</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"sm_</span><span class="si">{</span><span class="n">major</span><span class="si">}{</span><span class="n">minor</span><span class="si">}</span><span class="s2">"</span>
+ <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
+ <span class="c1"># Fallback to a reasonable default</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span>
+ <span class="sa">f</span><span class="s2">"Failed to auto-detect GPU architecture: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">. "</span>
+ <span class="s2">"Please specify 'arch' parameter explicitly."</span>
+ <span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="nn">e</span>
+
+ <span class="c1"># Create program</span>
+ <span class="n">result</span><span class="p">,</span> <span class="n">prog</span> <span class="o">=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcCreateProgram</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">source</span><span class="p">),</span> <span class="nb">str</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span>< [...]
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcResult</span><span class="o">.</span><span class="n">NVRTC_SUCCESS</span><span class="p">:</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to create NVRTC program: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="c1"># Compile options</span>
+ <span class="n">opts</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="sa">b</span><span class="s2">"--gpu-architecture="</span> <span class="o">+</span> <span class="n">arch</span><span class="o">.</span><span class="n">encode</span><span class="p">(),</span>
+ <span class="sa">b</span><span class="s2">"-default-device"</span><span class="p">,</span>
+ <span class="p">]</span>
+
+ <span class="c1"># Add extra options if provided</span>
+ <span class="k">if</span> <span class="n">extra_opts</span><span class="p">:</span>
+ <span class="n">opts</span><span class="o">.</span><span class="n">extend</span><span class="p">([</span><span class="n">opt</span><span class="o">.</span><span class="n">encode</span><span class="p">()</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">opt</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="k">else</span> <span class="n">opt</span> <span class="k">for</span> <span [...]
+
+ <span class="c1"># Compile</span>
+ <span class="p">(</span><span class="n">result</span><span class="p">,)</span> <span class="o">=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcCompileProgram</span><span class="p">(</span><span class="n">prog</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">opts</span><span class="p">),</span> <span class="n">opts</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcResult</span><span class="o">.</span><span class="n">NVRTC_SUCCESS</span><span class="p">:</span>
+ <span class="c1"># Get compilation log</span>
+ <span class="n">result_log</span><span class="p">,</span> <span class="n">log_size</span> <span class="o">=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcGetProgramLogSize</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result_log</span> <span class="o">==</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcResult</span><span class="o">.</span><span class="n">NVRTC_SUCCESS</span> <span class="ow">and</span> <span class="n">log_size</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
+ <span class="n">log_buf</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">" "</span> <span class="o">*</span> <span class="n">log_size</span>
+ <span class="p">(</span><span class="n">result_log</span><span class="p">,)</span> <span class="o">=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcGetProgramLog</span><span class="p">(</span><span class="n">prog</span><span class="p">,</span> <span class="n">log_buf</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result_log</span> <span class="o">==</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcResult</span><span class="o">.</span><span class="n">NVRTC_SUCCESS</span><span class="p">:</span>
+ <span class="n">error_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"NVRTC compilation failed:</span><span class="se">\n</span><span class="si">{</span><span class="n">log_buf</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">error_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"NVRTC compilation failed (couldn't get log): </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span>
+ <span class="k">else</span><span class="p">:</span>
+ <span class="n">error_msg</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"NVRTC compilation failed: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span>
+
+ <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcDestroyProgram</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="n">error_msg</span><span class="p">)</span>
+
+ <span class="c1"># Get CUBIN</span>
+ <span class="n">result</span><span class="p">,</span> <span class="n">cubin_size</span> <span class="o">=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcGetCUBINSize</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcResult</span><span class="o">.</span><span class="n">NVRTC_SUCCESS</span><span class="p">:</span>
+ <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcDestroyProgram</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to get CUBIN size from NVRTC: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="n">cubin_buf</span> <span class="o">=</span> <span class="sa">b</span><span class="s2">" "</span> <span class="o">*</span> <span class="n">cubin_size</span>
+ <span class="p">(</span><span class="n">result</span><span class="p">,)</span> <span class="o">=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcGetCUBIN</span><span class="p">(</span><span class="n">prog</span><span class="p">,</span> <span class="n">cubin_buf</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">result</span> <span class="o">!=</span> <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcResult</span><span class="o">.</span><span class="n">NVRTC_SUCCESS</span><span class="p">:</span>
+ <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcDestroyProgram</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span>
+ <span class="k">raise</span> <span class="ne">RuntimeError</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Failed to get CUBIN from NVRTC: </span><span class="si">{</span><span class="n">result</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
+
+ <span class="c1"># Clean up</span>
+ <span class="n">nvrtc</span><span class="o">.</span><span class="n">nvrtcDestroyProgram</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span>
+
+ <span class="k">return</span> <span class="n">cubin_buf</span></div>
+
+</pre></div>
+
+ </article>
+
+
+
+
+
+
+ <footer class="prev-next-footer d-print-none">
+
+<div class="prev-next-area">
+</div>
+ </footer>
+
+ </div>
+
+
+
+
+ </div>
+ <footer class="bd-footer-content">
+
+<div class="bd-footer-content__inner container">
+
+ <div class="footer-item">
+
+<p class="component-author">
+By Apache TVM FFI contributors
+</p>
+
+ </div>
+
+ <div class="footer-item">
+
+
+ </div>
+
+ <div class="footer-item">
+ <p class="last-updated">
+ Last updated on Dec 03, 2025.
+ <br/>
+</p>
+ </div>
+
+ <div class="footer-item">
+
+<div class="extra_footer">
+
+ <div class="footer-container" style="margin: 5px 0; font-size: 0.9em; color: #6c757d;">
+ <div class="footer-line1" style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 3px;">
+ <div class="footer-copyright-short">
+ Copyright © 2025, Apache Software Foundation
+ </div>
+ <div class="footer-dropdown">
+ <div class="dropdown">
+ <button class="btn btn-link dropdown-toggle" type="button" id="footerDropdown" data-bs-toggle="dropdown"
+ aria-expanded="false" style="font-size: 0.9em; color: #6c757d; text-decoration: none; padding: 0; border: none; background: none;">
+ ASF
+ </button>
+ <ul class="dropdown-menu" aria-labelledby="footerDropdown" style="font-size: 0.9em;">
+<li><a class="dropdown-item" href="https://apache.org/" target="_blank" style="font-size: 0.9em;">ASF Homepage</a></li>
+<li><a class="dropdown-item" href="https://www.apache.org/licenses/" target="_blank" style="font-size: 0.9em;">License</a></li>
+<li><a class="dropdown-item" href="https://www.apache.org/foundation/sponsorship.html" target="_blank" style="font-size: 0.9em;">Sponsorship</a></li>
+<li><a class="dropdown-item" href="https://tvm.apache.org/docs/reference/security.html" target="_blank" style="font-size: 0.9em;">Security</a></li>
+<li><a class="dropdown-item" href="https://www.apache.org/foundation/thanks.html" target="_blank" style="font-size: 0.9em;">Thanks</a></li>
+<li><a class="dropdown-item" href="https://www.apache.org/events/current-event" target="_blank" style="font-size: 0.9em;">Events</a></li>
+ </ul>
+ </div>
+ </div>
+ </div>
+ <div class="footer-line2" style="font-size: 0.9em; color: #6c757d;">
+ Apache TVM, Apache, the Apache feather, and the Apache TVM project logo are either trademarks or registered trademarks of the Apache Software Foundation.
+ </div>
+ </div>
+
+</div>
+ </div>
+
+</div>
+ </footer>
+
+
+ </main>
+ </div>
+ </div>
+
+ <!-- Scripts loaded after <body> so the DOM is not blocked -->
+ <script src="../../../_static/scripts/bootstrap.js?digest=dfe6caa3a7d634c4db9b"></script>
+<script src="../../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b"></script>
+
+ <footer class="bd-footer">
+ </footer>
+ </body>
+</html>
\ No newline at end of file
diff --git a/ffi/_modules/tvm_ffi/error.html b/ffi/_modules/tvm_ffi/error.html
index 3df3604821..537507afee 100644
--- a/ffi/_modules/tvm_ffi/error.html
+++ b/ffi/_modules/tvm_ffi/error.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/error';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1138,7 +1217,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/module.html b/ffi/_modules/tvm_ffi/module.html
index 35a677f35c..6621b920f0 100644
--- a/ffi/_modules/tvm_ffi/module.html
+++ b/ffi/_modules/tvm_ffi/module.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/module';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -906,6 +985,7 @@ document.write(`
<span class="c1"># isort: on</span>
<span class="c1"># fmt: on</span>
<span class="c1"># tvm-ffi-stubgen(end)</span>
+<span class="kn">import</span><span class="w"> </span><span class="nn">json</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">enum</span><span class="w"> </span><span class="kn">import</span> <span class="n">IntEnum</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">os</span><span class="w"> </span><span class="kn">import</span> <span class="n">PathLike</span><span class="p">,</span> <span class="n">fspath</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">typing</span><span class="w"> </span><span class="kn">import</span> <span class="n">ClassVar</span><span class="p">,</span> <span class="n">cast</span>
@@ -936,14 +1016,23 @@ document.write(`
<span class="sd"> import tvm_ffi</span>
-<span class="sd"> # load the module from a tvm-ffi shared library</span>
-<span class="sd"> mod : tvm_ffi.Module = tvm_ffi.load_module("path/to/library.so")</span>
-<span class="sd"> # you can use mod.func_name to call the exported function</span>
+<span class="sd"> # Load the module from a shared library</span>
+<span class="sd"> mod = tvm_ffi.load_module("path/to/library.so")</span>
+
+<span class="sd"> # Call exported function</span>
<span class="sd"> mod.func_name(*args)</span>
+<span class="sd"> # Query function metadata (type signature)</span>
+<span class="sd"> metadata = mod.get_function_metadata("func_name")</span>
+
+<span class="sd"> # Query function documentation (if available)</span>
+<span class="sd"> doc = mod.get_function_doc("func_name")</span>
+
<span class="sd"> See Also</span>
<span class="sd"> --------</span>
<span class="sd"> :py:func:`tvm_ffi.load_module`</span>
+<span class="sd"> :py:meth:`get_function_metadata`</span>
+<span class="sd"> :py:meth:`get_function_doc`</span>
<span class="sd"> Notes</span>
<span class="sd"> -----</span>
@@ -1063,6 +1152,97 @@ document.write(`
<span class="k">return</span> <span class="n">func</span></div>
+<div class="viewcode-block" id="Module.get_function_metadata">
+<a class="viewcode-back" href="../../reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.get_function_metadata">[docs]</a>
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_function_metadata</span><span class="p">(</span>
+ <span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">query_imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span>
+ <span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">[</span><span class="nb">str</span><span class="p">,</span> <span class="n">Any</span><span class="p">]</span> <span class="o">|</span> <span class="kc">None</span><span class="p">:</span>
+<span class="w"> </span><span class="sd">"""Get metadata for a function exported from the module.</span>
+
+<span class="sd"> This retrieves metadata for functions exported via c:macro:`TVM_FFI_DLL_EXPORT_TYPED_FUNC`</span>
+<span class="sd"> and when c:macro:`TVM_FFI_DLL_EXPORT_INCLUDE_METADATA` is on, which includes type schema</span>
+<span class="sd"> information.</span>
+
+<span class="sd"> Parameters</span>
+<span class="sd"> ----------</span>
+<span class="sd"> name</span>
+<span class="sd"> The name of the function</span>
+
+<span class="sd"> query_imports</span>
+<span class="sd"> Whether to also query modules imported by this module.</span>
+
+<span class="sd"> Returns</span>
+<span class="sd"> -------</span>
+<span class="sd"> metadata</span>
+<span class="sd"> A dictionary containing function metadata. The ``type_schema`` field</span>
+<span class="sd"> encodes the callable signature.</span>
+
+<span class="sd"> Examples</span>
+<span class="sd"> --------</span>
+<span class="sd"> .. code-block:: python</span>
+
+<span class="sd"> import tvm_ffi</span>
+<span class="sd"> from tvm_ffi.core import TypeSchema</span>
+<span class="sd"> import json</span>
+
+<span class="sd"> mod = tvm_ffi.load_module("add_one_cpu.so")</span>
+<span class="sd"> metadata = mod.get_function_metadata("add_one_cpu")</span>
+<span class="sd"> schema = TypeSchema.from_json_str(metadata["type_schema"])</span>
+<span class="sd"> print(schema) # Shows function signature</span>
+
+<span class="sd"> See Also</span>
+<span class="sd"> --------</span>
+<span class="sd"> :py:func:`tvm_ffi.get_global_func_metadata`</span>
+<span class="sd"> Get metadata for global registry functions.</span>
+
+<span class="sd"> """</span>
+ <span class="n">metadata_str</span> <span class="o">=</span> <span class="n">_ffi_api</span><span class="o">.</span><span class="n">ModuleGetFunctionMetadata</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">query_imports</span><span class="p">)</span>
+ <span class="k">if</span> <span class="n">metadata_str</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
+ <span class="k">return</span> <span class="kc">None</span>
+ <span class="k">return</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">metadata_str</span><span class="p">)</span></div>
+
+
+<div class="viewcode-block" id="Module.get_function_doc">
+<a class="viewcode-back" href="../../reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.get_function_doc">[docs]</a>
+ <span class="k">def</span><span class="w"> </span><span class="nf">get_function_doc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">query_imports</span><span class="p">:</span> <span class="nb">bool</span> <span class="o">=</span> <span class="kc">False</span><span class="p">)</span> <span class="o">-></span> <span class="nb">st [...]
+<span class="w"> </span><span class="sd">"""Get documentation string for a function exported from the module.</span>
+
+<span class="sd"> This retrieves documentation for functions exported via c:macro:`TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC`.</span>
+
+<span class="sd"> Parameters</span>
+<span class="sd"> ----------</span>
+<span class="sd"> name</span>
+<span class="sd"> The name of the function</span>
+
+<span class="sd"> query_imports</span>
+<span class="sd"> Whether to also query modules imported by this module.</span>
+
+<span class="sd"> Returns</span>
+<span class="sd"> -------</span>
+<span class="sd"> doc : str or None</span>
+<span class="sd"> The documentation string if available, None otherwise.</span>
+
+<span class="sd"> Examples</span>
+<span class="sd"> --------</span>
+<span class="sd"> .. code-block:: python</span>
+
+<span class="sd"> import tvm_ffi</span>
+
+<span class="sd"> mod = tvm_ffi.load_module("mylib.so")</span>
+<span class="sd"> doc = mod.get_function_doc("process_batch")</span>
+<span class="sd"> if doc:</span>
+<span class="sd"> print(doc)</span>
+
+<span class="sd"> See Also</span>
+<span class="sd"> --------</span>
+<span class="sd"> :py:meth:`get_function_metadata`</span>
+<span class="sd"> Get metadata including type schema.</span>
+
+<span class="sd"> """</span>
+ <span class="n">doc_str</span> <span class="o">=</span> <span class="n">_ffi_api</span><span class="o">.</span><span class="n">ModuleGetFunctionDoc</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">query_imports</span><span class="p">)</span>
+ <span class="k">return</span> <span class="n">doc_str</span> <span class="k">if</span> <span class="n">doc_str</span> <span class="k">else</span> <span class="kc">None</span></div>
+
+
<div class="viewcode-block" id="Module.import_module">
<a class="viewcode-back" href="../../reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.import_module">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">import_module</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">module</span><span class="p">:</span> <span class="n">Module</span><span class="p">)</span> <span class="o">-></span> <span class="kc">None</span><span class="p">:</span>
@@ -1327,7 +1507,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/registry.html b/ffi/_modules/tvm_ffi/registry.html
index ce690f2040..e54d98284f 100644
--- a/ffi/_modules/tvm_ffi/registry.html
+++ b/ffi/_modules/tvm_ffi/registry.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/registry';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1306,7 +1385,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/serialization.html b/ffi/_modules/tvm_ffi/serialization.html
index 647376af04..ed2740be5f 100644
--- a/ffi/_modules/tvm_ffi/serialization.html
+++ b/ffi/_modules/tvm_ffi/serialization.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/serialization';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1010,7 +1089,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_modules/tvm_ffi/stream.html b/ffi/_modules/tvm_ffi/stream.html
index 0b5748887f..ff31bc3851 100644
--- a/ffi/_modules/tvm_ffi/stream.html
+++ b/ffi/_modules/tvm_ffi/stream.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="../../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../../_static/documentation_options.js?v=5f86a092"></script>
<script src="../../_static/doctools.js?v=9bcbadda"></script>
<script src="../../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="../../_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "../../_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = '_modules/tvm_ffi/stream';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="../../search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="../../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1149,7 +1228,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/_sources/get_started/quickstart.rst b/ffi/_sources/get_started/quickstart.rst
index 650b750750..1ebb53389b 100644
--- a/ffi/_sources/get_started/quickstart.rst
+++ b/ffi/_sources/get_started/quickstart.rst
@@ -76,7 +76,8 @@ Suppose we implement a C++ function ``AddOne`` that performs elementwise ``y = x
The macro :c:macro:`TVM_FFI_DLL_EXPORT_TYPED_FUNC` exports the C++ function ``AddOne``
-as a TVM FFI compatible symbol with the name ``__tvm_ffi_add_one_cpu/cuda`` in the resulting library.
+as a TVM FFI compatible symbol ``__tvm_ffi_add_one_cpu/cuda``. If :c:macro:`TVM_FFI_DLL_EXPORT_INCLUDE_METADATA` is set to 1,
+it also exports the function's metadata as a symbol ``__tvm_ffi__metadata_add_one_cpu/cuda`` for type checking and stub generation.
The class :cpp:class:`tvm::ffi::TensorView` allows zero-copy interop with tensors from different ML frameworks:
diff --git a/ffi/_sources/guides/compiler_integration.md b/ffi/_sources/guides/compiler_integration.md
index aff6f90c15..254df38dca 100644
--- a/ffi/_sources/guides/compiler_integration.md
+++ b/ffi/_sources/guides/compiler_integration.md
@@ -30,9 +30,13 @@ following options:
- For compilers that generate host functions via codegen (e.g., LLVM), one can
generate the symbol `__tvm_ffi_<func_name>`, where `<funcname>` is the exported
- function.
-- For kernel generators that generate C++ host code, one can directly
- use {c:macro}`TVM_FFI_DLL_EXPORT_TYPED_FUNC` to expose the symbol.
+ function. Optionally, also generate `__tvm_ffi__metadata_<func_name>` for reflection.
+- For kernel generators that generate C++ host code, use {c:macro}`TVM_FFI_DLL_EXPORT_TYPED_FUNC`.
+ This macro automatically exports function metadata when {c:macro}`TVM_FFI_DLL_EXPORT_INCLUDE_METADATA`
+ is set to 1.
+- To export documentation strings, use {c:macro}`TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC` separately
+ after exporting the function. This enhances tooling support (stub generation, IDE tooltips).
+ Documentation export is also controlled by {c:macro}`TVM_FFI_DLL_EXPORT_INCLUDE_METADATA`.
The following code snippet shows C code that corresponds to a
function performing `add_one_c` under the ABI. It is reasonably straightforward for
diff --git a/ffi/_sources/guides/cpp_guide.md b/ffi/_sources/guides/cpp_guide.md
index ef69ed3d60..e5f09b7643 100644
--- a/ffi/_sources/guides/cpp_guide.md
+++ b/ffi/_sources/guides/cpp_guide.md
@@ -292,12 +292,55 @@ void AddOne(DLTensor* x, DLTensor* y) {
TVM_FFI_DLL_EXPORT_TYPED_FUNC(add_one, my_ffi_extension::AddOne);
```
-The new `add_one` takes the signature of `TVMFFISafeCallType` and can be wrapped as `ffi::Function`
-through the C++ `ffi::Module` API.
+The new `add_one` takes the signature of `TVMFFISafeCallType`, and can loaded and queried through the C++ `ffi::Module` API.
+
+When flag `TVM_FFI_DLL_EXPORT_TYPED_FUNC_METADATA` is on, the macro exports both the function and its type metadata, enabling
+signature validation without calling the function.
+
+The metadata contains:
+
+- **type_schema**: JSON string describing function signature (return type and argument types)
```cpp
ffi::Module mod = ffi::Module::LoadFromFile("path/to/export_lib.so");
+
+// Get the function
ffi::Function func = mod->GetFunction("add_one").value();
+
+// Query metadata (type schema information)
+ffi::Optional<ffi::String> metadata = mod->GetFunctionMetadata("add_one");
+if (metadata.has_value()) {
+ // Parse JSON metadata for validation
+ // Contains: {"type_schema": "..."}
+}
+```
+
+For functions that need documentation, use the `TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC` macro separately:
+
+```cpp
+#define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA 1
+
+void ProcessBatch(ffi::TensorView input, ffi::TensorView output) {
+ // ... implementation
+}
+
+// Export the function
+TVM_FFI_DLL_EXPORT_TYPED_FUNC(process_batch, ProcessBatch);
+
+// Export documentation separately (make sure TVM_FFI_DLL_EXPORT_INCLUDE_METADATA is set to 1)
+TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC(
+ process_batch,
+ R"(Process a batch of inputs and write results to output tensor.
+
+Parameters
+----------
+input : TensorView
+ Input tensor to process
+output : TensorView
+ Output tensor for results)");
+
+// Query documentation
+ffi::Optional<ffi::String> doc = mod->GetFunctionDoc("process_batch");
```
## Error Handling
diff --git a/ffi/_sources/guides/cubin_launcher.rst b/ffi/_sources/guides/cubin_launcher.rst
new file mode 100644
index 0000000000..e3e7d9688b
--- /dev/null
+++ b/ffi/_sources/guides/cubin_launcher.rst
@@ -0,0 +1,422 @@
+.. Licensed to the Apache Software Foundation (ASF) under one
+.. or more contributor license agreements. See the NOTICE file
+.. distributed with this work for additional information
+.. regarding copyright ownership. The ASF licenses this file
+.. to you under the Apache License, Version 2.0 (the
+.. "License"); you may not use this file except in compliance
+.. with the License. You may obtain a copy of the License at
+..
+.. http://www.apache.org/licenses/LICENSE-2.0
+..
+.. Unless required by applicable law or agreed to in writing,
+.. software distributed under the License is distributed on an
+.. "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+.. KIND, either express or implied. See the License for the
+.. specific language governing permissions and limitations
+.. under the License.
+
+CUBIN Launcher Guide
+====================
+
+This guide demonstrates how to load and launch CUDA kernels from CUBIN (CUDA Binary) modules using TVM-FFI. The CUBIN launcher enables you to execute pre-compiled or runtime-compiled CUDA kernels efficiently through the CUDA Runtime API.
+
+Overview
+--------
+
+TVM-FFI provides utilities for loading and launching CUDA kernels from CUBIN modules. The implementation is in ``tvm/ffi/extra/cuda/cubin_launcher.h`` and provides:
+
+- :cpp:class:`tvm::ffi::CubinModule`: RAII wrapper for loading CUBIN modules from memory
+- :cpp:class:`tvm::ffi::CubinKernel`: Handle for launching CUDA kernels with specified parameters
+- :c:macro:`TVM_FFI_EMBED_CUBIN`: Macro for embedding CUBIN data at compile time
+- :c:macro:`TVM_FFI_EMBED_CUBIN_GET_KERNEL`: Macro for retrieving kernels from embedded CUBIN
+
+The CUBIN launcher supports:
+
+- Loading CUBIN from memory (embedded data or runtime-generated)
+- Multi-GPU execution using CUDA primary contexts
+- Kernel parameter management and launch configuration
+- Integration with NVRTC, Triton, and other CUDA compilation tools
+
+**Build Integration:**
+
+TVM-FFI provides convenient tools for embedding CUBIN data at build time:
+
+- **CMake utilities** (``cmake/Utils/EmbedCubin.cmake``): Functions for compiling CUDA to CUBIN and embedding it into C++ code
+- **Python utility** (``python -m tvm_ffi.utils.embed_cubin``): Command-line tool for embedding CUBIN into object files
+- **Python API** (:py:func:`tvm_ffi.cpp.load_inline`): Runtime embedding via ``embed_cubin`` parameter
+
+Python Usage
+------------
+
+Basic Workflow
+~~~~~~~~~~~~~~
+
+The typical workflow for launching CUBIN kernels from Python involves:
+
+1. **Generate CUBIN**: Compile your CUDA kernel to CUBIN format
+2. **Define C++ Wrapper**: Write C++ code to load and launch the kernel
+3. **Load Module**: Use :py:func:`tvm_ffi.cpp.load_inline` with ``embed_cubin`` parameter
+4. **Call Kernel**: Invoke the kernel function from Python
+
+Example: NVRTC Compilation
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Here's a complete example using NVRTC to compile CUDA source at runtime.
+
+**Step 1: Compile CUDA source to CUBIN using NVRTC**
+
+.. literalinclude:: ../../examples/cubin_launcher/example_nvrtc_cubin.py
+ :language: python
+ :start-after: [cuda_source.begin]
+ :end-before: [cuda_source.end]
+ :dedent: 4
+
+**Step 2: Define C++ wrapper with embedded CUBIN**
+
+.. literalinclude:: ../../examples/cubin_launcher/example_nvrtc_cubin.py
+ :language: python
+ :start-after: [cpp_wrapper.begin]
+ :end-before: [cpp_wrapper.end]
+ :dedent: 4
+
+**Key Points:**
+
+- The ``embed_cubin`` parameter is a dictionary mapping CUBIN names to their binary data
+- CUBIN names in ``embed_cubin`` must match names in :c:macro:`TVM_FFI_EMBED_CUBIN`
+- Use ``cuda_sources`` parameter (instead of ``cpp_sources``) to automatically link with CUDA libraries
+- The C++ wrapper handles device management, stream handling, and kernel launching
+
+Example: Using Triton Kernels
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can compile Triton kernels to CUBIN and launch them through TVM-FFI.
+
+**Step 1: Define and compile Triton kernel**
+
+.. literalinclude:: ../../examples/cubin_launcher/example_triton_cubin.py
+ :language: python
+ :start-after: [triton_kernel.begin]
+ :end-before: [triton_kernel.end]
+ :dedent: 4
+
+**Step 2: Define C++ wrapper to launch the Triton kernel**
+
+.. literalinclude:: ../../examples/cubin_launcher/example_triton_cubin.py
+ :language: python
+ :start-after: [cpp_wrapper.begin]
+ :end-before: [cpp_wrapper.end]
+ :dedent: 4
+
+.. note::
+
+ Triton kernels may require extra dummy parameters in the argument list. Check the compiled kernel's signature to determine the exact parameter count needed.
+
+C++ Usage
+---------
+
+Embedding CUBIN at Compile Time
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The recommended approach in C++ is to embed CUBIN data directly into your shared library:
+
+.. literalinclude:: ../../examples/cubin_launcher/embedded_cubin/src/lib_embedded.cc
+ :language: cpp
+ :start-after: [example.begin]
+ :end-before: [example.end]
+
+**Key Points:**
+
+- Use ``static auto kernel`` to cache the kernel lookup for efficiency
+- Kernel arguments must be pointers to the actual values (use ``&`` for addresses)
+- :cpp:type:`tvm::ffi::dim3` supports 1D, 2D, or 3D configurations: ``dim3(x)``, ``dim3(x, y)``, ``dim3(x, y, z)``
+- ``TVMFFIEnvGetStream`` retrieves the correct CUDA stream for the device
+- Always check kernel launch results with :c:macro:`TVM_FFI_CHECK_CUDA_ERROR` (which checks CUDA Runtime API errors)
+
+Loading CUBIN at Runtime
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can also load CUBIN modules dynamically from memory:
+
+.. literalinclude:: ../../examples/cubin_launcher/dynamic_cubin/src/lib_dynamic.cc
+ :language: cpp
+ :start-after: [example.begin]
+ :end-before: [example.end]
+
+Embedding CUBIN with CMake Utilities
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+TVM-FFI provides CMake utility functions that simplify the CUBIN embedding process. This is the recommended approach for CMake-based projects.
+
+**Using CMake Utilities:**
+
+.. literalinclude:: ../../examples/cubin_launcher/embedded_cubin/CMakeLists.txt
+ :language: cmake
+ :start-after: [cmake_example.begin]
+ :end-before: [cmake_example.end]
+
+**Available CMake Functions:**
+
+- ``tvm_ffi_generate_cubin()``: Compiles CUDA source to CUBIN using nvcc
+
+ - ``OUTPUT``: Path to output CUBIN file
+ - ``SOURCE``: Path to CUDA source file
+ - ``ARCH``: Target GPU architecture (default: ``native`` for auto-detection)
+ - ``OPTIONS``: Additional nvcc compiler options (optional)
+ - ``DEPENDS``: Additional dependencies (optional)
+
+- ``tvm_ffi_embed_cubin()``: Compiles C++ source and embeds CUBIN data
+
+ - ``OUTPUT``: Path to output combined object file
+ - ``SOURCE``: Path to C++ source file with ``TVM_FFI_EMBED_CUBIN`` macro
+ - ``CUBIN``: Path to CUBIN file to embed
+ - ``NAME``: Symbol name used in ``TVM_FFI_EMBED_CUBIN(name)`` macro
+ - ``DEPENDS``: Additional dependencies (optional)
+
+The utilities automatically handle:
+
+- Compiling C++ source to intermediate object file
+- Creating CUBIN symbols with proper naming
+- Merging object files using ``ld -r``
+- Adding ``.note.GNU-stack`` section for security
+- Localizing symbols to prevent conflicts
+
+Embedding CUBIN with Python Utility
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For more advanced use cases or non-CMake build systems, you can use the Python command-line utility to embed CUBIN data into existing object files.
+
+**Command-Line Usage:**
+
+.. code-block:: bash
+
+ # Step 1: Compile C++ source to object file
+ g++ -c -fPIC -std=c++17 -I/path/to/tvm-ffi/include mycode.cc -o mycode.o
+
+ # Step 2: Embed CUBIN into the object file
+ python -m tvm_ffi.utils.embed_cubin \
+ --output-obj mycode_with_cubin.o \
+ --input-obj mycode.o \
+ --cubin kernel.cubin \
+ --name my_kernels
+
+ # Step 3: Link into final library
+ g++ -o mylib.so -shared mycode_with_cubin.o -lcudart
+
+**Python API:**
+
+.. code-block:: python
+
+ from pathlib import Path
+ from tvm_ffi.utils.embed_cubin import embed_cubin
+
+ embed_cubin(
+ cubin_path=Path("kernel.cubin"),
+ input_obj_path=Path("mycode.o"),
+ output_obj_path=Path("mycode_with_cubin.o"),
+ name="my_kernels",
+ verbose=True # Optional: print detailed progress
+ )
+
+The Python utility performs these steps:
+
+1. Creates intermediate CUBIN object file using ``ld -r -b binary``
+2. Adds ``.note.GNU-stack`` section for security
+3. Renames symbols to match TVM-FFI format (``__tvm_ffi__cubin_<name>``)
+4. Merges with input object file using relocatable linking
+5. Localizes symbols to prevent conflicts when multiple object files use the same name
+
+
+Manual CUBIN Embedding
+~~~~~~~~~~~~~~~~~~~~~~
+
+For reference, here's how to manually embed CUBIN using objcopy and ld:
+
+**Step 1: Compile CUDA kernel to CUBIN**
+
+.. code-block:: bash
+
+ nvcc --cubin -arch=sm_75 kernel.cu -o kernel.cubin
+
+**Step 2: Convert CUBIN to object file**
+
+.. code-block:: bash
+
+ ld -r -b binary -o kernel_data.o kernel.cubin
+
+**Step 3: Rename symbols with objcopy**
+
+.. code-block:: bash
+
+ objcopy --rename-section .data=.rodata,alloc,load,readonly,data,contents \
+ --redefine-sym _binary_kernel_cubin_start=__tvm_ffi__cubin_my_kernels \
+ --redefine-sym _binary_kernel_cubin_end=__tvm_ffi__cubin_my_kernels_end \
+ kernel_data.o
+
+**Step 4: Link with your library**
+
+.. code-block:: bash
+
+ g++ -o mylib.so -shared mycode.cc kernel_data.o -Wl,-z,noexecstack -lcudart
+
+The symbol names must match the name used in :c:macro:`TVM_FFI_EMBED_CUBIN`.
+
+**When to Use Each Approach:**
+
+- **CMake utilities**: Best for CMake-based projects, provides cleanest integration (recommended)
+- **Python utility**: Best for custom build systems, Makefile-based projects, or advanced workflows (recommended)
+- **Manual objcopy**: Low-level approach, useful for understanding the process or debugging (only for customized use cases)
+
+Advanced Topics
+---------------
+
+Multi-GPU Support
+~~~~~~~~~~~~~~~~~
+
+The CUBIN launcher automatically handles multi-GPU execution through CUDA primary contexts. Kernels will execute on the device associated with the input tensors:
+
+.. code-block:: cpp
+
+ void MultiGPUExample(tvm::ffi::TensorView x_gpu0, tvm::ffi::TensorView x_gpu1) {
+ static auto kernel = TVM_FFI_EMBED_CUBIN_GET_KERNEL(my_kernels, "process");
+
+ // Launch on GPU 0 (device determined by x_gpu0.device())
+ LaunchOnDevice(kernel, x_gpu0);
+
+ // Launch on GPU 1 (device determined by x_gpu1.device())
+ LaunchOnDevice(kernel, x_gpu1);
+ }
+
+The :cpp:class:`tvm::ffi::CubinKernel` automatically uses the device context from the input tensors.
+
+Kernel Launch Configuration
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When writing the C++ wrapper, important considerations include:
+
+- **Grid/Block Dimensions**: Use :cpp:type:`tvm::ffi::dim3` for 1D, 2D, or 3D configurations
+
+ - 1D: ``dim3(x)`` → ``(x, 1, 1)``
+ - 2D: ``dim3(x, y)`` → ``(x, y, 1)``
+ - 3D: ``dim3(x, y, z)`` → ``(x, y, z)``
+
+- **Kernel Arguments**: Must be pointers to actual values
+
+ - For device pointers: ``void* ptr = tensor.data_ptr(); args[] = {&ptr}``
+ - For scalars: ``int n = 42; args[] = {&n}``
+
+- **Stream Management**: Use ``TVMFFIEnvGetStream`` to get the correct CUDA stream for synchronization with DLPack tensors
+
+- **Error Checking**: Always use :c:macro:`TVM_FFI_CHECK_CUDA_ERROR` to validate CUDA Runtime API results
+
+Dynamic Shared Memory
+~~~~~~~~~~~~~~~~~~~~~
+
+To use dynamic shared memory, specify the size in the :cpp:func:`tvm::ffi::CubinKernel::Launch` call:
+
+.. code-block:: cpp
+
+ // Allocate 1KB of dynamic shared memory
+ uint32_t shared_mem_bytes = 1024;
+ cudaError_t result = kernel.Launch(args, grid, block, stream, shared_mem_bytes);
+
+Integration with Different Compilers
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The CUBIN launcher works with various CUDA compilation tools:
+
+- **NVCC**: Standard NVIDIA compiler, produces highly optimized CUBIN
+- **NVRTC**: Runtime compilation for JIT scenarios (via :py:mod:`tvm_ffi.cpp.nvrtc`)
+- **Triton**: High-level DSL that compiles to CUBIN
+- **Custom compilers**: Any tool that generates valid CUDA CUBIN
+
+Complete Examples
+-----------------
+
+For complete working examples, see the ``examples/cubin_launcher/`` directory:
+
+- ``embedded_cubin/`` - Pre-compiled CUBIN embedded at build time
+- ``dynamic_cubin/`` - CUBIN data passed dynamically at runtime
+- ``example_nvrtc_cubin.py`` - NVRTC runtime compilation
+- ``example_triton_cubin.py`` - Triton kernel compilation
+
+These examples demonstrate:
+
+- Compiling CUDA kernels to CUBIN
+- Embedding CUBIN in C++ modules
+- Launching kernels with proper error handling
+- Testing and verification
+
+API Reference
+-------------
+
+C++ Classes
+~~~~~~~~~~~
+
+- :cpp:class:`tvm::ffi::CubinModule`: RAII wrapper for CUBIN module lifecycle
+
+ - :cpp:func:`tvm::ffi::CubinModule::CubinModule`: Load CUBIN from memory
+ - :cpp:func:`tvm::ffi::CubinModule::GetKernel`: Get kernel by name
+ - :cpp:func:`tvm::ffi::CubinModule::GetKernelWithMaxDynamicSharedMemory`: Get kernel by name with maximum dynamic shared memory set
+ - :cpp:func:`tvm::ffi::CubinModule::operator[]`: Convenient kernel access
+
+- :cpp:class:`tvm::ffi::CubinKernel`: Handle for launching kernels
+
+ - :cpp:func:`tvm::ffi::CubinKernel::Launch`: Launch kernel with specified parameters
+
+- :cpp:type:`tvm::ffi::dim3`: 3D dimension structure
+
+ - ``dim3()``: Default (1, 1, 1)
+ - ``dim3(unsigned int x)``: 1D
+ - ``dim3(unsigned int x, unsigned int y)``: 2D
+ - ``dim3(unsigned int x, unsigned int y, unsigned int z)``: 3D
+
+C++ Macros
+~~~~~~~~~~
+
+- :c:macro:`TVM_FFI_EMBED_CUBIN`: Declare embedded CUBIN module
+- :c:macro:`TVM_FFI_EMBED_CUBIN_GET_KERNEL`: Get kernel from embedded module
+- :c:macro:`TVM_FFI_CHECK_CUDA_ERROR`: Check CUDA Runtime API result
+
+Python Functions
+~~~~~~~~~~~~~~~~
+
+- :py:func:`tvm_ffi.cpp.nvrtc.nvrtc_compile`: Compile CUDA source to CUBIN
+- :py:func:`tvm_ffi.cpp.load_inline`: Load inline module with embedded CUBIN
+
+Python Utilities
+~~~~~~~~~~~~~~~~
+
+- ``python -m tvm_ffi.utils.embed_cubin``: Command-line utility to embed CUBIN into object files
+
+ - ``--output-obj PATH``: Output combined object file path
+ - ``--input-obj PATH``: Input object file containing C++ code with ``TVM_FFI_EMBED_CUBIN``
+ - ``--cubin PATH``: Input CUBIN file to embed
+ - ``--name NAME``: Symbol name matching ``TVM_FFI_EMBED_CUBIN(name)`` macro
+ - ``--verbose``: Print detailed command output (optional)
+
+- :py:func:`tvm_ffi.utils.embed_cubin.embed_cubin`: Python API for embedding CUBIN
+
+ - ``cubin_path``: Path to input CUBIN file
+ - ``input_obj_path``: Path to existing object file
+ - ``output_obj_path``: Path to output combined object file
+ - ``name``: Symbol name for the embedded CUBIN
+ - ``verbose``: Enable detailed output (default: False)
+
+CMake Functions
+~~~~~~~~~~~~~~~
+
+- ``tvm_ffi_generate_cubin()``: Compile CUDA source to CUBIN
+
+ - ``OUTPUT``: Path to output CUBIN file
+ - ``SOURCE``: Path to CUDA source file (.cu)
+ - ``ARCH``: Target architecture (default: ``native``)
+ - ``OPTIONS``: Additional nvcc compiler flags (optional)
+ - ``DEPENDS``: Additional dependencies (optional)
+
+- ``tvm_ffi_embed_cubin()``: Compile C++ source and embed CUBIN data
+
+ - ``OUTPUT``: Path to output combined object file
+ - ``SOURCE``: Path to C++ source file
+ - ``CUBIN``: Path to CUBIN file to embed
+ - ``NAME``: Symbol name matching ``TVM_FFI_EMBED_CUBIN(name)`` in source
+ - ``DEPENDS``: Additional dependencies (optional)
diff --git a/ffi/_sources/guides/kernel_library_guide.rst b/ffi/_sources/guides/kernel_library_guide.rst
index 8966e306d6..82b1bff119 100644
--- a/ffi/_sources/guides/kernel_library_guide.rst
+++ b/ffi/_sources/guides/kernel_library_guide.rst
@@ -145,6 +145,21 @@ Explicit Update
Once the devices on which the stream contexts reside cannot be inferred from the tensors, the explicit update on stream context table is necessary. TVM FFI provides :py:func:`tvm_ffi.use_torch_stream` and :py:func:`tvm_ffi.use_raw_stream` for manual stream context update. However, it is **recommended** to use implicit update above, to reduce code complexity.
+Device Guard
+============
+
+When launching kernels, kernel libraries may require the current device context to be set for a specific device. TVM FFI provides the :cpp:class:`tvm::ffi::CUDADeviceGuard` class to manage this, similar to :cpp:class:`c10::cuda::CUDAGuard`. When a :cpp:class:`tvm::ffi::CUDADeviceGuard` object is constructed with a device index, it saves the original device index (retrieved using ``cudaGetDevice``) and sets the current device to the given index (using ``cudaSetDevice``). Upon destruction [...]
+
+.. code-block:: c++
+
+ void func(ffi::TensorView input, ...) {
+ // current device index is original device index
+ ffi::CUDADeviceGuard device_guard(input.device().device_id);
+ // current device index is input device index
+ }
+
+After ``func`` returns, the ``device_guard`` is destructed, and the original device index is restored.
+
Function Exporting
==================
diff --git a/ffi/_sources/index.rst b/ffi/_sources/index.rst
index bb7fa75d1c..23e67d0b78 100644
--- a/ffi/_sources/index.rst
+++ b/ffi/_sources/index.rst
@@ -58,6 +58,7 @@ Table of Contents
guides/cpp_guide.md
guides/python_guide.md
guides/rust_guide.md
+ guides/cubin_launcher.rst
guides/compiler_integration.md
guides/build_from_source.md
guides/kernel_library_guide.rst
diff --git a/ffi/_sources/reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.rst b/ffi/_sources/reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.rst
new file mode 100644
index 0000000000..6f55982723
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.rst
@@ -0,0 +1,17 @@
+.. _exhale_class_classtvm_1_1ffi_1_1CubinKernel:
+
+Class CubinKernel
+=================
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+
+Class Documentation
+-------------------
+
+
+.. doxygenclass:: tvm::ffi::CubinKernel
+ :project: tvm-ffi
+ :members:
+ :protected-members:
+ :undoc-members:
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.rst b/ffi/_sources/reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.rst
new file mode 100644
index 0000000000..ed2b708854
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.rst
@@ -0,0 +1,17 @@
+.. _exhale_class_classtvm_1_1ffi_1_1CubinModule:
+
+Class CubinModule
+=================
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+
+Class Documentation
+-------------------
+
+
+.. doxygenclass:: tvm::ffi::CubinModule
+ :project: tvm-ffi
+ :members:
+ :protected-members:
+ :undoc-members:
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.rst b/ffi/_sources/reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.rst
new file mode 100644
index 0000000000..5a9102cbb7
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.rst
@@ -0,0 +1,14 @@
+.. _exhale_define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade:
+
+Define TVM_FFI_EMBED_CUBIN
+==========================
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+
+Define Documentation
+--------------------
+
+
+.. doxygendefine:: TVM_FFI_EMBED_CUBIN
+ :project: tvm-ffi
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.rst b/ffi/_sources/reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.rst
new file mode 100644
index 0000000000..23b58e7b65
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.rst
@@ -0,0 +1,14 @@
+.. _exhale_define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc:
+
+Define TVM_FFI_EMBED_CUBIN_GET_KERNEL
+=====================================
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+
+Define Documentation
+--------------------
+
+
+.. doxygendefine:: TVM_FFI_EMBED_CUBIN_GET_KERNEL
+ :project: tvm-ffi
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.rst b/ffi/_sources/reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.rst
new file mode 100644
index 0000000000..1b8712f665
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.rst
@@ -0,0 +1,14 @@
+.. _exhale_define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1:
+
+Define TVM_FFI_CHECK_CUDA_ERROR
+===============================
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_base.h`
+
+
+Define Documentation
+--------------------
+
+
+.. doxygendefine:: TVM_FFI_CHECK_CUDA_ERROR
+ :project: tvm-ffi
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.rst b/ffi/_sources/reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.rst
new file mode 100644
index 0000000000..f7773372fe
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.rst
@@ -0,0 +1,14 @@
+.. _exhale_define_function_8h_1a78c6d17c063fba9ca07175f150838046:
+
+Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA
+==========================================
+
+- Defined in :ref:`file_tvm_ffi_function.h`
+
+
+Define Documentation
+--------------------
+
+
+.. doxygendefine:: TVM_FFI_DLL_EXPORT_INCLUDE_METADATA
+ :project: tvm-ffi
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.rst b/ffi/_sources/reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.rst
new file mode 100644
index 0000000000..a9f614c8f9
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.rst
@@ -0,0 +1,14 @@
+.. _exhale_define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd:
+
+Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC
+========================================
+
+- Defined in :ref:`file_tvm_ffi_function.h`
+
+
+Define Documentation
+--------------------
+
+
+.. doxygendefine:: TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC
+ :project: tvm-ffi
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra.rst b/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra.rst
index b2116d9137..cb7184b6ea 100644
--- a/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra.rst
+++ b/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra.rst
@@ -12,6 +12,11 @@ Directory extra
*Directory path:* ``tvm/ffi/extra``
+Subdirectories
+--------------
+
+- :ref:`dir_tvm_ffi_extra_cuda`
+
Files
-----
@@ -22,6 +27,7 @@ Files
- :ref:`file_tvm_ffi_extra_json.h`
- :ref:`file_tvm_ffi_extra_module.h`
- :ref:`file_tvm_ffi_extra_serialization.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
- :ref:`file_tvm_ffi_extra_structural_equal.h`
- :ref:`file_tvm_ffi_extra_structural_hash.h`
diff --git a/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra_cuda.rst b/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra_cuda.rst
new file mode 100644
index 0000000000..7285d47b3f
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/dir_tvm_ffi_extra_cuda.rst
@@ -0,0 +1,23 @@
+.. _dir_tvm_ffi_extra_cuda:
+
+
+Directory cuda
+==============
+
+
+|exhale_lsh| :ref:`Parent directory <dir_tvm_ffi_extra>` (``tvm/ffi/extra``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+
+*Directory path:* ``tvm/ffi/extra/cuda``
+
+
+Files
+-----
+
+- :ref:`file_tvm_ffi_extra_cuda_base.h`
+- :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+- :ref:`file_tvm_ffi_extra_cuda_device_guard.h`
+
+
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_base_details.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_base_details.h.rst
index af57118567..0f23d2cd2d 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_base_details.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_base_details.h.rst
@@ -59,6 +59,8 @@ Included By
- :ref:`file_tvm_ffi_error.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_function.h`
- :ref:`file_tvm_ffi_function_details.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_c_api.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_c_api.h.rst
index 56e50438d5..b33ed488cf 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_c_api.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_c_api.h.rst
@@ -50,6 +50,8 @@ Included By
- :ref:`file_tvm_ffi_extra_c_env_api.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_function.h`
- :ref:`file_tvm_ffi_function_details.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_array.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_array.h.rst
index 4c54514905..9d4b4c163c 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_array.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_array.h.rst
@@ -75,6 +75,8 @@ Included By
- :ref:`file_tvm_ffi_extra_module.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_reflection_access_path.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_map.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_map.h.rst
index 3f3ecae3c2..9ddc3eb2eb 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_map.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_container_map.h.rst
@@ -67,6 +67,8 @@ Included By
- :ref:`file_tvm_ffi_extra_module.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_reflection_creator.h`
- :ref:`file_tvm_ffi_reflection_registry.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_error.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_error.h.rst
index 1a56f61098..cec747b092 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_error.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_error.h.rst
@@ -66,6 +66,12 @@ Included By
- :ref:`file_tvm_ffi_dtype.h`
+- :ref:`file_tvm_ffi_extra_cuda_base.h`
+
+- :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_function.h`
- :ref:`file_tvm_ffi_function_details.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_c_env_api.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_c_env_api.h.rst
index f37ba3b5b7..7445e3b91b 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_c_env_api.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_c_env_api.h.rst
@@ -39,6 +39,12 @@ Includes
+Included By
+-----------
+
+
+- :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_base.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_base.h.rst
new file mode 100644
index 0000000000..2e18388f5d
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_base.h.rst
@@ -0,0 +1,69 @@
+
+.. _file_tvm_ffi_extra_cuda_base.h:
+
+File base.h
+===========
+
+|exhale_lsh| :ref:`Parent directory <dir_tvm_ffi_extra_cuda>` (``tvm/ffi/extra/cuda``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+
+
+CUDA base utilities.
+
+
+
+.. contents:: Contents
+ :local:
+ :backlinks: none
+
+Definition (``tvm/ffi/extra/cuda/base.h``)
+------------------------------------------
+
+
+.. toctree::
+ :maxdepth: 1
+
+ program_listing_file_tvm_ffi_extra_cuda_base.h.rst
+
+
+
+
+
+Includes
+--------
+
+
+- ``cuda_runtime.h``
+
+- ``tvm/ffi/error.h`` (:ref:`file_tvm_ffi_error.h`)
+
+
+
+Included By
+-----------
+
+
+- :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+- :ref:`file_tvm_ffi_extra_cuda_device_guard.h`
+
+
+
+
+Namespaces
+----------
+
+
+- :ref:`namespace_tvm`
+
+- :ref:`namespace_tvm__ffi`
+
+
+Defines
+-------
+
+
+- :ref:`exhale_define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1`
+
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_cubin_launcher.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_cubin_launcher.h.rst
new file mode 100644
index 0000000000..c1f452b062
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_cubin_launcher.h.rst
@@ -0,0 +1,98 @@
+
+.. _file_tvm_ffi_extra_cuda_cubin_launcher.h:
+
+File cubin_launcher.h
+=====================
+
+|exhale_lsh| :ref:`Parent directory <dir_tvm_ffi_extra_cuda>` (``tvm/ffi/extra/cuda``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+
+
+CUDA CUBIN launcher utility for loading and executing CUDA kernels.
+
+
+
+.. contents:: Contents
+ :local:
+ :backlinks: none
+
+Definition (``tvm/ffi/extra/cuda/cubin_launcher.h``)
+----------------------------------------------------
+
+
+.. toctree::
+ :maxdepth: 1
+
+ program_listing_file_tvm_ffi_extra_cuda_cubin_launcher.h.rst
+
+
+
+Detailed Description
+--------------------
+
+This header provides a lightweight C++ wrapper around CUDA Runtime API for loading CUBIN modules and launching kernels. It supports:
+
+- Loading CUBIN from memory (embedded data)
+
+- Multi-GPU execution using CUDA primary contexts
+
+- Kernel parameter management and launch configuration
+
+
+
+
+
+
+Includes
+--------
+
+
+- ``cstdint``
+
+- ``cstring``
+
+- ``cuda_runtime.h``
+
+- ``tvm/ffi/error.h`` (:ref:`file_tvm_ffi_error.h`)
+
+- ``tvm/ffi/extra/c_env_api.h`` (:ref:`file_tvm_ffi_extra_c_env_api.h`)
+
+- ``tvm/ffi/extra/cuda/base.h`` (:ref:`file_tvm_ffi_extra_cuda_base.h`)
+
+- ``tvm/ffi/string.h`` (:ref:`file_tvm_ffi_string.h`)
+
+
+
+
+
+
+Namespaces
+----------
+
+
+- :ref:`namespace_tvm`
+
+- :ref:`namespace_tvm__ffi`
+
+
+Classes
+-------
+
+
+- :ref:`exhale_struct_structtvm_1_1ffi_1_1dim3`
+
+- :ref:`exhale_class_classtvm_1_1ffi_1_1CubinKernel`
+
+- :ref:`exhale_class_classtvm_1_1ffi_1_1CubinModule`
+
+
+Defines
+-------
+
+
+- :ref:`exhale_define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade`
+
+- :ref:`exhale_define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc`
+
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_device_guard.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_device_guard.h.rst
new file mode 100644
index 0000000000..843f25fc4d
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_cuda_device_guard.h.rst
@@ -0,0 +1,59 @@
+
+.. _file_tvm_ffi_extra_cuda_device_guard.h:
+
+File device_guard.h
+===================
+
+|exhale_lsh| :ref:`Parent directory <dir_tvm_ffi_extra_cuda>` (``tvm/ffi/extra/cuda``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+
+
+Device guard structs.
+
+
+
+.. contents:: Contents
+ :local:
+ :backlinks: none
+
+Definition (``tvm/ffi/extra/cuda/device_guard.h``)
+--------------------------------------------------
+
+
+.. toctree::
+ :maxdepth: 1
+
+ program_listing_file_tvm_ffi_extra_cuda_device_guard.h.rst
+
+
+
+
+
+Includes
+--------
+
+
+- ``tvm/ffi/extra/cuda/base.h`` (:ref:`file_tvm_ffi_extra_cuda_base.h`)
+
+
+
+
+
+
+Namespaces
+----------
+
+
+- :ref:`namespace_tvm`
+
+- :ref:`namespace_tvm__ffi`
+
+
+Classes
+-------
+
+
+- :ref:`exhale_struct_structtvm_1_1ffi_1_1CUDADeviceGuard`
+
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_module.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_module.h.rst
index 51c4a6d209..e5aa8d961f 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_module.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_module.h.rst
@@ -74,6 +74,8 @@ Variables
---------
+- :ref:`exhale_variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb`
+
- :ref:`exhale_variable_module_8h_1aae0405c7615139afd4f68b72a862cffe`
- :ref:`exhale_variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_stl.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_stl.h.rst
new file mode 100644
index 0000000000..1ac0525401
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_extra_stl.h.rst
@@ -0,0 +1,104 @@
+
+.. _file_tvm_ffi_extra_stl.h:
+
+File stl.h
+==========
+
+|exhale_lsh| :ref:`Parent directory <dir_tvm_ffi_extra>` (``tvm/ffi/extra``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+
+
+STL container support.
+
+
+
+.. contents:: Contents
+ :local:
+ :backlinks: none
+
+Definition (``tvm/ffi/extra/stl.h``)
+------------------------------------
+
+
+.. toctree::
+ :maxdepth: 1
+
+ program_listing_file_tvm_ffi_extra_stl.h.rst
+
+
+
+Detailed Description
+--------------------
+
+This file is an extra extension of TVM FFI, which provides support for STL containers in C++ exported functions.
+
+Whenever possible, prefer using tvm/ffi/container/ implementations, such as ``tvm::ffi::Array`` and ``tvm::ffi::Tuple``, over STL containers.
+
+Native ffi objects comes with stable data layout and can be directly accessed through compiled languages (Rust) and DSLs(via LLVM) with raw pointer access for better performance and compatibility.
+
+
+
+
+Includes
+--------
+
+
+- ``algorithm``
+
+- ``array`` (:ref:`file_tvm_ffi_container_array.h`)
+
+- ``cstddef``
+
+- ``cstdint``
+
+- ``exception``
+
+- ``functional``
+
+- ``iterator``
+
+- ``map`` (:ref:`file_tvm_ffi_container_map.h`)
+
+- ``optional`` (:ref:`file_tvm_ffi_optional.h`)
+
+- ``tuple`` (:ref:`file_tvm_ffi_container_tuple.h`)
+
+- ``tvm/ffi/base_details.h`` (:ref:`file_tvm_ffi_base_details.h`)
+
+- ``tvm/ffi/c_api.h`` (:ref:`file_tvm_ffi_c_api.h`)
+
+- ``tvm/ffi/container/array.h`` (:ref:`file_tvm_ffi_container_array.h`)
+
+- ``tvm/ffi/container/map.h`` (:ref:`file_tvm_ffi_container_map.h`)
+
+- ``tvm/ffi/error.h`` (:ref:`file_tvm_ffi_error.h`)
+
+- ``tvm/ffi/function.h`` (:ref:`file_tvm_ffi_function.h`)
+
+- ``tvm/ffi/object.h`` (:ref:`file_tvm_ffi_object.h`)
+
+- ``tvm/ffi/type_traits.h`` (:ref:`file_tvm_ffi_type_traits.h`)
+
+- ``type_traits`` (:ref:`file_tvm_ffi_type_traits.h`)
+
+- ``utility``
+
+- ``variant`` (:ref:`file_tvm_ffi_container_variant.h`)
+
+- ``vector``
+
+
+
+
+
+
+Namespaces
+----------
+
+
+- :ref:`namespace_tvm`
+
+- :ref:`namespace_tvm__ffi`
+
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_function.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_function.h.rst
index 2e3db2a071..c77ba7ab90 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_function.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_function.h.rst
@@ -37,6 +37,8 @@ Includes
- ``functional``
+- ``sstream``
+
- ``string`` (:ref:`file_tvm_ffi_string.h`)
- ``tvm/ffi/any.h`` (:ref:`file_tvm_ffi_any.h`)
@@ -65,6 +67,8 @@ Included By
- :ref:`file_tvm_ffi_extra_module.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_reflection_accessor.h`
- :ref:`file_tvm_ffi_reflection_registry.h`
@@ -109,8 +113,12 @@ Defines
- :ref:`exhale_define_function_8h_1a14328d95ccda4b1691b9874645aef4bd`
+- :ref:`exhale_define_function_8h_1a78c6d17c063fba9ca07175f150838046`
+
- :ref:`exhale_define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4`
+- :ref:`exhale_define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd`
+
- :ref:`exhale_define_function_8h_1a10bd932564c8e71a3978a061fbb82360`
- :ref:`exhale_define_function_8h_1ae3c016c4bf383aa205b4485edd7ca17c`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_object.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_object.h.rst
index 87794e8d68..3fe8aa2881 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_object.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_object.h.rst
@@ -63,6 +63,8 @@ Included By
- :ref:`file_tvm_ffi_error.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_memory.h`
- :ref:`file_tvm_ffi_optional.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_string.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_string.h.rst
index 41fbab0cb7..4eca6c4fe3 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_string.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_string.h.rst
@@ -69,6 +69,8 @@ Included By
- :ref:`file_tvm_ffi_extra_base64.h`
+- :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
- :ref:`file_tvm_ffi_optional.h`
- :ref:`file_tvm_ffi_reflection_creator.h`
diff --git a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_type_traits.h.rst b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_type_traits.h.rst
index be79fd7ad1..25988337eb 100644
--- a/ffi/_sources/reference/cpp/generated/file_tvm_ffi_type_traits.h.rst
+++ b/ffi/_sources/reference/cpp/generated/file_tvm_ffi_type_traits.h.rst
@@ -58,6 +58,8 @@ Included By
- :ref:`file_tvm_ffi_dtype.h`
+- :ref:`file_tvm_ffi_extra_stl.h`
+
- :ref:`file_tvm_ffi_reflection_accessor.h`
- :ref:`file_tvm_ffi_reflection_registry.h`
diff --git a/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi.rst b/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi.rst
index d5d68af060..bc284489c9 100644
--- a/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi.rst
+++ b/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi.rst
@@ -32,12 +32,16 @@ Classes
- :ref:`exhale_struct_structtvm_1_1ffi_1_1AnyHash`
+- :ref:`exhale_struct_structtvm_1_1ffi_1_1CUDADeviceGuard`
+
- :ref:`exhale_struct_structtvm_1_1ffi_1_1DenseMapObj_1_1Block`
- :ref:`exhale_struct_structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType`
- :ref:`exhale_struct_structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode`
+- :ref:`exhale_struct_structtvm_1_1ffi_1_1dim3`
+
- :ref:`exhale_struct_structtvm_1_1ffi_1_1EnvErrorAlreadySet`
- :ref:`exhale_struct_structtvm_1_1ffi_1_1FallbackOnlyTraitsBase`
@@ -72,6 +76,10 @@ Classes
- :ref:`exhale_class_classtvm_1_1ffi_1_1Bytes`
+- :ref:`exhale_class_classtvm_1_1ffi_1_1CubinKernel`
+
+- :ref:`exhale_class_classtvm_1_1ffi_1_1CubinModule`
+
- :ref:`exhale_class_classtvm_1_1ffi_1_1DenseMapObj`
- :ref:`exhale_class_classtvm_1_1ffi_1_1Error`
@@ -164,14 +172,14 @@ Functions
- :ref:`exhale_function_serialization_8h_1a56baa5d1ca415dbdebf19ac1f54bd5b7`
+- :ref:`exhale_function_tensor_8h_1a71e4a492b5a03a19a95087771a7e9ed1`
+
- :ref:`exhale_function_tensor_8h_1a65b3a61c540c72d9410150a3a7a76dde`
- :ref:`exhale_function_tensor_8h_1a011d0a2dcbe5702156124d7a7223b3dd`
- :ref:`exhale_function_tensor_8h_1a226723176642cde5996498e7da6a6368`
-- :ref:`exhale_function_tensor_8h_1a71e4a492b5a03a19a95087771a7e9ed1`
-
- :ref:`exhale_function_cast_8h_1a4dba749dd934d8a7891ad126a8fdcc1f`
- :ref:`exhale_function_cast_8h_1a3c5fed9bb23b4804b61037c8ac4874f1`
diff --git a/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi__symbol.rst b/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi__symbol.rst
index 79e2be0d2d..229f85c3f8 100644
--- a/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi__symbol.rst
+++ b/ffi/_sources/reference/cpp/generated/namespace_tvm__ffi__symbol.rst
@@ -17,6 +17,8 @@ Variables
---------
+- :ref:`exhale_variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb`
+
- :ref:`exhale_variable_module_8h_1aae0405c7615139afd4f68b72a862cffe`
- :ref:`exhale_variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58`
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_c_api.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_c_api.h.rst
index dce5ec256f..1618cb246e 100644
--- a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_c_api.h.rst
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_c_api.h.rst
@@ -75,7 +75,7 @@ Program Listing for File c_api.h
// NOLINTBEGIN(modernize-macro-to-enum)
#define TVM_FFI_VERSION_MAJOR 0
#define TVM_FFI_VERSION_MINOR 1
- #define TVM_FFI_VERSION_PATCH 3
+ #define TVM_FFI_VERSION_PATCH 5
// NOLINTEND(modernize-macro-to-enum)
#ifdef __cplusplus
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_container_map.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_container_map.h.rst
index 751f7eafcd..d2593602fe 100644
--- a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_container_map.h.rst
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_container_map.h.rst
@@ -157,6 +157,9 @@ Program Listing for File map.h
// Reference class
template <typename, typename, typename>
friend class Map;
+
+ template <typename, typename>
+ friend struct TypeTraits;
};
class SmallMapObj : public MapObj,
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_base.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_base.h.rst
new file mode 100644
index 0000000000..d55f0cb096
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_base.h.rst
@@ -0,0 +1,54 @@
+
+.. _program_listing_file_tvm_ffi_extra_cuda_base.h:
+
+Program Listing for File base.h
+===============================
+
+|exhale_lsh| :ref:`Return to documentation for file <file_tvm_ffi_extra_cuda_base.h>` (``tvm/ffi/extra/cuda/base.h``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+.. code-block:: cpp
+
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ #ifndef TVM_FFI_EXTRA_CUDA_BASE_H_
+ #define TVM_FFI_EXTRA_CUDA_BASE_H_
+
+ #include <cuda_runtime.h>
+ #include <tvm/ffi/error.h>
+
+ namespace tvm {
+ namespace ffi {
+
+ #define TVM_FFI_CHECK_CUDA_ERROR(stmt) \
+ do { \
+ cudaError_t __err = (stmt); \
+ if (__err != cudaSuccess) { \
+ const char* __err_name = cudaGetErrorName(__err); \
+ const char* __err_str = cudaGetErrorString(__err); \
+ TVM_FFI_THROW(RuntimeError) << "CUDA Runtime Error: " << __err_name << " (" \
+ << static_cast<int>(__err) << "): " << __err_str; \
+ } \
+ } while (0)
+
+ } // namespace ffi
+ } // namespace tvm
+
+ #endif // TVM_FFI_EXTRA_CUDA_BASE_H_
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_cubin_launcher.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_cubin_launcher.h.rst
new file mode 100644
index 0000000000..ee67653608
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_cubin_launcher.h.rst
@@ -0,0 +1,236 @@
+
+.. _program_listing_file_tvm_ffi_extra_cuda_cubin_launcher.h:
+
+Program Listing for File cubin_launcher.h
+=========================================
+
+|exhale_lsh| :ref:`Return to documentation for file <file_tvm_ffi_extra_cuda_cubin_launcher.h>` (``tvm/ffi/extra/cuda/cubin_launcher.h``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+.. code-block:: cpp
+
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ #ifndef TVM_FFI_EXTRA_CUDA_CUBIN_LAUNCHER_H_
+ #define TVM_FFI_EXTRA_CUDA_CUBIN_LAUNCHER_H_
+
+ #include <cuda_runtime.h>
+ #include <tvm/ffi/error.h>
+ #include <tvm/ffi/extra/c_env_api.h>
+ #include <tvm/ffi/extra/cuda/base.h>
+ #include <tvm/ffi/string.h>
+
+ #include <cstdint>
+ #include <cstring>
+
+ namespace tvm {
+ namespace ffi {
+
+ struct dim3 {
+ unsigned int x;
+ unsigned int y;
+ unsigned int z;
+
+ dim3() : x(1), y(1), z(1) {}
+
+ explicit dim3(unsigned int x_) : x(x_), y(1), z(1) {}
+
+ dim3(unsigned int x_, unsigned int y_) : x(x_), y(y_), z(1) {}
+
+ dim3(unsigned int x_, unsigned int y_, unsigned int z_) : x(x_), y(y_), z(z_) {}
+ };
+
+ #define TVM_FFI_EMBED_CUBIN(name) \
+ extern "C" const char __tvm_ffi__cubin_##name[]; \
+ extern "C" const char __tvm_ffi__cubin_##name##_end[]; \
+ namespace { \
+ struct EmbedCubinModule_##name { \
+ tvm::ffi::CubinModule mod{__tvm_ffi__cubin_##name}; \
+ static EmbedCubinModule_##name* Global() { \
+ static EmbedCubinModule_##name inst; \
+ return &inst; \
+ } \
+ }; \
+ } /* anonymous namespace */
+
+ #define TVM_FFI_EMBED_CUBIN_GET_KERNEL(name, kernel_name) \
+ (EmbedCubinModule_##name::Global()->mod[kernel_name])
+
+ // Forward declaration
+ class CubinKernel;
+
+ class CubinModule {
+ public:
+ explicit CubinModule(const Bytes& bytes) {
+ TVM_FFI_CHECK_CUDA_ERROR(
+ cudaLibraryLoadData(&library_, bytes.data(), nullptr, nullptr, 0, nullptr, nullptr, 0));
+ }
+
+ explicit CubinModule(const char* code) {
+ TVM_FFI_CHECK_CUDA_ERROR(
+ cudaLibraryLoadData(&library_, code, nullptr, nullptr, 0, nullptr, nullptr, 0));
+ }
+
+ ~CubinModule() {
+ if (library_ != nullptr) {
+ cudaLibraryUnload(library_);
+ }
+ }
+
+ CubinKernel GetKernel(const char* name);
+
+ CubinKernel GetKernelWithMaxDynamicSharedMemory(const char* name, int64_t dynamic_smem_max);
+
+ CubinKernel operator[](const char* name);
+
+ cudaLibrary_t GetHandle() const { return library_; }
+
+ // Non-copyable
+ CubinModule(const CubinModule&) = delete;
+ CubinModule& operator=(const CubinModule&) = delete;
+
+ CubinModule(CubinModule&& other) noexcept : library_(other.library_) { other.library_ = nullptr; }
+
+ CubinModule& operator=(CubinModule&& other) noexcept {
+ if (this != &other) {
+ if (library_ != nullptr) {
+ cudaLibraryUnload(library_);
+ }
+ library_ = other.library_;
+ other.library_ = nullptr;
+ }
+ return *this;
+ }
+
+ private:
+ cudaLibrary_t library_ = nullptr;
+ };
+
+ class CubinKernel {
+ public:
+ CubinKernel(cudaLibrary_t library, const char* name) {
+ TVM_FFI_CHECK_CUDA_ERROR(cudaLibraryGetKernel(&kernel_, library, name));
+ }
+
+ ~CubinKernel() = default;
+
+ cudaError_t Launch(void** args, dim3 grid, dim3 block, cudaStream_t stream,
+ uint32_t dyn_smem_bytes = 0) {
+ // Cast cudaKernel_t to const void* for use with cudaLaunchKernel
+ // The Runtime API accepts cudaKernel_t directly as a function pointer
+ auto kernel = reinterpret_cast<const void*>(kernel_);
+ return cudaLaunchKernel(kernel, {grid.x, grid.y, grid.z}, {block.x, block.y, block.z}, args,
+ dyn_smem_bytes, stream);
+ }
+
+ cudaKernel_t GetHandle() const { return kernel_; }
+
+ // Non-copyable
+ CubinKernel(const CubinKernel&) = delete;
+ CubinKernel& operator=(const CubinKernel&) = delete;
+
+ CubinKernel(CubinKernel&& other) noexcept : kernel_(other.kernel_) { other.kernel_ = nullptr; }
+
+ CubinKernel& operator=(CubinKernel&& other) noexcept {
+ if (this != &other) {
+ kernel_ = other.kernel_;
+ other.kernel_ = nullptr;
+ }
+ return *this;
+ }
+
+ private:
+ void SetMaxDynamicSharedMemory(int64_t dynamic_smem_max = -1) {
+ int device_count = 0;
+ cudaError_t err = cudaGetDeviceCount(&device_count);
+ if (err != cudaSuccess || device_count == 0) {
+ return; // No devices available, nothing to configure
+ }
+
+ bool any_success = false;
+ for (int device_id = 0; device_id < device_count; ++device_id) {
+ // Query device's maximum shared memory per block
+ int max_shared_mem = 0;
+ err = cudaDeviceGetAttribute(&max_shared_mem, cudaDevAttrMaxSharedMemoryPerBlock, device_id);
+ if (err != cudaSuccess) {
+ continue; // Skip this device if we can't get its attribute
+ }
+
+ int shared_mem_to_set;
+ if (dynamic_smem_max == -1) {
+ // Query the kernel's static shared memory usage
+ cudaFuncAttributes func_attr;
+
+ // According to the documentation, we can use cudaFuncGetAttributes to get the attributes of
+ // cudaKernel_t returned by cudaLibraryGetKernel, just cast the kernel_ to const void*
+ err = cudaFuncGetAttributes(&func_attr, reinterpret_cast<const void*>(kernel_));
+ if (err != cudaSuccess) {
+ continue; // Skip this device if we can't get kernel attributes
+ }
+
+ // Calculate available dynamic shared memory:
+ // device max shared memory - static shared memory used by kernel
+ int64_t static_shared = static_cast<int64_t>(func_attr.sharedSizeBytes);
+ int64_t max_shared = static_cast<int64_t>(max_shared_mem);
+ int64_t available = max_shared - static_shared;
+ shared_mem_to_set = (available > 0) ? static_cast<int>(available) : 0;
+ } else {
+ shared_mem_to_set = static_cast<int>(dynamic_smem_max);
+ }
+
+ // Set the maximum dynamic shared memory size for this device
+ err = cudaKernelSetAttributeForDevice(kernel_, cudaFuncAttributeMaxDynamicSharedMemorySize,
+ shared_mem_to_set, device_id);
+ if (err == cudaSuccess) {
+ any_success = true;
+ }
+ // Don't error out for individual device failures - user may only use some GPUs
+ }
+
+ // Only error out if setting failed for ALL devices
+ if (!any_success && device_count > 0) {
+ TVM_FFI_THROW(RuntimeError) << "Failed to set dynamic shared memory attribute for any device";
+ }
+ }
+
+ cudaKernel_t kernel_ = nullptr;
+
+ friend class CubinModule;
+ };
+
+ // Implementation of CubinModule methods that return CubinKernel
+ inline CubinKernel CubinModule::GetKernelWithMaxDynamicSharedMemory(const char* name,
+ int64_t dynamic_smem_max = -1) {
+ auto kernel = CubinKernel(library_, name);
+ kernel.SetMaxDynamicSharedMemory(dynamic_smem_max);
+ return kernel;
+ }
+
+ inline CubinKernel CubinModule::GetKernel(const char* name) {
+ auto kernel = CubinKernel(library_, name);
+ return kernel;
+ }
+
+ inline CubinKernel CubinModule::operator[](const char* name) { return GetKernel(name); }
+
+ } // namespace ffi
+ } // namespace tvm
+
+ #endif // TVM_FFI_EXTRA_CUDA_CUBIN_LAUNCHER_H_
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_device_guard.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_device_guard.h.rst
new file mode 100644
index 0000000000..5df7720077
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_cuda_device_guard.h.rst
@@ -0,0 +1,62 @@
+
+.. _program_listing_file_tvm_ffi_extra_cuda_device_guard.h:
+
+Program Listing for File device_guard.h
+=======================================
+
+|exhale_lsh| :ref:`Return to documentation for file <file_tvm_ffi_extra_cuda_device_guard.h>` (``tvm/ffi/extra/cuda/device_guard.h``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+.. code-block:: cpp
+
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+ #ifndef TVM_FFI_EXTRA_CUDA_DEVICE_GUARD_H_
+ #define TVM_FFI_EXTRA_CUDA_DEVICE_GUARD_H_
+
+ #include <tvm/ffi/extra/cuda/base.h>
+
+ namespace tvm {
+ namespace ffi {
+
+ struct CUDADeviceGuard {
+ CUDADeviceGuard() = delete;
+ explicit CUDADeviceGuard(int device_index) {
+ target_device_index_ = device_index;
+ TVM_FFI_CHECK_CUDA_ERROR(cudaGetDevice(&original_device_index_));
+ if (target_device_index_ != original_device_index_) {
+ TVM_FFI_CHECK_CUDA_ERROR(cudaSetDevice(device_index));
+ }
+ }
+
+ ~CUDADeviceGuard() noexcept(false) {
+ if (original_device_index_ != target_device_index_) {
+ TVM_FFI_CHECK_CUDA_ERROR(cudaSetDevice(original_device_index_));
+ }
+ }
+
+ private:
+ int original_device_index_;
+ int target_device_index_;
+ };
+
+ } // namespace ffi
+ } // namespace tvm
+ #endif // TVM_FFI_EXTRA_CUDA_DEVICE_GUARD_H_
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_module.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_module.h.rst
index 3461da6f3b..84f5af6c19 100644
--- a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_module.h.rst
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_module.h.rst
@@ -115,6 +115,7 @@ Program Listing for File module.h
constexpr const char* tvm_ffi_library_ctx = "__tvm_ffi__library_ctx";
constexpr const char* tvm_ffi_library_bin = "__tvm_ffi__library_bin";
constexpr const char* tvm_ffi_metadata_prefix = "__tvm_ffi__metadata_";
+ constexpr const char* tvm_ffi_doc_prefix = "__tvm_ffi__doc_";
} // namespace symbol
} // namespace ffi
} // namespace tvm
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_stl.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_stl.h.rst
new file mode 100644
index 0000000000..1fcee0980a
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_extra_stl.h.rst
@@ -0,0 +1,646 @@
+
+.. _program_listing_file_tvm_ffi_extra_stl.h:
+
+Program Listing for File stl.h
+==============================
+
+|exhale_lsh| :ref:`Return to documentation for file <file_tvm_ffi_extra_stl.h>` (``tvm/ffi/extra/stl.h``)
+
+.. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS
+
+.. code-block:: cpp
+
+ /*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+ #ifndef TVM_FFI_EXTRA_STL_H_
+ #define TVM_FFI_EXTRA_STL_H_
+
+ #include <tvm/ffi/base_details.h>
+ #include <tvm/ffi/c_api.h>
+ #include <tvm/ffi/container/array.h>
+ #include <tvm/ffi/container/map.h>
+ #include <tvm/ffi/error.h>
+ #include <tvm/ffi/object.h>
+ #include <tvm/ffi/type_traits.h>
+
+ #include <algorithm>
+ #include <array>
+ #include <cstddef>
+ #include <cstdint>
+ #include <exception>
+ #include <functional>
+ #include <iterator>
+ #include <map>
+ #include <optional>
+ #include <tuple>
+ #include <type_traits>
+ #include <utility>
+ #include <variant>
+ #include <vector>
+
+ #include "tvm/ffi/function.h"
+
+ namespace tvm {
+ namespace ffi {
+ namespace details {
+
+ struct STLTypeMismatch : public std::exception {
+ const char* what() const noexcept override { return "STL type mismatch"; }
+ };
+
+ struct STLTypeTrait : public TypeTraitsBase {
+ public:
+ static constexpr bool storage_enabled = false;
+
+ protected:
+ template <typename T>
+ TVM_FFI_INLINE static void MoveToAnyImpl(ObjectPtr<T>&& src, TVMFFIAny* result) {
+ TVMFFIObject* obj_ptr = ObjectUnsafe::MoveObjectPtrToTVMFFIObjectPtr(std::move(src));
+ result->type_index = obj_ptr->type_index;
+ result->zero_padding = 0;
+ TVM_FFI_CLEAR_PTR_PADDING_IN_FFI_ANY(result);
+ result->v_obj = obj_ptr;
+ }
+
+ template <typename T>
+ TVM_FFI_INLINE static ObjectPtr<T> CopyFromAnyImpl(const TVMFFIAny* src) {
+ return ObjectUnsafe::ObjectPtrFromUnowned<T>(src->v_obj);
+ }
+
+ template <typename T>
+ TVM_FFI_INLINE static T ConstructFromAny(const Any& value) {
+ using TypeTrait = TypeTraits<T>;
+ if constexpr (std::is_same_v<T, Any>) {
+ return value;
+ } else {
+ auto opt = TypeTrait::TryCastFromAnyView(AnyUnsafe::TVMFFIAnyPtrFromAny(value));
+ if (!opt.has_value()) {
+ throw STLTypeMismatch{};
+ }
+ return std::move(*opt);
+ }
+ }
+ };
+
+ struct ListTemplate {};
+ struct MapTemplate {};
+
+ } // namespace details
+
+ template <>
+ struct TypeTraits<details::ListTemplate> : public details::STLTypeTrait {
+ public:
+ static constexpr int32_t field_static_type_index = TypeIndex::kTVMFFIArray;
+
+ private:
+ template <std::size_t... Is, typename Tuple>
+ TVM_FFI_INLINE static ObjectPtr<ArrayObj> CopyToTupleImpl(std::index_sequence<Is...>,
+ Tuple&& src) {
+ auto array = ArrayObj::Empty(static_cast<std::int64_t>(sizeof...(Is)));
+ auto dst = array->MutableBegin();
+ // increase size after each new to ensure exception safety
+ std::apply(
+ [&](auto&&... elems) {
+ ((::new (dst++) Any(std::forward<decltype(elems)>(elems)), array->size_++), ...);
+ },
+ std::forward<Tuple>(src));
+ return array;
+ }
+
+ template <typename Iter>
+ TVM_FFI_INLINE static ObjectPtr<ArrayObj> CopyToArrayImpl(Iter src, std::size_t size) {
+ auto array = ArrayObj::Empty(static_cast<std::int64_t>(size));
+ auto dst = array->MutableBegin();
+ // increase size after each new to ensure exception safety
+ for (std::size_t i = 0; i < size; ++i) {
+ ::new (dst++) Any(*(src++));
+ array->size_++;
+ }
+ return array;
+ }
+
+ protected:
+ template <typename Tuple>
+ TVM_FFI_INLINE static ObjectPtr<ArrayObj> CopyToTuple(const Tuple& src) {
+ return CopyToTupleImpl(std::make_index_sequence<std::tuple_size_v<Tuple>>{}, src);
+ }
+
+ template <typename Tuple>
+ TVM_FFI_INLINE static ObjectPtr<ArrayObj> MoveToTuple(Tuple&& src) {
+ return CopyToTupleImpl(std::make_index_sequence<std::tuple_size_v<Tuple>>{},
+ std::forward<Tuple>(src));
+ }
+
+ template <typename Range>
+ TVM_FFI_INLINE static ObjectPtr<ArrayObj> CopyToArray(const Range& src) {
+ return CopyToArrayImpl(std::begin(src), std::size(src));
+ }
+
+ template <typename Range>
+ TVM_FFI_INLINE static ObjectPtr<ArrayObj> MoveToArray(Range&& src) {
+ return CopyToArrayImpl(std::make_move_iterator(std::begin(src)), std::size(src));
+ }
+ };
+
+ template <>
+ struct TypeTraits<details::MapTemplate> : public details::STLTypeTrait {
+ public:
+ static constexpr int32_t field_static_type_index = TypeIndex::kTVMFFIMap;
+
+ protected:
+ template <typename MapType>
+ TVM_FFI_INLINE static ObjectPtr<Object> CopyToMap(const MapType& src) {
+ return MapObj::CreateFromRange(std::begin(src), std::end(src));
+ }
+
+ template <typename MapType>
+ TVM_FFI_INLINE static ObjectPtr<Object> MoveToMap(MapType&& src) {
+ return MapObj::CreateFromRange(std::make_move_iterator(std::begin(src)),
+ std::make_move_iterator(std::end(src)));
+ }
+
+ template <typename MapType, bool CanReserve>
+ TVM_FFI_INLINE static MapType ConstructMap(const TVMFFIAny* src) {
+ using KeyType = typename MapType::key_type;
+ using ValueType = typename MapType::mapped_type;
+ auto result = MapType{};
+ auto map_obj = CopyFromAnyImpl<MapObj>(src);
+ if constexpr (CanReserve) {
+ result.reserve(map_obj->size());
+ }
+ for (const auto& [key, value] : *map_obj) {
+ result.try_emplace(ConstructFromAny<KeyType>(key), ConstructFromAny<ValueType>(value));
+ }
+ return result;
+ }
+ };
+
+ template <typename T, std::size_t Nm>
+ struct TypeTraits<std::array<T, Nm>> : public TypeTraits<details::ListTemplate> {
+ private:
+ using Self = std::array<T, Nm>;
+
+ TVM_FFI_INLINE static bool CheckAnyFast(const TVMFFIAny* src) {
+ if (src->type_index != TypeIndex::kTVMFFIArray) return false;
+ const ArrayObj& n = *reinterpret_cast<const ArrayObj*>(src->v_obj);
+ return n.size_ == Nm;
+ }
+
+ public:
+ static_assert(Nm > 0, "Zero-length std::array is not supported.");
+
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(CopyToArray(src), result);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(MoveToArray(std::move(src)), result);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ if (!CheckAnyFast(src)) return std::nullopt;
+ try {
+ auto array = CopyFromAnyImpl<ArrayObj>(src);
+ auto begin = array->MutableBegin();
+ Self result; // no initialization to avoid overhead
+ for (std::size_t i = 0; i < Nm; ++i) {
+ result[i] = ConstructFromAny<T>(begin[i]);
+ }
+ return result;
+ } catch (const details::STLTypeMismatch&) {
+ return std::nullopt;
+ }
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ return "std::array<" + details::Type2Str<T>::v() + ", " + std::to_string(Nm) + ">";
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ return R"({"type":"std::array","args":[)" + details::TypeSchema<T>::v() + "," +
+ std::to_string(Nm) + "]}";
+ }
+ };
+
+ template <typename T>
+ struct TypeTraits<std::vector<T>> : public TypeTraits<details::ListTemplate> {
+ private:
+ using Self = std::vector<T>;
+
+ TVM_FFI_INLINE static bool CheckAnyFast(const TVMFFIAny* src) {
+ return src->type_index == TypeIndex::kTVMFFIArray;
+ }
+
+ public:
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(CopyToArray(src), result);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(MoveToArray(std::move(src)), result);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ if (!CheckAnyFast(src)) return std::nullopt;
+ try {
+ auto array = CopyFromAnyImpl<ArrayObj>(src);
+ auto begin = array->MutableBegin();
+ auto result = Self{};
+ int64_t length = array->size_;
+ result.reserve(length);
+ for (int64_t i = 0; i < length; ++i) {
+ result.emplace_back(ConstructFromAny<T>(begin[i]));
+ }
+ return result;
+ } catch (const details::STLTypeMismatch&) {
+ return std::nullopt;
+ }
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ return "std::vector<" + details::Type2Str<T>::v() + ">";
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ return R"({"type":"std::vector","args":[)" + details::TypeSchema<T>::v() + "]}";
+ }
+ };
+
+ template <typename T>
+ struct TypeTraits<std::optional<T>> : public TypeTraitsBase {
+ public:
+ using Self = std::optional<T>;
+
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ if (src.has_value()) {
+ TypeTraits<T>::CopyToAnyView(*src, result);
+ } else {
+ TypeTraits<std::nullptr_t>::CopyToAnyView(nullptr, result);
+ }
+ }
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ if (src.has_value()) {
+ TypeTraits<T>::MoveToAny(std::move(*src), result);
+ } else {
+ TypeTraits<std::nullptr_t>::MoveToAny(nullptr, result);
+ }
+ }
+
+ TVM_FFI_INLINE static bool CheckAnyStrict(const TVMFFIAny* src) {
+ if (src->type_index == TypeIndex::kTVMFFINone) return true;
+ return TypeTraits<T>::CheckAnyStrict(src);
+ }
+
+ TVM_FFI_INLINE static Self CopyFromAnyViewAfterCheck(const TVMFFIAny* src) {
+ if (src->type_index == TypeIndex::kTVMFFINone) return Self{std::nullopt};
+ return TypeTraits<T>::CopyFromAnyViewAfterCheck(src);
+ }
+
+ TVM_FFI_INLINE static Self MoveFromAnyAfterCheck(TVMFFIAny* src) {
+ if (src->type_index == TypeIndex::kTVMFFINone) return Self{std::nullopt};
+ return TypeTraits<T>::MoveFromAnyAfterCheck(src);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ if (src->type_index == TypeIndex::kTVMFFINone) return Self{std::nullopt};
+ auto result = std::optional<Self>{};
+ if (std::optional<T> opt = TypeTraits<T>::TryCastFromAnyView(src)) {
+ result.emplace(std::move(opt));
+ } else {
+ result.reset(); // failed to cast, indicate failure
+ }
+ return result;
+ }
+
+ TVM_FFI_INLINE static std::string GetMismatchTypeInfo(const TVMFFIAny* src) {
+ return TypeTraits<T>::GetMismatchTypeInfo(src);
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ return "std::optional<" + TypeTraits<T>::TypeStr() + ">";
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ return R"({"type":"std::optional","args":[)" + details::TypeSchema<T>::v() + "]}";
+ }
+ };
+
+ template <typename... Args>
+ struct TypeTraits<std::variant<Args...>> : public TypeTraitsBase {
+ private:
+ using Self = std::variant<Args...>;
+ static constexpr std::size_t Nm = sizeof...(Args);
+
+ template <std::size_t Is = 0>
+ TVM_FFI_INLINE static Self CopyUnsafeAux(const TVMFFIAny* src) {
+ if constexpr (Is >= Nm) {
+ TVM_FFI_ICHECK(false) << "Unreachable: variant TryCast failed.";
+ throw; // unreachable
+ } else {
+ using ElemType = std::variant_alternative_t<Is, Self>;
+ if (TypeTraits<ElemType>::CheckAnyStrict(src)) {
+ return Self{std::in_place_index<Is>, TypeTraits<ElemType>::CopyFromAnyViewAfterCheck(src)};
+ } else {
+ return CopyUnsafeAux<Is + 1>(src);
+ }
+ }
+ }
+
+ template <std::size_t Is = 0>
+ TVM_FFI_INLINE static Self MoveUnsafeAux(const TVMFFIAny* src) {
+ if constexpr (Is >= Nm) {
+ TVM_FFI_ICHECK(false) << "Unreachable: variant TryCast failed.";
+ throw; // unreachable
+ } else {
+ using ElemType = std::variant_alternative_t<Is, Self>;
+ if (TypeTraits<ElemType>::CheckAnyStrict(src)) {
+ return Self{std::in_place_index<Is>, TypeTraits<ElemType>::MoveFromAnyAfterCheck(src)};
+ } else {
+ return MoveUnsafeAux<Is + 1>(src);
+ }
+ }
+ }
+
+ template <std::size_t Is = 0>
+ TVM_FFI_INLINE static std::optional<Self> TryCastAux(const TVMFFIAny* src) {
+ if constexpr (Is >= Nm) {
+ return std::nullopt;
+ } else {
+ using ElemType = std::variant_alternative_t<Is, Self>;
+ if (auto opt = TypeTraits<ElemType>::TryCastFromAnyView(src)) {
+ return Self{std::in_place_index<Is>, std::move(*opt)};
+ } else {
+ return TryCastAux<Is + 1>(src);
+ }
+ }
+ }
+
+ public:
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return std::visit(
+ [&](const auto& value) {
+ using ValueType = std::decay_t<decltype(value)>;
+ TypeTraits<ValueType>::CopyToAnyView(value, result);
+ },
+ src);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return std::visit(
+ [&](auto&& value) {
+ using ValueType = std::decay_t<decltype(value)>;
+ TypeTraits<ValueType>::MoveToAny(std::forward<ValueType>(value), result);
+ },
+ std::move(src));
+ }
+
+ TVM_FFI_INLINE static bool CheckAnyStrict(const TVMFFIAny* src) {
+ return (TypeTraits<Args>::CheckAnyStrict(src) || ...);
+ }
+
+ TVM_FFI_INLINE static Self CopyFromAnyViewAfterCheck(const TVMFFIAny* src) {
+ // find the first possible type to copy
+ return CopyUnsafeAux(src);
+ }
+
+ TVM_FFI_INLINE static Self MoveFromAnyAfterCheck(TVMFFIAny* src) {
+ // find the first possible type to move
+ return MoveUnsafeAux(src);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ // try to find the first possible type to copy
+ return TryCastAux(src);
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ std::ostringstream os;
+ os << "std::variant<";
+ const char* sep = "";
+ ((os << sep << details::Type2Str<Args>::v(), sep = ", "), ...);
+ os << ">";
+ return std::move(os).str();
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ std::ostringstream os;
+ os << R"({"type":"std::variant","args":[)";
+ const char* sep = "";
+ ((os << sep << details::TypeSchema<Args>::v(), sep = ", "), ...);
+ os << "]}";
+ return std::move(os).str();
+ }
+ };
+
+ template <typename... Args>
+ struct TypeTraits<std::tuple<Args...>> : public TypeTraits<details::ListTemplate> {
+ private:
+ using Self = std::tuple<Args...>;
+ static constexpr std::size_t Nm = sizeof...(Args);
+ static_assert(Nm > 0, "Zero-length std::tuple is not supported.");
+
+ TVM_FFI_INLINE static bool CheckAnyFast(const TVMFFIAny* src) {
+ if (src->type_index != TypeIndex::kTVMFFIArray) return false;
+ const ArrayObj& n = *reinterpret_cast<const ArrayObj*>(src->v_obj);
+ return n.size_ == Nm;
+ }
+
+ template <std::size_t... Is>
+ TVM_FFI_INLINE static Self ConstructTupleAux(std::index_sequence<Is...>, const ArrayObj& n) {
+ return Self{ConstructFromAny<std::tuple_element_t<Is, Self>>(n[Is])...};
+ }
+
+ public:
+ static constexpr int32_t field_static_type_index = TypeIndex::kTVMFFIArray;
+
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(CopyToTuple(src), result);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(MoveToTuple(std::move(src)), result);
+ }
+
+ TVM_FFI_INLINE static bool CheckAnyStrict(const TVMFFIAny* src) {
+ if (src->type_index != TypeIndex::kTVMFFIArray) return false;
+ const ArrayObj& n = *reinterpret_cast<const ArrayObj*>(src->v_obj);
+ // check static length first
+ if (n.size_ != Nm) return false;
+ // then check element type
+ return CheckSubTypeAux(std::make_index_sequence<Nm>{}, n);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ if (!CheckAnyFast(src)) return std::nullopt;
+ try {
+ auto array = CopyFromAnyImpl<ArrayObj>(src);
+ return ConstructTupleAux(std::make_index_sequence<Nm>{}, *array);
+ } catch (const details::STLTypeMismatch&) {
+ return std::nullopt;
+ }
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ std::ostringstream os;
+ os << "std::tuple<";
+ const char* sep = "";
+ ((os << sep << details::Type2Str<Args>::v(), sep = ", "), ...);
+ os << ">";
+ return std::move(os).str();
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ std::ostringstream os;
+ os << R"({"type":"std::tuple","args":[)";
+ const char* sep = "";
+ ((os << sep << details::TypeSchema<Args>::v(), sep = ", "), ...);
+ os << "]}";
+ return std::move(os).str();
+ }
+ };
+
+ template <typename K, typename V>
+ struct TypeTraits<std::map<K, V>> : public TypeTraits<details::MapTemplate> {
+ private:
+ using Self = std::map<K, V>;
+ TVM_FFI_INLINE static bool CheckAnyFast(const TVMFFIAny* src) {
+ return src->type_index == TypeIndex::kTVMFFIMap;
+ }
+
+ public:
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(CopyToMap(src), result);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(MoveToMap(std::move(src)), result);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ if (!CheckAnyFast(src)) return std::nullopt;
+ try {
+ return ConstructMap<Self, /*CanReserve=*/false>(src);
+ } catch (const details::STLTypeMismatch&) {
+ return std::nullopt;
+ }
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ return "std::map<" + details::Type2Str<K>::v() + ", " + details::Type2Str<V>::v() + ">";
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ return R"({"type":"std::map","args":[)" + details::TypeSchema<K>::v() + "," +
+ details::TypeSchema<V>::v() + "]}";
+ }
+ };
+
+ template <typename K, typename V>
+ struct TypeTraits<std::unordered_map<K, V>> : public TypeTraits<details::MapTemplate> {
+ private:
+ using Self = std::unordered_map<K, V>;
+ TVM_FFI_INLINE static bool CheckAnyFast(const TVMFFIAny* src) {
+ return src->type_index == TypeIndex::kTVMFFIMap;
+ }
+
+ public:
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(CopyToMap(src), result);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return MoveToAnyImpl(MoveToMap(std::move(src)), result);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ if (!CheckAnyFast(src)) return std::nullopt;
+ try {
+ return ConstructMap<Self, /*CanReserve=*/true>(src);
+ } catch (const details::STLTypeMismatch&) {
+ return std::nullopt;
+ }
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ return "std::unordered_map<" + details::Type2Str<K>::v() + ", " + details::Type2Str<V>::v() +
+ ">";
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ return R"({"type":"std::unordered_map","args":[)" + details::TypeSchema<K>::v() + "," +
+ details::TypeSchema<V>::v() + "]}";
+ }
+ };
+
+ template <typename Ret, typename... Args>
+ struct TypeTraits<std::function<Ret(Args...)>> : TypeTraitsBase {
+ private:
+ using Self = std::function<Ret(Args...)>;
+ using Function = TypedFunction<Ret(Args...)>;
+ using ProxyTrait = TypeTraits<Function>;
+
+ TVM_FFI_INLINE static Self GetFunc(Function&& f) {
+ return [fn = std::move(f)](Args... args) -> Ret { return fn(std::forward<Args>(args)...); };
+ }
+
+ public:
+ static constexpr int32_t field_static_type_index = TypeIndex::kTVMFFIFunction;
+ static constexpr bool storage_enabled = false;
+
+ TVM_FFI_INLINE static void CopyToAnyView(const Self& src, TVMFFIAny* result) {
+ return ProxyTrait::MoveToAny(Function{src}, result);
+ }
+
+ TVM_FFI_INLINE static void MoveToAny(Self&& src, TVMFFIAny* result) {
+ return ProxyTrait::MoveToAny(Function{std::move(src)}, result);
+ }
+
+ TVM_FFI_INLINE static std::optional<Self> TryCastFromAnyView(const TVMFFIAny* src) {
+ auto opt = ProxyTrait::TryCastFromAnyView(src);
+ if (opt.has_value()) {
+ return GetFunc(std::move(*opt));
+ } else {
+ return std::nullopt;
+ }
+ }
+
+ TVM_FFI_INLINE static std::string TypeStr() {
+ std::ostringstream os;
+ os << "std::function<" << details::Type2Str<Ret>::v() << "(";
+ const char* sep = "";
+ ((os << sep << details::Type2Str<Args>::v(), sep = ", "), ...);
+ os << ")>";
+ return std::move(os).str();
+ }
+
+ TVM_FFI_INLINE static std::string TypeSchema() {
+ std::ostringstream os;
+ os << R"({"type":"std::function","args":[)" << details::TypeSchema<Ret>::v() << ",[";
+ const char* sep = "";
+ ((os << sep << details::TypeSchema<Args>::v(), sep = ", "), ...);
+ os << "]]}";
+ return std::move(os).str();
+ }
+ };
+
+ } // namespace ffi
+ } // namespace tvm
+
+ #endif // TVM_FFI_EXTRA_STL_H_
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function.h.rst
index 275c40fc93..e8a1da450c 100644
--- a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function.h.rst
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function.h.rst
@@ -25,6 +25,25 @@ Program Listing for File function.h
TVM_FFI_DLL_EXPORT_TYPED_FUNC(SubOne, [](int x) {
return x - 1;
});
+ return a + b;
+ }
+
+ TVM_FFI_DLL_EXPORT_TYPED_FUNC(add, Add);
+ TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC(
+ add,
+ R"(Add two integers and return the sum.
+
+ Parameters
+ ----------
+ a : int
+ First integer
+ b : int
+ Second integer
+
+ Returns
+ -------
+ result : int
+ Sum of a and b)");
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
@@ -46,6 +65,10 @@ Program Listing for File function.h
#ifndef TVM_FFI_FUNCTION_H_
#define TVM_FFI_FUNCTION_H_
+ #ifndef TVM_FFI_DLL_EXPORT_INCLUDE_METADATA
+ #define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA 0
+ #endif
+
#include <tvm/ffi/any.h>
#include <tvm/ffi/base_details.h>
#include <tvm/ffi/c_api.h>
@@ -53,6 +76,7 @@ Program Listing for File function.h
#include <tvm/ffi/function_details.h>
#include <functional>
+ #include <sstream>
#include <string>
#include <type_traits>
#include <utility>
@@ -503,7 +527,11 @@ Program Listing for File function.h
return type_index;
}
- #define TVM_FFI_DLL_EXPORT_TYPED_FUNC(ExportName, Function) \
+ // Internal implementation macros used by TVM_FFI_DLL_EXPORT_TYPED_FUNC and related macros.
+ // These should not be used directly; use the public macros instead.
+
+ // Internal implementation macro that generates the C ABI wrapper function
+ #define TVM_FFI_DLL_EXPORT_TYPED_FUNC_IMPL_(ExportName, Function) \
extern "C" { \
TVM_FFI_DLL_EXPORT int __tvm_ffi_##ExportName(void* self, const TVMFFIAny* args, \
int32_t num_args, TVMFFIAny* result) { \
@@ -517,6 +545,48 @@ Program Listing for File function.h
TVM_FFI_SAFE_CALL_END(); \
} \
}
+
+ #if TVM_FFI_DLL_EXPORT_INCLUDE_METADATA
+ // Implementation note: we specifically use TVMFFIStringFromByteArray
+ // so the returned string metadata is allocated in the libtvm_ffi and long lived.
+ #define TVM_FFI_DLL_EXPORT_TYPED_FUNC(ExportName, Function) \
+ TVM_FFI_DLL_EXPORT_TYPED_FUNC_IMPL_(ExportName, Function) \
+ extern "C" { \
+ TVM_FFI_DLL_EXPORT int __tvm_ffi__metadata_##ExportName(void* self, const TVMFFIAny* args, \
+ int32_t num_args, TVMFFIAny* result) { \
+ TVM_FFI_SAFE_CALL_BEGIN(); \
+ using FuncInfo = ::tvm::ffi::details::FunctionInfo<decltype(Function)>; \
+ std::ostringstream os; \
+ os << R"({"type_schema":)" \
+ << ::tvm::ffi::EscapeString(::tvm::ffi::String(FuncInfo::TypeSchema())) << R"(})"; \
+ std::string data = os.str(); \
+ TVMFFIByteArray data_array{data.data(), data.size()}; \
+ return TVMFFIStringFromByteArray(&data_array, result); \
+ TVM_FFI_SAFE_CALL_END(); \
+ } \
+ }
+ #else
+ #define TVM_FFI_DLL_EXPORT_TYPED_FUNC(ExportName, Function) \
+ TVM_FFI_DLL_EXPORT_TYPED_FUNC_IMPL_(ExportName, Function)
+ #endif
+
+ #if TVM_FFI_DLL_EXPORT_INCLUDE_METADATA
+ // Implementation note: we specifically use TVMFFIStringFromByteArray
+ // so the returned string metadata is allocated in the libtvm_ffi and long lived.
+ #define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC(ExportName, DocString) \
+ extern "C" { \
+ TVM_FFI_DLL_EXPORT int __tvm_ffi__doc_##ExportName(void* self, const TVMFFIAny* args, \
+ int32_t num_args, TVMFFIAny* result) { \
+ TVM_FFI_SAFE_CALL_BEGIN(); \
+ std::string_view data(DocString); \
+ TVMFFIByteArray data_array{data.data(), data.size()}; \
+ return TVMFFIStringFromByteArray(&data_array, result); \
+ TVM_FFI_SAFE_CALL_END(); \
+ } \
+ }
+ #else
+ #define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC(ExportName, DocString)
+ #endif
} // namespace ffi
} // namespace tvm
#endif // TVM_FFI_FUNCTION_H_
diff --git a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function_details.h.rst b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function_details.h.rst
index 23d7b4ee1d..aba3d4d988 100644
--- a/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function_details.h.rst
+++ b/ffi/_sources/reference/cpp/generated/program_listing_file_tvm_ffi_function_details.h.rst
@@ -204,6 +204,7 @@ Program Listing for File function_details.h
*rv = R(f(ArgValueWithContext<std::tuple_element_t<Is, PackedArgs>>{args, Is, optional_name,
f_sig}...));
}
+ // NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks
}
TVM_FFI_INLINE static Error MoveFromSafeCallRaised() {
diff --git a/ffi/_sources/reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.rst b/ffi/_sources/reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.rst
new file mode 100644
index 0000000000..73d8685b2d
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.rst
@@ -0,0 +1,17 @@
+.. _exhale_struct_structtvm_1_1ffi_1_1CUDADeviceGuard:
+
+Struct CUDADeviceGuard
+======================
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_device_guard.h`
+
+
+Struct Documentation
+--------------------
+
+
+.. doxygenstruct:: tvm::ffi::CUDADeviceGuard
+ :project: tvm-ffi
+ :members:
+ :protected-members:
+ :undoc-members:
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/structtvm_1_1ffi_1_1dim3.rst b/ffi/_sources/reference/cpp/generated/structtvm_1_1ffi_1_1dim3.rst
new file mode 100644
index 0000000000..f4651abe2d
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/structtvm_1_1ffi_1_1dim3.rst
@@ -0,0 +1,17 @@
+.. _exhale_struct_structtvm_1_1ffi_1_1dim3:
+
+Struct dim3
+===========
+
+- Defined in :ref:`file_tvm_ffi_extra_cuda_cubin_launcher.h`
+
+
+Struct Documentation
+--------------------
+
+
+.. doxygenstruct:: tvm::ffi::dim3
+ :project: tvm-ffi
+ :members:
+ :protected-members:
+ :undoc-members:
\ No newline at end of file
diff --git a/ffi/_sources/reference/cpp/generated/unabridged_orphan.rst b/ffi/_sources/reference/cpp/generated/unabridged_orphan.rst
index b7a7e4df4c..00bdc92b70 100644
--- a/ffi/_sources/reference/cpp/generated/unabridged_orphan.rst
+++ b/ffi/_sources/reference/cpp/generated/unabridged_orphan.rst
@@ -28,6 +28,11 @@ Directories
dir_tvm_ffi_extra.rst
+.. toctree::
+ :maxdepth: 5
+
+ dir_tvm_ffi_extra_cuda.rst
+
.. toctree::
:maxdepth: 5
@@ -62,6 +67,11 @@ Files
file_tvm_ffi_extra_base.h.rst
+.. toctree::
+ :maxdepth: 5
+
+ file_tvm_ffi_extra_cuda_base.h.rst
+
.. toctree::
:maxdepth: 5
@@ -97,6 +107,16 @@ Files
file_tvm_ffi_reflection_creator.h.rst
+.. toctree::
+ :maxdepth: 5
+
+ file_tvm_ffi_extra_cuda_cubin_launcher.h.rst
+
+.. toctree::
+ :maxdepth: 5
+
+ file_tvm_ffi_extra_cuda_device_guard.h.rst
+
.. toctree::
:maxdepth: 5
@@ -172,6 +192,11 @@ Files
file_tvm_ffi_container_shape.h.rst
+.. toctree::
+ :maxdepth: 5
+
+ file_tvm_ffi_extra_stl.h.rst
+
.. toctree::
:maxdepth: 5
diff --git a/ffi/_sources/reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.rst b/ffi/_sources/reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.rst
new file mode 100644
index 0000000000..c81effc307
--- /dev/null
+++ b/ffi/_sources/reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.rst
@@ -0,0 +1,14 @@
+.. _exhale_variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb:
+
+Variable tvm::ffi::symbol::tvm_ffi_doc_prefix
+=============================================
+
+- Defined in :ref:`file_tvm_ffi_extra_module.h`
+
+
+Variable Documentation
+----------------------
+
+
+.. doxygenvariable:: tvm::ffi::symbol::tvm_ffi_doc_prefix
+ :project: tvm-ffi
\ No newline at end of file
diff --git a/ffi/_sources/reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.rst b/ffi/_sources/reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.rst
new file mode 100644
index 0000000000..b6592738a0
--- /dev/null
+++ b/ffi/_sources/reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.rst
@@ -0,0 +1,6 @@
+tvm\_ffi.cpp.nvrtc.nvrtc\_compile
+=================================
+
+.. currentmodule:: tvm_ffi.cpp.nvrtc
+
+.. autofunction:: nvrtc_compile
\ No newline at end of file
diff --git a/ffi/_sources/reference/python/generated/tvm_ffi.Module.rst b/ffi/_sources/reference/python/generated/tvm_ffi.Module.rst
index 51fe5ad087..f6f651c97a 100644
--- a/ffi/_sources/reference/python/generated/tvm_ffi.Module.rst
+++ b/ffi/_sources/reference/python/generated/tvm_ffi.Module.rst
@@ -17,6 +17,8 @@
~Module.__init__
~Module.clear_imports
~Module.get_function
+ ~Module.get_function_doc
+ ~Module.get_function_metadata
~Module.get_property_mask
~Module.get_write_formats
~Module.implements_function
diff --git a/ffi/_sources/reference/python/index.rst b/ffi/_sources/reference/python/index.rst
index d36f02533a..99b652f4b3 100644
--- a/ffi/_sources/reference/python/index.rst
+++ b/ffi/_sources/reference/python/index.rst
@@ -115,6 +115,13 @@ C++ integration helpers for building and loading inline modules.
cpp.load
cpp.build
+NVRTC Utilities
+---------------
+.. autosummary::
+ :toctree: cpp/generated/
+
+ cpp.nvrtc.nvrtc_compile
+
Misc
----
.. autosummary::
diff --git a/ffi/_static/basic.css b/ffi/_static/basic.css
index 2a9e4114ac..9ca7106be1 100644
--- a/ffi/_static/basic.css
+++ b/ffi/_static/basic.css
@@ -741,14 +741,6 @@ abbr, acronym {
cursor: help;
}
-.translated {
- background-color: rgba(207, 255, 207, 0.2)
-}
-
-.untranslated {
- background-color: rgba(255, 207, 207, 0.2)
-}
-
/* -- code displays --------------------------------------------------------- */
pre {
diff --git a/ffi/_static/documentation_options.js b/ffi/_static/documentation_options.js
index c06e2fbd18..8bda0151da 100644
--- a/ffi/_static/documentation_options.js
+++ b/ffi/_static/documentation_options.js
@@ -1,5 +1,5 @@
const DOCUMENTATION_OPTIONS = {
- VERSION: '0.1.dev1+gdb53ce4f4',
+ VERSION: '0.1.dev1+gdcacb98d1',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
diff --git a/ffi/_static/downloads/mermaid-layout-elk.esm.min.mjs b/ffi/_static/downloads/mermaid-layout-elk.esm.min.mjs
index 5ec1dfd000..07a88820e6 100644
--- a/ffi/_static/downloads/mermaid-layout-elk.esm.min.mjs
+++ b/ffi/_static/downloads/mermaid-layout-elk.esm.min.mjs
@@ -1 +1 @@
-import{a as o}from"./chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs";var a=o(async()=>await import("./chunks/mermaid-layout-elk.esm.min/render-LWFKM4MT.mjs"),"loader"),t=["elk.stress","elk.force","elk.mrtree","elk.sporeOverlap"],r=[{name:"elk",loader:a,algorithm:"elk.layered"},...t.map(e=>({name:e,loader:a,algorithm:e}))],l=r;export{l as default};
+import{a as o}from"./chunks/mermaid-layout-elk.esm.min/chunk-SP2CHFBE.mjs";var a=o(async()=>await import("./chunks/mermaid-layout-elk.esm.min/render-AVRWSH4D.mjs"),"loader"),t=["elk.stress","elk.force","elk.mrtree","elk.sporeOverlap"],r=[{name:"elk",loader:a,algorithm:"elk.layered"},...t.map(e=>({name:e,loader:a,algorithm:e}))],l=r;export{l as default};
diff --git a/ffi/_static/searchtools.js b/ffi/_static/searchtools.js
index 2c774d17af..91f4be57fc 100644
--- a/ffi/_static/searchtools.js
+++ b/ffi/_static/searchtools.js
@@ -513,9 +513,11 @@ const Search = {
// perform the search on the required terms
searchTerms.forEach((word) => {
const files = [];
+ // find documents, if any, containing the query word in their text/title term indices
+ // use Object.hasOwnProperty to avoid mismatching against prototype properties
const arr = [
- { files: terms[word], score: Scorer.term },
- { files: titleTerms[word], score: Scorer.title },
+ { files: terms.hasOwnProperty(word) ? terms[word] : undefined, score: Scorer.term },
+ { files: titleTerms.hasOwnProperty(word) ? titleTerms[word] : undefined, score: Scorer.title },
];
// add support for partial matches
if (word.length > 2) {
@@ -547,8 +549,9 @@ const Search = {
// set score for the word in each file
recordFiles.forEach((file) => {
- if (!scoreMap.has(file)) scoreMap.set(file, {});
- scoreMap.get(file)[word] = record.score;
+ if (!scoreMap.has(file)) scoreMap.set(file, new Map());
+ const fileScores = scoreMap.get(file);
+ fileScores.set(word, record.score);
});
});
@@ -587,7 +590,7 @@ const Search = {
break;
// select one (max) score for the file.
- const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
+ const score = Math.max(...wordList.map((w) => scoreMap.get(file).get(w)));
// add result to the result list
results.push([
docNames[file],
diff --git a/ffi/concepts/abi_overview.html b/ffi/concepts/abi_overview.html
index 38bad463e2..c063cd45ce 100644
--- a/ffi/concepts/abi_overview.html
+++ b/ffi/concepts/abi_overview.html
@@ -40,7 +40,7 @@
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../_static/documentation_options.js?v=5f86a092"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -58,7 +58,7 @@
<link rel="prev" title="Kernel Library Guide" href="../guides/kernel_library_guide.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -172,6 +172,7 @@
<li class="toctree-l1"><a class="reference internal" href="../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -212,6 +213,7 @@
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -230,9 +232,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -267,6 +271,8 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -407,6 +413,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -415,6 +422,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -423,7 +431,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1171,7 +1183,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/genindex.html b/ffi/genindex.html
index 8e28721288..3354f53894 100644
--- a/ffi/genindex.html
+++ b/ffi/genindex.html
@@ -39,7 +39,7 @@
<link rel="preload" as="script" href="_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="_static/documentation_options.js?v=20154ed1"></script>
+ <script src="_static/documentation_options.js?v=5f86a092"></script>
<script src="_static/doctools.js?v=9bcbadda"></script>
<script src="_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,22 +55,47 @@
<script src="_static/downloads/d3.min.js"></script>
<script type="module">import mermaid from "_static/downloads/mermaid.esm.min.mjs";
-const style = document.createElement('style');
-style.textContent = `.mermaid-container {
- position: relative !important;
- display: inline-block;
+const defaultStyle = document.createElement('style');
+defaultStyle.textContent = `pre.mermaid {
+ /* Same as .mermaid-container > pre */
+ display: block;
width: 100%;
}
+pre.mermaid > svg {
+ /* Same as .mermaid-container > pre > svg */
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+`;
+document.head.appendChild(defaultStyle);
+
+const fullscreenStyle = document.createElement('style');
+fullscreenStyle.textContent = `.mermaid-container {
+ display: flex;
+ flex-direction: row;
+ width: 100%;
+}
+
+.mermaid-container > pre {
+ display: block;
+ width: 100%;
+}
+
+.mermaid-container > pre > svg {
+ height: 500px;
+ width: 100%;
+ max-width: 100% !important;
+}
+
.mermaid-fullscreen-btn {
- position: absolute !important;
width: 28px;
height: 28px;
background: rgba(255, 255, 255, 0.95);
border: 1px solid rgba(0, 0, 0, 0.3);
border-radius: 4px;
cursor: pointer;
- z-index: 100;
display: flex;
align-items: center;
justify-content: center;
@@ -105,7 +130,7 @@ style.textContent = `.mermaid-container {
position: fixed !important;
top: 0 !important;
left: 0 !important;
- width: 100vw;
+ width: 95vw;
height: 100vh;
background: rgba(255, 255, 255, 0.98);
z-index: 9999;
@@ -123,7 +148,7 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content {
+.mermaid-container-fullscreen {
position: relative;
width: 95vw;
height: 90vh;
@@ -139,12 +164,12 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content.dark-theme {
+.mermaid-container-fullscreen.dark-theme {
background: #1a1a1a;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.8);
}
-.mermaid-fullscreen-content .mermaid {
+.mermaid-container-fullscreen pre.mermaid {
width: 100%;
height: 100%;
display: flex;
@@ -152,11 +177,9 @@ style.textContent = `.mermaid-container {
justify-content: center;
}
-.mermaid-fullscreen-content .mermaid svg {
- width: 100%;
- height: auto;
- max-width: 100%;
- max-height: 85vh;
+.mermaid-container-fullscreen .mermaid svg {
+ height: 100% !important;
+ width: 100% !important;
cursor: grab;
}
@@ -200,9 +223,8 @@ style.textContent = `.mermaid-container {
.mermaid-fullscreen-modal .mermaid-fullscreen-btn {
display: none !important;
-}
-`;
-document.head.appendChild(style);
+}`;
+document.head.appendChild(fullscreenStyle);
// Detect if page has dark background
const isDarkTheme = () => {
@@ -218,20 +240,45 @@ const isDarkTheme = () => {
return false;
};
-const initFullscreen = async () => {
+const load = async () => {
await mermaid.run();
const all_mermaids = document.querySelectorAll(".mermaid");
const mermaids_processed = document.querySelectorAll(".mermaid[data-processed='true']");
- if(all_mermaids.length !== mermaids_processed.length) {
+ if ("False" === "True") {
+ const mermaids_to_add_zoom = -1 === -1 ? all_mermaids.length : -1;
+ if(mermaids_to_add_zoom > 0) {
+ var svgs = d3.selectAll("");
+ if(all_mermaids.length !== mermaids_processed.length) {
+ setTimeout(load, 200);
+ return;
+ } else if(svgs.size() !== mermaids_to_add_zoom) {
+ setTimeout(load, 200);
+ return;
+ } else {
+ svgs.each(function() {
+ var svg = d3.select(this);
+ svg.html("<g class='wrapper'>" + svg.html() + "</g>");
+ var inner = svg.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svg.call(zoom);
+ });
+ }
+ }
+ } else if(all_mermaids.length !== mermaids_processed.length) {
// Wait for mermaid to process all diagrams
- setTimeout(initFullscreen, 200);
+ setTimeout(load, 200);
return;
}
const darkTheme = isDarkTheme();
+ // Stop here if not adding fullscreen capability
+ if ("True" !== "True") return;
+
const modal = document.createElement('div');
modal.className = 'mermaid-fullscreen-modal' + (darkTheme ? ' dark-theme' : '');
modal.setAttribute('role', 'dialog');
@@ -239,17 +286,20 @@ const initFullscreen = async () => {
modal.setAttribute('aria-label', 'Fullscreen diagram viewer');
modal.innerHTML = `
<button class="mermaid-fullscreen-close${darkTheme ? ' dark-theme' : ''}" aria-label="Close fullscreen">✕</button>
- <div class="mermaid-fullscreen-content${darkTheme ? ' dark-theme' : ''}"></div>
+ <div class="mermaid-container-fullscreen${darkTheme ? ' dark-theme' : ''}"></div>
`;
document.body.appendChild(modal);
- const modalContent = modal.querySelector('.mermaid-fullscreen-content');
+ const modalContent = modal.querySelector('.mermaid-container-fullscreen');
const closeBtn = modal.querySelector('.mermaid-fullscreen-close');
+ let previousScrollOffset = [window.scrollX, window.scrollY];
+
const closeModal = () => {
modal.classList.remove('active');
modalContent.innerHTML = '';
- document.body.style.overflow = '';
+ document.body.style.overflow = ''
+ window.scrollTo({left: previousScrollOffset[0], top: previousScrollOffset[1], behavior: 'instant'});
};
closeBtn.addEventListener('click', closeModal);
@@ -279,6 +329,7 @@ const initFullscreen = async () => {
fullscreenBtn.className = 'mermaid-fullscreen-btn' + (darkTheme ? ' dark-theme' : '');
fullscreenBtn.setAttribute('aria-label', 'View diagram in fullscreen');
fullscreenBtn.textContent = '⛶';
+ fullscreenBtn.style.opacity = '50%';
// Calculate dynamic position based on diagram's margin and padding
const diagramStyle = window.getComputedStyle(mermaidDiv);
@@ -290,6 +341,7 @@ const initFullscreen = async () => {
fullscreenBtn.style.right = `${marginRight + paddingRight + 4}px`;
fullscreenBtn.addEventListener('click', () => {
+ previousScrollOffset = [window.scroll, window.scrollY];
const clone = mermaidDiv.cloneNode(true);
modalContent.innerHTML = '';
modalContent.appendChild(clone);
@@ -301,7 +353,22 @@ const initFullscreen = async () => {
svg.style.width = '100%';
svg.style.height = 'auto';
svg.style.maxWidth = '100%';
- svg.style.display = 'block';
+ svg.style.sdisplay = 'block';
+
+ if ("False" === "True") {
+ setTimeout(() => {
+ const g = svg.querySelector('g');
+ if (g) {
+ var svgD3 = d3.select(svg);
+ svgD3.html("<g class='wrapper'>" + svgD3.html() + "</g>");
+ var inner = svgD3.select("g");
+ var zoom = d3.zoom().on("zoom", function(event) {
+ inner.attr("transform", event.transform);
+ });
+ svgD3.call(zoom);
+ }
+ }, 100);
+ }
}
modal.classList.add('active');
@@ -345,7 +412,7 @@ const initFullscreen = async () => {
});
};
-window.addEventListener("load", initFullscreen);
+window.addEventListener("load", load);
</script>
<script>DOCUMENTATION_OPTIONS.pagename = 'genindex';</script>
<link rel="icon" href="https://tvm.apache.org/images/logo/tvm-logo-square.png"/>
@@ -353,7 +420,7 @@ window.addEventListener("load", initFullscreen);
<link rel="search" title="Search" href="search.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -469,6 +536,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l1"><a class="reference internal" href="guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -509,6 +577,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l2"><a class="reference internal" href="reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -527,9 +596,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -564,6 +635,8 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -704,6 +777,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -712,6 +786,7 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -720,7 +795,11 @@ window.addEventListener("load", initFullscreen);
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -893,6 +972,7 @@ document.write(`
| <a href="#K"><strong>K</strong></a>
| <a href="#L"><strong>L</strong></a>
| <a href="#M"><strong>M</strong></a>
+ | <a href="#N"><strong>N</strong></a>
| <a href="#O"><strong>O</strong></a>
| <a href="#P"><strong>P</strong></a>
| <a href="#R"><strong>R</strong></a>
@@ -1070,10 +1150,14 @@ document.write(`
</li>
<li><a href="reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.get_function">get_function() (tvm_ffi.Module method)</a>
</li>
- <li><a href="reference/python/generated/tvm_ffi.get_global_func.html#tvm_ffi.get_global_func">get_global_func() (in module tvm_ffi)</a>
+ <li><a href="reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.get_function_doc">get_function_doc() (tvm_ffi.Module method)</a>
+</li>
+ <li><a href="reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.get_function_metadata">get_function_metadata() (tvm_ffi.Module method)</a>
</li>
</ul></td>
<td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="reference/python/generated/tvm_ffi.get_global_func.html#tvm_ffi.get_global_func">get_global_func() (in module tvm_ffi)</a>
+</li>
<li><a href="reference/python/generated/tvm_ffi.get_global_func_metadata.html#tvm_ffi.get_global_func_metadata">get_global_func_metadata() (in module tvm_ffi)</a>
</li>
<li><a href="reference/python/generated/tvm_ffi.Module.html#tvm_ffi.Module.get_property_mask">get_property_mask() (tvm_ffi.Module method)</a>
@@ -1210,6 +1294,14 @@ document.write(`
</ul></td>
</tr></table>
+<h2 id="N">N</h2>
+<table style="width: 100%" class="indextable genindextable"><tr>
+ <td style="width: 33%; vertical-align: top;"><ul>
+ <li><a href="reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html#tvm_ffi.cpp.nvrtc.nvrtc_compile">nvrtc_compile() (in module tvm_ffi.cpp.nvrtc)</a>
+</li>
+ </ul></td>
+</tr></table>
+
<h2 id="O">O</h2>
<table style="width: 100%" class="indextable genindextable"><tr>
<td style="width: 33%; vertical-align: top;"><ul>
@@ -1438,6 +1530,34 @@ document.write(`
<li><a href="reference/cpp/generated/function_endian_8h_1ab4e0ed8000c632cd2c7cd089c0a0d1af.html#_CPPv4N3tvm3ffi8ByteSwapEPv6size_t6size_t">tvm::ffi::ByteSwap (C++ function)</a>
</li>
<li><a href="reference/cpp/generated/function_array_8h_1af5983fd2a31e79635307875b3a216472.html#_CPPv4I00EN3tvm3ffi6ConcatE5ArrayI1TE5ArrayI1TERK5ArrayI1TE">tvm::ffi::Concat (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4N3tvm3ffi11CubinKernelE">tvm::ffi::CubinKernel (C++ class)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4N3tvm3ffi11CubinKernel11CubinKernelE13cudaLibrary_tPKc">tvm::ffi::CubinKernel::CubinKernel (C++ function)</a>, <a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4N3tvm3ffi11CubinKernel11CubinKernelERK11CubinKernel">[1]</a>, <a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4N3tvm3ffi11CubinKernel11CubinKernelERR11CubinKernel">[2]</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4NK3tvm3ffi11CubinKernel9GetHandleEv">tvm::ffi::CubinKernel::GetHandle (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4N3tvm3ffi11CubinKernel6LaunchEPPv4dim34dim312cudaStream_t8uint32_t">tvm::ffi::CubinKernel::Launch (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html#_CPPv4N3tvm3ffi11CubinKernelD0Ev">tvm::ffi::CubinKernel::~CubinKernel (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModuleE">tvm::ffi::CubinModule (C++ class)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModule11CubinModuleEPKc">tvm::ffi::CubinModule::CubinModule (C++ function)</a>, <a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModule11CubinModuleERK11CubinModule">[1]</a>, <a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModule11CubinModuleERK5Bytes">[2]</a>, <a href="reference/cpp/generated/classtvm_1_ [...]
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4NK3tvm3ffi11CubinModule9GetHandleEv">tvm::ffi::CubinModule::GetHandle (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModule9GetKernelEPKc">tvm::ffi::CubinModule::GetKernel (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModule35GetKernelWithMaxDynamicSharedMemoryEPKc7int64_t">tvm::ffi::CubinModule::GetKernelWithMaxDynamicSharedMemory (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html#_CPPv4N3tvm3ffi11CubinModuleD0Ev">tvm::ffi::CubinModule::~CubinModule (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html#_CPPv4N3tvm3ffi15CUDADeviceGuardE">tvm::ffi::CUDADeviceGuard (C++ struct)</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html#_CPPv4N3tvm3ffi15CUDADeviceGuard15CUDADeviceGuardEi">tvm::ffi::CUDADeviceGuard::CUDADeviceGuard (C++ function)</a>, <a href="reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html#_CPPv4N3tvm3ffi15CUDADeviceGuard15CUDADeviceGuardEv">[1]</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html#_CPPv4N3tvm3ffi15CUDADeviceGuardD0Ev">tvm::ffi::CUDADeviceGuard::~CUDADeviceGuard (C++ function)</a>
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html#_CPPv4N3tvm3ffi11DenseMapObjE">tvm::ffi::DenseMapObj (C++ class)</a>
</li>
@@ -1524,6 +1644,16 @@ document.write(`
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html#_CPPv4NK3tvm3ffi11DenseMapObj8NumSlotsEv">tvm::ffi::DenseMapObj::NumSlots (C++ function)</a>
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html#_CPPv4N3tvm3ffi11DenseMapObjD0Ev">tvm::ffi::DenseMapObj::~DenseMapObj (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim3E">tvm::ffi::dim3 (C++ struct)</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim34dim3Ej">tvm::ffi::dim3::dim3 (C++ function)</a>, <a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim34dim3Ejj">[1]</a>, <a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim34dim3Ejjj">[2]</a>, <a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim34dim3Ev">[3]</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim31xE">tvm::ffi::dim3::x (C++ member)</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim31yE">tvm::ffi::dim3::y (C++ member)</a>
+</li>
+ <li><a href="reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html#_CPPv4N3tvm3ffi4dim31zE">tvm::ffi::dim3::z (C++ member)</a>
</li>
<li><a href="reference/cpp/generated/function_dtype_8h_1a94787950883e5a7e97b764ddd342afc3.html#_CPPv4N3tvm3ffi18DLDataTypeToStringE10DLDataType">tvm::ffi::DLDataTypeToString (C++ function)</a>
</li>
@@ -2029,6 +2159,8 @@ document.write(`
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1TypeAttrDef.html#_CPPv4I00EN3tvm3ffi10reflection11TypeAttrDefE">tvm::ffi::reflection::TypeAttrDef (C++ class)</a>
</li>
+ </ul></td>
+ <td style="width: 33%; vertical-align: top;"><ul>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1TypeAttrDef.html#_CPPv4I0EN3tvm3ffi10reflection11TypeAttrDef4attrER11TypeAttrDefPKc1T">tvm::ffi::reflection::TypeAttrDef::attr (C++ function)</a>
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1reflection_1_1TypeAttrDef.html#_CPPv4I0EN3tvm3ffi10reflection11TypeAttrDef3defER11TypeAttrDefPKcRR4Func">tvm::ffi::reflection::TypeAttrDef::def (C++ function)</a>
@@ -2043,8 +2175,6 @@ document.write(`
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1Shape.html#_CPPv4N3tvm3ffi5ShapeE">tvm::ffi::Shape (C++ class)</a>
</li>
- </ul></td>
- <td style="width: 33%; vertical-align: top;"><ul>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1Shape.html#_CPPv4NK3tvm3ffi5Shape2atE6size_t">tvm::ffi::Shape::at (C++ function)</a>
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1Shape.html#_CPPv4NK3tvm3ffi5Shape4backEv">tvm::ffi::Shape::back (C++ function)</a>
@@ -2204,6 +2334,8 @@ document.write(`
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1StructuralHash.html#_CPPv4N3tvm3ffi14StructuralHashE">tvm::ffi::StructuralHash (C++ class)</a>
</li>
<li><a href="reference/cpp/generated/classtvm_1_1ffi_1_1StructuralHash.html#_CPPv4N3tvm3ffi14StructuralHash4HashERK3Anybb">tvm::ffi::StructuralHash::Hash (C++ function)</a>
+</li>
+ <li><a href="reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html#_CPPv4N3tvm3ffi6symbol18tvm_ffi_doc_prefixE">tvm::ffi::symbol::tvm_ffi_doc_prefix (C++ member)</a>
</li>
<li><a href="reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html#_CPPv4N3tvm3ffi6symbol19tvm_ffi_library_binE">tvm::ffi::symbol::tvm_ffi_library_bin (C++ member)</a>
</li>
@@ -2389,6 +2521,8 @@ document.write(`
<li><a href="reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html#c.TVM_FFI_BACKTRACE_ON_SEGFAULT">TVM_FFI_BACKTRACE_ON_SEGFAULT (C macro)</a>
</li>
<li><a href="reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html#c.TVM_FFI_CHECK">TVM_FFI_CHECK (C macro)</a>
+</li>
+ <li><a href="reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html#c.TVM_FFI_CHECK_CUDA_ERROR">TVM_FFI_CHECK_CUDA_ERROR (C macro)</a>
</li>
<li><a href="reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html#c.TVM_FFI_CHECK_FUNC">TVM_FFI_CHECK_FUNC (C macro)</a>
</li>
@@ -2405,8 +2539,16 @@ document.write(`
<li><a href="reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html#c.TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE">TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE (C macro)</a>
</li>
<li><a href="reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html#c.TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE">TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE (C macro)</a>
+</li>
+ <li><a href="reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html#c.TVM_FFI_DLL_EXPORT_INCLUDE_METADATA">TVM_FFI_DLL_EXPORT_INCLUDE_METADATA (C macro)</a>
</li>
<li><a href="reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html#c.TVM_FFI_DLL_EXPORT_TYPED_FUNC">TVM_FFI_DLL_EXPORT_TYPED_FUNC (C macro)</a>
+</li>
+ <li><a href="reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html#c.TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC">TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC (C macro)</a>
+</li>
+ <li><a href="reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html#c.TVM_FFI_EMBED_CUBIN">TVM_FFI_EMBED_CUBIN (C macro)</a>
+</li>
+ <li><a href="reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html#c.TVM_FFI_EMBED_CUBIN_GET_KERNEL">TVM_FFI_EMBED_CUBIN_GET_KERNEL (C macro)</a>
</li>
<li><a href="reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html#c.TVM_FFI_ICHECK">TVM_FFI_ICHECK (C macro)</a>
</li>
@@ -2891,7 +3033,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/get_started/quickstart.html b/ffi/get_started/quickstart.html
index 8ee8c5ce5e..5c7436cf98 100644
--- a/ffi/get_started/quickstart.html
+++ b/ffi/get_started/quickstart.html
@@ -41,7 +41,7 @@
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../_static/documentation_options.js?v=5f86a092"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -60,7 +60,7 @@
<link rel="prev" title="Apache TVM FFI Documentation" href="../index.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -174,6 +174,7 @@
<li class="toctree-l1"><a class="reference internal" href="../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -214,6 +215,7 @@
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -232,9 +234,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -269,6 +273,8 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -409,6 +415,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -417,6 +424,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -425,7 +433,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -738,7 +750,8 @@ We can build a single shared library that works across:</p>
</div>
</div></div>
<p>The macro <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html#c.TVM_FFI_DLL_EXPORT_TYPED_FUNC" title="TVM_FFI_DLL_EXPORT_TYPED_FUNC"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_TYPED_FUNC</span></code></a> exports the C++ function <code class="docutils literal notranslate"><span class="pre">AddOne</span></code>
-as a TVM FFI compatible symbol with the name <code class="docutils literal notranslate"><span class="pre">__tvm_ffi_add_one_cpu/cuda</span></code> in the resulting library.</p>
+as a TVM FFI compatible symbol <code class="docutils literal notranslate"><span class="pre">__tvm_ffi_add_one_cpu/cuda</span></code>. If <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html#c.TVM_FFI_DLL_EXPORT_INCLUDE_METADATA" title="TVM_FFI_DLL_EXPORT_INCLUDE_METADATA"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</span></code></a> is set to 1,
+it also exports the function’s metadata as a symbol <code class="docutils literal notranslate"><span class="pre">__tvm_ffi__metadata_add_one_cpu/cuda</span></code> for type checking and stub generation.</p>
<p>The class <a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1TensorView.html#_CPPv4N3tvm3ffi10TensorViewE" title="tvm::ffi::TensorView"><code class="xref cpp cpp-class docutils literal notranslate"><span class="pre">tvm::ffi::TensorView</span></code></a> allows zero-copy interop with tensors from different ML frameworks:</p>
<ul class="simple">
<li><p>NumPy, CuPy,</p></li>
@@ -1131,7 +1144,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/get_started/stable_c_abi.html b/ffi/get_started/stable_c_abi.html
index a56ba78d1a..97e6893c58 100644
--- a/ffi/get_started/stable_c_abi.html
+++ b/ffi/get_started/stable_c_abi.html
@@ -41,7 +41,7 @@
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../_static/documentation_options.js?v=5f86a092"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -60,7 +60,7 @@
<link rel="prev" title="Quick Start" href="quickstart.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -174,6 +174,7 @@
<li class="toctree-l1"><a class="reference internal" href="../guides/cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="../guides/cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="../guides/kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -214,6 +215,7 @@
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -232,9 +234,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -269,6 +273,8 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -409,6 +415,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -417,6 +424,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -425,7 +433,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -1065,7 +1077,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/guides/build_from_source.html b/ffi/guides/build_from_source.html
index 3f7e65d572..8dec03f507 100644
--- a/ffi/guides/build_from_source.html
+++ b/ffi/guides/build_from_source.html
@@ -40,7 +40,7 @@
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../_static/documentation_options.js?v=5f86a092"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -58,7 +58,7 @@
<link rel="prev" title="Compiler Integration" href="compiler_integration.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -172,6 +172,7 @@
<li class="toctree-l1"><a class="reference internal" href="cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="compiler_integration.html">Compiler Integration</a></li>
<li class="toctree-l1 current active"><a class="current reference internal" href="#">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -212,6 +213,7 @@
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -230,9 +232,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -267,6 +271,8 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -407,6 +413,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -415,6 +422,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -423,7 +431,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -811,7 +823,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
</p>
</div>
diff --git a/ffi/guides/compiler_integration.html b/ffi/guides/compiler_integration.html
index 4527ac15c5..c9f61ccf9e 100644
--- a/ffi/guides/compiler_integration.html
+++ b/ffi/guides/compiler_integration.html
@@ -40,7 +40,7 @@
<link rel="preload" as="script" href="../_static/scripts/pydata-sphinx-theme.js?digest=dfe6caa3a7d634c4db9b" />
<script src="../_static/vendor/fontawesome/6.5.2/js/all.min.js?digest=dfe6caa3a7d634c4db9b"></script>
- <script src="../_static/documentation_options.js?v=20154ed1"></script>
+ <script src="../_static/documentation_options.js?v=5f86a092"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<script src="../_static/clipboard.min.js?v=a7894cd8"></script>
@@ -55,10 +55,10 @@
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="Build from Source" href="build_from_source.html" />
- <link rel="prev" title="Rust Guide" href="rust_guide.html" />
+ <link rel="prev" title="CUBIN Launcher Guide" href="cubin_launcher.html" />
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="docsearch:language" content="en"/>
- <meta name="docbuild:last-update" content="Nov 20, 2025"/>
+ <meta name="docbuild:last-update" content="Dec 03, 2025"/>
</head>
@@ -172,6 +172,7 @@
<li class="toctree-l1"><a class="reference internal" href="cpp_guide.html">C++ Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="python_guide.html">Python Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="rust_guide.html">Rust Guide</a></li>
+<li class="toctree-l1"><a class="reference internal" href="cubin_launcher.html">CUBIN Launcher Guide</a></li>
<li class="toctree-l1 current active"><a class="current reference internal" href="#">Compiler Integration</a></li>
<li class="toctree-l1"><a class="reference internal" href="build_from_source.html">Build from Source</a></li>
<li class="toctree-l1"><a class="reference internal" href="kernel_library_guide.html">Kernel Library Guide</a></li>
@@ -212,6 +213,7 @@
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build_inline.html">tvm_ffi.cpp.build_inline</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.load.html">tvm_ffi.cpp.load</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.build.html">tvm_ffi.cpp.build</a></li>
+<li class="toctree-l2"><a class="reference internal" href="../reference/python/cpp/generated/tvm_ffi.cpp.nvrtc.nvrtc_compile.html">tvm_ffi.cpp.nvrtc.nvrtc_compile</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.from_json_graph_str.html">tvm_ffi.serialization.from_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.serialization.to_json_graph_str.html">tvm_ffi.serialization.to_json_graph_str</a></li>
<li class="toctree-l2"><a class="reference internal" href="../reference/python/generated/tvm_ffi.access_path.AccessKind.html">tvm_ffi.access_path.AccessKind</a></li>
@@ -230,9 +232,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/namespace_tvm__ffi__symbol.html">Namespace tvm::ffi::symbol</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyEqual.html">Struct AnyEqual</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1AnyHash.html">Struct AnyHash</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1CUDADeviceGuard.html">Struct CUDADeviceGuard</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1Block.html">Struct DenseMapObj::Block</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ItemType.html">Struct DenseMapObj::ItemType</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1DenseMapObj_1_1ListNode.html">Struct DenseMapObj::ListNode</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1dim3.html">Struct dim3</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1EnvErrorAlreadySet.html">Struct EnvErrorAlreadySet</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1FallbackOnlyTraitsBase.html">Template Struct FallbackOnlyTraitsBase</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/structtvm_1_1ffi_1_1is__valid__iterator.html">Template Struct is_valid_iterator</a></li>
@@ -267,6 +271,8 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Array.html">Template Class Array</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ArrayObj.html">Class ArrayObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Bytes.html">Class Bytes</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinKernel.html">Class CubinKernel</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1CubinModule.html">Class CubinModule</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1DenseMapObj.html">Class DenseMapObj</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1Error.html">Class Error</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/classtvm_1_1ffi_1_1ErrorObj.html">Class ErrorObj</a></li>
@@ -407,6 +413,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1aeee9dab8873b5b2f327f4dfe50f802ab.html">Function TVMFFITypeRegisterMetadata</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/function_c__api_8h_1a4e8b3caff4da72205ec1ac9a811748e5.html">Function TVMFFITypeRegisterMethod</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_array_8h_1a3bbf4c2bf19b72b026ad9e19a23143d5.html">Variable tvm::ffi::is_valid_iterator_v</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a5a3a8ad10620c05ded5876f8e607e0eb.html">Variable tvm::ffi::symbol::tvm_ffi_doc_prefix</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1aae0405c7615139afd4f68b72a862cffe.html">Variable tvm::ffi::symbol::tvm_ffi_library_bin</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1a76f8a8fd1e38fd98cc501623d959ee58.html">Variable tvm::ffi::symbol::tvm_ffi_library_ctx</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/variable_module_8h_1ad9c186f1359987cef9278993037b3f66.html">Variable tvm::ffi::symbol::tvm_ffi_main</a></li>
@@ -415,6 +422,7 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a288653475dd42db1c715a11ab2972578.html">Define TVM_FFI_ALWAYS_LOG_BEFORE_THROW</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a7205bbaef1c45e57f939af6deefb6449.html">Define TVM_FFI_BACKTRACE_ON_SEGFAULT</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1ad4674e1cb9c051f47127e5331a4bcadc.html">Define TVM_FFI_CHECK</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cuda_2base_8h_1a8b7e871d0d7206eacc60705f11827ee1.html">Define TVM_FFI_CHECK_CUDA_ERROR</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a64c939463f90816ffc2b70bc89ea3e43.html">Define TVM_FFI_CHECK_FUNC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a14328d95ccda4b1691b9874645aef4bd.html">Define TVM_FFI_CHECK_SAFE_CALL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a438ff7ee1fc503216d35e156081280c0.html">Define TVM_FFI_DECLARE_OBJECT_INFO</a></li>
@@ -423,7 +431,11 @@
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a6ad2a76d53c8c695743f7a275c8c0523.html">Define TVM_FFI_DECLARE_OBJECT_INFO_STATIC</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a4ac33631a9b51877808ec7edf010f0d2.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NOTNULLABLE</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_object_8h_1a0fc0cc2d8f4318bc41a896c117e8a15c.html">Define TVM_FFI_DEFINE_OBJECT_REF_METHODS_NULLABLE</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html">Define TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html">Define TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1a99736a44462543179cb434ebd4512ade.html">Define TVM_FFI_EMBED_CUBIN</a></li>
+<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_cubin__launcher_8h_1ae8d64fa1cc7db9d38632e32054df72fc.html">Define TVM_FFI_EMBED_CUBIN_GET_KERNEL</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a6c01470f76c6437edf93ac668ea6242a.html">Define TVM_FFI_ICHECK</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a83986fc775d68d4abcc209c2f67dde6e.html">Define TVM_FFI_ICHECK_BINARY_OP</a></li>
<li class="toctree-l3"><a class="reference internal" href="../reference/cpp/generated/define_error_8h_1a394ec1781a34c49e29d47db5c3dfad9c.html">Define TVM_FFI_ICHECK_EQ</a></li>
@@ -677,9 +689,13 @@ following options:</p>
<ul class="simple">
<li><p>For compilers that generate host functions via codegen (e.g., LLVM), one can
generate the symbol <code class="docutils literal notranslate"><span class="pre">__tvm_ffi_<func_name></span></code>, where <code class="docutils literal notranslate"><span class="pre"><funcname></span></code> is the exported
-function.</p></li>
-<li><p>For kernel generators that generate C++ host code, one can directly
-use <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html#c.TVM_FFI_DLL_EXPORT_TYPED_FUNC" title="TVM_FFI_DLL_EXPORT_TYPED_FUNC"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_TYPED_FUNC</span></code></a> to expose the symbol.</p></li>
+function. Optionally, also generate <code class="docutils literal notranslate"><span class="pre">__tvm_ffi__metadata_<func_name></span></code> for reflection.</p></li>
+<li><p>For kernel generators that generate C++ host code, use <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a01777f12f8f99771331d679a0c1d2ed4.html#c.TVM_FFI_DLL_EXPORT_TYPED_FUNC" title="TVM_FFI_DLL_EXPORT_TYPED_FUNC"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_TYPED_FUNC</span></code></a>.
+This macro automatically exports function metadata when <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html#c.TVM_FFI_DLL_EXPORT_INCLUDE_METADATA" title="TVM_FFI_DLL_EXPORT_INCLUDE_METADATA"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</span></code></a>
+is set to 1.</p></li>
+<li><p>To export documentation strings, use <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1af84cdf62b6c193275db7e63e3bffc8bd.html#c.TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC" title="TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_TYPED_FUNC_DOC</span></code></a> separately
+after exporting the function. This enhances tooling support (stub generation, IDE tooltips).
+Documentation export is also controlled by <a class="reference internal" href="../reference/cpp/generated/define_function_8h_1a78c6d17c063fba9ca07175f150838046.html#c.TVM_FFI_DLL_EXPORT_INCLUDE_METADATA" title="TVM_FFI_DLL_EXPORT_INCLUDE_METADATA"><code class="xref c c-macro docutils literal notranslate"><span class="pre">TVM_FFI_DLL_EXPORT_INCLUDE_METADATA</span></code></a>.</p></li>
</ul>
<p>The following code snippet shows C code that corresponds to a
function performing <code class="docutils literal notranslate"><span class="pre">add_one_c</span></code> under the ABI. It is reasonably straightforward for
@@ -868,12 +884,12 @@ during loading, either by importing another runtime DLL, or embedding it in the
<div class="prev-next-area">
<a class="left-prev"
- href="rust_guide.html"
+ href="cubin_launcher.html"
title="previous page">
<i class="fa-solid fa-angle-left"></i>
<div class="prev-next-info">
<p class="prev-next-subtitle">previous</p>
- <p class="prev-next-title">Rust Guide</p>
+ <p class="prev-next-title">CUBIN Launcher Guide</p>
</div>
</a>
<a class="right-next"
@@ -939,7 +955,7 @@ By Apache TVM FFI contributors
<div class="footer-item">
<p class="last-updated">
- Last updated on Nov 20, 2025.
+ Last updated on Dec 03, 2025.
<br/>
... 45243 lines suppressed ...