U
    ÷Øf¤I ã                   @   s  d Z d dd„ e D ƒ¡ZddlZddlZddlZddlZddlZdZda	G dd„ de
ƒZG d	d
„ d
e
ƒZdd„ Zdidd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Z d3d4„ Z!d5d6„ Z"i fd7d8„Z#G d9d:„ d:e
ƒZ$G d;d<„ d<e
ƒZ%d=d>„ Z&d?d@„ Z'dAdB„ Z(dCdD„ Z)dEdF„ Z*dGdH„ Z+dIdJ„ Z,dKdL„ Z-dMdN„ Z.dOdP„ Z/dQdR„ Z0dSdT„ Z1dUdV„ Z2dWdX„ Z3dYdZ„ Z4d[d\„ Z5d]d^„ Z6d_d`„ Z7dadb„ Z8dcdd„ Z9dedf„ Z:e;dgkr e:ƒ  nedhdhƒa	eƒ  dS )j)é	   é    r   Ú.c                 C   s   g | ]}t |ƒ‘qS © )Ústr©Ú.0Únr   r   ú6/tmp/pip-target-lpfmz8o1/lib/python/cpuinfo/cpuinfo.pyÚ
<listcomp>   s     r
   r   NTc                   @   sT   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )ÚTracec                 C   sp   || _ | j sd S ddlm} ddlm} |r6|ƒ | _n | ¡  d¡}td |¡dƒ| _|ƒ | _	|ƒ | _
d | _d S )Nr   )Údatetime©ÚStringIOz%Y-%m-%d_%H-%M-%S-%fzcpuinfo_trace_{0}.traceÚw)Ú
_is_activer   Úior   Ú_outputÚnowÚstrftimeÚopenÚformatÚ_stdoutÚ_stderrÚ_err)ÚselfÚ	is_activeZis_stored_in_stringr   r   Údater   r   r	   Ú__init__+   s    
zTrace.__init__c                 C   sT   | j s
d S ddlm} |ƒ d }|d }|d }| j d |||¡¡ | j ¡  d S )Nr   ©Ústacké   é   z{0} ({1} {2})
©r   Úinspectr   r   Úwriter   Úflush©r   Úmsgr   ÚframeÚfileÚliner   r   r	   Úheader=   s     
zTrace.headerc                 C   sR   | j s
d S ddlm} |ƒ d }|d }|d }| j d ||¡¡ | j ¡  d S )Nr   r   r    r!   zSuccess ... ({0} {1})

r"   )r   r   r(   r)   r*   r   r   r	   ÚsuccessG   s     
zTrace.successc                 C   sè   | j s
d S ddlm} |ƒ d }|d }|d }t|tƒr„d dd„ | d¡D ƒ¡d }| j |¡ | j d	 	||¡¡ | j 
¡  n`t|tƒrädd
lm} |ƒ }| j d 	||¡¡ | j d dd„ | d¡D ƒ¡d ¡ | j 
¡  d S )Nr   r   r    r!   Ú c                 S   s   g | ]}d | ‘qS )ú	r   )r   r*   r   r   r	   r
   [   s     zTrace.fail.<locals>.<listcomp>Ú
zFailed ... ({0} {1})

©Ú
format_excz	Failed ... ({0} {1})
c                 S   s   g | ]}d   |¡‘qS ©ú		{0}
©r   r   r   r   r	   r
   d   s     )r   r#   r   Ú
isinstancer   ÚjoinÚsplitr   r$   r   r%   Ú	ExceptionÚ	tracebackr1   )r   r'   r   r(   r)   r*   r1   Ú
err_stringr   r   r	   ÚfailR   s"     


&z
Trace.failc                 C   sT   | j s
d S ddlm} |ƒ d }|d }|d }| j d |||¡¡ | j ¡  d S )Nr   r   é   r    r!   z	{0} ({1} {2})
r"   r&   r   r   r	   Úcommand_headerg   s     
zTrace.command_headerc                 C   sP   | j s
d S | j d |¡¡ | j d dd„ | d¡D ƒ¡d ¡ | j ¡  d S )Nr3   r-   c                 S   s   g | ]}d   |¡‘qS )z			{0}
r4   r   r   r   r	   r
   u   s     z(Trace.command_output.<locals>.<listcomp>r/   )r   r   r$   r   r6   r7   r%   )r   r'   Úoutputr   r   r	   Úcommand_outputq   s
     &zTrace.command_outputc              	      s  | j s
d S ddlm} |ƒ d }|d }|d }| j d ||¡¡ ‡ ‡fdd„|D ƒ}|r†|D ]"}	| j d |	ˆ |	 ˆ|	 ¡¡ q`n| j d	¡ | j d
 ||¡¡ ‡ ‡fdd„|D ƒ}
|
râ|
D ]}	| j d |	ˆ|	 ¡¡ qÂn| j d	¡ | j d¡ | j ¡  d S )Nr   r   r!   r    z	Changed keys ({0} {1})
c                    s0   g | ](}|ˆ kr|ˆkrˆ | ˆ| kr|‘qS r   r   ©r   Úkey©ÚinfoÚnew_infor   r	   r
   ‚   s
        zTrace.keys.<locals>.<listcomp>z		{0}: {1} to {2}
z		None
z	New keys ({0} {1})
c                    s    g | ]}|ˆkr|ˆ kr|‘qS r   r   r@   rB   r   r	   r
   ‹   s       z		{0}: {1}
r/   r"   )r   ÚkeysrC   rD   r   r(   r)   r*   Zchanged_keysrA   Znew_keysr   rB   r	   rE   x   s(     
"z
Trace.keysc                 C   s(   | j s
d S | j |d ¡ | j ¡  d S )Nr/   )r   r   r$   r%   )r   r'   r   r   r	   r$   •   s     zTrace.writec                 C   s&   | j  ¡ | j ¡ | j ¡ || j|dœS )N)r>   ÚstdoutÚstderrrC   ÚerrÚis_fail)r   Úgetvaluer   r   r   )r   rC   rI   r   r   r	   Úto_dict›   s    úzTrace.to_dictN)Ú__name__Ú
__module__Ú__qualname__r   r+   r,   r;   r=   r?   rE   r$   rK   r   r   r   r	   r   *   s   

