o
    i                     @   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   `/var/www/html/eduruby.in/lip-sync/lip-sync-env/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   Z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   ZtysargstyZ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    r7   r8   r   r   r9   )r$   r   r2   r   r   Zs2iZargnumZ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   joinr9   )r$   r4   r?   lastcurZnew_r   r   r
   r0   `   s   
$zHeaderParser._add_kernel)r   N)r   r   r   r%   r   r5   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>)rC   rB   r   r   r2   r   r   r
   gen_signaturem   s   rL   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, r@   z);
void load_z();
void unload_z();
    )rL   )r4   rM   r   r   r
   
make_declsq   s   
rO   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   rK   r   r   r
   <lambda>{       z(make_kernel_dispatcher.<locals>.<lambda>)keyz	CUresult _rN   z);
r@   z){c                 S   rQ   r   rR   rK   r   r   r
   rS      rT   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
   rS      s   8 z && c                    s"   g | ]\}}|d ur ||qS r   r   )rH   rY   rZ   Zcond_fnr   r
   rJ      s   " z*make_kernel_dispatcher.<locals>.<listcomp>z  if (z)
z    return z(stream, gX, gY, gZ, rF   z}
)loadZunloadz
// z for: c                 S   rQ   r   rR   rK   r   r   r
   rS      rT   zvoid z();
z() {c                 S   rQ   r   rR   rK   r   r   r
   rS      rT   z  )sortedr   r   rL   rC   rB   r   r   )r4   rM   srcmetaZcondsmoder   r[   r
   make_kernel_dispatchery   s,   ,"0((
ra   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)typerh   z--prefix z(String to prefix kernel dispatcher names)ri   defaultrh   c                 C      g | ]	\}}t ||qS r   )rO   rH   r4   r_   r   r   r
   rJ          rJ   z.hwz#include <cuda.h>
rP   Nc                 C   rl   r   )ra   rm   r   r   r
   rJ      rn   z.cz#include <stdint.h>
)-collectionsr   pathlibr   typingr   r   dataclassesr   r   	Exceptionr   r   r   rL   r   rO   ra   Zdescr   argparserc   parseradd_argument
parse_argsr:   Zincludesre   r&   Zh_path	read_textZh_strr9   r4   r5   r#   itemsZdeclsoutwith_suffixopenfpwriterC   Zdefsr   r   r   r
   <module>   sZ    
R


$