U
    hâËdR0  ã                   @   s4  d dl 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 d dlmZmZmZmZmZmZmZmZmZ d dlmZmZ d dlmZ d d	lmZ d dlZd d
lmZm Z m!Z! d dl"m#Z# G dd„ dej$ƒZ%G dd„ dej$ƒZ&G dd„ deƒZ'eddddddddddddddd d!d"d#ƒZ(G d$d%„ d%e(eƒZ)dS )&é    N)Úir)Ú_dynfunc)ÚPyCallWrapper)ÚBaseContext)	ÚutilsÚtypesÚconfigÚcgutilsÚcallconvÚcodegenÚ	externalsÚfastmathpassÚ
intrinsics)ÚTargetOptionsÚinclude_default_options)Úrtsys)Úglobal_compiler_lock)ÚParallelOptionsÚFastMathOptionsÚInlineOptions)Úufunc_dbc                   @   s   e Zd ZdejfgZdS )ÚClosureBodyÚenvN©Ú__name__Ú
__module__Ú__qualname__r   ZpyobjectÚ_fields© r   r   úG/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/numba/core/cpu.pyr      s   r   c                   @   s    e Zd ZdejfdejfgZdS )ÚEnvBodyÚglobalsZconstsNr   r   r   r   r   r       s   þr    c                       sÎ   e Zd ZdZdZd-‡ fdd„	Zdd„ Zedd	„ ƒZd
d„ Z	e
dd„ ƒZdd„ Zdd„ Ze
dd„ ƒZdd„ Zd.dd„Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd/d#d$„Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Z‡  ZS )0Ú
CPUContextz0
    Changes BaseContext calling convention
    TÚcpuc                    s   t ƒ  ||¡ d S ©N)ÚsuperÚ__init__)ÚselfZ	typingctxÚtarget©Ú	__class__r   r   r&   )   s    zCPUContext.__init__c                 C   s   | j  |¡S r$   )Ú_internal_codegenZ_create_empty_module)r'   Únamer   r   r   Úcreate_module-   s    zCPUContext.create_modulec                 C   s>   t jdk| _t d¡| _t ¡ dkr.t 	d¡ t
j | ¡ d S )Né    z
numba.execÚarmv7lzlibgcc_s.so.1)r   ZMACHINE_BITSÚis32bitr   ZJITCPUCodegenr+   ÚplatformÚmachineÚllZload_library_permanentlyr   Zc_math_functionsÚinstall©r'   r   r   r   Úinit0   s
    
zCPUContext.initc           &      C   sr  t  | ¡ ddlm}m}m}m}m}m}m	}m
}m}	m}
m}m}m} ddlm} ddlm}m} ddlm}m}m}m} ddlm}m} ddlm}m} ddlm }m!} dd	l"m#}m$} dd
lm%} ddlm&} ddlm'}m(} m)}!m*}" ddlm+}# ddl,m-}$ |  .|j/¡ |  .|#j/¡ |  .| j/¡ |  .|j/¡ |  .|!j/¡ |  .|"j/¡ |  .|$j0¡ t1j2j3 4¡  ddl5m6}% d S )Nr   )ÚbuiltinsÚcharseqÚenumimplÚhashingÚheapqÚ	iteratorsÚlistobjÚnumbersÚrangeobjÚsetobjÚslicingÚtupleobjÚunicode)Úoptional)Úgdb_hookÚliteral)ÚlinalgÚ
polynomialÚ	arraymathÚarrayobj)Úgenerator_coreÚgenerator_methods)Ú	typeddictÚdictimpl)Ú	typedlistÚ
listobject)ÚjitclassÚfunction_type)Ú
npdatetime)Únpyimpl)Ú	cmathimplÚmathimplÚ	printimplÚ
randomimpl)Úcffiimpl)ÚClassBuilder)Úndarray)7r   Z
initializeÚnumba.cpythonr7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   Ú
numba.corerD   Z
numba.miscrE   rF   Únumba.nprG   rH   rI   rJ   Znumba.np.randomrK   rL   Únumba.typedrM   rN   rO   rP   Znumba.experimentalrQ   rR   rS   rT   rU   rV   rW   rX   rY   Z numba.experimental.jitclass.baserZ   Zinstall_registryÚregistryZclass_impl_registryÚnumbaÚcoreÚentrypointsZinit_allZnumba.np.unsafer[   )&r'   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   Zjitclassimplr[   r   r   r   Úload_additional_registries<   s.    
<z%CPUContext.load_additional_registriesc                 C   s   | j jS r$   )r+   Útarget_datar5   r   r   r   re   h   s    zCPUContext.target_datac                 K   s   t j|f|Ž}| j|dd�S )NT)r+   Zaot_mode)r   ZAOTCPUCodegenZ	subtarget)r'   r,   Zaot_optionsZaot_codegenr   r   r   Úwith_aot_codegenl   s    ÿzCPUContext.with_aot_codegenc                 C   s   | j S r$   )r+   r5   r   r   r   r   q   s    zCPUContext.codegenc                 C   s
   t  | ¡S r$   )r
   ZCPUCallConvr5   r   r   r   Ú	call_convt   s    zCPUContext.call_convc                 C   s$   t  ||tjd ¡}t| ||dd�S )zŸ
        From the given *envptr* (a pointer to a _dynfunc.Environment object),
        get a EnvBody allowing structured access to environment fields.
        Zoffsetof_env_bodyT)ÚrefZcast_ref)r	   Úpointer_addr   Ú
