Cells QPDK#

bend_euler#

qpdk.cells.bend_euler(radius=None, angle=90, p=0.5, width=None, cross_section='strip', allow_min_radius_violation=False)[source]#

Regular degree euler bend.

Parameters:
  • radius (float | None) – in um. Defaults to cross_section_radius.

  • angle (float) – total angle of the curve.

  • p (float) – Proportion of the curve that is an Euler curve.

  • width (float | None) – width to use. Defaults to cross_section.width.

  • cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – specification (CrossSection, string, CrossSectionFactory dict).

  • allow_min_radius_violation (bool) – if True allows radius to be smaller than cross_section radius.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.bend_euler(angle=90, p=0.5, cross_section='strip', allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-1.png

bend_s#

qpdk.cells.bend_s(size=(11, 1.8), cross_section='strip', width=None, allow_min_radius_violation=False)[source]#

Return S bend with bezier curve.

stores min_bend_radius property in self.info[‘min_bend_radius’] min_bend_radius depends on height and length

Parameters:
  • size (tuple[float, float]) – in x and y direction.

  • cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – spec.

  • width (float | None) – width of the waveguide. If None, it will use the width of the cross_section.

  • allow_min_radius_violation (bool) – allows min radius violations.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.bend_s(size=(11, 1.8), cross_section='strip', allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-2.png

coupler_capacitive#

qpdk.cells.coupler_capacitive(pad_width=20.0, pad_height=90.0, gap=2.0, feed_width=10.0, feed_length=30.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical')[source]#

Creates a capacitive coupler for quantum circuits.

A capacitive coupler consists of two metal pads separated by a small gap, providing capacitive coupling between circuit elements like qubits and resonators.

Parameters:
  • pad_width (float) – Width of each coupling pad in μm.

  • pad_height (float) – Height of each coupling pad in μm.

  • gap (float) – Gap between the coupling pads in μm.

  • feed_width (float) – Width of the feed lines in μm.

  • feed_length (float) – Length of the feed lines in μm.

  • layer_metal (LayerSpec) – Layer for the metal structures.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the capacitive coupler geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.coupler_capacitive(pad_width=20.0, pad_height=90.0, gap=2.0, feed_width=10.0, feed_length=30.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

coupler_interdigital#

qpdk.cells.coupler_interdigital(fingers=6, finger_length=30.0, finger_width=2.0, finger_gap_vertical=2.0, finger_gap_horizontal=3.0, feed_width=10.0, feed_length=30.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical')[source]#

Creates an interdigital capacitive coupler.

Each side includes a base column (a vertical metal block) to which the fingers are attached. - The width of the base column is equal to the height of the fingers. - The finger_length parameter refers only to the length of the fingers extending from the base,

and does NOT include the base column width

Parameters:
  • fingers (int) – Number of fingers per side.

  • finger_length (float) – Length of each finger in μm (see note above).

  • finger_width (float) – Width of each finger in μm.

  • finger_gap_vertical (float) – Vertical gap between fingers in μm (g1).

  • finger_gap_horizontal (float) – Horizontal gap between fingers in μm (g2).

  • feed_width (float) – Width of the feed lines in μm.

  • feed_length (float) – Length of the feed lines in μm.

  • layer_metal (LayerSpec) – Layer for the metal structures.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the interdigital coupler geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.coupler_interdigital(fingers=6, finger_length=30.0, finger_width=2.0, finger_gap_vertical=2.0, finger_gap_horizontal=3.0, feed_width=10.0, feed_length=30.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

coupler_tunable#

qpdk.cells.coupler_tunable(pad_width=30.0, pad_height=40.0, gap=3.0, tuning_pad_width=15.0, tuning_pad_height=20.0, tuning_gap=1.0, feed_width=10.0, feed_length=30.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_tuning=<LayerMapQPDK.M1_CUTOUT: 48>, port_type='electrical')[source]#

Creates a tunable capacitive coupler with voltage control.

A tunable coupler includes additional electrodes that can be voltage-biased to change the coupling strength dynamically.

Parameters:
  • pad_width (float) – Width of main coupling pads in μm.

  • pad_height (float) – Height of main coupling pads in μm.

  • gap (float) – Gap between main coupling pads in μm.

  • tuning_pad_width (float) – Width of tuning pads in μm.

  • tuning_pad_height (float) – Height of tuning pads in μm.

  • tuning_gap (float) – Gap to tuning pads in μm.

  • feed_width (float) – Width of feed lines in μm.

  • feed_length (float) – Length of feed lines in μm.

  • layer_metal (LayerSpec) – Layer for main metal structures.

  • layer_tuning (LayerSpec) – Layer for tuning electrodes.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the tunable coupler geometry.

Return type:

Component

            (connected to feed)
                 _______
                |       |
                | tpad1 |
                |       |
                |_______|
                tuning gap
           ______        ______
 _______  |      |      |      | _______
|       | |      |      |      ||       |
| feed1 | | pad1 | gap  | pad2 || feed2 |
|       | |      |      |      ||       |
|_______| |      |      |      ||_______|
          |______|      |______|
                tuning gap
                 _______
                |       |
                | tpad2 |
                |       |
                |_______|
            (connected to feed)
from qpdk import cells, PDK

PDK.activate()
c = cells.coupler_tunable(pad_width=30.0, pad_height=40.0, gap=3.0, tuning_pad_width=15.0, tuning_pad_height=20.0, tuning_gap=1.0, feed_width=10.0, feed_length=30.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_tuning=<LayerMapQPDK.M1_CUTOUT: 48>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

flux_qubit#

qpdk.cells.flux_qubit(loop_width=50.0, loop_height=50.0, junction_width=0.15, junction_height=0.3, alpha_junction_width=0.12, alpha_junction_height=0.25, wire_width=2.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_alpha_junction=<LayerMapQPDK.JJ_MARK: 25>, port_type='electrical')[source]#

Creates a flux qubit (persistent current qubit).

A flux qubit consists of a superconducting loop interrupted by three Josephson junctions. Two junctions are identical (beta junctions) while the third is smaller (alpha junction) with roughly 0.5-0.8 times the critical current.

Parameters:
  • loop_width (float) – Width of the superconducting loop in μm.

  • loop_height (float) – Height of the superconducting loop in μm.

  • junction_width (float) – Width of the beta Josephson junctions in μm.

  • junction_height (float) – Height of the beta Josephson junctions in μm.

  • alpha_junction_width (float) – Width of the alpha Josephson junction in μm.

  • alpha_junction_height (float) – Height of the alpha Josephson junction in μm.

  • wire_width (float) – Width of the superconducting wires in μm.

  • layer_metal (LayerSpec) – Layer for the metal wires.

  • layer_junction (LayerSpec) – Layer for the beta Josephson junctions.

  • layer_alpha_junction (LayerSpec) – Layer for the alpha Josephson junction.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the flux qubit geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.flux_qubit(loop_width=50.0, loop_height=50.0, junction_width=0.15, junction_height=0.3, alpha_junction_width=0.12, alpha_junction_height=0.25, wire_width=2.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_alpha_junction=<LayerMapQPDK.JJ_MARK: 25>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

flux_qubit_asymmetric#

qpdk.cells.flux_qubit_asymmetric(loop_width=60.0, loop_height=40.0, junction_width=0.15, junction_height=0.3, alpha_junction_width=0.12, alpha_junction_height=0.25, wire_width=2.0, asymmetry_angle=15.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_alpha_junction=<LayerMapQPDK.JJ_MARK: 25>, port_type='electrical')[source]#

Creates an asymmetric flux qubit for reduced flux noise sensitivity.

An asymmetric flux qubit has a loop geometry that is not perfectly symmetric, which can help reduce sensitivity to flux noise while maintaining controllability.

Parameters:
  • loop_width (float) – Width of the superconducting loop in μm.

  • loop_height (float) – Height of the superconducting loop in μm.

  • junction_width (float) – Width of the beta Josephson junctions in μm.

  • junction_height (float) – Height of the beta Josephson junctions in μm.

  • alpha_junction_width (float) – Width of the alpha Josephson junction in μm.

  • alpha_junction_height (float) – Height of the alpha Josephson junction in μm.

  • wire_width (float) – Width of the superconducting wires in μm.

  • asymmetry_angle (float) – Angle of asymmetry in degrees.

  • layer_metal (LayerSpec) – Layer for the metal wires.

  • layer_junction (LayerSpec) – Layer for the beta Josephson junctions.

  • layer_alpha_junction (LayerSpec) – Layer for the alpha Josephson junction.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the asymmetric flux qubit geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.flux_qubit_asymmetric(loop_width=60.0, loop_height=40.0, junction_width=0.15, junction_height=0.3, alpha_junction_width=0.12, alpha_junction_height=0.25, wire_width=2.0, asymmetry_angle=15.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_alpha_junction=<LayerMapQPDK.JJ_MARK: 25>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

interdigital_capacitor#

qpdk.cells.interdigital_capacitor(fingers=4, finger_length=20.0, finger_gap=2.0, thickness=5.0, layer='M1_DRAW')[source]#

Generate an interdigital capacitor component with ports on both ends.

An interdigital capacitor consists of interleaved metal fingers that create a distributed capacitance. This component creates a planar capacitor with two sets of interleaved fingers extending from opposite ends.

See for example Zhu et al., Accurate circuit model of interdigital capacitor and its application to design of new quasi-lumped miniaturized filters with suppression of harmonic resonance, doi: 10.1109/22.826833.

Note

finger_length=0 effectively provides a parallel plate capacitor. The capacitance scales approximately linearly with the number of fingers and finger length.

Parameters:
  • fingers (int) – Total number of fingers of the capacitor (must be >= 1).

  • finger_length (float | int) – Length of each finger in μm.

  • finger_gap (float | int) – Gap between adjacent fingers in μm.

  • thickness (float | int) – Thickness of fingers and the base section in μm.

  • layer (LayerSpec) – Layer specification for the capacitor geometry.

Returns:

A gdsfactory component with the interdigital capacitor geometry and two ports (‘o1’ and ‘o2’) on opposing sides.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.interdigital_capacitor(fingers=4, finger_length=20.0, finger_gap=2.0, thickness=5.0, layer='M1_DRAW').copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-8.png

rectangle#

qpdk.cells.rectangle(size=(4.0, 2.0), layer='M1_DRAW', centered=False, port_type='electrical', port_orientations=(180, 90, 0, -90))[source]#

Returns a rectangle.

Parameters:
  • size (tuple[float, float]) – (tuple) Width and height of rectangle.

  • layer (tuple[int, int] | str | int | LayerEnum) – Specific layer to put polygon geometry on.

  • centered (bool) – True sets center to (0, 0), False sets south-west to (0, 0).

  • port_type (str | None) – optical, electrical.

  • port_orientations (tuple[int, ...] | list[int] | None) – list of port_orientations to add. None adds no ports.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.rectangle(size=(4.0, 2.0), layer='M1_DRAW', centered=False, port_type='electrical', port_orientations=(180, 90, 0, -90)).copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-9.png

resonator_cpw#

qpdk.cells.resonator_cpw(length=1000.0, width=10.0, gap=6.0, meander_pitch=50.0, meander_width=200.0, coupling_gap=5.0, coupling_length=100.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_gap=<LayerMapQPDK.M1_ETCH: 47>, port_type='electrical')[source]#

Creates a coplanar waveguide (CPW) resonator.

A CPW resonator consists of a meandered coplanar waveguide with coupling gaps for capacitive coupling to feedlines or qubits.

Parameters:
  • length (float) – Total length of the resonator in μm.

  • width (float) – Width of the center conductor in μm.

  • gap (float) – Gap width on each side of the center conductor in μm.

  • meander_pitch (float) – Pitch between meander segments in μm.

  • meander_width (float) – Width of each meander section in μm.

  • coupling_gap (float) – Gap for capacitive coupling in μm.

  • coupling_length (float) – Length of the coupling region in μm.

  • layer_metal (LayerSpec) – Layer for the metal conductor.

  • layer_gap (LayerSpec) – Layer for the gaps (ground plane).

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the CPW resonator geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.resonator_cpw(length=1000.0, width=10.0, gap=6.0, meander_pitch=50.0, meander_width=200.0, coupling_gap=5.0, coupling_length=100.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_gap=<LayerMapQPDK.M1_ETCH: 47>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

resonator_lumped#

qpdk.cells.resonator_lumped(capacitor_fingers=4, capacitor_finger_length=20.0, capacitor_finger_gap=2.0, capacitor_thickness=5.0, inductor_width=2.0, inductor_turns=3, inductor_radius=20.0, coupling_gap=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical')[source]#

Creates a lumped element resonator with interdigital capacitor and spiral inductor.

A lumped resonator consists of a capacitive element (interdigital capacitor) and an inductive element (spiral inductor) forming an LC circuit.

Parameters:
  • capacitor_fingers (int) – Number of fingers in the interdigital capacitor.

  • capacitor_finger_length (float) – Length of each capacitor finger in μm.

  • capacitor_finger_gap (float) – Gap between capacitor fingers in μm.

  • capacitor_thickness (float) – Thickness of capacitor fingers in μm.

  • inductor_width (float) – Width of the inductor wire in μm.

  • inductor_turns (int) – Number of turns in the spiral inductor.

  • inductor_radius (float) – Radius of the spiral inductor in μm.

  • coupling_gap (float) – Gap for capacitive coupling in μm.

  • layer_metal (LayerSpec) – Layer for the metal structures.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the lumped resonator geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.resonator_lumped(capacitor_fingers=4, capacitor_finger_length=20.0, capacitor_finger_gap=2.0, capacitor_thickness=5.0, inductor_width=2.0, inductor_turns=3, inductor_radius=20.0, coupling_gap=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

resonator_quarter_wave#

qpdk.cells.resonator_quarter_wave(length=2500.0, width=10.0, gap=6.0, short_stub_length=50.0, coupling_gap=5.0, coupling_length=100.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_gap=<LayerMapQPDK.M1_ETCH: 47>, port_type='electrical')[source]#

Creates a quarter-wave coplanar waveguide resonator.

A quarter-wave resonator is shorted at one end and has maximum electric field at the open end, making it suitable for capacitive coupling.

Parameters:
  • length (float) – Length of the quarter-wave resonator in μm.

  • width (float) – Width of the center conductor in μm.

  • gap (float) – Gap width on each side of the center conductor in μm.

  • short_stub_length (float) – Length of the shorting stub in μm.

  • coupling_gap (float) – Gap for capacitive coupling in μm.

  • coupling_length (float) – Length of the coupling region in μm.

  • layer_metal (LayerSpec) – Layer for the metal conductor.

  • layer_gap (LayerSpec) – Layer for the gaps.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the quarter-wave resonator geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.resonator_quarter_wave(length=2500.0, width=10.0, gap=6.0, short_stub_length=50.0, coupling_gap=5.0, coupling_length=100.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_gap=<LayerMapQPDK.M1_ETCH: 47>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

straight#

qpdk.cells.straight(length=10, cross_section='strip', width=None, npoints=2)[source]#

Returns a Straight waveguide.

Parameters:
  • length (float) – straight length (um).

  • cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – specification (CrossSection, string or dict).

  • width (float | None) – width of the waveguide. If None, it will use the width of the cross_section.

  • npoints (int) – number of points.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.straight(length=10, cross_section='strip', npoints=2).copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-13.png

transmon#

qpdk.cells.transmon(pad_width=200.0, pad_height=100.0, pad_gap=6.0, junction_width=0.15, junction_height=0.3, island_width=10.0, island_height=4.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_island=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical')[source]#

Creates a transmon qubit with Josephson junction.

A transmon qubit consists of two capacitor pads connected by a Josephson junction. The junction creates an anharmonic oscillator that can be used as a qubit.

Parameters:
  • pad_width (float) – Width of each capacitor pad in μm.

  • pad_height (float) – Height of each capacitor pad in μm.

  • pad_gap (float) – Gap between the two pads in μm.

  • junction_width (float) – Width of the Josephson junction in μm.

  • junction_height (float) – Height of the Josephson junction in μm.

  • island_width (float) – Width of the central island in μm.

  • island_height (float) – Height of the central island in μm.

  • layer_metal (LayerSpec) – Layer for the metal pads.

  • layer_junction (LayerSpec) – Layer for the Josephson junction.

  • layer_island (LayerSpec) – Layer for the central island.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the transmon geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.transmon(pad_width=200.0, pad_height=100.0, pad_gap=6.0, junction_width=0.15, junction_height=0.3, island_width=10.0, island_height=4.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_island=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

transmon_circular#

qpdk.cells.transmon_circular(pad_radius=100.0, pad_gap=6.0, junction_width=0.15, junction_height=0.3, island_radius=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_island=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical')[source]#

Creates a circular transmon qubit with Josephson junction.

A circular variant of the transmon qubit with circular capacitor pads.

Parameters:
  • pad_radius (float) – Radius of each circular capacitor pad in μm.

  • pad_gap (float) – Gap between the two pads in μm.

  • junction_width (float) – Width of the Josephson junction in μm.

  • junction_height (float) – Height of the Josephson junction in μm.

  • island_radius (float) – Radius of the central circular island in μm.

  • layer_metal (LayerSpec) – Layer for the metal pads.

  • layer_junction (LayerSpec) – Layer for the Josephson junction.

  • layer_island (LayerSpec) – Layer for the central island.

  • port_type (str) – Type of port to add to the component.

Returns:

A gdsfactory component with the circular transmon geometry.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.transmon_circular(pad_radius=100.0, pad_gap=6.0, junction_width=0.15, junction_height=0.3, island_radius=5.0, layer_metal=<LayerMapQPDK.M1_DRAW: 46>, layer_junction=<LayerMapQPDK.JJ_AREA: 22>, layer_island=<LayerMapQPDK.M1_DRAW: 46>, port_type='electrical').copy()
c.draw_ports()
c.plot()

(Source code)

wire_corner#

qpdk.cells.wire_corner(cross_section='metal_routing', width=None)[source]#

Returns 45 degrees electrical corner wire.

Parameters:
  • cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – spec.

  • width (float | None) – optional width. Defaults to cross_section width.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.wire_corner(cross_section='metal_routing').copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-16.png

wire_corner45#

qpdk.cells.wire_corner45(cross_section='metal_routing', radius=10, width=None, layer=None, with_corner90_ports=True)[source]#

Returns 90 degrees electrical corner wire.

Parameters:
  • cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – spec.

  • radius (float) – ignored.

  • width (float | None) – optional width. Defaults to cross_section width.

  • layer (tuple[int, int] | str | int | LayerEnum | None) – ignored.

  • with_corner90_ports (bool) – if True, adds ports at 90 degrees.

Return type:

Component

from qpdk import cells, PDK

PDK.activate()
c = cells.wire_corner45(cross_section='metal_routing', radius=10, with_corner90_ports=True).copy()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-17.png