base-stats,python: Expose DistInfo via Pybind11

Change-Id: If3ac9a0da52b929559e3cde3c2bab95b59ab16ce
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/39298
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
diff --git a/src/python/pybind11/stats.cc b/src/python/pybind11/stats.cc
index 5d52872..d07ccbf 100644
--- a/src/python/pybind11/stats.cc
+++ b/src/python/pybind11/stats.cc
@@ -67,6 +67,7 @@
     } while (0)
 
     TRY_CAST(Stats::ScalarInfo);
+    TRY_CAST(Stats::DistInfo);
 
     return py::cast(info);
 
@@ -147,6 +148,38 @@
         .def("total", &Stats::ScalarInfo::total)
         ;
 
+    py::class_<Stats::DistInfo, Stats::Info,
+                std::unique_ptr<Stats::DistInfo, py::nodelete>>(
+                    m, "DistInfo")
+        .def_property_readonly("min_val", [](const Stats::DistInfo &info) {
+                return info.data.min_val;
+            })
+        .def_property_readonly("max_val", [](const Stats::DistInfo &info) {
+                return info.data.max_val;
+            })
+        .def_property_readonly("bucket_size", [](const Stats::DistInfo &info) {
+                return info.data.bucket_size;
+            })
+        .def_property_readonly("values", [](const Stats::DistInfo &info) {
+                return info.data.cvec;
+            })
+        .def_property_readonly("overflow", [](const Stats::DistInfo &info) {
+                return info.data.overflow;
+            })
+        .def_property_readonly("underflow", [](const Stats::DistInfo &info) {
+                return info.data.underflow;
+            })
+        .def_property_readonly("sum", [](const Stats::DistInfo &info) {
+                return info.data.sum;
+            })
+        .def_property_readonly("logs", [](const Stats::DistInfo &info) {
+                return info.data.logs;
+            })
+        .def_property_readonly("squares", [](const Stats::DistInfo &info) {
+                return info.data.squares;
+            })
+        ;
+
     py::class_<Stats::Group, std::unique_ptr<Stats::Group, py::nodelete>>(
         m, "Group")
         .def("regStats", &Stats::Group::regStats)