U
    9%e                     @   sN  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eedddZeedddZeedddZed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 |  rHtjjj}| j|kr6dnd}|t	| j
 S |  rTdS |  r`dS |  rldS |  rxdS |  rdS |  rt| j}d	tt	| j}| d
| d
S |  rdS dstdd S )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AssertionError)tyr!   prefixeltr'    r,   ]/var/www/html/Darija-Ai-API/env/lib/python3.8/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>-   s     zmangle_fn.<locals>.<listcomp>c                    s"   g | ]}| d t  |  qS )c)reprr/   r   	constantsr,   r-   r0   .   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   s
   t | tS N)
isinstancer   r@   r,   r,   r-   _is_triton_tensor7   s    rE   c                 C   s
   t | tS rB   )rC   r   rD   r,   r,   r-   _is_constexpr;   s    rF   c                 C   s    t | o| j  p| jjdkS )Nr   )rE   typer$   ZnumelrD   r,   r,   r-   _is_triton_scalar?   s    rH   rD   c                 C   s   t | tr| jS | S rB   )rC   r   valuerD   r,   r,   r-   _unwrap_if_constexprC   s    rJ   c              
   C   sT   |j rPt|D ]@\}}t|st|st|j| d|j d|j|  d| qd S )Nz	Function z= is marked noinline, but was called with non-scalar argument :)noinline	enumeraterF   rH   r   src__name__	arg_names)nodefnargsidxargr,   r,   r-   _check_fn_argsG   s    rV   c                 C   s^   | }t |ts|j}q|jjj}t|j\}}|D ] }| drP|d7 }q4 qVq4||fS )N@r   )	rC   r   rR   __code__co_filenameinspectgetsourcelinesstrip
startswith)rR   Zbase_fn	file_namelines
begin_lineliner,   r,   r-   _get_fn_file_lineN   s    


rb   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )enter_sub_regionc                 C   s
   || _ d S rB   )	generator)selfrd   r,   r,   r-   __init__`   s    zenter_sub_region.__init__c                 C   sL   | j j | _| j j | _i | j _| j j | _| j j	 | _
| j| jfS rB   )rd   lscopecopyliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_pointre   r,   r,   r-   	__enter__c   s    zenter_sub_region.__enter__c                 O   s(   | j j| j | j| j _| j| j _d S rB   )rd   rl   restore_insertion_pointrp   ri   rg   rk   rj   )re   rS   kwargsr,   r,   r-   __exit__l   s    
zenter_sub_region.__exit__N)rO   
__module____qualname__rf   rr   ru   r,   r,   r,   r-   rc   _   s   	rc   c                   @   s   e Zd Zdd ZedddZedddZeddd	Zej	ed
ddZ
ejed
ddZejed
ddZejed
ddZejed
ddZejed
ddZejed
ddZejed
ddZejed
ddZejed
ddZdS ) ContainsReturnCheckerc                 C   s
   || _ d S rB   )gscope)re   ry   r,   r,   r-   rf   t   s    zContainsReturnChecker.__init__rA   c                 C   s   |D ]}|  |r dS qdS )NTFvisit)re   bodysr,   r,   r-   _visit_stmtsw   s    
