o
    ^i                    @   sT  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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m Z! dd	l"m#Z#m$Z$m%Z% dd
l&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/m0Z0 ddl1m2Z2m3Z3m4Z4 dd Z5dd Z6dede7fddZ8dede7fddZ9dede7fddZ:dede7fddZ;dede7fddZ<dd Z=d d! Z>d"d# Z?d$ee$ fd%d&Z@d'eejA d(ee% fd)d*ZBe7eCeDdhZEd+d, ZFd-d. ZGG d/d0 d0ZHG d1d2 d2e jIZJG d3d4 d4ZKe
d5d6G d7d8 d8ZLG d9d: d:e jIZMd=d;d<ZNdS )>    N)	dataclass)
ModuleType)	AnyCallableDictOptionalTupleTypeUnionIterableList   )knobslanguage)irgluon_ir)	constexpr	str_to_tytensortuple)_unwrap_if_constexpr
base_value	base_type)get_jit_fn_file_lineget_full_nameJITCallableBoundConstexprFunctionConstexprFunction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+   Y/var/www/html/RAG/RAG_venv/lib/python3.10/site-packages/triton/compiler/code_generator.pycheck_identifier_legality   s   r-   c                    s   d dd |D }d  fddt D }|dd}|dd}|d	dd
d}|  d| d| }|d urB|| 7 }|S )N_c                 S      g | ]}|  qS r+   )mangle.0tyr+   r+   r,   
<listcomp>"       zmangle_fn.<locals>.<listcomp>c                    s"   g | ]}| d t  |  qS )c)reprr2   i	constantsr+   r,   r4   #      " ._d_'_sq_[]__)joinsortedreplacer0   )r(   arg_tysr;   caller_contextmangled_arg_namesmangled_constantsretr+   r:   r,   	mangle_fn    s   rL   oreturnc                 C   
   t | tS N)
isinstancer   rM   r+   r+   r,   _is_triton_value.      
rS   c                 C   rO   rP   )rQ   r   rR   r+   r+   r,   _is_triton_tensor2   rT   rU   c                 C   s   | d u pt | ttjjtfS rP   )rQ   r   r   coredtyper   rR   r+   r+   r,   _is_constexpr6   s   rX   c                 C   s   t | o| j o| jjdkS Nr"   )rU   r)   is_blocknumelrR   r+   r+   r,   _is_non_scalar_tensor:      r\   c                 C   s   t | ttfS rP   )rQ   listr   rR   r+   r+   r,   _is_list_like>      r_   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	enumeraterX   r\   r%   src__name__	arg_names)nodefnargsidxargr+   r+   r,   _check_fn_argsB   s   rl   c                 C   s   t | tot| tot| dS )N_fields)rQ   r)   
issubclassr   hasattr)valr+   r+   r,   _is_namedtupleL   r]   rq   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+   r2   vrh   r+   r,   r4   X   r5   z*_apply_to_tuple_values.<locals>.<listcomp>c                 S   s    g | ]}|d u rt |n|qS rP   )r   rs   r+   r+   r,   r4   Y   s     c                 S      g | ]}|j qS r+   r)   rs   r+   r+   r,   r4   Z       )rq   r)   rm   rQ   r   r   fields
tuple_type)valuerh   ry   valstypesr+   ru   r,   _apply_to_tuple_valuesP   s   
r~   valuesc                 C   s   g }| D ]}| | q|S rP   )_flatten_ir)r   handlesrt   r+   r+   r,   flatten_values_to_ir^   s   r   r   r}   c                 c   s:    d}|D ]}| | |\}}|V  q|t| ksJ d S Nr   )_unflatten_irlen)r   r}   cursorr3   r{   r+   r+   r,   unflatten_ir_valuese   s   r   c                 C   s$   g }|  | | j|d\}}|S r   )r   r)   r   )rp   r   cloner.   r+   r+   r,   _clone_triton_valuep   s   
r   c                 C   s   dd |   D S )Nc                 S   s&   i | ]\}}|t |rt|n|qS r+   )rS   r   )r2   r(   rp   r+   r+   r,   
<dictcomp>x   s   & z _clone_scope.<locals>.<dictcomp>)items)scoper+   r+   r,   _clone_scopew      r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )enter_sub_regionc                 C   
   || _ d S rP   )	generator)selfr   r+   r+   r,   __init__}   rT   zenter_sub_region.__init__c                 C   sL   t | jj| _t | jj| _i | j_| jj | _| jj	 | _
