
    nVh                     J   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ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mZmZ ddl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&m'Z' ddl(m)Z)m*Z*m+Z+ d Z,d Z-d Z.de
de/fdZ0de
de/fdZ1de
de/fdZ2de
de/fdZ3de
de/fdZ4d Z5d Z6d Z7dee   fdZ8deejr                     dee   fdZ:e/e; e<d      hZ= G d  d!      Z> G d" d#e j~                        Z@ G d$ d%      ZA G d& d'e j~                        ZBd( ZCy))    N)
ModuleType)	AnyCallableDictOptionalTupleTypeUnionIterableList   )language)ir)	constexprsemantic	str_to_tytensor)_unwrap_if_constexprnv_tma_desc_type
base_value	base_type)get_jit_fn_file_line)JITFunction)find_paths_ifget_iterable_pathset_iterable_path   )CompilationErrorCompileTimeAssertionFailureUnsupportedLanguageConstructc                 Z    d}t        j                  ||       st        d| d|  |       | S )Nz^[a-zA-Z_][a-zA-Z0-9_]*$zinvalid z identifier: )rematchr   )nametypepatterns      N/home/dcms/DCMS/lib/python3.12/site-packages/triton/compiler/code_generator.pycheck_identifier_legalityr(      s4    )G88GT"$}TFCTJJK    c                    | j                         r/ddj                  t        t        | j                              z   dz   S | j                         rdt        | j                        z   S | j                         rOt        j                  j                  j                  }| j                  |k(  rdnd}|t        | j                        z   S | j                         rt        |       S | j!                         rFt        | j"                        }dj                  t        t        | j$                              }| d| dS | j'                         ryt)        d|        )	NT_PiuSVUnsupported type )is_tuplejoinmap	mangle_tytypesis_ptr
element_tyis_intr   dtype
SIGNEDNESSSIGNEDint_signednessstrint_bitwidthis_floatingis_blockscalarshapeis_void	TypeError)tyr=   prefixeltrD   s        r'   r6   r6      s   	{{}SXXc)RXX677#==	yy{Yr}}---	yy{**11))V3BOO,,,	~~2w	{{}		"S"((+,awa  	zz|
't,
--r)   c                 |   dj                  |D cg c]  }t        |       c}      }dj                  t        |      D cg c]  }| dt        ||           c}      }|j	                  dd      }|j	                  dd      }|j	                  dd      j	                  dd      }|  d	| d	| }|S c c}w c c}w )
Nr,   c._d_'_sq_[]__)r4   r6   sortedreprreplace)r$   arg_tys	constantsrG   mangled_arg_namesr.   mangled_constantsrets           r'   	mangle_fnr[   2   s    '!BB)B-!BCviGX!Y!QCqil);(<"=!YZ)11#u=)11#v>)11#s;CCCMF"&'r*;)<
=CJ "C!Ys   B4B9oreturnc                 "    t        | t              S N)
isinstancer   r\   s    r'   _is_triton_valuerb   >   s    a$$r)   c                 "    t        | t              S r_   )r`   r   ra   s    r'   _is_triton_tensorrd   B   s    a  r)   c                 b    | d u xs* t        | t        t        j                  j                  f      S r_   )r`   r   r   corer;   ra   s    r'   _is_constexprrg   F   s'    9G
1y(--2E2E&FGGr)   c                     t        |       xr6 | j                  j                          xs | j                  j                  dk(  S Nr   )rd   r%   rB   numelra   s    r'   _is_triton_scalarrk   J   s2    QP):%:%Oafflla>OPr)   c                 .    t        | t        t        f      S r_   )r`   listtuplera   s    r'   _is_list_likero   N   s    a$''r)   c                     |j                   rbt        |      D ]S  \  }}t        |      rt        |      rt	        |j
                  | d|j                   d|j                  |    d|        y y )Nz	Function z= is marked noinline, but was called with non-scalar argument :)noinline	enumeraterg   rk   r    src__name__	arg_names)nodefnargsidxargs        r'   _check_fn_argsr|   R   s    	{{!$ 	HC %.?.D2FFD},ijljvjvwzj{i||}  B  ~C  D 	 r)   c                 b    t        | t              xr t        | t              xr t	        | d      S )N_fields)r`   r%   
issubclassrn   hasattr)vals    r'   _is_namedtupler   \   s'    c4 WZU%;WY@WWr)   c                    t        t        |             r| j                  }nDt        | t        j
                        r| j                  j                  }nJ dt        |               | D cg c]
  } ||       }}|D cg c]  }|j                   }}t	        j
                  |t	        j                  ||            S c c}w c c}w )Nr2   )r   r%   r~   r`   r   rn   fields
tuple_type)valuerx   r   vvalsr7   s         r'   _apply_to_tuple_valuesr   `   s    d5k"	E8>>	*""7)$u+77u !aBqE!D!!"QVV"E">>$ 3 3E6 BCC ""s   *B>?Cvaluesc                 :    g }| D ]  }|j                  |        |S r_   )_flatten_ir)r   handlesr   s      r'   flatten_values_to_irr   m   s'    G 	gNr)   r   r7   c              #   p   K   d}|D ]  }|j                  | |      \  }}|  |t        |       k(  sJ y w)Nr   )_unflatten_irlen)r   r7   cursorrG   r   s        r'   unflatten_ir_valuesr   t   sI     F ((&9v S\!!!s   46c                       e Zd Zd Zd Zd Zy)enter_sub_regionc                     || _         y r_   )	generator)selfr   s     r'   __init__zenter_sub_region.__init__   s	    "r)   c                    | j                   j                  j                         | _        | j                   j                  j                         | _        i | j                   _        | j                   j                  j                         | _        | j                   j                  j                         | _
        | j                  | j                  fS r_   )r   lscopecopyliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_point)r   s    r'   	__enter__zenter_sub_region.__enter__   s    ~~,,11322779$&! NN22FFH NN22FFH||T....r)   c                     | j                   j                  j                  | j                         | j                  | j                   _        | j                  | j                   _        y r_   )r   r   restore_insertion_pointr   r   r   r   r   )r   ry   kwargss      r'   __exit__zenter_sub_region.__exit__   s@    66t7H7HI $$(NN!r)   N)ru   
__module____qualname__r   r   r    r)   r'   r   r      s    #/3r)   r   c                      e Zd Zd ZdefdZdefdZdefdZdej                  defdZ
dej                  defdZdej                  defd	Zdej                  defd
Zdej"                  defdZdej&                  defdZdej*                  defdZdej.                  defdZdej2                  defdZdej6                  defdZy)ContainsReturnCheckerc                     || _         y r_   )gscope)r   r   s     r'   r   zContainsReturnChecker.__init__   s	    r)   r]   c                 ,     t         fd|D              S )Nc              3   @   K   | ]  }j                  |        y wr_   visit).0sr   s     r'   	<genexpr>z5ContainsReturnChecker._visit_stmts.<locals>.<genexpr>   s     /Q4::a=/   )any)r   bodys   ` r'   _visit_stmtsz"ContainsReturnChecker._visit_stmts   s    /$///r)   c                     t        |t              r@|j                  s4|j                         }t	        | j
                        j                  |      S yNF)r`   r   rr   parser   r   r   )r   rx   fn_nodes      r'   _visit_functionz%ContainsReturnChecker._visit_function   s:    b+&r{{hhjG(5;;GDDr)   c                 4   d}t        j                  |      D ]}  \  }}t        |t              r8|D ]2  }t        |t         j                        s|xs | j                  |      }4 Nt        |t         j                        si|xs | j                  |      } |S r   )astiter_fieldsr`   rm   ASTr   )r   rw   rZ   r,   r   items         r'   generic_visitz#ContainsReturnChecker.generic_visit   s    - 	/HAu%&! 6D!$0!5TZZ%56 E377+.TZZ.	/ 
r)   rw   c                 Z   t        |j                  t        j                        rm|j                  j                  | j
                  v rJ| j
                  |j                  j                     }t        ||j                        }| j                  |      S y| j                  |j                        S r   )
