Repository: qiskit-community/qiskit-metal (language: python)

Issue:
Junction component
<!-- ⚠️ Please abide by this template, otherwise you run the risk of the issue being closed -->
<!-- ⚠️ Make sure to browse the opened and closed issues to confirm this idea does not exist. -->

Please be as descriptive as possible, including: what is expected, why is this feature needed, what is the objective, etc.

### What is the feature being requested?

The public paper based Dolan 1967 junction component. 



Discussion / hints:

Fix patch:
diff --git a/docs/apidocs/qiskit_metal.qlibrary.jj_dolan.rst b/docs/apidocs/qiskit_metal.qlibrary.jj_dolan.rst
new file mode 100644
index 000000000..a75e776ee
--- /dev/null
+++ b/docs/apidocs/qiskit_metal.qlibrary.jj_dolan.rst
@@ -0,0 +1,64 @@
+﻿
+
+jj_dolan
+==============================
+
+.. currentmodule:: qiskit_metal.qlibrary
+
+.. autoclass:: jj_dolan
+   :no-members:
+   :no-inherited-members:
+   :no-special-members:
+
+   
+   
+
+   .. rubric:: Attributes
+
+   .. autosummary::
+      :toctree: ../stubs/
+   
+      jj_dolan.TOOLTIP
+      jj_dolan.class_name
+      jj_dolan.component_metadata
+      jj_dolan.default_options
+      jj_dolan.design
+      jj_dolan.id
+      jj_dolan.logger
+      jj_dolan.name
+      jj_dolan.options
+      jj_dolan.pin_names
+      jj_dolan.qgeometry_types
+   
+   
+
+   
+   
+
+   .. rubric:: Methods
+
+   .. autosummary::
+      :toctree: ../stubs/
+   
+      jj_dolan.add_dependency
+      jj_dolan.add_pin
+      jj_dolan.add_qgeometry
+      jj_dolan.connect_components_already_in_design
+      jj_dolan.delete
+      jj_dolan.get_pin
+      jj_dolan.get_template_options
+      jj_dolan.make
+      jj_dolan.parse_options
+      jj_dolan.parse_value
+      jj_dolan.populate_to_track_table_usage
+      jj_dolan.qgeometry_bounds
+      jj_dolan.qgeometry_dict
+      jj_dolan.qgeometry_list
+      jj_dolan.qgeometry_plot
+      jj_dolan.qgeometry_table
+      jj_dolan.rebuild
+      jj_dolan.to_script
+   
+
+   
+   
\ No newline at end of file
diff --git a/docs/apidocs/qiskit_metal.qlibrary.jj_manhattan.rst b/docs/apidocs/qiskit_metal.qlibrary.jj_manhattan.rst
new file mode 100644
index 000000000..5f117bf9d
--- /dev/null
+++ b/docs/apidocs/qiskit_metal.qlibrary.jj_manhattan.rst
@@ -0,0 +1,64 @@
+﻿
+
+jj_manhattan
+==================================
+
+.. currentmodule:: qiskit_metal.qlibrary
+
+.. autoclass:: jj_manhattan
+   :no-members:
+   :no-inherited-members:
+   :no-special-members:
+
+   
+   
+
+   .. rubric:: Attributes
+
+   .. autosummary::
+      :toctree: ../stubs/
+   
+      jj_manhattan.TOOLTIP
+      jj_manhattan.class_name
+      jj_manhattan.component_metadata
+      jj_manhattan.default_options
+      jj_manhattan.design
+      jj_manhattan.id
+      jj_manhattan.logger
+      jj_manhattan.name
+      jj_manhattan.options
+      jj_manhattan.pin_names
+      jj_manhattan.qgeometry_types
+   
+   
+
+   
+   
+
+   .. rubric:: Methods
+
+   .. autosummary::
+      :toctree: ../stubs/
+   
+      jj_manhattan.add_dependency
+      jj_manhattan.add_pin
+      jj_manhattan.add_qgeometry
+      jj_manhattan.connect_components_already_in_design
+      jj_manhattan.delete
+      jj_manhattan.get_pin
+      jj_manhattan.get_template_options
+      jj_manhattan.make
+      jj_manhattan.parse_options
+      jj_manhattan.parse_value
+      jj_manhattan.populate_to_track_table_usage
+      jj_manhattan.qgeometry_bounds
+      jj_manhattan.qgeometry_dict
+      jj_manhattan.qgeometry_list
+      jj_manhattan.qgeometry_plot
+      jj_manhattan.qgeometry_table
+      jj_manhattan.rebuild
+      jj_manhattan.to_script
+   
+
+   
+   
\ No newline at end of file
diff --git a/qiskit_metal/qlibrary/__init__.py b/qiskit_metal/qlibrary/__init__.py
index 3d5d0b1fc..a95735049 100644
--- a/qiskit_metal/qlibrary/__init__.py
+++ b/qiskit_metal/qlibrary/__init__.py
@@ -105,6 +105,8 @@
 .. autosummary::
     :toctree:
 
