
    "h                        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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 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$ d Z%d Z&dede'fdZ(dede'fdZ)dede'fdZ*dede'fdZ+dede'fdZ,d Z-e'e. e/d      hZ0 G d d      Z1 G d de jd                        Z3 G d de jd                        Z4d Z5d Z6y)    N)AnyCallableDictOptionalTupleTypeUnion   )language)ir)	constexprtensor	str_to_ty)_unwrap_if_constexprnv_tma_desc_type_value)_normalize_tyget_jit_fn_file_line)JITFunction   )CompilationErrorCompileTimeAssertionFailureUnsupportedLanguageConstruct)
ModuleTypec                 0   | 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Piu_SVzUnsupported type )is_ptr	mangle_ty
element_tyis_intr   dtype
SIGNEDNESSSIGNEDint_signednessstrint_bitwidthis_floatingis_blockscalarjoinmapshapeis_void	TypeError)tyr(   prefixeltr1   s        [/var/www/html/sandstorm/venv/lib/python3.12/site-packages/triton/compiler/code_generator.pyr#   r#      s    	yy{Yr}}---	yy{**11))V3BOO,,,	~~2w	{{}		"S"((+,awa  	zz|
't,
--    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_[]__)r/   r#   sortedreprreplace)namearg_tys	constantsr4   mangled_arg_namesr   mangled_constantsrets           r7   	mangle_fnrK   &   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   rL   s    r7   _is_triton_valuerR   2       a  r8   c                 "    t        | t              S rO   )rP   r   rQ   s    r7   _is_triton_tensorrU   6   rS   r8   c                 "    t        | t              S rO   )rP   r   rQ   s    r7   _is_constexprrW   :   s    a##r8   c                     t        |       xr6 | j                  j                          xs | j                  j                  dk(  S )Nr   )rU   typer-   numelrQ   s    r7   _is_triton_scalarr[   >   s2    QP):%:%Oafflla>OPr8   c                 .    t        | t        t        f      S rO   )rP   listtuplerQ   s    r7   _is_list_liker_   B   s    a$''r8   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	enumeraterW   r[   r   src__name__	arg_names)nodefnargsidxargs        r7   _check_fn_argsrl   F   s    	{{!$ 	HC %.?.D2FFD},ijljvjvwzj{i||}  B  ~C  D 	 r8   c                       e Zd Zd Zd Zd Zy)enter_sub_regionc                     || _         y rO   )	generator)selfrp   s     r7   __init__zenter_sub_region.__init__U   s	    "r8   c                    | j                   j                  j                         | _        | j                   j                  j                         | _        i | j                   _        | j                   j                  j                         | _        | j                   j                  j                         | _
        | j                  | j                  fS rO   )rp   lscopecopyliveins
local_defs	prev_defsbuilderget_insertion_blockinsert_blockget_insertion_pointinsert_point)rq   s    r7   	__enter__zenter_sub_region.__enter__X   s    ~~,,11322779$&! NN22FFH NN22FFH||T....r8   c                     | j                   j                  j                  | j                         | j                  | j                   _        | j                  | j                   _        y rO   )rp   ry   restore_insertion_pointr}   rv   rt   rx   rw   )rq   ri   kwargss      r7   __exit__zenter_sub_region.__exit__a   s@    66t7H7HI $$(NN!r8   N)re   
__module____qualname__rr   r~   r    r8   r7   rn   rn   S   s    #/3r8   rn   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 rO   )gscope)rq   r   s     r7   rr   zContainsReturnChecker.__init__j   s	    r8   rM   c                 ,     t         fd|D              S )Nc              3   @   K   | ]  }j                  |        y wrO   visit).0srq   s     r7   	<genexpr>z5ContainsReturnChecker._visit_stmts.<locals>.<genexpr>n   s     /Q4::a=/   )any)rq   bodys   ` r7   _visit_stmtsz"ContainsReturnChecker._visit_stmtsm   s    /$///r8   c                     t        |t              r@|j                  s4|j                         }t	        | j
                        j                  |      S yNF)rP   r   rb   parser   r   r   )rq   rh   fn_nodes      r7   _visit_functionz%ContainsReturnChecker._visit_functionp   s:    b+&r{{hhjG(5;;GDDr8   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_fieldsrP   r]   ASTr   )rq   rg   rJ   r   valueitems         r7   generic_visitz#ContainsReturnChecker.generic_visitw   s    - 	/HAu%&! 6D!$0!5TZZ%56 E377+.TZZ.	/ 
r8   rg   c                 Z   t        |j                  t        j                        rm|j                  j                  | j
                  v rJ| j
                  |j                  j                     }t        ||j                        }| j                  |      S y| j                  |j                        S r   )
rP   r   r   Nameidr   getattrattrr   r   )rq   rg   r   rh   s       r7   visit_Attributez%ContainsReturnChecker.visit_Attribute   sw     djj#((+zz}}+DJJMM2UDII.++B//zz$**%%r8   c                     t        |j                        t        j                  u ry|j                  | j
                  v r*| j
                  |j                     }| j                  |      S yr   )rY   ctxr   Storer   r   r   )rq   rg   rh   s      r7   
visit_Namez ContainsReturnChecker.visit_Name   sO    >SYY&77dkk!TWW%B''++r8   c                      y)NTr   rq   rg   s     r7   visit_Returnz"ContainsReturnChecker.visit_Return       r8   c                      yr   r   r   s     r7   visit_Assignz"ContainsReturnChecker.visit_Assign        r8   c                      yr   r   r   s     r7   visit_AugAssignz%ContainsReturnChecker.visit_AugAssign   r   r8   c                 8    | j                  |j                        S rO   r   r   r   s     r7   visit_Modulez"ContainsReturnChecker.visit_Module         ++r8   c                 8    | j                  |j                        S rO   r   r   s     r7   visit_FunctionDefz'ContainsReturnChecker.visit_FunctionDef   r   r8   c                     | j                  |j                        }|j                  r|xs | j                  |j                        }|S rO   )r   r   orelse)rq   rg   rJ   s      r7   visit_IfzContainsReturnChecker.visit_If   s=     		*;;7**4;;7C
r8   c                 r    | j                  |j                        xs | j                  |j                        S rO   )r   r   r   r   s     r7   visit_IfExpz!ContainsReturnChecker.visit_IfExp   s'    zz$))$?

