
    rhG                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
 d dlmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZ ddlmZmZmZ dd	lmZm Z 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l+m,Z,m-Z-m.Z. d Z/d Z0dede1fdZ2dede1fdZ3dede1fdZ4dede1fdZ5dede1fdZ6d Z7d Z8d Z9dee    fdZ:deejv                     dee!   fdZ<e1e= e>d      hZ? G d  d!      Z@ G d" d#e j                        ZB G d$ d%      ZC ed&'       G d( d)             ZD G d* d+e j                        ZEd-d,ZFy).    N)	dataclass)
ModuleType)	AnyCallableDictOptionalTupleTypeUnionIterableList   )knobslanguage)irgluon_ir)	constexpr	str_to_tytensor)_unwrap_if_constexpr
base_value	base_type)get_jit_fn_file_lineget_full_name)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      q/var/www/html/ai-insurance-compliance-backend/venv/lib/python3.12/site-packages/triton/compiler/code_generator.pycheck_identifier_legalityr*      s4    )G88GT"$}TFCTJJK    c                    dj                  |D cg c]  }|j                          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 )
N_c._d_'_sq_[]__)joinmanglesortedreprreplace)r&   arg_tys	constantstymangled_arg_namesimangled_constantsrets           r)   	mangle_fnrB      s    !@""))+!@AviGX!Y!QCqil);(<"=!YZ)11#u=)11#v>)11#s;CCCMF"&'r*;)<
=CJ "A!Ys   B9B>oreturnc                 "    t        | t              S N)
isinstancer   rC   s    r)   _is_triton_valuerI   +   s    a$$r+   c                 "    t        | t              S rF   )rG   r   rH   s    r)   _is_triton_tensorrK   /   s    a  r+   c                 l    | d u xs/ t        | t        t        j                  j                  t
        f      S rF   )rG   r   r   coredtyper   rH   s    r)   _is_constexprrO   3   s)    9T
1y(--2E2E{&STTr+   c                     t        |       xr5 | j                  j                         xr | j                  j                  dk7  S Nr   )rK   r'   is_blocknumelrH   s    r)   _is_non_scalar_tensorrT   7   s/    QMQVV__%6%L166<<1;LMr+   c                 .    t        | t        t        f      S rF   )rG   listtuplerH   s    r)   _is_list_likerX   ;   s    a$''r+   c                     |j                   rbt        |      D ]S  \  }}t        |      rt        |      st	        |j
                  | d|j                   d|j                  |    d|        y y )Nz	Function z= is marked noinline, but was called with non-scalar argument :)noinline	enumeraterO   rT   r"   src__name__	arg_names)nodefnargsidxargs        r)   _check_fn_argsre   ?   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)rG   r'   
issubclassrW   hasattr)vals    r)   _is_namedtuplerk   I   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]  }|t        |      n| }}|D cg c]  }|j                   }}t	        j
                  |t	        j                  ||            S c c}w c c}w c c}w )NzUnsupported type )	rk   r'   rg   rG   r   rW   fieldsr   
tuple_type)valuera   rm   vvalstypess         r)   _apply_to_tuple_valuesrs   M   s    d5k"	E8>>	*""7)$u+77u !aBqE!D!6:;AIIaL1,;D;!"QVV"E">>$ 3 3E6 BCC ";"s   *C?CC$valuesc                 :    g }| D ]  }|j                  |        |S rF   )_flatten_ir)rt   handlesrp   s      r)   flatten_values_to_irrx   [   s'    G 	gNr+   rw   rr   c              #   p   K   d}|D ]  }|j                  | |      \  }}|  |t        |       k(  sJ y w)Nr   )_unflatten_irlen)rw   rr   cursorr=   ro   s        r)   unflatten_ir_valuesr}   b   sI     F ((&9v S\!!!s   46c                       e Zd Zd Zd Zd Zy)enter_sub_regionc                     || _         y rF   )	generator)selfr   s     r)   __init__zenter_sub_region.__init__o   s	    "r+   c                    | j                   j                  j                         | _        | j                   j                  j                         | _        i | j                   _        | j                   j                  j                         | _        | j                   j                  j                         | _
        | j                  | j                  fS rF   )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__r   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 rF   )r   r   restore_insertion_pointr   r   r   r   r   )r   rb   kwargss      r)   __exit__zenter_sub_region.__exit__{   s@    66t7H7HI $$(NN!r+   N)r^   
__module____qualname__r   r   r    r+   r)   r   r   m   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 rF   )gscope)r   r   s     r)   r   zContainsReturnChecker.__init__   s	    r+   rD   c                 ,     t         fd|D              S )Nc              3   @   K   | ]  }j                  |        y wrF   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                      yNFr   )r   ra   s     r)   _visit_functionz%ContainsReturnChecker._visit_function   s     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_fieldsrG   rV   ASTr   )r   r`   rA   r-   ro   items         r)   generic_visitz#ContainsReturnChecker.generic_visit   s    - 	/HAu%&! 6D!$0!5TZZ%56 E377+.TZZ.	/ 
r+   r`   c                 Z   t        |j                  t        j                        rm|j                  j                  | j
                  v rJ| j
                  |j                  j                     }t        ||j                        }| j                  |      S y| j                  |j                        S r   )
rG   ro   r   Nameidr   getattrattrr   r   )r   r`   ro   ra   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   r`   ra   s      r)   
visit_Namez ContainsReturnChecker.visit_Name   sO    >SYY&77dkk!TWW%B''++r+   c                      yNTr   r   r`   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 rF   r   r   r   s     r)   visit_Modulez"ContainsReturnChecker.visit_Module         ++r+   c                 8    | j                  |j                        S rF   r   r   s     r)   visit_FunctionDefz'ContainsReturnChecker.visit_FunctionDef   r   r+   c                     | j                  |j                        }|j                  r|xs | j                  |j                        }|S rF   )r   r   orelse)r   r`   rA   s      r)   visit_IfzContainsReturnChecker.visit_If   s=     		*;;7**4;;7C
r+   c                 r    | j                  |j                        xs | j                  |j                        S rF   )r   r   r   r   s     r)   visit_IfExpz!ContainsReturnChecker.visit_IfExp   s'    zz$))$?