z"ContainsReturnChecker._visit_stmtsc                 C   s,   t |tr(|js(| }t| j|S dS NF)rC   r   rL   parserx   ry   r|   )re   rR   Zfn_noder,   r,   r-   _visit_function}   s    z%ContainsReturnChecker._visit_functionc                 C   sf   d}t |D ]R\}}t|trF|D ]}t|t jr$|p@| |}q$qt|t jr|p^| |}q|S r   )astiter_fieldsrC   listASTr|   )re   rQ   r>   r   rI   itemr,   r,   r-   generic_visit   s    
z#ContainsReturnChecker.generic_visitrQ   rA   c                 C   sP   t |jtjrD|jj| jkr@| j|jj }t||j}| |S dS | 	|jS r   )
rC   rI   r   Nameidry   getattrattrr   r|   )re   rQ   rI   rR   r,   r,   r-   visit_Attribute   s    
z%ContainsReturnChecker.visit_Attributec                 C   s:   t |jtjkrdS |j| jkr6| j|j }| |S dS r   )rG   ctxr   Storer   ry   r   )re   rQ   rR   r,   r,   r-   
visit_Name   s    
z ContainsReturnChecker.visit_Namec                 C   s   dS )NTr,   re   rQ   r,   r,   r-   visit_Return   s    z"ContainsReturnChecker.visit_Returnc                 C   s   dS r   r,   r   r,   r,   r-   visit_Assign   s    z"ContainsReturnChecker.visit_Assignc                 C   s   dS r   r,   r   r,   r,   r-   visit_AugAssign   s    z%ContainsReturnChecker.visit_AugAssignc                 C   s   |  |jS rB   r   r}   r   r,   r,   r-   visit_Module   s    z"ContainsReturnChecker.visit_Modulec                 C   s   |  |jS rB   r   r   r,   r,   r-   visit_FunctionDef   s    z'ContainsReturnChecker.visit_FunctionDefc                 C   s&   |  |j}|jr"|p |  |j}|S rB   )r   r}   orelse)re   rQ   r>   r,   r,   r-   visit_If   s    zContainsReturnChecker.visit_Ifc                 C   s   |  |jp|  |jS rB   )r|   r}   r   r   r,   r,   r-   visit_IfExp   s    z!ContainsReturnChecker.visit_IfExpc                 C   s   |  |jS rB   )r|   funcr   r,   r,   r-   
visit_Call   s    z ContainsReturnChecker.visit_CallN)rO   rv   rw   rf   boolr   r   r   r   	Attributer   r   r   Returnr   Assignr   	AugAssignr   Moduler   FunctionDefr   Ifr   IfExpr   Callr   r,   r,   r,   r-   rx   s   s   rx   c                       s  e Zd ZU dee ee d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eeeef dd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&d-d. Z'd/d0 Z(d1d2 Z)d3d4 Z*e+j,d5e+j-d6e+j.d7e+j/d8e+j0d9e+j1d:e+j2d;e+j3d<e+j4d=e+j5d>e+j6d?e+j7d@iZ8ee9e+j: ef edA< dBdC Z;dDdE Z<dFdG Z=dHdI Z>dJdK Z?dLdM Z@dNdO ZAe+jBdPe+jCdQe+jDdRe+jEdSe+jFdTe+jGdUiZHee9e+jI ef edV< dWdX ZJe+jKdYe+jLdZe+jMd[e+jNd\iZOee9e+jP ef ed]< d^d_ ZQd`da ZRdbdc ZSddde ZTdfdg ZUdhdi ZVeWeef djdkdlZXedjdmdnZYeZdodpdqZ[drds Z\dtdu Z]e+j^dvdwdxZ_e+j`dye+jadziZbee9e+jc ef ed{< edjed|k rd}d~ Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zl fddZmdd Zne+joddddZpe+joddddZqejjreqejjsepiZteeueve+jogef f ed<   ZwS )CodeGeneratorNFr   )function_typesr^   c                 C   s   || _ t|| _|| _|d | _| j||d || j_|d krL| j n|| _|
d kr^i n|
| _	|| _
|| _t | _|| _|| _|| _|	| _d | _|| _|| _g | _d | _i | _i | _|  | _d S )Nr   r   )contextr   rl   r^   r`   set_locarchcreate_modulemodulefunction_ret_types	prototypery   dictrg   
attributesr5   function_name	is_kernel	last_nodedebugrL   	scf_stacklast_ret_typerj   global_uses_define_name_lookupdereference_name)re   r   r   ry   r   r5   r   r   r   r   r   r   rL   r^   r`   r,   r,   r-   rf      s.    
zCodeGenerator.__init__c                 C   s   i | ]}|j |qS r,   rO   r/   r   r,   r,   r-   
<dictcomp>   s      zCodeGenerator.<dictcomp>builtin_namespaceprintminc                    s4   t dfddt  t td fdd}|S )N)r=   c                    s.    j | |}||k	r*|  jkr*| j| < |S rB   )rg   getrj   r   )r=   absentrI   rq   r,   r-   local_lookup   s    
z7CodeGenerator._define_name_lookup.<locals>.local_lookup)r=   rA   c                    sH    }j jjjfD ]}|| |}||k	r|  S qt|  dd S )Nz is not defined)ry   r   r   	NameError)r=   r   Zlookup_functionrI   Zabsent_markerr   re   r,   r-   name_lookup   s    