4;;(??r8   c                 8    | j                  |j                        S rO   )r   funcr   s     r7   
visit_Callz ContainsReturnChecker.visit_Call   s    zz$))$$r8   N)re   r   r   rr   boolr   r   r   r   	Attributer   r   r   Returnr   Assignr   	AugAssignr   Moduler   FunctionDefr   Ifr   IfExpr   Callr   r   r8   r7   r   r   h   s   0D 0T 	T 	&CMM &d &sxx D     
CMM d 
, , ,,coo ,$ ,SVV  @		 @d @%sxx %D %r8   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 Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,d Z-d  Z.d! Z/d" Z0e1jd                  d#e1jf                  d$e1jh                  d%e1jj                  d&e1jl                  d'e1jn                  d(e1jp                  d)e1jr                  d*e1jt                  d+e1jv                  d,e1jx                  d-e1jz                  d.iZ>ee?e1j                     ef   ed/<   d0 ZAd1 ZBd2 ZCd3 ZDd4 ZEd5 ZFd6 ZGe1j                  d7e1j                  d8e1j                  d9e1j                  d:e1j                  d;e1j                  d<iZNee?e1j                     ef   ed=<   d> ZPe1j                  d?e1j                  d@e1j                  dAe1j                  dBiZUee?e1j                     ef   edC<   dD ZWdE ZXdF ZYdG ZZdH Z[dI Z\dJ Z]de^eef   fdKZ_defdLZ`dMefdNZadO ZbdP ZcdQe1j                  fdRZee1j                  dSe1j                  dTiZhee?e1j                     ef   edU<   ejj                  dVk  r	dW ZldX ZmdY ZndZ Zod[ Zpd\ Zqd] Zrfd^Zsd_ ZtdQe1j                  ddfd`Zvda Zwej(                  j                  evej(                  j                   ewez      e ewe      e ewe      iZ{ee|e}e1j                  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 | _        || _        || _        || _        || _        || _        d | _        || _        g | _        d | _        i | _        | j?                         | _         d | _!        d| _"        y )Nr   r   r    F)#contextr   ry   r   
begin_lineset_locoptionscodegen_fns
module_mapcreate_modulemodulefunction_ret_types	prototyper   itemsrP   r   getre   r   rt   
attributesrG   r   function_name	is_kernelcur_noderb   	scf_stackret_typerw   _define_name_lookupdereference_namerh   visiting_arg_default_value)rq   r   r   r   r   rG   r   r   r   r   r   r   r   r   rb   r   r   kvmodule_names                       r7   rr   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		# $"*"  .06:6N6N6P +0'r8   builtin_namespaceprintminmaxc                 D    t        | j                  j                  ||      S rO   )r   r   rd   )rq   rg   messages      r7   _unsupportedzCodeGenerator._unsupported   s    +DKKOOT7KKr8   c                     t               }| j                  j                  ||      }||u ryt        |      ry| j                  j                  di       j                  |      x}rt	        |      dk(  S y)NFT__annotations__r   )objectr   r   rW   r   )rq   rE   absent_markervalas        r7   _is_constexpr_globalz"CodeGenerator._is_constexpr_global   sl    kkoodM2- 126::4@@1@ #{22r8   c                 |     dt         f fddt         f fdt               dt         dt        f fd}|S )NrE   c                 <    j                   j                  | |      S rO   )rt   r   )rE   absentrq   s     r7   local_lookupz7CodeGenerator._define_name_lookup.<locals>.local_lookup  s    ;;??400r8   c                    j                   j                  | |      }t        ||u | j                  v t	        |      t
        u t        |t              t        |dd      t        |dd      j                  d      t        |t        j                        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 annotated as constexpr (`x: triton.language.constexpr = 42`
                or `x = triton.language.constexpr(42)`).  Alternatively, set the
                envvar TRITON_ALLOW_NON_CONSTEXPR_GLOBALS=1, but we do not
                promise to support this forever.
 )r   r   r   r   rY   r   rP   r   r   
