+
    5‹œiI$  ã                   ó<   € R t ^ RIt ! R R]4      t ! R R4      tR# )aX  
riscv_extension_analyzer

This module provides functionality for analyzing and parsing RISC-V extension
strings.

Key Features:
- Validate RISC-V extension strings to ensure they conform to the expected
  format.
- Parse extension strings to extract base ISA information and supported
  extensions.

Author: Heinrich Schuchardt
Version: 0.0.1
Nc                   ó6   a a€ ] tR t^t oRtV 3R ltRtVtV ;t# )ÚRiscvProfileExceptiona  
Exception raised for errors related to RISC-V extensions.

This exception is a subclass of RuntimeError and is used to indicate
issues specifically related to the RISC-V instruction set architecture
extensions.

Attributes:
    message (str): A description of the error.
c                ó&   <€ \         SV `  V4       R # )N)ÚsuperÚ__init__)ÚselfÚmessageÚ	__class__s   &&€Ú:/usr/lib/python3/dist-packages/DistUpgrade/RiscvProfile.pyr   ÚRiscvProfileException.__init__!   s   ø€ Ü‰Ñ˜Ö!ó    © )	Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__Ú__classdictcell__Ú__classcell__)r	   Ú__classdict__s   @@r
   r   r      s   ù‡ € ñ	÷"õ "r   r   c                   ód   a € ] tR t^%t o RtR tR tR tR tR t	R t
]R 4       tR	 tR
 tRtV tR# )ÚRiscvProfilez`
RiscvProfile

This class provides functionality to analyze and parse RISC-V extension
strings.
c                óH  € . RNRNRNRNRNRNRNRNR	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NR#NR$NR%NR&NR'NR(NR)NR*NR+NR,NR-NR.NR/NR0NR1NR2NR3NR4NR5NR6NR7NR8NR9NR:NR;NR<NR=NR>NR?NR@NRANRBNRCNRDNRENRFNRGNpV P                  V4       V# )Hz—
Gets the extensions published by the Linux kernel

Returns: List of extensions

Raises:
    RiscvExtException: If the provided ISA string is invalid.
ÚiÚmÚaÚfÚdÚqÚcÚvÚzicbomÚzicbozÚziccrseÚzicntrÚzicondÚzicsrÚzifenceiÚ	zihintntlÚzihintpauseÚzihpmÚzimopÚzabhaÚzacasÚzawrsÚzfaÚzfhÚzfhminÚzcaÚzcbÚzcdÚzcfÚzcmopÚzbaÚzbbÚzbcÚzbkbÚzbkcÚzbkxÚzbsÚzkÚzknÚzkndÚzkneÚzknhÚzkrÚzksÚzktÚzksedÚzkshÚztsoÚzvbbÚzvbcÚzve32fÚzve32xÚzve64dÚzve64fÚzve64xÚzvfhÚzvfhminÚzvkbÚzvkgÚzvknÚzvkncÚzvknedÚzvkngÚzvknhaÚzvknhbÚzvksÚzvkscÚzvksedÚzvkshÚzvksgÚzvkt©Úadd_implied_extensions)r   Ú
linux_6_14s   & r
   Úlinux_supportedÚRiscvProfile.linux_supported-   sÚ  € ð
Øð
Øð
Øð
Øð
Ø #ð
Ø%(ð
Ø*-ð
Ø/2ð
Ø4<ð
Ø>Fð
àð
àð
à!)ð
à+2ð
à4>ð
ð ð
ð 'ð
ð )0ð
ð 29ð
ð ;Bð
ð DKð
ð ð	
ð ð	
ð "ð	
ð $,ð	
ð .3ð	
ð 5:ð	
ð <Að	
ð CHð	
ð
 ð
ð
 ð
ð
 "ð
ð
 $)ð
ð
 +1ð
ð
 39ð
ð
 ;Að
ð
 CHð
ð ð
ð ð
ð  ð
ð "(ð
ð *0ð
ð 27ð
ð 9>ð
ð @Eð
ð ð
ð ð
ð $ð
ð &,ð
ð .4ð
ð 6>ð
ð @Hð
ð ð
ð ð
ð !)ð
ð +1ð
ð 3<ð
ð >Dð
ð FLð
ð ð
ð ð
ð &ð
ð (/ð
ð 19ð
ð ;Cð
ð EKð
ð ð
ð ð
ð  'ð
ð )0ð
ð 28ð
ˆ
ð 	×#Ñ# JÔ/àÐr   c                ó´   € . RNRNRNRNRNRNRNRNR	NR
NRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNRNR NR!NR"NpV P                  V4       V# )#zœ
Gets the mandatory extensions for the RVA23U64 profile

Returns: List of extensions

Raises:
    RiscvExtException: If the provided ISA string is invalid.
r   r   r   r   r   r    Úbr!   Úzic64br"   Úzicbopr#   ÚziccamoaÚziccifÚzicclsmr$   r%   r&   r'   r)   r*   r+   r,   Úza64rsr/   r0   r2   r4   r7   rJ   rR   r`   rF   Úsupmra   )r   Úrva23s   & r
   Úrva23_requiredÚRiscvProfile.rva23_requiredG   sW  € ð
