From 0a0913cab1ebc5d7c8767aff245ec4e7ce7f6555 Mon Sep 17 00:00:00 2001 From: akashicmarga Date: Thu, 26 Mar 2026 17:58:13 +0530 Subject: [PATCH] Fix KeyError for newer Apple Silicon chips (M3/M4/M5) Replace hardcoded E0/E1/P0/P1 cluster name lookups with dynamic detection that averages all available E-Cluster and P-Cluster entries. This fixes crashes on M3, M4, M5 and any future chips that report different cluster naming conventions. Tested on Apple M5 Pro. --- asitop/parsers.py | 32 ++++++++------------------------ 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/asitop/parsers.py b/asitop/parsers.py index d3530d4..b25680b 100644 --- a/asitop/parsers.py +++ b/asitop/parsers.py @@ -95,33 +95,17 @@ def parse_cpu_metrics(powermetrics_parse): cpu_metric_dict["e_core"] = e_core cpu_metric_dict["p_core"] = p_core if "E-Cluster_active" not in cpu_metric_dict: - # M1 Ultra - cpu_metric_dict["E-Cluster_active"] = int( - (cpu_metric_dict["E0-Cluster_active"] + cpu_metric_dict["E1-Cluster_active"])/2) + e_active_vals = [v for k, v in cpu_metric_dict.items() if k.startswith("E") and k.endswith("_active")] + cpu_metric_dict["E-Cluster_active"] = int(sum(e_active_vals) / len(e_active_vals)) if e_active_vals else 0 if "E-Cluster_freq_Mhz" not in cpu_metric_dict: - # M1 Ultra - cpu_metric_dict["E-Cluster_freq_Mhz"] = max( - cpu_metric_dict["E0-Cluster_freq_Mhz"], cpu_metric_dict["E1-Cluster_freq_Mhz"]) + e_freq_vals = [v for k, v in cpu_metric_dict.items() if k.startswith("E") and k.endswith("_freq_Mhz")] + cpu_metric_dict["E-Cluster_freq_Mhz"] = max(e_freq_vals) if e_freq_vals else 0 if "P-Cluster_active" not in cpu_metric_dict: - if "P2-Cluster_active" in cpu_metric_dict: - # M1 Ultra - cpu_metric_dict["P-Cluster_active"] = int((cpu_metric_dict["P0-Cluster_active"] + cpu_metric_dict["P1-Cluster_active"] + - cpu_metric_dict["P2-Cluster_active"] + cpu_metric_dict["P3-Cluster_active"]) / 4) - else: - cpu_metric_dict["P-Cluster_active"] = int( - (cpu_metric_dict["P0-Cluster_active"] + cpu_metric_dict["P1-Cluster_active"])/2) + p_active_vals = [v for k, v in cpu_metric_dict.items() if k.startswith("P") and k.endswith("_active")] + cpu_metric_dict["P-Cluster_active"] = int(sum(p_active_vals) / len(p_active_vals)) if p_active_vals else 0 if "P-Cluster_freq_Mhz" not in cpu_metric_dict: - if "P2-Cluster_freq_Mhz" in cpu_metric_dict: - # M1 Ultra - freqs = [ - cpu_metric_dict["P0-Cluster_freq_Mhz"], - cpu_metric_dict["P1-Cluster_freq_Mhz"], - cpu_metric_dict["P2-Cluster_freq_Mhz"], - cpu_metric_dict["P3-Cluster_freq_Mhz"]] - cpu_metric_dict["P-Cluster_freq_Mhz"] = max(freqs) - else: - cpu_metric_dict["P-Cluster_freq_Mhz"] = max( - cpu_metric_dict["P0-Cluster_freq_Mhz"], cpu_metric_dict["P1-Cluster_freq_Mhz"]) + p_freq_vals = [v for k, v in cpu_metric_dict.items() if k.startswith("P") and k.endswith("_freq_Mhz")] + cpu_metric_dict["P-Cluster_freq_Mhz"] = max(p_freq_vals) if p_freq_vals else 0 # power cpu_metric_dict["ane_W"] = cpu_metrics["ane_energy"]/1000 #cpu_metric_dict["dram_W"] = cpu_metrics["dram_energy"]/1000