
    
f                        d dl Z d dl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 d dlmZ d dlmZ d d	lmZ d d
lmZmZmZmZmZ d                    edg          Z G d de          Z G d de          Z ee          Z G d de          Zeee<   eeee         <   d Z e eee         <    G d de          Z! G d de j"                  Z#dS )    N)contextmanager)cached_property)njit)errorscputyping)TargetDescriptor)TargetConfigurationStack)BasicRetarget)overload)dispatcher_registryCPUDispatcherCPUtarget_registryjit_registry.	CustomCPUc                       e Zd ZdZdS )r   zExtend from the CPU target
    N)__name__
__module____qualname____doc__     <lib/python3.11/site-packages/numba/tests/test_retargeting.pyr   r      s         Dr   c                   t    e Zd Zej        Zed             Zed             Ze	d             Z
e	d             ZdS )CustomTargetDescrc                 @    t          j        | j        | j                  S N)r   
CPUContexttyping_context_target_nameselfs    r   _toplevel_target_contextz*CustomTargetDescr._toplevel_target_context#   s     ~d143DEEEr   c                 (    t          j                    S r   )r   Contextr#   s    r   _toplevel_typing_contextz*CustomTargetDescr._toplevel_typing_context(   s     ~r   c                     | j         S )z5
        The target context for DPU targets.
        )r%   r#   s    r   target_contextz CustomTargetDescr.target_context-       
 ,,r   c                     | j         S )z5
        The typing context for CPU targets.
        )r(   r#   s    r   r!   z CustomTargetDescr.typing_context4   r+   r   N)r   r   r   r   CPUTargetOptionsoptionsr   r%   r(   propertyr*   r!   r   r   r   r   r       s        "GF F _F     _  - - X- - - X- - -r   r   c                       e Zd ZeZdS )CustomCPUDispatcherN)r   r   r   custom_targettargetdescrr   r   r   r1   r1   ?   s        KKKr   r1   c                  @    d|vsJ d|vsJ t          | dt          i|S )Ntarget_target)r   CUSTOM_TARGET)argskwargss     r   
custom_jitr:   G   s<    6!!!!F""""7}7777r   c                   *    e Zd Zed             Zd ZdS )CustomCPURetargetc                     t           S r   )r7   r#   s    r   output_targetzCustomCPURetarget.output_targetS   s    r   c                 L     t          t                    |j                  }|S )Nr6   )r   r7   py_func)r$   cpu_dispkernels      r   compile_retargetz"CustomCPURetarget.compile_retargetW   s$    ,m,,,X-=>>r   N)r   r   r   r/   r>   rD   r   r   r   r<   r<   R   s<          X    r   r<   c                   Z    e Zd Zd Zd Zed             Zd Zd Zd Z	d Z
d Zd	 Zd
 ZdS )TestRetargetingc                     t          d          d             t           fd            }t           d             }t                      | _        t                      | _        d S )Nr   r@   c                     | dz   S )zo
            This has a fixed target to "cpu".
            Cannot be used in CUSTOM_TARGET target.
            
   r   xs    r   fixed_targetz+TestRetargeting.setUp.<locals>.fixed_target`   s     r6Mr   c                       |           dz   S )z
            This has a flexible target, but uses a fixed target function.
            Cannot be used in CUSTOM_TARGET target.
            d   r   )rK   rL   s    r   flex_call_fixedz.TestRetargeting.setUp.<locals>.flex_call_fixedh   s      <??S((r   c                     | dz   S )zf
            This has a flexible target.
            Can be used in CUSTOM_TARGET target.
            i  r   rJ   s    r   flex_targetz*TestRetargeting.setUp.<locals>.flex_targetp   s     t8Or   )r   locals	functionsr<   retarget)r$   rO   rQ   rL   s      @r   setUpzTestRetargeting.setUp]   s     
e				 	 
		 
	) 	) 	) 	) 
	) 
	 	 
	  )++r   c                 4    t          j        | j                  S r   )r
   switch_targetrT   r#   s    r   rW   zTestRetargeting.switch_target}   s    '5dmDDDr   c              #      K   |                      t          j                  5 }d V  d d d            n# 1 swxY w Y   |                     t           dt          |j                             d S )Nz != cpu)assertRaisesr   
NumbaErrorassertInr7   str	exception)r$   raisess     r   check_retarget_errorz$TestRetargeting.check_retarget_error   s      v011 	VEEE	 	 	 	 	 	 	 	 	 	 	 	 	 	 	///V5E1F1FGGGGGs   377c                     | j         j                                        }|                     |d         |d         z   d           d S )Nhitmissr   )rT   cachestatsassertGreater)r$   rd   s     r   check_non_empty_cachez%TestRetargeting.check_non_empty_cache   sC    #))++ 	5<%-7;;;;;r   c                 ,   | j         d         | j         d         t          fd            } |d          }|                     |d           | j        j                                        }|                     |t          dd                     d S )NrL   rQ   c                 4     |           }  |           } | S r   r   rK   rL   rQ   s    r   fooz'TestRetargeting.test_case0.<locals>.foo   "    QAAAHr   {   im  r   )ra   rb   )rS   r   assertEqualrT   rc   rd   dict)r$   rj   rrd   rL   rQ   s       @@r   
test_case0zTestRetargeting.test_case0   s    ~n5n]3		 	 	 	 	 
	
 CHHO,,,#))++ 3 3 344444r   c                    | j         d         t          fd            }|                                 5   |d          }d d d            n# 1 swxY w Y   |                     |d           |                                  d S )NrQ   c                      |           } | S r   r   )rK   rQ   s    r   rj   z'TestRetargeting.test_case1.<locals>.foo   s    AAHr   rl   ic  )rS   r   rW   rm   rf   )r$   rj   ro   rQ   s      @r   
test_case1zTestRetargeting.test_case1   s    n]3		 	 	 	 
	 !! 	 	CA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	J'''""$$$$$s   AAAc                 ,   | j         d         | j         d         t          fd            }|                                 5  |                                 5   |d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zK
        The non-nested call into fixed_target should raise error.
        rL   rQ   c                 4     |           }  |           } | S r   r   ri   s    r   rj   z'TestRetargeting.test_case2.<locals>.foo   rk   r   rl   NrS   r   r_   rW   )r$   rj   rL   rQ   s     @@r   
test_case2zTestRetargeting.test_case2   s2    ~n5n]3		 	 	 	 	 
	
 &&(( 	 	##%%  C              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	6   B	A1%B	1A5	5B	8A5	9B		BBc                 ,   | j         d         | j         d         t          fd            }|                                 5  |                                 5   |d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )zF
        The nested call into fixed_target should raise error
        rQ   rO   c                 4     |           }  |           } | S r   r   rK   rO   rQ   s    r   rj   z'TestRetargeting.test_case3.<locals>.foo   $    ""AAAHr   rl   Nrv   )r$   rj   rO   rQ   s     @@r   
test_case3zTestRetargeting.test_case3   s3    n]3.):;		 	 	 	 	 
	
 &&(( 	 	##%%  C              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	rx   c                 n   | j         d         | j         d          d          }|                     |d           t          fd            }|                                 5  |                                 5   |d           ddd           n# 1 swxY w Y   ddd           dS # 1 swxY w Y   dS )z
        Same as case2 but flex_call_fixed() is invoked outside of CUSTOM_TARGET
        target before the switch_target.
        rQ   rO   rl      c                 4     |           }  |           } | S r   r   r{   s    r   rj   z'TestRetargeting.test_case4.<locals>.foo   r|   r   N)rS   rm   r   r_   rW   )r$   ro   rj   rO   rQ   s      @@r   
test_case4zTestRetargeting.test_case4   sX   
 n]3.):;OC  N+++		 	 	 	 	 
	
 &&(( 	 	##%%  C              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s6   %B*:BB*B	B*B	B**B.1B.c                    d t          t                    d             }t          d          d             }t          d             }t          fd            } |d          }|                     |d	           |                                 5   |d          }|                     |d
           ddd           n# 1 swxY w Y   |                                  dS )zA
        Tests overload resolution with target switching
        c                     d S r   r   rJ   s    r   overloaded_funcz3TestRetargeting.test_case5.<locals>.overloaded_func   s    Dr   )r5   c                     d }|S )Nc                     dS )Nin  r   rJ   s    r   implzRTestRetargeting.test_case5.<locals>.ol_overloaded_func_custom_target.<locals>.impl       ur   r   rK   r   s     r    ol_overloaded_func_custom_targetzDTestRetargeting.test_case5.<locals>.ol_overloaded_func_custom_target         Kr   r   c                     d }|S )Nc                     dS )Niz  r   rJ   s    r   r   zHTestRetargeting.test_case5.<locals>.ol_overloaded_func_cpu.<locals>.impl   r   r   r   r   s     r   ol_overloaded_func_cpuz:TestRetargeting.test_case5.<locals>.ol_overloaded_func_cpu   r   r   c                     d S r   r   rJ   s    r   flex_resolve_overloadz9TestRetargeting.test_case5.<locals>.flex_resolve_overload   s    Fr   c                      |  |           z   S r   r   )rK   r   s    r   rj   z'TestRetargeting.test_case5.<locals>.foo   s    q))))r   rl   i2{  i  N)r   r7   r   rm   rW   rf   )r$   r   r   r   rj   ro   r   s         @r   
test_case5zTestRetargeting.test_case5   sm   
	 	 	 
/-	8	8	8	 	 
9	8	
 
/%	0	0	0	 	 
1	0	
 
	 	 
	 
	* 	* 	* 	* 
	* CHHK(((!! 	- 	-CAQ,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	""$$$$$s   "CC
CN)r   r   r   rU   rW   r   r_   rf   rp   rs   rw   r}   r   r   r   r   r   rF   rF   \   s        , , ,@E E E H H ^H
< < <5 5 5 % % %  "  "  *#% #% #% #% #%r   rF   )$unittest
contextlibr   	functoolsr   numbar   
numba.corer   r   r   numba.core.descriptorsr	   numba.core.dispatcherr
   numba.core.retargetr   numba.core.extendingr   numba.core.target_extensionr   r   r   r   r   joinr   r7   r   r   r2   r1   r:   r<   TestCaserF   r   r   r   <module>r      s@    % % % % % % % % % % % %       * * * * * * * * * * 3 3 3 3 3 3 : : : : : : - - - - - - ) ) ) ) ) )              (K011	 	 	 	 	 	 	 	- - - - -( - - -8 "!-00         -       "+ 6I OM2 38 8 8 0:_]+ ,
       h% h% h% h% h%h' h% h% h% h% h%r   