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mZmZmZm	Z	m
Z
mZmZ ddlmZ ddlmZ ddlmZmZ ddlmZ dd	lmZmZmZ d
d Zdd ZdedefddZdedefddZdedefddZdefddZdd Z dd Z!ee"e#dhZ$G dd dZ%G dd de j&Z'G d d! d!e j&Z(d"d# Z)d$d% Z*d&d' Z+dS )(    N)AnyCallableDictOptionalTupleTypeUnion   )language)ir)	constexprtensor)JITFunction   )CompilationErrorCompileTimeAssertionFailureUnsupportedLanguageConstructc                 C   s   |   rdt| j S |  r$tjjj}| j|krdnd}|t	| j
 S |  r*dS |  r0dS |  r6dS |  r<dS |  rBdS |  r\t| j}d	tt	| j}| d
| d
S |  rbdS J d)NPiuZfp8fp16bf16fp32fp64_SVFzUnsupported type)Zis_ptr	mangle_tyZ
element_tyis_intr
   dtype
SIGNEDNESSSIGNEDint_signednessstrZint_bitwidthZis_fp8Zis_fp16Zis_bf16Zis_fp32Zis_fp64is_blockZscalarjoinmapshapeZis_void)tyr!   prefixeltr'    r+   m/var/www/html/eduruby.in/lip-sync/lip-sync-env/lib/python3.10/site-packages/triton/compiler/code_generator.pyr      s.   

r   c                    st   d dd |D }d  fddt D }|dd}|dd}|d	dd
d}|  d| d| }|S )Nr   c                 S   s   g | ]}t |qS r+   )r   .0r(   r+   r+   r,   
<listcomp>-       zmangle_fn.<locals>.<listcomp>c                    s"   g | ]}| d t  |  qS )c)reprr.   r   	constantsr+   r,   r/   .   s   " .Z_d_'Z_sq_[]__)r%   sortedreplace)nameZarg_tysr5   Zmangled_arg_namesZmangled_constantsretr+   r4   r,   	mangle_fn+   s   r?   oreturnc                 C   
   t | tS N)
isinstancer   r@   r+   r+   r,   _is_triton_tensor7      
rF   c                 C   rB   rC   )rD   r   rE   r+   r+   r,   _is_constexpr;   rG   rH   c                 C   s    t | o| j  p| jjdkS )Nr   )rF   typer$   ZnumelrE   r+   r+   r,   _is_triton_scalar?   s    rJ   c                 C   s   t | tr| jS | S rC   )rD   r   valuerE   r+   r+   r,   _unwrap_if_constexprC      rL   c              
   C   sX   |j r(t|D ]"\}}t|s't|s'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	enumeraterH   rJ   r   src__name__	arg_names)nodefnargsidxargr+   r+   r,   _check_fn_argsG   s   (rY   c                 C   sj   | }t |ts|j}t |tr|jjj}t|j\}}|D ]}| dr,|d7 }q ||fS ||fS )N@r   )	rD   r   rU   __code__co_filenameinspectgetsourcelinesstrip
startswith)rU   Zbase_fn	file_namelines
begin_lineliner+   r+   r,   _get_fn_file_lineN   s   



