metrics: Add energy to Wattson per rail metrics

Add mWs output to Wattson per rail metrics so that both per rail metrics
and per thread metrics are outputting both power (mW) and energy (mWs).

Bug: 376512804
Test: tools/diff_test_trace_processor.py out/linux/trace_processor_shell --name-filter '.*wattson.*'
Change-Id: If581bf4dad7721815ca9d01b25de0cf8ccbf0e02
Signed-off-by: Samuel Wu <wusamuel@google.com>
diff --git a/protos/perfetto/metrics/android/wattson_in_time_period.proto b/protos/perfetto/metrics/android/wattson_in_time_period.proto
index ce00e9c..495de8c 100644
--- a/protos/perfetto/metrics/android/wattson_in_time_period.proto
+++ b/protos/perfetto/metrics/android/wattson_in_time_period.proto
@@ -37,33 +37,37 @@
 message AndroidWattsonCpuSubsystemEstimate {
   // estimates and estimates of subrails
   optional float estimated_mw = 1;
-  optional AndroidWattsonPolicyEstimate policy0 = 2;
-  optional AndroidWattsonPolicyEstimate policy1 = 3;
-  optional AndroidWattsonPolicyEstimate policy2 = 4;
-  optional AndroidWattsonPolicyEstimate policy3 = 5;
-  optional AndroidWattsonPolicyEstimate policy4 = 6;
-  optional AndroidWattsonPolicyEstimate policy5 = 7;
-  optional AndroidWattsonPolicyEstimate policy6 = 8;
-  optional AndroidWattsonPolicyEstimate policy7 = 9;
-  optional AndroidWattsonDsuScuEstimate dsu_scu = 10;
+  optional float estimated_mws = 2;
+  optional AndroidWattsonPolicyEstimate policy0 = 3;
+  optional AndroidWattsonPolicyEstimate policy1 = 4;
+  optional AndroidWattsonPolicyEstimate policy2 = 5;
+  optional AndroidWattsonPolicyEstimate policy3 = 6;
+  optional AndroidWattsonPolicyEstimate policy4 = 7;
+  optional AndroidWattsonPolicyEstimate policy5 = 8;
+  optional AndroidWattsonPolicyEstimate policy6 = 9;
+  optional AndroidWattsonPolicyEstimate policy7 = 10;
+  optional AndroidWattsonDsuScuEstimate dsu_scu = 11;
 }
 
 message AndroidWattsonPolicyEstimate {
   optional float estimated_mw = 1;
-  optional AndroidWattsonCpuEstimate cpu0 = 2;
-  optional AndroidWattsonCpuEstimate cpu1 = 3;
-  optional AndroidWattsonCpuEstimate cpu2 = 4;
-  optional AndroidWattsonCpuEstimate cpu3 = 5;
-  optional AndroidWattsonCpuEstimate cpu4 = 6;
-  optional AndroidWattsonCpuEstimate cpu5 = 7;
-  optional AndroidWattsonCpuEstimate cpu6 = 8;
-  optional AndroidWattsonCpuEstimate cpu7 = 9;
+  optional float estimated_mws = 2;
+  optional AndroidWattsonCpuEstimate cpu0 = 3;
+  optional AndroidWattsonCpuEstimate cpu1 = 4;
+  optional AndroidWattsonCpuEstimate cpu2 = 5;
+  optional AndroidWattsonCpuEstimate cpu3 = 6;
+  optional AndroidWattsonCpuEstimate cpu4 = 7;
+  optional AndroidWattsonCpuEstimate cpu5 = 8;
+  optional AndroidWattsonCpuEstimate cpu6 = 9;
+  optional AndroidWattsonCpuEstimate cpu7 = 10;
 }
 
 message AndroidWattsonCpuEstimate {
   optional float estimated_mw = 1;
+  optional float estimated_mws = 2;
 }
 
 message AndroidWattsonDsuScuEstimate {
   optional float estimated_mw = 1;
+  optional float estimated_mws = 2;
 }
