U
    9%eE9                     @   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/Darija-Ai-API/env/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rt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rt|
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 =
