stdlib: Add __repr__ to pystats

For Statistics the value is returned. E.g.:

```
print(simstats.board.core.some_integer)
> 5
```

For Groups the names of the stats in that group are listed.
E.g.:

```
print(stats.board.core)
> [Group: [some_integer, another_stat, another_group]]
```

Change-Id: I94cea907608fba622f4fc141d5b22ac95d8cde40
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/63271
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
diff --git a/src/python/m5/ext/pystats/group.py b/src/python/m5/ext/pystats/group.py
index 6e2da87..680a5d5 100644
--- a/src/python/m5/ext/pystats/group.py
+++ b/src/python/m5/ext/pystats/group.py
@@ -56,7 +56,7 @@
         time_conversion: Optional[TimeConversion] = None,
         **kwargs: Dict[
             str, Union["Group", Statistic, List["Group"], List["Statistic"]]
-        ]
+        ],
     ):
         if type is None:
             self.type = "Group"
@@ -140,6 +140,15 @@
             pattern = regex
         yield from self.children(lambda _name: bool(pattern.search(_name)))
 
+    def _repr_name(self) -> str:
+        return "Group"
+
+    def __repr__(self) -> str:
+        stats_list = []
+        for key in self.__dict__:
+            stats_list.append(key)
+        return f"{self._repr_name()}: {stats_list}"
+
 
 class Vector(Group):
     """
@@ -152,3 +161,6 @@
 
     def __init__(self, scalar_map: Mapping[str, Scalar]):
         super().__init__(type="Vector", time_conversion=None, **scalar_map)
+
+    def _repr_name(self) -> str:
+        return "Vector"
diff --git a/src/python/m5/ext/pystats/statistic.py b/src/python/m5/ext/pystats/statistic.py
index 446c9ba..b018060 100644
--- a/src/python/m5/ext/pystats/statistic.py
+++ b/src/python/m5/ext/pystats/statistic.py
@@ -56,6 +56,9 @@
         self.description = description
         self.datatype = datatype
 
+    def __repr__(self):
+        return str(self.value)
+
 
 class Scalar(Statistic):
     """