Source code for piel.integration.hdl21_gdsfactory.sky130

from ...types import AnalogueModule
from typing import Callable

custom_mapping_dict = {
    "sky130_fd_pr__nfet_01v8": "sky130_fd_pr__rf_nfet_01v8_aM02W1p65L0p15",
    "sky130_fd_pr__pfet_01v8": "sky130_fd_pr__rf_pfet_01v8_mcM04W3p00L0p15",
    "sky130_fd_pr__res_generic_po": "p_n_poly",
}


[docs] def find_most_relevant_gds(component_name, component_dict=None, custom_mapping=None): from difflib import get_close_matches import sky130 if component_dict is None: component_dict = sky130.cells if custom_mapping is None: custom_mapping = custom_mapping_dict if component_name in custom_mapping.keys(): print(f"Mapping for {component_name}: {custom_mapping[component_name]}") return custom_mapping[component_name] all_components = [ name for name in component_dict.keys() if "rf_test_coil" not in name ] closest_matches = get_close_matches(component_name, all_components, n=1, cutoff=0.1) print(f"Closest matches for {component_name}: {closest_matches}") return closest_matches[0] if closest_matches else component_name
[docs] def filter_port(port): """ Filter the port name to match spice declaration to gds port name, specifically focused on the SKY130nm technology. """ if port == "d": return "DRAIN" elif port == "g": return "GATE" elif port == "s": return "SOURCE" else: return port
[docs] def hdl21_module_to_schematic_editor( module: AnalogueModule, yaml_schematic_file_name: str, spice_gds_mapping_method: Callable | None = find_most_relevant_gds, port_filter_method: Callable = filter_port, ): """ Constructs a SchematicEditor instance from a hdl21 module object. Args: module (h.module): The hdl21 module object. yaml_schematic_file_name (str): The yaml schematic file name. spice_gds_mapping_method (Callable): The method to map the spice instance name to the component name. port_filter_method (Callable): The method to filter the port name. """ import sky130 from ...tools.gplugins import SchematicEditor from .netlist import ( _generate_raw_netlist_dict_from_proto_dict, _parse_module_to_proto_dict, ) proto_dict = _parse_module_to_proto_dict(module) raw_netlist_dict = _generate_raw_netlist_dict_from_proto_dict(proto_dict) # This just gives us a raw structure of the hdl21 modules. se = SchematicEditor(yaml_schematic_file_name) for instance_name_i, instance_i in raw_netlist_dict["instances"].items(): # Maps the spice instance name to the component name. # TODO implement setting mapping and custom name mapping if spice_gds_mapping_method is None: gds_component_name_i = instance_i["component"] else: gds_component_name_i = spice_gds_mapping_method( instance_i["component"], sky130.cells ) se.add_instance( instance_name=instance_name_i, component=sky130.cells[gds_component_name_i](), ) for connection_source_i, connection_target_i in raw_netlist_dict[ "connections" ].items(): source_instance, source_port = connection_source_i.split(",") target_instance, target_port = connection_target_i.split(",") source_port = port_filter_method(source_port) target_port = port_filter_method(target_port) se.add_net( source_instance, source_port, target_instance, target_port, allow_multiple=True, ) return se