Source code for qiskit_metal.qlibrary.core.qubit

# -*- coding: utf-8 -*-

# This code is part of Qiskit.
#
# (C) Copyright IBM 2017, 2021.
#
# This code is licensed under the Apache License, Version 2.0. You may
# obtain a copy of this license in the LICENSE.txt file in the root directory
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
#
# Any modifications or derivative works of this code must retain this
# copyright notice, and modified files need to carry a notice indicating
# that they have been altered from the originals.

from copy import deepcopy
from qiskit_metal.toolbox_python.attr_dict import Dict
from .base import QComponent
import pprint


[docs] class BaseQubit(QComponent): """Qubit base class. Use to subscript, not to generate directly. Has connection lines that can be added Inherits components.QComponent class Default Options: * pos_x: '0um' * pos_y: '0um' * connection_pads: empty Dict -- The dictionary which contains all active connection lines for the qubit. * _default_connection_pads: empty Dict -- The default values for the (if any) connection lines of the qubit. """ default_options = Dict(connection_pads=Dict(), _default_connection_pads=Dict()) """Default options.""" component_metadata = Dict(short_name='Q', _qgeometry_table_poly='True') """Component metadata""" TOOLTIP = """Qubit""" def __init__(self, design, name: str = None, options: Dict = None, options_connection_pads: dict = None, make: bool = True, **kwargs): """ Args: design (QDesign): The parent design. name (str): Name of the component. options (dict): User options that will override the defaults. Defaults to None. options_connection_pads(dict): User options for connection pads on qubit make (bool): True if the make function should be called at the end of the init. Options be used in the make function to create the geometry. Defaults to None. """ super().__init__(design, name, options=options, make=False) if self.status == 'Not Built': # Component is not registered in design. # This qubit was not added to design. # self.logger.warning( # 'In BaseQubit.__init(), the qubit has not been added to design. The component is exiting with None.') return None if options_connection_pads: self.options.connection_pads.update(options_connection_pads) try: self._set_options_connection_pads() except Exception as e: raise Exception( f"Unable to create connection pads using given parameters: {options_connection_pads}.\n\n If given parameters is None, check to make sure you don't have any invalid child parameters in your connection_pads parameter.\n\n If you don't want any pads, ensure neither options_connection_pads nor options[connection_pads] are parameters\n\n Exception is: {e} " ) if make: self.rebuild() def _set_options_connection_pads(self): """Applies the default options.""" # class_name = type(self).__name__ assert '_default_connection_pads' in self.design.template_options[ self.class_name], f"""When you define your custom qubit class please add a _default_connection_pads dictionary name as default_options['_default_connection_pads']. This should specify the default creation options for the connection. """ # Not sure if it best to remove it from options to keep del self.options._default_connection_pads # the self.options cleaner or not, since the options currently copies in the template. This is # potential source of bugs in the future for name in self.options.connection_pads: my_options_connection_pads = self.options.connection_pads[name] self.options.connection_pads[name] = deepcopy( self.design.template_options[ self.class_name]['_default_connection_pads']) self.options.connection_pads[name].update( my_options_connection_pads)