r   c                   @   s¤  e Zd Ze ¡ d Ze ¡ Ze ¡  	¡ dkZ
e ¡ Ze ¡ d ZdZedd„ ƒZedd„ ƒZed	d
„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd „ ƒZed!d"„ ƒZed#d$„ ƒZ ed%d&„ ƒZ!ed'd(„ ƒZ"ed)d*„ ƒZ#ed+d,„ ƒZ$ed-d.„ ƒZ%ed/d0„ ƒZ&ed1d2„ ƒZ'ed3d4„ ƒZ(ed5d6„ ƒZ)ed7d8„ ƒZ*ed9d:„ ƒZ+ed;d<„ ƒZ,ed=d>„ ƒZ-d?S )@Ú
DataSourcer   Úwindowsé   Tc                   C   s   t j d¡S )Nú/proc/cpuinfo)ÚosÚpathÚexistsr   r   r   r	   Úhas_proc_cpuinfo­   s    zDataSource.has_proc_cpuinfoc                   C   s   t tdƒƒdkS )NÚdmesgr   ©ÚlenÚ_program_pathsr   r   r   r	   Ú	has_dmesg±   s    zDataSource.has_dmesgc                  C   s4   t  ¡  ¡  d¡ d¡ ¡  ¡ } d| ko2tj d¡S )Nú"ú'Úlinuxú/var/run/dmesg.boot)ÚplatformÚsystemÚstripÚlowerrS   rT   rU   )Úunamer   r   r	   Úhas_var_run_dmesg_bootµ   s     z!DataSource.has_var_run_dmesg_bootc                   C   s   t tdƒƒdkS )Núcpufreq-infor   rX   r   r   r   r	   Úhas_cpufreq_infoº   s    zDataSource.has_cpufreq_infoc                   C   s   t tdƒƒdkS )NÚsestatusr   rX   r   r   r   r	   Úhas_sestatus¾   s    zDataSource.has_sestatusc                   C   s   t tdƒƒdkS )NÚsysctlr   rX   r   r   r   r	   Ú
has_sysctlÂ   s    zDataSource.has_sysctlc                   C   s   t tdƒƒdkS )NÚisainfor   rX   r   r   r   r	   Úhas_isainfoÆ   s    zDataSource.has_isainfoc                   C   s   t tdƒƒdkS )NÚkstatr   rX   r   r   r   r	   Ú	has_kstatÊ   s    zDataSource.has_kstatc                  C   sD   t  ¡  ¡  d¡ d¡ ¡  ¡ } d| kp.d| k}|oBttdƒƒdkS )Nr\   r]   ZbeosZhaikuÚsysinfor   )r`   ra   rb   rc   rY   rZ   )rd   Zis_beosr   r   r	   Úhas_sysinfoÎ   s     zDataSource.has_sysinfoc                   C   s   t tdƒƒdkS )NÚlscpur   rX   r   r   r   r	   Ú	has_lscpuÔ   s    zDataSource.has_lscpuc                   C   s   t tdƒƒdkS )NÚlspropr   rX   r   r   r   r	   Úhas_ibm_pa_featuresØ   s    zDataSource.has_ibm_pa_featuresc                  C   s(   t ddddgƒ\} }| dko&t|ƒdkS )NÚwmicrS   ÚgetÚVersionr   )Ú_run_and_get_stdoutrY   )Ú
returncoder>   r   r   r	   Úhas_wmicÜ   s    zDataSource.has_wmicc                   C   s   t ddgƒS )NÚcatrR   ©ry   r   r   r   r	   Úcat_proc_cpuinfoá   s    zDataSource.cat_proc_cpuinfoc                   C   s
   t dgƒS )Nrf   r}   r   r   r   r	   Úcpufreq_infoå   s    zDataSource.cpufreq_infoc                   C   s   t ddgƒS )Nrh   z-br}   r   r   r   r	   Ú
sestatus_bé   s    zDataSource.sestatus_bc                   C   s   t ddgƒS )NrW   z-ar}   r   r   r   r	   Údmesg_aí   s    zDataSource.dmesg_ac                   C   s   t ddgƒS )Nr|   r_   r}   r   r   r   r	   Úcat_var_run_dmesg_bootñ   s    z!DataSource.cat_var_run_dmesg_bootc                   C   s   t dddgƒS )Nrj   zmachdep.cpuúhw.cpufrequencyr}   r   r   r   r	   Ú"sysctl_machdep_cpu_hw_cpufrequencyõ   s    z-DataSource.sysctl_machdep_cpu_hw_cpufrequencyc                   C   s   t ddgƒS )Nrl   z-vbr}   r   r   r   r	   Ú
isainfo_vbù   s    zDataSource.isainfo_vbc                   C   s   t dddgƒS )Nrn   z-mZcpu_infor}   r   r   r   r	   Úkstat_m_cpu_infoý   s    zDataSource.kstat_m_cpu_infoc                   C   s   t ddgƒS )Nrp   z-cpur}   r   r   r   r	   Úsysinfo_cpu  s    zDataSource.sysinfo_cpuc                   C   s
   t dgƒS )Nrr   r}   r   r   r   r	   rr     s    zDataSource.lscpuc                  C   s*   dd l } |   d¡}|r&td|d gƒS d S )Nr   z(/proc/device-tree/cpus/*/ibm,pa-featuresrt   )Úglobry   )rˆ   Zibm_featuresr   r   r	   Úibm_pa_features	  s    
zDataSource.ibm_pa_featuresc                   C   s   t dddddgƒS )Nrv   Úcpurw   zOName,CurrentClockSpeed,L2CacheSize,L3CacheSize,Description,Caption,Manufacturerz/format:listr}   r   r   r   r	   Úwmic_cpu  s    zDataSource.wmic_cpuc                  C   s   t ddƒ} |  ¡ S )Nú.Hardware\Description\System\CentralProcessor\0ZProcessorNameString)Ú_read_windows_registry_keyrb   )Úprocessor_brandr   r   r	   Úwinreg_processor_brand  s    
z!DataSource.winreg_processor_brandc                  C   s   t ddƒ} | S )NrŒ   ZVendorIdentifier©r   )Úvendor_id_rawr   r   r	   Úwinreg_vendor_id_raw  s    
zDataSource.winreg_vendor_id_rawc                  C   s   t ddƒ} | S )Nz<SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentÚPROCESSOR_ARCHITECTUREr   )Úarch_string_rawr   r   r	   Úwinreg_arch_string_raw  s    
z!DataSource.winreg_arch_string_rawc                  C   s   t ddƒ} t| ƒ} | S )NrŒ   z~Mhz)r   Ú_to_decimal_string)Ú	hz_actualr   r   r	   Úwinreg_hz_actual$  s    
zDataSource.winreg_hz_actualc                  C   s   t ddƒ} | S )NrŒ   Z
FeatureSetr   ©Zfeature_bitsr   r   r	   Úwinreg_feature_bits*  s    
zDataSource.winreg_feature_bitsN).rL   rM   rN   r`   ÚarchitectureÚbitsÚmultiprocessingÚ	cpu_countra   rc   Ú
is_windowsÚmachiner”   rd   Úuname_string_rawÚ	can_cpuidÚstaticmethodrV   r[   re   rg   ri   rk   rm   ro   rq   rs   ru   r{   r~   r   r€   r   r‚   r„   r…   r†   r‡   rr   r‰   r‹   r   r’   r•   r˜   rš   r   r   r   r	   rO   ¥   s€   



























rO   c                 C   sŒ   g }t d tj dd¡ tj¡ƒ}tjd  tj¡D ]T}tj || ¡}t |tj	¡r\| 
|¡ |D ]$}|| }t |tj	¡r`| 
|¡ q`q2|S )NÚPATHEXTr-   ÚPATH)ÚfilterrS   Úenvironrw   r7   ÚpathseprT   r6   ÚaccessÚX_OKÚappend)Zprogram_nameÚpathsÚextsÚpÚeZpextr   r   r	   rZ   0  s    
rZ   c                 C   s¶   ddl m}m} t dd | ¡ d ¡ |s>|| |||d}n,|| |||d}|||j||d}|j ¡  | ¡ \}}|j	dd	}|j	dd	}t 
d
t|jƒ¡ t 
d|¡ |j|fS )Nr   ©ÚPopenÚPIPEzRunning command "ú z" ...©rF   rG   Ústdin)rµ   rF   rG   úUTF-8©Úencodingzreturn code:zstdout:)Ú
subprocessr±   r²   Úg_tracer=   r6   rF   ÚcloseÚcommunicateÚdecoder?   r   rz   )ÚcommandZpipe_commandr±   r²   Úp1Úp2Zstdout_outputZstderr_outputr   r   r	   ry   =  s    
ry   c                 C   s®   t  d | |¡¡ zdd l}W nR tk
rp } z4zdd l}W n" tk
r^ } zW 5 d }~X Y nX W 5 d }~X Y nX | |j| ¡}| ||¡d }| 	|¡ t  
dt|ƒ¡ |S )Nz*Reading Registry key "{0}" field "{1}" ...r   zvalue:)rº   r=   r   Ú_winregÚImportErrorÚwinregÚOpenKeyÚHKEY_LOCAL_MACHINEÚQueryValueExZCloseKeyr?   r   )Zkey_nameÚ
field_namerÃ   rH   rA   Úvaluer   r   r	   r   W  s    $
r   c                  C   s"   t tjƒ\} }| dkrtdƒ‚d S )N)
ÚX86_32ÚX86_64ÚARM_7ÚARM_8ÚPPC_64ÚS390XÚMIPS_32ÚMIPS_64ÚRISCV_32ÚRISCV_64zNpy-cpuinfo currently only works on X86 and some ARM/PPC/S390X/MIPS/RISCV CPUs.)Ú_parse_archrO   r”   r8   )Úarchrœ   r   r   r	   Ú_check_archi  s    rÕ   c                 C   s6   dd l }dd l}| }| |¡}| |¡}| d¡}|S )Nr   Úutf8)ÚpickleÚbase64ÚdumpsÚ	b64encoder½   )Úthingr×   rØ   ÚaÚbÚcÚdr   r   r	   Ú_obj_to_b64q  s    


rà   c                 C   sH   dd l }dd l}z| | ¡}| |¡}|W S  tk
rB   i  Y S X d S ©Nr   )r×   rØ   Ú	b64decodeÚloadsr8   )rÛ   r×   rØ   rÜ   rÝ   r   r   r	   Ú_b64_to_obj{  s    

rä   c                 C   s<   t | tƒrdd„ | D ƒS t | tƒr4dd„ |  ¡ D ƒS | S d S )Nc                 S   s   g | ]}t |ƒ‘qS r   ©Ú_utf_to_str)r   Úelementr   r   r	   r
   ˆ  s     z_utf_to_str.<locals>.<listcomp>c                 S   s   i | ]\}}t |ƒt |ƒ“qS r   rå   )r   rA   rÈ   r   r   r	   Ú
<dictcomp>Š  s   ÿ z_utf_to_str.<locals>.<dictcomp>)r5   ÚlistÚdictÚitems)Úinputr   r   r	   ræ   †  s    

ÿræ   c                 C   sº   ddddddddd	d
dddddddddddddg}t  || |¡ |D ]p}| |d ¡rn|  |d ¡sn|| | |< qD|dkrD| d¡rD|d D ]}|| d krˆ| d  |¡ qˆ| d  ¡  qDd S )Nr‘   Úhardware_rawÚ	brand_rawÚhz_advertised_friendlyÚhz_actual_friendlyÚhz_advertisedr—   rÔ   rœ   Úcountr”   r¡   Úl2_cache_sizeÚl2_cache_line_sizeÚl2_cache_associativityÚsteppingÚmodelÚfamilyÚprocessor_typeÚflagsÚl3_cache_sizeÚl1_data_cache_sizeÚl1_instruction_cache_size)rº   rE   rw   r«   Úsort)rC   rD   rE   rA   Úfr   r   r	   Ú_copy_new_fields  sB                    ù
 r   c                 C   sŠ   |  ¡ D ]|}|D ]r}| ¡ }d|kr| dd¡\}}| ¡  ¡ }| ¡ }||krt|ƒdkr| rv| ¡ s‚|    S q|    S qqd S )Nú:r    r   )Ú
