Code covered by the BSD License  

Highlights from
INTERFACE BETWEEN MATLAB AND CADENCE FOR MACRO-MODEL EXTRACTION

image thumbnail
from INTERFACE BETWEEN MATLAB AND CADENCE FOR MACRO-MODEL EXTRACTION by Philippe BENABES
launch cadence analog simulations from Matlab and extract a macromodel of linear analog functions

write_variant_to_gui.m
%---------------------------------------------------
% Ce programme est la propriete exclusive de SUPELEC
% Tout  usage  non  authorise  ou reproduction de ce
% programme est strictement defendu. 
% Copyright  (c) 2010  SUPELEC  Departement SSE
% Tous droits reserves
%---------------------------------------------------
%
% fichier : write_variant_to_gui.m
% auteur  : P.BENABES & C.TUGUI 
% Copyright (c) 2010 SUPELEC
% Revision: 2.0  Date: 29/10/2010
%
%---------------------------------------------------
%
% DESCRIPTION DU MODULE :
%   
%
% MODULES UTILISES :
%
%---------------------------------------------------

%Write variant parameters to gui

corrupt_var=0;

%hv=[handles.popupmenu59 handles.popupmenu97 handles.popupmenu119 handles.popupmenu118 handles.popupmenu125 handles.popupmenu124];
%hi=[handles.popupmenu103 handles.popupmenu102 handles.popupmenu121 handles.popupmenu120 handles.popupmenu127 handles.popupmenu126];
%hd=[handles.popupmenu105 handles.popupmenu106 handles.popupmenu117 handles.popupmenu116 handles.popupmenu123 handles.popupmenu122];
handpopmenu ;

%%General

if isfield(model_par,'machines')
    set(handles.edit38,'String',model_par.machines);
else
    set(handles.edit38,'String',[]);    
end

if ~isfield(model_par,'gen_sources')
    model_par.gen_sources=0 ;
end
if ~isfield(model_par,'gen_supply')
    model_par.gen_supply=0 ;
end
if ~isfield(model_par,'rev_trfunction')
    model_par.rev_trfunction=0 ;
end
if ~isfield(model_par,'numout')
    model_par.numout=1 ;
end

set(handles.checkbox40,'Value',model_par.rev_trfunction);


if model_par.gen_sources==1
    %Mode diff enabled on input
    handles.gen_sources=1;
    set(handles.edit39,'Enable','on');
    set(handles.edit39,'String',num2str(model_par.inoffset));
    
    set(handles.edit40,'Enable','on');
    set(handles.edit40,'String',num2str(model_par.outoffset));
    set(handles.checkbox34,'Value',1);
    
    set(handles.checkbox35,'Enable','on');
    handles.gen_supply=0;
    set(handles.popupmenu109,'Enable','on');
    set(handles.popupmenu109,'String',{'Constant','Sine','Square'});
    
    %GND
    nets_as_vect{1}='<None>';
    if size(handles.net_meas,2)>size(handles.net_meas,1)
        sz=size(handles.net_meas,2);
    else
        sz=size(handles.net_meas,1);
    end
        
    for i=1:sz
        nets_as_vect{i+1}=handles.net_meas{i};
    end
    
    if isfield(model_par,'gnd')
        
        set_popup_on(handles.popupmenu112,nets_as_vect);
        
        if ~isempty(model_par.gnd)
            corrupt_var = set_popup(handles.popupmenu112,strrep(model_par.gnd,':n',''),corrupt_var) ;
        else
            corrupt_var = set_popup(handles.popupmenu112,'<None>',corrupt_var) ;
        end
    else
        
        set_popup_on(handles.popupmenu112,nets_as_vect);
        corrupt_var = set_popup(handles.popupmenu112,'<None>',corrupt_var) ;
    end
    
    if model_par.gen_supply==1
        handles.gen_supply=1;
        set(handles.checkbox35,'Value',1);   
        set(handles.edit41,'Enable','on');
        if isfield(model_par,'supply_value')
            set(handles.edit41,'String',num2str(model_par.supply_value));
        else
            corrupt_var=1;
        end
    else
        handles.gen_supply=0;
        set(handles.checkbox35,'Value',0);   
        set(handles.edit41,'Enable','off');
    end

