
    "f                         d Z ddlmZ ddlmZmZ ddlmZ ddlmZ  G d de	          Z
	 ded
d
dddd
ddedededee         dee         dedededee         defdZd
S )zBit fields data store type.    )EnumMeta)AnyOptional   )EnumX)FlagXc                   F   e Zd ZdZdedededee         dee         deded	ed
ee         fdZ	e
defd            Ze
dee         fd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            Ze
defd            ZdefdZdeddfdZd  Zd! Zd" Zd# ZdS )$BitFielda  Bit field definition.

    :param doc: one line description
    :param size: size in bits
    :param typ: bit field type, default uses type annotation
    :param lsb: bit offset of least significant bit
    :param default: initial value when unspecified
    :param signed: interpret as signed integer
    :param ignore: do not include field in comparisons
    :param readonly: block setting member attribute
    :param argrepr: format to represent member argument in structure repr

    docsizetyplsbdefaultsignedignorereadonlyargreprc
                    t                               |            |$t          |          }|dk     rt          d          t          |          }t	          |          }|r|dk     rt          d          d|dz
  z  }
n|dk     rt          d          d}
|
rd|dz
  z   }d|z    }n
d}d|z  dz
  }|3t          |          }||cxk    r|k    sn t          d| d|           || _        || _        || _        d|z  dz
  | _	        || _
        || _        d | _        || _        |
| _        || _        d | _        || _        |	| _        |                     |           d S )	Nr   z8bit field position must be greater than or equal to zeror   z0'size' must be 2 or greater for signed bit field   z2'size' must be 1 or greater for unsigned bit fieldzbit field requires z <= default <= )property__init__int	TypeErrorbool
ValueError_doc_default_ignore_mask	_minvalue	_maxvalue_name_lsb_signbit_size
_make_type	_readonly_argrepr_set_typ)selfr   r   r   r   r   r   r   r   r   signbitminvaluemaxvalues                [/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/plum/bitfields/bitfield.pyr   zBitField.__init__!   s    	$?c((CQwwN   4yyf 	axx !STTTD1HoGGaxx !UVVVG 	'tax)HXHHHT	QH'llGw2222(2222 M(MM8MM   	4i1_
!!$(
	
!c    returnc                     t          | j        t                    r| j        }nFt          | j        t          t
          f          r| j         d| j         d}n| j         d| j         d}|S )zAFormat string to represent bit field argument in bit fields repr.z={repr(self.z).split(':')[0].lstrip('<')}z={self.z!r})
isinstancer(   str_typr   r   name)r*   repr_formats     r.   r   zBitField.argrepr_   s}     dmS)) 		@-KK	He#455 	@9SS49SSS K
 "Y??	???Kr/   c                     | j         S )z,Initializer default value for this bitfield.)r   r*   s    r.   r   zBitField.defaulto        }r/   c                     | j         S )zOne line bit field description.)r   r8   s    r.   r   zBitField.doct   s     yr/   c                     | j         S )z4Ignore when compared against bitfields of same type.)r   r8   s    r.   r   zBitField.ignorey   s     |r/   c                 <    | j         t          d          | j         S )z$Bit offset of least significant bit.Ninternal error)r#   RuntimeErrorr8   s    r.   r   zBitField.lsb~   s#     9/000yr/   c                     | j         S )z>Bit zero aligned bit mask covering the width of the bit field.)r   r8   s    r.   maskzBitField.mask        zr/   c                     | j         S )z"Minimum allowable bit field value.)r    r8   s    r.   r,   zBitField.minvalue        ~r/   c                     | j         S )z"Maximum allowable bit field value.)r!   r8   s    r.   r-   zBitField.maxvalue   rC   r/   c                 <    | j         t          d          | j         S )zBit field name.Nr=   )r"   r>   r8   s    r.   r5   zBitField.name   s#     :/000zr/   c                     | j         S )z"Block setting bit field attribute.)r'   r8   s    r.   r   zBitField.readonly   rC   r/   c                     | j         S )zBMask when anded with bit field value reveals if value is negative.)r$   r8   s    r.   r+   zBitField.signbit   r9   r/   c                 *    t          | j                  S )z&Interpret bit field as signed integer.)r   r$   r8   s    r.   r   zBitField.signed   s     DM"""r/   c                     | j         S )zBit field size in bits.)r%   r8   s    r.   r   zBitField.size   rA   r/   c                 L    | j         }t          |t                    r|j        }|S )zType hint expression.)r4   r2   r   enum)r*   r   s     r.   	type_hintzBitField.type_hint   s)     ic5!! 	(C
