U
    yÊ¹jE9  ã                   @   s$  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„ dƒZ	ee
 dœdd„Ze
dœd	d
„ZG dd„ deƒZG dd„ deƒZG dd„ dƒZdgZe
e
e
e
ddœdd„Zedk�r e  ¡ Zejddddd� ejdddd� ejdd d!d� ejd"d#d$d%d� e ¡ Zeejejejejƒ dS )&é    N)ÚABCÚabstractmethod)ÚDictÚListÚOptionalc                   @   sÀ   e Zd ZU eed< eed< eed< ee ed< ee ed< eeeee ee ddœdd	„Zeed
œdd„ƒZeed
œdd„ƒZ	eed
œdd„ƒZ
eee d
œdd„ƒZeee d
œdd„ƒZdS )ÚSymbolÚ_nameÚ_op_nameÚ	_ret_typeÚ
_arg_namesÚ
_arg_typesN)ÚnameÚop_nameÚret_typeÚ	arg_namesÚ	arg_typesÚreturnc                 C   s*   || _ || _|| _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   © r   úX/var/www/html/bwave/python/venv/lib/python3.8/site-packages/triton/tools/build_extern.pyÚ__init__   s
    
zSymbol.__init__©r   c                 C   s   | j S ©N©r   ©r   r   r   r   r   $   s    zSymbol.namec                 C   s   | j S r   )r	   r   r   r   r   r   (   s    zSymbol.op_namec                 C   s   | j S r   )r
   r   r   r   r   r   ,   s    zSymbol.ret_typec                 C   s   | j S r   )r   r   r   r   r   r   0   s    zSymbol.arg_namesc                 C   s   | j S r   )r   r   r   r   r   r   4   s    zSymbol.arg_types)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__r   r   Úpropertyr   r   r   r   r   r   r   r   r   r      s,   
ùr   r   c                 C   sP   | dkrdS | dkrdS | dkr$dS | dkr0dS | d	kr<d
S | dkrHdS d S d S )NZi32Úint32Úu32Úuint32Zi64Úint64Zu64Úuint64ÚfloatZfp32ÚdoubleZfp64r   ©Ztype_strr   r   r   Úconvert_type9   s    r*   c                 C   s    | dkrdS | dkrdS | S d S )Nr"   r$   r%   r&   r   r)   r   r   r   Úto_unsignedK   s
    r+   c                   @   sØ   e Zd ZU eed< eed< eeef ed< eed< eed< deeeeddœd	d
„Ze	edœdd„ƒZ
e	edœdd„ƒZe	eeef dœdd„ƒZe	edœdd„ƒZeddœdd„ƒZeedœdd„ƒZddœdd„ZdS )ÚExternLibraryr   Ú_pathÚ_symbolsÚ_formatÚ	_groupingTN)r   ÚpathÚformatÚgroupingr   c                 C   s"   || _ || _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   r-   r.   r/   r0   )r   r   r1   r2   r3   r   r   r   r   [   s
    zExternLibrary.__init__r   c                 C   s   | j S r   r   r   r   r   r   r   n   s    zExternLibrary.namec                 C   s   | j S r   ©r-   r   r   r   r   r1   r   s    zExternLibrary.pathc                 C   s   | j S r   )r.   r   r   r   r   Úsymbolsv   s    zExternLibrary.symbolsc                 C   s   | j S r   )r0   r   r   r   r   r3   z   s    zExternLibrary.groupingc                 C   s   d S r   r   )r   Ú
input_filer   r   r   Úparse_symbols~   s    zExternLibrary.parse_symbolsc                 C   s   d S r   r   r   r   r   r   Ú_output_stubs‚   s    zExternLibrary._output_stubsc              	   C   sž   |   ¡ }|d kst|ƒdkr$tdƒ‚|› d| j› d�}t|dƒ�T}| |¡ | ¡  | jr�tj	dddd	|gtj
d
� ¡  tj	d|gtj
d
� ¡  W 5 Q R X d S )Nr   zfile_str is emptyú/z.pyÚwZautopep8z-az-rz-i©ÚstdoutZisort)r8   ÚlenÚ	Exceptionr   ÚopenÚwriteÚcloser/   Ú
subprocessÚPopenÚPIPEÚcommunicate)r   Ú
output_dirÚfile_strZoutput_fileÚfr   r   r   Úgenerate_stub_file†   s    
ÿ
z ExternLibrary.generate_stub_file)TT)r   r   r   r   r    r   r   Úboolr   r!   r   r1   r5   r3   r   r7   r8   rI   r   r   r   r   r,   T   s6   
  ûúr,   c                       sx   e Zd ZU eeee f ed< ddœ‡ fdd„Ze	e
e dœdd„ƒZddœdd	„Zddœd
d„Zedœdd„Z‡  ZS )Ú	LibdeviceÚ_symbol_groupsNr   c                    s   t ƒ  d|¡ i | _d| _dS )z_
        Constructor for Libdevice.
        :param path: path of the libdevice library
        Ú	libdeviceTN)Úsuperr   rL   Úis_pure©r   r1   ©Ú	__class__r   r   r   ˜   s    zLibdevice.__init__c                 C   s@  |   d¡}|d }|d }|  ¡ }|d dkr2d S t|d ƒ}|d krJd S |  d¡}|d  dd¡}| dd¡}d|kr|d S |d   d	¡}	g }