z6CodeGenerator._define_name_lookup.<locals>.name_lookup)r#   objectr   )re   r   r,   r   r-   r      s    z!CodeGenerator._define_name_lookup)r=   rI   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)rg   rj   )re   r=   rI   r,   r,   r-   	set_value  s    
zCodeGenerator.set_valuec                 C   s   | j  }| j  }||fS rB   )rl   get_locro   )re   locipr,   r,   r-   _get_insertion_point_and_loc  s    

z*CodeGenerator._get_insertion_point_and_locc                 C   s   | j | | j | d S rB   )rl   rs   r   )re   r   r   r,   r,   r-   _set_insertion_point_and_loc  s    z*CodeGenerator._set_insertion_point_and_locc                 C   s2   |D ](}|  |}|d k	rt|tjr|| _qd S rB   )r|   rC   r   r   r   )re   ZstmtsstmtZret_typer,   r,   r-   visit_compound_statement  s    
z&CodeGenerator.visit_compound_statementc                 C   s   t j| | d S rB   r   NodeVisitorr   r   r,   r,   r-   r   $  s    zCodeGenerator.visit_Modulec                    s0     |j}|d kst fdd|jD }|S )Nc                    s   g | ]}  |qS r,   r{   )r/   r+   rq   r,   r-   r0   *  s     z,CodeGenerator.visit_List.<locals>.<listcomp>)r|   r   r(   elts)re   rQ   r   r   r,   rq   r-   
visit_List'  s    zCodeGenerator.visit_Listc                    s     |j}|d kr& jg  d }npt|trp fdd|D }dd |D } jdd |D  t|}n&tj| j} j|j	g |j
}|S )Nc                    s   g | ]}t j| jqS r,   )r
   core
_to_tensorrl   r/   vrq   r,   r-   r0   8  s     z.CodeGenerator.visit_Return.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r,   rG   r   r,   r,   r-   r0   9  s     c                 S   s   g | ]
}|j qS r,   handler   r,   r,   r-   r0   :  s     )r|   rI   rl   r>   rC   tupler
   r   r   r   rG   )re   rQ   Z	ret_valueZret_tyZ
ret_values	ret_typesr>   r,   rq   r-   r   .  s    

zCodeGenerator.visit_Returnc                 C   s>  |  |j\}}t|jjD ]l\}}|jj| d  }|j}|j}tj|t d}	|d krntj	|	g|d}
ntj
|	||d}
|  |
 q| jrdnd}| j| j| j| j| j|| j}| j| | }g }d}t|D ]\}}|| jkr$| j| }t|st| j| }|| qq|| jkrH||d| j| d  |t||| jj|  |d7 }q| j }t||D ]\}}| || q| j | | !|j" | j#d kr| j$g  nRt%| j#t&r t'| j#| j_(|)| j| j n | j#g| j_(|)| j| j |r2| j*| |+  d S )	Nr   r   r   targetsrI   )targetrI   
annotationpublicprivater   ztt.divisibility),r|   rS   rM   defaultsr   rU   r   r   r   r   	AnnAssignr   rl   Zget_or_insert_functionr   r   r   to_irrL   Z	push_backZadd_entry_blockr5   rF   r   appendr   Zset_arg_attrr   Zparam_typesrm   zipr   set_insertion_point_to_startr   r}   r   r>   rC   r   r   r   Z
reset_typeset_insertion_point_to_endfinalize)re   rQ   rP   kwarg_namesr   default_valueZarg_noder   r=   Z	st_targetZ	init_nodeZ
visibilityrR   entryZ
arg_valuesrT   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 rB   )rS   r|   kwarg)re   rQ   rP   rU   r   r,   r,   r-   visit_arguments{  s
    
zCodeGenerator.visit_argumentsc                 C   s   t j| | |jS rB   )r   r   r   rU   r   r,   r,   r-   	visit_arg  s    zCodeGenerator.visit_argc                 C   sr   |  |j}|  |j}|  |j}|tkrh|| jkrDt| dt|sTt|}|| j|< | j| S | |S )Nz4 is already defined. constexpr cannot be reassigned.)	r|   r   r   rI   r   rg   
ValueErrorrF   r   )re   rQ   r   r   rI   r,   r,   r-   visit_AnnAssign  s    


