Source code for gdsfactory.components.interdigital_capacitor

from __future__ import annotations

from itertools import chain
from math import ceil, floor

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.typings import LayerSpec


[docs] @gf.cell def interdigital_capacitor( fingers: int = 4, finger_length: float | int = 20.0, finger_gap: float | int = 2.0, thickness: float | int = 5.0, layer: LayerSpec = "WG", ) -> Component: """Generates an interdigital capacitor with ports on both ends. See for example Zhu et al., `Accurate circuit model of interdigital capacitor and its application to design of new uasi-lumped miniaturized filters with suppression of harmonic resonance`, doi: 10.1109/22.826833. Note: ``finger_length=0`` effectively provides a plate capacitor. Args: fingers: total fingers of the capacitor. finger_length: length of the probing fingers. finger_gap: length of gap between the fingers. thickness: Thickness of fingers and section before the fingers. layer: spec. """ c = Component() assert fingers >= 1, "Must have at least 1 finger" width = 2 * thickness + finger_length + finger_gap # total length height = fingers * thickness + (fingers - 1) * finger_gap # total height points_1 = [ (0, 0), (0, height), (thickness + finger_length, height), (thickness + finger_length, height - thickness), (thickness, height - thickness), *chain.from_iterable( ( (thickness, height - (2 * i) * (thickness + finger_gap)), ( thickness + finger_length, height - (2 * i) * (thickness + finger_gap), ), ( thickness + finger_length, height - (2 * i) * (thickness + finger_gap) - thickness, ), (thickness, height - (2 * i) * (thickness + finger_gap) - thickness), ) for i in range(ceil(fingers / 2)) ), (thickness, 0), (0, 0), ] points_2 = [ (width, 0), (width, height), (width - thickness, height), *chain.from_iterable( ( ( width - thickness, height - (1 + 2 * i) * thickness - (1 + 2 * i) * finger_gap, ), ( width - (thickness + finger_length), height - (1 + 2 * i) * thickness - (1 + 2 * i) * finger_gap, ), ( width - (thickness + finger_length), height - (2 + 2 * i) * thickness - (1 + 2 * i) * finger_gap, ), ( width - thickness, height - (2 + 2 * i) * thickness - (1 + 2 * i) * finger_gap, ), ) for i in range(floor(fingers / 2)) ), (width - thickness, 0), (width, 0), ] c.add_polygon(points_1, layer=layer) c.add_polygon(points_2, layer=layer) c.add_port( name="o1", center=(0, height / 2), width=thickness, orientation=180, layer=layer, ) c.add_port( name="o2", center=(width, height / 2), width=thickness, orientation=0, layer=layer, ) return c
if __name__ == "__main__": c = interdigital_capacitor() c.show(show_ports=True)