g }t|	ƒD ]F\}}t|  ¡ d ƒ}|d krÀ d S d
t|ƒ }|
 |¡ | |¡ qš|dkrüt|
d ƒ|
d< n4| d¡�r0t|ƒ}t|
ƒD ]\}}t|ƒ|
|< �qt|||||
ƒS )Nú@r   é   Zinternalú(Ú Z__nv_Zieeeú,ÚargÚsadéÿÿÿÿÚu)	Úsplitr*   ÚreplaceÚ	enumerater   Úappendr+   Ú
startswithr   )ÚlineÚentriesZret_strÚfunc_strZret_strsr   Z	func_strsÚ	func_namer   Zarg_strsr   r   ÚiZarg_strÚarg_typeÚarg_namer   r   r   Ú_extract_symbol¡   s>    


zLibdevice._extract_symbolc              œ   C   s¼  i }| j  ¡ D ]}|j}|||< q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dddddd d!d"d#ddd$d%d&d'd(d)d*d+d,d-d.d/d0d1d1d2d2d3d4d5d6d7d8d9d:d;d<d=d>d?d?d?d?d?d@d@d@d@d@dAdAdBdBdCdCdDdDdEdFdFdFdGdHdIdJdKdLdMdNdNdNdOdPdPdQdQdRdRdSdSdTdUdVdWdXdYdZd[d\d]d^d_d_d`dadbdcdddddededfdfdgdgdhdhdididjdjdkdkdldmdndodpdqdrdsœ›}| j  ¡ D ]N}|j}||k�rŠ|| }||_|| jk�r¨| j|  |¡ n|g| j|< �qhd S )tNÚabsÚacosÚacoshZadd_rdZadd_rnZadd_ruZadd_rzÚasinÚasinhÚatanÚatan2ÚatanhZbrevZcbrtÚceilZclzÚcopysignÚcosÚcoshZcospiZcyl_bessel_i0Zcyl_bessel_i1Zdiv_rdZdiv_rnZdiv_ruZdiv_rzÚerfÚerfcZerfcinvZerfcxZerfinvÚexpZexp10Zexp2Úexpm1Zfast_dividefZfdimZffsÚfloorÚfmaZfma_rdZfma_rnZfma_ruZfma_rzÚfmodZhaddÚhypotZilogbÚisinfÚisnanZj0Zj1ZjnÚldexpÚlgammaZllrintZllroundÚlogÚlog10Úlog1pÚlog2ÚlogbÚmaxÚminZmul_rdZmul_rnZmul_ruZmul_rzZmul24ZmulhiZ	nearbyintZ	nextafterZnorm3dZnorm4dZnormcdfZ
normcdfinvZpopcÚpowZrcbrtZrcp_rdZrcp_rnZrcp_ruZrcp_rzÚ	remainderZrhaddZrhypotZrintZrnorm3dZrnorm4dÚroundZrsqrtZrsqrt_rnrY   ZscalbnZsignbitÚsinÚsinhZsinpiÚsqrtZsqrt_rdZsqrt_rnZsqrt_ruZsqrt_rzZsub_rdZsub_rnZsub_ruZsub_rzÚtanÚtanhZtgammaÚtruncZy0Úy1Zyn)›ZllabsZacosfZacoshfZdadd_rdZfadd_rdZdadd_rnZfadd_rnZdadd_ruZfadd_ruZdadd_rzZfadd_rzZasinfZasinhfZatanfZatan2fZatanhfZbrevllZcbrtfZceilfZclzllZ	copysignfZcosfZcoshfZcospifZcyl_bessel_i0fZcyl_bessel_i1fZfdiv_rdZddiv_rdZfdiv_rnZddiv_rnZfdiv_ruZddiv_ruZfdiv_rzZddiv_rzZerffZerfcfZerfcinvfZerfcxfZerfinvfZexpfZexp10fZexp2fZexpm1fZfabsfÚfabsZfast_fdividefZfdimfZffsllZfloorfZfmafZfmaf_rdZfmaf_rnZfmaf_ruZfmaf_rzZfmodfZuhaddZhypotfZilogbfZisinffZisinfdZisnanfZisnandZj0fZj1fZjnfZldexpfZlgammafZllrintfZllroundfZlogfZlog10fZlog1pfZlog2fZlogbfZumaxZllmaxZullmaxZfmaxfZfmaxZuminZllminZullminZfminfZfminZdmul_rdZfmul_rdZdmul_rnZfmul_rnZdmul_ruZfmul_ruZdmul_rzZfmul_rzZumul24ZumulhiZmul64hiZumul64hiZ
nearbyintfZ
nextafterfZnorm3dfZnorm4dfZnormcdffZnormcdfinvfZpopcllZpowifZpowiZpowfZrcbrtfZfrcp_rdZdrcp_rdZfrcp_rnZdrcp_rnZfrcp_ruZdrcp_ruZfrcp_rzZdrcp_rzZ
remainderfZurhaddZrhypotfZrintfZrnorm3dfZrnorm4dfZroundfZrsqrtfZ	frsqrt_rnZusadZscalbnfZsignbitfZsignbitdZsinfZsinhfZsinpifZsqrtfZfsqrt_rdZdsqrt_rdZfsqrt_rnZdsqrt_rnZfsqrt_ruZdsqrt_ruZfsqrt_rzZdsqrt_rzZfsub_rdZdsub_rdZfsub_rnZdsub_rnZfsub_ruZdsub_ruZfsub_rzZdsub_rzZtanfZtanhfZtgammafZtruncfZy0fZy1fZynf)r.   Úvaluesr   r	   rL   r_   )r   Z
symbol_setÚsymbolr   Zrenamingr   r   r   Ú_group_symbolsË   sP   
                                                                                                         Î5
