
    3j21                        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\" \25      Rf                  S,-  \Rh                  -  S--  RM                  5       r5\!Rl                  Ro                  S.5      Rq                  S/5       r9\5r6\6S0Ru                  \-5      -  r6\6S0-  r6\6\0-  r6\6S0-  r6\6\1-  r6\9Rw                  \65        S1S1S15        \RV                  RY                  5        V Vs/ s H  u  p\" X5      PM     snn r<\RV                  R{                  5        V s/ s H  o PM     sn r>\" \>\/5      r?\" \/5      r@\" \>\/5      rA\" \/5      rB\" \/5      rC\!Rl                  Ro                  S25      Rq                  S/5       r9\5r6\6S3-  r6\6S4-  r6\6S0-  r6\6S0Ru                  \<5      -  r6\6S0-  r6\6\?-  r6\6S0-  r6\6\B-  r6\6S0-  r6\6\@-  r6\6S0-  r6\6\A-  r6\6S0-  r6\6\C-  r6\9Rw                  \65        S1S1S15        g1g1s  snn f s  snn f ! , (       d  f       GNA= fs  snn f s  sn f ! , (       d  f       g1= f)5    )defaultdict)Path)SequenceUnion)	dataclassc                 
    U S L$ N )xs    K/home/wildlama/miniconda3/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        UR                  S5      U l        [        [        5      U l	        S U l
        g )Nr   z'//[\s]*tt-linker:[\s]*([\w]+):(.+):(.+)z^([\w]+)_([\w]+)_([\w]*)$z[\s]*(\w+)\s(\w+)[,]?z[c,d]z%//[\s]*tt-linker-backend:[\s]*([\w]+))recompilelinker_directiveskernel_namec_sig
arg_suffixbackend_name_rer   listkernelsbackend_name)selfr)   s     r   __init__HeaderParser.__init__   sr     "$,X!Y::&DEZZ ;<
**W-!zz*TU"4( r   headerc                    UR                  5        GHe  nUR                  S5      (       d  M  U R                  R                  U5      n[	        U5      (       a  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  U R                  R                  U5      n[	        U5      (       d  GM  UR                  S5      nU R                  c	  Xl        GM:  U R                  U:w  d  GMM  [        SU R                   SU 35      e   g )	Nz//         _)r   r   r   r   r   r   r    r!   zdiffering backend z vs. )
splitlines
startswithr+   matchr   group_match_name_match_c_sig_match_suffix_add_kerneljoinr   r/   r2   RuntimeError)r3   r6   lnmker_namer-   	algo_infonamer   r    c_typesr   r!   r   r2   s                  r   extract_linker_meta HeaderParser.extract_linker_meta0   sP   ##%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#)&/	 ,,2226Aqzz'(wwqz,,40<-!..,>".1CDDUDUCVV[\h[i/j"kk9 &r   rH   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)Nr8   r9   r:   z is not a valid kernel name)r,   r>   r   r?   r   )r3   rH   rG   rJ   r   r    s         r   r@   HeaderParser._match_nameO   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   )r3   r-   rG   tysargstyarg_names          r   rA   HeaderParser._match_c_sigV   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SnUR                  [	        U5      5      n	U	(       d  M(  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XS  nM     [        U5      S:  a  [        SU 35      eUR                  S /[        U5      [        U5      -
  -  5        XV4$ )N,r8   r   )cdr   zHas invalid extra suffix: )
splitrangerR   r=   r"   r.   r>   extendrS   	Exception)
r3   r    r-   rU   s2ir!   r   iposidx_matcheds
             r   rB   HeaderParser._match_suffixa   s   {{3B	s4y!AC ++CF3K3s1v;C$$V11Q	dVq3u:~67S-.qD\F " v;?8ABBdVs4y3u:567r   rJ   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 )Nz Mismatched signature for kernel z: 
	existing sig is: rZ   z
	current is: )r1   zipr   r   rD   rS   )r3   rJ   rf   lastcurnew_s         r   rC   HeaderParser._add_kernelz   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.   r2   r/   r-   r,   r1   r+   )returnN)r   r   r   r   r4   r"   rL   r@   rA   rB   r   rC   r   r
   r   r   r&   r&      sX    !"l# l>DC D	H# 	H C    2