r`   r   r   Nameidr   getattrattrr   r   )r   rw   r   rx   s       r'   visit_Attributez%ContainsReturnChecker.visit_Attribute   sw     djj#((+zz}}+DJJMM2UDII.++B//zz$**%%r)   c                     t        |j                        t        j                  u ry|j                  | j
                  v r*| j
                  |j                     }| j                  |      S yr   )r%   ctxr   Storer   r   r   )r   rw   rx   s      r'   
visit_Namez ContainsReturnChecker.visit_Name   sO    >SYY&77dkk!TWW%B''++r)   c                      y)NTr   r   rw   s     r'   visit_Returnz"ContainsReturnChecker.visit_Return       r)   c                      yr   r   r   s     r'   visit_Assignz"ContainsReturnChecker.visit_Assign        r)   c                      yr   r   r   s     r'   visit_AugAssignz%ContainsReturnChecker.visit_AugAssign   r   r)   c                 8    | j                  |j                        S r_   r   r   r   s     r'   visit_Modulez"ContainsReturnChecker.visit_Module         ++r)   c                 8    | j                  |j                        S r_   r   r   s     r'   visit_FunctionDefz'ContainsReturnChecker.visit_FunctionDef   r   r)   c                     | j                  |j                        }|j                  r|xs | j                  |j                        }|S r_   )r   r   orelse)r   rw   rZ   s      r'   visit_IfzContainsReturnChecker.visit_If   s=     		*;;7**4;;7C
r)   c                 r    | j                  |j                        xs | j                  |j                        S r_   )r   r   r   r   s     r'   visit_IfExpz!ContainsReturnChecker.visit_IfExp   s'    zz$))$?

4;;(??r)   c                 8    | j                  |j                        S r_   )r   funcr   s     r'   
visit_Callz ContainsReturnChecker.visit_Call   s    zz$))$$r)   N)ru   r   r   r   boolr   r   r   r   	Attributer   r   r   Returnr   Assignr   	AugAssignr   Moduler   FunctionDefr   Ifr   IfExpr   Callr   r   r)   r'   r   r      s   0D 0T 	T 	&CMM &d &sxx D     
CMM d 
, , ,,coo ,$ ,SVV  @		 @d @%sxx %D %r)   r   c                   X    e Zd Zd Zdej
                  fdZdej
                  fdZd Zy)ASTFunctionc                 <    || _         || _        || _        || _        y r_   )	ret_types	arg_typesrW   attrs)r   r   r   rW   r   s        r'   r   zASTFunction.__init__   s    """
r)   r   c                     g }| j                   D ]I  }||j                  |      }t        |t              r|j	                  |       9|j                  |       K |S r_   )r   to_irr`   rm   extendappend)r   r   r   ret_tyir_tys        r'   return_types_irzASTFunction.return_types_ir   s^    	nn 	(F~LL)E%&  '  '	( r)   c                       fd}t        t         j                  |            }|D cg c]'  }t         j                  |      j	                  |      ) }} j                  |      }|j                  ||      S c c}w )Nc                 ,    | j                   vxr |d uS r_   rW   pathr,   r   s     r'   <lambda>z'ASTFunction.serialize.<locals>.<lambda>      T^^!;!M r)   )rm   r   r   r   r   r   get_function_ty)r   r   is_val	val_pathsr  r   r   s   `      r'   	serializezASTFunction.serialize   st     Nt~~v>?	XabPT&t~~t<BB7Kb	b((1	&&y)<< cs   ,A;c           
          fd  j                         } fd}t        t         j                   |            } j                  j	                         D ]6  \  }}|D ],  \  }}||v s|j                  |j                  |      ||       . 8 t        |      D ]?  \  }	}
t         j                   |
      }t        |t              s-|j                  |	dd       A t        |      D ]K  \  }	}
t         j                   |
      }t        ||
t        j                  |j                  |	      |             M  j                  }|j	                         D ]%  \  }
}t        ||
t        j                   |             ' |S )Nc                     t        | t        t        t        j                  f      r*t        j                  | D cg c]
  } |       c}|       S t        j
                  d       S c c}w r_   )r`   rm   rn   r   r   r   )rG   xmake_templates     r'   r  z.ASTFunction.deserialize.<locals>.make_template  sR    "tUH,?,?@A~~&DA}Q'7&DbII%%d++ 'Es   A&c                 ,    | j                   vxr |d uS r_   r  r  s     r'   r  z)ASTFunction.deserialize.<locals>.<lambda>  r  r)   ztt.nv_tma_descr   )r   rm   r   r   itemsset_arg_attrindexrs   r   r`   r   r   r   r   ry   rW   r   )r   rx   r   r  r  	attr_path
attr_specs	attr_nameattr_valr.   r  rG   rW   r   r  s   `             @r'   deserializezASTFunction.deserialize	  s`   	,
 T^^,Mt~~v>?	%)ZZ%5%5%7 	U!Iz'1 U#	8	)OOIOOI$>	8TU	U !+ 	8GAt"4>>48B"./#3Q7	8
 !+ 	KGAt"4>>48BdD(//"''!*b*IJ	K NN	"* 	CID#dD(*<*<S*AB	Cr)   N)	ru   r   r   r   r   r   r   r	  r  r   r)   r'   r   r      s,    
rzz 
= =r)   r   c                      e Zd ZU 	 	 dcdedee   dee   fdZee	e
eeeefD  ci c]  }|j                   | c}} Zeeef   ed<   ej%                  dej(                  j*                  fdej,                  fd	ej.                  ff       d
 Zd Zd Zdedeeef   ddfdZd Zd Z d Z!d Z"d Z#d Z$defdZ%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d  Z.d! Z/d" Z0d# Z1d$ Z2e3jh                  d%e3jj                  d&e3jl                  d'e3jn                  d(e3jp                  d)e3jr                  d*e3jt                  d+e3jv                  d,e3jx                  d-e3jz                  d.e3j|                  d/e3j~                  d0iZ@eeAe3j                     ef   ed1<   d2 ZCd3 ZDd4 ZEd5 ZFd6 ZGd7 ZHd8 ZIe3j                  d9e3j                  d:e3j                  d;e3j                  d<e3j                  d=e3j                  d>iZPeeAe3j                     ef   ed?<   d@ ZRe3j                  dAe3j                  dBe3j                  dCe3j                  dDiZWeeAe3j                     ef   edE<   dF ZYdG ZZdH Z[dI Z\dJ Z]dK Z^dL Z_dM Z`dN Zadebeef   fdOZcdefdPZddQefdRZedS ZfdT ZgdUe3j                  fdVZie3j                  dWe3j                  dXiZleeAe3j                     ef   edY<   dZ Znd[ Zod\ Zpd] Zqfd^Zrd_ ZsdUe3j                  ddfd`Zuda Zvej(                  j                  euej(                  j                   evey      e eve      e eve      iZzee{e|e3j                  gef   f   edb<   xZ}S c c}} w )dCodeGeneratorNjit_fnfunction_types	file_namec                    || _         t        j                  |      | _        || _        |dz
  | _        | j                  j                  ||d       || j                  _        || j                  _        |i n|| j                  _        |	| j                  j                         n|	| _
        |i n|| _        || _        i | _        |j                         D ]  \  }}t        |t               r*|j#                  |j$                  |      | j                  |<   @t'        |dd      }||v r't'        ||   |j$                        | j                  |<   x|| j                  |<    i | _        || _        |
