# -*- 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.fromcopyimportdeepcopyfromqiskit_metal.toolbox_python.attr_dictimportDictfrom.baseimportQComponentimportpprint
[docs]classBaseQubit(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)ifself.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.')returnNoneifoptions_connection_pads:self.options.connection_pads.update(options_connection_pads)try:self._set_options_connection_pads()exceptExceptionase:raiseException(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} ")ifmake:self.rebuild()def_set_options_connection_pads(self):"""Applies the default options."""# class_name = type(self).__name__assert'_default_connection_pads'inself.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 keepdelself.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 futurefornameinself.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)