else
    %Disable
    handles.gen_sources=0;
    handles.gen_supply=0;
    set_edit_off(handles.edit39);
    set_edit_off(handles.edit40);
    set(handles.checkbox34,'Value',0);   
    set_check_off(handles.checkbox35);
    set_edit_off(handles.edit41);
    set_popup_off(handles.popupmenu109,'Constant');
    
end


%In name and kind
if isfield(model_par,'in_kind')
    if strcmp(model_par.in_kind,'V')
        set(handles.radiobutton57,'Value',1) %then primary input is V
        handles.in_kind='V';
    elseif strcmp(model_par.in_kind,'I')
        set(handles.radiobutton58,'Value',1) %then primary input is I
        handles.in_kind='I';
    else
        corrupt_var=1;
        handles.in_kind=[];
    end
else
    corrupt_var=1;
end


if isfield(model_par,'in_kind')
        
    if isfield(model_par,'in_Vname')
        set_popup_on(handles.popupmenu58,handles.net_meas);
        corrupt_var = set_popup(handles.popupmenu58,strrep(model_par.in_Vname{1},':n',''),corrupt_var) ;
    else
        corrupt_var=1;
    end

    if (model_par.gen_sources==0)       % sources are not generated
        if isfield(model_par,'in_Iname')
            set_popup_on(handles.popupmenu101,handles.crt_meas);
            corrupt_var = set_popup(handles.popupmenu101,model_par.in_Iname{1},corrupt_var) ;
        else
            corrupt_var=1;
        end
    else
        set_popup_off(handles.popupmenu101,'<Ii1>')
    end
        
    
else
    corrupt_var=1;
end

        
%Out name and kind
if isfield(model_par,'out_kind')
    if strcmp(model_par.out_kind,'V')
        set(handles.radiobutton59,'Value',1) %then primary input is V
        handles.out_kind='V';
    elseif strcmp(model_par.out_kind,'I')
        set(handles.radiobutton60,'Value',1) %then primary input is I
        handles.out_kind='I';
    else
        corrupt_var=1;
        handles.out_kind=[];
    end
else
    corrupt_var=1;
end

for no=0:2
    for df=1:2
        set_popup_off(hv(no*2+df),['<Vo' num2str(df) 'A'+no '>']);
        set_popup_off(hi(no*2+df),['<Io' num2str(df) 'A'+no '>']);
        set_popup_off(hd(no*2+df),['<Diff' num2str(df) 'A'+no '>']);
    end
end


if isfield(model_par,'out_kind')
  for k=1:model_par.numout     
    if isfield(model_par,'out_Vname')
        set_popup_on(hv(2*k-1),handles.net_meas);
        corrupt_var = set_popup(hv(2*k-1),strrep(model_par.out_Vname{2*k-1},':n',''),corrupt_var) ;
    else
        corrupt_var=1;
    end

    if (model_par.gen_sources==0)       % sources are not generated
        if isfield(model_par,'out_Iname')
            set_popup_on(hi(2*k-1),handles.crt_meas);
            corrupt_var = set_popup(hi(2*k-1),model_par.out_Iname{2*k-1},corrupt_var) ;
        else
            corrupt_var=1;
        end
    else
        set_popup_off(hi(2*k-1),['<Io1' 'A'+no-1 '>']);
    end    
  end 
else
    corrupt_var=1;
end

%Supply name
if (model_par.gen_sources==0)       % sources are not generated
    if isfield(model_par,'alim_Iname')
        set_popup_on(handles.popupmenu60,handles.crt_meas);
        corrupt_var = set_popup(handles.popupmenu60,model_par.alim_Iname,corrupt_var) ;
    else
        corrupt_var=1;
    end
else
    set_popup_off(handles.popupmenu60,'<I_s>')
end        

if isfield(model_par,'alim_Vname')
    set_popup_on(handles.popupmenu110,['<none>' handles.net_meas]);
    corrupt_var = set_popup(handles.popupmenu110,model_par.alim_Vname,corrupt_var) ;
else
    corrupt_var=1;
end


%Design variables
if isempty(des_var)
    set(handles.pushbutton25,'enable','Off');
else
   set(handles.pushbutton25,'enable','On');
   for k=1:size(des_var,2)
       for l=1:size(handles.des_var,2)
           if strcmp(des_var(k).name,handles.des_var(l).name)
               handles.des_var(l).value=des_var(k).value ;
           end
       end
   end
