Chris@87: #!/usr/bin/env python Chris@87: """ Chris@87: cpuinfo Chris@87: Chris@87: Copyright 2002 Pearu Peterson all rights reserved, Chris@87: Pearu Peterson Chris@87: Permission to use, modify, and distribute this software is given under the Chris@87: terms of the NumPy (BSD style) license. See LICENSE.txt that came with Chris@87: this distribution for specifics. Chris@87: Chris@87: NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. Chris@87: Pearu Peterson Chris@87: Chris@87: """ Chris@87: from __future__ import division, absolute_import, print_function Chris@87: Chris@87: __all__ = ['cpu'] Chris@87: Chris@87: import sys, re, types Chris@87: import os Chris@87: Chris@87: if sys.version_info[0] >= 3: Chris@87: from subprocess import getstatusoutput Chris@87: else: Chris@87: from commands import getstatusoutput Chris@87: Chris@87: import warnings Chris@87: import platform Chris@87: Chris@87: from numpy.distutils.compat import get_exception Chris@87: Chris@87: def getoutput(cmd, successful_status=(0,), stacklevel=1): Chris@87: try: Chris@87: status, output = getstatusoutput(cmd) Chris@87: except EnvironmentError: Chris@87: e = get_exception() Chris@87: warnings.warn(str(e), UserWarning, stacklevel=stacklevel) Chris@87: return False, output Chris@87: if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status: Chris@87: return True, output Chris@87: return False, output Chris@87: Chris@87: def command_info(successful_status=(0,), stacklevel=1, **kw): Chris@87: info = {} Chris@87: for key in kw: Chris@87: ok, output = getoutput(kw[key], successful_status=successful_status, Chris@87: stacklevel=stacklevel+1) Chris@87: if ok: Chris@87: info[key] = output.strip() Chris@87: return info Chris@87: Chris@87: def command_by_line(cmd, successful_status=(0,), stacklevel=1): Chris@87: ok, output = getoutput(cmd, successful_status=successful_status, Chris@87: stacklevel=stacklevel+1) Chris@87: if not ok: Chris@87: return Chris@87: for line in output.splitlines(): Chris@87: yield line.strip() Chris@87: Chris@87: def key_value_from_command(cmd, sep, successful_status=(0,), Chris@87: stacklevel=1): Chris@87: d = {} Chris@87: for line in command_by_line(cmd, successful_status=successful_status, Chris@87: stacklevel=stacklevel+1): Chris@87: l = [s.strip() for s in line.split(sep, 1)] Chris@87: if len(l) == 2: Chris@87: d[l[0]] = l[1] Chris@87: return d Chris@87: Chris@87: class CPUInfoBase(object): Chris@87: """Holds CPU information and provides methods for requiring Chris@87: the availability of various CPU features. Chris@87: """ Chris@87: Chris@87: def _try_call(self, func): Chris@87: try: Chris@87: return func() Chris@87: except: Chris@87: pass Chris@87: Chris@87: def __getattr__(self, name): Chris@87: if not name.startswith('_'): Chris@87: if hasattr(self, '_'+name): Chris@87: attr = getattr(self, '_'+name) Chris@87: if isinstance(attr, types.MethodType): Chris@87: return lambda func=self._try_call,attr=attr : func(attr) Chris@87: else: Chris@87: return lambda : None Chris@87: raise AttributeError(name) Chris@87: Chris@87: def _getNCPUs(self): Chris@87: return 1 Chris@87: Chris@87: def __get_nbits(self): Chris@87: abits = platform.architecture()[0] Chris@87: nbits = re.compile('(\d+)bit').search(abits).group(1) Chris@87: return nbits Chris@87: Chris@87: def _is_32bit(self): Chris@87: return self.__get_nbits() == '32' Chris@87: Chris@87: def _is_64bit(self): Chris@87: return self.__get_nbits() == '64' Chris@87: Chris@87: class LinuxCPUInfo(CPUInfoBase): Chris@87: Chris@87: info = None Chris@87: Chris@87: def __init__(self): Chris@87: if self.info is not None: Chris@87: return Chris@87: info = [ {} ] Chris@87: ok, output = getoutput('uname -m') Chris@87: if ok: Chris@87: info[0]['uname_m'] = output.strip() Chris@87: try: Chris@87: fo = open('/proc/cpuinfo') Chris@87: except EnvironmentError: Chris@87: e = get_exception() Chris@87: warnings.warn(str(e), UserWarning) Chris@87: else: Chris@87: for line in fo: Chris@87: name_value = [s.strip() for s in line.split(':', 1)] Chris@87: if len(name_value) != 2: Chris@87: continue Chris@87: name, value = name_value Chris@87: if not info or name in info[-1]: # next processor Chris@87: info.append({}) Chris@87: info[-1][name] = value Chris@87: fo.close() Chris@87: self.__class__.info = info Chris@87: Chris@87: def _not_impl(self): pass Chris@87: Chris@87: # Athlon Chris@87: Chris@87: def _is_AMD(self): Chris@87: return self.info[0]['vendor_id']=='AuthenticAMD' Chris@87: Chris@87: def _is_AthlonK6_2(self): Chris@87: return self._is_AMD() and self.info[0]['model'] == '2' Chris@87: Chris@87: def _is_AthlonK6_3(self): Chris@87: return self._is_AMD() and self.info[0]['model'] == '3' Chris@87: Chris@87: def _is_AthlonK6(self): Chris@87: return re.match(r'.*?AMD-K6', self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_AthlonK7(self): Chris@87: return re.match(r'.*?AMD-K7', self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_AthlonMP(self): Chris@87: return re.match(r'.*?Athlon\(tm\) MP\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_AMD64(self): Chris@87: return self.is_AMD() and self.info[0]['family'] == '15' Chris@87: Chris@87: def _is_Athlon64(self): Chris@87: return re.match(r'.*?Athlon\(tm\) 64\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_AthlonHX(self): Chris@87: return re.match(r'.*?Athlon HX\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_Opteron(self): Chris@87: return re.match(r'.*?Opteron\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_Hammer(self): Chris@87: return re.match(r'.*?Hammer\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: # Alpha Chris@87: Chris@87: def _is_Alpha(self): Chris@87: return self.info[0]['cpu']=='Alpha' Chris@87: Chris@87: def _is_EV4(self): Chris@87: return self.is_Alpha() and self.info[0]['cpu model'] == 'EV4' Chris@87: Chris@87: def _is_EV5(self): Chris@87: return self.is_Alpha() and self.info[0]['cpu model'] == 'EV5' Chris@87: Chris@87: def _is_EV56(self): Chris@87: return self.is_Alpha() and self.info[0]['cpu model'] == 'EV56' Chris@87: Chris@87: def _is_PCA56(self): Chris@87: return self.is_Alpha() and self.info[0]['cpu model'] == 'PCA56' Chris@87: Chris@87: # Intel Chris@87: Chris@87: #XXX Chris@87: _is_i386 = _not_impl Chris@87: Chris@87: def _is_Intel(self): Chris@87: return self.info[0]['vendor_id']=='GenuineIntel' Chris@87: Chris@87: def _is_i486(self): Chris@87: return self.info[0]['cpu']=='i486' Chris@87: Chris@87: def _is_i586(self): Chris@87: return self.is_Intel() and self.info[0]['cpu family'] == '5' Chris@87: Chris@87: def _is_i686(self): Chris@87: return self.is_Intel() and self.info[0]['cpu family'] == '6' Chris@87: Chris@87: def _is_Celeron(self): Chris@87: return re.match(r'.*?Celeron', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_Pentium(self): Chris@87: return re.match(r'.*?Pentium', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_PentiumII(self): Chris@87: return re.match(r'.*?Pentium.*?II\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_PentiumPro(self): Chris@87: return re.match(r'.*?PentiumPro\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_PentiumMMX(self): Chris@87: return re.match(r'.*?Pentium.*?MMX\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_PentiumIII(self): Chris@87: return re.match(r'.*?Pentium.*?III\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_PentiumIV(self): Chris@87: return re.match(r'.*?Pentium.*?(IV|4)\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_PentiumM(self): Chris@87: return re.match(r'.*?Pentium.*?M\b', Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_Prescott(self): Chris@87: return self.is_PentiumIV() and self.has_sse3() Chris@87: Chris@87: def _is_Nocona(self): Chris@87: return self.is_Intel() \ Chris@87: and (self.info[0]['cpu family'] == '6' \ Chris@87: or self.info[0]['cpu family'] == '15' ) \ Chris@87: and (self.has_sse3() and not self.has_ssse3())\ Chris@87: and re.match(r'.*?\blm\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _is_Core2(self): Chris@87: return self.is_64bit() and self.is_Intel() and \ Chris@87: re.match(r'.*?Core\(TM\)2\b', \ Chris@87: self.info[0]['model name']) is not None Chris@87: Chris@87: def _is_Itanium(self): Chris@87: return re.match(r'.*?Itanium\b', Chris@87: self.info[0]['family']) is not None Chris@87: Chris@87: def _is_XEON(self): Chris@87: return re.match(r'.*?XEON\b', Chris@87: self.info[0]['model name'], re.IGNORECASE) is not None Chris@87: Chris@87: _is_Xeon = _is_XEON Chris@87: Chris@87: # Varia Chris@87: Chris@87: def _is_singleCPU(self): Chris@87: return len(self.info) == 1 Chris@87: Chris@87: def _getNCPUs(self): Chris@87: return len(self.info) Chris@87: Chris@87: def _has_fdiv_bug(self): Chris@87: return self.info[0]['fdiv_bug']=='yes' Chris@87: Chris@87: def _has_f00f_bug(self): Chris@87: return self.info[0]['f00f_bug']=='yes' Chris@87: Chris@87: def _has_mmx(self): Chris@87: return re.match(r'.*?\bmmx\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _has_sse(self): Chris@87: return re.match(r'.*?\bsse\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _has_sse2(self): Chris@87: return re.match(r'.*?\bsse2\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _has_sse3(self): Chris@87: return re.match(r'.*?\bpni\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _has_ssse3(self): Chris@87: return re.match(r'.*?\bssse3\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _has_3dnow(self): Chris@87: return re.match(r'.*?\b3dnow\b', self.info[0]['flags']) is not None Chris@87: Chris@87: def _has_3dnowext(self): Chris@87: return re.match(r'.*?\b3dnowext\b', self.info[0]['flags']) is not None Chris@87: Chris@87: class IRIXCPUInfo(CPUInfoBase): Chris@87: info = None Chris@87: Chris@87: def __init__(self): Chris@87: if self.info is not None: Chris@87: return Chris@87: info = key_value_from_command('sysconf', sep=' ', Chris@87: successful_status=(0, 1)) Chris@87: self.__class__.info = info Chris@87: Chris@87: def _not_impl(self): pass Chris@87: Chris@87: def _is_singleCPU(self): Chris@87: return self.info.get('NUM_PROCESSORS') == '1' Chris@87: Chris@87: def _getNCPUs(self): Chris@87: return int(self.info.get('NUM_PROCESSORS', 1)) Chris@87: Chris@87: def __cputype(self, n): Chris@87: return self.info.get('PROCESSORS').split()[0].lower() == 'r%s' % (n) Chris@87: def _is_r2000(self): return self.__cputype(2000) Chris@87: def _is_r3000(self): return self.__cputype(3000) Chris@87: def _is_r3900(self): return self.__cputype(3900) Chris@87: def _is_r4000(self): return self.__cputype(4000) Chris@87: def _is_r4100(self): return self.__cputype(4100) Chris@87: def _is_r4300(self): return self.__cputype(4300) Chris@87: def _is_r4400(self): return self.__cputype(4400) Chris@87: def _is_r4600(self): return self.__cputype(4600) Chris@87: def _is_r4650(self): return self.__cputype(4650) Chris@87: def _is_r5000(self): return self.__cputype(5000) Chris@87: def _is_r6000(self): return self.__cputype(6000) Chris@87: def _is_r8000(self): return self.__cputype(8000) Chris@87: def _is_r10000(self): return self.__cputype(10000) Chris@87: def _is_r12000(self): return self.__cputype(12000) Chris@87: def _is_rorion(self): return self.__cputype('orion') Chris@87: Chris@87: def get_ip(self): Chris@87: try: return self.info.get('MACHINE') Chris@87: except: pass Chris@87: def __machine(self, n): Chris@87: return self.info.get('MACHINE').lower() == 'ip%s' % (n) Chris@87: def _is_IP19(self): return self.__machine(19) Chris@87: def _is_IP20(self): return self.__machine(20) Chris@87: def _is_IP21(self): return self.__machine(21) Chris@87: def _is_IP22(self): return self.__machine(22) Chris@87: def _is_IP22_4k(self): return self.__machine(22) and self._is_r4000() Chris@87: def _is_IP22_5k(self): return self.__machine(22) and self._is_r5000() Chris@87: def _is_IP24(self): return self.__machine(24) Chris@87: def _is_IP25(self): return self.__machine(25) Chris@87: def _is_IP26(self): return self.__machine(26) Chris@87: def _is_IP27(self): return self.__machine(27) Chris@87: def _is_IP28(self): return self.__machine(28) Chris@87: def _is_IP30(self): return self.__machine(30) Chris@87: def _is_IP32(self): return self.__machine(32) Chris@87: def _is_IP32_5k(self): return self.__machine(32) and self._is_r5000() Chris@87: def _is_IP32_10k(self): return self.__machine(32) and self._is_r10000() Chris@87: Chris@87: Chris@87: class DarwinCPUInfo(CPUInfoBase): Chris@87: info = None Chris@87: Chris@87: def __init__(self): Chris@87: if self.info is not None: Chris@87: return Chris@87: info = command_info(arch='arch', Chris@87: machine='machine') Chris@87: info['sysctl_hw'] = key_value_from_command('sysctl hw', sep='=') Chris@87: self.__class__.info = info Chris@87: Chris@87: def _not_impl(self): pass Chris@87: Chris@87: def _getNCPUs(self): Chris@87: return int(self.info['sysctl_hw'].get('hw.ncpu', 1)) Chris@87: Chris@87: def _is_Power_Macintosh(self): Chris@87: return self.info['sysctl_hw']['hw.machine']=='Power Macintosh' Chris@87: Chris@87: def _is_i386(self): Chris@87: return self.info['arch']=='i386' Chris@87: def _is_ppc(self): Chris@87: return self.info['arch']=='ppc' Chris@87: Chris@87: def __machine(self, n): Chris@87: return self.info['machine'] == 'ppc%s'%n Chris@87: def _is_ppc601(self): return self.__machine(601) Chris@87: def _is_ppc602(self): return self.__machine(602) Chris@87: def _is_ppc603(self): return self.__machine(603) Chris@87: def _is_ppc603e(self): return self.__machine('603e') Chris@87: def _is_ppc604(self): return self.__machine(604) Chris@87: def _is_ppc604e(self): return self.__machine('604e') Chris@87: def _is_ppc620(self): return self.__machine(620) Chris@87: def _is_ppc630(self): return self.__machine(630) Chris@87: def _is_ppc740(self): return self.__machine(740) Chris@87: def _is_ppc7400(self): return self.__machine(7400) Chris@87: def _is_ppc7450(self): return self.__machine(7450) Chris@87: def _is_ppc750(self): return self.__machine(750) Chris@87: def _is_ppc403(self): return self.__machine(403) Chris@87: def _is_ppc505(self): return self.__machine(505) Chris@87: def _is_ppc801(self): return self.__machine(801) Chris@87: def _is_ppc821(self): return self.__machine(821) Chris@87: def _is_ppc823(self): return self.__machine(823) Chris@87: def _is_ppc860(self): return self.__machine(860) Chris@87: Chris@87: Chris@87: class SunOSCPUInfo(CPUInfoBase): Chris@87: Chris@87: info = None Chris@87: Chris@87: def __init__(self): Chris@87: if self.info is not None: Chris@87: return Chris@87: info = command_info(arch='arch', Chris@87: mach='mach', Chris@87: uname_i='uname_i', Chris@87: isainfo_b='isainfo -b', Chris@87: isainfo_n='isainfo -n', Chris@87: ) Chris@87: info['uname_X'] = key_value_from_command('uname -X', sep='=') Chris@87: for line in command_by_line('psrinfo -v 0'): Chris@87: m = re.match(r'\s*The (?P

