U
    yÊ¹j©Â  ã                   @   sN  d dl Z d dlZd dlZd dlZd dlZd dlmZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZmZ d
d„ Zdd„ Zeedœdd„Zeedœdd„Zeedœdd„Zedœdd„Zdd„ Z dd„ Z!ee"e#dƒhZ$G dd„ dƒZ%G dd„ de j&ƒZ'G d d!„ d!e j&ƒZ(d"d#„ Z)d$d%„ Z*d&d'„ Z+dS )(é    N)ÚAnyÚCallableÚDictÚOptionalÚTupleÚTypeÚUnioné   )Úlanguage)Úir)Ú	constexprÚtensor)ÚJITFunctioné   )ÚCompilationErrorÚCompileTimeAssertionFailureÚUnsupportedLanguageConstructc                 C   sÔ   |   ¡ rdt| jƒ S |  ¡ rHtjjj}| j|kr6dnd}|t	| j
ƒ S |  ¡ rTdS |  ¡ r`dS |  ¡ rldS |  ¡ rxdS |  ¡ r„dS |  ¡ r¸t| jƒ}d	 tt	| jƒ¡}|› d
|› d
�S |  ¡ rÄdS dsÐtdƒ‚d S )NÚPÚiÚuZfp8Úfp16Úbf16Úfp32Úfp64Ú_ÚSÚVFzUnsupported type)Zis_ptrÚ	mangle_tyZ
element_tyÚis_intr
   ÚdtypeÚ
SIGNEDNESSÚSIGNEDÚint_signednessÚstrZint_bitwidthZis_fp8Zis_fp16Zis_bf16Zis_fp32Zis_fp64Úis_blockZscalarÚjoinÚmapÚshapeZis_voidÚAssertionError)Útyr!   ÚprefixÚeltr'   © r,   ú]/var/www/html/bwave/python/venv/lib/python3.8/site-packages/triton/compiler/code_generator.pyr      s.    

r   c                    st   d  dd„ |D ƒ¡}d  ‡ fdd„tˆ ƒD ƒ¡}| dd¡}| dd¡}| d	d¡ d
d¡}| › d|› d|› �}|S )Nr   c                 S   s   g | ]}t |ƒ‘qS r,   )r   ©Ú.0r)   r,   r,   r-   Ú
<listcomp>-   s     zmangle_fn.<locals>.<listcomp>c                    s"   g | ]}|› d t ˆ | ƒ› �‘qS )Úc)Úrepr©r/   r   ©Ú	constantsr,   r-   r0   .   s     Ú.Z_d_ú'Z_sq_ú[ú]Ú__)r%   ÚsortedÚreplace)ÚnameZarg_tysr5   Zmangled_arg_namesZmangled_constantsÚretr,   r4   r-   Ú	mangle_fn+   s    r?   )ÚoÚreturnc                 C   s
   t | tƒS ©N)Ú
isinstancer   ©r@   r,   r,   r-   Ú_is_triton_tensor7   s    rE   c                 C   s
   t | tƒS rB   )rC   r   rD   r,   r,   r-   Ú_is_constexpr;   s    rF   c                 C   s    t | ƒo| j ¡  p| jjdkS )Nr   )rE   Útyper$   ZnumelrD   r,   r,   r-   Ú_is_triton_scalar?   s    rH   rD   c                 C   s   t | tƒr| jS | S rB   )rC   r   ÚvaluerD   r,   r,   r-   Ú_unwrap_if_constexprC   s    rJ   c              
   C   sT   |j rPt|ƒD ]@\}}t|ƒst|ƒst|j| d|j› d|j| › d|› �ƒ‚qd S )Nz	Function z= is marked noinline, but was called with non-scalar argument ú:)ÚnoinlineÚ	enumeraterF   rH   r   ÚsrcÚ__name__Ú	arg_names)ÚnodeÚfnÚargsÚidxÚargr,   r,   r-   Ú_check_fn_argsG   s    rV   c                 C   s^   | }t |tƒs|j}q|jjj}t |j¡\}}|D ] }| ¡  d¡rP|d7 }q4 qVq4||fS )Nú@r   )	rC   r   rR   Ú__code__Úco_filenameÚinspectÚgetsourcelinesÚstripÚ
startswith)rR   Zbase_fnÚ	file_nameÚlinesÚ
begin_lineÚliner,   r,   r-   Ú_get_fn_file_lineN   s    


rb   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Úenter_sub_regionc                 C   s
   || _ d S rB   )Ú	generator)Úselfrd   r,   r,   r-   Ú__init__`   s    zenter_sub_region.__init__c                 C   sL   | j j ¡ | _| j j ¡ | _i | j _| j j ¡ | _| j j 	¡ | _
| j| jfS rB   )rd   ÚlscopeÚcopyÚliveinsÚ
local_defsÚ	prev_defsÚbuilderÚget_insertion_blockÚinsert_blockÚget_insertion_pointÚinsert_point©re   r,   r,   r-   Ú	__enter__c   s    zenter_sub_region.__enter__c                 O   s(   | j j | j¡ | j| j _| j| j _d S rB   )rd   rl   Úrestore_insertion_pointrp   ri   rg   rk   rj   )re   rS   Úkwargsr,   r,   r-   Ú__exit__l   s    
zenter_sub_region.__exit__N)rO   Ú
__module__Ú__qualname__rf   rr   ru   r,   r,   r,   r-   rc   _   s   	rc   c                   @   sò   e Zd Zdd„ Zedœdd„Zedœdd„Zedœdd	„Zej	ed
œdd„Z
ejed
œdd„Zejed
œdd„Zejed
œdd„Zejed
œdd„Zejed
œdd„Zejed
œdd„Zejed
œdd„Zejed
œdd„Zejed
œdd„ZdS ) ÚContainsReturnCheckerc                 C   s
   || _ d S rB   )Úgscope)re   ry   r,   r,   r-   rf   t   s    zContainsReturnChecker.__init__©rA   c                 C   s   |D ]}|   |¡r dS qdS )NTF©Úvisit)re   ÚbodyÚsr,   r,   r-   Ú_visit_stmtsw   s    
