Skip to content

Commit ad73efa

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 208d7a1 commit ad73efa

7 files changed

Lines changed: 272 additions & 292 deletions

File tree

gplugins/hdl21/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from .netlist import *
2-
from .sky130 import *
2+
from .sky130 import *

gplugins/hdl21/netlist.py

Lines changed: 67 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
"""
22
This module provides functions to generate a raw netlist semi-compatible with gdsfactory from a hdl21 module object.
33
"""
4-
import yaml
4+
55
import hdl21 as h
6+
import yaml
67

78
__all__ = [
8-
'ParsedProtoVLSIR',
9-
'generate_raw_netlist_dict_from_module',
10-
'generate_raw_yaml_from_module'
9+
"ParsedProtoVLSIR",
10+
"generate_raw_netlist_dict_from_module",
11+
"generate_raw_yaml_from_module",
1112
]
1213

1314
ParsedProtoVLSIR = dict
@@ -63,44 +64,46 @@ def _parse_connections(proto_dict: ParsedProtoVLSIR) -> dict:
6364
connections = {}
6465

6566
# Extract the instances and their connections
66-
for module in proto_dict.get('modules', []):
67-
for instance in module.get('instances', []):
68-
instance_name = instance['name']
69-
for connection in instance.get('connections', []):
70-
portname = connection['portname']
71-
target_signal = connection['target'][0]['sig']
67+
for module in proto_dict.get("modules", []):
68+
for instance in module.get("instances", []):
69+
instance_name = instance["name"]
70+
for connection in instance.get("connections", []):
71+
portname = connection["portname"]
72+
target_signal = connection["target"][0]["sig"]
7273
connection_key = f"{instance_name},{portname}"
7374
# Find the target instance and port
74-
target_instance_port = _find_target_instance_port(proto_dict, target_signal, instance_name)
75+
target_instance_port = _find_target_instance_port(
76+
proto_dict, target_signal, instance_name
77+
)
7578
if target_instance_port:
7679
connections[connection_key] = target_instance_port
7780

7881
return connections
7982

8083

81-
def _find_target_instance_port(proto_dict: ParsedProtoVLSIR,
82-
target_signal,
83-
current_instance_name):
84+
def _find_target_instance_port(
85+
proto_dict: ParsedProtoVLSIR, target_signal, current_instance_name
86+
):
8487
"""
8588
Find the target instance and port of the target signal in the proto_dict.
8689
"""
8790
# Search in the same module
88-
for module in proto_dict.get('modules', []):
89-
for instance in module.get('instances', []):
90-
if instance['name'] == current_instance_name:
91+
for module in proto_dict.get("modules", []):
92+
for instance in module.get("instances", []):
93+
if instance["name"] == current_instance_name:
9194
continue
92-
for connection in instance.get('connections', []):
93-
if connection['target'][0]['sig'] == target_signal:
95+
for connection in instance.get("connections", []):
96+
if connection["target"][0]["sig"] == target_signal:
9497
return f"{instance['name']},{connection['portname']}"
9598
# Search in external modules
96-
for ext_module in proto_dict.get('ext_modules', []):
97-
for port in ext_module.get('ports', []):
98-
if port['signal'] == target_signal:
99-
for instance in module.get('instances', []):
100-
if instance['name'] == current_instance_name:
99+
for ext_module in proto_dict.get("ext_modules", []):
100+
for port in ext_module.get("ports", []):
101+
if port["signal"] == target_signal:
102+
for instance in module.get("instances", []):
103+
if instance["name"] == current_instance_name:
101104
continue
102-
for connection in instance.get('connections', []):
103-
if connection['target'][0]['sig'] == target_signal:
105+
for connection in instance.get("connections", []):
106+
if connection["target"][0]["sig"] == target_signal:
104107
return f"{instance['name']},{connection['portname']}"
105108

106109
return None
@@ -113,9 +116,9 @@ def _generate_top_level_connections(proto_dict: ParsedProtoVLSIR):
113116
top_level_connections = {}
114117