splitlinesrc   r7   rb   rY   Úisdigit)Úcant_be_numberÚ
raw_stringÚfield_namesr*   rÇ   ÚleftÚrightr   r   r	   Ú_get_field_actual¥  s    r	  c                 G   sJ   t | ||ƒ}|r:|r:z||ƒ}W n tk
r8   |}Y nX |d krF|}|S ©N)r	  r8   )r  r  Z
convert_toÚdefault_valuer  Úretvalr   r   r	   Ú
_get_field¶  s    
r  c                 C   sž   z‚d  | ¡} |  dd¡} d dd„ | D ƒ¡ ¡ } | dkr<d} d| krNd  | ¡} |  d¡} |  d¡rld	  | ¡} t| ƒ} d  | ¡} | W S  tk
r˜   Y d
S X d S )Nú{0}ú,r   r-   c                 s   s"   | ]}|  ¡ s|d kr|V  qdS ©r   N©r  r   r   r   r	   Ú	<genexpr>Î  s       z%_to_decimal_string.<locals>.<genexpr>Ú0z{0}.0z{0}0ú0.0)r   Úreplacer6   rb   ÚrstripÚendswithÚfloatr8   )Úticksr   r   r	   r–   Æ  s     





r–   c                 C   s°   z”t | ƒ} d | ¡} |  d¡}| d¡}| dd¡}| || d d¡}|| }d |d |… ||d … ¡}| d¡\}}t|ƒt|ƒ }}||fW S  tk
rª   Y dS X d S )Nr  r  r   r-   r    ú{0}.{1}©r   r   )	r  r   ÚlstripÚindexr  Úljustr7   Úintr8   )r  ÚscaleÚhzZ	old_indexZ	new_indexr  r  r   r   r	   Ú_hz_short_to_fullä  s    



r"  c                 C   sž   z‚|   ¡  ¡ } d\}}|  d¡r&d}n|  d¡r6d}n|  d¡rDd}d d	d
„ | D ƒ¡  ¡ }d|krl|d7 }t||ƒ\}}||fW S  tk
r˜   Y dS X d S )N©NNÚghzr   Úmhzé   r!  r   r-   c                 s   s"   | ]}|  ¡ s|d kr|V  qdS r  r  r   r   r   r	   r    s       z'_hz_friendly_to_full.<locals>.<genexpr>r   z.0r  )rb   rc   r  r6   r"  r8   )Z	hz_stringr!  r   r   r   r	   Ú_hz_friendly_to_full÷  s     



r'  c                 C   sÐ   z´t | |ƒ\}}d ||¡}| d¡}| dd¡}d}d}|dkrLd}d}n"|dkr^d	}d}n|d
krnd}d
}d |d | d … || d d … ¡}d t|ƒ|¡}| d¡}|W S  tk
rÊ   Y dS X d S )Nr  r   r-   ÚHzr   r   ÚGHzr&  ÚMHzr<   ZKHzr    z{0:.4f} {1}r  z	0.0000 Hz)r"  r   r  r  r  r  r8   )r  r   r  r  ÚresultZ	dot_indexÚsymbolr   r   r	   Ú_hz_short_to_friendly  s,    
(
r-  c                 C   sf   dd l }| s| S d | ¡} dddddœ}| ¡ D ]0\}}| || ¡r0d | d d	…  ¡ |¡  S q0| S )
Nr   r  ÚBZKBÚMBÚGB)z	^[0-9]+B$z	^[0-9]+K$z	^[0-9]+M$z	^[0-9]+G$z{0} {1}éÿÿÿÿ)Úrer   rë   Úmatchrb   )rì   r2  ÚformatsÚpatternZfriendly_sizer   r   r	   Ú_to_friendly_bytes/  s    
ür6  c                 C   sÈ   |   ¡ }ddiddiddiddiddid	did
diddiddiddig
}zX|D ]N}t| ¡ ƒd }t| ¡ ƒd }| |¡rNt| |¡d  ¡ ƒ|   W S qNW n" tk
rÂ } zW 5 d }~X Y nX | S )NZgibi   @Zmibi   Zkibé   ÚgbÚmbÚkbÚgÚmÚkrÝ   r    r   )	rc   ré   rE   Úvaluesr  r  r7   rb   r8   )Zfriendly_bytesrì   r4  Úentryr5  Ú
multiplierrH   r   r   r	   Ú_friendly_bytes_to_intC  s*    ô
&rA  c                 C   s†   d|   ¡ krdS |   ¡ }d}| d¡r,d}n| d¡r:d}d|krR| d¡d	 }n| d d	¡d	 }| d¡ d¡ ¡ }t|ƒ}||fS )
Nr!  ©r  r   r   r%  r&  r$  r   ú@r    )rc   r  r7   Úrsplitr  rb   r–   )Ú
cpu_stringr!  r   r   r   r	   Ú_parse_cpu_brand_stringa  s    

rF  c                    sê  dd l }dd„ | dˆ ¡D ƒ}dd„ | dˆ ¡D ƒ}dd„ t||ƒD ƒ}‡ fd	d„| ¡ D ƒ}d
\}}}}|D ]¦}	|	 d¡D ]–}
dd„ |
 d¡D ƒ}
t|
ƒdkr||
d |
d  }}|dkrÆ| d¡}q||dkràt| d¡dƒ}q||dkrút| d¡dƒ}q||dkr|t| d¡dƒ}q|qnˆ  ¡ }d}|rld}|D ]6}	d 	|	¡}| 
|¡r0|d t|ƒ …  ¡ }d}q0q"t|ƒ\}}|dkrØ|D ]P}	|	}dD ]@}||kr’d|d | |¡t|ƒ …  }t|ƒ\}} q†q’q†|||||||fS )Nr   c                 S   s   g | ]}|  ¡ ‘qS r   ©Ústart©r   r<  r   r   r	   r
   {  s     z._parse_cpu_brand_string_dx.<locals>.<listcomp>z\(c                 S   s   g | ]}|  ¡ ‘qS r   rG  rI  r   r   r	   r
   |  s     z\)c                 S   s   i | ]\}}||“qS r   r   ©r   r=  Úvr   r   r	   rè   }  s      z._parse_cpu_brand_string_dx.<locals>.<dictcomp>c                    s    g | ]\}}ˆ |d  |… ‘qS )r    r   )r   rH  Úend©rE  r   r	   r
   ~  s     )NNNNr  c                 S   s   g | ]}|  ¡ ‘qS r   )rb   r   r   r   r	   r
   „  s     r  r    Úoriginr\   rö   Ú0xé   r÷   ©Úfamrø   TFz({0})r  )r)  r*  r(  zCPU @ )r2  ÚfinditerÚziprë   r7   rY   rb   r  r  r   r  rF  Úfind)rE  r2  ZstartsZendsZinsidesÚ	vendor_idrö   r÷   rø   ZinsideÚpairÚnamerÈ   ÚbrandZ
is_workingÚfullÚhz_brandr   r!  r?  r   rM  r	   Ú_parse_cpu_brand_string_dxw  sL    


r\  c              
   C   s  zâ|   d¡dd … |   d¡dd …  |   d¡dd …  |   d¡dd …  |   d¡dd …  |   d¡dd …  }dd	„ |D ƒ}d
d	„ |D ƒ}d }d}|D ]&}tdd	„ |D ƒƒ}||kr˜|}|}q˜|sÊi W S |\}}}	}
}}}d| kr¾| |  d¡d …   d¡d }| ¡   ¡ }dd	„ |D ƒ}dd	„ |D ƒ}|D ]Ž}t| ¡ ƒd }t| ¡ ƒd }|dkrh| d¡}
nR|dkr„t| d¡dƒ}n6|dkr t| d¡dƒ}n|dkr.t| d¡dƒ}q.g }dD ].}|| krÆ| 	|   |¡d   d¡d ¡ qÆg }|D ]>}|  d¡d   d¡d  
¡ }|  d¡D ]}| 	|¡ q(qþ| ¡  t|	ƒ\}}|dkrhd}t|ƒ}|
|	||||dœ}|r¦|dkr¦t||ƒ|d< t||ƒ|d < |rÒ|dkrÒt||ƒ|d!< t||ƒ|d"< d#d$„ | ¡ D ƒW S  tk
r } zt |¡ W 5 d }~X Y nX i S )%Nz CPU0:r    z CPU1:z CPU:z
CPU0:z
CPU1:z
CPU:c                 S   s   g | ]}|  d ¡d  ¡ ‘qS )r/   r   )r7   rb   ©r   Úlr   r   r	   r
   ´  s     z'_parse_dmesg_output.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )r\  r]  r   r   r	   r
   ·  s     r   c                 S   s   g | ]}|d k	‘qS r
  r   r   r   r   r	   r
   ½  s     z	  Origin=r/   c                 S   s   g | ]}|  ¡  d ¡‘qS ©ú=)rb   r7   r   r   r   r	   r
   Ì  s     c                 S   s(   g | ] }|d    ¡  ¡ |d   ¡ i‘qS )r   r    )rb   rc   r   r   r   r	   r
   Í  s     rN  r\   rö   rO  rP  r÷   rQ  )z  Features=z  Features2=z  AMD Features=z  AMD Features2=ú<ú>r  r  r&  )r‘   rî   rö   r÷   rø   rú   rï   rð   rñ   r—   c                 S   s   i | ]\}}|r||“qS r   r   rJ  r   r   r	   rè     s       z'_parse_dmesg_output.<locals>.<dictcomp>)r7   ÚsumrU  rb   ré   rE   r>  r  r  r«   rc   rþ   rF  r–   r-  r"  rë   r8   rº   r;   )r>   ÚlinesZcpu_stringsZbest_stringZhighest_countrE  rò   r—   r   rŽ   rV  rö   r÷   rø   ÚfieldsÚfieldrX  rÈ   Z
flag_linesÚcategoryrú   r*   Úflagrñ   rC   rH   r   r   r	   Ú_parse_dmesg_output«  sŽ    ÿþýüû