re   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )enter_sub_regionc                 C   
   || _ d S rC   )	generator)selfrh   r+   r+   r,   __init__`   rG   zenter_sub_region.__init__c                 C   sL   | j j | _| j j | _i | j _| j j | _| j j	 | _
| j| jfS rC   )rh   lscopecopyliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_pointri   r+   r+   r,   	__enter__c   s   zenter_sub_region.__enter__c                 O   s(   | j j| j | j| j _| j| j _d S rC   )rh   rp   restore_insertion_pointrt   rm   rk   ro   rn   )ri   rV   kwargsr+   r+   r,   __exit__l   s   
zenter_sub_region.__exit__N)rR   
__module____qualname__rj   rv   ry   r+   r+   r+   r,   rf   _   s    	rf   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   rg   rC   )gscope)ri   r}   r+   r+   r,   rj   t   rG   zContainsReturnChecker.__init__rA   c                 C   s   |D ]
}|  |r dS qdS )NTFvisit)ri   bodysr+   r+   r,   _visit_stmtsw   s
   
z"ContainsReturnChecker._visit_stmtsc                 C   s,   t |tr|js| }t| j|S dS NF)rD   r   rO   parser|   r}   r   )ri   rU   Zfn_noder+   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_fieldsrD   listASTr   )ri   rT   r>   r   rK   itemr+   r+   r,   generic_visit   s   
z#ContainsReturnChecker.generic_visitrT   c                 C   sP   t |jtjr"|jj| jv r | j|jj }t||j}| |S dS | 	|jS r   )
rD   rK   r   Nameidr}   getattrattrr   r   )ri   rT   rK   rU   r+   r+   r,   visit_Attribute   s   
z%ContainsReturnChecker.visit_Attributec                 C   s:   t |jtjkr
dS |j| jv r| j|j }| |S dS r   )rI   ctxr   Storer   r}   r   )ri   rT   rU   r+   r+   r,   
visit_Name   s   
z ContainsReturnChecker.visit_Namec                 C      dS )NTr+   ri   rT   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 rC   r   r   r   r+   r+   r,   visit_Module      z"ContainsReturnChecker.visit_Modulec                 C   r   rC   r   r   r+   r+   r,   visit_FunctionDef   r   z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |  |j}|jr|p|  |j}|S rC   )r   r   orelse)ri   rT   r>   r+   r+   r,   visit_If   s   zContainsReturnChecker.visit_Ifc                 C   s   |  |jp|  |jS rC   )r   r   r   r   r+   r+   r,   visit_IfExp      z!ContainsReturnChecker.visit_IfExpc                 C   r   rC   )r   funcr   r+   r+   r,   
visit_Call   r   z ContainsReturnChecker.visit_CallN)rR   rz   r{   rj   boolr   r   r   r   	Attributer   r   r   Returnr   Assignr   	AugAssignr   Moduler   FunctionDefr   Ifr   IfExpr   Callr   r+   r+   r+   r,   r|   s   s    r|   c                       s  e Zd ZU 		ddee dee fddZdd	 eee	e
efD Zeeef ed
< edejjfdejff dd Z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 d! Zd"d# Z d$d% Z!d&d' Z"d(d) Z#d*d+ Z$d,d- Z%d.d/ Z&d0d1 Z'd2d3 Z(d4d5 Z)d6d7 Z*e+j,d8e+j-d9e+j.d:e+j/d;e+j0d<e+j1d=e+j2d>e+j3d?e+j4d@e+j5dAe+j6dBe+j7dCiZ8ee9e+j: ef edD< dEdF Z;dGdH Z<dIdJ Z=dKdL Z>dMdN Z?dOdP Z@dQdR ZAe+jBdSe+jCdTe+jDdUe+jEdVe+jFdWe+jGdXiZHee9e+jI ef edY< dZd[ ZJe+jKd\e+jLd]e+jMd^e+jNd_iZOee9e+jP ef ed`< dadb ZQdcdd ZRdedf ZSdgdh ZTdidj ZUdkdl ZVdeWeef fdmdnZXdefdodpZYdqeZfdrdsZ[dtdu Z\dvdw Z]dxe+j^fdydzZ_e+j`d{e+jad|iZbee9e+jc ef ed}< edjed~k rdd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zl fddZmdd Zndxe+joddfddZpdxe+joddfddZqejjreqejjsepiZteeueve+jogef f ed<   ZwS )CodeGeneratorNFr   function_typesra   c                 C   s   || _ t|| _|| _|d | _| j||d || j_|d u r&| j n|| _|
d u r/i n|
| _	|| _
|| _t | _|| _|| _|| _|	| _d | _|| _|| _g | _d | _i | _i | _|  | _d S )Nr   r   )contextr   rp   ra   rc   set_locarchcreate_modulemodulefunction_ret_types	prototyper}   dictrk   
attributesr5   function_name	is_kernel	last_nodedebugrO   	scf_stacklast_ret_typern   global_uses_define_name_lookupdereference_name)ri   r   r   r}   r   r5   r   r   r   r   r   r   rO   ra   rc   r+   r+   r,   rj      s.   
zCodeGenerator.__init__c                 C   s   i | ]}|j |qS r+   rR   r.   r   r+   r+   r,   
<dictcomp>   r0   zCodeGenerator.<dictcomp>builtin_namespaceprintminc                    s6   dt ffddt  dt dtf fdd}|S )Nr=   c                    s.    j | |}||ur|  jvr| j| < |S rC   )rk   getrn   r   )r=   absentrK   ru   r+   r,   local_lookup   s   
z7CodeGenerator._define_name_lookup.<locals>.local_lookuprA   c                    sD    }j jjjfD ]}|| |}||ur|  S qt|  d)Nz is not defined)r}   r   r   	NameError)r=   r   Zlookup_functionrK   Zabsent_markerr   ri   r+   r,   name_lookup   s   
z6CodeGenerator._define_name_lookup.<locals>.name_lookup)r#   objectr   )ri   r   r+   r   r,   r      s   z!CodeGenerator._define_name_lookupr=   rK   rA   c                 C   s   || j |< || j|< dS )z This function:
            called by visit_Assign() & visit_FunctionDef() to store left value (lvalue)
        1. record local defined name (FIXME: should consider control flow)
        2. store tensor in self.lvalue
        N)rk   rn   )ri   r=   rK   r+   r+   r,   	set_value  s   
zCodeGenerator.set_valuec                 C   s   | j  }| j  }||fS rC   )rp   get_locrs   )ri   locipr+   r+   r,   _get_insertion_point_and_loc  s   

z*CodeGenerator._get_insertion_point_and_locc                 C   s   | j | | j | d S rC   )rp   rw   r   )ri   r   r   r+   r+   r,   _set_insertion_point_and_loc  s   z*CodeGenerator._set_insertion_point_and_locc                 C   s2   |D ]}|  |}|d urt|tjr|| _qd S rC   )r   rD   r   r   r   )ri   ZstmtsstmtZret_typer+   r+   r,   visit_compound_statement  s   
z&CodeGenerator.visit_compound_statementc                 C      t j| | d S rC   r   NodeVisitorr   r   r+   r+   r,   r   $     zCodeGenerator.visit_Modulec                    s0     |j}|d u sJ  fdd|jD }|S )Nc                       g | ]}  |qS r+   r~   )r.   r*   ru   r+   r,   r/   *      z,CodeGenerator.visit_List.<locals>.<listcomp>)r   r   elts)ri   rT   r   r   r+   ru   r,   
visit_List'  s   zCodeGenerator.visit_Listc                    s     |j}|d u r jg  d }|S t|tr: fdd|D }dd |D } jdd |D  t|}|S tj| j} j|j	g |j
}|S )Nc                    s   g | ]
}t j| jqS r+   )r
   core
_to_tensorrp   r.   vru   r+   r,   r/   8      z.CodeGenerator.visit_Return.<locals>.<listcomp>c                 S      g | ]}|j qS r+   rI   r   r+   r+   r,   r/   9      c                 S   r   r+   handler   r+   r+   r,   r/   :  r   )r   rK   rp   r>   rD   tupler
   r   r   r   rI   )ri   rT   Z	ret_valueZret_tyZ
ret_values	ret_typesr>   r+   ru   r,   r   .  s   
zCodeGenerator.visit_Returnc                 C   s0  |  |j\}}t|jjD ]6\}}|jj| d  }|j}|j}tj|t d}	|d u r7tj	|	g|d}
ntj
|	||d}
|  |
 q| jrJdnd}| j| j| j| j| j|| j}| j| | }g }d}t|D ]C\}}|| jv r| j| }t|st| j| }|| qp|| jv r||d| j| d  |t||| jj|  |d7 }qp| j }t||D ]
\}}| || q| j | | !|j" | j#d u r| j$g  n(t%| j#t&rt'| j#| j_(|)| j| j n| j#g| j_(|)| j| j |r| j*| |+  d S )	Nr   r   r   targetsrK   )targetrK   
annotationpublicprivater   ztt.divisibility),r   rV   rP   defaultsr   rX   r   r   r   r   	AnnAssignr   rp   Zget_or_insert_functionr   r   r   to_irrO   Z	push_backZadd_entry_blockr5   rH   r   appendr   Zset_arg_attrr   Zparam_typesrq   zipr   set_insertion_point_to_startr   r   r   r>   rD   r   r   r   Z
reset_typeset_insertion_point_to_endfinalize)ri   rT   rS   kwarg_namesr   default_valueZarg_noder   r=   Z	st_targetZ	init_nodeZ
visibilityrU   entryZ
arg_valuesrW   Zarg_nameZcstZ	insert_pt	arg_valuer+   r+   r,   r   D  sT   $






zCodeGenerator.visit_FunctionDefc                 C   s4   g }|j D ]
}|| |g7 }q| |j}||fS rC   )rV   r   kwarg)ri   rT   rS   rX   r   r+   r+   r,   visit_arguments{  s
   
zCodeGenerator.visit_argumentsc                 C   s   t j| | |jS rC   )r   r   r   rX   r   r+   r+   r,   	visit_arg  s   zCodeGenerator.visit_argc                 C   sr   |  |j}|  |j}|  |j}|tkr4|| jv r"t| dt|s*t|}|| j|< | j| S | |S )Nz4 is already defined. constexpr cannot be reassigned.)	r   r   r   rK   r   rk   
ValueErrorrH   r   )ri   rT   r   r   rK   r+   r+   r,   visit_AnnAssign  s   



zCodeGenerator.visit_AnnAssignc           	      C   s   g }|j D ]
}|| |g7 }qt|dkrtd |d|d }| |j}t|ts.|g}t|ts6|g}tjf}t	||D ]#\}}t
|}|d ur\t|s\t||s\tj|| j}| || q?d S )Nr   z2simultaneous multiple assignment is not supported.r   )r   r   lenr   rK   rD   r   r
   r   r   rL   rF   r   r   rp   r   )	ri   rT   Z_namesr   namesvaluesZnative_nontensor_typesr=   rK   r+   r+   r,   r     s,   


zCodeGenerator.visit_Assignc                 C   sR   |j j}tj|t d}t||j|j}tj|j g|d}| 	| | 
|S )Nr   r   )r   r   r   r   LoadBinOpoprK   r   r   r   )ri   rT   r=   lhsrhsZassignr+   r+   r,   r     s   

zCodeGenerator.visit_AugAssignc                 C   s"   t |jtjkr|jS | |jS rC   )rI   r   r   r   r   r   r   r+   r+   r,   r     s   zCodeGenerator.visit_Namec                 C   r   rC   r   r   r+   r+   r,   visit_Store  r   zCodeGenerator.visit_Storec                 C   r   rC   r   r   r+   r+   r,   
visit_Load  r   zCodeGenerator.visit_Loadc                    s    fdd|j D }t|S )Nc                    r   r+   r~   )r.   xru   r+   r,   r/     r   z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)r   r   )ri   rT   rV   r+   ru   r,   visit_Tuple  s   zCodeGenerator.visit_Tuplec                 C   sT   t |rt|||| jdS t |r#tdd|}t|||| jdS t|||S )NZ_builderz__(.*)__z__r\1__)rF   r   rp   resub)ri   method_namer  r  Zreverse_method_namer+   r+   r,   _apply_binary_method  s   z"CodeGenerator._apply_binary_methodc                 C   sV   |  |j}|  |j}| jt|j}|d u r$td |d|jj	| 
|||S )Nz8AST binary operator '{}' is not (currently) implemented.)r   leftright_method_name_for_bin_opr   rI   r
  r   formatrR   r  ri   rT   r  r  r  r+   r+   r,   visit_BinOp  s   zCodeGenerator.visit_BinOp__add____sub____mul____truediv____floordiv____mod____pow__
__lshift__
__rshift____and____or____xor__r  c                 C   s  | j | | |j | j  }| j }i }|jr9| j | | | _i | _| |j | j }| j  }g }g }g }	|D ]}
|df|dffD ](\}}|
|v rs||
 j	||
 j	kssJ d|
 d||
 j	 d| d||
 j	 qK|
|v s||
|v r|
|
 |
|
|v r||
 j	n||
 j	 |	
|
|v r||
 j n||
 j  |
|v r|
|vr||
 ||
< |
|v r|
|vr||
 ||
< qA| | @ D ]7}
|
|v rq||
 j	}||
 j	}||ksJ d|
 d| d	| d
|
|
 |
| |	
||
 j  q|||||||	fS )NZthenelsezinitial value for `z` is of type z
, but the z block redefines it as zmismatched type for z between then block (z) and else block ())rp   r   r   r   rq   rn   rl   r   rk   rI   r   r   get_typekeys)ri   rT   rm   
then_block
else_block	then_defs	else_defsr  r   ir_ret_typesr=   ZdefsZ
block_nameZthen_tyZelse_tyr+   r+   r,   visit_then_else_blocks  sb   





"*




z$CodeGenerator.visit_then_else_blocksc                    sx  d}t | }|\}}| j }| j }| j }	| j| | j|j|| | ||||\ }}}
}}| j| | rL| rLd}|	  |	 s`|r`| j
|	fdd|
D  | j| |	 sz|rz| j
|	 fdd|
D  |r|D ]}|	| q~W d    n1 sw   Y  |r| j|	 t|
D ]\}}tj|	||| }| || qd S d S )NTFc                       g | ]} | j qS r+   r   r.   nr.  r+   r,   r/   $  r   z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                    r2  r+   r   r3  r/  r+   r,   r/   (  r   )rf   rp   create_blockr   Zcreate_cond_branchr   r1  Z
has_returneraseZhas_terminatorZcreate_branchadd_argumentr   rP   r
   r   r   rX   r   )ri   condrT   Zhas_endif_blocksrrm   Zip_blockr,  r-  Zendif_blockr  r   r0  r(   r   r=   
new_tensorr+   )r/  r.  r,   visit_if_top_level  s>   



z CodeGenerator.visit_if_top_levelc                    sv  t }|\}} \}}j }|jrj nd }	||||	\ }}	}
}}|| jfdd|D |jd}|	|
  j|
  t|
dkrejfdd|
D  |jsm| }	n|		|  j|  t|
dkrj fdd|
D  W d    n1 sw   Y  t|
D ]\}}tj|||| }|| qd S )Nc                       g | ]}|  jqS r+   r   rp   r-   ru   r+   r,   r/   ?      z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                    r2  r+   r   r3  r5  r+   r,   r/   C  r   c                    r2  r+   r   r3  r6  r+   r,   r/   J  r   )rf   r   rp   r7  r   r1  r   Zcreate_if_opr   Zmerge_block_beforeZget_then_blockr   r  create_yield_opZget_else_blockrP   r
   r   r   
get_resultr   )ri   r:  rT   r;  rm   r   r   last_locr,  r-  r  r   Zif_opr   r=   r<  r+   )r/  ri   r.  r,   visit_if_scf5  s2   

 
zCodeGenerator.visit_if_scfc              	   C   s   |  |j}t|r;|jtj| jd}t| j |}| j	r&|r&t
d |d| j	s+|s3| || d S | || d S t|}t|tvrZt
d |dddd tD t|j|rd| |j d S | |j d S )Nr  zCannot have `return` statements inside `while` or `for` statements in triton (note that this also applies to `return` statements that are inside functions transitively called from within `while`/`for` statements)zO`if` conditionals can only accept values of type {{{}}}, not objects of type {}, c                 s   s    | ]}|j V  qd S rC   r   r   r+   r+   r,   	<genexpr>d  s    z)CodeGenerator.visit_If.<locals>.<genexpr>)r   testrF   tor
   int1rp   r|   r}   r   r   rD  r=  rL   rI   _condition_typesr  r%   rR   r   r   r   )ri   rT   r:  Zcontains_returnr+   r+   r,   r   P  s,   

zCodeGenerator.visit_Ifc                 C   sF   |  |j}t|r|jtj| jd}t|r|  |jS |  |j	S Nr  )
r   rG  rF   rH  r
   rI  rp   rL   r   r   )ri   rT   r:  r+   r+   r,   r   j  s   zCodeGenerator.visit_IfExpc                 C      d S rC   r+   r   r+   r+   r,   
visit_Passs  r   zCodeGenerator.visit_Passc                 C   s   t |jdkrt |jdkstd |d| |j}| |jd }t|}t|}t|jd tj	kr:t
||u S t|jd tjkrJt
||uS | jt|jd }|d u rftd |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  rL   rI   r   Isr   IsNot_method_name_for_comp_opr   r  rR   r  )ri   rT   r  r  	lhs_value	rhs_valuer  r+   r+   r,   visit_Comparev  s   zCodeGenerator.visit_Compare__eq____ne____lt____le____gt____ge__rR  c                 C   sb   |  |j}| jt|j}|d u rtd |d|jjt	|r+t
||| jdS t
|| S )Nz7AST unary operator '{}' is not (currently) implemented.r  )r   operand_method_name_for_unary_opr   rI   r
  r   r  rR   rF   r   rp   )ri   rT   r
  rU   r+   r+   r,   visit_UnaryOp  s   zCodeGenerator.visit_UnaryOp__neg____pos____not__
__invert__r]  c                    s  t K}|\}} \}}j }j| j| |j j	  j
}|  g }	g }
g }|D ]6}||v rqt|| sIJ t|| sQJ || j|| jks]J |	| |
|| j |||  q;|| jfdd|
D dd |D }j| fdd|
D  j  t|	D ]\}}tj ||
| j|< j| j
|< q|j}j  j|j fddtt|D  j| fdd|
D }j| t|	D ]\}}tj|||
| j|< j| j
|< qj| |j j	  j
}g }|D ]}||v r<|||  q.j dd |D  W d    n	1 sTw   Y  t|	D ]\}}tj|!||
| }|j|< |j
|< q]|j"D ]}J d	d S )
Nc                    r>  r+   r?  r-   ru   r+   r,   r/     r@  z-CodeGenerator.visit_While.<locals>.<listcomp>c                 S   r   r+   r   r.   rX   r+   r+   r,   r/     r   c                    r>  r+   r?  r-   ru   r+   r,   r/     r@  c                    r   r+   )rX   r3   )before_blockr+   r,   r/     r   c                    r>  r+   r?  r-   ru   r+   r,   r/     r@  c                 S   r   r+   r   r.   yr+   r+   r,   r/     r   FzNot implemented)&rf   r   rp   r7  r   r   r   r   r   poprn   r8  rF   rI   r   Zcreate_while_opZcreate_block_with_parentZ
get_beforerP   r
   r   r   rX   rk   r   rG  r   Zcreate_condition_opr   ranger  Z	get_afterrA  rB  r   r   r   r   )ri   rT   r;  rm   rr   r   rC  dummyZ	loop_defsr  r   	init_argsr=   Zwhile_opr   r:  Zafter_blockyieldsZnew_defr   r+   )rd  ri   r,   visit_While  sz   


&

?

zCodeGenerator.visit_Whilec                 C   sJ   |j jjdks	J | |j}| |j}t|r!|j|| jdS || S )Nr  r  )	r   	__class__rR   r   rK   slicerF   __getitem__rp   )ri   rT   r  Zslicesr+   r+   r,   visit_Subscript  s   zCodeGenerator.visit_Subscriptc                    s    fdd|j D S )Nc                    r   r+   r~   )r.   dimru   r+   r,   r/     r   z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)dimsr   r+   ru   r,   visit_ExtSlice  rM   zCodeGenerator.visit_ExtSlicec                    s    |jj} fdd|jjD }|tjkrJ|| }t|jj|j	j|j
j}|D ]}t| j|jj<  |j |jD ]	}tj | q=q)d S |turRtdt|dkr\|d n  td}t|dkrn|d n  |jjd }	t|dkr|d n  td}
d}t|
r|
jdk rt|
j }
d}|	|}}	tj| j}tj|	 j}	tj|
 j}
|j r|	j r|
j std	|j d
|	j d
|
j dtj |j|	j}tj ||
j}|! j}|j"tjjj#j$k}|j%}|	j%}	|
j%}
 j&|||} j&|	||}	 j&|
||}
 j'|} (|jjtj)|| t* a}|\}} + \}} j, } j-|  j./|  |j  j.0  |1  g }g }g } j2D ]a}||v rt3 j2| s|J | dt3|| sJ  j2| j4|| j4ksJ d| d|| j4 d j2| j4 d|/| |/tj||  j |/tj j2|  j qf 5||  j6||	|
dd |D } j./|  j-|7d t8|D ]\}} (|tj)|7d9|d || j4 q |j  j.0  g } j2D ]}||v r0|/tj j2|  j qt|dkrD j:dd |D  |7d; }|< dksVJ d j-|7d |= }|rt j>|	|} j?||} j|jj j%@|  (|jjtj)|| W d    n	1 sw   Y  t8|D ]\}} (|tj)|A||| j4 q|jD ]}J dd S )Nc                    r   r+   r~   rc  ru   r+   r,   r/     r   z+CodeGenerator.visit_For.<locals>.<listcomp>zAOnly `range` and `static_range` iterators are currently supportedr   r   r	   FTz0For loop bounds and step must all be ints, are (rE  r)  z is not tensorzLoop-carried variable z has initial type z but is re-assigned to z: in loop! Please make sure that the type stays consistent.c                 S   r   r+   r   rc  r+   r+   r,   r/   <  r   c                 S   r   r+   r   re  r+   r+   r,   r/   K  r   z7We use SCF, so the loop body should only have one blockz)Don't know what to do with else after for)Br   iterr   rV   r
   static_rangerh  startrK   endstepr   rk   r   r   r   r   r   r   r   r   RuntimeErrorr  NumrH   r   r   rp   r   r   	TypeErrorsemanticZinteger_promote_implr   r"   r    r!   r   Zcreate_int_castZcreate_undefr   r   rf   r   r7  r   r   r   rg  r8  rn   rF   rI   r   Zcreate_for_opget_bodyrP   rX   rA  Z
get_parentsizeZget_induction_varZ
create_subZ
create_addZreplace_all_uses_withrB  )ri   rT   ZIteratorClassZ	iter_argsiteratorru  r   r   ZlbZubrx  Znegative_stepZiv_typeZ
iv_ir_typeZiv_is_signedZivr;  rm   rr   r   rC  blockrj  rk  r  r=   Zfor_opZfor_op_regionr+   ru   r,   	visit_For  s   

$&$
"





0


>&
zCodeGenerator.visit_Forc                 C   s0   |  |j}|  |j}|  |j}t|||S rC   )r   lowerupperrx  rn  )ri   rT   r  r  rx  r+   r+   r,   visit_Slice`  s   zCodeGenerator.visit_Slicec                 C   r   rC   )r   rK   r   r+   r+   r,   visit_Indexf  r   zCodeGenerator.visit_Indexc                 C   s   |j | |jfS rC   )rX   r   rK   r   r+   r+   r,   visit_keywordi  r   zCodeGenerator.visit_keywordc                 C   s6   | j sd S | |j}| |j}tjj||| jdS rK  )r   r   rG  msgr
   r   device_assertrp   )ri   rT   rG  r  r+   r+   r,   visit_Assertl  s
   zCodeGenerator.visit_AssertrU   c                    s  t j|jg R i |  fdd|jD  dd  D  t }dd t D  fddD }fddt D  dd  D }d	d  D }t|j||}| j	|st
