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; }