zCodeGenerator.visit_AnnAssignc           	      C   s   g }|j D ]}|| |g7 }q
t|dkr8td |d|d }| |j}t|ts\|g}t|tsl|g}tjf}t	||D ]F\}}t
|}|d k	rt|st||stj|| j}| || q~d S )Nr   z2simultaneous multiple assignment is not supported.r   )r   r|   lenr   rI   rC   r   r
   r   r   rJ   rE   r   r   rl   r   )	re   rQ   Z_namesr   namesvaluesZnative_nontensor_typesr=   rI   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oprI   r   r|   r   )re   rQ   r=   lhsrhsZassignr,   r,   r-   r     s    
zCodeGenerator.visit_AugAssignc                 C   s"   t |jtjkr|jS | |jS rB   )rG   r   r   r   r   r   r   r,   r,   r-   r     s    zCodeGenerator.visit_Namec                 C   s   t j| | d S rB   r   r   r,   r,   r-   visit_Store  s    zCodeGenerator.visit_Storec                 C   s   t j| | d S rB   r   r   r,   r,   r-   
visit_Load  s    zCodeGenerator.visit_Loadc                    s    fdd|j D }t|S )Nc                    s   g | ]}  |qS r,   r{   )r/   xrq   r,   r-   r0     s     z-CodeGenerator.visit_Tuple.<locals>.<listcomp>)r   r   )re   rQ   rS   r,   rq   r-   visit_Tuple  s    zCodeGenerator.visit_Tuplec                 C   sT   t |rt|||| jdS t |rFtdd|}t|||| jdS t|||S )NZ_builderz__(.*)__z__r\1__)rE   r   rl   resub)re   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 krHtd |d|jj	| 
|||S )Nz8AST binary operator '{}' is not (currently) implemented.)r|   leftright_method_name_for_bin_opr   rG   r   r   formatrO   r  re   rQ   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rr| j | | | _i | _| |j | j }| j  }g }g }g }	|D ]}
|df|dffD ]P\}}|
|kr||
 j	||
 j	kst
d|
 d||
 j	 d| d||
 j	 q|
|ks|
|krV||
 ||
|kr||
 j	n||
 j	 |	|
|krF||
 j n||
 j  |
|krv|
|krv||
 ||
< |
|kr|
|kr||
 ||
< q| | @ D ]v}
|
|krq||
 j	}||
 j	}||kst
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 ())rl   r   r   r}   rm   rj   rh   r   rg   rG   r(   r   r   get_typekeys)re   rQ   ri   
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  sR    





&
$,




z$CodeGenerator.visit_then_else_blocksc              	      sj  d}t | }|\}}| j }| j }| j }	| j| | j|j|| | ||||\ }}}
}}| j| | r| rd}|	  |	 s|r| j
|	fdd|
D  | j| |	 s|r| j
|	 fdd|
D  |r|D ]}|	| q W 5 Q R X |rf| j|	 t|
D ].\}}tj|	||| }| || q6d S )NTFc                    s   g | ]} | j qS r,   r   r/   nr  r,   r-   r0   $  s     z4CodeGenerator.visit_if_top_level.<locals>.<listcomp>c                    s   g | ]} | j qS r,   r   r#  r   r,   r-   r0   (  s     )rc   rl   create_blockr   Zcreate_cond_branchr   r"  Z
has_returneraseZhas_terminatorZcreate_branchadd_argumentr   rM   r
   r   r   rU   r   )re   condrQ   Zhas_endif_blocksrri   Zip_blockr  r  Zendif_blockr   r   r!  r)   r   r=   
new_tensorr,   )r   r  r-   visit_if_top_level  s6    


z CodeGenerator.visit_if_top_levelc              	      sh  t }|\}} \}}j }|jr:j nd }	||||	\ }}	}
}}|| jfdd|D |jd}|	|
  j|
  t|
dkr̈jfdd|
D  |js| }	n|		|  j|  t|
dkr"j fdd|
D  W 5 Q R X t|
D ].\}}tj|||| }|| q4d S )Nc                    s   g | ]}|  jqS r,   r   rl   r.   rq   r,   r-   r0   ?  s     z.CodeGenerator.visit_if_scf.<locals>.<listcomp>Tr   c                    s   g | ]} | j qS r,   r   r#  r%  r,   r-   r0   C  s     c                    s   g | ]} | j qS r,   r   r#  r&  r,   r-   r0   J  s     )rc   r   rl   r'  r   r"  r   Zcreate_if_opr   Zmerge_block_beforeZget_then_blockr   r   create_yield_opZget_else_blockrM   r
   r   r   