g |}	tj|jj j}
|jd u ro| jn|j}t|\}}t| j|	|
||| j|| j||j||| jjd
}||  |j}|| j|< n| j| }| j|}| j||}| dks|d u rd S | dkrt|d|S g }t | D ]}|!t||||  qt"|S )Nc                    s   g | ]} | qS r+   r+   )r.   r=   rV   r+   r,   r/   v  r0   z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s    g | ]}t |r
|nt|qS r+   )rF   r   rc  r+   r+   r,   r/   w  s
    c                 S   s   g | ]
\}}t |r|qS r+   )rH   r.   r   rX   r+   r+   r,   r/   {  r   c                    s   i | ]}| | qS r+   r+   r3   r  r+   r,   r   |  r   z2CodeGenerator.call_JitFunction.<locals>.<dictcomp>c                    s    g | ]\}}| v rd n|qS rC   r+   r  )
constexprsr+   r,   r/   ~       c                 S      g | ]	}|d ur|j qS rC   r   rc  r+   r+   r,   r/         c                 S   r  rC   r   rc  r+   r+   r,   r/     r  )r   r   r   r   rO   ra   rc   r   r   r   )#r]   getcallargsrU   rS   r   rP   r?   rR   r   Zhas_functionr
   function_typesysmodulesrz   __dict__r   re   r   r   r   rO   rp   r   r   r   r   Zget_functioncallZget_num_resultsr   rB  rh  r   r   )ri   rU   rV   rx   r   r5   arg_vals	arg_typesfn_namer   r}   r   ra   rc   rh   Zcallee_ret_typesymbolZcall_opresultsr   r+   )rV   r  r,   call_JitFunctiont  sF   