+    jj_dolan
+    jj_manhattan
     TransmonConcentric
     TransmonCross
     TransmonCrossFL
@@ -157,6 +159,8 @@
     from .tlines.anchored_path import RouteAnchors
     from .tlines.mixed_path import RouteMixed
     from .tlines.pathfinder import RoutePathfinder
+    from .qubits.JJ_Dolan import jj_dolan
+    from .qubits.JJ_Manhattan import jj_manhattan
     from .qubits.transmon_concentric import TransmonConcentric
     from .qubits.transmon_cross import TransmonCross
     from .qubits.transmon_cross_fl import TransmonCrossFL
diff --git a/qiskit_metal/qlibrary/qubits/JJ_Dolan.py b/qiskit_metal/qlibrary/qubits/JJ_Dolan.py
new file mode 100644
index 000000000..b866d9d96
--- /dev/null
+++ b/qiskit_metal/qlibrary/qubits/JJ_Dolan.py
@@ -0,0 +1,129 @@
+# -*- 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.
+"""
+Josephson Junction (Dolan-Style)
+REFERENCE: G. Dolan, Applied Physics Letters 31, 337 (1977)
+"""
+from qiskit_metal import draw, Dict
+from qiskit_metal.qlibrary.core.base import QComponent
+
+
+class jj_dolan(QComponent):
+    """
+    The base "JJ_Dolan" inherits the "QComponent" class.
+    
+    NOTE TO USER: Please be aware that when designing with this
+    qcomponent, one must take care in accounting for the junction
+    qgeometry when exporting to to GDS and/or to a simulator. This
+    qcomponent should not be rendered for EM simulation.
+
+    This creates a "Dolan"-style Josephson Junction consisting
+    of two non-overlapping metal rectangles each connected
+    to a larger rectangular pad. There is also a second,
+    smaller rectangle drawn on a different metal level
+    which overlaps part of one of the rectangular fingers.
+
+    Default Options:
+        * JJ_pad_lower_width: '25um' -- width of lower JJ metal region
+        * JJ_pad_lower_height: '10um' -- height of lower JJ metal region
+        * JJ_pad_lower_pos_x: '0um' -- the initial x-coord of the lower JJ pad
+        * JJ_pad_lower_pos_y: '0um' -- the initial y-coord of the lower JJ pad
+        * finger_lower_width: '1um' -- the width of the rectangular finger(s)
+        * finger_lower_height: '20um' -- the length of the rectangular finger(s)
+        * extension: '1um' -- the amount of rectangle extending beyond X-point
+        * offset: '2um' -- the separation between finger and the 2nd metal level
+        * second_metal_length: '5um' -- the length of the 2nd metal level
+        * second_metal_width: '1um' -- the width of the 2nd metal level
+        * x_pos: '0um' -- the final x-coord of the lower left corner of final design
+        * y_pos: '0um' -- the final y-coord of the lower left corner of final design
+    """
+    # Default drawing options
+    default_options = Dict(JJ_pad_lower_width='25um',
+                           JJ_pad_lower_height='10um',
+                           JJ_pad_lower_pos_x='0',
+                           JJ_pad_lower_pos_y='0',
+                           finger_lower_width='1um',
+                           finger_lower_height='20um',
+                           extension='1um',
+                           offset='2um',
+                           second_metal_length='5um',
+                           second_metal_width='1um',
+                           x_pos='0um',
+                           y_pos='0um',
+                           layer='1')
+    """Default drawing options"""
+
+    # Name prefix of component, if user doesn't provide name
+    component_metadata = Dict(short_name='component')
+    """Component metadata"""
+
+    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
+        JJ_pad_lower = draw.rectangle(p.JJ_pad_lower_width,
+                                      p.JJ_pad_lower_height,
+                                      p.JJ_pad_lower_pos_x,
+                                      p.JJ_pad_lower_pos_y)
+
+        finger_lower = draw.rectangle(
+            p.finger_lower_width, p.finger_lower_height, p.JJ_pad_lower_pos_x,
+            0.5 * (p.JJ_pad_lower_height + p.finger_lower_height))
+
+        # merge the lower pad and the finger into a single object
+        design = draw.union(JJ_pad_lower, finger_lower)
+
+        # copy the pad/finger and rotate it by 90 degrees
+        design2 = draw.rotate(design, 90.0)
+
+        # translate the second pad/finger to achieve the desired extension
+        # for a Manhattan-like configuration
+        design2 = draw.translate(
+            design2, 0.5 * (p.JJ_pad_lower_height + p.finger_lower_height) -
+            0.5 * p.finger_lower_width - p.extension,
+            0.5 * (p.JJ_pad_lower_height + p.finger_lower_height) -
+            0.5 * p.finger_lower_width - p.extension)
+
+        # now translate the second pad/finger to achieve the desired offset
+        # from the first pad/finger
+        design2 = draw.translate(design2,
+                                 p.extension + p.finger_lower_width + p.offset)
+
+        final_design = draw.union(design, design2)
+
+        second_metal = draw.rectangle(
+            p.second_metal_width, p.second_metal_length,
+            p.JJ_pad_lower_pos_x + p.offset + 0.5 * p.finger_lower_width,
+            0.5 * p.JJ_pad_lower_height + p.finger_lower_height -
+            0.5 * p.second_metal_length)
+
+        # translate everything so that the bottom left corner of the lower
+        # pad is at the origin
+        final_design = draw.translate(final_design, 0.5 * p.JJ_pad_lower_width,
+                                      0.5 * p.JJ_pad_lower_height)
+        second_metal = draw.translate(second_metal, 0.5 * p.JJ_pad_lower_width,
+                                      0.5 * p.JJ_pad_lower_height)
+
+        # now translate so that the bottom left corner is at the
+        # user-defined coordinates (x_pos, y_pos)
+        final_design = draw.translate(final_design, p.x_pos, p.y_pos)
+        second_metal = draw.translate(second_metal, p.x_pos, p.y_pos)
+
+        geom1 = {'design': final_design}
+        self.add_qgeometry('poly', geom1, layer=p.layer, subtract=False)
+
+        geom2 = {'design': second_metal}
+        self.add_qgeometry('poly', geom2, layer=2.0, subtract=False)
diff --git a/qiskit_metal/qlibrary/qubits/JJ_Manhattan.py b/qiskit_metal/qlibrary/qubits/JJ_Manhattan.py
new file mode 100644
index 000000000..a6e2e8c5b
--- /dev/null
+++ b/qiskit_metal/qlibrary/qubits/JJ_Manhattan.py
@@ -0,0 +1,106 @@
+# -*- 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.
+"""
+Josephson Junction (Manhattan-Style)
+REFERENCE: I.M. Pop et al., Nature 508, 369-372 (2014)
+"""
+from qiskit_metal import draw, Dict
+from qiskit_metal.qlibrary.core.base import QComponent
+
+
+class jj_manhattan(QComponent):
+    """
+    The base "JJ_Manhattan" inherits the "QComponent" class.
+    
+    NOTE TO USER: Please be aware that when designing with this
+    qcomponent, one must take care in accounting for the junction
+    qgeometry when exporting to to GDS and/or to a simulator. This
+    qcomponent should not be rendered for EM simulation.
+
+    This creates a "Manhattan"-style Josephson Junction consisting
+    of two overlapping thin metal strips, each connected to a
+    larger metallic pad region.
+
+    Default Options:
+        * JJ_pad_lower_width: '4um' -- width of lower JJ metal region
+        * JJ_pad_lower_height: '2um' -- height of lower JJ metal region
+        * JJ_pad_lower_pos_x: '0' -- the initial x-coord of the lower rectangle
+        * JJ_pad_lower_pos_y: '0' -- the initial y-coord of the lower rectangle
+        * finger_lower_width: '1um' -- the width of the overlapping rectangular finger(s)
+        * finger_lower_height: '20um' -- the length of the overlapping rectangular finger(s)
+        * extension: '1um' -- the length of the fingers extending beyond the cross-point
+        * x_pos: '0um' -- the x-coordinate of the lower left point  of the final design
+        * y_pos: '0um' -- the y-coordinate of the lower left point of the final design
+    """
+    # Default drawing options
+    default_options = Dict(JJ_pad_lower_width='25um',
+                           JJ_pad_lower_height='10um',
+                           JJ_pad_lower_pos_x='0',
+                           JJ_pad_lower_pos_y='0',
+                           finger_lower_width='1um',
+                           finger_lower_height='20um',
+                           extension='1um',
+                           x_pos='0um',
+                           y_pos='0um',
+                           layer='1')
+    """Default drawing options"""
+
+    # Name prefix of component, if user doesn't provide name
+    component_metadata = Dict(short_name='component')
+    """Component metadata"""
+
+    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
+        JJ_pad_lower = draw.rectangle(p.JJ_pad_lower_width,
+                                      p.JJ_pad_lower_height,
+                                      p.JJ_pad_lower_pos_x,
+                                      p.JJ_pad_lower_pos_y)
+
+        finger_lower = draw.rectangle(
+            p.finger_lower_width, p.finger_lower_height, p.JJ_pad_lower_pos_x,
+            0.5 * (p.JJ_pad_lower_height + p.finger_lower_height))
+
+        # fudge factor to merge the two options
+        finger_lower = draw.translate(finger_lower, 0.0, -0.0001)
+
+        # merge the lower pad and the finger into a single object
+        design = draw.union(JJ_pad_lower, finger_lower)
+
+        # copy the pad/finger and rotate it by 90 degrees
+        design2 = draw.rotate(design, 90.0)
+
+        # translate the second pad/finger to achieve the desired extension
+        design2 = draw.translate(
+            design2, 0.5 * (p.JJ_pad_lower_height + p.finger_lower_height) -
+            0.5 * p.finger_lower_width - p.extension,
+            0.5 * (p.JJ_pad_lower_height + p.finger_lower_height) -
+            0.5 * p.finger_lower_width - p.extension)
+
+        final_design = draw.union(design, design2)
+
+        # translate the final design so that the bottom left
+        # corner of the lower pad is at the origin
+        final_design = draw.translate(final_design, 0.5 * p.JJ_pad_lower_width,
+                                      0.5 * p.JJ_pad_lower_height)
+
+        # now translate so that the design is centered on the
+        # user-defined coordinates (x_pos, y_pos)
+        final_design = draw.translate(final_design, p.x_pos, p.y_pos)
+
+        geom = {'design': final_design}
+        self.add_qgeometry('poly', geom, layer=p.layer, subtract=False)
diff --git a/tutorials/Appendix B Quick topics/JJ Demo Notebook.ipynb b/tutorials/Appendix B Quick topics/JJ Demo Notebook.ipynb
new file mode 100644
index 000000000..177ef3024
--- /dev/null
+++ b/tutorials/Appendix B Quick topics/JJ Demo Notebook.ipynb
@@ -0,0 +1,334 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# Josephson Junction QComponent Demo Notebook"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "This demo notebook describes two types of Josephson Junction (JJ) qcomponents available in Qiskit Metal, including a \"Manhattan\"-style JJ and a \"Dolan\"-style JJ. In addition, we demonstrate how to insert these realistic JJ structures in between the capacative pads of the transmon pocket qcomponent, forming a realistic qubit design. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's start to importing some key modules:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import qiskit_metal as metal\n",
+    "from qiskit_metal import designs, draw\n",
+    "from qiskit_metal import MetalGUI, Dict #, open_docs"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Next, we'll fire up the Qiskit Metal GUI: "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "design = designs.DesignPlanar()\n",
+    "gui = MetalGUI(design)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Next, let's see what a Manhattan-style JJ looks like. We'll import the qcomponent and place it in our design, calling it \"JJ1\":"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qiskit_metal.qlibrary.qubits.JJ_Manhattan import jj_manhattan\r\n",
+    "design.overwrite_enabled = True\r\n",
+    "jj1 = jj_manhattan(design, 'JJ1', options=dict())\r\n",
+    "gui.rebuild()\r\n",
+    "gui.autoscale()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can take a screenshot of the GUI to see what our JJ looks like up close::"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gui.rebuild()\r\n",
+    "gui.autoscale()\r\n",
+    "gui.edit_component('JJ1')\r\n",
+    "gui.zoom_on_components(['JJ1'])\r\n",
+    "gui.highlight_components(['JJ1'])\r\n",
+    "gui.screenshot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Note that you'll have to zoom in to see the JJ qcomponent since the default dimensions are quite small (micrometers instead of mm!) For the Manhattan-style junction, we see two crossing rectangles each connected to a larger rectangular pad. All of the metal is part of the same layer, as opposed to the two-layer Dolan-style design that we'll see below. \n",
+    "\n",
+    "Also note that for both JJ qcomponents, the coordinates (x_pos, y_pos) define the lower-left corner of the bottom rectangle. Since the default values of these coordinates are zero, we see that the bottom left corner is at the origin. \n",
+    "\n",
+    "Now, let's take a look at a Dolan-style JJ qcomponent design. We'll call this one \"JJ2\" and we'll place it such that the bottom left corner is at the coordinate (0.1, 0.0) so that we can look at the two qcomponents side-by-side in our design: "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qiskit_metal.qlibrary.qubits.JJ_Dolan import jj_dolan\r\n",
+    "design.overwrite_enabled = True\r\n",
+    "jj2 = jj_dolan(design, 'JJ2', options=dict(x_pos=\"0.1\", y_pos=\"0.0\"))\r\n",
+    "gui.rebuild()\r\n",
+    "gui.autoscale()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can again take a GUI screenshot to see how this JJ differs from the Manhattan-style one:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gui.rebuild()\r\n",
+    "gui.autoscale()\r\n",
+    "gui.edit_component('JJ2')\r\n",
+    "gui.zoom_on_components(['JJ2'])\r\n",
+    "gui.highlight_components(['JJ2'])\r\n",
+    "gui.screenshot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "You'll notice that the Dolan-style JJ has a similar structure as the Manhattan-style JJ but the second set of rectangles is translated so that they no longer overlap with the first pair of rectangles. In addition, we see a smaller rectangle drawn which is actually defined to be on a different metal layer than the other rectangles. This reflects the fact that in Dolan-style JJ fabrication, there are two separate metal levels used in the shadow masking process. "
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Inserting Josephson Junctions into a Transmon Qubit Design"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In a realistic quantum chip design, the JJs would be located in between the large pads of the transmon pocket. Before we show what this would actually look like, let's delete the two JJs that we've drawn and start from scratch. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "jj1.delete()\n",
+    "jj2.delete()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "You may have to hit the \"Replot\" button in the GUI after deleting. Now, let's create an instance of a basic transmon pocket qcomponent, using all default settings:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qiskit_metal.qlibrary.qubits.transmon_pocket import TransmonPocket\n",
+    "design.overwrite_enabled = True\n",
+    "q1 = TransmonPocket(design, 'qubit1', options=dict())\n",
+    "gui.rebuild()\n",
+    "gui.autoscale()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "When we zoom in and see that the middle of the \"JJ region\" of the transmon pocket is at the origin. This is the region we will place our actual JJ qcomponent. Since we want the larger rectangular pads of the JJ qcomponent to overlap with the large rectangular pads of the transmon pocket, we'll have to pick a suitable (x,y) coordinate for the JJ. Here's an example of placing the Manhattan-style JJ in this region:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "from qiskit_metal.qlibrary.qubits.JJ_Manhattan import jj_manhattan\r\n",
+    "design.overwrite_enabled = True\r\n",
+    "jj1 = jj_manhattan(design, 'JJ1', options=dict(x_pos=\"-0.015\", y_pos=\"-0.02\"))\r\n",
+    "gui.rebuild()\r\n",
+    "gui.autoscale()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can take a GUI screenshot to see how the transmon qubit looks with the JJ inserted:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gui.rebuild()\r\n",
+    "gui.autoscale()\r\n",
+    "gui.edit_component('qubit1')\r\n",
+    "gui.zoom_on_components(['qubit1'])\r\n",
+    "gui.screenshot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "We can zoom in on the actual JJ to see how the pads overlap with the large rectangular pads of the transmon:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gui.rebuild()\r\n",
+    "gui.autoscale()\r\n",
+    "gui.edit_component('JJ1')\r\n",
+    "gui.zoom_on_components(['JJ1'])\r\n",
+    "gui.screenshot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In the same way, we can place another transmon pocket at (1,1) and then place a Dolan-style JJ inside:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "design.overwrite_enabled = True\r\n",
+    "q2 = TransmonPocket(design, 'qubit2', options=dict(pos_x=\"1.0\"))\r\n",
+    "jj2 = jj_dolan(design, 'JJ2', options=dict(x_pos=\"0.985\", y_pos=\"-0.02\"))\r\n",
+    "gui.rebuild()\r\n",
+    "gui.autoscale()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Let's take a screenshot to see what the transmon qubit looks like with the JJ inserted:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gui.rebuild()\r\n",
+    "gui.autoscale()\r\n",
+    "gui.edit_component('qubit2')\r\n",
+    "gui.zoom_on_components(['qubit2'])\r\n",
+    "gui.screenshot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Lastly, we can zoom in even more to see how the Dolan-style JJ looks while connected to the pads of the transmon:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "gui.rebuild()\r\n",
+    "gui.autoscale()\r\n",
+    "gui.edit_component('JJ2')\r\n",
+    "gui.zoom_on_components(['JJ2'])\r\n",
+    "gui.screenshot()"
+   ]
+  }
+ ],
+ "metadata": {
+  "interpreter": {
+   "hash": "3c543aac259cb5d300c63f5c4b30daf72526e10e2454451f45e9cc4261aaa61c"
+  },
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.8.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
\ No newline at end of file


Test patch:
diff --git a/qiskit_metal/tests/test_qlibrary_1_instantiate.py b/qiskit_metal/tests/test_qlibrary_1_instantiate.py
index 67e77dc5d..e233bc99c 100644
--- a/qiskit_metal/tests/test_qlibrary_1_instantiate.py
+++ b/qiskit_metal/tests/test_qlibrary_1_instantiate.py
@@ -47,6 +47,8 @@
 from qiskit_metal.qlibrary.terminations.launchpad_wb import LaunchpadWirebond
 from qiskit_metal.qlibrary.terminations.launchpad_wb_coupled import LaunchpadWirebondCoupled
 from qiskit_metal.qlibrary.lumped.cap_3_interdigital import Cap3Interdigital
+from qiskit_metal.qlibrary.qubits.JJ_Dolan import jj_dolan
+from qiskit_metal.qlibrary.qubits.JJ_Manhattan import jj_manhattan
 from qiskit_metal.qlibrary.qubits.transmon_concentric import TransmonConcentric
 from qiskit_metal.qlibrary.qubits.transmon_cross import TransmonCross
 from qiskit_metal.qlibrary.qubits.transmon_cross_fl import TransmonCrossFL
@@ -811,6 +813,43 @@ def test_qlibrary_qubits_tunable_coupler_01(self):
                 "TunableCoupler01(design, \"my_name3\", options={}, make=False)"
             )
 