_impl_infor    )r'   ÚbuilderZenvptrZbody_ptrr   r   r   Úget_env_bodyx   s      ÿzCPUContext.get_env_bodyFc                 C   sZ   |   |j|  | j¡¡}| |¡}|  |¡}|j||| jjd� |  ||¡}| 	| j
||¡S )N)Úreturn_pyobjectZ	debug_msg)Zdeclare_env_globalÚmoduleÚget_env_nameÚfndescÚloadÚget_python_apiZemit_environment_sentryÚenv_namerl   Úget_env_managerÚenvironment)r'   rk   rm   ZenvgvZenvargÚpyapiZenv_bodyr   r   r   rt   �   s    
ÿ

ýzCPUContext.get_env_managerc                 C   s   t j||tjd |d�S )z~
        From the given *genptr* (a pointer to a _dynfunc.Generator object),
        get a pointer to its state area.
        Zoffsetof_generator_state)Úreturn_type)r	   ri   r   rj   )r'   rk   Zgenptrrw   r   r   r   Úget_generator_stateŽ   s      þzCPUContext.get_generator_statec                 C   s   ddl m} | | |||¡S )zR
        Build a list from the Numba *list_type* and its initial *items*.
        r   )r=   )r\   r=   Ú
build_list)r'   rk   Z	list_typeÚitemsr=   r   r   r   ry   —   s    zCPUContext.build_listc                 C   s   ddl m} | | |||¡S )zP
        Build a set from the Numba *set_type* and its initial *items*.
        r   )r@   )r\   r@   Ú	build_set)r'   rk   Úset_typerz   r@   r   r   r   r{   ž   s    zCPUContext.build_setc                 C   s   ddl m} | | ||||¡S )Nr   )Ú
dictobject)r_   r}   Ú	build_map)r'   rk   Ú	dict_typeZ
item_typesrz   r}   r   r   r   r~   ¥   s    zCPUContext.build_mapc                 C   s4   | j rt || j ¡ | jr$t |¡ | tj¡ d S r$   )	Úfastmathr   Zrewrite_moduler0   r   Z
fix_divmodZadd_linking_libraryr   Úlibrary)r'   Úmodr�   r   r   r   Úpost_loweringª   s
    
zCPUContext.post_loweringc           
   	   C   sX   |   d¡}| j |j|j¡}t |||j¡}t| ||||||d�}	|	 	¡  | 
|¡ d S )NÚwrapper)Úcall_helperÚrelease_gil)r-   rg   Úget_function_typeÚrestypeÚargtypesr   ÚFunctionÚllvm_func_namer   ÚbuildÚadd_ir_module)
r'   r�   rp   r   r…   r†   Úwrapper_moduleÚfntyÚwrapper_calleerk   r   r   r   Úcreate_cpython_wrapperµ   s    
ÿ  þz!CPUContext.create_cpython_wrapperc              	      s*  ˆ   d¡}ˆ j |j|j¡}t |||j¡}‡ fdd„|jD ƒ}ˆ  |j¡}	t 	|	|¡}
t ||
|j
¡}t | d¡¡}ˆ jj|||j|j|jdd�\}}|j|jdd��b ˆ  |¡}| ¡ }ˆ j |||¡ ˆ  |jtˆ ƒ¡}| |¡}| |¡ | |¡ | |¡ W 5 Q R X | |¡ | |¡ d S )	NZcfunc_wrapperc                    s   g | ]}ˆ   |¡‘qS r   )Úget_value_type)Ú.0Útyr5   r   r   Ú
<listcomp>Ç   s     z3CPUContext.create_cfunc_wrapper.<locals>.<listcomp>Úentry)Znoinline)ÚattrsF)Zlikely)r-   rg   r‡   rˆ   r‰   r   rŠ   r‹   r’   ÚFunctionTypeZllvm_cfunc_wrapper_nameZ	IRBuilderZappend_basic_blockZcall_functionÚargsZif_thenZis_errorrr   Z
gil_ensureZraise_errorZinsert_const_stringrn   ÚreprZstring_from_stringZerr_write_unraisableZdecrefZgil_releaseÚretr�   )r'   r�   rp   r   r…   rŽ   r�   r�   Zll_argtypesZll_return_typeZwraptyZwrapfnrk   ÚstatusÚoutrv   Z	gil_stateZcstrZstrobjr   r5   r   Úcreate_cfunc_wrapperÁ   s>    
ÿÿ    þ