get_resultr   )re   r*  rQ   r+  ri   r   r   last_locr  r  r   r   Zif_opr   r=   r,  r,   )r   re   r  r-   visit_if_scf5  s,    
 
$zCodeGenerator.visit_if_scfc              	   C   s   |  |j}t|rt|jtj| jd}t| j |}| j	rN|rNt
d |dq| j	sX|sf| || q| || n\t|}t|tkrt
d |dddd tD t|j|r| |j n| |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 rB   r   r   r,   r,   r-   	<genexpr>d  s     z)CodeGenerator.visit_If.<locals>.<genexpr>)r|   testrE   tor
   int1rl   rx   ry   r   r   r2  r-  rJ   rG   _condition_typesr
  r%   rO   r   r}   r   )re   rQ   r*  Zcontains_returnr,   r,   r-   r   P  s4    
 
   zCodeGenerator.visit_Ifc                 C   sJ   |  |j}t|r&|jtj| jd}t|r:|  |jS |  |j	S d S Nr  )
r|   r5  rE   r6  r
   r7  rl   rJ   r}   r   )re   rQ   r*  r,   r,   r-   r   j  s    zCodeGenerator.visit_IfExpc                 C   s   d S rB   r,   r   r,   r,   r-   
visit_Passs  s    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rtt
||kS t|jd tjkrt
||k	S | jt|jd }|d krtd |d|jd j| |||S )Nr   z1simultaneous multiple comparison is not supportedr   z<AST comparison operator '{}' is not (currently) implemented.)r   ZcomparatorsZopsr   r|   r  rJ   rG   r   Isr   IsNot_method_name_for_comp_opr   r
  rO   r  )re   rQ   r   r   	lhs_value	rhs_valuer  r,   r,   r-   visit_Comparev  s    zCodeGenerator.visit_Compare__eq____ne____lt____le____gt____ge__r=  c                 C   sb   |  |j}| jt|j}|d kr<td |d|jjt	|rVt
||| jdS t
|| S )Nz7AST unary operator '{}' is not (currently) implemented.r  )r|   operand_method_name_for_unary_opr   rG   r   r   r
  rO   rE   r   rl   )re   rQ   r   rR   r,   r,   r-   visit_UnaryOp  s    zCodeGenerator.visit_UnaryOp__neg____pos____not__
__invert__rH  c              	      s  t }|\}} \}}j }j| j| |j j	  j
}|  g }	g }
g }|D ]l}||krvt|| stt|| st|| j|| jkst|	| |
|| j |||  qv|| jfdd|
D dd |D }j| fdd|
D  j  t|	D ]8\}}tj ||
| j|< j| j
|< qJ|j}j  j|j fddtt|D  j|  fdd|
D }j| t|	D ]8\}}tj|||
| j|< j| j
|< qj| |j j	  j
}g }|D ]}||kr`|||  q`j!dd |D  W 5 Q R X t|	D ]6\}}tj|"||
| }|j|< |j
|< q|j#D ]"}dstd	t$j%&| qd S )
Nc                    s   g | ]}|  jqS r,   r.  r.   rq   r,   r-   r0     s     z-CodeGenerator.visit_While.<locals>.<listcomp>c                 S   s   g | ]
}|j qS r,   r   r/   rU   r,   r,   r-   r0     s     c                    s   g | ]}|  jqS r,   r.  r.   rq   r,   r-   r0     s     c                    s   g | ]}  |qS r,   )rU   r3   )before_blockr,   r-   r0     s     c                    s   g | ]}|  jqS r,   r.  r.   rq   r,   r-   r0     s     c                 S   s   g | ]
}|j qS r,   r   r/   yr,   r,   r-   r0     s     FzNot implemented)'rc   r   rl   r'  r   r   r   r   r}   poprj   r(  rE   r(   rG   r   Zcreate_while_opZcreate_block_with_parentZ
get_beforerM   r
   r   r   rU   rg   r|   r5  r   Zcreate_condition_opr   ranger   Z	get_afterr/  r0  r   r   r   r   )re   rQ   r+  ri   rn   r   r1  dummyZ	loop_defsr   r   	init_argsr=   Zwhile_opr   r*  Zafter_blockyieldsZnew_defr   r,   )rO  re   r-   visit_While  st    


&

 

