U
    î¾|e®  ã                   @   s0  d dl Z d dlZd dlZd dlm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 d dlmZmZ d dlmZ d dl
mZmZ d dlmZmZmZmZmZmZmZmZmZ d dl m!Z! d d	l"m#Z# d d
l$m%Z% dd„ Z&G dd„ de'ƒZ(dd„ Z)G dd„ de'ƒZ*dd„ Z+dd„ Z,dd„ Z-dd„ Z.dd„ Z/dS )é    N)Úadd)ÚtypesÚirÚrewritesÚconfigÚir_utils)Úinfer_globalÚAbstractTemplate)Ú	signature)ÚutilsÚtyping)	Úget_call_tableÚmk_unique_varÚcompile_to_numba_irÚreplace_arg_nodesÚguardÚfind_callnameÚrequireÚ
find_constÚGuardException)ÚNumbaValueError)ÚOPERATORS_TO_BUILTINS)Únumpy_supportc                 C   s   |dkr| | S | S d S ©Nr   © )Údim_sizeÚindex_constr   r   úY/var/www/website-v5/atlas_env/lib/python3.8/site-packages/numba/stencils/stencilparfor.pyÚ_compute_last_ind   s    r   c                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚStencilPassc                 C   s.   || _ || _|| _|| _|| _|| _|| _d S ©N)Úfunc_irÚtypemapÚ	calltypesÚarray_analysisÚ	typingctxÚ	targetctxÚflags)Úselfr!   r"   r#   r$   r%   r&   r'   r   r   r   Ú__init__"   s    zStencilPass.__init__c                    s  ddl m} tˆ jjƒ\}}g }i }| ¡ D ].\}}|D ] }t||ƒr8| |¡ |||< q8q,|sddS ˆ jj ¡ D �]¦\}	}
tt	t
|
jƒƒƒD �]ˆ\}‰tˆtjƒ�rÌtˆjtjƒ�rÌˆjjdk�rÌˆjjj|k�rÌtˆjjƒ}‡fdd„ttˆjjƒƒD ƒ}ˆjj}t‡ fdd„|D ƒƒ}|D ]}t|tjƒ�rtd	ƒ‚�q| d
¡}|ˆjjj }t|ˆ j||
j|
j |ˆ j!ˆ j"ƒ\}}}|j# dd¡}ˆ  $|	||||ˆj%|||¡	}|
jd|… | |
j|d d…  |
_qŒtˆtjƒrŒtˆjtjƒrŒˆjjdkrŒt&t'ˆ jˆjƒdkrŒt (dˆj ¡ˆ_qŒqpdS )zP Finds all calls to StencilFuncs in the IR and converts them to parfor.
        r   )ÚStencilFuncNÚcallc                    s   i | ]}|ˆ j j| “qS r   )ÚvalueÚargs©Ú.0Úi)Ústmtr   r   Ú