startswithr   r&   r   r   osenviron	NameErrortextwrapdedentrD   )rE   r   r   rq   s      r7   global_lookupz8CodeGenerator._define_name_lookup.<locals>.global_lookup  s    ++//$/C 6M44+A+A#AI+sK0C!5u=Cr2==>OPsHNN3--d3 33JJNN#GMQTT  
 %//3f 51!4 5 6=WT35GI Ir8   rM   c                     }j                   j                  fD ]  } || |      }||us|c S  t        |  d      )Nz is not defined)r   r   r  )rE   r   lookup_functionr   r   r
  r   rq   s       r7   name_lookupz6CodeGenerator._define_name_lookup.<locals>.name_lookup1  sW    "F#/@V@V@Z@Z#Z !'f5& L! tfO455r8   )r*   r   r   )rq   r  r   r
  r   s   ` @@@r7   r   z!CodeGenerator._define_name_lookup  sF    	1s 	1	I 	I: 	6c 	6c 	6 	6 r8   rE   r   rM   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)rt   rw   )rq   rE   r   s      r7   	set_valuezCodeGenerator.set_value;  s      "D %r8   c                 r    | j                   j                         }| j                   j                         }||fS rO   )ry   get_locr|   )rq   locips      r7   _get_insertion_point_and_locz*CodeGenerator._get_insertion_point_and_locD  s1     ll""$\\--/3wr8   c                 p    | j                   j                  |       | j                   j                  |       y rO   )ry   r   r   )rq   r  r  s      r7   _set_insertion_point_and_locz*CodeGenerator._set_insertion_point_and_locL  s&    ,,R0S!r8   c                     t        |      s|g}|D ]/  }| j                  |       t        |t        j                        s/ y  y rO   )r_   r   rP   r   r   )rq   stmtsstmts      r7   visit_compound_statementz&CodeGenerator.visit_compound_statementS  s?    U#GE 	DJJt $

+	r8   c                 D    t         j                  j                  | |       y rO   r   NodeVisitorr   r   s     r7   r   zCodeGenerator.visit_Module_      %%dD1r8   c                     | j                  |j                        }|J |j                  D cg c]  }| j                  |       }}|S c c}w rO   )r   r   elts)rq   rg   r   r6   r   s        r7   
visit_ListzCodeGenerator.visit_Listb  sG    jj"{{+/995C

355 6s   A
c                    | j                  |j                        }|,| j                  j                  g        t        j
                  }nt        |t              r|D cg c],  }t        j                  j                  || j                        . }}|D cg c]  }|j                   }}| j                  j                  |D cg c]  }|j                   c}       t        |      }n\t        j                  j                  || j                        }| j                  j                  |j                  g       |j                  }| j                  || _        n*| j                  |k7  rt        d| j                   d|       | j                  j                         }| j                  j                  |       y c c}w c c}w c c}w )NzInconsistent return types:  and )r   r   ry   rJ   r   voidrP   r^   semantic	to_tensorrY   handler   r3   create_blockset_insertion_point_to_end)	rq   rg   	ret_valueret_tyr   
ret_values	ret_typesrJ   post_ret_blocks	            r7   r   zCodeGenerator.visit_Returni  sT   JJtzz*	LLR ]]F	5)PYZ1(++55aFZJZ)34A4I4LL
;1ahh;<9%F##--iFCLLcjj\*XXF== "DM]]f$9$--fXVWW 224//?# [4;s   1F9F>G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/                         }g }d}t1        t3        |            D ]+  }|| j4                  v rD| j4                  |   }t7        |      st9        | j4                  |         }|j;                  |       V|| j<                  v r4| j<                  |   D ]"  \  }}| j                  j?                  |||       $ tA        | j&                  jB                  |   tD              r| j                  j?                  |dd       |j;                  tG        | j                  j                  |      | j&                  jB                  |                |dz  }. | j                  jI                         }tK        ||      D ]  \  }}| jM                  ||        | j                  jO                  |       | jQ                  |jR                         | j                  jI                         jU                         rJ | jV                  | jV                  tX        jZ                  k(  r2tX        jZ                  | _+        | j                  j]                  g        ntA        | jV                  t^              rta        | jV                        n| jV                  g| j&                  _1        | j                  je                  | j&                  j)                  | j                               | j                  j]                  | j&                  jb                  D cg c]B  }| jV                  4| j                  jg                  |j)                  | j                              D c}       | j                  ji                          |r| j                  jk                  |       y y # d| _        w xY wc c}w )Nz,nested function definition is not supported.r   r   r   targetsr   )targetr   
annotationTFpublicprivater   ztt.nv_tma_desc)6r   ri   rh   r   rc   defaultsr5  rk   r   r   r   r   	AnnAssignr   r   ry   get_or_insert_functionr   r   r   to_irrb   	push_backadd_entry_blockrangelenrG   rW   r   appendr   set_arg_attrrP   param_typesr   r   rz   zipr  set_insertion_point_to_startr  r   has_terminatorr   r   r$  rJ   r^   r]   r-  
reset_typecreate_poisonfinalizer)  )rq   rg   rf   kwarg_namesr   default_valuearg_noder5  rE   	st_target	init_node
visibilityentry
arg_valuesrj   cstr   	insert_ptarg_name	arg_valuer4   s                        r7   r   zCodeGenerator.visit_FunctionDef  s1   !%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
,,55dkk4CUCU6:nn6J6J4<<6XZdfjfsfsudgg&'')
s9~& 	ADNN"nnQ'$S)#DNN1$56C!!#&''+q'9 ?e,,S$>? dnn88=?OPGG((.>B!!&c):DNN<V<VWZ<["\]q#	& LL446	#&y*#= 	0HiNN8Y/	011%8%%dii0 <<335DDFFF== DMMX]]$B$MMDMLLR >HX]>^tDMM':eiererdsDNN$GGt~~33DLLABLL..22==, **288DLL+AB 
 	LL33I> g 38/Xs   :&UAU(	U%c                     g }|j                   D ]  }|| j                  |      gz  } | j                  |j                        }||fS rO   )ri   r   kwarg)rq   rg   rf   rk   rI  s        r7   visit_argumentszCodeGenerator.visit_arguments  sL    	99 	+C$**S/**I	+jj,+%%r8   c                 Z    t         j                  j                  | |       |j                  S rO   )r   r  r   rk   r   s     r7   	visit_argzCodeGenerator.visit_arg  s    %%dD1xxr8   c                 x   | j                  |j                        }| j                  |j                        }| j                  |j                        }|t        k(  rP|| j
                  v rt        | d      t        |      st	        |      }|| j
                  |<   | j
                  |   S | j                  |      S )Nz4 is already defined. constexpr cannot be reassigned.)	r   r5  r4  r   r   rt   
ValueErrorrW   r   )rq   rg   r5  r4  r   s        r7   visit_AnnAssignzCodeGenerator.visit_AnnAssign  s    ZZ0
DKK(

4::&"$ F8 ,D "E F F '!%("'DKK;;v&&  &&r8   c                    g }t        |t        j                        r || j                  |j                        gz  }n&|j
                  D ]  }|| j                  |      gz  } t        |      dkD  r| j                  |d      |d   }| j                  |j                        }t        |      s|g}t        |      s|g}t        j                  f}t        ||      D ]e  \  }}t        |      }|At        |      s6t        ||      s*t        j                  j!                  || j"                        }| j%                  ||       g y )Nr   z2simultaneous multiple assignment is not supported.r   )rP   r   r9  r   r4  r3  r?  r   r   r_   r   r&   rC  r   rR   r%  r&  ry   r  )	rq   rg   _namesr4  namesvaluesnative_nontensor_typesrE   r   s	            r7   r   zCodeGenerator.visit_Assign  s$   dCMM*tzz$++.//F,, /4::f-../v;?##D*^__q	DJJ'U#GEV$XF"*..!3uf- 	(KD%(/E #E*e%;< ))33E4<<HNN4'	(r8   c                 ^   |j                   j                  }t        j                  |t        j                               }t        j
                  ||j                  |j                        }t        j                  |j                   g|      }| j                  |       | j                  |      S )Nr1  r2  )r4  r   r   r   LoadBinOpopr   r   r   r   )rq   rg   rE   lhsrhsassigns         r7   r   zCodeGenerator.visit_AugAssign  sr    {{~~hh$CHHJ/iiTWWdjj1T[[M=

6$$T**r8   c                     t        |j                        t        j                  u r|j                  S | j                  |j                        S rO   )rY   r   r   r   r   r   r   s     r7   r   zCodeGenerator.visit_Name	  s4    >SYY&77N$$TWW--r8   c                 D    t         j                  j                  | |       y rO   r  r   s     r7   visit_StorezCodeGenerator.visit_Store  r  r8   c                 D    t         j                  j                  | |       y rO   r  r   s     r7   
visit_LoadzCodeGenerator.visit_Load  r  r8   c                 r    |j                   D cg c]  }| j                  |       }}t        |      S c c}w rO   )r   r   r^   )rq   rg   xri   s       r7   visit_TuplezCodeGenerator.visit_Tuple  s0    '+yy1!

111T{ 2s   4c                     t        |      r t        ||      || j                        S t        |      r5t        j                  dd|      } t        ||      || j                        S  t        ||      |      S )N_builderz__(.*)__z__r\1__)rU   r   ry   resub)rq   method_namerf  rg  reverse_method_names        r7   _apply_binary_methodz"CodeGenerator._apply_binary_method  sn    S!,73,S4<<HHS!"$&&j+"N473 34S4<<PP(wsK(--r8   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   rY   re  r   formatre   rx  rq   rg   rf  rg  rv  s        r7   visit_BinOpzCodeGenerator.visit_BinOp!  s    jj#jj$2266tDGG}E##D$^$e$efjfmfmfvfv$wy y((c3??r8   __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 }g }g }	|D ]  }
|df|dffD ]V  \  }}|
|v s||
   j                  ||
   j                  k(  r+J d|
 d||
   j                   d| d||
   j                           |
|v s|
|v r|j                  |
       |j                  |
|v r||
   j                  n||
   j                         |	j                  |
|v r||
   j                  j                         n||
   j                  j                                |
|v r|
|vr||
   ||
<   |
|v s|
|vs||
   ||
<   " t        |j                         |j                         z        D ]  }
|
|v r||
   j                  }||
   j                  }||k(  sJ d|
 d| d	| d
       |j                  |
       |j                  |       |	j                  ||
   j                  j                                 |||||||	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 ())ry   rD  r  r   rz   rw   ru   r   rt   rY   r@  r'  get_typerB   keys)rq   rg   rv   
then_block
else_block	then_defs	else_defsr_  r-  ir_ret_typesrE   defs
block_namethen_tyelse_tys                  r7   visit_then_else_blocksz$CodeGenerator.visit_then_else_blocks9  s   11*=%%dii0\\557
OO((*		;;LL55jA!,,.DK DO))$++6,,.I99;J 	 	0D&/%89f:M$N X j4<:??gdm.@.@@ X-dV=ASAS@T U##-,.Ed4jooEVXX@X
 y DI$5T"  9J4!5!5PYZ^P_PdPde##$-J.IdO$:$:$C$C$E3<T?3I3I3R3R3TV y T%:")$-	$y T%:")$-	$#	0( 9>>+inn.>>? 
	CDu}o**Go**Gg% .&tf,A' K##*)1..% LLW%	$ 6 6 ? ? AB
	C )ZUI|[[r8   c           	      x   t        |       5 }|\  }}| j                  j                         }| j                  j                         }| j                  j                  |       | j                  j	                  |j
                  ||       | j                  ||||      \  }}	}}}
}}| j                  j                         }| j                  j                  |       |j                         rJ |        | j                  j                  ||
D cg c]  }||   j
                   c}       | j                  j                  |       |j                         rJ |        | j                  j                  ||
D cg c]  }|	|   j
                   c}       |D ]  }|j                  |        	 d d d        | j                  j                         t        
      D ]I  \  }}t        j                  j                  |j                  |      |         }| j!                  ||       K y c c}w c c}w # 1 sw Y   xY wrO   )rn   ry   r(  r)  create_cond_branchr'  r  rE  create_branchadd_argumentrD  rc   r   corer   rk   r  )rq   condrg   srrv   ip_blockr  r  r  r  r_  r-  r  endif_blocknr4   r   rE   
new_tensors                      r7   visit_if_top_levelz CodeGenerator.visit_if_top_levelp  s   d# 	-r "GX224J224JLL33H=LL++DKKZP ++D':zR YIy*j%L ,,335KLL33J?!002CzlC2LL&&{RW4XQYq\5H5H4XYLL33J?!002CzlC2LL&&{RW4XQYq\5H5H4XY" -((,-)	-0 	11+> ' 	-GAt!--kooa.@)A,OJNN4,	- 5Y 5Y'	- 	-s+   C?H0H&!AH05H+H0&
H00H9c           	      &   t        |       5 }|\  }}| j                         \  }}| j                  j                         }|j                  r| j                  j                         nd }	| j                  ||||	      \  }
}}}	}}}| j                  ||       | j                  j                  |D cg c]  }|j                  | j                         c}|j                  d      }|j                  |j                                | j                  j                  |j                                t        |      dkD  r6| j                  j                  |D cg c]  }|
|   j                   c}       |j                  s|j                         }	n|	j                  |j                                | j                  j                  |j                                t        |      dkD  r6| j                  j                  |D cg c]  }||   j                   c}       d d d        t!              D ]I  \  }}t"        j$                  j'                  j)                  |      |         }| j+                  ||       K y c c}w c c}w c c}w # 1 sw Y   pxY w)NTr   )rn   r  ry   r(  r   r  r  create_if_opr;  r'  merge_block_beforeget_then_blockr)  r?  create_yield_opget_else_blockrc   r   r  r   
get_resultr  )rq   r  rg   r  rv   r   r  last_locr  r  r  r  r_  r-  r4   if_opr  r   rE   r  s                       r7   visit_if_scfzCodeGenerator.visit_if_scf  s   d# 	SrJGQ<<>LB224J8<224J++D':zR NIy*j%A --b(;LL--PY.Z"rxx/E.Z\`\g\gimnE))%*>*>*@ALL33E4H4H4JK5zA~,,5-Qail.A.A-QR;;"113
--e.B.B.DELL33E4H4H4JK5zA~,,5-Qail.A.A-QR)	S, !' 	-GAt!--e.>.>q.A9Q<PJNN4,	- /[ .R .R)	S 	Ss8   B"J."I8
BJI=
(BJ;J
J8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 )Nrr  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rO   re   r   r   s     r7   r   z)CodeGenerator.visit_If.<locals>.<genexpr>       !G!**!G   )r   testrU   tor   int1ry   r   r   r   r   r  r  r   rY   _condition_typesr}  r/   re   r   r   r  )rq   rg   r  contains_returnactive_blocks        r7   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)),7r8   c           	      t   | j                  |j                        }t        |      rc|j                  t        j
                  | j                        }t        |       5  | j                         \  }}| j                  j                         }| j                  j                  |       t        j                  j                  | j                  |j                        | j                        }| j                  j                         }| j                  j                         }| j                  j                  |       t        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)	Nrr  zATernary expression with dynamic condition has inconsistent types r#  Tr   r  r  c              3   4   K   | ]  }|j                     y wrO   r  r  s     r7   r   z,CodeGenerator.visit_IfExp.<locals>.<genexpr>  r  r  )$r   r  rU   r  r   r  ry   rn   r  r(  rD  r%  r&  r   rz   r   r  rY   r$  r;  r  r'  r  r  r)  r  r  r  r   r  r   r  r   r}  r/   re   )rq   rg   r  r  r  r  then_valr  else_valr   ret_type_irr  s               r7   r   zCodeGenerator.visit_IfExp  s2   zz$))$T"778==4<<7@D!$' !d#@@BH!\\668
99*E#,,66tzz$))7Ldll[!\\==?
!\\668
99*E $,,66tzz$++7NPTP\P\]!\\==?
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..P7c                      y rO   r   r   s     r7   
visit_PasszCodeGenerator.visit_Pass  s    r8   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   rz  r   rY   r   Isr   IsNot_method_name_for_comp_opr   r}  re   rx  )rq   rg   rf  rg  	lhs_value	rhs_valuerv  s          r7   visit_ComparezCodeGenerator.visit_Compare  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??r8   __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.rr  z)' is not (currently) implemented on type )r   operand_method_name_for_unary_opr   rY   re  r   re   rU   r   ry   AttributeError)rq   rg   r  rh   s       r7   visit_UnaryOpzCodeGenerator.visit_UnaryOp  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                 4   t        |      sJ d| d       t        |      sJ d| d       t        |      t        |      k(  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.)rR   rY   rU   )rq   rE   loop_vallive_vals       r7   _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.r8   c           
      x
   t        |       5 }|\  }}| j                         \  }}| j                  j                         }| j                  j	                  |       | j
                  j                  |       | j                  |j                         | j
                  j                          | j                  }|j                          g }	g }
g }|D ]a  }||v s||   }||   }| j                  |||       |	j                  |       |
j                  |j                         |j                  |       c | j                  ||       | j                  j                  |
D cg c]  }|j!                  | j                         c}|D cg c]  }|j"                   c}      }| j                  j%                  |j'                         |
D cg c]  }|j!                  | j                         c}      }| j                  j	                  |       t)        |	      D ]`  \  }}t*        j,                  j/                  |j1                  |      |
|         | j2                  |<   | j2                  |   | j                  |<   b | j5                  |j6                        }| j                  j9                  |       | j                  j;                  |j"                  t=        t?        |            D cg c]  }|j1                  |       c}       | j                  j%                  |jA                         |
D cg c]  }|j!                  | j                         c}      }| j                  j	                  |       t)        |	      D ]`  \  }}t*        j,                  j/                  |j1                  |      |
|         | j2                  |<   | j2                  |   | j                  |<   b | j
                  j                  |       | j                  |j                         | j
                  j                          | j                  }g }|D ]  }||v s|j                  ||           | j                  jC                  |D cg c]  }|j"                   c}       d d d        t)        	      D ]U  \  }}t*        j,                  j/                  jE                  |      
|         }|| j2                  |<   || j                  |<   W |jF                  D ]  }J d        y c c}w c c}w c c}w c c}w c c}w c c}w # 1 sw Y   xY w)NzNot implemented)'rn   r  ry   r(  rD  r   r@  r  r   poprw   eraser  rY   r  create_while_opr;  r'  create_block_with_parent
get_beforerc   r   r  r   rk   rt   r   r  r)  create_condition_opr>  r?  	get_afterr  r  r   r   r  r   )rq   rg   r  rv   r{   r  r  dummy	loop_defsr_  r-  	init_argsrE   r  r  r4   rk   while_opbefore_blockr   r  after_blockyieldsynew_defr  s                             r7   visit_WhilezCodeGenerator.visit_While-  sf   d# =	Er$&!G\<<>LB LL--/ELL55e<NN!!$'))$))4NN IKKM EII! 
/7?(H&t}H66tXxP LL&$$X]]3$$X.
/ --b(;||33V_4`PRRXXdll5K4`KT4UCSZZ4UWH  <<@@ATATAVclAm]_"((4<<BXAmoLLL55lC$U+ :4$,MM$8$89I9I!9LiXYl$[D!(,D(9%: ::dii(DLL33LALL,,T[[X]^abk^lXm:nST<;K;KA;N:no,,??@R@R@Tbk@l\^$,,AW@lnK LL55kB$U+ :4$,MM$8$89KYWX\$ZD!(,D(9%: NN!!$'))$))4NN IF! 37?MM)D/23 LL((F)Cq!(()CD{=	E@ !' 	,GAtmm**8+>+>q+A9Q<PG 'DKK$+DOOD!	,
 KK 	6D+++5	6M 5a4U Bn ;o Am *D{=	E =	Esi   C	T0BT0"T
?T0T/T0"T)C<T0%T!=/T0,"T&C7T0/T05T+
T0T00T9c                    |j                   j                  j                  dk(  sJ | j                  |j                        }| j                  |j
                        }t        |      r|j                  || j                        S ||   S )Nrc  rr  )	r   	__class__re   r   r   slicerU   __getitem__ry   )rq   rg   rf  slicess       r7   visit_SubscriptzCodeGenerator.visit_Subscriptw  sm    xx!!**f444jj$DJJ'S!??6DLL?AA6{r8   c                 ^    |j                   D cg c]  }| j                  |       c}S c c}w rO   )dimsr   )rq   rg   dims      r7   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 }|t        j                  u rE ||i |}|j                  }|j                  }|j                  }|j.                  }
|j0                  }n|t        u rt3        |      dkD  r|d   n# j                  t)        j4                  d            }t3        |      dkD  r|d   n' j                  |j                  j                  d         }t3        |      dkD  r|d   n# j                  t)        j4                  d            }nt7        d      d}t9        |      r+|j                  dk  rt        |j                         }d}||}}t        j:                  j=                  | j>                        }t        j:                  j=                  | j>                        }t        j:                  j=                  | j>                        }|j@                  jC                         r4|j@                  jC                         r|j@                  jC                         s3tE        d|j@                   d	|j@                   d	|j@                   d
      t        j:                  jG                  |j@                  |j@                        }t        j:                  jG                  ||j@                        }|jI                   j>                        }|jJ                  t        jL                  j@                  jN                  jP                  k(  }|jR                  }|jR                  }|jR                  } j>                  jU                  |||      } j>                  jU                  |||      } j>                  jU                  |||      } j>                  jW                  |      } jY                  |j                  j                   t        jL                  j[                  ||             t]               5 }|\  }} j_                         \  }} j>                  ja                         } j>                  jc                  |        jd                  jg                  |        j#                  |j$                          jd                  ji                          |jk                          g }g }g } jl                  D ]a  }||v s jl                  |   }||   } jo                  |||       |jg                  |       |jg                  |       |jg                  |       c  jq                  ||        j>                  js                  ||||D cg c]  }|jR                   c}      } |
+| ju                  d j>                  jw                  |
             |+| ju                  d j>                  jw                  |              jd                  jg                  |        j>                  jc                  | jy                  d             |j{                          _        i  _6        t}        |      D ]c  \  }} jY                  |t        jL                  j[                  | jy                  d      j                  |dz         ||   j                               e  j#                  |j$                          jd                  ji                          g } jl                  D ]M  }||v s|jg                  t        j:                  j=                   jl                  |    j>                               O t3        |      dkD  r3 j>                  j                  |D !cg c]  }!|!jR                   c}!       | jy                  d      j                         }"|"j                         dk(  sJ d        j>                  jc                  | jy                  d             | j                         }|r8 j>                  j                  ||      } j>                  j                  ||      } j                  |j                  j                      jR                  j                  |        jY                  |j                  j                   t        jL                  j[                  ||             d d d        t}              D ]Q  \  }} jY                  |t        jL                  j[                   j                  |      |   j                               S |j&                  D ]  }	J d        y c c}w c c}w c c}!w # 1 sw Y   xY w)Nc              3   @   K   | ]  }j                  |        y wrO   r   r   keywordrq   s     r7   r   z*CodeGenerator.visit_For.<locals>.<genexpr>  s     Q74::g.Qr   r   r   r
   zAOnly `range` and `static_range` iterators are currently supportedFTz0For loop bounds and step must all be ints, are (r  r  ztt.num_stagesztt.loop_unroll_factorz7We use SCF, so the loop body should only have one blockz)Don't know what to do with else after for)Ir   iterr   ri   dictkeywordsr   static_ranger>  startr   endstepr   rt   r4  r   r  r   r   r   r  r   
num_stagesloop_unroll_factorr?  NumRuntimeErrorrW   r%  r&  ry   r&   r%   r3   integer_promote_implr;  r)   r  r'   r(   r'  create_int_castrG  r  r   rn   r  r(  rD  r   r@  r  r  rw   r  r  create_for_opset_attrget_int32_attrget_bodyru   rc   rk   rY   r  
get_parentsizeget_induction_var
create_sub
create_addreplace_all_uses_withr  )#rq   rg   IteratorClassrk   	iter_argsiter_kwargsiteratorr  r   r  r
  r  lbubr	  negative_stepiv_type
iv_ir_typeiv_is_signedivr  rv   r{   r  r  blockr  r  r_  rE   r  r  for_opr  for_op_regions#   `                                  r7   	visit_ForzCodeGenerator.visit_For  s0   

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!)!<!<e# "%Y!!31CGGAJ9OB!$Y!!31DIINNSTDU9VB#&y>A#59Q<4::cggaj;QDbcc4::>djj[)D MB((T\\:((T\\:  **4>xx (9ARARATNrxxjXZ[][c[cZddfgkgqgqfrrstuu##88288L##88$**M]]4<<0
--1D1D1O1O1V1VVYYYY{{\\))"j,G\\))"j,G||++D*lK\\''
3t{{~~x}}';';B'HId# ?	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(;\\//BU^>_cszz>_`F%1L1LZ1XY!- 79T9TUg9hiNN!!$'LL55fooa6HI!,,.DK DO$U+ j4tX]]%9%9&//!:L:P:PQRUVQV:WY_`aYbYgYg%hij))$))4NN F d7?MM("3"3"="=dood>SUYUaUa"bcd
 6{Q,,-G1ahh-GH"OOA.99;M %%'1,g.gg, LL55fooa6HI))+B\\,,R4\\,,R4KK'..DDRHNN4;;>>8==+?+?G+LM?	ND !' 	]GAtNN4!5!5f6G6G6JFSTINN![\	] KK 	6DEEE5	6C @t ?`, .Hi?	N ?	Ns@   i%Ci4B
i4i*2E=i40A/i4i/
2D4i4*
i44i=c                     | j                  |j                        }| j                  |j                        }| j                  |j                        }t	        |||      S rO   )r   lowerupperr	  r  )rq   rg   r*  r+  r	  s        r7   visit_SlicezCodeGenerator.visit_Slice	  sG    