end 



% get design variables
vars_as_vect=[];
for i=1:size(handles.des_var,2)
    vars_as_vect{i}=handles.des_var(i).name;
end

%Populate diffI1 menu
set(handles.popupmenu61,'String',vars_as_vect);

if (model_par.gen_sources==0)       % sources are not generated
    if isfield(model_par,'mode_var_I')
        corrupt_var = set_popup(handles.popupmenu61,model_par.mode_var_I{1},corrupt_var) ;
    else 
        corrupt_var=1;
    end
else
    set_popup_off(handles.popupmenu61,'<DiffI1>')
end        
        
%Diff_mode IN
if isfield(model_par,'mode_diff_enabled')
        
    if model_par.mode_diff_enabled
        set(handles.checkbox14,'Enable','on');
        set(handles.checkbox14,'Value',1);
        handles.mode_diff_enabled=1;
        
        %Populate diffI2 menu
        set(handles.popupmenu104,'String',vars_as_vect);
              
        if (model_par.gen_sources==0)       % sources are not generated
           if isfield(model_par,'mode_var_I')
                corrupt_var = set_popup(handles.popupmenu104,model_par.mode_var_I{2},corrupt_var) ;
            else 
                corrupt_var=1;
           end
        else
            set_popup_off(handles.popupmenu104,'<DiffI2>')
        end
        %Populate In2 menu
        
        net_meas=handles.net_meas;
        crt_meas=handles.crt_meas;
        
        set(handles.popupmenu96,'String',net_meas);
        set(handles.popupmenu100,'String',crt_meas);
        

        if isfield(model_par,'in_kind')
        
            if isfield(model_par,'in_Vname')
                if size(model_par.in_Vname,2)>1
                    corrupt_var = set_popup(handles.popupmenu96,strrep(model_par.in_Vname{2},':n',''),corrupt_var) ;
                else
                    corrupt_var=1;
                end
            else
                corrupt_var=1;
            end

            if (model_par.gen_sources==0)       % sources are not generated
                if isfield(model_par,'in_Iname')
                    if size(model_par.in_Iname,2)>1
                        corrupt_var = set_popup(handles.popupmenu100,model_par.in_Iname{2},corrupt_var) ;
                    else
                        corrupt_var=1;
                    end
                else
                    corrupt_var=1;
                end
            else
                set_popup_off(handles.popupmenu100,'<Ii2>')
            end

        else
            corrupt_var=1;
        end
        
    else
        set(handles.checkbox14,'Enable','on');
        set(handles.checkbox14,'Value',0);
        
        set_popup_off(handles.popupmenu96,'<Vi2>')
        set_popup_off(handles.popupmenu100,'<Ii2>')
        
    end
else
    corrupt_var=1;
end


%Populate diffO1 menu

for k=1:model_par.numout
    set(hd(2*k-1),'String',vars_as_vect);
    if (model_par.gen_sources==0)       % sources are not generated
        if isfield(model_par,'mode_var_O')
            corrupt_var = set_popup(hd(2*k-1),model_par.mode_var_O{2*k-1},corrupt_var) ;
        else 
            corrupt_var=1;
        end
    else
        set_popup_off(hd(2*k-1),['<Diff1' 'A'+no-1 '>']);
    end
end