<dictcomp>I   s      z#StencilPass.run.<locals>.<dictcomp>c                 3   s   | ]}ˆ j |j V  qd S r    )r"   Únamer.   ©r(   r   r   Ú	<genexpr>L   s     z"StencilPass.run.<locals>.<genexpr>zITuple parameters not supported for stencil kernels in parallel=True mode.ÚoutÚindex_offsetsé   )ÚstencilÚnumba))Únumba.stencils.stencilr*   r   r!   ÚblocksÚitemsÚ
isinstanceÚappendÚreversedÚlistÚ	enumerateÚbodyr   ÚAssignr,   ÚExprÚopÚfuncr3   ÚdictÚkwsÚrangeÚlenr-   Útupler   Ú	BaseTupleÚ
ValueErrorÚgetÚget_stencil_irr%   ÚscopeÚlocr"   r#   ÚoptionsÚ_mk_stencil_parforÚtargetr   r   ÚConst)r(   r*   Ú
call_tableÚ_Zstencil_callsZstencil_dictZcall_varnameÚ	call_listZone_callÚlabelÚblockr0   rI   Ú
input_dictÚin_argsZarg_typemapÚarg_typeÚout_arrÚsfÚ
stencil_irÚrtÚarg_to_arr_dictr7   Ú	gen_nodesr   )r(   r1   r   Úrun,   sx    

ÿ
þý
ÿ
    ý

    þ(ÿ
þÿýzStencilPass.runc              	   C   s¬   |  ¡ D ]ž\}}|j}|j}g }|jD ]x}	t|	tjƒr”| ¡ }
t|
tjƒrdt|
j	tj
ƒrd|
j	jdksht‚| t |
j	j	||¡¡ | t ||¡¡ q&| |	¡ q&||_qdS )zß
        Find return statements in the IR and replace them with a SetItem
        call of the value "returned" by the kernel into the result array.
        Returns the block labels that contained return statements.
        ÚcastN)r=   rQ   rR   rC   r>   r   ÚReturnÚpoprD   r,   rE   rF   ÚAssertionErrorr?   ÚJump)r(   r<   Úexit_value_varÚparfor_body_exit_labelrZ   r[   rQ   rR   Únew_bodyr1   Z	prev_stmtr   r   r   Úreplace_return_with_setitemh   s     
ÿ
þz'StencilPass.replace_return_with_setitemc
           S         sì	  g }
|j }tjdkr4td||ˆ||||ƒ t |¡ |d }ˆj|j }t |ˆj¡\}}t 	|¡}t 
|||ˆjˆj¡ tjdkr–tdƒ t |¡ t |ˆjj|ˆj¡ tjdkrÈtdƒ t |¡ ˆj|j j‰ |j}|j}g }tˆ ƒD ].}t |tdƒ|¡}tjˆj|j< | |¡ qîˆ ||||||	¡\}}tjdk�rhtdƒ td|ƒ td	|ƒ t |¡ g }ˆj |¡}| |¡}ˆ t|ƒk�s”t‚g }g }tˆ ƒD ]f}ˆ || || |
||¡}ˆ  || |
||¡}| |¡ | |¡ | t!j"j# $|| ||d¡¡ �q¤t%| &¡ ƒd }t '||¡||< t |td
ƒ|¡} |j(ˆj| j< g }!ˆ dk�rd|d }"nPt |tdƒ|¡}"tj) *tjˆ ¡ˆj|"j< tj+ ,||¡}#t -|#|"|¡}$|! |$¡ tjdk�rÒtdƒ t |¡ t '||¡}%ˆdk�rÒˆj|j }t d¡}&t ||&|¡}'tj+ .|d|¡}(tj) *tj|j¡ˆj|&< |%j/ 0t -|(|'|¡g¡ t d¡})t ||)|¡‰d|j1k�r¬|j1d }*t2j3 3|*¡}+ˆj4 5|+|j(¡�s t6dƒ‚| (|*¡},n
| (d¡},t 7|,|¡}-|j(ˆj|)< |%j/ 0t -|-ˆ|¡g¡ t d¡}.t ||.|¡‰t!j8jj9 :|j(|j|j;¡ˆjˆj< t |tdƒ|¡}/tj< =t>¡ˆj|/j< t ?dt>|¡}0t -|0|/|¡}1|%j/ |1¡ t@ A|j(¡jBjC}2|2dk�rŒd}2tj+ .|/|2|¡}3t |tdƒ|¡}4tjD E|j(¡ˆj|4j< t -|3|4|¡}5|%j/ |5¡ t Fdt>jGˆ|'|4gˆj4ˆjˆj¡}6t |tdƒ|¡}7t -t 7d|¡|7|¡}8|6 |8¡ tjHˆj|7j< t |tdƒ|¡}9t -t 7d|¡|9|¡}:|6 |:¡ tjˆj|9j< t |tdƒ|¡};ˆj4 ItJ¡}<|<ˆj|;j< t ?dtJ|¡}=t -|=|;|¡}>|6 |>¡ ˆj4 K|<tjHfd i ¡}?tj+jL|;|7|7fd|d �}@|?ˆj|@< t |td!ƒ|¡}AtjMˆj|Aj< t -|@|A|¡}>|6 |>¡ ‡ ‡‡‡fd"d#„}Bt|jƒD ]V}C|Ag|j }D|Ag|j }E|B|<|C|||;|6||D|9d$ƒ
 |B|<|C|||;|6||E||C d%ƒ
 �q^| Nˆ|¡ |%j/ 0|6¡ �n¦d|j1k�rx|j1d }*t2j3 3|*¡}+ˆj4 5|+|j(¡�sd}FtO|Fƒ‚t |td&ƒ|¡}Aˆj4 ItJ¡}<|<ˆj|Aj< t ?dtJ|¡}=t -|=|A|¡}G|%j/ |G¡ ˆj4 K|<tjHfd i ¡}?tj+jL|Add|d �}H|?ˆj|H< t |td'ƒ|¡}ItjMˆj|Ij< t -|H|I|¡}>|%j/ |>¡ t 7| (|*¡|¡}Jt |td(ƒ|¡}K|j(ˆj|Kj< t -|J|K|¡}L|%j/ |L¡ t PˆtJddƒ|I|K|¡}M|%j/ |M¡ tQtjHˆjˆj ˆj|Ij ˆjˆj j(ƒ}?|?ˆj|M< ˆ R|| |¡ tjdk�r¤td)ƒ t |¡ t Sˆ|"| |¡}NtQtjHˆjˆj ˆj|"j ˆjˆj j(ƒˆj|N< || j/ 0|!¡ || j/ |N¡ t Td*d+¡}Ot |td(ƒ|O¡}Pt -tj7d|Od,�|P|O¡}L|| j/ |L¡ || j/ t U|P|O¡¡ t V|¡}|t%| &¡ ƒ j/ W¡  tjdk�	r td-ƒ t |¡ d.||gf}Qt!j"j# X||%|||"||QˆjY¡}R|
 |R¡ |
 t -ˆ||¡¡ |
