pyhw 0.7.4__py3-none-any.whl → 0.9.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. pyhw/__init__.py +1 -1
  2. pyhw/__main__.py +2 -2
  3. pyhw/backend/cpu/cpuBase.py +6 -3
  4. pyhw/backend/cpu/linux.py +3 -0
  5. pyhw/backend/cpu/windows.py +48 -0
  6. pyhw/backend/gpu/gpuBase.py +8 -4
  7. pyhw/backend/gpu/linux.py +1 -1
  8. pyhw/backend/gpu/windows.py +41 -0
  9. pyhw/backend/host/hostBase.py +5 -5
  10. pyhw/backend/host/hostInfo.py +17 -8
  11. pyhw/backend/host/linux.py +1 -1
  12. pyhw/backend/host/windows.py +32 -1
  13. pyhw/backend/kernel/kernelBase.py +3 -2
  14. pyhw/backend/kernel/kernelInfo.py +6 -0
  15. pyhw/backend/kernel/windows.py +32 -1
  16. pyhw/backend/memory/memoryBase.py +8 -4
  17. pyhw/backend/memory/windows.py +36 -0
  18. pyhw/backend/nic/linux.py +2 -0
  19. pyhw/backend/nic/nicBase.py +8 -4
  20. pyhw/backend/nic/windows.py +44 -0
  21. pyhw/backend/npu/linux.py +18 -2
  22. pyhw/backend/npu/npuBase.py +8 -6
  23. pyhw/backend/npu/windows.py +40 -0
  24. pyhw/backend/os/osBase.py +6 -3
  25. pyhw/backend/os/osInfo.py +6 -0
  26. pyhw/backend/os/windows.py +43 -0
  27. pyhw/backend/shell/shellBase.py +4 -1
  28. pyhw/backend/shell/shellInfo.py +10 -0
  29. pyhw/backend/shell/unix.py +2 -10
  30. pyhw/backend/shell/windows.py +29 -0
  31. pyhw/backend/title/titleBase.py +2 -2
  32. pyhw/backend/title/titleInfo.py +9 -0
  33. pyhw/backend/title/unix.py +2 -9
  34. pyhw/backend/title/windows.py +10 -1
  35. pyhw/backend/uptime/linux.py +3 -3
  36. pyhw/backend/uptime/macos.py +3 -3
  37. pyhw/backend/uptime/uptimeBase.py +6 -3
  38. pyhw/backend/uptime/windows.py +49 -0
  39. pyhw/frontend/color/colorConfig.py +52 -0
  40. pyhw/frontend/logo/ascii/windows_10.pyhw +19 -0
  41. pyhw/frontend/logo/ascii/windows_11.pyhw +17 -0
  42. pyhw/frontend/logo/ascii/windows_2025.pyhw +17 -0
  43. pyhw/frontend/logo/ascii/windows_old.pyhw +16 -0
  44. pyhw/pyhwUtil/pyhwUtil.py +13 -4
  45. {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/METADATA +8 -4
  46. {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/RECORD +50 -36
  47. {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/LICENSE +0 -0
  48. {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/WHEEL +0 -0
  49. {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/entry_points.txt +0 -0
  50. {pyhw-0.7.4.dist-info → pyhw-0.9.0.dist-info}/top_level.txt +0 -0
pyhw/__init__.py CHANGED
@@ -1 +1 @@
1
- __version__ = '0.7.4'
1
+ __version__ = '0.9.0'
pyhw/__main__.py CHANGED
@@ -17,8 +17,8 @@ from .pyhwUtil import getOS, selectOSLogo
17
17
 
18
18
  def main():
19
19
  current_os = getOS()
20
- if current_os not in ["linux", "macos", "freebsd"]:
21
- print(f"Only Linux, macOS, and FreeBSD is supported for now. Current os: {current_os}")
20
+ if current_os not in ["linux", "macos", "freebsd", "windows"]:
21
+ print(f"Only Linux, macOS, FreeBSD and Windows are supported for now. Current OS: {current_os}")
22
22
  return
23
23
  data = Data()
24
24
  data.title = TitleDetect(os=current_os).getTitle().title
@@ -1,6 +1,3 @@
1
- from .linux import CPUDetectLinux
2
- from .macos import CPUDetectMacOS
3
- from .bsd import CPUDetectBSD
4
1
  from ...pyhwException import OSUnsupportedException
5
2
 
6
3
 
@@ -10,10 +7,16 @@ class CPUDetect:
10
7
 
11
8
  def getCPUInfo(self):
12
9
  if self.OS == "linux":
10
+ from .linux import CPUDetectLinux
13
11
  return CPUDetectLinux().getCPUInfo()
14
12
  elif self.OS == "macos":
13
+ from .macos import CPUDetectMacOS
15
14
  return CPUDetectMacOS().getCPUInfo()
16
15
  elif self.OS == "freebsd":
16
+ from .bsd import CPUDetectBSD
17
17
  return CPUDetectBSD().getCPUInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import CPUDetectWindows
20
+ return CPUDetectWindows().getCPUInfo()
18
21
  else:
19
22
  raise OSUnsupportedException("Unsupported operating system")
pyhw/backend/cpu/linux.py CHANGED
@@ -73,6 +73,9 @@ class CPUDetectLinux:
73
73
  model = compatible.split(",")[-1]
74
74
  if model.startswith("sun"):
75
75
  self.__cpuInfo.model = f"Allwinner {model.split('-')[-1].upper()} ({model})"
76
+ elif "cvitek" in compatible:
77
+ model = compatible.split(",")[-1]
78
+ self.__cpuInfo.model = f"Cvitek {model}"
76
79
  else:
77
80
  pass
78
81
 
@@ -0,0 +1,48 @@
1
+ import re
2
+ import os
3
+ import subprocess
4
+ from .cpuInfo import CPUInfo
5
+ import json
6
+
7
+
8
+ class CPUDetectWindows:
9
+ def __init__(self):
10
+ self.__cpuInfo = CPUInfo()
11
+
12
+ def getCPUInfo(self):
13
+ self.__getCPUInfo()
14
+ self.__modelClean()
15
+ if self.__cpuInfo.model == "":
16
+ self.__cpuInfo.model = "Unknown"
17
+ if self.__cpuInfo.model != "":
18
+ self.__cpuInfo.cpu = self.__cpuInfo.model
19
+ if self.__cpuInfo.cores != "":
20
+ self.__cpuInfo.cpu += f" ({self.__cpuInfo.cores})"
21
+ if self.__cpuInfo.frequency != "":
22
+ self.__cpuInfo.cpu += f" @ {self.__cpuInfo.frequency}"
23
+ return self.__cpuInfo
24
+
25
+ def __getCPUInfo(self):
26
+ COMMAND = "Get-CimInstance -ClassName Win32_Processor | Select-Object Name,NumberOfLogicalProcessors,MaxClockSpeed | ConvertTo-JSON"
27
+
28
+ try:
29
+ result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
30
+ except subprocess.SubprocessError:
31
+ exit(-1)
32
+
33
+ res = json.loads(result.stdout)
34
+ name = res["Name"]
35
+ cores = res["NumberOfLogicalProcessors"]
36
+ frequency = round(int(res["MaxClockSpeed"]) / 1000.0, 2) # GHz
37
+ if "@" in name:
38
+ self.__cpuInfo.model = name.split("@")[0].strip()
39
+ else:
40
+ self.__cpuInfo.model = name
41
+ self.__cpuInfo.cores = str(cores)
42
+ self.__cpuInfo.frequency = f"{frequency:.2f} GHz"
43
+
44
+ def __modelClean(self):
45
+ self.__cpuInfo.model = self.__cpuInfo.model.replace("(R)", "")
46
+ self.__cpuInfo.model = self.__cpuInfo.model.replace("(TM)", "")
47
+ self.__cpuInfo.model = self.__cpuInfo.model.replace("CPU ", "")
48
+
@@ -1,6 +1,4 @@
1
- from .linux import GPUDetectLinux
2
- from .macos import GPUDetectMacOS
3
- from .bsd import GPUDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class GPUDetect:
@@ -9,10 +7,16 @@ class GPUDetect:
9
7
 
10
8
  def getGPUInfo(self):
11
9
  if self.OS == "linux":
10
+ from .linux import GPUDetectLinux
12
11
  return GPUDetectLinux().getGPUInfo()
13
12
  elif self.OS == "macos":
13
+ from .macos import GPUDetectMacOS
14
14
  return GPUDetectMacOS().getGPUInfo()
15
15
  elif self.OS == "freebsd":
16
+ from .bsd import GPUDetectBSD
16
17
  return GPUDetectBSD().getGPUInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import GPUDetectWindows
20
+ return GPUDetectWindows().getGPUInfo()
17
21
  else:
18
- raise NotImplementedError("Unsupported operating system")
22
+ raise OSUnsupportedException("Unsupported operating system")
pyhw/backend/gpu/linux.py CHANGED
@@ -29,7 +29,7 @@ class GPUDetectLinux:
29
29
 
30
30
  def __handleNonePciDevices(self):
31
31
  # if detector can't find any VGA/Display/3D GPUs, assume the host is a sbc device, this function is a placeholder for a more advanced method.
32
- if getArch() == "aarch64" or getArch() == "arm32":
32
+ if getArch() in ["aarch64", "arm32", "riscv64"]:
33
33
  self.__gpuInfo.number = 1
34
34
  self.__gpuInfo.gpus.append(f"{CPUDetect(os='linux').getCPUInfo().model} [SOC Integrated]")
35
35
  else:
@@ -0,0 +1,41 @@
1
+ import subprocess
2
+ from .gpuInfo import GPUInfo
3
+ from ..cpu import CPUDetect
4
+ from ...pyhwUtil import getArch
5
+ import pypci
6
+
7
+
8
+ class GPUDetectWindows:
9
+ def __init__(self):
10
+ self.__gpuInfo = GPUInfo()
11
+
12
+ def getGPUInfo(self):
13
+ self.__getGPUInfo()
14
+ self.__sortGPUList()
15
+ return self.__gpuInfo
16
+
17
+ def __getGPUInfo(self):
18
+ gpu_devices = pypci.PCI().FindAllVGA()
19
+ if len(gpu_devices) == 0:
20
+ self.__handleNonePciDevices()
21
+ else:
22
+ for device in gpu_devices:
23
+ if device.subsystem_device_name != "":
24
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
25
+ else:
26
+ device_name = f"{device.vendor_name} {device.device_name}"
27
+ self.__gpuInfo.gpus.append(self.__gpuNameClean(device_name))
28
+ self.__gpuInfo.number += 1
29
+
30
+ def __handleNonePciDevices(self):
31
+ self.__gpuInfo.gpus.append("Not found")
32
+ self.__gpuInfo.number = 1
33
+
34
+ @staticmethod
35
+ def __gpuNameClean(gpu_name: str):
36
+ gpu_name_clean = gpu_name.replace("Corporation ", "")
37
+ return gpu_name_clean
38
+
39
+ def __sortGPUList(self):
40
+ self.__gpuInfo.gpus.sort()
41
+
@@ -1,7 +1,3 @@
1
- from .linux import HostDetectLinux
2
- from .macos import HostDetectMacOS
3
- from .windows import HostDetectWindows
4
- from .bsd import HostDetectBSD
5
1
  from ...pyhwException import OSUnsupportedException
6
2
 
7
3
 
@@ -11,12 +7,16 @@ class HostDetect:
11
7
 
12
8
  def getHostInfo(self):
13
9
  if self.OS == "linux":
10
+ from .linux import HostDetectLinux
14
11
  return HostDetectLinux().getHostInfo()
15
12
  elif self.OS == "macos":
13
+ from .macos import HostDetectMacOS
16
14
  return HostDetectMacOS().getHostInfo()
17
15
  elif self.OS == "freebsd":
16
+ from .bsd import HostDetectBSD
18
17
  return HostDetectBSD().getHostInfo()
19
18
  elif self.OS == "windows":
20
- pass
19
+ from .windows import HostDetectWindows
20
+ return HostDetectWindows().getHostInfo()
21
21
  else:
22
22
  raise OSUnsupportedException("Unsupported operating system")
@@ -3,11 +3,20 @@ from dataclasses import dataclass
3
3
 
4
4
  @dataclass
5
5
  class HostInfo:
6
- model = ""
7
- family = ""
8
- name = ""
9
- version = ""
10
- sku = ""
11
- serial = ""
12
- uuid = ""
13
- vendor = ""
6
+ """
7
+ HostInfo class to store host information.
8
+ """
9
+ def __init__(self):
10
+ """
11
+ Initialize HostInfo class, model attribute is required.
12
+ """
13
+ self.os = ""
14
+ self.model = ""
15
+ self.family = ""
16
+ self.name = ""
17
+ self.version = ""
18
+ self.sku = ""
19
+ self.serial = ""
20
+ self.uuid = ""
21
+ self.vendor = ""
22
+
@@ -39,7 +39,7 @@ class HostDetectLinux:
39
39
  self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
40
40
  except FileNotFoundError:
41
41
  pass
42
- elif self._arch in ["aarch64", "arm32"]:
42
+ elif self._arch in ["aarch64", "arm32", "riscv64"]:
43
43
  # try to find dmi folder since some arm based desktops and servers may have same structure as x86_64 machines.
44
44
  if os.path.exists("/sys/devices/virtual/dmi/id"):
45
45
  try:
@@ -1,5 +1,36 @@
1
1
  """
2
2
  In dev.
3
3
  """
4
+ from ...pyhwUtil import getArch
5
+ from ...pyhwException import BackendException
6
+ from .hostInfo import HostInfo
7
+ import winreg
8
+
9
+
4
10
  class HostDetectWindows:
5
- pass
11
+ def __init__(self):
12
+ self._hostInfo = HostInfo()
13
+ self._arch = getArch()
14
+
15
+ def getHostInfo(self):
16
+ self._getModel()
17
+ return self._hostInfo
18
+
19
+ def _getModel(self):
20
+ try:
21
+ key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"HARDWARE\DESCRIPTION\System\BIOS")
22
+ manufacturer, _ = winreg.QueryValueEx(key, "SystemManufacturer")
23
+ name, _ = winreg.QueryValueEx(key, "SystemProductName")
24
+ version, _ = winreg.QueryValueEx(key, "SystemVersion")
25
+ winreg.CloseKey(key)
26
+ except FileNotFoundError:
27
+ raise BackendException("Unable to retrieve system information.")
28
+ self._hostInfo.name = name
29
+ self._hostInfo.version = version
30
+ self._hostInfo.vendor = manufacturer
31
+ self.__handleVM()
32
+ self._hostInfo.model = self._hostInfo.name + " " + self._hostInfo.version
33
+
34
+ def __handleVM(self):
35
+ if self._hostInfo.name.startswith("VMware"):
36
+ self._hostInfo.version = ""
@@ -1,4 +1,3 @@
1
- from .unix import KernelDetectUnix
2
1
  from ...pyhwException import OSUnsupportedException
3
2
 
4
3
 
@@ -8,8 +7,10 @@ class KernelDetect:
8
7
 
9
8
  def getKernelInfo(self):
10
9
  if self.OS in ["linux", "macos", "freebsd"]:
10
+ from .unix import KernelDetectUnix
11
11
  return KernelDetectUnix().getKernelInfo()
12
12
  elif self.OS == "windows":
13
- raise OSUnsupportedException("Unsupported operating system")
13
+ from .windows import KernelDetectWindows
14
+ return KernelDetectWindows().getKernelInfo()
14
15
  else:
15
16
  raise OSUnsupportedException("Unsupported operating system")
@@ -3,7 +3,13 @@ from dataclasses import dataclass
3
3
 
4
4
  @dataclass
5
5
  class KernelInfo:
6
+ """
7
+ Data class for storing kernel information.
8
+ """
6
9
  def __init__(self):
10
+ """
11
+ Initialize the data class, kernel attribute is required.
12
+ """
7
13
  self.name = ""
8
14
  self.version = ""
9
15
  self.machine = ""
@@ -1,7 +1,38 @@
1
1
  """
2
2
  In dev.
3
3
  """
4
+ from .kernelInfo import KernelInfo
5
+ from ...pyhwException import BackendException
6
+ import platform
7
+ import winreg
4
8
 
5
9
 
6
10
  class KernelDetectWindows:
7
- pass
11
+ def __init__(self):
12
+ self.__kernelInfo = KernelInfo()
13
+
14
+ def getKernelInfo(self):
15
+ version = platform.version()
16
+ machine = platform.machine()
17
+ display = self.__get_windows_version()
18
+ if display != "":
19
+ self.__kernelInfo.kernel = f"{version} ({display}) {machine}"
20
+ else:
21
+ self.__kernelInfo.kernel = f"{version} {machine}"
22
+ return self.__kernelInfo
23
+
24
+ @staticmethod
25
+ def __get_windows_version():
26
+ try:
27
+ key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
28
+ display_version, _ = winreg.QueryValueEx(key, "DisplayVersion")
29
+ winreg.CloseKey(key)
30
+ return str(display_version)
31
+ except:
32
+ try:
33
+ key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Microsoft\Windows NT\CurrentVersion")
34
+ release_id, _ = winreg.QueryValueEx(key, "ReleaseId")
35
+ winreg.CloseKey(key)
36
+ return str(release_id)
37
+ except:
38
+ return ""
@@ -1,6 +1,4 @@
1
- from .linux import MemoryDetectLinux
2
- from .macos import MemoryDetectMacOS
3
- from .bsd import MemoryDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class MemoryDetect:
@@ -9,10 +7,16 @@ class MemoryDetect:
9
7
 
10
8
  def getMemoryInfo(self):
11
9
  if self.OS == "linux":
10
+ from .linux import MemoryDetectLinux
12
11
  return MemoryDetectLinux().getMemoryInfo()
13
12
  elif self.OS == "macos":
13
+ from .macos import MemoryDetectMacOS
14
14
  return MemoryDetectMacOS().getMemoryInfo()
15
15
  elif self.OS == "freebsd":
16
+ from .bsd import MemoryDetectBSD
16
17
  return MemoryDetectBSD().getMemoryInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import MemoryDetectWindows
20
+ return MemoryDetectWindows().getMemoryInfo()
17
21
  else:
18
- raise NotImplementedError("Unsupported operating system")
22
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,36 @@
1
+ from ...pyhwException import BackendException
2
+ from .memoryInfo import MemoryInfo
3
+ import subprocess
4
+ import json
5
+
6
+
7
+ class MemoryDetectWindows:
8
+ def __init__(self):
9
+ self._memoryInfo = MemoryInfo()
10
+
11
+ def getMemoryInfo(self):
12
+ self._getMemory()
13
+ self._memoryInfo.memory = f"{self._memoryInfo.used} MiB / {self._memoryInfo.total} MiB"
14
+ return self._memoryInfo
15
+
16
+ def _getMemory(self):
17
+ COMMAND = 'Get-CimInstance -ClassName Win32_OperatingSystem | Select-Object FreePhysicalMemory,TotalVisibleMemorySize | ConvertTo-JSON'
18
+ try:
19
+ result = subprocess.run(["powershell", "-NoProfile", "-Command", COMMAND], capture_output=True, text=True)
20
+ except subprocess.SubprocessError:
21
+ raise BackendException("Failed to get memory information on Windows.")
22
+
23
+ res = json.loads(result.stdout)
24
+ free_memory = int(res['FreePhysicalMemory']) / 1024
25
+ total_memory = int(res['TotalVisibleMemorySize']) / 1024
26
+ used_memory = total_memory - free_memory
27
+ self._memoryInfo.total = round(total_memory, 2)
28
+ self._memoryInfo.available = round(free_memory, 2)
29
+ self._memoryInfo.used = round(used_memory, 2)
30
+
31
+
32
+
33
+
34
+
35
+
36
+
pyhw/backend/nic/linux.py CHANGED
@@ -39,6 +39,8 @@ class NICDetectLinux:
39
39
  for interface in interfaces:
40
40
  try:
41
41
  if_ip = subprocess.run(["bash", "-c", f"ip -4 addr show {interface} | grep inet | awk '{{print $2}}'"], capture_output=True, text=True).stdout.strip().split("/")[0]
42
+ if if_ip == "":
43
+ continue
42
44
  self._nicInfo.nics.append(f"{interface} @ {if_ip}")
43
45
  self._nicInfo.number += 1
44
46
  except:
@@ -1,6 +1,4 @@
1
- from .linux import NICDetectLinux
2
- from .macos import NICDetectMacOS
3
- from .bsd import NICDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class NICDetect:
@@ -16,10 +14,16 @@ class NICDetect:
16
14
  :return: dataclass NICInfo, direct attr: nics
17
15
  """
18
16
  if self.OS == "linux":
17
+ from .linux import NICDetectLinux
19
18
  return NICDetectLinux().getNICInfo()
20
19
  elif self.OS == "macos":
20
+ from .macos import NICDetectMacOS
21
21
  return NICDetectMacOS().getNICInfo()
22
22
  elif self.OS == "freebsd":
23
+ from .bsd import NICDetectBSD
23
24
  return NICDetectBSD().getNICInfo()
25
+ elif self.OS == "windows":
26
+ from .windows import NICDetectWindows
27
+ return NICDetectWindows().getNICInfo()
24
28
  else:
25
- raise NotImplementedError("Unsupported operating system")
29
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,44 @@
1
+ import subprocess
2
+ from .nicInfo import NICInfo
3
+ from ...pyhwUtil import getArch
4
+ from ...pyhwException import BackendException
5
+ import pypci
6
+ import os
7
+
8
+
9
+ class NICDetectWindows:
10
+ def __init__(self):
11
+ self._nicInfo = NICInfo()
12
+
13
+ def getNICInfo(self):
14
+ self._getNICInfo()
15
+ self._sortNICList()
16
+ return self._nicInfo
17
+
18
+ def _getNICInfo(self):
19
+ nic_devices = pypci.PCI().FindAllNIC()
20
+ if len(nic_devices) == 0:
21
+ self.__handleNonePciDevices()
22
+ else:
23
+ for device in nic_devices:
24
+ if device.subsystem_device_name != "":
25
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
26
+ else:
27
+ device_name = f"{device.vendor_name} {device.device_name}"
28
+ self._nicInfo.nics.append(self._nicNameClean(device_name))
29
+ self._nicInfo.number += 1
30
+
31
+ def __handleNonePciDevices(self):
32
+ # need to update
33
+ self._nicInfo.nics.append("Not found")
34
+ self._nicInfo.number = 1
35
+
36
+ @staticmethod
37
+ def _nicNameClean(nic_name: str):
38
+ nic_name_clean = nic_name.replace("Corporation ", "")
39
+ return nic_name_clean
40
+
41
+ def _sortNICList(self):
42
+ return self._nicInfo.nics.sort()
43
+
44
+
pyhw/backend/npu/linux.py CHANGED
@@ -1,5 +1,6 @@
1
1
  from .npuInfo import NPUInfo
2
2
  import pypci
3
+ import os
3
4
 
4
5
 
5
6
  class NPUDetectLinux:
@@ -25,9 +26,24 @@ class NPUDetectLinux:
25
26
  self._npuInfo.number += 1
26
27
 
27
28
  def _handleNonePciDevices(self):
29
+ if os.path.exists("/sys/firmware/devicetree/base/tpu/compatible"):
30
+ try:
31
+ with open("/sys/firmware/devicetree/base/tpu/compatible", "r") as f:
32
+ compatible = f.read().strip()
33
+ except FileNotFoundError:
34
+ compatible = ""
35
+ if "cvitek" in compatible:
36
+ model = compatible.split(",")[-1]
37
+ self._npuInfo.npus.append(f"Cvitek {model}")
38
+ self._npuInfo.number = 1
39
+ else:
40
+ pass
41
+ else:
42
+ pass
28
43
  # Place Holder for unknown NPU
29
- self._npuInfo.number = 1
30
- self._npuInfo.npus.append("Not found")
44
+ if self._npuInfo.number == 0:
45
+ self._npuInfo.number = 1
46
+ self._npuInfo.npus.append("Not found")
31
47
 
32
48
  @staticmethod
33
49
  def _npuNameClean(npu_name: str):
@@ -1,6 +1,4 @@
1
- from .linux import NPUDetectLinux
2
- from .macos import NPUDetectMacOS
3
- from .bsd import NPUDetectBSD
1
+ from ...pyhwException import OSUnsupportedException
4
2
 
5
3
 
6
4
  class NPUDetect:
@@ -9,12 +7,16 @@ class NPUDetect:
9
7
 
10
8
  def getNPUInfo(self):
11
9
  if self.OS == "linux":
10
+ from .linux import NPUDetectLinux
12
11
  return NPUDetectLinux().getNPUInfo()
13
12
  elif self.OS == "macos":
13
+ from .macos import NPUDetectMacOS
14
14
  return NPUDetectMacOS().getNPUInfo()
15
15
  elif self.OS == "freebsd":
16
+ from .bsd import NPUDetectBSD
16
17
  return NPUDetectBSD().getNPUInfo()
18
+ elif self.OS == "windows":
19
+ from .windows import NPUDetectWindows
20
+ return NPUDetectWindows().getNPUInfo()
17
21
  else:
18
- raise NotImplementedError("Unsupported operating system")
19
-
20
-
22
+ raise OSUnsupportedException("Unsupported operating system")
@@ -0,0 +1,40 @@
1
+ from .npuInfo import NPUInfo
2
+ import pypci
3
+
4
+
5
+ class NPUDetectWindows:
6
+ def __init__(self):
7
+ self._npuInfo = NPUInfo()
8
+
9
+ def getNPUInfo(self):
10
+ self._getNPUInfo()
11
+ self._sortNPUList()
12
+ return self._npuInfo
13
+
14
+ def _getNPUInfo(self):
15
+ npu_devices = pypci.PCI().FindAllNPU()
16
+ if len(npu_devices) == 0:
17
+ self._handleNonePciDevices()
18
+ else:
19
+ for device in npu_devices:
20
+ if device.subsystem_device_name != "":
21
+ device_name = f"{device.vendor_name} {device.device_name} ({device.subsystem_device_name})"
22
+ else:
23
+ device_name = f"{device.vendor_name} {device.device_name}"
24
+ self._npuInfo.npus.append(self._npuNameClean(device_name))
25
+ self._npuInfo.number += 1
26
+
27
+ def _handleNonePciDevices(self):
28
+ # Place Holder for unknown NPU
29
+ self._npuInfo.number = 1
30
+ self._npuInfo.npus.append("Not found")
31
+
32
+ @staticmethod
33
+ def _npuNameClean(npu_name: str):
34
+ npu_name_clean = npu_name.replace("Corporation ", "")
35
+ return npu_name_clean
36
+
37
+ def _sortNPUList(self):
38
+ self._npuInfo.npus.sort()
39
+
40
+
pyhw/backend/os/osBase.py CHANGED
@@ -1,6 +1,3 @@
1
- from .linux import OSDetectLinux
2
- from .macos import OSDetectMacOS
3
- from .bsd import OSDetectBSD
4
1
  from ...pyhwException import OSUnsupportedException
5
2
 
6
3
 
@@ -10,10 +7,16 @@ class OSDetect:
10
7
 
11
8
  def getOSInfo(self):
12
9
  if self.__OS == "linux":
10
+ from .linux import OSDetectLinux
13
11
  return OSDetectLinux().getOSInfo()
14
12
  elif self.__OS == "macos":
13
+ from .macos import OSDetectMacOS
15
14
  return OSDetectMacOS().getOSInfo()
16
15
  elif self.__OS == "freebsd":
16
+ from .bsd import OSDetectBSD
17
17
  return OSDetectBSD().getOSInfo()
18
+ elif self.__OS == "windows":
19
+ from .windows import OSDetectWindows
20
+ return OSDetectWindows().getOSInfo()
18
21
  else:
19
22
  raise OSUnsupportedException("Unsupported operating system")
pyhw/backend/os/osInfo.py CHANGED
@@ -3,7 +3,13 @@ from dataclasses import dataclass
3
3
 
4
4
  @dataclass
5
5
  class OSInfo:
6
+ """
7
+ Dataclass to hold the OS information
8
+ """
6
9
  def __init__(self):
10
+ """
11
+ Initialize the dataclass, prettyName and id attributes are required.
12
+ """
7
13
  self.prettyName = ""
8
14
  self.name = ""
9
15
  self.id = ""