4::&

4::&zz$))$UE4((r8   c                 8    | j                  |j                        S rO   )r   r   r   s     r7   visit_IndexzCodeGenerator.visit_Index  s    zz$**%%r8   c                 P    |j                   | j                  |j                        fS rO   )rk   r   r   r   s     r7   visit_keywordzCodeGenerator.visit_keyword  s    xxDJJ///r8   c                     | j                  |j                        }|j                  | j                  |j                        nd}t        j                  j                  ||| j                        S )Nr   rr  )r   r  msgr   r  device_assertry   )rq   rg   r  r2  s       r7   visit_AssertzCodeGenerator.visit_Assert  sQ    zz$))$&*hh&:djj"}}**4t||*LLr8   rh   c                    t        j                  |j                  g|i |}|j                  D cg c]  }||   	 }}|D cg c]  }t	        |      r|n
t        |       }}i }t        |      D cg c]  \  }}t        |      s| }}}|D ci c]  }|||   
 }	}t        |      D cg c]  \  }}||v rd n| }}}|D cg c]  }||j                   }
}|D cg c]  }||j                   }}t        |j                  ||	      }| j                  j                  |      st        j                  g |      }|j                   }t#        |      \  }}t%        | j&                  ||||	| j                  ||| j(                  |j*                  ||| j,                  j.                  | j,                  j0                  | j,                  j2                        }	 |j5                  |j7                                |jB                  }|| j(                  |<   n| j(                  |   }| j                  jE                  |      }| j,                  jG                  ||
      }|jI                         dk(  s|y |jI                         dk(  rtK        |jM                  d      |      S g }tO        |jI                               D ]/  }|jQ                  tK        |jM                  |      ||                1 tS        |      S c c}w c c}w c c}}w c c}w c c}}w c c}w c c}w # t8        $ r1}t;        | j<                  j>                  | j@                  d       |d }~ww xY w)N)