S )/z> Converts a set of stencil kernel blocks to a parfor.
        r8   rT   r   z#stencil_blocks after copy_propagatez'stencil_blocks after removing dead codez$parfor_index_varz-stencil_blocks after replace stencil accesseszstart_lengths:zend_lengths:z$parfor_exit_valuez$parfor_index_tuple_varz.stencil_blocks after creating parfor index varNZin_arr_shapeÚshapeZzero_valÚcvalz-cval type does not match stencil return type.Zstencil_outputz	$np_g_varÚnpÚboolÚbool_z$np_attr_attrÚemptyz	$none_varz$zero_index_varz$slice_func_varÚsliceé   r   ©rG   r-   rI   rR   ú$slicec
                    sš  ˆj  | tjfd i ¡}
|| }t|ttjfƒs4t‚t |t	dƒ|¡}tjˆj
|j< t|tƒrvt t ||¡||¡}nt |||¡}| |¡ tjj||	r¢||fn||fd|d�}|
ˆj|< t |t	dƒ|¡}tjˆj
|j< t |||¡}| |¡ |||< t |t	dƒ|¡}tj tjˆ ¡ˆj
|j< tj ||¡}t |||¡}| |¡ t ˆ|ˆ|¡}ttjˆj
ˆj ˆj
|j ˆj
ˆj jƒˆj|< | |¡ d S )Nrv   z$border_indr   rw   rx   z$border_index_tuple_var)r%   Úresolve_function_typer   Úintpr>   Úintr   ÚVarri   r   r"   r3   rD   rV   r?   rE   r+   r#   Úslice2_typeÚ
containersÚUniTupleÚbuild_tupleÚSetItemr
   ÚnoneÚdtype)Úslice_fn_tyÚdimrQ   rR   Úslice_func_varÚstmtsZborder_indsZborder_tuple_itemsZ	other_argZother_firstÚsigÚsiZsi_varZ	si_assignÚslice_callexprZborder_slice_varÚslice_assignZborder_ind_varÚ
tuple_callÚtuple_assignÚsetitem_call©Úndimsr_   r(   Zzero_varr   r   Úhandle_borderA  sZ    
ý

ü

ÿÿ ÿ
 

ý
z5StencilPass._mk_stencil_parfor.<locals>.handle_borderTFz	$py_g_varz$slice_instz$cval_constz%stencil_blocks after replacing returnZstencilparfor_dummyéÿÿÿÿ)rR   z#stencil_blocks after adding SetItemr9   )Zr<   r   ÚDEBUG_ARRAY_OPTÚprintr   Údump_blocksr"   r3   Úcopy_propagateÚget_name_var_tableÚapply_copy_propagater#   Úremove_deadr!   Ú	arg_namesÚndimrQ   rR   rJ   r   r|   r   r   rz   r?   Ú_replace_stencil_accessesr$   Úget_equiv_setÚ	get_shaperK   ri   Ú_get_stencil_last_indÚ_get_stencil_start_indr:   ÚparforsÚparforÚLoopNestÚmaxÚkeysÚBlockrƒ   r~   r   rE   r€   rD   ÚgetattrrC   ÚextendrS   r   Útypeofr%   Úcan_convertrN   rV   ÚcoreÚnpytypesÚArrayÚlayoutÚmiscÚModulerq   ÚGlobalr   Úas_dtypeÚtypeÚ__name__Ú	functionsÚNumberClassÚgen_np_callrt   r‚   Úresolve_value_typeru   ry   r+   r}   Zinsert_equivr   ÚStaticSetItemr
   rn   r�   ÚLocrg   Úsimplify_CFGrh   ÚParforr'   )Sr(   rZ   r]   r_   ra   r7   rU   Úreturn_typeÚstencil_funcrc   rd   Ústencil_blocksÚin_arrÚ