Øð
Øð
Øð
Øð
Ø #ð
Ø%(ð
Ø*-ð
Ø/2ð
Ø4<ð
Ø>Fð
àð
àð
à *ð
à,4ð
à6?ð
àAJð
ð ð
ð ð
ð !(ð
ð *5ð
ð 7Dð
ð FMð
ð ð	
ð ð	
ð  'ð	
ð ).ð	
ð 08ð	
ð :?ð	
ð AHð	
ð
 ð
ð
 ð
ð
  &ð
ð
 (-ð
ð
 /5ð
ˆð 	×#Ñ# EÔ*àˆr   c                ó€   € V P                  4       pV P                  4       pV Uu. uF  q3V9   g   K  VNK  	  up# u upi )z¦
Gets the required RVA23 extensions published by the Linux kernel

Returns: List of extensions

Raises:
    RiscvExtException: If the provided ISA string is invalid.
)rd   rp   )r   ÚlinuxÚcheckÚexts   &   r
   Úrva23_to_checkÚRiscvProfile.rva23_to_check\   s>   € ð ×$Ñ$Ó&ˆØ×#Ñ#Ó%ˆá$Ó5™u˜¨u©—�™uÑ5Ð5ùÒ5s   ¥;²;c                óÀ   € R^€R^@R^ /pRpVP                  4        F.  w  rEVP                  V4      '       g   K  TpV\        V4      R p M	  Vf   \        R4      hVX3# )ad  
Checks the base instruction set architecture (ISA) provided by a
RISC-V extension string.

Args:
    isa_string (str): The RISC-V extension string to analyze.

Returns:
    bitness (int): Bitness of base ISA.
    remainder (str): Remaining ISA string.

Raises:
    RiscvProfileException:
    If the string does not start with a valid base ISA identifier.
Úrv128Úrv64Úrv32NzInvalid base ISA)ÚitemsÚ
startswithÚlenr   )r   Ú
isa_stringÚ	base_isasÚbitnessÚkeyÚvalueÚ	remainders   &&     r
   Úcheck_base_isaÚRiscvProfile.check_base_isak   s{   € ð$ �SØ�BØ�Bðˆ	ð
 ˆØ#Ÿ/™/Ö+‰JˆCØ×$Ñ$ S×)Ô)Ø�Ø&¤s¨3£x yÐ1�	Ùñ	 ,ð Š?Ü'Ð(:Ó;Ð;à˜	Ð!Ð!r   c                óê  € RR.RR.RR.RR.RR.R	R.R
R./pR. ROR. ROR. ROR. ROR. R OR. R!ORRR.RRR.R. R"ORRR.RRR./pRpV'       dR   RpV FG  pWS9   g   K  W5,           F  pWa9  g   K  VP                  V4       K  	  VP                  V4       Rp KU  	  KY  RpV'       dI   RpV F>  pWR9   d+   W%,           F  pWa9  g   K  VP                  V4       RpK   	  V'       g   K=   KL  	  KP  R# )#zG
Adds implied extensions

Args:
    extensions: iterable of extensions
r   Úzmmulr   Úzaamor   r'   r   r   r!   r1   r2   rg   Úgr?   r@   rE   rU   rV   rK   rX   rT   r[   r\   r_   TFN)r8   r9   r>   )r   r   r   r   r   r'   r(   )r@   rD   rF   )r;   r<   r=   rB   rA   rC   )r;   r<   r=   rG   rH   )rW   rZ   rS   r`   )r]   r^   rS   r`   )ÚappendÚremove)r   Ú
extensionsÚimpliesÚ	shorthandÚupdateÚ	extensionÚimplieds   &&     r
   rb   Ú#RiscvProfile.add_implied_extensions�   sI  € ð �'�Ø�'�Ø�'�Ø�#�Ø�#�Ø�#�Ø�H�:ð
ˆð Ò&ØÒ?ØÒ'ØÒCØÒ<ØÒ8Ø�f˜fÐ%Ø�f˜fÐ%ØÒ7Ø�f˜fÐ%Ø�f˜fÐ%ð
ˆ	ð ˆßØˆFÛ'�	ØÖ)Ø#,×#7Ð#7˜Ø"Ö4Ø&×-Ñ-¨gÖ6ñ $8ð ×%Ñ% iÔ0Ø!�FÚó (ð ˆßØˆFÛ'�	ØÔ'Ø#*×#5Ð#5˜Ø"Ö4Ø&×-Ñ-¨gÔ6Ø%)šFñ $6÷ ‘6Úó (ñ r   c                óÖ  € Rp. p\        V4      ^ 8”  EdC   VP                  R4      '       d   VR,          pV'       g   \        R4      hMV'       d   \        R4      hV^ ,          R9   d   RpV'       d   \        P                  ! RV4      pM\        P                  ! R	V4      pV'       g   \        R
4      hVP                  4       pWP                  4       R pVR9  dR   \        P                  ! RV4      pV'       g   \        P                  ! RV4      pV'       d   VRVP                  4        pV'       g   \        R4      hVP                  V4       EKS  V P                  V4       V# )zŸ
Parse RISC-V ISA string