rt-        |d      }|| _        |
| _        d | _        || _        g | _        d | _        i | _        | j=                         | _        d | _         d| _!        y )Nr   r   r    functionF)"contextr   r   r  
begin_lineset_locoptionscodegen_fns
module_mapcreate_modulemodulefunction_ret_types	prototyper   r  r`   r   getru   r   r   r  r(   function_name	is_kernelcur_noderr   	scf_stackret_typer   _define_name_lookupdereference_namerx   visiting_arg_default_value)r   r  r(  r   r*  r  r"  r#  r$  r&  r+  r  rr   r  r   kr   module_names                     r'   r   zCodeGenerator.__init__)  s    zz'*"$q.Y
A6& $/ (2(:"
6<ndll002&(6(>"N"LLN 		#DAq!Z(!+

A!>A!!\26Kj(!(K)@!**!MA!"A		# 5mZPM*"  .06:6N6N6P +0'r)   builtin_namespaceprintminmaxc                 D    t        | j                  j                  ||      S r_   )r    r  rt   )r   rw   messages      r'   _unsupportedzCodeGenerator._unsupportedc  s    +DKKOOT7KKr)   c                 r    t               }| j                  j                  ||      }||u ryt        |      ryy)NFT)objectr   r)  rg   )r   r$   absent_markerr   s       r'   _is_constexpr_globalz"CodeGenerator._is_constexpr_globalf  s6    kkoodM2-r)   c                 |     dt         f fddt         f fdt               dt         dt        f fd}|S )Nr$   c                 <    j                   j                  | |      S r_   )r   r)  )r$   absentr   s     r'   local_lookupz7CodeGenerator._define_name_lookup.<locals>.local_lookups  s    ;;??400r)   c                 &   j                   j                  | |      }t        ||u | j                  v t	        |      t
        u t        |t              t        |dd      t        |dd      j                  d      t        |t        j                        t        |      j                  |       j                  t        j                   j                  dd      dk(  g      r|S t#        t%        j&                  d	|  d
      j)                  dd            )N__triton_builtin__Fr   r  ztriton.language"TRITON_ALLOW_NON_CONSTEXPR_GLOBALS01z.                Cannot access global variable a   from within @jit'ed
                function. Triton kernels can only access global variables that
                are instanstiated as constexpr (`x = triton.language.constexpr(42)`). Note that this is different from
                annotating a variable as constexpr (`x: triton.language.constexpr = 42`), which is not supported.  Alternatively, set the
                envvar TRITON_ALLOW_NON_CONSTEXPR_GLOBALS=1, but we do not
                promise to support this forever.
 )r   r)  r   r4  r%   r   r`   r   r   
startswithr   r;   r   r>  r1  osenviron	NameErrortextwrapdedentrU   )r$   rA  r   r   s      r'   global_lookupz8CodeGenerator._define_name_lookup.<locals>.global_lookupw  s   ++//$/C 6M44+A+A#AI+sK0C!5u=Cr2==>OPsHNN3"3'--d3 33JJNN#GMQTT  
 %//3f 51!4 5 6=WT35GI Ir)   r]   c                     }j                   j                  fD ]  } || |      }||us|c S  t        |  d      )Nz is not defined)r4  r)  rM  )r$   rA  lookup_functionr   r=  rP  rB  r   s       r'   name_lookupz6CodeGenerator._define_name_lookup.<locals>.name_lookup  sW    "F#/@V@V@Z@Z#Z !'f5& L! tfO455r)   )r?   r<  r   )r   rS  r=  rP  rB  s   ` @@@r'   r/  z!CodeGenerator._define_name_lookupq  sF    	1s 	1	I 	I< 	6c 	6c 	6 	6 r)   r$   r   r]   c                 @    || j                   |<   || j                  |<   y)z This function:
            called by visit_Assign() & visit_FunctionDef() to store left value (lvalue)
        1. record local defined name (FIXME: should consider control flow)
        2. store tensor in self.lvalue
        N)r   r   )r   r$   r   s      r'   	set_valuezCodeGenerator.set_value  s      "D %r)   c                 r    | j                   j                         }| j                   j                         }||fS r_   )r   get_locr   )r   locips      r'   _get_insertion_point_and_locz*CodeGenerator._get_insertion_point_and_loc  s1     ll""$\\--/3wr)   c                 p    | j                   j                  |       | j                   j                  |       y r_   )r   r   r!  )r   rY  rX  s      r'   _set_insertion_point_and_locz*CodeGenerator._set_insertion_point_and_loc  s&    ,,R0S!r)   c                     t        |      s|g}|D ]/  }| j                  |       t        |t        j                        s/ y  y r_   )ro   r   r`   r   r   )r   stmtsstmts      r'   visit_compound_statementz&CodeGenerator.visit_compound_statement  s?    U#GE 	DJJt $

+	r)   c                 D    t         j                  j                  | |       y r_   r   NodeVisitorr   r   s     r'   r   zCodeGenerator.visit_Module      %%dD1r)   c                     | j                  |j                        }|J t        j                  |j                  D cg c]  }| j                  |       c}      }|S c c}w r_   )r   r   r   rn   elts)r   rw   r   rI   rf  s        r'   
visit_ListzCodeGenerator.visit_List  sN    jj"{{~~$))D3tzz#DE Es   Ac                 &     j                  |j                        }g } fd |      }|t        j                  }nCt	        |t        j
                  j                        sJ |j                  |       |j                  } j                  j                  |        j                  | _        n* j                  |k7  rt        d j                   d|        j                  j                         } j                  j                  |       y )Nc                     t        | t        j                        rt        |       S t        | t        j                  t
        t        f      r t        j                  | j                        S | S r_   )
r`   r   rn   r   r   intfloatr   	to_tensorr   )r   decayr   s    r'   rm  z)CodeGenerator.visit_Return.<locals>.decay  sQ    %0-eU;;EH$6$6U#CD))%>>Lr)   zInconsistent return types:  and )r   r   r   voidr`   rf   r   r   r%   r   rZ   r.  rF   create_blockset_insertion_point_to_end)r   rw   	ret_valuer   r   post_ret_blockrm  s   `     @r'   r   zCodeGenerator.visit_Return  s    JJtzz*		 )$	]]Fi)A)ABBB!!'*^^F!== "DM]]f$9$--fXVWW 224//?r)   c                     | j                  |j                        }t        |t        j                  j
                        sJ |j                  S r_   )r   r   r`   r   rf   rn   r   )r   rw   ry   s      r'   visit_StarredzCodeGenerator.visit_Starred  s8    zz$**%$ 3 3444{{r)   c                    | j                  |j                        \  }}| j                  r| j                  |d      t	        |j                  j
                  d d d         D ]  \  }}|j                  j                  | dz
     }|j                  }|j                  }t        j                  |t        j                               }	|t        j                  |	g|      }
nt        j                  |	||      }
	 | j                  rJ d| _        | j                  |
       d| _         | j                  rd	nd
}| j                  j!                  | j"                        }| j"                  j%                  | j&                  | j(                  ||| j*                        | _        | j&                  j-                  | j                         | j                  j/                         }| j                  j1                  | j                        }t3        ||      D ]  \  }}| j5                  ||        | j"                  j7                         }| j"                  j9                  |       | j;                  |j<                         | j"                  j7                         j?                         rJ | j@                  | j@                  tB        jD                  k(  r2tB        jD                  | _         | j"                  jG                  g        n	tI        | j@                  tB        jJ                        r&| j@                  jL                  | j                  _'        n| j@                  g| j                  _'        | j                  jQ                  | j                  j!                  | j"                               | j"                  jG                  | j                  jS                  | j"                        D cg c]  }| j"                  jU                  |       c}       | j                  jW                          |r| j"                  jY                  |       y y # d| _        w xY wc c}w )Nz,nested function definition is not supported.r   r   r   targetsr   )targetr   
annotationTFpublicprivate)-r   ry   rx   r:  rs   defaultsr|  r{   r   r   r   r   	AnnAssignr1  r+  r(  r	  r   get_or_insert_functionr&  r*  rr   	push_backadd_entry_blockr  ziprU  r   set_insertion_point_to_startr`  r   has_terminatorr.  r   ro  rZ   r`   r   r7   r   
reset_typer   create_poisonfinalizerq  )r   rw   rv   kwarg_namesr.   default_valuearg_noder|  r$   	st_target	init_node
visibilityfn_tyentry
arg_valuesarg_name	arg_value	insert_ptrG   s                      r'   r   zCodeGenerator.visit_FunctionDef  s)   !%DII!6	;77##D*XYY )$))*<*<TrT*B C 	8A}yy~~qb1f-H!,,J<<DDciik:I!JJ	{-P	MM-\fg	8::::26/

9%27/	8" "&XY
((6,,55dkk4CUCUW\^hjnjwjwxdgg&'')^^//8
#&y*#= 	0HiNN8Y/	0LL446	11%8%%dii0 <<335DDFFF== DMMX]]$B$MMDMLLR $--)<)<=+/==+>+>(,0MM?(GGt~~77EFLLt~~GeGefjfrfrGstdll88<tuLL33I> ? 38/8 us   :&Q"Q	Q
c                     g }|j                   D ]  }|| j                  |      gz  } | j                  |j                        }||fS r_   )ry   r   kwarg)r   rw   rv   r{   r  s        r'   visit_argumentszCodeGenerator.visit_arguments&  sL    	99 	+C$**S/**I	+jj,+%%r)   c                 Z    t         j                  j                  | |       |j                  S r_   )r   rc  r   r{   r   s     r'   	visit_argzCodeGenerator.visit_arg-  s    %%dD1xxr)   c                 b   | j                  |j                        }| j                  |j                        }| j                  |j                        }|t        k(  rE|| j
                  v rt        | d      t	        |      }|| j
                  |<   | j
                  |   S | j                  |      S )Nz4 is already defined. constexpr cannot be reassigned.)r   r|  r{  r   r   r   
ValueErrorr   )r   rw   r|  r{  r   s        r'   visit_AnnAssignzCodeGenerator.visit_AnnAssign1  s    ZZ0
DKK(

4::&"$ F8 ,D "E F Fe$E"'DKK;;v&&  &&r)   c                 6   t        |t        j                        r7|j                  j                  j
                  dk(  sJ | j                  ||      S t        |t        j                        rq|j                  j                  j
                  dk(  sJ t        |j                        D ]3  \  }}| j                  | j                  |      |j                  |          5 y t        |t        j                        sJ | j                  | j                  |      |       y Nr   )r`   r   	Subscriptr   	__class__ru   visit_Subscript_Storer   rs   rf  rU  r   r   r   )r   r{  r   r.   r$   s        r'   assignTargetzCodeGenerator.assignTargetA  s    fcmm,::''00G;;;--fe<<fcii(::''00G;;;$V[[1 B4tzz$/aAB&#((+++tzz&)51r)   c                      fd  j                  |j                              }t        |t        j                        r|j
                  gn|j                  }t        |      dk(  sJ  j                  |d   |       y )Nc                    t        | t        j                        rt        |       S t        j                  t        j                  f}t        |       } | 7t        |       s,t        | |      s t        j                  | j                        } | S r_   )
r`   r   rn   r   r;   r   rb   r   rl  r   )r   native_nontensor_types_sanitize_valuer   s     r'   r  z3CodeGenerator.visit_Assign.<locals>._sanitize_valueO  so    %0-e_EE&.nnhnn%E"(/E $U+u&<= **5$,,?Lr)   r   r   )	r   r   r`   r   r  r{  rz  r   r  )r   rw   r   rz  r  s   `   @r'   r   zCodeGenerator.visit_AssignM  se    		 !DJJ!78#-dCMM#B4;;-7|q   '!*f-r)   c                 ^   |j                   j                  }t        j                  |t        j                               }t        j
                  ||j                  |j                        }t        j                  |j                   g|      }| j                  |       | j                  |      S )Nrx  ry  )r{  r   r   r   LoadBinOpopr   r   r   r0  )r   rw   r$   lhsrhsassigns         r'   r   zCodeGenerator.visit_AugAssign_  sr    {{~~hh$CHHJ/iiTWWdjj1T[[M=