z"ContainsReturnChecker._visit_stmtsc                 C   s,   t |tƒr(|js(| ¡ }t| jƒ |¡S dS ©NF)rC   r   rL   Úparserx   ry   r|   )re   rR   Zfn_noder,   r,   r-   Ú_visit_function}   s    z%ContainsReturnChecker._visit_functionc                 C   sf   d}t  |¡D ]R\}}t|tƒrF|D ]}t|t jƒr$|p@|  |¡}q$qt|t jƒr|p^|  |¡}q|S r€   )ÚastÚiter_fieldsrC   ÚlistÚASTr|   )re   rQ   r>   r   rI   Úitemr,   r,   r-   Úgeneric_visit„   s    
z#ContainsReturnChecker.generic_visit©rQ   rA   c                 C   sP   t |jtjƒrD|jj| jkr@| j|jj }t||jƒ}|  |¡S dS |  	|j¡S r€   )
rC   rI   rƒ   ÚNameÚidry   ÚgetattrÚattrr‚   r|   )re   rQ   rI   rR   r,   r,   r-   Úvisit_Attribute�   s    
z%ContainsReturnChecker.visit_Attributec                 C   s:   t |jƒtjkrdS |j| jkr6| j|j }|  |¡S dS r€   )rG   Úctxrƒ   ÚStorer‹   ry   r‚   )re   rQ   rR   r,   r,   r-   Ú
visit_Namež   s    
z ContainsReturnChecker.visit_Namec                 C   s   dS )NTr,   ©re   rQ   r,   r,   r-   Úvisit_Return¦   s    z"ContainsReturnChecker.visit_Returnc                 C   s   dS r€   r,   r’   r,   r,   r-   Úvisit_Assign©   s    z"ContainsReturnChecker.visit_Assignc                 C   s   dS r€   r,   r’   r,   r,   r-   Úvisit_AugAssign®   s    z%ContainsReturnChecker.visit_AugAssignc                 C   s   |   |j¡S rB   ©r   r}   r’   r,   r,   r-   Úvisit_Module³   s    z"ContainsReturnChecker.visit_Modulec                 C   s   |   |j¡S rB   r–   r’   r,   r,   r-   Úvisit_FunctionDef¶   s    z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |   |j¡}|jr"|p |   |j¡}|S rB   )r   r}   Úorelse)re   rQ   r>   r,   r,   r-   Úvisit_If¹   s    zContainsReturnChecker.visit_Ifc                 C   s   |   |j¡p|   |j¡S rB   )r|   r}   r™   r’   r,   r,   r-   Úvisit_IfExpÆ   s    z!ContainsReturnChecker.visit_IfExpc                 C   s   |   |j¡S rB   )r|   Úfuncr’   r,   r,   r-   Ú
visit_CallÉ   s    z ContainsReturnChecker.visit_CallN)rO   rv   rw   rf   Úboolr   r‚   rˆ   rƒ   Ú	AttributerŽ   rŠ   r‘   ÚReturnr“   ÚAssignr”   Ú	AugAssignr•   ÚModuler—   ÚFunctionDefr˜   ÚIfrš   ÚIfExpr›   ÚCallr�   r,   r,   r,   r-   rx   s   s   rx   c                       sˆ  e Zd ZU d•ee ee dœdd„Zdd„ eee	e
efD ƒZeeef ed	< e d
ejjfdejff¡ dd„ Zeeeef ddœdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Z d!d"„ Z!d#d$„ Z"d%d&„ Z#d'd(„ Z$d)d*„ Z%d+d,„ Z&d-d.„ Z'd/d0„ Z(d1d2„ Z)d3d4„ Z*e+j,d5e+j-d6e+j.d7e+j/d8e+j0d9e+j1d:e+j2d;e+j3d<e+j4d=e+j5d>e+j6d?e+j7d@iZ8ee9e+j: ef edA< dBdC„ Z;dDdE„ Z<dFdG„ Z=dHdI„ Z>dJdK„ Z?dLdM„ Z@dNdO„ ZAe+jBdPe+jCdQe+jDdRe+jEdSe+jFdTe+jGdUiZHee9e+jI ef edV< dWdX„ ZJe+jKdYe+jLdZe+jMd[e+jNd\iZOee9e+jP ef ed]< d^d_„ ZQd`da„ ZRdbdc„ ZSddde„ ZTdfdg„ ZUdhdi„ ZVeWeef djœdkdl„ZXedjœdmdn„ZYeZdoœdpdq„Z[drds„ Z\dtdu„ Z]e+j^dvœdwdx„Z_e+j`dye+jadziZbee9e+jc ef ed{< edjed|k �rød}d~„ Zfdd€„ Zgd�d‚„ Zhdƒd„„ Zid…d†„ Zjd‡dˆ„ Zkd‰dŠ„ Zl‡ fd‹dŒ„Zmd�dŽ„ Zne+jodd�œd�d‘„Zpe+jodd�œd’d“„ZqejjreqejjsepiZteeueve+jogef f ed”< ‡  ZwS )–ÚCodeGeneratorNFr   )Úfunction_typesr^   c                 C   sÈ   || _ t |¡| _|| _|d | _| j ||d¡ || j_|d krL| j ¡ n|| _|
d kr^i n|
| _	|| _
|| _tƒ | _|| _|| _|| _|	| _d | _|| _|| _g | _d | _i | _i | _|  ¡ | _d S )Nr   r   )Úcontextr   rl   r^   r`   Úset_locÚarchÚcreate_moduleÚmoduleÚfunction_ret_typesÚ	prototypery   Údictrg   Ú
attributesr5   Úfunction_nameÚ	is_kernelÚ	last_nodeÚdebugrL   Ú	scf_stackÚlast_ret_typerj   Úglobal_usesÚ_define_name_lookupÚdereference_name)re   rª   r°   ry   r²   r5   r³   r¬   r®   r´   r©   r¶   rL   r^   r`   r,   r,   r-   rf   Î   s.    
zCodeGenerator.__init__c                 C   s   i | ]}|j |“qS r,   ©rO   ©r/   r   r,   r,   r-   Ú
<dictcomp>ì   s      zCodeGenerator.<dictcomp>Úbuiltin_namespaceÚprintÚminc                    s4   t dœ‡fdd„‰tƒ ‰ t tdœ‡ ‡‡fdd„}|S )N)r=   c                    s.   ˆ j  | |¡}||k	r*| ˆ jkr*|ˆ j| < |S rB   )rg   Úgetrj   r¹   )r=   ÚabsentrI   rq   r,   r-   Úlocal_lookupó   s    
z7CodeGenerator._define_name_lookup.<locals>.local_lookup)r=   rA   c                    sH   ˆ }ˆˆj jˆjjfD ]}|| |ƒ}||k	r|  S qt| › d�ƒ‚d S )Nz is not defined)ry   rÂ   r¿   Ú	NameError)r=   rÃ   Zlookup_functionrI   ©Zabsent_markerrÄ   re   r,   r-   Úname_lookupû   s    

z6CodeGenerator._define_name_lookup.<locals>.name_lookup)r#   Úobjectr   )re   rÇ   r,   rÆ   r-   rº   ò   s    z!CodeGenerator._define_name_lookup)r=   rI   rA   c                 C   s   || j |< || j|< dS )zâ This function:
            called by visit_Assign() & visit_FunctionDef() to store left value (lvalue)
        1. record local defined name (FIXME: should consider control flow)
        2. store tensor in self.lvalue
        N)rg   rj   )re   r=   rI   r,   r,   r-   Ú	set_value  s    