args:
    isa_string: ISA string without base ISA (e.g. rv64)

Raises:
    RiscvExtException: If the provided ISA string is invalid.
FÚ_:é   NNzMissing extensionzExpecting underscoreÚsxzTz^[^_]+z^\D\d+p\d+|\D\d+|\DzExpecting extensionNz\d+p\d+$z\d+$zZero length extension>   Úsv32Úsv39Úsv48Úsv59)r~   r}   r   ÚreÚmatchÚgroupÚendÚsearchÚstartr‹   rb   )r   r   Úmulti_characterr�   r�   r‘   s   &&    r
   Úparse_isa_stringÚRiscvProfile.parse_isa_stringÇ   s(  € ð  ˆàˆ
ä�*‹o Õ!Ø×$Ñ$ S×)Ò)Ø'¨�^�
ß!Ü/Ð0CÓDÐDð "ç Ü+Ð,BÓCÐCØ˜!�} Ô%Ø"&�ßÜŸš ¨JÓ7‘äŸšÐ!7¸ÓD�ßÜ+Ð,AÓBÐBØŸ™›ˆIØ#§I¡I£K LÐ1ˆJàÐ @Ô@äŸ	š	 +¨yÓ9�ßÜŸIšI g¨yÓ9�Eßà )¨.¨5¯;©;«=Ð 9�IßÜ+Ð,CÓDÐDà×Ñ˜i×(à×#Ñ# JÔ/àÐr   c                 ó¤  €  \        RR4      ;_uu_ 4       p V P                  4       pRRR4       XP	                  RRR7      P                  4       pT F?  p\        P                  ! RT4      pT'       g   K$  \        YEP                  4       R 4      u # 	  \        R	4      h  + '       g   i     L�; i  \         d   p\        R4      ThRp?ii ; i)
z²
Gets the extensions listed in /proc/cpuinfo as common for all harts

Returns: List of extensions

Raises:
    RiscvExtException: If the ISA string is invalid or cannot be found
z/proc/cpuinfoÚrbNzCan't read /proc/cpuinfozutf-8Úignore)Úerrorsz
isa\s*:\s*zNo ISA information)
ÚopenÚreadÚOSErrorr   ÚdecodeÚ
splitlinesrœ   r�   r   rŸ   )ÚfileÚbinary_contentÚexÚlinesÚliner�   s         r
   Úread_cpuinfoÚRiscvProfile.read_cpuinfoø   s²   € ð	MÜ�o t×,Ô,°Ø!%§¡£�÷ -ð
 ×%Ñ% g°hÐ%Ó?×JÑJÓLˆÛˆDÜ—H’H˜]¨DÓ1ˆEß‰uÜ# D¯©«¨Ð$6Ó7Ò7ñ ô
 $Ð$8Ó9Ð9÷ -×,ûäô 	MÜ'Ð(CÓDÈ"ÐLûð	Mús3   ‚B3 –B §B3 Â B0	Â+B3 Â0B3 Â3CÂ>C
Ã
Cc                ót   € V P                  4       pV F!  pW P                  9  g   K  \        RV 24      h	  R# )ze
Check if the system is RVA23 ready

Raises:
    RiscvExtException: If the system is not RVA23 ready
zMissing extension N)rv   r�   r   )r   Úexpectedru   s   &  r
   Úassert_rva23_readyÚRiscvProfile.assert_rva23_ready  s9   € ð ×&Ñ&Ó(ˆÛˆCØŸ/™/Ö)Ü+Ð.@ÀÀÐ,FÓGÐGó r   c                ó„   € VP                  4       pV P                  V4      w  V n        pV P                  V4      V n        R# )zÉ
Initializes a RiscvProfile object with a given RISC-V ISA
string.

Args:
    isa_string (str): The RISC-V ISA string to analyze.

Raises:
    RiscvExtException: If the provided ISA string is invalid.
N)Úlowerr…   r�   r£   r�   )r   r   r„   s   && r
   r   ÚRiscvProfile.__init__  s;   € ð  ×%Ñ%Ó'ˆ
Ø"&×"5Ñ"5°jÓ"AÑˆŒ�iØ×/Ñ/°	Ó:ˆŽr   )r�   r�   N)r   r   r   r   r   rd   rp   rv   r…   rb   r£   Ústaticmethodr³   r·   r   r   r   )r   s   @r
   r   r   %   sO   ø‡ € ñòò4ò*6ò "òD8òt/ðb ñ:ó ð:ò0H÷;ð ;r   r   )r   rœ   ÚRuntimeErrorr   r   r   r   r
   Ú<module>r¾      s'   ðñó  
ô"˜Lô "÷ G;ó G;r   