o
    h                     @   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ufp8fp16bf16fp32fp64_SVFzUnsupported type)is_ptr	mangle_ty
element_tyis_intr
   dtype
SIGNEDNESSSIGNEDint_signednessstrint_bitwidthis_fp8is_fp16is_bf16is_fp32is_fp64is_blockscalarjoinmapshapeis_void)tyr$   prefixeltr1    r6   T/var/www/html/ai/venv/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 r6   )r   .0r3   r6   r6   r7   
<listcomp>-       zmangle_fn.<locals>.<listcomp>c                    s"   g | ]}| d t  |  qS )c)reprr9   r   	constantsr6   r7   r:   .   s   " ._d_'_sq_[]__)r/   sortedreplace)namearg_tysr@   mangled_arg_namesmangled_constantsretr6   r?   r7   	mangle_fn+   s   rO   oreturnc                 C   
   t | tS N)
isinstancer   rP   r6   r6   r7   _is_triton_tensor7      
rV   c                 C   rR   rS   )rT   r   rU   r6   r6   r7   _is_constexpr;   rW   rX   c                 C   s    t | o| j  p| jjdkS )Nr   )rV   typer-   numelrU   r6   r6   r7   _is_triton_scalar?   s    r[   c                 C   s   t | tr| jS | S rS   )rT   r   valuerU   r6   r6   r7   _unwrap_if_constexprC      r]   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	enumeraterX   r[   r   src__name__	arg_names)nodefnargsidxargr6   r6   r7   _check_fn_argsG   s   (rj   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   )	rT   r   rf   __code__co_filenameinspectgetsourcelinesstrip
startswith)rf   base_fn	file_namelines
begin_lineliner6   r6   r7   _get_fn_file_lineN   s   



rw   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )enter_sub_regionc                 C   
   || _ d S rS   )	generator)selfrz   r6   r6   r7   __init__`   rW   zenter_sub_region.__init__c                 C   sL   | j j | _| j j | _i | j _| j j | _| j j	 | _
| j| jfS rS   )rz   lscopecopyliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_pointr{   r6   r6   r7   	__enter__c   s   zenter_sub_region.__enter__c                 O   s(   | j j| j | j| j _| j| j _d S rS   )rz   r   restore_insertion_pointr   r   r}   r   r   )r{   rg   kwargsr6   r6   r7   __exit__l   s   
zenter_sub_region.__exit__N)rc   
__module____qualname__r|   r   r   r6   r6   r6   r7   rx   _   s    	rx   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   ry   rS   )gscope)r{   r   r6   r6   r7   r|   t   rW   zContainsReturnChecker.__init__rQ   c                 C   s   |D ]
}|  |r dS qdS )NTFvisit)r{   bodysr6   r6   r7   _visit_stmtsw   s
   
z"ContainsReturnChecker._visit_stmtsc                 C   s,   t |tr|js| }t| j|S dS NF)rT   r   r`   parser   r   r   )r{   rf   fn_noder6   r6   r7   _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_fieldsrT   listASTr   )r{   re   rN   r   r\   itemr6   r6   r7   generic_visit   s   
z#ContainsReturnChecker.generic_visitre   c                 C   sP   t |jtjr"|jj| jv r | j|jj }t||j}| |S dS | 	|jS r   )
rT   r\   r   Nameidr   getattrattrr   r   )r{   re   r\   rf   r6   r6   r7   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   )rY   ctxr   Storer   r   r   )r{   re   rf   r6   r6   r7   
visit_Name   s   
z ContainsReturnChecker.visit_Namec                 C      dS )NTr6   r{   re   r6   r6   r7   visit_Return      z"ContainsReturnChecker.visit_Returnc                 C   r   r   r6   r   r6   r6   r7   visit_Assign      z"ContainsReturnChecker.visit_Assignc                 C   r   r   r6   r   r6   r6   r7   visit_AugAssign   r   z%ContainsReturnChecker.visit_AugAssignc                 C      |  |jS rS   r   r   r   r6   r6   r7   visit_Module      z"ContainsReturnChecker.visit_Modulec                 C   r   rS   r   r   r6   r6   r7   visit_FunctionDef   r   z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |  |j}|jr|p|  |j}|S rS   )r   r   orelse)r{   re   rN   r6   r6   r7   visit_If   s   zContainsReturnChecker.visit_Ifc                 C   s   |  |jp|  |jS rS   )r   r   r   r   r6   r6   r7   visit_IfExp      z!ContainsReturnChecker.visit_IfExpc                 C   r   rS   )r   funcr   r6   r6   r7   
visit_Call   r   z ContainsReturnChecker.visit_CallN)rc   r   r   r|   boolr   r   r   r   	Attributer   r   r   Returnr   Assignr   	AugAssignr   Moduler   FunctionDefr   Ifr   IfExpr   Callr   r6   r6   r6   r7   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_typesrs   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   r   rs   ru   set_locarchcreate_modulemodulefunction_ret_types	prototyper   dictr}   
attributesr@   function_name	is_kernel	last_nodedebugr`   	scf_stacklast_ret_typer   global_uses_define_name_lookupdereference_name)r{   r   r   r   r   r@   r   r   r   r   r   r   r`   rs   ru   r6   r6   r7   r|      s.   
zCodeGenerator.__init__c                 C   s   i | ]}|j |qS r6   rc   r9   r   r6   r6   r7   
<dictcomp>   r;   zCodeGenerator.<dictcomp>builtin_namespaceprintminc                    s6   dt ffddt  dt dtf fdd}|S )NrJ   c                    s.    j | |}||ur|  jvr| j| < |S rS   )r}   getr   r   )rJ   absentr\   r   r6   r7   local_lookup   s   
z7CodeGenerator._define_name_lookup.<locals>.local_lookuprQ   c                    sD    }j jjjfD ]}|| |}||ur|  S qt|  d)Nz is not defined)r   r   r   	NameError)rJ   r   lookup_functionr\   absent_markerr   r{   r6   r7   name_lookup   s   
z6CodeGenerator._define_name_lookup.<locals>.name_lookup)r&   objectr   )r{   r   r6   r   r7   r      s   z!CodeGenerator._define_name_lookuprJ   r\   rQ   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{   rJ   r\   r6   r6   r7   	set_value  s   
zCodeGenerator.set_valuec                 C   s   | j  }| j  }||fS rS   )r   get_locr   )r{   locipr6   r6   r7   _get_insertion_point_and_loc  s   

z*CodeGenerator._get_insertion_point_and_locc                 C   s   | j | | j | d S rS   )r   r   r   )r{   r   r   r6   r6   r7   _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 rS   )r   rT   r   r   r   )r{   stmtsstmtret_typer6   r6   r7   visit_compound_statement  s   
z&CodeGenerator.visit_compound_statementc                 C      t j| | d S rS   r   NodeVisitorr   r   r6   r6   r7   r   $     zCodeGenerator.visit_Modulec                    s0     |j}|d u sJ  fdd|jD }|S )Nc                       g | ]}  |qS r6   r   )r9   r5   r   r6   r7   r:   *      z,CodeGenerator.visit_List.<locals>.<listcomp>)r   r   elts)r{   re   r   r   r6   r   r7   
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 r6   )r
   core