zCodeGenerator.set_valuec                 C   s   | j  ¡ }| j  ¡ }||fS rB   )rl   Úget_locro   )re   ÚlocÚipr,   r,   r-   Ú_get_insertion_point_and_loc  s    

z*CodeGenerator._get_insertion_point_and_locc                 C   s   | j  |¡ | j  |¡ d S rB   )rl   rs   r«   )re   rÌ   rË   r,   r,   r-   Ú_set_insertion_point_and_loc  s    z*CodeGenerator._set_insertion_point_and_locc                 C   s2   |D ](}|   |¡}|d k	rt|tjƒr|| _qd S rB   )r|   rC   rƒ   r    r¸   )re   ZstmtsÚstmtZret_typer,   r,   r-   Úvisit_compound_statement  s    
z&CodeGenerator.visit_compound_statementc                 C   s   t j | |¡ d S rB   ©rƒ   ÚNodeVisitorrˆ   r’   r,   r,   r-   r—   $  s    zCodeGenerator.visit_Modulec                    s0   ˆ   |j¡}|d kst‚‡ fdd„|jD ƒ}|S )Nc                    s   g | ]}ˆ   |¡‘qS r,   r{   )r/   r+   rq   r,   r-   r0   *  s     z,CodeGenerator.visit_List.<locals>.<listcomp>)r|   r�   r(   Úelts)re   rQ   r�   rÓ   r,   rq   r-   Ú
visit_List'  s    zCodeGenerator.visit_Listc                    sš   ˆ   |j¡}|d kr&ˆ j g ¡ d }npt|tƒrp‡ fdd„|D ƒ}dd„ |D ƒ}ˆ j dd„ |D ƒ¡ t|ƒ}n&tj |ˆ j¡}ˆ j |j	g¡ |j
}|S )Nc                    s   g | ]}t j |ˆ j¡‘qS r,   )r
   ÚcoreÚ
_to_tensorrl   ©r/   Úvrq   r,   r-   r0   8  s     z.CodeGenerator.visit_Return.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r,   ©rG   r×   r,   r,   r-   r0   9  s     c                 S   s   g | ]
}|j ‘qS r,   ©Úhandler×   r,   r,   r-   r0   :  s     )r|   rI   rl   r>   rC   Útupler
   rÕ   rÖ   rÛ   rG   )re   rQ   Z	ret_valueZret_tyZ
ret_valuesÚ	ret_typesr>   r,   rq   r-   r“   .  s    

zCodeGenerator.visit_Returnc                 C   s>  |   |j¡\}}t|jjƒD ]l\}}|jj| d  }|j}|j}tj|t ¡ d�}	|d krntj	|	g|d�}
ntj
|	||d�}
|   |
¡ q| jr”dnd}| j | j| j| j | j¡|| j¡}| j |¡ | ¡ }g }d}t|ƒD ]Ž\}}|| jk�r$| j| }t|ƒ�st| j| ƒ}| |¡ qàqà|| jk�rH| |d| j| d ¡ | t| |¡| jj| ƒ¡ |d7 }qà| j ¡ }t||ƒD ]\}}|  ||¡ �q„| j  |¡ |  !|j"¡ | j#d k�rÎ| j $g ¡ nRt%| j#t&ƒ�r t'| j#ƒ| j_(| )| j | j¡¡ n | j#g| j_(| )| j | j¡¡ |�r2| j *|¡ | +¡  d S )	Nr   ©r‹   r�   ©ÚtargetsrI   )ÚtargetrI   Ú
annotationÚpublicÚprivater   ztt.divisibility),r|   rS   rM   Údefaultsrâ   rU   rƒ   rŠ   r�   r¡   Ú	AnnAssignr´   rl   Zget_or_insert_functionr®   r³   r°   Úto_irrL   Z	push_backZadd_entry_blockr5   rF   r   Úappendr²   Zset_arg_attrr   Zparam_typesrm   ÚziprÉ   Úset_insertion_point_to_startrÐ   r}   r¸   r>   rC   rÜ   r…   rÝ   Z
reset_typeÚset_insertion_point_to_endÚfinalize)re   rQ   rP   Úkwarg_namesr   Údefault_valueZarg_noderâ   r=   Z	st_targetZ	init_nodeZ
visibilityrR   ÚentryZ
arg_valuesrT   Zarg_nameZcstZ	insert_ptÚ	arg_valuer,   r,   r-   r˜   D  sT    $




zCodeGenerator.visit_FunctionDefc                 C   s4   g }|j D ]}||  |¡g7 }q
|  |j¡}||fS rB   )rS   r|   Úkwarg)re   rQ   rP   rU   rí   r,   r,   r-   Úvisit_arguments{  s
    
zCodeGenerator.visit_argumentsc                 C   s   t j | |¡ |jS rB   )rƒ   rÒ   rˆ   rU   r’   r,   r,   r-   Ú	visit_arg‚  s    zCodeGenerator.visit_argc                 C   sr   |   |j¡}|   |j¡}|   |j¡}|tkrh|| jkrDt|› d�ƒ‚t|ƒsTt|ƒ}|| j|< | j| S |  |¡S )Nz4 is already defined. constexpr cannot be reassigned.)	r|   râ   rá   rI   r   rg   Ú
ValueErrorrF   r”   )re   rQ   râ   rá   rI   r,   r,   r-   Úvisit_AnnAssign†  s    


zCodeGenerator.visit_AnnAssignc           	      C   sÊ   g }|j D ]}||  |¡g7 }q
t|ƒdkr8td |dƒ‚|d }|  |j¡}t|tƒs\|g}t|tƒsl|g}tjf}t	||ƒD ]F\}}t
|ƒ}|d k	r¸t|ƒs¸t||ƒs¸tj || j¡}|  ||¡ q~d S )Nr   z2simultaneous multiple assignment is not supported.r   )rà   r|   Úlenr   rI   rC   rÜ   r
   r   ré   rJ   rE   rÕ   rÖ   rl   rÉ   )	re   rQ   Ú_namesrá   ÚnamesÚvaluesZnative_nontensor_typesr=   rI   r,   r,   r-   r”   —  s*    


