Kelly Nguyen has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/43606 )
Change subject: python: Add JsonLoader to pystats
......................................................................
python: Add JsonLoader to pystats
Allows for loading JSON files (e.g. m5out/stats.json) into the gem5 Python
stats model.
Change-Id: I948dff0b23ea65c4c7acaac5e4fdf3795de1c0a7
Signed-off-by: Kelly Nguyen <klyngu...@ucdavis.edu>
---
M src/python/SConscript
M src/python/m5/ext/pystats/__init__.py
A src/python/m5/ext/pystats/jsonloader.py
M src/python/m5/ext/pystats/simstat.py
4 files changed, 97 insertions(+), 2 deletions(-)
diff --git a/src/python/SConscript b/src/python/SConscript
index 57d5578..b6531ef 100644
--- a/src/python/SConscript
+++ b/src/python/SConscript
@@ -71,6 +71,7 @@
PySource('m5.ext.pystats', 'm5/ext/pystats/statistic.py')
PySource('m5.ext.pystats', 'm5/ext/pystats/storagetype.py')
PySource('m5.ext.pystats', 'm5/ext/pystats/timeconversion.py')
+PySource('m5.ext.pystats', 'm5/ext/pystats/jsonloader.py')
PySource('m5.stats', 'm5/stats/gem5stats.py')
Source('pybind11/core.cc', add_tags='python')
diff --git a/src/python/m5/ext/pystats/__init__.py
b/src/python/m5/ext/pystats/__init__.py
index 4ffac9a..668dddd 100644
--- a/src/python/m5/ext/pystats/__init__.py
+++ b/src/python/m5/ext/pystats/__init__.py
@@ -30,6 +30,7 @@
from .statistic import Statistic
from .storagetype import StorageType
from .timeconversion import TimeConversion
+from .jsonloader import JsonLoader
__all__ = [
"Group",
@@ -38,4 +39,5 @@
"TimeConversion",
"StorageType",
"JsonSerializable",
- ]
\ No newline at end of file
+ "JsonLoader",
+ ]
diff --git a/src/python/m5/ext/pystats/jsonloader.py
b/src/python/m5/ext/pystats/jsonloader.py
new file mode 100644
index 0000000..3191f12
--- /dev/null
+++ b/src/python/m5/ext/pystats/jsonloader.py
@@ -0,0 +1,91 @@
+# Copyright (c) 2021 The Regents of The University of California
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+from .simstat import SimStat
+from .statistic import Scalar, Distribution, Accumulator
+from .group import Group, Vector
+import json
+
+class JsonLoader(json.JSONDecoder):
+ """
+ Subclass of JSONDecoder that overrides 'object_hook'. Converts JSON
object
+ into a SimStat object.
+
+ Usage
+ -----
+ ```
+ from m5.ext.pystats.jsonloader import JsonLoader
+
+ with open(path) as f:
+ simstat_object = json.load(f, cls=JsonLoader)
+ ```
+ """
+
+ def __init__(self):
+ json.JSONDecoder.__init__(self, object_hook=self.__json_to_simstat)
+
+ def __json_to_simstat(self, d: dict) -> SimStat:
+ if 'type' in d:
+ if d['type'] == 'Scalar':
+ d.pop('type', None)
+ return Scalar(**d)
+
+ elif d['type'] == 'Distribution':
+ d.pop('type', None)
+ return Distribution(**d)
+
+ elif d['type'] == 'Accumulator':
+ d.pop('type', None)
+ return Accumulator(**d)
+
+ elif d['type'] == 'Group':
+ return Group(**d)
+
+ elif d['type'] == 'Vector':
+ d.pop('type', None)
+ d.pop('time_conversion', None)
+ return Vector(d)
+ else:
+ return SimStat(**d)
+
+def load(json_file) -> SimStat:
+ """
+ Wrapper function that provides a cleaner interface for using the
+ JsonLoader class.
+
+ Usage
+ -----
+ ```
+ import m5.ext.pystats as pystats
+
+ with open(path) as f:
+ pystats.jsonloader.load(f)
+ ```
+ """
+
+ simstat_object = json.load(json_file, cls=JsonLoader)
+ return simstat_object
+
diff --git a/src/python/m5/ext/pystats/simstat.py
b/src/python/m5/ext/pystats/simstat.py
index 6f4565e..05ce37d 100644
--- a/src/python/m5/ext/pystats/simstat.py
+++ b/src/python/m5/ext/pystats/simstat.py
@@ -53,4 +53,5 @@
self.simulated_end_time = simulated_end_time
for key,value in kwargs.items():
- setattr(self, key, value)
\ No newline at end of file
+ setattr(self, key, value)
+
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/43606
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I948dff0b23ea65c4c7acaac5e4fdf3795de1c0a7
Gerrit-Change-Number: 43606
Gerrit-PatchSet: 1
Gerrit-Owner: Kelly Nguyen <klyngu...@ucdavis.edu>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s