Source code for ihp.cells2.bjt_transistors

import gdsfactory as gf

from .. import tech
from .ihp_pycell import npn13G2 as npn13G2IHP
from .ihp_pycell import npn13G2L as npn13G2LIHP
from .ihp_pycell import npn13G2V as npn13G2VIHP
from .ihp_pycell import pnpMPA as pnpMPAIHP
from .utils import *


[docs] @gf.cell def npn13G2( STI: float = 0.44, baspolyx: float = 0.3, bipwinx: float = 0.07, bipwiny: float = 0.1, empolyx: float = 0.15, empolyy: float = 0.18, emitter_length: float = 0.9, emitter_width: float = 0.7, Nx: int = 1, Ny: int = 1, text: str = "npn13G2", CMetY1: float = 0, CMetY2: float = 0, ) -> gf.Component: """Returns the IHP npn13G2 BJT transistor as a gdsfactory Component. This function generates a parametric layout of the npn13G2 heterojunction bipolar transistor (HBT) from the IHP SG13G2 process. Geometry parameters control the emitter, base, and implant enclosure sizes, while Nx and Ny define the emitter finger array configuration. Args: STI: STI enclosure around the active device, in microns. baspolyx: Base poly enclosure in the x-direction, in microns. bipwinx: BIP window enclosure in the x-direction, in microns. bipwiny: BIP window enclosure in the y-direction, in microns. empolyx: Emitter poly enclosure in the x-direction, in microns. empolyy: Emitter poly enclosure in the y-direction, in microns. emitter_length: Length of each emitter finger, in microns. emitter_width: Width of each emitter finger, in microns. Nx: Number of emitter fingers. Ny: Number of emitter rows (not used by current IHP PyCell implementation). text: Label text to place on the device. CMetY1: Optional metal extension on the collector side (lower side), in microns. CMetY2: Optional metal extension on the collector side (upper side), in microns. Returns: gdsfactory.Component: The generated npn13G2 transistor layout. """ params = { "cdf_version": tech.techParams["CDFVersion"], "Display": "Selected", "model": tech.techParams["npn13G2_model"], "Nx": Nx, "Ny": Ny, "le": emitter_length * 1e-6, # Length in μm "we": emitter_width * 1e-6, # Width in nm "STI": STI * 1e-6, "baspolyx": baspolyx * 1e-6, "bipwinx": bipwinx * 1e-6, "bipwiny": bipwiny * 1e-6, "empolyx": empolyx * 1e-6, "empolyy": empolyy * 1e-6, "Icmax": 3 * 1e-3, # hardcoded in IHP PyCell, not in techparams "Iarea": 1 * 1e-3, # hardcoded in IHP PyCell, not in techparams "area": 1, # hardcoded in IHP PyCell, not in techparams "bn": "sub!", # hardcoded in IHP PyCell, not in techparams "m": 1, "trise": "", "Text": text, "CMetY1": CMetY1 * 1e-6, # hardcoded in IHP PyCell, not in techparams "CMetY2": CMetY2 * 1e-6, # hardcoded in IHP PyCell, not in techparams } # add ports to the component c = generate_gf_from_ihp( cell_name="npn13G2", cell_params=params, function_name=npn13G2IHP() ) gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal1pin), port_type="electrical", ports_on_short_side=True, auto_rename_ports=False, ) c.ports["e1"].name = "C" c.ports["e2"].name = "B" gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal2pin), port_name_prefix="E", port_type="electrical", ports_on_short_side=True, auto_rename_ports=False, ) c.ports["E1"].name = "E" # c.ports["e1"].name = "B" # c.ports["e2"].name = "C" # c.ports["e3"].name = "E" return c
[docs] @gf.cell def npn13G2L( Nx: int = 1, emitter_length: float = 1, emitter_width: float = 0.07, ) -> gf.Component: """Returns the IHP npn13G2L BJT transistor as a gdsfactory Component. This function generates a layout for the npn13G2L heterojunction bipolar transistor (HBT) from the IHP SG13G2 process. The transistor geometry is defined by the number of emitter fingers and the dimensions of each emitter finger. Args: Nx: Number of emitter fingers. emitter_length: Length of each emitter finger, in microns. emitter_width: Width of each emitter finger, in microns. Returns: gdsfactory.Component: The generated npn13G2L transistor layout. """ params = { "cdf_version": tech.techParams["CDFVersion"], "Display": "Selected", "model": tech.techParams["npn13G2L_model"], "Nx": Nx, "le": emitter_length * 1e-6, # Length in μm "we": emitter_width * 1e-6, # Width in nm "Icmax": 3 * 1e-3, # hardcoded in IHP PyCell, not in techparams "Iarea": 1 * 1e-3, # hardcoded in IHP PyCell, not in techparams "area": 1, # hardcoded in IHP PyCell, not in techparams "bn": "sub!", # hardcoded in IHP PyCell, not in techparams "Vbe": "", "Vce": "", "m": 1, "trise": "", } c = generate_gf_from_ihp( cell_name="npn13G2L", cell_params=params, function_name=npn13G2LIHP() ) # add ports to the component gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal1pin), port_type="electrical", ports_on_short_side=True, ) gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal2pin), port_name_prefix="E", port_type="electrical", ports_on_short_side=True, ) c.ports["e1"].name = "B" c.ports["e2"].name = "E" c.ports["e3"].name = "C" return c
[docs] @gf.cell def npn13G2V( Nx: int = 1, emitter_length: float = 1, emitter_width: float = 0.12, ) -> gf.Component: """Returns the IHP npn13G2V BJT transistor as a gdsfactory Component. This function generates a layout for the npn13G2V heterojunction bipolar transistor (HBT) from the IHP SG13G2 process. The transistor geometry is defined by the number of emitter fingers and the dimensions of each emitter finger. Args: Nx: Number of emitter fingers. Valid range: [1, 8]. emitter_length: Length of each emitter finger, in microns. emitter_width: Width of each emitter finger, in microns. Returns: gdsfactory.Component: The generated npn13G2V transistor layout. """ params = { "cdf_version": tech.techParams["CDFVersion"], "Display": "Selected", "model": tech.techParams["npn13G2V_model"], "Nx": Nx, "le": emitter_length * 1e-6, # Length in μm "we": emitter_width * 1e-6, # Width in nm "Icmax": 3 * 1e-3, # hardcoded in IHP PyCell, not in techparams "Iarea": 1 * 1e-3, # hardcoded in IHP PyCell, not in techparams "area": 1, # hardcoded in IHP PyCell, not in techparams "bn": "sub!", # hardcoded in IHP PyCell, not in techparams "Vbe": "", "Vce": "", "m": 1, "trise": "", } c = generate_gf_from_ihp( cell_name="npn13G2V", cell_params=params, function_name=npn13G2VIHP() ) # add ports to the component gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal1pin), port_type="electrical", ports_on_short_side=True, ) gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal2pin), port_name_prefix="E", port_type="electrical", ports_on_short_side=True, ) c.ports["e1"].name = "B" c.ports["e2"].name = "C" c.ports["e3"].name = "E" return c
[docs] @gf.cell def pnpMPA( width: float = 0.7, length: float = 2, ) -> gf.Component: """Returns the IHP pnpMPA BJT transistor as a gdsfactory Component. This function generates a layout for a PNP transistor using the IHP process. The geometry of the transistor is defined by its width and length. Args: width: Width of the transistor, in microns. length: Length of the transistor, in microns. Returns: gdsfactory.Component: The generated pnpMPA transistor layout. """ area = width * length perimeter = 2 * (width + length) params = { "cdf_version": tech.techParams["CDFVersion"], "Display": "Selected", "model": tech.techParams["pnpMPA_model"], "Calculate": "a", "w": width * 1e-6, # Length in μm "l": length * 1e-6, # Width in nm "a": area * 1e-12, "p": perimeter * 1e-6, "ac": 7.524 * 1e-12, "pc": 11.16 * 1e-6, "m": 1, # Multiplier "region": "", "trise": "", } c = generate_gf_from_ihp( cell_name="pnpMPA", cell_params=params, function_name=pnpMPAIHP() ) # add ports to the component gf.add_ports.add_ports_from_boxes( c, pin_layer=(tech.LAYER.Metal1pin), port_type="electrical", ports_on_short_side=True, ) c.ports["e1"].name = "TIE" c.ports["e2"].name = "PLUS" c.ports["e3"].name = "MINUS" return c