+    def test_qlibrary_qubits_jj_dolan_instantiate(self):
+        """Test the instantiaion of jj_dolan."""
+        design = designs.DesignPlanar()
+        try:
+            jj_dolan
+        except Exception:
+            self.fail("jj_dolan failed")
+
+        try:
+            jj_dolan(design, "my_name2", options={})
+        except Exception:
+            self.fail("jj_dolan(design, \"my_name2\", options={})")
+
+        try:
+            jj_dolan(design, "my_name3", options={}, make=False)
+        except Exception:
+            self.fail("jj_dolan(design, \"my_name3\", options={}, make=False)")
+
+    def test_qlibrary_qubits_jj_manhattan_instantiate(self):
+        """Test the instantiaion of jj_dolan."""
+        design = designs.DesignPlanar()
+        try:
+            jj_manhattan
+        except Exception:
+            self.fail("jj_manhattan failed")
+
+        try:
+            jj_manhattan(design, "my_name2", options={})
+        except Exception:
+            self.fail("jj_manhattan(design, \"my_name2\", options={})")
+
+        try:
+            jj_manhattan(design, "my_name3", options={}, make=False)
+        except Exception:
+            self.fail(
+                "jj_manhattan(design, \"my_name3\", options={}, make=False)")
+
 
 if __name__ == '__main__':
     unittest.main(verbosity=2)