| j| jfS rP   )r   r   lscopeliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_pointr   r+   r+   r,   	__enter__   s   zenter_sub_region.__enter__c                 O   s(   | j j| j | j| j _| j| j _d S rP   )r   r   restore_insertion_pointr   r   r   r   r   )r   ri   kwargsr+   r+   r,   __exit__   s   
zenter_sub_region.__exit__N)re   
__module____qualname__r   r   r   r+   r+   r+   r,   r   {   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   rP   )gscope)r   r   r+   r+   r,   r      rT   zContainsReturnChecker.__init__rN   c                    s   t  fdd|D S )Nc                 3       | ]}  |V  qd S rP   visit)r2   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   rh   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_fieldsrQ   r^   ASTr   )r   rg   rK   r.   r{   itemr+   r+   r,   generic_visit   s   
z#ContainsReturnChecker.generic_visitrg   c                 C   sP   t |jtjr"|jj| jv r | j|jj }t||j}| |S dS | 	|jS r   )
rQ   r{   r   Nameidr   getattrattrr   r   )r   rg   r{   rh   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   rg   rh   r+   r+   r,   
visit_Name   s   
z ContainsReturnChecker.visit_Namec                 C   r   NTr+   r   rg   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 rP   r   r   r   r+   r+   r,   visit_Module      z"ContainsReturnChecker.visit_Modulec                 C   r   rP   r   r   r+   r+   r,   visit_FunctionDef   r   z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |  |j}|jr|p|  |j}|S rP   )r   r   orelse)r   rg   rK   r+   r+   r,   visit_If   s   zContainsReturnChecker.visit_Ifc                 C   s   |  |jp|  |jS rP   )r   r   r   r   r+   r+   r,   visit_IfExp      z!ContainsReturnChecker.visit_IfExpc                 C   r   rP   )r   funcr   r+   r+   r,   
visit_Call   r   z ContainsReturnChecker.visit_CallN)re   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 rP   )	ret_types	arg_typesr;   attrs)r   r   r   r;   r   r+   r+   r,   r      s   
zASTFunction.__init__r   r}   rN   c                 C   s(   g }|D ]}|d u rq| || q|S rP   )_flatten_ir_types)r   r   r}   ir_typesr3   r+   r+   r,   flatten_ir_types   s   zASTFunction.flatten_ir_typesc                 C   s   |  || jS rP   )r   r   )r   r   r+   r+   r,   return_types_ir   r`   zASTFunction.return_types_irc                    sP    fdd}t t j|} fdd|D } ||} |}|||S )Nc                       |  j vo|d uS rP   r:   pathr.   r   r+   r,   <lambda>   rx   z'ASTFunction.serialize.<locals>.<lambda>c                    s   g | ]}t  j|qS r+   )r    r   r2   r   r   r+   r,   r4          z)ASTFunction.serialize.<locals>.<listcomp>)r^   r   r   r   r   get_function_ty)r   r   is_val	val_pathsr   arg_types_ir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                    rr   r+   r+   r2   xmake_templater+   r,   r4     r5   zBASTFunction.deserialize.<locals>.make_template.<locals>.<listcomp>)rQ   r^   r   r   rz   r   )r3   r   r+   r,   r     s   
z.ASTFunction.deserialize.<locals>.make_templatec                    r   rP   r:   r   r   r+   r,   r     rx   z)ASTFunction.deserialize.<locals>.<lambda>r   c                       g | ]}  |qS r+   ri   r8   ru   r+   r,   r4         z+ASTFunction.deserialize.<locals>.<listcomp>)r   r^   r   rangeget_num_argsr    r   getset_arg_attrr   r!   r;   r   r   r   )r   rh   r|   r   r   r   r   r   r3   
attr_specs	attr_nameattr_valrp   r;   r+   )rh   r   r   r,   deserialize  s"   
zASTFunction.deserializeN)re   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)re   r   r   r   __annotations__r   r+   r+   r+   r,   r   !  s   
 r   c                       sB  e Zd ZU ddddddddd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ej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*j+fd,d-Z,d.d/ Z-defd0d1Z.d2d3 Z/d4d5 Z0d6d7 Z1d8d9 Z2d:d; Z3d<d= Z4d>d? Z5d@dA Z6dBdC Z7dDdE Z8dFdG Z9dHdI Z:dJdK Z;e*j<dLe*j=dMe*j>dNe*j?dOe*j@dPe*jAdQe*jBdRe*jCdSe*jDdTe*jEdUe*jFdVe*jGdWiZHeeIe*jJ ef edX< dYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNdadb ZOdcdd ZPdedf ZQdgdh ZRe*jSdie*jTdje*jUdke*jVdle*jWdme*jXdniZYeeIe*jZ ef edo< dpdq Z[e*j\dre*j]dse*j^dte*j_duiZ`eeIe*ja ef edv< dwdx Zbdydz Zcd{d| Zdd}d~ Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdeleef fddZmdefddZnddefddZodd Zpdd Zqdd Zrdd Zsd+e*jtfddZue*jvde*jwdiZxeeIe*jy ef ed< dd Zzdd Z{dd Z|dd Z} fddZ~dd Zd+e*jddfddZdd ZddlmZ ejjeejjeeejeejeeeeeeeeiZeeee*jgef f ed<   ZS )CodeGeneratorNFr   )module	is_kernelfunction_typesrb   rH   	file_name