zCPUContext.create_cfunc_wrapperc                 C   sV   |  |j¡}d|jf }t | ¡ |j d¡d ||||f¡}|j |  	|¡|¡ |S )zö
        Returns
        -------
        (cfunc, fnptr)

        - cfunc
            callable function (Can be None)
        - fnptr
            callable function address
        - env
            an execution environment (from _dynfunc)
        zcompiled wrapper for %rÚ.éÿÿÿÿ)
Zget_pointer_to_functionZllvm_cpython_wrapper_nameÚqualnamer   Zmake_functionZlookup_moduleÚsplitr   Zset_envro   )r'   r�   rp   r   ZfnptrÚdocZcfuncr   r   r   Úget_executableá   s    ÿ
  üzCPUContext.get_executablec                 C   s    t  t j|d¡}|  |  |¡¡S )zI
        Calculate the size of an array struct on the CPU target
        ÚA)r   ZArrayZint32Zget_abi_sizeofr’   )r'   ÚndimZarytyr   r   r   Úcalc_array_sizeofþ   s    zCPUContext.calc_array_sizeofc                 C   s
   t  |¡S r$   )r   Úget_ufunc_info)r'   Z	ufunc_keyr   r   r   r¨     s    zCPUContext.get_ufunc_info)r#   )F)F)r   r   r   Ú__doc__Zallow_dynamic_globalsr&   r-   r   r6   rd   Úpropertyre   rf   r   rg   rl   rt   rx   ry   r{   r~   rƒ   r‘   rž   r¤   r§   r¨   Ú__classcell__r   r   r)   r   r"   #   s4   
,

	
	 ÿ
 r"   ZnopythonZforceobjZloopliftZ_nrtÚdebugÚboundscheckZnogilZno_rewritesZno_cpython_wrapperZno_cfunc_wrapperÚparallelr€   Úerror_modelÚinlineÚforceinlineÚtarget_backendZ_dbg_extend_lifetimesZ_dbg_optnonec                   @   s   e Zd Zdd„ ZdS )ÚCPUTargetOptionsc                 C   s´   |  d¡sd|_|  d¡s d|_|jddd� |  d¡s@tj|_|  d¡s`|jrXd|_ntj|_|  d¡sr|j|_	d|_
| d	¡ |jd
dd� | d¡ | d¡ |jr°d|_d S )NÚenable_pyobjectTÚenable_loopliftZnrt)ÚdefaultÚ	debuginfoÚdbg_extend_lifetimesr­   r€   r¯   Úpythonr²   r±   F)Úis_setr´   rµ   Zinherit_if_not_setr   ZDEBUGINFO_DEFAULTr·   r¸   ZEXTEND_VARIABLE_LIFETIMESr­   Zenable_pyobject_loopliftr±   Zoptnone)r'   ÚflagsÚoptionsr   r   r   Úfinalize%  s(    







zCPUTargetOptions.finalizeN)r   r   r   r½   r   r   r   r   r³   $  s   r³   )*r1   Zllvmlite.bindingZbindingr3   Zllvmliter   ra   r   Znumba.core.callwrapperr   Znumba.core.baser   r]   r   r   r   r	   r
   r   r   r   r   Znumba.core.optionsr   r   Znumba.core.runtimer   Znumba.core.compiler_lockr   Znumba.core.entrypointsZnumba.core.cpu_optionsr   r   r   r^   r   Z	Structurer   r    r"   Z_options_mixinr³   r   r   r   r   Ú<module>   sJ   , kí