diff --git a/qiskit_metal/tests/test_qlibrary_2_options.py b/qiskit_metal/tests/test_qlibrary_2_options.py
index 3df71d3c6..8f09419d2 100644
--- a/qiskit_metal/tests/test_qlibrary_2_options.py
+++ b/qiskit_metal/tests/test_qlibrary_2_options.py
@@ -40,6 +40,8 @@
 from qiskit_metal.qlibrary.terminations.launchpad_wb import LaunchpadWirebond
 from qiskit_metal.qlibrary.terminations.launchpad_wb_coupled import LaunchpadWirebondCoupled
 from qiskit_metal.qlibrary.lumped.cap_3_interdigital import Cap3Interdigital
+from qiskit_metal.qlibrary.qubits.JJ_Dolan import jj_dolan
+from qiskit_metal.qlibrary.qubits.JJ_Manhattan import jj_manhattan
 from qiskit_metal.qlibrary.qubits import transmon_concentric
 from qiskit_metal.qlibrary.qubits import transmon_cross
 from qiskit_metal.qlibrary.qubits.transmon_cross_fl import TransmonCrossFL
@@ -751,6 +753,47 @@ def test_qlibrary_qroute_options(self):
         self.assertEqual(options['lead']['start_jogged_extension'], '')
         self.assertEqual(options['lead']['end_jogged_extension'], '')
 