begin_linejit_fnr  r  c                C   s  || _ |	| _|	rddlm} t|| _|| j| _nddlm	} t
|| _|| j| _d | _|| _|d | _| j||d || j_|| j_|d u rNi n|| j_|
d u r[| j n|
| _|d u rdi n|| _|| _i | _| D ]/\}}t|tr||j|| j|< qqt|dd}||v rt|| |j| j|< qq|| j|< qqi | _|| _|r||dd d  }t |d}|| _!|| _"d | _#|| _$|| _%g | _&d | _'i | _(| ) | _*d | _+d	| _,d S )
Nr   )GluonSemantic)TritonSemanticr"   r    r=   functionF)-contextis_gluon,triton.experimental.gluon.language._semanticr
  r   GluonOpBuilderr   semantictriton.language.semanticr  r   name_loc_as_prefixr  r  set_locoptionscodegen_fns
module_mapcreate_moduler  function_ret_types	prototyper   r   rQ   r   r   re   r   r   r	  rfindr-   function_namer  cur_noderb   rH   	scf_stackret_typer   _define_name_lookupdereference_namerh   visiting_arg_default_value)r   r  r  r   r  r	  r  r  r  r  r  r  r  rb   rH   r  r  r
  r  krt   module_namer+   r+   r,   r   )  sX   




zCodeGenerator.__init__c                 C   s   i | ]}|j |qS r+   re   r2   r.   r+   r+   r,   r   h  s    zCodeGenerator.<dictcomp>builtin_namespaceprintminmaxc                 C   s   t | jj||S rP   )r%   r	  rd   )r   rg   messager+   r+   r,   _unsupportedr  s   zCodeGenerator._unsupportedc                 C   s0   t  }| j||}||u rdS t|rdS dS )NFT)objectr   r   rX   )r   r(   absent_markerrp   r+   r+   r,   _is_constexpr_globalu  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 rP   )r   r   )r(   absentr   r+   r,   local_lookup  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)N__triton_builtin__F__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   rQ   r   r   
startswithr   rW   rq   r0  r#  r   compilationallow_non_constexpr_globals	NameErrortextwrapdedentrF   )r(   r1  rp   r   r+   r,   global_lookup  s.   



z8CodeGenerator._define_name_lookup.<locals>.global_lookuprN   c                    s@    }j jfD ]}|| |}||ur|  S q	t|  d)Nz is not defined)r(  r   r:  )r(   r1  lookup_functionr{   r/  r=  r2  r   r+   r,   name_lookup  s   
z6CodeGenerator._define_name_lookup.<locals>.name_lookup)strr.  r   )r   r@  r+   r?  r,   r!    s
   !z!CodeGenerator._define_name_lookupc                 c   s    || _ d V  d | _ d S rP   )r  )r   prefixr+   r+   r,   _name_loc_prefix  s   
zCodeGenerator._name_loc_prefixc                 C   sn   t |tjtjfr|| j||  d S t|r3g }|	| |D ]}|| j||  q$d S d S rP   )
rQ   r   r{   block_argumentr  r   create_name_locget_locrS   r   )r   rp   r(   r   handler+   r+   r,   _maybe_set_loc_to_name  s   
z$CodeGenerator._maybe_set_loc_to_namer(   r{   rN   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(   r{   r+   r+   r,   	set_value  s   
zCodeGenerator.set_valuec                 C   s   | j  }| j  }||fS rP   )r   rF  r   )r   locipr+   r+   r,   _get_insertion_point_and_loc  s   

z*CodeGenerator._get_insertion_point_and_locc                 C   s   | j | | j | d S rP   )r   r   r  )r   rK  rJ  r+   r+   r,   _set_insertion_point_and_loc  s   z*CodeGenerator._set_insertion_point_and_locc                 C   s   | j  }| j | | j| | |j | j  |  g }g }g }|	 D ]@\}}t
|r]| j| }	| ||	| t|g}
t|	g}|
|kr\|| ||j ||
 q*|| jvsjJ d| dq*| | _i | _|||fS )NLoop carried variable z is not a triton value)r   create_blockset_insertion_point_to_startr  appendvisit_compound_statementr   poperaser   rS   r   _verify_loop_carried_variabler   r)   extendr   copy)r   rg   r   blockinit_tysinit_handlesnamesr(   live_valloop_vallive_handlesloop_handlesr+   r+   r,   _find_carries  s0   








zCodeGenerator._find_carriesc                 C   s8   t |s|g}|D ]}| | t|tjr d S q	d S rP   )r_   r   rQ   r   r   )r   stmtsstmtr+   r+   r,   rR    s   
z&CodeGenerator.visit_compound_statementc                 C      t j| | d S rP   r   NodeVisitorr   r   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   )r2   eltr   r+   r,   r4     r   z,CodeGenerator.visit_List.<locals>.<listcomp>)r   r   r   r   elts)r   rg   r   rg  r+   r   r,   
visit_List  s   zCodeGenerator.visit_Listrg   c                 C   sv   t |jdkrtd|jd }| |j}t|tstdg }|D ]}| |j	j
| || |j q#t|S )Nr"   z'nested comprehensions are not supportedr   z'only tuple comprehensions are supported)r   
generators
ValueErrorr   iterrQ   tl_tupleNotImplementedErrorrI  targetr   rQ  rf  )r   rg   comprk  resultsr   r+   r+   r,   visit_ListComp  s   

