
    çgi5              
       J   d dl Z d dlZd dlmZmZ d dlmZmZmZ  G d d          Z	dee
         fdZde
fdZ G d	 d
e          Z G d de          Z G d d          ZdgZde
de
de
de
ddf
dZedk    r e j                    Ze                    dddd           e                    ddd           e                    ddd           e                    ddd d!           e                                Z eej        ej        ej        ej                   dS dS )"    N)ABCabstractmethod)DictListOptionalc                   6   e Zd ZU eed<   eed<   eed<   ee         ed<   ee         ed<   dededed	ee         d
ee         ddfdZedefd            Zedefd            Z	edefd            Z
edee         fd            Zedee         fd            ZdS )Symbol_name_op_name	_ret_type
_arg_names
_arg_typesnameop_nameret_type	arg_names	arg_typesreturnNc                     || _         || _        || _        t          |          | _        t          |          | _        dS )a#  
        A symbol is a function declaration.
        :param name: name of the symbol
        :param op_name: name of the operation
        :param ret_type: return type of the operation
        :param arg_names: names of the arguments
        :param arg_types: types of the arguments
        N)r
   r   r   listr   r   )selfr   r   r   r   r   s         U/var/www/html/ai-engine/env/lib/python3.11/site-packages/triton/tools/build_extern.py__init__zSymbol.__init__   s7      
!y//y//    c                     | j         S Nr
   r   s    r   r   zSymbol.name$   
    zr   c                     | j         S r   )r   r   s    r   r   zSymbol.op_name(   
    }r   c                     | j         S r   )r   r   s    r   r   zSymbol.ret_type,   
    ~r   c                     | j         S r   )r   r   s    r   r   zSymbol.arg_names0   
    r   c                     | j         S r   )r   r   s    r   r   zSymbol.arg_types4   r%   r   )__name__
__module____qualname__str__annotations__r   r   propertyr   r   r   r   r    r   r   r	   r	      sr        JJJMMMNNNS	S	** * 	*
 9* 9* 
* * * *, c    X     X #    X 49    X 49    X  r   r	   r   c                 f    | dk    rdS | dk    rdS | dk    rdS | dk    rdS | d	k    rd
S | dk    rdS d S )Ni32int32u32uint32i64int64u64uint64floatfp32doublefp64r-   type_strs    r   convert_typer=   9   si    5w	U		x	U		w	U		x	W		v	X		v tr   c                 &    | dk    rdS | dk    rdS | S )Nr0   r2   r4   r6   r-   r;   s    r   to_unsignedr?   K   s'    7x	W		xr   c                   0   e Zd ZU eed<   eed<   eeef         ed<   eed<   eed<   	 	 ddeded	ed
eddf
dZe	defd            Z
e	defd            Ze	deeef         fd            Ze	defd            Zedd            Zedefd            ZddZdS )ExternLibraryr
   _path_symbols_format	_groupingTr   pathformatgroupingr   Nc                 L    || _         || _        i | _        || _        || _        dS )z
        Abstract class for extern library.
        :param name: name of the library
        :param path: path of the library
        :param format: whether to format the generated stub file
        N)r
   rB   rC   rD   rE   )r   r   rF   rG   rH   s        r   r   zExternLibrary.__init__[   s+     

!r   c                     | j         S r   r   r   s    r   r   zExternLibrary.namen   r   r   c                     | j         S r   rB   r   s    r   rF   zExternLibrary.pathr   r   r   c                     | j         S r   )rC   r   s    r   symbolszExternLibrary.symbolsv   r!   r   c                     | j         S r   )rE   r   s    r   rH   zExternLibrary.groupingz   r#   r   c                     d S r   r-   )r   
input_files     r   parse_symbolszExternLibrary.parse_symbols~       r   c                     d S r   r-   r   s    r   _output_stubszExternLibrary._output_stubs   rS   r   c                    |                                  }|t          |          dk    rt          d          | d| j         d}t	          |d          5 }|                    |           |                                 | j        rkt          j	        dddd	|gt          j
        
                                           t          j	        d|gt          j
        
                                           d d d            d S # 1 swxY w Y   d S )Nr   zfile_str is empty/z.pywautopep8z-az-rz-istdoutisort)rU   len	Exceptionr
   openwritecloserD   
