optical pins name revised. Pin type added

This commit is contained in:
=
2026-06-07 22:56:33 +08:00
parent a4ac88f002
commit 8462c3397f
262 changed files with 3251 additions and 1134 deletions
+144 -48
View File
@@ -150,8 +150,12 @@ class Heater_NDoped():
)
## Add pin
nd.Pin(name='a0').put(wg_input.pin['b0'])
nd.Pin(name='a1', width=self.w_wg).put(wg_input.pin['b0'])
nd.Pin(name='b1', width=self.w_wg).put(wg_output.pin['b0'])
## revised in 2026.06.07 by Qin Yue
# legacy: nd.Pin(name='a1', width=self.w_wg).put(wg_input.pin['b0'])
nd.Pin(name='opt_a1', width=self.w_wg,type="optical:").put(wg_input.pin['b0'])
## revised in 2026.06.07 by Qin Yue
# legacy: nd.Pin(name='b1', width=self.w_wg).put(wg_output.pin['b0'])
nd.Pin(name='opt_b1', width=self.w_wg,type="optical:").put(wg_output.pin['b0'])
nd.Pin(name='ep1', width=abs(metal_l.pin['a0'].y-metal_l.pin['b0'].y)).put(
metal_l.pin['a0'].x, (metal_l.pin['a0'].y+metal_l.pin['b0'].y)/2, 180
)
@@ -169,40 +173,64 @@ class Heater_NDoped():
stripe = Route(radius=5, width=gc.w_wg, xs='strip')
gc_input = gc.cell.put('g1',0,gc_offset,180)
gc_output = gc.cell.put('g1',gc2gc_length,gc_offset,0)
mmi_input = mmi.cell.put('a1',20,0,0)
mmi_output = mmi.cell.put('a1', gc_output.pin['g1'].x-20,0, 180)
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_input = mmi.cell.put('a1',20,0,0)
mmi_input = mmi.cell.put('opt_a1',20,0,0)
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_output = mmi.cell.put('a1', gc_output.pin['g1'].x-20,0, 180)
mmi_output = mmi.cell.put('opt_a1', gc_output.pin['g1'].x-20,0, 180)
stripe.sbend_p2p(
pin1=gc_input.pin['g1'],
pin2=mmi_input.pin['a1'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin2=mmi_input.pin['a1'],
pin2=mmi_input.pin['opt_a1'],
Lstart=5,
arrow=False
).put()
stripe.sbend_p2p(
pin1=gc_output.pin['g1'],
pin2=mmi_output.pin['a1'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin2=mmi_output.pin['a1'],
pin2=mmi_output.pin['opt_a1'],
Lstart=5,
arrow=False
).put()
# Connect upper arm
ps = self.cell.put('a1',mmi_input.pin['b1'].x+40,mzi_offset)
## revised in 2026.06.07 by Qin Yue
# legacy: ps = self.cell.put('a1',mmi_input.pin['b1'].x+40,mzi_offset)
ps = self.cell.put('opt_a1',mmi_input.pin['opt_b1'].x+40,mzi_offset)
stripe.sbend_route_p2p(
pin1=mmi_input.pin['b1'],
pin2=ps.pin['a1'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=mmi_input.pin['b1'],
pin1=mmi_input.pin['opt_b1'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin2=ps.pin['a1'],
pin2=ps.pin['opt_a1'],
arrow=False
).put()
stripe.sbend_route_p2p(
pin1=mmi_output.pin['b2'],
pin2=ps.pin['b1'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=mmi_output.pin['b2'],
pin1=mmi_output.pin['opt_b2'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin2=ps.pin['b1'],
pin2=ps.pin['opt_b1'],
arrow=False
).put()
# Connect lower arm
stripe.strt_p2p(
pin1=mmi_input.pin['b2'],
pin2=mmi_output.pin['b1'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=mmi_input.pin['b2'],
pin1=mmi_input.pin['opt_b2'],
## revised in 2026.06.07 by Qin Yue
# legacy: pin2=mmi_output.pin['b1'],
pin2=mmi_output.pin['opt_b1'],
arrow=False
).put()
## Put CT heater
ps_ct = self.cell.put('a1',ps.pin['a1'].x,ps.pin['a1'].y+ct_pitch,0)
## revised in 2026.06.07 by Qin Yue
# legacy: ps_ct = self.cell.put('a1',ps.pin['a1'].x,ps.pin['a1'].y+ct_pitch,0)
ps_ct = self.cell.put('opt_a1',ps.pin['opt_a1'].x,ps.pin['opt_a1'].y+ct_pitch,0)
## Put pins
nd.Pin(name="ep1", pin=ps.pin['ep1']).put()
nd.Pin(name="en1", pin=ps.pin['en1']).put()
@@ -306,9 +334,15 @@ class PS_PIN() :
nd.add_layer2xsection(xsection='slab2strip_pin', layer='STRIP_CLD', leftedge=(0.5,self.w_slab*2), rightedge=(-0.5,-self.w_slab*2), overwrite=True)
taper_strip2slab = taper_xs2xs(xs_1='strip',xs_2='slab2strip_pin',L_taper=10,w_1=self.w_wg,w_2=self.w_wg_slab, L_port=0.2)
taper_slab2strip = taper_xs2xs(xs_1='slab2strip_pin',xs_2='strip',L_taper=10,w_1=self.w_wg_slab, w_2=self.w_wg,L_port=0.2)
taper_input = taper_strip2slab.cell.put('a1',0,0,0)
wg_ps = slab.strt(length=self.l_wg,arrow=False).put(taper_input.pin['b1'])
taper_output = taper_slab2strip.cell.put('a1',wg_ps.pin['b0'])
## revised in 2026.06.07 by Qin Yue
# legacy: taper_input = taper_strip2slab.cell.put('a1',0,0,0)
taper_input = taper_strip2slab.cell.put('opt_a1',0,0,0)
## revised in 2026.06.07 by Qin Yue
# legacy: wg_ps = slab.strt(length=self.l_wg,arrow=False).put(taper_input.pin['b1'])
wg_ps = slab.strt(length=self.l_wg,arrow=False).put(taper_input.pin['opt_b1'])
## revised in 2026.06.07 by Qin Yue
# legacy: taper_output = taper_slab2strip.cell.put('a1',wg_ps.pin['b0'])
taper_output = taper_slab2strip.cell.put('opt_a1',wg_ps.pin['b0'])
''' Add doping area near the waveguide '''
l_edge = 1
@@ -317,10 +351,18 @@ class PS_PIN() :
p_layer_temp = self.p_layer_list[_index_]
n_layer_temp = self.n_layer_list[_index_]
doping_polygon = [
(taper_input.pin['b1'].x+l_edge, self.w_wg_slab/2+d2wg_temp),
(taper_output.pin['a1'].x-l_edge, self.w_wg_slab/2+d2wg_temp),
(taper_output.pin['a1'].x-l_edge, self.w_plus_max),
(taper_input.pin['b1'].x+l_edge, self.w_plus_max)
## revised in 2026.06.07 by Qin Yue
# legacy: (taper_input.pin['b1'].x+l_edge, self.w_wg_slab/2+d2wg_temp),
(taper_input.pin['opt_b1'].x+l_edge, self.w_wg_slab/2+d2wg_temp),
## revised in 2026.06.07 by Qin Yue
# legacy: (taper_output.pin['a1'].x-l_edge, self.w_wg_slab/2+d2wg_temp),
(taper_output.pin['opt_a1'].x-l_edge, self.w_wg_slab/2+d2wg_temp),
## revised in 2026.06.07 by Qin Yue
# legacy: (taper_output.pin['a1'].x-l_edge, self.w_plus_max),
(taper_output.pin['opt_a1'].x-l_edge, self.w_plus_max),
## revised in 2026.06.07 by Qin Yue
# legacy: (taper_input.pin['b1'].x+l_edge, self.w_plus_max)
(taper_input.pin['opt_b1'].x+l_edge, self.w_plus_max)
]
nd.Polygon(points=doping_polygon, layer=p_layer_temp).put(0,0)
nd.Polygon(points=doping_polygon, layer=n_layer_temp).put(0,0,flop=True)
@@ -332,15 +374,23 @@ class PS_PIN() :
xs_l1="sa", xs_l2="metal", show_pins=False
)
vias_p = vias.cell.put(
taper_input.pin['b1'].x+self.l_wg/2, (self.w_plus_max+self.d2wg_list[-1]+self.w_wg_slab/2)/2
## revised in 2026.06.07 by Qin Yue
# legacy: taper_input.pin['b1'].x+self.l_wg/2, (self.w_plus_max+self.d2wg_list[-1]+self.w_wg_slab/2)/2
taper_input.pin['opt_b1'].x+self.l_wg/2, (self.w_plus_max+self.d2wg_list[-1]+self.w_wg_slab/2)/2
)
vias_n = vias.cell.put(
taper_input.pin['b1'].x+self.l_wg/2, -(self.w_plus_max+self.d2wg_list[-1]+self.w_wg_slab/2)/2
## revised in 2026.06.07 by Qin Yue
# legacy: taper_input.pin['b1'].x+self.l_wg/2, -(self.w_plus_max+self.d2wg_list[-1]+self.w_wg_slab/2)/2
taper_input.pin['opt_b1'].x+self.l_wg/2, -(self.w_plus_max+self.d2wg_list[-1]+self.w_wg_slab/2)/2
)
''' Add Pins '''
nd.Pin(name='a1',width=self.w_wg).put(taper_input.pin['a1'])
nd.Pin(name='b1',width=self.w_wg).put(taper_output.pin['b1'])
## revised in 2026.06.07 by Qin Yue
# legacy: nd.Pin(name='a1',width=self.w_wg).put(taper_input.pin['a1'])
nd.Pin(name='opt_a1',width=self.w_wg,type="optical:").put(taper_input.pin['opt_a1'])
## revised in 2026.06.07 by Qin Yue
# legacy: nd.Pin(name='b1',width=self.w_wg).put(taper_output.pin['b1'])
nd.Pin(name='opt_b1',width=self.w_wg,type="optical:").put(taper_output.pin['opt_b1'])
nd.Pin(name="ep1", width=self.w_plus_max-(self.d2wg_list[-1]+self.w_wg_slab/2)-0.2*2).put(vias_p.pin['a0'])
nd.Pin(name="en1", width=self.w_plus_max-(self.d2wg_list[-1]+self.w_wg_slab/2)-0.2*2).put(vias_n.pin['a0'])
# nd.put_stub()
@@ -351,52 +401,90 @@ class PS_PIN() :
Generating a Mach-Zehnder Interferometer for testing the PIN phase shifter.
'''
with nd.Cell(name=self.cell_name+"_MZI", instantiate=False) as ICell :
mmi_input = mmi.cell.put('a1',0,0,0)
pin2test = self.cell.put('a1', mmi_input.pin['b1'].move(60,100,0))
mmi_bottom = mmi.cell.put('a1', pin2test.pin['b1'].x+10, mmi_input.pin['b2'].y, 0)
mmi_up = mmi.cell.put('a1', pin2test.pin['b1'].move(10,0,0))
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_input = mmi.cell.put('a1',0,0,0)
mmi_input = mmi.cell.put('opt_a1',0,0,0)
## revised in 2026.06.07 by Qin Yue
# legacy: pin2test = self.cell.put('a1', mmi_input.pin['b1'].move(60,100,0))
pin2test = self.cell.put('opt_a1', mmi_input.pin['opt_b1'].move(60,100,0))
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_bottom = mmi.cell.put('a1', pin2test.pin['b1'].x+10, mmi_input.pin['b2'].y, 0)
mmi_bottom = mmi.cell.put('opt_a1', pin2test.pin['opt_b1'].x+10, mmi_input.pin['opt_b2'].y, 0)
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_up = mmi.cell.put('a1', pin2test.pin['b1'].move(10,0,0))
mmi_up = mmi.cell.put('opt_a1', pin2test.pin['opt_b1'].move(10,0,0))
mmi_middle = mmi.cell.put(
'a1',
mmi_bottom.pin['b1'].x+mmi.length+25,
mmi_up.pin['b2'].y/2+mmi_bottom.pin['b1'].y/2,
## revised in 2026.06.07 by Qin Yue
# legacy: 'a1',
'opt_a1',
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_bottom.pin['b1'].x+mmi.length+25,
mmi_bottom.pin['opt_b1'].x+mmi.length+25,
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_up.pin['b2'].y/2+mmi_bottom.pin['b1'].y/2,
mmi_up.pin['opt_b2'].y/2+mmi_bottom.pin['opt_b1'].y/2,
180
)
''' Wg routing '''
strip = Route(radius=10, width=self.w_wg, xs='strip')
strip.strt_p2p(pin1=mmi_input.pin['b2'],pin2=mmi_bottom.pin['a1'],arrow=False).put()
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt_p2p(pin1=mmi_input.pin['b2'],pin2=mmi_bottom.pin['a1'],arrow=False).put()
strip.strt_p2p(pin1=mmi_input.pin['opt_b2'],pin2=mmi_bottom.pin['opt_a1'],arrow=False).put()
# strip.sbend_p2p(pin1=mmi_input.pin['b1'],pin2=pin2test.pin['a1'],Lstart=1,arrow=False).put()
strip.sbend_p2p(
pin1=mmi_input.pin['b1'],pin2=nd.Pin().put(mmi_input.pin['b1'].x+11,pin2test.pin['a1'].y,180),
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=mmi_input.pin['b1'],pin2=nd.Pin().put(mmi_input.pin['b1'].x+11,pin2test.pin['a1'].y,180),
pin1=mmi_input.pin['opt_b1'],pin2=nd.Pin().put(mmi_input.pin['opt_b1'].x+11,pin2test.pin['opt_a1'].y,180),
radius=5, Lstart=0.5, arrow=False
).put()
strip.sbend_p2p(
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+22,mmi_input.pin['b1'].y+1,180),
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+22,mmi_input.pin['b1'].y+1,180),
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['opt_b1'].x+22,mmi_input.pin['opt_b1'].y+1,180),
radius=5, Lstart=0.5, arrow=False
).put()
strip.sbend_p2p(
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+33,pin2test.pin['a1'].y,180),
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+33,pin2test.pin['a1'].y,180),
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['opt_b1'].x+33,pin2test.pin['opt_a1'].y,180),
radius=5, Lstart=0.5, arrow=False
).put()
strip.sbend_p2p(
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+44,mmi_input.pin['b1'].y+1,180),
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+44,mmi_input.pin['b1'].y+1,180),
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['opt_b1'].x+44,mmi_input.pin['opt_b1'].y+1,180),
radius=5, Lstart=0.5, arrow=False
).put()
strip.sbend_p2p(
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+55,pin2test.pin['a1'].y,180),
## revised in 2026.06.07 by Qin Yue
# legacy: pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['b1'].x+55,pin2test.pin['a1'].y,180),
pin1=nd.Pin().put(),pin2=nd.Pin().put(mmi_input.pin['opt_b1'].x+55,pin2test.pin['opt_a1'].y,180),
radius=5, Lstart=0.5, arrow=False
).put()
strip.strt_p2p(pin1=nd.Pin().put(),pin2=pin2test.pin['a1'],arrow=False).put()
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt_p2p(pin1=nd.Pin().put(),pin2=pin2test.pin['a1'],arrow=False).put()
strip.strt_p2p(pin1=nd.Pin().put(),pin2=pin2test.pin['opt_a1'],arrow=False).put()
# strip.sbend(radius=5,offset=-abs(pin2test.pin['a1'].y-mmi_input.pin['b1'].y),arrow=False).put()
strip.strt_p2p(pin1=mmi_up.pin['a1'],pin2=pin2test.pin['b1'],arrow=False).put()
strip.sbend_p2p(pin1=mmi_up.pin['b2'],pin2=mmi_middle.pin['b2'],Lstart=0.5,radius=10,arrow=False).put()
strip.sbend_p2p(pin1=mmi_bottom.pin['b1'],pin2=mmi_middle.pin['b1'],Lstart=2.5,radius=10,arrow=False).put()
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt_p2p(pin1=mmi_up.pin['a1'],pin2=pin2test.pin['b1'],arrow=False).put()
strip.strt_p2p(pin1=mmi_up.pin['opt_a1'],pin2=pin2test.pin['opt_b1'],arrow=False).put()
## revised in 2026.06.07 by Qin Yue
# legacy: strip.sbend_p2p(pin1=mmi_up.pin['b2'],pin2=mmi_middle.pin['b2'],Lstart=0.5,radius=10,arrow=False).put()
strip.sbend_p2p(pin1=mmi_up.pin['opt_b2'],pin2=mmi_middle.pin['opt_b2'],Lstart=0.5,radius=10,arrow=False).put()
## revised in 2026.06.07 by Qin Yue
# legacy: strip.sbend_p2p(pin1=mmi_bottom.pin['b1'],pin2=mmi_middle.pin['b1'],Lstart=2.5,radius=10,arrow=False).put()
strip.sbend_p2p(pin1=mmi_bottom.pin['opt_b1'],pin2=mmi_middle.pin['opt_b1'],Lstart=2.5,radius=10,arrow=False).put()
''' Add pads '''
pad_ground = pad.cell.put(
mmi_input.pin['b1'].x+40+30+50,mmi_input.pin['b1'].y+5+40-4,0
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_input.pin['b1'].x+40+30+50,mmi_input.pin['b1'].y+5+40-4,0
mmi_input.pin['opt_b1'].x+40+30+50,mmi_input.pin['opt_b1'].y+5+40-4,0
)
pad_signal = pad.cell.put(
mmi_input.pin['b1'].x+40+30+100+50,mmi_input.pin['b1'].y+5+40-4,0
## revised in 2026.06.07 by Qin Yue
# legacy: mmi_input.pin['b1'].x+40+30+100+50,mmi_input.pin['b1'].y+5+40-4,0
mmi_input.pin['opt_b1'].x+40+30+100+50,mmi_input.pin['opt_b1'].y+5+40-4,0
)
''' Metal Connecting '''
@@ -427,13 +515,21 @@ class PS_PIN() :
)
)
''' Put output gratings '''
strip.strt(length=60,arrow=False).put(mmi_input.pin['a1'])
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt(length=60,arrow=False).put(mmi_input.pin['a1'])
strip.strt(length=60,arrow=False).put(mmi_input.pin['opt_a1'])
gc.cell.put('g1')
strip.strt(length=60,arrow=False).put(mmi_up.pin['b1'])
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt(length=60,arrow=False).put(mmi_up.pin['b1'])
strip.strt(length=60,arrow=False).put(mmi_up.pin['opt_b1'])
gc.cell.put('g1')
strip.strt(length=100,arrow=False).put(mmi_middle.pin['a1'])
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt(length=100,arrow=False).put(mmi_middle.pin['a1'])
strip.strt(length=100,arrow=False).put(mmi_middle.pin['opt_a1'])
gc.cell.put('g1')
strip.strt(length=60,arrow=False).put(mmi_bottom.pin['b2'])
## revised in 2026.06.07 by Qin Yue
# legacy: strip.strt(length=60,arrow=False).put(mmi_bottom.pin['b2'])
strip.strt(length=60,arrow=False).put(mmi_bottom.pin['opt_b2'])
gc.cell.put('g1')
return ICell