o
    hG                    @   s,  d dl Z d dlZ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 d dl	m
Z
 d dlmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZ ddlmZmZmZ dd	lmZm Z 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l+m,Z,m-Z-m.Z. dd Z/dd Z0dede1fddZ2dede1fddZ3dede1fddZ4dede1fddZ5dede1fddZ6dd  Z7d!d" Z8d#d$ Z9d%ee  fd&d'Z:d(eej; d)ee! fd*d+Z<e1e=e>dhZ?G d,d- d-Z@G d.d/ d/e jAZBG d0d1 d1ZCed2d3G d4d5 d5ZDG d6d7 d7e jAZEd:d8d9ZFdS );    N)	dataclass)
ModuleType)	AnyCallableDictOptionalTupleTypeUnionIterableList   )knobslanguage)irgluon_ir)	constexpr	str_to_tytensor)_unwrap_if_constexpr
base_value	base_type)get_jit_fn_file_lineget_full_name)JITFunction)find_paths_ifget_iterable_pathset_iterable_path   )CompilationErrorCompileTimeAssertionFailureUnsupportedLanguageConstructc                 C   s*   d}t || std| d|  | | S )Nz^[a-zA-Z_][a-zA-Z0-9_]*$zinvalid z identifier: )rematchr   )nametypepattern r'   d/home/www/facesmatcher.com/frenv_anti/lib/python3.10/site-packages/triton/compiler/code_generator.pycheck_identifier_legality   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 )N_c                 S      g | ]}|  qS r'   )Zmangle.0tyr'   r'   r(   
<listcomp>!       zmangle_fn.<locals>.<listcomp>c                    s"   g | ]}| d t  |  qS )c)reprr-   i	constantsr'   r(   r/   "      " .Z_d_'Z_sq_[]__)joinsortedreplace)r$   Zarg_tysr6   Zmangled_arg_namesZmangled_constantsretr'   r5   r(   	mangle_fn   s   rA   oreturnc                 C   
   t | tS N)
