o
    iY                    @   sH  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.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"ee# fd#d$Z?d%eej@ d&ee$ fd'd(ZAe7eBeCdhZDd)d* ZEd+d, ZFG d-d. d.ZGG d/d0 d0e jHZIG d1d2 d2ZJe	d3d4G d5d6 d6ZKG d7d8 d8e jHZLd;d9d:ZMd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is_namedtuple   )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,   ]/home/ubuntu/Irodori-TTS/.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r3   i	constantsr,   r-   r5   "      " ._d_'_sq_[]__)joinsortedreplacer1   )r)   arg_tysr<   caller_contextmangled_arg_namesmangled_constantsretr,   r;   r-   	mangle_fn   s   rM   oreturnc                 C   
   t | tS N)
isinstancer   rN   r,   r,   r-   _is_triton_value-      
rT   c                 C   rP   rQ   )rR   r   rS   r,   r,   r-   _is_triton_tensor1   rU   rV   c                 C   s   | d u pt | ttjjtfS rQ   )rR   r   r   coredtyper   rS   r,   r,   r-   _is_constexpr5   s   rY   c                 C   s   t | o| j o| jjdkS Nr#   )rV   r*   is_blocknumelrS   r,   r,   r-   _is_non_scalar_tensor9   s   r]   c                 C   s   t | ttfS rQ   )rR   listr   rS   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	enumeraterY   r]   r&   src__name__	arg_names)nodefnargsidxargr,   r,   r-   _check_fn_argsA   s   rl   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,   r3   vrh   r,   r-   r5   S   r6   z*_apply_to_tuple_values.<locals>.<listcomp>c                 S   s    g | ]}|d u rt |n|qS rQ   )r   rn   r,   r,   r-   r5   T   s     c                 S      g | ]}|j qS r,   r*   rn   r,   r,   r-   r5   U       )r"   r*   _fieldsrR   r   r   fields
tuple_type)valuerh   ru   valstypesr,   rp   r-   _apply_to_tuple_valuesK   s   
rz   valuesc                 C   s   g }| D ]}| | q|S rQ   )_flatten_ir)r{   handlesro   r,   r,   r-   flatten_values_to_irY   s   r~   r}   ry   c                 c   s:    d}|D ]}| | |\}}|V  q|t| ksJ d S Nr   )_unflatten_irlen)r}   ry   cursorr4   rw   r,   r,   r-   unflatten_ir_values`   s   r   c                 C   s$   g }|  | | j|d\}}|S r   )r|   r*   r   )valr}   cloner/   r,   r,   r-   _clone_triton_valuek   s   
r   c                 C   s   dd |   D S )Nc                 S   s&   i | ]\}}|t |rt|n|qS r,   )rT   r   )r3   r)   r   r,   r,   r-   
<dictcomp>s   s   & z _clone_scope.<locals>.<dictcomp>)items)scoper,   r,   r-   _clone_scoper      r   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )enter_sub_regionc                 C   
   || _ d S rQ   )	generator)selfr   r,   r,   r-   __init__x   rU   zenter_sub_region.__init__c                 C   sL   t | jj| _t | jj| _i | j_| jj | _| jj	 | _
| j| jfS rQ   )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 rQ   )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   v   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   rQ   )gscope)r   r   r,   r,   r-   r      rU   zContainsReturnChecker.__init__rO   c                    s   t  fdd|D S )Nc                 3       | ]}  |V  qd S rQ   visit)r3   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_fieldsrR   r^   ASTr   )r   rg   rL   r/   rw   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   )
rR   rw   r   Nameidr   getattrattrr   r   )r   rg   rw   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 rQ   r   r   r   r,   r,   r-   visit_Module      z"ContainsReturnChecker.visit_Modulec                 C   r   rQ   r   r   r,   r,   r-   visit_FunctionDef   r   z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |  |j}|jr|p|  |j}|S rQ   )r   r   orelse)r   rg   rL   r,   r,   r-   visit_If   s   zContainsReturnChecker.visit_Ifc                 C   s   |  |jp|  |jS rQ   )r   r   r   r   r,   r,   r-   visit_IfExp      z!ContainsReturnChecker.visit_IfExpc                 C   r   rQ   )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 rQ   )	ret_types	arg_typesr<   attrs)r   r   r   r<   r   r,   r,   r-   r      s   
zASTFunction.__init__r   ry   rO   c                 C   s(   g }|D ]}|d u rq| || q|S rQ   )_flatten_ir_types)r   r   ry   ir_typesr4   r,   r,   r-   flatten_ir_types   s   zASTFunction.flatten_ir_typesc                 C   s   |  || jS rQ   )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 rQ   r;   pathr/   r   r,   r-   <lambda>   rs   z'ASTFunction.serialize.<locals>.<lambda>c                    s   g | ]}t  j|qS r,   )r    r   r3   r   r   r,   r-   r5          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                    rm   r,   r,   r3   xmake_templater,   r-   r5     r6   zBASTFunction.deserialize.<locals>.make_template.<locals>.<listcomp>)rR   r^   r   r   rv   r   )r4   r   r,   r-   r     s   
z.ASTFunction.deserialize.<locals>.make_templatec                    r   rQ   r;   r   r   r,   r-   r     rs   z)ASTFunction.deserialize.<locals>.<lambda>r   c                       g | ]}  |qS r,   ri   r9   rp   r,   r-   r5         z+ASTFunction.deserialize.<locals>.<listcomp>)r   r^   r   rangeget_num_argsr    r   getset_arg_attrr   r!   r<   r   r   r   )r   rh   rx   r   r   r   r}   r   r4   
attr_specs	attr_nameattr_valr   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                       sH  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jfdej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%e& fd#e&e fd$d%Z'd&d' Z(d(d) Z)d*d+ Z*d,e+j,fd-d.Z-d/d0 Z.d1d2 Z/d3d4 Z0d5d6 Z1d7d8 Z2d9d: Z3d;d< Z4d=d> Z5d?d@ Z6dAdB Z7dCdD Z8dEdF Z9dGdH Z:dIdJ Z;e+j<dKe+j=dLe+j>dMe+j?dNe+j@dOe+jAdPe+jBdQe+jCdRe+jDdSe+jEdTe+jFdUe+jGdViZHeeIe+jJ ef edW< dXdY ZKdZd[ ZLd\d] ZMd^d_ ZNd`da ZOdbdc ZPddde ZQdfdg ZRe+jSdhe+jTdie+jUdje+jVdke+jWdle+jXdmiZYeeIe+jZ ef edn< dodp Z[e+j\dqe+j]dre+j^dse+j_dtiZ`eeIe+ja ef edu< dvdw Zbdxdy Zcdzd{ Zdd|d} Zed~d Zfdd Zgdd Zhdd Zidd Zjdekeef fddZldefddZmddefddZndd Zodd Zpdd Zqdd Zrd,e+jsfddZte+jude+jvdiZweeIe+jx ef ed< dd Zydd 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   rI   	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   rR   r   r   re   r   r   r  rfindr.   function_namer  cur_noderb   rI   	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   rI   r  r  r  r  kro   module_namer,   r,   r-   r   $  sX   




zCodeGenerator.__init__c                 C   s   i | ]}|j |qS r,   re   r3   r/   r,   r,   r-   r   c  s    zCodeGenerator.<dictcomp>builtin_namespaceprintminmaxc                 C   s   t | jj||S rQ   )r&   r  rd   )r   rg   messager,   r,   r-   _unsupportedm  s   zCodeGenerator._unsupportedc                 C   s0   t  }| j||}||u rdS t|rdS dS )NFT)objectr   r   rY   )r   r)   absent_markerr   r,   r,   r-   _is_constexpr_globalp  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 rQ   )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   rR   r   r   
startswithr   rX   r"   r-  r   r   compilationallow_non_constexpr_globals	NameErrortextwrapdedentrG   )r)   r.  r   r   r,   r-   global_lookup  s.   



z8CodeGenerator._define_name_lookup.<locals>.global_lookuprO   c                    s@    }j jfD ]}|| |}||ur|  S q	t|  d)Nz is not defined)r%  r   r7  )r)   r.  lookup_functionrw   r,  r:  r/  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 rQ   )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 rQ   )
rR   r   rw   block_argumentr  r   create_name_locget_locrT   r|   )r   r   r)   r}   handler,   r,   r-   _maybe_set_loc_to_name  s   
z$CodeGenerator._maybe_set_loc_to_namer)   rw   rO   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)   rw   r,   r,   r-   	set_value  s   
zCodeGenerator.set_valuec                 C   s   | j  }| j  }||fS rQ   )r   rC  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 rQ   )r   r   r  )r   rH  rG  r,   r,   r-   _set_insertion_point_and_loc  s   z*CodeGenerator._set_insertion_point_and_locignorec                 C   s   | j  }| j | | j| | |j | j  |  g }g }g }|	 D ]E\}}	||v r3q*t
|	rb| j| }
| ||
|	 t|	g}t|
g}||kra|| ||	j || q*|| jvsoJ 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   rT   r   _verify_loop_carried_variabler~   r*   extendr   copy)r   rg   r   rK  blockinit_tysinit_handlesnamesr)   live_valloop_vallive_handlesloop_handlesr,   r,   r-   _find_carries  s4   








zCodeGenerator._find_carriesc                 C   s8   t |s|g}|D ]}| | t|tjr d S q	d S rQ   )r_   r   rR   r   r   )r   stmtsstmtr,   r,   r-   rP    s   
z&CodeGenerator.visit_compound_statementc                 C      t j| | d S rQ   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   )r3   eltr   r,   r-   r5     r   z,CodeGenerator.visit_List.<locals>.<listcomp>)r   r   r   r   elts)r   rg   r   re  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   iterrR   tl_tupleNotImplementedErrorrF  targetr   rO  rd  )r   rg   compri  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 rQ   )	rR   r   r   rz   r   intfloatr  	to_tensor)rw   decayr   r,   r-   rt  %  s
   
z)CodeGenerator.visit_Return.<locals>.decayzInconsistent return types:  and )r   rw   r   voidrR   rW   r   r|   r*   r   rL   r  	TypeErrorrM  set_insertion_point_to_end)r   rg   	ret_valuer}   ret_typost_ret_blockr,   rs  r-   r   !  s    



zCodeGenerator.visit_Returnc              	      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   targetsrw   )rl  rw   
annotationTFpublicprivatec                    s   g | ]} j |qS r,   )r   create_poisonr2   r   r,   r-   r5   q  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   rI   initialize_calleeziprE  rF  r   rN  rP  r   has_terminatorr  r   rv  rL   rR   rv   ry   r   
reset_typer   finalizerx  )r   rg   rf   kwarg_namesr:   default_valuearg_noder  r)   	st_target	init_node
visibilityfn_tyentry
arg_valuesarg_name	arg_value	insert_ptr,   r   r-   r   ?  sV   



$
zCodeGenerator.visit_FunctionDefc                 C   s4   g }|j D ]
}|| |g7 }q| |j}||fS rQ   )ri   r   kwarg)r   rg   rf   rk   r  r,   r,   r-   visit_argumentsw  s
   
zCodeGenerator.visit_argumentsc                    sX   t j|   t fdd| jjD }|jr)|js|jr)t	| jj
  j d jS )Nc                 3   s     | ]}|j  jkr|V  qd S rQ   )r)   rk   )r3   prg   r,   r-   r     s    z*CodeGenerator.visit_arg.<locals>.<genexpr>z marked as constexpr and listed in do_not_specialize/do_not_specialize_on_alignment. Remove constexpr designation to skip specialization.)r   rc  r   nextr  paramsis_constexprdo_not_specializedo_not_specialize_on_alignmentr$   rd   rk   )r   rg   paramr,   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  rl  rw   r   r   rh  r   )r   rg   r  rl  rw   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)rR   r   r   r   	Subscriptvisit_Subscript_Storer   rc   re  assignTargetr{   r   rk  r   rF  r   )r   rl  rw   r:   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 rQ   )	rR   r   r   rz   rX   r   rT   r  rr  )rw   native_nontensor_types_sanitize_valuer   r,   r-   r    s   
z3CodeGenerator.visit_Assign.<locals>._sanitize_valuer#   r   )rR   r   r  rl  r~  r   r   r@  r   r   rw   r  )r   rg   r~  rl  r{   r,   r  r-   r     s   zCodeGenerator.visit_Assignc                 C   s   t |j}t |_t||j|j}tj	|jg|d}dD ]}t
||r7t||}t||| t||| q| | | |S )Nr}  )lineno
col_offset
end_linenoend_col_offset)rU  deepcopyrl  r   Loadr   BinOpoprw   r   hasattrr   setattrr   )r   rg   lhsrhsassignr   yr,   r,   r-   r     s   




zCodeGenerator.visit_AugAssignc                 C   s"   t |jtju r|jS | |jS rQ   )r*   r   r   r   r   r  r   r,   r,   r-   r     s   zCodeGenerator.visit_Namec                 C   ra  rQ   rb  r   r,   r,   r-   visit_Store  r   zCodeGenerator.visit_Storec                 C   ra  rQ   rb  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-   r5     r   z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)re  r   r   )r   rg   ri   r,   r   r-   visit_Tuple  s   
zCodeGenerator.visit_Tuplec                 C   s   t |rt|||| jdS t |r#tdd|}t|||| jdS t|ttjfs4t|tr4t|}t|tr?t||}n| 	||}| 
|||gi S )N	_semanticz__(.*)__z__r\1__)rV   r   r  r'   subrR   r   r   r   get_Attributecall_Function)r   rg   method_namer  r  reverse_method_namerh   r,   r,   r-   _apply_binary_method  s   
z"CodeGenerator._apply_binary_methodc                 C   sX   |  |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   rN  rP  r   r   r   rU  r   r   r   rT   r~   rO  r*   rF   keys)r   rg   r   
then_block
else_block	then_defs	then_vals	else_defs	else_valsrY  r)   rw   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 rQ   r,   r3   r)   r  r,   r-   r   H      z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>c                 3   r  rQ   r,   r  r  r,   r-   r   M  r  c                    r   r,   rk   r9   )endif_blockr,   r-   r5   X  r   z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                       g | ]} | j qS r,   rr   r  r  r,   r-   r5   Y  r   )r   r   rM  rx  create_cond_branchrD  r  r  r~   create_branchr   r  get_typeadd_argumentrN  r   r   rF  )r   condrg   srr   ip_blockr  r  rY  r  r  then_helse_hr4   res_handlesry   
new_valuesr)   	new_valuer,   )r  r  r  r-   visit_if_top_level8  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  rQ   r,   r  r  r,   r-   r   h  r  z-CodeGenerator.visit_if_scf.<locals>.<genexpr>c                 S   r0   r,   r  r3   hr,   r,   r-   r5   l  r6   z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                 3   r  rQ   r,   r  r  r,   r-   r   w  r  c                    r   r,   
get_resultr9   )if_opr,   r-   r5   |  r   c                    r  r,   rr   r  r  r,   r-   r5   }  r   )r   rI  r   rM  r   r  r~   r  rE  rJ  create_if_oprD  merge_block_beforeget_then_blockrx  r   create_yield_opget_else_blockr   r   rF  )r   r  rg   r  r   r/   rH  last_locr  r  rY  r  r)   r   r  r  ry   r  r  r,   )r  r  r  r-   visit_if_scf_  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 rQ   r#  r$  r,   r,   r-   r         z)CodeGenerator.visit_If.<locals>.<genexpr>)r   testrV   r]   r*  r*   r[   warningswarnr   unparser   rW   _unsplatr  toint1r   r   r  r  r
  r   _condition_typesr  rE   re   r   r   rP  )r   rg   r  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 )
Nr  zATernary expression with dynamic condition has inconsistent types ru  Tr   r  r  c                 s   r  rQ   r#  r$  r,   r,   r-   r     r  z,CodeGenerator.visit_IfExp.<locals>.<genexpr>)$r   r  rV   r  r   r  r  r   rI  r   rM  rN  rr  r   r   r   rJ  r*   rv  to_irr  rD  r  r  rx  r  r  rW   r   r  r   r  r*  r  rE   re   )r   rg   r  rH  r	  r  r  r  r  r  ret_type_irr  r,   r,   r-   r     sT   




$#zCodeGenerator.visit_IfExpc                    s   g }|j D ]0}|j} |j} fdd|jD }t fdd|jD }||d ji|}|| qt	||j D ]\}}|
 }	|jd urU |j}
 |
|	 q<t j|rd |d |j t|D ]	}|d d d  qnd S )Nc                    r   r,   r   r3   rk   r   r,   r-   r5     r   z,CodeGenerator.visit_With.<locals>.<listcomp>c                 3   r   rQ   r   )r3   kwr   r,   r-   r     r   z+CodeGenerator.visit_With.<locals>.<genexpr>r  zCCannot have `return` statements inside `with` statements in triton )r   context_exprr   r   ri   dictkeywordsr  rO  r  r   optional_varsrF  r   r   r*  rP  r   reversedr   )r   rg   cm_listr   callrh   ri   kwscmresvar_namer,   r   r-   
visit_With  s(   

zCodeGenerator.visit_Withc                 C      d S rQ   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   rV   r   r  AttributeErrorr   )r   rg   r:  rh   r,   r,   r-   visit_UnaryOp  s   zCodeGenerator.visit_UnaryOp__neg____pos__r9  
__invert__r;  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 looprL  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.)rT   r*   rV   )r   r)   r[  rZ  r,   r,   r-   rS    s   z+CodeGenerator._verify_loop_carried_variablec                    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   r0   r,   r  r  r,   r,   r-   r5   (  r6   z-CodeGenerator.visit_While.<locals>.<listcomp>c                    r   r,   r  r9   )before_blockr,   r-   r5   .  r   llvm.loop_annotationc                    r   r,   r  r9   )after_blockr,   r-   r5   A  r   c                 3       | ]} j | V  qd S rQ   r   r  r   r,   r-   r   K  r   z,CodeGenerator.visit_While.<locals>.<genexpr>c                    r   r,   r  r9   )while_opr,   r-   r5   O  r   FzNot implemented)'r   rI  r^  rJ  r   create_while_opcreate_block_with_parent
get_beforerN  r   r   r   r  r   r   rE  r   r  rR   r   	conditiondisable_licmset_attrget_disable_loop_licm_attrrx  create_condition_oprD  	get_afterr  rO  rP  r   rQ  r~   r  r   r   rc  r   )r   rg   r  r   r   rH  r	  rY  rX  init_fe_tysrW  
block_argscondition_argsr)   r   r  body_handles	body_argsyield_handlesresult_handlesresult_valsnew_defr`  r,   )rC  rA  r   rF  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 rQ   )
rR   r   r   r  r   rw   slicerT   call_Method__getitem__)r   rg   r  slicesr,   r,   r-   visit_Subscript_LoadZ  s   z"CodeGenerator.visit_Subscript_Loadc                 C   s   t d)Nz&__setitem__ is not supported in triton)rk  )r   rg   rw   r,   r,   r-   r  b  s   z#CodeGenerator.visit_Subscript_Storec                 C   s
   |  |S rQ   )r^  r   r,   r,   r-   visit_Subscripte  rU   zCodeGenerator.visit_Subscriptc                    s    fdd|j D S )Nc                    r   r,   r   )r3   dimr   r,   r-   r5   i  r   z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)dimsr   r,   r   r-   visit_ExtSliceh  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t&|r(t%d|j' t&|r5t%d|j' t&|rBt%d|j' j!(|j#|j#}j!(||j#}|)j*}|j+tj,j#j-j.k}|j/}|j/}|j/}j*0|||}j*0|||}j*0|||}j*1|}2|jjtj,3|| t4"}|\}}5 \}}j6|||jjhd\}}}7|| j*8|||| t9|	d urԈ :dj*;|	 t9|
d ur :dj*;|
 |r :dj*<  |r :dj*<  |r	 :dj*<  |r :dj*=  j>?|  @dj*A fddtt|D }tB||} tC|| D ]\}!}"D|"|! 2|!|" q=|j j>E  tFfdd|D }#t|#dkrrj*G|# H }$|$I dksJ dj*A  J }%|rj*K||%}%j*L|%|}%|M|% 2|jjtj,3|%| D|%|jj W d    n	1 sw   Y   fddtt|D }&tB|&|}'tC||'D ]\}!}"2|!|" D|"|! q|jD ]}J dd S )Nc                    r   r,   r   r  r   r,   r-   r5   m  r   z+CodeGenerator.visit_For.<locals>.<listcomp>c                 3   r   rQ   r   r3   keywordr   r,   r-   r   n  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&For lower bound must be a scalar, got z&For upper bound must be a scalar, got zFor step must be a scalar, got )rK  ztt.num_stagesztt.loop_unroll_factorztt.disallow_acc_multi_bufferz