' 
'*: 
'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,  )rD   ri   r   r   )rG   rV   args      r   gen_signature_with_full_argsrs      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 )Nr8   rp   rq   )ri   r   r   r   rD   )rG   rV   hint	arg_typesrr   r   sigs          r   gen_signaturerx      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;
rJ   metasrn   c           	      8    SU  S[        US   5       SU  SU  S3	$ )N
TT_ResultTy (TT_StreamTy stream, rh   z);
void load_();
void unload_();
    )rs   )rJ   ry   s     r   make_algo_declsr      sB    F'(DU2Y(O'P Q& F  r   metac                     SU R                    S[        U 5       SU R                    S[        U 5       SU R                    SU R                    S3$ )Nr{   _default(TT_StreamTy stream, z);
TT_ResultTy r|   z, int algo_id);
void load_r}   r~   )r   rs   )r   s    r   make_global_declr      su    ""##@A]^bAc@d e""##89UVZ9[8\ ]  
! """# $	 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TT_ResultTy r   z){
	  return 	(stream, rp   z, 0);
}
r   rs   rD   r   r   srcs     r   make_default_algo_kernelr      sd    ..//LMijnMoLppu
vC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!   rG   s    r   <lambda>.make_kernel_hints_dispatcher.<locals>.<lambda>   
    Q[[Lr   )keyr   r;   r|   );
rh   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((uintptr_t)z % z == 0)r8   (z == )r
   )valru   s     r   r   r      sN    rz !-SETF&A  qy SEdV1% 	r   z && z  if (z)
zif (1)
r8   z    return r   rp   z!  return TT_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    rx   rs   rD   ri   r   r   any)rJ   ry   r   r   cond_fnr   ru   condsrr   r   modes              r   make_kernel_hints_dispatcherr      s   dV2
&Cu"89d334Admm_Adkk]Rghuvzh{g|  }A  B  	B :4KCl4& 56RSXY[S\6]5^^abcC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//C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   r|   z, int algo_id){
z   assert (algo_id < (int)sizeof(z_kernels));
r   z_kernels[algo_id](stream, rp   r   r   r   r   s     r   !make_kernel_meta_const_dispatcherr      s    ..//DEabfEgDhhz
{C-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$ )Nz9typedef TT_ResultTy (*kernel_func_t)(TT_StreamTy stream, r   zkernel_func_t z_kernels[] = {
r   z,
z};
)rs   r   )r   r   r   rJ   s       r   make_func_pointersr      s^    EFbcgFhEiim
nC^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   r;   z(void){
r   r   z}

r   )r   r   r   r   rJ   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   extrazlink.hz.hwr   Nz.cz#include <stdint.h>
z#include <assert.h>
)Dcollectionsr   pathlibr   typingr   r   dataclassesr   r   r`   r   r   r&   rs   rx   r"   r   r   r   r   r   r   r   r   r   descr   argparser   parseradd_argument
parse_argsrU   includesr   r6   h_path	read_texth_strrS   rJ   rL   r1   items
algo_decls
meta_listsr   get_num_algos_declglobal_decl__file__parentr2   backend_preludeoutwith_suffixopenfprD   writedefskeysr   func_pointers_defmeta_const_defload_unload_defget_num_algos_defdefault_algo_kernel)rJ   r   s   00r   <module>r      s   #  " !	) 	 	, 	, 	,g' g'T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H~,,w69L9LLxWbbdO			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""
! 
.	-g 8 X@
 
.	- _4 
.	-s1   >N$3N*:<N0OO1A)O0
N?
O