xref: /aosp_15_r20/external/perfetto/test/trace_processor/diff_tests/stdlib/wattson/tests.py (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1#!/usr/bin/env python3
2# Copyright (C) 2024 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License a
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15
16from python.generators.diff_tests.testing import Csv, Path, DataPath
17from python.generators.diff_tests.testing import DiffTestBlueprint
18from python.generators.diff_tests.testing import TestSuite
19
20
21class WattsonStdlib(TestSuite):
22  consolidate_tables_template = ('''
23      SELECT
24        sum(dur) as duration,
25        SUM(l3_hit_count) AS l3_hit_count,
26        SUM(l3_miss_count) AS l3_miss_count,
27        freq_0, idle_0, freq_1, idle_1, freq_2, idle_2, freq_3, idle_3,
28        freq_4, idle_4, freq_5, idle_5, freq_6, idle_6, freq_7, idle_7,
29        suspended
30      FROM SYSTEM_STATE_TABLE
31      GROUP BY
32        freq_0, idle_0, freq_1, idle_1, freq_2, idle_2, freq_3, idle_3,
33        freq_4, idle_4, freq_5, idle_5, freq_6, idle_6, freq_7, idle_7,
34        suspended
35      ORDER BY duration desc
36      LIMIT 20;
37      ''')
38
39  # Test raw system state before any grouping
40  def test_wattson_system_state(self):
41    return DiffTestBlueprint(
42        trace=DataPath('wattson_dsu_pmu.pb'),
43        query="""
44        INCLUDE PERFETTO MODULE wattson.system_state;
45        SELECT * from wattson_system_states
46        ORDER by ts DESC
47        LIMIT 20
48        """,
49        out=Csv("""
50        "ts","dur","l3_hit_count","l3_miss_count","freq_0","idle_0","freq_1","idle_1","freq_2","idle_2","freq_3","idle_3","freq_4","idle_4","freq_5","idle_5","freq_6","idle_6","freq_7","idle_7","suspended"
51        370103436540,339437,"[NULL]","[NULL]",738000,-1,738000,1,738000,-1,738000,-1,400000,-1,400000,1,1106000,1,1106000,1,0
52        370103419857,16683,"[NULL]","[NULL]",738000,-1,738000,1,738000,1,738000,-1,400000,-1,400000,1,1106000,1,1106000,1,0
53        370103213314,206543,"[NULL]","[NULL]",738000,1,738000,1,738000,1,738000,-1,400000,-1,400000,1,1106000,1,1106000,1,0
54        370103079729,133585,"[NULL]","[NULL]",738000,1,738000,1,738000,1,738000,-1,400000,-1,400000,1,1106000,-1,1106000,1,0
55        370102869076,210653,"[NULL]","[NULL]",738000,1,738000,1,738000,1,738000,-1,400000,1,400000,1,1106000,-1,1106000,1,0
56        370102837378,31698,"[NULL]","[NULL]",738000,1,738000,1,738000,-1,738000,-1,400000,1,400000,1,1106000,-1,1106000,1,0
57        370102832862,4516,"[NULL]","[NULL]",738000,1,738000,1,738000,-1,738000,-1,400000,1,400000,1,1106000,-1,1106000,-1,0
58        370102831844,1018,"[NULL]","[NULL]",738000,1,738000,1,738000,-1,738000,-1,400000,1,400000,1,1106000,-1,984000,-1,0
59        370102819475,12369,"[NULL]","[NULL]",738000,1,738000,1,738000,-1,738000,-1,400000,1,400000,1,984000,-1,984000,-1,0
60        370102816586,1098,"[NULL]","[NULL]",738000,1,574000,1,574000,-1,574000,-1,400000,1,400000,1,984000,-1,984000,-1,0
61        370102669043,147543,"[NULL]","[NULL]",574000,1,574000,1,574000,-1,574000,-1,400000,1,400000,1,984000,-1,984000,-1,0
62        370102044564,624479,"[NULL]","[NULL]",574000,1,574000,1,574000,-1,574000,1,400000,1,400000,1,984000,-1,984000,-1,0
63        370100810360,1234204,"[NULL]","[NULL]",574000,1,574000,1,574000,-1,574000,1,400000,1,400000,1,984000,1,984000,-1,0
64        370100731096,79264,"[NULL]","[NULL]",574000,1,574000,1,574000,-1,574000,-1,400000,1,400000,1,984000,1,984000,-1,0
65        370100411312,319784,"[NULL]","[NULL]",574000,1,574000,1,574000,1,574000,-1,400000,1,400000,1,984000,1,984000,-1,0
66        370100224219,187093,"[NULL]","[NULL]",574000,-1,574000,1,574000,1,574000,-1,400000,1,400000,1,984000,1,984000,-1,0
67        370100171729,52490,"[NULL]","[NULL]",574000,1,574000,1,574000,1,574000,-1,400000,1,400000,1,984000,1,984000,-1,0
68        370096452775,3718954,"[NULL]","[NULL]",574000,1,574000,1,574000,1,574000,1,400000,1,400000,1,984000,1,984000,-1,0
69        370096412858,39917,"[NULL]","[NULL]",574000,-1,574000,1,574000,1,574000,1,400000,1,400000,1,984000,1,984000,-1,0
70        370096347307,65551,"[NULL]","[NULL]",574000,-1,574000,1,574000,1,574000,1,400000,1,400000,1,984000,-1,984000,-1,0
71            """))
72
73  # Test fixup of deep idle offset and time marker window.
74  def test_wattson_time_window(self):
75    return DiffTestBlueprint(
76        trace=DataPath('wattson_dsu_pmu.pb'),
77        query="""
78        INCLUDE PERFETTO MODULE wattson.system_state;
79
80        CREATE PERFETTO TABLE wattson_time_window
81        AS
82        SELECT 362426061658 AS ts, 5067704349 AS dur;
83
84        -- Final table that is cut off to fit within the requested time window.
85        CREATE VIRTUAL TABLE time_window_intersect
86          USING SPAN_JOIN(wattson_system_states, wattson_time_window);
87        """ + self.consolidate_tables_template.replace("SYSTEM_STATE_TABLE",
88                                                       "time_window_intersect"),
89        out=Csv("""
90            "duration","l3_hit_count","l3_miss_count","freq_0","idle_0","freq_1","idle_1","freq_2","idle_2","freq_3","idle_3","freq_4","idle_4","freq_5","idle_5","freq_6","idle_6","freq_7","idle_7","suspended"
91            59232508,2796301,1232977,574000,0,574000,1,574000,1,574000,0,553000,0,553000,0,500000,1,500000,0,0
92            50664181,2364802,1133322,574000,0,574000,1,574000,1,574000,0,553000,1,553000,0,500000,0,500000,0,0
93            41917186,2020898,920691,574000,0,574000,0,574000,1,574000,1,553000,0,553000,0,500000,0,500000,1,0
94            33778317,1478303,683731,300000,0,300000,0,300000,1,300000,1,400000,0,400000,0,500000,0,500000,1,0
95            32703489,1428203,690001,300000,0,300000,0,300000,1,300000,0,400000,0,400000,0,500000,0,500000,0,0
96            28770906,1588177,715673,574000,0,574000,0,574000,1,574000,0,553000,1,553000,0,500000,1,500000,0,0
97            28310872,1211262,566873,300000,0,300000,1,300000,1,300000,0,400000,0,400000,0,500000,0,500000,0,0
98            26754474,1224826,569901,300000,0,300000,1,300000,0,300000,0,400000,1,400000,0,500000,0,500000,0,0
99            24816645,1047517,467614,300000,0,300000,1,300000,1,300000,0,400000,0,400000,0,500000,1,500000,0,0
100            24251986,984546,417947,300000,0,300000,0,300000,1,300000,0,400000,1,400000,0,500000,1,500000,0,0
101            23771603,987803,450930,300000,0,300000,1,300000,1,300000,0,400000,1,400000,0,500000,0,500000,0,0
102            22988523,984240,473025,300000,0,300000,0,300000,1,300000,0,400000,0,400000,0,500000,0,500000,1,0
103            22057168,998933,453689,300000,0,300000,1,300000,1,300000,0,400000,0,400000,0,500000,0,500000,1,0
104            21663200,1034424,445500,574000,0,574000,0,574000,1,574000,0,553000,0,553000,0,500000,0,500000,1,0
105            20665650,974100,442861,300000,0,300000,0,300000,1,300000,0,400000,0,400000,1,500000,0,500000,0,0
106            18224891,834959,345078,300000,0,300000,1,300000,0,300000,0,400000,0,400000,0,500000,1,500000,0,0
107            17469272,816735,342795,574000,0,574000,0,574000,0,574000,0,553000,1,553000,0,500000,1,500000,0,0
108            16560058,754170,344777,574000,0,574000,1,574000,1,574000,0,553000,0,553000,0,500000,0,500000,1,0
109            16191449,689792,316923,300000,0,300000,0,300000,1,300000,0,400000,1,400000,0,500000,0,500000,0,0
110            16008137,748321,327736,574000,0,574000,1,574000,0,574000,1,553000,0,553000,0,500000,1,500000,0,0
111            """))
112
113  # Test on Raven for checking system states and the DSU PMU counts.
114  def test_wattson_dsu_pmu(self):
115    return DiffTestBlueprint(
116        trace=DataPath('wattson_dsu_pmu.pb'),
117        query=("INCLUDE PERFETTO MODULE wattson.system_state;\n" +
118               self.consolidate_tables_template.replace(
119                   "SYSTEM_STATE_TABLE", "wattson_system_states")),
120        out=Csv("""
121            "duration","l3_hit_count","l3_miss_count","freq_0","idle_0","freq_1","idle_1","freq_2","idle_2","freq_3","idle_3","freq_4","idle_4","freq_5","idle_5","freq_6","idle_6","freq_7","idle_7","suspended"
122            1280071578,1319309,419083,300000,1,300000,1,300000,1,300000,1,400000,1,400000,1,500000,1,500000,1,0
123            165833778,118250,42072,300000,-1,300000,1,300000,1,300000,1,400000,1,400000,1,500000,1,500000,1,0
124            121848767,5879527,2358273,574000,0,574000,1,574000,0,574000,0,553000,0,553000,0,500000,1,500000,1,0
125            72914132,134731,58480,300000,1,300000,1,300000,-1,300000,1,400000,1,400000,1,500000,1,500000,1,0
126            70723657,68341,22021,300000,1,300000,-1,300000,1,300000,1,400000,1,400000,1,500000,1,500000,1,0
127            64738046,275953,309822,300000,1,300000,1,300000,1,300000,1,400000,1,400000,1,500000,-1,500000,1,0
128            59232508,2796301,1232977,574000,0,574000,1,574000,1,574000,0,553000,0,553000,0,500000,1,500000,0,0
129            50960835,50577,17976,300000,1,300000,1,300000,1,300000,-1,400000,1,400000,1,500000,1,500000,1,0
130            50664181,2364802,1133322,574000,0,574000,1,574000,1,574000,0,553000,1,553000,0,500000,0,500000,0,0
131            49614333,2201254,928640,300000,0,300000,1,300000,0,300000,0,400000,0,400000,0,500000,1,500000,1,0
132            41917186,2020898,920691,574000,0,574000,0,574000,1,574000,1,553000,0,553000,0,500000,0,500000,1,0
133            40469221,"[NULL]","[NULL]",1401000,1,1401000,1,1401000,1,1401000,1,400000,1,400000,1,2802000,1,2802000,1,0
134            40265209,14021,1245,300000,0,300000,1,300000,1,300000,1,400000,1,400000,1,500000,1,500000,1,0
135            38159789,1428203,690001,300000,0,300000,0,300000,1,300000,0,400000,0,400000,0,500000,0,500000,0,0
136            33778317,1478303,683731,300000,0,300000,0,300000,1,300000,1,400000,0,400000,0,500000,0,500000,1,0
137            31421773,34528,17983,300000,1,300000,1,300000,1,300000,1,400000,-1,400000,1,500000,1,500000,1,0
138            31137678,162530,198792,1098000,1,1098000,1,1098000,1,1098000,1,400000,1,400000,1,500000,1,500000,-1,0
139            30271091,38946,48402,300000,1,300000,1,300000,1,300000,1,400000,1,400000,1,500000,1,500000,-1,0
140            30209881,"[NULL]","[NULL]",1328000,1,1328000,1,1328000,1,1328000,1,2253000,1,2253000,1,500000,1,500000,1,0
141            30118849,1394832,585081,574000,0,574000,1,574000,0,574000,0,553000,0,553000,0,500000,1,500000,0,0
142            """))
143
144  # Test on eos to check that suspend states are being calculated appropriately.
145  def test_wattson_suspend(self):
146    return DiffTestBlueprint(
147        trace=DataPath('wattson_eos_suspend.pb'),
148        query="""
149        INCLUDE PERFETTO MODULE wattson.system_state;
150        SELECT
151          sum(dur) as duration,
152          freq_0, idle_0, freq_1, idle_1, freq_2, idle_2, freq_3, idle_3,
153          suspended
154        FROM wattson_system_states
155        GROUP BY
156          freq_0, idle_0, freq_1, idle_1, freq_2, idle_2, freq_3, idle_3,
157          suspended
158        ORDER BY duration desc
159        LIMIT 20;
160        """,
161        out=Csv("""
162            "duration","freq_0","idle_0","freq_1","idle_1","freq_2","idle_2","freq_3","idle_3","suspended"
163            16606175990,614400,1,614400,1,614400,1,614400,1,0
164            10648392546,1708800,-1,1708800,-1,1708800,-1,1708800,-1,1
165            6972220533,1708800,-1,1708800,-1,1708800,-1,1708800,-1,0
166            1649400745,614400,0,614400,0,614400,0,614400,0,0
167            1206977074,614400,-1,614400,1,614400,1,614400,1,0
168            945900007,1708800,0,1708800,0,1708800,0,1708800,0,0
169            943703078,1363200,0,1363200,0,1363200,0,1363200,1,0
170            736663600,1708800,0,1708800,0,1708800,0,1708800,1,0
171            706695995,1708800,1,1708800,1,1708800,1,1708800,1,0
172            656873956,1363200,1,1363200,1,1363200,1,1363200,1,0
173            633440914,1363200,0,1363200,0,1363200,0,1363200,0,0
174            627957352,1708800,-1,1708800,0,1708800,0,1708800,0,0
175            615611076,1708800,-1,1708800,1,1708800,1,1708800,1,0
176            575584212,1708800,-1,1708800,0,1708800,0,1708800,-1,0
177            527581753,1708800,-1,1708800,-1,1708800,0,1708800,-1,0
178            488107828,1708800,0,1708800,0,1708800,0,1708800,-1,0
179            474912603,1363200,-1,1363200,0,1363200,0,1363200,1,0
180            461943392,1708800,0,1708800,-1,1708800,0,1708800,0,0
181            375051979,864000,1,864000,1,864000,1,864000,1,0
182            371458882,1363200,-1,1363200,0,1363200,0,1363200,-1,0
183            """))
184
185  # Test that the device name can be extracted from the trace's metadata.
186  def test_wattson_device_name(self):
187    return DiffTestBlueprint(
188        trace=DataPath('wattson_wo_device_name.pb'),
189        query=("""
190            INCLUDE PERFETTO MODULE wattson.device_infos;
191            select name from _wattson_device
192            """),
193        out=Csv("""
194            "name"
195            "monaco"
196            """))
197
198  # Tests intermediate table
199  def test_wattson_intermediate_table(self):
200    return DiffTestBlueprint(
201        trace=DataPath('wattson_dsu_pmu.pb'),
202        query=("""
203            INCLUDE PERFETTO MODULE wattson.curves.estimates;
204              select * from _w_independent_cpus_calc
205              WHERE ts > 359661672577
206              ORDER by ts ASC
207              LIMIT 10
208            """),
209        out=Csv("""
210            "ts","dur","l3_hit_count","l3_miss_count","freq_0","idle_0","freq_1","idle_1","freq_2","idle_2","freq_3","idle_3","freq_4","idle_4","freq_5","idle_5","freq_6","idle_6","freq_7","idle_7","policy_4","policy_5","policy_6","policy_7","no_static","cpu0_curve","cpu1_curve","cpu2_curve","cpu3_curve","cpu4_curve","cpu5_curve","cpu6_curve","cpu7_curve","static_4","static_5","static_6","static_7"
211            359661672578,75521,8326,9689,1401000,0,1401000,0,1401000,0,1401000,0,2253000,-1,2253000,0,2802000,-1,2802000,0,4,4,6,6,0,"[NULL]","[NULL]","[NULL]","[NULL]",527.050000,23.500000,1942.890000,121.430000,35.660000,-1.000000,35.640000,-1.000000
212            359661748099,2254517,248577,289258,1401000,0,1401000,0,1401000,0,1401000,0,2253000,0,2253000,0,2802000,-1,2802000,0,4,4,6,6,0,"[NULL]","[NULL]","[NULL]","[NULL]",23.500000,23.500000,1942.890000,121.430000,-1.000000,-1.000000,35.640000,-1.000000
213            359664003674,11596,1278,1487,1401000,-1,1401000,-1,1401000,-1,1401000,-1,2253000,-1,2253000,-1,2802000,-1,2802000,-1,4,4,6,6,-1,"[NULL]","[NULL]","[NULL]","[NULL]",527.050000,527.050000,1942.890000,1942.890000,35.660000,35.660000,35.640000,35.640000
214            359664015270,4720,520,605,1401000,-1,1401000,-1,1401000,-1,1401000,-1,2253000,-1,2253000,-1,2802000,-1,2802000,0,4,4,6,6,-1,"[NULL]","[NULL]","[NULL]","[NULL]",527.050000,527.050000,1942.890000,121.430000,35.660000,35.660000,35.640000,-1.000000
215            359664019990,18921,2086,2427,1401000,-1,1401000,-1,1401000,-1,1401000,-1,2253000,0,2253000,-1,2802000,-1,2802000,0,4,4,6,6,-1,"[NULL]","[NULL]","[NULL]","[NULL]",23.500000,527.050000,1942.890000,121.430000,-1.000000,35.660000,35.640000,-1.000000
216            359664038911,8871,978,1138,1401000,-1,1401000,-1,1401000,0,1401000,-1,2253000,0,2253000,-1,2802000,-1,2802000,0,4,4,6,6,-1,"[NULL]","[NULL]","[NULL]","[NULL]",23.500000,527.050000,1942.890000,121.430000,-1.000000,35.660000,35.640000,-1.000000
217            359664047782,1343,148,172,1401000,-1,1401000,0,1401000,0,1401000,-1,2253000,0,2253000,-1,2802000,-1,2802000,0,4,4,6,6,-1,"[NULL]","[NULL]","[NULL]","[NULL]",23.500000,527.050000,1942.890000,121.430000,-1.000000,35.660000,35.640000,-1.000000
218            359664049491,1383,152,177,1401000,0,1401000,0,1401000,0,1401000,-1,2253000,0,2253000,0,2802000,-1,2802000,0,4,4,6,6,-1,"[NULL]","[NULL]","[NULL]","[NULL]",23.500000,23.500000,1942.890000,121.430000,-1.000000,-1.000000,35.640000,-1.000000
219            359664050874,2409912,265711,309195,1401000,0,1401000,0,1401000,0,1401000,0,2253000,0,2253000,0,2802000,-1,2802000,0,4,4,6,6,0,"[NULL]","[NULL]","[NULL]","[NULL]",23.500000,23.500000,1942.890000,121.430000,-1.000000,-1.000000,35.640000,-1.000000
220            359666460786,13754,1516,1764,1401000,0,1401000,0,1401000,0,1401000,0,2253000,-1,2253000,0,2802000,-1,2802000,0,4,4,6,6,0,"[NULL]","[NULL]","[NULL]","[NULL]",527.050000,23.500000,1942.890000,121.430000,35.660000,-1.000000,35.640000,-1.000000
221            """))
222
223  # Tests that device static curve selection is only when CPUs are active
224  def test_wattson_static_curve_selection(self):
225    return DiffTestBlueprint(
226        trace=DataPath('wattson_dsu_pmu.pb'),
227        query=("""
228            INCLUDE PERFETTO MODULE wattson.curves.estimates;
229              select * from _system_state_curves
230              ORDER by ts ASC
231              LIMIT 5
232            """),
233        out=Csv("""
234            "ts","dur","cpu0_curve","cpu1_curve","cpu2_curve","cpu3_curve","cpu4_curve","cpu5_curve","cpu6_curve","cpu7_curve","static_curve","l3_hit_value","l3_miss_value"
235            359085636893,23030,0.000000,"[NULL]",0.000000,0.000000,0.000000,28.510000,0.000000,0.000000,0.000000,"[NULL]","[NULL]"
236            359085659923,6664673,0.000000,"[NULL]",0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000
237            359092324596,1399699,0.000000,"[NULL]",0.000000,21.840000,0.000000,0.000000,0.000000,0.000000,3.730000,"[NULL]","[NULL]"
238            359093724295,6959391,0.000000,"[NULL]",0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000
239            359100683686,375122,0.000000,"[NULL]",0.000000,0.000000,28.510000,0.000000,0.000000,0.000000,0.000000,"[NULL]","[NULL]"
240            """))
241
242  # Tests that L3 cache calculations are being done correctly
243  def test_wattson_l3_calculations(self):
244    return DiffTestBlueprint(
245        trace=DataPath('wattson_dsu_pmu.pb'),
246        query=("""
247            INCLUDE PERFETTO MODULE wattson.curves.estimates;
248              select * from _system_state_curves
249              WHERE ts > 359661672577
250              ORDER by ts ASC
251              LIMIT 5
252            """),
253        out=Csv("""
254            "ts","dur","cpu0_curve","cpu1_curve","cpu2_curve","cpu3_curve","cpu4_curve","cpu5_curve","cpu6_curve","cpu7_curve","static_curve","l3_hit_value","l3_miss_value"
255            359661672578,75521,3.410000,3.410000,3.410000,3.410000,527.050000,23.500000,1942.890000,121.430000,35.660000,16836.004600,1215.000600
256            359661748099,2254517,3.450000,3.450000,3.450000,3.450000,23.500000,23.500000,1942.890000,121.430000,35.640000,578637.540600,262212.377000
257            359664003674,11596,248.900000,248.900000,248.900000,248.900000,527.050000,527.050000,1942.890000,1942.890000,35.660000,2584.243800,186.469800
258            359664015270,4720,248.900000,248.900000,248.900000,248.900000,527.050000,527.050000,1942.890000,121.430000,35.660000,1051.492000,75.867000
259            359664019990,18921,248.900000,248.900000,248.900000,248.900000,23.500000,527.050000,1942.890000,121.430000,35.660000,4218.100600,304.345800
260            """))
261
262  # Tests calculations when everything in system state is converted to mW
263  def test_wattson_system_state_mw_calculations(self):
264    return DiffTestBlueprint(
265        trace=DataPath('wattson_dsu_pmu.pb'),
266        query=("""
267            INCLUDE PERFETTO MODULE wattson.curves.estimates;
268              select * from _system_state_mw
269              WHERE ts > 359661672577
270              ORDER by ts ASC
271              LIMIT 10
272            """),
273        out=Csv("""
274            "ts","dur","cpu0_mw","cpu1_mw","cpu2_mw","cpu3_mw","cpu4_mw","cpu5_mw","cpu6_mw","cpu7_mw","dsu_scu_mw"
275            359661672578,75521,3.410000,3.410000,3.410000,3.410000,527.050000,23.500000,1942.890000,121.430000,274.679679
276            359661748099,2254517,3.450000,3.450000,3.450000,3.450000,23.500000,23.500000,1942.890000,121.430000,408.602332
277            359664003674,11596,248.900000,248.900000,248.900000,248.900000,527.050000,527.050000,1942.890000,1942.890000,274.597013
278            359664015270,4720,248.900000,248.900000,248.900000,248.900000,527.050000,527.050000,1942.890000,121.430000,274.507246
279            359664019990,18921,248.900000,248.900000,248.900000,248.900000,23.500000,527.050000,1942.890000,121.430000,274.677304
280            359664038911,8871,248.900000,248.900000,3.410000,248.900000,23.500000,527.050000,1942.890000,121.430000,274.676909
281            359664047782,1343,248.900000,3.410000,3.410000,248.900000,23.500000,527.050000,1942.890000,121.430000,274.557692
282            359664049491,1383,3.450000,3.450000,3.450000,208.140000,23.500000,23.500000,1942.890000,121.430000,407.495459
283            359664050874,2409912,3.450000,3.450000,3.450000,3.450000,23.500000,23.500000,1942.890000,121.430000,408.602720
284            359666460786,13754,3.410000,3.410000,3.410000,3.410000,527.050000,23.500000,1942.890000,121.430000,274.623880
285            """))
286
287  # Tests that suspend values are being skipped
288  def test_wattson_suspend_calculations(self):
289    return DiffTestBlueprint(
290        trace=DataPath('wattson_eos_suspend.pb'),
291        query=("""
292            INCLUDE PERFETTO MODULE wattson.curves.estimates;
293              select * from _system_state_curves
294              WHERE ts > 24790009884888
295              ORDER by ts ASC
296              LIMIT 5
297            """),
298        out=Csv("""
299            "ts","dur","cpu0_curve","cpu1_curve","cpu2_curve","cpu3_curve","cpu4_curve","cpu5_curve","cpu6_curve","cpu7_curve","static_curve","l3_hit_value","l3_miss_value"
300            24790009907857,2784616769,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0.000000,0,0
301            24792794524626,424063,39.690000,39.690000,39.690000,39.690000,0.000000,0.000000,0.000000,0.000000,18.390000,"[NULL]","[NULL]"
302            24792794948689,205625,39.690000,39.690000,39.690000,39.690000,0.000000,0.000000,0.000000,0.000000,18.390000,"[NULL]","[NULL]"
303            24792795154314,19531,39.690000,39.690000,39.690000,39.690000,0.000000,0.000000,0.000000,0.000000,18.390000,"[NULL]","[NULL]"
304            24792795173845,50781,39.690000,39.690000,0.000000,39.690000,0.000000,0.000000,0.000000,0.000000,18.390000,"[NULL]","[NULL]"
305            """))
306
307  # Tests that total calculations are correct
308  def test_wattson_idle_attribution(self):
309    return DiffTestBlueprint(
310        trace=DataPath('wattson_eos_suspend.pb'),
311        query=("""
312            INCLUDE PERFETTO MODULE wattson.curves.idle_attribution;
313            SELECT
314              SUM(estimated_mw * dur) / 1000000000 as idle_transition_cost_mws,
315              utid,
316              upid
317            FROM _idle_transition_cost
318            GROUP BY utid
319            ORDER BY idle_transition_cost_mws DESC
320            LIMIT 20
321            """),
322        out=Csv("""
323            "idle_transition_cost_mws","utid","upid"
324            19.068358,10,10
325            7.642105,73,73
326            6.069991,146,146
327            4.887564,457,457
328            4.641823,694,353
329            4.575867,1262,401
330            4.513442,515,137
331            3.819375,169,169
332            3.803823,11,11
333            3.617314,147,147
334            3.522582,396,396
335            3.385840,486,486
336            3.351066,727,356
337            3.279231,606,326
338            3.155939,464,464
339            2.949362,29,29
340            2.848033,414,414
341            2.660892,471,471
342            2.573006,1270,401
343            2.488196,172,172
344            """))
345
346  # Tests that DSU devfreq calculations are merged correctly
347  def test_wattson_dsu_devfreq(self):
348    return DiffTestBlueprint(
349        trace=DataPath('wattson_tk4_pcmark.pb'),
350        query=("""
351            INCLUDE PERFETTO MODULE wattson.curves.w_dsu_dependence;
352            SELECT * FROM _cpu_curves
353            WHERE ts > 4108586775197
354            LIMIT 20
355            """),
356        out=Csv("""
357            "ts","dur","freq_0","idle_0","freq_1","idle_1","freq_2","idle_2","freq_3","idle_3","cpu4_curve","cpu5_curve","cpu6_curve","cpu7_curve","l3_hit_count","l3_miss_count","no_static","all_cpu_deep_idle"
358            4108586789603,35685,1950000,0,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,14718,5837,-1,-1
359            4108586825288,30843,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,12721,5045,-1,-1
360            4108586856131,13387,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,99.470000,5521,2189,-1,-1
361            4108586869518,22542,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,9297,3687,-1,-1
362            4108586892060,2482,1950000,-1,1950000,-1,1950000,-1,1950000,0,674.240000,674.240000,674.240000,3327.560000,1023,406,-1,-1
363            4108586894542,68563,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,28279,11216,-1,-1
364            4108586963105,59652,1950000,-1,1950000,-1,1950000,-1,1950000,0,674.240000,674.240000,674.240000,3327.560000,24603,9758,-1,-1
365            4108587022757,3743,1950000,0,1950000,-1,1950000,-1,1950000,0,674.240000,674.240000,674.240000,3327.560000,1543,612,-1,-1
366            4108587026500,15992,1950000,-1,1950000,-1,1950000,-1,1950000,0,674.240000,674.240000,674.240000,3327.560000,6595,2616,-1,-1
367            4108587042492,15625,1950000,-1,1950000,-1,1950000,-1,1950000,0,674.240000,674.240000,674.240000,99.470000,6444,2556,-1,-1
368            4108587058117,8138,1950000,-1,1950000,-1,1950000,-1,1950000,0,674.240000,674.240000,674.240000,3327.560000,3356,1331,-1,-1
369            4108587066255,80566,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,33229,13179,-1,-1
370            4108587146821,19572,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,99.470000,8072,3201,-1,-1
371            4108587166393,219116,1950000,-1,1950000,-1,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,90375,35845,-1,-1
372            4108587385509,81991,1950000,-1,1950000,0,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,33817,13413,-1,-1
373            4108587467500,90413,1950000,-1,1950000,0,1950000,0,1950000,-1,674.240000,674.240000,674.240000,3327.560000,37291,14790,-1,-1
374            4108587557913,92896,1950000,0,1950000,0,1950000,0,1950000,-1,674.240000,674.240000,674.240000,3327.560000,38315,15196,-1,-1
375            4108587650809,95296,1950000,-1,1950000,0,1950000,0,1950000,-1,674.240000,674.240000,674.240000,3327.560000,39305,15589,-1,-1
376            4108587746105,12451,1950000,0,1950000,0,1950000,0,1950000,-1,674.240000,674.240000,674.240000,3327.560000,5135,2036,-1,-1
377            4108587758556,28524,1950000,0,1950000,0,1950000,-1,1950000,-1,674.240000,674.240000,674.240000,3327.560000,11764,4666,-1,-1
378            """))
379
380  # Tests that DSU devfreq calculations are merged correctly
381  def test_wattson_dsu_devfreq_system_state(self):
382    return DiffTestBlueprint(
383        trace=DataPath('wattson_tk4_pcmark.pb'),
384        query=("""
385            INCLUDE PERFETTO MODULE wattson.curves.estimates;
386            SELECT * FROM _system_state_mw
387            WHERE ts > 4108586775197
388            LIMIT 20
389            """),
390        out=Csv("""
391            "ts","dur","cpu0_mw","cpu1_mw","cpu2_mw","cpu3_mw","cpu4_mw","cpu5_mw","cpu6_mw","cpu7_mw","dsu_scu_mw"
392            4108586789603,35685,2.670000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.695271
393            4108586825288,30843,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.698554
394            4108586856131,13387,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,99.470000,1166.545753
395            4108586869518,22542,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.655587
396            4108586892060,2482,205.600000,205.600000,205.600000,2.670000,674.240000,674.240000,674.240000,3327.560000,1166.164641
397            4108586894542,68563,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.746124
398            4108586963105,59652,205.600000,205.600000,205.600000,2.670000,674.240000,674.240000,674.240000,3327.560000,1166.716706
399            4108587022757,3743,2.670000,205.600000,205.600000,2.670000,674.240000,674.240000,674.240000,3327.560000,1166.170321
400            4108587026500,15992,205.600000,205.600000,205.600000,2.670000,674.240000,674.240000,674.240000,3327.560000,1166.620056
401            4108587042492,15625,205.600000,205.600000,205.600000,2.670000,674.240000,674.240000,674.240000,99.470000,1166.668234
402            4108587058117,8138,205.600000,205.600000,205.600000,2.670000,674.240000,674.240000,674.240000,3327.560000,1166.555033
403            4108587066255,80566,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.717766
404            4108587146821,19572,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,99.470000,1166.626795
405            4108587166393,219116,205.600000,205.600000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.750356
406            4108587385509,81991,205.600000,2.670000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.743880
407            4108587467500,90413,205.600000,2.670000,2.670000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.736713
408            4108587557913,92896,2.670000,2.670000,2.670000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.730805
409            4108587650809,95296,205.600000,2.670000,2.670000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.740927
410            4108587746105,12451,2.670000,2.670000,2.670000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.556475
411            4108587758556,28524,2.670000,2.670000,205.600000,205.600000,674.240000,674.240000,674.240000,3327.560000,1166.680924
412            """))
413
414  def test_wattson_time_window_api(self):
415    return DiffTestBlueprint(
416        trace=DataPath('wattson_dsu_pmu.pb'),
417        query="""
418        INCLUDE PERFETTO MODULE wattson.curves.estimates;
419
420        SELECT
421          cpu0_mw,
422          cpu1_mw,
423          cpu2_mw,
424          cpu3_mw,
425          cpu4_mw,
426          cpu5_mw,
427          cpu6_mw,
428          cpu7_mw,
429          dsu_scu_mw
430        FROM _windowed_system_state_mw(362426061658, 5067704349)
431        """,
432        out=Csv("""
433            "cpu0_mw","cpu1_mw","cpu2_mw","cpu3_mw","cpu4_mw","cpu5_mw","cpu6_mw","cpu7_mw","dsu_scu_mw"
434            13.025673,6.270190,5.448549,8.796540,8.937174,10.717942,29.482823,30.239208,26.121213
435            """))
436
437  # Tests that suspend calculations are correct on 8 CPU device where suspend
438  # indication comes from "syscore" command
439  def test_wattson_syscore_suspend(self):
440    return DiffTestBlueprint(
441        trace=DataPath('wattson_syscore_suspend.pb'),
442        query=("""
443            INCLUDE PERFETTO MODULE wattson.curves.estimates;
444            SELECT ts, dur, cpu0_id, cpu1_id, cpu2_id, cpu3_id, suspended
445            FROM _stats_cpu0123_suspend
446            WHERE suspended
447            """),
448        out=Csv("""
449            "ts","dur","cpu0_id","cpu1_id","cpu2_id","cpu3_id","suspended"
450            385019771468,61975407053,12041,12218,10488,8910,1
451            448320364476,3674872885,13005,12954,11166,9272,1
452            452415394221,69579176303,13654,13361,11651,9609,1
453            564873995228,135118729231,45223,37594,22798,20132,1
454            """))
455
456  # Tests traces from VM that have incomplete CPU tracks
457  def test_wattson_missing_cpus_on_guest(self):
458    return DiffTestBlueprint(
459        trace=DataPath('wattson_tk4_vm.pb'),
460        query=("""
461            INCLUDE PERFETTO MODULE wattson.curves.estimates;
462               SELECT
463                 ts, dur, cpu0_mw, cpu1_mw, cpu2_mw, cpu3_mw, cpu4_mw, cpu5_mw,
464                 cpu6_mw
465               FROM _system_state_mw
466               WHERE ts > 25150000000
467               LIMIT 10
468            """),
469        out=Csv("""
470            "ts","dur","cpu0_mw","cpu1_mw","cpu2_mw","cpu3_mw","cpu4_mw","cpu5_mw","cpu6_mw"
471            25150029000,1080,0.000000,0.000000,0.000000,0.000000,70.050000,83.260000,0.000000
472            25150030640,42920,0.000000,0.000000,0.000000,0.000000,70.050000,70.050000,0.000000
473            25150073560,99800,0.000000,0.000000,0.000000,0.000000,70.050000,0.000000,0.000000
474            25150173360,28240,176.280000,0.000000,0.000000,0.000000,70.050000,0.000000,0.000000
475            25150201600,6480,176.280000,0.000000,0.000000,176.280000,70.050000,0.000000,0.000000
476            25150208080,29840,176.280000,0.000000,0.000000,176.280000,70.050000,70.050000,0.000000
477            25150237920,129800,0.000000,0.000000,0.000000,176.280000,70.050000,70.050000,0.000000
478            25150367720,37480,0.000000,0.000000,0.000000,176.280000,70.050000,0.000000,0.000000
479            25150405200,15120,0.000000,176.280000,0.000000,176.280000,70.050000,0.000000,0.000000
480            25150420320,15920,0.000000,176.280000,0.000000,0.000000,70.050000,0.000000,0.000000
481            """))
482