%Diff_mode OUT
handles.numout=model_par.numout ;
if isfield(model_par,'mode_diff_enabled_out')
    if model_par.mode_diff_enabled_out
        set(handles.popupmenu128,'Value',model_par.numout*2);
        st129='All' ; 
        for k=1:model_par.numout
            st129=[st129 '|' '0'+k];
        end
        set(handles.popupmenu129,'Value',1);
        set(handles.popupmenu129,'String',st129);
        handles.mode_diff_enabled_out=1;
        
        %Populate diffO2 menu
        for k=1:model_par.numout
            if (model_par.gen_sources==0)       % sources are not generated
                set(hd(2*k),'String',vars_as_vect);       
                if isfield(model_par,'mode_var_O')
                    corrupt_var = set_popup(hd(2*k),model_par.mode_var_O{2*k},corrupt_var) ;
                else 
                    corrupt_var=1;
                end
            else
                set_popup_off(hd(2*k),['<Diff2' 'A'+no-1 '>']);
            end
        end    

           
        
        
        %Populate Out2 menu
        
        %set(handles.popupmenu102,'Enable','on');
        
        net_meas=handles.net_meas;
        crt_meas=handles.crt_meas;
        
        for k=1:model_par.numout
            if isfield(model_par,'out_kind')

                if ~isempty(model_par.out_Vname{2*k})
                   set_popup_on(hv(2*k),handles.net_meas);
                   corrupt_var = set_popup(hv(2*k),strrep(model_par.out_Vname{2*k},':n',''),corrupt_var) ;
                else
                    corrupt_var=1;
                end

                if (model_par.gen_sources==0)       % sources are not generated
                    if ~isempty(model_par.out_Iname{2*k})
                        set_popup_on(hi(2*k),handles.crt_meas);
                        corrupt_var = set_popup(hi(2*k),model_par.out_Iname{2*k},corrupt_var) ;
                    else
                        corrupt_var=1;
                    end
                else
                     set_popup_off(hi(2*k),['<Io2' 'A'+no-1 '>']);
                end
            else
                corrupt_var=1;
            end
        end
        
    else
        set(handles.popupmenu128,'Value',model_par.numout*2-1);
        st129='All' ; 
        for k=1:model_par.numout
            st129=[st129 '|' '0'+k];
        end
        set(handles.popupmenu129,'Value',1);
        set(handles.popupmenu129,'String',st129);
        
%        set_popup_off(handles.popupmenu97,'<Vo2>')
%        set_popup_off(handles.popupmenu102,'<Io2>')
        
    end
else
    corrupt_var=1;
end
    
%%Transient

if ~isempty(trans_an)
    set(handles.checkbox17,'Value',1);
    handles.trans_enabled=1;
    
    %Unlock all TRANS features when TRANS analysis enabled
    set(handles.edit4,'Enable','on');
    set(handles.edit5,'Enable','on');
    set(handles.edit8,'Enable','on');
    set(handles.edit9,'Enable','on');
    set(handles.edit11,'Enable','on');
    set(handles.edit12,'Enable','on');
    set(handles.pushbutton27,'Enable','on');
                       
    %Populate features
    
    set(handles.popupmenu62,'String',vars_as_vect);
    set(handles.popupmenu63,'String',vars_as_vect);
    set(handles.popupmenu68,'String',vars_as_vect);
    
    if (model_par.gen_sources==0)       % sources are not generated
        if isfield(trans_an,'naminmax')            
            corrupt_var = set_popup(handles.popupmenu62,trans_an.naminmax,corrupt_var) ;
        else
            corrupt_var=1;
        end 


        if isfield(trans_an,'naminmin')
            corrupt_var = set_popup(handles.popupmenu63,trans_an.naminmin,corrupt_var) ;
        else
             corrupt_var=1;
        end 


        if isfield(trans_an,'nam_per_tr')
            corrupt_var = set_popup(handles.popupmenu68,trans_an.nam_per_tr,corrupt_var) ;
        else
             corrupt_var=1;
        end
    else
        set_popup_off(handles.popupmenu62,'<TR_max>');
        set_popup_off(handles.popupmenu63,'<TR_min>');
        set_popup_off(handles.popupmenu68,'<TR_per>');
    end
    
    if (model_par.gen_sources==1)
        if isfield(trans_an,'type')            
            corrupt_var = set_popup(handles.popupmenu109,trans_an.type,corrupt_var) ;
        else
            corrupt_var=1;
        end
    end

     
    if isfield(trans_an,'valinmax')    
        set(handles.edit5,'String',num2str(trans_an.valinmax));
    else
        corrupt_var=1;
    end
      
    if isfield(trans_an,'valinmin')    
        set(handles.edit4,'String',num2str(trans_an.valinmin));
    else
        corrupt_var=1;
    end
    
    if isfield(trans_an,'per_tr')    
        set(handles.edit8,'String',num2str(trans_an.per_tr));
    else
        corrupt_var=1;
    end
        
    if isfield(trans_an,'start')    
        set(handles.edit9,'String',num2str(trans_an.start));
    else
        corrupt_var=1;
    end
    
    if isfield(trans_an,'stop')    
        set(handles.edit12,'String',num2str(trans_an.stop));
    else
        corrupt_var=1;
    end
    
    if isfield(trans_an,'step')    
        set(handles.edit11,'String',num2str(trans_an.step));
    else
        corrupt_var=1;
    end
    