"
ù
ri  c                 C   sV  dd l }d\}}|  ¡ } | d| ¡r0d}d}n| d| ¡rHd}d}n| d	| ¡r^d
}d}nð| d| ¡rtd}d}nÚ| d| ¡rŠd
}d}nÄ| d| ¡r d}d}n®| d| ¡r¶d}d}n˜| d| ¡rÌd}d}n‚| d| ¡râd}d}nl| d| ¡rød}d}nV| dkrd}d}nB| dkr d}d}n.| d| ¡r8d}d}n| d| ¡rNd}d}||fS ) Nr   r#  z4^i\d86$|^x86$|^x86_32$|^i86pc$|^ia32$|^ia-32$|^bepc$rÉ   é    z9^x64$|^x86_64$|^x86_64t$|^i686-64$|^amd64$|^ia64$|^ia-64$rÊ   é@   z^armv8-a|aarch64|arm64$rÌ   z/^armv7$|^armv7[a-z]$|^armv7-[a-z]$|^armv6[a-z]$rË   z"^armv8$|^armv8[a-z]$|^armv8-[a-z]$z ^ppc32$|^prep$|^pmac$|^powermac$ZPPC_32z^powerpc$|^ppc64$|^ppc64le$rÍ   z^sparc32$|^sparc$ZSPARC_32z^sparc64$|^sun4u$|^sun4v$ZSPARC_64z^s390x$rÎ   ÚmipsrÏ   Zmips64rÐ   z^riscv$|^riscv32$|^riscv32be$rÑ   z^riscv64$|^riscv64be$rÒ   )r2  rc   r3  )r”   r2  rÔ   rœ   r   r   r	   rÓ   
  s\    

rÓ   c                 C   s   d|> }| |@ dk}|S )Nr    r   r   )ÚregÚbitÚmaskÚis_setr   r   r	   Ú_is_bit_setC  s    rq  c                 C   sê   t  ¡ s|  d¡ dS t  ¡ \}}|dkr8|  d¡ dS | ¡ D ]0}| ¡  ¡ }| d¡r@| d¡rj dS  dS q@d}d}| ¡ D ]B}| ¡  ¡ }| d¡r¬| d	¡r¬d}q‚| d
¡r‚| d	¡r‚d}q‚|  	d|¡ |  	d|¡ | pè| S )NzFailed to find sestatus.Fr   z$Failed to run sestatus. Skipping ...zcurrent mode:Z	enforcingTZallow_execheapÚonZallow_execmemzcan_selinux_exec_heap:zcan_selinux_exec_memory:)
rO   ri   r;   r€   r  rb   rc   Ú
startswithr  r?   )Útracerz   r>   r*   Zcan_selinux_exec_heapZcan_selinux_exec_memoryr   r   r	   Ú_is_selinux_enforcingI  s0    



ru  c                 C   sr   i }| D ]d}| | }||kr2|| |kr2|||< q|s8q|dkrBq|dkrLqt |ƒtkrd| d¡rdq|||< q|S )Nr  r1  r  )Útyper   rs  )rC   Zacceptable_valuesZfiltered_inforA   rÈ   r   r   r	   Ú#_filter_dict_keys_with_empty_valuesm  s"    
rw  c                   @   s4   e Zd Zddg fdd„Zdd„ Zdd„ Zd	d
„ ZdS )ÚASMNr   c                 C   s4   || _ || _|| _d | _d | _d | _d | _d| _d S rá   )ÚrestypeÚargtypesÚmachine_codeÚ
prochandleÚmmÚfuncÚaddressÚsize)r   ry  rz  r{  r   r   r	   r     s    zASM.__init__c                 C   s  t  d| j¡}t t|ƒ¡| _tjrdt|ƒ}|dk r:d}t 	d¡}t 	d¡}tj
jj}tj|_|d t |¡||ƒ| _| js„tdƒ‚t tjtjtjtj¡tjƒ}|| j||ƒdk r¼tdƒ‚t 	d¡}t 	d¡}tj
jj}	|	t | j¡t |¡|t |¡ƒ}
|
s
tdƒ‚| js2tj
jj}tj|_t |ƒ ¡| _tj
j | jt | j¡t |¡¡}
|
sÞtd	ƒ‚nzdd
lm}m}m}m}m}m} t  d| j¡}t|ƒ| _|d| j||B ||B |B d| _| j |¡ t  tj! "| j¡¡| _tj| jf| j#žŽ }|| jƒ| _$d S )Nó    i   é   zFailed to VirtualAllocr   zFailed to memmoverP  zFailed VirtualProtectzFailed FlushInstructionCache)ÚmmapÚMAP_PRIVATEÚMAP_ANONYMOUSÚ
PROT_WRITEÚ	PROT_READÚ	PROT_EXECr1  )rú   Zprot)%Úbytesr6   r{  ÚctypesÚc_size_trY   r€  rO   rŸ   Úc_ulongÚwindllÚkernel32ZVirtualAllocÚc_void_pry  r  r8   Z	CFUNCTYPEZ_memmove_addrZVirtualProtectÚbyrefr|  ZGetCurrentProcessZFlushInstructionCacherƒ  r„  r…  r†  r‡  rˆ  r}  r$   Z	addressofÚc_intZfrom_bufferrz  r~  )r   r{  r€  Z
MEM_COMMITZPAGE_READWRITEZpfnVirtualAllocZmemmoveZPAGE_EXECUTEZold_protectZpfnVirtualProtectÚresZpfnGetCurrentProcessrƒ  r„  r…  r†  r‡  rˆ  Zfunctyper   r   r	   Úcompile—  sJ     





"
"
 
 zASM.compilec                 C   s   |   ¡ }|S r
  )r~  )r   r  r   r   r	   ÚrunÏ  s    zASM.runc                 C   s^   t jr2t d¡}tjj t | j¡t 	d¡|¡ n
| j
 ¡  d | _d | _
d | _d | _d| _d S )Ni €  r   )rO   rŸ   rŠ  rŒ  r  rŽ  ZVirtualFreer  r  r‹  r}  r»   r|  r~  r€  )r   ZMEM_RELEASEr   r   r	   ÚfreeÕ  s    
"
zASM.free)rL   rM   rN   r   r“  r”  r•  r   r   r   r	   rx  Œ  s   
8rx  c                   @   sn   e Zd Zddd„Zddg fdd„Zdd„ Zd	d
„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚCPUIDNc                 C   s    |d krt ddƒ}t|ƒ| _d S )NF)r   ru  Úis_selinux_enforcing)r   rt  r   r   r	   r   å  s    
zCPUID.__init__r   c                 C   s   t |||ƒ}| ¡  |S r
  )rx  r“  )r   ry  rz  r{  Úasmr   r   r	   Ú	_asm_funcì  s    zCPUID._asm_funcc                 G   s*   t tjd|ƒ}| ¡  | ¡ }| ¡  |S )Nr   )rx  rŠ  Úc_uint32r“  r”  r•  )r   r{  r˜  r  r   r   r	   Ú_run_asmñ  s
    zCPUID._run_asmc                 C   sf   |   dd¡}|   dd¡}|   dd¡}g }|||fD ]$}dD ]}| t||? d@ ƒ¡ q:q2d |¡}|S )Nó   1Àó   ¢‰ØÃó   ¢‰ÈÃó   ¢‰ÐÃ©r   é   rP  é   éÿ   r-   )r›  r«   Úchrr6   )r   ÚebxÚecxÚedxrV  rm  r   r   r   r	   Úget_vendor_idù  s$    þþþ
zCPUID.get_vendor_idc           	      C   s   |   dd¡}|d? d@ }|d? d@ }|d? d@ }|d? d@ }|d	? d@ }|d
? d@ }d}|dkrj|| }n|}|dkr‚|d> | }||||dœS )Nó   ¸   s   ¢Ãr   é   r‚  r¡  é   r<   rP  é   r£  )rª  )r&  rª  )rö   r÷   rø   rù   ©r›  )	r   ÚeaxZstepping_idr÷   Z	family_idrù   Zextended_model_idZextended_family_idrø   r   r   r	   Úget_info  s*    þ
üzCPUID.get_infoc                 C   s   |   d¡}|S )Ns   ¸   €¢Ãr­  )r   Úmax_extension_supportr   r   r	   Úget_max_extension_support=  s    ÿzCPUID.get_max_extension_supportc              >   C   s”  |   dd¡}|   dd¡}t|dƒt|dƒt|dƒt|dƒt|dƒt|d	ƒt|d
ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d ƒt|d!ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d	ƒt|d
ƒt|dƒt|dƒt|dƒt|d"ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d#ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d ƒt|d!ƒd$œ<}d%d&„ | ¡ D ƒ}|dkr¢|   d'd(¡}|   d'd)¡}t|dƒt|dƒt|dƒt|d	ƒt|dƒt|dƒt|dƒt|d"ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d#ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d ƒt|d!ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d
ƒt|dƒt|dƒt|d"ƒt|dƒt|dƒt|dƒt|dƒt|d ƒd*œ*}d+d&„ | ¡ D ƒ}||7 }|d,krˆ|   d-¡}|   d.¡}t|dƒt|dƒt|dƒt|dƒt|dƒt|d	ƒt|d
ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d#ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d ƒt|d!ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|d	ƒt|d
ƒt|dƒt|dƒt|dƒt|d"ƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒt|dƒd/œ5}d0d&„ | ¡ D ƒ}||7 }| ¡  |S )1Nr©  rŸ  rž  r   r    r!   r<   r‚  rQ   r&  é   r¡  r   é   r«  é   é   rª  rP  é   é   é   é   é   é   r¢  é   é   é   é   é   é   é   é
   r¬  )<ÚfpuÚvmeÚdeÚpseÚtscÚmsrÚpaeÚmceÚcx8ÚapicÚsepÚmtrrÚpgeÚmcaÚcmovÚpatÚpse36ZpnÚclflushÚdtsÚacpiÚmmxÚfxsrÚsseÚsse2ÚssZhtÚtmÚia64ÚpbeZpniZ	pclmulqdqZdtes64ZmonitorZds_cplZvmxZsmxZestZtm2Zssse3ZcidÚfmaZcx16ZxtprZpdcmZpcidZdcaZsse4_1Zsse4_2Zx2apicZmovbeZpopcntZtscdeadlineZaesZxsaveZosxsaveZavxZf16cZrdrndZ