tt.flattenztt.warp_specializerB  c                    s   g | ]	}  |d  qS )r#   r  r9   )for_op_bodyr,   r-   r5         c                 3   rD  rQ   rE  r  r   r,   r-   r     r   z7We use SCF, so the loop body should only have one blockc                    r   r,   r  r9   )for_opr,   r-   r5     r   z)Don't know what to do with else after for)Nr   ri  r   ri   r  r  r   static_ranger   startrw   endstepr   r   rl  r   rP  r   r   r   rc  r   
num_stagesloop_unroll_factordisallow_acc_multi_bufferflattenwarp_specializerK  r   ConstantRuntimeErrorrY   r  rr  rX   is_intrw  r]   r*   integer_promote_implr  r   int_signednessrW   
SIGNEDNESSSIGNEDrD  create_int_castr  rF  r   r   rI  r^  rJ  create_for_opr   rL  get_int32_attrget_unit_attrrM  r  rO  get_bodyrN  r   r  rE  rQ  r~   r  
get_parentsizeget_induction_var
create_sub
create_addreplace_all_uses_with)(r   rg   IteratorClass	iter_argsiter_kwargsiteratorrh  r:   r`  rl  rm  rn  ro  rp  rK  lbubrk  negative_stepiv_type
iv_ir_typeiv_is_signediv_placeholderr  r   r   rH  r	  rY  rX  rW  block_handlesrQ  r)   r   rU  for_op_regionivrV  result_valuesr,   )rg  re  r   r-   	visit_Fork  s   


$&&
$"






3

zCodeGenerator.visit_Forc                 C   s2   |  |j}|  |j}|  |j}t|||S rQ   )r   lowerupperrk  r   rZ  )r   rg   r  r  rk  r,   r,   r-   visit_Slice  s   zCodeGenerator.visit_Slicec                 C   r   rQ   )r   rw   r   r,   r,   r-   visit_Index  r   zCodeGenerator.visit_Indexc                 C   s   |j | |jfS rQ   )rk   r   rw   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   rW   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-   r5     r6   z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s   t |S rQ   rY   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 rQ   r  r  r,   r,   r-   r     s   
 c                    s   g | ]}t  |qS r,   r  r   r   r,   r-   r5     r   c                 S   rq   r,   rr   r  r,   r,   r-   r5     rs   c                 S   s6   g | ]}|d u st |tttjjfrtjjn|jqS rQ   )rR   r   rp  r   rW   rX   r   r*   r  r,   r,   r-   r5     s    )r  r  r  r  rb   r  r  r  r  r  rI   r  c                    r   r,   r  r9   )call_opr,   r-   r5   3  r   )4inspectgetcallargsrh   rf   rc   rR   r   rX   rq  rp  r   r   rW   r   r   rI   rM   r   r  has_functionr   r   r  r   r  get_capture_scoper  rb   r   r  r  r  r  r   parse	Exceptionr   r5  front_end_debuggingr$   r  rd   r  r  get_functionr~   r#  rv  r   get_num_resultsr  r   )r   rh   ri   r   rI   r:   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   s  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 st	|drt
|jst 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 rQ   )rT   r   )r   r,   r,   r-   wrap_constexpr^  s   z3CodeGenerator.call_Function.<locals>.wrap_constexpr)$rR   r   r   insertr   r   r   rl   r  r  rT   r   rW   
is_builtinr   r  r  	signature__call__
parametersr  r   r  r   r5  r  r$   r  rd   r>  r%  r{   mapr   builtinsrz   )
r   rg   rh   ri   r$  extra_kwargssigrL   r  r  r,   r,   r-   r  6  sF   
"






"

zCodeGenerator.call_Functionc                 C   s&   t |tr|d| | ||||S r   )rR   r   r  r  )r   rg   rh   fn_selfri   r$  r,   r,   r-   r[  g  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 }g }|jD ]&}t|tjrw |j}t|tjjspJ ||j qY| | qY ||||S )N_must_use_resultF
_is_unusedz#The result of %s is not being used.r3  c                 3   r   rQ   r   rc  r   r,   r-   r   z  r   z+CodeGenerator.visit_Call.<locals>.<genexpr>)r   r   r   rR   r    statically_implemented_functionsr   r   r   r  r>  rO  r$   r  rd   rE   r  r  ri   Starredrw   r   rW   r   rT  r{   r  )	r   rg   rh   static_implementationmurerror_messager$  ri   rk   r,   r   r-   r   l  s(   




zCodeGenerator.visit_Callc                 C   s
   t |jS rQ   )r   rw   r   r,   r,   r-   visit_Constant  rU   zCodeGenerator.visit_Constantc              	   C   sJ  | 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_orr  zeLogical 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   rV   r   r[   r   r  r  warn_explicitUserWarningr  r   r  rO  r   rQ  r  )r   rg   r  nontrivial_valuessubnoderw   bvr  r  r  r&  r,   r,   r-   visit_BoolOp  sJ   





zCodeGenerator.visit_BoolOpr  r  r  c                 C   s`   t |r|dkr| j|dS t|tr|dvr|j}t||}t|r.t|tr.t	||S |S )NT)r#   r   )rw   r*   )
rV   r  permuterR   r   rw   r   rT   r   r   )r   r  r   r,   r,   r-   r    s   

