U
    ºmœdr#  ã                   @   s4   d dl Z d dlmZmZmZmZ G dd„ deƒZdS )é    N)ÚcontextÚvaluesÚtypesÚ_utilsc                   @   s¼   e Zd Zdejfdd„Zdd„ Zdd„ Zdd	„ Zd+dd„Z	d,dd„Z
dd„ Zedd„ ƒZedd„ ƒZdd„ Zdd„ Zd-dd„Zd.dd„Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ ZdS )/ÚModuleÚ c                 C   sB   || _ || _d| _t ¡ | _d| _t ¡ | _	g | _
i | _i | _d S )Nr   zunknown-unknown-unknown)r   ÚnameÚdata_layoutr   Z	NameScopeÚscopeÚtripleÚcollectionsÚOrderedDictÚglobalsÚmetadataÚnamedmetadataÚ_metadatacache)Úselfr   r   © r   úK/home/sam/Atlas/atlas_env/lib/python3.8/site-packages/llvmlite/ir/module.pyÚ__init__   s    

zModule.__init__c                 C   sb   g }|D ]T}|d kr"t  ¡ d ƒ}n0t|tƒr:t | |¡}nt|ttfƒrR|  |¡}| 	|¡ q|S ©N)
r   ÚMetaDataTypeÚ
isinstanceÚstrr   ZMetaDataStringÚlistÚtupleÚadd_metadataÚappend)r   ÚoperandsÚ	fixed_opsÚopr   r   r   Ú_fix_metadata_operands   s    

zModule._fix_metadata_operandsc                 C   s<   g }|D ].\}}t |ttfƒr(|  |¡}| ||f¡ q|S r   )r   r   r   r   r   )r   r   r   r   r    r   r   r   Ú_fix_di_operands$   s    
zModule._fix_di_operandsc                 C   sp   t |ttfƒstd|f ƒ‚|  |¡}t|ƒ}|| jkrbt| jƒ}tj	| |t
|ƒd�}|| j|< n
| j| }|S )zü
        Add an unnamed metadata to the module with the given *operands*
        (a sequence of values) or return a previous equivalent metadata.
        A MDValue instance is returned, it can then be associated to
        e.g. an instruction.
        z3expected a list or tuple of metadata values, got %r©r   )r   r   r   Ú	TypeErrorr!   r   Úlenr   r   ZMDValuer   )r   r   ÚkeyÚnÚmdr   r   r   r   -   s    ÿ



zModule.add_metadataFc                 C   sf   t t|  | ¡ ¡ƒƒ}|||f}|| jkrXt| jƒ}tj| |||t	|ƒd�}|| j|< n
| j| }|S )ak  
        Add debug information metadata to the module with the given
        *operands* (a dict of values with string keys) or return
        a previous equivalent metadata.  *kind* is a string of the
        debug information kind (e.g. "DICompileUnit").

        A DIValue instance is returned, it can then be associated to e.g.
        an instruction.
        r#   )
r   Úsortedr"   Úitemsr   r%   r   r   ZDIValuer   )r   Úkindr   Zis_distinctr&   r'   Zdir   r   r   Úadd_debug_infoA   s    




zModule.add_debug_infoNc                 C   sr   || j kr| j | }nt | ¡ }| j |< |dk	rnt|tjƒsH|  |¡}t|jtjƒsdt	d|f ƒ‚| 
|¡ |S )a­  
        Add a named metadata node to the module, if it doesn't exist,
        or return the existing node.
        If *element* is given, it will append a new element to
        the named metadata node.  If *element* is a sequence of values
        (rather than a metadata value), a new unnamed node will first be
        created.

        Example::
            module.add_named_metadata("llvm.ident", ["llvmlite/1.0"])
        Nz'wrong type for metadata element: got %r)r   r   ZNamedMetaDatar   ÚValuer   Útyper   r   r$   Úadd)r   r   ÚelementZnmdr   r   r   Úadd_named_metadataU   s    

ÿ
zModule.add_named_metadatac                 C   s
   | j | S )zš
        Return the metadata node with the given *name*.  KeyError is raised
        if no such node exists (contrast with add_named_metadata()).
        )r   ©r   r   r   r   r   Úget_named_metadatan   s    zModule.get_named_metadatac                 C   s   dd„ | j  ¡ D ƒS )zI
        A list of functions declared or defined in this module.
        c                 S   s   g | ]}t |tjƒr|‘qS r   )r   r   ÚFunction©Ú.0Úvr   r   r   Ú
<listcomp>z   s    ÿz$Module.functions.<locals>.<listcomp>©r   r   ©r   r   r   r   Ú	functionsu   s    zModule.functionsc                 C   s
   | j  ¡ S )z>
        An iterable of global values in this module.
        r9   r:   r   r   r   Úglobal_values}   s    zModule.global_valuesc                 C   s
   | j | S )z-
        Get a global value by name.
        )r   r2   r   r   r   Ú
