From f3ce343a26f8f657d85953960b9fb6099ffca0e1 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 15 Sep 2023 10:21:27 -0700 Subject: [PATCH 1/3] stdlib, resources: Added pretty printing resource - Implemented a __str__ for AbstractResource __str__ prints resource category, id and version. link to resources website is also printed. Change-Id: Iad5825ff7d8d505ceb236e00dc49bb56055fc8f0 --- src/python/gem5/resources/resource.py | 62 ++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) diff --git a/src/python/gem5/resources/resource.py b/src/python/gem5/resources/resource.py index 9e6c79ab01..fd55995bbe 100644 --- a/src/python/gem5/resources/resource.py +++ b/src/python/gem5/resources/resource.py @@ -25,6 +25,7 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from abc import ABCMeta +import json import os from pathlib import Path from m5.util import warn, fatal @@ -70,6 +71,8 @@ class AbstractResource: def __init__( self, + category: Optional[str] = None, + id: Optional[str] = None, resource_version: Optional[str] = None, local_path: Optional[str] = None, description: Optional[str] = None, @@ -91,12 +94,16 @@ class AbstractResource: f"Local path specified for resource, '{local_path}', does not " "exist." ) - + self._id = id + self._category = category self._local_path = local_path self._description = description self._source = source self._version = resource_version + def __str__(self): + return f"{self._category} resource({self._id}, {self._version})\nFor more information, please visit https://resources.gem5.org/resources/{self._id}?version={self._version}" + def get_resource_version(self) -> str: """Returns the version of the resource.""" return self._version @@ -122,6 +129,8 @@ class FileResource(AbstractResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -134,6 +143,8 @@ class FileResource(AbstractResource): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -146,6 +157,8 @@ class DirectoryResource(AbstractResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -159,6 +172,8 @@ class DirectoryResource(AbstractResource): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -171,6 +186,8 @@ class DiskImageResource(FileResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -179,6 +196,8 @@ class DiskImageResource(FileResource): ): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -196,6 +215,8 @@ class BinaryResource(FileResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -204,6 +225,8 @@ class BinaryResource(FileResource): ): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -227,6 +250,8 @@ class BootloaderResource(BinaryResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -235,6 +260,8 @@ class BootloaderResource(BinaryResource): ): super().__init__( local_path=local_path, + id=id, + category=category, description=description, architecture=architecture, source=source, @@ -248,6 +275,8 @@ class GitResource(DirectoryResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -255,6 +284,8 @@ class GitResource(DirectoryResource): ): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -267,6 +298,8 @@ class KernelResource(BinaryResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -275,6 +308,8 @@ class KernelResource(BinaryResource): ): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, architecture=architecture, @@ -293,6 +328,8 @@ class CheckpointResource(DirectoryResource): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -300,6 +337,8 @@ class CheckpointResource(DirectoryResource): ): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -320,6 +359,8 @@ class SimpointResource(AbstractResource): simpoint_list: List[int] = None, weight_list: List[float] = None, warmup_interval: int = 0, + id: Optional[str] = None, + category: Optional[str] = None, workload_name: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -340,6 +381,8 @@ class SimpointResource(AbstractResource): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -429,6 +472,8 @@ class LooppointCsvResource(FileResource, LooppointCsvLoader): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -437,6 +482,8 @@ class LooppointCsvResource(FileResource, LooppointCsvLoader): FileResource.__init__( self, local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -448,6 +495,8 @@ class LooppointJsonResource(FileResource, LooppointJsonLoader): def __init__( self, local_path: str, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, region_id: Optional[Union[str, int]] = None, description: Optional[str] = None, @@ -457,6 +506,8 @@ class LooppointJsonResource(FileResource, LooppointJsonLoader): FileResource.__init__( self, local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -477,6 +528,8 @@ class SimpointDirectoryResource(SimpointResource): weight_file: str, simpoint_interval: int, warmup_interval: int, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, workload_name: Optional[str] = None, description: Optional[str] = None, @@ -510,6 +563,8 @@ class SimpointDirectoryResource(SimpointResource): warmup_interval=warmup_interval, workload_name=workload_name, local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -563,6 +618,8 @@ class WorkloadResource(AbstractResource): def __init__( self, function: str = None, + id: Optional[str] = None, + category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -577,6 +634,8 @@ class WorkloadResource(AbstractResource): super().__init__( local_path=local_path, + id=id, + category=category, description=description, source=source, resource_version=resource_version, @@ -741,6 +800,7 @@ def obtain_resource( # Once we know what AbstractResource subclass we are using, we create it. # The fields in the JSON object are assumed to map like-for-like to the # subclass contructor, so we can pass the resource_json map directly. + return resource_class(local_path=to_path, **resource_json) From 7225da4ac6946700a4893df33f8e56746f852b1f Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Fri, 15 Sep 2023 10:41:45 -0700 Subject: [PATCH 2/3] stdlib, resources: Removed unused import Change-Id: Iee54cc695c7c8ce146719ef583be424b792e2232 --- src/python/gem5/resources/resource.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/python/gem5/resources/resource.py b/src/python/gem5/resources/resource.py index fd55995bbe..6b33f10971 100644 --- a/src/python/gem5/resources/resource.py +++ b/src/python/gem5/resources/resource.py @@ -25,7 +25,6 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. from abc import ABCMeta -import json import os from pathlib import Path from m5.util import warn, fatal @@ -800,7 +799,6 @@ def obtain_resource( # Once we know what AbstractResource subclass we are using, we create it. # The fields in the JSON object are assumed to map like-for-like to the # subclass contructor, so we can pass the resource_json map directly. - return resource_class(local_path=to_path, **resource_json) From 633bdc08f2e32d24990132336c16788a2161fdc8 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Wed, 27 Sep 2023 11:36:51 -0700 Subject: [PATCH 3/3] stdlib: Addressed requested changes - Added mulitline string for print message - Added get_category_name method instead of having category as variable Change-Id: I51e0e14a70e802453c21070711b200bc47994ba3 --- src/python/gem5/resources/resource.py | 78 +++++++++++++++++---------- 1 file changed, 49 insertions(+), 29 deletions(-) diff --git a/src/python/gem5/resources/resource.py b/src/python/gem5/resources/resource.py index 6b33f10971..5b70f9561b 100644 --- a/src/python/gem5/resources/resource.py +++ b/src/python/gem5/resources/resource.py @@ -70,7 +70,6 @@ class AbstractResource: def __init__( self, - category: Optional[str] = None, id: Optional[str] = None, resource_version: Optional[str] = None, local_path: Optional[str] = None, @@ -94,14 +93,22 @@ class AbstractResource: "exist." ) self._id = id - self._category = category self._local_path = local_path self._description = description self._source = source self._version = resource_version + def get_category_name(cls) -> str: + raise NotImplementedError + def __str__(self): - return f"{self._category} resource({self._id}, {self._version})\nFor more information, please visit https://resources.gem5.org/resources/{self._id}?version={self._version}" + message = ( + f"{self.get_category_name()}({self._id}, {self._version})\n" + "For more information, please visit " + f"https://resources.gem5.org/resources/{self._id}?" + f"version={self._version}" + ) + return message def get_resource_version(self) -> str: """Returns the version of the resource.""" @@ -129,7 +136,6 @@ class FileResource(AbstractResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -143,12 +149,14 @@ class FileResource(AbstractResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, ) + def get_category_name(cls) -> str: + return "FileResource" + class DirectoryResource(AbstractResource): """A resource consisting of a directory.""" @@ -157,7 +165,6 @@ class DirectoryResource(AbstractResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -172,12 +179,14 @@ class DirectoryResource(AbstractResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, ) + def get_category_name(cls) -> str: + return "DirectoryResource" + class DiskImageResource(FileResource): """A Disk Image resource.""" @@ -186,7 +195,6 @@ class DiskImageResource(FileResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -196,7 +204,6 @@ class DiskImageResource(FileResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, @@ -207,6 +214,9 @@ class DiskImageResource(FileResource): """Returns, if applicable, the Root Partition of the disk image.""" return self._root_partition + def get_category_name(cls) -> str: + return "DiskImageResource" + class BinaryResource(FileResource): """A binary resource.""" @@ -215,7 +225,6 @@ class BinaryResource(FileResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -225,7 +234,6 @@ class BinaryResource(FileResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, @@ -238,6 +246,9 @@ class BinaryResource(FileResource): elif isinstance(architecture, ISA): self._architecture = architecture + def get_category_name(cls) -> str: + return "BinaryResource" + def get_architecture(self) -> Optional[ISA]: """Returns the ISA this binary is compiled to.""" return self._architecture @@ -250,7 +261,6 @@ class BootloaderResource(BinaryResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -260,13 +270,15 @@ class BootloaderResource(BinaryResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, architecture=architecture, source=source, resource_version=resource_version, ) + def get_category_name(cls) -> str: + return "BootloaderResource" + class GitResource(DirectoryResource): """A git resource.""" @@ -275,7 +287,6 @@ class GitResource(DirectoryResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -284,12 +295,14 @@ class GitResource(DirectoryResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, ) + def get_category_name(cls) -> str: + return "GitResource" + class KernelResource(BinaryResource): """A kernel resource.""" @@ -298,7 +311,6 @@ class KernelResource(BinaryResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -308,13 +320,15 @@ class KernelResource(BinaryResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, architecture=architecture, resource_version=resource_version, ) + def get_category_name(cls) -> str: + return "KernelResource" + class CheckpointResource(DirectoryResource): """A checkpoint resource. The following directory structure is expected: @@ -328,7 +342,6 @@ class CheckpointResource(DirectoryResource): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -337,12 +350,14 @@ class CheckpointResource(DirectoryResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, ) + def get_category_name(cls) -> str: + return "CheckpointResource" + class SimpointResource(AbstractResource): """A simpoint resource. This resource stores all information required to @@ -359,7 +374,6 @@ class SimpointResource(AbstractResource): weight_list: List[float] = None, warmup_interval: int = 0, id: Optional[str] = None, - category: Optional[str] = None, workload_name: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -381,7 +395,6 @@ class SimpointResource(AbstractResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, @@ -463,6 +476,9 @@ class SimpointResource(AbstractResource): self._simpoint_start_insts[index] = start_inst - warmup_inst return warmup_list + def get_category_name(cls) -> str: + return "SimpointResource" + class LooppointCsvResource(FileResource, LooppointCsvLoader): """This Looppoint resource used to create a Looppoint resource from a @@ -472,7 +488,6 @@ class LooppointCsvResource(FileResource, LooppointCsvLoader): self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -482,20 +497,21 @@ class LooppointCsvResource(FileResource, LooppointCsvLoader): self, local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, ) LooppointCsvLoader.__init__(self, pinpoints_file=Path(local_path)) + def get_category_name(cls) -> str: + return "LooppointCsvResource" + class LooppointJsonResource(FileResource, LooppointJsonLoader): def __init__( self, local_path: str, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, region_id: Optional[Union[str, int]] = None, description: Optional[str] = None, @@ -506,7 +522,6 @@ class LooppointJsonResource(FileResource, LooppointJsonLoader): self, local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, @@ -515,6 +530,9 @@ class LooppointJsonResource(FileResource, LooppointJsonLoader): self, looppoint_file=local_path, region_id=region_id ) + def get_category_name(cls) -> str: + return "LooppointJsonResource" + class SimpointDirectoryResource(SimpointResource): """A Simpoint diretory resource. This Simpoint Resource assumes the @@ -528,7 +546,6 @@ class SimpointDirectoryResource(SimpointResource): simpoint_interval: int, warmup_interval: int, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, workload_name: Optional[str] = None, description: Optional[str] = None, @@ -563,7 +580,6 @@ class SimpointDirectoryResource(SimpointResource): workload_name=workload_name, local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, @@ -607,6 +623,9 @@ class SimpointDirectoryResource(SimpointResource): weight_list.append(weight) return simpoint_list, weight_list + def get_category_name(cls) -> str: + return "SimpointDirectoryResource" + class WorkloadResource(AbstractResource): """A workload resource. This resource is used to specify a workload to run @@ -618,7 +637,6 @@ class WorkloadResource(AbstractResource): self, function: str = None, id: Optional[str] = None, - category: Optional[str] = None, resource_version: Optional[str] = None, description: Optional[str] = None, source: Optional[str] = None, @@ -634,7 +652,6 @@ class WorkloadResource(AbstractResource): super().__init__( local_path=local_path, id=id, - category=category, description=description, source=source, resource_version=resource_version, @@ -671,6 +688,9 @@ class WorkloadResource(AbstractResource): """ self._params[parameter] = value + def get_category_name(cls) -> str: + return "WorkloadResource" + def obtain_resource( resource_id: str,