zCodeGenerator.get_Attributec                 C   s`   |  |j}t|tr)|j }| jjv r)| jj| }|j|kr n	|j }| jjv s| ||jS rQ   )	r   rw   rR   r   re   r   r  r  r   )r   rg   r  r)   r,   r,   r-   r     s   

zCodeGenerator.visit_Attributec                 C   s   d|j _tj| | d S r   )rw   r  r   rc  r   r   r,   r,   r-   
visit_Expr  s   zCodeGenerator.visit_Exprc                 C   r)  rQ   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   rR   r   rq  r>  rw   FormattedValue
conversionr   rY   r*  r*   chrr  AssertionErrorrE   )r   rg   r{   r:   rw   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 )NrK  r  r  )r  catch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr  r   rC  r  
create_locr  r  r  r  r  r  rB  superr   r$   r  r   r5  r  r  rd   r8   )r   rg   	last_noder	  here_locrL   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  rw  r   r   rR   r   rk  r  r8   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   )r3   r)   rw   r,   r,   r-   r   ,  s    z>CodeGenerator.static_executor.<locals>.ret.<locals>.<dictcomp>c                 3   r   rQ   r   rc  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-   r5   0  rf  z>CodeGenerator.static_executor.<locals>.ret.<locals>.<listcomp>)r  ri   r   )r   rg   r$  ri   	python_fnr   r-   rL   +  s
   z*CodeGenerator.static_executor.<locals>.ret)r   r   )r  rL   r,   r  r-   static_executor)  s   zCodeGenerator.static_executorr   )r   r  rQ   )re   r   r   r   r   r   r>  r   r   r^   r   rq  rp  rR   r   r  r%  r   r   updater   rW   device_printbuiltin_minbuiltin_maxr*  r-  r  
contextlibcontextmanagerr@  rE  r
   r   r   rF  rI  rJ  setr^  rP  r   rf  r   ListCompro  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*  r2  EqNotEqLtLtEGtGtEr/  cmpopr=  USubUAddNotInvertr;  unaryoprS  rY  r^  r  r_  rb  r  r  r  r   r  r  r  r  r[  r   r  BoolOpr  AndOrr  boolopr  r   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                    sN  d gt j }j D ]\}}	j|}
t|	d ||
< q fdd j D ]\}} |t|d d d | 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 )Nc                    sX   |  }t|dkr"t| trt|j| |< d S t|j| j|< d S  | | || d S r   )rQ  r   rR   r^   r   r*   ry   )argumentindicesrw   index)apply_constexpr_typesr,   r-   r  G  s   
z*ast_to_ttir.<locals>.apply_constexpr_typesr|  r   )
namedtuplec                 S   s   t | dkS rZ   )r   )ro   r,   r,   r-   r   X  s    zast_to_ttir.<locals>.<lambda>c                    s"   i | ]} j |d   j| qS )r   )rf   r<   r9   )rh   rd   r,   r-   r   Y  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   r  r   r  r   r<   r^   r   r   r   collectionsr  filterr   r  r8   r  r   r  r  r  verifyr&  rr  )rh   rd   r  r  r  r  r  r   r!  ro   rj   r   rw   r  r  r  r  leavesr<   r  proxyr   r,   )r  rh   rd   r-   ast_to_ttir@  s4   

r!  rQ   )Nr   r  r  rU  r  r'   r  r8  dataclassesr   ry   r   typingr   r   r   r   r   r	   r
   r   r   r	  r   r   _C.libtritonr   r   r   r   r   r   rj  language.corer   r   r   runtime.jitr   r   r   r   r   r   _utilsr   r    r!   r"   errorsr$   r%   r&   r.   rM   r   rT   rV   rY   r]   r_   rl   rz   r~   rw   r   rp  r*   r  r   r   r   rc  r   r   r   r   r!  r,   r,   r,   r-   <module>   sb    , 
W:          (