ÿþzCodeGenerator.visit_Assignc                 C   sR   |j j}tj|t ¡ d�}t ||j|j¡}tj|j g|d�}|  	|¡ |  
|¡S )NrÞ   rß   )rá   r‹   rƒ   rŠ   ÚLoadÚBinOpÚoprI   r¡   r|   r»   )re   rQ   r=   ÚlhsÚrhsZassignr,   r,   r-   r•   ­  s    
zCodeGenerator.visit_AugAssignc                 C   s"   t |jƒtjkr|jS |  |j¡S rB   )rG   r�   rƒ   r�   r‹   r»   r’   r,   r,   r-   r‘   µ  s    zCodeGenerator.visit_Namec                 C   s   t j | |¡ d S rB   rÑ   r’   r,   r,   r-   Úvisit_Storeº  s    zCodeGenerator.visit_Storec                 C   s   t j | |¡ d S rB   rÑ   r’   r,   r,   r-   Ú
visit_Load½  s    zCodeGenerator.visit_Loadc                    s   ‡ fdd„|j D ƒ}t|ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r,   r{   )r/   Úxrq   r,   r-   r0   Á  s     z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)rÓ   rÜ   )re   rQ   rS   r,   rq   r-   Úvisit_TupleÀ  s    zCodeGenerator.visit_Tuplec                 C   sT   t |ƒrt||ƒ|| jd�S t |ƒrFt dd|¡}t||ƒ|| jd�S t||ƒ|ƒS )N©Z_builderz__(.*)__z__r\1__)rE   rŒ   rl   ÚreÚsub)re   Úmethod_namerý   rþ   Zreverse_method_namer,   r,   r-   Ú_apply_binary_methodÄ  s    z"CodeGenerator._apply_binary_methodc                 C   sV   |   |j¡}|   |j¡}| j t|jƒ¡}|d krHtd |d |jj	¡ƒ‚|  
|||¡S )Nz8AST binary operator '{}' is not (currently) implemented.)r|   ÚleftÚrightÚ_method_name_for_bin_oprÂ   rG   rü   r   ÚformatrO   r  ©re   rQ   rý   rþ   r  r,   r,   r-   Úvisit_BinOpÍ  s    zCodeGenerator.visit_BinOpÚ__add__Ú__sub__Ú__mul__Ú__truediv__Ú__floordiv__Ú__mod__Ú__pow__Ú
__lshift__Ú
__rshift__Ú__and__Ú__or__Ú__xor__r
  c                 C   s.  | j  |¡ |  |j¡ | j  ¡ }| j ¡ }i }|jrr| j  |¡ | ¡ | _i | _|  |j¡ | j ¡ }| j  ¡ }g }g }g }	|D �]}
|df|dffD ]P\}}|
|kr˜||
 j	||
 j	ks˜t
d|
› d||
 j	› d|› d||
 j	› �ƒ‚q˜|
|ksü|
|k�rV| |
¡ | |
|k�r||
 j	n||
 j	¡ |	 |
|k�rF||
 j ¡ n||
 j ¡ ¡ |
|k�rv|
|k�rv||
 ||
< |
|kr‚|
|kr‚||
 ||
< q‚| ¡ | ¡ @ D ]v}
|
|k�r¶�q¤||
 j	}||
 j	}||k�sðt
d|
› d|› d	|› d
�ƒ‚| |
¡ | |¡ |	 ||
 j ¡ ¡ �q¤|||||||	fS )NZthenÚelsezinitial value for `z` is of type z
, but the z block redefines it as zmismatched type for z between then block (z) and else block (ú))rl   rê   rÐ   r}   rm   rj   rh   r™   rg   rG   r(   rè   rÛ   Úget_typeÚkeys)re   rQ   ri   Ú
then_blockÚ
else_blockÚ	then_defsÚ	else_defsrø   rÝ   Úir_ret_typesr=   ZdefsZ
block_nameZthen_tyZelse_tyr,   r,   r-   Úvisit_then_else_blocksÚ  sR    





&ÿ
$,


ÿ

z$CodeGenerator.visit_then_else_blocksc              	      sj  d}t | ƒ��}|\}}| j ¡ }| j ¡ }| j ¡ }	| j |¡ | j |j||¡ |  ||||¡\‰‰ }}}
}}| j |¡ | ¡ rš| ¡ ršd}|	 ¡  | 	¡ sÂ|rÂ| j 
|	‡fdd„|
D ƒ¡ | j |¡ | 	¡ sö|rö| j 
|	‡ fdd„|
D ƒ¡ |�r|D ]}|	 |¡ �q W 5 Q R X |�rf| j |	¡ t|
ƒD ].\}}tj |	 |¡|| ¡}|  ||¡ �q6d S )NTFc                    s   g | ]}ˆ | j ‘qS r,   rÚ   ©r/   Ún©r   r,   r-   r0   $  s     z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                    s   g | ]}ˆ | j ‘qS r,   rÚ   r$  ©r!  r,   r-   r0   (  s     )rc   rl   Úcreate_blockrë   Zcreate_cond_branchrÛ   r#  Z
has_returnÚeraseZhas_terminatorZcreate_branchÚadd_argumentrê   rM   r
   rÕ   r   rU   rÉ   )re   ÚcondrQ   Zhas_endif_blockÚsrri   Zip_blockr  r  Zendif_blockrø   rÝ   r"  r)   r   r=   Ú
new_tensorr,   )r!  r   r-   Úvisit_if_top_level  s6    


ÿz CodeGenerator.visit_if_top_levelc              	      sh  t ˆƒ��}|\}}ˆ ¡ \}}ˆj ¡ }|jr:ˆj ¡ nd }	ˆ ||||	¡\‰‰ }}	}
}}ˆ ||¡ ˆj ‡fdd„|D ƒ|jd¡}| 	| 
¡ ¡ ˆj | 
¡ ¡ t|
ƒdkrÌˆj ‡fdd„|
D ƒ¡ |jsÜ| ¡ }	n|	 	| ¡ ¡ ˆj | ¡ ¡ t|
ƒdk�r"ˆj ‡ fdd„|
D ƒ¡ W 5 Q R X t|
ƒD ].\}}tj | |¡|| ¡}ˆ ||¡ �q4d S )Nc                    s   g | ]}|  ˆ j¡‘qS r,   ©rç   rl   r.   rq   r,   r-   r0   ?  s     z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                    s   g | ]}ˆ | j ‘qS r,   rÚ   r$  r&  r,   r-   r0   C  s     c                    s   g | ]}ˆ | j ‘qS r,   rÚ   r$  r'  r,   r-   r0   J  s     )rc   rÍ   rl   r(  r™   r#  rÎ   Zcreate_if_oprÛ   Zmerge_block_beforeZget_then_blockrë   rö   Úcreate_yield_opZget_else_blockrM   r
   rÕ   r   Ú
