#!/usr/bin/env python3 # # NOTE: the custom hooks are only used for sky130. import os import hammer_vlsi from hammer_vlsi import CLIDriver, HammerToolHookAction from typing import Dict, Callable, Optional, List from technology.sky130 import SKY130Tech def example_place_tap_cells(x: hammer_vlsi.HammerTool) -> bool: if x.get_setting("vlsi.core.technology") == "sky130": x.append(''' # TODO # Place custom TCL here ''') return True def example_add_fillers(x: hammer_vlsi.HammerTool) -> bool: if x.get_setting("vlsi.core.technology") == "sky130": x.append(''' # TODO # Place custom TCL here ''') return True def example_tool_settings(x: hammer_vlsi.HammerTool) -> bool: if x.get_setting("vlsi.core.technology") == "sky130": x.append(''' # TODO # Place custom TCL here set_db route_design_bottom_routing_layer 2 set_db route_design_top_routing_layer 5 ''') return True def drc_blackbox_openram_srams(x: hammer_vlsi.HammerTool) -> bool: if x.get_setting("vlsi.core.technology") == "sky130": drc_box = '' for name in SKY130Tech().openram_sram_names(): drc_box += f"\nEXCLUDE CELL {name}" with open(x.drc_run_file, "a") as f: f.write(drc_box) return True def lvs_blackbox_openram_srams(x: hammer_vlsi.HammerTool) -> bool: if x.get_setting("vlsi.core.technology") == "sky130": lvs_box = '' for name in SKY130Tech.openram_sram_names(): lvs_box += f"\nLVS BOX {name}" lvs_box += f"\nLVS FILTER {name} OPEN " with open(x.lvs_run_file, "a") as f: f.write(lvs_box) return True class ExampleDriver(CLIDriver): def get_extra_par_hooks(self) -> List[HammerToolHookAction]: extra_hooks = [ # Default set of steps can be found in the CAD tool plugin's __init__.py # make_pre_insertion_hook will execute the custom hook before the specified step # SYNTAX: make_pre_insertion_hook("EXISTING_STEP", INSERTED_HOOK) # hammer_vlsi.HammerTool.make_pre_insertion_hook("route_design", example_add_fillers), # make_post_insertion_hook will execute the custom hook after the specified step hammer_vlsi.HammerTool.make_post_insertion_hook("init_design", example_tool_settings), # make_replacement_hook will replace the specified step with a custom hook # hammer_vlsi.HammerTool.make_replacement_hook("place_tap_cells", example_place_tap_cells), # make_removal_hook will remove the specified step from the flow hammer_vlsi.HammerTool.make_removal_hook("place_bumps"), # The target step in any of the above calls may be a default step or another one of your custom hooks ] return extra_hooks def get_extra_drc_hooks(self) -> List[HammerToolHookAction]: extra_hooks = [ # This is an example of a technology-supplied hook hammer_vlsi.HammerTool.make_post_insertion_hook("generate_drc_run_file", drc_blackbox_openram_srams), ] return extra_hooks def get_extra_lvs_hooks(self) -> List[HammerToolHookAction]: extra_hooks = [ # This is an example of a technology-supplied hook hammer_vlsi.HammerTool.make_post_insertion_hook("generate_lvs_run_file", lvs_blackbox_openram_srams), ] return extra_hooks if __name__ == '__main__': ExampleDriver().main()