o
    پi                     @   sN   d dl Z d dlZd dlZd dlZd dlZdd ZdddZde fddZdS )	    Nc                 C   sT   |  }| j |j_ | j|j_| j|j_| j |_ | j|_| j|_| j d| j |_|S )z
    A decorator that allow you to write something of the form:

    @cacheable
    def my_kernel(): return (expression dynamically defining a kernel)

    such that it interacts gracefully with triton cache and preload.
    .)__name__fn
__module____qualname___fn_name)fg r
   M/home/ubuntu/.local/lib/python3.10/site-packages/triton_kernels/specialize.py	cacheable   s   



r   c           
      K   s   dd }t di |j}|| t|j|}|j|_t	| } | | 
dd } g }| dd dd  }|}	|	d|i t| d	 | d
 |	 t|d |_||_|d j|_|du ret  }tj|fi |}||  |S )z
    Dynamically create a Triton function or kernel from a src string,
    linking any symbols in the kernel to objects specified by extra_globals.
    c                   S   s   d S Nr
   r
   r
   r
   r   	_empty_fn$   s   z define_kernel.<locals>._empty_fndef N   (r   stored_functionsz

stored_functions.append(z)
r
   )dict__globals__updatetypesFunctionType__code__r   r   textwrapdedentfindsplitstripexecinspect	signature__signature____doc__tritonJITFunction_unsafe_update_src)
srcmoduleattrsextra_globalsr   gdictr   r   function_nameexec_globalsr
   r
   r   define_kernel   s(   


r-   c                    s2  t tjjjs
J |d u rj }tj}t	
|}|d}tdd t|D }|}	||	  dsE|	d7 }	||	  dr8||	d d  }
|||	d  }dd |D }d|}td	|}|smtd
|d}dd |dD }g }|D ]}|dd dd  }|||g}||vr||7 }qdd | D  B }d| dd| d}dd | D }dd | D }dd|g| | |
 }ttjjjj}t|j dd  }fdd|D }|d   fdd}||d< |r||d< t|||fi |}|S )N
c                 s   s&    | ]\}}|  d r|V  qdS )defN)r   
startswith).0iliner
   r
   r   	<genexpr>J   s   $ zspecialize.<locals>.<genexpr>:   c                 S   s4   g | ]}| d dd  r| d dd  qS )#r6   r   )r   r   )r1   lr
   r
   r   
<listcomp>R   s    zspecialize.<locals>.<listcomp> z\((.*)\)\s*:zCould not parse function headerc                 S   s   g | ]
}|  r|  qS r
   )r   )r1   argr
   r
   r   r9   ]   s    ,r   =c                 S   s(   i | ]\}}t |tjjjr|j|qS r
   )
isinstancer#   runtimejitr$   r   )r1   kvr
   r
   r   
<dictcomp>e   s   ( zspecialize.<locals>.<dictcomp>r   r   z, z):c                 S   s.   g | ]\}}d | dt |r|jn| qS )    z: tl.constexpr = )callabler   r1   keyvaluer
   r
   r   r9   i   s    "c              	   S   sB   g | ]\}}d | ddd | t|dkrdnd d  qS )rD   z = r   r<   r6    ))joinlenrF   r
   r
   r   r9   l   s    6z@triton.jit   c                    s    i | ]}|j t |j |jqS r
   )namegetattrdefault)r1   param)r   r
   r   rC   s   s     reprc                    sD    | }  D ]}|d }|r|d}|r|d| 7 }q|S )N_)valuesrR   r   )specializationretspec_fn	spec_repr)	base_reprspec_fnsr
   r   new_reprx   s   

zspecialize.<locals>.new_reprdo_not_specialize)r>   r#   r?   r@   r$   r   r   	getsourcer   r   r   r   next	enumeraterstripendswithrK   research
ValueErrorgroupr   getitemsget_capture_scoper    __init__list
parametersrT   r-   )r   r'   	constantstuplesrN   r\   r&   linesdef_idx
header_end
body_linesheader_linesheader_clean
header_srcmargs_strargsnon_specialized_argsr;   arg_keynew_argsglobalsnew_signatureconstexpr_linestuple_linesnew_srcsigparamsr(   r[   rV   r
   )rY   r   rZ   r   
specializeA   sb   




r   r   )	r   rb   r   r   r#   r   r-   tupler   r
   r
   r
   r   <module>   s    
$