zCodeGenerator.visit_ListCompc                    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 rP   )	rQ   r   r   r~   r   intfloatr  	to_tensor)r{   decayr   r+   r,   rv  '  s
   
z)CodeGenerator.visit_Return.<locals>.decayzInconsistent return types:  and )r   r{   r   voidrQ   rV   r   r   r)   r   rK   r   	TypeErrorrO  set_insertion_point_to_end)r   rg   	ret_valuer   ret_typost_ret_blockr+   ru  r,   r   #  s    



zCodeGenerator.visit_Returnc                 C   s$   |  |j}t|tjjsJ |jS rP   )r   r{   rQ   r   rV   r   r   r   rg   ri   r+   r+   r,   visit_StarredA  s   zCodeGenerator.visit_Starredc              	      sT    |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} jd ur 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   targetsr{   )rn  r{   
annotationTFpublicprivatec                    s   g | ]} j |qS r+   )r   create_poisonr1   r   r+   r,   r4   x  r   z3CodeGenerator.visit_FunctionDef.<locals>.<listcomp>)/r   ri   rh   r-  rc   defaultsr  rk   r   r   r   r   	AnnAssignr#  r  r  r   r   get_or_insert_functionr  r  rb   	push_backadd_entry_blockr   rH   initialize_calleeziprH  rI  r   rP  rR  r   has_terminatorr   r   rx  rK   rQ   rz   r}   r   
reset_typer   finalizerz  )r   rg   rf   kwarg_namesr9   default_valuearg_noder  r(   	st_target	init_node
visibilityfn_tyentry
arg_valuesarg_name	arg_value	insert_ptr+   r   r,   r   F  sV   



$
zCodeGenerator.visit_FunctionDefc                 C   s4   g }|j D ]
}|| |g7 }q| |j}||fS rP   )ri   r   kwarg)r   rg   rf   rk   r  r+   r+   r,   visit_arguments~  s
   
zCodeGenerator.visit_argumentsc                 C   s   t j| | |jS rP   )r   re  r   rk   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  rn  r{   r   r   rj  r   )r   rg   r  rn  r{   r+   r+   r,   visit_AnnAssign  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r:tdt |tjsBJ | | || d S )Nz/Attribute assignment is not supported in triton)rQ   r   r   r   	Subscriptvisit_Subscript_Storer   rc   rg  assignTargetr   r   rm  r   rI  r   )r   rn  r{   r9   r+   r+   r,   r    s   zCodeGenerator.assignTargetc                    s    fdd t |tjr|jgn|j}t|dksJ |d }t |tjrE|j  	|j
}W d    n1 s?w   Y  n 	|j
}|| 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 rP   )	rQ   r   r   r~   rW   r   rS   r  rt  )r{   native_nontensor_types_sanitize_valuer   r+   r,   r    s   
z3CodeGenerator.visit_Assign.<locals>._sanitize_valuer"   r   )rQ   r   r  rn  r  r   r   rC  r   r   r{   r  )r   rg   r  rn  r   r+   r  r,   r     s   zCodeGenerator.visit_Assignc                 C   sN   t |j}t |_t||j|j}tj	|jg|d}| 
| | 
|S )Nr  )rW  deepcopyrn  r   Loadr   BinOpopr{   r   r   )r   rg   lhsrhsassignr+   r+   r,   r     s   


zCodeGenerator.visit_AugAssignc                 C   s"   t |jtju r|jS | |jS rP   )r)   r   r   r   r   r"  r   r+   r+   r,   r     s   zCodeGenerator.visit_Namec                 C   rc  rP   rd  r   r+   r+   r,   visit_Store  r   zCodeGenerator.visit_Storec                 C   rc  rP   rd  r   r+   r+   r,   
visit_Load  r   zCodeGenerator.visit_Loadc                    s    fdd|j D }t|S )Nc                    r   r+   r   r   r   r+   r,   r4     r   z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)rg  r   r   r~  r+   r   r,   visit_Tuple  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__)	rU   r   r  r&   subrQ   r   r   r   )r   method_namer  r  reverse_method_namer+   r+   r,   _apply_binary_method  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-  formatre   r  )r   rg   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 }| j }i }| }|jrG| j | | | _i | _| |j | j }| j  }| j }g }	|	 D ]`\}
}t
|sVqMt||
 g}t||
 g}||kriqM|	|
 ||
 ||
< ||
 ||
< |df|dffD ]*\}}t||
 t|k}|r||
 j|jksJ d|
 d| d| d||
  qqMt| | @ D ]6}
|
|	v rq||
 }|j}||
 }|j}t|t|k}|r||ksJ d|
 d| d	| d
|	|
 q|||||	fS )N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   rP  rR  r   r   r   rW  r   r   r   rS   r   rQ  r)   rE   keys)r   rg   r   
then_block
else_block	then_defs	then_vals	else_defs	else_valsr[  r(   r{   then_handleselse_handlesdefs
block_name
type_equalthen_valthen_tyelse_valelse_tyr+   r+   r,   visit_then_else_blocks  sf   







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 rP   r+   r2   r(   r  r+   r,   r   @      z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>c                 3   r  rP   r+   r  r  r+   r,   r   E  r  c                    r   r+   rk   r8   )endif_blockr+   r,   r4   P  r   z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                       g | ]} | j qS r+   rw   r  r  r+   r,   r4   Q  r   )r   r   rO  rz  create_cond_branchrG  r  r  r   create_branchr   r  get_typeadd_argumentrP  r   r   rI  )r   condrg   srr   ip_blockr  r  r[  r  r  then_helse_hr3   res_handlesr}   
new_valuesr(   	new_valuer+   )r  r  r  r,   visit_if_top_level0  s>   




z CodeGenerator.visit_if_top_levelc                    s  t | }|\}}|  \}}| j }|jr| j nd }	| ||||	\ }}	}
tfdd|
D }t|
|D ]
\}}| || q;| 	|| | j
dd |D |jd|  | j  t|
dkru| j| |js} }	n|	  | j  t|
dkrt fdd|
D }t|
|D ]
\}}| || q| 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  rP   r+   r  r  r+   r,   r   `  r  z-CodeGenerator.visit_if_scf.<locals>.<genexpr>c                 S   r/   r+   r  r2   hr+   r+   r,   r4   d  r5   z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                 3   r  rP   r+   r  r  r+   r,   r   o  r  c                    r   r+   
get_resultr8   )if_opr+   r,   r4   t  r   c                    r  r+   rw   r  r  r+   r,   r4   u  r   )r   rL  r   rO  r   r  r   r  rH  rM  create_if_oprG  merge_block_beforeget_then_blockrz  r   create_yield_opget_else_blockr   r   rI  )r   r  rg   r  r   r.   rK  last_locr  r  r[  r  r(   rp   r  r  r}   r  r  r+   )r  r  r  r,   visit_if_scfW  sB   