_to_tensorr   r9   vr   r6   r7   r:   8      z.CodeGenerator.visit_Return.<locals>.<listcomp>c                 S      g | ]}|j qS r6   rY   r   r6   r6   r7   r:   9      c                 S   r   r6   handler   r6   r6   r7   r:   :  r   )r   r\   r   rN   rT   tupler
   r   r   r  rY   )r{   re   	ret_valueret_ty
ret_values	ret_typesrN   r6   r   r7   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   targetsr\   )targetr\   
annotationpublicprivater   ztt.divisibility),r   rg   ra   defaultsr  ri   r   r   r   r   	AnnAssignr   r   get_or_insert_functionr   r   r   to_irr`   	push_backadd_entry_blockr@   rX   r   appendr   set_arg_attrr   param_typesr   zipr   set_insertion_point_to_startr   r   r   rN   rT   r  r   r  
reset_typeset_insertion_point_to_endfinalize)r{   re   rd   kwarg_namesr   default_valuearg_noder  rJ   	st_target	init_node
visibilityrf   entry
arg_valuesrh   arg_namecst	insert_pt	arg_valuer6   r6   r7   r   D  sT   $






zCodeGenerator.visit_FunctionDefc                 C   s4   g }|j D ]
}|| |g7 }q| |j}||fS rS   )rg   r   kwarg)r{   re   rd   ri   r  r6   r6   r7   visit_arguments{  s
   
zCodeGenerator.visit_argumentsc                 C   s   t j| | |jS rS   )r   r   r   ri   r   r6   r6   r7   	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
  r\   r   r}   
ValueErrorrX   r   )r{   re   r  r
  r\   r6   r6   r7   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   r\   rT   r  r
   r"   r  r]   rV   r   r   r   r   )	r{   re   _namesr
  namesvaluesnative_nontensor_typesrJ   r\   r6   r6   r7   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opr\   r   r   r   )r{   re   rJ   lhsrhsassignr6   r6   r7   r     s   

zCodeGenerator.visit_AugAssignc                 C   s"   t |jtjkr|jS | |jS rS   )rY   r   r   r   r   r   r   r6   r6   r7   r     s   zCodeGenerator.visit_Namec                 C   r   rS   r   r   r6   r6   r7   visit_Store  r   zCodeGenerator.visit_Storec                 C   r   rS   r   r   r6   r6   r7   
visit_Load  r   zCodeGenerator.visit_Loadc                    s    fdd|j D }t|S )Nc                    r   r6   r   )r9   xr   r6   r7   r:     r   z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)r   r  )r{   re   rg   r6   r   r7   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_builderz__(.*)__z__r\1__)rV   r   r   resub)r{   method_namer5  r6  reverse_method_namer6   r6   r7   _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   rY   r4  r   formatrc   rB  r{   re   r5  r6  r@  r6   r6   r7   visit_BinOp  s   zCodeGenerator.visit_BinOp__add____sub____mul____truediv____floordiv____mod____pow__
__lshift__
__rshift____and____or____xor__rE  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 )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   r  r   r   r   r   r~   r   r}   rY   r  r  get_typekeys)r{   re   r   
then_block
else_block	then_defs	else_defsr/  r  ir_ret_typesrJ   defs
block_namethen_tyelse_tyr6   r6   r7   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 r6   r   r9   nr\  r6   r7   r:   $  r   z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                    rd  r6   r   re  r]  r6   r7   r:   (  r   )rx   r   create_blockr  create_cond_branchr  rc  
has_returnerasehas_terminatorcreate_branchadd_argumentr  ra   r
   r   r   ri   r   )r{   condre   has_endif_blocksrr   ip_blockrZ  r[  endif_blockr/  r  r^  r3   r   rJ   
new_tensorr6   )r]  r\  r7   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 r6   r  r   r8   r   r6   r7   r:   ?      z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                    rd  r6   r   re  rg  r6   r7   r:   C  r   c                    rd  r6   r   re  rh  r6   r7   r:   J  r   )rx   r   r   ri  r   rc  r   create_if_opr  merge_block_beforeget_then_blockr  r-  create_yield_opget_else_blockra   r
   r   r   
get_resultr   )r{   rp  re   rr  r   r   r   last_locrZ  r[  r/  r  if_opr   rJ   ru  r6   )r]  r{   r\  r7   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 rS   r   r   r6   r6   r7   	<genexpr>d  s    z)CodeGenerator.visit_If.<locals>.<genexpr>)r   testrV   tor
   int1r   r   r   r   r   r  rv  r]   rY   _condition_typesrF  r/   rc   r   r   r   )r{   re   rp  contains_returnr6   r6   r7   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   r  rV   r  r
   r  r   r]   r   r   )r{   re   rp  r6   r6   r7   r   j  s   zCodeGenerator.visit_IfExpc                 C      d S rS   r6   r   r6   r6   r7   
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   rC  r]   rY   r   Isr   IsNot_method_name_for_comp_opr   rF  rc   rB  )r{   re   r5  r6  	lhs_value	rhs_valuer@  r6   r6   r7   visit_Comparev  s   zCodeGenerator.visit_Compare__eq____ne____lt____le____gt____ge__r  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   rY   r4  r   rF  rc   rV   r   r   )r{   re   r4  rf   r6   r6   r7   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                    rw  r6   rx  r8   r   r6   r7   r:     ry  z-CodeGenerator.visit_While.<locals>.<listcomp>c                 S   r   r6   r   r9   ri   r6   r6   r7   r:     r   c                    rw  r6   rx  r8   r   r6   r7   r:     ry  c                    r   r6   )ri   r>   )before_blockr6   r7   r:     r   c                    rw  r6   rx  r8   r   r6   r7   r:     ry  c                 S   r   r6   r   r9   yr6   r6   r7   r:     r   FzNot implemented)&rx   r   r   ri  r  r   r  r   r   popr   rl  rV   rY   r   create_while_opcreate_block_with_parent
get_beforera   r
   r   r   ri   r}   r   r  r  create_condition_opr  ranger-  	get_afterr}  r  r   r   r   r   )r{   re   rr  r   r   r   r  dummy	loop_defsr/  r  	init_argsrJ   while_opr   rp  after_blockyieldsnew_defr   r6   )r  r{   r7   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 )Nr2  r<  )	r   	__class__rc   r   r\   slicerV   __getitem__r   )r{   re   r5  slicesr6   r6   r7   visit_Subscript  s   zCodeGenerator.visit_Subscriptc                    s    fdd|j D S )Nc                    r   r6   r   )r9   dimr   r6   r7   r:     r   z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)dimsr   r6   r   r7   visit_ExtSlice  r^   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   r6   r   r  r   r6   r7   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 (r  rW  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   r6   r   r  r6   r6   r7   r:   <  r   c                 S   r   r6   r   r  r6   r6   r7   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   rg   r
   static_ranger  startr\   endstepr   r}   r
  r   r   r   r   r   r   r   RuntimeErrorr-  NumrX   r   r   r   r"   r!   	TypeErrorsemanticinteger_promote_implr  r%   r#   r$   r  create_int_castcreate_undefr   r   rx   r   ri  r  r   r  r  rl  r   rV   rY   r   create_for_opget_bodyra   ri   r}  
get_parentsizeget_induction_var
create_sub
create_addreplace_all_uses_withr  )r{   re   IteratorClass	iter_argsiteratorr  r   r   lbubr  negative_stepiv_type
iv_ir_typeiv_is_signedivrr  r   r   r   r  blockr  r  r/  rJ   for_opfor_op_regionr6   r   r7   	visit_For  s   

$&$
"





0


>&
zCodeGenerator.visit_Forc                 C   s0   |  |j}|  |j}|  |j}t|||S rS   )r   lowerupperr  r  )r{   re   r  r  r  r6   r6   r7   visit_Slice`  s   zCodeGenerator.visit_Slicec                 C   r   rS   )r   r\   r   r6   r6   r7   visit_Indexf  r   zCodeGenerator.visit_Indexc                 C   s   |j | |jfS rS   )ri   r   r\   r   r6   r6   r7   visit_keywordi  r   zCodeGenerator.visit_keywordc                 C   s6   | j sd S | |j}| |j}tjj||| jdS r  )r   r   r  msgr
   r   device_assertr   )r{   re   r  r  r6   r6   r7   visit_Assertl  s
   zCodeGenerator.visit_Assertrf   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 r6   r6   )r9   rJ   rg   r6   r7   r:   v  r;   z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s    g | ]}t |r