hypervisorc                 S   s   g | ]\}}|r|‘qS r   r   rJ  r   r   r	   r
   Ÿ  s      z#CPUID.get_flags.<locals>.<listcomp>s   1És
   ¸   ¢‰ØÃs
   ¸   ¢‰ÈÃ)*ZsgxZbmi1ÚhleZavx2ZsmepZbmi2ZermsZinvpcidZrtmZpqmZmpxZpqeZavx512fZavx512dqZrdseedZadxZsmapZ
avx512ifmaZpcommitZ
clflushoptZclwbZintel_ptZavx512pfZavx512erZavx512cdÚshaZavx512bwZavx512vlZprefetchwt1Z
avx512vbmiZumipZpkuZospkeZavx512vbmi2ZgfniZvaesZ
vpclmulqdqZ
avx512vnniZavx512bitalgZavx512vpopcntdqZrdpidZsgx_lcc                 S   s   g | ]\}}|r|‘qS r   r   rJ  r   r   r	   r
   û  s      l       s
   ¸  €¢‰ØÃs
   ¸  €¢‰ÈÃ)5rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  ZsyscallrÏ  rÐ  rÑ  rÒ  rÓ  rÔ  ÚmpÚnxZmmxextrØ  rÙ  Zfxsr_optZpdpe1gpZrdtscpZlmZ3dnowextÚ3dnowZlahf_lmZ
cmp_legacyZsvmZextapicZ
cr8_legacyZabmZsse4aZmisalignsseZ3dnowprefetchZosvwZibsZxopZskinitZwdtZlwpZfma4ZtceZ
nodeid_msrZtbmZtopoextZperfctr_coreZ
perfctr_nbZdbxZperftscZpci_l2ic                 S   s   g | ]\}}|r|‘qS r   r   rJ  r   r   r	   r
   V  s      )r›  rq  rë   rþ   )r   r°  r§  r¦  rú   r¥  Zextended_flagsr   r   r	   Ú	get_flagsH  sz   þþ	¿E
þ	þÀE
ÿÿ	ÂEzCPUID.get_flagsc                 C   s’   d}|dkr€dddg}|D ]d}|   |d¡}|   |d¡}|   |d¡}|   |d	¡}||||fD ]"}	d
D ]}
|t|	|
? d@ ƒ7 }qbqZq| d¡ ¡ }|S )Nr-   l       s   ¸  €s   ¸  €s   ¸  €s   ¢‰ÀÃr  rž  rŸ  r   r£  ú )r›  r¤  rb   )r   r°  rŽ   ZinstructionsZinstructionr®  r¥  r¦  r§  rm  r   r   r   r	   Úget_processor_brand]  s8    ýþþþþzCPUID.get_processor_brandc                 C   sB   i }|dk r|S |   d¡}|d@ d |d? d@ |d? d@ d	œ}|S )
Nl       s
   ¸  €¢‰ÈÃr£  r7  r«  rª  rP  iÿÿ  )Úsize_bÚassociativityÚline_size_br­  )r   r°  Ú
cache_infor¦  r   r   r	   Ú	get_cache“  s    ÿ


ýzCPUID.get_cachec                    s¨   d }t jdkrld }t tj¡t tj¡f}|  ||dddddddd	d
ddg¡}|j‰ ‡ fdd„}||_|}n8t jdkr¤tj}d}|  ||dddddddddg	¡}|}|S )NÚ32bitó   Us   ‰årœ  s   ¢s   1s   ‹]s   ‹Ms   ‰s   ‰ó   ]ó   Ãc                     sB   t  d¡} t  d¡}ˆ t  | ¡t  |¡ƒ | jd> d@ |jB }|S )Nr   rj  l       üÿ )rŠ  rš  r  rÈ   )ÚhighÚlowr  ©Zold_funcr   r	   Únew_funcÃ  s
    

z&CPUID.get_ticks_func.<locals>.new_funcÚ64bitr   ó   Hs   Áâ s   	Ð)rO   rœ   rŠ  ZPOINTERZc_uintr™  r~  Zc_uint64)r   r  ry  rz  Zget_ticks_x86_32rõ  Zget_ticks_x86_64r   rô  r	   Úget_ticks_funcª  sN    
õÿ	
÷ÿzCPUID.get_ticks_funcc                 C   s@   ddl m} |  ¡ }| ¡ }|dƒ | ¡ }|| }| ¡  |S )Nr   )Úsleepr    )Útimerù  rø  r~  r•  )r   rù  Zticks_fnrH  rL  r  r   r   r	   Ú
get_raw_hzä  s    zCPUID.get_raw_hz)N)rL   rM   rN   r   r™  r›  r¨  r¯  r±  ræ  rè  rí  rø  rû  r   r   r   r	   r–  ä  s   
#!  6:r–  c                  C   sª  ddl m}  tddƒ}i }|jt_|jt_z
tt	j
ƒ\}}|dkr\| d¡ | |d¡W S t|ƒ}|jr‚| d¡ | |d¡W S | ¡ }| |¡}| ¡ }| |¡}| ¡ }	t|	ƒ}	t|ƒ\}
}| ¡ d|t|
|ƒt|	dƒt|
|ƒt|	dƒ|d |d	 |d
 |d |d |d |d | |¡dœ}t|ƒ}| ¡  W nf tk
rœ } zFddlm} |ƒ }d dd„ |  d¡D ƒ¡d |_!| |d¡ W Y ¢S d}~X Y nX | |d¡S )zÍ
	Warning! This function has the potential to crash the Python runtime.
	Do not call it directly. Use the _get_cpu_info_from_cpuid function instead.
	It will safely call this function in another process.
	r   r   T©rÉ   rÊ   ú-Not running on X86_32 or X86_64. Skipping ...z"SELinux is enforcing. Skipping ...r-   ré  rë  rê  rö   r÷   rø   rù   )r‘   rí   rî   rï   rð   rñ   r—   ró   rô   rõ   rö   r÷   rø   rù   rú   r0   c                 S   s   g | ]}d   |¡‘qS r2   r4   r   r   r   r	   r
   8  s     z3_get_cpu_info_from_cpuid_actual.<locals>.<listcomp>r/   NF)"r   r   r   r   ÚsysrF   r   rG   rÓ   rO   r”   r;   rK   r–  r—  r±  rí  r¯  rè  rû  r–   rF  r¨  r-  r"  ræ  rw  r,   r8   r9   r1   r6   r7   r   )r   rt  rC   rÔ   rœ   Zcpuidr°  rì  rŽ   r—   rñ   r   rH   r1   r:   r   r   r	   Ú_get_cpu_info_from_cpuid_actualò  sZ    




î "rÿ  c                 C   s0   t j}t j}tƒ }|t _|t _|  t|ƒ¡ d S r
  )rþ  rF   rG   rÿ  Úputrà   )ÚqueueÚorig_stdoutÚorig_stderrr>   r   r   r	   Ú+_get_cpu_info_from_cpuid_subprocess_wrapper=  s    r  c               
   C   sx  t  d¡ ddlm} m} tjs.t  d¡ i S ttj	ƒ\}}|dkrRt  d¡ i S zðt
r|ƒ }| t|fd}| ¡  | ¡ rŒ| d¡ qx|jdkr¦t  d¡ i W S | ¡ r¾t  d	¡ i W S t| ¡ ƒ}dd
l}|jdd}d|kr |d r t  |d ¡ d|kr4|d r4tj d |d ¡¡ tj ¡  d|krh|d rhtj d |d ¡¡ tj ¡  d|kr‚t  d¡ i W S d|kr¾|d r¾t  d¡ t  |d ¡ t  d¡ i W S d|krâ|d rât  d¡ i W S d|ksö|d st  d¡ i W S |d W S n0tj}	tj}
tƒ }|	t_|
t_t  ¡  |d W S W n. tk
rr } zt  |¡ W 5 d
}~X Y nX i S )z 
	Returns the CPU info gathered by querying the X86 cpuid register in a new process.
	Returns {} on non X86 cpus.
	Returns {} if SELinux is in enforcing mode.
	z Tying to get info from CPUID ...r   )ÚProcessÚQueuezCan't CPUID. Skipping ...rü  rý  )ÚtargetÚargsz,Failed to run CPUID in process. Skipping ...z7Failed to get anything from CPUID process. Skipping ...Nr‚  )Úindentr>   rF   z{0}
rG   rI   z6Failed to get is_fail from CPUID process. Skipping ...rH   z
Failed ...rC   z:Failed to get return info from CPUID process. Skipping ...)rº   r+   r   r  r  rO   r¢   r;   rÓ   r”   ÚCAN_CALL_CPUID_IN_SUBPROCESSr  rH  Úis_aliver6   ÚexitcodeÚemptyrä   rw   ÚpprintÚPrettyPrinterr$   rþ  rF   r   r%   rG   rÿ  r,   r8   )r  r  rÔ   rœ   r  r®   r>   r  Úppr  r  rH   r   r   r	   Ú_get_cpu_info_from_cpuidH  st    