diff --git a/protos/perfetto/metrics/perfetto_merged_metrics.proto b/protos/perfetto/metrics/perfetto_merged_metrics.proto
index 5b104e3..8267654 100644
--- a/protos/perfetto/metrics/perfetto_merged_metrics.proto
+++ b/protos/perfetto/metrics/perfetto_merged_metrics.proto
@@ -2932,35 +2932,39 @@
 message AndroidWattsonCpuSubsystemEstimate {
   // estimates and estimates of subrails
   optional float estimated_mw = 1;
-  optional AndroidWattsonPolicyEstimate policy0 = 2;
-  optional AndroidWattsonPolicyEstimate policy1 = 3;
-  optional AndroidWattsonPolicyEstimate policy2 = 4;
-  optional AndroidWattsonPolicyEstimate policy3 = 5;
-  optional AndroidWattsonPolicyEstimate policy4 = 6;
-  optional AndroidWattsonPolicyEstimate policy5 = 7;
-  optional AndroidWattsonPolicyEstimate policy6 = 8;
-  optional AndroidWattsonPolicyEstimate policy7 = 9;
-  optional AndroidWattsonDsuScuEstimate dsu_scu = 10;
+  optional float estimated_mws = 2;
+  optional AndroidWattsonPolicyEstimate policy0 = 3;
+  optional AndroidWattsonPolicyEstimate policy1 = 4;
+  optional AndroidWattsonPolicyEstimate policy2 = 5;
+  optional AndroidWattsonPolicyEstimate policy3 = 6;
+  optional AndroidWattsonPolicyEstimate policy4 = 7;
+  optional AndroidWattsonPolicyEstimate policy5 = 8;
+  optional AndroidWattsonPolicyEstimate policy6 = 9;
+  optional AndroidWattsonPolicyEstimate policy7 = 10;
+  optional AndroidWattsonDsuScuEstimate dsu_scu = 11;
 }
 
 message AndroidWattsonPolicyEstimate {
   optional float estimated_mw = 1;
-  optional AndroidWattsonCpuEstimate cpu0 = 2;
-  optional AndroidWattsonCpuEstimate cpu1 = 3;
-  optional AndroidWattsonCpuEstimate cpu2 = 4;
-  optional AndroidWattsonCpuEstimate cpu3 = 5;
-  optional AndroidWattsonCpuEstimate cpu4 = 6;
-  optional AndroidWattsonCpuEstimate cpu5 = 7;
-  optional AndroidWattsonCpuEstimate cpu6 = 8;
-  optional AndroidWattsonCpuEstimate cpu7 = 9;
+  optional float estimated_mws = 2;
+  optional AndroidWattsonCpuEstimate cpu0 = 3;
+  optional AndroidWattsonCpuEstimate cpu1 = 4;
+  optional AndroidWattsonCpuEstimate cpu2 = 5;
+  optional AndroidWattsonCpuEstimate cpu3 = 6;
+  optional AndroidWattsonCpuEstimate cpu4 = 7;
+  optional AndroidWattsonCpuEstimate cpu5 = 8;
+  optional AndroidWattsonCpuEstimate cpu6 = 9;
+  optional AndroidWattsonCpuEstimate cpu7 = 10;
 }
 
 message AndroidWattsonCpuEstimate {
   optional float estimated_mw = 1;
+  optional float estimated_mws = 2;
 }
 
 message AndroidWattsonDsuScuEstimate {
   optional float estimated_mw = 1;
+  optional float estimated_mws = 2;
 }
 
 // End of protos/perfetto/metrics/android/wattson_in_time_period.proto
diff --git a/python/perfetto/trace_processor/metrics.descriptor b/python/perfetto/trace_processor/metrics.descriptor
index 9c3e42c..9c22fd3 100644
--- a/python/perfetto/trace_processor/metrics.descriptor
+++ b/python/perfetto/trace_processor/metrics.descriptor
Binary files differ
diff --git a/src/trace_processor/metrics/sql/android/wattson_rail_relations.sql b/src/trace_processor/metrics/sql/android/wattson_rail_relations.sql
index 6c2dbbb..4c80ebb 100644
--- a/src/trace_processor/metrics/sql/android/wattson_rail_relations.sql
+++ b/src/trace_processor/metrics/sql/android/wattson_rail_relations.sql
@@ -79,46 +79,76 @@
     period_id,
     period_dur,
     cast_double!(IIF(is_defined, sum_mw, NULL)) as estimated_mw,
+    cast_double!(
+      IIF(is_defined, sum_mw * period_dur / 1e9, NULL)
+    ) as estimated_mws,
     AndroidWattsonPolicyEstimate(
       'estimated_mw', cast_double!(IIF(is_defined, sum_mw, NULL)),
+      'estimated_mws', cast_double!(
+        IIF(is_defined, sum_mw * period_dur / 1e9, NULL)
+      ),
       'cpu0', IIF(
         cpu0_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu0_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu0_mw,
+          'estimated_mws', cpu0_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu1', IIF(
         cpu1_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu1_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu1_mw,
+          'estimated_mws', cpu1_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu2', IIF(
         cpu2_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu2_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu2_mw,
+          'estimated_mws', cpu2_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu3', IIF(
         cpu3_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu3_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu3_mw,
+          'estimated_mws', cpu3_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu4', IIF(
         cpu4_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu4_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu4_mw,
+          'estimated_mws', cpu4_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu5', IIF(
         cpu5_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu5_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu5_mw,
+          'estimated_mws', cpu5_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu6', IIF(
         cpu6_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu6_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu6_mw,
+          'estimated_mws', cpu6_mw * period_dur / 1e9
+        ),
         NULL
       ),
       'cpu7', IIF(
         cpu7_mw,
-        AndroidWattsonCpuEstimate('estimated_mw', cpu7_mw),
+        AndroidWattsonCpuEstimate(
+          'estimated_mw', cpu7_mw,
+          'estimated_mws', cpu7_mw * period_dur / 1e9
+        ),
         NULL
       )
     ) AS proto