zCodeGenerator.call_JitFunctionc                    s  t  |j} j|}|d ur| |S t fdd|jD } fdd|jD }|tj	j
u r8 js8d S t|trJt|||  |||S t|drTt|jsZtj	|rwt jd}t|}d|jv rn |d< ||i ||S | j v rtt |}||i |S )Nc                 3       | ]}  |V  qd S rC   r~   r.   keywordru   r+   r,   rF        z+CodeGenerator.visit_Call.<locals>.<genexpr>c                    r   r+   r~   rc  ru   r+   r,   r/     r   z,CodeGenerator.visit_Call.<locals>.<listcomp>__self__r  Z
_generator)rL   r   r    statically_implemented_functionsr   r   keywordsrV   r
   r   r  r   rD   r   rY   r  hasattrrF   r  
is_builtinrp   r]   	signature
parametersr   r  r&   )ri   rT   rU   Zstatic_implementationkwsrV   extra_kwargssigr+   ru   r,   r     s*   

 


zCodeGenerator.visit_Callc                 C   
   t |jS rC   r   rK   r   r+   r+   r,   visit_Constant  rG   zCodeGenerator.visit_ConstantrT   c                 C   sx   t |jdkrtd |d| |jd }| |jd }| jt|j}|d u r5td |d|jj	| 
