
    h?                        S r SSKrSSKrSSKrSSKrSSKrSSKrSSKrSSKJ	r	J
r
JrJrJrJr  SSKJr  SSKJrJrJr  SSKJrJr  \R0                  " \5      r0 rS	rS
rSrSrSr S\!4S jr"     S5S\!S\!S\\\!      S\#S\!S\4S jjr$\"" SS9S\4S j5       r% " S S5      r&\"" SS9S 5       r'S r(\\S.r)S  r*\"" S!S9S\4S" j5       r+S# r,S$\	\!\!4   S\!4S% jr-S$\	\!\!4   S&\!S\\!   4S' jr.S\4S( jr/S)\S\
\   4S* jr0S+ r1S,\\!\\!S-4   4   4S. jr2\2" \\4S/9S0 5       r3\2" \S/9S1 5       r4\2" \S/9S2 5       r5\2" \ S/9S3 5       r6S\\!   4S4 jr7g)6z#Detection of CPU microarchitectures    N)DictListOptionalSetTupleUnion   )CPUID   )TARGETSMicroarchitecturegeneric_microarchitecture)
CPUID_JSONTARGETS_JSONx86_64aarch64ppc64leppc64riscv64operating_systemc                    ^  U 4S jnU$ )zDecorator to mark functions that are meant to return partial information on the current cpu.

Args:
    operating_system: operating system where this function can be used.
c                 8   > [         T   R                  U 5        U $ N)INFO_FACTORYappend)factoryr   s    3lib/python3.13/site-packages/archspec/cpu/detect.py	decoratordetection.<locals>.decorator*   s    %&--g6     )r   r   s   ` r   	detectionr"   #   s     r    namevendorfeatures
generationcpu_partreturnc           
      B    [        U / UU=(       d
    [        5       0 UUS9$ )zTConstruct a partial microarchitecture, from information gathered during system scan.)r#   parentsr$   r%   	compilersr&   r'   )r   set)r#   r$   r%   r&   r'   s        r   partial_uarchr-   1   s-     "SU r    Linux)r   c                  4   0 n [        S5       nU HF  nUR                  S5      u  p4nUS:w  a	  U (       a    O$UR                  5       XR                  5       '   MH     SSS5        [        5       nU[        :X  a"  [        U R                  SS5      [        U SS9S9$ U[        :X  a,  [        [        U 5      [        U S	S9U R                  S
S5      S9$ U[        [        4;   aK  [        R                  " SU R                  SS5      5      n [        UR                  S5      5      n[        US9$ U["        :X  a7  U R                  S5      S:X  a  SU S'   [        U R                  S["        5      S9$ [%        U5      $ ! , (       d  f       GN"= f! [          a    Sn Nuf = f)zMReturns a partial Microarchitecture, obtained from scanning ``/proc/cpuinfo``z/proc/cpuinfo:N	vendor_idgenericflagskeyr$   r%   FeatureszCPU part )r$   r%   r'   z
POWER(\d+)cpur   r   )r&   uarchzsifive,u74-mcu74mc)r#   )open	partitionstrip_machineX86_64r-   get_feature_setAARCH64_canonicalize_aarch64_vendorPPC64LEPPC64researchintgroupAttributeErrorRISCV64r   )	datafileliner5   	separatorvaluearchitecturegeneration_matchr&   s	            r   proc_cpuinforT   D   s}    D	o	$D$(NN3$7!CE CD %D  
  :Lv88K3l4U\>]
 	
 w/5!$J7XXj"-
 	
 ''99]DHHUB4GH	-33A67J 
33w88G/#DM$((7G"<==$\22[ 
	B  	 J		s   AE6F 6
FFFc                   N    \ rS rSrSrS rS rS\S\S\4S jr	S\
\   4S	 jrS
rg)CpuidInfoCollectorx   z;Collects the information we need on the host CPU from cpuidc                    [        5       U l        U R                  R                  " S0 [        S   S   D6nUR                  U l        [        R                  " SUR                  UR                  UR                  5      R                  S5      U l        U R                  R                  " S0 [        S   S   D6nUR                  U l        U R                  5       U l        g )Nr$   inputIIIutf-8highest_extension_supportr!   )r
   cpuidregisters_forr   eaxhighest_basic_supportstructpackebxedxecxdecoder$   r\   	_featuresr%   )self	registerss     r   __init__CpuidInfoCollector.__init__|   s    W
JJ,,Mz(/CG/LM	%.]]"kk%	y}}U\\
 JJ,,`z:U/VW^/_`	)2&(r    c                    ^ ^ [        5       mUU 4S jn[        S    H#  nUS   S   T R                  :  a  M  U" U5        M%     [        S    H#  nUS   S   T R                  :  a  M  U" U5        M%     T$ )Nc                    > TR                   R                  " S0 U S   D6nU S    H@  n[        XS   5      nTR                  X2S   5      (       d  M,  TR	                  US   5        MB     g )NrY   bitsregisterbitr#   r!   )r]   r^   getattr_is_bit_setadd)rM   ri   feature_checkcurrentresultrh   s       r   check_features4CpuidInfoCollector._features.<locals>.check_features   sb    

00A4=AI!%f!):-FG##G5-ABBJJ}V45 ".r    r3   rY   r_   zextension-flags)r,   r   r`   r\   )rh   rw   	call_datarv   s   `  @r   rg   CpuidInfoCollector._features   s    	6 $G,I!%(4+E+EE9% -
 $$56I!%(4+I+II9% 7
 r    ro   rp   r(   c                     SU-  nX-  S:  $ )Nr   r   r!   )rh   ro   rp   masks       r   rr   CpuidInfoCollector._is_bit_set   s    Cx""r    c                 4   U R                   S:  a  gU R                  R                  SSS9nU R                  R                  SSS9nU R                  R                  SSS9n[        R                  " SUR
                  UR                  UR                  UR                  UR
                  UR                  UR                  UR                  UR
                  UR                  UR                  UR                  5      R                  S5      nUR                  S	5      $ )
z'Returns the brand string, if available.l       Nl       r   )r_   re   l       IIIIIIIIIIIIr[    )r\   r]   r^   ra   rb   r_   rc   re   rd   rf   r>   )rh   r1r2r3rv   s        r   brand_stringCpuidInfoCollector.brand_string   s    ))J6ZZ%%*!%<ZZ%%*!%<ZZ%%*!%<FFFFFFFFFFFFFFFFFFFFFFFF
 &/ 	 ||F##r    )r]   r%   r`   r\   r$   N)__name__
