Files
mxpic_forge/mxpic/components/primitives/pic/PBS.py
T
2026-06-04 23:21:39 +08:00

94 lines
4.0 KiB
Python

from typing import Optional
from turtle import shape
import nazca as nd
import numpy as np
import math
from .taper import taper_xs2xs
from ...routing import Route
from ...structures import *
from ....technologies import *
class PBS_3wg:
def __init__(self,
name: Optional[str] = None,
xs: str = 'strip',
Lcp: float = 11.7 ,
w1_tp: float = 0.55,
w2_tp: float = 0.3,
w_m: float = 0.45,
gap: float = 0.25,
R_bend: int = 20,
A_bend: float = 7.5,
w_wg: float = 0.45,
show_pins: bool = False,
sharp_patch: bool = True ) -> None:
self.Lcp = Lcp
self.xs = xs
self.w1_tp = w1_tp
self.w2_tp = w2_tp
self.w_m = w_m
self.gap = gap
self.R_bend = R_bend
self.A_bend = A_bend
self.w_wg = w_wg
self.name = name
if (self.name==None):
self.instantiate = False
else :
self.instantiate = True
self.cell = self.generate_gds(show_pins=show_pins, sharp_patch=sharp_patch)
def generate_gds(self,show_pins=False,sharp_patch = True):
w_crack = 0.002
with nd.Cell(instantiate=self.instantiate,name=self.name) as C:
nd.strt(length=self.Lcp,width=self.w_m,xs=self.xs).put(-self.Lcp/2,0,0)
tp_U = nd.taper(length=self.Lcp,width1=self.w1_tp,width2=self.w2_tp,xs=self.xs,shift=-(self.w1_tp-self.w2_tp)/2).put(-self.Lcp/2,self.w1_tp/2+self.gap+self.w_m/2,0)
tp_D = nd.taper(length=self.Lcp,width1=self.w2_tp,width2=self.w1_tp,xs=self.xs,shift=(self.w2_tp-self.w1_tp)/2).put(-self.Lcp/2,-self.w2_tp/2-self.gap-self.w_m/2,0)
Att_U = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w1_tp).put(tp_U.pin['a0'],flip=1)
Att_U = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w1_tp).put(flip=0)
Att_D = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w2_tp).put(tp_D.pin['a0'],flip=0)
Att_D = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w2_tp).put(flip=1)
if (self.w_wg!=None and self.w_wg>0) :
Att_D = nd.taper(length=5,width1=self.w2_tp,width2=self.w_wg,xs=self.xs).put(Att_D.pin['b0'])
Att_U = nd.taper(length=5,width1=self.w1_tp,width2=self.w_wg,xs=self.xs).put(Att_U.pin['b0'])
nd.Pin(name='a1',pin=Att_U.pin['b0']).put()
nd.Pin(name='a2',pin=Att_D.pin['b0']).put()
nd.strt(length=w_crack,width=self.w_wg,xs=self.xs).put(Att_U.pin['b0'].x-w_crack/2,Att_U.pin['b0'].y,0)
nd.strt(length=w_crack,width=self.w_wg,xs=self.xs).put(Att_D.pin['b0'].x-w_crack/2,Att_D.pin['b0'].y,0)
Att_U = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w2_tp).put(tp_U.pin['b0'],flip=0)
Att_U = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w2_tp).put(flip=1)
Att_D = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w1_tp).put(tp_D.pin['b0'],flip=1)
Att_D = nd.bend(angle=self.A_bend,radius=self.R_bend,xs=self.xs,width=self.w1_tp).put(flip=0)
if (self.w_wg!=None and self.w_wg>0) :
Att_D = nd.taper(length=5,width1=self.w1_tp,width2=self.w_wg,xs=self.xs).put(Att_D.pin['b0'])
Att_U = nd.taper(length=5,width1=self.w2_tp,width2=self.w_wg,xs=self.xs).put(Att_U.pin['b0'])
nd.Pin(name='b1',pin=Att_U.pin['b0']).put()
nd.Pin(name='b2',pin=Att_D.pin['b0']).put()
nd.strt(length=w_crack,width=self.w_wg,xs=self.xs).put(Att_U.pin['b0'].x-w_crack/2,Att_U.pin['b0'].y,0)
nd.strt(length=w_crack,width=self.w_wg,xs=self.xs).put(Att_D.pin['b0'].x-w_crack/2,Att_D.pin['b0'].y,0)
if (show_pins):
nd.put_stub()
return C