|||S )Nr	   z^chained boolean operators (A or B or C) are not supported; use parentheses to split the chain.r   r   z9AST boolean operator '{}' is not (currently) implemented.)r  r  r   r   _method_name_for_bool_opr   rI   r
  r  rR   r  r  r+   r+   r,   visit_BoolOp  s   zCodeGenerator.visit_BoolOplogical_and
logical_orr  )      c                 C   r  rC   r  r   r+   r+   r,   visit_NameConstant  rG   z CodeGenerator.visit_NameConstantc                 C   r  rC   )r   r4  r   r+   r+   r,   	visit_Num  rG   zCodeGenerator.visit_Numc                 C   s   t t|S rC   )r   r   literal_evalr   r+   r+   r,   	visit_Str  s   zCodeGenerator.visit_Strc                 C   s<   |  |j}t|r|jdkrtjj|| jdS t||jS )NT)rp   )	r   rK   rF   r   r
   r|  Ztransrp   r   )ri   rT   r  r+   r+   r,   r     s
   
zCodeGenerator.visit_Attributec                 C   r   rC   r   r   r+   r+   r,   
visit_Expr  r   zCodeGenerator.visit_Exprc                 C   rL  rC   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:td |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 node )r   r  rP   rD   r   Constantr#   rK   FormattedValue
conversionr   rH   r   rI   chrr  AssertionErrorr%   )ri   rT   r  r   rK   Zconversion_codeZ	evaluatedr+   r+   r,   visit_JoinedStr  s   
*
zCodeGenerator.visit_JoinedStrc                    s   |d u rd S t  I t dt t dt || _| j }t|dr<t|dr<| j	| j
| j|j |j | j }t |}|rJ| j	| |W  d    S 1 sVw   Y  d S )Nignorelineno
col_offset)warningscatch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr   rp   r   r  r   ra   rc   r  r  superr   )ri   rT   rC  r>   rm  r+   r,   r     s   