|nt|qS r6   )rV   r   r  r6   r6   r7   r:   w  s
    c                 S   s   g | ]
\}}t |r|qS r6   )rX   r9   r   ri   r6   r6   r7   r:   {  r   c                    s   i | ]}| | qS r6   r6   r>   r  r6   r7   r   |  r   z2CodeGenerator.call_JitFunction.<locals>.<dictcomp>c                    s    g | ]\}}| v rd n|qS rS   r6   r  )
constexprsr6   r7   r:   ~       c                 S      g | ]	}|d ur|j qS rS   r   r  r6   r6   r7   r:         c                 S   r  rS   r   r  r6   r6   r7   r:     r  )r   r   r   r   r`   rs   ru   r   r   r   )#rn   getcallargsrf   rd   r   ra   rO   rc   r   has_functionr
   function_typesysmodulesr   __dict__r   rw   r   r   r   r`   r   r   r   r   r   get_functioncallget_num_resultsr   r  r  r  r  )r{   rf   rg   r   r   r@   arg_vals	arg_typesfn_namer   r   r   rs   ru   rz   callee_ret_typesymbolcall_opresultsr   r6   )rg   r  r7   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 rS   r   r9   keywordr   r6   r7   r        z+CodeGenerator.visit_Call.<locals>.<genexpr>c                    r   r6   r   r  r   r6   r7   r:     r   z,CodeGenerator.visit_Call.<locals>.<listcomp>__self__r<  