r  c               
   C   sÞ  t  d¡ z–t ¡ s&t  d¡ i W S t ¡ \} }| dkrJt  d¡ i W S td|dddd	d
ƒ}td|ddddddƒ}td|dddƒ}td|tddƒ}td|tddƒ}td|tddƒ}td|dddƒ}td|dddddƒ}	|	rì|	 ¡ }	|	 	¡  |s‚zxt
ddƒD ]h}
d |
¡}td|dd|ƒ}|rþdd„ | d¡D ƒ}t|ƒ}d|krþ|d dkrþd |krþ|d  } qhqþW n tk
r€   Y nX td|ddd!d"d#d$d%ƒ	}| ¡  d&¡ ¡ }t|ƒ}d'\}}zt|ƒ\}}W n tk
râ   Y nX ||t|ƒ|	||||d(œ}|r|d)kr|}d*}n|r(|d)kr,|}t||ƒd+krXt||ƒ|d,< t||ƒ|d-< t||ƒd+kr„t|d*ƒ|d.< t|d*ƒ|d/< t|dddd0œƒ}t  ¡  |W S  tk
rØ } zt  |¡ i  W Y ¢S d}~X Y nX dS )1z`
	Returns the CPU info gathered from /proc/cpuinfo.
	Returns {} if /proc/cpuinfo is not found.
	z(Tying to get info from /proc/cpuinfo ...z*Failed to find /proc/cpuinfo. Skipping ...r   z-Failed to run cat /proc/cpuinfo. Skipping ...FNr-   rV  z	vendor idÚvendorTz
model namerŠ   Ú	processorZuarchz
cache sizer1  rö   r÷   z
cpu familyZHardwarerú   ÚFeaturesúASEs implementedrÃ  zcache{0}c                 S   s   g | ]}|  d ¡‘qS r_  )r7   )r   r?  r   r   r	   r
   Õ  s     z3_get_cpu_info_from_proc_cpuinfo.<locals>.<listcomp>r³   ÚlevelÚ3r€  zcpu MHzz	cpu speedÚclockzcpu MHz dynamiczcpu MHz staticr%  rá   )rí   rî   rû   rú   r‘   rö   r÷   rø   r  r&  r  rï   rñ   rð   r—   ©rö   r÷   rø   )rº   r+   rO   rV   r;   r~   r  r  r7   rþ   Úranger   rê   r8   rc   r  rb   r–   rF  rA  r"  r-  rw  r,   )rz   r>   rV  rŽ   Ú
cache_sizerö   r÷   rø   Zhardwarerú   ÚirX  rÈ   r—   rñ   r   rC   rH   r   r   r	   Ú_get_cpu_info_from_proc_cpuinfo¬  s†    



÷
r  c               
   C   sH  t  d¡ z d\} }t ¡ s.t  d¡ i W S t ¡ \}}|dkrRt  d¡ i W S | d¡d  d¡d } |  d	¡}|d
ks€t‚| d|d …  	¡  
¡ } |  d¡r¨d}n|  d¡r¶d}|  d¡ d¡ 	¡ } t| ƒ} t| |ƒt| |ƒt| |ƒt| |ƒdœ}t|ƒ}t  ¡  |W S  tk
rB } zt  |¡ i  W Y ¢S d}~X Y nX dS )z^
	Returns the CPU info gathered from cpufreq-info.
	Returns {} if cpufreq-info is not found.
	z'Tying to get info from cpufreq-info ...rB  z)Failed to find cpufreq-info. Skipping ...r   z(Failed to run cpufreq-info. Skipping ...zcurrent CPU frequency isr    r/   r(  r1  r!   r%  r&  r$  r   )rï   rð   rñ   r—   N)rº   r+   rO   rg   r;   r   r7   rU  ÚAssertionErrorrb   rc   r  r  r–   r-  r"  rw  r,   r8   )r[  r   rz   r>   r  rC   rH   r   r   r	   Ú_get_cpu_info_from_cpufreq_info  s>    





ü
r  c               
   C   sL  t  d¡ zt ¡ s&t  d¡ i W S t ¡ \} }| dkrJt  d¡ i W S i }td|ddddƒ}|r¨t|ƒ}d	}t||ƒ|d
< t||ƒ|d< t	||ƒ|d< t	||ƒ|d< td|ddddƒ}|rt|ƒ}d	}t||ƒ|d
< t||ƒ|d< t	||ƒ|d< t	||ƒ|d< td|dddƒ}|r"||d< td|dddƒ}|rB||d< n(td|dddƒ}|rj| 
¡ sj||d< td|dddƒ}|r–| 
¡ r–t|ƒ|d< td|dddƒ}|rÂ| 
¡ rÂt|ƒ|d< td|dddƒ}	|	rî|	 
¡ rît|	ƒ|d< td|dddƒ}
|
r"|
 d¡d  ¡ }
t|
ƒ|d< td|dddƒ}|rV| d¡d  ¡ }t|ƒ|d< td|dddd ƒ}|rŒ| d¡d  ¡ }t|ƒ|d!< td|ddd"ƒ}|rÀ| d¡d  ¡ }t|ƒ|d#< td|ddd$d%d&ƒ}|rò| ¡ }| ¡  ||d$< t|dddd'œƒ}t  ¡  |W S  tk
rF } zt  |¡ i  W Y ¢S d}~X Y nX dS )(zP
	Returns the CPU info gathered from lscpu.
	Returns {} if lscpu is not found.
	z Tying to get info from lscpu ...z"Failed to find lscpu. Skipping ...r   z!Failed to run lscpu. Skipping ...FNzCPU max MHzzCPU MHzr&  rï   rð   rñ   r—   zCPU dynamic MHzzCPU static MHzz	Vendor IDr‘   z
Model namerî   ÚModelz
CPU familyrø   ÚSteppingrö   r÷   z	L1d cacheú(rü   z	L1i cacherý   zL2 cachez	L2d cacheró   zL3 cacherû   rú   r  r  r  )rº   r+   rO   rs   r;   rr   r  r–   r-  r"  r  r  r7   rb   rA  rþ   rw  r,   r8   )rz   r>   rC   Znew_hzr   rV  rY  rø   rö   r÷   rü   rý   ró   rû   rú   rH   r   r   r	   Ú_get_cpu_info_from_lscpu;  sŽ    




r#  c                  C   s‚   t  d¡ ttjƒ\} }| dkr.t  d¡ i S t ¡ sDt  d¡ i S t ¡ \}}|dks`|dkrnt  d¡ i S t|ƒ}t  	¡  |S )zr
	Returns the CPU info gathered from dmesg.
	Returns {} if dmesg is not found or does not have the desired info.
	z$Tying to get info from the dmesg ...)rÎ   zRunning on S390X. Skipping ...z"Failed to find dmesg. Skipping ...Nr   z&Failed to run "dmesg -a". Skipping ...)
rº   r+   rÓ   rO   r”   r;   r[   r   ri  r,   )rÔ   rœ   rz   r>   rC   r   r   r	   Ú_get_cpu_info_from_dmesgœ  s    



r$  c                  C   s   t  d¡ z¸t ¡ s&t  d¡ i W S t ¡ \} }|dksB| dkrRt  d¡ i W S | d¡d  ¡ }dd	„ |D ƒ}d
 |¡}t	|dd… dƒ}t	|dd… dƒ}t
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒt
|dƒd œ}d!d	„ | ¡ D ƒ}| ¡  d"|i}t|ƒ}t  ¡  |W S  tk
rú } zt  |¡ i  W Y ¢S d}~X Y nX dS )#z¬
	Returns the CPU info gathered from lsprop /proc/device-tree/cpus/*/ibm,pa-features
	Returns {} if lsprop is not found or ibm,pa-features does not have the desired info.
	z!Tying to get info from lsprop ...z#Failed to find lsprop. Skipping ...Nr   zEFailed to glob /proc/device-tree/cpus/*/ibm,pa-features. Skipping ...zibm,pa-featuresr    c                 S   s   g | ]}|t d ƒkr|‘qS )Z0123456789abcfed)ré   ©r   Úsr   r   r	   r
   Ò  s      z6_get_cpu_info_from_ibm_pa_features.<locals>.<listcomp>r-   r¡  rP  r!   r<   rQ   r&  r²  r   rÃ  r³  r«  r´  rµ  rª  r¶  r¸  r¹  rº  r»  r¢  r¼  )ZmmurÄ  Zslbr”  ZdabrÚneZwtrZmcrZdsisrZlpÚriZdabrxZsprg3Zrislbr  Zvpmzdss_2.05ZdarZpprzdss_2.02zdss_2.06Zlsd_in_dscrZugr_in_dscrzsso_2.06ÚleZcfarZebzlsq_2.07zdss_2.07c                 S   s   g | ]\}}|r|‘qS r   r   rJ  r   r   r	   r
   -  s      rú   )rº   r+   rO   ru   r;   r‰   r7   rc   r6   r  rq  rë   rþ   rw  r,   r8   )rz   r>   rÈ   r  r  rú   rC   rH   r   r   r	   Ú"_get_cpu_info_from_ibm_pa_features¼  sn    



	
