o
    qiJ                     @   sf   d dl Z d dlmZmZ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 G dd dZdS )    N)Typeint8_tint16_tint32_tint64_tuint8_tuint16_tuint32_tuint64_tfloat_double_)parse_assigned_variable_name)Namec                
   @   s  e Zd Zg dZeeeeee	e
eeeg
Zdd Zdd Zdd Zdd	 Zd
d Zedd Zedd Zdd Zedd Zedd Zedd Zedd Zedd ZedGddZedHdd ZedId!d"Z e			dJd#d$Z!edGd%d&Z"edHd'd(Z#edId)d*Z$e			dJd+d,Z%e					dKd-d.Z&e			dJd/d0Z'e					dKd1d2Z(edGd3d4Z)edHd5d6Z*edId7d8Z+edGd9d:Z,edHd;d<Z-edId=d>Z.e			dJd?d@Z/edAdB Z0edCdD Z1edEdF Z2dS )LConstant)                   @   c              	   C   s   t |tjs
J d|tjv s"J dt|dttttjf t |tjs,J d|| dks6J dt |t	s?J d|tj
v sNJ ddtj
 t |tsUJ || _|| _|| _|| _|f| _d | _d | _d S )	Nz Constant size must be an integerz4Unsupported size %s: the only supported sizes are %s, z0The number of contant repeats must be an integerr   zJThe number of constant repeats must divide constant size without remainderz2Element type must be an instance of peachpy.c.TypezThe only supported types are %s)
isinstancesixZinteger_typesr   _supported_sizesstrjoinmapsortedr   _supported_typesr   sizerepeatselement_ctypedatanameZlabelprefix)selfr    r!   r#   r"   r$    r'   L/home/app/PyTorch/test/pytorch/third_party/python-peachpy/peachpy/literal.py__init__   s$   

zConstant.__init__c                    s6   d| j | j d   dd fdd| jD  d S )Nz%%0%dXr   <r   c                 3   s    | ]} | V  qd S Nr'   .0r#   format_specr'   r(   	<genexpr>'       z#Constant.__str__.<locals>.<genexpr>>)r    r!   r   r#   r&   r'   r.   r(   __str__%   s   "zConstant.__str__c                 C   s   t | jt | jA t | jA S r+   )hashr#   r    r!   r3   r'   r'   r(   __hash__)   s   zConstant.__hash__c                 C   s"   t |to| j|jko| j|jkS r+   )r   r   r#   r"   )r&   otherr'   r'   r(   __eq__,   s   "zConstant.__eq__c                    sX   ddl m} t||sJ |j|j|j|jd| j| j   t	 
 fdd| jD S )Nr   )Encoder)r   r   r   r   c                    s   g | ]} |qS r'   r'   r,   Zencode_functionr'   r(   