zCodeGenerator.visit_Whilec                 C   sJ   |j jjdkst| |j}| |j}t|rB|j|| j	dS || S )Nr   r  )
r   	__class__rO   r(   r|   rI   slicerE   __getitem__rl   )re   rQ   r   Zslicesr,   r,   r-   visit_Subscript  s    zCodeGenerator.visit_Subscriptc                    s    fdd|j D S )Nc                    s   g | ]}  |qS r,   r{   )r/   dimrq   r,   r-   r0     s     z0CodeGenerator.visit_ExtSlice.<locals>.<listcomp>)Zdimsr   r,   rq   r-   visit_ExtSlice  s    zCodeGenerator.visit_ExtSlicec                    s    |jj} fdd|jjD }|tjkr|| }t|jj|j	j|j
j}|D ]<}t| j|jj<  |j |jD ]}tj | qzqRd S |tk	rtdt|dkr|d n  td}t|dkr|d n  |jjd }	t|dkr|d n  td}
d}t|
rH|
jdk rHt|
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* }|\}} + \}} j, } j-|  j./|  |j  j.0  |1  g }g }g } j2D ]}||krt3 j2| st4| dt3|| st4 j2| j5|| j5ksXt4d| d|| j5 d j2| j5 d|/| |/tj||  j |/tj j2|  j q؈ 6||  j7||	|
dd |D } j./|  j-|8d t9|D ]6\}} (|tj)|8d:|d || j5 q |j  j.0  g } j2D ],}||krB|/tj j2|  j qBt|dkr j;dd |D  |8d< }|= dkst4d j-|8d |> }|r j?|	|} j@||} j|jj j%A|  (|jjtj)|| W 5 Q R X t9|D ],\}} (|tj)|B||| j5 q6|jD ]"}ds|t4dtj | qjd S )Nc                    s   g | ]}  |qS r,   r{   rN  rq   r,   r-   r0     s     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 (r3  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   s   g | ]
}|j qS r,   r   rN  r,   r,   r-   r0   <  s     c                 S   s   g | ]
}|j qS r,   r   rP  r,   r,   r-   r0   K  s     z7We use SCF, so the loop body should only have one blockz)Don't know what to do with else after for)Cr|   iterr   rS   r
   static_rangerS  startrI   endstepr   rg   r   r   r   r}   r   r   r   r   RuntimeErrorr   NumrF   r   r   rl   r   r   	TypeErrorsemanticZinteger_promote_implr   r"   r    r!   r   Zcreate_int_castZcreate_undefr   r   rc   r   r'  r   r   r   rR  r(  rj   rE   r(   rG   r   Zcreate_for_opget_bodyrM   rU   r/  Z
get_parentsizeZget_induction_varZ
create_subZ
create_addZreplace_all_uses_withr0  )re   rQ   ZIteratorClassZ	iter_argsiteratorr_  r   r   ZlbZubrb  Znegative_stepZiv_typeZ
iv_ir_typeZiv_is_signedZivr+  ri   rn   r   r1  blockrU  rV  r   r=   Zfor_opZfor_op_regionr,   rq   r-   	visit_For  s    

$&&
$"



$
 0


 $&