6$$T**r)   c                     t        |j                        t        j                  u r|j                  S | j                  |j                        S r_   )r%   r   r   r   r   r0  r   s     r'   r   zCodeGenerator.visit_Nameg  s4    >SYY&77N$$TWW--r)   c                 D    t         j                  j                  | |       y r_   rb  r   s     r'   visit_StorezCodeGenerator.visit_Storel  rd  r)   c                 D    t         j                  j                  | |       y r_   rb  r   s     r'   
visit_LoadzCodeGenerator.visit_Loado  rd  r)   c                     |j                   D cg c]  }| j                  |       }}t        j                  |      S c c}w r_   )rf  r   r   rn   )r   rw   r  ry   s       r'   visit_TuplezCodeGenerator.visit_Tupler  s5    '+yy1!

111~~d## 2s   >c                     t        |      r t        ||      || j                        S t        |      r5t        j                  dd|      } t        ||      || j                        S  t        ||      |      S )N_builderz__(.*)__z__r\1__)rd   r   r   r"   sub)r   method_namer  r  reverse_method_names        r'   _apply_binary_methodz"CodeGenerator._apply_binary_methodv  sn    S!,73,S4<<HHS!"$&&j+"N473 34S4<<PP(wsK(--r)   c                 ^   | j                  |j                        }| j                  |j                        }| j                  j	                  t        |j                              }|5| j                  |dj                  |j                  j                              | j                  |||      S )Nz8AST binary operator '{}' is not (currently) implemented.)r   leftright_method_name_for_bin_opr)  r%   r  r:  formatru   r  r   rw   r  r  r  s        r'   visit_BinOpzCodeGenerator.visit_BinOp  s    jj#jj$2266tDGG}E##D$^$e$efjfmfmfvfv$wy y((c3??r)   __add____sub____mul____truediv____floordiv____mod____pow__
__lshift__
__rshift____and____or____xor__r  c                    | j                   j                  |       | j                  |j                         | j                   j	                         }| j
                  j                         }i }|j                  r| j                   j                  |       |j                         | _        i | _        | j                  |j                         | j
                  j                         }| j                   j	                         }g }|D ]  }|df|dffD ]a  \  }	}
||	v st        |	|         t        ||         k(  }|r |	|   j                  ||   j                  k(  rJJ d| d||    d|
 d|	|            ||v s||v r|j                  |       ||v r||vr||   ||<   ||v s||vs||   ||<    t        |j                         |j                         z        D ]i  }||v r||   }|j                  }||   }|j                  }t        |      t        |      k(  }|r||k(  sJ d| d| d	| d
       |j                  |       k |||||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   r%   r   rS   keys)r   rw   r   
then_block
else_block	then_defs	else_defsnamesr$   defs
block_name
type_equalthen_valthen_tyelse_valelse_tys                   r'   visit_then_else_blocksz$CodeGenerator.visit_then_else_blocks  s~   11*=%%dii0\\557
OO((*		;;LL55jA!,,.DK DO))$++6,,.I99;J  	0D&/%89f:M$N S j4<!%d4j!1T'$-5H!HJ%$t*//WT]=O=O*O S-dV= P##-,.Ed4j\SSOS y DI$5T"y T%:")$-	$y T%:")$-	$	0$ 9>>+inn.>>? 	Du} HmmG HmmGh4>9J'W"4 .&tf,A' K##*)1..4 LL	 )ZUBBr)   c                 @   t        |       5 }|\  }}| j                  j                         }| j                  j                         }| j                  j                  |       | j                  j	                  |j
                  ||       | j                  ||||      \  }}}| j                  j                         }	| j                  j                  |       |j                         rJ |        t        fd|D              }
| j                  j                  |	|
       | j                  j                  |       |j                         rJ |        t        fd|D              }| j                  j                  |	|       t        |
      t        |      k(  sJ t        |
|      D ];  \  }}|j                         }||j                         k(  sJ |	j                  |       = 	 d d d        | j                  j                  	       t        t        
            D cg c]  }|	j!                  |       }}D cg c]  }|   j"                   }}t%        ||      }t        ||      D ]  \  }}| j'                  ||        y # 1 sw Y   xY wc c}w c c}w )Nc              3   (   K   | ]	  }|     y wr_   r   r   r$   r  s     r'   r   z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>       /RD	$/R   c              3   (   K   | ]	  }|     y wr_   r   r   r$   r  s     r'   r   z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>  r  r  )r   r   rp  rq  create_cond_branchhandler  r  r   create_branchr   r  get_typeadd_argumentr  ranger{   r%   r   rU  )r   condrw   srr   ip_blockr  r  r  endif_blockthen_handleselse_handlesthen_helse_hrG   r.   res_handlesr$   r7   
new_values	new_valuer  r  s                        @@r'   visit_if_top_levelz CodeGenerator.visit_if_top_level  sI   d# 	-r "GX224J224JLL33H=LL++DKKZP ++D':zR @Iy*j% ,,335KLL33J?!002CzlC2//RE/RRLLL&&{LALL33J?!002CzlC2//RE/RRLLL&&{LA|$L(9999"%lL"A -__&V__....((,-/	-: 	11+>38\9J3KLa{q)LL278$4%%88(e<
"5*5 	,OD)NN4+	,E	- 	-> M8s   GJ
!J?J
Jc                 B   t        |       5 }|\  }}| j                         \  }}| j                  j                         }|j                  r| j                  j                         nd }	| j                  ||||	      \  }}	}
t        fd|
D              }| j                  ||       | j                  j                  |D cg c]  }|j                          c}|j                  d      }|j                  |j                                | j                  j                  |j                                t        |
      dkD  r| j                  j                  |       |j                  s|j!                         }	n|	j                  |j!                                | j                  j                  |j!                                t        |
      dkD  r/t        fd|