zLibdevice._group_symbolsc                 C   s`   t | jƒdkrd S t dd|g¡ ¡  ¡ }|D ]$}|  |¡}|d krFq.|| j|j< q.|  	¡  d S )Nr   ZgrepZdefine)
r=   r5   rB   Úcheck_outputÚdecodeÚ
splitlinesrh   r.   r   r•   )r   r6   Úoutputra   r”   r   r   r   r7     s    
zLibdevice.parse_symbolsc                 C   sŽ  d}|d7 }|d7 }d}|d7 }|d7 }|d7 }|d7 }|d	7 }|d
7 }|d7 }|d7 }|d7 }d}| j  ¡ D �]}|d7 }d|d j› d�}|d jD ]}||› d�7 }q˜|d7 }d| j› d�}|d jD ]}||› d�7 }qÌ|d7 }d}|D ]R}	|d7 }|	jD ]}
|d|
› d�7 }�qd|	j› d�}|d|	j d | d 7 }qð|d7 }||7 }|d| j› �7 }|d 7 }||| d! 7 }qn|| | }|S )"Nzfrom . import core
z
import os
zimport functools
rV   z@functools.lru_cache()
zdef libdevice_path():
z    import torch
ze    third_party_dir =  os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "third_party")
z"    if torch.version.hip is None:
zR        default = os.path.join(third_party_dir, "cuda", "lib", "libdevice.10.bc")
z
    else:
z        default = ''
z7    return os.getenv("TRITON_LIBDEVICE_PATH", default)
z@core.extern
zdef r   rU   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)
Ú
)	rL   r“   r   r   r   r   r   r   rO   )r   Z
import_strÚ
header_strrc   r5   Zfunc_name_strrg   Z
return_strZarg_type_symbol_dict_strr”   rf   r   rG   r   r   r   r8     sL    
zLibdevice._output_stubs)r   r   r   r   r   r   r   r    r   Ústaticmethodr   rh   r•   r7   r8   Ú__classcell__r   r   rQ   r   rK   •   s   
	)FrK   c                   @   s`   e Zd ZU eed< eed< ddœdd„Zeddœdd	„Zeedœd
d„ƒZeedœdd„ƒZ	dS )ÚLLVMDisassemblerr-   Ú_ll_fileNr   c                 C   s   || _ d| _dS )zf
        Invoke llvm-dis to disassemble the given file.
        :param path: path to llvm-dis
        z/tmp/extern_lib.llN)r-   r¡   rP   r   r   r   r   U  s    zLLVMDisassembler.__init__)Úlib_pathr   c                 C   s$   t j| j|d| jgt jd� ¡  d S )Nz-or;   )rB   rC   r-   Úll_filerD   rE   )r   r¢   r   r   r   Údisasm]  s    ÿzLLVMDisassembler.disasmc                 C   s   | j S r   )r¡   r   r   r   r   r£   a  s    zLLVMDisassembler.ll_filec                 C   s   | j S r   r4   r   r   r   r   r1   e  s    zLLVMDisassembler.path)
r   r   r   r   r    r   r¤   r!   r£   r1   r   r   r   r   r    Q  s   
r    rM   )Úllvm_dis_pathr¢   Úlib_namerF   r   c                 C   sL   |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
    rM   zUnknown extern library: N)rK   r>   r    r¤   r7   r£   rI   )r¥   r¢   r¦   rF   Z
extern_libZllvm_disassemblerr   r   r   Úbuildm  s    

r§   Ú__main__z
--llvm-disr¥   zPath to llvm-diszllvm-dis)ÚdestÚhelpÚdefaultz
--lib-pathr¢   zPath to the extern library)r©   rª   z
--lib-namer¦   zName of the extern libraryz--outputrF   zOutput file pathz/tmp/)ÚargparserB   Úabcr   r   Útypingr   r   r   r   r   r*   r+   r,   rK   r    Zextern_libsr§   r   ÚArgumentParserÚparserÚadd_argumentÚ
parse_argsÚargsr¥   r¢   r¦   rF   r   r   r   r   Ú<module>   s2   2	A =û
