• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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