get_global„   s    zModule.get_globalc                 C   s    |j | jkst‚|| j|j < dS )z)
        Add a new global value.
        N)r   r   ÚAssertionError)r   Zglobalvaluer   r   r   Ú
add_globalŠ   s    zModule.add_globalc                 C   s   | j  |¡S )zJ
        Get a unique global name with the following *name* hint.
        )r
   Zdeduplicater2   r   r   r   Úget_unique_name‘   s    zModule.get_unique_namer   c                    s<  ‡ ‡fdd„}ˆ dkr$ˆd j g}ndd„ ˆD ƒ}d ˆ g| ¡}|| jkrV| j| S |d k	rb�nÊtˆƒdkr’ˆ dkr’t t ¡ t d	¡g¡}�nštˆƒd	k�r:ˆ d
krÈt ˆd ˆd t d¡g¡}npˆ dkræt ˆd ˆd ¡}nRˆ dk�r
t ˆd t d¡g¡}n.ˆ dk�r(t t d¡ˆ¡}nt ˆd ˆ¡}nòtˆƒdk�rºˆ dk�r„ˆd t d¡ˆd	 t d	¡g‰t t ¡ ˆ¡}n4ˆ dk�r²ˆd t d	¡g‰t ˆd ˆ¡}n|ƒ  nrtˆƒdk�r&ˆ dk�rôˆt d	¡g ‰t t ¡ ˆ¡}n0ˆ dk�rˆd gd ‰t ˆd ˆ¡}n|ƒ  n|ƒ  tj	| ||d�S )Nc                      s   t dˆ tˆƒf ƒ‚d S )Nz"unknown intrinsic %r with %d types)ÚNotImplementedErrorr%   r   ©Ú	intrinsicÚtysr   r   Ú_error˜   s    
ÿz(Module.declare_intrinsic.<locals>._error>   úllvm.fmaú	llvm.cttzú	llvm.ctlzr   c                 S   s   g | ]
}|j ‘qS r   )Úintrinsic_name)r6   Útr   r   r   r8   Ÿ   s     z,Module.declare_intrinsic.<locals>.<listcomp>Ú.zllvm.assumeé   z	llvm.powié    zllvm.powé   zllvm.convert.from.fp16é   zllvm.convert.to.fp16zllvm.memseté   >   rG   rH   é   )zllvm.memcpyzllvm.memmoverF   r#   )
rI   Újoinr   r%   r   ÚFunctionTypeZVoidTypeZIntTyper   r4   )r   rC   rD   ZfntyrE   Úsuffixesr   r   rB   r   Údeclare_intrinsic—   sR    

 


ÿ


zModule.declare_intrinsicc                 C   s   | j jS r   )r   Zidentified_typesr:   r   r   r   Úget_identified_typesÌ   s    zModule.get_identified_typesc                 C   s2   dd„ |   ¡  ¡ D ƒ}|dd„ | j ¡ D ƒ7 }|S )Nc                 S   s   g | ]}|  ¡ ‘qS r   )Zget_declaration)r6   Úitr   r   r   r8   Ñ   s   ÿz*Module._get_body_lines.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )r   r5   r   r   r   r8   Ô   s     )rV   r   r   ©r   Úlinesr   r   r   Ú_get_body_linesÏ   s
    
ÿzModule._get_body_linesc              	   C   s\   g }| j  ¡ D ].\}}| dj|d dd„ |jD ƒ¡d�¡ q| jD ]}| t|ƒ¡ qD|S )Nz!{name} = !{{ {operands} }}z, c                 s   s   | ]}|  ¡ V  qd S r   )Zget_reference)r6   Úir   r   r   Ú	<genexpr>Û   s   ÿz-Module._get_metadata_lines.<locals>.<genexpr>)r   r   )r   r*   r   ÚformatrR   r   r   r   )r   ZmdbufÚkr7   r(   r   r   r   Ú_get_metadata_lines×   s     
ÿÿ

zModule._get_metadata_linesc                 C   s   d  |  ¡ ¡S ©NÚ
)rR   rZ   r:   r   r   r   Ú_stringify_bodyá   s    zModule._stringify_bodyc                 C   s   d  |  ¡ ¡S r`   )rR   r_   r:   r   r   r   Ú_stringify_metadataå   s    zModule._stringify_metadatac                 C   sN   g }|d| j f d| jf d| jf dg7 }||  ¡ 7 }||  ¡ 7 }d |¡S )Nz; ModuleID = "%s"ztarget triple = "%s"ztarget datalayout = "%s"r   ra   )r   r   r	   rZ   r_   rR   rX   r   r   r   Ú__repr__é   s    


üzModule.__repr__)F)N)r   )r   N)Ú__name__Ú
__module__Ú__qualname__r   Zglobal_contextr   r!   r"   r   r,   r1   r3   Úpropertyr;   r<   r=   r?   r@   rU   rV   rZ   r_   rb   rc   rd   r   r   r   r   r      s*   	





5
r   )r   Zllvmlite.irr   r   r   r   Úobjectr   r   r   r   r   Ú<module>   s   