get_resultrÉ   )re   r+  rQ   r,  ri   r   rÌ   Úlast_locr  r  rø   rÝ   Zif_opr   r=   r-  r,   )r!  re   r   r-   Úvisit_if_scf5  s,    
ÿ 
$zCodeGenerator.visit_if_scfc              	   C   sÔ   |   |j¡}t|ƒrt|jtj| jd�}t| jƒ  |¡}| j	rN|rNt
d |dƒ‚qÐ| j	sX|sf|  ||¡ qÐ|  ||¡ n\t|ƒ}t|ƒtkr²t
d |d d dd„ tD ƒ¡t|ƒj¡ƒ‚|rÄ|  |j¡ n|  |j¡ d S )Nr  zÔCannot have `return` statements inside `while` or `for` statements in triton (note that this also applies to `return` statements that are inside functions transitively called from within `while`/`for` statements)zO`if` conditionals can only accept values of type {{{}}}, not objects of type {}ú, c                 s   s   | ]}|j V  qd S rB   r¼   r½   r,   r,   r-   Ú	<genexpr>d  s     z)CodeGenerator.visit_If.<locals>.<genexpr>)r|   ÚtestrE   Útor
   Úint1rl   rx   ry   r·   r   r3  r.  rJ   rG   Ú_condition_typesr  r%   rO   rÐ   r}   r™   )re   rQ   r+  Zcontains_returnr,   r,   r-   rš   P  s4    
 þ
   ÿÿzCodeGenerator.visit_Ifc                 C   sJ   |   |j¡}t|ƒr&|jtj| jd�}t|ƒr:|   |j¡S |   |j	¡S d S ©Nr  )
r|   r6  rE   r7  r
   r8  rl   rJ   r}   r™   )re   rQ   r+  r,   r,   r-   r›   j  s    zCodeGenerator.visit_IfExpc                 C   s   d S rB   r,   r’   r,   r,   r-   Ú
visit_Passs  s    zCodeGenerator.visit_Passc                 C   sÚ   t |jƒdkrt |jƒdks(td |dƒ‚|  |j¡}|  |jd ¡}t|ƒ}t|ƒ}t|jd ƒtj	krtt
||kƒS t|jd ƒtjkr”t
||k	ƒS | j t|jd ƒ¡}|d krÌtd |d |jd j¡ƒ‚|  |||¡S )Nr   z1simultaneous multiple comparison is not supportedr   z<AST comparison operator '{}' is not (currently) implemented.)rö   ZcomparatorsZopsr   r|   r  rJ   rG   rƒ   ÚIsr   ÚIsNotÚ_method_name_for_comp_oprÂ   r  rO   r  )re   rQ   rý   rþ   Ú	lhs_valueÚ	rhs_valuer  r,   r,   r-   Úvisit_Comparev  s    zCodeGenerator.visit_CompareÚ__eq__Ú__ne__Ú__lt__Ú__le__Ú__gt__Ú__ge__r>  c                 C   sb   |   |j¡}| j t|jƒ¡}|d kr<td |d |jj¡ƒ‚t	|ƒrVt
||ƒ| jd�S t
||ƒƒ S )Nz7AST unary operator '{}' is not (currently) implemented.r  )r|   ÚoperandÚ_method_name_for_unary_oprÂ   rG   rü   r   r  rO   rE   rŒ   rl   )re   rQ   rü   rR   r,   r,   r-   Úvisit_UnaryOp‰  s    zCodeGenerator.visit_UnaryOpÚ__neg__Ú__pos__Ú__not__Ú
__invert__rI  c              	      s  t ˆƒ���}|\}}ˆ ¡ \}}ˆj ¡ }ˆj |¡ ˆj |¡ ˆ |j¡ ˆj 	¡  ˆj
}| ¡  g }	g }
g }|D ]l}||krvt|| ƒs’t‚t|| ƒs¢t‚|| j|| jksºt‚|	 |¡ |
 || j¡ | || ¡ qvˆ ||¡ ˆj ‡fdd„|
D ƒdd„ |D ƒ¡}ˆj | ¡ ‡fdd„|
D ƒ¡‰ ˆj ˆ ¡ t|	ƒD ]8\}}tj ˆ  |¡|
| ¡ˆj|< ˆj| ˆj
|< �qJˆ |j¡}ˆj ˆ ¡ ˆj |j‡ fdd„tt|ƒƒD ƒ¡ ˆj |  ¡ ‡fdd„|
D ƒ¡}ˆj |¡ t|	ƒD ]8\}}tj | |¡|
| ¡ˆj|< ˆj| ˆj
|< �qöˆj |¡ ˆ |j¡ ˆj 	¡  ˆj
}g }|D ]}||k�r`| || ¡ �q`ˆj !dd„ |D ƒ¡ W 5 Q R X t|	ƒD ]6\}}tj | "|¡|
| ¡}|ˆj|< |ˆj
|< �q¨|j#D ]"}d�søtd	ƒ‚t$j% &ˆ|¡ �qæd S )
Nc                    s   g | ]}|  ˆ j¡‘qS r,   r/  r.   rq   r,   r-   r0   ²  s     z-CodeGenerator.visit_While.<locals>.<listcomp>c                 S   s   g | ]
}|j ‘qS r,   rÚ   ©r/   rU   r,   r,   r-   r0   ³  s     c                    s   g | ]}|  ˆ j¡‘qS r,   r/  r.   rq   r,   r-   r0   ¶  s     c                    s   g | ]}ˆ   |¡‘qS r,   )rU   r3   )Úbefore_blockr,   r-   r0   ¾  s     c                    s   g | ]}|  ˆ j¡‘qS r,   r/  r.   rq   r,   r-   r0   Á  s     c                 S   s   g | ]
}|j ‘qS r,   rÚ   ©r/   Úyr,   r,   r-   r0   Ð  s     FzNot implemented)'rc   rÍ   rl   r(  rê   r·   rè   rÐ   r}   Úpoprj   r)  rE   r(   rG   rÎ   Zcreate_while_opZcreate_block_with_parentZ
get_beforerM   r
   rÕ   r   rU   rg   r|   r6  rë   Zcreate_condition_oprÛ   Úrangerö   Z	get_afterr0  r1  r™   rƒ   rÒ   rˆ   )re   rQ   r,  ri   rn   rÌ   r2  ÚdummyZ	loop_defsrø   rÝ   Ú	init_argsr=   Zwhile_opr   r+  Zafter_blockÚyieldsZnew_defrÏ   r,   )rP  re   r-   Úvisit_While“  st    


ÿÿ&ÿ

 