<listcomp>8   s    z#Constant.encode.<locals>.<listcomp>)peachpy.encoderr9   r   Zuint8Zuint16uint32uint64r    r!   	bytearrayr   r#   )r&   encoderr9   r'   r:   r(   encode/   s   
zConstant.encodec                 C   s   | j dkrdS | j S )N
   r   )r    r3   r'   r'   r(   	alignment:   s   
zConstant.alignmentc                 C   s4   ddl m}m} | ||j}ddd |D S )Nr   )r9   
Endianness c                 s   s    | ]}d | V  qdS )z%02XNr'   )r-   Zbyter'   r'   r(   r0   E   r1   z"Constant.as_hex.<locals>.<genexpr>)r<   r9   rD   rA   ZLittler   )r&   r9   rD   Z
bytestringr'   r'   r(   as_hexA   s   zConstant.as_hexc                 C   s   |dkrd| j  d S t| S )NZgoZconst0xz(SB))rF   r   )r&   Zassembly_formatr'   r'   r(   formatG   s   zConstant.formatc                 G      ddl m}m} ||sJ dd |D }t|dkrtdt|dkr1t||kr1td| t|D ]&\}}||sEtdt| ||sOtd	| |dk r[||  d
7  < q5t|dkri|d g| }td| |t	|t
| S )Nr   )is_intis_int64c                 S      g | ]}|d ur|qS r+   r'   r-   argr'   r'   r(   r;   Q       z&Constant._uint64xN.<locals>.<listcomp>-At least one constant value must be specifiedr   'Either 1 or %d values must be specifiedThe value %s is not an integerz%The number %d is not a 64-bit integerl            r   )peachpy.utilrI   rJ   len
ValueError	enumerate	TypeErrorr   r   tupler
   )r$   nargsrI   rJ   inumberr'   r'   r(   	_uint64xNM   $   zConstant._uint64xNc                 G   rH   )Nr   rI   is_int32c                 S   rK   r+   r'   rL   r'   r'   r(   r;   e   rN   z&Constant._uint32xN.<locals>.<listcomp>rO   r   rP   rQ   z%The number %d is not a 32-bit integer        r   rR   rI   r_   rS   rT   rU   rV   r   r   rW   r	   r$   rX   rY   rI   r_   rZ   r[   r'   r'   r(   	_uint32xNa   r]   zConstant._uint32xNc                 G   rH   )Nr   r^   c                 S   rK   r+   r'   rL   r'   r'   r(   r;   y   rN   z&Constant._uint16xN.<locals>.<listcomp>rO   r   rP   rQ   z%The number %d is not a 16-bit integerr`   r   ra   rb   r'   r'   r(   	_uint16xNu   r]   zConstant._uint16xNc                 G      dd |D }t |dkrtdt |dkr#t ||kr#td| dd |D }t |dkr7|d g| }td| |t|t| S )	Nc                 S   rK   r+   r'   rL   r'   r'   r(   r;      rN   z'Constant._float64xN.<locals>.<listcomp>r   rO   r   rP   c                 S      g | ]}t |qS r'   )r   _parse_float64rL   r'   r'   r(   r;          r   rS   rT   r   rW   r   r$   rX   rY   r'   r'   r(   
_float64xN      zConstant._float64xNc                 G   re   )	Nc                 S   rK   r+   r'   rL   r'   r'   r(   r;      rN   z'Constant._float32xN.<locals>.<listcomp>r   rO   r   rP   c                 S   rf   r'   )r   _parse_float32rL   r'   r'   r(   r;      rh   r   ri   rj   r'   r'   r(   
_float32xN   rl   zConstant._float32xNNc                 C   H   |d urt | t |d}ndd l}t t| dd}t|d| S )Nr$   r   Constant.uint64Zprenamer   r   
check_nameinspectr   stackr   r\   r[   r$   ru   r'   r'   r(   r>         
rq   c                 C   J   |d urt | t |d}ndd l}t t| dd}t|d| |S )Nrp   r   Constant.uint64x2rr   r   rs   number1number2r$   ru   r'   r'   r(   uint64x2      
rz   c                 C   N   |d urt | t |d}ndd l}t t| dd}t|d| |||S )Nrp   r   Constant.uint64x4rr   r   rs   r|   r}   number3number4r$   ru   r'   r'   r(   uint64x4      
r   c	           
      C   V   |d urt | t |d}ndd l}	t t|	 dd}t|d| |||||||
S )Nrp   r   Constant.uint64x8rr   r   rs   
r|   r}   r   r   number5number6number7number8r$   ru   r'   r'   r(   uint64x8      
r   c                 C   ro   )Nrp   r   Constant.uint32rr   r   r   rt   ru   r   rv   r   rc   rw   r'   r'   r(   r=      rx   r   c                 C   ry   )Nrp   r   Constant.uint32x2rr   r   r   r{   r'   r'   r(   uint32x2   r   r   c                 C   r   )Nrp   r   Constant.uint32x4rr   r   r   r   r'   r'   r(   uint32x4   r   r   c	           
      C   r   )Nrp   r   Constant.uint32x8rr   r   r   r   r'   r'   r(   uint32x8   r   r   c                 C   f   |d urt | t |d}ndd l}t t| dd}t|d| |||||||||	|
|||||S )Nrp   r   Constant.uint32x16rr   r   r   r|   r}   r   r   r   r   r   r   Znumber9Znumber10Znumber11Znumber12Znumber13Znumber14Znumber15Znumber16r$   ru   r'   r'   r(   	uint32x16      
r   c	           
      C   r   )Nrp   r   Constant.uint16x8rr   r   r   rt   ru   r   rv   r   rd   r   r'   r'   r(   uint16x8  r   r   c                 C   r   )Nrp   r   Constant.uint16x16rr   r   r   r   r'   r'   r(   	uint16x16  r   r   c                 C   ro   )Nrp   r   Constant.float64rr   r   r   rt   ru   r   rv   r   rk   rw   r'   r'   r(   float64/  rx   r   c                 C   ry   )Nrp   r   Constant.float64x2rr   r   r   r{   r'   r'   r(   	float64x2:  r   r   c                 C   r   )Nrp   r   Constant.float64x4rr   r   r   r   r'   r'   r(   	float64x4E  r   r   c                 C   ro   )Nrp   r   Constant.float32rr   r   r   rt   ru   r   rv   r   rn   rw   r'   r'   r(   float32P  rx   r   c                 C   ry   )Nrp   r   Constant.float32x2rr   r   r   r{   r'   r'   r(   	float32x2[  r   r   c                 C   r   )Nrp   r   Constant.float32x4rr   r   r   r   r'   r'   r(   	float32x4f  r   r   c	           
      C   r   )Nrp   r   Constant.float32x8rr   r   r   r   r'   r'   r(   	float32x8q  r   r   c                 C   s   dd l }| d| g}|d S )Nr   f)array)r[   r   Zfloat_arrayr'   r'   r(   _convert_to_float32  s   zConstant._convert_to_float32c                 C   s  t | trtt| } n(t | tr.zttt| } W n ty-   td|  w tdt|  | dks>| dkr@dS | dkrFdS | dkrLd	S | 	d
}| 
d}| d}| t|| }|dksm|dksmJ | |d | }|dkrt|dkrt|d> S | |d d  }t|d }|dkrt|d}n|dk rt|dd| > }n	t|d|d ? }t|}|dkr|d |d  ? }d}|t|d d>  t|d>  S )N8The string %s is not a hexadecimal floating-point number&Unsupported type of constant number %sinf+infi  -infl       nani  -.p0x00x1r   r      r      r   ii   ~      )r   floathexr   r   r   fromhexrT   rV   
startswithindexrindexintrS   r[   Zis_negativeZpoint_positionZexp_positionZnumber_prefixZmantissaZexponentZmantissa_bitsr'   r'   r(   rm     sF   




 zConstant._parse_float32c                 C   s  t | trt| } n%t | tr(z
tt| } W n ty'   td|  w tdt|  | dks8| dkr:dS | dkr@dS | dkrFd	S | d
}| d}| 	d}| t
|| }|dksg|dksgJ | |d | }|dkrt
|dks{J t
|d> S | |d d  }t|d }|dkrt
|d}n|dk rt
|dd| > }n	t
|d|d ? }t
|}|dkr|d |d  ? }d}n|dkrd}d}|t
|d d>  t
|d>  S )Nr   r   r   r   l          r   l          r   l          r   r   r   r   r   r   r   ?   r   4   r   il          i  i  )r   r   r   r   r   rT   rV   r   r   r   r   rS   r   r'   r'   r(   rg     sN   




 zConstant._parse_float64r+   )NN)NNNN)NNNNNNNN)NNNNNNNNNNNNNNNN)3__name__
__module____qualname__r   r   r   r	   r
   r   r   r   r   r   r   r   r)   r4   r6   r8   rA   propertyrC   rF   rG   staticmethodr\   rc   rd   rk   rn   r>   r~   r   r   r=   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rm   rg   r'   r'   r'   r(   r   
   s    




















*r   )r   peachpy.c.typesr   r   r   r   r   r   r   r	   r
   r   r   Zpeachpy.parser   Zpeachpy.namer   r   r'   r'   r'   r(   <module>   s
    4