r/   c                     | j         S )zPBit field type.

        :returns: bit field type
        :rtype: type

        )r4   r8   s    r.   r   zBitField.typ   s     yr/   c                 b   t          |t                    ot          |t                    }t          |t          t
          f          s|rn^t          |d          r?t          |d          s.| j        r
| j	        dnd}t          d| d|j         d          nt          d          || _        d S )Nnested  zbit field typ z(must be declared as nested (e.g. 'class z(BitFields, nested=True):')zbit field type must be int-like)r2   type
issubclassr   r   r   hasattrgetattrr"   r5   r   __name__r4   )r*   r   is_int_subclassr5   s       r.   r)   zBitField._set_typ   s    $S$//HJsC4H4HcE5>** 	?o 	?S(## 		?3)) ,0J>$)((((BHT H H!lH H H   =>>>			r/   r5   Nc                 r    | j         	|| _         dS t          d|dt          |           j         d          )zMComplete instance initialization.

        :param name: member name

        Nzinvalid bit field z definition, z8() instance can not be shared between bit fields classes)r"   r   rR   rV   )r*   r5   s     r.   finish_initializationzBitField.finish_initialization   sU     :DJJJ.T . .::&. . .  r/   c                     d| j         dS )NzBitField(name=))r"   r8   s    r.   __repr__zBitField.__repr__   s    /
////r/   c                 T    t                               | || j        | j                   | S )N)r   r   fsetfdel)r*   fgets     r.   getterzBitField.getter   s%    $di;;;r/   c                     | j         rt          d          t                              | | j        || j                   | S )Nz6'setter' not allowed on read-only bit field properties)r   r   r   r   r`   r_   )r*   r^   s     r.   setterzBitField.setter   s?    = 	VTUUU$	4;;;r/   c                      t          d          )Nz-bit field properties do not support 'deleter')r   )r*   r_   s     r.   deleterzBitField.deleter   s    GHHHr/   ) rV   
__module____qualname____doc__r3   r   rR   r   r   r   r   r   r   r   r   r   r@   r,   r-   r5   r   r+   r   r   rL   r   r)   rY   r\   ra   rc   re    r/   r.   r
   r
      sb         << < 	<
 c]< #< < < < #< < < <|     X #    X S    X     X S    X c    X #    X #    X c    X $    X     X # # # # X# c    X 4    X T    XD    &# $    0 0 0    I I I I Ir/   r
   rQ   NF)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0   c                0    t          | ||||||||	  	        S )a  Define bit field.

    :param doc: one line description
    :param size: size in bits
    :param typ: bit field type
    :param lsb: bit offset of least significant bit
    :param default: initial value when unspecified
    :param signed: interpret as signed integer
    :param ignore: do not include field in comparisons
    :param readonly: block setting member attribute
    :param argrepr: format to represent member argument in structure repr

    )r
   )	r   r   r   r   r   r   r   r   r   s	            r.   bitfieldrk      s"    2 CsC&&(GTTTr/   )rQ   )rh   rK   r   typingr   r   r   flagr   r   r
   r   r3   rR   r   rk   ri   r/   r.   <module>rn      sb   " !                                  eI eI eI eI eIx eI eI eIR U !!U U U	U U 
	U
 
#U c]U U U U c]U 	U U U U U Ur/   