zCodeGenerator.visit_Whilec                 C   sJ   |j jjdkst‚|  |j¡}|  |j¡}t|ƒrB|j|| j	d�S || S )Nrú   r  )
r�   Ú	__class__rO   r(   r|   rI   ÚslicerE   Ú__getitem__rl   )re   rQ   rý   Zslicesr,   r,   r-   Úvisit_SubscriptÜ  s    zCodeGenerator.visit_Subscriptc                    s   ‡ fdd„|j D ƒS )Nc                    s   g | ]}ˆ   |¡‘qS r,   r{   )r/   Údimrq   r,   r-   r0   å  s     z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)Zdimsr’   r,   rq   r-   Úvisit_ExtSliceä  s    zCodeGenerator.visit_ExtSlicec                    s’  ˆ   |jj¡}‡ fdd„|jjD ƒ}|tjkr”||Ž }t|jj|j	j|j
jƒ}|D ]<}t|ƒˆ j|jj< ˆ  |j¡ |jD ]}tj ˆ |¡ qzqRd S |tk	r¤tdƒ‚t|ƒdkr¸|d nˆ   t d¡¡}t|ƒdkrÜ|d nˆ   |jjd ¡}	t|ƒdk�r|d nˆ   t d¡¡}
d}t|
ƒ�rH|
jdk �rHt|
j ƒ}
d}|	| }}	tj |ˆ j¡}tj |	ˆ j¡}	tj |
ˆ j¡}
|j ¡ �rœ|	j ¡ �rœ|
j ¡ �s¾td	|j› d
|	j› d
|
j› d�ƒ‚tj  |j|	j¡}tj  ||
j¡}| !ˆ j¡}|j"tjjj#j$k}|j%}|	j%}	|
j%}
ˆ j &|||¡}ˆ j &|	||¡}	ˆ j &|
||¡}
ˆ j '|¡}ˆ  (|jjtj )||¡¡ t*ˆ ƒ��¸}|\}}ˆ  +¡ \}}ˆ j ,¡ }ˆ j -|¡ ˆ j. /|¡ ˆ  |j¡ ˆ j. 0¡  | 1¡  g }g }g }ˆ j2D ]Â}||k�rØt3ˆ j2| ƒ�st4|› d�ƒ‚t3|| ƒ�st4‚ˆ j2| j5|| j5k�sXt4d|› d|| j5› dˆ j2| j5› d�ƒ‚| /|¡ | /tj || ˆ j¡¡ | /tj ˆ j2| ˆ j¡¡ �qØˆ  6||¡ ˆ j 7||	|
dd„ |D ƒ¡}ˆ j. /|¡ ˆ j -| 8d¡¡ t9|ƒD ]6\}}ˆ  (|tj )| 8d¡ :|d ¡|| j5¡¡ �qêˆ  |j¡ ˆ j. 0¡  g }ˆ j2D ],}||k�rB| /tj ˆ j2| ˆ j¡¡ �qBt|ƒdk�r”ˆ j ;dd„ |D ƒ¡ | 8d¡ <¡ }| =¡ dk�s¸t4dƒ‚ˆ j -| 8d¡¡ | >¡ }|�rôˆ j ?|	|¡}ˆ j @||¡}ˆ j|jj j% A|¡ ˆ  (|jjtj )||¡¡ W 5 Q R X t9|ƒD ],\}}ˆ  (|tj )| B|¡|| j5¡¡ �q6|jD ]"}d�s|t4dƒ‚tj ˆ |¡ �qjd S )Nc                    s   g | ]}ˆ   |¡‘qS r,   r{   rO  rq   r,   r-   r0   é  s     z+CodeGenerator.visit_For.<locals>.<listcomp>zAOnly `range` and `static_range` iterators are currently supportedr   r   r	   FTz0For loop bounds and step must all be ints, are (r4  r  z is not tensorzLoop-carried variable z has initial type z but is re-assigned to z: in loop! Please make sure that the type stays consistent.c                 S   s   g | ]
}|j ‘qS r,   rÚ   rO  r,   r,   r-   r0   <  s     c                 S   s   g | ]
}|j ‘qS r,   rÚ   rQ  r,   r,   r-   r0   K  s     z7We use SCF, so the loop body should only have one blockz)Don't know what to do with else after for)Cr|   Úiterrœ   rS   r
   Ústatic_rangerT  ÚstartrI   ÚendÚstepr   rg   rá   r‹   rÐ   r}   r™   rƒ   rÒ   rˆ   ÚRuntimeErrorrö   ÚNumrF   rÕ   rÖ   rl   r   r   Ú	TypeErrorÚsemanticZinteger_promote_implrç   r"   r    r!   rÛ   Zcreate_int_castZcreate_undefrÉ   r   rc   rÍ   r(  rê   r·   rè   rS  r)  rj   rE   r(   rG   rÎ   Zcreate_for_opÚget_bodyrM   rU   r0  Z
get_parentÚsizeZget_induction_varZ
create_subZ
create_addZreplace_all_uses_withr1  )re   rQ   ZIteratorClassZ	iter_argsÚiteratorr`  r   rÏ   ZlbZubrc  Znegative_stepZiv_typeZ
iv_ir_typeZiv_is_signedZivr,  ri   rn   rÌ   r2  ÚblockrV  rW  rø   r=   Zfor_opZfor_op_regionr,   rq   r-   Ú	visit_Forç  s¶    
þ
$&&
$"



$ÿ
 0


 $&
zCodeGenerator.visit_Forc                 C   s0   |   |j¡}|   |j¡}|   |j¡}t|||ƒS rB   )r|   ÚlowerÚupperrc  rZ  )re   rQ   rm  rn  rc  r,   r,   r-   Úvisit_Slice`  s    zCodeGenerator.visit_Slicec                 C   s   |   |j¡S rB   )r|   rI   r’   r,   r,   r-   Úvisit_Indexf  s    zCodeGenerator.visit_Indexrz   c                 C   s   |j |  |j¡fS rB   )rU   r|   rI   r’   r,   r,   r-   Úvisit_keywordi  s    zCodeGenerator.visit_keywordc                 C   s6   | j s
d S |  |j¡}|  |j¡}tjj||| jd�S r:  )r¶   r|   r6  Úmsgr
   rÕ   Údevice_assertrl   )re   rQ   r6  rr  r,   r,   r-   Úvisit_Assertl  s
    zCodeGenerator.visit_Assert©rR   c                    sÖ  t j|jfˆ ž|Ž‰ ‡ fdd„|jD ƒ‰ dd„ ˆ D ƒ‰ tƒ }dd„ tˆ ƒD ƒ‰‡ fdd„ˆD ƒ}‡fdd„tˆ ƒD ƒ‰ dd„ ˆ D ƒ}d	d„ ˆ D ƒ}t|j||ƒ}| j 	|¡�s:t
 g |¡}	tj|jj j}