D              }| j                  j                  |       d d d        t#        t                    D cg c]  }j%                  |       }}
D cg c]  }|   j&                   }}t)        ||      }t+        |
|      D ]  \  }}| j-                  ||        y c c}w # 1 sw Y   xY wc c}w c c}w )Nc              3   (   K   | ]	  }|     y wr_   r   r  s     r'   r   z-CodeGenerator.visit_if_scf.<locals>.<genexpr>  r  r  Tr   c              3   (   K   | ]	  }|     y wr_   r   r  s     r'   r   z-CodeGenerator.visit_if_scf.<locals>.<genexpr>  s     3VIdO3Vr  )r   rZ  r   rp  r   r  r   r\  create_if_opr  r  merge_block_beforeget_then_blockrq  r   create_yield_opget_else_blockr  
get_resultr%   r   r  rU  )r   r  rw   r  r   r,   rY  last_locr  r  r  r  hif_opr  r.   r  r$   r7   r  r  r  r  s                        @@r'   visit_if_scfzCodeGenerator.visit_if_scf  s-   d# 	;rJGQ<<>LB224J8<224J++D':zR @Iy*j% 0/RE/RRL--b(;LL--\.Rqzz|.RTXT_T_aefE))%*>*>*@ALL33E4H4H4JK5zA~,,\:;;"113
--e.B.B.DELL33E4H4H4JK5zA~33VPU3VV,,\:-	;0 5:#l:K4LMqu''*MM278$4%%88(e<
"5*5 	,OD)NN4+	,# /S	; 	;0 N8s+   B4JJ
D&JJ;JJJc           	         | j                  |j                        }t        |      r|j                  t        j
                  | j                        }t        | j                        j                  |      }|r1| j                  r| j                  |d      | j                  ||       y | j                  ||       y t        |      }t        |      t        vrO| j                  |dj!                  dj#                  d t        D              t        |      j$                              |r|j&                  n|j(                  }| j+                  |       y )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)O`if` conditionals can only accept values of type {{{}}}, not objects of type {}, c              3   4   K   | ]  }|j                     y wr_   ru   r   r,   s     r'   r   z)CodeGenerator.visit_If.<locals>.<genexpr>&       !G!**!G   )r   testrd   tor   int1r   r   r   r-  r:  r  r  r   r%   _condition_typesr  r4   ru   r   r   r`  )r   rw   r  contains_returnactive_blocks        r'   r   zCodeGenerator.visit_If  s   zz$))$T"778==4<<7@D3DKK@FFtLO>>++ TU U ''d3!!$-'-DDz!11''krr		!G6F!GGT
++-. .
 )-499$++L)),7r)   c           	      L   | j                  |j                        }t        |      rO|j                  t        j
                  | j                        }t        |       5  | j                         \  }}| j                  j                         }| j                  j                  |       t        j                  | j                  |j                        | j                        }| j                  j                         }| j                  j                         }| j                  j                  |       t        j                  | j                  |j                        | j                        }| j                  j                         }| j!                  ||       |j"                  |j"                  k(  s!J d|j"                   d|j"                          |j"                  }	|	t        j$                  k7  r|	j'                  | j                        gng }
| j                  j)                  |
|j*                  d      }|j-                  |j/                                |
rO| j                  j1                  |j/                                | j                  j3                  |j*                  g       | j                  j1                  |j/                                |j-                  |j5                                |
rO| j                  j1                  |j5                                | j                  j3                  |j*                  g       |
r/t        j6                  j9                  |j;                  d      |	      nd cd d d        S t=        |      }t#        |      t>        vrO| jA                  |djC                  djE                  d t>        D              t#        |      jF                              |r| j                  |j                        S | j                  |j                        S # 1 sw Y   y xY w)	Nr  zATernary expression with dynamic condition has inconsistent types rn  Tr   r	  r
  c              3   4   K   | ]  }|j                     y wr_   r  r  s     r'   r   z,CodeGenerator.visit_IfExp.<locals>.<genexpr>Z  r  r  )$r   r  rd   r  r   r  r   r   rZ  rp  r  r   rl  r   r   r   r\  r%   ro  r   r  r  r  r   rq  r  r  rf   r   r  r   r  r:  r  r4   ru   )r   rw   r  rY  r  r  r  r  r  r.  ret_type_irr  s               r'   r   zCodeGenerator.visit_IfExp,  s#   zz$))$T"778==4<<7@D!$' !d#@@BH!\\668
99*E#--djj.CT\\R!\\==?
!\\668
99*E $--djj.Et||T!\\==?
11"h?}}5 |WX`XeXeWffkltlylykz{|5#==@HHMM@Yx~~dll;<_a11+t{{DQ--e.B.B.DELL;;E<P<P<RSLL00(//1BC778L8L8NO--e.B.B.DELL;;E<P<P<RSLL00(//1BCNYx}}++E,<,<Q,?J_cC!d !dF (-D Dz!11''krr		!G6F!GGT
++-. . zz$)),,zz$++..]!d !ds   LPP#c                      y r_   r   r   s     r'   
visit_PasszCodeGenerator.visit_Passa  s    r)   c                    t        |j                        dk(  rt        |j                        dk(  s| j                  |d      | j	                  |j
                        }| j	                  |j                  d         }t        |      }t        |      }t        |j                  d         t        j                  u rt        ||u       S t        |j                  d         t        j                  u rt        ||u      S | j                  j                  t        |j                  d               }|8| j                  |dj                  |j                  d   j                              | j!                  |||      S )Nr   z1simultaneous multiple comparison is not supportedr   z<AST comparison operator '{}' is not (currently) implemented.)r   comparatorsopsr:  r   r  r   r%   r   Isr   IsNot_method_name_for_comp_opr)  r  ru   r  )r   rw   r  r  	lhs_value	rhs_valuer  s          r'   visit_ComparezCodeGenerator.visit_Compared  s@   D$$%*s488}/A##D*]^^jj#jj))!,-(-	(-	&Y)344		)Yi7883377TXXa[8IJ##T[[\`\d\def\g\p\pqs s((c3??r)   __eq____ne____lt____le____gt____ge__r   c           
         | j                  |j                        }| j                  j                  t	        |j
                              }|*| j                  |d|j
                  j                   d      t        |      r t        ||      | j                        S 	  t        ||             S # t        $ r, | j                  |d| dt	        |      j                         w xY w)NzAST unary operator 'z!' is not (currently) implemented.r  z)' is not (currently) implemented on type )r   operand_method_name_for_unary_opr)  r%   r  r:  ru   rd   r   r   AttributeError)r   rw   r+  rx   s       r'   visit_UnaryOpzCodeGenerator.visit_UnaryOpy  s    **T\\*++//TWW>:##D,@AQAQ@RRs*tuuW%'77B'>>	t'77B')) 	t##,RD0YZ^_fZgZpZpYqrt t	ts   B0 05C%__neg____pos____not__
__invert__r,  c                 2   t        |      sJ d| d       t        |      sJ d| d       t        |      t        |      u sJ d| d       t        |      r?|j                  |j                  k(  s%J d| d|j                   d|j                   d	       y y )
Nzcannot reassign constxpr z in the loopzcannot reasign constexpr zLoop carried variable z changed typezLoop-carried variable z has initial type z but is re-assigned to z: in loop! Please make sure that the type stays consistent.)rb   r%   rd   )r   r$   loop_vallive_vals       r'   _verify_loop_carried_variablez+CodeGenerator._verify_loop_carried_variable  s    )Y-FtfL+YY))Y-FtfL+YY)H~h/]3I$}1]]/$X.(--8==2P 	@$TF*<X]]O L%%-]]O 4?@	@P2P.r)   c                 $	   t        |       5 }|\  }}| j                         \  }}| j                  j                         }| j                  j	                  |       | j
                  j                  |       | j                  |j                         | j
                  j                          | j                  }|j                          g }	g }
|D ]F  }||v s||   }||   }| j                  |||       |	j                  |       |
j                  |       H t        |
      }|D cg c]  }|j                          }}|
