% LC oscillator design.
% (a tradeoff figure between the power and phase noise is generated)
%
% This is an example taken directly from the paper:
%
%   Geometric Programming and its Applications to EDA Problems
%   (DATE Tutorial 2005) by Boyd, Kim, and Mohan.
%   (see pages 102-113)
%
% Designs an LC oscillator consisting of a loop inductor, varactors
% for fine tuning, binary weighted switching capacitors for coarse
% tuning, cross coupled NMOS transistors, and tail current source.
% The optimal LC oscillator design iwith minimum power consumption,
% and limits on phase noise, area, etc... can be formulated as a GP:
%
%   minimize   P
%       s.t.   N <= Nmax, A <= Amax, l >= lmin, etc.
%
% where optimization variables are loop inductor dimensions D,W,
% size of varactor Vc, size of switching caps Csw, width and length
% of transistors Wnmos, Lnmos, bias current Ibias, etc.
%
% Original code by S. Mohan.
% Almir Mutapcic 02/03/06

%********************************************************************
% problem data
%********************************************************************
Vdd   = 1.2;         % voltage
CL    = 0.2e-12;     % load capcitance
F     = 5e9;         % operating frequency in Hz
omega = 2*pi*F;      % operating freq. in radians

PNSpec = 0.7e-11;    % phase noise specs
FOff   = 6e5;        % offset frequency for phase noise calculation
LoopGainSpec = 2.0;  % loop gain spec
Vbias  = 0.2;        % non ideality of current mirror

% tuning specs
T         = 0.1;     % +/- tuning range as a normalized value
CvarRatio = 3;       % maximum to minimum value of CVar
CswBits   = 3;
CswSegs   = 2^(CswBits);
CvarCswLSBOverlap = 2;

%********************************************************************
% optimization of LC oscillator
%********************************************************************
% optimization variables
gpvar D;        % diameter of loop inductor
gpvar W;        % width of loop inductor
gpvar SRF;      % self resonance frequency
gpvar l;        % length of CMOS transistor
gpvar w;        % width of CMOS transistor
gpvar I;        % maximum current through CMOS transistor
gpvar VOsc;     % differential voltage amplitude
gpvar CT;       % total capacitance of oscillator
gpvar Csw;      % maximum switching capacitance
gpvar Cvar;     % minimum variable capacitance
gpvar IBias;    % bias current
gpvar CMaxFreq; % capacitor max frequency

%********************************************************************
% loop inductor definitions and constraints
%********************************************************************
SRFSpec  = 3*F;
omegaSRF = 2*pi*SRF;

% inductance
L = 2.1e-06*D^(1.28)*(W)^(-0.25)*(F)^(-0.01);
% series resistance
R = 0.1*D/W+3e-6*D*W^(-0.84)*F^(0.5)+5e-9*D*W^(-0.76)*F^(0.75)+0.02*D*W*F;
% effective capacitance
C = 1e-11*D+5e-6*D*W;

% area, tank conductance, and inverse quality factor
Area = (D+W)^2;
G    = R/(omega*L)^2;
invQ = R/(omega*L);

loop_constr = [ Area <= 0.25e-6;
W <= 30e-6;
5e-6 <= W;
10*W <= D;
D <= 100*W;
SRFSpec <= SRF;
omegaSRF^2*L*C <= 1 ];

%********************************************************************
% transistor definitions and constraints
%********************************************************************
GM  = 6e-3*(w/l)^0.6*(I/2)^(0.4);
GD  = 4e-10*(w/l)^0.4*(I/2)^(0.6)*1/l;
Vgs = 0.34+1e-8/l+800*(I*l/(2*w))^0.7;
Cgs = 1e-2*w*l;
Cgd = 1e-9*w;
Cdb = 1e-9*w;

transistor_constr = [ 2e-6 <= w;
0.13e-6 <= l;
l <= 1e-6 ];

%********************************************************************
% overall LC oscillator definitions and constraints
%********************************************************************
% power
power   = Vdd*IBias;
invVOsc = (G+GD)/IBias;

% phase noise
kT4  = 4*1.38e-23*300;
kT4G = 2*kT4;
LoopCurrentNoise = kT4*G;
TransistorCurrentNoise = 0.5*kT4G*GM;
PN = 1/(160*(FOff*VOsc*CT)^2)*(LoopCurrentNoise+TransistorCurrentNoise);

% capacitance
Cfix = C+0.5*(CL+Cgs+Cdb+4*Cgd); % fixed capacitance
CDiffMaxFreq = Cfix+0.5*Cvar;

invLoopGain=(G+0.5*GD)/(0.5*GM);

% collect all of the LC oscillator constraints
constr = [ PN <= PNSpec;
loop_constr;
transistor_constr;
omega^2*L*CT == 1;
omega^2*(1+T)^2*L*CMaxFreq == 1;
4*T/((1-T^2)^2)*CT <= Csw*(1+CvarCswLSBOverlap/CswSegs);
Csw*CvarCswLSBOverlap/CswSegs <= 0.5*Cvar*(CvarRatio-1);
CDiffMaxFreq <= CMaxFreq;
VOsc+2*Vbias <= 2*Vdd;
VOsc*invVOsc <= 1;
invLoopGain*LoopGainSpec <= 1; % loop gain spec
Vbias+Vgs+IBias/2*R/2 <= Vdd;  % bias constraint spec
I == IBias ];


%********************************************************************
% solve the problem and generate the tradeoff curve
%********************************************************************
% set the quiet flag (no solver reporting)
global QUIET; QUIET = 1;

powers = [];
for T = 0.15 % can also vary tuning T = 0.05:0.05:0.2
  for PNSpec=0.7e-12:0.2e-12:1e-11
    constr(1) = PN <= PNSpec;
    [min_power solution status] = gpsolve(power,constr);
    powers = [powers min_power];
  end
end

% enable solver reporting again
global QUIET; QUIET = 0;

% plot the tradeoff curve
PNSpec = [0.7e-12:0.2e-12:1e-11];
plot(10*log10(PNSpec),powers/1e-3);
xlabel('Phase Noise (dBc/Hz)')
ylabel('Power (mW)')
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.
Problem succesfully solved.