@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
@@ -40,7 +40,7 @@ import os
|
||||
import sys
|
||||
import textwrap
|
||||
import warnings
|
||||
from dataclasses import dataclass
|
||||
from dataclasses import dataclass, field
|
||||
from typing import List, Set, Dict, Any, Callable, Optional
|
||||
from types import ModuleType
|
||||
from collections import OrderedDict
|
||||
@@ -161,6 +161,118 @@ class ScopeManager:
|
||||
self.scopes.pop()
|
||||
|
||||
|
||||
@dataclass
|
||||
class SessionData:
|
||||
"""
|
||||
Session data for the DSL preprocessor.
|
||||
"""
|
||||
|
||||
counter: int = 0 # Unique function names for multiple loops
|
||||
scope_manager: ScopeManager = field(default_factory=ScopeManager.create)
|
||||
function_counter: int = 0
|
||||
function_name: str = "<unknown function>"
|
||||
class_name: Optional[str] = None
|
||||
file_name: str = "<unknown filename>"
|
||||
function_depth: int = 0
|
||||
local_closures: set[str] = field(default_factory=set)
|
||||
function_globals: Optional[dict[str, Any]] = None
|
||||
import_top_module: bool = False
|
||||
|
||||
|
||||
def _create_module_attribute(
|
||||
func_name,
|
||||
*,
|
||||
use_base_dsl=True,
|
||||
submodule_name="ast_helpers",
|
||||
lineno=None,
|
||||
col_offset=None,
|
||||
):
|
||||
"""Creates an AST node representing a qualified attribute access to a function in a module or submodule.
|
||||
|
||||
:param func_name: The attribute or function name to access
|
||||
:type func_name: str
|
||||
:param top_module_name: The top-level module name, defaults to "_dsl_"
|
||||
:type top_module_name: str, optional
|
||||
:param submodule_name: The submodule name to access within the top module,
|
||||
defaults to "ast_helpers"
|
||||
:type submodule_name: str, optional
|
||||
:param lineno: The line number to use for AST node location, defaults to None
|
||||
:type lineno: int, optional
|
||||
:param col_offset: The column offset to use for AST node location, defaults to None
|
||||
:type col_offset: int, optional
|
||||
:return: An AST Attribute node corresponding to the desired attribute access,
|
||||
with optional location info
|
||||
:rtype: ast.Attribute
|
||||
"""
|
||||
|
||||
# If we simply copy location from origin node, it contains a way to wide range, which cause location in traceback to be wrong.
|
||||
def set_location(node, lineno, col_offset):
|
||||
if lineno is None or col_offset is None:
|
||||
return
|
||||
node.lineno = lineno
|
||||
node.end_lineno = lineno
|
||||
node.col_offset = col_offset
|
||||
node.end_col_offset = col_offset
|
||||
|
||||
base = ast.Name(
|
||||
id="__base_dsl__" if use_base_dsl else "__module_dsl__", ctx=ast.Load()
|
||||
)
|
||||
set_location(base, lineno, col_offset)
|
||||
if submodule_name:
|
||||
base = ast.Attribute(value=base, attr=submodule_name, ctx=ast.Load())
|
||||
set_location(base, lineno, col_offset)
|
||||
node = ast.Attribute(value=base, attr=func_name, ctx=ast.Load())
|
||||
set_location(node, lineno, col_offset)
|
||||
return node
|
||||
|
||||
|
||||
class DSLPreprocessorSession:
|
||||
"""Context manager for managing a DSL preprocessor session.
|
||||
|
||||
This context manager is used to ensure that each preprocessing operation
|
||||
(typically a transformation of a Python AST via the DSL preprocessor)
|
||||
is performed within a well-defined session. When entering the context,
|
||||
it initializes session-specific resources or state by calling
|
||||
`_start_session()` on the provided DSL object. Upon exit, it performs
|
||||
appropriate cleanup by calling `_end_session()`.
|
||||
|
||||
Example usage::
|
||||
|
||||
with DSLPreprocessorSession(dsl_object):
|
||||
# perform AST transformations or other preprocessing actions
|
||||
|
||||
:param dsl_object: An instance of a DSL object that implements
|
||||
`_start_session()` and `_end_session()` methods to manage the
|
||||
session state
|
||||
:type dsl_object: DSLPreprocessor
|
||||
"""
|
||||
|
||||
def __init__(self, dsl_object):
|
||||
self.dsl_object = dsl_object
|
||||
|
||||
def __enter__(self):
|
||||
"""Starts the DSL preprocessor session.
|
||||
|
||||
:return: The DSL object for use within the context
|
||||
:rtype: DSLPreprocessor
|
||||
"""
|
||||
self.dsl_object._start_session()
|
||||
# Let `with preprocessor.get_session() as p:` keep using `p` as the preprocessor.
|
||||
return self.dsl_object
|
||||
|
||||
def __exit__(self, exc_type, exc_value, traceback):
|
||||
"""Ends the DSL preprocessor session.
|
||||
|
||||
:param exc_type: The exception type if an exception was raised in the context
|
||||
:type exc_type: type, optional
|
||||
:param exc_value: The exception value if an exception was raised in the context
|
||||
:type exc_value: Exception, optional
|
||||
:param traceback: The traceback if an exception was raised in the context
|
||||
:type traceback: traceback, optional
|
||||
"""
|
||||
self.dsl_object._end_session()
|
||||
|
||||
|
||||
class DSLPreprocessor(ast.NodeTransformer):
|
||||
"""
|
||||
A preprocessor for transforming Python ASTs. It supports:
|
||||
@@ -185,44 +297,42 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
|
||||
def __init__(self, client_module_name):
|
||||
super().__init__()
|
||||
self.counter = 0 # Unique function names for multiple loops
|
||||
self.scope_manager = ScopeManager.create()
|
||||
# Persistent state
|
||||
self.processed_functions = set()
|
||||
self.function_counter = 0
|
||||
self.function_name = "<unknown function>"
|
||||
self.class_name = None
|
||||
self.file_name = "<unknown filename>"
|
||||
self.function_depth = 0
|
||||
self.local_closures = set()
|
||||
self.function_globals = None
|
||||
self.client_module_name = client_module_name
|
||||
self.import_top_module = False
|
||||
self.module_cache = {}
|
||||
self._session_data = None
|
||||
|
||||
def _create_module_attribute(
|
||||
self,
|
||||
func_name,
|
||||
*,
|
||||
top_module_name="_dsl_",
|
||||
submodule_name="ast_helpers",
|
||||
lineno=None,
|
||||
col_offset=None,
|
||||
):
|
||||
# If we simply copy location from origin node, it contains a way to wide range, which cause location in traceback to be wrong.
|
||||
def set_location(node, lineno, col_offset):
|
||||
if lineno and col_offset:
|
||||
node.lineno = lineno
|
||||
node.end_lineno = lineno
|
||||
node.col_offset = col_offset
|
||||
node.end_col_offset = col_offset
|
||||
def _start_session(self):
|
||||
"""
|
||||
Starts a new preprocessing session by initializing session data.
|
||||
|
||||
base = ast.Name(id=top_module_name, ctx=ast.Load())
|
||||
set_location(base, lineno, col_offset)
|
||||
if submodule_name:
|
||||
base = ast.Attribute(value=base, attr=submodule_name, ctx=ast.Load())
|
||||
set_location(base, lineno, col_offset)
|
||||
node = ast.Attribute(value=base, attr=func_name, ctx=ast.Load())
|
||||
set_location(node, lineno, col_offset)
|
||||
return node
|
||||
This method sets up a fresh SessionData instance for use during
|
||||
AST transformations. It must be called before performing any
|
||||
preprocessing actions that require access to context-specific
|
||||
information during the transformation of a function's AST.
|
||||
"""
|
||||
self._session_data = SessionData()
|
||||
|
||||
def _end_session(self):
|
||||
"""
|
||||
Ends the current preprocessing session and clears session data.
|
||||
|
||||
This method resets the session-specific data, marking the end of
|
||||
a preprocessing context. It should be called after all necessary
|
||||
AST processing is complete to ensure no stale context remains.
|
||||
"""
|
||||
self._session_data = None
|
||||
|
||||
def get_session(self):
|
||||
return DSLPreprocessorSession(dsl_object=self)
|
||||
|
||||
@property
|
||||
def session_data(self):
|
||||
assert self._session_data is not None, (
|
||||
"Please start a session before accessing session data"
|
||||
)
|
||||
return self._session_data
|
||||
|
||||
def _get_imports_from_ast(self, node, module):
|
||||
"""
|
||||
@@ -328,7 +438,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
@contextlib.contextmanager
|
||||
def local_import(module_path):
|
||||
# Directory where some local import might happen:
|
||||
local_dir = os.path.dirname(self.file_name)
|
||||
local_dir = os.path.dirname(self.session_data.file_name)
|
||||
# Momentarily insert the directory where the local import
|
||||
# used to happen, so the import can find the module.
|
||||
sys.path.insert(0, local_dir)
|
||||
@@ -389,6 +499,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
self.exec_imports(import_info.finally_imports, exec_globals)
|
||||
|
||||
def exec(self, function_name, original_function, code_object, exec_globals):
|
||||
"""Requires an active DSL preprocessor session."""
|
||||
# Get imports from the original module
|
||||
module_imports = self._get_module_imports(original_function)
|
||||
|
||||
@@ -463,11 +574,17 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# Step 3. Import cutlass and base_dsl
|
||||
top_module_name = ".".join(self.client_module_name)
|
||||
import_stmts = []
|
||||
if self.import_top_module:
|
||||
import_stmts.append(ast.Import(names=[ast.alias(name=top_module_name)]))
|
||||
if self.session_data.import_top_module:
|
||||
import_stmts.append(
|
||||
ast.Import(
|
||||
names=[ast.alias(name=top_module_name, asname="__module_dsl__")]
|
||||
)
|
||||
)
|
||||
import_stmts.append(
|
||||
ast.Import(
|
||||
names=[ast.alias(name=f"{top_module_name}.base_dsl", asname="_dsl_")]
|
||||
names=[
|
||||
ast.alias(name=f"{top_module_name}.base_dsl", asname="__base_dsl__")
|
||||
]
|
||||
)
|
||||
)
|
||||
|
||||
@@ -584,9 +701,13 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if not checker.has_early_exit:
|
||||
return
|
||||
raise DSLAstPreprocessorError(
|
||||
message=f"Early exit ({checker.early_exit_type}) is not allowed in `{self.function_name}`"
|
||||
+ (f" in `{self.class_name}`" if self.class_name else ""),
|
||||
filename=self.file_name,
|
||||
message=f"Early exit ({checker.early_exit_type}) is not allowed in `{self.session_data.function_name}`"
|
||||
+ (
|
||||
f" in `{self.session_data.class_name}`"
|
||||
if self.session_data.class_name
|
||||
else ""
|
||||
),
|
||||
filename=self.session_data.file_name,
|
||||
snippet=ast.unparse(tree),
|
||||
suggestion=(
|
||||
"If predicates are constant expression, write like "
|
||||
@@ -633,13 +754,14 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
def transform(self, original_function, exec_globals):
|
||||
"""
|
||||
Transforms the provided function using the preprocessor.
|
||||
Requires an active DSL preprocessor session.
|
||||
"""
|
||||
self.file_name = inspect.getsourcefile(original_function)
|
||||
self.function_globals = exec_globals
|
||||
self.session_data.file_name = inspect.getsourcefile(original_function)
|
||||
self.session_data.function_globals = exec_globals
|
||||
transformed_tree = self.transform_function(
|
||||
original_function.__name__, original_function
|
||||
)
|
||||
self.function_globals = None
|
||||
self.session_data.function_globals = None
|
||||
unified_tree = ast.Module(body=transformed_tree, type_ignores=[])
|
||||
unified_tree = ast.fix_missing_locations(unified_tree)
|
||||
|
||||
@@ -656,9 +778,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# we need orderedset to keep the insertion order the same. otherwise generated IR is different each time
|
||||
write_args = OrderedSet()
|
||||
invoked_args = OrderedSet()
|
||||
local_closure = self.local_closures
|
||||
file_name = self.file_name
|
||||
region_node = node
|
||||
local_closure = self.session_data.local_closures
|
||||
called_closures = OrderedSet()
|
||||
|
||||
class RegionAnalyzer(ast.NodeVisitor):
|
||||
@@ -767,7 +887,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
return self.visit(args[0]), self.visit(args[1]), self.visit(args[2]), True
|
||||
else:
|
||||
raise DSLAstPreprocessorError(
|
||||
"Unsupported number of arguments in range", filename=self.file_name
|
||||
"Unsupported number of arguments in range",
|
||||
filename=self.session_data.file_name,
|
||||
)
|
||||
|
||||
def extract_unroll_args(self, iter_node):
|
||||
@@ -790,7 +911,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
self.issue_deprecation_warning(
|
||||
message="pipelining is deprecated, use prefetch_stages instead",
|
||||
category=DeprecationWarning,
|
||||
filename=self.file_name,
|
||||
filename=self.session_data.file_name,
|
||||
lineno=iter_node.lineno,
|
||||
)
|
||||
return keywords.get("pipelining", ast.Constant(value=None))
|
||||
@@ -841,7 +962,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# Define the decorator with parameters
|
||||
decorator = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.DECORATOR_FOR_STATEMENT,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -902,14 +1023,14 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# else
|
||||
# return and_(lhs, rhs)
|
||||
short_circuit_value = ast.Constant(value=False)
|
||||
helper_func = self._create_module_attribute(
|
||||
helper_func = _create_module_attribute(
|
||||
"and_",
|
||||
top_module_name="cutlass",
|
||||
use_base_dsl=False,
|
||||
submodule_name=None,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
)
|
||||
self.import_top_module = True
|
||||
self.session_data.import_top_module = True
|
||||
# Transform "or" to "or_"
|
||||
elif isinstance(node.op, ast.Or):
|
||||
# Create an if-else statement in AST form
|
||||
@@ -918,19 +1039,19 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# else
|
||||
# return or_(lhs, rhs)
|
||||
short_circuit_value = ast.Constant(value=True)
|
||||
helper_func = self._create_module_attribute(
|
||||
helper_func = _create_module_attribute(
|
||||
"or_",
|
||||
top_module_name="cutlass",
|
||||
use_base_dsl=False,
|
||||
submodule_name=None,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
)
|
||||
self.import_top_module = True
|
||||
self.session_data.import_top_module = True
|
||||
else:
|
||||
# BoolOp should be either And or Or
|
||||
raise DSLAstPreprocessorError(
|
||||
f"Unsupported boolean operation: {node.op}",
|
||||
filename=self.file_name,
|
||||
filename=self.session_data.file_name,
|
||||
snippet=ast.unparse(node),
|
||||
)
|
||||
|
||||
@@ -977,14 +1098,14 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
|
||||
# Transform "not" to "~" as we overload __invert__
|
||||
if isinstance(node.op, ast.Not):
|
||||
func_name = self._create_module_attribute(
|
||||
func_name = _create_module_attribute(
|
||||
"not_",
|
||||
top_module_name="cutlass",
|
||||
use_base_dsl=False,
|
||||
submodule_name=None,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
)
|
||||
self.import_top_module = True
|
||||
self.session_data.import_top_module = True
|
||||
return ast.copy_location(
|
||||
ast.Call(func=func_name, args=[node.operand], keywords=[]), node
|
||||
)
|
||||
@@ -998,7 +1119,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
range_inputs = node.iter.args
|
||||
check_call = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
"range_value_check", lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=range_inputs,
|
||||
@@ -1021,7 +1142,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
"""
|
||||
check_call = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
"cf_symbol_check", lineno=func.lineno, col_offset=func.col_offset
|
||||
),
|
||||
args=[deepcopy(func)],
|
||||
@@ -1044,18 +1165,18 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
return [check_call, node]
|
||||
return node
|
||||
|
||||
active_symbols = self.scope_manager.get_active_symbols()
|
||||
active_symbols = self.session_data.scope_manager.get_active_symbols()
|
||||
|
||||
with self.scope_manager:
|
||||
with self.session_data.scope_manager:
|
||||
if isinstance(node.target, ast.Name):
|
||||
self.scope_manager.add_to_scope(node.target.id)
|
||||
self.session_data.scope_manager.add_to_scope(node.target.id)
|
||||
|
||||
if range_kind == "range_dynamic":
|
||||
# Generate a warning
|
||||
self.issue_deprecation_warning(
|
||||
message="range_dynamic is deprecated and will be removed in the future, please remove it.",
|
||||
category=DeprecationWarning,
|
||||
filename=self.file_name,
|
||||
filename=self.session_data.file_name,
|
||||
lineno=node.iter.lineno,
|
||||
)
|
||||
|
||||
@@ -1098,18 +1219,18 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
|
||||
def _handle_negative_step(self, node, start_expr, stop_expr, step_expr):
|
||||
# hoist start, stop, step to assignments
|
||||
start_ori_name = f"start_ori_{self.counter}"
|
||||
start_ori_name = f"start_ori_{self.session_data.counter}"
|
||||
start = self._hoist_expr_to_assignments(start_expr, start_ori_name)
|
||||
stop_ori_name = f"stop_ori_{self.counter}"
|
||||
stop_ori_name = f"stop_ori_{self.session_data.counter}"
|
||||
stop = self._hoist_expr_to_assignments(stop_expr, stop_ori_name)
|
||||
step_ori_name = f"step_ori_{self.counter}"
|
||||
step_ori_name = f"step_ori_{self.session_data.counter}"
|
||||
step = self._hoist_expr_to_assignments(step_expr, step_ori_name)
|
||||
|
||||
extra_exprs = [start, stop, step]
|
||||
|
||||
# Handle possible negative step, generates the following code in Python:
|
||||
# isNegative = step < 0
|
||||
isNegative_name = f"isNegative_{self.counter}"
|
||||
isNegative_name = f"isNegative_{self.session_data.counter}"
|
||||
isNegative = ast.copy_location(
|
||||
ast.Assign(
|
||||
targets=[ast.Name(id=isNegative_name, ctx=ast.Store())],
|
||||
@@ -1123,7 +1244,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
)
|
||||
|
||||
# start = stop if isNegative else start
|
||||
start_name = f"start_{self.counter}"
|
||||
start_name = f"start_{self.session_data.counter}"
|
||||
start = self._build_select_and_assign(
|
||||
name=start_name,
|
||||
test=ast.Name(id=isNegative_name, ctx=ast.Load()),
|
||||
@@ -1133,7 +1254,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
)
|
||||
|
||||
# stop = start if isNegative else stop
|
||||
stop_name = f"stop_{self.counter}"
|
||||
stop_name = f"stop_{self.session_data.counter}"
|
||||
stop = self._build_select_and_assign(
|
||||
name=stop_name,
|
||||
test=ast.Name(id=isNegative_name, ctx=ast.Load()),
|
||||
@@ -1143,7 +1264,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
)
|
||||
|
||||
# step = -step if isNegative else step
|
||||
step_name = f"step_{self.counter}"
|
||||
step_name = f"step_{self.session_data.counter}"
|
||||
step = self._build_select_and_assign(
|
||||
name=step_name,
|
||||
test=ast.Name(id=isNegative_name, ctx=ast.Load()),
|
||||
@@ -1155,7 +1276,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
)
|
||||
|
||||
# offset = start + stop if isNegative else 0
|
||||
offset_name = f"offset_{self.counter}"
|
||||
offset_name = f"offset_{self.session_data.counter}"
|
||||
offset = self._build_select_and_assign(
|
||||
name=offset_name,
|
||||
test=ast.Name(id=isNegative_name, ctx=ast.Load()),
|
||||
@@ -1204,7 +1325,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
def _create_closure_check_call(self, called_closures, node):
|
||||
return ast.Expr(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
"closure_check",
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -1225,7 +1346,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if node.orelse:
|
||||
raise DSLAstPreprocessorError(
|
||||
"dynamic for loop with else is not supported",
|
||||
filename=self.file_name,
|
||||
filename=self.session_data.file_name,
|
||||
snippet=ast.unparse(node),
|
||||
)
|
||||
|
||||
@@ -1243,7 +1364,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# Add necessary exprs to handle this
|
||||
if target_var_is_active_before_loop:
|
||||
# Initialize an extra loop carried variable
|
||||
loop_carried_var_name = f"loop_carried_var_{self.counter}"
|
||||
loop_carried_var_name = f"loop_carried_var_{self.session_data.counter}"
|
||||
pre_loop_expr = ast.copy_location(
|
||||
ast.Assign(
|
||||
targets=[ast.Name(id=loop_carried_var_name, ctx=ast.Store())],
|
||||
@@ -1283,8 +1404,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if called_closures:
|
||||
exprs.append(self._create_closure_check_call(called_closures, node))
|
||||
|
||||
func_name = f"loop_body_{self.counter}"
|
||||
self.counter += 1
|
||||
func_name = f"loop_body_{self.session_data.counter}"
|
||||
self.session_data.counter += 1
|
||||
|
||||
func_def = self.create_loop_function(
|
||||
func_name,
|
||||
@@ -1329,7 +1450,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# Rewrite to assert_executor(test, msg)
|
||||
new_node = ast.Expr(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.ASSERT_EXECUTOR, lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=[],
|
||||
@@ -1353,7 +1474,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if func.id == "bool":
|
||||
return ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.BOOL_CAST,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -1369,7 +1490,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
)
|
||||
return ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
helper_func, lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=[node.args[0]],
|
||||
@@ -1378,12 +1499,12 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
node,
|
||||
)
|
||||
elif func.id in ["min", "max"]:
|
||||
self.import_top_module = True
|
||||
self.session_data.import_top_module = True
|
||||
return ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
func.id,
|
||||
top_module_name="cutlass",
|
||||
use_base_dsl=False,
|
||||
submodule_name=None,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -1417,7 +1538,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
def create_downcast_call(arg):
|
||||
return ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.IMPLICIT_DOWNCAST_NUMERIC_TYPE,
|
||||
submodule_name="typing",
|
||||
lineno=node.lineno,
|
||||
@@ -1429,7 +1550,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
arg,
|
||||
)
|
||||
|
||||
module = self.function_globals.get(func.value.id)
|
||||
module = self.session_data.function_globals.get(func.value.id)
|
||||
if isinstance(module, ModuleType) and module.__package__.endswith(
|
||||
"._mlir.dialects"
|
||||
):
|
||||
@@ -1457,18 +1578,18 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
return node
|
||||
|
||||
def visit_ClassDef(self, node):
|
||||
self.class_name = node.name
|
||||
self.session_data.class_name = node.name
|
||||
self.generic_visit(node)
|
||||
self.class_name = None
|
||||
self.session_data.class_name = None
|
||||
return node
|
||||
|
||||
def _visit_target(self, target):
|
||||
if isinstance(target, ast.Name):
|
||||
self.scope_manager.add_to_scope(target.id)
|
||||
self.session_data.scope_manager.add_to_scope(target.id)
|
||||
elif isinstance(target, ast.Tuple):
|
||||
for t in target.elts:
|
||||
if isinstance(t, ast.Name):
|
||||
self.scope_manager.add_to_scope(t.id)
|
||||
self.session_data.scope_manager.add_to_scope(t.id)
|
||||
|
||||
def visit_Assign(self, node):
|
||||
for target in node.targets:
|
||||
@@ -1486,7 +1607,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if node.id in ["max", "min", "any", "all"] and isLoad:
|
||||
return ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
"redirect_builtin_function",
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -1558,41 +1679,41 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
return new_decorator_list
|
||||
|
||||
def visit_FunctionDef(self, node):
|
||||
with self.scope_manager:
|
||||
self.function_counter += 1
|
||||
self.function_name = node.name
|
||||
if self.function_depth > 0:
|
||||
self.local_closures.add(node.name)
|
||||
with self.session_data.scope_manager:
|
||||
self.session_data.function_counter += 1
|
||||
self.session_data.function_name = node.name
|
||||
if self.session_data.function_depth > 0:
|
||||
self.session_data.local_closures.add(node.name)
|
||||
|
||||
self.function_depth += 1
|
||||
self.session_data.function_depth += 1
|
||||
|
||||
# Add function name and arguments
|
||||
self.scope_manager.add_to_scope(node.name)
|
||||
self.session_data.scope_manager.add_to_scope(node.name)
|
||||
for arg in node.args.args:
|
||||
self.scope_manager.add_to_scope(arg.arg)
|
||||
self.session_data.scope_manager.add_to_scope(arg.arg)
|
||||
arg.annotation = None
|
||||
|
||||
for arg in node.args.kwonlyargs:
|
||||
self.scope_manager.add_to_scope(arg.arg)
|
||||
self.session_data.scope_manager.add_to_scope(arg.arg)
|
||||
arg.annotation = None
|
||||
|
||||
for arg in node.args.posonlyargs:
|
||||
self.scope_manager.add_to_scope(arg.arg)
|
||||
self.session_data.scope_manager.add_to_scope(arg.arg)
|
||||
arg.annotation = None
|
||||
|
||||
self.generic_visit(node)
|
||||
|
||||
self.function_depth -= 1
|
||||
self.session_data.function_depth -= 1
|
||||
|
||||
# Remove .jit and .kernel decorators
|
||||
node.decorator_list = self.remove_dsl_decorator(node.decorator_list)
|
||||
return node
|
||||
|
||||
def visit_With(self, node):
|
||||
with self.scope_manager:
|
||||
with self.session_data.scope_manager:
|
||||
for item in node.items:
|
||||
if isinstance(item.optional_vars, ast.Name):
|
||||
self.scope_manager.add_to_scope(item.optional_vars.id)
|
||||
self.session_data.scope_manager.add_to_scope(item.optional_vars.id)
|
||||
self.generic_visit(node)
|
||||
|
||||
return node
|
||||
@@ -1604,8 +1725,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
check = self._insert_cf_symbol_check(node.test.func)
|
||||
return [check, node]
|
||||
|
||||
active_symbols = self.scope_manager.get_active_symbols()
|
||||
with self.scope_manager:
|
||||
active_symbols = self.session_data.scope_manager.get_active_symbols()
|
||||
with self.session_data.scope_manager:
|
||||
# Check for early exit and raise exception
|
||||
self.check_early_exit(node, "while")
|
||||
|
||||
@@ -1616,8 +1737,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if called_closures:
|
||||
exprs.append(self._create_closure_check_call(called_closures, node))
|
||||
|
||||
func_name = f"while_region_{self.counter}"
|
||||
self.counter += 1
|
||||
func_name = f"while_region_{self.session_data.counter}"
|
||||
self.session_data.counter += 1
|
||||
|
||||
func_def = self.create_while_function(
|
||||
func_name, node, write_args, full_write_args_count
|
||||
@@ -1627,14 +1748,14 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
return exprs + [func_def] + assign
|
||||
|
||||
def visit_Try(self, node):
|
||||
with self.scope_manager:
|
||||
with self.session_data.scope_manager:
|
||||
self.generic_visit(node)
|
||||
return node
|
||||
|
||||
def visit_ExceptHandler(self, node):
|
||||
with self.scope_manager:
|
||||
with self.session_data.scope_manager:
|
||||
if node.name: # Exception variable
|
||||
self.scope_manager.add_to_scope(node.name)
|
||||
self.session_data.scope_manager.add_to_scope(node.name)
|
||||
self.generic_visit(node)
|
||||
return node
|
||||
|
||||
@@ -1671,7 +1792,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if has_self:
|
||||
fix_self = ast.Expr(
|
||||
value=ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
"copy_members", lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=[
|
||||
@@ -1694,7 +1815,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# Emit
|
||||
# node if type(pred) == bool else select_(pred, body, orelse)
|
||||
# so if pred is a python bool, use python to short-circuit and avoid emit arith.select
|
||||
self.import_top_module = True
|
||||
self.session_data.import_top_module = True
|
||||
return ast.copy_location(
|
||||
ast.IfExp(
|
||||
test=ast.Compare(
|
||||
@@ -1708,8 +1829,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
),
|
||||
body=node, # Original ternary expression
|
||||
orelse=ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
"select_", top_module_name="cutlass", submodule_name=None
|
||||
func=_create_module_attribute(
|
||||
"select_", use_base_dsl=False, submodule_name=None
|
||||
),
|
||||
args=[
|
||||
node.test,
|
||||
@@ -1756,7 +1877,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
|
||||
call = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(self.COMPARE_EXECUTOR),
|
||||
func=_create_module_attribute(self.COMPARE_EXECUTOR),
|
||||
args=[],
|
||||
keywords=keywords,
|
||||
),
|
||||
@@ -1772,8 +1893,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
check = self._insert_cf_symbol_check(node.test.func)
|
||||
return [check, node]
|
||||
|
||||
active_symbols = self.scope_manager.get_active_symbols()
|
||||
with self.scope_manager:
|
||||
active_symbols = self.session_data.scope_manager.get_active_symbols()
|
||||
with self.session_data.scope_manager:
|
||||
# Check for early exit and raise exception
|
||||
self.check_early_exit(node, "if")
|
||||
|
||||
@@ -1784,8 +1905,8 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
if called_closures:
|
||||
exprs.append(self._create_closure_check_call(called_closures, node))
|
||||
|
||||
func_name = f"if_region_{self.counter}"
|
||||
self.counter += 1
|
||||
func_name = f"if_region_{self.session_data.counter}"
|
||||
self.session_data.counter += 1
|
||||
|
||||
func_def = self.create_if_function(
|
||||
func_name, node, yield_args, full_write_args_count
|
||||
@@ -1796,7 +1917,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
|
||||
def generate_get_locals_or_none_call(self, write_args):
|
||||
return ast.Call(
|
||||
func=self._create_module_attribute("get_locals_or_none"),
|
||||
func=_create_module_attribute("get_locals_or_none"),
|
||||
args=[
|
||||
ast.Call(
|
||||
func=ast.Name(id="locals", ctx=ast.Load()), args=[], keywords=[]
|
||||
@@ -1842,10 +1963,10 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
defaults=[],
|
||||
)
|
||||
|
||||
then_block_name = f"then_block_{self.counter}"
|
||||
else_block_name = f"else_block_{self.counter}"
|
||||
elif_region_name = f"elif_region_{self.counter}"
|
||||
self.counter += 1
|
||||
then_block_name = f"then_block_{self.session_data.counter}"
|
||||
else_block_name = f"else_block_{self.session_data.counter}"
|
||||
elif_region_name = f"elif_region_{self.session_data.counter}"
|
||||
self.session_data.counter += 1
|
||||
|
||||
# Create then block
|
||||
then_block = ast.copy_location(
|
||||
@@ -1872,7 +1993,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# Create decorator
|
||||
decorator = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.DECORATOR_IF_STATEMENT,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -1914,7 +2035,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
# No write_args case - only then_block needed
|
||||
execute_call = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.IF_EXECUTOR, lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=[],
|
||||
@@ -2001,7 +2122,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
|
||||
execute_call = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.IF_EXECUTOR, lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=[],
|
||||
@@ -2072,7 +2193,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
]
|
||||
decorator = ast.copy_location(
|
||||
ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.DECORATOR_WHILE_STATEMENT,
|
||||
lineno=node.lineno,
|
||||
col_offset=node.col_offset,
|
||||
@@ -2084,9 +2205,9 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
)
|
||||
|
||||
# Section: Shared initialization for before and after blocks
|
||||
while_before_block_name = f"while_before_block_{self.counter}"
|
||||
while_after_block_name = f"while_after_block_{self.counter}"
|
||||
self.counter += 1
|
||||
while_before_block_name = f"while_before_block_{self.session_data.counter}"
|
||||
while_after_block_name = f"while_after_block_{self.session_data.counter}"
|
||||
self.session_data.counter += 1
|
||||
block_args_args = [ast.arg(arg=var, annotation=None) for var in write_args]
|
||||
block_args = ast.arguments(
|
||||
posonlyargs=[],
|
||||
@@ -2169,7 +2290,7 @@ class DSLPreprocessor(ast.NodeTransformer):
|
||||
]
|
||||
|
||||
execute_call = ast.Call(
|
||||
func=self._create_module_attribute(
|
||||
func=_create_module_attribute(
|
||||
self.WHILE_EXECUTOR, lineno=node.lineno, col_offset=node.col_offset
|
||||
),
|
||||
args=[],
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
@@ -626,6 +626,10 @@ class CompileCallable:
|
||||
while hasattr(func, "__wrapped__"):
|
||||
func = func.__wrapped__
|
||||
|
||||
from .dsl import BaseDSL
|
||||
|
||||
BaseDSL._lazy_initialize_dsl(func)
|
||||
|
||||
if not hasattr(func, "_dsl_object"):
|
||||
raise DSLRuntimeError(
|
||||
f"Function {func} is not decorated with jit decorator."
|
||||
@@ -641,4 +645,9 @@ class CompileCallable:
|
||||
else:
|
||||
compile_options = self._compile_options
|
||||
func._dsl_object.compile_options = compile_options
|
||||
|
||||
# Preprocess the function if not already preprocessed
|
||||
func._dsl_object._preprocess_and_replace_code(func)
|
||||
|
||||
# Run the function
|
||||
return func._dsl_object._func(func, *args, **kwargs)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
@@ -229,38 +229,6 @@ def new_from_mlir_values(obj, values):
|
||||
assert len(values) == 0, f"{obj} expects 0 values, but got {values}"
|
||||
return obj
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class DSLLocation:
|
||||
"""
|
||||
Represents Python source location information for MLIR DSL code.
|
||||
|
||||
Attributes:
|
||||
filename (str): Name of the Python source file.
|
||||
lineno (int): Line number in the source file.
|
||||
col_offset (int): Column offset in the source line.
|
||||
function_name (str): Name of the function in which the location occurs.
|
||||
|
||||
This is used primarily to annotate or trace locations in generated MLIR IR
|
||||
back to the original Python code for better diagnostic and debugging.
|
||||
"""
|
||||
|
||||
filename: str
|
||||
lineno: int
|
||||
col_offset: int
|
||||
function_name: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class PreprocessSessionData:
|
||||
"""
|
||||
Holds metadata and transformed AST related to a DSL preprocessing session.
|
||||
|
||||
Attributes:
|
||||
decorator_globals (dict): The global variables from the decorator's environment,
|
||||
captured for possible AST or code evaluation during preprocessing.
|
||||
"""
|
||||
decorator_globals: dict
|
||||
|
||||
|
||||
class DSLSingletonMeta(type):
|
||||
"""
|
||||
@@ -314,6 +282,27 @@ class DSLSingletonMeta(type):
|
||||
log().info(f"DSL singleton instances after clearing: {cls._instances}")
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class DSLLocation:
|
||||
"""
|
||||
Represents Python source location information for MLIR DSL code.
|
||||
|
||||
Attributes:
|
||||
filename (str): Name of the Python source file.
|
||||
lineno (int): Line number in the source file.
|
||||
col_offset (int): Column offset in the source line.
|
||||
function_name (str): Name of the function in which the location occurs.
|
||||
|
||||
This is used primarily to annotate or trace locations in generated MLIR IR
|
||||
back to the original Python code for better diagnostic and debugging.
|
||||
"""
|
||||
|
||||
filename: str
|
||||
lineno: int
|
||||
col_offset: int
|
||||
function_name: str
|
||||
|
||||
|
||||
class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
gpu_module = None
|
||||
_env_class = EnvironmentVarManager
|
||||
@@ -354,7 +343,6 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
self.name = name
|
||||
self.compiler_provider = compiler_provider
|
||||
self.pass_sm_arch_name = pass_sm_arch_name
|
||||
self.preprocess_session_data = None
|
||||
self.decorator_location = None
|
||||
self.no_cache = False
|
||||
self.device_compilation_only = device_compilation_only
|
||||
@@ -437,44 +425,40 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
return dkwargs.pop("preprocess", True)
|
||||
|
||||
@staticmethod
|
||||
def _get_original_function(fcn_ptr, name):
|
||||
def _lazy_initialize_dsl(func):
|
||||
"""
|
||||
Get the original function from the decorated function
|
||||
Lazy initialization of DSL object if has not been initialized
|
||||
"""
|
||||
|
||||
while not hasattr(fcn_ptr, "__name__") or fcn_ptr.__name__ != name:
|
||||
# If the function is wrapped with functools, get from __wrapped__
|
||||
if hasattr(fcn_ptr, "__wrapped__"):
|
||||
fcn_ptr = fcn_ptr.__wrapped__
|
||||
elif isinstance(fcn_ptr, staticmethod):
|
||||
fcn_ptr = fcn_ptr.__func__
|
||||
# If the function is wrapped manually, it's the first in clousure
|
||||
elif callable(fcn_ptr.__closure__[0].cell_contents):
|
||||
fcn_ptr = fcn_ptr.__closure__[0].cell_contents
|
||||
else:
|
||||
raise DSLRuntimeError(
|
||||
f"Cannot find the original function {name} in the closure chain"
|
||||
)
|
||||
return fcn_ptr
|
||||
if hasattr(func, "_dsl_cls"):
|
||||
func._dsl_object = func._dsl_cls._get_dsl()
|
||||
delattr(func, "_dsl_cls")
|
||||
|
||||
@staticmethod
|
||||
def _preprocess_and_replace_code(func):
|
||||
"""
|
||||
Run ast transformation and return the materialized function pointer
|
||||
"""
|
||||
# Ensure the DSL instance is materialized before touching _dsl_object
|
||||
BaseDSL._lazy_initialize_dsl(func)
|
||||
|
||||
if hasattr(func, "_preprocess_session_data"):
|
||||
# If the function ptr is already materialized, use the existing one
|
||||
func._dsl_object.preprocess_session_data = func._preprocess_session_data
|
||||
func._dsl_object.decorator_location = func._decorator_location
|
||||
transformed_ast = func._dsl_object.run_preprocessor(func)
|
||||
fcn_ptr = func._dsl_object.get_function_ptr(func, transformed_ast)
|
||||
# Update the decorator location to the new function
|
||||
func._dsl_object.decorator_location = func._decorator_location
|
||||
|
||||
if getattr(func, "_preprocessed", False) is True:
|
||||
# already preprocessed, skip
|
||||
return
|
||||
|
||||
if not func._dsl_object.enable_preprocessor:
|
||||
func._preprocessed = True
|
||||
return
|
||||
|
||||
fcn_ptr = func._dsl_object.run_preprocessor(func)
|
||||
if fcn_ptr:
|
||||
func.__code__ = (
|
||||
fcn_ptr.__code__
|
||||
if not isinstance(fcn_ptr, staticmethod)
|
||||
else fcn_ptr.__func__.__code__
|
||||
)
|
||||
return func
|
||||
|
||||
@staticmethod
|
||||
def jit_runner(cls, executor_name, frame, *dargs, **dkwargs):
|
||||
@@ -485,22 +469,26 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
|
||||
def jit_runner_decorator(func):
|
||||
# Run preprocessor that alters AST
|
||||
func._dsl_object = cls._get_dsl()
|
||||
func._dsl_cls = cls
|
||||
func._decorator_location = BaseDSL.get_location_from_frame(frame)
|
||||
if (
|
||||
func._dsl_object.enable_preprocessor
|
||||
and func._dsl_object._can_preprocess(**dkwargs)
|
||||
if not hasattr(func, "_preprocessed") and not BaseDSL._can_preprocess(
|
||||
**dkwargs
|
||||
):
|
||||
# For an annotated function, add some DSL attributes
|
||||
# When materializing the AST, we need decorator's frame
|
||||
func._preprocess_session_data = PreprocessSessionData(
|
||||
decorator_globals=frame.f_globals,
|
||||
)
|
||||
BaseDSL._preprocess_and_replace_code(func)
|
||||
func._preprocessed = True
|
||||
|
||||
@wraps(func)
|
||||
def jit_wrapper(*args, **kwargs):
|
||||
return getattr(func._dsl_object, executor_name)(func, *args, **kwargs)
|
||||
BaseDSL._preprocess_and_replace_code(func)
|
||||
|
||||
custom_name = getattr(jit_wrapper, "_name_prefix", None)
|
||||
if custom_name:
|
||||
return getattr(func._dsl_object, executor_name)(
|
||||
func, *args, **kwargs, _name_prefix=custom_name
|
||||
)
|
||||
else:
|
||||
return getattr(func._dsl_object, executor_name)(
|
||||
func, *args, **kwargs
|
||||
)
|
||||
|
||||
def set_name_prefix(name: str):
|
||||
jit_wrapper._name_prefix = name
|
||||
@@ -702,26 +690,6 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
"""
|
||||
pass
|
||||
|
||||
def _get_globals(self):
|
||||
"""
|
||||
Combines global and local variables from the current context and the
|
||||
caller's frame comes. This includes the current module's globals, the
|
||||
global variables from the caller's frame, and the local variables from
|
||||
the caller's frame.
|
||||
|
||||
"self.frame" is used to fetch the caller's frame.
|
||||
|
||||
AST preprocessor generates a new python code, so the resulting globals
|
||||
dictionary is used to execute the python code.
|
||||
"""
|
||||
all_globals = {}
|
||||
if (
|
||||
self.preprocess_session_data
|
||||
and self.preprocess_session_data.decorator_globals
|
||||
):
|
||||
all_globals.update(self.preprocess_session_data.decorator_globals)
|
||||
return all_globals
|
||||
|
||||
@abstractmethod
|
||||
def _is_tensor_descriptor(self, maybe_tensor_descriptor) -> bool:
|
||||
pass
|
||||
@@ -986,18 +954,11 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
|
||||
@staticmethod
|
||||
def get_location_from_frame(frame):
|
||||
frameInfo = inspect.getframeinfo(frame)
|
||||
return DSLLocation(
|
||||
filename=frameInfo.filename,
|
||||
lineno=frameInfo.lineno,
|
||||
col_offset=(
|
||||
frameInfo.positions.col_offset if hasattr(frameInfo, "positions") else 0
|
||||
),
|
||||
function_name=(
|
||||
"".join([c.strip() for c in frameInfo.code_context])
|
||||
if frameInfo.code_context
|
||||
else frameInfo.function
|
||||
),
|
||||
filename=inspect.getsourcefile(frame),
|
||||
lineno=frame.f_lineno,
|
||||
col_offset=0,
|
||||
function_name=frame.f_code.co_name,
|
||||
)
|
||||
|
||||
def get_ir_location(self, location: DSLLocation = None):
|
||||
@@ -1352,8 +1313,6 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
self.num_kernels = 0
|
||||
# reset the compile options after the compilation is done.
|
||||
self.compile_options = CompileOptions()
|
||||
# reset preprocess session data after the compilation is done.
|
||||
self.preprocess_session_data = None
|
||||
# reset decorator location after the compilation is done.
|
||||
self.decorator_location = None
|
||||
|
||||
@@ -1468,36 +1427,37 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
|
||||
return result
|
||||
|
||||
def run_preprocessor(self, funcBody):
|
||||
if not hasattr(funcBody, "_preprocessed"):
|
||||
function_name = funcBody.__name__
|
||||
self.funcBody = funcBody
|
||||
log().info("Started preprocessing [%s]", function_name)
|
||||
exec_globals = self._get_globals()
|
||||
transformed_ast = self.preprocessor.transform(funcBody, exec_globals)
|
||||
def run_preprocessor(self, original_function):
|
||||
function_name = original_function.__name__
|
||||
self.funcBody = original_function
|
||||
log().info("Started preprocessing [%s]", function_name)
|
||||
exec_globals = {}
|
||||
if original_function.__globals__ is not None:
|
||||
exec_globals.update(original_function.__globals__)
|
||||
with self.preprocessor.get_session() as preprocessor_session:
|
||||
transformed_ast = preprocessor_session.transform(
|
||||
original_function, exec_globals
|
||||
)
|
||||
if self.envar.print_after_preprocessor:
|
||||
log().info(
|
||||
f"# Printing unparsed AST after preprocess of func=`{function_name}` id=`{id(funcBody)}`"
|
||||
f"# Printing unparsed AST after preprocess of func=`{function_name}` id=`{id(original_function)}`"
|
||||
)
|
||||
DSLPreprocessor.print_ast(transformed_ast)
|
||||
funcBody._preprocessed = True
|
||||
return transformed_ast
|
||||
return None
|
||||
file_name = inspect.getsourcefile(original_function)
|
||||
code_object = compile(
|
||||
transformed_ast,
|
||||
filename=file_name,
|
||||
mode="exec",
|
||||
)
|
||||
|
||||
def get_function_ptr(self, original_function, transformed_ast):
|
||||
file_name = inspect.getsourcefile(original_function)
|
||||
code_object = compile(
|
||||
transformed_ast,
|
||||
filename=file_name,
|
||||
mode="exec",
|
||||
)
|
||||
original_function._preprocessed = True
|
||||
|
||||
return self.preprocessor.exec(
|
||||
original_function.__name__,
|
||||
original_function,
|
||||
code_object,
|
||||
self._get_globals(),
|
||||
)
|
||||
return preprocessor_session.exec(
|
||||
original_function.__name__,
|
||||
original_function,
|
||||
code_object,
|
||||
exec_globals,
|
||||
)
|
||||
|
||||
def _get_function_bound_args(self, sig, func_name, *args, **kwargs):
|
||||
"""
|
||||
@@ -1573,7 +1533,6 @@ class BaseDSL(metaclass=DSLSingletonMeta):
|
||||
|
||||
pipeline = kwargs.pop("pipeline", None)
|
||||
gpu_module_attrs = kwargs.pop("gpu_module_attrs", {})
|
||||
self.decorator_location = getattr(funcBody, "_decorator_location", None)
|
||||
|
||||
# Disable cache
|
||||
no_cache = kwargs.pop("no_cache", False)
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: BSD-3-Clause
|
||||
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# Use of this software is governed by the terms and conditions of the
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-FileCopyrightText: Copyright (c) 2025 - 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||
# SPDX-License-Identifier: LicenseRef-NvidiaProprietary
|
||||
#
|
||||
# NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user