U
    9%e                  	   @   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eee edddZeee edddZdZedkrd 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 qd$d% ej#$ D Z%ej&'d&(d'Z)e)*d(d)+e%  W 5 Q R X 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 5 Q R X d-S ).    )defaultdict)Path)SequenceUnion)	dataclassc                 C   s   | d k	S N )xr   r   P/var/www/html/Darija-Ai-API/env/lib/python3.8/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                   @   sb   e Zd ZddddZedddZedd	d
ZedddZedddZee	dddZ
dS )HeaderParserN)returnc                 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r| j|}t|r|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_meta)r3   c                 C   sR   | j |}t|r@|d|d|d  }}}|||fS t| dd S )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_name)r!   c                 C   sZ   | j |}t|rHg g  }}|D ]\}}|| || q"||fS t| dd S )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_sig)r   c                 C   sx   | j |}t|s"t| dg }t|}ddd}|D ]2\}}t|t|k r`|d  qD|||  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_suffix)r4   kerc              
   C   sv   || j krb| j | d }t|j|jD ]:\}}||kr&t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   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 ]l}dd  d fddt|j|jD }|d| d7 }|d|  d|j d|j dd|j d		7 }q|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   s   | j  S r   r   rK   r   r   r
   <lambda>{       z(make_kernel_dispatcher.<locals>.<lambda>)keyz	CUresult _rN   z);
r@   z){c                 S   s   | j  S r   rQ   rK   r   r   r
   rR      rS   c                 S   s8   |dkrd|  d| dS |dkr4d|  d| dS d S )Nr<   (z % z == 0)r'   z == )r   )valhintr   r   r
   rR      rS   z && c                    s"   g | ]\}}|d k	r ||qS r   r   )rH   rX   rY   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   s   | j  S r   rQ   rK   r   r   r
   rR      rS   zvoid z();
z() {c                 S   s   | j  S r   rQ   rK   r   r   r
   rR      rS   z  )sortedr   r   rL   rC   rB   r   r   )r4   rM   srcmetaZcondsmoder   rZ   r
   make_kernel_dispatchery   s,    ,"0**r`   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)typerg   z--prefix z(String to prefix kernel dispatcher names)rh   defaultrg   c                 C   s   g | ]\}}t ||qS r   )rO   rH   r4   r^   r   r   r
   rJ      s     rJ   z.hwz#include <cuda.h>
rP   c                 C   s   g | ]\}}t ||qS r   )r`   rk   r   r   r
   rJ      s     z.cz#include <stdint.h>
N)-collectionsr   pathlibr   typingr   r   dataclassesr   r   	Exceptionr   r   r   rL   r   rO   r`   descr   argparserb   parseradd_argument
parse_argsr:   Zincludesrd   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>   sR   
R


