function [ok,scs_m,%cpr] = scicos_codegeneration(scs_m,Params) // Function for running scicos code generation of a diagram // in batch mode. // [ok,scs_m,%cpr] = scicos_codegeneration(scs_m,Params) // // scs_m: scicos diagram (obtained by "load file.cos") // // Params: a list of properties for scicos code generation // // Params(1) : silent_mode : if 1 then no message are displayed // during the code generation and default values // are taken for the target directory and names. // Params(2) : cblock : if 1 the generated block is replaced by // a CBLOCK4 that enclosed the generic parameters // and the generated computational function. // Params(3) : rdnom : sets the default name for the generated // code. // Params(4) : rpat : sets the default target path for the // generated code. // Params(5) : libs : sets the additional external libraries // needed by code generation. // Params(6) : opt : if 0, then the standalone code will not // be generated -default 1-. // Params(7) : enable_debug : says if additionnal code must be // generated to debug generated code. // Params(8) : scopes : list of additionnal scopes used in scs_m; // this params must be a matrix of string of size -1,2 // Params(9) : remove : list of blocks that must be removed for the // generated code; this params must be a matrix of string // of size -1,2 // //@@ default value %cpr=list() //** check type/number of rhs parameters mess=[] if argn(2)>=1 then if typeof(scs_m)<>'diagram'&typeof(scs_m)<>'list' then mess='first Rhs must be a scicos diagram.' end if argn(2)>=2 then if type(Params)<>15 then mess=[mess;'second Rhs must be a list.'] end else Params=list() end else mess='incorrect number of arguments in function call...' end if mess<>[] then error('scicos_codegeneration : '+mess) end %scicos_context=struct(); //** define Scicos data tables if (~isdef("scicos_pal") | ~isdef("%scicos_display_mode") | ~isdef("modelica_libs") | .. ~isdef("scicos_pal_libs") | ~isdef("%scicos_libs") | ~isdef("%scicos_cflags")) then [scicos_pal, %scicos_menu, %scicos_short, %scicos_help,... %scicos_display_mode, modelica_libs, scicos_pal_libs,... %scicos_lhb_list, %CmenuTypeOneVector, %scicos_gif,... %scicos_contrib,%scicos_libs,%scicos_cflags] = initial_scicos_tables() ; clear initial_scicos_tables end //** initialize a "scicos_debug_gr" variable %scicos_debug_gr = %f; //** load macros libraries and palettes of scicos load SCI/macros/scicos/lib exec(loadpallibs,-1) CodeGeneration_=CodeGeneration_ //@@ check version of scicos diagram [ierr,scicos_ver,scs_m]=update_version(scs_m); if ierr<>0 then error("scicos_codegeneration : Can''t convert old diagram (problem in version)"); end //@@ define some variable used by scicos %pt=[]; %tcur=0; %cpr=list(); alreadyran=%f; needstart=%t; needcompile=4; %state0=list(); tolerances=scs_m.props.tol; solver=tolerances(6); %scicos_solver=solver; curwin=0; %zoom=1.8; //check/set values of Params [mess,scs_m]=checkParams(scs_m,Params) if mess<>[] then error('scicos_codegeneration : '+mess), end //## tk widgets /////////////////////if with_tk() & ~silent_mode then////////////// if with_tk() then prot = funcprot(); funcprot(0); if with_ttk() then tk_getvalue = ttk_getvalue tk_message = ttk_message tk_messageW = ttk_message scstxtedit_tk = ttk_txtedit x_choices = ttk_choices tk_message_modeless = ttk_message_modeless end x_message_modeless = tk_message_modeless scstxtedit = scstxtedit_tk if MSDOS then getvalue = tk_getvalue choose = tk_scicos_choose getfile = tk_getfile_scicos savefile = tk_savefile_scicos x_message = tk_messageW else getfile = tk_getfile_scicos savefile = tk_savefile_scicos getvalue = tk_getvalue x_message = tk_message deff('x=choose(varargin)', 'x=x_choose(varargin(1:$))') end funcprot(prot); end //## overload some functions in silent mode if scs_m.codegen.silent==1 then prot = funcprot(); funcprot(0); deff('message(txt)','printf('"%s\n'",txt)'); deff('x_message(txt)','printf('"%s\n'",txt)'); funcprot(prot); end //** set variables of context [%scicos_context,ierr]=script2var(scs_m.props.context,%scicos_context); if ierr==0 then [scs_m,%cpr,needcompile,ok]=do_eval(scs_m,%cpr,%scicos_context); if needcompile<>4&size(%cpr)>0 then %state0=%cpr.state,end alreadyran=%f; else error("scicos_codegeneration : Incorrect context definition, "+lasterror()); end //@@ entire diagram generation ALL = %t; //@@ input function of codegeneration ierr=execstr('[ok, XX, gui_path, flgcdgen, szclkINTemp, freof, c_atomic_code, cpr] ='+... 'do_compile_superblock42(scs_m, -1);','errcatch'); if ierr<>0 then error(lasterror()), end if ok<>%t then ok=%f, end //@@ update the diagram with the new block generated if ok then props = scs_m.props; nscs_m = get_new_scs_m() nscs_m.props = props XX.graphics.pein = 2 XX.graphics.peout = 2 YY = scicos_link(xx = [20;20;70;70;20;20],... yy = [-5.70;-25;-25;60;60;45.7],... ct = [5;-1],... from = [1,1,0],... to = [1,1,1]) nscs_m.objs(1) = XX nscs_m.objs(2) = YY if scs_m.codegen.cblock==1 then scs_m = nscs_m [%cpr,ok]=do_compile(nscs_m) else [%cpr,ok]=do_compile(nscs_m) %cpr.cor=update_cor(cpr.cor) corinv=list() for i =1:lstsize(cpr.corinv) if cpr.corinv(i)<>0 then corinv($+1)=cpr.corinv(i) end end %cpr.corinv(1)=corinv %cpr.sim.critev=0 end end endfunction function cor=update_cor(cor) for k=1:lstsize(cor) if type(cor(k))==15 then cor(k)=update_cor(cor(k)) else if cor(k)<>0 then cor(k)=1 end end end endfunction function [mess,scs_m]=checkParams(scs_m,Params) mess=[] if Params==list() then return, end // silent=scs_m.codegen.silent cblock=scs_m.codegen.cblock rdnom=scs_m.codegen.rdnom rpat=scs_m.codegen.rpat libs=scs_m.codegen.libs opt=scs_m.codegen.opt enable_debug=scs_m.codegen.enable_debug scopes=scs_m.codegen.scopes remove=scs_m.codegen.remove replace=scs_m.codegen.replace //@@ check silent if lstsize(Params)>=1 then if size(Params(1),'*') <> 1 then mess=['Silent mode must be a scalar.'] return end if find(Params(1)==[0 1])==[] then mess=['Silent mode must be 0 or 1.'] return end silent=Params(1) end //@@ check cblock if lstsize(Params)>=2 then if size(Params(2),'*') <> 1 then mess=['cblock must be a scalar.'] return end if find(Params(2)==[0 1])==[] then mess=['cblock must be 0 or 1.'] return end cblock=Params(2) end //@@ check rdnom if lstsize(Params)>=3 then if Params(3)<>[] then if size(Params(3),'*') <> 1 then mess=['rdnom must have a size 1.'] return end if type(Params(3)) <> 10 then mess=['rdnom must be a string.'] return end end rdnom=Params(3) end //@@ check rpat if lstsize(Params)>=4 then if Params(4)<>[] then if size(Params(4),'*') <> 1 then mess=['rpat must have a size 1.'] return end if type(Params(4)) <> 10 then mess=['rpat must be a string.'] return end end rpat=Params(4) end //@@ check libs if lstsize(Params)>=5 then if Params(5)<>[] then if type(Params(5)) <> 10 then mess=['libs must be a vector of strings.'] return end end libs=Params(5) end //@@ check opt if lstsize(Params)>=6 then if size(Params(6),'*') <> 1 then mess=['opt must be a scalar.'] return end if find(Params(6)==[0 1])==[] then mess=['opt must be 0 or 1.'] return end opt=Params(6) end //@@ check enable_debug if lstsize(Params)>=7 then if size(Params(7),'*') <> 1 then mess=['enable_debug must be a scalar.'] return end if find(Params(7)==[0 1])==[] then mess=['enable_debug must be 0 or 1.'] return end enable_debug=Params(7) end //@@ check scopes if lstsize(Params)>=8 then if Params(8)<>[] then if size(Params(8),2) <> 2 then mess=['List of Scopes must be a matrix of strings of size -1,2.'] return end if type(Params(8)) <> 10 then mess=['List of Scopes must be a matrix of strings of size -1,2.'] return end end scopes=Params(8) end //@@ check remove if lstsize(Params)>=9 then if Params(9)<>[] then if size(Params(9),2) <> 2 then mess=['List of blocks to remove must be a matrix of strings of size -1,2.'] return end if type(Params(9)) <> 10 then mess=['List of blocks to remove must be a matrix of strings of size -1,2.'] return end end remove=Params(9) end // scs_m.codegen.silent=silent scs_m.codegen.cblock=cblock scs_m.codegen.rdnom=rdnom scs_m.codegen.rpat=rpat scs_m.codegen.libs=libs scs_m.codegen.opt=opt scs_m.codegen.enable_debug=enable_debug scs_m.codegen.scopes=scopes scs_m.codegen.remove=remove scs_m.codegen.replace=replace endfunction