zCodeGenerator.visit_if_scfc              	   C   s  |  |j}t|rXt|r| |d|j r.tdt	
|j  tjj|| j| d}|jtj| jd}t| j |rP| jrH| |d| || d S | || d S t|}t|tvrw| |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)r  
_generatorr  zMCannot have `return` statements inside `while` or `for` statements in triton.O`if` conditionals can only accept values of type {{{}}}, not objects of type {}, c                 s       | ]}|j V  qd S rP   r&  r'  r+   r+   r,   r         z)CodeGenerator.visit_If.<locals>.<genexpr>)r   testrU   r\   r-  r)   rZ   warningswarnr   unparser   rV   _unsplatr  toint1r   r   r  r  r  r   _condition_typesr  rD   re   r   r   rR  )r   rg   r  active_blockr+   r+   r,   r   z  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 )
Nr  zATernary expression with dynamic condition has inconsistent types rw  Tr   r  r   c                 s   r  rP   r&  r'  r+   r+   r,   r     r  z,CodeGenerator.visit_IfExp.<locals>.<genexpr>)$r   r  rU   r  r   r	  r  r   rL  r   rO  rP  rt  r   r   r   rM  r)   rx  to_irr  rG  r  r  rz  r  r  rV   r   r  r   r
  r-  r  rD   re   )r   rg   r  rK  r  r  r  r  r  r   ret_type_irr  r+   r+   r,   r     sT   




$#zCodeGenerator.visit_IfExpc                    sz  t |jdkrC|jd j} |j}|tjkrC fdd|jD }||d ji  	|j
 W d    d S 1 s<w   Y  d S g }|jD ]0}|j} |j} fdd|jD }t fdd|jD }	||d	 ji|	}
||
 qHt||jD ]\}
}|
 }|jd ur |j} || qt j|r |d
 	|j
 t|D ]	}
|
d d d  qd S )Nr"   r   c                    r   r+   r   r2   rk   r   r+   r,   r4     r   z,CodeGenerator.visit_With.<locals>.<listcomp>_builderc                    r   r+   r   r  r   r+   r,   r4     r   c                 3   r   rP   r   )r2   kwr   r+   r,   r     r   z+CodeGenerator.visit_With.<locals>.<genexpr>r  zCCannot have `return` statements inside `with` statements in triton )r   r   context_exprr   r   r   
async_taskri   r   rR  r   dictkeywordsr  rQ  r  r   optional_varsrI  r   r   r-  reversedr   )r   rg   r  withitemClassri   cm_listr   callrh   kwscmresvar_namer+   r   r,   
visit_With  s>   



