1 2-- Copyright 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 at 7-- 8-- https://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 16-- This file established the tables that define the relationships between rails 17-- and subrails as well as the hierarchical power estimates of each rail 18 19INCLUDE PERFETTO MODULE wattson.curves.estimates; 20 21-- The most basic rail components that form the "building blocks" from which all 22-- other rails and components are derived. Average power over the entire trace 23-- for each of these rail components. 24DROP VIEW IF EXISTS _wattson_base_components_avg_mw; 25CREATE PERFETTO VIEW _wattson_base_components_avg_mw AS 26SELECT 27 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 0) as cpu0_poli, 28 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 1) as cpu1_poli, 29 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 2) as cpu2_poli, 30 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 3) as cpu3_poli, 31 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 4) as cpu4_poli, 32 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 5) as cpu5_poli, 33 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 6) as cpu6_poli, 34 (SELECT m.policy FROM _dev_cpu_policy_map AS m WHERE m.cpu = 7) as cpu7_poli, 35 -- Converts all mW of all slices into average mW of total trace 36 SUM(ii.dur * ss.cpu0_mw) / SUM(ii.dur) as cpu0_mw, 37 SUM(ii.dur * ss.cpu1_mw) / SUM(ii.dur) as cpu1_mw, 38 SUM(ii.dur * ss.cpu2_mw) / SUM(ii.dur) as cpu2_mw, 39 SUM(ii.dur * ss.cpu3_mw) / SUM(ii.dur) as cpu3_mw, 40 SUM(ii.dur * ss.cpu4_mw) / SUM(ii.dur) as cpu4_mw, 41 SUM(ii.dur * ss.cpu5_mw) / SUM(ii.dur) as cpu5_mw, 42 SUM(ii.dur * ss.cpu6_mw) / SUM(ii.dur) as cpu6_mw, 43 SUM(ii.dur * ss.cpu7_mw) / SUM(ii.dur) as cpu7_mw, 44 SUM(ii.dur * ss.dsu_scu_mw) / SUM(ii.dur) as dsu_scu_mw, 45 SUM(ii.dur) as period_dur, 46 w.period_id 47FROM _interval_intersect!( 48 ( 49 (SELECT period_id AS id, * FROM {{window_table}}), 50 _ii_subquery!(_system_state_mw) 51 ), 52 () 53) ii 54JOIN {{window_table}} AS w ON w.period_id = id_0 55JOIN _system_state_mw AS ss ON ss._auto_id = id_1 56GROUP BY w.period_id; 57 58-- Macro that filters out CPUs that are unrelated to the policy of the table 59-- passed in, and does some bookkeeping to put data in expected format 60CREATE OR REPLACE PERFETTO MACRO 61_get_valid_cpu_mw(policy_tbl_w_cpus TableOrSubQuery) 62RETURNS TableOrSubquery AS 63( 64 WITH input_table_w_filter AS ( 65 SELECT 66 *, 67 COALESCE( 68 cpu0_mw, cpu1_mw, cpu2_mw, cpu3_mw, cpu4_mw, cpu5_mw, cpu6_mw, cpu7_mw 69 ) IS NOT NULL as is_defined, 70 ( 71 IFNULL(cpu0_mw, 0) + IFNULL(cpu1_mw, 0) + IFNULL(cpu2_mw, 0) 72 + IFNULL(cpu3_mw, 0) + IFNULL(cpu4_mw, 0) + IFNULL(cpu5_mw, 0) 73 + IFNULL(cpu6_mw, 0) + IFNULL(cpu7_mw, 0) 74 ) as sum_mw 75 FROM $policy_tbl_w_cpus 76 ) 77 SELECT 78 is_defined, 79 period_id, 80 period_dur, 81 cast_double!(IIF(is_defined, sum_mw, NULL)) as estimated_mw, 82 cast_double!( 83 IIF(is_defined, sum_mw * period_dur / 1e9, NULL) 84 ) as estimated_mws, 85 AndroidWattsonPolicyEstimate( 86 'estimated_mw', cast_double!(IIF(is_defined, sum_mw, NULL)), 87 'estimated_mws', cast_double!( 88 IIF(is_defined, sum_mw * period_dur / 1e9, NULL) 89 ), 90 'cpu0', IIF( 91 cpu0_mw, 92 AndroidWattsonCpuEstimate( 93 'estimated_mw', cpu0_mw, 94 'estimated_mws', cpu0_mw * period_dur / 1e9 95 ), 96 NULL 97 ), 98 'cpu1', IIF( 99 cpu1_mw, 100 AndroidWattsonCpuEstimate( 101 'estimated_mw', cpu1_mw, 102 'estimated_mws', cpu1_mw * period_dur / 1e9 103 ), 104 NULL 105 ), 106 'cpu2', IIF( 107 cpu2_mw, 108 AndroidWattsonCpuEstimate( 109 'estimated_mw', cpu2_mw, 110 'estimated_mws', cpu2_mw * period_dur / 1e9 111 ), 112 NULL 113 ), 114 'cpu3', IIF( 115 cpu3_mw, 116 AndroidWattsonCpuEstimate( 117 'estimated_mw', cpu3_mw, 118 'estimated_mws', cpu3_mw * period_dur / 1e9 119 ), 120 NULL 121 ), 122 'cpu4', IIF( 123 cpu4_mw, 124 AndroidWattsonCpuEstimate( 125 'estimated_mw', cpu4_mw, 126 'estimated_mws', cpu4_mw * period_dur / 1e9 127 ), 128 NULL 129 ), 130 'cpu5', IIF( 131 cpu5_mw, 132 AndroidWattsonCpuEstimate( 133 'estimated_mw', cpu5_mw, 134 'estimated_mws', cpu5_mw * period_dur / 1e9 135 ), 136 NULL 137 ), 138 'cpu6', IIF( 139 cpu6_mw, 140 AndroidWattsonCpuEstimate( 141 'estimated_mw', cpu6_mw, 142 'estimated_mws', cpu6_mw * period_dur / 1e9 143 ), 144 NULL 145 ), 146 'cpu7', IIF( 147 cpu7_mw, 148 AndroidWattsonCpuEstimate( 149 'estimated_mw', cpu7_mw, 150 'estimated_mws', cpu7_mw * period_dur / 1e9 151 ), 152 NULL 153 ) 154 ) AS proto 155 FROM input_table_w_filter 156); 157 158-- Automatically determines CPUs that correspond to policyX, and picks up NULL 159-- otherwise. 160DROP VIEW IF EXISTS _estimate_policy0_proto; 161CREATE PERFETTO VIEW _estimate_policy0_proto AS 162SELECT * FROM _get_valid_cpu_mw!( 163 ( 164 SELECT 165 period_id, 166 period_dur, 167 IIF(cpu0_poli = 0, cpu0_mw, NULL) as cpu0_mw, 168 IIF(cpu1_poli = 0, cpu1_mw, NULL) as cpu1_mw, 169 IIF(cpu2_poli = 0, cpu2_mw, NULL) as cpu2_mw, 170 IIF(cpu3_poli = 0, cpu3_mw, NULL) as cpu3_mw, 171 IIF(cpu4_poli = 0, cpu4_mw, NULL) as cpu4_mw, 172 IIF(cpu5_poli = 0, cpu5_mw, NULL) as cpu5_mw, 173 IIF(cpu6_poli = 0, cpu6_mw, NULL) as cpu6_mw, 174 IIF(cpu7_poli = 0, cpu7_mw, NULL) as cpu7_mw 175 FROM _wattson_base_components_avg_mw 176 GROUP BY period_id, period_dur 177 ) 178); 179 180DROP VIEW IF EXISTS _estimate_policy1_proto; 181CREATE PERFETTO VIEW _estimate_policy1_proto AS 182SELECT * FROM _get_valid_cpu_mw!( 183 ( 184 SELECT 185 period_id, 186 period_dur, 187 IIF(cpu0_poli = 1, cpu0_mw, NULL) as cpu0_mw, 188 IIF(cpu1_poli = 1, cpu1_mw, NULL) as cpu1_mw, 189 IIF(cpu2_poli = 1, cpu2_mw, NULL) as cpu2_mw, 190 IIF(cpu3_poli = 1, cpu3_mw, NULL) as cpu3_mw, 191 IIF(cpu4_poli = 1, cpu4_mw, NULL) as cpu4_mw, 192 IIF(cpu5_poli = 1, cpu5_mw, NULL) as cpu5_mw, 193 IIF(cpu6_poli = 1, cpu6_mw, NULL) as cpu6_mw, 194 IIF(cpu7_poli = 1, cpu7_mw, NULL) as cpu7_mw 195 FROM _wattson_base_components_avg_mw 196 GROUP BY period_id, period_dur 197 ) 198); 199 200DROP VIEW IF EXISTS _estimate_policy2_proto; 201CREATE PERFETTO VIEW _estimate_policy2_proto AS 202SELECT * FROM _get_valid_cpu_mw!( 203 ( 204 SELECT 205 period_id, 206 period_dur, 207 IIF(cpu0_poli = 2, cpu0_mw, NULL) as cpu0_mw, 208 IIF(cpu1_poli = 2, cpu1_mw, NULL) as cpu1_mw, 209 IIF(cpu2_poli = 2, cpu2_mw, NULL) as cpu2_mw, 210 IIF(cpu3_poli = 2, cpu3_mw, NULL) as cpu3_mw, 211 IIF(cpu4_poli = 2, cpu4_mw, NULL) as cpu4_mw, 212 IIF(cpu5_poli = 2, cpu5_mw, NULL) as cpu5_mw, 213 IIF(cpu6_poli = 2, cpu6_mw, NULL) as cpu6_mw, 214 IIF(cpu7_poli = 2, cpu7_mw, NULL) as cpu7_mw 215 FROM _wattson_base_components_avg_mw 216 GROUP BY period_id, period_dur 217 ) 218); 219 220DROP VIEW IF EXISTS _estimate_policy3_proto; 221CREATE PERFETTO VIEW _estimate_policy3_proto AS 222SELECT * FROM _get_valid_cpu_mw!( 223 ( 224 SELECT 225 period_id, 226 period_dur, 227 IIF(cpu0_poli = 3, cpu0_mw, NULL) as cpu0_mw, 228 IIF(cpu1_poli = 3, cpu1_mw, NULL) as cpu1_mw, 229 IIF(cpu2_poli = 3, cpu2_mw, NULL) as cpu2_mw, 230 IIF(cpu3_poli = 3, cpu3_mw, NULL) as cpu3_mw, 231 IIF(cpu4_poli = 3, cpu4_mw, NULL) as cpu4_mw, 232 IIF(cpu5_poli = 3, cpu5_mw, NULL) as cpu5_mw, 233 IIF(cpu6_poli = 3, cpu6_mw, NULL) as cpu6_mw, 234 IIF(cpu7_poli = 3, cpu7_mw, NULL) as cpu7_mw 235 FROM _wattson_base_components_avg_mw 236 GROUP BY period_id, period_dur 237 ) 238); 239 240DROP VIEW IF EXISTS _estimate_policy4_proto; 241CREATE PERFETTO VIEW _estimate_policy4_proto AS 242SELECT * FROM _get_valid_cpu_mw!( 243 ( 244 SELECT 245 period_id, 246 period_dur, 247 IIF(cpu0_poli = 4, cpu0_mw, NULL) as cpu0_mw, 248 IIF(cpu1_poli = 4, cpu1_mw, NULL) as cpu1_mw, 249 IIF(cpu2_poli = 4, cpu2_mw, NULL) as cpu2_mw, 250 IIF(cpu3_poli = 4, cpu3_mw, NULL) as cpu3_mw, 251 IIF(cpu4_poli = 4, cpu4_mw, NULL) as cpu4_mw, 252 IIF(cpu5_poli = 4, cpu5_mw, NULL) as cpu5_mw, 253 IIF(cpu6_poli = 4, cpu6_mw, NULL) as cpu6_mw, 254 IIF(cpu7_poli = 4, cpu7_mw, NULL) as cpu7_mw 255 FROM _wattson_base_components_avg_mw 256 GROUP BY period_id, period_dur 257 ) 258); 259 260DROP VIEW IF EXISTS _estimate_policy5_proto; 261CREATE PERFETTO VIEW _estimate_policy5_proto AS 262SELECT * FROM _get_valid_cpu_mw!( 263 ( 264 SELECT 265 period_id, 266 period_dur, 267 IIF(cpu0_poli = 5, cpu0_mw, NULL) as cpu0_mw, 268 IIF(cpu1_poli = 5, cpu1_mw, NULL) as cpu1_mw, 269 IIF(cpu2_poli = 5, cpu2_mw, NULL) as cpu2_mw, 270 IIF(cpu3_poli = 5, cpu3_mw, NULL) as cpu3_mw, 271 IIF(cpu4_poli = 5, cpu4_mw, NULL) as cpu4_mw, 272 IIF(cpu5_poli = 5, cpu5_mw, NULL) as cpu5_mw, 273 IIF(cpu6_poli = 5, cpu6_mw, NULL) as cpu6_mw, 274 IIF(cpu7_poli = 5, cpu7_mw, NULL) as cpu7_mw 275 FROM _wattson_base_components_avg_mw 276 GROUP BY period_id, period_dur 277 ) 278); 279 280DROP VIEW IF EXISTS _estimate_policy6_proto; 281CREATE PERFETTO VIEW _estimate_policy6_proto AS 282SELECT * FROM _get_valid_cpu_mw!( 283 ( 284 SELECT 285 period_id, 286 period_dur, 287 IIF(cpu0_poli = 6, cpu0_mw, NULL) as cpu0_mw, 288 IIF(cpu1_poli = 6, cpu1_mw, NULL) as cpu1_mw, 289 IIF(cpu2_poli = 6, cpu2_mw, NULL) as cpu2_mw, 290 IIF(cpu3_poli = 6, cpu3_mw, NULL) as cpu3_mw, 291 IIF(cpu4_poli = 6, cpu4_mw, NULL) as cpu4_mw, 292 IIF(cpu5_poli = 6, cpu5_mw, NULL) as cpu5_mw, 293 IIF(cpu6_poli = 6, cpu6_mw, NULL) as cpu6_mw, 294 IIF(cpu7_poli = 6, cpu7_mw, NULL) as cpu7_mw 295 FROM _wattson_base_components_avg_mw 296 GROUP BY period_id, period_dur 297 ) 298); 299 300DROP VIEW IF EXISTS _estimate_policy7_proto; 301CREATE PERFETTO VIEW _estimate_policy7_proto AS 302SELECT * FROM _get_valid_cpu_mw!( 303 ( 304 SELECT 305 period_id, 306 period_dur, 307 IIF(cpu0_poli = 7, cpu0_mw, NULL) as cpu0_mw, 308 IIF(cpu1_poli = 7, cpu1_mw, NULL) as cpu1_mw, 309 IIF(cpu2_poli = 7, cpu2_mw, NULL) as cpu2_mw, 310 IIF(cpu3_poli = 7, cpu3_mw, NULL) as cpu3_mw, 311 IIF(cpu4_poli = 7, cpu4_mw, NULL) as cpu4_mw, 312 IIF(cpu5_poli = 7, cpu5_mw, NULL) as cpu5_mw, 313 IIF(cpu6_poli = 7, cpu6_mw, NULL) as cpu6_mw, 314 IIF(cpu7_poli = 7, cpu7_mw, NULL) as cpu7_mw 315 FROM _wattson_base_components_avg_mw 316 GROUP BY period_id, period_dur 317 ) 318); 319 320DROP VIEW IF EXISTS _estimate_dsu_scu; 321CREATE PERFETTO VIEW _estimate_dsu_scu AS 322SELECT 323 period_id, 324 period_dur, 325 dsu_scu_mw 326FROM _wattson_base_components_avg_mw 327GROUP BY period_id, period_dur; 328 329-- Automatically populates the appropriate policy based on the device of the 330-- trace. For policies that do not exist on the device, a NULL proto/estimate is 331-- populated. 332DROP VIEW IF EXISTS _estimate_cpu_subsystem_sum; 333CREATE PERFETTO VIEW _estimate_cpu_subsystem_sum AS 334WITH components AS ( 335 SELECT 336 period_id, 337 period_dur, 338 dsu_scu.dsu_scu_mw, 339 IIF(p0.is_defined, p0.estimated_mw, NULL) as p0_mw, 340 IIF(p0.is_defined, p0.proto, NULL) as p0_proto, 341 IIF(p1.is_defined, p1.estimated_mw, NULL) as p1_mw, 342 IIF(p1.is_defined, p1.proto, NULL) as p1_proto, 343 IIF(p2.is_defined, p2.estimated_mw, NULL) as p2_mw, 344 IIF(p2.is_defined, p2.proto, NULL) as p2_proto, 345 IIF(p3.is_defined, p3.estimated_mw, NULL) as p3_mw, 346 IIF(p3.is_defined, p3.proto, NULL) as p3_proto, 347 IIF(p4.is_defined, p4.estimated_mw, NULL) as p4_mw, 348 IIF(p4.is_defined, p4.proto, NULL) as p4_proto, 349 IIF(p5.is_defined, p5.estimated_mw, NULL) as p5_mw, 350 IIF(p5.is_defined, p5.proto, NULL) as p5_proto, 351 IIF(p6.is_defined, p6.estimated_mw, NULL) as p6_mw, 352 IIF(p6.is_defined, p6.proto, NULL) as p6_proto, 353 IIF(p7.is_defined, p7.estimated_mw, NULL) as p7_mw, 354 IIF(p7.is_defined, p7.proto, NULL) as p7_proto 355 FROM _estimate_policy0_proto AS p0 356 JOIN _estimate_policy1_proto AS p1 USING (period_id, period_dur) 357 JOIN _estimate_policy2_proto AS p2 USING (period_id, period_dur) 358 JOIN _estimate_policy3_proto AS p3 USING (period_id, period_dur) 359 JOIN _estimate_policy4_proto AS p4 USING (period_id, period_dur) 360 JOIN _estimate_policy5_proto AS p5 USING (period_id, period_dur) 361 JOIN _estimate_policy6_proto AS p6 USING (period_id, period_dur) 362 JOIN _estimate_policy7_proto AS p7 USING (period_id, period_dur) 363 JOIN _estimate_dsu_scu AS dsu_scu USING (period_id, period_dur) 364), 365components_w_sum AS ( 366 SELECT 367 *, 368 ( 369 IFNULL(p0_mw, 0) + IFNULL(p1_mw, 0) + IFNULL(p2_mw, 0) + IFNULL(p3_mw, 0) 370 + IFNULL(p4_mw, 0) + IFNULL(p5_mw, 0) + IFNULL(p6_mw, 0) 371 + IFNULL(p7_mw, 0) + dsu_scu_mw 372 ) as sum_mw 373 FROM components 374) 375SELECT 376 period_id, 377 period_dur, 378 AndroidWattsonCpuSubsystemEstimate( 379 'estimated_mw', sum_mw, 380 'estimated_mws', sum_mw * period_dur / 1e9, 381 'policy0', p0_proto, 382 'policy1', p1_proto, 383 'policy2', p2_proto, 384 'policy3', p3_proto, 385 'policy4', p4_proto, 386 'policy5', p5_proto, 387 'policy6', p6_proto, 388 'policy7', p7_proto, 389 'dsu_scu', AndroidWattsonDsuScuEstimate( 390 'estimated_mw', dsu_scu_mw, 391 'estimated_mws', dsu_scu_mw * period_dur / 1e9 392 ) 393 ) as proto 394FROM components_w_sum; 395 396