isinstancer   rB   r'   r'   r(   _is_triton_value+      
rH   c                 C   rD   rE   )rF   r   rG   r'   r'   r(   _is_triton_tensor/   rI   rJ   c                 C   s   | d u pt | ttjjtfS rE   )rF   r   r   coredtyper   rG   r'   r'   r(   _is_constexpr3   s   rM   c                 C   s   t | o| j o| jjdkS Nr   )rJ   r%   is_blockZnumelrG   r'   r'   r(   _is_non_scalar_tensor7      rP   c                 C   s   t | ttfS rE   )rF   listtuplerG   r'   r'   r(   _is_list_like;      rT   c              
   C   sX   |j r(t|D ]"\}}t|s't|r't|j| d|j d|j|  d| qd S d S )Nz	Function z= is marked noinline, but was called with non-scalar argument :)noinline	enumeraterM   rP   r!   src__name__	arg_names)nodefnargsidxargr'   r'   r(   _check_fn_args?   s   ra   c                 C   s   t | tot| tot| dS )N_fields)rF   r%   
issubclassrS   hasattr)valr'   r'   r(   _is_namedtupleI   rQ   rf   c                    s~   t t| r
| j}nt| tjr| jj}n	J dt|   fdd| D }dd |D }dd |D }t|t||S )NFzUnsupported type c                       g | ]} |qS r'   r'   r-   vr]   r'   r(   r/   U   r0   z*_apply_to_tuple_values.<locals>.<listcomp>c                 S   s    g | ]}|d u rt |n|qS rE   )r   rh   r'   r'   r(   r/   V   s     c                 S      g | ]}|j qS r'   r%   rh   r'   r'   r(   r/   W       )rf   r%   rb   rF   r   rS   fields
tuple_type)valuer]   rn   valstypesr'   rj   r(   _apply_to_tuple_valuesM   s   
rs   valuesc                 C   s   g }| D ]}| | q|S rE   )_flatten_ir)rt   handlesri   r'   r'   r(   flatten_values_to_ir[   s   rw   rv   rr   c                 c   s:    d}|D ]}| | |\}}|V  q|t| ksJ d S )Nr   )_unflatten_irlen)rv   rr   cursorr.   rp   r'   r'   r(   unflatten_ir_valuesb   s   r{   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )enter_sub_regionc                 C   
   || _ d S rE   )	generator)selfr~   r'   r'   r(   __init__o   rI   zenter_sub_region.__init__c                 C   sL   | j j | _| j j | _i | j _| j j | _| j j	 | _
| j| jfS rE   )r~   lscopecopyliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_pointr   r'   r'   r(   	__enter__r   s   zenter_sub_region.__enter__c                 O   s(   | j j| j | j| j _| j| j _d S rE   )r~   r   restore_insertion_pointr   r   r   r   r   )r   r^   kwargsr'   r'   r(   __exit__{   s   
zenter_sub_region.__exit__N)rZ   
__module____qualname__r   r   r   r'   r'   r'   r(   r|   m   s    	r|   c                   @   s  e Zd Zdd ZdefddZdefddZdefdd	Zd
ej	defddZ
d
ejdefddZd
ejdefddZd
ejdefddZd
ejdefddZd
ejdefddZd
ejdefddZd
ejdefddZd
ejdefddZd
ejdefddZdS ) ContainsReturnCheckerc                 C   r}   rE   )gscope)r   r   r'   r'   r(   r      rI   zContainsReturnChecker.__init__rC   c                    s   t  fdd|D S )Nc                 3       | ]}  |V  qd S rE   visit)r-   sr   r'   r(   	<genexpr>       z5ContainsReturnChecker._visit_stmts.<locals>.<genexpr>)any)r   bodyr'   r   r(   _visit_stmts   s   z"ContainsReturnChecker._visit_stmtsc                 C      dS NFr'   )r   r]   r'   r'   r(   _visit_function   s   z%ContainsReturnChecker._visit_functionc                 C   sf   d}t |D ])\}}t|tr#|D ]}t|t jr!|p | |}qqt|t jr0|p/| |}q|S r   )astiter_fieldsrF   rR   ASTr   )r   r\   r@   r*   rp   itemr'   r'   r(   generic_visit   s   
z#ContainsReturnChecker.generic_visitr\   c                 C   sP   t |jtjr"|jj| jv r | j|jj }t||j}| |S dS | 	|jS r   )
rF   rp   r   Nameidr   getattrattrr   r   )r   r\   rp   r]   r'   r'   r(   visit_Attribute   s   
z%ContainsReturnChecker.visit_Attributec                 C   s:   t |jtju r
dS |j| jv r| j|j }| |S dS r   )r%   ctxr   Storer   r   r   )r   r\   r]   r'   r'   r(   
visit_Name   s   
z ContainsReturnChecker.visit_Namec                 C   r   NTr'   r   r\   r'   r'   r(   visit_Return      z"ContainsReturnChecker.visit_Returnc                 C   r   r   r'   r   r'   r'   r(   visit_Assign      z"ContainsReturnChecker.visit_Assignc                 C   r   r   r'   r   r'   r'   r(   visit_AugAssign   r   z%ContainsReturnChecker.visit_AugAssignc                 C      |  |jS rE   r   r   r   r'   r'   r(   visit_Module      z"ContainsReturnChecker.visit_Modulec                 C   r   rE   r   r   r'   r'   r(   visit_FunctionDef   r   z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |  |j}|jr|p|  |j}|S rE   )r   r   orelse)r   r\   r@   r'   r'   r(   visit_If   s   zContainsReturnChecker.visit_Ifc                 C   s   |  |jp|  |jS rE   )r   r   r   r   r'   r'   r(   visit_IfExp      z!ContainsReturnChecker.visit_IfExpc                 C   r   rE   )r   funcr   r'   r'   r(   
visit_Call   r   z ContainsReturnChecker.visit_CallN)rZ   r   r   r   boolr   r   r   r   	Attributer   r   r   Returnr   Assignr   	AugAssignr   Moduler   FunctionDefr   Ifr   IfExpr   Callr   r'   r'   r'   r(   r      s    r   c                   @   sh   e Zd Zdd Zdejdee deej fddZ	dejdeej fdd	Z
dejfd
dZdd ZdS )ASTFunctionc                 C   s   || _ || _|| _|| _d S rE   )	ret_types	arg_typesr6   attrs)r   r   r   r6   r   r'   r'   r(   r      s   
zASTFunction.__init__r   rr   rC   c                 C   s(   g }|D ]}|d u rq| || q|S rE   )Z_flatten_ir_types)r   r   rr   Zir_typesr.   r'   r'   r(   flatten_ir_types   s   zASTFunction.flatten_ir_typesc                 C   s   |  || jS rE   )r   r   )r   r   r'   r'   r(   return_types_ir   rU   zASTFunction.return_types_irc                    sP    fdd}t t j|} fdd|D } ||} |}|||S )Nc                       |  j vo|d uS rE   r5   pathr*   r   r'   r(   <lambda>   rm   z'ASTFunction.serialize.<locals>.<lambda>c                    s   g | ]}t  j|qS r'   )r   r   r-   r   r   r'   r(   r/          z)ASTFunction.serialize.<locals>.<listcomp>)rR   r   r   r   r   Zget_function_ty)r   r   is_val	val_pathsr   Zarg_types_irZret_types_irr'   r   r(   	serialize   s   
zASTFunction.serializec                    s   fddj }fdd}ttj |}d} fddt  D }|D ]+}tj |}j|g }	|	D ]\}
} ||
| q;|	||\}}t
||| q*j}| D ]\}}t
||t| q]|S )Nc                    s6   t | tttjfrt fdd| D | S td S )Nc                    rg   r'   r'   r-   xmake_templater'   r(   r/      r0   zBASTFunction.deserialize.<locals>.make_template.<locals>.<listcomp>)rF   rR   rS   r   ro   r   )r.   r   r'   r(   r      s   
z.ASTFunction.deserialize.<locals>.make_templatec                    r   rE   r5   r   r   r'   r(   r      rm   z)ASTFunction.deserialize.<locals>.<lambda>r   c                       g | ]}  |qS r'   r^   r3   rj   r'   r(   r/         z+ASTFunction.deserialize.<locals>.<listcomp>)r   rR   r   rangeZget_num_argsr   r   getZset_arg_attrrx   r   r6   itemsr   r   )r   r]   rq   r   r   rz   rv   r   r.   Z
attr_specsZ	attr_nameZattr_valre   r6   r'   )r]   r   r   r(   deserialize   s"   
zASTFunction.deserializeN)rZ   r   r   r   r   r   r   r   r%   r   r   r   r   r'   r'   r'   r(   r      s    "
r   T)frozenc                   @   s   e Zd ZU eed< eed< dS )BoundJITMethod__self____func__N)rZ   r   r   r   __annotations__r   r'   r'   r'   r(   r     s   
 r   c                       s  e Zd ZU 		ddedee dee fddZd	d
 ee	e