$zCodeGenerator.visitc                 C   s   t d |dt|j)Nzunsupported AST node type: {})r   r  rI   rR   r   r+   r+   r,   r     r   zCodeGenerator.generic_visitc                    sD   dd  fdd|j D D } fdd|jD }t|i | d S )Nc                 S   s   i | ]	\}}|t |qS r+   )rL   )r.   r=   rK   r+   r+   r,   r     r  z6CodeGenerator.execute_static_print.<locals>.<dictcomp>c                 3   r  rC   r~   r  ru   r+   r,   rF    r  z5CodeGenerator.execute_static_print.<locals>.<genexpr>c                    s   g | ]	}t  |qS r+   )rL   r   rc  ru   r+   r,   r/     r  z6CodeGenerator.execute_static_print.<locals>.<listcomp>)r  rV   r   )ri   rT   r  rV   r+   ru   r,   execute_static_print  s   z"CodeGenerator.execute_static_printc              
   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|sf|dkr9d}n%z
| |jd }W n t	y] } zdt
| d }W Y d }~nd }~ww td |t|d S )	Nr   r	   z=`static_assert` requires one or two positional arguments onlyzqAssertion condition could not be determined at compile-time. Make sure that it depends only on `constexpr` valuesr   r  z'<failed to evaluate assertion message: >)r  rV   r  r{  rL   r   rD   r   NotImplementedError	Exceptionr2   r   )ri   rT   	arg_countZpassedmessageer+   r+   r,   execute_static_assert	  s&   


z#CodeGenerator.execute_static_assertr  )NFNFFNr   )xrR   rz   r{   r   r   r#   rj   rh  floatintrD   r   r   r   __annotations__updater
   r   Zdevice_printminimumr   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r   r  r  r  r  r  r   AddSubMultDivFloorDivModPowLShiftRShiftBitAndBitOrBitXorr  r   operatorr1  r=  rD  r   r   rM  rU  EqNotEqLtLtEGtGtErR  cmpopr^  USubUAddNotInvertr]  unaryoprl  rp  rs  r  r  r  r   r  r  r   r  r   r  BoolOpr  AndOrr  boolopr  version_infor  r  r  r   r  r  r  r   r   r   r  r  Zstatic_assertZstatic_printr  r   r   __classcell__r+   r+   r  r,   r      s   
 
(



7	6%	$2Iy*&	(r   c                 C   s   | d dkrt | dd  }t|S i dtjdtjdtjdtjdtjd	tjd
tj	dtj
dtjdtjdtjdtjdtjdtjdtjdtjdtj
}||  S )Nr   *r   Zfp8e4Zfp8e5Zfp8e4b15r   r   r   r   i1i8Zi16Zi32Zi64u8u16u32Zu64B)	str_to_tyr
   Zpointer_typeZfloat8e4Zfloat8e5Zfloat8e4b15Zfloat16Zbfloat16Zfloat32Zfloat64rI  Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64)r=   r(   tysr+   r+   r,   r  #  sN   
	
r  c                 C   sJ   d}t | D ]\}}|t|7 }||jv r|d7 }||jv r"|d7 }q|S )Nr  r1   d)rP   r#   
equal_to_1divisible_by_16)r  specializationsuffixr   r   r+   r+   r,   kernel_suffix=  s   