subprocessPopenPIPEcommunicate)r   
output_dirfile_stroutput_filefs        r   generate_stub_filez ExternLibrary.generate_stub_file   sX   %%''s8}}11/000#55dj555+s## 	_qGGHGGIII| _ *dD$!LU_Udeeeqqsss ';!7
PPP\\^^^	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_ 	_s   BC??DD)TTr   N)r'   r(   r)   r*   r+   r   r	   boolr   r,   r   rF   rN   rH   r   rR   rU   rj   r-   r   r   rA   rA   T   s        JJJJJJ3;MMMOOO " "" " 	"
 " 
" " " "& c    X c    X c6k*    X $    X    ^ s    ^_ _ _ _ _ _r   rA   c                        e Zd ZU eeee         f         ed<   d	 fdZe	de
e         fd            Zd	dZd	dZdefdZ xZS )
	Libdevice_symbol_groupsr   Nc                 h    t                                          d|           i | _        d| _        dS )z_
        Constructor for Libdevice.
        :param path: path of the libdevice library
        	libdeviceTN)superr   ro   is_pure)r   rF   	__class__s     r   r   zLibdevice.__init__   s2    
 	d+++ r   c                    |                      d          }|d         }|d         }|                                 }|d         dk    rd S t          |d                   }|d S |                     d          }|d                             dd          }|                    dd          }d|v rd S |d                              d	          }	g }
g }t          |	          D ]m\  }}t          |                                 d                   }| d S d
t	          |          z   }|
                    |           |                    |           n|dk    rt          |
d                   |
d<   nK|                    d          r6t          |          }t          |
          D ]\  }}t          |          |
|<   t          |||||
          S )N@r      internal( __nv_ieee,argsadu)	splitr=   replace	enumerater*   appendr?   
