# -*- 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.
"""SQUID_loop.
.. code-block:
:
| |
| |
|-----seg a-----|JJ|-- seg b-------| |
| | plate 2
| | |
plate1 seg c ---seg d-----|
| | |
| | |
|--seg a lower--|JJ|--seg b lower--| |
| |
| |
"""
from qiskit_metal import draw, Dict
from qiskit_metal.qlibrary.core.base import QComponent
import numpy as np
[docs]
class SQUID_LOOP(QComponent):
"""
The base "SQUID_LOOP" inherits the "QComponent" class.
This creates a simple SQUID loop consisting of two Josephson
junctions (JJs) located on opposite sides of a rectangular loop.
The design consists of eight separate rectangles: plate1,
segment a (and segment a lower), segment b (and segment b lower),
segment c, segment d and plate 2. The two JJs are located between
segments and a and b (and also between segments a lower and b
lower.)
.. image::
SQUID_LOOP.png
.. meta::
Squid Loop
Default Options:
* plate1_width: '5.5um' -- width of plate1 (left)
* plate1_height: '40um' -- height of plate1 (left)
* plate1_pos_x: '0' -- origin of the plate1 (left)
* plate1_pos_y: '0' -- origin of the plate1 (left)
* squid_gap: '10um' -- space between 'seg a' and 'seg a lower'
* segment_a_length: '10um' -- length of seg a
* segment_a_width: '1um' -- width of seg a
* JJ_gap: '0.5um' -- space between seg a and seg b
* segment_b_length: '5um' -- length of seg b
* segment_b_width: '1um' -- width of seg b
* segment_c_width: '10um' -- length of seg c
* segment_d_length: '10um' -- length of seg d
* segment_d_width: '2um' -- width of seg d
* plate2_width: '6um' -- width of plate 2 (right)
* plate2_height: '30um' -- height of plate 2 (right)
"""
# Default drawing options
default_options = Dict(plate1_width='5.5um',
plate1_height='40um',
plate1_pos_x='0',
plate1_pos_y='0',
squid_gap='10um',
segment_a_length='10um',
segment_a_width='1um',
JJ_gap='0.5um',
segment_b_length='5um',
segment_b_width='1um',
segment_c_width='1um',
segment_d_length='10um',
segment_d_width='2um',
plate2_width='6um',
plate2_height='30um')
"""Default drawing options"""
# Name prefix of component, if user doesn't provide name
component_metadata = Dict(short_name='component')
"""Component metadata"""
[docs]
def make(self):
"""Convert self.options into QGeometry."""
p = self.parse_options() # Parse the string options into numbers
# draw the lower pad as a rectangle
plate1 = draw.rectangle(p.plate1_width, p.plate1_height, p.plate1_pos_x,
p.plate1_pos_y)
segment_a = draw.rectangle(p.segment_a_length, p.segment_a_width,
0.5 * (p.plate1_width + p.segment_a_length),
0.5 * (p.squid_gap + p.segment_a_width))
segment_a_lower = draw.translate(
segment_a, 0.0, -1.0 * (p.squid_gap + p.segment_a_width))
segment_b = draw.rectangle(
p.segment_b_length, p.segment_b_width,
0.5 * (p.plate1_width + p.segment_b_length) + p.JJ_gap +
p.segment_a_length, 0.5 * (p.squid_gap + p.segment_b_width))
segment_b_lower = draw.translate(
segment_b, 0.0, -1.0 * (p.squid_gap + p.segment_b_width))
segment_c = draw.rectangle(
p.segment_c_width,
p.squid_gap + p.segment_a_width + p.segment_b_width,
0.5 * (p.plate1_width + p.segment_c_width) + p.segment_a_length +
p.segment_b_length + p.JJ_gap, p.plate1_pos_y)
segment_d = draw.rectangle(
p.segment_d_length, p.segment_d_width,
0.5 * (p.plate1_width + p.segment_d_length) + p.segment_a_length +
p.segment_b_length + p.JJ_gap + p.segment_c_width, p.plate1_pos_y)
plate2 = draw.rectangle(
p.plate2_width, p.plate2_height, 0.5 *
(p.plate1_width + p.plate2_width) + p.segment_a_length + p.JJ_gap +
p.segment_b_length + p.segment_c_width + p.segment_d_length,
p.plate1_pos_y)
design1 = draw.union(plate1, segment_a, segment_a_lower, segment_b,
segment_b_lower, segment_c, segment_d, plate2)
# now translate and rotate the final structure
design1 = draw.rotate(design1, p.orientation, origin=(0, 0))
design1 = draw.translate(design1, p.pos_x, p.pos_y)
geom = {'design': design1}
self.add_qgeometry('poly', geom, layer=p.layer, subtract=False)