D cg c]  }|j                   }}| j!                  ||       | j                  j#                  ||      }| j                  j%                  |j'                         |      }| j                  j	                  |       t)        t+        |            D cg c]  }|j-                  |       }}t/        ||      }t1        |	|      D ]#  \  }}|| j2                  |<   || j                  |<   % | j5                  |j6                        }| j                  j9                  |       | j                  j;                  |j<                  |       | j                  j%                  |j?                         |      }| j                  j	                  |       t)        t+        |            D cg c]  }|j-                  |       }}t/        ||      }t1        |	|      D ]#  \  }}|| j2                  |<   || j                  |<   % | j
                  j                  |       | j                  |j                         | j
                  j                          | j                  }g }|D ]  }||v s||   jA                  |        | j                  jC                  |       d d d        t)        t+                    D cg c]  }jE                  |       }}t/        |      }t1        	|      D ]#  \  }} | | j2                  |<   | | j                  |<   % |jF                  D ]  }!J d        y c c}w c c}w c c}w c c}w # 1 sw Y   xY wc c}w )NzNot implemented)'r   rZ  r   rp  r  r-  r   r`  r   popr   eraser6  r   r  r%   r\  create_while_opcreate_block_with_parent
get_beforer  r   r{   r   r  r   r   r  rq  create_condition_opr  	get_afterr   r  r  r   r   rc  r   )"r   rw   r  r   r   rY  r  dummy	loop_defsr  	init_argsr$   r4  r5  init_handlesr  init_tysainit_fe_tyswhile_opbefore_blockr.   
block_argscondition_argsr   r  after_blockbody_handles	body_argsyieldsresult_handlesresult_valsnew_defr_  s"                                     r'   visit_WhilezCodeGenerator.visit_While  s   d# @	1r$&!G\<<>LB LL--/ELL55e<NN!!$'))$))4NN IKKM EI! 	/7?(H&t}H66tXxP LL&$$X.	/ 0	:L.:;

;H;+45a1665K5--b(;||33HlKH<<@@ATATAVX`aLLL55lC7<S=N7OP!,**1-PJP0[IN 7 ,	c$'D!(+%, ::dii(DLL33LALL,,T[[*E,,??@R@R@TV^_K LL55kB8=c,>O8PQ1KOOA.QLQ+L+FI 	2 ,	c$'D!(+%, NN!!$'))$))4NN IF! 87?dO//78 LL((0A@	1F ;@L@Q:RSQ(--a0SS).+F 4 	,MD' 'DKK$+DOOD!	, KK 	6D+++5	6Y <5 Q Re@	1 @	1F TsX   CRAR$Q-;RQ2BRQ77C7R.Q<B'R.1R=R-RR
c                    |j                   j                  j                  dk(  sJ | j                  |j                        }| j                  |j
                        }t        |      r|j                  || j                        S ||   S )Nr  r  )	r   r  ru   r   r   slicerd   __getitem__r   )r   rw   r  slicess       r'   visit_Subscript_Loadz"CodeGenerator.visit_Subscript_Load  sm    xx!!**f444jj$DJJ'S!??6DLL?AA6{r)   c                    |j                   j                  j                  dk(  sJ | j                  |j                        }| j                  |j
                        }t        |t        j                        sJ |j                  ||       y r  )
r   r  ru   r   r   rS  r`   r   rn   __setitem__)r   rw   r   r  rU  s        r'   r  z#CodeGenerator.visit_Subscript_Store  sf    xx!!**g555jj$DJJ'#x~~...&r)   c                 $    | j                  |      S r_   )rV  r   s     r'   visit_SubscriptzCodeGenerator.visit_Subscript  s    ((..r)   c                 ^    |j                   D cg c]  }| j                  |       c}S c c}w r_   )dimsr   )r   rw   dims      r'   visit_ExtSlicezCodeGenerator.visit_ExtSlice  s"    +/995C

3555s   *c           	      z     j                  |j                  j                        }|j                  j                  D cg c]  } j                  |       }}t	         fd|j                  j
                  D              }|t        j                  k(  r ||i |}t        |j                  j                  |j                  j                  |j                  j                        }|D ]z  }t        |       j                  |j                  j                   <    j#                  |j$                         |j&                  D ]"  }	t(        j*                  j-                   |	       $ | y d }
d }d}d}|t        j                  u r] ||i |}|j                  }|j                  }|j                  }|j.                  }
|j0                  }|j2                  }|j4                  }n|t        u rt7        |      dkD  r|d   n# j                  t)        j8                  d            }t7        |      dkD  r|d   n' j                  |j                  j                  d         }t7        |      dkD  r|d   n# j                  t)        j8                  d            }nt;        d      d}t=        |      r+|j                  dk  rt        |j                         }d}||}}t?        j@                  | jB                        }t?        j@                  | jB                        }t?        j@                  | jB                        }|jD                  jG                         r4|jD                  jG                         r|jD                  jG                         s3tI        d|jD                   d	|jD                   d	|jD                   d
      t?        jJ                  |jD                  |jD                        }t?        jJ                  ||jD                        }|jM                   jB                        }|jN                  t        jP                  jD                  jR                  jT                  k(  }|jV                  }|jV                  }|jV                  } jB                  jY                  |||      } jB                  jY                  |||      } jB                  jY                  |||      } jB                  j[                  |      } j]                  |j                  j                   t        jP                  j_                  ||             ta               5 }|\  }} jc                         \  }} jB                  je                         } jB                  jg                  |        jh                  jk                  |        j#                  |j$                          jh                  jm                          |jo                          g }g }g } jp                  D ]a  }||v s jp                  |   } ||   }! js                  || |!       |jk                  |       |jk                  |!       |jk                  |        c  ju                  ||       tw        |      }"|D #cg c]  }#|#jx                   }$}# jB                  j{                  ||||"      }%t}        |
      +|%j                  d jB                  j                  |
             t}        |      +|%j                  d jB                  j                  |             |r*|%j                  d jB                  j                                |r*|%j                  d jB                  j                                 jh                  jk                  |       |%j                  d      }& jB                  jg                  |&       |j                          _        i  _8        t        t7        |"            D cg c]  }|&j                  |dz          }'}t        |'|$      }(t        ||(      D ]  \  }}) j]                  ||)         j#                  |j$                          jh                  jm                          g } jp                  D ]W  }||v s jp                  |   }*t        |*t              r t?        j@                  |* jB                        }*|jk                  |*       Y t7        |      dkD  r&tw        |      }+ jB                  j                  |+       |&j                         },|,j                         dk(  sJ d        jB                  jg                  |&       |%j                         }|r8 jB                  j                  ||      } jB                  j                  ||      } j                  |j                  j                      jV                  j                  |        j]                  |j                  j                   t        jP                  j_                  ||             d d d        t        t7        "            D cg c]  }%j                  |       }-}t        |-$      }.t        |.      D ]  \  }}) j]                  ||)        |j&                  D ]  }	J d        y c c}w c c}#w c c}w # 1 sw Y   xY wc c}w )Nc              3   @   K   | ]  }j                  |        y wr_   r   r   keywordr   s     r'   r   z*CodeGenerator.visit_For.<locals>.<genexpr>  s     Q74::g.Qr   Fr   r   r   zAOnly `range` and `static_range` iterators are currently supportedTz0For loop bounds and step must all be ints, are (r
  r  ztt.num_stagesztt.loop_unroll_factorztt.disallow_acc_multi_bufferz