|jd krÚ| jn|j}t|ƒ\}}t| j|	|
||| j|| j||j||| jjd
�}| | ¡ ¡ |j}|| j|< n
| j| }| j |¡}| j ||¡}| ¡ dk�sv|d k�rzd S | ¡ dk�r˜t| d¡|ƒS g }t | ¡ ƒD ] }| !t| |¡|| ƒ¡ �q¨t"|ƒS d S )Nc                    s   g | ]}ˆ | ‘qS r,   r,   )r/   r=   ©rS   r,   r-   r0   v  s     z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s    g | ]}t |ƒr|nt|ƒ‘qS r,   )rE   r   rO  r,   r,   r-   r0   w  s   ÿc                 S   s   g | ]\}}t |ƒr|‘qS r,   )rF   ©r/   r   rU   r,   r,   r-   r0   {  s      c                    s   i | ]}|ˆ | “qS r,   r,   r3   rv  r,   r-   r¾   |  s      z2CodeGenerator.call_JitFunction.<locals>.<dictcomp>c                    s    g | ]\}}|ˆ krd n|‘qS rB   r,   rw  )Ú
constexprsr,   r-   r0   ~  s     c                 S   s   g | ]}|d k	r|j ‘qS rB   rÚ   rO  r,   r,   r-   r0     s      c                 S   s   g | ]}|d k	r|j ‘qS rB   rÙ   rO  r,   r,   r-   r0   €  s      )r®   r³   r©   r¶   rL   r^   r`   r¬   r   r   )#rZ   ÚgetcallargsrR   rP   r±   rM   r?   rO   r®   Zhas_functionr
   Úfunction_typeÚsysÚmodulesrv   Ú__dict__r¶   rb   r¨   rª   r¯   rL   rl   r¬   r|   r�   r¸   Zget_functionÚcallZget_num_resultsr   r1  rT  rè   rÜ   )re   rR   rS   rt   r²   r5   Úarg_valsÚ	arg_typesÚfn_namer°   ry   r¶   r^   r`   rd   Zcallee_ret_typeÚsymbolZcall_opÚresultsr   r,   )rS   rx  r-   Úcall_JitFunctiont  sP    ÿ     þ
zCodeGenerator.call_JitFunctionc                    s  t ˆ  |j¡ƒ}ˆ j |¡}|d k	r.|ˆ |ƒS t‡ fdd„|jD ƒƒ}‡ fdd„|jD ƒ}|tj	j
krpˆ jspd S t|tƒr”t|||ƒ ˆ  |||¡S t|dƒr¨t|jƒs´tj	 |¡rêtˆ jd�}t |¡}d|jkrÜˆ |d< ||||—ŽS |ˆ j ¡ k�rtt |ƒ}|||ŽS )Nc                 3   s   | ]}ˆ   |¡V  qd S rB   r{   ©r/   Úkeywordrq   r,   r-   r5  ¥  s     z+CodeGenerator.visit_Call.<locals>.<genexpr>c                    s   g | ]}ˆ   |¡‘qS r,   r{   rO  rq   r,   r-   r0   ¦  s     z,CodeGenerator.visit_Call.<locals>.<listcomp>Ú__self__r  Z
_generator)rJ   r|   rœ   Ú statically_implemented_functionsrÂ   r±   ÚkeywordsrS   r
   rÕ   rs  r¶   rC   r   rV   r„  ÚhasattrrE   r‡  Ú
is_builtinrl   rZ   Ú	signatureÚ
parametersr¿   rù   r&   )re   rQ   rR   Zstatic_implementationÚkwsrS   Úextra_kwargsÚsigr,   rq   r-   r�   ž  s*    

 


zCodeGenerator.visit_Callc                 C   s
   t |jƒS rB   ©r   rI   r’   r,   r,   r-   Úvisit_Constant·  s    zCodeGenerator.visit_Constant)rQ   c                 C   sx   t |jƒdkrtd |dƒ‚|  |jd ¡}|  |jd ¡}| j t|jƒ¡}|d krjtd |d |jj	¡ƒ‚|  
|||¡S )Nr	   z^chained boolean operators (A or B or C) are not supported; use parentheses to split the chain.r   r   z9AST boolean operator '{}' is not (currently) implemented.)rö   rù   r   r|   Ú_method_name_for_bool_oprÂ   rG   rü   r  rO   r  r  r,   r,   r-   Úvisit_BoolOpº  s    zCodeGenerator.visit_BoolOpÚlogical_andÚ
logical_orr“  )é   é   c                 C   s
   t |jƒS rB   r‘  r’   r,   r,   r-   Úvisit_NameConstantÆ  s    z CodeGenerator.visit_NameConstantc                 C   s
   t |jƒS rB   )r   r%  r’   r,   r,   r-   Ú	visit_NumÉ  s    zCodeGenerator.visit_Numc                 C   s   t t |¡ƒS rB   )r   rƒ   Úliteral_evalr’   r,   r,   r-   Ú	visit_StrÌ  s    zCodeGenerator.visit_Strc                 C   s<   |   |j¡}t|ƒr0|jdkr0tjj|| jd�S t||jƒS )NÚT)rl   )	r|   rI   rE   r�   r
   rg  Ztransrl   rŒ   )re   rQ   rý   r,   r,   r-   rŽ   Ï  s
    
zCodeGenerator.visit_Attributec                 C   s   t j | |¡ d S rB   rÑ   r’   r,   r,   r-   Ú
visit_ExprÖ  s    zCodeGenerator.visit_Exprc                 C   s   d S rB   r,   r’   r,   r,   r-   Úvisit_NoneTypeÙ  s    zCodeGenerator.visit_NoneTypec                 C   s¼   t |jƒ}t|ƒD ]ž\}}t|tjƒr6t|jƒ||< qt|tjƒrž|j	}|  
|j¡}t|ƒsttd |dtt|ƒƒ ƒ‚|dk r€dndt|ƒ d  |j¡||< qtd t|ƒ¡ƒ‚qd |¡S )Nz^Cannot evaluate f-string containing non-constexpr conversion values, found conversion of type r   z{}z{!Ú}z:encountered unexpected node of type {} in a JoinedStr nodeÚ )r…   rù   rM   rC   rƒ   ÚConstantr#   rI   ÚFormattedValueÚ
conversionr|   rF   r   rG   Úchrr  r(   r%   )re   rQ   rù   r   rI   Zconversion_codeZ	evaluatedr,   r,   r-   Úvisit_JoinedStrÜ  s     
  ÿ*zCodeGenerator.visit_JoinedStrc              
      s®   |d krd S t  ¡ �� t  dt¡ t  dt¡ || _| j ¡ }t|dƒrxt|dƒrx| j 	| j
