Files
2026-06-08 15:46:41 +08:00

274 lines
9.3 KiB
Plaintext

function mx_euler_ring(name,coord,euler_para,wafer)
{
R1 = euler_para.R1;
R0 = euler_para.R0;
w1 = euler_para.w1;
w0 = euler_para.w0;
para = euler_para.para;
## setting the ring to a group ##
addstructuregroup;
set('name',name);
set('x',0);
set('y',0);
set('z',0);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[ 0,0,0],'single','linear',wafer,[0,0]);
delete;
sz = wg.sz;
wg = mx_euler_wg2wg(euler_para,pi/2,0,[0,-sz(2),0],'single','linear',wafer,[0,0]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[0,-sz(2),0],'single','linear',wafer,[1,0]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[0, sz(2),0],'single','linear',wafer,[0,1]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[0, sz(2),0],'single','linear',wafer,[1,1]);
addtogroup(name);
select(name);
set('x',coord(1));
set('y',coord(2));
set('z',coord(3));
sz = [sz(1)*2,sz(2)*2];
ring = struct;
ring.sz = sz;
ring.w = wg.w;
return ring;
}
## =================================================== ##
## DEVICE: ring coupler with euler bend attached
## =================================================== ##
function mx_euler_racetrack(name,coord,euler_para,dLx,dLy,wafer)
{
R1 = euler_para.R1;
R0 = euler_para.R0;
w1 = euler_para.w1;
w0 = euler_para.w0;
para = euler_para.para;
## generation of the single racetrack ##
## setting the ring to a group ##
addstructuregroup;
set('name',name);
set('x',0);
set('y',0);
set('z',0);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[ dLx/2,-dLy/2,0],'dual','linear',wafer,[0,0]);
delete;
sz = wg.sz;
wg = mx_euler_wg2wg(euler_para,pi/2,0,[ dLx/2,-dLy/2-sz(2),0],'dual','linear',wafer,[0,0]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[-dLx/2,-dLy/2-sz(2),0],'dual','linear',wafer,[1,0]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[ dLx/2, dLy/2+sz(2),0],'dual','linear',wafer,[0,1]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,pi/2,0,[-dLx/2, dLy/2+sz(2),0],'dual','linear',wafer,[1,1]);
dy = sz(2);
dx = sz(1);
addtogroup(name);
mx_rect('wg_d',[0,-dLy/2-dy,0],[dLx+1e-9,w0,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_rect('wg_u',[0, dLy/2+dy,0],[dLx+1e-9,w0,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_rect('wg_l',[-dLx/2-dx,0,0],[w1,dLy+1e-9,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_rect('wg_r',[ dLx/2+dx,0,0],[w1,dLy+1e-9,H_wafer],wafer.Material,1,0);
addtogroup(name);
select(name);
set('x',coord(1));
set('y',coord(2));
set('z',coord(3));
sz = [dLx+2*dx,dLy+2*dy];
racetrack = struct;
racetrack.sz = sz;
racetrack.w = wg.w;
return racetrack;
}
## =================================================== ##
## DEVICE: ring coupler with euler bend attached
## =================================================== ##
function mx_euler_coupler(name,coord,coupler_para,dLc,dAc,Att,coupler_type,H_wafer,mWafer){
w_cp = coupler_para.w_cp;
R_cp = coupler_para.R_cp;
Ratt = coupler_para.Ratt;
Rmin = coupler_para.Rmin;
w_wg = coupler_para.w_wg;
para = coupler_para.para;
addstructuregroup;
set('name',name);
set('x',0);
set('y',0);
set('z',0);
if (coupler_type=='straight' or coupler_type=='s' or coupler_type=='DC'){
mx_rect('wg_coupling',[0,0,0],[dLc,w_cp,H_wafer],mWafer,1,0);
addtogroup(name);
dx_attach = dLc/2;
dy_attach = 0;
Acp = 0;
}
else if (coupler_type=='bend' or coupler_type=='b' or coupler_type=='BDC'){
if (dAc>0){
mx_ring('wg_coupling',[0,R_cp,0],H_wafer,[R_cp-w_cp/2,R_cp+w_cp/2],[270-dAc/2/pi*180,270+dAc/2/pi*180],mWafer,1,0);
addtogroup(name);
}
Acp = dAc/2;
dx_attach = R_cp*sin(Acp);
dy_attach = R_cp-R_cp*cos(Acp);
}
else {
Acp = 0;
dx_attach = 0;
dy_attach = 0;
}
euler_para = struct;
euler_para.R0 = R_cp;
euler_para.R1 = Ratt;
euler_para.w0 = w_cp;
euler_para.w1 = w_cp;
euler_para.para = para;
euler_para.order = coupler_para.order;
euler_para.w_offset = coupler_para.w_offset;
wg = mx_euler_wg2wg(euler_para,Att,Acp,[dx_attach,dy_attach,0],'single','linear',H_wafer,mWafer,[0,0]);
addtogroup(name);
wg = mx_euler_wg2wg(euler_para,Att,Acp,[-dx_attach,dy_attach,0],'single','linear',H_wafer,mWafer,[1,0]);
addtogroup(name);
euler_para.R0 = Ratt;
euler_para.R1 = Rmin;
euler_para.R2 = Ratt;
euler_para.w0 = w_cp;
euler_para.w1 = w_wg;
sz = wg.sz;
mx_euler_wg2wg(euler_para,-Att-Acp,Att+Acp,[-dx_attach-sz(1),dy_attach+sz(2),0],'dual','linear',H_wafer,mWafer,[1,0]);
addtogroup(name);
wg_attach = mx_euler_wg2wg(euler_para,-Att-Acp,Att+Acp,[ dx_attach+sz(1),dy_attach+sz(2),0],'dual','linear',H_wafer,mWafer,[0,0]);
addtogroup(name);
mx_rect('patch',[0,0,0],[1e-9,w_cp,H_wafer],mWafer,1,0);
addtogroup(name);
sz_attach = wg_attach.sz;
select(name);
set('x',coord(1));
set('y',coord(2));
set('z',coord(3));
cp_sz = [sz_attach(1)*2+dx_attach*2+sz(1)*2,sz_attach(2)+dy_attach+sz(2)];
return cp_sz;
}
## =================================================== ##
## DEVICE: ring coupler with circular bend attached
## =================================================== ##
function mx_circular_coupler(name,coord,w_couple,R_couple,dAc,Att,wafer)
{
addstructuregroup;
set('name',name);
set('x',0);
set('y',0);
set('z',0);
mx_ring('wg_coupling',[0,R_couple,0],H_wafer,[R_couple-w_couple/2,R_couple+w_couple/2],[270-dAc/2/pi*180,270+dAc/2/pi*180],wafer.Material,1,0);
addtogroup(name);
mx_ring('wg_in',[R_couple*sin(dAc/2)*2,R_couple*(1-cos(dAc/2)*2),0],H_wafer,[R_couple-w_couple/2,R_couple+w_couple/2],[90,90+dAc/2/pi*180],wafer.Material,1,0);
addtogroup(name);
mx_ring('wg_out',[-R_couple*sin(dAc/2)*2,R_couple*(1-cos(dAc/2)*2),0],H_wafer,[R_couple-w_couple/2,R_couple+w_couple/2],[90-dAc/2/pi*180,90],wafer.Material,1,0);
addtogroup(name);
select(name);
set('x',coord(1));
set('y',coord(2));
set('z',coord(3));
cp_sz = [R_couple*(sin(dAc/2))*2*2,R_couple*(1-cos(dAc/2))*2];
return cp_sz;
}
function mx_std_dc(name,coord,gap,w_cp,L_cp,L_attach,w_wg,R0,A,wafer)
{
addstructuregroup;
set('name',name);
set('x',0);
set('y',0);
set('z',0);
Lt = abs(w_wg-w_cp)/tan(5/180*pi);
taper_vtx_x = [0,0,-Lt,-Lt];
taper_vtx_y = [w_cp/2,-w_cp/2,-w_wg/2,w_wg/2];
taper_vtx = [taper_vtx_x;taper_vtx_y];
mx_rect('cp_u',[0,w_cp/2+gap/2,0],[L_cp,w_cp,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_rect('cp_d',[0,-(w_cp/2+gap/2),0],[L_cp,w_cp,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_ul',[-L_cp/2,(w_cp/2+gap/2)+R0,0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[270-A,270],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_ul',[-L_cp/2-sin(A/180*pi)*R0*2,R0+(w_cp/2+gap/2)-cos(A/180*pi)*R0*2,0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[90-A,90],wafer.Material,1,0);
addtogroup(name);
y_port = R0+(w_cp/2+gap/2)-cos(A/180*pi)*R0*2+R0;
x_port = -L_cp/2-sin(A/180*pi)*R0*2-L_attach/2-Lt;
mx_poly('ul_taper',[-L_cp/2-sin(A/180*pi)*R0*2,y_port,0],taper_vtx,H_wafer,wafer.Material,1,0);
addtogroup(name);
mx_rect('ul_attach',[x_port,y_port,0],[L_attach,w_wg,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_dl',[-L_cp/2,-((w_cp/2+gap/2)+R0),0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[90,90+A],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_dl',[-L_cp/2-sin(A/180*pi)*R0*2,-(R0+(w_cp/2+gap/2)-cos(A/180*pi)*R0*2),0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[270,270+A],wafer.Material,1,0);
addtogroup(name);
mx_poly('dl_taper',[-L_cp/2-sin(A/180*pi)*R0*2,-y_port,0],taper_vtx,H_wafer,wafer.Material,1,0);
addtogroup(name);
mx_rect('dl_attach',[x_port,-y_port,0],[L_attach,w_wg,H_wafer],wafer.Material,1,0);
addtogroup(name);
taper_vtx(1,:) = -taper_vtx(1,:);
mx_ring('cp_ur',[L_cp/2,(w_cp/2+gap/2)+R0,0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[270,270+A],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_ur',[L_cp/2+sin(A/180*pi)*R0*2,R0+(w_cp/2+gap/2)-cos(A/180*pi)*R0*2,0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[90,90+A],wafer.Material,1,0);
addtogroup(name);
mx_poly('ur_taper',[-(-L_cp/2-sin(A/180*pi)*R0*2),y_port,0],taper_vtx,H_wafer,wafer.Material,1,0);
addtogroup(name);
mx_rect('ur_attach',[-x_port,y_port,0],[L_attach,w_wg,H_wafer],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_dr',[L_cp/2,-((w_cp/2+gap/2)+R0),0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[90-A,90],wafer.Material,1,0);
addtogroup(name);
mx_ring('cp_dr',[L_cp/2+sin(A/180*pi)*R0*2,-(R0+(w_cp/2+gap/2)-cos(A/180*pi)*R0*2),0],H_wafer,[R0-w_cp/2,R0+w_cp/2],[270-A,270],wafer.Material,1,0);
addtogroup(name);
mx_poly('dr_taper',[-(-L_cp/2-sin(A/180*pi)*R0*2),-y_port,0],taper_vtx,H_wafer,wafer.Material,1,0);
addtogroup(name);
mx_rect('dr_attach',[-x_port,-y_port,0],[L_attach,w_wg,H_wafer],wafer.Material,1,0);
addtogroup(name);
sz = [abs(x_port-L_attach/2)*2,y_port*2];
return sz;
}