zCodeGenerator.visit_Forc                 C   s0   |  |j}|  |j}|  |j}t|||S rB   )r|   lowerupperrb  rY  )re   rQ   rl  rm  rb  r,   r,   r-   visit_Slice`  s    zCodeGenerator.visit_Slicec                 C   s   |  |jS rB   )r|   rI   r   r,   r,   r-   visit_Indexf  s    zCodeGenerator.visit_Indexrz   c                 C   s   |j | |jfS rB   )rU   r|   rI   r   r,   r,   r-   visit_keywordi  s    zCodeGenerator.visit_keywordc                 C   s6   | j s
d S | |j}| |j}tjj||| jdS r9  )r   r|   r5  msgr
   r   device_assertrl   )re   rQ   r5  rq  r,   r,   r-   visit_Assertl  s
    zCodeGenerator.visit_AssertrR   c                    s  t j|jf |  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	|s:t
g |}	tj|jj j}
|jd kr| jn|j}t|\}}t| j|	|
||| j|| j||j||| jjd
}||  |j}|| j|< n
| j| }| j|}| j||}| dksv|d krzd S | dkrt|d|S g }t | D ] }|!t||||  qt"|S d S )Nc                    s   g | ]} | qS r,   r,   )r/   r=   rS   r,   r-   r0   v  s     z2CodeGenerator.call_JitFunction.<locals>.<listcomp>c                 S   s    g | ]}t |r|nt|qS r,   )rE   r   rN  r,   r,   r-   r0   w  s   c                 S   s   g | ]\}}t |r|qS r,   )rF   r/   r   rU   r,   r,   r-   r0   {  s      c                    s   i | ]}| | qS r,   r,   r3   ru  r,   r-   r   |  s      z2CodeGenerator.call_JitFunction.<locals>.<dictcomp>c                    s    g | ]\}}| krd n|qS rB   r,   rv  )
constexprsr,   r-   r0   ~  s     c                 S   s   g | ]}|d k	r|j qS rB   r   rN  r,   r,   r-   r0     s      c                 S   s   g | ]}|d k	r|j qS rB   r   rN  r,   r,   r-   r0     s      )r   r   r   r   rL   r^   r`   r   r   r   )#rZ   getcallargsrR   rP   r   rM   r?   rO   r   Zhas_functionr
   function_typesysmodulesrv   __dict__r   rb   r   r   r   rL   rl   r   r|   r   r   Zget_functioncallZget_num_resultsr   r0  rS  r   r   )re   rR   rS   rt   r   r5   arg_vals	arg_typesfn_namer   ry   r   r^   r`   rd   Zcallee_ret_typesymbolZcall_opresultsr   r,   )rS   rw  r-   call_JitFunctiont  sP         
zCodeGenerator.call_JitFunctionc                    s  t  |j} j|}|d k	r.| |S t fdd|jD } fdd|jD }|tj	j
krp jspd S t|trt|||  |||S t|drt|jstj	|rt jd}t|}d|jkr܈ |d< ||||S | j krtt |}|||S )Nc                 3   s   | ]}  |V  qd S rB   r{   r/   keywordrq   r,   r-   r4    s     z+CodeGenerator.visit_Call.<locals>.<genexpr>c                    s   g | ]}  |qS r,   r{   rN  rq   r,   r-   r0     s     z,CodeGenerator.visit_Call.<locals>.<listcomp>__self__r  Z
_generator)rJ   r|   r    statically_implemented_functionsr   r   keywordsrS   r
   r   rr  r   rC   r   rV   r  hasattrrE   r  
is_builtinrl   rZ   	signature
parametersr   r   r&   )re   rQ   rR   Zstatic_implementationkwsrS   extra_kwargssigr,   rq   r-   r     s*    

 


zCodeGenerator.visit_Callc                 C   s
   t |jS rB   r   rI   r   r,   r,   r-   visit_Constant  s    zCodeGenerator.visit_Constant)rQ   c                 C   sx   t |jdkrtd |d| |jd }| |jd }| jt|j}|d krjt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   rG   r   r
  rO   r  r  r,   r,   r-   visit_BoolOp  s    zCodeGenerator.visit_BoolOplogical_and
logical_orr  )      c                 C   s
   t |jS rB   r  r   r,   r,   r-   visit_NameConstant  s    z CodeGenerator.visit_NameConstantc                 C   s
   t |jS rB   )r   r$  r   r,   r,   r-   	visit_Num  s    zCodeGenerator.visit_Numc                 C   s   t t|S rB   )r   r   literal_evalr   r,   r,   r-   	visit_Str  s    zCodeGenerator.visit_Strc                 C   s<   |  |j}t|r0|jdkr0tjj|| jdS t||jS )NT)rl   )	r|   rI   rE   r   r
   rf  Ztransrl   r   )re   rQ   r   r,   r,   r-   r     s
    
zCodeGenerator.visit_Attributec                 C   s   t j| | d S rB   r   r   r,   r,   r-   
visit_Expr  s    zCodeGenerator.visit_Exprc                 C   s   d S rB   r,   r   r,   r,   r-   visit_NoneType  s    zCodeGenerator.visit_NoneTypec                 C   s   t |j}t|D ]\}}t|tjr6t|j||< qt|tjr|j	}| 
|j}t|sttd |dtt| |dk rdndt| d |j||< qtdt|q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   rM   rC   r   Constantr#   rI   FormattedValue
conversionr|   rF   r   rG   chrr
  r(   r%   )re   rQ   r   r   rI   Zconversion_codeZ	evaluatedr,   r,   r-   visit_JoinedStr  s     
  *zCodeGenerator.visit_JoinedStrc              
      s   |d krd S t   t dt t dt || _| j }t|drxt|drx| j	| j
| j|j |j | j }t |}|r| j	| |W  5 Q R  S Q R X d S )Nignorelineno
col_offset)warningscatch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr   rl   r   r  r   r^   r`   r  r  superr|   )re   rQ   r1  r>   rX  r,   r-   r|     s    


