
    (Th_.                     `   S SK Jr  S SKJr  S SKJrJr  S SKJr  S r	 " S S\
5      r\ " S S	5      5       r " S
 S5      rS rS rS\S\\   S\4S jrS\S\4S jrS\S\4S jrS\S\\   S\4S jrS\S\4S jrS\S\S\4S jrS\S\S\4S jrS\S\4S jrS\S\4S jrSr\S:X  Ga  S SKJr  \" \S9r\R?                  S S!S"S#9  \R?                  S$S%\S&S'9  \R?                  S(\S)S*S+9  \RA                  5       r!\" 5       r/ r"\!RF                   HG  r$\" \$5      r%\%RM                  5       r'\"RQ                  \%RR                  5        \RU                  \'5        MI     \RV                  RY                  5        V Vs/ s H  u  p\" X5      PM     snn r-\RV                  RY                  5        V Vs/ s H  u  pUPM	     snn r.\.S    S    r/\" \/5      r0\" \/5      r1\!Rd                  Rg                  S,5      Ri                  S-5       r5S.r2\2S/Rm                  \-5      -  r2\2S/-  r2\2\0-  r2\2S/-  r2\2\1-  r2\5Ro                  \25        S0S0S05        \RV                  RY                  5        V Vs/ s H  u  p\" X5      PM     snn r8\RV                  Rs                  5        V s/ s H  o PM     sn r:\" \:\/5      r;\" \/5      r<\" \:\/5      r=\" \/5      r>\" \/5      r?\!Rd                  Rg                  S15      Ri                  S-5       r5S)r2\2S.-  r2\2S2-  r2\2S3-  r2\2S/-  r2\2S/Rm                  \85      -  r2\2S/-  r2\2\;-  r2\2S/-  r2\2\>-  r2\2S/-  r2\2\<-  r2\2S/-  r2\2\=-  r2\2S/-  r2\2\?-  r2\5Ro                  \25        S0S0S05        g0g0s  snn f s  snn f ! , (       d  f       GNF= fs  snn f s  sn f ! , (       d  f       g0= f)4    )defaultdict)Path)SequenceUnion)	dataclassc                 
    U S L$ N )xs    I/var/www/auris/envauris/lib/python3.13/site-packages/triton/tools/link.py_existsr      s    D=    c                       \ rS rSrSrg)LinkerError   r
   N)__name__
__module____qualname____firstlineno____static_attributes__r
   r   r   r   r      s    r   r   c                       \ rS rSr% \\S'   \\   \S'   \\   \S'   \\\S4      \S'   \\S'   \\S'   \\S	'   \\S
'   Sr	g)KernelLinkerMeta   orig_kernel_name	arg_names
arg_ctypesNsizessig_hashtriton_suffixsuffix	num_specsr
   )
r   r   r   r   str__annotations__r   r   intr   r
   r   r   r   r      sH    }E#t)$%%MKN+r   r   c                   l    \ rS rSrSS jrS\4S jrS\4S jrS\4S	 jrS
\S\4S jr	S\S\
4S jrSrg)HeaderParser   Nc                     SS K nUR                  S5      U l        UR                  S5      U l        UR                  S5      U l        UR                  S5      U l        [        [        5      U l        g )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__HeaderParser.__init__   sX     "$,X!Y::&DEZZ ;<
**W-"4(r   headerc                    UR                  5        H  nUR                  S5      (       d  M  U R                  R                  U5      n[	        U5      (       d  MH  UR                  S5      UR                  S5      UR                  S5      penU R                  U5      u  pxn	U R                  U5      u  pU R                  X5      u  pU R                  SR                  Xv/5      [        UUU
UUU	U	US95        M     g )Nz//         _)r   r   r   r   r   r   r    r!   )
splitlines
startswithr+   matchr   group_match_name_match_c_sig_match_suffix_add_kerneljoinr   )r1   r4   lnmker_namer-   	algo_infonamer   r    c_typesr   r!   r   s                 r   extract_linker_meta HeaderParser.extract_linker_meta-   s    ##%B}}T""**0041::12QWWQZQRYH-1-=-=h-G*DF)-):):5)A&G'+'9'9&'H$I$$$!23(-1&/'."'%-*0#)&/	 &r   rE   c                     U R                   R                  U5      n[        U5      (       a6  UR                  S5      UR                  S5      UR                  S5      pTnX4U4$ [	        U S35      e)Nr6   r7   r8   z is not a valid kernel name)r,   r<   r   r=   r   )r1   rE   rD   rG   r   r    s         r   r>   HeaderParser._match_nameD   sb    ""8,1::%&WWQZQWWQZFD6))XJ&ABCCr   r-   c                     U R                   R                  U5      n[        U5      (       a3  / / pCU H'  u  pVUR                  U5        UR                  U5        M)     X44$ [	        U S35      e)Nz" is not a valid argument signature)r-   findalllenappendr   )r1   r-   rD   tysargstyarg_names          r   r?   HeaderParser._match_c_sigK   sf    JJu%q66B !

2H% !" 9UG#EFGGr   r    c                 B   UR                  S5      nSSS.nSn/ n[        [        U5      5       H  nUR                  [	        U5      5      nUS:X  a  [        U S35      eU[        [	        U5      5      -  nU R                  R                  X5      (       aA  US-  nUR                  S /U[        U5      -
  -  5        UR                  XAU      5        US-  nU[        U5      S-
  :  a  XS  nM  UR                  S /[        U5      [        U5      -
  -  5        M     XV4$ )N,r6   r   )cdr   z is not a valid kernel suffix)
splitrangerO   findr"   r   r.   r<   extendrP   )	r1   r    r-   rR   s2ir!   r   iposs	            r   r@   HeaderParser._match_suffixV   s   {{3B	 s4y!A++c!f%Cby!VH,I"JKK3s1v;C$$V11Q	dVq3u:~67S-.q3t9q= dVs4y3u:'=>? " r   rG   kerc                 j   XR                   ;   a  U R                   U   S   n[        UR                  UR                  5       HP  u  pEXE:w  d  M  [        SU SSR	                  UR                  5       SSR	                  UR                  5       35      e   U R                   U   R                  U5        g )NrZ   z Mismatched signature for kernel z: 
	existing sig is: rW   z
	current is: )r0   zipr   r   rB   rP   )r1   rG   rc   lastcurnew_s         r   rA   HeaderParser._add_kernelm   s    <<%)\\$%7%;D #..A	;%:4&@WX[X`X`aeapapXqWr  sC  DG  DL  DL  MP  M[  M[  D\  C]  ^  B 	T!!#&r   )r.   r-   r,   r0   r+   )returnN)r   r   r   r   r2   r"   rI   r>   r?   r@   r   rA   r   r
   r   r   r&   r&      sV    )# .DC D	H# 	H C    .
' 
'*: 
'r   r&   c           	          SR                  [        U R                  U R                  5       VVs/ s H  u  pU SU 3PM     snn5      $ s  snnf )N,  )rB   re   r   r   )rD   rS   args      r   gen_signature_with_full_argsro   z   s@    993q||Q[[3QR3QAcUm3QRSSRs   A

c           	         [        U R                  U R                  5       VVs/ s H  u  pUS:w  d  M  UPM     nnn[        U R                  U R                  5       VVs/ s H  u  pBUS:w  d  M  UPM     nnnSR	                  [        X55       VVs/ s H  u  pU SU 3PM     snn5      nU$ s  snnf s  snnf s  snnf )Nr6   rl   rm   )re   r   r   r   rB   )rD   rS   hint	arg_typesrn   r   sigs          r   gen_signaturert   ~   s    $'agg$>L$>$!)$>IL&)!++qww&?M&?419&?IM
))#i2KL2Kwrt1SE]2KL
MCJ MMLs   B/B/ B50B5B;
rG   metasrj   c           	      8    SU  S[        US   5       SU  SU  S3	$ )N

CUresult (CUstream stream, rZ   z);
void load_();
void unload_();
    )ro   )rG   ru   s     r   make_algo_declsr{      sB    

!">uRy"I!J K& F  r   metac                     SU R                    S[        U 5       SU R                    S[        U 5       SU R                    SU R                    S3$ )Nrw   _default(CUstream stream, z);
CUresult rx   z, int algo_id);
void load_ry   rz   )r   ro   )r|   s    r   make_global_declr      su    

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



	  23OPT3U2V W  
! """# $	 r   c                     SU R                    S[        U 5       S3nUSU R                    SSR                  U R                  5       S3-  nUS-  nU$ )	N	CUresult r~   z){
	  return 	(stream, rl   z, 0);
}
r   ro   rB   r   r|   srcs     r   make_default_algo_kernelr      sd    d++,,FGcdhGiFjjo
pCi--.i		$..8Q7RRYZ[C5LCJr   c                    SU  S3n[        US S9 H<  nUSUR                   SUR                   SUR                   S[	        U5       S3	-  nM>     US-  nUSU  S[        US	   5       S
3-  nUS-  n[        US S9 H  nS nSR                  [        UR                  UR                  5       VVs/ s H  u  pVUc  M
  U" XV5      PM     snn5      nU[        UR                  5      (       a  SU S3OS-  n[        UR                  UR                  5       VVs/ s H  u  pUS:w  d  M  UPM     n	nnUSUR                   SUR                   SUR                   SSR                  U	5       S3	-  nM     US-  nUS-  nUS-  nS H  n
USU
 SU  S3-  n[        US S9 H3  nUSU
 SUR                   SUR                   SUR                   S3	-  nM5     USU
 SU  S3-  nUS-  n[        US S9 H3  nUSU
 SUR                   SUR                   SUR                   S3	-  nM5     US-  nM     U$ s  snnf s  snnf ) Nz// launcher for: 
c                     U R                   * $ r	   r!   rD   s    r   <lambda>.make_kernel_hints_dispatcher.<locals>.<lambda>   
    Q[[Lr   )keyr   r9   rx   );
rZ   z){c                     U R                   * $ r	   r   r   s    r   r   r      r   r   c                 B    US:X  a	  SU  SU S3$ US:X  a	  SU  SU S3$ S $ )Nr   (z % z == 0)r6   z == )r
   )valrq   s     r   r   r      sN    rz !"#c$v6  qy SEdV1% 	r   z && z  if (z)
zif (1)
r6   z    return r   rl   z#  return CUDA_ERROR_INVALID_VALUE;
r   loadunloadz
// z for: c                     U R                   * $ r	   r   r   s    r   r   r      
    r   void ();
z() {c                     U R                   * $ r	   r   r   s    r   r   r      r   r     )sortedr   r   r    rt   ro   rB   re   r   r   any)rG   ru   r   r|   cond_fnr   rq   condsrn   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 	  <
<	 GC<
 
 	s4::&s#J 	*-dnndjj*IW*IYSTUVYS*I	WT2231T]]O1T[[MQZ[_[d[den[oZpptuu :  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   3	H8 H8H>,H>c                     SU R                    S[        U 5       S3nUSU R                    S3-  nUSU R                    SSR                  U R                  5       S	3-  nUS
-  nU$ )Nr   rx   z, int algo_id){
z   assert (algo_id < (int)sizeof(z_kernels));
r   z_kernels[algo_id](stream, rl   r   r   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                 x    S[        U5       S3nUSUR                   S3-  nU  H  nUSU S3-  nM     US-  nU$ )Nz3typedef CUresult (*kernel_func_t)(CUstream stream, r   zkernel_func_t z_kernels[] = {
r   z,
z};
)ro   r   )r   r|   r   rG   s       r   make_func_pointersr      s^    ?@\]a@b?ccg
hC^D1122CDDCD6~ 6MCJr   c                 |    SnS H3  nUSU SUR                    S3-  nU  H  nUSU SU S3-  nM     US-  nM5     U$ )	N r   r   r9   z(void){
r   r   z}

r   )r   r|   r   r   rG   s        r   make_kernel_load_defr      sd    
C"tfAd334J??DRvQtfE**C w	 #
 Jr   c                 &    SU R                    S3nU$ )Nint z_get_num_algos(void);r   r   s     r   make_get_num_algos_declr      s    &&''<
=CJr   c                 p    SU R                    S3nUSU R                    SU R                    S3-  nUS-  nU$ )Nr   z_get_num_algos(void){
z  return (int)(sizeof(z_kernels) / sizeof(z_kernels[0]));
r   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&   ro   rt   r"   r{   r   r   r   r   r   r   r   r   descr   argparser   parseradd_argument
parse_argsrR   includesr   r4   h_path	read_texth_strrP   rG   rI   r0   items
algo_decls
meta_listsr|   get_num_algos_declglobal_decloutwith_suffixopenfprB   writedefskeysr   func_pointers_defmeta_const_defload_unload_defget_num_algos_defdefault_algo_kernel)rG   r|   s   00r   <module>r      so   #  " !	) 	 	, 	, 	,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@V*$/$-@VWJ)/)=)=)?@)?:4$)?@Ja=D06"4(K			d	#	(	(	-#tyy$$t!!t{
 
. HN~~G[G[G]^G](4G]^D$nn11343dT34E*5$76t<N*5$7O.t4248			d	#	(	(	-$$&&&&ttyyt  t  t~tt""
# 
.	-e 8 X@ 
.	- _4 
.	-s1   >M63M<<N(NN>A.N
N
N-