zCodeGenerator.visit_Withc                 C      d S rP   r+   r   r+   r+   r,   
visit_Pass  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.)r   comparatorsopsr-  r   r  r   r)   r   Isr   IsNot_method_name_for_comp_opr   r  re   r  )r   rg   r  r  	lhs_value	rhs_valuer  r+   r+   r,   visit_Compare  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.r  __not__z)' is not (currently) implemented on type )r   operand_method_name_for_unary_opr   r)   r  r-  re   rU   r   r  AttributeErrorr   )r   rg   r0  rh   r+   r+   r,   visit_UnaryOp  s   zCodeGenerator.visit_UnaryOp__neg____pos__r/  
__invert__r1  c                 C   s   t |sJ d| dt |sJ d| dt|t|u s1J d| dt| dt| t|rK|j|jksMJ d| d|j d|j d	d S d S )
Nzcannot reassign constexpr z in the looprN  z changed type, was z but is now zLoop-carried variable z has initial type z but is re-assigned to z: in loop! Please make sure that the type stays consistent.)rS   r)   rU   )r   r(   r]  r\  r+   r+   r,   rU    s   z+CodeGenerator._verify_loop_carried_variablec                 C   r   rP   )r   r  r   r+   r+   r,   visit_withitem"  r   zCodeGenerator.visit_withitemc                    sh  t }|\}} \}}||\}}}	dd |D }
|| j|
|j |
j fddt	t
|D }t||	}t||D ]\}}|j|< |j|< || qR|j}t|tjr|jrdj  |j}j j|j| j |
 j   fddt	t
|D }t||	}t||D ]\}}|j|< |j|< || qj| |j j   t!fdd|D }j"| W d    n1 sw   Y  fddt	t
|D }t||	}t||D ]\}}|j|< |j|< || q|j#D ]}J d
d S )Nc                 S   r/   r+   r  r  r+   r+   r,   r4   ,  r5   z-CodeGenerator.visit_While.<locals>.<listcomp>c                    r   r+   r  r8   )before_blockr+   r,   r4   2  r   llvm.loop_annotationc                    r   r+   r  r8   )after_blockr+   r,   r4   E  r   c                 3       | ]} j | V  qd S rP   r   r  r   r+   r,   r   O  r   z,CodeGenerator.visit_While.<locals>.<genexpr>c                    r   r+   r  r8   )while_opr+   r,   r4   S  r   FzNot implemented)'r   rL  r`  rM  r   create_while_opcreate_block_with_parent
get_beforerP  r   r   r   r  r   r   rH  r   r  rQ   r   	conditiondisable_licmset_attrget_disable_loop_licm_attrrz  create_condition_oprG  	get_afterr  rQ  rR  r   rS  r   r  r   r   re  r   )r   rg   r  r   r   rK  r  r[  rZ  init_fe_tysrY  
block_argscondition_argsr(   rp   r  body_handles	body_argsyield_handlesresult_handlesresult_valsnew_defrb  r+   )r:  r8  r   r=  r,   visit_While%  sZ   







-



zCodeGenerator.visit_Whilec                 C   sP   t |jtjs	J | |j}| |j}t|r$| ||j	||gi S || S rP   )
rQ   r   r   r  r   r{   slicerS   call_Method__getitem__)r   rg   r  slicesr+   r+   r,   visit_Subscript_Load^  s   z"CodeGenerator.visit_Subscript_Loadc                 C   s   t d)Nz&__setitem__ is not supported in triton)rm  )r   rg   r{   r+   r+   r,   r  f  s   z#CodeGenerator.visit_Subscript_Storec                 C   s
   |  |S rP   )rU  r   r+   r+   r,   visit_Subscripti  rT   zCodeGenerator.visit_Subscriptc                    s    fdd|j D S )Nc                    r   r+   r   )r2   dimr   r+   r,   r4   m  r   z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)dimsr   r+   r   r,   visit_ExtSlicel  s   zCodeGenerator.visit_ExtSlicec           '         s   |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}d}|tju r||i |}|j	}|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(/|}0|jjtj*1|| t2#}|\}}3 \}}4||\}}}5|| j(6|||| t7|	d ur 8dj(9|	 t7|
d ur 8dj(9|
 |rň 8dj(:  |rш 8dj(:  |r݈ 8dj(:  |r 8dj(;  j<=|  >dj(? fddtt|D }t@||} tA|| D ]\}!}"B|"|! 0|!|" q|j j<C  tDfdd|D }#t|#dkrFj(E|# F }$|$G dksUJ dj(?  H }|rpj(I||}j(J||}j|jj j-K| 0|jjtj*1|| B||jj W d    n	1 sw   Y   fddtt|D }%t@|%|}&tA||&D ]\}!}"0|!|" B|"|! q|jD ]}J dd S )Nc                    r   r+   r   r  r   r+   r,   r4   q  r   z+CodeGenerator.visit_For.<locals>.<listcomp>c                 3   r   rP   r   r2   keywordr   r+   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   r  ztt.num_stagesztt.loop_unroll_factorztt.disallow_acc_multi_bufferz