in_arr_typÚin_cpsÚout_cpsÚname_var_tablerQ   rR   Úparfor_varsr0   Z
parfor_varÚstart_lengthsÚend_lengthsÚ	loopnestsÚ	equiv_setZin_arr_dim_sizesZ
start_indsZ	last_indsÚlast_indZ	start_indrl   rk   Zfor_replacing_retZparfor_ind_varrŒ   r�   Ú
init_blockÚ
shape_nameZ	shape_varZshape_getattrZ	zero_namerp   Úcval_tyÚtemp2Z
full_constZso_nameZdtype_g_np_varZ
dtype_g_npZdtype_g_np_assignÚreturn_type_nameZdtype_np_attr_callÚdtype_attr_varÚdtype_attr_assignr‡   Znone_varZnone_assignZzero_index_varZzero_index_assignr†   r„   Zslice_gr‹   rˆ   rŠ   Ú	slice_varr‘   r…   Zstart_tuple_itemsZlast_tuple_itemsÚmsgZslice_assignedÚcallexprZslice_inst_varZcval_const_valZcval_const_varZcval_const_assignZsetitemexprrŽ   Z	dummy_locZret_const_varÚpatternr¢   r   r�   r   rT   �   sN   
  ÿ

û

ÿ

ÿÿ    þ




   ÿ   ÿ

  ÿ


ÿÿ ÿ




ÿ





ýÿ
ú



þý

8÷
÷

þÿ
ÿÿ ÿ þ
þ
ÿ
 

ý


ÿ

    ÿ
zStencilPass._mk_stencil_parforc                 C   s4  |}|dk�r0t  |tdƒ|¡}tj| j|j< t|tj	ƒrRt  
t  ||¡||¡}nt  
|||¡}| |¡ t  |tdƒ|¡}tj| j|j< t  |tdƒ|¡}	t t¡}
tj |
¡}|| j|	j< t  d|
|¡}t  
||	|¡}| |¡ t j |	||gd|¡}| | jtjtjgi ¡| j|< t  
|||¡}| |¡ |S )Nr   Zstencil_const_varrÊ   Zcompute_last_ind_varr   r   )r   r|   r   r   rz   r"   r3   r>   ÚnumbersÚNumberrD   rV   r?   r:   Únjitr   rµ   Ú
Dispatcherr±   rE   r+   Úget_call_typer%   r#   )r(   r   Z
end_lengthrd   rQ   rR   rÊ   r   Úconst_assignZg_varZ
check_funcÚfunc_typZg_objZg_assignÚ
index_callÚindex_assignr   r   r   rŸ   ò  s>    
ÿ ÿ


 
 ÿ