else
    set(handles.checkbox17,'Value',0);
    handles.trans_enabled=0;
end
    

%%DC

if ~isempty(dc_an)
    set(handles.checkbox20,'Value',1);
    handles.dc_enabled=1;
    set(handles.popupmenu132,'Enable','on');

    %Populate features
    
    vars_as_vect{1}='<None>';
    for i=1:size(handles.des_var,2)
            vars_as_vect{i+1}=handles.des_var(i).name;
    end
    
    set(handles.popupmenu132,'String',vars_as_vect);

    %Unlock all DC features when DC analysis enabled
    set(handles.edit13,'Enable','on');
        
    set(handles.edit14,'Enable','on');
        
    set(handles.edit15,'Enable','on');
    
    if isfield(model_par,'mode_diff_enabled')
        if model_par.mode_diff_enabled==1
            set(handles.edit37,'Enable','on');
        end
    end
        
    
    %Populate features 
    
    if (model_par.gen_sources==0)       % sources are not generated
        set(handles.popupmenu34,'String',vars_as_vect);
        if isfield(dc_an,'par_name')
            corrupt_var = set_popup(handles.popupmenu34,dc_an.par_name,corrupt_var) ;
        else
             corrupt_var=1;
        end
    else
        set_popup_off(handles.popupmenu34,'<DC_var>');
    end
    
    if isfield(dc_an,'par_start')    
        set(handles.edit13,'String',num2str(dc_an.par_start));
    else
        corrupt_var=1;
    end
    
    if isfield(dc_an,'par_stop')    
        set(handles.edit14,'String',num2str(dc_an.par_stop));
    else
        corrupt_var=1;
    end
    
    if isfield(model_par,'mode_diff_enabled')
        if model_par.mode_diff_enabled==1
            if isfield(dc_an,'par_diff_max')    
                set(handles.edit37,'String',num2str(dc_an.par_diff_max));
            else
                corrupt_var=1;
            end
        end
    end
    
    if isfield(dc_an,'par_gain')    
        set(handles.edit15,'String',num2str(dc_an.par_gain));
    else
        corrupt_var=1;
    end

    if isfield(dc_an,'naminC')
        if ~isempty(dc_an.naminC)
            corrupt_var = set_popup(handles.popupmenu132,dc_an.naminC,corrupt_var) ;
        else    
            set(handles.popupmenu132,'Value',1);
        end
    else
        corrupt_var=1;
    end
    
else
    set(handles.checkbox20,'Value',0);
    handles.dc_enabled=0;
end



%%Param

if ~isempty(par_an)
    set(handles.checkbox21,'Value',1);
    handles.par_enabled=1;
    
    %Unlock all Par features when Par analysis enabled
    set(handles.edit19,'Enable','on'); 
    set(handles.edit20,'Enable','on');
    set(handles.edit21,'Enable','on');
    set(handles.popupmenu77,'Enable','on');
    
    
    %Populate features     
    if (model_par.gen_sources==0)       % sources are not generated
        set(handles.popupmenu77,'String',vars_as_vect);
        if isfield(par_an,'var_name')    
            corrupt_var = set_popup(handles.popupmenu77,par_an.var_name,corrupt_var) ;
        else
             corrupt_var=1;
        end
    else
        set_popup_off(handles.popupmenu77,'<DC_OUT_var>');
    end
            
        
    if isfield(par_an,'start')    
        set(handles.edit19,'String',num2str(par_an.start));
    else
        corrupt_var=1;
    end
    
    if isfield(par_an,'stop')    
        set(handles.edit21,'String',num2str(par_an.stop));
    else
        corrupt_var=1;
    end
    
    if isfield(par_an,'npt')    
        set(handles.edit20,'String',num2str(par_an.npt));
    else
        corrupt_var=1;
    end
else
    set(handles.checkbox21,'Value',0);
    handles.par_enabled=0;
end

%%AC in

