Source code for qiskit_metal.qlibrary.lumped.resonator_coil_rect

# -*- 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.
"""File contains dictionary for NSquareSpiral and the make()."""

from qiskit_metal import draw, Dict
from qiskit_metal.qlibrary.core import QComponent
import numpy as np


[docs] class ResonatorCoilRect(QComponent): """A rectangle spiral resonator based on length input. The X dimension is modified by the code based on the total length inputed. Inherits `QComponent` class A rectangular spiral resonator. The width of the spiral is modified based on inputted values and given total length of the spiral. :: <--------X--------> __________________ | ___________ | | | | | | | | | | |______________| | .. image:: ResonatorCoilRect.png .. meta:: Resonator Coil Rectangle Default Options: Convention: Values (unless noted) are strings with units included, (e.g., '30um') * n: '3' -- Number of turns of the spiral * length: '2000um' -- Total length of the spiral * line_width: '1um' -- The width of the line of the spiral * height: '40um' -- The height of the inner portion of the spiral * gap: '4um' -- The distance between each layer of the spiral * coupler_distance: '10um' -- The pin position from the grounded termination of the spiral """ component_metadata = Dict(short_name='res') """Component metadata""" default_options = Dict(n='3', length='2000um', line_width='1um', height='40um', gap='4um', coupler_distance='10um') """Default drawing options""" TOOLTIP = """A rectangle spiral resonator based on length input. The X dimension is modified by the code based on the total length inputed."""
[docs] def make(self): """The make function implements the logic that creates the geoemtry (poly, path, etc.) from the qcomponent.options dictionary of parameters, and the adds them to the design, using qcomponent.add_qgeometry(...), adding in extra needed information, such as layer, subtract, etc.""" p = self.p # p for parsed parameters. Access to the parsed options. n = int(p.n) # Create the geometry spiral_list = [] #Formulat to determine the size of the spiral based on inputed length. x_n = (p.length / (2 * n)) - (p.height + 2 * (p.gap + p.line_width) * (2 * n - 1)) if x_n <= p.gap + p.line_width: self._error_message = f'Inputted values results in the width of the spiral being too small.' self.logger.warning(self._error_message) return for step in range(n): x_point = x_n / 2 + step * (p.line_width + p.gap) y_point = p.height / 2 + step * (p.line_width + p.gap) spiral_list.append((-x_point, -y_point)) spiral_list.append((x_point, -y_point)) spiral_list.append((x_point, y_point)) spiral_list.append((-x_point - (p.line_width + p.gap), y_point)) x_point = (x_n / 2 + (step + 1) * (p.line_width + p.gap)) y_point = (p.height / 2 + (step + 1) * (p.line_width + p.gap) - p.line_width / 2) spiral_list.append((-x_point, -y_point)) spiral_list = draw.LineString(spiral_list) spiral_etch = draw.shapely.geometry.box( -(x_point + p.line_width / 2 + p.gap), -y_point, x_point - p.line_width / 2, y_point) #Generates a linestring to track port location points = draw.LineString([ (-x_point + p.line_width / 2, -y_point + p.coupler_distance), (-x_point - p.line_width / 2, -y_point + p.coupler_distance) ]) c_items = [spiral_list, spiral_etch, points] c_items = draw.rotate(c_items, p.orientation, origin=(0, 0)) c_items = draw.translate(c_items, p.pos_x, p.pos_y) [spiral_list, spiral_etch, points] = c_items ############################################## # add elements self.add_qgeometry('path', {'n_spiral': spiral_list}, width=p.line_width) self.add_qgeometry('poly', {'n_spira_etch': spiral_etch}, subtract=True) # NEW PIN SPOT self.add_pin('spiralPin', points=np.array(points.coords), width=p.line_width, input_as_norm=True)