_generator)r]   r   r    statically_implemented_functionsr   r   keywordsrg   r
   r   r  r   rT   r   rj   r  hasattrrV   r  
is_builtinr   rn   	signature
parametersr   r0  r0   )r{   re   rf   static_implementationkwsrg   extra_kwargssigr6   r   r7   r     s*   

 


zCodeGenerator.visit_Callc                 C   
   t |jS rS   r   r\   r   r6   r6   r7   visit_Constant  rW   zCodeGenerator.visit_Constantre   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-  r0  r   r   _method_name_for_bool_opr   rY   r4  rF  rc   rB  rG  r6   r6   r7   visit_BoolOp  s   zCodeGenerator.visit_BoolOplogical_and
logical_orr  )      c                 C   r  rS   r  r   r6   r6   r7   visit_NameConstant  rW   z CodeGenerator.visit_NameConstantc                 C   r  rS   )r   rf  r   r6   r6   r7   	visit_Num  rW   zCodeGenerator.visit_Numc                 C   s   t t|S rS   )r   r   literal_evalr   r6   r6   r7   	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)r   )	r   r\   rV   r   r
   r  transr   r   )r{   re   r5  r6   r6   r7   r     s
   
zCodeGenerator.visit_Attributec                 C   r   rS   r   r   r6   r6   r7   
visit_Expr  r   zCodeGenerator.visit_Exprc                 C   r  rS   r6   r   r6   r6   r7   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   r0  ra   rT   r   Constantr&   r\   FormattedValue
conversionr   rX   r   rY   chrrF  AssertionErrorr/   )r{   re   r0  r   r\   conversion_code	evaluatedr6   r6   r7   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   r   r   r  r   rs   ru   r*  r+  superr   )r{   re   r  rN   r  r6   r7   r     s   


$zCodeGenerator.visitc                 C   s   t d |dt|j)Nzunsupported AST node type: {})r   rF  rY   rc   r   r6   r6   r7   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 r6   )r]   )r9   rJ   r\   r6   r6   r7   r     r  z6CodeGenerator.execute_static_print.<locals>.<dictcomp>c                 3   r  rS   r   r  r   r6   r7   r    r  z5CodeGenerator.execute_static_print.<locals>.<genexpr>c                    s   g | ]	}t  |qS r6   )r]   r   r  r   r6   r7   r:     r  z6CodeGenerator.execute_static_print.<locals>.<listcomp>)r  rg   r   )r{   re   r  rg   r6   r   r7   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-  rg   r  r  r]   r   rT   r   NotImplementedError	Exceptionr=   r   )r{   re   	arg_countpassedmessageer6   r6   r7   execute_static_assert	  s&   


z#CodeGenerator.execute_static_assertr  )NFNFFNr   )xrc   r   r   r   r   r&   r|   r  floatintrT   r   r   r   __annotations__updater
   r   device_printminimumr   r   r   r   r   r   r   r   r   r   r   r   r)  r*  r,  r   r   r   r8  r9  r;  rB  rH  r   AddSubMultDivFloorDivModPowLShiftRShiftBitAndBitOrBitXorrE  r   operatorrc  rv  r  r   r   r  r  EqNotEqLtLtEGtGtEr  cmpopr  USubUAddNotInvertr  unaryopr  r  r  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   r3  r;  static_assertstatic_printr  r   r   __classcell__r6   r6   r2  r7   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   fp8e4fp8e5fp8e4b15r   r   r   r   i1i8i16i32i64u8u16u32u64B)	str_to_tyr
   pointer_typefloat8e4float8e5float8e4b15float16bfloat16float32float64r  int8int16int32int64uint8uint16uint32uint64)rJ   r3   tysr6   r6   r7   rq  #  sN   
	