r   r   r   r   rb   r   r   r   r   r   r   r   )*inspectgetcallargsrh   rf   rR   r   rc   rW   r'  rY   rK   re   r   has_functionr   function_type__globals__r   r   r   r   rb   ry   r   r   r   r   r   	Exceptionr   r   rd   r   r   get_functioncallget_num_resultsr   r  r>  r@  r^   )rq   rh   ri   r   rE   rk   r   r   
constexprsrG   arg_vals	arg_typesfn_namer   r   r   r   rp   ecallee_ret_typesymbolcall_opresultss                          r7   call_JitFunctionzCodeGenerator.call_JitFunction  s   ""255:4:6:')||4tT
44LPQS',)C.@QQ
&/oLFAss9KaL
L)34AQQZ4	4?HOVQZS0OO*.B3#/CJJBB)-A#SXXA	ABKKI>{{''0 ..r9=I^^F$8$<!Iz%dllIvzS\eiepep-/wW[WnWn/1{{i\f.2ll.B.BPTP\P\PhPh151H1H	JI
T
+
 (00O/>D##G,"55g>O))'2,,##FH5""$)_-D$$&!+',,Q/AA G72245 Rvg&8&8&;_Q=OPQR>!W 5Q M4OBA  T&t{{tLRSSTsS   K<L5L	LL1L
LL&L.LL! !	M*,MMc                 ^    t         j                  |j                              } j                  j	                  |      }|	 | |      S t         fd|j                  D              }|j                  D cg c]  } j                  |       }}t        |t              r t        |||        j                  |||      S t        |d      rt        |j                        st        j                   j#                  |      rAd j$                  i}t'        j(                  |      }d|j*                  v r |d<   	  ||i ||S | j4                  j7                         v rt9        t         |      } ||i |S c c}w # t,        $ r'}	t/         j0                  j2                  |d       |	d }	~	ww xY w)Nc              3   @   K   | ]  }j                  |        y wrO   r   r  s     r7   r   z+CodeGenerator.visit_Call.<locals>.<genexpr>O  s     D74::g&Dr   __self__rs  
_generator)r   r   r    statically_implemented_functionsr   r  r  ri   rP   r   rl   rH  hasattrrR   rK  r   r  
is_builtinry   r6  	signature
parametersr;  r   r   rd   r   r`  r0   )
rq   rg   rh   static_implementationkwsrk   ri   extra_kwargssigrC  s
   `         r7   r   zCodeGenerator.visit_CallI  s   !$**TYY"78 $ E E I I" M ,(t44DdmmDD+/995C

355b+&4T*((T377B
#(8(E(--JbJbceJf&5L##B'Cs~~--1\*	K47<7377 ''..00+T2D43- 6  K 't{{dCJKs   8E79	E< <	F,"F''F,c                 ,    t        |j                        S rO   r   r   r   s     r7   visit_ConstantzCodeGenerator.visit_Constanth  s    $$r8   rg   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   rY   re  r}  re   rx  r~  s        r7   visit_BoolOpzCodeGenerator.visit_BoolOpk  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??r8   logical_and
logical_orrZ  )      c                 ,    t        |j                        S rO   rW  r   s     r7   visit_NameConstantz CodeGenerator.visit_NameConstant{  s    TZZ((r8   c                 ,    t        |j                        S rO   )r   r  r   s     r7   	visit_NumzCodeGenerator.visit_Num~  s    TVV$$r8   c                 >    t        t        j                  |            S rO   )r   r   literal_evalr   s     r7   	visit_StrzCodeGenerator.visit_Str  s    S--d344r8   c                     | j                  |j                        }t        |      r;|j                  dk(  r,t        j
                  j                  |d| j                        S t        ||j                        S )NT)r   r   )ry   )	r   r   rU   r   r   r%  permutery   r   )rq   rg   rf  s      r7   r   zCodeGenerator.visit_Attribute  sZ    jj$S!dii3&6$$,,S&$,,,OOsDII&&r8   c                 D    t         j                  j                  | |       y rO   r  r   s     r7   