ÂS ÿ
r*  c                  C   s^   t  d¡ t ¡ s t  d¡ i S t ¡ \} }|dks<| dkrJt  d¡ i S t|ƒ}t  ¡  |S )z€
	Returns the CPU info gathered from /var/run/dmesg.boot.
	Returns {} if dmesg is not found or does not have the desired info.
	z6Tying to get info from the /var/run/dmesg.boot log ...z5Failed to find /var/run/dmesg.boot file. Skipping ...Nr   z5Failed to run "cat /var/run/dmesg.boot". Skipping ...)rº   r+   rO   re   r;   r‚   ri  r,   )rz   r>   rC   r   r   r	   Ú)_get_cpu_info_from_cat_var_run_dmesg_boot;  s    


r+  c                  C   s¾  t  d¡ zvt ¡ s&t  d¡ i W S t ¡ \} }|dksB| dkrRt  d¡ i W S td|dddƒ}td|ddd	ƒ}td|tdd
ƒ}td|tddƒ}td|tddƒ}td|tddƒ}td|dddƒ ¡  	¡ }| 
td|dddƒ ¡  	¡ ¡ | 
td|dddƒ ¡  	¡ ¡ | ¡  t|ƒ\}	}
td|dddƒ}t|ƒ}||t|	|
ƒt|dƒt|	|
ƒt|dƒt|ƒd ||||dœ}t|ƒ}t  ¡  |W S  tk
r¸ } zt  |¡ i  W Y ¢S d}~X Y nX dS )zR
	Returns the CPU info gathered from sysctl.
	Returns {} if sysctl is not found.
	z!Tying to get info from sysctl ...z#Failed to find sysctl. Skipping ...Nr   z@Failed to run "sysctl machdep.cpu hw.cpufrequency". Skipping ...Fzmachdep.cpu.vendorTzmachdep.cpu.brand_stringzmachdep.cpu.cache.sizezmachdep.cpu.steppingzmachdep.cpu.modelzmachdep.cpu.familyr-   zmachdep.cpu.featureszmachdep.cpu.leaf7_featureszmachdep.cpu.extfeaturesrƒ   r7  ©r‘   rî   rï   rð   rñ   r—   ró   rö   r÷   rø   rú   )rº   r+   rO   rk   r;   r„   r  r  rc   r7   Úextendrþ   rF  r–   r-  r"  rw  r,   r8   )rz   r>   rV  rŽ   r  rö   r÷   rø   rú   rñ   r   r—   rC   rH   r   r   r	   Ú_get_cpu_info_from_sysctlS  sP    



ò
r.  c                  C   s   t ƒ } |  tƒ ¡ | S )úT
	Returns the CPU info gathered from sysinfo.
	Returns {} if sysinfo is not found.
	)Ú_get_cpu_info_from_sysinfo_v1ÚupdateÚ_get_cpu_info_from_sysinfo_v2)rC   r   r   r	   Ú_get_cpu_info_from_sysinfo“  s    r3  c                  C   s¶  t  d¡ znt ¡ s&t  d¡ i W S t ¡ \} }|dksB| dkrRt  d¡ i W S d}| d¡d  d	¡d  ¡ }d}t| d
¡d  d¡d  ¡ ƒ}t| d¡d  d¡d  ¡ ƒ}t| d¡d  d¡d  ¡ ƒ}g }| d¡D ]0}	|	 	d¡rä|	 ¡  
¡  ¡ D ]}
| |
¡ qqä| ¡  t|ƒ\}}|}||t||ƒt||ƒt||ƒt||ƒt|ƒ||||dœ}t|ƒ}t  ¡  |W S  tk
r° } zt  |¡ i  W Y ¢S d}~X Y nX dS )r/  z,Tying to get info from sysinfo version 1 ...ú$Failed to find sysinfo. Skipping ...Nr   ú*Failed to run "sysinfo -cpu". Skipping ...r-   ú	CPU #0: "r    ú"
z, stepping r  z, model z	, family r/   ú		r,  )rº   r+   rO   rq   r;   r‡   r7   rb   r  rs  rc   r«   rþ   rF  r-  r"  r6  rw  r,   r8   )rz   r>   rV  rŽ   r  rö   r÷   rø   rú   r*   rh  rñ   r   r—   rC   rH   r   r   r	   r0    sR    


   
ò
r0  c                  C   s4  t  d¡ zìt ¡ s&t  d¡ i W S t ¡ \} }|dksB| dkrRt  d¡ i W S d}| d¡d  d	¡d  ¡ }d}| d
¡d  d¡d  ¡ }t| d¡d  d¡d  ¡ ƒ}t| d¡d  d¡d  ¡ ƒ}t| d¡d  d¡d  ¡ ƒ}dd„ }	|	| d¡d ƒ|	| d¡d ƒ |	| d¡d ƒ }
|
 	¡  dd„ | d¡D ƒ}|d  d¡d  ¡  
¡ }| d¡ d¡ ¡ }t|ƒ}|}d}| d¡rœd}n| d¡r¬d}||t||ƒt||ƒt||ƒt||ƒt|ƒ||||
dœ}t|ƒ}t  ¡  |W S  tk
r. } zt  |¡ i  W Y ¢S d}~X Y nX dS )r/  z,Tying to get info from sysinfo version 2 ...r4  Nr   r5  r-   r6  r    r7  z
Signature:r/   z	stepping r  zmodel zfamily c                 S   sZ   g }|   d¡dd … D ]>}| d¡s2| d¡s2 qV| ¡  ¡   d¡D ]}| |¡ qDq|S )Nr/   r    z                r8  r³   )r7   rs  rb   rc   r«   )r>   r  r*   r?  r   r   r	   Úget_subsection_flagsý  s     z;_get_cpu_info_from_sysinfo_v2.<locals>.get_subsection_flagsz
Features: z Extended Features (0x00000001): z Extended Features (0x80000001): c                 S   s   g | ]}|r|‘qS r   r   r   r   r   r	   r
   	  s      z1_get_cpu_info_from_sysinfo_v2.<locals>.<listcomp>zrunning at r%  r$  r&  r   r,  )rº   r+   rO   rq   r;   r‡   r7   rb   r  rþ   rc   r  r–   r  r-  r"  r6  rw  r,   r8   )rz   r>   rV  rŽ   r  Ú	signaturerö   r÷   rø   r9  rú   rd  Zraw_hzrñ   r—   r   rC   rH   r   r   r	   r2  Þ  sf    


   ÿþò
r2  c                  C   sH  t  d¡ z tjrt ¡ s,t  d¡ i W S t ¡ \} }|dksH| dkrXt  d¡ i W S | d¡}dd„ |D ƒ}d	d
„ |D ƒ}| d¡}t	|ƒ\}}| d¡}d}|r®t
|ƒ}| d¡}|rÈt|ƒd }| d¡}	|	rât|	ƒd }	d\}
}}| d¡pþ| d¡}| d¡}d|krF| d¡t|ƒd k rF| d¡}t||d  ƒ}
d|kr‚| d¡t|ƒd k r‚| d¡}t||d  ƒ}d|kr¾| d¡t|ƒd k r¾| d¡}t||d  ƒ}| d¡|t||ƒt||ƒt||ƒt||ƒ||	|||
dœ}t|ƒ}t  ¡  |W S  tk
rB } zt  |¡ i  W Y ¢S d}~X Y nX dS )zd
	Returns the CPU info gathered from WMI.
	Returns {} if not on Windows, or wmic is not installed.
	zTying to get info from wmic ...z4Failed to find WMIC, or not on Windows. Skipping ...Nr   z Failed to run wmic. Skipping ...r/   c                 S   s"   g | ]}d |kr|  ¡  d ¡‘qS r_  )r  r7   r%  r   r   r	   r
   D	  s      z+_get_cpu_info_from_wmic.<locals>.<listcomp>c                 S   s   i | ]\}}|r||“qS r   r   rJ  r   r   r	   rè   E	  s       z+_get_cpu_info_from_wmic.<locals>.<dictcomp>ÚNameZCurrentClockSpeedr&  ZL2CacheSizer7  ZL3CacheSize)r-   r-   r-   ÚDescriptionZCaptionr³   ÚFamilyr    r   r!  ZManufacturer)r‘   rî   rï   rð   rñ   r—   ró   rû   rö   r÷   rø   )rº   r+   rO   rŸ   r{   r;   r‹   r7   rw   rF  r–   r  r  rY   r-  r"  rw  r,   r8   )rz   r>   rÈ   rŽ   rñ   Zscale_advertisedr—   Zscale_actualró   rû   rø   r÷   rö   ÚdescriptionÚentriesr  rC   rH   r   r   r	   Ú_get_cpu_info_from_wmic0	  sl    









"
"
"
ò
r@  c                     sà  t  d¡ z˜tjs$t  d¡ i W S t ¡  ¡ } t ¡ }t ¡ }t	|ƒ\}}t 
¡ }t|ƒ}t| ƒ\}}|dkr|d}t|ƒ}t ¡ ‰ ‡ fdd„}|dƒ|dƒ|d	ƒ|d
ƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|dƒ|d ƒ|d!ƒ|d"ƒ|d#ƒd$œ}	d%d&„ |	 ¡ D ƒ}	|	 ¡  || t||ƒt|dƒt||ƒt|dƒ|	d'œ}
t|
ƒ}
t  ¡  |
W S  tk
rÚ } zt  |¡ i  W Y ¢S d(}~X Y nX d(S ))z[
	Returns the CPU info gathered from the Windows Registry.
	Returns {} if not on Windows.
	z+Tying to get info from Windows registry ...z$Not running on Windows. Skipping ...r  r&  c                    s   d| ? }|ˆ @ dk}|S )Nl        r   r   )rn  ro  r  r™   r   r	   rp  «	  s    z+_get_cpu_info_from_registry.<locals>.is_setr   r    r!   r<   r‚  rQ   r²  r¡  r   rÃ  r³  r«  r´  rµ  rª  rP  r¶  r·  r¸  r¹  rº  r»  r¢  r¼  r½  r¾  rÀ  rÁ  rÂ  )rÄ  rÅ  rÆ  rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  ZsepamdrÎ  rÏ  rÐ  rÑ  rÒ  rÓ  rÔ  ÚserialrÕ  rÖ  r×  rØ  rÙ  rÚ  rÛ  rÜ  rÝ  rÞ  rå  c                 S   s   g | ]\}}|r|‘qS r   r   rJ  r   r   r	   r
   ×	  s      z/_get_cpu_info_from_registry.<locals>.<listcomp>)r‘   rî   rï   rð   rñ   r—   rú   N)rº   r+   rO   rŸ   r;   r   rb   r’   r•   rÓ   r˜   r–   rF  rš   rë   rþ   r-  r"  rw  r,   r8   )rŽ   rV  r”   rÔ   rœ   r—   rñ   r   rp  rú   rC   rH   r   r™   r	   Ú_get_cpu_info_from_registry„	  s€    

	à$÷