rq  c                 C   sJ   d}t | D ]\}}|t|7 }||jv r|d7 }||jv r"|d7 }q|S )Nr   r<   d)ra   r&   
equal_to_1divisible_by_16)r  specializationsuffixr   r   r6   r6   r7   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 r6   )rp   r9   kr   r6   r6   r7   r   M  r  zast_to_ttir.<locals>.<dictcomp>,c                    s   t | tr j| S | S rS   )rT   r&   rd   index)r   )rf   r6   r7   <lambda>Q  r  zast_to_ttir.<locals>.<lambda>c                    s   i | ]	\}} ||qS r6   r6   )r9   keyr\   )cst_keyr6   r7   r   R  r  r   c                    s*   i | ]}|| v r | d krdndqS )rg  Tr   r6   r9   r  )r  r6   r7   r   W  s   * c                 S   s   i | ]}|d qS ))multiple_of   r6   r  r6   r6   r7   r   X  r   c                    s    g | ]\}}| vrt |qS r6   )rq  r  r?   r6   r7   r:   [  r  zast_to_ttir.<locals>.<listcomp>T)	r   r@   r   r   r   r   rs   ru   r   )rT   r&   ra   splitr   r   load_tritonitems__globals__r~   r/   rc   r  r0  r   r  r  r?  rw   r
   r  r   r   r   r   rb   set_source_coder6  r   r=   r   )rf   r  r  r@   r   r   r   r   r   new_constants	new_attrsall_constantsr  rs   ru   r   rz   r:  re   rN   r6   )r@   r  rf   r  r7   ast_to_ttirJ  sL   




r  ),r   rn   r>  r  r,  typingr   r   r   r   r   r   r   r   r
   _C.libtriton.tritonr   r   r   runtimer   errorsr   r   r   r   rO   r   rV   rX   r[   r]   rj   rw   r=  rY   r  rx   r   r   r   rq  r  r  r6   r6   r6   r7   <module>   s@    $Z      \