r  c                    s  t |trdd t|dD }t }|  fddfdd  D  j	 }d
jt| |g}t| fdd|jD }	d	d |jD }
 	 }||	  fd
d| D }t\}}tg |}t||||||
d||||d}z	|  W n5 ty } z|jd u r|j  d }~w ty } z|j}|d u r tj|t||d }~ww |j}||_|S )Nc                 S   s   i | ]	\}}||  qS r+   )r_   r.   kr   r+   r+   r,   r   M  r  zast_to_ttir.<locals>.<dictcomp>,c                    s   t | tr j| S | S rC   )rD   r#   rS   index)r   )rU   r+   r,   <lambda>Q  r  zast_to_ttir.<locals>.<lambda>c                    s   i | ]	\}} ||qS r+   r+   )r.   keyrK   )cst_keyr+   r,   r   R  r  r   c                    s*   i | ]}|| v r | d krdndqS )r  Tr   r+   r.   r  )r   r+   r,   r   W  s   * c                 S   s   i | ]}|d qS ))Zmultiple_of   r+   r  r+   r+   r,   r   X  r   c                    s    g | ]\}}| vrt |qS r+   )r  r  r4   r+   r,   r/   [  r  zast_to_ttir.<locals>.<listcomp>T)	r}   r5   r   r   r   r   ra   rc   r   )rD   r#   rP   splitr   r   Zload_tritonitems__globals__rl   r%   rR   r  r  r   r  r  r  re   r
   r  r   r   r   r   rQ   Zset_source_coder  r   r2   r   )rU   r  r  r5   r   r   r   r}   r   Znew_constants	new_attrsZall_constantsr  ra   rc   r   rh   r  rT   r>   r+   )r5   r  rU   r   r,   ast_to_ttirJ  sL   




r  ),r   r]   r  r  r  typingr   r   r   r   r   r   r   r  r
   Z_C.libtriton.tritonr   r   r   Zruntimer   errorsr   r   r   r   r?   r   rF   rH   rJ   rL   rY   re   r  rI   rJ  rf   r   r|   r   r  r  r  r+   r+   r+   r,   <module>   s@    $Z      \