eeeeefD Zeeef ed< edejjfdejfdejff dd Zdd Zdd Zdedeeef ddfddZdd Z dd Z!dd Z"d d! Z#d"d# Z$d$d% Z%defd&d'Z&d(d) Z'd*d+ Z(d,d- Z)d.d/ Z*d0d1 Z+d2d3 Z,d4d5 Z-d6d7 Z.d8d9 Z/d:d; Z0d<d= Z1d>d? Z2d@dA Z3e4j5dBe4j6dCe4j7dDe4j8dEe4j9dFe4j:dGe4j;dHe4j<dIe4j=dJe4j>dKe4j?dLe4j@dMiZAeeBe4jC ef edN< dOdP ZDdQdR ZEdSdT ZFdUdV ZGdWdX ZHdYdZ ZId[d\ ZJe4jKd]e4jLd^e4jMd_e4jNd`e4jOdae4jPdbiZQeeBe4jR ef edc< ddde ZSe4jTdfe4jUdge4jVdhe4jWdiiZXeeBe4jY ef edj< dkdl ZZdmdn Z[dodp Z\dqdr Z]dsdt Z^dudv Z_dwdx Z`dydz Zad{d| Zbd}d~ Zcdd Zddeeeef fddZfdefddZgdefddZhdd Zidd Zjde4jkfddZle4jmde4jndiZoeeBe4jp ef ed< dd Zqdd Zrdd Zsdd Zt fddZudd Zvde4jwddfddZxdd ZyddlzmZ{ ejj|exejj}eye~e{j|exe{j}eye~eeyeeeyeiZeeee4jwgef f ed<   ZS )CodeGeneratorNFr   jit_fnfunction_types	file_namec                 C   s  || _ | rddlm} t|| _|| j| _nddlm	} t
|| _|| j| _|| _|d | _| j||d || j_|| j_|d u rJi n|| j_|	d u rW| j n|	| _|d u r`i n|| _|| _i | _| D ]/\}}t|tr||j|| j|< qmt|dd}||v rt|| |j| j|< qm|| j|< qmi | _|| _|
r||dd d  }t|d}|| _ |
| _!d | _"|| _#g | _$d | _%i | _&| ' | _(d | _)d	| _*d S )
Nr   )GluonSemantic)TritonSemanticr   r    r8   functionF)+contextZis_gluonZ,triton.experimental.gluon.language._semanticr   r   ZGluonOpBuilderr   semanticZtriton.language.semanticr   r   r   
begin_lineset_locoptionscodegen_fns
module_mapcreate_modulemodulefunction_ret_types	prototyper   r   rF   r   r   rZ   r   r   r   rfindr)   function_name	is_kernelcur_noderW   	scf_stackret_typer   _define_name_lookupdereference_namer]   visiting_arg_default_value)r   r   r   r   r   r   r   r   r   r   r   r   rW   r   r   r   r   kri   module_namer'   r'   r(   r     sR   




zCodeGenerator.__init__c                 C   s   i | ]}|j |qS r'   rZ   r-   r*   r'   r'   r(   
<dictcomp>V  s    zCodeGenerator.<dictcomp>builtin_namespaceprintminmaxc                 C   s   t | jj||S rE   )r!   r   rY   )r   r\   messager'   r'   r(   _unsupported`  s   zCodeGenerator._unsupportedc                 C   s0   t  }| j||}||u rdS t|rdS dS )NFT)objectr   r   rM   )r   r$   absent_markerre   r'   r'   r(   _is_constexpr_globalc  s   z"CodeGenerator._is_constexpr_globalc                    sJ   dt ffdddt ffddt  dt dtf fdd}|S )	Nr$   c                    s    j | |S rE   )r   r   )r$   absentr   r'   r(   local_lookupp  s   z7CodeGenerator._define_name_lookup.<locals>.local_lookupc                    s    j | |}t||u |  jv t|tu t|tt|ddt|ddt|dd	dt|dd	dt|t
jt| |  jtjjgrH|S ttd|  d	d
d)NZ__triton_builtin__FZ__triton_aggregate__r   r   ztriton.languagez"triton.experimental.gluon.languagez.                Cannot access global variable a   from within @jit'ed
                function. Triton kernels can only access global variables that
                are instanstiated as constexpr (`x = triton.language.constexpr(42)`). Note that this is different from
                annotating a variable as constexpr (`x: triton.language.constexpr = 42`), which is not supported.  Alternatively, set the
                envvar TRITON_ALLOW_NON_CONSTEXPR_GLOBALS=1, but we do not
                promise to support this forever.
 )r   r   r   r	  r%   r   rF   r   r   
startswithr   rL   rf   r  r  r   compilationZallow_non_constexpr_globals	NameErrortextwrapdedentr?   )r$   r  re   r   r'   r(   global_lookupt  s.   



z8CodeGenerator._define_name_lookup.<locals>.global_lookuprC   c                    s@    }j jfD ]}|| |}||ur|  S q	t|  d)Nz is not defined)r	  r   r  )r$   r  Zlookup_functionrp   r  r  r  r   r'   r(   name_lookup  s   
z6CodeGenerator._define_name_lookup.<locals>.name_lookup)strr  r   )r   r  r'   r  r(   r  n  s
   !z!CodeGenerator._define_name_lookupr$   rp   rC   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)r   r   )r   r$   rp   r'   r'   r(   	set_value  s   
zCodeGenerator.set_valuec                 C   s   | j  }| j  }||fS rE   )r   get_locr   )r   locipr'   r'   r(   _get_insertion_point_and_loc  s   

z*CodeGenerator._get_insertion_point_and_locc                 C   s   | j | | j | d S rE   )r   r   r   )r   r"  r!  r'   r'   r(   _set_insertion_point_and_loc  s   z*CodeGenerator._set_insertion_point_and_locc                 C   s8   t |s|g}|D ]}| | t|tjr d S q	d S rE   )rT   r   rF   r   r   )r   Zstmtsstmtr'   r'   r(   visit_compound_statement  s   
z&CodeGenerator.visit_compound_statementc                 C      t j| | d S rE   r   NodeVisitorr   r   r'   r'   r(   r        zCodeGenerator.visit_Modulec                    s6     |j}|d u sJ t fdd|jD }|S )Nc                    r   r'   r   )r-   eltr   r'   r(   r/     r   z,CodeGenerator.visit_List.<locals>.<listcomp>)r   r   r   rS   elts)r   r\   r   r,  r'   r   r(   
visit_List  s   zCodeGenerator.visit_Listc                    s    |j}g } fdd  |}|d u rtj}nt|tjjs$J || |j}j	
| jd u r;|_nj|krKtdj d| j	 }j	| d S )Nc                    s8   t | tjrt|  S t | tjttfrj| S | S rE   )	rF   r   rS   rs   r   intfloatr   	to_tensor)rp   decayr   r'   r(   r2    s
   
z)CodeGenerator.visit_Return.<locals>.decayzInconsistent return types:  and )r   rp   r   voidrF   rK   r   ru   r%   r   r@   r   	TypeErrorcreate_blockset_insertion_point_to_end)r   r\   Z	ret_valuerv   Zret_tyZpost_ret_blockr'   r1  r(   r     s    



zCodeGenerator.visit_Returnc                 C   s$   |  |j}t|tjjsJ |jS rE   )r   rp   rF   r   rK   rS   rt   r   r\   r^   r'   r'   r(   visit_Starred  s   zCodeGenerator.visit_Starredc              	      s,    |j\}} jr |dt|jjd d d D ]G\}}|jj| d  }|j}|j}tj	|t
 d}	|d u rEtj|	g|d}
ntj|	||d}
z jrSJ d _  |
 W d _qd _w  jrid	nd
} j j} j j j|| j _ j j  j } j j}t||D ]
\}} || q j } j|  |j  j  rJ  j d u sȈ j t!j"krt!j" _  j#g  n1t$ j t!j%r j j& j_'n j g j_' j( j j  j# fdd j) jD   j*  |r j+| d S d S )Nz,nested function definition is not supported.r   )r   r   targetsrp   )targetrp   
annotationTFpublicprivatec                    s   g | ]} j |qS r'   )r   create_poisonr,   r   r'   r(   r/      r   z3CodeGenerator.visit_FunctionDef.<locals>.<listcomp>),r   r^   r]   r  rX   defaultsr>  r`   r   r   r   r   	AnnAssignr  r   r   r   r   Zget_or_insert_functionr   r   rW   Z	push_backZadd_entry_blockr   zipr  r   set_insertion_point_to_startr&  r   has_terminatorr   r   r4  r@   rF   ro   rr   r   Z
reset_typer   finalizer7  )r   r\   r[   kwarg_namesr4   default_valueZarg_noder>  r$   Z	st_targetZ	init_nodeZ
visibilityZfn_tyentryZ
arg_valuesZarg_name	arg_valueZ	insert_ptr'   r   r(   r     sP   


$
zCodeGenerator.visit_FunctionDefc                 C   s4   g }|j D ]
}|| |g7 }q| |j}||fS rE   )r^   r   kwarg)r   r\   r[   r`   rH  r'   r'   r(   visit_arguments&  s
   
zCodeGenerator.visit_argumentsc                 C   s   t j| | |jS rE   )r   r)  r   r`   r   r'   r'   r(   	visit_arg-  s   zCodeGenerator.visit_argc                 C   sj   |  |j}|  |j}|  |j}|tkr0|| jv r"t| dt|}|| j|< | j| S | |S )Nz4 is already defined. constexpr cannot be reassigned.)r   r>  r=  rp   r   r   
ValueErrorr   )r   r\   r>  r=  rp   r'   r'   r(   visit_AnnAssign1  s   



zCodeGenerator.visit_AnnAssignc                 C   s   t |jtjs	J t |tjr| ||S t |tjr0t|jD ]\}}| 	||j
|  q d S t |tjrE| |j}t||j| d S t |tjsMJ | | || d S rE   )rF   r   r   r   	Subscriptvisit_Subscript_Storer   rX   r,  assignTargetrt   r   r   rp   setattrr   r   r  )r   r=  rp   r4   baser'   r'   r(   rS  A  s   zCodeGenerator.assignTargetc                    s\    fdd   |j}t|tjr|jgn|j}t|dks$J |d | d S )Nc                    sT   t | tjrt|  S tjtjf}t| } | d ur(t| s(t | |s(j| } | S rE   )	rF   r   rS   rs   rL   r   rH   r   r0  )rp   Znative_nontensor_types_sanitize_valuer   r'   r(   rW  R  s   
z3CodeGenerator.visit_Assign.<locals>._sanitize_valuer   r   )	r   rp   rF   r   rC  r=  r<  ry   rS  )r   r\   rt   r<  r'   rV  r(   r   P  s
   zCodeGenerator.visit_Assignc                 C   sN   t |j}t |_t||j|j}tj	|jg|d}| 
| | 
|S )Nr;  )r   deepcopyr=  r   Loadr   BinOpoprp   r   r   )r   r\   lhsrhsZassignr'   r'   r(   r   b  s   


zCodeGenerator.visit_AugAssignc                 C   s"   t |jtju r|jS | |jS rE   )r%   r   r   r   r   r  r   r'   r'   r(   r   j  s   zCodeGenerator.visit_Namec                 C   r'  rE   r(  r   r'   r'   r(   visit_Storeo  r*  zCodeGenerator.visit_Storec                 C   r'  rE   r(  r   r'   r'   r(   
visit_Loadr  r*  zCodeGenerator.visit_Loadc                    s    fdd|j D }t|S )Nc                    r   r'   r   r   r   r'   r(   r/   v  r   z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)r,  r   rS   r8  r'   r   r(   visit_Tupleu  s   
zCodeGenerator.visit_Tuplec                 C   sv   t |rt|||| jdS t |r#tdd|}t|||| jdS t|ttjfs4t|tr4t|}t|||S )N	_semanticz__(.*)__z__r\1__)	rJ   r   r   r"   subrF   r   r   rS   )r   method_namer\  r]  Zreverse_method_namer'   r'   r(   _apply_binary_methody  s   z"CodeGenerator._apply_binary_methodc                 C   sV   |  |j}|  |j}| jt|j}|d u r$| |d|jj	| 
|||S )Nz8AST binary operator '{}' is not (currently) implemented.)r   leftright_method_name_for_bin_opr   r%   r[  r  formatrZ   re  )r   r\   r\  r]  rd  r'   r'   r(   visit_BinOp  s   zCodeGenerator.visit_BinOp__add____sub____mul____truediv____floordiv____mod____pow__
__lshift__
__rshift____and____or____xor__rh  c                 C   s  | j | | |j | j  }| j }i }|jr9| j | | | _i | _| |j | j }| j  }g }|D ]h}|df|dffD ]4\}	}
||	v r{t	|	| t	|| k}|rg|	| j	|| j	ks{J d| d||  d|
 d|	|  qG||v s||v r|
| ||v r||vr|| ||< ||v r||vr|| ||< q=t| | @ D ]6}||v rq|| }|j	}|| }|j	}t	|t	|k}|r||ksJ d| d| d	| d
|
| 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 ())r   rE  r&  r   r   r   r   r   r   r%   appendr>   keys)r   r\   r   
then_block
else_block	then_defs	else_defsnamesr$   ZdefsZ
block_nameZ
type_equalthen_valZthen_tyelse_valZelse_tyr'   r'   r(   visit_then_else_blocks  s^   





z$CodeGenerator.visit_then_else_blocksc                    s  t | }|\}}| j }| j }| j| | j|j|| | ||||\ }}}| j | j| | rCJ | tfdd|D }	| j	|	 | j| | rdJ | t fdd|D }
| j	|
 t
|	t
|
ksJ t|	|
D ]\}}| }|| ksJ | qW d    n1 sw   Y  | j fddtt
|	D }fdd|D }t||}t||D ]
\}}| || qd S )Nc                 3       | ]} | V  qd S rE   r'   r-   r$   r}  r'   r(   r         z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>c                 3   r  rE   r'   r  r~  r'   r(   r     r  c                    r   r'   r`   r3   )endif_blockr'   r(   r/     r   z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                       g | ]} | j qS r'   rl   r  r  r'   r(   r/     r   )r|   r   r6  r7  Zcreate_cond_branchhandler  rF  rw   Zcreate_branchry   rD  get_typeadd_argumentrE  r   r{   r  )r   condr\   srr   Zip_blockr{  r|  r  then_handleselse_handlesZthen_hZelse_hr.   res_handlesrr   
new_valuesr$   	new_valuer'   )r~  r  r}  r(   visit_if_top_level  s>   