+    def test_qlibrary_jj_dolan_options(self):
+        """Test the default options of JJ_Dolan were not accidentially changed."""
+        design = designs.DesignPlanar()
+        my_jj_dolan = jj_dolan(design, name='test_jj_dolan', options={})
+        options = my_jj_dolan.default_options
+
+        self.assertEqual(len(options), 13)
+        self.assertEqual(options['JJ_pad_lower_width'], '25um')
+        self.assertEqual(options['JJ_pad_lower_height'], '10um')
+        self.assertEqual(options['JJ_pad_lower_pos_x'], '0')
+        self.assertEqual(options['JJ_pad_lower_pos_y'], '0')
+        self.assertEqual(options['finger_lower_width'], '1um')
+        self.assertEqual(options['finger_lower_height'], '20um')
+        self.assertEqual(options['extension'], '1um')
+        self.assertEqual(options['offset'], '2um')
+        self.assertEqual(options['second_metal_length'], '5um')
+        self.assertEqual(options['second_metal_width'], '1um')
+        self.assertEqual(options['x_pos'], '0um')
+        self.assertEqual(options['y_pos'], '0um')
+        self.assertEqual(options['layer'], '1')
+
+    def test_qlibrary_jj_manhattan_options(self):
+        """Test the default options of JJ_Manhattan were not accidentially changed."""
+        design = designs.DesignPlanar()
+        my_jj_manhattan = jj_manhattan(design,
+                                       name='test_jj_manhattan',
+                                       options={})
+        options = my_jj_manhattan.default_options
+
+        self.assertEqual(len(options), 10)
+        self.assertEqual(options['JJ_pad_lower_width'], '25um')
+        self.assertEqual(options['JJ_pad_lower_height'], '10um')
+        self.assertEqual(options['JJ_pad_lower_pos_x'], '0')
+        self.assertEqual(options['JJ_pad_lower_pos_y'], '0')
+        self.assertEqual(options['finger_lower_width'], '1um')
+        self.assertEqual(options['finger_lower_height'], '20um')
+        self.assertEqual(options['extension'], '1um')
+        self.assertEqual(options['x_pos'], '0um')
+        self.assertEqual(options['y_pos'], '0um')
+        self.assertEqual(options['layer'], '1')
+
 
 if __name__ == '__main__':
     unittest.main(verbosity=2)