zCodeGenerator.visitc                 C   s   t d |dt|jd S )Nzunsupported AST node type: {})r   r
  rG   rO   r   r,   r,   r-   r     s    zCodeGenerator.generic_visitr   c                    s@   dd  fdd|j D D } fdd|jD }t|| d S )Nc                 S   s   i | ]\}}|t |qS r,   )rJ   )r/   r=   rI   r,   r,   r-   r     s      z6CodeGenerator.execute_static_print.<locals>.<dictcomp>c                 3   s   | ]}  |V  qd S rB   r{   r  rq   r,   r-   r4    s     z5CodeGenerator.execute_static_print.<locals>.<genexpr>c                    s   g | ]}t  |qS r,   )rJ   r|   rN  rq   r,   r-   r0     s     z6CodeGenerator.execute_static_print.<locals>.<listcomp>)r  rS   r   )re   rQ   r  rS   r,   rq   r-   execute_static_print  s    z"CodeGenerator.execute_static_printc              
   C   s   t |j}d|  k rdkr,n n
t |jr4tdt| |jd }t|tsZtd|s|dkrld}nHz| |jd }W n2 t	k
r } zdt
| d }W 5 d }~X Y nX 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   rS   r  re  rJ   r|   rC   r   NotImplementedError	Exceptionr2   r   )re   rQ   	arg_countZpassedmessageer,   r,   r-   execute_static_assert	  s    
"
"z#CodeGenerator.execute_static_assertr  )NFNFFNr   )xrO   rv   rw   r   r   r#   rf   rS  floatintrC   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   operatorr"  r-  r2  r   r   r:  r@  EqNotEqLtLtEGtGtEr=  cmpoprI  USubUAddNotInvertrH  unaryoprW  r[  r]  rk  rn  ro  r   rp  rs  r   r  r   r  BoolOpr  AndOrr  booloprz  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   sx   | d dkr&t | dd  }t|S tjtjtjtjtjtjtj	tj
tjtjtjtjtjtjtjtjtj
d}||  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float64r7  Zint8Zint16Zint32Zint64Zuint8Zuint16Zuint32Zuint64)r=   r)   tysr,   r,   r-   r  #  s,    
r  c                 C   sJ   d}t | D ]8\}}|t|7 }||jkr2|d7 }||jkr|d7 }q|S )Nr  r1   d)rM   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 n tk
rV } z|jd krD|j  W 5 d }~X Y nJ tk
r } z*|j}|d krz tj|t||W 5 d }~X Y nX |j}||_|S )Nc                 S   s   i | ]\}}||  qS r,   )r\   r/   kr   r,   r,   r-   r   M  s      zast_to_ttir.<locals>.<dictcomp>,c                    s   t | tr j| S | S rB   )rC   r#   rP   index)r   rt  r,   r-   <lambda>Q      zast_to_ttir.<locals>.<lambda>c                    s   i | ]\}} ||qS r,   r,   )r/   keyrI   )cst_keyr,   r-   r   R  s      r   c                    s*   i | ]"}|| k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  s      c                    s    g | ]\}}| krt |qS r,   )r  r  r4   r,   r-   r0   [  s      zast_to_ttir.<locals>.<listcomp>T)	ry   r5   r   r   r   r   r^   r`   r   )rC   r#   rM   splitr   r   Zload_tritonitems__globals__rh   r%   rO   r  r   r   r  r  r  rb   r
   ry  r   r|   r   r   rN   Zset_source_coder  r   r2   r   )rR   r  r  r5   r   r   r   ry   r   Znew_constantsZ	new_attrsZall_constantsr  r^   r`   r   rd   r  rQ   r>   r,   )r5   r  rR   r  r-   ast_to_ttirJ  sN    



    
&r  ),r   rZ   r  rz  r  typingr   r   r   r   r   r   r   r  r
   Z_C.libtriton.tritonr   r   r   Zruntimer   errorsr   r   r   r   r?   r   rE   rF   rH   rJ   rV   rb   r  rG   r8  rc   r   rx   r   r  r  r  r,   r,   r,   r-   <module>   s>   $Z      \