z CodeGenerator.visit_if_top_levelc                    s  t | }|\}}|  \}}| j }|jr| j nd }	| ||||	\ }}	}
tfdd|
D }| || | jdd |D |j	d|
  | j  t|
dkre| j| |jsm }	n|	
  | j  t|
dkrt fdd|
D }| j| W d    n1 sw   Y  fddtt|D }fd	d|
D }t||}t|
|D ]
\}}| || qd S )
Nc                 3   r  rE   r'   r  r  r'   r(   r      r  z-CodeGenerator.visit_if_scf.<locals>.<genexpr>c                 S   r+   r'   r  r-   hr'   r'   r(   r/     r0   z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                 3   r  rE   r'   r  r  r'   r(   r     r  c                    r   r'   
get_resultr3   )if_opr'   r(   r/     r   c                    r  r'   rl   r  r  r'   r(   r/     r   )r|   r#  r   r6  r   r  rw   r$  create_if_opr  merge_block_beforeget_then_blockr7  ry   create_yield_opget_else_blockr   r{   rD  r  )r   r  r\   r  r   r*   r"  last_locr{  r|  r  r  r  r  rr   r  r$   r  r'   )r~  r  r}  r(   visit_if_scf  s:   



zCodeGenerator.visit_if_scfc              	   C   s  |  |j}t|rZt|r| |d|j r.tdt	
|j  tjj|| j| d}|jtj| jd}t| j |}|rR| jrJ| |d| || d S | || d S t|}t|tvry| |dddd	 tD t|j|r~|jn|j}| | d S )
Nz=Boolean value of Tensor with more than one value is ambiguousziIf conditional called with multidimensional Tensor instead of scalar; please use "if (%s).item()" instead)rb  
_generatorra  zCannot 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)O`if` conditionals can only accept values of type {{{}}}, not objects of type {}, c                 s       | ]}|j V  qd S rE   r  r  r'   r'   r(   r   2      z)CodeGenerator.visit_If.<locals>.<genexpr>)r   testrJ   rP   r  r%   rO   warningswarnr   unparser   rK   Z_unsplatr   toint1r   r   r   r  r  r   _condition_typesri  r=   rZ   r   r   r&  )r   r\   r  Zcontains_returnZactive_blockr'   r'   r(   r     s<   

zCodeGenerator.visit_Ifc              	   C   s  |  |j}t|r|jtj| jd}t|  |  \}}| j	
 }| j	| | j|  |j}| j	 }| j	
 }| j	| | j|  |j}| j	 }| || |j|jksjJ d|j d|j |j}	|	tjkry|	| j	gng }
| j	|
|jd}||  |
r| j	|  | j	|jg | j	|  ||  |
r| j	|  | j	|jg |
rtj|d|	nd W  d    S 1 sw   Y  d S t|}t|tvr|  |d!d"dd	 tD t|j#|r|  |jS |  |jS )
Nra  zATernary expression with dynamic condition has inconsistent types r3  Tr   r  r  c                 s   r  rE   r  r  r'   r'   r(   r   f  r  z,CodeGenerator.visit_IfExp.<locals>.<genexpr>)$r   r  rJ   r  r   r  r   r|   r#  r   r6  rE  r0  r   r   r   r$  r%   r4  to_irr  r  r  r  r7  r  r  rK   r   r  r   r  r  ri  r=   rZ   )r   r\   r  r"  r  r{  r  r|  r  r   Zret_type_irr  r'   r'   r(   r   8  sT   




$#zCodeGenerator.visit_IfExpc                 C      d S rE   r'   r   r'   r'   r(   
visit_Passm  r   zCodeGenerator.visit_Passc                 C   s   t |jdkrt |jdks| |d| |j}| |jd }t|}t|}t|jd tj	u r:t
||u S t|jd tju rJt
||uS | jt|jd }|d u rf| |d|jd j| |||S )Nr   z1simultaneous multiple comparison is not supportedr   z<AST comparison operator '{}' is not (currently) implemented.)ry   comparatorsopsr  r   rf  r   r%   r   Isr   IsNot_method_name_for_comp_opr   ri  rZ   re  )r   r\   r\  r]  	lhs_value	rhs_valuerd  r'   r'   r(   visit_Comparep  s    zCodeGenerator.visit_Compare__eq____ne____lt____le____gt____ge__r  c                 C   s   |  |j}| jt|j}|d u r| |d|jj dt|r,t	||| j
dS zt	|| W S  tyT   |dkrEt|  Y S | |d| dt|j w )NzAST unary operator 'z!' is not (currently) implemented.ra  __not__z)' is not (currently) implemented on type )r   operand_method_name_for_unary_opr   r%   r[  r  rZ   rJ   r   r   AttributeErrorr   )r   r\   r  r]   r'   r'   r(   visit_UnaryOp  s   zCodeGenerator.visit_UnaryOp__neg____pos__r  
__invert__r  c                 C   s   t |sJ d| dt |sJ d| dt|t|u s(J d| dt|rB|j|jksDJ d| d|j d|j d	d S d S )
Nzcannot reassign constxpr z in the loopzcannot reasign constexpr zLoop carried variable z changed typezLoop-carried variable z has initial type z but is re-assigned to z: in loop! Please make sure that the type stays consistent.)rH   r%   rJ   )r   r$   loop_vallive_valr'   r'   r(   _verify_loop_carried_variable  s    z+CodeGenerator._verify_loop_carried_variablec                 C   r   rE   )r   context_exprr   r'   r'   r(   visit_withitem  r   zCodeGenerator.visit_withitemc                    s   t |jdks	J |jd j} |j}|tjkrE fdd|jD }||d ji  	|j
 W d    d S 1 s>w   Y  d S  	|j
 d S )Nr   r   c                    r   r'   r   r-   r`   r   r'   r(   r/     r   z,CodeGenerator.visit_With.<locals>.<listcomp>Z_builder)ry   r   r  r   r   r   Z