tt.flattenz7We use SCF, so the loop body should only have one blockz)Don't know what to do with else after for)Pr   iterr   ry   dictkeywordsr   static_ranger  startr   endstepr   r   r{  r   r`  r   r   r   rc  r   
num_stagesloop_unroll_factordisallow_acc_multi_bufferflattenr   NumRuntimeErrorrg   r   rl  r   r;   r:   rF   integer_promote_implr   r>   rf   r<   r=   r  create_int_castr  rU  r   r   rZ  rp  r  r-  r   r8  r9  r   r6  r\  r   r%   create_for_opr   set_attrget_int32_attrget_unit_attrget_bodyr   r{   r   r  r`   r  
get_parentsizeget_induction_var
create_sub
create_addreplace_all_uses_withr  )/r   rw   IteratorClassr{   	iter_argsiter_kwargsiteratorrf  r.   r_  rj  rk  rl  rm  lbubri  negative_stepiv_type
iv_ir_typeiv_is_signedivr  r   r   rY  r  blockrA  rM  r  r$   r4  r5  rB  r   rC  for_opfor_op_bodyblock_handlesrH  r   localyield_handlesfor_op_regionrN  result_valuess/   `                                              r'   	visit_ForzCodeGenerator.visit_For  s   

499>>204		?TZZ_?	?Qdii>P>PQQH111$i?;?H !5!5x||7I7I8==K^K^_L! >.7lDKKNN+--dii8 KK >DOO11$=>>
 
!$)!HNN*$i?;?H BB==D!,,J!)!<!<(0(J(J%&&Ge# "%Y!!31CGGAJ9OB!$Y!!31DIINNSTDU9VB#&y>A#59Q<4::cggaj;QDbcc4::>djj[)D MBDLL1DLL1!!$5xx (9ARARATNrxxjXZ[][c[cZddfgkgqgqfrrstuu//"((C//D]]4<<0
--1D1D1O1O1V1VVYYYY{{\\))"j,G\\))"j,G||++D*lK\\''
3t{{~~x}}';';B'HId# L	Nr$&!G\<<>LB LL--/ELL55e<NN!!$'))$))4NN KKM IFE ,7?#t4H&t}H66tXxPLL&$$X.MM(+, --b(;/	:L(1212H2\\//BlKF#J/;1L1LZ1XY#$67C 79T9TUg9hi( >@Z@Z@\]dll.H.H.JKNN!!$' //!,KLL55kB!,,.DK DO=B3|CT=UV[__QU3VMV,]HEJ 
3 *	ctS)*))$))4NN F )7? OOD1E!%3 ( 2 25$,, GMM%() 6{Q 4V <,,];'224M %%'1,g.gg, LL55kB))+B\\,,R4\\,,R4KK'..DDRHNN4;;>>8==+?+?G+LMYL	N^ 9>c,>O8PQ1&++A.QQ+NHEUM2 	&ID#NN4%	& KK 	6DEEE5	6i @~ 3" WaL	N L	N^ RsF   j7Cj,?A=j,<j"Ej,,j'A>j,Fj,9j8"
j,,j5c                     | j                  |j                        }| j                  |j                        }| j                  |j                        }t	        j
                  |||      S r_   )r   lowerupperri  r   rS  )r   rw   r  r  ri  s        r'   visit_SlicezCodeGenerator.visit_Slice  sK    

4::&

4::&zz$))$~~eUD11r)   c                 8    | j                  |j                        S r_   )r   r   r   s     r'   visit_IndexzCodeGenerator.visit_Index  s    zz$**%%r)   c                 P    |j                   | j                  |j                        fS r_   )r{   r   r   r   s     r'   visit_keywordzCodeGenerator.visit_keyword  s    xxDJJ///r)   c                     | j                  |j                        }|j                  | j                  |j                        nd}t        j                  j                  ||| j                        S )Nr  r  )r   r  msgr   rf   device_assertr   )r   rw   r  r  s       r'   visit_AssertzCodeGenerator.visit_Assert  sQ    zz$))$&*hh&:djj"}}**4t||*LLr)   rx   c                 N   t        j                  |j                  g|i |}|j                  D cg c]  }||   	 }}t	        |      D ]W  \  }}t        |t        j                  t        t        t        t        f      s6t        j                  j                  |      ||<   Y t        |d       }|D ci c]  }|t        ||       }}t        |d       }	|	D cg c]  }t        ||       }
}t!        |j"                  |
D cg c]  }|j$                   c}|      }| j&                  j)                  |      sL|j*                  }t-        |      \  }}|D cg c]Y  }|/t        |t        t        t        j                  j                  f      rt        j                  j                  n|j$                  [ }}t/        g ||t1                     }t3        | j4                  ||| j&                  ||| j6                  |j8                  ||| j:                  j<                  | j:                  j>                  | j:                  j@                        }	 |jC                  |jE                                |jP                  }|| j6                  |<   n| j6                  |   }| j&                  jS                  |      }|
D cg c]  }|jT                   }
}| j:                  jW                  ||
      }|t        jX                  k(  ry t[        |j]                               D cg c]  }|j_                  |       }}ta        tc        ||g            S c c}w c c}w c c}w c c}w c c}w # tF        $ r1}tI        | jJ                  jL                  | jN                  d       |d }~ww xY wc c}w c c}w )Nc                     t        |      S r_   rg   r,   r  s     r'   r  z0CodeGenerator.call_JitFunction.<locals>.<lambda>  s    M!4D r)   c                     t        |       S r_   r  r  s     r'   r  z0CodeGenerator.call_JitFunction.<locals>.<lambda>  s    q9I5I r)   )
r&  r  r*  r  rr   r  r   r"  r#  r$  )2inspectgetcallargsrx   rv   rs   r`   r   r;   rk  rj  r   r   rf   r   r   r   r[   ru   r%   r&  has_function__globals__r   r   rd  r  r  r'  rr   r   r"  r#  r$  r   r   	Exceptionr   r  rt   r,  r.  get_functionr  callro  r  get_num_resultsr  nextr   )r   rx   ry   r   r$   r.   r{   args_cstr  	args_pathargs_valfn_namer   r  r   r   r(  r   ecallee_ret_typesymbolcall_opr   s                          r'   call_JitFunctionzCodeGenerator.call_JitFunction  s    ""255:4:6:')||4tT
44o 	7FAs#sD+NO"--11#6Q	7 !'DEDLMDD+D$77MM!$(IJ	>GHd%dD1HHBKKh)Gs#(()GR{{''0^^F$8$<!Iz    ,/;*SFJCQYQ^Q^QdQdEe;g''loltltuI 
 $B	8TVDI%dllIvdkkbd4;DLcLc/1{{i\f.2ll.B.BPTP\P\PhPh151H1H	JI
T
+
 (00O/>D##G,"55g>O))'2*233CJJ33,,##FH5hmm+278O8O8Q2RSQ7%%a(SS'/1BCDDU 5
 NH)G  T&t{{tLRSST 4 TsB   M6MMM
AMM  7NN" 	N),NNc                 P    t         j                  |j                              } j                  j	                  |      }|	 | |      S t         fd|j                  D              }|j                  D cg c]  } j                  |       }}t        t        j                  j                  d |D                    }t        |t              r t        |||        j                  |||      S t!        |d      rt#        |j$                        st&        j(                  j+                  |      rhd j,                  i}t/        j0                  |      }d|j2                  v r |d<   	  ||i ||}	t        |	t4              rt'        j4                  |	      }	|	S | j>                  jA                         v rtC        t         |      } ||i |}	tE        tG        |	            rtI        |	d       S |	S c c}w # t6        $ r'}
t9         j:                  j<                  |d       |
d }
~
ww xY w)Nc              3   @   K   | ]  }j                  |        y wr_   r   ra  s     r'   r   z+CodeGenerator.visit_Call.<locals>.<genexpr>  s     D74::g&Dr   c              3   F   K   | ]  }t        |t              r|n|g  y wr_   )r`   rm   )r   r  s     r'   r   z+CodeGenerator.visit_Call.<locals>.<genexpr>  s#     1bXYz!T7J!QRPS2S1bs   !__self__r  
_generatorc                     | S r_   r   )r  s    r'   r  z*CodeGenerator.visit_Call.<locals>.<lambda>  s    Q r)   )%r   r   r    statically_implemented_functionsr)  rd  re  ry   rm   	itertoolschainfrom_iterabler`   r   r|   r  r   rb   r  r   rf   
is_builtinr   r  	signature
parametersrn   r  r   r  rt   r4  r   r5   r   r%   r   )r   rw   rx   static_implementationkwsr{   ry   extra_kwargssigrZ   r  s   `          r'   r   zCodeGenerator.visit_Call  s   !$**TYY"78 $ E E I I" M ,(t44DdmmDD+/995C

355IOO111b]a1bbcb+&4T*((T377B
#(8(E(--JbJbceJf&5L##B'Cs~~--1\*K$6,6#6c5)"..-C
 ''..00+T2D$#;I$s);T%c;7]Z]]9 6   K 't{{dCJKs   8G0(0G5 5	H%>"H  H%c                 ,    t        |j                        S r_   )r   r   r   s     r'   visit_ConstantzCodeGenerator.visit_Constant  s    $$r)   rw   c                    t        |j                        dk7  r| j                  |d      | j                  |j                  d         }| j                  |j                  d         }| j                  j                  t        |j                              }|5| j                  |dj                  |j                  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)  r%   r  r  ru   r  r  s        r'   visit_BoolOpzCodeGenerator.visit_BoolOp  s    t{{q ##vx xjjQ(jjQ(3377TWWF##QXXY]Y`Y`YiYijl l((c3??r)   logical_and
logical_orr  c                     | j                  |j                        }t        |      r1|j                  dk(  r"t	        j
                  |d| j                        S t        ||j                        S )Nr+   )r   r   )r   )r   r   rd   r   r   permuter   r   )r   rw   r  s      r'   r   zCodeGenerator.visit_Attribute  sQ    jj$S!dii3&6##CFFsDII&&r)   c                 D    t         j                  j                  | |       y r_   rb  r   s     r'   
visit_ExprzCodeGenerator.visit_Expr  rd  r)   c                      y r_   r   r   s     r'   visit_NoneTypezCodeGenerator.visit_NoneType  r   r)   c           
      p   t        |j                        }t        |      D ]  \  }}t        |t        j
                        rt        |j                        ||<   :t        |t        j                        r|j                  }| j                  |j                        }t        |      s'| j                  |dt        t        |            z         |dk  rdndt        |      z   dz   j                  |j                        ||<   t!        dj                  t        |                   dj#                  |      S )Nz^Cannot evaluate f-string containing non-constexpr conversion values, found conversion of type r   z{}z{!}z:encountered unexpected node of type {} in a JoinedStr noder  )rm   r   rs   r`   r   Constantr?   r   FormattedValue
conversionr   rg   r:  r%   chrr  AssertionErrorr4   )r   rw   r   r.   r   conversion_code	evaluateds          r'   visit_JoinedStrzCodeGenerator.visit_JoinedStr  s   dkk"!&) 	wHAu%.,q	E3#5#56"'"2"2 JJu{{3	$Y/++xd9o./0 0 &5q%8TdSEY>Y\_>_gghqhwhwxq	$%a%h%himnsit%uvv	w wwvr)   c           	         |y t        j                         5  t        j                  dt               t        j                  dt               | j
                  }| j                  j                         }|| _        t        |d      rnt        |d      rb| j                  j                  | j                  | j                  |j                  z   |j                         | j                  j                         }	 t        | =  |      }|r"|| _        | j                  j                  |       |cd d d        S # t         $ r  t"        $ r:}t!        | j$                  j&                  | j
                  t)        |            d d }~ww xY w# 1 sw Y   y xY w)Nignorelineno
