
    sg_.                     @   d dl mZ d dlmZ d dlmZmZ d dlmZ d Z	 G d de
      Ze G d d	             Z G d
 d      Zd Zd Zdedee   defdZdedefdZdedefdZdedee   defdZdedefdZdededefdZdededefdZdedefdZdedefdZdZedk(  rd dlmZ  ee      Zej?                  d d!d"#       ej?                  d$d%ed&'       ej?                  d(ed)d*+       ejA                         Z! e       Zg Z"e!jF                  D ]F  Z$ ee$      Z%e%jM                         Z'e"jQ                  e%jR                         ejU                  e'       H ejV                  jY                         D  cg c]  \  } } e| |       c}} Z-ejV                  jY                         D  cg c]  \  } }|	 c}} Z.e.d    d    Z/ ee/      Z0 ee/      Z1e!jd                  jg                  d,      ji                  d-      5 Z5d.Z2e2d/jm                  e-      z  Z2e2d/z  Z2e2e0z  Z2e2d/z  Z2e2e1z  Z2e5jo                  e2       d0d0d0       ejV                  jY                         D  cg c]  \  } } e| |       c}} Z8ejV                  js                         D  cg c]  } |  c} Z: ee:e/      Z; ee/      Z< ee:e/      Z= ee/      Z> ee/      Z?e!jd                  jg                  d1      ji                  d-      5 Z5d)Z2e2d.z  Z2e2d2z  Z2e2d3z  Z2e2d/z  Z2e2d/jm                  e8      z  Z2e2d/z  Z2e2e;z  Z2e2d/z  Z2e2e>z  Z2e2d/z  Z2e2e<z  Z2e2d/z  Z2e2e=z  Z2e2d/z  Z2e2e?z  Z2e5jo                  e2       d0d0d0       y0y0c c}} w c c}} w # 1 sw Y   >xY wc c}} w c c} w # 1 sw Y   y0xY w)4    )defaultdict)Path)SequenceUnion)	dataclassc                 
    | d uS N )xs    D/var/www/html/venv/lib/python3.12/site-packages/triton/tools/link.py_existsr      s    D=    c                       e Zd Zy)LinkerErrorN)__name__
__module____qualname__r
   r   r   r   r      s    r   r   c                   z    e Zd ZU eed<   ee   ed<   ee   ed<   eeedf      ed<   eed<   eed<   eed<   eed	<   y)
KernelLinkerMetaorig_kernel_name	arg_names
arg_ctypesNsizessig_hashtriton_suffixsuffix	num_specs)r   r   r   str__annotations__r   r   intr
   r   r   r   r      sH    }E#t)$%%MKN+r   r   c                   X    e Zd ZddZdefdZdefdZdefdZd	edefd
Zdede	fdZ
y)HeaderParserNc                     dd l }|j                  d      | _        |j                  d      | _        |j                  d      | _        |j                  d      | _        t        t              | _        y )Nr   z'//[\s]*tt-linker:[\s]*([\w]+):(.+):(.+)z^([\w]+)_([\w]+)_([\w]+)$z[\s]*(\w+)\s(\w+)[,]?z[c,d])	recompilelinker_directiveskernel_namec_sig
arg_suffixr   listkernels)selfr$   s     r   __init__zHeaderParser.__init__   sX     "$,X!Y::&DEZZ ;<
**W-"4(r   headerc                    |j                         D ]  }|j                  d      s| j                  j                  |      }t	        |      s<|j                  d      |j                  d      |j                  d      }}}| j                  |      \  }}}	| j                  |      \  }
}| j                  |	|      \  }}| j                  dj                  ||g      t        |||
|||	|	|              y )Nz//         _)r   r   r   r   r   r   r   r   )
splitlines
startswithr&   matchr   group_match_name_match_c_sig_match_suffix_add_kerneljoinr   )r,   r.   lnmker_namer(   	algo_infonamer   r   c_typesr   r   r   s                 r   extract_linker_metaz HeaderParser.extract_linker_meta-   s    ##% 	B}}T"**0041:12QWWQZQRYeH-1-=-=h-G*D(F)-):):5)A&GY'+'9'9&%'H$Iu$$$	!23(-1&/'."'%-*0#)&/		r   r?   c                     | j                   j                  |      }t        |      r8|j                  d      |j                  d      |j                  d      }}}|||fS t	        | d      )Nr0   r1   r2   z is not a valid kernel name)r'   r6   r   r7   r   )r,   r?   r>   rA   r   r   s         r   r8   zHeaderParser._match_nameD   sd    ""8,1:%&WWQZQWWQZF(D6))XJ&ABCCr   r(   c                     | j                   j                  |      }t        |      r4g g }}|D ]'  \  }}|j                  |       |j                  |       ) ||fS t	        | d      )Nz" is not a valid argument signature)r(   findalllenappendr   )r,   r(   r>   tysargstyarg_names          r   r9   zHeaderParser._match_c_sigK   so    JJu%q6BC ! &H

2H%& 9UG#EFGGr   r   c                 6   |j                  d      }ddd}d}g }t        t        |            D ]  }|j                  t	        |            }|dk(  rt        | d      |t        t	        |            z  }| j                  j                  ||      rB|dz  }|j                  d g|t        |      z
  z         |j                  |||             |dz  }|t        |      dz
  k  r||d  }|j                  d gt        |      t        |      z
  z          ||fS )N,r0      )cdr   z is not a valid kernel suffix)