async_taskr^   r   r&  r   )r   r\   r   ZwithitemClassr^   r'   r   r(   
visit_With  s   
"zCodeGenerator.visit_Withc                    s  t | &}|\}}|  \}}| j }| j| | j| | |j | j	  | j
}|  g }	g }
|D ]}||v rX|| }|| }| ||| |	| |
| q9t|
}dd |D }dd |
D }| || | j||| j || j fddtt|D }t||}t|	|D ]\}}|| j|< || j
|< q| |j}| j | j|j| | j | | j   fddtt|D }t||}t|	|D ]\}}|| j|< || j
|< q| j| | |j | j	  | j
}g }|D ]}||v r|| | q| j| W d    n	1 s/w   Y  fddtt|D }t||}t|	|D ]\}}|| j|< || j
|< qK|jD ]}J dd S )	Nc                 S   r+   r'   r  r  r'   r'   r(   r/     r0   z-CodeGenerator.visit_While.<locals>.<listcomp>c                 S   rk   r'   rl   )r-   ar'   r'   r(   r/     rm   c                    r   r'   r  r3   )before_blockr'   r(   r/     r   c                    r   r'   r  r3   )after_blockr'   r(   r/     r   c                    r   r'   r  r3   )while_opr'   r(   r/     r   FzNot implemented)#r|   r#  r   r6  rE  r   ry  r&  r   popr   eraser  rw   r$  Zcreate_while_opZcreate_block_with_parentZ
get_beforer   ry   r{   rD  r   r   r  r7  Zcreate_condition_opr  Z	get_afterru   r  r   r   r)  r   )r   r\   r  r   r   r"  r  dummyZ	loop_defsr  	init_argsr$   r  r  init_handlesinit_tysZinit_fe_tys
block_argsZcondition_argsre   r  Zbody_handlesZ	body_argsyieldsresult_handlesZresult_valsZnew_defr%  r'   )r  r  r  r(   visit_While  sz   









C


zCodeGenerator.visit_Whilec                 C   sJ   t |jtjs	J | |j}| |j}t|r!|j|| j	dS || S )Nra  )
rF   r   r   rY  r   rp   slicerJ   __getitem__r   )r   r\   r\  slicesr'   r'   r(   visit_Subscript_Load  s   z"CodeGenerator.visit_Subscript_Loadc                 C   sJ   t |jtjs	J | |j}| |j}t |tjsJ |	|| d S rE   )
rF   r   r   r   r   rp   r  r   rS   __setitem__)r   r\   rp   r\  r  r'   r'   r(   rR    s
   z#CodeGenerator.visit_Subscript_Storec                 C   s
   |  |S rE   )r  r   r'   r'   r(   visit_Subscript  rI   zCodeGenerator.visit_Subscriptc                    s    fdd|j D S )Nc                    r   r'   r   )r-   dimr   r'   r(   r/     r   z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)dimsr   r'   r   r(   visit_ExtSlice  s   zCodeGenerator.visit_ExtSlicec           ,         sN   |jj}fdd|jjD }tfdd|jjD }|tjkrZ||i |}t|j	j
|jj
|jj
}|D ]}t|j|jj< |j |jD ]	}tj| qMq9d S d }	d }
d}d}d}|tju r||i |}|j	}|j}|j}|j}	|j}
|j}|j}|j}n@|tu rt|dkr|d n td}t|dkr|d n |jjd }t|dkr|d n td}ntd	d}t|r|j
dk rt|j
 }d
}||}}j !|}j !|}j !|}|j"# r|j"# r|j"# st$d|j" d|j" d|j" dj %|j"|j"}j %||j"}|&j'}|j(tj)j"j*j+k}|j,}|j,}|j,}j'-|||}j'-|||}j'-|||}j'.|}/|jjtj)0|| t1}|\}}2 \}}j'3 }j'4| j56| |j j57  |8  g }g }g }j9D ]'}||v rɈj9| } || }!:|| |! |6| |6|! |6|  q;|| t<|}"dd |D }#j'=||||" t>|	d ur ?dj'@|	 t>|
d ur ?dj'@|
 |r ?dj'A  |r ?dj'A  |r+ ?dj'A  j56|  Bdj'4 |C _i _9fddtt|"D }$tD|$|#}%tE||%D ]\}}&/||& q[|j j57  g }j9D ]}||v rj9| }'tF|'trj !|'}'|6|' qwt|dkrt<|}(j'G|( H })|)I dksJ dj'4  J }|rшj'K||}j'L||}j|jj j,M| /|jjtj)0|| W d    n	1 sw   Y   fddtt|"D }*tD|*|#}+tE||+D ]\}}&/||& q|jD ]}J dd S )Nc                    r   r'   r   r  r   r'   r(   r/     r   z+CodeGenerator.visit_For.<locals>.<listcomp>c                 3   r   rE   r   r-   keywordr   r'   r(   r     r   z*CodeGenerator.visit_For.<locals>.<genexpr>Fr   r   r   zAOnly `range` and `static_range` iterators are currently supportedTz0For loop bounds and step must all be ints, are (r  rx  c                 S   rk   r'   rl   rh   r'   r'   r(   r/   u  rm   ztt.num_stagesztt.loop_unroll_factorztt.disallow_acc_multi_bufferz