@@ -347,6 +377,7 @@
   period_dur,
   AndroidWattsonCpuSubsystemEstimate(
     'estimated_mw', sum_mw,
+    'estimated_mws', sum_mw * period_dur / 1e9,
     'policy0', p0_proto,
     'policy1', p1_proto,
     'policy2', p2_proto,
@@ -355,7 +386,10 @@
     'policy5', p5_proto,
     'policy6', p6_proto,
     'policy7', p7_proto,
-    'dsu_scu', AndroidWattsonDsuScuEstimate('estimated_mw', dsu_scu_mw)
+    'dsu_scu', AndroidWattsonDsuScuEstimate(
+      'estimated_mw', dsu_scu_mw,
+      'estimated_mws', dsu_scu_mw * period_dur / 1e9
+    )
   ) as proto
 FROM components_w_sum;
 
diff --git a/test/trace_processor/diff_tests/metrics/android/tests.py b/test/trace_processor/diff_tests/metrics/android/tests.py
index 27d4ad6..5f24e2e 100644
--- a/test/trace_processor/diff_tests/metrics/android/tests.py
+++ b/test/trace_processor/diff_tests/metrics/android/tests.py
@@ -382,41 +382,54 @@
             period_dur: 384847255
             cpu_subsystem {
               estimated_mw: 4568.1772
+              estimated_mws: 1758.050415
               policy0 {
                 estimated_mw: 578.31256
+                estimated_mws: 222.561996
                 cpu0 {
                   estimated_mw: 148.99423
+                  estimated_mws: 57.340019
                 }
                 cpu1 {
                   estimated_mw: 130.13142
+                  estimated_mws: 50.080723
                 }
                 cpu2 {
                   estimated_mw: 127.60357
+                  estimated_mws: 49.107883
                 }
                 cpu3 {
                   estimated_mw: 171.58333
+                  estimated_mws: 66.033371
                 }
               }
               policy4 {
                 estimated_mw: 684.18835
+                estimated_mws: 263.308014
                 cpu4 {
                   estimated_mw: 344.39563
+                  estimated_mws: 132.539703
                 }
                 cpu5 {
                   estimated_mw: 339.7927
+                  estimated_mws: 130.768295
                 }
               }
               policy6 {
                 estimated_mw: 2163.158
+                estimated_mws: 832.48541
                 cpu6 {
                   estimated_mw: 1080.6881
+                  estimated_mws: 415.89984
                 }
                 cpu7 {
                   estimated_mw: 1082.47
+                  estimated_mws: 416.585602
                 }
               }
               dsu_scu {
                 estimated_mw: 1142.5181
+                estimated_mws: 439.694946
               }
             }
           }
@@ -436,23 +449,30 @@
             period_dur: 61792677852
             cpu_subsystem {
               estimated_mw: 42.123608
+              estimated_mws: 2602.930420
               policy0 {
                 estimated_mw: 34.71892
+                estimated_mws: 2145.375244
                 cpu0 {
                   estimated_mw: 10.705099
+                  estimated_mws: 661.496704
                 }
                 cpu1 {
                   estimated_mw: 8.315703
+                  estimated_mws: 513.849548
                 }
                 cpu2 {
                   estimated_mw: 7.7776227
+                  estimated_mws: 480.600128
                 }
                 cpu3 {
                   estimated_mw: 7.9204974
+                  estimated_mws: 489.428741
                 }
               }
               dsu_scu {
                 estimated_mw: 7.404684
+                estimated_mws: 457.555267
               }
             }
           }
@@ -490,23 +510,30 @@
             period_dur: 2031871358
             cpu_subsystem {
               estimated_mw: 46.540943
+              estimated_mws: 94.565208
               policy0 {
                 estimated_mw: 34.037483
+                estimated_mws: 69.159790
                 cpu0 {
                   estimated_mw: 14.416655
+                  estimated_mws: 29.292788
                 }
                 cpu1 {
                   estimated_mw: 6.641429
+                  estimated_mws: 13.494529
                 }
                 cpu2 {
                   estimated_mw: 8.134797
+                  estimated_mws: 16.528862
                 }
                 cpu3 {
                   estimated_mw: 4.8446035
+                  estimated_mws: 9.843612
                 }
               }
               dsu_scu {
                 estimated_mw: 12.503458
+                estimated_mws: 25.405418
               }
             }
           }