[\w\d]+) processor operates at', line) Chris@87: if m: Chris@87: info['processor'] = m.group('p') Chris@87: break Chris@87: self.__class__.info = info Chris@87: Chris@87: def _not_impl(self): pass Chris@87: Chris@87: def _is_i386(self): Chris@87: return self.info['isainfo_n']=='i386' Chris@87: def _is_sparc(self): Chris@87: return self.info['isainfo_n']=='sparc' Chris@87: def _is_sparcv9(self): Chris@87: return self.info['isainfo_n']=='sparcv9' Chris@87: Chris@87: def _getNCPUs(self): Chris@87: return int(self.info['uname_X'].get('NumCPU', 1)) Chris@87: Chris@87: def _is_sun4(self): Chris@87: return self.info['arch']=='sun4' Chris@87: Chris@87: def _is_SUNW(self): Chris@87: return re.match(r'SUNW', self.info['uname_i']) is not None Chris@87: def _is_sparcstation5(self): Chris@87: return re.match(r'.*SPARCstation-5', self.info['uname_i']) is not None Chris@87: def _is_ultra1(self): Chris@87: return re.match(r'.*Ultra-1', self.info['uname_i']) is not None Chris@87: def _is_ultra250(self): Chris@87: return re.match(r'.*Ultra-250', self.info['uname_i']) is not None Chris@87: def _is_ultra2(self): Chris@87: return re.match(r'.*Ultra-2', self.info['uname_i']) is not None Chris@87: def _is_ultra30(self): Chris@87: return re.match(r'.*Ultra-30', self.info['uname_i']) is not None Chris@87: def _is_ultra4(self): Chris@87: return re.match(r'.*Ultra-4', self.info['uname_i']) is not None Chris@87: def _is_ultra5_10(self): Chris@87: return re.match(r'.*Ultra-5_10', self.info['uname_i']) is not None Chris@87: def _is_ultra5(self): Chris@87: return re.match(r'.*Ultra-5', self.info['uname_i']) is not None Chris@87: def _is_ultra60(self): Chris@87: return re.match(r'.*Ultra-60', self.info['uname_i']) is not None Chris@87: def _is_ultra80(self): Chris@87: return re.match(r'.*Ultra-80', self.info['uname_i']) is not None Chris@87: def _is_ultraenterprice(self): Chris@87: return re.match(r'.*Ultra-Enterprise', self.info['uname_i']) is not None Chris@87: def _is_ultraenterprice10k(self): Chris@87: return re.match(r'.*Ultra-Enterprise-10000', self.info['uname_i']) is not None Chris@87: def _is_sunfire(self): Chris@87: return re.match(r'.*Sun-Fire', self.info['uname_i']) is not None Chris@87: def _is_ultra(self): Chris@87: return re.match(r'.*Ultra', self.info['uname_i']) is not None Chris@87: Chris@87: def _is_cpusparcv7(self): Chris@87: return self.info['processor']=='sparcv7' Chris@87: def _is_cpusparcv8(self): Chris@87: return self.info['processor']=='sparcv8' Chris@87: def _is_cpusparcv9(self): Chris@87: return self.info['processor']=='sparcv9' Chris@87: Chris@87: class Win32CPUInfo(CPUInfoBase): Chris@87: Chris@87: info = None Chris@87: pkey = r"HARDWARE\DESCRIPTION\System\CentralProcessor" Chris@87: # XXX: what does the value of Chris@87: # HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0 Chris@87: # mean? Chris@87: Chris@87: def __init__(self): Chris@87: if self.info is not None: Chris@87: return Chris@87: info = [] Chris@87: try: Chris@87: #XXX: Bad style to use so long `try:...except:...`. Fix it! Chris@87: if sys.version_info[0] >= 3: Chris@87: import winreg Chris@87: else: Chris@87: import _winreg as winreg Chris@87: Chris@87: prgx = re.compile(r"family\s+(?P\d+)\s+model\s+(?P\d+)"\ Chris@87: "\s+stepping\s+(?P\d+)", re.IGNORECASE) Chris@87: chnd=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self.pkey) Chris@87: pnum=0 Chris@87: while True: Chris@87: try: Chris@87: proc=winreg.EnumKey(chnd, pnum) Chris@87: except winreg.error: Chris@87: break Chris@87: else: Chris@87: pnum+=1 Chris@87: info.append({"Processor":proc}) Chris@87: phnd=winreg.OpenKey(chnd, proc) Chris@87: pidx=0 Chris@87: while True: Chris@87: try: Chris@87: name, value, vtpe=winreg.EnumValue(phnd, pidx) Chris@87: except winreg.error: Chris@87: break Chris@87: else: Chris@87: pidx=pidx+1 Chris@87: info[-1][name]=value Chris@87: if name=="Identifier": Chris@87: srch=prgx.search(value) Chris@87: if srch: Chris@87: info[-1]["Family"]=int(srch.group("FML")) Chris@87: info[-1]["Model"]=int(srch.group("MDL")) Chris@87: info[-1]["Stepping"]=int(srch.group("STP")) Chris@87: except: Chris@87: print(sys.exc_info()[1], '(ignoring)') Chris@87: self.__class__.info = info Chris@87: Chris@87: def _not_impl(self): pass Chris@87: Chris@87: # Athlon Chris@87: Chris@87: def _is_AMD(self): Chris@87: return self.info[0]['VendorIdentifier']=='AuthenticAMD' Chris@87: Chris@87: def _is_Am486(self): Chris@87: return self.is_AMD() and self.info[0]['Family']==4 Chris@87: Chris@87: def _is_Am5x86(self): Chris@87: return self.is_AMD() and self.info[0]['Family']==4 Chris@87: Chris@87: def _is_AMDK5(self): Chris@87: return self.is_AMD() and self.info[0]['Family']==5 \ Chris@87: and self.info[0]['Model'] in [0, 1, 2, 3] Chris@87: Chris@87: def _is_AMDK6(self): Chris@87: return self.is_AMD() and self.info[0]['Family']==5 \ Chris@87: and self.info[0]['Model'] in [6, 7] Chris@87: Chris@87: def _is_AMDK6_2(self): Chris@87: return self.is_AMD() and self.info[0]['Family']==5 \ Chris@87: and self.info[0]['Model']==8 Chris@87: Chris@87: def _is_AMDK6_3(self): Chris@87: return self.is_AMD() and self.info[0]['Family']==5 \ Chris@87: and self.info[0]['Model']==9 Chris@87: Chris@87: def _is_AMDK7(self): Chris@87: return self.is_AMD() and self.info[0]['Family'] == 6 Chris@87: Chris@87: # To reliably distinguish between the different types of AMD64 chips Chris@87: # (Athlon64, Operton, Athlon64 X2, Semperon, Turion 64, etc.) would Chris@87: # require looking at the 'brand' from cpuid Chris@87: Chris@87: def _is_AMD64(self): Chris@87: return self.is_AMD() and self.info[0]['Family'] == 15 Chris@87: Chris@87: # Intel Chris@87: Chris@87: def _is_Intel(self): Chris@87: return self.info[0]['VendorIdentifier']=='GenuineIntel' Chris@87: Chris@87: def _is_i386(self): Chris@87: return self.info[0]['Family']==3 Chris@87: Chris@87: def _is_i486(self): Chris@87: return self.info[0]['Family']==4 Chris@87: Chris@87: def _is_i586(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==5 Chris@87: Chris@87: def _is_i686(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==6 Chris@87: Chris@87: def _is_Pentium(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==5 Chris@87: Chris@87: def _is_PentiumMMX(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==5 \ Chris@87: and self.info[0]['Model']==4 Chris@87: Chris@87: def _is_PentiumPro(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==6 \ Chris@87: and self.info[0]['Model']==1 Chris@87: Chris@87: def _is_PentiumII(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==6 \ Chris@87: and self.info[0]['Model'] in [3, 5, 6] Chris@87: Chris@87: def _is_PentiumIII(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==6 \ Chris@87: and self.info[0]['Model'] in [7, 8, 9, 10, 11] Chris@87: Chris@87: def _is_PentiumIV(self): Chris@87: return self.is_Intel() and self.info[0]['Family']==15 Chris@87: Chris@87: def _is_PentiumM(self): Chris@87: return self.is_Intel() and self.info[0]['Family'] == 6 \ Chris@87: and self.info[0]['Model'] in [9, 13, 14] Chris@87: Chris@87: def _is_Core2(self): Chris@87: return self.is_Intel() and self.info[0]['Family'] == 6 \ Chris@87: and self.info[0]['Model'] in [15, 16, 17] Chris@87: Chris@87: # Varia Chris@87: Chris@87: def _is_singleCPU(self): Chris@87: return len(self.info) == 1 Chris@87: Chris@87: def _getNCPUs(self): Chris@87: return len(self.info) Chris@87: Chris@87: def _has_mmx(self): Chris@87: if self.is_Intel(): Chris@87: return (self.info[0]['Family']==5 and self.info[0]['Model']==4) \ Chris@87: or (self.info[0]['Family'] in [6, 15]) Chris@87: elif self.is_AMD(): Chris@87: return self.info[0]['Family'] in [5, 6, 15] Chris@87: else: Chris@87: return False Chris@87: Chris@87: def _has_sse(self): Chris@87: if self.is_Intel(): Chris@87: return (self.info[0]['Family']==6 and \ Chris@87: self.info[0]['Model'] in [7, 8, 9, 10, 11]) \ Chris@87: or self.info[0]['Family']==15 Chris@87: elif self.is_AMD(): Chris@87: return (self.info[0]['Family']==6 and \ Chris@87: self.info[0]['Model'] in [6, 7, 8, 10]) \ Chris@87: or self.info[0]['Family']==15 Chris@87: else: Chris@87: return False Chris@87: Chris@87: def _has_sse2(self): Chris@87: if self.is_Intel(): Chris@87: return self.is_Pentium4() or self.is_PentiumM() \ Chris@87: or self.is_Core2() Chris@87: elif self.is_AMD(): Chris@87: return self.is_AMD64() Chris@87: else: Chris@87: return False Chris@87: Chris@87: def _has_3dnow(self): Chris@87: return self.is_AMD() and self.info[0]['Family'] in [5, 6, 15] Chris@87: Chris@87: def _has_3dnowext(self): Chris@87: return self.is_AMD() and self.info[0]['Family'] in [6, 15] Chris@87: Chris@87: if sys.platform.startswith('linux'): # variations: linux2,linux-i386 (any others?) Chris@87: cpuinfo = LinuxCPUInfo Chris@87: elif sys.platform.startswith('irix'): Chris@87: cpuinfo = IRIXCPUInfo Chris@87: elif sys.platform == 'darwin': Chris@87: cpuinfo = DarwinCPUInfo Chris@87: elif sys.platform.startswith('sunos'): Chris@87: cpuinfo = SunOSCPUInfo Chris@87: elif sys.platform.startswith('win32'): Chris@87: cpuinfo = Win32CPUInfo Chris@87: elif sys.platform.startswith('cygwin'): Chris@87: cpuinfo = LinuxCPUInfo Chris@87: #XXX: other OS's. Eg. use _winreg on Win32. Or os.uname on unices. Chris@87: else: Chris@87: cpuinfo = CPUInfoBase Chris@87: Chris@87: cpu = cpuinfo() Chris@87: Chris@87: #if __name__ == "__main__": Chris@87: # Chris@87: # cpu.is_blaa() Chris@87: # cpu.is_Intel() Chris@87: # cpu.is_Alpha() Chris@87: # Chris@87: # print 'CPU information:', Chris@87: # for name in dir(cpuinfo): Chris@87: # if name[0]=='_' and name[1]!='_': Chris@87: # r = getattr(cpu,name[1:])() Chris@87: # if r: Chris@87: # if r!=1: Chris@87: # print '%s=%s' %(name[1:],r), Chris@87: # else: Chris@87: # print name[1:], Chris@87: # print