rB  c                  C   s  t  d¡ zÊt ¡ rt ¡ s.t  d¡ i W S t ¡ \} }|dksJ| dkrZt  d¡ i W S t ¡ \} }|dksv| dkr†t  d¡ i W S | d¡d  d	¡d  	¡ }| d
¡d  d	¡d  	¡ }t
| d¡d  d	¡d  	¡ ƒ}t
| d¡d  d	¡d  	¡ ƒ}t
| d¡d  d	¡d  	¡ ƒ}| 	¡  d	¡d  	¡  ¡  ¡ }| ¡  d}	| d¡d  d	¡d  	¡ }
t|
ƒ}
| d¡d  d	¡d  	¡ }t|ƒ}||t|
|	ƒt|dƒt|
|	ƒt|dƒ||||dœ
}t|ƒ}t  ¡  |W S  tk
r } zt  |¡ i  W Y ¢S d}~X Y nX dS )zh
	Returns the CPU info gathered from isainfo and kstat.
	Returns {} if isainfo or kstat are not found.
	z Tying to get info from kstat ...z,Failed to find isinfo or kstat. Skipping ...Nr   z)Failed to run "isainfo -vb". Skipping ...z/Failed to run "kstat -m cpu_info". Skipping ...z	vendor_id r    r/   z	brand z
	stepping z	model z	family r1  r&  z	clock_MHz z	current_clock_Hz )
r‘   rî   rï   rð   rñ   r—   rö   r÷   rø   rú   )rº   r+   rO   rm   ro   r;   r…   r†   r7   rb   r  rc   rþ   r–   r-  r"  rw  r,   r8   )rz   Zflag_outputrn   rV  rŽ   rö   r÷   rø   rú   r   rñ   r—   rC   rH   r   r   r	   Ú_get_cpu_info_from_kstatí	  sT    



   ô
rC  c               
   C   s4  t  d¡ zîtj d¡d } d\}}}|  d¡}d|krh| d¡t|ƒd k rh| d¡}t||d  ƒ}d|kr | d¡t|ƒd k r | d¡}t||d  ƒ}d	|krØ| d	¡t|ƒd k rØ| d	¡}t||d  ƒ}|||d
œ}t|ƒ}t  	¡  |W S  t
k
r. } zt  |¡ i  W Y ¢S d }~X Y nX d S )Nz)Tying to get info from platform.uname ...r  r   )NNNr³   r=  r    r   r!  )rø   r÷   rö   )rº   r+   rO   r¡   r7   r  rY   r  rw  r,   r8   r;   )rd   rø   r÷   rö   r?  r  rC   rH   r   r   r	   Ú!_get_cpu_info_from_platform_uname1
  s0    





ý
rD  c                  C   s€  t  d¡ ttjƒ\} }dddœ tj¡p,d}djtj	Ž }d ||¡}|t
t| |tjtjdœ}t  d	 |d
 ¡¡ t  d |d ¡¡ t  d |d ¡¡ t  d |d ¡¡ t  d |d ¡¡ t  d |d ¡¡ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t|tƒ ƒ t  d¡ |S )zo
	Returns the CPU info by using the best sources of information for your OS.
	Returns {} if nothing is found.
	zP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z32 bitz64 bit)iÿÿÿl   ÿÿÿÿ zunknown bitsz{0}.{1}.{2}.{3}.{4}z	{0} ({1}))Úpython_versionÚcpuinfo_versionÚcpuinfo_version_stringrÔ   rœ   rò   r”   zpython_version: {0}rE  zcpuinfo_version: {0}rF  z	arch: {0}rÔ   z	bits: {0}rœ   z
count: {0}rò   zarch_string_raw: {0}r”   )rº   r$   rÓ   rO   r”   rw   rþ  Úmaxsizer   Úversion_infoÚCPUINFO_VERSIONÚCPUINFO_VERSION_STRINGrž   r   r@  rB  r  r  r#  r.  rC  r$  r+  r*  r3  r  rD  )rÔ   rœ   Zfriendly_maxsizeZfriendly_versionÚPYTHON_VERSIONrC   r   r   r	   Ú_get_cpu_info_internalS
  sD    
ù

rM  c                  C   sŠ   ddl } d}ttddƒr4tƒ }|  |¡}d |¡}nRddlm}m} tj	t
dg}|||||d}| ¡ d }|jdkrzd	S |jd
d}|S )zs
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a json string
	r   NÚfrozenFr  r°   ú--jsonr´   z{}r¶   r·   )ÚjsonÚgetattrrþ  rM  rÙ   r   r¹   r±   r²   Ú
executableÚ__file__r¼   rz   r½   )rP  r>   rC   r±   r²   r¾   r¿   r   r   r	   Úget_cpu_info_jsonŸ
  s    

rT  c                  C   s    ddl } tƒ }| j|td}|S )zl
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a dict
	r   N)Úobject_hook)rP  rT  rã   ræ   )rP  r>   r   r   r	   Úget_cpu_info¿
  s    rV  c               
   C   s  ddl m}  dd l}| dd}|jdddd |jd	dd
d |jdddd | ¡ }t|jdƒaz
tƒ  W n@ t	k
r¬ } z"t
j t|ƒd ¡ t
 d¡ W 5 d }~X Y nX tƒ }|sÎt
j d¡ t
 d¡ |jræt| |¡ƒ n(|jrøttƒ ntd | dd¡¡ƒ td | dd¡¡ƒ td | dd¡¡ƒ td | dd¡¡ƒ td | dd¡¡ƒ td | dd¡¡ƒ td | dd¡¡ƒ td  | d!d¡¡ƒ td" | d#d¡¡ƒ td$ | d%d¡¡ƒ td& | d'd¡¡ƒ td( | d)d¡¡ƒ td* | d+d¡¡ƒ td, | d-d¡¡ƒ td. | d/d¡¡ƒ td0 | d1d¡¡ƒ td2 | d3d¡¡ƒ td4 | d5d¡¡ƒ td6 | d7d¡¡ƒ td8 | d9d¡¡ƒ td: | d;d¡¡ƒ td< | d=d¡¡ƒ td> | d?d¡¡ƒ td@ dA | dBd¡¡¡ƒ d S )CNr   )ÚArgumentParserzGets CPU info with pure Python)r>  rO  Ú
store_truezReturn the info in JSON format)ÚactionÚhelpz	--versionz Return the version of py-cpuinfoz--tracez/Traces code paths used to find CPU info to fileFr/   r    zFailed to find cpu info
zPython Version: {0}rE  r-   zCpuinfo Version: {0}rG  zVendor ID Raw: {0}r‘   zHardware Raw: {0}rí   zBrand Raw: {0}rî   zHz Advertised Friendly: {0}rï   zHz Actual Friendly: {0}rð   zHz Advertised: {0}rñ   zHz Actual: {0}r—   z	Arch: {0}rÔ   z	Bits: {0}rœ   z
Count: {0}rò   zArch String Raw: {0}r”   zL1 Data Cache Size: {0}rü   zL1 Instruction Cache Size: {0}rý   zL2 Cache Size: {0}ró   zL2 Cache Line Size: {0}rô   zL2 Cache Associativity: {0}rõ   zL3 Cache Size: {0}rû   zStepping: {0}rö   z
Model: {0}r÷   zFamily: {0}rø   zProcessor Type: {0}rù   z
Flags: {0}z, rú   )ÚargparserW  rP  Úadd_argumentÚ
parse_argsr   rt  rº   rÕ   r8   rþ  rG   r$   r   ÚexitrM  ÚprintrÙ   ÚversionrK  r   rw   r6   )rW  rP  Úparserr  rH   rC   r   r   r	   ÚmainÎ
  sZ    


rb  Ú__main__F)N)<rJ  r6   rK  rS   rþ  r`   r   rŠ  r
  rº   Úobjectr   rO   rZ   ry   r   rÕ   rà   rä   ræ   r   r	  r  r–   r"  r'  r-  r6  rA  rF  r\  ri  rÓ   rq  ru  rw  rx  r–  rÿ  r  r  r  r  r#  r$  r*  r+  r.  r3  r0  r2  r@  rB  rC  rD  rM  rT  rV  rb  rL   r   r   r   r	   Ú<module>   s€   { 

	"4_9$X    Kd`/a @
ARTiD"L 9

