annotate DEPENDENCIES/mingw32/Python27/Lib/site-packages/numpy/distutils/cpuinfo.py @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents 2a2c65a20a8b
children
rev   line source
Chris@87 1 #!/usr/bin/env python
Chris@87 2 """
Chris@87 3 cpuinfo
Chris@87 4
Chris@87 5 Copyright 2002 Pearu Peterson all rights reserved,
Chris@87 6 Pearu Peterson <pearu@cens.ioc.ee>
Chris@87 7 Permission to use, modify, and distribute this software is given under the
Chris@87 8 terms of the NumPy (BSD style) license. See LICENSE.txt that came with
Chris@87 9 this distribution for specifics.
Chris@87 10
Chris@87 11 NO WARRANTY IS EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
Chris@87 12 Pearu Peterson
Chris@87 13
Chris@87 14 """
Chris@87 15 from __future__ import division, absolute_import, print_function
Chris@87 16
Chris@87 17 __all__ = ['cpu']
Chris@87 18
Chris@87 19 import sys, re, types
Chris@87 20 import os
Chris@87 21
Chris@87 22 if sys.version_info[0] >= 3:
Chris@87 23 from subprocess import getstatusoutput
Chris@87 24 else:
Chris@87 25 from commands import getstatusoutput
Chris@87 26
Chris@87 27 import warnings
Chris@87 28 import platform
Chris@87 29
Chris@87 30 from numpy.distutils.compat import get_exception
Chris@87 31
Chris@87 32 def getoutput(cmd, successful_status=(0,), stacklevel=1):
Chris@87 33 try:
Chris@87 34 status, output = getstatusoutput(cmd)
Chris@87 35 except EnvironmentError:
Chris@87 36 e = get_exception()
Chris@87 37 warnings.warn(str(e), UserWarning, stacklevel=stacklevel)
Chris@87 38 return False, output
Chris@87 39 if os.WIFEXITED(status) and os.WEXITSTATUS(status) in successful_status:
Chris@87 40 return True, output
Chris@87 41 return False, output
Chris@87 42
Chris@87 43 def command_info(successful_status=(0,), stacklevel=1, **kw):
Chris@87 44 info = {}
Chris@87 45 for key in kw:
Chris@87 46 ok, output = getoutput(kw[key], successful_status=successful_status,
Chris@87 47 stacklevel=stacklevel+1)
Chris@87 48 if ok:
Chris@87 49 info[key] = output.strip()
Chris@87 50 return info
Chris@87 51
Chris@87 52 def command_by_line(cmd, successful_status=(0,), stacklevel=1):
Chris@87 53 ok, output = getoutput(cmd, successful_status=successful_status,
Chris@87 54 stacklevel=stacklevel+1)
Chris@87 55 if not ok:
Chris@87 56 return
Chris@87 57 for line in output.splitlines():
Chris@87 58 yield line.strip()
Chris@87 59
Chris@87 60 def key_value_from_command(cmd, sep, successful_status=(0,),
Chris@87 61 stacklevel=1):
Chris@87 62 d = {}
Chris@87 63 for line in command_by_line(cmd, successful_status=successful_status,
Chris@87 64 stacklevel=stacklevel+1):
Chris@87 65 l = [s.strip() for s in line.split(sep, 1)]
Chris@87 66 if len(l) == 2:
Chris@87 67 d[l[0]] = l[1]
Chris@87 68 return d
Chris@87 69
Chris@87 70 class CPUInfoBase(object):
Chris@87 71 """Holds CPU information and provides methods for requiring
Chris@87 72 the availability of various CPU features.
Chris@87 73 """
Chris@87 74
Chris@87 75 def _try_call(self, func):
Chris@87 76 try:
Chris@87 77 return func()
Chris@87 78 except:
Chris@87 79 pass
Chris@87 80
Chris@87 81 def __getattr__(self, name):
Chris@87 82 if not name.startswith('_'):
Chris@87 83 if hasattr(self, '_'+name):
Chris@87 84 attr = getattr(self, '_'+name)
Chris@87 85 if isinstance(attr, types.MethodType):
Chris@87 86 return lambda func=self._try_call,attr=attr : func(attr)
Chris@87 87 else:
Chris@87 88 return lambda : None
Chris@87 89 raise AttributeError(name)
Chris@87 90
Chris@87 91 def _getNCPUs(self):
Chris@87 92 return 1
Chris@87 93
Chris@87 94 def __get_nbits(self):
Chris@87 95 abits = platform.architecture()[0]
Chris@87 96 nbits = re.compile('(\d+)bit').search(abits).group(1)
Chris@87 97 return nbits
Chris@87 98
Chris@87 99 def _is_32bit(self):
Chris@87 100 return self.__get_nbits() == '32'
Chris@87 101
Chris@87 102 def _is_64bit(self):
Chris@87 103 return self.__get_nbits() == '64'
Chris@87 104
Chris@87 105 class LinuxCPUInfo(CPUInfoBase):
Chris@87 106
Chris@87 107 info = None
Chris@87 108
Chris@87 109 def __init__(self):
Chris@87 110 if self.info is not None:
Chris@87 111 return
Chris@87 112 info = [ {} ]
Chris@87 113 ok, output = getoutput('uname -m')
Chris@87 114 if ok:
Chris@87 115 info[0]['uname_m'] = output.strip()
Chris@87 116 try:
Chris@87 117 fo = open('/proc/cpuinfo')
Chris@87 118 except EnvironmentError:
Chris@87 119 e = get_exception()
Chris@87 120 warnings.warn(str(e), UserWarning)
Chris@87 121 else:
Chris@87 122 for line in fo:
Chris@87 123 name_value = [s.strip() for s in line.split(':', 1)]
Chris@87 124 if len(name_value) != 2:
Chris@87 125 continue
Chris@87 126 name, value = name_value
Chris@87 127 if not info or name in info[-1]: # next processor
Chris@87 128 info.append({})
Chris@87 129 info[-1][name] = value
Chris@87 130 fo.close()
Chris@87 131 self.__class__.info = info
Chris@87 132
Chris@87 133 def _not_impl(self): pass
Chris@87 134
Chris@87 135 # Athlon
Chris@87 136
Chris@87 137 def _is_AMD(self):
Chris@87 138 return self.info[0]['vendor_id']=='AuthenticAMD'
Chris@87 139
Chris@87 140 def _is_AthlonK6_2(self):
Chris@87 141 return self._is_AMD() and self.info[0]['model'] == '2'
Chris@87 142
Chris@87 143 def _is_AthlonK6_3(self):
Chris@87 144 return self._is_AMD() and self.info[0]['model'] == '3'
Chris@87 145
Chris@87 146 def _is_AthlonK6(self):
Chris@87 147 return re.match(r'.*?AMD-K6', self.info[0]['model name']) is not None
Chris@87 148
Chris@87 149 def _is_AthlonK7(self):
Chris@87 150 return re.match(r'.*?AMD-K7', self.info[0]['model name']) is not None
Chris@87 151
Chris@87 152 def _is_AthlonMP(self):
Chris@87 153 return re.match(r'.*?Athlon\(tm\) MP\b',
Chris@87 154 self.info[0]['model name']) is not None
Chris@87 155
Chris@87 156 def _is_AMD64(self):
Chris@87 157 return self.is_AMD() and self.info[0]['family'] == '15'
Chris@87 158
Chris@87 159 def _is_Athlon64(self):
Chris@87 160 return re.match(r'.*?Athlon\(tm\) 64\b',
Chris@87 161 self.info[0]['model name']) is not None
Chris@87 162
Chris@87 163 def _is_AthlonHX(self):
Chris@87 164 return re.match(r'.*?Athlon HX\b',
Chris@87 165 self.info[0]['model name']) is not None
Chris@87 166
Chris@87 167 def _is_Opteron(self):
Chris@87 168 return re.match(r'.*?Opteron\b',
Chris@87 169 self.info[0]['model name']) is not None
Chris@87 170
Chris@87 171 def _is_Hammer(self):
Chris@87 172 return re.match(r'.*?Hammer\b',
Chris@87 173 self.info[0]['model name']) is not None
Chris@87 174
Chris@87 175 # Alpha
Chris@87 176
Chris@87 177 def _is_Alpha(self):
Chris@87 178 return self.info[0]['cpu']=='Alpha'
Chris@87 179
Chris@87 180 def _is_EV4(self):
Chris@87 181 return self.is_Alpha() and self.info[0]['cpu model'] == 'EV4'
Chris@87 182
Chris@87 183 def _is_EV5(self):
Chris@87 184 return self.is_Alpha() and self.info[0]['cpu model'] == 'EV5'
Chris@87 185
Chris@87 186 def _is_EV56(self):
Chris@87 187 return self.is_Alpha() and self.info[0]['cpu model'] == 'EV56'
Chris@87 188
Chris@87 189 def _is_PCA56(self):
Chris@87 190 return self.is_Alpha() and self.info[0]['cpu model'] == 'PCA56'
Chris@87 191
Chris@87 192 # Intel
Chris@87 193
Chris@87 194 #XXX
Chris@87 195 _is_i386 = _not_impl
Chris@87 196
Chris@87 197 def _is_Intel(self):
Chris@87 198 return self.info[0]['vendor_id']=='GenuineIntel'
Chris@87 199
Chris@87 200 def _is_i486(self):
Chris@87 201 return self.info[0]['cpu']=='i486'
Chris@87 202
Chris@87 203 def _is_i586(self):
Chris@87 204 return self.is_Intel() and self.info[0]['cpu family'] == '5'
Chris@87 205
Chris@87 206 def _is_i686(self):
Chris@87 207 return self.is_Intel() and self.info[0]['cpu family'] == '6'
Chris@87 208
Chris@87 209 def _is_Celeron(self):
Chris@87 210 return re.match(r'.*?Celeron',
Chris@87 211 self.info[0]['model name']) is not None
Chris@87 212
Chris@87 213 def _is_Pentium(self):
Chris@87 214 return re.match(r'.*?Pentium',
Chris@87 215 self.info[0]['model name']) is not None
Chris@87 216
Chris@87 217 def _is_PentiumII(self):
Chris@87 218 return re.match(r'.*?Pentium.*?II\b',
Chris@87 219 self.info[0]['model name']) is not None
Chris@87 220
Chris@87 221 def _is_PentiumPro(self):
Chris@87 222 return re.match(r'.*?PentiumPro\b',
Chris@87 223 self.info[0]['model name']) is not None
Chris@87 224
Chris@87 225 def _is_PentiumMMX(self):
Chris@87 226 return re.match(r'.*?Pentium.*?MMX\b',
Chris@87 227 self.info[0]['model name']) is not None
Chris@87 228
Chris@87 229 def _is_PentiumIII(self):
Chris@87 230 return re.match(r'.*?Pentium.*?III\b',
Chris@87 231 self.info[0]['model name']) is not None
Chris@87 232
Chris@87 233 def _is_PentiumIV(self):
Chris@87 234 return re.match(r'.*?Pentium.*?(IV|4)\b',
Chris@87 235 self.info[0]['model name']) is not None
Chris@87 236
Chris@87 237 def _is_PentiumM(self):
Chris@87 238 return re.match(r'.*?Pentium.*?M\b',
Chris@87 239 self.info[0]['model name']) is not None
Chris@87 240
Chris@87 241 def _is_Prescott(self):
Chris@87 242 return self.is_PentiumIV() and self.has_sse3()
Chris@87 243
Chris@87 244 def _is_Nocona(self):
Chris@87 245 return self.is_Intel() \
Chris@87 246 and (self.info[0]['cpu family'] == '6' \
Chris@87 247 or self.info[0]['cpu family'] == '15' ) \
Chris@87 248 and (self.has_sse3() and not self.has_ssse3())\
Chris@87 249 and re.match(r'.*?\blm\b', self.info[0]['flags']) is not None
Chris@87 250
Chris@87 251 def _is_Core2(self):
Chris@87 252 return self.is_64bit() and self.is_Intel() and \
Chris@87 253 re.match(r'.*?Core\(TM\)2\b', \
Chris@87 254 self.info[0]['model name']) is not None
Chris@87 255
Chris@87 256 def _is_Itanium(self):
Chris@87 257 return re.match(r'.*?Itanium\b',
Chris@87 258 self.info[0]['family']) is not None
Chris@87 259
Chris@87 260 def _is_XEON(self):
Chris@87 261 return re.match(r'.*?XEON\b',
Chris@87 262 self.info[0]['model name'], re.IGNORECASE) is not None
Chris@87 263
Chris@87 264 _is_Xeon = _is_XEON
Chris@87 265
Chris@87 266 # Varia
Chris@87 267
Chris@87 268 def _is_singleCPU(self):
Chris@87 269 return len(self.info) == 1
Chris@87 270
Chris@87 271 def _getNCPUs(self):
Chris@87 272 return len(self.info)
Chris@87 273
Chris@87 274 def _has_fdiv_bug(self):
Chris@87 275 return self.info[0]['fdiv_bug']=='yes'
Chris@87 276
Chris@87 277 def _has_f00f_bug(self):
Chris@87 278 return self.info[0]['f00f_bug']=='yes'
Chris@87 279
Chris@87 280 def _has_mmx(self):
Chris@87 281 return re.match(r'.*?\bmmx\b', self.info[0]['flags']) is not None
Chris@87 282
Chris@87 283 def _has_sse(self):
Chris@87 284 return re.match(r'.*?\bsse\b', self.info[0]['flags']) is not None
Chris@87 285
Chris@87 286 def _has_sse2(self):
Chris@87 287 return re.match(r'.*?\bsse2\b', self.info[0]['flags']) is not None
Chris@87 288
Chris@87 289 def _has_sse3(self):
Chris@87 290 return re.match(r'.*?\bpni\b', self.info[0]['flags']) is not None
Chris@87 291
Chris@87 292 def _has_ssse3(self):
Chris@87 293 return re.match(r'.*?\bssse3\b', self.info[0]['flags']) is not None
Chris@87 294
Chris@87 295 def _has_3dnow(self):
Chris@87 296 return re.match(r'.*?\b3dnow\b', self.info[0]['flags']) is not None
Chris@87 297
Chris@87 298 def _has_3dnowext(self):
Chris@87 299 return re.match(r'.*?\b3dnowext\b', self.info[0]['flags']) is not None
Chris@87 300
Chris@87 301 class IRIXCPUInfo(CPUInfoBase):
Chris@87 302 info = None
Chris@87 303
Chris@87 304 def __init__(self):
Chris@87 305 if self.info is not None:
Chris@87 306 return
Chris@87 307 info = key_value_from_command('sysconf', sep=' ',
Chris@87 308 successful_status=(0, 1))
Chris@87 309 self.__class__.info = info
Chris@87 310
Chris@87 311 def _not_impl(self): pass
Chris@87 312
Chris@87 313 def _is_singleCPU(self):
Chris@87 314 return self.info.get('NUM_PROCESSORS') == '1'
Chris@87 315
Chris@87 316 def _getNCPUs(self):
Chris@87 317 return int(self.info.get('NUM_PROCESSORS', 1))
Chris@87 318
Chris@87 319 def __cputype(self, n):
Chris@87 320 return self.info.get('PROCESSORS').split()[0].lower() == 'r%s' % (n)
Chris@87 321 def _is_r2000(self): return self.__cputype(2000)
Chris@87 322 def _is_r3000(self): return self.__cputype(3000)
Chris@87 323 def _is_r3900(self): return self.__cputype(3900)
Chris@87 324 def _is_r4000(self): return self.__cputype(4000)
Chris@87 325 def _is_r4100(self): return self.__cputype(4100)
Chris@87 326 def _is_r4300(self): return self.__cputype(4300)
Chris@87 327 def _is_r4400(self): return self.__cputype(4400)
Chris@87 328 def _is_r4600(self): return self.__cputype(4600)
Chris@87 329 def _is_r4650(self): return self.__cputype(4650)
Chris@87 330 def _is_r5000(self): return self.__cputype(5000)
Chris@87 331 def _is_r6000(self): return self.__cputype(6000)
Chris@87 332 def _is_r8000(self): return self.__cputype(8000)
Chris@87 333 def _is_r10000(self): return self.__cputype(10000)
Chris@87 334 def _is_r12000(self): return self.__cputype(12000)
Chris@87 335 def _is_rorion(self): return self.__cputype('orion')
Chris@87 336
Chris@87 337 def get_ip(self):
Chris@87 338 try: return self.info.get('MACHINE')
Chris@87 339 except: pass
Chris@87 340 def __machine(self, n):
Chris@87 341 return self.info.get('MACHINE').lower() == 'ip%s' % (n)
Chris@87 342 def _is_IP19(self): return self.__machine(19)
Chris@87 343 def _is_IP20(self): return self.__machine(20)
Chris@87 344 def _is_IP21(self): return self.__machine(21)
Chris@87 345 def _is_IP22(self): return self.__machine(22)
Chris@87 346 def _is_IP22_4k(self): return self.__machine(22) and self._is_r4000()
Chris@87 347 def _is_IP22_5k(self): return self.__machine(22) and self._is_r5000()
Chris@87 348 def _is_IP24(self): return self.__machine(24)
Chris@87 349 def _is_IP25(self): return self.__machine(25)
Chris@87 350 def _is_IP26(self): return self.__machine(26)
Chris@87 351 def _is_IP27(self): return self.__machine(27)
Chris@87 352 def _is_IP28(self): return self.__machine(28)
Chris@87 353 def _is_IP30(self): return self.__machine(30)
Chris@87 354 def _is_IP32(self): return self.__machine(32)
Chris@87 355 def _is_IP32_5k(self): return self.__machine(32) and self._is_r5000()
Chris@87 356 def _is_IP32_10k(self): return self.__machine(32) and self._is_r10000()
Chris@87 357
Chris@87 358
Chris@87 359 class DarwinCPUInfo(CPUInfoBase):
Chris@87 360 info = None
Chris@87 361
Chris@87 362 def __init__(self):
Chris@87 363 if self.info is not None:
Chris@87 364 return
Chris@87 365 info = command_info(arch='arch',
Chris@87 366 machine='machine')
Chris@87 367 info['sysctl_hw'] = key_value_from_command('sysctl hw', sep='=')
Chris@87 368 self.__class__.info = info
Chris@87 369
Chris@87 370 def _not_impl(self): pass
Chris@87 371
Chris@87 372 def _getNCPUs(self):
Chris@87 373 return int(self.info['sysctl_hw'].get('hw.ncpu', 1))
Chris@87 374
Chris@87 375 def _is_Power_Macintosh(self):
Chris@87 376 return self.info['sysctl_hw']['hw.machine']=='Power Macintosh'
Chris@87 377
Chris@87 378 def _is_i386(self):
Chris@87 379 return self.info['arch']=='i386'
Chris@87 380 def _is_ppc(self):
Chris@87 381 return self.info['arch']=='ppc'
Chris@87 382
Chris@87 383 def __machine(self, n):
Chris@87 384 return self.info['machine'] == 'ppc%s'%n
Chris@87 385 def _is_ppc601(self): return self.__machine(601)
Chris@87 386 def _is_ppc602(self): return self.__machine(602)
Chris@87 387 def _is_ppc603(self): return self.__machine(603)
Chris@87 388 def _is_ppc603e(self): return self.__machine('603e')
Chris@87 389 def _is_ppc604(self): return self.__machine(604)
Chris@87 390 def _is_ppc604e(self): return self.__machine('604e')
Chris@87 391 def _is_ppc620(self): return self.__machine(620)
Chris@87 392 def _is_ppc630(self): return self.__machine(630)
Chris@87 393 def _is_ppc740(self): return self.__machine(740)
Chris@87 394 def _is_ppc7400(self): return self.__machine(7400)
Chris@87 395 def _is_ppc7450(self): return self.__machine(7450)
Chris@87 396 def _is_ppc750(self): return self.__machine(750)
Chris@87 397 def _is_ppc403(self): return self.__machine(403)
Chris@87 398 def _is_ppc505(self): return self.__machine(505)
Chris@87 399 def _is_ppc801(self): return self.__machine(801)
Chris@87 400 def _is_ppc821(self): return self.__machine(821)
Chris@87 401 def _is_ppc823(self): return self.__machine(823)
Chris@87 402 def _is_ppc860(self): return self.__machine(860)
Chris@87 403
Chris@87 404
Chris@87 405 class SunOSCPUInfo(CPUInfoBase):
Chris@87 406
Chris@87 407 info = None
Chris@87 408
Chris@87 409 def __init__(self):
Chris@87 410 if self.info is not None:
Chris@87 411 return
Chris@87 412 info = command_info(arch='arch',
Chris@87 413 mach='mach',
Chris@87 414 uname_i='uname_i',
Chris@87 415 isainfo_b='isainfo -b',
Chris@87 416 isainfo_n='isainfo -n',
Chris@87 417 )
Chris@87 418 info['uname_X'] = key_value_from_command('uname -X', sep='=')
Chris@87 419 for line in command_by_line('psrinfo -v 0'):
Chris@87 420 m = re.match(r'\s*The (?P<p>[\w\d]+) processor operates at', line)
Chris@87 421 if m:
Chris@87 422 info['processor'] = m.group('p')
Chris@87 423 break
Chris@87 424 self.__class__.info = info
Chris@87 425
Chris@87 426 def _not_impl(self): pass
Chris@87 427
Chris@87 428 def _is_i386(self):
Chris@87 429 return self.info['isainfo_n']=='i386'
Chris@87 430 def _is_sparc(self):
Chris@87 431 return self.info['isainfo_n']=='sparc'
Chris@87 432 def _is_sparcv9(self):
Chris@87 433 return self.info['isainfo_n']=='sparcv9'
Chris@87 434
Chris@87 435 def _getNCPUs(self):
Chris@87 436 return int(self.info['uname_X'].get('NumCPU', 1))
Chris@87 437
Chris@87 438 def _is_sun4(self):
Chris@87 439 return self.info['arch']=='sun4'
Chris@87 440
Chris@87 441 def _is_SUNW(self):
Chris@87 442 return re.match(r'SUNW', self.info['uname_i']) is not None
Chris@87 443 def _is_sparcstation5(self):
Chris@87 444 return re.match(r'.*SPARCstation-5', self.info['uname_i']) is not None
Chris@87 445 def _is_ultra1(self):
Chris@87 446 return re.match(r'.*Ultra-1', self.info['uname_i']) is not None
Chris@87 447 def _is_ultra250(self):
Chris@87 448 return re.match(r'.*Ultra-250', self.info['uname_i']) is not None
Chris@87 449 def _is_ultra2(self):
Chris@87 450 return re.match(r'.*Ultra-2', self.info['uname_i']) is not None
Chris@87 451 def _is_ultra30(self):
Chris@87 452 return re.match(r'.*Ultra-30', self.info['uname_i']) is not None
Chris@87 453 def _is_ultra4(self):
Chris@87 454 return re.match(r'.*Ultra-4', self.info['uname_i']) is not None
Chris@87 455 def _is_ultra5_10(self):
Chris@87 456 return re.match(r'.*Ultra-5_10', self.info['uname_i']) is not None
Chris@87 457 def _is_ultra5(self):
Chris@87 458 return re.match(r'.*Ultra-5', self.info['uname_i']) is not None
Chris@87 459 def _is_ultra60(self):
Chris@87 460 return re.match(r'.*Ultra-60', self.info['uname_i']) is not None
Chris@87 461 def _is_ultra80(self):
Chris@87 462 return re.match(r'.*Ultra-80', self.info['uname_i']) is not None
Chris@87 463 def _is_ultraenterprice(self):
Chris@87 464 return re.match(r'.*Ultra-Enterprise', self.info['uname_i']) is not None
Chris@87 465 def _is_ultraenterprice10k(self):
Chris@87 466 return re.match(r'.*Ultra-Enterprise-10000', self.info['uname_i']) is not None
Chris@87 467 def _is_sunfire(self):
Chris@87 468 return re.match(r'.*Sun-Fire', self.info['uname_i']) is not None
Chris@87 469 def _is_ultra(self):
Chris@87 470 return re.match(r'.*Ultra', self.info['uname_i']) is not None
Chris@87 471
Chris@87 472 def _is_cpusparcv7(self):
Chris@87 473 return self.info['processor']=='sparcv7'
Chris@87 474 def _is_cpusparcv8(self):
Chris@87 475 return self.info['processor']=='sparcv8'
Chris@87 476 def _is_cpusparcv9(self):
Chris@87 477 return self.info['processor']=='sparcv9'
Chris@87 478
Chris@87 479 class Win32CPUInfo(CPUInfoBase):
Chris@87 480
Chris@87 481 info = None
Chris@87 482 pkey = r"HARDWARE\DESCRIPTION\System\CentralProcessor"
Chris@87 483 # XXX: what does the value of
Chris@87 484 # HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0
Chris@87 485 # mean?
Chris@87 486
Chris@87 487 def __init__(self):
Chris@87 488 if self.info is not None:
Chris@87 489 return
Chris@87 490 info = []
Chris@87 491 try:
Chris@87 492 #XXX: Bad style to use so long `try:...except:...`. Fix it!
Chris@87 493 if sys.version_info[0] >= 3:
Chris@87 494 import winreg
Chris@87 495 else:
Chris@87 496 import _winreg as winreg
Chris@87 497
Chris@87 498 prgx = re.compile(r"family\s+(?P<FML>\d+)\s+model\s+(?P<MDL>\d+)"\
Chris@87 499 "\s+stepping\s+(?P<STP>\d+)", re.IGNORECASE)
Chris@87 500 chnd=winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, self.pkey)
Chris@87 501 pnum=0
Chris@87 502 while True:
Chris@87 503 try:
Chris@87 504 proc=winreg.EnumKey(chnd, pnum)
Chris@87 505 except winreg.error:
Chris@87 506 break
Chris@87 507 else:
Chris@87 508 pnum+=1
Chris@87 509 info.append({"Processor":proc})
Chris@87 510 phnd=winreg.OpenKey(chnd, proc)
Chris@87 511 pidx=0
Chris@87 512 while True:
Chris@87 513 try:
Chris@87 514 name, value, vtpe=winreg.EnumValue(phnd, pidx)
Chris@87 515 except winreg.error:
Chris@87 516 break
Chris@87 517 else:
Chris@87 518 pidx=pidx+1
Chris@87 519 info[-1][name]=value
Chris@87 520 if name=="Identifier":
Chris@87 521 srch=prgx.search(value)
Chris@87 522 if srch:
Chris@87 523 info[-1]["Family"]=int(srch.group("FML"))
Chris@87 524 info[-1]["Model"]=int(srch.group("MDL"))
Chris@87 525 info[-1]["Stepping"]=int(srch.group("STP"))
Chris@87 526 except:
Chris@87 527 print(sys.exc_info()[1], '(ignoring)')
Chris@87 528 self.__class__.info = info
Chris@87 529
Chris@87 530 def _not_impl(self): pass
Chris@87 531
Chris@87 532 # Athlon
Chris@87 533
Chris@87 534 def _is_AMD(self):
Chris@87 535 return self.info[0]['VendorIdentifier']=='AuthenticAMD'
Chris@87 536
Chris@87 537 def _is_Am486(self):
Chris@87 538 return self.is_AMD() and self.info[0]['Family']==4
Chris@87 539
Chris@87 540 def _is_Am5x86(self):
Chris@87 541 return self.is_AMD() and self.info[0]['Family']==4
Chris@87 542
Chris@87 543 def _is_AMDK5(self):
Chris@87 544 return self.is_AMD() and self.info[0]['Family']==5 \
Chris@87 545 and self.info[0]['Model'] in [0, 1, 2, 3]
Chris@87 546
Chris@87 547 def _is_AMDK6(self):
Chris@87 548 return self.is_AMD() and self.info[0]['Family']==5 \
Chris@87 549 and self.info[0]['Model'] in [6, 7]
Chris@87 550
Chris@87 551 def _is_AMDK6_2(self):
Chris@87 552 return self.is_AMD() and self.info[0]['Family']==5 \
Chris@87 553 and self.info[0]['Model']==8
Chris@87 554
Chris@87 555 def _is_AMDK6_3(self):
Chris@87 556 return self.is_AMD() and self.info[0]['Family']==5 \
Chris@87 557 and self.info[0]['Model']==9
Chris@87 558
Chris@87 559 def _is_AMDK7(self):
Chris@87 560 return self.is_AMD() and self.info[0]['Family'] == 6
Chris@87 561
Chris@87 562 # To reliably distinguish between the different types of AMD64 chips
Chris@87 563 # (Athlon64, Operton, Athlon64 X2, Semperon, Turion 64, etc.) would
Chris@87 564 # require looking at the 'brand' from cpuid
Chris@87 565
Chris@87 566 def _is_AMD64(self):
Chris@87 567 return self.is_AMD() and self.info[0]['Family'] == 15
Chris@87 568
Chris@87 569 # Intel
Chris@87 570
Chris@87 571 def _is_Intel(self):
Chris@87 572 return self.info[0]['VendorIdentifier']=='GenuineIntel'
Chris@87 573
Chris@87 574 def _is_i386(self):
Chris@87 575 return self.info[0]['Family']==3
Chris@87 576
Chris@87 577 def _is_i486(self):
Chris@87 578 return self.info[0]['Family']==4
Chris@87 579
Chris@87 580 def _is_i586(self):
Chris@87 581 return self.is_Intel() and self.info[0]['Family']==5
Chris@87 582
Chris@87 583 def _is_i686(self):
Chris@87 584 return self.is_Intel() and self.info[0]['Family']==6
Chris@87 585
Chris@87 586 def _is_Pentium(self):
Chris@87 587 return self.is_Intel() and self.info[0]['Family']==5
Chris@87 588
Chris@87 589 def _is_PentiumMMX(self):
Chris@87 590 return self.is_Intel() and self.info[0]['Family']==5 \
Chris@87 591 and self.info[0]['Model']==4
Chris@87 592
Chris@87 593 def _is_PentiumPro(self):
Chris@87 594 return self.is_Intel() and self.info[0]['Family']==6 \
Chris@87 595 and self.info[0]['Model']==1
Chris@87 596
Chris@87 597 def _is_PentiumII(self):
Chris@87 598 return self.is_Intel() and self.info[0]['Family']==6 \
Chris@87 599 and self.info[0]['Model'] in [3, 5, 6]
Chris@87 600
Chris@87 601 def _is_PentiumIII(self):
Chris@87 602 return self.is_Intel() and self.info[0]['Family']==6 \
Chris@87 603 and self.info[0]['Model'] in [7, 8, 9, 10, 11]
Chris@87 604
Chris@87 605 def _is_PentiumIV(self):
Chris@87 606 return self.is_Intel() and self.info[0]['Family']==15
Chris@87 607
Chris@87 608 def _is_PentiumM(self):
Chris@87 609 return self.is_Intel() and self.info[0]['Family'] == 6 \
Chris@87 610 and self.info[0]['Model'] in [9, 13, 14]
Chris@87 611
Chris@87 612 def _is_Core2(self):
Chris@87 613 return self.is_Intel() and self.info[0]['Family'] == 6 \
Chris@87 614 and self.info[0]['Model'] in [15, 16, 17]
Chris@87 615
Chris@87 616 # Varia
Chris@87 617
Chris@87 618 def _is_singleCPU(self):
Chris@87 619 return len(self.info) == 1
Chris@87 620
Chris@87 621 def _getNCPUs(self):
Chris@87 622 return len(self.info)
Chris@87 623
Chris@87 624 def _has_mmx(self):
Chris@87 625 if self.is_Intel():
Chris@87 626 return (self.info[0]['Family']==5 and self.info[0]['Model']==4) \
Chris@87 627 or (self.info[0]['Family'] in [6, 15])
Chris@87 628 elif self.is_AMD():
Chris@87 629 return self.info[0]['Family'] in [5, 6, 15]
Chris@87 630 else:
Chris@87 631 return False
Chris@87 632
Chris@87 633 def _has_sse(self):
Chris@87 634 if self.is_Intel():
Chris@87 635 return (self.info[0]['Family']==6 and \
Chris@87 636 self.info[0]['Model'] in [7, 8, 9, 10, 11]) \
Chris@87 637 or self.info[0]['Family']==15
Chris@87 638 elif self.is_AMD():
Chris@87 639 return (self.info[0]['Family']==6 and \
Chris@87 640 self.info[0]['Model'] in [6, 7, 8, 10]) \
Chris@87 641 or self.info[0]['Family']==15
Chris@87 642 else:
Chris@87 643 return False
Chris@87 644
Chris@87 645 def _has_sse2(self):
Chris@87 646 if self.is_Intel():
Chris@87 647 return self.is_Pentium4() or self.is_PentiumM() \
Chris@87 648 or self.is_Core2()
Chris@87 649 elif self.is_AMD():
Chris@87 650 return self.is_AMD64()
Chris@87 651 else:
Chris@87 652 return False
Chris@87 653
Chris@87 654 def _has_3dnow(self):
Chris@87 655 return self.is_AMD() and self.info[0]['Family'] in [5, 6, 15]
Chris@87 656
Chris@87 657 def _has_3dnowext(self):
Chris@87 658 return self.is_AMD() and self.info[0]['Family'] in [6, 15]
Chris@87 659
Chris@87 660 if sys.platform.startswith('linux'): # variations: linux2,linux-i386 (any others?)
Chris@87 661 cpuinfo = LinuxCPUInfo
Chris@87 662 elif sys.platform.startswith('irix'):
Chris@87 663 cpuinfo = IRIXCPUInfo
Chris@87 664 elif sys.platform == 'darwin':
Chris@87 665 cpuinfo = DarwinCPUInfo
Chris@87 666 elif sys.platform.startswith('sunos'):
Chris@87 667 cpuinfo = SunOSCPUInfo
Chris@87 668 elif sys.platform.startswith('win32'):
Chris@87 669 cpuinfo = Win32CPUInfo
Chris@87 670 elif sys.platform.startswith('cygwin'):
Chris@87 671 cpuinfo = LinuxCPUInfo
Chris@87 672 #XXX: other OS's. Eg. use _winreg on Win32. Or os.uname on unices.
Chris@87 673 else:
Chris@87 674 cpuinfo = CPUInfoBase
Chris@87 675
Chris@87 676 cpu = cpuinfo()
Chris@87 677
Chris@87 678 #if __name__ == "__main__":
Chris@87 679 #
Chris@87 680 # cpu.is_blaa()
Chris@87 681 # cpu.is_Intel()
Chris@87 682 # cpu.is_Alpha()
Chris@87 683 #
Chris@87 684 # print 'CPU information:',
Chris@87 685 # for name in dir(cpuinfo):
Chris@87 686 # if name[0]=='_' and name[1]!='_':
Chris@87 687 # r = getattr(cpu,name[1:])()
Chris@87 688 # if r:
Chris@87 689 # if r!=1:
Chris@87 690 # print '%s=%s' %(name[1:],r),
Chris@87 691 # else:
Chris@87 692 # print name[1:],
Chris@87 693 # print