| j|j |j¡ | j ¡ }tƒ  |¡}|r”| j 	|¡ |W  5 Q R £ S Q R X d S )NÚignoreÚlinenoÚ
col_offset)ÚwarningsÚcatch_warningsÚsimplefilterÚDeprecationWarningÚPendingDeprecationWarningrµ   rl   rÊ   rŠ  r«   r^   r`   r¨  r©  Úsuperr|   )re   rQ   r2  r>   ©rY  r,   r-   r|   ì  s    


zCodeGenerator.visitc                 C   s   t d |d t|ƒj¡ƒ‚d S )Nzunsupported AST node type: {})r   r  rG   rO   r’   r,   r,   r-   rˆ   ÿ  s    zCodeGenerator.generic_visitr‰   c                    s@   dd„ ‡ fdd„|j D ƒD ƒ}‡ fdd„|jD ƒ}t||Ž d S )Nc                 S   s   i | ]\}}|t |ƒ“qS r,   )rJ   )r/   r=   rI   r,   r,   r-   r¾     s      z6CodeGenerator.execute_static_print.<locals>.<dictcomp>c                 3   s   | ]}ˆ   |¡V  qd S rB   r{   r…  rq   r,   r-   r5    s     z5CodeGenerator.execute_static_print.<locals>.<genexpr>c                    s   g | ]}t ˆ  |¡ƒ‘qS r,   )rJ   r|   rO  rq   r,   r-   r0     s     z6CodeGenerator.execute_static_print.<locals>.<listcomp>)r‰  rS   rÀ   )re   rQ   rŽ  rS   r,   rq   r-   Úexecute_static_print  s    z"CodeGenerator.execute_static_printc              
   C   sÈ   t |jƒ}d|  k rdkr,n n
t |jƒr4tdƒ‚t|  |jd ¡ƒ}t|tƒsZtdƒ‚|sÄ|dkrld}nHz|  |jd ¡}W n2 t	k
r² } zdt
|ƒ d }W 5 d }~X Y nX td |t|ƒƒ‚d S )	Nr   r	   z=`static_assert` requires one or two positional arguments onlyzqAssertion condition could not be determined at compile-time. Make sure that it depends only on `constexpr` valuesr   r¡  z'<failed to evaluate assertion message: ú>)rö   rS   r‰  rf  rJ   r|   rC   rž   ÚNotImplementedErrorÚ	Exceptionr2   r   )re   rQ   Ú	arg_countZpassedÚmessageÚer,   r,   r-   Úexecute_static_assert	  s    
"
"z#CodeGenerator.execute_static_assertrˆ  )NFNFFNr   )xrO   rv   rw   r   r   r#   rf   rT  ÚfloatÚintrC   rŒ   r¿   r   Ú__annotations__Úupdater
   rÕ   Zdevice_printÚminimumrº   r   r   r   rÉ   rÍ   rÎ   rÐ   r—   rÔ   r“   r˜   rò   ró   rõ   r”   r•   r‘   rÿ   r   r  r  r  rƒ   ÚAddÚSubÚMultÚDivÚFloorDivÚModÚPowÚLShiftÚRShiftÚBitAndÚBitOrÚBitXorr
  r   Úoperatorr#  r.  r3  rš   r›   r;  rA  ÚEqÚNotEqÚLtÚLtEÚGtÚGtEr>  ÚcmpoprJ  ÚUSubÚUAddÚNotÚInvertrI  ÚunaryoprX  r\  r^  rl  ro  rp  r   rq  rt  r   r„  r�   r’  ÚBoolOpr”  ÚAndÚOrr“  Úboolopr{  Úversion_infor™  rš  rœ  rŽ   rž  rŸ  r¦  r|   rˆ   r§   r±  r¸  Zstatic_assertZstatic_printrˆ  rÈ   r   Ú__classcell__r,   r,   r°  r-   r¨   Í   sè   
            þþ(
þ
 ÿ
7	                     ý6%	           ÿ2Iy*	&  þr¨   c                 C   sx   | d dkr&t | dd … ƒ}t |¡S tjtjtjtjtjtjtj	tj
tjtjtjtjtjtjtjtjtj
dœ}||  S )Nr   Ú*r   )Zfp8e4Zfp8e5Zfp8e4b15r   r   r   r   Úi1Úi8Zi16Zi32Zi64Úu8Úu16Úu32Zu64ÚB)Ú	str_to_tyr
   Zpointer_typeZfloat8e4Zfloat8e5Zfloat8e4b15Zfloat16Zbfloat16Zfloat32Zfloat64r8  Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64)r=   r)   Útysr,   r,   r-   rä  #  s,    
ïrä  c                 C   sJ   d}t | ƒD ]8\}}|t|ƒ7 }||jkr2|d7 }||jkr|d7 }q|S )Nr¡  r1   Úd)rM   r#   Ú
equal_to_1Údivisible_by_16)rŒ  ÚspecializationÚsuffixr   r   r,   r,   r-   Úkernel_suffix=  s    


rë  c                    s°  t |tƒr"dd„ t| d¡ƒD ƒ}t ¡ }| ¡  ‡fdd„‰‡fdd„ˆ  ¡ D ƒ‰ ˆj 	¡ }d 
ˆjt| ¡ |ƒg¡}t| ¡ ƒ‰‡fdd„|jD ƒ}	d	d„ |jD ƒ}
ˆ  	¡ }| |	¡ ‡ fd
d„| ¡ D ƒ}tˆƒ\}}t g |¡}t||||||
d||||d�}z| ˆ ¡ ¡ W n† tk
�rV } z|jd k�rD| ˆj¡ ‚ W 5 d }~X Y nJ tk
�rž } z*|j}|d k�rz‚ tˆj|t|ƒƒ|‚W 5 d }~X Y nX |j}||_|S )Nc                 S   s   i | ]\}}||  ¡ “qS r,   )r\   ©r/   ÚkrØ   r,   r,   r-   r¾   M  s      zast_to_ttir.<locals>.<dictcomp>ú,c                    s   t | tƒrˆ j | ¡S | S rB   )rC   r#   rP   Úindex)r   ru  r,   r-   Ú<lambda>Q  ó    zast_to_ttir.<locals>.<lambda>c                    s   i | ]\}}ˆ |ƒ|“qS r,   r,   )r/   ÚkeyrI   )Úcst_keyr,   r-   r¾   R  s      r   c                    s*   i | ]"}||ˆ kr"ˆ | d kr"dnd“qS )rÞ  Tr   r,   ©r/   rí  )rå  r,   r-   r¾   W  s      c                 S   s   i | ]
}|d “qS ))Zmultiple_ofé   r,   rô  r,   r,   r-   r¾   X  s      c                    s    g | ]\}}|ˆ krt |ƒ‘qS r,   )rä  rì  r4   r,   r-   r0   [  s      zast_to_ttir.<locals>.<listcomp>T)	ry   r5   r³   r²   r´   r¶   r^   r`   r¬   )rC   r#   rM   Úsplitr   rª   Zload_tritonÚitemsÚ__globals__rh   r%   rO   rë  rù   r…   rç  rè  r¼  rb   r
   rz  r¨   r|   r�   r   rN   Zset_source_coder´  rµ   r2   r®   )rR   rŒ  ré  r5   r¶   r¬   rª   ry   r³   Znew_constantsZ	new_attrsZall_constantsr€  r^   r`   r°   rd   r·  rQ   r>   r,   )r5   ró  rR   rå  r-   Úast_to_ttirJ  sN    



    ý
&rù  ),rƒ   rZ   r  r{  rª  Útypingr   r   r   r   r   r   r   r¡  r
   Z_C.libtriton.tritonr   r   r   Úruntimer   Úerrorsr   r   r   r   r?   rž   rE   rF   rH   rJ   rV   rb   rº  rG   r9  rc   rÒ   rx   r¨   rä  rë  rù  r,   r,   r,   r-   Ú<module>   s>   $Z      \