
    ^j21                        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/      Z1 ee2      jf                  d,z  ejh                  z  d-z  jM                         Z5e!jl                  jo                  d.      jq                  d/      5 Z9e5Z6e6d0ju                  e-      z  Z6e6d0z  Z6e6e0z  Z6e6d0z  Z6e6e1z  Z6e9jw                  e6       d1d1d1       ejV                  jY                         D  cg c]  \  } } e| |       c}} Z<ejV                  j{                         D  cg c]  } |  c} Z> ee>e/      Z? ee/      Z@ ee>e/      ZA ee/      ZB ee/      ZCe!jl                  jo                  d2      jq                  d/      5 Z9e5Z6e6d3z  Z6e6d4z  Z6e6d0z  Z6e6d0ju                  e<      z  Z6e6d0z  Z6e6e?z  Z6e6d0z  Z6e6eBz  Z6e6d0z  Z6e6e@z  Z6e6d0z  Z6e6eAz  Z6e6d0z  Z6e6eCz  Z6e9jw                  e6       d1d1d1       y1y1c c}} w c c}} w # 1 sw Y   9xY wc c}} w c c} w # 1 sw Y   y1xY w)5    )defaultdict)Path)SequenceUnion)	dataclassc                 
    | d uS N )xs    \/var/www/ramen.bs-engineer-server.com/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      | _        |j                  d      | _        t        t              | _	        d | _
        y )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__zHeaderParser.__init__   sr     "$,X!Y::&DEZZ ;<
**W-!zz*TU"4( r   headerc                    |j                         D ]Y  }|j                  d      s| j                  j                  |      }t	        |      r|j                  d      |j                  d      |j                  d      }}}| j                  |      \  }}}	| j                  |      \  }
}| j                  |	|      \  }}| j                  dj                  ||g      t        |||
|||	|	|             | j                  j                  |      }t	        |      s
|j                  d      }| j                  	|| _        0| j                  |k7  sAt        d| j                   d|        y )	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*   r-   RuntimeError)r.   r0   lnmker_namer(   	algo_infonamer   r   c_typesr   r   r   r-   s                  r   extract_linker_metaz HeaderParser.extract_linker_meta0   s^   ##% 	l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#)&/	 ,,2226Aqz'(wwqz,,40<D-!..,>".1CDDUDUCVV[\h[i/j"kk9	lr   rB   c                     | j                   j                  |      }t        |      r8|j                  d      |j                  d      |j                  d      }}}|||fS t	        | d      )Nr2   r3   r4   z is not a valid kernel name)r'   r8   r   r9   r   )r.   rB   rA   rD   r   r   s         r   r:   zHeaderParser._match_nameO   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(   rA   tysargstyarg_names          r   r;   zHeaderParser._match_c_sigV   so    JJu%q6BC ! &H

2H%& 9UG#EFGGr   r   c                 .   |j                  d      }ddd}d}g }t        t        |            D ]  }d}|j                  t	        |            }	|	s"|t        t	        |            z  }| j
                  j                  ||      rB|dz  }|j                  d g|t        |      z
  z         |j                  |||             |dz  }||d  } t        |      dkD  rt        d|       |j                  d gt        |      t        |      z
  z         ||fS )N,r2      )cdr   zHas invalid extra suffix: )
splitrangerJ   r7   r   r)   r8   extendrK   	Exception)
r.   r   r(   rM   s2ir   r   iposidx_matcheds
             r   r<   zHeaderParser._match_suffixa   s   {{3B	s4y! 	"AC ++CF3K3s1v;C$$VS1Q	dVq3u:~67S-.qCD\F	" v;?8ABBdVs4y3u:567%r   rD   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 )Nz Mismatched signature for kernel z: 
	existing sig is: rQ   z
	current is: )r,   zipr   r   r>   rK   )r.   rD   r]   lastcurnew_s         r   r=   zHeaderParser._add_kernelz   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   rF   r:   r;   r<   r   r=   r
   r   r   r"   r"      sX    !"l# l>DC D	H# 	H C    2
' 
'*: 
'r   r"   c           	          dj                  t        | j                  | j                        D cg c]  \  }}| d|  c}}      S c c}}w )N,  )r>   r`   r   r   )rA   rN   args      r   gen_signature_with_full_argsri      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 )Nr2   rf   rg   )r`   r   r   r   r>   )rA   rN   hint	arg_typesrh   r   sigs          r   gen_signaturern      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
rD   metasrd   c           	      8    d|  dt        |d          d|  d|  d	S )N
TT_ResultTy (TT_StreamTy stream, r_   z);
void load_();
void unload_();
    )ri   )rD   ro   s     r   make_algo_declsru      sB    F'(DU2Y(O'P Q& F  r   metac                     d| j                    dt        |        d| j                    dt        |        d| j                    d| j                    dS )Nrq   _default(TT_StreamTy stream, z);
TT_ResultTy rr   z, int algo_id);
void load_rs   rt   )r   ri   )rv   s    r   make_global_declry      su    ""##@A]^bAc@d e""##89UVZ9[8\ ]  
! """# $	 r   c                     d| j                    dt        |        d}|d| j                    ddj                  | j                         dz  }|dz  }|S )	NTT_ResultTy rx   z){
	  return 	(stream, rf   z, 0);
}
r   ri   r>   r   rv   srcs     r   make_default_algo_kernelr      sd    ..//LMijnMoLppu
vC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   rA   s    r   <lambda>z.make_kernel_hints_dispatcher.<locals>.<lambda>       Q[[L r   )keyr{   r5   rr   );
r_   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 )	NrR   z((uintptr_t)z % z == 0)r2   (z == )r
   )valrk   s     r   r   z.make_kernel_hints_dispatcher.<locals>.<lambda>   sK    rz !-SETF&A  qy SEdV1%  	 r   z && z  if (z)
zif (1)
r2   z    return r}   rf   z!  return TT_ERROR_INVALID_VALUE;
r~   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   rn   ri   r>   r`   r   r   any)rD   ro   r   rv   cond_fnr   rk   condsrh   r   modes              r   make_kernel_hints_dispatcherr      s   dV2
&Cu"89 Bd334Admm_Adkk]Rghuvzh{g|  }A  B  	BB4KCl4& 56RSXY[S\6]5^^abcC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//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   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 )Nr{   rr   z, int algo_id){
z   assert (algo_id < (int)sizeof(z_kernels));
r|   z_kernels[algo_id](stream, rf   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                 t    dt        |       d}|d|j                   dz  }| D ]  }|d| dz  } |dz  }|S )Nz9typedef TT_ResultTy (*kernel_func_t)(TT_StreamTy stream, r   zkernel_func_t z_kernels[] = {
r   z,
z};
)ri   r   )r   rv   r   rD   s       r   make_func_pointersr      sc    EFbcgFhEiim
nC^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   r5   z(void){
r   r   z}

r   )r   rv   r   r   rD   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]));
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   rX   r   r   r"   ri   rn   r   ru   ry   r   r   r   r   r   r   r   descr   argparser   parseradd_argument
parse_argsrM   includesr   r0   h_path	read_texth_strrK   rD   rF   r,   items
algo_decls
meta_listsrv   get_num_algos_declglobal_decl__file__parentr-   backend_preludeoutwith_suffixopenfpr>   writedefskeysr   func_pointers_defmeta_const_defload_unload_defget_num_algos_defdefault_algo_kernel)rD   rv   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*$/$-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]^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""
! g 8 X@
  _4 s1   >N2N$7<N*N7	N=+A)O*N4O