4;;(??r+   c                 8    | j                  |j                        S rF   )r   funcr   s     r)   
visit_Callz ContainsReturnChecker.visit_Call   s    zz$))$$r+   N)r^   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                       e Zd Zd Zdej
                  dee   deej                     fdZ	dej
                  deej                     fdZ
dej
                  fdZd Zy	)
ASTFunctionc                 <    || _         || _        || _        || _        y rF   )	ret_types	arg_typesr<   attrs)r   r   r   r<   r   s        r)   r   zASTFunction.__init__   s    """
r+   r   rr   rD   c                 B    g }|D ]  }||j                  ||        |S rF   )_flatten_ir_types)r   r   rr   ir_typesr=   s        r)   flatten_ir_typeszASTFunction.flatten_ir_types   s5     	4Bz  (3	4 r+   c                 :    | j                  || j                        S rF   )r   r   )r   r   s     r)   return_types_irzASTFunction.return_types_ir   s    $$Wdnn==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 rF   r<   pathr-   r   s     r)   <lambda>z'ASTFunction.serialize.<locals>.<lambda>       T^^!;!M r+   )rV   r   r   r   r   r   get_function_ty)r   r   is_val	val_pathsr   r   arg_types_irret_types_irs   `       r)   	serializezASTFunction.serialize   sz     Nt~~v>?	IRS&t~~t<S	S,,Wi@++G4&&|\BB Ts   A>c                 p    fd  j                         } fd}t        t         j                   |            }d}t        |j	                               D cg c]  }|j                  |       }}|D ]s  }t         j                   |      }	 j                  j                  |g       }
|
D ]  \  }}|j                  |||        |	j                  ||      \  }}t        |||       u  j                  }|j                         D ]%  \  }}t        ||t        j                  |             ' |S c c}w )Nc                     t        | t        t        t        j                  f      r*t        j                  | D cg c]
  } |       c}|       S t        j
                  d       S c c}w rF   )rG   rV   rW   r   rn   r   )r=   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 rF   r   r   s     r)   r   z)ASTFunction.deserialize.<locals>.<lambda>   r   r+   r   )r   rV   r   rangeget_num_argsrb   r   r   getset_arg_attrrz   r   r<   itemsr   r   )r   ra   rq   r   r   r|   r?   rw   r   r=   
attr_specs	attr_nameattr_valrj   r<   r   s   `              @r)   deserializezASTFunction.deserialize   s"   	,
 T^^,Mt~~v>?	',R__->'?@!2771:@@ 	/D"4>>48Bb1J'1 =#	8	8<= **7F;KCdD#.	/ NN	"* 	CID#dD(*<*<S*AB	C As   D3N)r^   r   r   r   r   r   r   r   r'   r   r   r   r  r   r+   r)   r   r      sj    

 4	? tTVT[T[} >rzz >d277m >C Cr+   r   T)frozenc                   "    e Zd ZU eed<   eed<   y)BoundJITMethod__self____func__N)r^   r   r   r   __annotations__r   r   r+   r)   r  r    s    r+   r  c                      e Zd ZU 	 	 dgdedee   dee   fdZe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j0                  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! Z0d" Z1d# Z2d$ Z3e4jj                  d%e4jl                  d&e4jn                  d'e4jp                  d(e4jr                  d)e4jt                  d*e4jv                  d+e4jx                  d,e4jz                  d-e4j|                  d.e4j~                  d/e4j                  d0iZAeeBe4j                     ef   ed1<   d2 ZDd3 ZEd4 ZFd5 ZGd6 ZHd7 ZId8 ZJe4j                  d9e4j                  d:e4j                  d;e4j                  d<e4j                  d=e4j                  d>iZQeeBe4j                     ef   ed?<   d@ ZSe4j                  dAe4j                  dBe4j                  dCe4j                  dDiZXeeBe4j                     ef   edE<   dF ZZdG Z[dH Z\dI Z]dJ Z^dK Z_dL Z`dM ZadN ZbdO ZcdP Zddeeeef   fdQZfdefdRZgdSefdTZhdU ZidV ZjdWe4j                  fdXZle4j                  dYe4j                  dZiZoeeBe4j                     ef   ed[<   d\ Zqd] Zrd^ Zsd_ Ztfd`Zuda ZvdWe4j                  ddfdbZxdc ZydddelzmZ{ ej*                  j                  exej*                  j                   eye~      e{j                  exe{j                   eye~      e eye      e eye      iZeeee4j                  gef   f   edf<   xZS c c}} w )hCodeGeneratorNjit_fnfunction_types	file_namec                    || _         |j                         r8ddlm} t	        j
                  |      | _         || j                        | _        n7ddlm	} t        j                  |      | _         || j                        | _        || _        |dz
  | _        | j                  j                  ||d       || j                  _        || j                  _        |i n|| j                  _        |	| j                  j#                         n|	| _        |i n|| _        || _        i | _        |j-                         D ]  \  }}t/        |t0              r*|j3                  |j4                  |      | j*                  |<   @t7        |dd      }||v r't7        ||   |j4                        | j*                  |<   x|| j*                  |<    i | _        || _        |
r#||j=                  d      dz   d  }t?        |d      }|| _         |
| _!        d | _"        || _#        g | _$        d | _%        i | _&        | jO                         | _(        d | _)        d	| _*        y )
Nr   )GluonSemantic)TritonSemanticr   r    r/   functionF)+contextis_gluon,triton.experimental.gluon.language._semanticr  r   GluonOpBuilderr   semantictriton.language.semanticr  r   r  
begin_lineset_locoptionscodegen_fns
module_mapcreate_modulemodulefunction_ret_types	prototyper   r   rG   r   r   r^   r   r   r
  rfindr*   function_name	is_kernelcur_noder[   	scf_stackret_typer   _define_name_lookupdereference_namera   visiting_arg_default_value)r   r  r   r   r"  r
  r  r  r  r  r#  r  r[   r  r  r  r  krp   module_names                       r)   r   zCodeGenerator.__init__  s    ??R#227;DL)$,,7DM?::g.DL*4<<8DM"$q.Y
A6& $/ (2(:"
6<ndll002&(6(>"N"LLN 		#DAq!Z(!+

A!>A!!\26Kj(!(K)@!**!MA!"A		# )-*=*=c*BQ*F*GHM5mZPM*"  .06:6N6N6P +0'r+   builtin_namespaceprintminmaxc                 D    t        | j                  j                  ||      S rF   )r"   r
  r]   )r   r`   messages      r)   _unsupportedzCodeGenerator._unsupported`  s    +DKKOOT7KKr+   c                 r    t               }| j                  j                  ||      }||u ryt        |      ryy)NFT)objectr   r   rO   )r   r&   absent_markerrj   s       r)   _is_constexpr_globalz"CodeGenerator._is_constexpr_globalc  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 rF   )r   r   )r&   absentr   s     r)   local_lookupz7CodeGenerator._define_name_lookup.<locals>.local_lookupp  s    ;;??400r+   c                 b   j                   j                  | |      }t        ||u | j                  v t	        |      t
        u t        |t              t        |dd      t        |dd      t        |dd      j                  d      t        |dd      j                  d      t        |t        j                        t        |      j                  |       j                  t        j                   j"                  g      r|S t%        t'        j(                  d|  d	      j+                  d
d            )N__triton_builtin__F__triton_aggregate__r   r  ztriton.languagez"triton.experimental.gluon.languagez.                Cannot access global variable a   from within @jit'ed
                function. Triton kernels can only access global variables that
                are instanstiated as constexpr (`x = triton.language.constexpr(42)`). Note that this is different from
                annotating a variable as constexpr (`x: triton.language.constexpr = 42`), which is not supported.  Alternatively, set the
                envvar TRITON_ALLOW_NON_CONSTEXPR_GLOBALS=1, but we do not
                promise to support this forever.
 )r   r   r   r,  r'   r   rG   r   r   
startswithr   rN   rk   r6  r)  r   compilationallow_non_constexpr_globals	NameErrortextwrapdedentr:   )r&   r9  rj   r   s      r)   global_lookupz8CodeGenerator._define_name_lookup.<locals>.global_lookupt  s   ++//$/C 6MD222I+sK0C!5u=C!7?Cr2==>OPCr2==>bcsHNN3"3'--d3 33%%AA! $ 
 %//3f 51!4 5 6=WT35GI Ir+   rD   c                     }j                   j                  fD ]  } || |      }||us|c S  t        |  d      )Nz is not defined)r,  r   rC  )r&   r9  lookup_functionro   r5  rF  r:  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+   )strr4  r   )r   rI  r5  rF  r:  s   ` @@@r)   r'  z!CodeGenerator._define_name_lookupn  sG    	1s 	1	I 	IB 	6c 	6c 	6 	6 r+   r&   ro   rD   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&   ro   s      r)   	set_valuezCodeGenerator.set_value  s      "D %r+   c                 r    | j                   j                         }| j                   j                         }||fS rF   )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 rF   )r   r   r  )r   rP  rO  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 rF   )rX   r   rG   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 rF   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 rF   )r   r   r   rW   elts)r   r`   r   eltr]  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j                  j                  |       S | S rF   )	rG   r   rW   rs   r   intfloatr  	to_tensor)ro   decayr   s    r)   re  z)CodeGenerator.visit_Return.<locals>.decay  sO    %0-eU;;EH$6$6U#CD}}..u55Lr+   zInconsistent return types:  and )r   ro   r   voidrG   rM   r   rv   r'   r   rA   r&  	TypeErrorcreate_blockset_insertion_point_to_end)r   r`   	ret_valuerw   ret_typost_ret_blockre  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 rF   )r   ro   rG   r   rM   rW   rt   )r   r`   rb   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   targetsro   )targetro   
annotationTFpublicprivate)-r   rb   ra   r2  r\   defaultsru  rd   r   r   r   r   	AnnAssignr)  r#  r   r   r   get_or_insert_functionr  r"  r[   	push_backadd_entry_blockr  ziprL  r   set_insertion_point_to_startrW  r   has_terminatorr&  r   rg  rA   rG   rn   rr   r   
reset_typer   create_poisonfinalizerj  )r   r`   r_   kwarg_namesr?   default_valuearg_noderu  r&   	st_target	init_node
visibilityfn_tyentry
arg_valuesarg_name	arg_value	insert_ptr=   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 rF   )rb   r   kwarg)r   r`   r_   rd   r  s        r)   visit_argumentszCodeGenerator.visit_arguments&  sL    	99 	+C$**S/**I	+jj,+%%r+   c                 Z    t         j                  j                  | |       |j                  S rF   )r   rZ  r   rd   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   ru  rt  ro   r   r   
ValueErrorr   )r   r`   ru  rt  ro   s        r)   visit_AnnAssignzCodeGenerator.visit_AnnAssign1  s    ZZ0
DKK(

4::&"$ F8 ,D "E F Fe$E"'DKK;;v&&  &&r+   c                 j   t        |j                  t        j                        sJ t        |t        j                        r| j                  ||      S t        |t        j                        r=t        |j                        D ]$  \  }}| j                  ||j                  |          & y t        |t        j                        r3| j                  |j                        }t        ||j                  |       y t        |t        j                         sJ | j#                  | j                  |      |       y rF   )rG   r   r   r   	Subscriptvisit_Subscript_Storer	   r\   r]  assignTargetrt   r   r   ro   setattrr   r   rL  )r   rt  ro   r?   bases        r)   r  zCodeGenerator.assignTargetA  s    &**cii000fcmm,--fe<<fcii(&v{{3 ;	6!!&%,,q/:;fcmm,::fll+DD&++u-&#((+++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        |       } | 2t        |       s't        | |      sj                  j                  |       } | S rF   )	rG   r   rW   rs   rN   r   rI   r  rd  )ro   native_nontensor_types_sanitize_valuer   s     r)   r  z3CodeGenerator.visit_Assign.<locals>._sanitize_valueR  sm    %0-e_EE&.nnhnn%E"(/E $U+u&<=//6Lr+   r   r   )	r   ro   rG   r   ry  rt  rs  r{   r  )r   r`   rt   rs  r  s   `   @r)   r   zCodeGenerator.visit_AssignP  se    		 !DJJ!78#-dCMM#B4;;-7|q   '!*f-r+   c                 P   t        j                  |j                        }t        j                         |_        t        j                  ||j                  |j                        }t        j                  |j                  g|      }| j                  |       | j                  |      S )Nrr  )r   deepcopyrt  r   Loadr   BinOpopro   r   r   )r   r`   lhsrhsassigns        r)   r   zCodeGenerator.visit_AugAssignb  sk    mmDKK(((*iiTWWdjj1T[[M=

6zz#r+   c                     t        |j                        t        j                  u r|j                  S | j                  |j                        S rF   )r'   r   r   r   r   r(  r   s     r)   r   zCodeGenerator.visit_Namej  s4    >SYY&77N$$TWW--r+   c                 D    t         j                  j                  | |       y rF   rY  r   s     r)   visit_StorezCodeGenerator.visit_Storeo  r[  r+   c                 D    t         j                  j                  | |       y rF   rY  r   s     r)   
visit_LoadzCodeGenerator.visit_Loadr  r[  r+   c                     |j                   D cg c]  }| j                  |       }}t        j                  |      S c c}w rF   )r]  r   r   rW   )r   r`   r   rb   s       r)   visit_TuplezCodeGenerator.visit_Tupleu  s5    '+yy1!

111~~d## 2s   >c                 n   t        |      r t        ||      || j                        S t        |      r5t        j                  dd|      } t        ||      || j                        S t        |t        t        j                  f      st        |t              rt        |      } t        ||      |      S )N	_semanticz__(.*)__z__r\1__)	rK   r   r  r$   subrG   r   r   rW   )r   method_namer  r  reverse_method_names        r)   _apply_binary_methodz"CodeGenerator._apply_binary_methody  s    S!,73,SDMMJJS!"$&&j+"N473 34SDMMRR#	8>>:;
3PY@ZC.C(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  r2  formatr^   r  )r   r`   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~  rW  r   r   r   r   r   r   r'   appendr8   keys)r   r`   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rF   r   r   r&   r  s     r)   r   z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>       /RD	$/R   c              3   (   K   | ]	  }|     y wrF   r   r   r&   r  s     r)   r   z3CodeGenerator.visit_if_top_level.<locals>.<genexpr>  r  r  )r   r   ri  rj  create_cond_branchhandler  r  rx   create_branchr{   r}  get_typeadd_argumentr~  r   rd   r'   r}   rL  )r   condr`   srr   ip_blockr  r  r  endif_blockthen_handleselse_handlesthen_helse_hr=   r?   res_handlesr&   rr   
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rF   r   r  s     r)   r   z-CodeGenerator.visit_if_scf.<locals>.<genexpr>   r  r  Tr   c              3   (   K   | ]	  }|     y wrF   r   r  s     r)   r   z-CodeGenerator.visit_if_scf.<locals>.<genexpr>  s     3VIdO3Vr  )r   rQ  r   ri  r   r  rx   rS  create_if_opr  r  merge_block_beforeget_then_blockrj  r{   create_yield_opget_else_blockr   
get_resultr'   r}   r}  rL  )r   r  r`   r  r   r-   rP  last_locr  r  r  r  hif_opr  r?   r  r&   rr   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-t        |      r| j	                  |d      |j
                  j                         rat        j                  dt        j                  |j                        z         t        j                  j                  || j                  |       }|j                  t        j                   | j                        }t#        | j$                        j                  |      }|r1| j&                  r| j	                  |d      | j)                  ||       y | j+                  ||       y t-        |      }t        |      t.        vrO| j	                  |dj1                  dj3                  d t.        D              t        |      j4                              |r|j6                  n|j8                  }| j;                  |       y )	Nz=Boolean value of Tensor with more than one value is ambiguousziIf conditional called with multidimensional Tensor instead of scalar; please use "if (%s).item()" instead)r  
_generatorr  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rF   r^   r   r-   s     r)   r   z)CodeGenerator.visit_If.<locals>.<genexpr>2       !G!**!G   )r   testrK   rT   r2  r'   rR   warningswarnr   unparser   rM   _unsplatr  toint1r   r   r%  r  r   r   _condition_typesr  r6   r^   r   r   rW  )r   r`   r  contains_returnactive_blocks        r)   r   zCodeGenerator.visit_If  s   zz$))$T"$T*''.mnnyy!!# Bkk$)),-.  }}--ddmmX\-]778==DMM7BD3DKK@FFtLO>>++ TU U ''d3!!$-'-DDz!11''krr		!G6F!GGT
++-. .
 )-499$++L)),7r+   c           	      8   | j                  |j                        }t        |      rE|j                  t        j
                  | j                        }t        |       5  | j                         \  }}| j                  j                         }| j                  j                  |       | j                  j                  | j                  |j                              }| j                  j                         }| j                  j                         }| j                  j                  |       | 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 rf  Tr   r  r  c              3   4   K   | ]  }|j                     y wrF   r  r  s     r)   r   z,CodeGenerator.visit_IfExp.<locals>.<genexpr>f  r  r	  )$r   r
  rK   r  r   r  r  r   rQ  r   ri  r~  rd  r   r   r   rS  r'   rg  to_irr  r  r  r  rj  r  r  rM   r   r  r   r  r2  r  r6   r^   )r   r`   r  rP  r  r  r  r  r  r&  ret_type_irr  s               r)   r   zCodeGenerator.visit_IfExp8  s   zz$))$T"778==DMM7BD!$' !d#@@BH!\\668
99*E==224::dii3HI!\\==?
!\\668
99*E  ==224::dkk3JK!\\==?
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 rF   r   r   s     r)   
visit_PasszCodeGenerator.visit_Passm  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opsr2  r   r  r   r'   r   Isr   IsNot_method_name_for_comp_opr   r  r^   r  )r   r`   r  r  	lhs_value	rhs_valuer  s          r)   visit_ComparezCodeGenerator.visit_Comparep  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? |dk(  rt        |       cY S | j                  |d| dt	        |      j                         w xY w)NzAST unary operator 'z!' is not (currently) implemented.r  __not__z)' is not (currently) implemented on type )r   operand_method_name_for_unary_opr   r'   r  r2  r^   rK   r   r  AttributeErrorr   )r   r`   r+  ra   s       r)   visit_UnaryOpzCodeGenerator.visit_UnaryOp  s    **T\\*++//TWW>:##D,@AQAQ@RRs*tuuW%'77B'$--@@	t'77B')) 	tY W--##,RD0YZ^_fZgZpZpYqrt t	ts   B0 0C8,C8__neg____pos__r*  
__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.)rI   r'   rK   )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                 8    | j                  |j                        S rF   )r   context_exprr   s     r)   visit_withitemzCodeGenerator.visit_withitem  s    zz$++,,r+   c                    t        |j                        dk(  sJ |j                  d   j                  }| j                  |j                        }|t
        j                  k(  r_|j                  D cg c]  }| j                  |       }} ||d| j                  i5  | j                  |j                         d d d        y | j                  |j                         y c c}w # 1 sw Y   y xY w)Nr   r   _builder)r{   r   r7  r   r   r   
async_taskrb   r   rW  r   )r   r`   r  withitemClassrd   rb   s         r)   
visit_WithzCodeGenerator.visit_With  s    4::!###**Q-,,

7<<0H////6||<DJJsO<D<<t||< 9--dii89 9 ))$))4	 =9 9s   0CC""C+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   rQ  r   ri  r~  r%  r  rW  r   popr   eraser5  rx   r  r'   rS  create_while_opcreate_block_with_parent
get_beforer   r{   rd   r}   r}  r   r   r
  rj  create_condition_opr  	get_afterrv   r  r  r   r   rZ  r   )"r   r`   r  r   r   rP  r  dummy	loop_defsr  	init_argsr&   r3  r4  init_handlesr  init_tysainit_fe_tyswhile_opbefore_blockr?   
block_argscondition_argsrj   r  after_blockbody_handles	body_argsyieldsresult_handlesresult_valsnew_defrV  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                    t        |j                  t        j                        sJ | j	                  |j
                        }| j	                  |j                        }t        |      r|j                  || j                        S ||   S )Nr  )
rG   r   r   r  r   ro   slicerK   __getitem__r  )r   r`   r  slicess       r)   visit_Subscript_Loadz"CodeGenerator.visit_Subscript_Load  sg    $((CHH---jj$DJJ'S!??6T]]?CC6{r+   c                    t        |j                  t        j                        sJ | j	                  |j
                        }| j	                  |j                        }t        |t        j                        sJ |j                  ||       y rF   )
rG   r   r   r   r   ro   rZ  r   rW   __setitem__)r   r`   ro   r  r\  s        r)   r  z#CodeGenerator.visit_Subscript_Store  s`    $((CII...jj$DJJ'#x~~...&r+   c                 $    | j                  |      S rF   )r]  r   s     r)   visit_SubscriptzCodeGenerator.visit_Subscript  s    ((..r+   c                 ^    |j                   D cg c]  }| j                  |       c}S c c}w rF   )dimsr   )r   r`   dims      r)   visit_ExtSlicezCodeGenerator.visit_ExtSlice  s"    +/995C

3555s   *c           	           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}d}|t        j                  u ri ||i |}|j                  }|j                  }|j                  }|j.                  }
|j0                  }|j2                  }|j4                  }|j6                  }n|t        u rt9        |      dkD  r|d   n# j                  t)        j:                  d            }t9        |      dkD  r|d   n' j                  |j                  j                  d         }t9        |      dkD  r|d   n# j                  t)        j:                  d            }nt=        d      d}t?        |      r+|j                  dk  rt        |j                         }d}||}} j@                  jC                  |      } j@                  jC                  |      } j@                  jC                  |      }|jD                  jG                         r4|jD                  jG                         r|jD                  jG                         s3tI        d|jD                   d	|jD                   d	|jD                   d
       j@                  jK                  |jD                  |jD                        } j@                  jK                  ||jD                        }|jM                   jN                        }|jP                  t        jR                  jD                  jT                  jV                  k(  }|jX                  }|jX                  }|jX                  } jN                  j[                  |||      } jN                  j[                  |||      } jN                  j[                  |||      } jN                  j]                  |      } j_                  |j                  j                   t        jR                  ja                  ||             tc               5 }|\  }} je                         \  }} jN                  jg                         } jN                  ji                  |        jj                  jm                  |        j#                  |j$                          jj                  jo                          |jq                          g }g }g } jr                  D ]a  } | |v s jr                  |    }!||    }" ju                  | |!|"       |jm                  |        |jm                  |"       |jm                  |!       c  jw                  ||       ty        |      }#|D $cg c]  }$|$jz                   }%}$ jN                  j}                  ||||#      }&t        |
      +|&j                  d jN                  j                  |
             t        |      +|&j                  d jN                  j                  |             |r*|&j                  d jN                  j                                |r*|&j                  d jN                  j                                |r*|&j                  d jN                  j                                 jj                  jm                  |       |&j                  d      }' jN                  ji                  |'       |j                          _        i  _9        t        t9        |#            D cg c]  }|'j                  |dz          }(}t        |(|%      })t        ||)      D ]  \  } }* j_                  | |*         j#                  |j$                          jj                  jo                          g } jr                  D ]R  } | |v s jr                  |    }+t        |+t              r j@                  jC                  |+      }+|jm                  |+       T t9        |      dkD  r&ty        |      }, jN                  j                  |,       |'j                         }-|-j                         dk(  sJ d        jN                  ji                  |'       |&j                         }|r8 jN                  j                  ||      } jN                  j                  ||      } j                  |j                  j                      jX                  j                  |        j_                  |j                  j                   t        jR                  ja                  ||             d d d        t        t9        #            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rF   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.flattenztt.warp_specializez7We use SCF, so the loop body should only have one blockz)Don't know what to do with else after for)Qr   iterr   rb   dictkeywordsr   static_ranger   startro   endstepr   r   rt  r   rW  r   r   r   rZ  r   
num_stagesloop_unroll_factordisallow_acc_multi_bufferflattenwarp_specializer{   NumRuntimeErrorrO   r  rd  rN   is_intrh  integer_promote_implr  r   int_signednessrM   
SIGNEDNESSSIGNEDr  create_int_castr  rL  r   r   rQ  ri  r~  r%  r  r?  r@  r   r5  rS  rx   r'   create_for_opr   set_attrget_int32_attrget_unit_attrget_bodyr   rd   r}   r}  rG   r  
get_parentsizeget_induction_var
create_sub
create_addreplace_all_uses_withr  )0r   r`   IteratorClassrd   	iter_argsiter_kwargsiteratorrm  r?   rV  rq  rr  rs  rt  ru  lbubrp  negative_stepiv_type
iv_ir_typeiv_is_signedivr  r   r   rP  r  blockrH  rT  r  r&   r3  r4  rI  rp   rJ  for_opfor_op_bodyblock_handlesrO  rj   localyield_handlesfor_op_regionrU  result_valuess0   `                                               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&66Oe# "%Y!!31CGGAJ9OB!$Y!!31DIINNSTDU9VB#&y>A#59Q<4::cggaj;QDbcc4::>djj[)D MB]]$$R(]]$$R(}}&&t,xx (9ARARATNrxxjXZ[][c[cZddfgkgqgqfrrstuu--44RXXrxxH--44WdjjI]]4<<0
--1D1D1O1O1V1VVYYYY{{\\))"j,G\\))"j,G||++D*lK\\''
3t{{~~x}}';';B'HId# N	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 4dll6P6P6RS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 $ 7 7 >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M]N	Nb 9>c,>O8PQ1&++A.QQ+NHEUM2 	&ID#NN4%	& KK 	6DEEE5	6q @B 3& WeN	N N	Nb RsF   kCk
A=kkF	k#k>A>k=Fk+k*
kk'c                     | j                  |j                        }| j                  |j                        }| j                  |j                        }t	        j
                  |||      S rF   )r   lowerupperrp  r   rZ  )r   r`   r  r  rp  s        r)   visit_SlicezCodeGenerator.visit_Slice  sK    

4::&

4::&zz$))$~~eUD11r+   c                 8    | j                  |j                        S rF   )r   ro   r   s     r)   visit_IndexzCodeGenerator.visit_Index  s    zz$**%%r+   c                 P    |j                   | j                  |j                        fS rF   )rd   r   ro   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   rM   device_assertr  )r   r`   r
  r  s       r)   visit_AssertzCodeGenerator.visit_Assert  sQ    zz$))$&*hh&:djj"}}**4*NNr+   ra   c                 `   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!        t#        |      |
D cg c]  }|j$                   c}|      }| j&                  j)                  |      sNt+        |      \  }}|D cg c]Y  }|/t        |t        t        t        j                  j                  f      rt        j                  j                  n|j$                  [ }}t-        g ||t/                     }t1        | j2                  ||j5                         | j&                  ||| j6                  |j8                  ||| j:                  j<                  | j:                  j>                  | j:                  j@                        }	 |jC                  |jE                                |jV                  }|| j6                  |<   n| j6                  |   }| j&                  jY                  |      }t[        |
      }
| j:                  j]                  ||
      }|t        j^                  k(  ry ta        |jc                               D cg c]  }|je                  |       }}tg        ti        ||g            S c c}w c c}w c c}w c c}w c c}w # tF        $ rL}tH        jJ                  jL                  r tO        | jP                  jR                  | jT                  d       |d }~ww xY wc c}w )Nc                     t        |      S rF   rO   r-   r   s     r)   r   z0CodeGenerator.call_JitFunction.<locals>.<lambda>  s    M!4D r+   c                     t        |       S rF   r  r  s     r)   r   z0CodeGenerator.call_JitFunction.<locals>.<lambda>  s    q9I5I r+   )
r  r
  r"  r  r[   r  r  r  r  r  )5inspectgetcallargsra   r_   r\   rG   r   rN   rc  rb  r   r   rM   r   r   r   rB   r   r'   r  has_functionr   r   rk  r	  r  get_capture_scoper  r[   r   r  r  r  r   parse	Exceptionr   rA  front_end_debuggingr    r
  r]   r$  r&  get_functionrx   callrg  r   get_num_resultsr  nextr}   )r   ra   rb   r   r&   r?   rd   args_cstr   	args_pathargs_valfn_namer  r  r   r   r   ecallee_ret_typesymbolcall_oprw   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M"-H/MS/MxX{{''0$8$<!Iz    ,/;*SFJCQYQ^Q^QdQdEe;g''loltltuI 
 $B	8TVDI%dllIr?S?S?U^b^i^irt4;DLcLc/1{{i\f.2ll.B.BPTP\P\PhPh151H1H	JI
T
+ (00O/>D##G,"55g>O))'2'1,,##FH5hmm+278O8O8Q2RSQ7%%a(SS'/1BCDDW 5
 NH/M
  T$$88&t{{tLRSS	T Ts=   L:6L?MM	
AMM 
N+	N(AN##N(c                 6    t         j                  |j                              }t        |t              s& j
                  j                  |      }|	 | |      S t        |dd      }|rt        |dd      rtdt        j                  |j                        z  g}t        |t              r|j                  |       t         j                  j                  |dj                  |            t!         fd|j"                  D              }|j$                  D cg c]  } j                  |       }}t'        t(        j*                  j-                  d |D                    }t        |t              r(|j/                  d|j0                         |j2                  }t        |t4              r t7        |||        j9                  |||      S t;        |d	      rt=        |j0                        st>        j@                  jC                  |      rhd
 jD                  i}	tG        jH                  |      }
d|
jJ                  v r |	d<   	  ||i |	|}t        |tL              rt?        jL                  |      }|S | jV                  jY                         v rt[        t         |      } ||i |}t]        t_        |            rta        |d       S |S c c}w # tN        $ rB}tP        jR                  jT                  r t         j                  j                  |d       |d }~ww xY w)N_must_use_resultF
_is_unusedz#The result of %s is not being used.r?  c              3   @   K   | ]  }j                  |        y wrF   r   rh  s     r)   r   z+CodeGenerator.visit_Call.<locals>.<genexpr>  s     D74::g&Dr   c              3   F   K   | ]  }t        |t              r|n|g  y wrF   )rG   rV   )r   r   s     r)   r   z+CodeGenerator.visit_Call.<locals>.<genexpr>   s#     1bXYz!T7J!QRPS2S1bs   !r   r  r  r  c                     | S rF   r   )r   s    r)   r   z*CodeGenerator.visit_Call.<locals>.<lambda>   s    Q r+   )1r   r   r   rG   r   statically_implemented_functionsr   r   r   r  rJ  r  r    r
  r]   r6   rk  rl  rb   rV   	itertoolschainfrom_iterableinsertr  r  r   re   r  ri   rI   r   rM   
is_builtinr  r  	signature
parametersrW   r  r   rA  r  r,  rt   maprk   r'   rs   )r   r`   ra   static_implementationmurerror_messagekwsrd   rb   extra_kwargssigrA   r  s   `            r)   r   zCodeGenerator.visit_Call  s   !$**TYY"78"n-$($I$I$M$Mb$Q!$0,T488b,e474u5BS[[QUQZQZE[[\M#s#$$S)"4;;??D#((=:QRRDdmmDD+/995C

355IOO111b]a1bbcb.)KK2;;'Bb+&4T*((T377B
#(8(E(--JbJbceJf'7L##B'Cs~~--1\*K$6,6#6c5)"..-C
 ''..00+T2D$#;I$s);T%c;7]Z]]C 6&  	K$$88 't{{dCJ	Ks   K 0K 	L=LLc                 ,    t        |j                        S rF   )r   ro   r   s     r)   visit_ConstantzCodeGenerator.visit_Constant"  s    $$r+   r`   c           
         | j                   j                  t        |j                              }|5| j	                  |dj                  |j                  j                              g }|j                  D ]  }| j                  |      }t        |      s't        |      }|du r	|dk(  r|c S |du s<|dk(  sB|c S |j                  j                         rYt        |dd       }||| j                  z  }t        j                  dt         | j"                  |t%        j&                  |             |j)                  |        t+        |      d	k(  r|j)                         t+        |      d
k\  rS|j-                         }|j-                         }	| j/                  ||	|      }
|j)                  |
       t+        |      d
k\  rSt+        |      dk(  sJ |d	   S )Nz9AST boolean operator '{}' is not (currently) implemented.Flogical_andT
logical_orlinenozeLogical operators 'and' and 'or' are deprecated for non-scalar tensors; please use '&' or '|' instead)categoryfilenamer  sourcer   r   r   )_method_name_for_bool_opr   r'   r  r2  r  r^   rt   r   rK   r   rR   r   r  r  warn_explicitUserWarningr  r   r  r  r{   r?  r  )r   r`   r  nontrivial_valuessubnodero   bvr  r  r  ress              r)   visit_BoolOpzCodeGenerator.visit_BoolOp%  s   3377TWWF##QXXY]Y`Y`YiYijl l {{ 	0G JJw'E$U+%[%Kk]&B L$J[L%@ L ::&&($T8T:F)$//1**!,!%%"{{40 "((/9	0<  !Q& $$U+#$)#'')C#'')C++KcBC$$S)	 #$) $%*** ##r+   r  r  r  c                 x   | j                  |j                        }t        |      r+|j                  dk(  r| j                  j                  |d      S t        |t              r|j                  dk7  r|j                  }t        ||j                        }t        |      rt        |t              rt        ||      S |S )NT)r   r   ro   )r   ro   rK   r   r  permuterG   r   r   rI   r   r  )r   r`   r  r   s       r)   r   zCodeGenerator.visit_Attribute[  s    jj$S!dii3&6==((f55c9%$))w*>))CsDII&C Zk%B!#t,,r+   c                 f    d|j                   _        t        j                  j	                  | |       y r   )ro   r  r   rZ  r   r   s     r)   
visit_ExprzCodeGenerator.visit_Exprg  s"     $

%%dD1r+   c                      y rF   r   r   s     r)   visit_NoneTypezCodeGenerator.visit_NoneTypek  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  )rV   rt   r\   rG   r   ConstantrJ  ro   FormattedValue
conversionr   rO   r2  r'   chrr  AssertionErrorr6   )r   r`   rt   r?   ro   conversion_code	evaluateds          r)   visit_JoinedStrzCodeGenerator.visit_JoinedStrn  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           	      T   |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"        $ rU}t$        j&                  j(                  r t!        | j*                  j,                  | j
                  t/        |            d d }~ww xY w# 1 sw Y   y xY w)Nignorer  
col_offset)r  catch_warningssimplefilterDeprecationWarningPendingDeprecationWarningr$  r   rN  ri   r  r  r  r  r  superr   r    r  r   rA  r  r
  r]   r9   )r   r`   	last_noder  rA   r  	__class__s         r)   r   zCodeGenerator.visit  sT   <$$& 	 !!(,>?!!(,EFI||++-H DMtX&74+F$$T^^T__t{{5RTXTcTcd<<//1	ZgmD)  )$$X.5	 	 $  Z$$88 't{{tAwOUYYZ	 	s1   CF6D4%F4FAFFFF'c                 j    | j                  |dj                  t        |      j                              )Nzunsupported AST node type: {})r2  r  r'   r^   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{   rb   rl  rh  r   r   rG   r   NotImplementedErrorr  r9   r!   r
  r]   )r   r`   	arg_countpassedr1  r  s         r)   execute_static_assertz#CodeGenerator.execute_static_assert  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 )Nr`   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rF   r   rh  s     r)   r   z=CodeGenerator.static_executor.<locals>.ret.<locals>.<genexpr>  s     #UGDJJw$7#Ur   )rl  r   rb   r   r   )r   r`   r&   ro   r  rd   rb   	python_fns   `      r)   rA   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  rA   s   ` r)   static_executorzCodeGenerator.static_executor  s    	6CHH 	6 
r+   r   )r   r  )NFNFNr   )r^   r   r   r   r   r   rJ  r   r{   rV   r   rc  rb  rG   r   ri   r,  r   r  updater   rM   device_printminimummaximumr2  r6  r'  r   r   r   rL  rQ  rS  rW  r   r_  r   ro  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,  unaryopr5  r8  r=  rX  r]  r  ra  re  r  r  r  r	   r  r  r  r   r  BoolOpr  AndOrr  boolopr   r  r  r  r   r   r   r	  r  experimental.gluonttglstatic_assertstatic_printr-  r  r4  r   __classcell__)r   r-   r  s   00@r)   r	  r	    s?    `e=>90+ 90?G~90$SM90z tUE3
GWM) 	


A)tCH~  	(--,,-	  !	  ! L	1f&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,> 8D3/j@$ 	#))Xsvvx(TWTZTZ\dfifmfmow<d4		?C#78 t  	)SXXy#''9cjjR^?tD$5s$:; @-	5L6\'/6\6|2&0U38_ 0OC O
-E; -E^0^d%2$ 2$h >AWWmUXU[U[]i<jd4

#3S#89j
2$>c#(( t ,
 6##%:""OE$:1?51_S!_S!Q$d68SXXJO3L+L&M _#)s   M;r	  c                    d gt        | j                        z  }|j                  j                         D ].  \  }}	| j                  j	                  |      }
t        |	      ||
<   0 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                  |      | d||||||      }|j!                  | j#                                |j$                  }||_        |S c c}w )	Nr   )
namedtuplec                     t        |       dk(  S rQ   )r{   )rp   s    r)   r   zast_to_ttir.<locals>.<lambda>  s    c!fk r+   SpecializationProxyr<   r  T)
r   r"  r
  r#  r  r  r  r  r  r  )r{   r_   r  r   indexr   r   r<   r   r   collectionsr6  filterr	  r  r9   r   r  r  r  )ra   r]   r  r  r  r  r  r   r*  rp   rc   r   r  r  r6  leavesr?   r<   r  proxyr   rA   s                         r)   ast_to_ttirr>    sW   R\\**I##% &1ll  #"1	#& 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9M9M9O_a_f_fgl_m%'49Ycmt*5*U[]I OOBHHJ


CCKJ Gs   6'E%rF   )Gr   r   r  r$   r  rD  r  dataclassesr   rr   r   typingr   r   r   r   r	   r
   r   r   r   r  r   r   _C.libtritonr   r   r   r   r   language.corer   r   r   runtime.jitr   r   runtimer   _utilsr   r   r   errorsr    r!   r"   r*   rB   r   rI   rK   rO   rT   rX   re   rk   rs   rx   ro   r}   rb  r'   r  r   rZ  r   r   r  r	  r>  r   r+   r)   <module>rG     sn   
   	    !  T T T  ' 3 3 G G = ! H H a a	% % %! ! !US UT UNS NT N(S (T (XD*!5 "bhh "Y " #tDz* 3 3*T%COO T%n7 7t $  
sCOO sl%r+   