//VerilogA for passive,wgarc,veriloga `include "constants.vams" `include "disciplines.vams" module wgarc(Ipow,Iphase,Ilam,Opow,Ophase,Olam); parameter integer modespec = 1 from [1:2]; parameter integer alpha_use_dBm = 1 from [0:1]; parameter real reffreq = 193.1e12 from (0:inf); parameter real neff_te_0 = 2.6 from (0:inf); parameter real neff_tm_0 = 2.6 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; parameter real disper_tm = 0; parameter real attenu_te = 0 from [0:inf); parameter real attenu_tm = 0 from [0:inf); parameter real phasedelay_te = 0; parameter real phasedelay_tm = 0; parameter real coupling_tem = 0; parameter real redius = 1e-3 from (0:inf); parameter real angle = 90 from (0:inf); parameter real kn_te = 0; parameter real kn_tm = 0; parameter real A_te = 0 from [0:inf); parameter real A_tm = 0 from [0:inf); parameter real B_te = 0 from [0:inf); parameter real B_tm = 0 from [0:inf); 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_ter,beta_tei,beta_tmr,beta_tmi,beta_avr,beta_avi,beta_dvr,beta_dvi; real delta,trandelta,cdd,bddr,bddi; real rfront,ifrontch,t11r1,t1r2,t11i1,t1i2,t22r1,t2r2,t22i1,t2i2; real alpha_te0,alpha_tm0; real dn_te,dn_tm,dalpha_te,dalpha_tm; real alpha_te,alpha_tm,neff_te,neff_tm; real length=redius*angle/180*`M_PI; real phasedelay_te_u=phasedelay_te/360.0*2*`M_PI; real phasedelay_tm_u=phasedelay_tm/360.0*2*`M_PI; 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 alpha_te0=0.1*ln(10)*attenu_te; alpha_tm0=0.1*ln(10)*attenu_tm; dn_te=kn_te/pow(redius,2); dn_tm=kn_tm/pow(redius,2); dalpha_te=A_te/sqrt(redius)*exp(-B_te*redius); dalpha_tm=A_tm/sqrt(redius)*exp(-B_tm*redius); neff_te=neff_te_0+dn_te; neff_tm=neff_tm_0+dn_tm; alpha_te=alpha_te0+dalpha_te; alpha_tm=alpha_tm0+dalpha_tm; if (alpha_use_dBm == 1) begin alpha_te=0.1*ln(10)*alpha_te; alpha_tm=0.1*ln(10)*alpha_tm; end beta_ter=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_tei=-alpha_te/2; beta_tmr=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); beta_tmi=-alpha_tm/2; if (coupling_tem == 0) begin rfront=exp(beta_tei*length); t11r1=cos(phasedelay_te_u-beta_ter*length); t11i1=sin(phasedelay_te_u-beta_ter*length); t22r1=cos(phasedelay_tm_u-beta_tmr*length); t22i1=sin(phasedelay_tm_u-beta_tmr*length); t11r=rfront*t11r1; t11i=rfront*t11i1; t12r=0; t12i=0; t21r=0; t21i=0; t22r=rfront*t22r1; t22i=rfront*t22i1; end else begin beta_avr=(beta_ter+beta_tmr)/2; beta_avi=(beta_tmi+beta_tmi)/2; beta_dvr=(beta_ter-beta_tmr)/2; beta_dvi=(beta_tmi-beta_tmi)/2; delta=sqrt(beta_dvr*beta_dvr+beta_dvi*beta_dvi+coupling_tem*coupling_tem); trandelta=delta*length; cdd=coupling_tem/delta; bddr=beta_dvr/delta; bddi=beta_dvi/delta; rfront=exp(beta_avi*length); t11r1=cos(trandelta)+bddi*sin(trandelta); t11i1=-bddr*sin(trandelta); t1r2=cos(phasedelay_te_u-beta_avr*length); t1i2=sin(phasedelay_te_u-beta_avr*length); ifrontch=-cdd*sin(trandelta); t2r2=cos(phasedelay_tm_u-beta_avr*length); t2i2=sin(phasedelay_tm_u-beta_avr*length); t22r1=cos(trandelta)-bddi*sin(trandelta); t22i1=bddr*sin(trandelta); t11r=rfront*(t11r1*t1r2-t11i1*t1i2); t11i=rfront*(t11r1*t1i2+t11i1*t1r2); t12r=rfront*ifrontch*t1i2; t12i=rfront*ifrontch*t1r2; t21r=rfront*ifrontch*t2i2; t21i=rfront*ifrontch*t2r2; t22r=rfront*(t22r1*t2r2-t22i1*t2i2); t22i=rfront*(t22r1*t2i2+t22i1*t2r2); end 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; V(Olam) <+ V(Ilam); 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 end endmodule