o
    h                     @   s$  d dl mZ d dlmZ d dlmZmZ d dlmZ dd Z	G dd de
ZeG d	d
 d
ZG dd dZdd Zdedee defddZdedee defddZdZedkrd dlmZ eedZejdddd ejdded d! ejd"ed#d$d% e Ze Zg ZejD ]ZeeZe Ze ej! e"e qd&d' ej#$ D Z%ej&'d((d)Z)e)*d*d++e%  W d,   n1 sw   Y  d-d' ej#$ D Z,ej&'d.(d)#Z)d#Z&e&d*7 Z&e&d/7 Z&e&d+7 Z&e&d++e,7 Z&e)*e& W d,   d,S 1 s	w   Y  d,S d,S )0    )defaultdict)Path)SequenceUnion)	dataclassc                 C   s   | d uS N )xr   r   G/var/www/html/ai/venv/lib/python3.10/site-packages/triton/tools/link.py_exists   s   r   c                   @   s   e Zd ZdS )LinkerErrorN)__name__
__module____qualname__r   r   r   r
   r      s    r   c                   @   sR   e Zd ZU ee ed< ee ed< eeedf  ed< eed< eed< eed< dS )KernelLinkerMeta	arg_names
arg_ctypesNsizessig_hashsuffix	num_specs)r   r   r   r   str__annotations__r   intr   r   r   r
   r      s   
 r   c                   @   s`   e Zd ZdddZdefddZdefd	d
ZdefddZdefddZdede	fddZ
dS )HeaderParserreturnNc                 C   sF   dd l }|d| _|d| _|d| _|d| _tt| _d S )Nr   z"//[\s]*tt-linker:[\s]*([\w]+):(.+)z^([\w]+)_([\w]+)_([\w]+)$z([0-9]+)([c,d])z[\s]*(\w+)\s(\w+)[,]?)	recompilelinker_directiveskernel_namekernel_suffixc_sigr   listkernels)selfr   r   r   r
   __init__   s   zHeaderParser.__init__headerc                 C   s   |  D ]@}|drD| j|}t|rD|d|d}}| |\}}}| |\}	}
| |\}}| 	|t
|
|	||||d qd S )Nz//      )r   r   r   r   r   r   )
splitlines
startswithr   matchr   group_match_name_match_c_sig_match_suffix_add_kernelr   )r$   r&   lnmker_namer!   namer   r   c_typesr   r   r   r   r   r
   extract_linker_meta*   s*   
z HeaderParser.extract_linker_metar3   c                 C   sN   | j |}t|r |d|d|d}}}|||fS t| d)Nr'   r(      z is not a valid kernel name)r   r+   r   r,   r   )r$   r3   r2   r4   r   r   r   r   r
   r-   @   s
   "
zHeaderParser._match_namer!   c                 C   sV   | j |}t|r$g g }}|D ]\}}|| || q||fS t| d)Nz" is not a valid argument signature)r!   findalllenappendr   )r$   r!   r2   tysargstyarg_namer   r   r
   r.   G   s   

zHeaderParser._match_c_sigr   c                 C   s   | j |}t|st| dg }t|}ddd}|D ] \}}t|t|k r7|d  t|t|k s*|||  q||fS )Nz is not a valid kernel suffixr'      )cd)r    r8   r9   r   r   r:   )r$   r   r2   r   r   s2iargnumarg_size_annr   r   r
   r/   R   s   

zHeaderParser._match_suffixr4   kerc              
   C   sv   || j v r1| j | d }t|j|jD ]\}}||kr0td| dd|j dd|j q| j | | d S )Nz Mismatched signature for kernel z: 
	existing sig is: ,z
	current is: )r#   zipr   r   joinr:   )r$   r4   rE   lastcurnew_r   r   r
   r0   `   s   
$zHeaderParser._add_kernel)r   N)r   r   r   r%   r   r6   r-   r.   r/   r   r0   r   r   r   r
   r      s    
r   c                 C   s   d dd t| j| jD S )N, c                 S   s   g | ]\}}| d | qS ) r   ).0r=   argr   r   r
   
<listcomp>n   s    z!gen_signature.<locals>.<listcomp>)rI   rH   r   r   r2   r   r   r
   gen_signaturem   s   rS   r4   metasr   c              	   C   s&   d|  dt |d  d|  d|  d	S )Nz

CUresult E(CUstream stream, unsigned int gX, unsigned int gY, unsigned int gZ, rF   z);
void load_z();
void unload_z();
    )rS   )r4   rT   r   r   r
   
make_declsq   s   
rV   c                    s  d|  d}t |dd dD ]}|d|  d|j d|j dt| d		7 }q|d7 }|d|  dt|d
  d7 }|d7 }t |dd dD ]6}dd  d fddt|j|jD }|d| d7 }|d|  d|j d|j dd|j d		7 }qE|d7 }dD ]\}|d| d|  d7 }t |dd dD ]}|d| d|  d|j d|j d	7 }q|d| d|  d7 }|d7 }t |dd dD ]}|d| d|  d|j d|j d	7 }q|d7 }q|S ) Nz// launcher for: 
c                 S      | j  S r   r   rR   r   r   r
   <lambda>{       z(make_kernel_dispatcher.<locals>.<lambda>)keyz	CUresult _rU   z);
rF   z){c                 S   rX   r   rY   rR   r   r   r
   rZ      r[   c                 S   s8   |dkrd|  d| dS |dkrd|  d| dS d S )Nr?   (z % z == 0)r'   z == )r   )valhintr   r   r
   rZ      s   8 z && c                    s"   g | ]\}}|d ur ||qS r   r   )rO   r`   ra   cond_fnr   r
   rQ      s   " z*make_kernel_dispatcher.<locals>.<listcomp>z  if (z)
z    return z(stream, gX, gY, gZ, rM   z}
)loadunloadz
// z for: c                 S   rX   r   rY   rR   r   r   r
   rZ      r[   zvoid z();
z() {c                 S   rX   r   rY   rR   r   r   r
   rZ      r[   z  )sortedr   r   rS   rI   rH   r   r   )r4   rT   srcmetacondsmoder   rb   r
   make_kernel_dispatchery   s,   ,"0((
rk   a0  
Triton ahead-of-time linker:

This program takes in header files generated by compile.py, and generates a
single entry-point responsible for dispatching the user's input to the right
kernel given the specializations that were compiled.

Example usage:
python link.py /path/to/headers/*.h -o kernel_name
__main__)ArgumentParser)descriptionheaders+z_Paths to header files to link. Must include linker directive annotations (autogenerated by ttc))nargshelpz--outz-ozOut filename)typerr   z--prefix z(String to prefix kernel dispatcher names)rs   defaultrr   c                 C      g | ]	\}}t ||qS r   )rV   rO   r4   rh   r   r   r
   rQ          rQ   z.hwz#include <cuda.h>
rW   Nc                 C   rv   r   )rk   rw   r   r   r
   rQ      rx   z.cz#include <stdint.h>
)-collectionsr   pathlibr   typingr   r   dataclassesr   r   	Exceptionr   r   r   rS   r   rV   rk   descr   argparserm   parseradd_argument
parse_argsr<   includesro   r&   h_path	read_texth_strr:   r4   r6   r#   itemsdeclsoutwith_suffixopenfpwriterI   defsr   r   r   r
   <module>   sZ    
R


$