if (~isempty(ac_an))&&(isfield(ac_an,'start'))

    set(handles.checkbox25,'Value',1);
    handles.ac_in_enabled=1;
    
    %Unlock all AC in features when AC in analysis enabled
    
    set(handles.edit22,'Enable','on');
    set(handles.edit23,'Enable','on');
    set(handles.edit24,'Enable','on');
    set(handles.edit25,'Enable','on');
    set_check_on(handles.checkbox22);
    set(handles.popupmenu40,'Enable','on');
   
    %Populate features
    
    vars_as_vect{1}='<None>';
    for i=1:size(handles.des_var,2)
            vars_as_vect{i+1}=handles.des_var(i).name;
    end
    
    set(handles.popupmenu40,'String',vars_as_vect);

    if isfield(ac_an,'start')    
        set(handles.edit22,'String',num2str(ac_an.start));
    else
        corrupt_var=1;
    end
    
    if isfield(ac_an,'stop')    
        set(handles.edit24,'String',num2str(ac_an.stop));
    else
        corrupt_var=1;
    end
    
    if isfield(ac_an,'points')    
        set(handles.edit23,'String',num2str(ac_an.points));
    else
        corrupt_var=1;
    end
    
    if isfield(ac_an,'f0')    
        set(handles.edit25,'String',num2str(ac_an.f0));
    else
        corrupt_var=1;
    end

    if isfield(ac_an,'enable_ac_norm')   
        set(handles.checkbox32,'Enable','on');
        if ac_an.enable_ac_norm
          set(handles.checkbox32,'Value',1);
          handles.enable_ac_norm=1;
        else
          set(handles.checkbox32,'Value',0);
          handles.enable_ac_norm=0;
        end
    end
    
end


if (~isempty(ac_in_an))&&(isfield(ac_in_an,'naminC'))
    
    
    if isfield(ac_in_an,'naminC')
        if ~isempty(ac_in_an.naminC)
            corrupt_var = set_popup(handles.popupmenu40,ac_in_an.naminC,corrupt_var) ;
        else    
            set(handles.popupmenu40,'Value',1);
        end
    else
        corrupt_var=1;
    end
    
    
    if isfield(ac_in_an,'ord_Zin')    
          set(handles.checkbox22,'Enable','on');
          set(handles.checkbox22,'Value',1);
          set(handles.popupmenu85,'Value',ac_in_an.ord_Zin+1);
          set(handles.popupmenu85,'Enable','on');
          set(handles.popupmenu107,'Value',ac_in_an.ord_trf+1);
          set(handles.popupmenu107,'Enable','on');
          handles.extract_ac_in_pz=1;
    end
    
    
else
    set(handles.checkbox25,'Value',0);
    handles.ac_in_enabled=0;
end


%%AC out

if (~isempty(ac_out_an))&&(isfield(ac_out_an,'namoutC'))
    
    set(handles.checkbox29,'Value',1);
    handles.ac_out_enabled=1;
    
    %Unlock all AC in features when AC in analysis enabled
    
    set(handles.checkbox28,'Enable','on');
    %set(handles.checkbox28,'Value',0);
       
    
    set(handles.popupmenu93,'Enable','on');
      
    set(handles.popupmenu93,'String',vars_as_vect);
    
    if isfield(ac_out_an,'namoutC')
        if ~isempty(ac_out_an.namoutC)
            corrupt_var = set_popup(handles.popupmenu93,ac_out_an.namoutC,corrupt_var) ;
        else    
            set(handles.popupmenu93,'Value',1);
        end
    else
        corrupt_var=1;
    end
        
    if isfield(ac_out_an,'ord_Zout')    
          handles.extract_ac_out_pz=1;
          set(handles.checkbox28,'Enable','on');
          set(handles.checkbox28,'Value',1);
          set(handles.popupmenu94,'Value',ac_out_an.ord_Zout+1);
          set(handles.popupmenu94,'Enable','on');
          set(handles.popupmenu108,'Value',ac_out_an.ord_invf+1);
          set(handles.popupmenu108,'Enable','on');
    end
        
else
    set(handles.checkbox29,'Value',0);
    handles.ac_out_enabled=0;
end

%%vhdl

if isfield(model_par,'vhdl_filename')
    set(handles.edit42,'String',model_par.vhdl_filename);
end

%Verify corruption of variant file
if corrupt_var
    errordlg('Variant file corrupted! Only some parameters loaded.','Variant corrupted');
end

Contact us at files@mathworks.com