//VerilogA for ring,idealfilter,veriloga `include "constants.vams" `include "disciplines.vams" module idealfilter(Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2); parameter real r = 10u from (0:inf); parameter real alpha = 7.1029e3 from (0:inf); parameter real t1_abs = 0.8 from [0:1]; parameter real t1_theta = 0 from (-360:360); parameter real t2_abs = 0.8 from [0:1]; parameter real t2_theta = 0 from (-360:360); parameter real neff = 3.42 from (0:inf); input Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2; output Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2; electrical Ipow1,Iphase1,Ilam1,Ipow2,Iphase2,Ilam2,Opow1,Ophase1,Olam1,Opow2,Ophase2,Olam2; real omega,L; real a,theta; real T1,T2; real t1r,t1i,t2r,t2i; real k1r,k1i,k2r,k2i; real dr,di,u1r,u1i,u2r,u2i,u3r,u3i,u4r,u4i; real ein1r,ein1i,ein2r,ein2i,eout1r,eout1i,eout2r,eout2i; real c1r,c1i,c2r,c2i,c3r,c3i,c4r,c4i; analog begin omega=2*`M_PI*`P_C/V(Ilam1); L=2*`M_PI*r; a=exp(-alpha*L/2); theta=omega*neff*L/`P_C; t1r=t1_abs*cos(t1_theta*`M_PI/180); t1i=t1_abs*sin(t1_theta*`M_PI/180); t2r=t2_abs*cos(t2_theta*`M_PI/180); t2i=t2_abs*sin(t2_theta*`M_PI/180); k1r=sqrt(1-pow(t1r,2)-pow(t1i,2)); k2r=sqrt(1-pow(t2r,2)-pow(t2i,2)); k1i=0; k2i=0; dr=1-a*cos(theta)*t1r*t2r+a*cos(theta)*t1i*t2i-a*sin(theta)*t1r*t2i-a*sin(theta)*t1i*t2r; di=a*cos(theta)*t1r*t2i+a*cos(theta)*t1i*t2r-a*sin(theta)*t1r*t2r+a*sin(theta)*t1i*t2i; u1r=t1r-a*cos(theta)*t2r+a*sin(theta)*t2i; u1i=t1i-a*cos(theta)*t2i-a*sin(theta)*t2r; u2r=-sqrt(a)*(cos(theta/2)*k1r*k2r+cos(theta/2)*k1i*k2i+sin(theta/2)*k1r*k2i-sin(theta/2)*k1i*k2r); u2i=-sqrt(a)*(sin(theta/2)*k1r*k2r+sin(theta/2)*k1i*k2i-cos(theta/2)*k1r*k2i+cos(theta/2)*k1i*k2r); u3r=t2r-a*cos(theta)*t1r+a*sin(theta)*t1i; u3i=t2i-a*cos(theta)*t1i-a*sin(theta)*t1r; u4r=-sqrt(a)*(cos(theta/2)*k2r*k1r+cos(theta/2)*k2i*k1i+sin(theta/2)*k2r*k1i-sin(theta/2)*k2i*k1r); u4i=-sqrt(a)*(sin(theta/2)*k2r*k1r+sin(theta/2)*k2i*k1i-cos(theta/2)*k2r*k1i+cos(theta/2)*k2i*k1r); c1r=(dr*u1r+di*u1i)/(pow(dr,2)+pow(di,2)); c1i=(dr*u1i-di*u1r)/(pow(dr,2)+pow(di,2)); c2r=(dr*u2r+di*u2i)/(pow(dr,2)+pow(di,2)); c2i=(dr*u2i-di*u2r)/(pow(dr,2)+pow(di,2)); c3r=(dr*u3r+di*u3i)/(pow(dr,2)+pow(di,2)); c3i=(dr*u3i-di*u3r)/(pow(dr,2)+pow(di,2)); c4r=(dr*u4r+di*u4i)/(pow(dr,2)+pow(di,2)); c4i=(dr*u4i-di*u4r)/(pow(dr,2)+pow(di,2)); ein1r=V(Ipow1)*cos(V(Iphase1)/180.0*`M_PI); ein1i=V(Ipow1)*sin(V(Iphase1)/180.0*`M_PI); ein2r=V(Ipow2)*cos(V(Iphase2)/180.0*`M_PI); ein2i=V(Ipow2)*sin(V(Iphase2)/180.0*`M_PI); eout1r=c1r*ein1r-c1i*ein1i+c2r*ein2r-c2i*ein2i; eout1i=c1i*ein1r+c1r*ein1i+c2i*ein2r+c2r*ein2i; eout2r=c3r*ein2r-c3i*ein2i+c4r*ein1r-c4i*ein1i; eout2i=c3i*ein2r+c3r*ein2i+c4i*ein1r+c4r*ein1i; V(Opow1) <+ eout1r*eout1r+eout1i*eout1i; V(Ophase1) <+ atan2(eout1i,eout1r)/`M_PI*180.0; V(Olam1) <+ V(Ilam1); V(Opow2) <+ eout2r*eout2r+eout2i*eout2i; V(Ophase2) <+ atan2(eout2i,eout2r)/`M_PI*180.0; V(Olam2) <+ V(Ilam2); end endmodule