visit_ExprzCodeGenerator.visit_Expr  r  r8   c                      y rO   r   r   s     r7   visit_NoneTypezCodeGenerator.visit_NoneType  r   r8   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   )r]   r`  rc   rP   r   Constantr*   r   FormattedValue
conversionr   rW   r   rY   chrr}  AssertionErrorr/   )rq   rg   r`  r   r   conversion_code	evaluateds          r7   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r8   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   ry   r  rN  r   r   r   rz  r{  superr   r   r;  r   rd   rC   )rq   rg   	last_noder  rJ   rC  r  s         r7   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}  rY   re   r   s     r7   r   zCodeGenerator.generic_visit  s,    &E&L&LTRVZM`M`&abbr8   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?  ri   r  r3   r   r   rP   r   NotImplementedErrorr;  rC   r   r   rd   )rq   rg   	arg_countpassedr   rC  s         r7   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 )Nrg   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rO   r   r  s     r7   r   z=CodeGenerator.static_executor.<locals>.ret.<locals>.<genexpr>  s     #UGDJJw$7#Ur   )r  r   ri   r   r   )rq   rg   rE   r   rS  rk   ri   	python_fns   `      r7   rJ   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  rJ   s   ` r7   static_executorzCodeGenerator.static_executor  s    	6CHH 	6 
r8   rM  )NFNFNr   )re   r   r   r   r   r   r*   rr   r?  r]   r>  floatintrP   r   r   r   r   updater   r  device_printminimummaximumr   r   r   r	   r   r   r  r  r  r  r   r!  r   r   rW  rY  r\  r   r   r   rk  rm  rp  rx  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  unaryopr  r  r  r  r(  r,  r.  r   r0  r4  rH  r   rX  BoolOpr[  AndOrrZ  boolopsysversion_infora  rc  rf  r   rk  rm  rw  r   r   r   r  r  static_assertstatic_printr   rM  r   r   __classcell__)r   r   r  s   00@r7   r   r      s    jnMN00al 00X`aeXf00,4SM00d BEdESXZ]_ikr@s(t1Q(ttCH~t	(--,,-	  !	  ! L-^&c &%	0A*B &t &"
2@2H?T&'"(2+.
22.@ 	)n

L

L

I		8

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

#3S#89j
& 	)	%	5'2$:c#(( t ,
 	##%:""OE$:_S!_S!	Q$d68SXXJO3L+L&M a )us   Mr   c                     d}t        |       D ]:  \  }}|t        |      z  }||j                  v r|dz  }||j                  v s6|dz  }< |S )Nr   r:   d)rc   r*   
equal_to_1divisibility_16)rP  specializationsuffixr   r   s        r7   kernel_suffixr    sd     F)$ 1#a&)))cMF...cMF Mr8   c                     |j                   } fd}|j                  j                         D 	ci c]  \  }}	 ||      |	 }
}}	 j                  j	                         } j                  |      }t        |j                  j                               }|j                         }|D ]  }||v s||   dk(  s||   dk(  sd||<     |j                         }|j                         }|
j	                         }|j                  |       |j                  j                         D cg c]  \  }}||j                  vst        |      ! }}}t               \  }}t        j                   g |      }t#        ||||| |d|||||      }|j%                   j'                                |j(                  }||_        |S c c}	}w c c}}w )Nc                 ^    t        | t              rj                  j                  |       S | S rO   )rP   r*   rf   index)r   rh   s    r7   <lambda>zast_to_ttir.<locals>.<lambda>  s#    As1C**1-  r8   i1r   T)r   rG   r   r   r   r   r   r   r   r   r   )attrsrG   r   r:  ru   rC   r]   rP  r`  get_constantsfilter_out_constantsget_fn_attrsr  r   r   r   r9  r   r   r   r   r   )rh   r  r   r   r   r   r  cst_keykeyr   rG   r   r   tysnew_constantsr   	new_attrsfn_attrsall_constantsr   rA  r   r   r   rp   rJ   s   `                         r7   ast_to_ttirr    s     EJG7E7O7O7U7U7WXeu$XIX^^  "FGGN+M
~''..0
1C'')M $8A$=+;q+@#M!$ **,I%%'HNN$M'*8*B*B*H*H*Jp$!QaWeWoWoNo1pIp04Iz&&r95Igy=hu%'HXa)3WR]jtvI OOBHHJ


CCKJ5 Y qs   F<%G<G)7r   r6  rt  r  r|  r  r  typingr   r   r   r   r   r   r	   r   r   _C.libtritonr   r   r   r   language.corer   r   r   runtime.jitr   r   runtimer   errorsr   r   r   typesr   r#   rK   r   rR   rU   rW   r[   r_   rl   r  rY   r  rn   r  r   r   r  r  r   r8   r7   <module>r     s   
  	 
  	  D D D   3 3 J J = ! a a .$	! ! !! ! !$S $T $Q Q Q(S (T ( #tDz* 3 3*U%COO U%piCOO iX!
r8   