z!StencilPass._get_stencil_last_indc           	      C   s�   t |tƒrtt|dƒƒS dd„ }t|i | j| jtjf| j	| j
ƒ}t|jƒdksRt‚|j ¡ d }t||gƒ ||jd d… 7 }|jd jj}|S )Nr   c                 S   s   t t| dƒƒS r   )ÚabsÚmin)Zs_lengthr   r   r   Úget_start_ind  s    z9StencilPass._get_stencil_start_ind.<locals>.get_start_indr8   éþÿÿÿ)r>   r{   rß   rà   r   r%   r&   r   rz   r"   r#   rK   r<   ri   Úpopitemr   rC   r,   )	r(   Zstart_lengthrd   rQ   rR   rá   Úf_irr[   Zret_varr   r   r   r      s    

  þz"StencilPass._get_stencil_start_indc              	      s°  ˆj }|d }dd„ |D ƒ}	d|jkr`|jd D ]}
|
ˆ kr0tdƒ‚q0‡ fdd„|jd D ƒ}ng }|j|krvtdƒ‚ˆj|j j}|j}|j}|jdk}|r´|dg }|dg }n d	d„ |jD ƒ}d
d„ |jD ƒ}t	 
|¡}d}| ¡ D �]¦\}}g }|jD �]Š}t|tjƒ�r@t|jtjƒ�r@|jjdk�r@|jjj|	k�sjt|tjƒ�s\t|tjƒ�rr|jj|	k�rrtdƒ‚t|tjƒ�r€t|jtjƒ�r€|jjdk�r€|jjj|	k�r€|jjj|k�r€|jj}|dk�rØ|g}n"t|dƒ�rú|j|k�rú||j }t	 |¡ˆ_‡‡fdd„|D ƒ}|�r6ˆ |t|ƒ|||¡}|�rŠt|tjƒ�s^tdd„ |D ƒƒ�rftdƒ‚ttt||ƒƒ}ttt ||ƒƒ}d}ˆ |t|ƒ|||¡}|dk�r´|d }nPt |t!dƒ|¡}t"j# $t"j%|¡ˆj|j< tj &||¡}t |||¡}| '|¡ t(‡fdd„|D ƒƒ�r0ˆj|jjj j)}nˆj|jjj }tj *|jj||¡}t+|ˆj|jjj ˆj|j ƒˆj,|< ||_| '|¡ qþ||_qê|�r¨|�s¨tdƒ‚||fS )zÄ Convert relative indexing in the stencil kernel to standard indexing
            by adding the loop index variables to the corresponding dimensions
            of the array index tuples.
        r   c                 S   s   g | ]
}|j ‘qS r   )r3   ©r/   Úxr   r   r   Ú
<listcomp>+  s     z9StencilPass._replace_stencil_accesses.<locals>.<listcomp>Ústandard_indexingz[Standard indexing requested for an array name not present in the stencil kernel definition.c                    s   g | ]}ˆ | ‘qS r   r   rå   )rc   r   r   rç   2  s     zYThe first argument to a stencil kernel must use relative indexing, not standard indexing.Nc                 S   s   g | ]}|d  ‘qS )r   r   rå   r   r   r   rç   I  s     c                 S   s   g | ]}|d  ‘qS )r8   r   rå   r   r   r   rç   J  s     F)ÚsetitemÚstatic_setitemz?Assignments to arrays passed to stencil kernels is not allowed.)Ústatic_getitemÚgetitemr8   r3   c                    s   g | ]}t ˆˆ j|ƒ‘qS r   )Ú_get_const_index_exprr!   ©r/   Úv)r(   ra   r   r   rç   t  s   ÿ  ÿc                 S   s   g | ]}t |tƒ ‘qS r   ©r>   r{   rî   r   r   r   rç     s     z<Variable stencil index only possible with known neighborhoodTz$parfor_index_ind_varc                    s   g | ]}ˆ j |j tjk‘qS r   )r"   r3   r   rz   rî   r4   r   r   rç   ˜  s   ÿz=Stencil kernel with no accesses to relatively indexed arrays.)-r<   rS   rN   r3   r"   r›   rQ   rR   Úneighborhoodr   Úget_tuple_tabler=   rC   r>   r   rD   r,   rE   rF   r�   r¹   rU   ÚindexÚhasattrÚbuild_definitionsÚ_definitionsÚ_add_index_offsetsrA   r|   ÚanyÚmaprà   r¤   r   r   r~   r   rz   r€   r?   Úallrƒ   rì   r
   r#   )r(   ra   rÅ   r]   r7   r¾   rc   r¿   rÀ   Zin_arg_namesræ   Ústandard_indexedr�   rQ   rR   Úneed_to_calc_kernelrÆ   rÇ   Útuple_tableZfound_relative_indexrZ   r[   rm   r1   Ú