115118
# Iterate over the top-level module ports
116-
for module in proto_dict.get('modules', []):
117-
for port in module.get('ports', []):
118-
port_signal = port['signal']
119+
for module in proto_dict.get("modules", []):
120+
for port in module.get("ports", []):
121+
port_signal = port["signal"]
119122
connection = _find_port_connection(proto_dict, port_signal)
120123
if connection:
121124
top_level_connections[port_signal] = connection
@@ -128,11 +131,11 @@ def _find_port_connection(proto_dict: ParsedProtoVLSIR, port_signal):
128131
Find the connection of the port signal in the proto_dict.
129132
"""
130133
# Search within the module instances
131-
for module in proto_dict.get('modules', []):
132-
for instance in module.get('instances', []):
133-
instance_name = instance['name']
134-
for connection in instance.get('connections', []):
135-
if connection['target'][0]['sig'] == port_signal:
134+
for module in proto_dict.get("modules", []):
135+
for instance in module.get("instances", []):
136+
instance_name = instance["name"]
137+
for connection in instance.get("connections", []):
138+
if connection["target"][0]["sig"] == port_signal:
136139
return f"{instance_name},{connection['portname']}"
137140
return None
138141

@@ -143,27 +146,27 @@ def _extract_instance_parameters(proto_dict: ParsedProtoVLSIR):
143146
"""
144147
instance_parameters = {}
145148

146-
for module in proto_dict.get('modules', []):
147-
for instance in module.get('instances', []):
148-
instance_name = instance['name']
149+
for module in proto_dict.get("modules", []):
150+
for instance in module.get("instances", []):
151+
instance_name = instance["name"]
149152
instance_info = {
150-
'component': _extract_component_name(instance),
151-
'info': {},
152-
'settings': {}
153+
"component": _extract_component_name(instance),
154+
"info": {},
155+
"settings": {},
153156
}
154157

155158
# Extract parameters into the settings
156-
for parameter in instance.get('parameters', []):
157-
param_name = parameter['name']
158-
param_value = _extract_parameter_value(parameter['value'])
159-
instance_info['settings'][param_name] = param_value
159+
for parameter in instance.get("parameters", []):
160+
param_name = parameter["name"]
161+
param_value = _extract_parameter_value(parameter["value"])
162+
instance_info["settings"][param_name] = param_value
160163

161164
# Extract connections and add to settings
162-
instance_info['settings']['ports'] = {}
163-
for connection in instance.get('connections', []):
164-
portname = connection['portname']
165-
target_signal = connection['target'][0]['sig']
166-
instance_info['settings']['ports'][portname] = target_signal
165+
instance_info["settings"]["ports"] = {}
166+
for connection in instance.get("connections", []):
167+
portname = connection["portname"]
168+
target_signal = connection["target"][0]["sig"]
169+
instance_info["settings"]["ports"][portname] = target_signal
167170

168171
instance_parameters[instance_name] = instance_info
169172

@@ -174,23 +177,23 @@ def _extract_component_name(instance):
174177
"""
175178
Extract the component name from the instance.
176179
"""
177-
external_modules = instance.get('module', [])
180+
external_modules = instance.get("module", [])
178181
if external_modules:
179-
domain = external_modules[0].get('external', [{}])[0].get('domain', '')
180-
name = external_modules[0].get('external', [{}])[0].get('name', '')
182+
domain = external_modules[0].get("external", [{}])[0].get("domain", "")
183+
name = external_modules[0].get("external", [{}])[0].get("name", "")
181184
return f"{name}"
182-
return 'unknown_component'
185+
return "unknown_component"
183186

184187

185188
def _extract_parameter_value(value):
186189
"""
187190
Extract the parameter value from the value dictionary.
188191
"""
189-
if value and 'literal' in value[0]:
190-
return value[0]['literal']
191-
elif value and 'prefixed' in value[0]:
192-
prefix = value[0]['prefixed'][0].get('prefix', '')
193-
int64_value = value[0]['prefixed'][0].get('int64_value', '')
192+
if value and "literal" in value[0]:
193+
return value[0]["literal"]
194+
elif value and "prefixed" in value[0]:
195+
prefix = value[0]["prefixed"][0].get("prefix", "")
196+
int64_value = value[0]["prefixed"][0].get("int64_value", "")
194197
return f"{prefix}_{int64_value}"
195198
return None
196199

@@ -199,25 +202,20 @@ def _generate_raw_netlist_dict_from_proto_dict(proto_dict: ParsedProtoVLSIR):
199202
"""
200203
Generate a raw netlist dictionary from the proto_dict.
201204
"""
202-
raw_netlist_dict = {
203-
'name': '',
204-
'instances': {},
205-
'connections': {},
206-
'ports': {}
207-
}
205+
raw_netlist_dict = {"name": "", "instances": {}, "connections": {}, "ports": {}}
208206

209207
# Extract the top-level module name
210-
if proto_dict.get('modules'):
211-
raw_netlist_dict['name'] = proto_dict['modules'][0].get('name', '')
208+
if proto_dict.get("modules"):
209+
raw_netlist_dict["name"] = proto_dict["modules"][0].get("name", "")
212210

213211
# Generate instances information
214-
raw_netlist_dict['instances'] = _extract_instance_parameters(proto_dict)
212+
raw_netlist_dict["instances"] = _extract_instance_parameters(proto_dict)
215213

216214
# Generate connections
217-
raw_netlist_dict['connections'] = _parse_connections(proto_dict)
215+
raw_netlist_dict["connections"] = _parse_connections(proto_dict)
218216

219217
# Generate top-level connections
220-
raw_netlist_dict['ports'] = _generate_top_level_connections(proto_dict)
218+
raw_netlist_dict["ports"] = _generate_top_level_connections(proto_dict)
221219

222220
return raw_netlist_dict
223221

gplugins/hdl21/sky130.py

Lines changed: 28 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,37 @@
1-
import sky130
1+
from collections.abc import Callable
2+
23
import hdl21 as h
3-
from typing import Callable, Optional
4+
import sky130
5+
46
from ..schematic_editor import SchematicEditor
5-
from .netlist import _parse_module_to_proto_dict, _generate_raw_netlist_dict_from_proto_dict
7+
from .netlist import (
8+
_generate_raw_netlist_dict_from_proto_dict,
9+
_parse_module_to_proto_dict,
10+
)
611

7-
__all__ = [
8-
'hdl21_module_to_schematic_editor',
9-
"find_most_relevant_gds",
10-
"filter_port"
11-
]
12+
__all__ = ["hdl21_module_to_schematic_editor", "find_most_relevant_gds", "filter_port"]
1213

1314
from difflib import get_close_matches
1415

1516
custom_mapping_dict = {
1617
"sky130_fd_pr__nfet_01v8": "sky130_fd_pr__rf_nfet_01v8_aM02W1p65L0p15",
17-
"sky130_fd_pr__pfet_01v8": "sky130_fd_pr__rf_pfet_01v8_mcM04W3p00L0p15"
18+
"sky130_fd_pr__pfet_01v8": "sky130_fd_pr__rf_pfet_01v8_mcM04W3p00L0p15",
1819
}
1920

2021

21-
def find_most_relevant_gds(component_name,
22-
component_dict=sky130.cells,
23-
custom_mapping=None):
24-
22+
def find_most_relevant_gds(
23+
component_name, component_dict=sky130.cells, custom_mapping=None
24+
):
2525
if custom_mapping is None:
2626
custom_mapping = custom_mapping_dict
2727

2828
if component_name in custom_mapping.keys():
2929
print(f"Mapping for {component_name}: {custom_mapping[component_name]}")
3030
return custom_mapping[component_name]
3131

32-
all_components = [name for name in component_dict.keys() if "rf_test_coil" not in name]
32+
all_components = [
33+
name for name in component_dict.keys() if "rf_test_coil" not in name
34+
]
3335
closest_matches = get_close_matches(component_name, all_components, n=1, cutoff=0.1)
3436
print(f"Closest matches for {component_name}: {closest_matches}")
3537
return closest_matches[0] if closest_matches else component_name
@@ -49,11 +51,12 @@ def filter_port(port):
4951
return port
5052

5153

52-
def hdl21_module_to_schematic_editor(module: h.module,
53-
yaml_schematic_file_name: str,
54-
spice_gds_mapping_method: Optional[Callable] = find_most_relevant_gds,
55-
port_filter_method: Callable = filter_port
56-
) -> SchematicEditor:
54+
def hdl21_module_to_schematic_editor(
55+
module: h.module,
56+
yaml_schematic_file_name: str,
57+
spice_gds_mapping_method: Callable | None = find_most_relevant_gds,
58+
port_filter_method: Callable = filter_port,
59+
) -> SchematicEditor:
5760
"""
5861
Constructs a SchematicEditor instance from a hdl21 module object.
5962
@@ -75,13 +78,17 @@ def hdl21_module_to_schematic_editor(module: h.module,
7578
if spice_gds_mapping_method is None:
7679
gds_component_name_i = instance_i["component"]
7780
else:
78-
gds_component_name_i = spice_gds_mapping_method(instance_i["component"], sky130.cells)
81+
gds_component_name_i = spice_gds_mapping_method(
82+
instance_i["component"], sky130.cells
83+
)
7984
se.add_instance(
8085
instance_name=instance_name_i,
8186
component=sky130.cells[gds_component_name_i](),
8287
)
8388

84-
for connection_source_i, connection_target_i in raw_netlist_dict["connections"].items():
89+
for connection_source_i, connection_target_i in raw_netlist_dict[
90+
"connections"
91+
].items():
8592
source_instance, source_port = connection_source_i.split(",")
8693
target_instance, target_port = connection_target_i.split(",")
8794
source_port = port_filter_method(source_port)

0 commit comments

Comments
 (0)