Open nikosavola opened 1 year ago
I am happy to help if anyone is interested in adding a superinductor array to, for example, Double Pads.
KQCircuits GUI installation required
The task is to implement a simple version of the SuperInductor
junction into the KQCircuits library. The junction will then be used by qubits already present in the KQCircuits library, such as Double Pads. The geometry of the SuperInductor
junction should be parametrised so that certain features in the junction could be tuned on-the-fly without rewriting the code.
Read more:
Planat, Luca et al. ‘A photonic crystal Josephson traveling wave parametric amplifier’, Phys. Rev. X, vol: 10, Apr. 2020, doi: 10.1103/PhysRevX.10.021021
Bao, Feng et al. ´Fluxonium: An Alternative Qubit Platform for High-Fidelity Operations´, Phys. Rev. X, vol: 129, Jun. 2022, doi: 10.1103/physrevlett.129.010502
We recommend getting started by copying an existing junction in KQCircuits and using that as a template for the new SuperInductor
junction. Let's copy manhattan.py into the same folder junctions and rename it super_inductor.py
. Rename the name of the class in the python file from Manhattan
to SuperInductor
.
Now when you start KLayout, change the Libraries selection to Junction Library - Library for junctions.
. You should see the new SuperInductor
entry in the library list. Drag-and-drop that entry into the layout, then press F2
and *
to center the view and unhide the cells. You should be able to see geometry for the Manhattan junction, but under the Super Inductor name.
You can also view the current state of the SuperInductor by using the create_element_from_path.py utility, which can be integrated within an IDE. More instructions on how to set it up in the script's comments.
Next, open kqcircuits/junctions/__init__.py and include Super Inductor
entry in the junction_type_choices
list. After restarting KLayout, drag-and-drop some qubit into the layout, for example Double Pads. Now the Junction Type
parameter should have the Super Inductor
junction as an option.
The rest of the work is to implement klayout_package/python/kqcircuits/qubits/super_inductor.py
according to the specifications outlined in below chapter. Some main take-aways from the Manhattan code:
SuperInductor
(previously Manhattan
) class is a subclass of the Squid
class, which inherits the loop_area
parameter. We recommend using that parameter in your design.build
method. All other methods present in the code are called from the build
method.finger_overshoot = Param(pdt.TypeDouble, "Length of fingers after the junction.", 1.0, unit="μm")
.
unit
argument makes sense for parameters you define, for example "µm"
self
, e.g. self.finger_overshoot
SuperInductor
inherits the junction_width
parameter from Junction class, so don't forget to use itpdt.TypeList
type parameter, make sure to cast all elements to appropriate datatypes because they are interpreted as strings when changed from GUI. (e.g. float(self.ground_gap[0])
).region = pya.Region(shape.to_itype(self.layout.dbu))
. If you have multiple regions that possibly overlap, you can combine them into a single region using the +
operator: region = region1 + region2
. Alternatively, if shapes are in the list shapes
, you can use region = pya.Region(shapes).merged()
. Finally, add the region into some of the junction cell's layers, let's say "SIS_junction"
with self.cell.shapes(self.get_layer("SIS_junction")).insert(region)
.self.add_port("port_name", port_origin, direction=port_direction)
, where port_origin
is pya.DPoint and port_direction
is pya.DVector. Direction helps to align a waveguide into the port. If you're not sure that you need the direction
argument, it's fine not to use it.For more information refer to the KLayout API and KQCircuits workflow advisory.
You can also reload the fluxonium placed on the layout after each code change: from KLayout top task bar choose KQCircuits > Reload libraries
. This features is a bit buggy at the moment and might cause KLayout to crash.
The below specifications for the design are for the uninitiated. Similar design was used in
Vool, Uri et al. ‘Non-Poissonian Quantum Jumps of a Fluxonium Qubit due to Quasiparticle Excitations’, Physical review letters. vol: 113, 2014, doi: 10.1103/PhysRevLett.113.247001.
If you are familiar with Fluxoniums and what kind of Super Inductor junctions can work to implement such qubits, feel free to implement your own design. Just make sure the design is well parametrised and that it meets the Definition of done below.
The outline of the design is presented in this chart which we will further describe in text.
Super Inductor is an array of junctions (blue lines) connected by wires (red lines). Junctions should align to x-axis and wires to y-axis, and they should be orthogonal to each other. Sequence of junctions should form a line, with wires connecting them in the middle. Should the junction sequence make a bend, the wires can be placed somewhere not strictly in the middle - as long as they connect the two junctions. Junctions and wires should be placed in the "SIS_junction"
layer.
On the left, opposite to the loop shape, there should be two wires connecting two junctions to form a SQUID loop area. Multiple SQUID loop areas should be placed in a sequence. From each end of the SQUID array there should be wires extending to some length.
We recommend to think of the Super Inductor construction as a set of line segments, where each line segment is populated by junctions along the line. If the line is diagonal, the wires should remain to be aligned with the y-axis and form a shape of stairs as they connect the junctions. On the sides of the Super Inductor there should be one junction enabling a U-turn of the junction sequence. See the below chart for line segment visualisation.
The junctions in the Super Inductor will be fabricated as so-called bridge-free Josephson junctions. For this we need shapes that are placed in the "SIS_shadow"
layer. These shapes are visualised in the chart as pink rectangles, to the left and to the right of the wires, as well as pertruding from both ends of junctions. For wires, the undercutting regions should alternate between being on the left or on the right of the wire. Consult the chart if the direction of the undercutting region is unclear in specific cases. Open the GDS file within attached ZIP file with KLayout for further reference (courtesy of Vladimir Milchakov). Here layer 1/0
would be SIS_junction
and 2/0
would be SIS_shadow
.
It's good to review during the development process how the Super Inductor looks like on a ready-made qubit like Double Pads. Make sure that the wires leading out of the Super Inductor have enough length. The origin (pya.DPoint(0,0)
) of the Super Inductor cell should be the end of the south wire. Add a port called "common"
with self.add_port("common", point)
, where point
is located on the end of the north wire. Make sure that the origin and the "common"
port are not exactly at the ends of their respective wires. Instead let the wire pertrude a bit beyond those points so that Super Inductor can reach inside the pads of the qubit.
This is our best guess on what features should be parametrised because the parameter set may vary depending on the implementation details.
self.junction_width
as inherited from the Junction
class.This requirement does not need to be followed to the letter. It's good to parametrize as much as we can, but also we do not want to confuse the designer with too many parameter choices. It's good to be mindful if there are "magic" numbers in the code and what is the justification for them not being parametrised.
create_element_from_path.py
.Super Inductor
junction should be selected for the Double Pads qubit and the Super Inductor geometry should match nicely with Double Pads geometry (use refpoints to align junction to qubits)Super Inductor
class should have a clear explanation, parameters should be well described.I highly recommend to make a pull request early even if the code is not finished. PR can be created as early as when you simply create the super_inductor.py
file. This gives us an opportunity to give feedback early and to guide the design process, and its also very illustrative to share code to show where you are stuck.
Hi I'm interested in working on this
Hi I'm interested in working on this
Awesome, thank you for your interest! You can start working on the solution and once the solution is ready, create a pull request. During review we might give some suggestions to refine the solution, but once it is ready, we will assign you to this issue and mark it closed. Don't hesitate to make a pull request earlier rather than later so that we could have some time before the deadline to reiterate your solution from our feedback if needed.
Description
At APS March meeting 2023 there was large interest in using KQCircuits for Fluxoniums designs. Would be nice to have one example qubit with a Junction array.
Use case
Use KQC for designing Fluxonium devices.