index_listÚ
index_varsÚind_varrŒ   r�   Zgetitem_return_typÚgetitem_callr   )rc   r(   ra   r   rœ   #  sê    


ÿ



ÿ
þý
ü
û
úÿ
þýü

ÿ   ÿÿÿ   ÿ

ÿÿ ÿ
ÿ
ÿÿ
ý
z%StencilPass._replace_stencil_accessesc                 C   s<  t |ƒt |ƒkst‚tdd„ || D ƒƒr:ttt||ƒƒS g }g }tt |ƒƒD �]Ü}|| }	t|	tƒrªt	 
|tdƒ|¡}	tj| j|	j< t	 t	 || |¡|	|¡}
| |
¡ || }t|tƒ�rt	 
|tdƒ|¡}tj| j|j< t	 t	 || |¡||¡}
| |
¡ t|	tƒ�s&t| j|	j tjjƒ�r\| j|j tjk�s>t‚|  |	||||¡}| |¡ qNt|tƒ�s€t| j|j tjjƒ�r¶| j|	j tjk�s˜t‚|  ||	|||¡}| |¡ qNt	 
|tdƒ|¡}tj| j|j< t	j tj|	||¡}| j tjtjtjfi ¡| j|< t	 |||¡}| |¡ | |¡ qN| |¡ |S )zw Does the actual work of adding loop index variables to the
            relative index constants or variables.
        c                 S   s   g | ]}t |tƒ‘qS r   rð   rî   r   r   r   rç   ¸  s     z2StencilPass._add_index_offsets.<locals>.<listcomp>Úold_index_varÚ
offset_varZoffset_stencil_index)rK   ri   rú   rA   rù   r   rJ   r>   r{   r   r|   r   r   rz   r"   r3   rD   rV   r?   ru   r¯   Ú	SliceTypeÚ_add_offset_to_slicerE   ÚbinopÚoperatorr%   ry   r#   r¨   )r(   rþ   r7   rm   rQ   rR   Ú	out_nodesrÿ   r0   r  rÛ   r  Ú	index_varrÝ   rÞ   r   r   r   r÷   °  s–    
 ÿ ÿ
 ÿ ÿ
ÿÿ  ÿ
ÿÿ  ÿ
 ÿ ÿ 
 ÿ


zStencilPass._add_index_offsetsc                 C   sÎ   t |tƒrBd |j|j¡}i }t|i |ƒ |d }|g}tjf}	n&dd„ }||g}| j|j	 }
|
tjf}	| j
jjj}t||| j| j|	| j| jƒ}|j ¡ \}}t||ƒ |jd jj}| |jd d… ¡ |S )NzRdef f(offset):
                return slice({} + offset, {} + offset)
            Úfc                 S   s   t | j| | j| ƒS r    )ru   ÚstartÚstop)Z	old_sliceÚoffsetr   r   r   r
     s    z+StencilPass._add_offset_to_slice.<locals>.frâ   )r>   ru   Úformatr  r  Úexecr   rz   r"   r3   r!   Úfunc_idrG   Ú__globals__r   r%   r&   r#   r<   rã   r   rC   r,   r¨   )r(   rÒ   r  r  rQ   rR   Zf_textr
  r-   Úarg_typsZ
slice_typeÚ_globalsrä   rX   r[   Ú	new_indexr   r   r   r  ô  s2    
 þ

  ÿ
z StencilPass._add_offset_to_sliceN)r´   Ú
__module__Ú__qualname__r)   re   rn   rT   rŸ   r    rœ   r÷   r  r   r   r   r   r   !   s   
<  s" Dr   c                 C   sÌ  ddl m} ddlm}	 ddlm}
 ddlm} | j 	¡ }t	 
|j¡}||_t |j¡}d|krhtdƒ‚ddlm}	 |	j}|	 ||¡�ˆ t||||ƒ}tj d|j¡ ||jj|jj|jj|jjd	ƒ\|j_|j_|j_}|
j|jj|jj|jjd
d	|jj|jjtjd� W 5 Q R X t  |t !¡ ¡}t"| #¡ ƒ}t$| #¡ ƒ}tj% &|¡ tj'dk�rft(dƒ t )|¡ i }|jj *¡ D ].\}}t+ ,|t-|ƒ|¡}|||< |||j.< �qvt /||¡ tj'dk�rÐt(dƒ t )|¡ |jj *¡ D ]\}}|||< �qÜi }| 0¡ D ]‚}|j1D ]t}t2|t+j3ƒ�rt2|j4t+j5ƒ�rtj'dk�rTt(d||j4j6|j4j.|j4j6|kƒ ||j4j6 j.||j4j.< ||j4j6 |_4�q�qütj'dk�r¨t(d|ƒ t(dƒ t )|¡ t 7|¡ ||_||  8|¡d |fS )z'get typed IR from stencil bytecode
    r   )Ú
