optical pins name revised. Pin type added
This commit is contained in:
+528
-176
@@ -179,12 +179,20 @@ class MZI:
|
||||
cell_BS = __BS_generate__(BS=BS,xs=xs_wg,func_name="mxpic::functional::MZI")
|
||||
cell_BS2 = __BS_generate__(BS=BS2,xs=xs_wg,func_name="mxpic::functional::MZI")
|
||||
|
||||
dY1 = np.abs(cell_BS.pin['b1'].y - cell_BS.pin['b2'].y)
|
||||
dY2 = np.abs(cell_BS2.pin['b1'].y - cell_BS2.pin['b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: dY1 = np.abs(cell_BS.pin['b1'].y - cell_BS.pin['b2'].y)
|
||||
dY1 = np.abs(cell_BS.pin['opt_b1'].y - cell_BS.pin['opt_b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: dY2 = np.abs(cell_BS2.pin['b1'].y - cell_BS2.pin['b2'].y)
|
||||
dY2 = np.abs(cell_BS2.pin['opt_b1'].y - cell_BS2.pin['opt_b2'].y)
|
||||
# dX = np.abs(cell_BS.pin['a1'].x - cell_BS.pin['b1'].x)
|
||||
|
||||
BS1 = cell_BS.put('b1',-L_arm/2-R_bend*2-2.5,dY1/2,180)
|
||||
BS2 = cell_BS2.put('b2', L_arm/2+R_bend*2+2.5,dY2/2,0,flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS1 = cell_BS.put('b1',-L_arm/2-R_bend*2-2.5,dY1/2,180)
|
||||
BS1 = cell_BS.put('opt_b1',-L_arm/2-R_bend*2-2.5,dY1/2,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS2 = cell_BS2.put('b2', L_arm/2+R_bend*2+2.5,dY2/2,0,flip=0)
|
||||
BS2 = cell_BS2.put('opt_b2', L_arm/2+R_bend*2+2.5,dY2/2,0,flip=0)
|
||||
|
||||
pic = Route(width=w_wg,radius=R_bend,xs=xs_wg,adapt_width=True,adapt_xs=True)
|
||||
|
||||
@@ -197,53 +205,93 @@ class MZI:
|
||||
|
||||
# print("DEBUG - A")
|
||||
|
||||
if ('a2' in pin_in_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_in_name):
|
||||
if ('opt_a2' in pin_in_name):
|
||||
if (D_port==None):
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a2'])
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a2'])
|
||||
nd.strt(length=0.005,width=BS1.pin['opt_a2'].width,xs=self.xs_wg).put(BS1.pin['opt_a2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a1'])
|
||||
nd.strt(length=0.005,width=BS1.pin['opt_a2'].width,xs=self.xs_wg).put(BS1.pin['opt_a1'])
|
||||
|
||||
elif(isinstance(D_port,int) or isinstance(D_port,float)):
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a1'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a1'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['opt_a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['opt_a1'].y)),
|
||||
original_function=not sharp_patch).put(flip=1)
|
||||
nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a2'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a2'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['opt_a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['opt_a2'].y)),
|
||||
original_function=not sharp_patch).put(flip=0)
|
||||
nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
else:
|
||||
raise Exception("ERROR:: In <mxpic::functionalll::MZI>, <D_port> type error")
|
||||
else :
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
pin_out_name = []
|
||||
for str,Pin in cell_BS2.ic_pins():
|
||||
pin_out_name = pin_out_name+[str]
|
||||
|
||||
|
||||
if ('a2' in pin_out_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_out_name):
|
||||
if ('opt_a2' in pin_out_name):
|
||||
if (D_port==None):
|
||||
nd.Pin(name='b2',pin=BS2.pin['a1']).put()
|
||||
nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a2'])
|
||||
nd.Pin(name='b1',pin=BS2.pin['a2']).put()
|
||||
nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a2'])
|
||||
nd.strt(length=0.005,width=BS2.pin['opt_a2'].width,xs=self.xs_wg).put(BS2.pin['opt_a2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a1'])
|
||||
nd.strt(length=0.005,width=BS2.pin['opt_a2'].width,xs=self.xs_wg).put(BS2.pin['opt_a1'])
|
||||
|
||||
elif(isinstance(D_port,int) or isinstance(D_port,float)):
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a1'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a1'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['opt_a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['opt_a1'].y)),
|
||||
original_function=not sharp_patch).put(flip=0)
|
||||
nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a2'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a2'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['opt_a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['opt_a2'].y)),
|
||||
original_function=not sharp_patch).put(flip=1)
|
||||
nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
else:
|
||||
raise Exception("ERROR:: In <mxpic::functionalll::MZI>, <D_port> type error")
|
||||
|
||||
else :
|
||||
nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
|
||||
|
||||
@@ -277,10 +325,18 @@ class MZI:
|
||||
Ltp=self.Ltp
|
||||
).cell.put(0,-D_arm/2,0)
|
||||
|
||||
pic.sbend_p2p(pin1=BS1.pin['b1'],pin2=arm_upper.pin['a1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS1.pin['b2'],pin2=arm_down.pin['a1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS2.pin['b2'],pin2=arm_upper.pin['b1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS2.pin['b1'],pin2=arm_down.pin['b1'],arrow=False,original_function=not sharp_patch).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=BS1.pin['b1'],pin2=arm_upper.pin['a1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS1.pin['opt_b1'],pin2=arm_upper.pin['opt_a1'],arrow=False,original_function=not sharp_patch).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=BS1.pin['b2'],pin2=arm_down.pin['a1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS1.pin['opt_b2'],pin2=arm_down.pin['opt_a1'],arrow=False,original_function=not sharp_patch).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=BS2.pin['b2'],pin2=arm_upper.pin['b1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS2.pin['opt_b2'],pin2=arm_upper.pin['opt_b1'],arrow=False,original_function=not sharp_patch).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=BS2.pin['b1'],pin2=arm_down.pin['b1'],arrow=False,original_function=not sharp_patch).put()
|
||||
pic.sbend_p2p(pin1=BS2.pin['opt_b1'],pin2=arm_down.pin['opt_b1'],arrow=False,original_function=not sharp_patch).put()
|
||||
|
||||
|
||||
for str,Pin in arm_upper.ic_pins():
|
||||
@@ -296,7 +352,9 @@ class MZI:
|
||||
nd.put_stub()
|
||||
|
||||
self.cell = C
|
||||
self.L = np.abs(self.cell.pin['a1'].x-self.cell.pin['b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: self.L = np.abs(self.cell.pin['a1'].x-self.cell.pin['b1'].x)
|
||||
self.L = np.abs(self.cell.pin['opt_a1'].x-self.cell.pin['opt_b1'].x)
|
||||
|
||||
class MZI_NS:
|
||||
"""Nested-straight MZI composite with taperable arm widths.
|
||||
@@ -392,9 +450,13 @@ class MZI_NS:
|
||||
|
||||
pic_strip = Route(radius=R_bend,width=w_wg,xs=xs_wg)
|
||||
|
||||
_L_ = abs(BS.pin['a1'].x-BS.pin['b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _L_ = abs(BS.pin['a1'].x-BS.pin['b1'].x)
|
||||
_L_ = abs(BS.pin['opt_a1'].x-BS.pin['opt_b1'].x)
|
||||
|
||||
_W_ = abs(BS.pin['b1'].y-BS.pin['b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _W_ = abs(BS.pin['b1'].y-BS.pin['b2'].y)
|
||||
_W_ = abs(BS.pin['opt_b1'].y-BS.pin['opt_b2'].y)
|
||||
|
||||
|
||||
|
||||
@@ -403,10 +465,16 @@ class MZI_NS:
|
||||
via_h2m=via_h2m,
|
||||
isl=isl,
|
||||
L_ht=L_ht)
|
||||
PS_U = PS.cell.put('a1',-PS.L_arm/2,D_arm/2,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: PS_U = PS.cell.put('a1',-PS.L_arm/2,D_arm/2,0)
|
||||
PS_U = PS.cell.put('opt_a1',-PS.L_arm/2,D_arm/2,0)
|
||||
|
||||
BS1 = BS.put('b1',-R_bend*2-L_patch-PS.L_arm/2,_W_/2,180)
|
||||
BS2 = BS.put('b2', R_bend*2+L_patch+PS.L_arm/2,_W_/2,0,flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS1 = BS.put('b1',-R_bend*2-L_patch-PS.L_arm/2,_W_/2,180)
|
||||
BS1 = BS.put('opt_b1',-R_bend*2-L_patch-PS.L_arm/2,_W_/2,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS2 = BS.put('b2', R_bend*2+L_patch+PS.L_arm/2,_W_/2,0,flip=0)
|
||||
BS2 = BS.put('opt_b2', R_bend*2+L_patch+PS.L_arm/2,_W_/2,0,flip=0)
|
||||
|
||||
pic = Route(width=w_wg,radius=R_bend,xs=xs_wg,adapt_width=True,adapt_xs=True)
|
||||
|
||||
@@ -416,39 +484,73 @@ class MZI_NS:
|
||||
pin_in_name = pin_in_name+[str]
|
||||
# pin_in_name.append(str)
|
||||
|
||||
if ('a2' in pin_in_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_in_name):
|
||||
if ('opt_a2' in pin_in_name):
|
||||
if (D_port==None):
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
nd.Pin(name='b2',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
elif(isinstance(D_port,int) or isinstance(D_port,float)):
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a1'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a1'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['opt_a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['opt_a1'].y)),
|
||||
original_function=not sharp_patch).put(flip=1)
|
||||
nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a2'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a2'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['opt_a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['opt_a2'].y)),
|
||||
original_function=not sharp_patch).put(flip=0)
|
||||
nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a1'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a1'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['opt_a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['opt_a1'].y)),
|
||||
original_function=not sharp_patch).put(flip=0)
|
||||
nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a2'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a2'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['opt_a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['opt_a2'].y)),
|
||||
original_function=not sharp_patch).put(flip=1)
|
||||
nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
else:
|
||||
raise Exception("ERROR:: In <mxpic::functionalll::MZI>, <D_port> type error")
|
||||
else :
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
# print("SEGEMENT")
|
||||
|
||||
pic_strip.sbend_p2p(pin1=PS_U.pin['a1'],pin2=BS1.pin['b1'],Lstart=L_patch/4).put()
|
||||
pic_strip.sbend_p2p(pin1=PS_U.pin['b1'],pin2=BS2.pin['b2'],Lstart=L_patch/4).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.sbend_p2p(pin1=PS_U.pin['a1'],pin2=BS1.pin['b1'],Lstart=L_patch/4).put()
|
||||
pic_strip.sbend_p2p(pin1=PS_U.pin['opt_a1'],pin2=BS1.pin['opt_b1'],Lstart=L_patch/4).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.sbend_p2p(pin1=PS_U.pin['b1'],pin2=BS2.pin['b2'],Lstart=L_patch/4).put()
|
||||
pic_strip.sbend_p2p(pin1=PS_U.pin['opt_b1'],pin2=BS2.pin['opt_b2'],Lstart=L_patch/4).put()
|
||||
|
||||
if (dual_ht==False):
|
||||
w_ht_D = 0
|
||||
@@ -458,10 +560,16 @@ class MZI_NS:
|
||||
via_h2m=via_h2m,
|
||||
isl=isl,
|
||||
L_ht=L_ht)
|
||||
PS_D = PS.cell.put('a1',-PS.L_arm/2,-D_arm/2,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: PS_D = PS.cell.put('a1',-PS.L_arm/2,-D_arm/2,0)
|
||||
PS_D = PS.cell.put('opt_a1',-PS.L_arm/2,-D_arm/2,0)
|
||||
|
||||
pic_strip.sbend_p2p(pin1=PS_D.pin['a1'],pin2=BS1.pin['b2'],Lstart=L_patch/4).put()
|
||||
pic_strip.sbend_p2p(pin1=PS_D.pin['b1'],pin2=BS2.pin['b1'],Lstart=L_patch/4).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.sbend_p2p(pin1=PS_D.pin['a1'],pin2=BS1.pin['b2'],Lstart=L_patch/4).put()
|
||||
pic_strip.sbend_p2p(pin1=PS_D.pin['opt_a1'],pin2=BS1.pin['opt_b2'],Lstart=L_patch/4).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.sbend_p2p(pin1=PS_D.pin['b1'],pin2=BS2.pin['b1'],Lstart=L_patch/4).put()
|
||||
pic_strip.sbend_p2p(pin1=PS_D.pin['opt_b1'],pin2=BS2.pin['opt_b1'],Lstart=L_patch/4).put()
|
||||
|
||||
if (w_heater>0):
|
||||
nd.Pin(name='ep1',pin=PS_U.pin['ep1']).put()
|
||||
@@ -566,15 +674,27 @@ class MZI_NS_ubend:
|
||||
|
||||
pic = Route(radius=R_bend,width=w_wg,xs=xs_wg)
|
||||
|
||||
_L_ = abs(BS.pin['a1'].x-BS.pin['b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _L_ = abs(BS.pin['a1'].x-BS.pin['b1'].x)
|
||||
_L_ = abs(BS.pin['opt_a1'].x-BS.pin['opt_b1'].x)
|
||||
|
||||
_W_ = abs(BS.pin['b1'].y-BS.pin['b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _W_ = abs(BS.pin['b1'].y-BS.pin['b2'].y)
|
||||
_W_ = abs(BS.pin['opt_b1'].y-BS.pin['opt_b2'].y)
|
||||
|
||||
BS1 = BS.put('b1',-R_bend*2-L_patch/2,_W_/2,180)
|
||||
BS2 = BS.put('b2', R_bend*2+L_patch/2,_W_/2,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS1 = BS.put('b1',-R_bend*2-L_patch/2,_W_/2,180)
|
||||
BS1 = BS.put('opt_b1',-R_bend*2-L_patch/2,_W_/2,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS2 = BS.put('b2', R_bend*2+L_patch/2,_W_/2,0)
|
||||
BS2 = BS.put('opt_b2', R_bend*2+L_patch/2,_W_/2,0)
|
||||
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
""" Plcaing b2 pin """
|
||||
pin_in_name = []
|
||||
@@ -582,37 +702,75 @@ class MZI_NS_ubend:
|
||||
pin_in_name = pin_in_name+[str]
|
||||
# pin_in_name.append(str)
|
||||
|
||||
if ('a2' in pin_in_name):
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='b2',pin=BS2.pin['a2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_in_name):
|
||||
if ('opt_a2' in pin_in_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_a2'],type="optical:").put()
|
||||
|
||||
if (D_port==None):
|
||||
nd.Pin(name='b2',pin=BS2.pin['a1']).put()
|
||||
nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=xs_wg).put(BS2.pin['a2'])
|
||||
nd.Pin(name='b1',pin=BS2.pin['a2']).put()
|
||||
nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=xs_wg).put(BS2.pin['a1'])
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=xs_wg).put(BS1.pin['a2'])
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=xs_wg).put(BS1.pin['a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=xs_wg).put(BS2.pin['a2'])
|
||||
nd.strt(length=0.005,width=BS2.pin['opt_a2'].width,xs=xs_wg).put(BS2.pin['opt_a2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=xs_wg).put(BS2.pin['a1'])
|
||||
nd.strt(length=0.005,width=BS2.pin['opt_a2'].width,xs=xs_wg).put(BS2.pin['opt_a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=xs_wg).put(BS1.pin['a2'])
|
||||
nd.strt(length=0.005,width=BS1.pin['opt_a2'].width,xs=xs_wg).put(BS1.pin['opt_a2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=xs_wg).put(BS1.pin['a1'])
|
||||
nd.strt(length=0.005,width=BS1.pin['opt_a2'].width,xs=xs_wg).put(BS1.pin['opt_a1'])
|
||||
|
||||
elif(isinstance(D_port,int) or isinstance(D_port,float)):
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a1'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a1'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['opt_a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['opt_a1'].y)),
|
||||
original_function=not sharp_patch).put(flip=0)
|
||||
nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a2'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['a2'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS2.pin['opt_a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS2.pin['opt_a2'].y)),
|
||||
original_function=not sharp_patch).put(flip=1)
|
||||
nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a1'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a1'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['opt_a1'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['opt_a1'].y)),
|
||||
original_function=not sharp_patch).put(flip=1)
|
||||
nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a2'].y)),
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['a2'].y)),
|
||||
temp = pic.sbend_route(radius=R_bend,width=w_wg,pin=BS1.pin['opt_a2'],length1=L_patch/4,length2=L_patch/4,offset=abs(D_port/2-abs(BS1.pin['opt_a2'].y)),
|
||||
original_function=not sharp_patch).put(flip=0)
|
||||
nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
else:
|
||||
raise Exception("ERROR:: In <mxpic::functionalll::MZI>, <D_port> type error")
|
||||
@@ -621,9 +779,15 @@ class MZI_NS_ubend:
|
||||
L12=L12,L_tp=Ltp,w_heater=w_ht,
|
||||
via_h2m=via_h2m,
|
||||
isl=isl,
|
||||
L_ht=L_ht).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b1'].y+L_patch/4+R_bend,90)
|
||||
pic.bend_route_p2p(pin1=PS_L1.pin['a1'],pin2=BS1.pin['b1']).put()
|
||||
pic.bend_route_p2p(pin1=PS_L1.pin['b1'],pin2=BS2.pin['b2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: L_ht=L_ht).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b1'].y+L_patch/4+R_bend,90)
|
||||
L_ht=L_ht).cell.put('opt_a1',BS1.pin['opt_b1'].x+L_patch/4+R_bend,BS1.pin['opt_b1'].y+L_patch/4+R_bend,90)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.bend_route_p2p(pin1=PS_L1.pin['a1'],pin2=BS1.pin['b1']).put()
|
||||
pic.bend_route_p2p(pin1=PS_L1.pin['opt_a1'],pin2=BS1.pin['opt_b1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.bend_route_p2p(pin1=PS_L1.pin['b1'],pin2=BS2.pin['b2']).put()
|
||||
pic.bend_route_p2p(pin1=PS_L1.pin['opt_b1'],pin2=BS2.pin['opt_b2']).put()
|
||||
|
||||
if (dual_ht):
|
||||
w_ht_d=w_ht
|
||||
@@ -633,9 +797,15 @@ class MZI_NS_ubend:
|
||||
L12=L12,L_tp=Ltp,w_heater=w_ht_d,
|
||||
via_h2m=via_h2m,
|
||||
isl=isl,
|
||||
L_ht=L_ht).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
pic.bend_route_p2p(pin1=PS_L2.pin['a1'],pin2=BS1.pin['b2']).put()
|
||||
pic.bend_route_p2p(pin1=PS_L2.pin['b1'],pin2=BS2.pin['b1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: L_ht=L_ht).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
L_ht=L_ht).cell.put('opt_a1',BS1.pin['opt_b1'].x+L_patch/4+R_bend,BS1.pin['opt_b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.bend_route_p2p(pin1=PS_L2.pin['a1'],pin2=BS1.pin['b2']).put()
|
||||
pic.bend_route_p2p(pin1=PS_L2.pin['opt_a1'],pin2=BS1.pin['opt_b2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.bend_route_p2p(pin1=PS_L2.pin['b1'],pin2=BS2.pin['b1']).put()
|
||||
pic.bend_route_p2p(pin1=PS_L2.pin['opt_b1'],pin2=BS2.pin['opt_b1']).put()
|
||||
|
||||
if (w_ht>0):
|
||||
nd.Pin(name='ep1',pin=PS_L1.pin['ep1']).put()
|
||||
@@ -723,47 +893,97 @@ class MZI_2st_ubend:
|
||||
|
||||
pic_strip = Route(radius=R_bend,width=w_wg,xs=xs_wg)
|
||||
|
||||
_L1_ = abs(BS1.pin['a1'].x-BS1.pin['b1'].x)
|
||||
_L2_ = abs(BS2.pin['a1'].x-BS2.pin['b1'].x)
|
||||
_L3_ = abs(BS3.pin['a1'].x-BS3.pin['b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _L1_ = abs(BS1.pin['a1'].x-BS1.pin['b1'].x)
|
||||
_L1_ = abs(BS1.pin['opt_a1'].x-BS1.pin['opt_b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _L2_ = abs(BS2.pin['a1'].x-BS2.pin['b1'].x)
|
||||
_L2_ = abs(BS2.pin['opt_a1'].x-BS2.pin['opt_b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _L3_ = abs(BS3.pin['a1'].x-BS3.pin['b1'].x)
|
||||
_L3_ = abs(BS3.pin['opt_a1'].x-BS3.pin['opt_b1'].x)
|
||||
|
||||
_W1_ = abs(BS1.pin['b1'].y-BS1.pin['b2'].y)
|
||||
_W2_ = abs(BS2.pin['b1'].y-BS2.pin['b2'].y)
|
||||
_W3_ = abs(BS3.pin['b1'].y-BS3.pin['b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _W1_ = abs(BS1.pin['b1'].y-BS1.pin['b2'].y)
|
||||
_W1_ = abs(BS1.pin['opt_b1'].y-BS1.pin['opt_b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _W2_ = abs(BS2.pin['b1'].y-BS2.pin['b2'].y)
|
||||
_W2_ = abs(BS2.pin['opt_b1'].y-BS2.pin['opt_b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: _W3_ = abs(BS3.pin['b1'].y-BS3.pin['b2'].y)
|
||||
_W3_ = abs(BS3.pin['opt_b1'].y-BS3.pin['opt_b2'].y)
|
||||
|
||||
BSM = BS2.put('a1',-_L2_/2,_W2_/2,0)
|
||||
BS1 = BS1.put('b1',-_L2_/2-R_bend*4-L_patch,_W2_/2,180)
|
||||
BS2 = BS3.put('a1', _L2_/2+R_bend*4+L_patch,_W2_/2,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BSM = BS2.put('a1',-_L2_/2,_W2_/2,0)
|
||||
BSM = BS2.put('opt_a1',-_L2_/2,_W2_/2,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS1 = BS1.put('b1',-_L2_/2-R_bend*4-L_patch,_W2_/2,180)
|
||||
BS1 = BS1.put('opt_b1',-_L2_/2-R_bend*4-L_patch,_W2_/2,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS2 = BS3.put('a1', _L2_/2+R_bend*4+L_patch,_W2_/2,0)
|
||||
BS2 = BS3.put('opt_a1', _L2_/2+R_bend*4+L_patch,_W2_/2,0)
|
||||
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
|
||||
nd.Pin(name='b1',pin=BS2.pin['b1']).put()
|
||||
nd.Pin(name='b2',pin=BS2.pin['b2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['b1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_b1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['b2']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_b2'],type="optical:").put()
|
||||
|
||||
PS_L1 = PS_2st(xs_wg=xs_wg,w_wg=w_wg,w1=w1,w2=w2,L1=Ln1/2+L0,L2=L0,R_bend=R_bend,L_wg=0.25,
|
||||
via_h2m=via_h2m,isl=isl,
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b1'].y+L_patch/4+R_bend,90)
|
||||
pic_strip.bend_route_p2p(pin1=PS_L1.pin['a1'],pin2=BS1.pin['b1']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_L1.pin['b1'],pin2=BSM.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b1'].y+L_patch/4+R_bend,90)
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('opt_a1',BS1.pin['opt_b1'].x+L_patch/4+R_bend,BS1.pin['opt_b1'].y+L_patch/4+R_bend,90)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_L1.pin['a1'],pin2=BS1.pin['b1']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_L1.pin['opt_a1'],pin2=BS1.pin['opt_b1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_L1.pin['b1'],pin2=BSM.pin['a1']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_L1.pin['opt_b1'],pin2=BSM.pin['opt_a1']).put()
|
||||
|
||||
PS_L2 = PS_2st(xs_wg=xs_wg,w_wg=w_wg,w1=w2,w2=w1,L1=Ls1/2+L0,L2=L0,R_bend=R_bend,L_wg=0.25,
|
||||
via_h2m=via_h2m,isl=isl,
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
pic_strip.bend_route_p2p(pin1=PS_L2.pin['a1'],pin2=BS1.pin['b2']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_L2.pin['b1'],pin2=BSM.pin['a2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BS1.pin['b1'].x+L_patch/4+R_bend,BS1.pin['b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('opt_a1',BS1.pin['opt_b1'].x+L_patch/4+R_bend,BS1.pin['opt_b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_L2.pin['a1'],pin2=BS1.pin['b2']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_L2.pin['opt_a1'],pin2=BS1.pin['opt_b2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_L2.pin['b1'],pin2=BSM.pin['a2']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_L2.pin['opt_b1'],pin2=BSM.pin['opt_a2']).put()
|
||||
|
||||
PS_R1 = PS_2st(xs_wg=xs_wg,w_wg=w_wg,w1=w2,w2=w1,L1=Ln2/2+L0,L2=L0,R_bend=R_bend,L_wg=0.25,
|
||||
via_h2m=via_h2m,isl=isl,
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BSM.pin['b1'].x+L_patch/4+R_bend,BSM.pin['b1'].y+L_patch/4+R_bend,90)
|
||||
pic_strip.bend_route_p2p(pin1=PS_R1.pin['b1'],pin2=BS2.pin['a1']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_R1.pin['a1'],pin2=BSM.pin['b1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BSM.pin['b1'].x+L_patch/4+R_bend,BSM.pin['b1'].y+L_patch/4+R_bend,90)
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('opt_a1',BSM.pin['opt_b1'].x+L_patch/4+R_bend,BSM.pin['opt_b1'].y+L_patch/4+R_bend,90)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_R1.pin['b1'],pin2=BS2.pin['a1']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_R1.pin['opt_b1'],pin2=BS2.pin['opt_a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_R1.pin['a1'],pin2=BSM.pin['b1']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_R1.pin['opt_a1'],pin2=BSM.pin['opt_b1']).put()
|
||||
|
||||
PS_R2 = PS_2st(xs_wg=xs_wg,w_wg=w_wg,w1=w1,w2=w2,L1=Ls2/2+L0,L2=L0,R_bend=R_bend,L_wg=0.25,
|
||||
via_h2m=via_h2m,isl=isl,
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BSM.pin['b1'].x+L_patch/4+R_bend,BSM.pin['b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
pic_strip.bend_route_p2p(pin1=PS_R2.pin['b1'],pin2=BS2.pin['a2']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_R2.pin['a1'],pin2=BSM.pin['b2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: L12=L12,L_tp=Ltp,w_heater=0).cell.put('a1',BSM.pin['b1'].x+L_patch/4+R_bend,BSM.pin['b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
L12=L12,L_tp=Ltp,w_heater=0).cell.put('opt_a1',BSM.pin['opt_b1'].x+L_patch/4+R_bend,BSM.pin['opt_b2'].y-L_patch/4-R_bend,-90,flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_R2.pin['b1'],pin2=BS2.pin['a2']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_R2.pin['opt_b1'],pin2=BS2.pin['opt_a2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.bend_route_p2p(pin1=PS_R2.pin['a1'],pin2=BSM.pin['b2']).put()
|
||||
pic_strip.bend_route_p2p(pin1=PS_R2.pin['opt_a1'],pin2=BSM.pin['opt_b2']).put()
|
||||
|
||||
self.cell = C
|
||||
|
||||
@@ -841,28 +1061,56 @@ class MZI_Eubend:
|
||||
R90_eff = EUB_90.sz[0]
|
||||
R180_eff = EUB_180.sz[1]
|
||||
|
||||
BS1 = BS.put('b1',-R90_eff-R180_eff/2-L_patch/2,BS.pin['b1'].y,180)
|
||||
BS2 = BS.put('b1', R90_eff+R180_eff/2+L_patch/2,BS.pin['b1'].y,0,flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS1 = BS.put('b1',-R90_eff-R180_eff/2-L_patch/2,BS.pin['b1'].y,180)
|
||||
BS1 = BS.put('opt_b1',-R90_eff-R180_eff/2-L_patch/2,BS.pin['opt_b1'].y,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS2 = BS.put('b1', R90_eff+R180_eff/2+L_patch/2,BS.pin['b1'].y,0,flip=1)
|
||||
BS2 = BS.put('opt_b1', R90_eff+R180_eff/2+L_patch/2,BS.pin['opt_b1'].y,0,flip=1)
|
||||
|
||||
tl = nd.strt(length=L_patch/2,xs=xs_wg,width=BS1.pin['b1'].width).put(BS1.pin['b1'])
|
||||
EUB_90.cell.put('a1',tl.pin['b0'],flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: tl = nd.strt(length=L_patch/2,xs=xs_wg,width=BS1.pin['b1'].width).put(BS1.pin['b1'])
|
||||
tl = nd.strt(length=L_patch/2,xs=xs_wg,width=BS1.pin['opt_b1'].width).put(BS1.pin['opt_b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: EUB_90.cell.put('a1',tl.pin['b0'],flip=0)
|
||||
EUB_90.cell.put('opt_a1',tl.pin['b0'],flip=0)
|
||||
nd.strt(length=L_arm/2+dL_Amzi/2,xs=xs_wg,width=w_arm).put()
|
||||
tl = EUB_180.cell.put(flip=1)
|
||||
tr = nd.strt(length=abs(tl.pin['b1'].x-BS2.pin['b1'].x)-R90_eff,xs=xs_wg,width=BS2.pin['b1'].width).put(BS2.pin['b1'])
|
||||
tr = EUB_90.cell.put('a1',tr.pin['b0'],flip=1)
|
||||
nd.strt(length=abs(tr.pin['b1'].y - tl.pin['b1'].y),xs=xs_wg,width=w_arm).put(tr.pin['b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: tr = nd.strt(length=abs(tl.pin['b1'].x-BS2.pin['b1'].x)-R90_eff,xs=xs_wg,width=BS2.pin['b1'].width).put(BS2.pin['b1'])
|
||||
tr = nd.strt(length=abs(tl.pin['opt_b1'].x-BS2.pin['opt_b1'].x)-R90_eff,xs=xs_wg,width=BS2.pin['opt_b1'].width).put(BS2.pin['opt_b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: tr = EUB_90.cell.put('a1',tr.pin['b0'],flip=1)
|
||||
tr = EUB_90.cell.put('opt_a1',tr.pin['b0'],flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=abs(tr.pin['b1'].y - tl.pin['b1'].y),xs=xs_wg,width=w_arm).put(tr.pin['b1'])
|
||||
nd.strt(length=abs(tr.pin['opt_b1'].y - tl.pin['opt_b1'].y),xs=xs_wg,width=w_arm).put(tr.pin['opt_b1'])
|
||||
|
||||
tl = nd.strt(length=L_patch/2,xs=xs_wg,width=BS1.pin['b2'].width).put(BS1.pin['b2'])
|
||||
EUB_90.cell.put('a1',tl.pin['b0'],flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: tl = nd.strt(length=L_patch/2,xs=xs_wg,width=BS1.pin['b2'].width).put(BS1.pin['b2'])
|
||||
tl = nd.strt(length=L_patch/2,xs=xs_wg,width=BS1.pin['opt_b2'].width).put(BS1.pin['opt_b2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: EUB_90.cell.put('a1',tl.pin['b0'],flip=1)
|
||||
EUB_90.cell.put('opt_a1',tl.pin['b0'],flip=1)
|
||||
nd.strt(length=L_arm/2,xs=xs_wg,width=w_arm).put()
|
||||
tl = EUB_180.cell.put(flip=0)
|
||||
|
||||
tr = nd.strt(length=abs(tl.pin['b1'].x-BS2.pin['b2'].x)-R90_eff,xs=xs_wg,width=BS2.pin['b2'].width).put(BS2.pin['b2'])
|
||||
tr = EUB_90.cell.put('a1',tr.pin['b0'],flip=0)
|
||||
nd.strt(length=abs(tr.pin['b1'].y - tl.pin['b1'].y),xs=xs_wg,width=w_arm).put(tr.pin['b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: tr = nd.strt(length=abs(tl.pin['b1'].x-BS2.pin['b2'].x)-R90_eff,xs=xs_wg,width=BS2.pin['b2'].width).put(BS2.pin['b2'])
|
||||
tr = nd.strt(length=abs(tl.pin['opt_b1'].x-BS2.pin['opt_b2'].x)-R90_eff,xs=xs_wg,width=BS2.pin['opt_b2'].width).put(BS2.pin['opt_b2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: tr = EUB_90.cell.put('a1',tr.pin['b0'],flip=0)
|
||||
tr = EUB_90.cell.put('opt_a1',tr.pin['b0'],flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=abs(tr.pin['b1'].y - tl.pin['b1'].y),xs=xs_wg,width=w_arm).put(tr.pin['b1'])
|
||||
nd.strt(length=abs(tr.pin['opt_b1'].y - tl.pin['opt_b1'].y),xs=xs_wg,width=w_arm).put(tr.pin['opt_b1'])
|
||||
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
""" Plcaing b2 pin """
|
||||
pin_in_name = []
|
||||
@@ -870,9 +1118,15 @@ class MZI_Eubend:
|
||||
pin_in_name = pin_in_name+[str]
|
||||
# pin_in_name.append(str)
|
||||
|
||||
if ('a2' in pin_in_name):
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='b2',pin=BS2.pin['a2']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_in_name):
|
||||
if ('opt_a2' in pin_in_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_a2'],type="optical:").put()
|
||||
|
||||
|
||||
self.cell = C
|
||||
@@ -1081,11 +1335,19 @@ class MZI_Butterfly:
|
||||
|
||||
pic_strip = Route(radius=self.R_bend,width=self.w_wg,width2_mm=self.w_arm,sharp_patch=self.sharp_patch,
|
||||
xs=self.xs_wg)
|
||||
dY_BS1 = abs(self.BS.pin['b1'].y - self.BS.pin['b2'].y)
|
||||
BS1 = self.BS.put('b1',-self.R_bend-self.L_inner/2,dY_BS1/2,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: dY_BS1 = abs(self.BS.pin['b1'].y - self.BS.pin['b2'].y)
|
||||
dY_BS1 = abs(self.BS.pin['opt_b1'].y - self.BS.pin['opt_b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS1 = self.BS.put('b1',-self.R_bend-self.L_inner/2,dY_BS1/2,180)
|
||||
BS1 = self.BS.put('opt_b1',-self.R_bend-self.L_inner/2,dY_BS1/2,180)
|
||||
|
||||
dY_BS2 = abs(self.BS2.pin['b1'].y - self.BS2.pin['b2'].y)
|
||||
BS2 = self.BS2.put('b2',self.R_bend+self.L_inner/2,dY_BS2/2,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: dY_BS2 = abs(self.BS2.pin['b1'].y - self.BS2.pin['b2'].y)
|
||||
dY_BS2 = abs(self.BS2.pin['opt_b1'].y - self.BS2.pin['opt_b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: BS2 = self.BS2.put('b2',self.R_bend+self.L_inner/2,dY_BS2/2,0)
|
||||
BS2 = self.BS2.put('opt_b2',self.R_bend+self.L_inner/2,dY_BS2/2,0)
|
||||
|
||||
# print("BS1=%.3f BS2=%.3f" %(dY_BS1,dY_BS2))
|
||||
|
||||
@@ -1093,13 +1355,23 @@ class MZI_Butterfly:
|
||||
HT_U = waveguide(w_heater=self.w_heater,L_wg=LU,L_heater=LU,
|
||||
w_wg=self.w_arm,Ltp=self.Ltp,w_port=self.w_wg,
|
||||
isl=self.isl,w_metal=self.w_metal,
|
||||
via_h2m=self.via_h2m).cell.put('a1',-LU/2,dY_BS1/2+self.R_bend*4+self.L_patch,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: via_h2m=self.via_h2m).cell.put('a1',-LU/2,dY_BS1/2+self.R_bend*4+self.L_patch,0)
|
||||
via_h2m=self.via_h2m).cell.put('opt_a1',-LU/2,dY_BS1/2+self.R_bend*4+self.L_patch,0)
|
||||
|
||||
pic_strip.ubend_route(pin=BS1.pin['b1'],length=self.L_patch/2,offset=self.R_bend*2).put()
|
||||
pic_strip.ubend_p2p(pin2=HT_U.pin['a1'],length=self.L_patch/2).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_route(pin=BS1.pin['b1'],length=self.L_patch/2,offset=self.R_bend*2).put()
|
||||
pic_strip.ubend_route(pin=BS1.pin['opt_b1'],length=self.L_patch/2,offset=self.R_bend*2).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_p2p(pin2=HT_U.pin['a1'],length=self.L_patch/2).put()
|
||||
pic_strip.ubend_p2p(pin2=HT_U.pin['opt_a1'],length=self.L_patch/2).put()
|
||||
|
||||
pic_strip.ubend_route(pin=BS2.pin['b2'],length=self.L_patch/2,offset=self.R_bend*2).put(flip=1)
|
||||
pic_strip.ubend_p2p(pin2=HT_U.pin['b1'],length=self.L_patch/2).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_route(pin=BS2.pin['b2'],length=self.L_patch/2,offset=self.R_bend*2).put(flip=1)
|
||||
pic_strip.ubend_route(pin=BS2.pin['opt_b2'],length=self.L_patch/2,offset=self.R_bend*2).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_p2p(pin2=HT_U.pin['b1'],length=self.L_patch/2).put()
|
||||
pic_strip.ubend_p2p(pin2=HT_U.pin['opt_b1'],length=self.L_patch/2).put()
|
||||
|
||||
if (self.w_heater>0):
|
||||
nd.Pin(name="ep1",pin=HT_U.pin['ep1']).put()
|
||||
@@ -1113,17 +1385,27 @@ class MZI_Butterfly:
|
||||
HT_D = waveguide(w_heater=w_ht_d,L_wg=LD,L_heater=LD,
|
||||
w_wg=self.w_arm,Ltp=self.Ltp,w_port=self.w_wg,
|
||||
isl=self.isl,
|
||||
via_h2m=self.via_h2m).cell.put('a1',-LD/2,-dY_BS1/2-self.R_bend*4-self.L_patch,0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: via_h2m=self.via_h2m).cell.put('a1',-LD/2,-dY_BS1/2-self.R_bend*4-self.L_patch,0)
|
||||
via_h2m=self.via_h2m).cell.put('opt_a1',-LD/2,-dY_BS1/2-self.R_bend*4-self.L_patch,0)
|
||||
|
||||
if (w_ht_d>0 and self.dual_ht):
|
||||
nd.Pin(name="ep2",pin=HT_D.pin['ep1']).put()
|
||||
nd.Pin(name="en2",pin=HT_D.pin['en1']).put()
|
||||
|
||||
pic_strip.ubend_route(pin=BS1.pin['b2'],length=self.L_patch/2,offset=self.R_bend*2).put(flip=1)
|
||||
pic_strip.ubend_p2p(pin2=HT_D.pin['a1'],length=self.L_patch/2).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_route(pin=BS1.pin['b2'],length=self.L_patch/2,offset=self.R_bend*2).put(flip=1)
|
||||
pic_strip.ubend_route(pin=BS1.pin['opt_b2'],length=self.L_patch/2,offset=self.R_bend*2).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_p2p(pin2=HT_D.pin['a1'],length=self.L_patch/2).put()
|
||||
pic_strip.ubend_p2p(pin2=HT_D.pin['opt_a1'],length=self.L_patch/2).put()
|
||||
|
||||
pic_strip.ubend_route(pin=BS2.pin['b1'],length=self.L_patch/2,offset=self.R_bend*2).put()
|
||||
pic_strip.ubend_p2p(pin2=HT_D.pin['b1'],length=self.L_patch/2).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_route(pin=BS2.pin['b1'],length=self.L_patch/2,offset=self.R_bend*2).put()
|
||||
pic_strip.ubend_route(pin=BS2.pin['opt_b1'],length=self.L_patch/2,offset=self.R_bend*2).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic_strip.ubend_p2p(pin2=HT_D.pin['b1'],length=self.L_patch/2).put()
|
||||
pic_strip.ubend_p2p(pin2=HT_D.pin['opt_b1'],length=self.L_patch/2).put()
|
||||
|
||||
|
||||
""" Placing Input and Output ports """
|
||||
@@ -1132,53 +1414,101 @@ class MZI_Butterfly:
|
||||
for str,Pin in self.BS.ic_pins():
|
||||
pin_in_name = pin_in_name+[str]
|
||||
|
||||
if ('a2' in pin_in_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_in_name):
|
||||
if ('opt_a2' in pin_in_name):
|
||||
if (self.D_port==None):
|
||||
nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a2'])
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=BS1.pin['a2']).put()
|
||||
nd.Pin(name='opt_a2',pin=BS1.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a2'])
|
||||
nd.strt(length=0.005,width=BS1.pin['opt_a2'].width,xs=self.xs_wg).put(BS1.pin['opt_a2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS1.pin['a2'].width,xs=self.xs_wg).put(BS1.pin['a1'])
|
||||
nd.strt(length=0.005,width=BS1.pin['opt_a2'].width,xs=self.xs_wg).put(BS1.pin['opt_a1'])
|
||||
|
||||
elif(isinstance(self.D_port,int) or isinstance(self.D_port,float)):
|
||||
temp = pic_strip.sbend_route(pin=BS1.pin['a1'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
offset=abs(self.D_port/2-abs(BS1.pin['a1'].y))).put(flip=1)
|
||||
nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic_strip.sbend_route(pin=BS1.pin['a1'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
temp = pic_strip.sbend_route(pin=BS1.pin['opt_a1'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: offset=abs(self.D_port/2-abs(BS1.pin['a1'].y))).put(flip=1)
|
||||
offset=abs(self.D_port/2-abs(BS1.pin['opt_a1'].y))).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic_strip.sbend_route(pin=BS1.pin['a2'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
offset=abs(self.D_port/2-abs(BS1.pin['a2'].y))).put(flip=0)
|
||||
nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic_strip.sbend_route(pin=BS1.pin['a2'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
temp = pic_strip.sbend_route(pin=BS1.pin['opt_a2'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: offset=abs(self.D_port/2-abs(BS1.pin['a2'].y))).put(flip=0)
|
||||
offset=abs(self.D_port/2-abs(BS1.pin['opt_a2'].y))).put(flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_a2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
else:
|
||||
raise Exception("ERROR:: In <mxpic::functionalll::MZI>, <D_port> type error")
|
||||
else :
|
||||
nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=BS1.pin['a1']).put()
|
||||
nd.Pin(name='opt_a1',pin=BS1.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
pin_out_name = []
|
||||
|
||||
for str,Pin in self.BS2.ic_pins():
|
||||
pin_out_name = pin_out_name+[str]
|
||||
|
||||
if ('a2' in pin_out_name):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ('a2' in pin_out_name):
|
||||
if ('opt_a2' in pin_out_name):
|
||||
if (self.D_port==None):
|
||||
nd.Pin(name='b2',pin=BS2.pin['a1']).put()
|
||||
nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a2'])
|
||||
nd.Pin(name='b1',pin=BS2.pin['a2']).put()
|
||||
nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b2',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a2'])
|
||||
nd.strt(length=0.005,width=BS2.pin['opt_a2'].width,xs=self.xs_wg).put(BS2.pin['opt_a2'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a2']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a2'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.strt(length=0.005,width=BS2.pin['a2'].width,xs=self.xs_wg).put(BS2.pin['a1'])
|
||||
nd.strt(length=0.005,width=BS2.pin['opt_a2'].width,xs=self.xs_wg).put(BS2.pin['opt_a1'])
|
||||
|
||||
elif(isinstance(self.D_port,int) or isinstance(self.D_port,float)):
|
||||
|
||||
temp = pic_strip.sbend_route(pin=BS2.pin['a2'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
offset=abs(self.D_port/2-abs(BS2.pin['a1'].y))).put(flip=0)
|
||||
nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic_strip.sbend_route(pin=BS2.pin['a2'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
temp = pic_strip.sbend_route(pin=BS2.pin['opt_a2'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: offset=abs(self.D_port/2-abs(BS2.pin['a1'].y))).put(flip=0)
|
||||
offset=abs(self.D_port/2-abs(BS2.pin['opt_a1'].y))).put(flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b1',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
|
||||
temp = pic_strip.sbend_route(pin=BS2.pin['a1'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
offset=abs(self.D_port/2-abs(BS2.pin['a2'].y))).put(flip=1)
|
||||
nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = pic_strip.sbend_route(pin=BS2.pin['a1'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
temp = pic_strip.sbend_route(pin=BS2.pin['opt_a1'],length1=self.L_patch/4,length2=self.L_patch/4,
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: offset=abs(self.D_port/2-abs(BS2.pin['a2'].y))).put(flip=1)
|
||||
offset=abs(self.D_port/2-abs(BS2.pin['opt_a2'].y))).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b2',pin=temp.pin['b0'].move(-0.05,0,0)).put()
|
||||
nd.Pin(name='opt_b2',pin=temp.pin['b0'].move(-0.05,0,0),type="optical:").put()
|
||||
else:
|
||||
raise Exception("ERROR:: In <mxpic::functionalll::MZI>, <D_port> type error")
|
||||
|
||||
else :
|
||||
nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=BS2.pin['a1']).put()
|
||||
nd.Pin(name='opt_b1',pin=BS2.pin['opt_a1'],type="optical:").put()
|
||||
|
||||
|
||||
return C
|
||||
@@ -1204,29 +1534,51 @@ class MZI_Butterfly:
|
||||
GC2Instr = gc_cell.put(pin_gc,dXgc2gc,0,0)
|
||||
|
||||
""" Placing GC inputs """
|
||||
if ("a2" in self.cell.pin):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ("a2" in self.cell.pin):
|
||||
if ("opt_a2" in self.cell.pin):
|
||||
GC3Instr = gc_cell.put(pin_gc,0,dYgc2gc,180)
|
||||
|
||||
if ("b2" in self.cell.pin):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ("b2" in self.cell.pin):
|
||||
if ("opt_b2" in self.cell.pin):
|
||||
GC4Instr = gc_cell.put(pin_gc,dXgc2gc,dYgc2gc,0)
|
||||
dYcell = abs(self.cell.pin['b1'].y - self.cell.pin['b2'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: dYcell = abs(self.cell.pin['b1'].y - self.cell.pin['b2'].y)
|
||||
dYcell = abs(self.cell.pin['opt_b1'].y - self.cell.pin['opt_b2'].y)
|
||||
dYoffset = -(dYcell - dYgc2gc)/2
|
||||
else:
|
||||
dYoffset = 0
|
||||
|
||||
dXcell = abs(self.cell.pin['a1'].x - self.cell.pin['b1'].x)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: dXcell = abs(self.cell.pin['a1'].x - self.cell.pin['b1'].x)
|
||||
dXcell = abs(self.cell.pin['opt_a1'].x - self.cell.pin['opt_b1'].x)
|
||||
dXoffset = -(dXcell - dXgc2gc)/2
|
||||
cellInstr = self.cell.put('a1',dXoffset,dYoffset,0,flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: cellInstr = self.cell.put('a1',dXoffset,dYoffset,0,flip=1)
|
||||
cellInstr = self.cell.put('opt_a1',dXoffset,dYoffset,0,flip=1)
|
||||
|
||||
pic = Route(xs=self.xs_wg,width=w_wg,radius=R_bend,sharp_patch=self.sharp_patch)
|
||||
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['a1'],pin2=GC1Instr.pin[pin_gc]).put()
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['b1'],pin2=GC2Instr.pin[pin_gc]).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=cellInstr.pin['a1'],pin2=GC1Instr.pin[pin_gc]).put()
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['opt_a1'],pin2=GC1Instr.pin[pin_gc]).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=cellInstr.pin['b1'],pin2=GC2Instr.pin[pin_gc]).put()
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['opt_b1'],pin2=GC2Instr.pin[pin_gc]).put()
|
||||
|
||||
if ("a2" in cellInstr.pin):
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['a2'],pin2=GC3Instr.pin[pin_gc]).put()
|
||||
if ("b2" in cellInstr.pin):
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['b2'],pin2=GC4Instr.pin[pin_gc]).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ("a2" in cellInstr.pin):
|
||||
if ("opt_a2" in cellInstr.pin):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=cellInstr.pin['a2'],pin2=GC3Instr.pin[pin_gc]).put()
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['opt_a2'],pin2=GC3Instr.pin[pin_gc]).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if ("b2" in cellInstr.pin):
|
||||
if ("opt_b2" in cellInstr.pin):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: pic.sbend_p2p(pin1=cellInstr.pin['b2'],pin2=GC4Instr.pin[pin_gc]).put()
|
||||
pic.sbend_p2p(pin1=cellInstr.pin['opt_b2'],pin2=GC4Instr.pin[pin_gc]).put()
|
||||
|
||||
return C
|
||||
|
||||
|
||||
Reference in New Issue
Block a user