tt.flattenztt.warp_specializer9  c                    s   g | ]	}  |d  qS )r"   r  r8   )for_op_bodyr+   r,   r4         c                 3   r;  rP   r<  r  r   r+   r,   r     r   z7We use SCF, so the loop body should only have one blockc                    r   r+   r  r8   )for_opr+   r,   r4     r   z)Don't know what to do with else after for)Lr   rk  r   ri   r  r  r   static_ranger   startr{   endstepr   r   rn  r   rR  r   r   r   re  r   
num_stagesloop_unroll_factordisallow_acc_multi_bufferflattenwarp_specializerB  r   NumRuntimeErrorrX   r  rt  rW   is_intry  integer_promote_implr  r   int_signednessrV   
SIGNEDNESSSIGNEDrG  create_int_castr  rI  r   r   rL  r`  rM  create_for_opr   rC  get_int32_attrget_unit_attrrD  r  rQ  get_bodyrP  r   r  rH  rS  r   r  
get_parentsizeget_induction_var
create_sub
create_addreplace_all_uses_with)'r   rg   IteratorClass	iter_argsiter_kwargsiteratorr_  r9   rb  rc  rd  re  rf  rg  rB  lbubrb  negative_stepiv_type
iv_ir_typeiv_is_signedivr  r   r   rK  r  r[  rZ  rY  block_handlesrH  r(   rp   rL  for_op_regionrM  result_valuesr+   )r^  r\  r   r,   	visit_Foro  s   


$&&
$"


3

zCodeGenerator.visit_Forc                 C   s2   |  |j}|  |j}|  |j}t|||S rP   )r   lowerupperrb  r   rQ  )r   rg   r  r  rb  r+   r+   r,   visit_Slice  s   zCodeGenerator.visit_Slicec                 C   r   rP   )r   r{   r   r+   r+   r,   visit_Index  r   zCodeGenerator.visit_Indexc                 C   s   |j | |jfS rP   )rk   r   r{   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  r  )r   r  msgr   rV   device_assertr  )r   rg   r  r  r+   r+   r,   visit_Assert  s   zCodeGenerator.visit_Assertrh   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 }	|pW| j}tt|d	d |	D ||}
| j|
st|\}}d
d  D }tg ||t }t| j|| | 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t01 D }t2t3||gS )Nc                    s   g | ]} | qS r+   r+   r  r   r+   r,   r4     r5   z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s   t |S rP   rX   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 rP   r  r  r+   r+   r,   r     s   
 c                    s   g | ]}t  |qS r+   r  r   r   r+   r,   r4     r   c                 S   rv   r+   rw   r  r+   r+   r,   r4     rx   c                 S   s6   g | ]}|d u st |tttjjfrtjjn|jqS rP   )rQ   r   rr  r   rV   rW   r   r)   r  r+   r+   r,   r4     s    )r  r	  r  r  rb   r  r  r  r  r  rH   r  c                    r   r+   r  r8   )call_opr+   r,   r4   1  r   )4inspectgetcallargsrh   rf   rc   rQ   r   rW   rs  rr  r   r   rV   r   r   rH   rL   r   r  has_functionr   r   r  r  r  get_capture_scoper  rb   r   r  r  r  r  r   parse	Exceptionr   r8  front_end_debuggingr#   r	  rd   r  r   get_functionr   r  rx  r   get_num_resultsnextr   )r   rh   ri   r   rH   r9   rk   args_cst	args_pathargs_valfn_namer  r  r   r  r   ecallee_ret_typesymbolr   r+   )ri   r  r,   call_JitFunction  sV   


zCodeGenerator.call_JitFunctionc           
   
   C   sv  t |ttfr|d|j |j}t |tr#t||| | |||S t	|dr-t
|js8tj|s8t |trt }t |trGt|j}nt|}d|jv rV| j|d< d|jv r_| |d< z||i ||}t |trst|}|W S  ty } ztjjr t| jj|t||d }~ww || j v rt t!|}||i |}dd }	t |t"jtjfrt#||	S |	|S )Nr   r   r  r  c                 S   s   t | r| S t| S rP   )rS   r   )r   r+   r+   r,   wrap_constexpr\  s   z3CodeGenerator.call_Function.<locals>.wrap_constexpr)$rQ   r   r   insertr   r  r   rl   r  ro   rS   r   rV   
is_builtinr   r  r  	signature__call__
parametersr  r   r  r   r8  r  r#   r	  rd   rA  r(  r   mapr   builtinsr~   )
r   rg   rh   ri   r  extra_kwargssigrK   r  r  r+   r+   r,   call_Function4  sF   
"








zCodeGenerator.call_Functionc                 C   s&   t |tr|d| | ||||S r   )rQ   r   r  r  )r   rg   rh   fn_selfri   r  r+   r+   r,   rR  e  s   
zCodeGenerator.call_Methodc                    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 } ||||S )N_must_use_resultF
_is_unusedz#The result of %s is not being used.r6  c                 3   r   rP   r   rZ  r   r+   r,   r   x  r   z+CodeGenerator.visit_Call.<locals>.<genexpr>c                    r   r+   r   r  r   r+   r,   r4   y  r   z,CodeGenerator.visit_Call.<locals>.<listcomp>c                 s   s$    | ]}t |tr|n|gV  qd S rP   )rQ   r^   r   r+   r+   r,   r   z  s   " )r   r   r   rQ   r    statically_implemented_functionsr   r   r   r  rA  rQ  r#   r	  rd   rD   r  r  ri   r^   	itertoolschainfrom_iterabler  )r   rg   rh   static_implementationmurerror_messager  ri   r+   r   r,   r   j  s   



zCodeGenerator.visit_Callc                 C   s
   t |jS rP   )r   r{   r   r+   r+   r,   visit_Constant~  rT   zCodeGenerator.visit_Constantc              	   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-  r  re   r   r   rU   r   rZ   r   r  r  warn_explicitUserWarningr  r   r  rQ  r   rS  r  )r   rg   r  nontrivial_valuessubnoder{   bvr  r  r  r  r+   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vr#|j}t||j}t	|r7t|t
r7t||S |S )NT)r"   r   )r{   r)   )r   r{   rU   r   r  permuterQ   r   r   rS   r   r   )r   rg   r  r   r+   r+   r,   r     s   
zCodeGenerator.visit_Attributec                 C   s   d|j _tj| | d S r   )r{   r  r   re  r   r   r+   r+   r,   
visit_Expr  s   zCodeGenerator.visit_Exprc                 C   r  rP   r+   r   r+   r+   r,   visit_NoneType  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  )r^   r   rc   rQ   r   ConstantrA  r{   FormattedValue
conversionr   rX   r-  r)   chrr  AssertionErrorrD   )r   rg   r   r9   r{   conversion_code	evaluatedr+   r+   r,   visit_JoinedStr  s"   

*
zCodeGenerator.visit_JoinedStrc                    sD  |d u rd S t   t dt t dt | j}| j }|| _t|drWt|drW| j	| j
| j|j |j}| jd urL| j| j| j| n| j| | j }zt |}W n$ tyg     ty } ztjjrs t| jj| jt|d d }~ww |r|| _| j| |W  d    S 1 sw   Y  d S )Nignorer  
col_offset)r  catch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr  r   rF  ro   
create_locr  r  r  r  r  r  rE  superr   r#   r  r   r8  r  r	  rd   r7   )r   rg   	last_noder  here_locrK   r  	__class__r+   r,   r     s:   



$zCodeGenerator.visitc                 C   s   |  |dt|j)Nzunsupported AST node type: {})r-  r  r)   re   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: >)r   ri   r  ry  r   r   rQ   r   rm  r  r7   r$   r	  rd   )r   rg   	arg_countpassedr,  r  r+   r+   r,   execute_static_assert  s*   


z#CodeGenerator.execute_static_assertc                    s   dt jf fdd}|S )Nrg   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   )r2   r(   r{   r+   r+   r,   r     s    z>CodeGenerator.static_executor.<locals>.ret.<locals>.<dictcomp>c                 3   r   rP   r   rZ  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,   r4     r]  z>CodeGenerator.static_executor.<locals>.ret.<locals>.<listcomp>)r  ri   r   )r   rg   r  ri   	python_fnr   r,   rK     s
   z*CodeGenerator.static_executor.<locals>.ret)r   r   )r  rK   r+   r  r,   static_executor  s   zCodeGenerator.static_executorr   )r   r  rP   )re   r   r   r   r   r   rA  r   r   r^   r   rs  rr  rQ   r   ro   r(  r   r  updater   rV   device_printminimummaximumr-  r0  r!  
contextlibcontextmanagerrC  rH  r
   r   r   rI  rL  rM  r`  rR  r   rh  r   ListComprq  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  r  r   r   r  r   r(  EqNotEqLtLtEGtGtEr%  cmpopr3  USubUAddNotInvertr1  unaryoprU  r7  rP  rU  r  rV  rY  r  r  r  r   r  r  r  r  rR  r   r  BoolOpr  AndOrr  boolopr   r  r  r  r   r   r   r  r  experimental.gluonttglstatic_assertstatic_printr)  r  r.  r   __classcell__r+   r+   r  r,   r  '  s   
 