CPUContext)Ú
cpu_target)Útype_annotations)Útype_inference_stager6   z6Cannot use the reserved word 'out' in stencil kernels.zbefore-inferenceNr   )r!   r"   r#   ÚliftedÚlifted_fromr-   r½   Úhtml_outputr8   zInitial stencil_blockszAfter replace_varsr\   rc   zAfter replace arg with arr)9Znumba.core.cpur  Únumba.core.registryr  Znumba.core.annotationsr  Únumba.core.typed_passesr  Ú	kernel_irÚcopyÚdeepcopyr<   r   r—   rN   Útarget_contextÚnested_contextÚDummyPipeliner   Úrewrite_registryÚapplyÚstater%   r&   r!   r-   r"   r½   r#   ZTypeAnnotationr   ÚHTMLÚadd_offset_to_labelsÚ
next_labelrà   r¥   r¤   Ú_the_max_labelÚupdater“   r”   r•   r=   r   r|   r   r3   Úreplace_varsÚvaluesrC   r>   rD   r,   ÚArgró   Úremove_delsÚget_return_type)r`   r%   r-   rQ   rR   r\   r"   r#   r  r  r  r  Zstencil_func_irr¿   rÄ   r&   ÚtprX   Z	min_labelÚ	max_labelÚvar_dictrï   ÚtypÚnew_varr+   Úcall_typrc   r[   r1   r   r   r   rP     sŒ    
   þøÿ


 
ÿ


rP   c                   @   s   e Zd Zdd„ ZdS )r%  c                 C   sP   ddl m} |ƒ | _|| j_|| j_|| j_|| j_d | j_d | j_d | j_	d S )Nr   )Ú	StateDict)
Znumba.core.compilerr9  r(  r%   r&   r-   r!   r"   r½   r#   )r(   r%   r&   r-   rä   r9  r   r   r   r)   g  s    zDummyPipeline.__init__N)r´   r  r  r)   r   r   r   r   r%  f  s   r%  c                 C   s   t t| ||ƒ}|dk	r|S |S )z²
    infer index_var as constant if it is of a expression form like c-1 where c
    is a constant in the outer function.
    index_var is assumed to be inside stencil kernel
    N)r   Ú_get_const_index_expr_inner)ra   r!   r	  Ú	const_valr   r   r   rí   s  s       ÿrí   c                 C   sr   t t|tjƒƒ tt| ||ƒ}|dk	r*|S t | |¡}tt| ||ƒ}|dk	rP|S tt	| ||ƒ}|dk	rj|S t
‚dS )zWinner constant inference function that calls constant, unary and binary
    cases.
    N)r   r>   r   r|   r   Ú_get_const_two_irsr   Úget_definitionÚ_get_const_unary_exprÚ_get_const_binary_exprr   )ra   r!   r	  Ú	var_constÚ	index_defr   r   r   r:    s,       ÿ   ÿr:  c                 C   s8   t t| |ƒ}|dk	r|S t t||ƒ}|dk	r0|S t‚dS )zWget constant in either of two IRs if available
    otherwise, throw GuardException
    N)r   r   r   )Zir1Zir2Úvarr@  r   r   r   r<  –  s    r<  c                 C   sF   t t|tjƒo|jdkƒ |j}t| ||ƒ}t|j }t	d 
||¡ƒS )zQevaluate constant unary expr if possible
    otherwise, raise GuardException
    Úunaryz{}{})r   r>   r   rE   rF   r,   r:  r   ÚfnÚevalr  )ra   r!   rA  Z	inner_varr;  rF   r   r   r   r>  ¢  s
    
r>  c                 C   sR   t t|tjƒo|jdkƒ t| ||jƒ}t| ||jƒ}t|j	 }t
d |||¡ƒS )zRevaluate constant binary expr if possible
    otherwise, raise GuardException
    r  z{}{}{})r   r>   r   rE   rF   r:  ÚlhsÚrhsr   rD  rE  r  )ra   r!   rA  Úarg1Úarg2rF   r   r   r   r?  ­  s
    
r?  )0rÖ   r!  r   Úpytypesr  r   Únumpyrq   Únumba.parfors.parforr:   Ú
numba.corer   r   r   r   Únumba.core.typing.templatesr   r	   Únumba.core.typingr
   r   r   Únumba.core.ir_utilsr   r   r   r   r   r   r   r   r   Únumba.core.errorsr   Znumba.core.utilsr   Únumba.npr   r   Úobjectr   rP   r%  rí   r:  r<  r>  r?  r   r   r   r   Ú<module>   s8   ,     rX