//VerilogA for ring,basicreso,veriloga `include "constants.vams" `include "disciplines.vams" module basicreso(Ipow,Iphase,Ilam,Opow,Ophase,Olam); parameter integer modespec = 1 from [1:2]; parameter integer alpha_use_dBm = 1 from [0:1]; parameter real l_bus = 1e-3 from [0:inf); parameter real r_ring = 7.5e-6 from [0:inf); parameter real attenu_bus_te = 0 from [0:inf); parameter real attenu_bus_tm = 0 from [0:inf); parameter real attenu_ring_te = 0 from [0:inf); parameter real attenu_ring_tm = 0 from [0:inf); parameter real phasedelay_bus_te = 0; parameter real phasedelay_bus_tm = 0; parameter real phasedelay_ring_te = 0; parameter real phasedelay_ring_tm = 0; parameter real neff_te = 2.6 from (0:inf); parameter real neff_tm = 2.6 from (0:inf); parameter real coupling_ring_te = 0.145 from [0:1]; parameter real coupling_ring_tm = 0.145 from [0:1]; parameter real reffreq = 193.1T from (0:inf); parameter real n_gv_te = 4.2 from (0:inf); parameter real n_gv_tm = 4.2 from (0:inf); parameter real disper_te = 0 from [0:inf); parameter real disper_tm = 0 from [0:inf); //parameter real coupling_tem = 0; input Ipow,Iphase,Ilam; output Opow,Ophase,Olam; electrical Ipow,Iphase,Ilam,Opow,Ophase,Olam; real eeir,eeii,emir,emii; real eeor,eeoi,emor,emoi; real t11r,t11i,t12r,t12i,t21r,t21i,t22r,t22i; real beta_te,beta_tm; real alpha_bus_te,alpha_bus_tm,alpha_ring_te,alpha_ring_tm; real beta_bus_ter,beta_bus_tei,beta_bus_tmr,beta_bus_tmi,beta_ring_ter,beta_ring_tei,beta_ring_tmr,beta_ring_tmi; real t_te,t_tm,theta_ter,theta_tei,theta_tmr,theta_tmi; real c1e1r,c1e1i,c1e2r,c1e2i,c1m1r,c1m1i,c1m2r,c1m2i; real c11r,c11i,c11m,c12r,c12i,c12m; real c21r,c21i,c22r,c22i; real l_ring=2*`M_PI*r_ring; real freq; real iph; analog begin freq=`P_C/V(Ilam); iph=V(Iphase)/360.0*2*`M_PI; if (modespec == 1) begin eeir=sqrt(V(Ipow))*cos(iph); eeii=sqrt(V(Ipow))*sin(iph); emir=0; emii=0; end else if (modespec == 2) begin eeir=0; eeii=0; emir=sqrt(V(Ipow))*cos(iph); emii=sqrt(V(Ipow))*sin(iph); end beta_te=2*`M_PI*reffreq/`P_C*neff_te+2*`M_PI/`P_C*n_gv_te*(freq-reffreq)-`M_PI*`P_C*disper_te/pow(reffreq,2)*pow(freq-reffreq,2); beta_tm=2*`M_PI*reffreq/`P_C*neff_tm+2*`M_PI/`P_C*n_gv_tm*(freq-reffreq)-`M_PI*`P_C*disper_tm/pow(reffreq,2)*pow(freq-reffreq,2); if (alpha_use_dBm == 0) begin alpha_bus_te=attenu_bus_te; alpha_bus_tm=attenu_bus_tm; alpha_ring_te=attenu_ring_te; alpha_ring_tm=attenu_ring_tm; end else if (alpha_use_dBm == 1) begin alpha_bus_te=attenu_bus_te/10.0*ln(10); alpha_bus_tm=attenu_bus_tm/10.0*ln(10); alpha_ring_te=attenu_ring_te/10.0*ln(10); alpha_ring_tm=attenu_ring_tm/10.0*ln(10); end beta_bus_ter=beta_te; beta_bus_tei=-0.5*alpha_bus_te; beta_bus_tmr=beta_tm; beta_bus_tmi=-0.5*alpha_bus_tm; beta_ring_ter=beta_te; beta_ring_tei=-0.5*alpha_ring_te; beta_ring_tmr=beta_tm; beta_ring_tmi=-0.5*alpha_ring_tm; t_te=sqrt(1-coupling_ring_te); t_tm=sqrt(1-coupling_ring_tm); theta_ter=beta_ring_ter*l_ring-phasedelay_ring_te/360.0*`M_PI*2; theta_tei=beta_ring_tei*l_ring; theta_tmr=beta_ring_tmr*l_ring-phasedelay_ring_tm/360.0*`M_PI*2; theta_tmi=beta_ring_tmi*l_ring; c1e1r=1-t_te*exp(-theta_tei)*cos(theta_ter); c1e1i=-t_te*exp(-theta_tei)*sin(theta_ter); c1e2r=t_te-exp(-theta_tei)*cos(theta_ter); c1e2i=exp(-theta_tei)*sin(theta_ter); c11m=pow(t_te-exp(-theta_tei)*cos(theta_ter),2)+pow(exp(-theta_tei)*sin(theta_ter),2); c11r=(c1e1r*c1e2r-c1e1i*c1e2i)/c11m; c11i=(c1e1r*c1e2i+c1e1i*c1e2r)/c11m; c1m1r=1-t_tm*exp(-theta_tmi)*cos(theta_tmr); c1m1i=-t_tm*exp(-theta_tmi)*sin(theta_tmr); c1m2r=t_tm-exp(-theta_tmi)*cos(theta_tmr); c1m2i=exp(-theta_tmi)*sin(theta_tmr); c12m=pow(t_tm-exp(-theta_tmi)*cos(theta_tmr),2)+pow(exp(-theta_tmi)*sin(theta_tmr),2); c12r=(c1m1r*c1m2r-c1m1i*c1m2i)/c12m; c12i=(c1m1r*c1m2i+c1m1i*c1m2r)/c12m; c21r=exp(beta_bus_tei*l_bus)*cos(-beta_bus_ter*l_bus-phasedelay_bus_te/360.0*`M_PI*2); c21i=exp(beta_bus_tei*l_bus)*sin(-beta_bus_ter*l_bus-phasedelay_bus_te/360.0*`M_PI*2); c22r=exp(beta_bus_tmi*l_bus)*cos(-beta_bus_tmr*l_bus-phasedelay_bus_tm/360.0*`M_PI*2); c22i=exp(beta_bus_tmi*l_bus)*sin(-beta_bus_tmr*l_bus-phasedelay_bus_tm/360.0*`M_PI*2); t11r=c11r*c21r-c11i*c21i; t11i=c11r*c21i+c11i*c21r; t12r=0; t12i=0; t21r=0; t21i=0; t22r=c12r*c22r-c12i*c22i; t22i=c12r*c22i+c12i*c22r; eeor=t11r*eeir-t11i*eeii+t12r*emir-t12i*emii; eeoi=t11r*eeii+t11i*eeir+t12r*emii+t12i*emir; emor=t21r*eeir-t21i*eeii+t22r*emir-t22i*emii; emoi=t21r*eeii+t21i*eeir+t22r*emii+t22i*emir; if (modespec == 1) begin V(Opow) <+ eeor*eeor+eeoi*eeoi; V(Ophase) <+ atan2(eeoi,eeor)*360.0/(2*`M_PI); end else if (modespec == 2) begin V(Opow) <+ emor*emor+emoi*emoi; V(Ophase) <+ atan2(emoi,emor)*360.0/(2*`M_PI); end V(Olam) <+ V(Ilam); end endmodule