Source code for gf180mcu.cells.cap_mim

import gdsfactory as gf

from gf180mcu.cells.via_generator import via_generator
from gf180mcu.layers import layer


[docs] @gf.cell def cap_mim( mim_option: str = "A", metal_level: str = "M4", lc: float = 2, wc: float = 2, label: bool = False, top_label: str = "", bot_label: str = "", ) -> gf.Component: """Return mim cap. Args: min_option: MIM-A or MIM-B. metal_level: metal level. M4, M5, M6. lc: cap length. wc: cap width. label: 1 to add labels. top_label: top label. bot_label: bottom label. """ c = gf.Component() # used dimensions and layers # MIM Option selection if mim_option == "MIM-A": upper_layer = layer["metal3"] bottom_layer = layer["metal2"] via_layer = layer["via2"] up_label_layer = layer["metal3_label"] bot_label_layer = layer["metal2_label"] elif mim_option == "MIM-B": if metal_level == "M4": upper_layer = layer["metal4"] bottom_layer = layer["metal3"] via_layer = layer["via3"] up_label_layer = layer["metal4_label"] bot_label_layer = layer["metal3_label"] elif metal_level == "M5": upper_layer = layer["metal5"] bottom_layer = layer["metal4"] via_layer = layer["via4"] up_label_layer = layer["metal5_label"] bot_label_layer = layer["metal4_label"] elif metal_level == "M6": upper_layer = layer["metaltop"] bottom_layer = layer["metal5"] via_layer = layer["via5"] up_label_layer = layer["metaltop_label"] bot_label_layer = layer["metal5_label"] else: upper_layer = layer["metal3"] bottom_layer = layer["metal2"] via_layer = layer["via2"] up_label_layer = layer["metal3_label"] bot_label_layer = layer["metal2_label"] via_size = (0.22, 0.22) via_spacing = (0.5, 0.5) via_enc = (0.4, 0.4) bot_enc_top = 0.6 l_mk_w = 0.1 # drawing cap identifier and bottom , upper layers m_up = c.add_ref( gf.components.rectangle( size=(wc, lc), layer=upper_layer, ) ) fusetop = c.add_ref( gf.components.rectangle(size=(m_up.dxsize, m_up.dysize), layer=layer["fusetop"]) ) fusetop.dxmin = m_up.dxmin fusetop.dymin = m_up.dymin mim_l_mk = c.add_ref( gf.components.rectangle(size=(fusetop.dxsize, l_mk_w), layer=layer["mim_l_mk"]) ) mim_l_mk.dxmin = fusetop.dxmin mim_l_mk.dymin = fusetop.dymin m_dn = c.add_ref( gf.components.rectangle( size=(m_up.dxsize + (2 * bot_enc_top), m_up.dysize + (2 * bot_enc_top)), layer=bottom_layer, ) ) m_dn.dxmin = m_up.dxmin - bot_enc_top m_dn.dymin = m_up.dymin - bot_enc_top cap_mk = c.add_ref( gf.components.rectangle(size=(m_dn.dxsize, m_dn.dysize), layer=layer["cap_mk"]) ) cap_mk.dxmin = m_dn.dxmin cap_mk.dymin = m_dn.dymin # generatingg labels if label == 1: c.add_label( top_label, position=(m_up.dxmin + (m_up.dxsize / 2), m_dn.dxmin + (m_dn.dysize / 2)), layer=up_label_layer, ) c.add_label( bot_label, position=( m_dn.dxmin + (m_dn.dxsize / 2), m_dn.dymin + (m_up.dymin - m_dn.dymin) / 2, ), layer=bot_label_layer, ) # generatingg vias via = via_generator( x_range=(m_up.dxmin, m_up.dxmax), y_range=(m_up.dymin, m_up.dymax), via_enclosure=via_enc, via_layer=via_layer, via_size=via_size, via_spacing=via_spacing, ) c.add_ref(via) # Add ports for top and bottom metal connections c.add_port( name="top", center=(m_up.dcenter[0], m_up.dcenter[1]), width=m_up.dxsize, orientation=90, layer=upper_layer, port_type="electrical", ) c.add_port( name="bottom", center=(m_dn.dcenter[0], m_dn.dcenter[1]), width=m_dn.dxsize, orientation=90, layer=bottom_layer, port_type="electrical", ) return c
if __name__ == "__main__": c = cap_mim() c.pprint_ports() c.show()