274 lines
9.3 KiB
Plaintext
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;
|
|
} |