From 0fbcfa5c19edc684c376f3c55e3567d67f48b051 Mon Sep 17 00:00:00 2001 From: Jingyi Date: Tue, 21 May 2019 12:12:43 -0700 Subject: [PATCH 1/8] Replace blank power straps mode with empty --- src/hammer-vlsi/defaults.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hammer-vlsi/defaults.yml b/src/hammer-vlsi/defaults.yml index bb48e1b53..2b1332ba8 100644 --- a/src/hammer-vlsi/defaults.yml +++ b/src/hammer-vlsi/defaults.yml @@ -437,10 +437,10 @@ par: # Power straps configuration. # Valid options are: - # - blank - Specify no power straps + # - empty - Specify no power straps # - manual - Specify the contents of a manual TCL script to use, specified in power_straps_script_contents. # - generate - Generate power straps from Hammer IR. - power_straps_mode: blank + power_straps_mode: empty power_straps_script_contents: null # Spacing around blocks and hardmacros in microns From 46b48686fe8207365ee234b02e303eef3d1127eb Mon Sep 17 00:00:00 2001 From: Jingyi Date: Wed, 22 May 2019 11:01:53 -0700 Subject: [PATCH 2/8] add Mode Enum class #400 --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index 5329839ad..8b7e57d36 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -28,6 +28,9 @@ from .submit_command import HammerSubmitCommand from .units import TemperatureValue, TimeValue, VoltageValue +from enum import Enum +from hammer_utils import reverse_dict + __all__ = ['HammerTool'] @@ -1128,3 +1131,34 @@ def verbose_tcl_append(cmd: str, output_buffer: List[str]) -> None: """ output_buffer.append("""puts "{0}" """.format(cmd.replace('"', '\"'))) output_buffer.append(cmd) +class ModeType(Enum): + Auto = 1 + Empty = 2 + Manual = 3 + Generate = 4 + Generated = 5 + Append = 6 + Prepend = 7 + + @classmethod + def __mapping(cls) -> Dict[str, "ModeType"]: + return { + "auto": ModeType.Auto, + "empty": ModeType.Empty, + "manual": ModeType.Manual, + "generate": ModeType.Generated, + "generated": ModeType.Generate, + "append": ModeType.Append, + "prepend": ModeType.Prepend + } + + @staticmethod + def from_str(input_str: str) -> "ModeType": + try: + return ModeType.__mapping()[input_str] + except KeyError: + raise ValueError("Invalid mode type: " + str(input_str)) + + def __str__(self) -> str: + return reverse_dict(ModeType.__mapping())[self] + From bbf024e3d603b244183f6506d4ab30ff4baa5dd9 Mon Sep 17 00:00:00 2001 From: Jingyi Date: Wed, 22 May 2019 13:08:08 -0700 Subject: [PATCH 3/8] include 4 mode types, change string comparisons to Enum comparisons --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 23 +++++++------------ .../hammer_vlsi/hammer_vlsi_impl.py | 10 ++++---- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index 8b7e57d36..4357914d2 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -895,10 +895,10 @@ def get_independent_ground_nets(self) -> List[Supply]: return list(filter(lambda x: x.tie is None, self.get_all_ground_nets())) def get_bumps(self) -> Optional[BumpsDefinition]: - bumps_mode = self.get_setting("vlsi.inputs.bumps_mode") - if bumps_mode == "empty": + bumps_mode = ModeType.from_str(self.get_setting("vlsi.inputs.bumps_mode")) #Type: ModeType Enum + if bumps_mode == ModeType.Empty: return None - elif bumps_mode != "manual": + elif bumps_mode != ModeType.Manual: self.logger.error("Invalid bumps_mode:{m}, only empty or manual supported. Assuming empty.".format( m=bumps_mode)) return None @@ -973,7 +973,7 @@ def get_gds_map_file(self) -> Optional[str]: :return: Fully-resolved path to GDS map file or None. """ # Mode can be auto, empty, or manual - gds_map_mode = str(self.get_setting("par.inputs.gds_map_mode")) # type: str + gds_map_mode = ModeType.from_str(str(self.get_setting("par.inputs.gds_map_mode"))) # type: ModeType Enum # gds_map_file will only be used in manual mode # Not including the map_file flag includes all layers but with no specific layer numbers @@ -986,11 +986,11 @@ def get_gds_map_file(self) -> Optional[str]: tech_map_file_raw) if tech_map_file_raw is not None else None # type: Optional[str] tech_map_file = optional_map(tech_map_file_optional, lambda p: self.technology.prepend_dir_path(p)) - if gds_map_mode == "auto": + if gds_map_mode == ModeType.Auto: map_file = tech_map_file - elif gds_map_mode == "manual": + elif gds_map_mode == ModeType.Manual: map_file = manual_map_file - elif gds_map_mode == "empty": + elif gds_map_mode == ModeType.Empty: map_file = None else: self.logger.error( @@ -1135,10 +1135,7 @@ class ModeType(Enum): Auto = 1 Empty = 2 Manual = 3 - Generate = 4 - Generated = 5 - Append = 6 - Prepend = 7 + Generated = 4 @classmethod def __mapping(cls) -> Dict[str, "ModeType"]: @@ -1146,10 +1143,7 @@ def __mapping(cls) -> Dict[str, "ModeType"]: "auto": ModeType.Auto, "empty": ModeType.Empty, "manual": ModeType.Manual, - "generate": ModeType.Generated, "generated": ModeType.Generate, - "append": ModeType.Append, - "prepend": ModeType.Prepend } @staticmethod @@ -1161,4 +1155,3 @@ def from_str(input_str: str) -> "ModeType": def __str__(self) -> str: return reverse_dict(ModeType.__mapping())[self] - diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py b/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py index 971ef3307..c5435b864 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py @@ -23,7 +23,7 @@ from .constraints import * from .units import VoltageValue - +from .hammer_tool import ModeType class HierarchicalMode(Enum): Flat = 1 @@ -1323,15 +1323,15 @@ def generate_power_spec_commands(self) -> List[str]: return [] power_spec_contents = "" # type: str - power_spec_mode = str(self.get_setting("vlsi.inputs.power_spec_mode")) # type: str - if power_spec_mode == "empty": + power_spec_mode = ModeType.from_str(str(self.get_setting("vlsi.inputs.power_spec_mode"))) # type: ModeType Enum + if power_spec_mode == ModeType.Empty: return [] - elif power_spec_mode == "auto": + elif power_spec_mode == ModeType.Auto: if power_spec_type == "cpf": power_spec_contents = self.cpf_power_specification elif power_spec_type == "upf": power_spec_contents = self.upf_power_specification - elif power_spec_mode == "manual": + elif power_spec_mode == ModeType.Manual: power_spec_contents = str(self.get_setting("vlsi.inputs.power_spec_contents")) else: self.logger.error("Invalid power specification mode '{mode}'; using 'empty'.".format(mode=power_spec_mode)) From 10d94d096e26a64cfbdb12f4eb85035d7af9ba72 Mon Sep 17 00:00:00 2001 From: Jingyi Date: Wed, 22 May 2019 13:09:32 -0700 Subject: [PATCH 4/8] fixed typo --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index 4357914d2..f321ca95d 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -1143,7 +1143,7 @@ def __mapping(cls) -> Dict[str, "ModeType"]: "auto": ModeType.Auto, "empty": ModeType.Empty, "manual": ModeType.Manual, - "generated": ModeType.Generate, + "generated": ModeType.Generated, } @staticmethod From ba8f207d1378a5d5c8f3d9d7fe99f6e07a52a301 Mon Sep 17 00:00:00 2001 From: Jingyi99 <37708002+Jingyi99@users.noreply.github.com> Date: Wed, 22 May 2019 13:13:51 -0700 Subject: [PATCH 5/8] Update src/hammer-vlsi/hammer_vlsi/hammer_tool.py Co-Authored-By: edwardcwang --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index f321ca95d..bfb784f13 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -895,7 +895,7 @@ def get_independent_ground_nets(self) -> List[Supply]: return list(filter(lambda x: x.tie is None, self.get_all_ground_nets())) def get_bumps(self) -> Optional[BumpsDefinition]: - bumps_mode = ModeType.from_str(self.get_setting("vlsi.inputs.bumps_mode")) #Type: ModeType Enum + bumps_mode = ModeType.from_str(self.get_setting("vlsi.inputs.bumps_mode")) # type: ModeType if bumps_mode == ModeType.Empty: return None elif bumps_mode != ModeType.Manual: From c2d56e5827bf7d799dc8aaa9b8c19e41383e8b58 Mon Sep 17 00:00:00 2001 From: Jingyi99 <37708002+Jingyi99@users.noreply.github.com> Date: Wed, 22 May 2019 13:14:13 -0700 Subject: [PATCH 6/8] Update src/hammer-vlsi/hammer_vlsi/hammer_tool.py Co-Authored-By: edwardcwang --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index bfb784f13..b22a33135 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -1131,6 +1131,7 @@ def verbose_tcl_append(cmd: str, output_buffer: List[str]) -> None: """ output_buffer.append("""puts "{0}" """.format(cmd.replace('"', '\"'))) output_buffer.append(cmd) + class ModeType(Enum): Auto = 1 Empty = 2 From a82a9b61b8d94fd7836ad57b65e74c8234ea123b Mon Sep 17 00:00:00 2001 From: Jingyi Date: Wed, 22 May 2019 13:18:27 -0700 Subject: [PATCH 7/8] fix type hinting comments --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 2 +- src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index b22a33135..7825c588a 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -973,7 +973,7 @@ def get_gds_map_file(self) -> Optional[str]: :return: Fully-resolved path to GDS map file or None. """ # Mode can be auto, empty, or manual - gds_map_mode = ModeType.from_str(str(self.get_setting("par.inputs.gds_map_mode"))) # type: ModeType Enum + gds_map_mode = ModeType.from_str(str(self.get_setting("par.inputs.gds_map_mode"))) # type: ModeType # gds_map_file will only be used in manual mode # Not including the map_file flag includes all layers but with no specific layer numbers diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py b/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py index c5435b864..42375db6a 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py @@ -1323,7 +1323,7 @@ def generate_power_spec_commands(self) -> List[str]: return [] power_spec_contents = "" # type: str - power_spec_mode = ModeType.from_str(str(self.get_setting("vlsi.inputs.power_spec_mode"))) # type: ModeType Enum + power_spec_mode = ModeType.from_str(str(self.get_setting("vlsi.inputs.power_spec_mode"))) # type: ModeType if power_spec_mode == ModeType.Empty: return [] elif power_spec_mode == ModeType.Auto: From 397deb740282d41c83367cb5a805fa4d36fb40eb Mon Sep 17 00:00:00 2001 From: Jingyi Date: Fri, 24 May 2019 12:45:37 -0700 Subject: [PATCH 8/8] add hammer tool class method get_mode_setting --- src/hammer-vlsi/hammer_vlsi/hammer_tool.py | 15 +++++++++++++-- src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py | 3 +-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py index 7825c588a..8ddf00fba 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_tool.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_tool.py @@ -895,7 +895,7 @@ def get_independent_ground_nets(self) -> List[Supply]: return list(filter(lambda x: x.tie is None, self.get_all_ground_nets())) def get_bumps(self) -> Optional[BumpsDefinition]: - bumps_mode = ModeType.from_str(self.get_setting("vlsi.inputs.bumps_mode")) # type: ModeType + bumps_mode = self.get_mode_setting("vlsi.inputs.bumps_mode") #type: ModeType if bumps_mode == ModeType.Empty: return None elif bumps_mode != ModeType.Manual: @@ -973,7 +973,7 @@ def get_gds_map_file(self) -> Optional[str]: :return: Fully-resolved path to GDS map file or None. """ # Mode can be auto, empty, or manual - gds_map_mode = ModeType.from_str(str(self.get_setting("par.inputs.gds_map_mode"))) # type: ModeType + gds_map_mode = self.get_mode_setting("par.inputs.gds_map_mode") #type: ModeType # gds_map_file will only be used in manual mode # Not including the map_file flag includes all layers but with no specific layer numbers @@ -1132,6 +1132,15 @@ def verbose_tcl_append(cmd: str, output_buffer: List[str]) -> None: output_buffer.append("""puts "{0}" """.format(cmd.replace('"', '\"'))) output_buffer.append(cmd) + def get_mode_setting(self, setting: str) -> ModeType: + """ + Create a ModeType object based on the mode settings. + + :param setting: Key of the setting to receive. + :return: ModeType, can be auto, empty, manual or generated. + """ + return ModeType.from_str(self.get_setting(setting)) + class ModeType(Enum): Auto = 1 Empty = 2 @@ -1156,3 +1165,5 @@ def from_str(input_str: str) -> "ModeType": def __str__(self) -> str: return reverse_dict(ModeType.__mapping())[self] + + diff --git a/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py b/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py index 42375db6a..aafe911e4 100644 --- a/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py +++ b/src/hammer-vlsi/hammer_vlsi/hammer_vlsi_impl.py @@ -23,7 +23,6 @@ from .constraints import * from .units import VoltageValue -from .hammer_tool import ModeType class HierarchicalMode(Enum): Flat = 1 @@ -1323,7 +1322,7 @@ def generate_power_spec_commands(self) -> List[str]: return [] power_spec_contents = "" # type: str - power_spec_mode = ModeType.from_str(str(self.get_setting("vlsi.inputs.power_spec_mode"))) # type: ModeType + power_spec_mode = self.get_mode_setting("par.inputs.gds_map_mode") if power_spec_mode == ModeType.Empty: return [] elif power_spec_mode == ModeType.Auto: