"""Standardized naming conventions for design variables in qubit/resonator/coupler systems."""
from typing import Literal, Union
from qiskit_metal.designs.design_planar import DesignPlanar
from qdesignoptimizer.utils.names_parameters import Mode
from qdesignoptimizer.utils.names_qiskit_components import name_mode
[docs]
def add_design_variables_to_design(
design: DesignPlanar, design_variables: dict[str, str]
):
"""Add design variables to a Qiskit Metal design so that the variables can be used in render.
Args:
design (DesignPlanar): A Qiskit Metal design.
design_variables (dict[str:str]): Design variables to add to the design.
"""
for key, val in {**design_variables}.items():
design.variables[key] = val
# Design variables
[docs]
def design_var_length(identifier: str):
"""Create standardized variable name for component length."""
return f"design_var_length_{identifier}"
[docs]
def design_var_width(identifier: str):
"""Create standardized variable name for component width."""
return f"design_var_width_{identifier}"
[docs]
def design_var_gap(identifier: str):
"""Create standardized variable name for gap dimension."""
return f"design_var_gap_{identifier}"
[docs]
def design_var_coupl_length(identifier_1: str, identifier_2: str):
"""Create standardized variable name for coupler length between two components."""
identifier_first, identifier_second = sorted([identifier_1, identifier_2])
return f"design_var_coupl_length_{identifier_first}_{identifier_second}"
[docs]
def design_var_lj(identifier: str):
"""Create standardized variable name for Josephson inductance."""
return f"design_var_lj_{identifier}"
[docs]
def design_var_cj(identifier: str):
"""Create standardized variable name for Josephson capacitance."""
return f"design_var_cj_{identifier}"
[docs]
def design_var_cl_pos_x(identifier: Union[str, int]):
"""Create standardized variable name for charge line x-position."""
return f"design_var_cl_pos_x_{identifier}"
[docs]
def design_var_cl_pos_y(identifier: Union[str, int]):
"""Create standardized variable name for charge line y-position."""
return f"design_var_cl_pos_y_{identifier}"
[docs]
def junction_setup(mode: Mode, mode_type: Literal[None, "linear"] = None):
"""Generate jj setup for
Args:
component_name (str): component name
mode_type (str): mode_type of JJ, e.g. 'linear' for a SNAIL/ATS tuned to the Kerr-free point. Default is None = ordinary jj.
Returns:
Dict: jj setup
"""
jj_name = f"jj_{name_mode(mode)}"
setup = {
jj_name: {
"rect": f"JJ_rect_Lj_{name_mode(mode)}_rect_jj",
"line": f"JJ_Lj_{name_mode(mode)}_rect_jj_",
"Lj_variable": design_var_lj(mode),
"Cj_variable": design_var_cj(mode),
}
}
if mode_type is not None:
setup[jj_name]["mode_type"] = mode_type
return setup