?
3
		(8
9'#5$
9 11&4#
(r  c                    sb  d gt  j }tj }t|d\}	}
tj D ](\}\}} j|}d }|	d ur>|	d |kr>|
}t|d\}	}
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  st| td|S )N)NNr   )
namedtuplec                 S   s   t | dkS rY   )r   )rt   r+   r+   r,   r   ?  s    zast_to_ttir.<locals>.<lambda>c                    s"   i | ]} j |d   j| qS )r   )rf   r;   r8   rh   rd   r+   r,   r   @  r<   zast_to_ttir.<locals>.<dictcomp>SpecializationProxyr;   r  T)r   r  r	  r  r  r  r  r  r  r  r  z error encountered during parsing)r   rf   rk  r;   r   r  rc   r  indexr   r   r   r   collectionsr  filterr  r  r7   r  r   r  r  r  verify_with_diagnosticsr)  ri  )rh   rd   r  r  r  r  r  r   
const_iterkcvcr9   ksrt   rj   cexprr  r  r  r  leavesr;   r  proxyr   r+   r  r,   ast_to_ttir/  s:   
r!  rP   )Or   r  r  rW  r  r&   r  r;  r  dataclassesr   r}   r   typingr   r   r   r   r   r	   r
   r   r   r  r   r   _C.libtritonr   r   r   r   r   r   rl  language.corer   r   r   runtime.jitr   r   r   r   r   r   _utilsr   r    r!   errorsr#   r$   r%   r-   rL   r   rS   rU   rX   r\   r_   rl   rq   r~   r   r{   r   rr  r)   r
  r   r   r   re  r   r   r   r  r!  r+   r+   r+   r,   <module>   sf    , 
W:          