startswithr	   )lineentriesret_strfunc_strret_strsr   	func_strs	func_namer   arg_strsr   r   iarg_strarg_typearg_names                   r   _extract_symbolzLibdevice._extract_symbol   s    **S//!*1:==??A;*$$4,,4NN3''	aL((b11	##GR00W4Q<%%c**		#H-- 	' 	'JAw#GMMOOA$677Htts1vv~HX&&&X&&&&e'	"66IbMM$$ 	5 #8,,H(33 5 58*844	!i(IyIIIr   c                    i }| j                                         D ]}|j        }|||<   i ddddddddd	dd
dddddddddddddddddddddddi dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d2d4d5d6d5d7d8d9d8d:d;d<d;i d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOddPddQdRdSdTdUdVdWdXdYdZd[d\i d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdldndodpdodqdrdsdtdudvdwdxdydzd{d|i d}d~ddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddi ddddddddddddddddddddddddœddœddȓddʓdd̓ddΓi ddГddғddԓdd֓ddؓddړddܓddޓddޓddddddddddddddddi ddddddddddddddddddddddddd ddddddddd	d
dd}| j                                         D ]Q}|j        }||v r||         }||_        || j        v r!| j        |                             |           F|g| j        |<   Rd S (  Nllabsabsacosfacosacoshfacoshdadd_rdadd_rdfadd_rddadd_rnadd_rnfadd_rndadd_ruadd_rufadd_rudadd_rzadd_rzfadd_rzasinfasinasinhfasinhatanfatanatan2fatan2atanhfatanhbrevllbrevcbrtfcbrtceilfceilclzllclz	copysignfcopysigncosfcoscoshfcoshcospifcospicyl_bessel_i0fcyl_bessel_i0cyl_bessel_i1fcyl_bessel_i1fdiv_rddiv_rdddiv_rdfdiv_rndiv_rnddiv_rnfdiv_rudiv_ruddiv_rufdiv_rzdiv_rzddiv_rzerfferferfcferfcerfcinvferfcinverfcxferfcxerfinvferfinvexpfexpexp10fexp10exp2fexp2expm1fexpm1fabsffabsfast_fdivideffast_divideffdimffdimffsllffsfloorffloorfmaffmafmaf_rdfma_rdfmaf_rnfma_rnfmaf_rufma_rufmaf_rzfma_rzfmodffmoduhaddhaddhypotfhypotilogbfilogbisinffisinfisinfdisnanfisnanisnandj0fj0j1fj1jnfjnldexpfldexplgammaflgammallrintfllrintllroundfllroundlogfloglog10flog10log1pflog1plog2flog2logbflogbumaxmaxllmaxullmaxfmaxffmaxuminminllminullminfminffmindmul_rdmul_rdfmul_rddmul_rnmul_rnfmul_rndmul_rumul_rufmul_rudmul_rzmul_rzfmul_rzumul24mul24umulhimulhimul64hiumul64hi
nearbyintf	nearbyint
nextafterf	nextafternorm3dfnorm3dnorm4dfnorm4dnormcdffnormcdfnormcdfinvf
normcdfinvpopcllpopcpowifpowpowipowfrcbrtfrcbrtfrcp_rdrcp_rddrcp_rdfrcp_rnrcp_rndrcp_rnfrcp_rurcp_rudrcp_rufrcp_rzrcp_rzdrcp_rz
remainderf	remainderurhaddrhaddrhypotfrhypotrintfrintrnorm3dfrnorm3drnorm4dfrnorm4droundfroundrsqrtfrsqrt	frsqrt_rnrsqrt_rnusadr   scalbnfscalbnsignbitfsignbitsignbitdsinfsinsinhfsinhsinpifsinpisqrtfsqrtfsqrt_rdsqrt_rddsqrt_rdfsqrt_rnsqrt_rndsqrt_rnfsqrt_rusqrt_rudsqrt_rufsqrt_rzsqrt_rzdsqrt_rzfsub_rdsub_rddsub_rdfsub_rnsub_rndsub_rnfsub_rusub_rudsub_rufsub_rzsub_rzdsub_rztanftantanhftanhtgammaftgammatruncftruncy0fy0y1yn)y1fynf)rC   valuesr   r   ro   r   )r   
symbol_setsymbolr   renamings        r   _group_symbolszLibdevice._group_symbols   s	   
m**,, 	) 	)FnG"(Jw
U
#V
-5w
@I8
U^`h
js

+4h
@I8
U^`h
js
 v
 (0
 ;B6
 LTU\
 _gho
 f	
 
 &v	
 07	
 AH	
 Q\]g	
 jpqv	

 V

 &w

 1A/

 Tdet
 x
 "+H
 7@
 LUV^
 ajks
 x
 "+H
 7@
 
 
 LRSX
 [bci
 lv
  
 +4X
 @Fu
 OWX_
 bijp
 g
  '
 06u
 ?N~
 `ghn
 qx
 W
 '-e
 6?
 
 
 KTU]
 `ijr
 x
 ")&
 3:6
 DLW
 W_`g
 jr
 w
 )1'
 <DW
 OTUY
 \abf
 inos
 g
  )(
 5>x
 
 
 JTU^
 aghm
 px
 w
 )0
 :A&
 KQRW
 Zabg
 jr
 E
 $*5
 39%
 BI%
 RZ[`
 cjkp
  E!
  %h!
 
 
  1:8!
  FOPX!
  [dem!
" x#
" "+H#
" 7@#
" LUV^#
" aijq#
$ g%
$  )'%
$ 4>w%
$ IUVa%
$ dp'
& #H'
& /8'
& DNy'
& [hiu'
 
 
( f)
( &u)
( /5e)
( >DU)
( MUV])
( `ijr)
* x+
* "+H+
* 7@+
* LUV^+
* ajks+
, x-
, "+H-
, 7CK-
, RZ[b-
, enow-
. V/
 
 
. (/
. 5?	/
. LTU\/
. _gho/
0 1
0 &,U1
0 5>x1
0 JTU^1
0 aklu1
2 E3
2 #F3
2 -5g3
2 @G3
2 Q[\e3
2 hr5
4 "95
4 /9)5
 
 
4 FPQZ5
4 ]ghq5
6 	7
6 $.y7
6 ;DX7
6 PYZb7
6 enow7
8 x9
8 "+H9
8 7@9
8 LUV^9
8 ajks9
: E;
: #F;
: -6x;
: BJ7;
: UZ[_;
 
: im=
 
 
B m**,, 	8 	8FnG("""7+")$---#G,33F;;;;06x#G,,	8 	8r   c                 0   t          | j                  dk    rd S t          j        dd|g                                                                          }|D ])}|                     |          }||| j        |j        <   *| 	                                 d S )Nr   grepdefine)
r]   rN   rb   check_outputdecode
splitlinesr   rC   r   r  )r   rQ   outputr   r  s        r   rR   zLibdevice.parse_symbols   s    t|q  F(&(J)GHHOOQQ\\^^ 	0 	0D))$//F~)/DM&+&&r   c                    d}d}d}| j                                         D ]}|dz  }d|d         j         d}|d         j        D ]
}|| dz  }|dz  }d	| j         d
}|d         j        D ]
}|| dz  }|dz  }d}|D ];}	|dz  }|	j        D ]}
|d|
 dz  }d|	j         d}|d|	j        z   dz   |z   dz   z  }<|dz  }||z  }|d| j         z  }|dz  }|||z   dz   z  }||z   |z   }|S )Nzfrom . import core
rz   z@core.extern
zdef r   ry   z, z_builder=None):
z!	return core.extern_elementwise("z", libdevice_path(), [z], 
{zcore.dtype("z"),z")z): ("z", z),
}z
, is_pure=z, _builder=_builder)

)	ro   r  r   r   r
   r   r   r   rs   )r   
import_str
header_strr   rN   func_name_strr   
return_strarg_type_symbol_dict_strr  r   r   rg   s                r   rU   zLibdevice._output_stubs  s    ,

*1133 	: 	:G((H871:#5888M#AJ0 1 1H000MbtzbbbJ#AJ0 . .ooo-

'!J'*$! ` `(C/( & 0 M MH,0Lx0L0L0LL,,=&/===(Hv{,BV,Kh,VY_,__(($+$22J5t|555J22J
2T99HH
*X5r   rk   )r'   r(   r)   r   r*   r   r	   r+   r   staticmethodr   r   r  rR   rU   __classcell__)rt   s   @r   rn   rn      s         d6l*++++      'J&!1 'J 'J 'J \'JR08 08 08 08d
 
 
 
&s & & & & & & & &r   rn   c                   t    e Zd ZU eed<   eed<   d
dZdeddfdZedefd            Zedefd	            Z	dS )LLVMDisassemblerrB   _ll_filer   Nc                 "    || _         d| _        dS )zf
        Invoke llvm-dis to disassemble the given file.
        :param path: path to llvm-dis
        z/tmp/extern_lib.llN)rB   r  )r   rF   s     r   r   zLLVMDisassembler.__init__5  s    
 
,r   lib_pathc                     t          j        | j        |d| j        gt           j                                                   d S )Nz-orZ   )rb   rc   rB   ll_filerd   re   )r   r  s     r   disasmzLLVMDisassembler.disasm=  s9    $*hdlCJO\\\hhjjjjjr   c                     | j         S r   )r  r   s    r   r  zLLVMDisassembler.ll_file@  r!   r   c                     | j         S r   rL   r   s    r   rF   zLLVMDisassembler.pathD  r   r   rk   )
r'   r(   r)   r*   r+   r   r  r,   r  rF   r-   r   r   r  r  1  s         JJJMMM- - - -ks kt k k k k     X c    X  r   r  rq   llvm_dis_pathr  lib_namerf   c                     |dk    rt          |          }nt          d|           t          |           }|                    |           |                    |j                   |                    |           dS )a  
      Interface function to build the library file.
      :param llvm_dis_path: path to the llvm-dis binary
      :param lib_path: path to the external library file
      :param lib_name: name of the library
      :param output_dir: path to the output directory
    rq   zUnknown extern library: N)rn   r^   r  r  rR   r  rj   )r  r  r  rf   
extern_libllvm_disassemblers         r   buildr  L  s     ;x((

=8==>>>(77X&&&.6777!!*-----r   __main__z
--llvm-diszPath to llvm-diszllvm-dis)desthelpdefaultz
--lib-pathzPath to the extern library)r  r  z
--lib-namezName of the extern libraryz--outputzOutput file pathz/tmp/)argparserb   abcr   r   typingr   r   r   r	   r*   r=   r?   rA   rn   r  extern_libsr  r'   ArgumentParserparseradd_argument
parse_argsargsr  r  r  rf   r-   r   r   <module>r     s]        # # # # # # # # ' ' ' ' ' ' ' ' ' '/ / / / / / / /dhsm    $S    =_ =_ =_ =_ =_C =_ =_ =_@Z Z Z Z Z Z Z Zz       0 m... . 	.
 
. . . .2 z$X$&&F
?AS]ghhh
:<XYYY
:<XYYY

<NX_```D	E$
dmT]DOLLLLL r   