//VerilogA for amp,soa,veriloga

`include "constants.vams"
`include "disciplines.vams"

module soa(Ipow,Iphase,Ilam,Opow,Ophase,Olam,Vinj,Gnd);
    parameter real length = 500e-6 from (0:1e-3];
    parameter real width = 3e-6 from (0:50e-6];
    parameter real height = 80e-9 from (0:5e-6];
    parameter real gamma = 0.15 from (0:1];
    parameter real alpha_s = 4000 from (0:5e4];
    parameter real dg = 2.78e-20 from (0:50e-20];
    parameter real Ntr = 1.4e24 from (0:5e25];
    parameter real alpha = 5.0 from [-20:20];
    parameter real A = 1.43e8 from [0:1e11];
    parameter real B = 1e-16 from (0:1e-13];
    parameter real C = 3e-41 from (0:1e-37];

    input Ipow,Iphase,Ilam,Vinj;
    output Opow,Ophase,Olam;
    inout Gnd;
    electrical Ipow,Iphase,Ilam,Vinj,Opow,Ophase,Olam,Gnd;
    electrical Na;

    real eir,eii,soar,soai,eor,eoi;
    real E_in,ph_in;
    real g,gtot,Pav,N;
    real Vsoa;
    real freq;

    branch(Gnd,Na) Iin;
    branch(Na,Gnd) C1,Ra,Ib,Ic,Iav;

    analog initial begin
        N=3e24;
    end

    analog begin
        freq=`P_C/V(Ilam);
        Vsoa=length*width*height;
        
        N=V(Na)/(`P_Q*Vsoa);
        g=dg*(N-Ntr);
        gtot=gamma*g-alpha_s;
        Pav=V(Ipow)*(exp(gtot*length)-1)/(gtot*length);

        I(Iin) <+ I(Vinj);
        I(C1) <+ ddt(V(C1));
        I(Ra) <+ A*V(Ra);
        I(Ib) <+ `P_Q*Vsoa*B*pow(N,2);
        I(Ic) <+ `P_Q*Vsoa*C*pow(N,3);
        I(Iav) <+ `P_Q*gamma*g*Pav*length/(`P_H*freq);

        E_in=sqrt(V(Ipow));
        ph_in=V(Iphase)/360*2*`M_PI;
        eir=E_in*cos(ph_in);
        eii=E_in*sin(ph_in);
        soar=exp((gamma*g*length-alpha_s*length)/2)*cos(alpha*gamma*g*length/2);
        soai=exp((gamma*g*length-alpha_s*length)/2)*sin(alpha*gamma*g*length/2);
        eor=soar*eir-soai*eii;
        eoi=soai*eir+soar*eii;

        V(Opow) <+ eor**2+eoi**2;
        V(Ophase) <+ atan2(eoi,eor)*360/(2*`M_PI);
        V(Olam) <+ V(Ilam);
    end


endmodule