Verilog-A release version.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

475 lines
23 KiB

//VerilogA for ring,basicreso_withv,veriloga
`include "constants.vams"
`include "disciplines.vams"
`define MAX_TABLE_SIZE 1000
module basicreso_withv(Ipow,Iphase,Ilam,Opow,Ophase,Olam,Vbias);
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 phasedelay_bus_te = 0;
parameter real phasedelay_bus_tm = 0;
parameter real phasedelay_ring_te = 0;
parameter real phasedelay_ring_tm = 0;
parameter integer read_neff = 0 from [0:1];
parameter string file_neff_bus_te = "./neff_bus_te.txt";
parameter string file_neff_bus_tm = "./neff_bus_tm.txt";
parameter string file_neff_ring_te = "./neff_ring_te.txt";
parameter string file_neff_ring_tm = "./neff_ring_tm.txt";
parameter string file_deltaneff_te = "./deltaneff_te.txt";
parameter string file_deltaneff_tm = "./deltaneff_tm.txt";
parameter real neff_bus_te = 2.6 from (0:inf);
parameter real neff_bus_tm = 2.6 from (0:inf);
parameter real neff_ring_te = 2.6 from (0:inf);
parameter real neff_ring_tm = 2.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 delta_neff_perv_te = 0;
parameter real delta_neff_perv_tm = 0;
parameter real delta_attenu_perv_te = 0;
parameter real delta_attenu_perv_tm = 0;
parameter real reffreq = 193.1T from (0:inf);
parameter real n_gv_bus_te = 4.2 from (0:inf);
parameter real n_gv_bus_tm = 4.2 from (0:inf);
parameter real n_gv_ring_te = 4.2 from (0:inf);
parameter real n_gv_ring_tm = 4.2 from (0:inf);
parameter real disper_bus_te = 0;
parameter real disper_bus_tm = 0;
parameter real disper_ring_te = 0;
parameter real disper_ring_tm = 0;
parameter integer read_coupling_ring = 0 from [0:1];
parameter real coupling_ring_te = 0.145 from [0:1];
parameter real coupling_ring_tm = 0.145 from [0:1];
parameter string file_coupling_ring_te = "./coupling_te.txt";
parameter string file_coupling_ring_tm = "./coupling_tm.txt";
//parameter real coupling_tem = 0;
input Ipow,Iphase,Ilam,Vbias;
output Opow,Ophase,Olam;
electrical Ipow,Iphase,Ilam,Opow,Ophase,Olam,Vbias;
real eeir,eeii,emir,emii;
real eeor,eeoi,emor,emoi;
real t11r,t11i,t12r,t12i,t21r,t21i,t22r,t22i;
real neff_bus_ter,neff_bus_tei,neff_bus_tmr,neff_bus_tmi;
real neff_ring_ter,neff_ring_tei,neff_ring_tmr,neff_ring_tmi;
real beta_bus_te,beta_bus_tm,beta_ring_te,beta_ring_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,lam;
real neff_bus_ter_u,neff_bus_tmr_u,neff_ring_ter_u,neff_ring_tmr_u;
real neff_bus_tei_u,neff_bus_tmi_u,neff_ring_tei_u,neff_ring_tmi_u;
real coupling_ring_te_u,coupling_ring_tm_u;
real attenu_bus_te_u,attenu_bus_tm_u,attenu_ring_te_u,attenu_ring_tm_u;
real delta_neff_ter,delta_neff_tei,delta_neff_tmr,delta_neff_tmi;
integer file_te,file_tm;
integer file_bus_te,file_bus_tm,file_ring_te,file_ring_tm;
real neff_bus_te_lamdata[0:`MAX_TABLE_SIZE-1];
real neff_bus_tm_lamdata[0:`MAX_TABLE_SIZE-1];
real neff_ring_te_lamdata[0:`MAX_TABLE_SIZE-1];
real neff_ring_tm_lamdata[0:`MAX_TABLE_SIZE-1];
real neff_bus_te_data_r[0:`MAX_TABLE_SIZE-1];
real neff_bus_te_data_i[0:`MAX_TABLE_SIZE-1];
real neff_bus_tm_data_r[0:`MAX_TABLE_SIZE-1];
real neff_bus_tm_data_i[0:`MAX_TABLE_SIZE-1];
real neff_ring_te_data_r[0:`MAX_TABLE_SIZE-1];
real neff_ring_te_data_i[0:`MAX_TABLE_SIZE-1];
real neff_ring_tm_data_r[0:`MAX_TABLE_SIZE-1];
real neff_ring_tm_data_i[0:`MAX_TABLE_SIZE-1];
real coupling_ring_te_lamdata[0:`MAX_TABLE_SIZE-1];
real coupling_ring_tm_lamdata[0:`MAX_TABLE_SIZE-1];
real coupling_ring_te_data[0:`MAX_TABLE_SIZE-1];
real coupling_ring_tm_data[0:`MAX_TABLE_SIZE-1];
real delta_neff_te_vdata[0:`MAX_TABLE_SIZE-1];
real delta_neff_tm_vdata[0:`MAX_TABLE_SIZE-1];
real delta_neff_te_data_r[0:`MAX_TABLE_SIZE-1];
real delta_neff_te_data_i[0:`MAX_TABLE_SIZE-1];
real delta_neff_tm_data_r[0:`MAX_TABLE_SIZE-1];
real delta_neff_tm_data_i[0:`MAX_TABLE_SIZE-1];
integer num_lines_neff_bus_te,num_lines_neff_bus_tm,num_lines_neff_ring_te,num_lines_neff_ring_tm;
integer num_lines_coupling_te,num_lines_coupling_tm;
integer num_lines_deltaneff_te,num_lines_deltaneff_tm;
integer i;
integer readfile_neff=0;
integer readfile_coupling_ring=0;
integer readfile_delta_neff=0;
real iph;
analog begin
lam=V(Ilam);
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
if (read_neff == 1) begin
if (readfile_neff == 0) begin
readfile_neff=1;
end
if (readfile_delta_neff == 0) begin
readfile_delta_neff=1;
end
end
else begin
delta_neff_ter=delta_neff_perv_te*V(Vbias);
delta_neff_tmr=delta_neff_perv_tm*V(Vbias);
beta_bus_te=2*`M_PI*reffreq/`P_C*(neff_bus_te)+2*`M_PI/`P_C*n_gv_bus_te*(freq-reffreq)-`M_PI*`P_C*disper_bus_te/pow(reffreq,2)*pow(freq-reffreq,2);
beta_bus_tm=2*`M_PI*reffreq/`P_C*(neff_bus_tm)+2*`M_PI/`P_C*n_gv_bus_tm*(freq-reffreq)-`M_PI*`P_C*disper_bus_tm/pow(reffreq,2)*pow(freq-reffreq,2);
beta_ring_te=2*`M_PI*reffreq/`P_C*(neff_ring_te+delta_neff_ter)+2*`M_PI/`P_C*n_gv_ring_te*(freq-reffreq)-`M_PI*`P_C*disper_ring_te/pow(reffreq,2)*pow(freq-reffreq,2);
beta_ring_tm=2*`M_PI*reffreq/`P_C*(neff_ring_tm+delta_neff_tmr)+2*`M_PI/`P_C*n_gv_ring_tm*(freq-reffreq)-`M_PI*`P_C*disper_ring_tm/pow(reffreq,2)*pow(freq-reffreq,2);
attenu_bus_te_u=attenu_bus_te;
attenu_bus_tm_u=attenu_bus_tm;
attenu_ring_te_u=attenu_ring_te+delta_attenu_perv_te*V(Vbias);
attenu_ring_tm_u=attenu_ring_tm+delta_attenu_perv_tm*V(Vbias);
if (alpha_use_dBm == 1) begin
alpha_bus_te=attenu_bus_te_u/10*ln(10);
alpha_bus_tm=attenu_bus_tm_u/10*ln(10);
alpha_ring_te=attenu_ring_te_u/10*ln(10);
alpha_ring_tm=attenu_ring_tm_u/10*ln(10);
end
else begin
alpha_bus_te=attenu_bus_te_u;
alpha_bus_tm=attenu_bus_tm_u;
alpha_ring_te=attenu_ring_te_u;
alpha_ring_tm=attenu_ring_tm_u;
end
end
if (readfile_delta_neff == 1) begin
file_te=$fopen(file_deltaneff_te,"r");
file_tm=$fopen(file_deltaneff_tm,"r");
if (file_te == 0 && file_tm == 0) begin
$display("Error: cannot open file %s and %s",file_deltaneff_te,file_deltaneff_tm);
$finish;
end
if (file_te != 0) begin
$fscanf(file_te,"%d",num_lines_deltaneff_te);
for (i=0;i<num_lines_deltaneff_te;i=i+1) begin
$fscanf(file_te,"%f %f %f",delta_neff_te_vdata[i],delta_neff_te_data_r[i],delta_neff_te_data_i[i]);
end
if (file_tm == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_deltaneff_tm,file_deltaneff_te);
num_lines_deltaneff_tm=num_lines_deltaneff_te;
for (i=0;i<num_lines_deltaneff_te;i=i+1) begin
delta_neff_tm_vdata[i]=delta_neff_te_vdata[i];
delta_neff_tm_data_r[i]=delta_neff_te_data_r[i];
delta_neff_tm_data_i[i]=delta_neff_te_data_i[i];
end
end
end
if (file_tm != 0) begin
$fscanf(file_tm,"%d",num_lines_deltaneff_tm);
for (i=0;i<num_lines_deltaneff_tm;i=i+1) begin
$fscanf(file_tm,"%f %f %f",delta_neff_tm_vdata[i],delta_neff_tm_data_r[i],delta_neff_tm_data_i[i]);
end
if (file_te == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_deltaneff_te,file_deltaneff_tm);
num_lines_deltaneff_te=num_lines_deltaneff_tm;
for (i=0;i<num_lines_deltaneff_tm;i=i+1) begin
delta_neff_te_vdata[i]=delta_neff_tm_vdata[i];
delta_neff_te_data_r[i]=delta_neff_tm_data_r[i];
delta_neff_te_data_i[i]=delta_neff_tm_data_i[i];
end
end
end
$fclose(file_te);
$fclose(file_tm);
readfile_delta_neff=2;
end
if (readfile_delta_neff == 2) begin
delta_neff_ter=$table_model(V(Vbias),delta_neff_te_vdata,delta_neff_te_data_r,"3E");
delta_neff_tei=$table_model(V(Vbias),delta_neff_te_vdata,delta_neff_te_data_i,"3E");
if (V(Vbias) < delta_neff_te_vdata[0]) begin
$display("Warning: V(Vbias) %f is out of range of the delta_neff_te table",V(Vbias));
end
else if (V(Vbias) > delta_neff_te_vdata[num_lines_deltaneff_te-1]) begin
$display("Warning: V(Vbias) %f is out of range of the delta_neff_te table",V(Vbias));
end
delta_neff_tmr=$table_model(V(Vbias),delta_neff_tm_vdata,delta_neff_tm_data_r,"3E");
delta_neff_tmi=$table_model(V(Vbias),delta_neff_tm_vdata,delta_neff_tm_data_i,"3E");
if (V(Vbias) < delta_neff_tm_vdata[0]) begin
$display("Warning: V(Vbias) %f is out of range of the delta_neff_tm table",V(Vbias));
end
else if (V(Vbias) > delta_neff_tm_vdata[num_lines_deltaneff_tm-1]) begin
$display("Warning: V(Vbias) %f is out of range of the delta_neff_tm table",V(Vbias));
end
end
if (readfile_neff == 1) begin
file_bus_te=$fopen(file_neff_bus_te,"r");
file_bus_tm=$fopen(file_neff_bus_tm,"r");
file_ring_te=$fopen(file_neff_ring_te,"r");
file_ring_tm=$fopen(file_neff_ring_tm,"r");
if (file_bus_te == 0 && file_bus_tm == 0) begin
$display("Error: cannot open file %s and %s",file_neff_bus_te,file_neff_bus_tm);
$finish;
end
if (file_ring_te == 0 && file_ring_tm == 0) begin
$display("Error: cannot open file %s and %s",file_neff_ring_te,file_neff_ring_tm);
$finish;
end
if (file_bus_te != 0) begin
$fscanf(file_bus_te,"%d",num_lines_neff_bus_te);
for (i=0;i<num_lines_neff_bus_te;i=i+1) begin
$fscanf(file_bus_te,"%f %f %f",neff_bus_te_lamdata[i],neff_bus_te_data_r[i],neff_bus_te_data_i[i]);
end
if (file_bus_tm == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_neff_bus_tm,file_neff_bus_te);
num_lines_neff_bus_tm=num_lines_neff_bus_te;
for (i=0;i<num_lines_neff_bus_te;i=i+1) begin
neff_bus_tm_lamdata[i]=neff_bus_te_lamdata[i];
neff_bus_tm_data_r[i]=neff_bus_te_data_r[i];
neff_bus_tm_data_i[i]=neff_bus_te_data_i[i];
end
end
end
if (file_bus_tm != 0) begin
$fscanf(file_bus_tm,"%d",num_lines_neff_bus_tm);
for (i=0;i<num_lines_neff_bus_tm;i=i+1) begin
$fscanf(file_bus_tm,"%f %f %f",neff_bus_tm_lamdata[i],neff_bus_tm_data_r[i],neff_bus_tm_data_i[i]);
end
if (file_bus_te == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_neff_bus_te,file_neff_bus_tm);
num_lines_neff_bus_te=num_lines_neff_bus_tm;
for (i=0;i<num_lines_neff_bus_tm;i=i+1) begin
neff_bus_te_lamdata[i]=neff_bus_tm_lamdata[i];
neff_bus_te_data_r[i]=neff_bus_tm_data_r[i];
neff_bus_te_data_i[i]=neff_bus_tm_data_i[i];
end
end
end
$fclose(file_bus_te);
$fclose(file_bus_tm);
if (file_ring_te != 0) begin
$fscanf(file_ring_te,"%d",num_lines_neff_ring_te);
for (i=0;i<num_lines_neff_ring_te;i=i+1) begin
$fscanf(file_ring_te,"%f %f %f",neff_ring_te_lamdata[i],neff_ring_te_data_r[i],neff_ring_te_data_i[i]);
end
if (file_ring_tm == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_neff_ring_tm,file_neff_ring_te);
num_lines_neff_ring_tm=num_lines_neff_ring_te;
for (i=0;i<num_lines_neff_ring_te;i=i+1) begin
neff_ring_tm_lamdata[i]=neff_ring_te_lamdata[i];
neff_ring_tm_data_r[i]=neff_ring_te_data_r[i];
end
end
end
if (file_ring_tm != 0) begin
$fscanf(file_ring_tm,"%d",num_lines_neff_ring_tm);
for (i=0;i<num_lines_neff_ring_tm;i=i+1) begin
$fscanf(file_ring_tm,"%f %f %f",neff_ring_tm_lamdata[i],neff_ring_tm_data_r[i],neff_ring_tm_data_i[i]);
end
if (file_ring_te == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_neff_ring_te,file_neff_ring_tm);
num_lines_neff_ring_te=num_lines_neff_ring_tm;
for (i=0;i<num_lines_neff_ring_tm;i=i+1) begin
neff_ring_te_lamdata[i]=neff_ring_tm_lamdata[i];
neff_ring_te_data_r[i]=neff_ring_tm_data_r[i];
neff_ring_te_data_i[i]=neff_ring_tm_data_i[i];
end
end
end
$fclose(file_ring_te);
$fclose(file_ring_tm);
readfile_neff=2;
end
if (readfile_neff ==2) begin
neff_bus_ter_u=$table_model(lam,neff_bus_te_lamdata,neff_bus_te_data_r,"3E");
neff_bus_tei_u=$table_model(lam,neff_bus_te_lamdata,neff_bus_te_data_i,"3E");
if (lam < neff_bus_te_lamdata[0]) begin
$display("Warning: wavelength %e is out of range of the neff_bus_te table",lam);
end
else if (lam > neff_bus_te_lamdata[num_lines_neff_bus_te-1]) begin
$display("Warning: wavelength %e is out of range of the neff_bus_te table",lam);
end
neff_bus_tmr_u=$table_model(lam,neff_bus_tm_lamdata,neff_bus_tm_data_r,"3E");
neff_bus_tmi_u=$table_model(lam,neff_bus_tm_lamdata,neff_bus_tm_data_i,"3E");
if (lam < neff_bus_tm_lamdata[0]) begin
$display("Warning: wavelength %e is out of range of the neff_bus_tm table",lam);
end
else if (lam > neff_bus_tm_lamdata[num_lines_neff_bus_tm-1]) begin
$display("Warning: wavelength %e is out of range of the neff_bus_tm table",lam);
end
neff_ring_ter_u=$table_model(lam,neff_ring_te_lamdata,neff_ring_te_data_r,"3E");
neff_ring_tei_u=$table_model(lam,neff_ring_te_lamdata,neff_ring_te_data_i,"3E");
if (lam < neff_ring_te_lamdata[0]) begin
$display("Warning: wavelength %e is out of range of the neff_ring_te table",lam);
end
else if (lam > neff_ring_te_lamdata[num_lines_neff_ring_te-1]) begin
$display("Warning: wavelength %e is out of range of the neff_ring_te table",lam);
end
neff_ring_tmr_u=$table_model(lam,neff_ring_tm_lamdata,neff_ring_tm_data_r,"3E");
neff_ring_tmi_u=$table_model(lam,neff_ring_tm_lamdata,neff_ring_tm_data_i,"3E");
if (lam < neff_ring_tm_lamdata[0]) begin
$display("Warning: wavelength %e is out of range of the neff_ring_tm table",lam);
end
else if (lam > neff_ring_tm_lamdata[num_lines_neff_ring_tm-1]) begin
$display("Warning: wavelength %e is out of range of the neff_ring_tm table",lam);
end
beta_bus_te=2*`M_PI*freq/`P_C*(neff_bus_ter_u);
beta_bus_tm=2*`M_PI*freq/`P_C*(neff_bus_tmr_u);
beta_ring_te=2*`M_PI*freq/`P_C*(neff_ring_ter_u+delta_neff_ter);
beta_ring_tm=2*`M_PI*freq/`P_C*(neff_ring_tmr_u+delta_neff_tmr);
alpha_bus_te=4*`M_PI*neff_bus_tei_u/lam;
alpha_bus_tm=4*`M_PI*neff_bus_tmi_u/lam;
alpha_ring_te=4*`M_PI*(neff_ring_tei_u+delta_neff_tei)/lam;
alpha_ring_tm=4*`M_PI*(neff_ring_tmi_u+delta_neff_tmi)/lam;
end
if (read_coupling_ring == 1) begin
if (readfile_coupling_ring == 0) begin
readfile_coupling_ring=1;
end
end
else begin
coupling_ring_te_u=coupling_ring_te;
coupling_ring_tm_u=coupling_ring_tm;
end
if (readfile_coupling_ring == 1) begin
file_te=$fopen(file_coupling_ring_te,"r");
file_tm=$fopen(file_coupling_ring_tm,"r");
if (file_te == 0 && file_tm == 0) begin
$display("Error: cannot open file %s and %s",file_coupling_ring_te,file_coupling_ring_tm);
$finish;
end
if (file_te != 0) begin
$fscanf(file_te,"%d",num_lines_coupling_te);
for (i=0;i<num_lines_coupling_te;i=i+1) begin
$fscanf(file_te,"%f %f",coupling_ring_te_lamdata[i],coupling_ring_te_data[i]);
end
if (file_tm == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_coupling_ring_tm,file_coupling_ring_te);
num_lines_coupling_tm=num_lines_coupling_te;
for (i=0;i<num_lines_coupling_te;i=i+1) begin
coupling_ring_tm_lamdata[i]=coupling_ring_te_lamdata[i];
coupling_ring_tm_data[i]=coupling_ring_te_data[i];
end
end
end
if (file_tm != 0) begin
$fscanf(file_tm,"%d",num_lines_coupling_tm);
for (i=0;i<num_lines_coupling_tm;i=i+1) begin
$fscanf(file_tm,"%f %f",coupling_ring_tm_lamdata[i],coupling_ring_tm_data[i]);
end
if (file_te == 0) begin
$display("Warning: cannot open file %s, using %s instead",file_coupling_ring_te,file_coupling_ring_tm);
num_lines_coupling_te=num_lines_coupling_tm;
for (i=0;i<num_lines_coupling_tm;i=i+1) begin
coupling_ring_te_lamdata[i]=coupling_ring_tm_lamdata[i];
coupling_ring_te_data[i]=coupling_ring_tm_data[i];
end
end
end
$fclose(file_te);
$fclose(file_tm);
readfile_coupling_ring=2;
end
if (readfile_coupling_ring ==2) begin
coupling_ring_te_u=$table_model(lam,coupling_ring_te_lamdata,coupling_ring_te_data,"3E");
if (lam < coupling_ring_te_lamdata[0]) begin
$display("Warning: wavelength %e is out of range of the coupling_ring_te table",lam);
end
else if (lam > coupling_ring_te_lamdata[num_lines_coupling_te-1]) begin
$display("Warning: wavelength %e is out of range of the coupling_ring_te table",lam);
end
coupling_ring_tm_u=$table_model(lam,coupling_ring_tm_lamdata,coupling_ring_tm_data,"3E");
if (lam < coupling_ring_tm_lamdata[0]) begin
$display("Warning: wavelength %e is out of range of the coupling_ring_tm table",lam);
end
else if (lam > coupling_ring_tm_lamdata[num_lines_coupling_tm-1]) begin
$display("Warning: wavelength %e is out of range of the coupling_ring_tm table",lam);
end
end
beta_bus_ter=beta_bus_te;
beta_bus_tei=-0.5*alpha_bus_te;
beta_bus_tmr=beta_bus_tm;
beta_bus_tmi=-0.5*alpha_bus_tm;
beta_ring_ter=beta_ring_te;
beta_ring_tei=-0.5*alpha_ring_te;
beta_ring_tmr=beta_ring_tm;
beta_ring_tmi=-0.5*alpha_ring_tm;
t_te=sqrt(1-coupling_ring_te_u);
t_tm=sqrt(1-coupling_ring_tm_u);
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