splitrangerG   findr   r   r)   r6   extendrH   )	r,   r   r(   rJ   s2ir   r   iposs	            r   r:   zHeaderParser._match_suffixV   s   {{3B	 s4y! 	@A++c!f%Cby!VH,I"JKK3s1v;C$$VS1Q	dVq3u:~67S-.q3t9q= dVs4y3u:'=>?	@ %r   rA   kerc                 f   || j                   v r| j                   |   d   }t        |j                  |j                        D ]P  \  }}||k7  st        d| ddj	                  |j                         ddj	                  |j                                | j                   |   j                  |       y )NrR   z Mismatched signature for kernel z: 
	existing sig is: rN   z
	current is: )r+   zipr   r   r<   rH   )r,   rA   rZ   lastcurnew_s         r   r;   zHeaderParser._add_kernelm   s    4<<%)\\$%7%;D #..A 	T$;%:4&@WX[X`X`aeapapXqWr  sC  DG  DL  DL  MP  M[  M[  D\  C]  ^  	T!!#&r   )returnN)r   r   r   r-   r   rC   r8   r9   r:   r   r;   r
   r   r   r"   r"      sV    )# .DC D	H# 	H C    .
' 
'*: 
'r   r"   c           	          dj                  t        | j                  | j                        D cg c]  \  }}| d|  c}}      S c c}}w )N,  )r<   r\   r   r   )r>   rK   args      r   gen_signature_with_full_argsre   z   s<    993q||Q[[3QRCAcUmRSSRs   A
c           	      p   t        | j                  | j                        D cg c]  \  }}|dk7  s| }}}t        | j                  | j                        D cg c]  \  }}|dk7  s| }}}dj	                  t        ||      D cg c]  \  }}| d|  c}}      }|S c c}}w c c}}w c c}}w )Nr0   rb   rc   )r\   r   r   r   r<   )r>   rK   hint	arg_typesrd   r   sigs          r   gen_signaturerj   ~   s    $'agg$>LD$!)LIL&)!++qww&?Md419MIM
))#i2KLwr3t1SE]L
MCJ MMLs   B&B&B,*B,B2
rA   metasr`   c           	      8    d|  dt        |d          d|  d|  d	S )N

CUresult (CUstream stream, rR   z);
void load_();
void unload_();
    )re   )rA   rk   s     r   make_algo_declsrq      sB    

!">uRy"I!J K& F  r   metac                     d| j                    dt        |        d| j                    dt        |        d| j                    d| j                    dS )Nrm   _default(CUstream stream, z);
CUresult rn   z, int algo_id);
void load_ro   rp   )r   re   )rr   s    r   make_global_declru      su    



	  :;WX\;]:^ _



	  23OPT3U2V W  
! """# $	 r   c                     d| j                    dt        |        d}|d| j                    ddj                  | j                         dz  }|dz  }|S )	N	CUresult rt   z){
	  return 	(stream, rb   z, 0);
}
r   re   r<   r   rr   srcs     r   make_default_algo_kernelr~      sd    d++,,FGcdhGiFjjo
pCi--.i		$..8Q7RRYZ[C5LCJr   c                 r   d|  d}t        |d       D ];  }|d|j                   d|j                   d|j                   dt	        |       d	z  }= |dz  }|d|  dt        |d	          d
z  }|dz  }t        |d       D ]  }d }dj                  t        |j                  |j                        D cg c]  \  }}|	 |||       c}}      }|t        |j                        rd| dndz  }t        |j                  |j                        D cg c]  \  }}|dk7  s| }	}}|d|j                   d|j                   d|j                   ddj                  |	       d	z  } |dz  }|dz  }|dz  }dD ]  }
|d|
 d|  dz  }t        |d       D ]2  }|d|
 d|j                   d|j                   d|j                   d	z  }4 |d|
 d|  dz  }|dz  }t        |d       D ]2  }|d|
 d|j                   d|j                   d|j                   d	z  }4 |dz  } |S c c}}w c c}}w ) Nz// launcher for: 
c                     | j                    S r	   r   r>   s    r   <lambda>z.make_kernel_hints_dispatcher.<locals>.<lambda>       Q[[L r   )keyrw   r3   rn   );
rR   z){c                     | j                    S r	   r   r   s    r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   r   r   c                 >    |dk(  r	d|  d| dS |dk(  r	d|  d| dS d S )NrO   (z % z == 0)r0   z == )r
   )valrg   s     r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   sK    rz !"#c$v6  qy SEdV1%  	 r   z && z  if (z)
zif (1)
r0   z    return ry   rb   z#  return CUDA_ERROR_INVALID_VALUE;
rz   loadunloadz
// z for: c                     | j                    S r	   r   r   s    r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>        r   void ();
z() {c                     | j                    S r	   r   r   s    r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   r   r     )sortedr   r   r   rj   re   r<   r\   r   r   any)rA   rk   r}   rr   cond_fnr   rg   condsrd   r   modes              r   make_kernel_hints_dispatcherr      s   dV2
&Cu"89 |40014==/4;;-Oaboptbuavvz{{|4KCiv/0LUSUY0W/XX[\]C4KCu"89 v 	  <
T C
 
 	s4::&s#J 	*-dnndjj*IWYS$TUVYSW	WT2231T]]O1T[[MQZ[_[d[den[oZpptuuv  4KC11C5LC" tfF4&++5&<= 	]DU4&$"7"7!8$--$++V[\\C	]tfAdV5))t5&<= 	\Dba 5 56aa}TYZ[C	\u J-
 Xs   7H-H3%H3c                     d| j                    dt        |        d}|d| j                    dz  }|d| j                    ddj                  | j                         d	z  }|d
z  }|S )Nrw   rn   z, int algo_id){
z   assert (algo_id < (int)sizeof(z_kernels));
rx   z_kernels[algo_id](stream, rb   r   rz   r{   r|   s     r   !make_kernel_meta_const_dispatcherr      s    d++,,>?[\`?a>bbt
uC-d.C.C-DMRRCYt,,--G		RVR`R`HaGbbfggC5LCJr   namesc                 t    dt        |       d}|d|j                   dz  }| D ]  }|d| dz  } |dz  }|S )Nz3typedef CUresult (*kernel_func_t)(CUstream stream, r   zkernel_func_t z_kernels[] = {
r   z,
z};
)re   r   )r   rr   r}   rA   s       r   make_func_pointersr      sc    ?@\]a@b?ccg
hC^D1122CDDC D6~6MCJr   c                 t    d}dD ]0  }|d| d|j                    dz  }| D ]  }|d| d| dz  } |dz  }2 |S )	N r   r   r3   z(void){
r   r   z}

r   )r   rr   r}   r   rA   s        r   make_kernel_load_defr      sn    
C" tfAd334J?? 	+DRvQtfE**C	+w	
 Jr   c                 &    d| j                    d}|S )Nint z_get_num_algos(void);r   r|   s     r   make_get_num_algos_declr      s    &&''<
=CJr   c                 p    d| j                    d}|d| j                    d| j                    dz  }|dz  }|S )Nr   z_get_num_algos(void){
z  return (int)(sizeof(z_kernels) / sizeof(z_kernels[0]));
rz   r   r|   s     r   make_get_num_algos_defr      sP    &&''?
@C#D$9$9#::MdNcNcMddtuuC5LCJr   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)typer   z--prefixr   z(String to prefix kernel dispatcher names)r   defaultr   z.hwz#include <cuda.h>
r   Nz.cz#include <stdint.h>
z#include <assert.h>
)@collectionsr   pathlibr   typingr   r   dataclassesr   r   	Exceptionr   r   r"   re   rj   r   rq   ru   r~   r   r   r   r   r   r   descr   argparser   parseradd_argument
parse_argsrJ   includesr   r.   h_path	read_texth_strrH   rA   rC   r+   items
algo_decls
meta_listsrr   get_num_algos_declglobal_decloutwith_suffixopenfpr<   writedefskeysr   func_pointers_defmeta_const_defload_unload_defget_num_algos_defdefault_algo_kernel)rA   rr   s   00r   <module>r      sv   #  " !	) 	 	, 	, 	,Z' Z'zT# h/?&@ S +  #3  %s %8<L3M %RU %R,<  c )9 c  +;  "2 s 
!1 c 	 z'-F
n  
 D~F
7	   D ^FH,, *f  "$""5)	* AG@T@T@VW*$/$-WJ)/)=)=)?@:4$@Ja=D06"4(K			d	#	(	(	- #tyy$$t!!t{
 HN~~G[G[G]^t(t4^D$nn1134dT4E*5$76t<N*5$7O.t4248			d	#	(	(	- $$&&&&ttyyt  t  t~tt""
# e 8 X@  _4 s1   >M02M6<M<%N		N8A.N<NN