tt.flattenztt.warp_specializec                    s   g | ]	}  |d  qS )r   r  r3   )for_op_bodyr'   r(   r/         z7We use SCF, so the loop body should only have one blockc                    r   r'   r  r3   )for_opr'   r(   r/     r   z)Don't know what to do with else after for)Nr   iterr   r^   dictkeywordsr   static_ranger   startrp   endstepr   r   r=  r   r&  r   r   r   r)  r   
num_stagesloop_unroll_factordisallow_acc_multi_bufferflattenwarp_specializery   NumRuntimeErrorrM   r   r0  rL   Zis_intr5  Zinteger_promote_implr  r   Zint_signednessrK   Z
SIGNEDNESSZSIGNEDr  Zcreate_int_castrA  r  r   r|   r#  r6  rE  r   ry  r  r  r   r  r$  rw   Zcreate_for_opr   Zset_attrZget_int32_attrZget_unit_attrget_bodyr   r{   rD  rF   r  Z
get_parentsizeZget_induction_varZ
create_subZ
create_addZreplace_all_uses_with),r   r\   ZIteratorClassZ	iter_argsZiter_kwargsiteratorr  r4   r%  r  r  r  r  r  ZlbZubr  Znegative_stepZiv_typeZ
iv_ir_typeZiv_is_signedZivr  r   r   r"  r  blockr  r  r  r$   r  r  r  r  Zblock_handlesr  re   localZyield_handlesZfor_op_regionr  Zresult_valuesr'   )r  r  r   r(   	visit_For  s  


$&&
$"















Q

zCodeGenerator.visit_Forc                 C   s2   |  |j}|  |j}|  |j}t|||S rE   )r   lowerupperr  r   r  )r   r\   r  r   r  r'   r'   r(   visit_Slice  s   zCodeGenerator.visit_Slicec                 C   r   rE   )r   rp   r   r'   r'   r(   visit_Index  r   zCodeGenerator.visit_Indexc                 C   s   |j | |jfS rE   )r`   r   rp   r   r'   r'   r(   visit_keyword  r*  zCodeGenerator.visit_keywordc                 C   s:   |  |j}|jd ur|  |jnd}tjj||| jdS )Nr   ra  )r   r  msgr   rK   Zdevice_assertr   )r   r\   r  r  r'   r'   r(   visit_Assert  s   zCodeGenerator.visit_Assertr]   c                    s  t j|jg R i |  fdd|jD  t D ]\}}t|tjtt	t
tfr2tj| |< qt dd } fdd|D }t dd } fdd|D }tt|d	d |D |}	| j|	st|\}
}d
d  D }tg ||t }t| j|| | j||	| j|j|
|| jj| jj| jjd}z	||   W n t!y } zt"j#j$r t%| j&j'| j(d |d }~ww |j)}|| j|	< n| j|	 }| j*|	}t+|}| j,|||tj-krd S fddt./ D }t0t1||gS )Nc                    s   g | ]} | qS r'   r'   r  r   r'   r(   r/     r0   z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s   t |S rE   rM   r*   r   r'   r'   r(   r     s    z0CodeGenerator.call_JitFunction.<locals>.<lambda>c                    s   i | ]}|t  |qS r'   r   r   r   r'   r(   r    r   z2CodeGenerator.call_JitFunction.<locals>.<dictcomp>c                 S   s
   t | S rE   r  r  r'   r'   r(   r     s   
 c                    s   g | ]}t  |qS r'   r  r   r   r'   r(   r/     r   c                 S   rk   r'   rl   r  r'   r'   r(   r/     rm   c                 S   s6   g | ]}|d u st |tttjjfrtjjn|jqS rE   )rF   r   r.  r   rK   rL   r   r%   r  r'   r'   r(   r/     s    )
r   r   r   r   rW   r   r   r   r   r   c                    r   r'   r  r3   )call_opr'   r(   r/     r   )2inspectgetcallargsr]   r[   rX   rF   r   rL   r/  r.  r   r   rK   r   r   rA   r   r   Zhas_functionr   r   r  r   r   get_capture_scoper   rW   r   r   r   r   r   parse	Exceptionr   r  front_end_debuggingr   r   rY   r   r   Zget_functionrw   callr4  r   Zget_num_resultsnextr{   )r   r]   r^   r   r4   r`   Zargs_cstZ	args_pathZargs_valfn_namer   r   r   r   r~   eZcallee_ret_typesymbolrv   r'   )r^   r	  r(   call_JitFunction  sR   

zCodeGenerator.call_JitFunctionc              
      s  t  |j}t|ts j|}|d ur| |S t|dd}|rHt|ddrHdt	|j g}t|t
r=|| t jj|d|t fdd|jD } fdd	|jD }ttjd
d |D }t|trz|d|j |j}t|trt|||  |||S t|drt|jstj !|rd j"i}t#$|}	d|	j%v r |d< z||i ||}
t|
t&rt&|
}
|
W S  t'y } zt(j)j*r҂ t jj|d |d }~ww | j+, v rt-t |}||i |}
t.t/|
rt0|
dd S |
S )NZ_must_use_resultF
_is_unusedz#The result of %s is not being used.r  c                 3   r   rE   r   r  r   r'   r(   r     r   z+CodeGenerator.visit_Call.<locals>.<genexpr>c                    r   r'   r   r  r   r'   r(   r/     r   z,CodeGenerator.visit_Call.<locals>.<listcomp>c                 s   s$    | ]}t |tr|n|gV  qd S rE   )rF   rR   r   r'   r'   r(   r      s   " r   r   rb  r  c                 S   s   | S rE   r'   )r   r'   r'   r(   r      s    z*CodeGenerator.visit_Call.<locals>.<lambda>)1r   r   r   rF   r    statically_implemented_functionsr   r   r   r  r  ry  r   r   rY   r=   r  r  r^   rR   	itertoolschainfrom_iterableinsertr   r   r   ra   r  rd   rH   r   rK   
is_builtinr   r
  	signature
parametersrS   r  r   r  r  r	  rt   maprf   r%   rs   )r   r\   r]   Zstatic_implementationZmurerror_messagekwsr^   extra_kwargssigr@   r  r'   r   r(   r     sP   





 





 zCodeGenerator.visit_Callc                 C   s
   t |jS rE   )r   rp   r   r'   r'   r(   visit_Constant"  rI   zCodeGenerator.visit_Constantr\   c              	   C   sH  | j t|j}|d u r| |d|jjg }|jD ]O}| |}t	|sEt
|}|du r8|dkr8|  S |du rD|dkrD|  S q|j rgt|dd }|d urY|| j7 }tjdt| j|t|d || qt|d	krx|| t|d
kr| }| }	| ||	|}
||
 t|d