diff --git a/qiskit_metal/tests/test_qlibrary_3_functionality.py b/qiskit_metal/tests/test_qlibrary_3_functionality.py
index f2d62041a..5c3bbfdb0 100644
--- a/qiskit_metal/tests/test_qlibrary_3_functionality.py
+++ b/qiskit_metal/tests/test_qlibrary_3_functionality.py
@@ -40,6 +40,8 @@
 from qiskit_metal.qlibrary.tlines.meandered import RouteMeander
 from qiskit_metal.qlibrary.tlines import straight_path
 from qiskit_metal import designs
+from qiskit_metal.qlibrary.qubits.JJ_Dolan import jj_dolan
+from qiskit_metal.qlibrary.qubits.JJ_Manhattan import jj_manhattan
 from qiskit_metal.qlibrary.qubits import transmon_pocket_cl
 from qiskit_metal.qlibrary.qubits import transmon_pocket
 from qiskit_metal.qlibrary.qubits import transmon_cross
@@ -344,6 +346,20 @@ def test_qlibrary_transmon_coupler_01_component_metadata(self):
         self.assertEqual(metadata['_qgeometry_table_path'], 'True')
         self.assertEqual(metadata['_qgeometry_table_junction'], 'True')
 
+    def test_qlibrary_qubit_jj_dolan_component_metadata(self):
+        """Test component_metadata in jj_dolan."""
+        component = jj_dolan
+        metadata = component.component_metadata
+        self.assertEqual(len(metadata), 1)
+        self.assertEqual(metadata['short_name'], 'component')
+
+    def test_qlibrary_qubit_jj_manhattan_component_metadata(self):
+        """Test component_metadata in jj_dolan."""
+        component = jj_manhattan
+        metadata = component.component_metadata
+        self.assertEqual(len(metadata), 1)
+        self.assertEqual(metadata['short_name'], 'component')
+
     def test_qlibrary_qcomponent_get_pin_names(self):
         """Test getting all the pin names."""
         design = designs.DesignPlanar()