piel.models.physical.photonic.via_stack
=======================================

.. py:module:: piel.models.physical.photonic.via_stack


Attributes
----------

.. autoapisummary::

   piel.models.physical.photonic.via_stack.via_stack_m1_m3
   piel.models.physical.photonic.via_stack.via_stack_slab_m3
   piel.models.physical.photonic.via_stack.via_stack_slab_m2
   piel.models.physical.photonic.via_stack.via_stack_npp_m1
   piel.models.physical.photonic.via_stack.via_stack_slab_npp_m3
   piel.models.physical.photonic.via_stack.c


Functions
---------

.. autoapisummary::

   piel.models.physical.photonic.via_stack.via_stack
   piel.models.physical.photonic.via_stack.via_stack_circular
   piel.models.physical.photonic.via_stack._smaller_angle
   piel.models.physical.photonic.via_stack.via_stack_from_rules
   piel.models.physical.photonic.via_stack.optimized_via
   piel.models.physical.photonic.via_stack.test_via_stack_from_rules


Module Contents
---------------

.. py:function:: via_stack(size=(11.0, 11.0), layers: gdsfactory.typings.LayerSpecs = ('M1', 'M2', 'M3'), layer_offsets: Optional[gdsfactory.typings.Floats] = None, vias: Optional[Tuple[Optional[gdsfactory.typings.ComponentSpec], Ellipsis]] = (via1, via2, None), layer_port: Optional[gdsfactory.typings.LayerSpec] = None, correct_size: bool = True) -> gdsfactory.component.Component

   Rectangular via array stack.

   You can use it to connect different metal layers or metals to silicon.
   You can use the naming convention via_stack_layerSource_layerDestination
   contains 4 connection (e1, e2, e3, e4)

   also know as Via array
   http://www.vlsi-expert.com/2017/12/vias.html

   spacing = via.info['spacing']
   enclosure = via.info['enclosure']

   :param size: of the layers.
   :param layers: layers on which to draw rectangles.
   :param layer_offsets: Optional offsets for each layer with respect to size.
                         positive grows, negative shrinks the size.
   :param vias: vias to use to fill the rectangles.
   :param layer_port: if None assumes port is on the last layer.
   :param correct_size: if True, if the specified dimensions are too small it increases
                        them to the minimum possible to fit a via.


.. py:function:: via_stack_circular(radius: float = 10.0, angular_extent: float = 45, center_angle: float = 0, width: float = 5.0, layers: gdsfactory.typings.LayerSpecs = ('M1', 'M2', 'M3'), vias: Tuple[Optional[gdsfactory.typings.ComponentSpec], Ellipsis] = (via1, via2), layer_port: Optional[gdsfactory.typings.LayerSpec] = None) -> gdsfactory.component.Component

   Circular via array stack.

   FIXME! does not work.

   Constructs a circular via array stack. It does so
   by stacking rectangular via stacks offset by a small amount
   along the specified circumference.

   :param radius: of the via stack (center).
   :param angular_extent: of the via stack.
   :param center_angle: of the via stack.
   :param width: of the via stack.
   :param layers: layers to draw
   :param vias: vias to use to fill the rectangles.
   :param layer_port: if None assumes port is on the last layer.


.. py:function:: _smaller_angle(angle, angle1, angle2)

   Returns False if angle is outside the
    bounds of the arc angle defined between
    angle 1 and angle2.

   But it does so assuming that angle1 and angle2 are between [-pi, pi]
   and that we are trying to fill an arc


.. py:function:: via_stack_from_rules(size: gdsfactory.typings.Float2 = (1.2, 1.2), layers: gdsfactory.typings.LayerSpecs = ('M1', 'M2', 'M3'), layer_offsets: Optional[Tuple[float, Ellipsis]] = None, vias: Optional[Tuple[Optional[gdsfactory.typings.ComponentSpec], Ellipsis]] = (via1, via2), via_min_size: Tuple[gdsfactory.typings.Float2, Ellipsis] = ((0.2, 0.2), (0.2, 0.2)), via_min_gap: Tuple[gdsfactory.typings.Float2, Ellipsis] = ((0.1, 0.1), (0.1, 0.1)), via_min_enclosure: gdsfactory.typings.Float2 = (0.15, 0.25), layer_port: Optional[gdsfactory.typings.LayerSpec] = None) -> gdsfactory.component.Component

   Rectangular via array stack, with optimized dimension for vias.

   Uses inclusion, minimum width, and minimum spacing rules to place the maximum number of individual vias,
   each with maximum via area.

   :param size: of the layers, len(size).
   :param layers: layers on which to draw rectangles.
   :param layer_offsets: Optional offsets for each layer with respect to size.
                         positive grows, negative shrinks the size.
   :param vias: list of base via components to modify.
   :param via_min_size: via minimum x, y dimensions.
   :param via_min_gap: via minimum x, y distances.
   :param via_min_enclosure: via minimum inclusion into connecting layers.
   :param layer_port: if None assumes port is on the last layer.


.. py:function:: optimized_via(base_via: gdsfactory.typings.ComponentSpec = 'VIAC', size: Tuple[float, float] = (11.0, 11.0), min_via_size: Tuple[float, float] = (0.3, 0.3), min_via_gap: Tuple[float, float] = (0.1, 0.1), min_via_enclosure: float = 0.2) -> gdsfactory.component.Component

   Given a target total inclusion size, returns an optimized dimension for the via.

   Uses inclusion, minimum width, and minimum spacing rules to place the maximum number of individual vias, with maximum via area.

   :param base_via: to modify.
   :param size: of the target enclosing medium.
   :param min_via_size: minimum size the vias can take.
   :param min_via_gap: minimum distance between vias.
   :param min_via_enclosure: minimum distance between edge of enclosing medium and nearest via edge.


.. py:function:: test_via_stack_from_rules() -> None

.. py:data:: via_stack_m1_m3

.. py:data:: via_stack_slab_m3

.. py:data:: via_stack_slab_m2

.. py:data:: via_stack_npp_m1

.. py:data:: via_stack_slab_npp_m3

.. py:data:: c