ks~t|dksJ |d	 S )Nz9AST boolean operator '{}' is not (currently) implemented.Flogical_andT
logical_orlinenozeLogical operators 'and' and 'or' are deprecated for non-scalar tensors; please use '&' or '|' instead)categoryfilenamer'  sourcer   r   r   )_method_name_for_bool_opr   r%   r[  r  ri  rZ   rt   r   rJ   r   rO   r   r   r  warn_explicitUserWarningr   r   r  ry  ry   r  re  )r   r\   rd  Znontrivial_valuesZsubnoderp   Zbvr'  r]  r\  resr'   r'   r(   visit_BoolOp%  sJ   





zCodeGenerator.visit_BoolOpr%  r&  r+  c                 C   sr   |  |j}t|r|jdkr| j|dS t|tr#|jdkr#|j}t||j}t	|r7t|t
r7t||S |S )NT)r   r   rp   )r   rp   rJ   r   r   ZpermuterF   r   r   rH   r   r   )r   r\   r\  r   r'   r'   r(   r   [  s   
zCodeGenerator.visit_Attributec                 C   s   d|j _tj| | d S r   )rp   r  r   r)  r   r   r'   r'   r(   
visit_Exprg  s   zCodeGenerator.visit_Exprc                 C   r  rE   r'   r   r'   r'   r(   visit_NoneTypek  r   zCodeGenerator.visit_NoneTypec                 C   s   t |j}t|D ]N\}}t|tjrt|j||< q	t|tjrO|j	}| 
|j}t|s:| |dtt| |dk r@dndt| d |j||< q	tdt|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 noder   )rR   rt   rX   rF   r   Constantr  rp   FormattedValue
conversionr   rM   r  r%   chrri  AssertionErrorr=   )r   r\   rt   r4   rp   Zconversion_codeZ	evaluatedr'   r'   r(   visit_JoinedStrn  s"   

*
zCodeGenerator.visit_JoinedStrc                    s  |d u rd S t  v t dt t dt | j}| j }|| _t|dr?t|dr?| j	| j
| j|j |j | j }zt |}W n$ tyO     tyk } ztjjr[ t| jj| jt|d d }~ww |rw|| _| j	| |W  d    S 1 sw   Y  d S )Nignorer'  
col_offset)r  catch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr   r   r   rd   r   r   r   r'  r;  superr   r   r  r   r  r  r   rY   r2   )r   r\   Z	last_noder  r@   r  	__class__r'   r(   r     s4   


$zCodeGenerator.visitc                 C   s   |  |dt|j)Nzunsupported AST node type: {})r  ri  r%   rZ   r   r'   r'   r(   r     r   zCodeGenerator.generic_visitc              
   C   s   t |j}d|  k rdkrn tdt |jrtdt| |jd }t|ts0td|sh|dkr9d}n%z
| |jd }W n t	y] } zdt
| d }W Y d }~nd }~ww t| jj|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: >)ry   r^   r  r5  r   r   rF   r   NotImplementedErrorr  r2   r    r   rY   )r   r\   	arg_countZpassedr  r  r'   r'   r(   execute_static_assert  s*   


z#CodeGenerator.execute_static_assertc                    s   dt jf fdd}|S )Nr\   c                    sD   dd  fdd|j D D } fdd|jD }t|i |S )Nc                 S   s   i | ]	\}}|t |qS r'   )r   )r-   r$   rp   r'   r'   r(   r    s    z>CodeGenerator.static_executor.<locals>.ret.<locals>.<dictcomp>c                 3   r   rE   r   r  r   r'   r(   r     r   z=CodeGenerator.static_executor.<locals>.ret.<locals>.<genexpr>c                    s   g | ]	}t  |qS r'   )r   r   r  r   r'   r(   r/     r  z>CodeGenerator.static_executor.<locals>.ret.<locals>.<listcomp>)r  r^   r   )r   r\   r!  r^   	python_fnr   r(   r@     s
   z*CodeGenerator.static_executor.<locals>.ret)r   r   )rH  r@   r'   rG  r(   static_executor  s   zCodeGenerator.static_executorr   )r   r  )NFNFNr   )rZ   r   r   r   r   r   r  r   ry   rR   r   r/  r.  rF   r   rd   r	  r   r   updater   rK   Zdevice_printminimummaximumr  r  r  r
   r   r   r  r#  r$  r&  r   r-  r   r9  r   rM  rN  rP  rS  r   r   r   r^  r_  r`  re  rj  r   AddSubMultDivFloorDivModPowLShiftRShiftBitAndBitOrBitXorrh  r	   operatorr  r  r  r   r   r  r  EqNotEqLtLtEGtGtEr  cmpopr  USubUAddNotInvertr  unaryopr  r  r  r  r  rR  r  r  r  r  r  r   r  r  r  r   r$  BoolOpr/  AndOrr+  boolopr   r1  r2  r9  r   r   r   rF  rI  Zexperimental.gluonZttglZstatic_assertZstatic_printr
  r  r  r   __classcell__r'   r'   rA  r(   r     s   
 
;
3	5
4'"5$	N /2&4
(r   c                    s   d gt  j }j D ]\}}	 j|}
t|	||
< qtg |jj}t	 \}}ddl
m} tdd j} fdd|D }j}|ddd	g||}t||   | d
||||||d}|   |j}||_|S )Nr   )
namedtuplec                 S   s   t | dkS rN   )ry   )ri   r'   r'   r(   r     s    zast_to_ttir.<locals>.<lambda>c                    s"   i | ]} j |d   j| qS )r   )r[   r6   r3   r]   rY   r'   r(   r    r7   zast_to_ttir.<locals>.<dictcomp>ZSpecializationProxyr6   r  T)
r   r   r   r   r   r   r   r   r   r   )ry   r[   r  r   indexr   r   r6   r   r   collectionsrk  filterr   r  r2   r   r  r   r   )r]   rY   r   r   r   r   r   r   r  ri   r_   r   r   r   rk  leavesr6   r  proxyr~   r@   r'   rl  r(   ast_to_ttir  s&   
rr  rE   )Gr   r   r
  r"   r  r  r  dataclassesr   rr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   Z_C.libtritonr   r   r   r   r   Zlanguage.corer   r   r   Zruntime.jitr   r   Zruntimer   Z_utilsr   r   r   errorsr   r    r!   r)   rA   r   rH   rJ   rM   rP   rT   ra   rf   rs   rw   rp   r{   r.  r%   r  r|   r)  r   r   r   r   rr  r'   r'   r'   r(   <module>   s^    ,
W:         ?