optical pins name revised. Pin type added
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
@@ -181,11 +181,19 @@ class waveguide_PIN:
|
||||
if (self.rib_taper):
|
||||
tp_L = taper_xs2xs(xs_1='temp',xs_2=self.xs_port,L_taper=self.L_taper,w_1=self.w_wg,w_2=self.w_wg).cell.put(core.pin['a0'])
|
||||
tp_R = taper_xs2xs(xs_1='temp',xs_2=self.xs_port,L_taper=self.L_taper,w_1=self.w_wg,w_2=self.w_wg).cell.put(core.pin['b0'])
|
||||
nd.Pin(name='a1',pin=tp_L.pin['b0']).put()
|
||||
nd.Pin(name='b1',pin=tp_R.pin['b0']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=tp_L.pin['b0']).put()
|
||||
nd.Pin(name='opt_a1',pin=tp_L.pin['b0'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=tp_R.pin['b0']).put()
|
||||
nd.Pin(name='opt_b1',pin=tp_R.pin['b0'],type="optical:").put()
|
||||
else:
|
||||
nd.Pin(name='a1',pin=core.pin['a0']).put()
|
||||
nd.Pin(name='b1',pin=core.pin['b0']).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='a1',pin=core.pin['a0']).put()
|
||||
nd.Pin(name='opt_a1',pin=core.pin['a0'],type="optical:").put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: nd.Pin(name='b1',pin=core.pin['b0']).put()
|
||||
nd.Pin(name='opt_b1',pin=core.pin['b0'],type="optical:").put()
|
||||
|
||||
## adding p doping area
|
||||
_y_ = self.w_itr/2
|
||||
@@ -476,12 +484,28 @@ class WGDoped():
|
||||
xs1 = self.cell_xs_transition.put('a0',coreOUT.pin['b0'])
|
||||
xs2 = self.cell_xs_transition.put('a0',coreIN.pin['a0'])
|
||||
|
||||
xs1.raise_pins(['b0'],['a1'])
|
||||
xs2.raise_pins(['b0'],['b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: xs1.raise_pins(['b0'],['a1'])
|
||||
xs1.raise_pins(['b0'],['opt_a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
C.pin['opt_a1'].type = "optical:"
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: xs2.raise_pins(['b0'],['b1'])
|
||||
xs2.raise_pins(['b0'],['opt_b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
C.pin['opt_b1'].type = "optical:"
|
||||
else:
|
||||
|
||||
coreIN.raise_pins(['a0'],['b1'])
|
||||
coreOUT.raise_pins(['b0'],['a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: coreIN.raise_pins(['a0'],['b1'])
|
||||
coreIN.raise_pins(['a0'],['opt_b1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
C.pin['opt_b1'].type = "optical:"
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: coreOUT.raise_pins(['b0'],['a1'])
|
||||
coreOUT.raise_pins(['b0'],['opt_a1'])
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
C.pin['opt_a1'].type = "optical:"
|
||||
|
||||
# nd.put_stub()
|
||||
return C
|
||||
|
||||
@@ -590,7 +590,9 @@ class AED_Ring_PIN(MRR_AED): ## Finished in 2022.11.23
|
||||
spacing=self.via_i2m.spacing,
|
||||
sp_via_xs=self.via_i2m.sp_via_xs,
|
||||
instantiate=self.via_i2m.instantiate,
|
||||
).cell.put(INSTR.pin['a1'].x+self.w_metal/2+self.sp_cont,INSTR.pin['a1'].y,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: ).cell.put(INSTR.pin['a1'].x+self.w_metal/2+self.sp_cont,INSTR.pin['a1'].y,180)
|
||||
).cell.put(INSTR.pin['opt_a1'].x+self.w_metal/2+self.sp_cont,INSTR.pin['opt_a1'].y,180)
|
||||
|
||||
BUS_VIA_R = Vias(xs=self.via_i2m.xs,area=[self.w_metal,BUS_IMP.w_wg-self.sp_cont*2],
|
||||
xs_l1=self.via_i2m.xs_l1,
|
||||
@@ -599,21 +601,47 @@ class AED_Ring_PIN(MRR_AED): ## Finished in 2022.11.23
|
||||
spacing=self.via_i2m.spacing,
|
||||
sp_via_xs=self.via_i2m.sp_via_xs,
|
||||
instantiate=self.via_i2m.instantiate,
|
||||
).cell.put(INSTR.pin['b1'].x-self.w_metal/2-self.sp_cont,INSTR.pin['b1'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: ).cell.put(INSTR.pin['b1'].x-self.w_metal/2-self.sp_cont,INSTR.pin['b1'].y)
|
||||
).cell.put(INSTR.pin['opt_b1'].x-self.w_metal/2-self.sp_cont,INSTR.pin['opt_b1'].y)
|
||||
|
||||
|
||||
if (abs(BUS_VIA_L.pin['a0'].x) > abs(VIA_LO.pin['b1'].x)):
|
||||
temp = eic_mt.bend(pin=VIA_LO.pin['b1'],angle=360-VIA_LO.pin['b1'].a,arrow=False).put(flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if (abs(BUS_VIA_L.pin['a0'].x) > abs(VIA_LO.pin['b1'].x)):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if (abs(BUS_VIA_L.pin['a0'].x) > abs(VIA_LO.pin['opt_b1'].x)):
|
||||
if (abs(BUS_VIA_L.pin['a0'].x) > abs(VIA_LO.pin['ele_b1'].x)):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_LO.pin['b1'],angle=360-VIA_LO.pin['b1'].a,arrow=False).put(flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_LO.pin['opt_b1'],angle=360-VIA_LO.pin['opt_b1'].a,arrow=False).put(flip=0)
|
||||
temp = eic_mt.bend(pin=VIA_LO.pin['ele_b1'],angle=360-VIA_LO.pin['ele_b1'].a,arrow=False).put(flip=0)
|
||||
eic_mt.ubend_p2p(pin2=BUS_VIA_L.pin['a0'],arrow=False).put()
|
||||
|
||||
else :
|
||||
eic_mt.strt_bend_strt_p2p(pin1=VIA_LO.pin['b1'],pin2=BUS_VIA_L.pin['a0'].move(0,0,90),arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin1=VIA_LO.pin['b1'],pin2=BUS_VIA_L.pin['a0'].move(0,0,90),arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin1=VIA_LO.pin['opt_b1'],pin2=BUS_VIA_L.pin['a0'].move(0,0,90),arrow=False).put()
|
||||
eic_mt.strt_bend_strt_p2p(pin1=VIA_LO.pin['ele_b1'],pin2=BUS_VIA_L.pin['a0'].move(0,0,90),arrow=False).put()
|
||||
|
||||
if (abs(BUS_VIA_R.pin['a0'].x) > abs(VIA_RO.pin['a1'].x)):
|
||||
temp = eic_mt.bend(pin=VIA_RO.pin['a1'],angle=VIA_RO.pin['a1'].a-180,arrow=False).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if (abs(BUS_VIA_R.pin['a0'].x) > abs(VIA_RO.pin['a1'].x)):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: if (abs(BUS_VIA_R.pin['a0'].x) > abs(VIA_RO.pin['opt_a1'].x)):
|
||||
if (abs(BUS_VIA_R.pin['a0'].x) > abs(VIA_RO.pin['ele_a1'].x)):
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_RO.pin['a1'],angle=VIA_RO.pin['a1'].a-180,arrow=False).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_RO.pin['opt_a1'],angle=VIA_RO.pin['opt_a1'].a-180,arrow=False).put(flip=1)
|
||||
temp = eic_mt.bend(pin=VIA_RO.pin['ele_a1'],angle=VIA_RO.pin['ele_a1'].a-180,arrow=False).put(flip=1)
|
||||
eic_mt.ubend_p2p(pin2=BUS_VIA_R.pin['a0'],arrow=False).put()
|
||||
else :
|
||||
eic_mt.strt_bend_strt_p2p(pin1=VIA_RO.pin['a1'],pin2=BUS_VIA_R.pin['a0'].move(0,0,-90),arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin1=VIA_RO.pin['a1'],pin2=BUS_VIA_R.pin['a0'].move(0,0,-90),arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin1=VIA_RO.pin['opt_a1'],pin2=BUS_VIA_R.pin['a0'].move(0,0,-90),arrow=False).put()
|
||||
eic_mt.strt_bend_strt_p2p(pin1=VIA_RO.pin['ele_a1'],pin2=BUS_VIA_R.pin['a0'].move(0,0,-90),arrow=False).put()
|
||||
|
||||
nd.Pin(name='en3',width=BUS_IMP.wg_Ltp-self.sp_cont*2).put(BUS_VIA_L.pin['a0'].x,BUS_VIA_L.pin['a0'].y,-90)
|
||||
nd.Pin(name='en4',width=BUS_IMP.wg_Ltp-self.sp_cont*2).put(BUS_VIA_R.pin['a0'].x,BUS_VIA_R.pin['a0'].y,-90)
|
||||
@@ -660,25 +688,53 @@ class AED_Ring_PIN(MRR_AED): ## Finished in 2022.11.23
|
||||
xs_l2=self.via_i2m.xs_l2,
|
||||
sz=self.via_i2m.sz,spacing=self.via_i2m.spacing,
|
||||
sp_via_xs=self.via_i2m.sp_via_xs,
|
||||
).cell.put(INSTR.pin['a1'].x+self.w_metal/2+self.sp_cont,INSTR.pin['a1'].y,180)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: ).cell.put(INSTR.pin['a1'].x+self.w_metal/2+self.sp_cont,INSTR.pin['a1'].y,180)
|
||||
).cell.put(INSTR.pin['opt_a1'].x+self.w_metal/2+self.sp_cont,INSTR.pin['opt_a1'].y,180)
|
||||
|
||||
BUS_VIA_R = Vias(xs=self.via_i2m.xs,area=[self.w_metal,BUS_IMP.w_wg-self.sp_cont*2],
|
||||
xs_l1=self.via_i2m.xs_l1,
|
||||
xs_l2=self.via_i2m.xs_l2,
|
||||
sp_via_xs=self.via_i2m.sp_via_xs,
|
||||
sz=self.via_i2m.sz,spacing=self.via_i2m.spacing).cell.put(INSTR.pin['b1'].x-self.w_metal/2-self.sp_cont,INSTR.pin['b1'].y)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: sz=self.via_i2m.sz,spacing=self.via_i2m.spacing).cell.put(INSTR.pin['b1'].x-self.w_metal/2-self.sp_cont,INSTR.pin['b1'].y)
|
||||
sz=self.via_i2m.sz,spacing=self.via_i2m.spacing).cell.put(INSTR.pin['opt_b1'].x-self.w_metal/2-self.sp_cont,INSTR.pin['opt_b1'].y)
|
||||
|
||||
eic_mt.bend(pin=VIA_LO.pin['a1'],angle=VIA_LO.pin['a1'].a-90,arrow=False).put(flip=1)
|
||||
eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_L.pin['a1'],arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.bend(pin=VIA_LO.pin['a1'],angle=VIA_LO.pin['a1'].a-90,arrow=False).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.bend(pin=VIA_LO.pin['opt_a1'],angle=VIA_LO.pin['opt_a1'].a-90,arrow=False).put(flip=1)
|
||||
eic_mt.bend(pin=VIA_LO.pin['ele_a1'],angle=VIA_LO.pin['ele_a1'].a-90,arrow=False).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_L.pin['a1'],arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_L.pin['opt_a1'],arrow=False).put()
|
||||
eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_L.pin['ele_a1'],arrow=False).put()
|
||||
|
||||
eic_mt.bend(pin=VIA_RO.pin['b1'],angle=90-VIA_RO.pin['b1'].a).put(flip=0)
|
||||
eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_R.pin['a1'],arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.bend(pin=VIA_RO.pin['b1'],angle=90-VIA_RO.pin['b1'].a).put(flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.bend(pin=VIA_RO.pin['opt_b1'],angle=90-VIA_RO.pin['opt_b1'].a).put(flip=0)
|
||||
eic_mt.bend(pin=VIA_RO.pin['ele_b1'],angle=90-VIA_RO.pin['ele_b1'].a).put(flip=0)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_R.pin['a1'],arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_R.pin['opt_a1'],arrow=False).put()
|
||||
eic_mt.strt_bend_strt_p2p(pin2=BUS_VIA_R.pin['ele_a1'],arrow=False).put()
|
||||
|
||||
else :
|
||||
temp = eic_mt.bend(pin=VIA_LO.pin['b1'],angle=VIA_LO.pin['b1'].a-270,arrow=False).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_LO.pin['b1'],angle=VIA_LO.pin['b1'].a-270,arrow=False).put(flip=1)
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_LO.pin['opt_b1'],angle=VIA_LO.pin['opt_b1'].a-270,arrow=False).put(flip=1)
|
||||
temp = eic_mt.bend(pin=VIA_LO.pin['ele_b1'],angle=VIA_LO.pin['ele_b1'].a-270,arrow=False).put(flip=1)
|
||||
nd.Pin(name='en3',width=w_cont_out-self.sp_cont*2+ovlp,pin=temp.pin['b0']).put()
|
||||
|
||||
temp = eic_mt.bend(pin=VIA_RO.pin['a1'],angle=270-VIA_RO.pin['a1'].a,arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_RO.pin['a1'],angle=270-VIA_RO.pin['a1'].a,arrow=False).put()
|
||||
## revised in 2026.06.07 by Qin Yue
|
||||
# legacy: temp = eic_mt.bend(pin=VIA_RO.pin['opt_a1'],angle=270-VIA_RO.pin['opt_a1'].a,arrow=False).put()
|
||||
temp = eic_mt.bend(pin=VIA_RO.pin['ele_a1'],angle=270-VIA_RO.pin['ele_a1'].a,arrow=False).put()
|
||||
nd.Pin(name='en4',width=w_cont_out-self.sp_cont*2+ovlp,pin=temp.pin['b0']).put()
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user