col_offset)warningscatch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr,  r   rW  r   r!  r  r   r  r  superr   r   r  r  rt   rT   )r   rw   	last_noder  rZ   r  r  s         r'   r   zCodeGenerator.visit#  sB   <$$& 	 !!(,>?!!(,EFI||++-H DMtX&74+F$$T^^T__t{{5RTXTcTcd<<//1ZgmD)  )$$X.1	 	 $  Z 't{{tAwOUYYZ	 	s0   CF6D4%F4F 5E;;F  FFc                 j    | j                  |dj                  t        |      j                              )Nzunsupported AST node type: {})r:  r  r%   ru   r   s     r'   r   zCodeGenerator.generic_visit@  s,    &E&L&LTRVZM`M`&abbr)   c                    t        |j                        }d|cxk  rdk  r"n t        d      t        |j                        rt        d      t	        | j                  |j                  d               }t        |t              st        d      |sQ|dk(  rd}n	 | j                  |j                  d         }t        | j                  j                  |t	        |            y # t        $ r}dt        |      z   dz   }Y d }~Jd }~ww xY w)	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   ry   re  rF   r   r   r`   r   NotImplementedErrorr  rT   r   r  rt   )r   rw   	arg_countpassedr9  r  s         r'   execute_static_assertz#CodeGenerator.execute_static_assertC  s    		N	I""[\\ (+4=='9[\\%djj1&>?&$'% D  A~X"jj16G .dkkootEYZaEbcc	 ! XG$q'QTWWGXs   C$ $	D-DDc                 4     dt         j                  f fd}|S )Nrw   c                      fd|j                   D        D ci c]  \  }}|t        |       }}}|j                  D cg c]  }t         j                  |             }}t	         |i |      S c c}}w c c}w )Nc              3   @   K   | ]  }j                  |        y wr_   r   ra  s     r'   r   z=CodeGenerator.static_executor.<locals>.ret.<locals>.<genexpr>^  s     #UGDJJw$7#Ur   )re  r   ry   r   r   )r   rw   r$   r   r  r{   ry   	python_fns   `      r'   rZ   z*CodeGenerator.static_executor.<locals>.ret[  s     $Vt}}#UD% *511C  FJYYOc(C9ODOY4455 Ps   A6!A<)r   r   )r  rZ   s   ` r'   static_executorzCodeGenerator.static_executorY  s    	6CHH 	6 
r)   r  )NFNFNr   )~ru   r   r   r   r   r   r?   r   r   rm   r  rk  rj  r`   r   r4  r   __annotations__updater   rf   device_printminimummaximumr:  r>  r/  r
   r   r   rU  rZ  r\  r`  r   rg  r   ru  r   r  r  r  r  r   r   r   r  r  r  r  r  r   AddSubMultDivFloorDivModPowLShiftRShiftBitAndBitOrBitXorr  r	   operatorr  r  r  r   r   r  r#  EqNotEqLtLtEGtGtEr   cmpopr.  USubUAddNotInvertr,  unaryopr6  rQ  rV  r  rZ  r^  r  r  r  r   r  r  r  r   r  BoolOpr  AndOrr  boolopr   r  r  r  r   r   r   r  r  static_assertstatic_printr5  r  r<  r   __classcell__)r   r,   r  s   00@r'   r  r  '  s    `e=>10+ 10?G~10$SM10f BEdESXZ]_ikr@s(t1Q(ttCH~t	(--,,-	  !	  ! L	.`&c &%
I0E*F &4 &"	2@<S 
3?j&' 
2.$+.
22$.@ 	)n

L

L

I		8

I>T$s||"4c"9: 2Ch$,N,>863/j@$ 	#))Xsvvx(TWTZTZ\dfifmfmow<d4		?C#78 t 	)SXXy#''9cjjR^?tD$5s$:; @L6\'/6X6t2&0U38_ 0MC M
,E; ,E\#^J%
@ 
@ >AWWmUXU[U[]i<jd4

#3S#89j'2$:c#(( t ,
 	##%:""OE$:_S!_S!	Q$d68SXXJO3L+L&M S  )us   Mr  c                    t        t        t        |j                  j	                                     }t        g ||j                  |j                        }t        |       \  }}	ddl	m
}
 t        d |j                        }|D ci c]"  }| j                  |d      |j                  |   $ }}|j                  }  |
dddg      ||      }t        ||| j                  j                         | j!                  |      | d||	|||      }|j#                  | j%                                |j&                  }||_        |S c c}w )	Nr   )
namedtuplec                     t        |       dk(  S ri   )r   )r   s    r'   r  zast_to_ttir.<locals>.<lambda>s  s    c!fk r)   SpecializationProxyrW   r  T)	r   r*  r  r+  r  r   r"  r#  r$  )rm   r5   r   r  r   r   rW   r   r   collectionsr  filterrv   r  r  r   rT   r   r   r&  r  )rx   rt   r  r"  r#  r$  r   r(  r  r   r  leavesr.   rW   r  proxyr   rZ   s                     r'   ast_to_ttirr   m  s   SCMM$8$8$:;<IB	3==#))DI04Iz&)3==9F?EF!ad#S]]1%55FIFIIJ,{K.HI)U^_Egy9L9L9N^`^e^efk^luw(,	jbi*5*NI OOBHHJ


CCKJ Gs   'D;)Dr   r  r"   r  rK  rN  r  r7   r   typingr   r   r   r   r   r	   r
   r   r   r  r   _C.libtritonr   r   r   r   r   language.corer   r   r   r   runtime.jitr   runtimer   _utilsr   r   r   errorsr   r   r    r(   r6   r[   r   rb   rd   rg   rk   ro   r|   r   r   r   r   r   rj  r%   r  r   rc  r   r   r  r   r   r)   r'   <module>r(     sR   
  	  	    T T T   = = Y Y . ! H H a a.(	% % %! ! !HS HT HQ Q Q(S (T (X
D*!5 "bhh "Y " #tDz* 3 3*U%COO U%p8 8vCCOO CL"r)   