__module____qualname____firstlineno____doc__rj   rg   rI   boolrr   r   strr   __static_attributes__r!   r    r   rV   rV   x   s9    E),#C #c #d #$hsm $r    rV   Windowsc                      [        5       n U [        :X  a(  [        5       n[        UR                  UR
                  S9$ [        U 5      $ )zPReturns a partial Microarchitecture, obtained from running the cpuid instructionr6   )r?   r@   rV   r-   r$   r%   r   )rR   rM   s     r   
cpuid_infor      s;     :Lv!#DKK$--HH$\22r    c                     [         R                  " U [         R                  US9 nUR                  5       S   nS S S 5        [	        WR                  S5      5      $ ! , (       d  f       N(= f)N)stdoutenvr   r[   )
subprocessPopenPIPEcommunicater   rf   )argsr   procoutputs       r   _check_outputr      sQ    			$zC	@D!!#A& 
Av}}W%&& 
A	@s   A
A))AMD64ARM64c                  *   [         R                  " 5       n U S;  a  [         R                  " 5       $ U S:X  a*  [         R                  " 5       n[        R	                  X5      $ [        / SQ[        5       S9R                  5       nSU;   a  [        $ [        $ )z)Return the machine architecture we are on)Darwinr   r   sysctl-nmachdep.cpu.brand_stringr   Apple)
platformsystemmachineWINDOWS_MAPPINGrA   r   _ensure_bin_usrbin_in_pathr>   rC   r@   )r   platform_machiner   s      r   r?   r?      s    ( 44!! 9$#++-""#3FF 4:T:Veg  & Mr    r   c                  &  ^ [        5       mS[        S[        4U4S jjn [        5       [        :X  a  U " SS5      R	                  5        SU " SS5      R	                  5        3n[        UR                  5       5      n[        S   S	   R                  5        H+  u  p#X!;   d  M  UR                  UR                  5       5        M-     [        U " SS
5      US9$ SnU " SS5      R	                  5       nSU;   a  SnOSU;   a  SnOSU;   a  Sn[        USS9$ )z;Returns a raw info dictionary parsing the output of sysctl.r   r(   c                  N   > [        S/[        U 5      -   TS9R                  5       $ )Nr   r   )r   listr>   )r   child_environments    r   r   sysctl_info.<locals>.sysctl   s%    hZ$t*4:KLRRTTr    r   zmachdep.cpu.features zmachdep.cpu.leaf7_featuresconversionsdarwin_flagszmachdep.cpu.vendorr6   unknownr   m2m1appler   )r#   r$   )r   r   r?   r@   lowerr,   splitr   itemsupdater-   )r   r%   darwin_flag
linux_flagmodel	model_strr   s         @r   sysctl_infor      s#    34Uc Uc U zVd2399;<Ad89??ABD 	 x~~'( (4M'B>'R'X'X'Z#K&
 0 0 23 ([ F41E$FQYZZEt78>>@Iy			I	eG44r    c                  8   [        [        R                  R                  5       5      n U R	                  SS5      R                  [        R                  5      nS H  nX!;  d  M
  UR                  U5        M     [        R                  R                  U5      U S'   U $ )NPATHr8   )z/sbinz	/usr/sbin)	dictosenvironr   rA   r   pathsepr   join)r   search_pathsadditional_paths      r   r   r     sy    RZZ--/0$((4::2::FL1.0 2 !#

 =fr    rM   c                 T    SU ;  a  g[         S   S   nU S   nUR                  X"5      $ )z1Adjust the vendor field to make it human-readablezCPU implementerr2   r   arm_vendors)r   rA   )rM   r   arm_codes      r   rD   rD      s8    $ }-m<K%&H??8..r    r5   c                 T    [        U R                  US5      R                  5       5      $ )Nr8   )r,   rA   r   )rM   r5   s     r   rB   rB   1  s!    txxR &&())r    c                      [         [        R                  " 5           H  n  U " 5       s  $    [        [        5       5      $ ! [         a*  n[        R
                  " [        U5      5         SnAMQ  SnAff = f)a%  Returns a partial Microarchitecture with information on the CPU of the current host.

This function calls all the viable factories one after the other until there's one that is
able to produce the requested information. Falls-back to a generic microarchitecture, if none
of the calls succeed.
N)	r   r   r   	Exceptionwarningswarnr   r   r?   )r   excs     r   detected_infor   5  s[       12	$9 3 %XZ00  	$MM#c(##	$s   ?
A3	A..A3infoc                     [        5       n[        R                  US 5      n[        R                  " 5        Vs/ s H  o2" X5      (       d  M  UPM     sn=(       d    [        U5      /$ s  snf )zReturns an unordered list of known micro-architectures that are compatible with the
partial Microarchitecture passed as input.
c                     g)NFr!   )xys     r   <lambda>/compatible_microarchitectures.<locals>.<lambda>L  s    r    )r?   COMPATIBILITY_CHECKSrA   r   valuesr   )r   architecture_familytesterr   s       r   compatible_microarchitecturesr   F  s]     #*!%%&9;MNF~~';'!6$?A'; !"56@ ;s   A)A)c                    ^ [        5       m[        T5      n S nU  Vs/ s H  o"R                  S:X  d  M  UPM     nn[        X1S9nTR                  S:w  aH  [        U4S jU  5       5      (       a.  U  Vs/ s H!  nTR                  UR                  :X  d  M  UPM#     n nU  Vs/ s H  o"U:  d  M
  UPM     n nU (       d  U$ [        XS9$ s  snf s  snf s  snf )z3Detects the host micro-architecture and returns it.c                 V    [        U R                  5      [        U R                  5      4$ r   )len	ancestorsr%   )items    r   
sorting_fnhost.<locals>.sorting_fn[  s    4>>"C$666r    r2   r4   r8   c              3   `   >#    U  H#  nTR                   UR                   :X  d  M  Uv   M%     g 7fr   )r'   ).0cr   s     r   	<genexpr>host.<locals>.<genexpr>c  s"     "XjDMMQZZ<W11js   .	.)r   r   r$   maxr'   any)
candidatesr   r   generic_candidatesbest_genericr   s        @r   hostr   R  s     ?D /t4J7 &0IZ88y3H!ZI):L }}s"Xj"XXX!+KAt}}

/Ja
K
 (<Z|+;!ZJ<  z**% J
 L
 =s"   C	C	4CC"	C/Cr   .c                 D   ^  [        T [        5      (       a  T 4m U 4S jnU$ )a  Decorator to register a function as a proper compatibility check.

A compatibility check function takes a partial Microarchitecture object as a first argument,
and an arbitrary target Microarchitecture as the second argument. It returns True if the
target is compatible with first argument, False otherwise.

Args:
    architecture_family: architecture family for which this test can be used
c                 ^   > [         R                  T Vs0 s H  oU _M     sn5        U $ s  snf r   )r   r   )funcfamilyr   s     r   r   &compatibility_check.<locals>.decorator  s0    ##@S$T@SfT\@S$TU %Us   *)
isinstancer   )r   r   s   ` r   compatibility_checkr   t  s)     %s++24 r    )r   c                     [         [        5          nX:H  =(       d    X!R                  ;   =(       a    UR                  U R                  :*  $ )z8Compatibility check for PPC64 and PPC64LE architectures.)r   r?   r   r&   r   target	arch_roots      r   compatibility_check_for_powerr     s@    
 
#I<y,<,<</


t
./r    c                     [         [           nX:H  =(       d    X!R                  ;   =(       aG    UR                  U R                  S4;   =(       a%    UR                  R                  U R                  5      $ )z-Compatibility check for x86_64 architectures.r2   )r   r@   r   r$   r%   issubsetr   s      r   compatibility_check_for_x86_64r     s[    
 I			=	-=-= = 	4MMdkk955	4OO$$T]]3r    c                    UR                   S:X  a  UR                  [        :w  a  g[        [           nX!R                  :H  =(       a    UR                   U R                   S4;   n[
        R                  " 5       S:X  a5  [        U R                     nU=(       a    X:H  =(       d    XR                  ;   $ U=(       a%    UR                  R                  U R                  5      $ )z.Compatibility check for AARCH64 architectures.r2   Fr   )
r$   r#   rC   r   r   r   r   r   r%   r   )r   r   r   arch_root_and_vendorr   s        r   compatibility_check_for_aarch64r    s    
 }}	!fkkW&< I$5 &--L ; H$		"#V)UFoo<UVKFOO$<$<T]]$KKr    c                     [         [           nX:H  =(       d    X!R                  ;   =(       a/    UR                  U R                  :H  =(       d    UR                  S:H  $ )z.Compatibility check for riscv64 architectures.r2   )r   rL   r   r#   r$   r   s      r   compatibility_check_for_riscv64r    sJ      I@90@0@#@ tyy >FMMY$>r    c                      [         R                  " 5       S:X  a"  [        / SQ[        5       S9R	                  5       $ [        5       R                  [        :X  a  [        5       R                  5       $ g)z;Returns the brand string of the host, if detected, or None.r   r   r   N)
r   r   r   r   r>   r   r   r@   rV   r   r!   r    r   r   r     sS    H$8>X>Z

%'	 v}}!#0022r    )r8   r8   Nr   r8   )8r   collectionsr   r   rG   ra   r   r   typingr   r   r   r   r   r   vendor.cpuid.cpuidr
   microarchitecturer   r   r   schemar   r   defaultdictr   r   r   r@   rC   rE   rF   rL   r   r"   rI   r-   rT   rV   r   r   r   r?   r   r   rD   rB   r   r   r   r   r   r   r  r  r   r!   r    r   <module>r     sX  
 *  	  	    : : & T T , &&t,   



  #'
 s3x  	
  & G$03' 03 %03fC$ C$L I&3 '3' < H%5& 5 &5B/tCH~ /# /"*tCH~ *C *CH *1( 1"	(9 	dCT>U 	+DU3c3h3G-H * '5)9:/ ;/ 0	 1	 1L 2L, 1 2
hsm 
r    