replaces message by messagebox
[scilab.git] / scilab / modules / scicos / macros / scicos_scicos / CodeGeneration_.sci
1 //  Scicos
2 //
3 //  Copyright (C) INRIA - METALAU Project <scicos@inria.fr>
4 //                      - Alan Layec <alan.layec@inria.fr>
5 //                      - Ramine Nikoukhah <ramine.nikoukhah@inria.fr>
6 //                      - Rachid Djenidi
7 //
8 //                      - Scilab 5 update by Simone Mannori 
9 //
10 // This program is free software; you can redistribute it and/or modify
11 // it under the terms of the GNU General Public License as published by
12 // the Free Software Foundation; either version 2 of the License, or
13 // (at your option) any later version.
14 //
15 // This program is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 // GNU General Public License for more details.
19 //
20 // You should have received a copy of the GNU General Public License
21 // along with this program; if not, write to the Free Software
22 // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 //
24 // See the file ../license.txt
25 //
26
27 function CodeGeneration_()
28 // Copyright INRIA
29 //
30 // Last update : 14/12/08 
31 //
32 // Input editor function of Scicos code generator
33 //** 30/06/2009 S. Steer: Localization
34
35     k = [] ; //** index of the CodeGen source superbloc candidate
36
37     xc = %pt(1); //** last valid click position
38     yc = %pt(2);
39
40     %pt   = []   ;
41     Cmenu = [] ;
42
43     k  = getobj(scs_m,[xc;yc]) ; //** look for a block
44
45     ALL = %f;
46     //** check if we have clicked near an object
47     if k==[] then
48       ALL = %t;
49       //return
50     //** check if we have clicked near a block
51     elseif typeof(scs_m.objs(k))<>'Block' then
52       return
53     end
54
55     if ~ALL then
56       //** If the clicked/selected block is really a superblock
57       //**             <k>
58       if scs_m.objs(k).model.sim(1)=='super' | scs_m.objs(k).gui =='DSUPER'  then
59          global scs_m_top
60
61          //## test to know if a simulation have not been finished
62          if alreadyran then
63             Scicos_commands=['%diagram_path_objective=[];%scicos_navig=1';
64                              '[alreadyran,%cpr]=do_terminate();'+...
65                              '%diagram_path_objective='+sci2exp(super_path)+';%scicos_navig=1';
66                              '%pt='+sci2exp(%pt)+';Cmenu='"Code Generation"'';]
67
68          //## test to know if the precompilation of that sblock have been done
69          elseif ( isequal(scs_m_top,[]) | isequal(scs_m_top,list()) ) then
70             Scicos_commands=['%diagram_path_objective=[];%scicos_navig=1';
71                              'global scs_m_top; scs_m_top=adjust_all_scs_m(scs_m,'+sci2exp(k)+');'+...
72                              '%diagram_path_objective='+sci2exp(super_path)+';%scicos_navig=1';
73                              '%pt='+sci2exp(%pt)+';Cmenu='"Code Generation"'';]
74
75          else
76             // Got to target sblock.
77             scs_m_top=goto_target_scs_m(scs_m_top)
78             //## call do_compile_superblock
79             [ok, XX, gui_path, flgcdgen, szclkINTemp, freof] = ...
80                               do_compile_superblock42(scs_m_top, k);
81
82             clearglobal scs_m_top;
83
84             //**quick fix for sblock that contains scope
85             gh_curwin=scf(curwin)
86
87             if ok==%t then
88               scs_m = changeports(scs_m,list('objs',k), XX);  //scs_m.objs(k)=XX
89               scs_m = draw_sampleclock(scs_m,XX,k,flgcdgen, szclkINTemp, freof);
90               edited      = %t ;
91               needcompile = 4  ;
92
93               // The interface function must be defined on the first level
94               Scicos_commands=['%diagram_path_objective=[];%scicos_navig=1';
95                                'ppprot=funcprot();funcprot(0);';
96                                'ierr=execstr(''exec('''''+gui_path+''''');'',''errcatch'');';
97                                 'funcprot(ppprot);clear ppprot;';
98                                'if ierr<> 0 then messagebox(''Cannot load the '''''+gui_path+''''' file'',''modal'');end';
99                                 '%diagram_path_objective='+sci2exp(super_path)+';%scicos_navig=1;'
100                                'Cmenu='"Replot'"']
101             else
102               if ok<>-1 then
103                 Cmenu = "Open/Set"
104               end
105             end
106             //## remove variables
107             clear XX flgcdgen k szclkINTemp freof gui_path
108          end
109
110       else
111         //** the clicked/selected block is NOT a superblock
112         messagebox(_("Code Generation only works for a Superblock !\n"),"modal","error")
113       end
114
115    //@@
116    else
117
118      //@@ do_terminate if necessary
119      if alreadyran then [alreadyran,%cpr]=do_terminate(), end
120
121      //## call do_compile_superblock
122      [ok, XX, gui_path, flgcdgen, szclkINTemp, freof] = ...
123                             do_compile_superblock42(scs_m, -1);
124
125      //** quick fix for sblock that contains scope
126      gh_curwin=scf(curwin)
127
128      if ok==%t then
129        props             = scs_m.props;
130        scs_m             = get_new_scs_m()
131        scs_m.props       = props
132        XX.graphics.pein  = 2
133        XX.graphics.peout = 2
134        YY                = scicos_link(xx   = [20;20;70;70;20;20],...
135                                        yy   = [-5.70;-25;-25;60;60;45.7],...
136                                        ct   = [5;-1],...
137                                        from = [1,1,0],...
138                                        to   = [1,1,1])
139        scs_m.objs(1)     = XX
140        scs_m.objs(2)     = YY
141
142        edited      = %t ;
143        needcompile = 4  ;
144        Cmenu       = "Replot"
145
146        //## remove variables
147        clear XX YY flgcdgen k szclkINTemp freof gui_path
148      end
149
150    end
151
152 endfunction
153 //**---------------------------------------------------------------------------------------------------------------------------------
154 //CallBlock : generate C calling sequence
155 //            of a scicos block
156 //
157 //inputs : bk   : bloc index
158 //         pt   : evt activation number
159 //         flag : flag
160 //
161 //output : txt  :
162 //
163 //Copyright INRIA
164 function txt=call_block42(bk,pt,flag)
165   txt=[]
166   //**
167   if flag==2 & ((zcptr(bk+1)-zcptr(bk))<>0) & pt<0 then
168
169   else
170     if flag==2 & ((zptr(bk+1)-zptr(bk))+..
171                   (ozptr(bk+1)-ozptr(bk))+..
172                   (xptr(bk+1)-xptr(bk)+..
173                   with_work(bk))==0 |..
174                   pt<=0) & ~(stalone & or(bk==actt(:,1))) then
175       return // block without state or continuously activated
176     end
177   end
178   if flag==0 & ((xptr(bk+1)-xptr(bk))==0) then
179     return // block without continuous state
180   end
181   if flag==7 & ((xptr(bk+1)-xptr(bk))==0) then
182     return // block without continuous state
183   end
184   if flag==9 & ((zcptr(bk+1)-zcptr(bk))==0) then
185     return // block without continuous state
186   end
187   if flag==3 & ((clkptr(bk+1)-clkptr(bk))==0) then
188     return
189   end
190
191   //** adjust pt
192   if ~(flag==3 & ((zcptr(bk+1)-zcptr(bk))<>0) |..
193        flag==2 & ((zcptr(bk+1)-zcptr(bk))<>0)) then
194     pt=abs(pt)
195   end
196
197   //## check and adjust function type
198   ftyp=funtyp(bk)
199   ftyp_tmp=modulo(funtyp(bk),10000)
200   if ftyp_tmp>2000 then
201     ftyp=ftyp-2000
202   elseif ftyp_tmp>1000 then
203     ftyp=ftyp-1000
204   end
205
206   //** change flag 7 to flag 0 for ftyp<10000
207   flagi=flag
208   if flag==7 & ftyp < 10000 then
209     flag=0;
210   end
211
212   //** set nevprt and flag for called block
213   txt_nf=['block_'+rdnom+'['+string(bk-1)+'].nevprt = '+string(pt)+';'
214           'local_flag = '+string(flag)+';']
215
216   //@@ init evout
217   if flag==3 then
218     txt_init_evout=['/* initialize evout */'
219                     'for(kf=0;kf<block_'+rdnom+'['+string(bk-1)+'].nevout;kf++) {'
220                     '  block_'+rdnom+'['+string(bk-1)+'].evout[kf]=-1.;'
221                     '}']
222   else
223     txt_init_evout=[]
224   end
225
226   //** add comment
227   txt=[get_comment('call_blk',list(funs(bk),funtyp(bk),bk));]
228
229   //** see if its bidon, actuator or sensor
230   if funs(bk)=='bidon' then
231     txt=[];
232     return
233   elseif funs(bk)=='bidon2' then
234     txt=[];
235     return
236   //@@ agenda_blk
237   elseif funs(bk)=='agenda_blk' then
238     txt=[];
239     return
240   //## sensor
241   elseif or(bk==capt(:,1)) then
242     ind=find(bk==capt(:,1))
243     yk=capt(ind,2);
244
245     txt = [txt_init_evout;
246            txt;
247            txt_nf
248            'nport = '+string(ind)+';']
249
250     txt = [txt;
251            rdnom+'_sensor(&local_flag, &nport, &block_'+rdnom+'['+string(bk-1)+'].nevprt, \'
252            get_blank(rdnom+'_sensor')+' &t, ('+mat2scs_c_ptr(outtb(yk))+' *)block_'+rdnom+'['+string(bk-1)+'].outptr[0], \'
253            get_blank(rdnom+'_sensor')+' &block_'+rdnom+'['+string(bk-1)+'].outsz[0], \'
254            get_blank(rdnom+'_sensor')+' &block_'+rdnom+'['+string(bk-1)+'].outsz[1], \'
255            get_blank(rdnom+'_sensor')+' &block_'+rdnom+'['+string(bk-1)+'].outsz[2], \'
256            get_blank(rdnom+'_sensor')+' block_'+rdnom+'['+string(bk-1)+'].insz[0], \'
257            get_blank(rdnom+'_sensor')+' block_'+rdnom+'['+string(bk-1)+'].inptr[0]);']
258     //## errors management
259     txt = [txt;
260            '/* error handling */'
261            'if(local_flag < 0) {']
262     if stalone then
263       txt =[txt;
264             '  set_block_error(5 - local_flag);']
265       if flag<>5 then
266         txt =[txt;
267               '  Cosend();']
268       end
269     else
270       txt =[txt;
271             '  set_block_error(local_flag);']
272       if flag<>5 then
273         txt = [txt;
274                '  return get_block_error();']
275       end
276     end
277     txt = [txt;
278            '}']
279     return
280   //## actuator
281   elseif or(bk==actt(:,1)) then
282     ind=find(bk==actt(:,1))
283     uk=actt(ind,2)
284
285     txt = [txt_init_evout;
286            txt;
287            txt_nf
288            'nport = '+string(ind)+';']
289
290     txt = [txt;
291            rdnom+'_actuator(&local_flag, &nport, &block_'+rdnom+'['+string(bk-1)+'].nevprt, \'
292            get_blank(rdnom+'_actuator')+' &t, ('+mat2scs_c_ptr(outtb(uk))+' *)block_'+rdnom+'['+string(bk-1)+'].inptr[0], \'
293            get_blank(rdnom+'_actuator')+' &block_'+rdnom+'['+string(bk-1)+'].insz[0], \'
294            get_blank(rdnom+'_actuator')+' &block_'+rdnom+'['+string(bk-1)+'].insz[1], \'
295            get_blank(rdnom+'_actuator')+' &block_'+rdnom+'['+string(bk-1)+'].insz[2], \'
296            get_blank(rdnom+'_actuator')+' block_'+rdnom+'['+string(bk-1)+'].outsz[0], \'
297            get_blank(rdnom+'_actuator')+' block_'+rdnom+'['+string(bk-1)+'].outptr[0]);']
298     //## errors management
299     txt = [txt;
300            '/* error handling */'
301            'if(local_flag < 0) {']
302     if stalone then
303       txt =[txt;
304             '  set_block_error(5 - local_flag);']
305       if flag<>5 then
306         txt =[txt;
307               '  Cosend();']
308       end
309     else
310       txt =[txt;
311             '  set_block_error(local_flag);']
312       if flag<>5 then
313         txt = [txt;
314                '  return get_block_error();']
315       end
316     end
317     txt = [txt;
318            '}']
319     return
320   end
321
322   //**
323   nx=xptr(bk+1)-xptr(bk);
324   nz=zptr(bk+1)-zptr(bk);
325   nrpar=rpptr(bk+1)-rpptr(bk);
326   nipar=ipptr(bk+1)-ipptr(bk);
327   nin=inpptr(bk+1)-inpptr(bk);  //* number of input ports */
328   nout=outptr(bk+1)-outptr(bk); //* number of output ports */
329
330   //**
331   //l'adresse du pointeur de ipar
332   if nipar<>0 then ipar=ipptr(bk), else ipar=1;end
333   //l'adresse du pointeur de rpar
334   if nrpar<>0 then rpar=rpptr(bk), else rpar=1; end
335   //l'adresse du pointeur de z attention -1 pas sur
336   if nz<>0 then z=zptr(bk)-1, else z=0;end
337   //l'adresse du pointeur de x
338   if nx<>0 then x=xptr(bk)-1, else x=0;end
339
340   //** check function type
341   if ftyp < 0 then //** ifthenelse eselect blocks
342       txt = [];
343       return;
344   else
345     if (ftyp<>0 & ftyp<>1 & ftyp<>2 & ftyp<>3 & ftyp<>4  & ftyp<>10004) then
346       disp("Types other than 0,1,2,3 or 4/10004 are not supported.")
347       txt = [];
348       return;
349     end
350   end
351
352   select ftyp
353
354     case 0 then
355
356       txt=[txt_init_evout;
357            txt;
358            txt_nf]
359
360       //**** input/output addresses definition ****//
361       //## concatenate input
362       if nin>1 then
363         for k=1:nin
364           uk=inplnk(inpptr(bk)-1+k);
365           nuk=size(outtb(uk),1);
366           //## Alan, 24/04/08 : YAUNEERREURICIFAUTRECOPIERTOUTDANSRDOUTTB
367 //           txt=[txt;
368 //                'rdouttb['+string(k-1)+']=(double *)'+rdnom+'_block_outtbptr['+string(uk-1)+'];']
369
370           txt=[txt;
371                'rdouttb['+string(k-1)+']=(double *)block_'+rdnom+'['+string(bk-1)+'].inptr['+string(k-1)+'];']
372
373         end
374         txt=[txt;
375              'args[0]=&(rdouttb[0]);']
376       elseif nin==0
377         uk=0;
378         nuk=0;
379         txt=[txt;
380              'args[0]=NULL;']
381       else
382         uk=inplnk(inpptr(bk));
383         nuk=size(outtb(uk),1);
384         txt=[txt;
385              'args[0]=(double *)block_'+rdnom+'['+string(bk-1)+'].inptr[0];']
386       end
387
388       //## concatenate outputs
389       if nout>1 then
390         for k=1:nout
391           yk=outlnk(outptr(bk)-1+k);
392           nyk=size(outtb(yk),1);
393           //## Alan, 24/04/08 : YAUNEERREURICIFAUTRECOPIERTOUTDANSRDOUTTB
394 //           txt=[txt;
395 //                'rdouttb['+string(k+nin-1)+']=(double *)'+rdnom+'_block_outtbptr['+string(yk-1)+'];'];
396           txt=[txt;
397                'rdouttb['+string(k+nin-1)+']=(double *)block_'+rdnom+'['+string(bk-1)+'].outptr['+string(k-1)+'];']
398         end
399         txt=[txt;
400              'args[1]=&(rdouttb['+string(nin)+']);'];
401       elseif nout==0
402         yk=0;
403         nyk=0;
404         txt=[txt;
405              'args[1]=NULL;'];
406       else
407         yk=outlnk(outptr(bk));
408         nyk=size(outtb(yk),1);
409         txt=[txt;
410              'args[1]=(double *)block_'+rdnom+'['+string(bk-1)+'].outptr[0];'];
411       end
412       //*******************************************//
413
414       //@@ This is for compatibility, jroot is returned in g for old type
415       if (zcptr(bk+1)-zcptr(bk))<>0 & pt<0 then
416         txt=[txt;
417              '/* Update g array */'
418              'for(i=0;i<block_'+rdnom+'['+string(bk-1)+'].ng;i++) {'
419              '  block_'+rdnom+'['+string(bk-1)+'].g[i]=(double)block_'+rdnom+'['+string(bk-1)+'].jroot[i];'
420              '}']
421       end
422
423       //## adjust continuous state array before call
424       if impl_blk & flag==0 then
425         txt=[txt;
426              '/* adjust continuous state array before call */'
427              'block_'+rdnom+'['+string(bk-1)+'].res = &(res['+string(xptr(bk)-1)+']);'];
428
429         //*********** call seq definition ***********//
430         txtc=['(&local_flag,&block_'+rdnom+'['+string(bk-1)+'].nevprt,&t,block_'+rdnom+'['+string(bk-1)+'].res, \';
431               'block_'+rdnom+'['+string(bk-1)+'].x,&block_'+rdnom+'['+string(bk-1)+'].nx, \';
432               'block_'+rdnom+'['+string(bk-1)+'].z,&block_'+rdnom+'['+string(bk-1)+'].nz,block_'+rdnom+'['+string(bk-1)+'].evout, \';
433               '&block_'+rdnom+'['+string(bk-1)+'].nevout,block_'+rdnom+'['+string(bk-1)+'].rpar,&block_'+rdnom+'['+string(bk-1)+'].nrpar, \';
434               'block_'+rdnom+'['+string(bk-1)+'].ipar,&block_'+rdnom+'['+string(bk-1)+'].nipar, \';
435               '(double *)args[0],(nrd_1='+string(nuk)+',&nrd_1),(double *)args[1],(nrd_2='+string(nyk)+',&nrd_2));'];
436       else
437         //*********** call seq definition ***********//
438         txtc=['(&local_flag,&block_'+rdnom+'['+string(bk-1)+'].nevprt,&t,block_'+rdnom+'['+string(bk-1)+'].xd, \';
439               'block_'+rdnom+'['+string(bk-1)+'].x,&block_'+rdnom+'['+string(bk-1)+'].nx, \';
440               'block_'+rdnom+'['+string(bk-1)+'].z,&block_'+rdnom+'['+string(bk-1)+'].nz,block_'+rdnom+'['+string(bk-1)+'].evout, \';
441               '&block_'+rdnom+'['+string(bk-1)+'].nevout,block_'+rdnom+'['+string(bk-1)+'].rpar,&block_'+rdnom+'['+string(bk-1)+'].nrpar, \';
442              'block_'+rdnom+'['+string(bk-1)+'].ipar,&block_'+rdnom+'['+string(bk-1)+'].nipar, \';
443              '(double *)args[0],(nrd_1='+string(nuk)+',&nrd_1),(double *)args[1],(nrd_2='+string(nyk)+',&nrd_2));'];
444       end
445
446       if (funtyp(bk)>2000 & funtyp(bk)<3000)
447         blank = get_blank(funs(bk)+'( ');
448         txtc(1) = funs(bk)+txtc(1);
449       elseif (funtyp(bk)<2000)
450         txtc(1) = 'C2F('+funs(bk)+')'+txtc(1);
451         blank = get_blank('C2F('+funs(bk)+') ');
452       end
453       txtc(2:$) = blank + txtc(2:$);
454       txt = [txt;txtc];
455       //*******************************************//
456
457       //## adjust continuous state array after call
458       if impl_blk & flag==0 then
459         if flagi==7 then
460           txt=[txt;
461                '/* adjust continuous state array after call */'
462                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
463                '  block_'+rdnom+'['+string(bk-1)+'].xd[i] = block_'+rdnom+'['+string(bk-1)+'].res[i];'
464                '}']
465         else
466           txt=[txt;
467                '/* adjust continuous state array after call */'
468                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
469                '  block_'+rdnom+'['+string(bk-1)+'].res[i] = block_'+rdnom+'['+string(bk-1)+'].res[i] - '+...
470                  'block_'+rdnom+'['+string(bk-1)+'].xd[i];'
471                '}']
472         end
473       end
474       //## errors management
475       txt = [txt;
476              '/* error handling */'
477              'if(local_flag < 0) {']
478       if stalone then
479         txt =[txt;
480               '  set_block_error(5 - local_flag);']
481         if flag<>5 then
482           txt =[txt;
483                 '  Cosend();']
484         end
485       else
486         txt =[txt;
487               '  set_block_error(local_flag);']
488         if flag<>5 then
489           txt = [txt;
490                  '  return get_block_error();']
491         end
492       end
493       txt = [txt;
494              '}']
495
496       if flag==3 then
497         //@@ addevs function call
498         if ~stalone & ALL & size(evs,'*')<>0 then
499           ind=get_ind_clkptr(bk,clkptr,funtyp)
500           txt = [txt;
501                  '/* addevs function call */'
502                  'for(kf=0;kf<block_'+rdnom+'['+string(bk-1)+'].nevout;kf++) {'
503                  '  if (block_'+rdnom+'['+string(bk-1)+'].evout[kf]>=t) {'
504                  '    '+rdnom+'_addevs(ptr, block_'+rdnom+'['+string(bk-1)+'].evout[kf], '+string(ind)+'+kf);'
505                  '  }'
506                  '}']
507         else
508           //@@ adjust values of output register
509           //@@ TODO : multiple output event block
510           txt = [txt;
511                  '/* adjust values of output register */'
512                  '/* TODO :  multiple output event block */'
513                  'block_'+rdnom+'['+string(bk-1)+'].evout[0] = block_'+rdnom+'['+string(bk-1)+'].evout[0] - t;']
514         end
515       end
516       return
517
518     //**
519     case 1 then
520
521       txt=[txt_init_evout;
522            txt;
523            txt_nf]
524
525       //@@ This is for compatibility, jroot is returned in g for old type
526       if (zcptr(bk+1)-zcptr(bk))<>0 & pt<0 then
527         txt=[txt;
528              '/* Update g array */'
529              'for(i=0;i<block_'+rdnom+'['+string(bk-1)+'].ng;i++) {'
530              '  block_'+rdnom+'['+string(bk-1)+'].g[i]=(double)block_'+rdnom+'['+string(bk-1)+'].jroot[i];'
531              '}']
532       end
533
534       //## adjust continuous state array before call
535       if impl_blk & flag==0 then
536         txt=[txt;
537              '/* adjust continuous state array before call */'
538              'block_'+rdnom+'['+string(bk-1)+'].res = &(res['+string(xptr(bk)-1)+']);'];
539
540         //*********** call seq definition ***********//
541         txtc=['(&local_flag,&block_'+rdnom+'['+string(bk-1)+'].nevprt,&t,block_'+rdnom+'['+string(bk-1)+'].res, \';
542               'block_'+rdnom+'['+string(bk-1)+'].x,&block_'+rdnom+'['+string(bk-1)+'].nx, \';
543               'block_'+rdnom+'['+string(bk-1)+'].z,&block_'+rdnom+'['+string(bk-1)+'].nz,block_'+rdnom+'['+string(bk-1)+'].evout, \';
544               '&block_'+rdnom+'['+string(bk-1)+'].nevout,block_'+rdnom+'['+string(bk-1)+'].rpar,&block_'+rdnom+'['+string(bk-1)+'].nrpar, \';
545               'block_'+rdnom+'['+string(bk-1)+'].ipar,&block_'+rdnom+'['+string(bk-1)+'].nipar , \'];
546       else
547         //*********** call seq definition ***********//
548         txtc=['(&local_flag,&block_'+rdnom+'['+string(bk-1)+'].nevprt,&t,block_'+rdnom+'['+string(bk-1)+'].xd, \';
549               'block_'+rdnom+'['+string(bk-1)+'].x,&block_'+rdnom+'['+string(bk-1)+'].nx, \';
550               'block_'+rdnom+'['+string(bk-1)+'].z,&block_'+rdnom+'['+string(bk-1)+'].nz,block_'+rdnom+'['+string(bk-1)+'].evout, \';
551               '&block_'+rdnom+'['+string(bk-1)+'].nevout,block_'+rdnom+'['+string(bk-1)+'].rpar,&block_'+rdnom+'['+string(bk-1)+'].nrpar, \';
552               'block_'+rdnom+'['+string(bk-1)+'].ipar,&block_'+rdnom+'['+string(bk-1)+'].nipar , \'];
553       end
554
555       if (funtyp(bk)>2000 & funtyp(bk)<3000)
556         blank = get_blank(funs(bk)+'( ');
557         txtc(1) = funs(bk)+txtc(1);
558       elseif (funtyp(bk)<2000)
559         txtc(1) = 'C2F('+funs(bk)+')'+txtc(1);
560         blank = get_blank('C2F('+funs(bk)+') ');
561       end
562       if nin>=1 | nout>=1 then
563         if nin>=1 then
564           for k=1:nin
565             uk=inplnk(inpptr(bk)-1+k);
566             txtc=[txtc;
567                   '(double *)block_'+rdnom+'['+string(bk-1)+'].inptr['+string(k-1)+'],&block_'+rdnom+'['+string(bk-1)+'].insz['+string(k-1)+'], \';]
568           end
569         end
570         if nout>=1 then
571           for k=1:nout
572             yk=outlnk(outptr(bk)-1+k);
573             txtc=[txtc;
574                   '(double *)block_'+rdnom+'['+string(bk-1)+'].outptr['+string(k-1)+'],&block_'+rdnom+'['+string(bk-1)+'].outsz['+string(k-1)+'], \';]
575           end
576         end
577       end
578
579       if ztyp(bk) then
580         txtc=[txtc;
581               'block_'+rdnom+'['+string(bk-1)+'].g,&block_'+rdnom+'['+string(bk-1)+'].ng);']
582       else
583         txtc($)=part(txtc($),1:length(txtc($))-3)+');';
584       end
585
586       txtc(2:$) = blank + txtc(2:$);
587       txt = [txt;txtc];
588       //*******************************************//
589
590       //## adjust continuous state array after call
591       if impl_blk & flag==0 then
592         if flagi==7 then
593           txt=[txt;
594                '/* adjust continuous state array after call */'
595                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
596                '  block_'+rdnom+'['+string(bk-1)+'].xd[i] = block_'+rdnom+'['+string(bk-1)+'].res[i];'
597                '}']
598         else
599           txt=[txt;
600                '/* adjust continuous state array after call */'
601                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
602                '  block_'+rdnom+'['+string(bk-1)+'].res[i] = block_'+rdnom+'['+string(bk-1)+'].res[i] - '+...
603                  'block_'+rdnom+'['+string(bk-1)+'].xd[i];'
604                '}']
605         end
606       end
607       //## errors management
608       txt = [txt;
609              '/* error handling */'
610              'if(local_flag < 0) {']
611       if stalone then
612         txt =[txt;
613               '  set_block_error(5 - local_flag);']
614         if flag<>5 then
615           txt =[txt;
616                 '  Cosend();']
617         end
618       else
619         txt =[txt;
620               '  set_block_error(local_flag);']
621         if flag<>5 then
622           txt = [txt;
623                  '  return get_block_error();']
624         end
625       end
626       txt = [txt;
627              '}']
628
629       if flag==3 then
630         //@@ addevs function call
631         if ~stalone & ALL & size(evs,'*')<>0 then
632           ind=get_ind_clkptr(bk,clkptr,funtyp)
633           txt = [txt;
634                  '/* addevs function call */'
635                  'for(kf=0;kf<block_'+rdnom+'['+string(bk-1)+'].nevout;kf++) {'
636                  '  if (block_'+rdnom+'['+string(bk-1)+'].evout[kf]>=t) {'
637                  '    '+rdnom+'_addevs(ptr, block_'+rdnom+'['+string(bk-1)+'].evout[kf], '+string(ind)+'+kf);'
638                  '  }'
639                  '}']
640         else
641           //@@ adjust values of output register
642           //@@ TODO : multiple output event block
643           txt = [txt;
644                  '/* adjust values of output register */'
645                  '/* TODO :  multiple output event block */'
646                  'block_'+rdnom+'['+string(bk-1)+'].evout[0] = block_'+rdnom+'['+string(bk-1)+'].evout[0] - t;']
647         end
648       end
649       return
650
651     //**
652     case 2 then
653
654       txt=[txt_init_evout;
655            txt;
656            txt_nf]
657
658       //@@ This is for compatibility, jroot is returned in g for old type
659       if (zcptr(bk+1)-zcptr(bk))<>0 & pt<0 then
660         txt=[txt;
661              '/* Update g array */'
662              'for(i=0;i<block_'+rdnom+'['+string(bk-1)+'].ng;i++) {'
663              '  block_'+rdnom+'['+string(bk-1)+'].g[i]=(double)block_'+rdnom+'['+string(bk-1)+'].jroot[i];'
664              '}']
665       end
666
667       //## adjust continuous state array before call
668       if impl_blk & flag==0 then
669         txt=[txt;
670              '/* adjust continuous state array before call */'
671              'block_'+rdnom+'['+string(bk-1)+'].res = &(res['+string(xptr(bk)-1)+']);'];
672
673         //*********** call seq definition ***********//
674         txtc=[funs(bk)+'(&local_flag,&block_'+rdnom+'['+string(bk-1)+'].nevprt,&t,block_'+rdnom+'['+string(bk-1)+'].res, \';
675               'block_'+rdnom+'['+string(bk-1)+'].x,&block_'+rdnom+'['+string(bk-1)+'].nx, \';
676               'block_'+rdnom+'['+string(bk-1)+'].z,&block_'+rdnom+'['+string(bk-1)+'].nz,block_'+rdnom+'['+string(bk-1)+'].evout, \';
677               '&block_'+rdnom+'['+string(bk-1)+'].nevout,block_'+rdnom+'['+string(bk-1)+'].rpar,&block_'+rdnom+'['+string(bk-1)+'].nrpar, \';
678               'block_'+rdnom+'['+string(bk-1)+'].ipar,&block_'+rdnom+'['+string(bk-1)+'].nipar, \';
679               '(double **)block_'+rdnom+'['+string(bk-1)+'].inptr,block_'+rdnom+'['+string(bk-1)+'].insz,&block_'+rdnom+'['+string(bk-1)+'].nin, \';
680               '(double **)block_'+rdnom+'['+string(bk-1)+'].outptr,block_'+rdnom+'['+string(bk-1)+'].outsz, &block_'+rdnom+'['+string(bk-1)+'].nout'];
681       else
682         //*********** call seq definition ***********//
683         txtc=[funs(bk)+'(&local_flag,&block_'+rdnom+'['+string(bk-1)+'].nevprt,&t,block_'+rdnom+'['+string(bk-1)+'].xd, \';
684               'block_'+rdnom+'['+string(bk-1)+'].x,&block_'+rdnom+'['+string(bk-1)+'].nx, \';
685               'block_'+rdnom+'['+string(bk-1)+'].z,&block_'+rdnom+'['+string(bk-1)+'].nz,block_'+rdnom+'['+string(bk-1)+'].evout, \';
686               '&block_'+rdnom+'['+string(bk-1)+'].nevout,block_'+rdnom+'['+string(bk-1)+'].rpar,&block_'+rdnom+'['+string(bk-1)+'].nrpar, \';
687               'block_'+rdnom+'['+string(bk-1)+'].ipar,&block_'+rdnom+'['+string(bk-1)+'].nipar, \';
688               '(double **)block_'+rdnom+'['+string(bk-1)+'].inptr,block_'+rdnom+'['+string(bk-1)+'].insz,&block_'+rdnom+'['+string(bk-1)+'].nin, \';
689               '(double **)block_'+rdnom+'['+string(bk-1)+'].outptr,block_'+rdnom+'['+string(bk-1)+'].outsz, &block_'+rdnom+'['+string(bk-1)+'].nout'];
690       end
691
692       if ~ztyp(bk) then
693         txtc($)=txtc($)+');';
694       else
695         txtc($)=txtc($)+', \';
696         txtc=[txtc;
697               'block_'+rdnom+'['+string(bk-1)+'].g,&block_'+rdnom+'['+string(bk-1)+'].ng);']
698       end
699       blank = get_blank(funs(bk)+'( ');
700       txtc(2:$) = blank + txtc(2:$);
701       txt = [txt;txtc];
702       //*******************************************//
703
704       //## adjust continuous state array after call
705       if impl_blk & flag==0 then
706         if flagi==7 then
707           txt=[txt;
708                '/* adjust continuous state array after call */'
709                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
710                '  block_'+rdnom+'['+string(bk-1)+'].xd[i] = block_'+rdnom+'['+string(bk-1)+'].res[i];'
711                '}']
712         else
713           txt=[txt;
714                '/* adjust continuous state array after call */'
715                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
716                '  block_'+rdnom+'['+string(bk-1)+'].res[i] = block_'+rdnom+'['+string(bk-1)+'].res[i] - '+...
717                  'block_'+rdnom+'['+string(bk-1)+'].xd[i];'
718                '}']
719         end
720       end
721       //## errors management
722       txt = [txt;
723              '/* error handling */'
724              'if(local_flag < 0) {']
725       if stalone then
726         txt =[txt;
727               '  set_block_error(5 - local_flag);']
728         if flag<>5 then
729           txt =[txt;
730                 '  Cosend();']
731         end
732       else
733         txt =[txt;
734               '  set_block_error(local_flag);']
735         if flag<>5 then
736           txt = [txt;
737                  '  return get_block_error();']
738         end
739       end
740       txt = [txt;
741              '}']
742
743       if flag==3 then
744         //@@ addevs function call
745         if ~stalone & ALL & size(evs,'*')<>0 then
746           ind=get_ind_clkptr(bk,clkptr,funtyp)
747           txt = [txt;
748                  '/* addevs function call */'
749                  'for(kf=0;kf<block_'+rdnom+'['+string(bk-1)+'].nevout;kf++) {'
750                  '  if (block_'+rdnom+'['+string(bk-1)+'].evout[kf]>=t) {'
751                  '    '+rdnom+'_addevs(ptr, block_'+rdnom+'['+string(bk-1)+'].evout[kf], '+string(ind)+'+kf);'
752                  '  }'
753                  '}']
754         else
755           //@@ adjust values of output register
756           //@@ TODO : multiple output event block
757           txt = [txt;
758                  '/* adjust values of output register */'
759                  '/* TODO :  multiple output event block */'
760                  'block_'+rdnom+'['+string(bk-1)+'].evout[0] = block_'+rdnom+'['+string(bk-1)+'].evout[0] - t;']
761         end
762       end
763       return
764
765     //**
766     case 4 then
767
768       txt=[txt_init_evout;
769            txt;
770            txt_nf]
771
772       //## adjust continuous state array before call
773       if impl_blk & flag==0 then
774         txt=[txt;
775              '/* adjust continuous state array before call */'
776              'block_'+rdnom+'['+string(bk-1)+'].xd  = &(res['+string(xptr(bk)-1)+']);'
777              'block_'+rdnom+'['+string(bk-1)+'].res = &(res['+string(xptr(bk)-1)+']);'];
778       end
779
780       txt=[txt;
781            funs(bk)+'(&block_'+rdnom+'['+string(bk-1)+'],local_flag);'];
782
783       //## adjust continuous state array after call
784       if impl_blk & flag==0  then
785         if flagi==7 then
786           txt=[txt;
787                '/* adjust continuous state array after call */'
788                'block_'+rdnom+'['+string(bk-1)+'].xd = &(xd['+string(xptr(bk)-1)+']);'
789                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
790                '  block_'+rdnom+'['+string(bk-1)+'].xd[i] = block_'+rdnom+'['+string(bk-1)+'].res[i];'
791                '}']
792         else
793           txt=[txt;
794                '/* adjust continuous state array after call */'
795                'block_'+rdnom+'['+string(bk-1)+'].xd = &(xd['+string(xptr(bk)-1)+']);'
796                'for (i=0;i<block_'+rdnom+'['+string(bk-1)+'].nx;i++) {'
797                '  block_'+rdnom+'['+string(bk-1)+'].res[i] = block_'+rdnom+'['+string(bk-1)+'].res[i] - '+...
798                  'block_'+rdnom+'['+string(bk-1)+'].xd[i];'
799                '}']
800         end
801       end
802
803     //**
804     case 10004 then
805
806       txt=[txt_init_evout;
807            txt;
808            txt_nf]
809
810       txt=[txt;
811            funs(bk)+'(&block_'+rdnom+'['+string(bk-1)+'],local_flag);'];
812
813   end
814
815   //## errors management
816   if stalone then
817     txt =[txt;
818           '/* error handling */'
819           'if (get_block_error() < 0) {'
820           '  set_block_error(5 - get_block_error());']
821     if flag<>5 then
822         txt = [txt;
823                '  Cosend();']
824     end
825     txt =[txt;
826           '}']
827   else
828     if flag<>5 then
829       txt =[txt;
830             '/* error handling */'
831             'if (get_block_error() < 0) {'
832             '  return get_block_error();'
833             '}']
834     end
835   end
836
837   //@@ addevs function call
838   if flag==3 then
839     if ~stalone & ALL & size(evs,'*')<>0 then
840       ind=get_ind_clkptr(bk,clkptr,funtyp)
841       txt = [txt;
842              '/* addevs function call */'
843              'for(kf=0;kf<block_'+rdnom+'['+string(bk-1)+'].nevout;kf++) {'
844              '  if (block_'+rdnom+'['+string(bk-1)+'].evout[kf]>=0.) {'
845              '    '+rdnom+'_addevs(ptr, block_'+rdnom+'['+string(bk-1)+'].evout[kf] + t, '+string(ind)+'+kf);'
846              '  }'
847              '}']
848     else
849       //@@ adjust values of output register
850       //@@ TODO : multiple output event block
851       txt=txt
852     end
853   end
854
855 endfunction
856
857 function XX=gen_allblk()
858 //@@ creates the Scicos C generick block
859 //@@ associated to an entire diagram
860 //@@ generated code
861 //
862 //@@ 28/09/08, Alan : initial rev
863 //@@
864 //@@ Copyright INRIA
865
866   //@@ adjust oz
867   oz=cpr.state.oz;
868   //new_oz=list();
869   //for i=1:lstsize(oz)
870   //  new_oz($+1) = oz(i)
871   //end
872   //for i=1:lstsize(outtb)
873   //  new_oz($+1) = outtb(i)
874   //end
875
876   new_oz_str=[];
877   for i=1:lstsize(oz)
878     new_oz_str = [new_oz_str , sci2exp(oz(i),0)];
879   end
880   for i=1:lstsize(outtb)
881     new_oz_str = [new_oz_str , 'zeros('+string(size(outtb(i),1))+','+string(size(outtb(i),2))+')'];
882   end
883
884   new_oz_str='list('+strcat(new_oz_str,',')+')';
885
886   //@@ adjust z
887   work=zeros(nblk,1);
888   Z=[z;work]
889
890   //@@ get nmode
891   nmode = cpr.sim.modptr($)-1
892
893   //@@ get nzcross
894   nzcross = cpr.sim.zcptr($)-1
895
896   //@@ get firing
897   //firing = min(firing_evtout)
898   if find(firing_evtout>=0)<>[] then
899     firing = min(firing_evtout(find(firing_evtout>=0)))
900   else
901     firing = min(firing_evtout)
902   end
903
904   //@@ get rpar/ipar/opar
905   rpar = cpr.sim.rpar
906   ipar = cpr.sim.ipar
907   opar = cpr.sim.opar
908
909   //@@ get a new CBLOCK4
910   XX             = CBLOCK4('define')
911
912   //@@ set the size
913   XX.graphics.sz = 20 *XX.graphics.sz
914
915   //@@ load computational function
916   toto=mgetl(rpat+'/'+rdnom+'.c')
917
918   //@@ set the graphics exprs
919   XX.graphics.exprs(1)(1)  = rdnom             //simulation function
920   if impl_blk then
921     XX.graphics.exprs(1)(2)  = 'y'            //implicit blck
922   end
923   XX.graphics.exprs(1)(3)  = '[]'              //regular input port size
924   XX.graphics.exprs(1)(5)  = '[]'              //regular output port size
925   XX.graphics.exprs(1)(7)  = '1'               //event input port size
926   XX.graphics.exprs(1)(8)  = '1'               //event output port size
927   XX.graphics.exprs(1)(9)  = sci2exp(x,0)      //continuous state
928   XX.graphics.exprs(1)(10) = sci2exp(Z,0)      //discrete state
929   //XX.graphics.exprs(1)(11) = sci2exp(new_oz,0) //object state
930   XX.graphics.exprs(1)(11) = new_oz_str        //object state
931   XX.graphics.exprs(1)(12) = sci2exp(rpar,0)   //real parameters
932   XX.graphics.exprs(1)(13) = sci2exp(ipar,0)   //ipar parameters
933   XX.graphics.exprs(1)(14) = sci2exp(opar,0)   //opar parameters
934   XX.graphics.exprs(1)(15) = sci2exp(nmode)    //number of modes
935   XX.graphics.exprs(1)(16) = sci2exp(nzcross)  //number of zero crossings
936   XX.graphics.exprs(1)(17) = sci2exp(firing)   //initial event date
937   XX.graphics.exprs(1)(18) = 'n'               //direct feedthrough
938   if ALWAYS_ACTIVE then
939     XX.graphics.exprs(1)(19) = 'y'             //time dependence
940   end
941
942   //@@ put text of computational function
943   //@@ in CBLOCK
944   XX.graphics.exprs(2)=toto
945
946   //@@ run 'set' job of the CBLOCK4
947   prot=funcprot();funcprot(0)
948   getvalue=setvalue;
949   deff('message(txt)',['messagebox(''In block ''+XX.gui+'': ''+txt,''Warning'',''info'',''modal'');'
950                     'global %scicos_prob;'
951                     '%scicos_prob=%t'])
952
953   %scicos_prob = %f
954   XX = CBLOCK4('set',XX)
955   funcprot(prot)
956
957 endfunction
958
959 function [ok,c_atomic_code]=gen_atomic_ccode42();
960   //** Generate code for atomic scicos block
961   //** Fady Nassif, inital rev 10/12/07
962   Code=make_computational42()
963   [CCode,FCode]=gen_blocks()
964   flag_no_ccode = %f;
965   for i=1:size(CCode,1)
966     if CCode(i)=='void no_ccode()' then flag_no_ccode = %t, end
967     if flag_no_ccode then
968       if CCode(i)=='}' then flag_no_ccode = %f, end
969       CCode(i)='//'+CCode(i)
970     end
971   end
972   c_atomic_code=[Code;CCode]
973   //c_atomic_code=Code
974 endfunction
975
976 function [CCode,FCode]=gen_blocks()
977 //Generates Code for dynamically linked Fortran and C Blocks
978   CCode=[]
979   FCode=[]
980
981   //## look at for the modelica block
982   kdyn=find(funtyp==10004);
983   ind=[]
984   if (size(kdyn,'*')>=1)
985     for i=1:size(kdyn,'*')
986       if type(corinv(kdyn(i)))==15 then
987         ind=kdyn(i);
988         break;
989       end
990     end
991   end
992
993   if ind<>[] then
994     CCode=mgetl(TMPDIR+'/'+funs(ind)+'.c');
995   end
996
997   //## remove implicit number
998   funtyp=modulo(funtyp,10000)
999
1000   kdyn=find(funtyp>1000) //dynamically linked blocs
1001                          //100X : Fortran blocks
1002                          //200X : C blocks
1003
1004   if (size(kdyn,'*') >1)
1005     kfuns=[];
1006     //get the block data structure in the initial scs_m structure
1007     if size(corinv(kdyn(1)),'*')==1 then
1008       O=scs_m.objs(corinv(kdyn(1)));
1009     else
1010       path=list('objs');
1011       for l=corinv(kdyn(1))(1:$-1)
1012         path($+1)=l;
1013         path($+1)='model';
1014         path($+1)='rpar';
1015         path($+1)='objs';
1016       end
1017       path($+1)=corinv(kdyn(1))($);
1018       O=scs_m(path);
1019     end
1020     if funtyp(kdyn(1))>2000 then
1021       //C block
1022       CCode=[CCode;O.graphics.exprs(2)]
1023     else
1024       FCode=[FCode;O.graphics.exprs(2)]
1025     end
1026     kfuns=funs(kdyn(1));
1027     for i=2:size(kdyn,'*')
1028       //get the block data structure in the initial scs_m structure
1029       if size(corinv(kdyn(i)),'*')==1 then
1030         O=scs_m.objs(corinv(kdyn(i)));
1031       else
1032         path=list('objs');
1033          for l=corinv(kdyn(i))(1:$-1)
1034            path($+1)=l;
1035            path($+1)='model';
1036            path($+1)='rpar';
1037            path($+1)='objs';
1038         end
1039         path($+1)=corinv(kdyn(i))($);
1040         O=scs_m(path);
1041       end
1042       if (find(kfuns==funs(kdyn(i))) == [])
1043         kfuns=[kfuns;funs(kdyn(i))];
1044         if funtyp(kdyn(i))>2000  then
1045           //C block
1046           CCode=[CCode;O.graphics.exprs(2)]
1047         else
1048           FCode=[FCode;O.graphics.exprs(2)]
1049         end
1050       end
1051     end
1052   elseif (size(kdyn,'*')==1)
1053     //get the block data structure in the initial scs_m structure
1054     if size(corinv(kdyn),'*')==1 then
1055       O=scs_m.objs(corinv(kdyn));
1056     else
1057       path=list('objs');
1058       for l=corinv(kdyn)(1:$-1)
1059         path($+1)=l;
1060         path($+1)='model';
1061         path($+1)='rpar';
1062         path($+1)='objs';
1063       end
1064       path($+1)=corinv(kdyn)($);
1065       O=scs_m(path);
1066     end
1067     if funtyp(kdyn)>2000 then
1068       //C block
1069       CCode=[CCode;O.graphics.exprs(2)]
1070     else
1071       FCode=[FCode;O.graphics.exprs(2)]
1072     end
1073   end
1074   if CCode==[]
1075     CCode=['void no_ccode()'
1076            '{'
1077            '  return;'
1078            '}']
1079   end
1080 endfunction
1081
1082 //** Generates the C code for new block simulation
1083 //
1084 //Copyright INRIA
1085 function ok=gen_ccode42()
1086 //** 30/06/2009 S. Steer : 
1087 //  -  WriteCodeToFile definition and use for a clearer code + localization
1088 //  -  use of copyfile instead of mputl(..,mgetl())  
1089
1090
1091   //** Generate code for scicos block
1092   ok=WriteCodeToFile(make_computational42(),rpat+'/'+rdnom+'.c')
1093   if ~ok then return,end
1094
1095   //** Generate files for dynamically linked scicos blocks
1096   [CCode,FCode]=gen_blocks()
1097   if FCode<>[] then
1098     ok=WriteCodeToFile(FCode,rpat+'/'+rdnom+'f.f')
1099     if ~ok then return,end
1100   end
1101   if CCode<>[] then
1102     ok=WriteCodeToFile(CCode,rpat+'/'+rdnom+'_Cblocks.c')
1103     if ~ok then return,end
1104   end
1105
1106   //** Generate _void_io.c
1107   ok=WriteCodeToFile(make_void_io(),rpat+'/'+rdnom+'_void_io.c')
1108   if ~ok then return,end
1109
1110   //** Generate _standalone.c
1111   ok=WriteCodeToFile(make_standalone42(),rpat+'/'+rdnom+'_standalone.c')
1112   if ~ok then return,end
1113
1114   //## Generate intrdnom.c
1115   ok=WriteCodeToFile(make_sci_interf(),rpat+'/int'+rdnom+'.c')
1116   if ~ok then return,end
1117
1118
1119   //copy scicos_block4.h and machine.h include files in destination directory
1120   // scicos_block4.h  
1121   from = scicos_include_paths('scicos_blocks')+'/scicos_block4.h'
1122   to   = rpat+'/scicos_block4.h';
1123   [ierr,mess] = copyfile(from,to)
1124   if ierr==0 then  messagebox(mess,'modal','error'); ok=%f;return;end
1125
1126   // machine.h
1127   from = scicos_include_paths('core')+'/machine.h'
1128   to   = rpat+'/machine.h';
1129   [ierr,mess] = copyfile(from,to)
1130   if ierr==0 then  messagebox(mess,'modal','error'); ok=%f;return;end
1131
1132
1133   //## Generate _act_sens_events.c
1134   [Code,reponse]=make_act_sens_events()
1135   if reponse==1 |  reponse==[] then
1136     ok=WriteCodeToFile(Code,rpat+'/'+rdnom+'_act_sens_events.c')
1137     if ~ok then return,end
1138   end
1139   
1140 endfunction
1141
1142 //creates the Scicos GUI function associated with the new block
1143 //
1144 //Author : Rachid Djenidi, A.Layec
1145 //
1146 //20/06/07, A.Layec : update with in2,out2,intyp,outtyp
1147 //27/06/07, A.Layec : update opar,oz
1148 //
1149 //Copyright INRIA
1150 function ok=gen_gui42();
1151   clkinput=ones(clkIN)';
1152   clkoutput=ones(clkOUT)';
1153   //outtb=outtb;
1154   oz=cpr.state.oz;
1155
1156 //   new_oz=list();
1157 //   for i=1:lstsize(oz)
1158 //     new_oz($+1) = oz(i)
1159 //   end
1160 //   for i=1:lstsize(outtb)
1161 //     new_oz($+1) = outtb(i)
1162 //   end
1163
1164   new_oz_str=[];
1165   for i=1:lstsize(oz)
1166     new_oz_str = [new_oz_str , sci2exp(oz(i),0)];
1167   end
1168   for i=1:lstsize(outtb)
1169     new_oz_str = [new_oz_str , 'zeros('+string(size(outtb(i),1))+','+string(size(outtb(i),2))+')'];
1170   end
1171
1172   new_oz_str='list('+strcat(new_oz_str,',...'+ascii(10)+'                ')+')';
1173
1174   //outtb($+1) = zeros(nblk,1);
1175   Code=['function [x,y,typ]='+rdnom+'_c(job,arg1,arg2)';
1176         '// Copyright INRIA';
1177         ' x=[];y=[];typ=[];';
1178         ' select job';
1179         ' case ''plot'' then';
1180         '   standard_draw(arg1)';
1181         ' case ''getinputs'' then';
1182         '   [x,y,typ]=standard_inputs(arg1)';
1183         ' case ''getoutputs'' then';
1184         '   [x,y,typ]=standard_outputs(arg1)';
1185         ' case ''getorigin'' then';
1186         '   [x,y]=standard_origin(arg1)';
1187         ' case ''set'' then';
1188         '   x=arg1;';
1189         ' case ''define'' then'
1190         '   '+sci2exp(capt(:,3),'in',70); //input ports sizes 1
1191         '   '+sci2exp(capt(:,4),'in2',70); //input ports sizes 2
1192         '   '+sci2exp(scs_c_nb2scs_nb(capt(:,5)),'intyp',70); //input ports type
1193         '   '+sci2exp(actt(:,3),'out',70); //output ports sizes 1
1194         '   '+sci2exp(actt(:,4),'out2',70); //output ports sizes 2
1195         '   '+sci2exp(scs_c_nb2scs_nb(actt(:,5)),'outtyp',70); //output ports type
1196         '   '+sci2exp(x,'x',70); //initial continuous state
1197         '   '+sci2exp(z,'z',70); //initial discrete state
1198         '   work=zeros('+string(nblk)+',1)';
1199         '   Z=[z;work]';
1200         '   odstate='+new_oz_str
1201         //'   '+sci2exp(new_oz,'odstate',70);
1202         '   '+sci2exp(cpr.sim.rpar,'rpar',70); //real parameters
1203         '   '+sci2exp(cpr.sim.ipar,'ipar',70); //integer parameters
1204         '   '+sci2exp(cpr.sim.opar,'opar',70); //object parameters
1205         '   '+sci2exp(clkinput,'clkinput',70);
1206         '   '+sci2exp(clkoutput,'clkoutput',70);
1207         '   '+sci2exp(FIRING,'firing',70);
1208         '   nzcross='+string(sum(cpr.sim.zcptr(2:$)-cpr.sim.zcptr(1:$-1)))';
1209         '   nmode='+string(sum(cpr.sim.modptr(2:$)-cpr.sim.modptr(1:$-1)))';]
1210
1211   for i=1:length(bllst)
1212     deput=[depu_vec',%f]
1213     if (bllst(i).dep_ut($) == %t) then
1214       deput(1,$)=%t;
1215       break;
1216     end
1217   end
1218   Code($+1)='   '+sci2exp(deput,'dep_ut',70);
1219   if impl_blk then
1220     Code=[Code
1221           '   model=scicos_model(sim=list('''+rdnom+''',10004),..']
1222   else
1223     Code=[Code
1224           '   model=scicos_model(sim=list('''+rdnom+''',4),..']
1225   end
1226   Code=[Code
1227         '                      in=in,..'
1228         '                      in2=in2,..'
1229         '                      intyp=intyp,..'
1230         '                      out=out,..'
1231         '                      out2=out2,..'
1232         '                      outtyp=outtyp,..'
1233         '                      evtin=clkinput,..'
1234         '                      evtout=clkoutput,..'
1235         '                      firing=firing,..'
1236         '                      state=x,..'
1237         '                      dstate=Z,..'
1238         '                      odstate=odstate,..'
1239         '                      rpar=rpar,..'
1240         '                      ipar=ipar,..'
1241         '                      opar=opar,..'
1242         '                      blocktype=''c'',..'
1243         '                      dep_ut=dep_ut,..'
1244         '                      nzcross=nzcross,..'
1245         '                      nmode=nmode)'
1246         '   gr_i=''xstringb(orig(1),orig(2),'''''+rdnom+''''',sz(1),..'
1247         '          sz(2),''''fill'''')''';
1248         '   x=standard_define([2 2],model,[],gr_i)';
1249         ' end'
1250         'endfunction'];
1251   //Create file
1252   ok=WriteCodeToFile(Code,rpat+'/'+rdnom+'_c.sci')
1253 endfunction
1254
1255 function [ok,XX,gui_path,flgcdgen,szclkINTemp,freof,c_atomic_code]=do_compile_superblock42(all_scs_m,numk,atomicflag)
1256 // Transforms a given Scicos discrete and continuous SuperBlock into a C defined Block
1257 // Copyright INRIA
1258   //******************* Fady *****************
1259   [lhs,rhs] = argn(0)
1260   if rhs<3 then atomicflag=%f; end
1261   c_atomic_code=[];
1262   freof=[];
1263   flgcdgen=[];
1264   szclkINTemp=[];
1265   //*****************************************
1266
1267   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1268   //@@ check and set global variables
1269   //@@ ALL
1270   if ~exists('ALL') then ALL=%f, end
1271   if ALL<>%f & ALL<>%t then ALL=%f, end
1272
1273   //@@ list_of_scopes
1274   if ~exists('list_of_scopes') then
1275     list_of_scopes=[]
1276   end
1277   list_of_scopes=[list_of_scopes
1278                   'bouncexy'  'ipar(1)';
1279                   'canimxy'   'ipar(1)';
1280                   'canimxy3d' 'ipar(1)';
1281                   'cevscpe'   'ipar(1)';
1282                   'cfscope'   'ipar(1)';
1283                   'cmat3d'    ''
1284                   'cmatview'  ''
1285                   'cmscope'   'ipar(1)';
1286                   'cscope'    'ipar(1)';
1287                   'cscopxy'   'ipar(1)';
1288                   'cscopxy3d' 'ipar(1)']
1289
1290   //@@ sim_to_be_removed
1291   if ~exists('sim_to_be_removed') then
1292     sim_to_be_removed=[]
1293   end
1294   sim_to_be_removed = [sim_to_be_removed
1295                        'cfscope' 'Floating Scope';
1296                        'affich'  'Affich';
1297                        'affich2' 'Affich']
1298
1299   //@@ Todo : sim_to_be_replaced
1300
1301   //@@ debug_agenda
1302   if ~exists('debug_agenda') then debug_agenda=%f, end
1303   if debug_agenda<>%f & debug_agenda<>%t then debug_agenda=%f, end
1304
1305   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1306
1307
1308   //## set void value for gui_path
1309   gui_path=[];
1310
1311   if numk<>-1 then
1312     //## get the model of the sblock
1313     XX=all_scs_m.objs(numk);
1314
1315     //## get the diagram inside the sblock
1316     scs_m=XX.model.rpar
1317   else
1318     XX=[]
1319     scs_m=all_scs_m;
1320   end
1321
1322   par=scs_m.props;
1323   hname=scs_m.props.title(1) //superblock name
1324   //***********************************************************
1325   //Check blocks properties and adapt them if necessary
1326   //***********************************************************
1327
1328   IN=[];OUT=[];clkIN=[];clkOUT=[];numa=[];numc=[];
1329   for i=1:size(scs_m.objs)
1330     if typeof(scs_m.objs(i))=='Block' then
1331       if scs_m.objs(i).gui=='CLKOUT_f' | scs_m.objs(i).gui=='CLKOUTV_f' then
1332         ok=%f
1333         %cpr=list()
1334         messagebox(_('Superblock should not have any activation output port.'),'modal','error')
1335         return
1336       elseif scs_m.objs(i).gui=='INIMPL_f' then
1337         ok=%f
1338         %cpr=list()
1339         messagebox(_('Superblock should not have any input implicit port.'),'modal','error')
1340         return
1341       elseif scs_m.objs(i).gui=='OUTIMPL_f' then
1342         ok=%f
1343         %cpr=list()
1344         messagebox(_('Superblock should not have any output implicit port.'),'modal','error')
1345         return
1346       elseif scs_m.objs(i).gui=='IN_f' then
1347         //replace input ports by sensor blocks
1348         numc=numc+1
1349         scs_m.objs(i).gui='INPUTPORTEVTS';
1350         scs_m.objs(i).model.evtin=1
1351         scs_m.objs(i).model.sim(1)='capteur'+string(numc)
1352         IN=[IN scs_m.objs(i).model.ipar]
1353       elseif scs_m.objs(i).gui=='OUT_f' then
1354         //replace output ports by actuator blocks
1355         numa=numa+1
1356         scs_m.objs(i).gui='OUTPUTPORTEVTS';
1357         scs_m.objs(i).model.sim(1)='actionneur'+string(numa)
1358         OUT=[OUT  scs_m.objs(i).model.ipar]
1359       elseif scs_m.objs(i).gui=='CLKINV_f' then
1360         //replace event input ports by  fictious block
1361         scs_m.objs(i).gui='EVTGEN_f';
1362         scs_m.objs(i).model.sim(1)='bidon'
1363         clkIN=[clkIN scs_m.objs(i).model.ipar];
1364         //elseif scs_m.objs(i).model.dep_ut(2)==%t then
1365         //check for time dependency PAS IICI
1366         //ok=%f;%cpr=list()
1367         //messagebox('a block have time dependence.','modal')
1368         //return
1369       elseif scs_m.objs(i).gui=='CLKOUTV_f' then
1370         scs_m.objs(i).gui='EVTOUT_f';
1371         scs_m.objs(i).model.sim(1)='bidon2'
1372         clkOUT=[clkOUT scs_m.objs(i).model.ipar];
1373       end
1374     end
1375   end
1376
1377   //Check if input/output ports are numered properly
1378   IN=-sort(-IN);
1379   if or(IN<>[1:size(IN,'*')]) then
1380     ok=%f;%cpr=list()
1381     messagebox(_('Input ports are not numbered properly.'),'modal','error')
1382     return
1383   end
1384   OUT=-sort(-OUT);
1385   if or(OUT<>[1:size(OUT,'*')]) then
1386     ok=%f;%cpr=list()
1387     messagebox(_('Output ports are not numbered properly.'),'modal','error')
1388     return
1389   end
1390   clkIN=-sort(-clkIN);
1391   if or(clkIN<>[1:size(clkIN,'*')]) then
1392     ok=%f;%cpr=list()
1393     messagebox(_('Event input ports are not numbered properly.'),'modal','error')
1394     return
1395   end
1396   clkOUT=-sort(-clkOUT);
1397   if or(clkOUT<>[1:size(clkOUT,'*')]) then
1398     ok=%f;%cpr=list()
1399     messagebox(_('Event output ports are not numbered properly.'),'modal','error')
1400     return
1401   end
1402
1403   //Check if there is more than one clock in the diagram
1404   szclkIN=size(clkIN,2);
1405   if szclkIN==0 then
1406     szclkIN=[]
1407   end
1408   flgcdgen=szclkIN
1409
1410  
1411   //## first pass of compilation
1412   if ~ALL then
1413     [bllst,connectmat,clkconnect,cor,corinv,ok,scs_m,flgcdgen,freof]=c_pass1(scs_m,flgcdgen);
1414   else
1415     [bllst,connectmat,clkconnect,cor,corinv,ok,scs_m,flgcdgen,freof]=c_pass1(scs_m);
1416     szclkINTemp=flgcdgen;
1417   end
1418
1419   //## restore buildnewblock
1420   clear buildnewblock
1421
1422   if ~ok then
1423     %cpr=list()
1424     messagebox('Sorry: problem in the pre-compilation step.','modal')
1425     return
1426   end
1427
1428   //@@ Alan, 04/12/08, adjust scope win number if needed
1429   [bllst,ok]=adjust_id_scopes(list_of_scopes,bllst)
1430   if ~ok then
1431     %cpr=list()
1432     messagebox(_('Problem adjusting scope id number.'),'modal','error')
1433     return
1434   end
1435
1436   //###########################//
1437   //## Detect implicit block ##//
1438
1439   //## Force here generation of implicit block
1440   //## impl_blk = %t;
1441   //## %scicos_solver=100;
1442
1443   impl_blk = %f;
1444   for blki=bllst
1445     if type(blki.sim)==15 then
1446       if blki.sim(2)>10000 then
1447         impl_blk = %t;
1448         %scicos_solver=100;
1449         break;
1450       end
1451     end
1452   end
1453   //###########################//
1454
1455   if ~ALL then
1456     if flgcdgen<> szclkIN
1457       clkIN=[clkIN flgcdgen]
1458     end
1459     szclkINTemp=szclkIN;
1460     szclkIN=flgcdgen;
1461   end
1462
1463   //Test for  ALWAYS_ACTIVE sblock (RN -25/06/07)
1464   ALWAYS_ACTIVE=%f;
1465   for blki=bllst
1466     if blki.dep_ut($) then
1467       ALWAYS_ACTIVE=%t;
1468       break;
1469     end
1470   end
1471
1472   if ALWAYS_ACTIVE then
1473     for Ii=1:length(bllst)
1474       if type(bllst(Ii).sim(1))==10 then
1475         if part(bllst(Ii).sim(1),1:7)=='capteur' then
1476           bllst(Ii).dep_ut($)=%t
1477         end
1478       end
1479     end
1480   end
1481
1482   // *********************************************************
1483   // build various index tables :
1484   // cap  : indices of sensors blk in bllst
1485   // act  : indices of actuators blk in bllst
1486   // allhowclk  : indices of evt sensors blk in bllst
1487   // allhowclk2 : indices of evt actuators blk in bllst
1488   // *********************************************************
1489
1490   a=[];
1491   b=[];
1492   tt=[];
1493   howclk=[];
1494   allhowclk=[];
1495   allhowclk2=[];
1496   cap=[];
1497   act=[];
1498
1499   for i=1:size(bllst)
1500     for j=1:size(bllst)
1501       if (bllst(i).sim(1)=='capteur'+string(j)) then
1502         if tt<>i then
1503           cap=[cap;i];
1504           tt=i;
1505         end
1506       elseif (bllst(i).sim(1)=='actionneur'+string(j)) then
1507         if tt<>i then
1508           act=[act;i];
1509           tt=i;
1510         end
1511       elseif (bllst(i).sim(1)=='bidon') then
1512         if tt<>i then
1513           allhowclk=[allhowclk;i];
1514           tt=i;
1515         end
1516       elseif (bllst(i).sim(1)=='bidon2') then
1517         if tt<>i then
1518           allhowclk2=[allhowclk2;i];
1519           tt=i;
1520         end
1521       end
1522     end
1523   end
1524   ///**********************************************************
1525
1526   if szclkIN>1 then
1527     //replace the N Event inputs by a fictious block with
1528     // 2^N as many event outputs
1529     output=ones((2^szclkIN)-1,1)
1530     bllst($+1)=scicos_model(sim=list('bidon',1),evtout=output,..
1531                             blocktype='d',..
1532                             firing=-output',dep_ut=[%f %f])
1533     corinv(size(bllst))=size(bllst)+1;
1534     howclk=size(bllst)
1535     // adjust the links accordingly
1536     for i=1:(2^szclkIN)-1
1537       vec=codebinaire(i,szclkIN)
1538       for j=1:szclkIN
1539         if vec(j)*allhowclk(j)>=1 then
1540           for k=1:size(clkconnect,1)
1541             if clkconnect(k,1)==allhowclk(j) then
1542               clkconnect=[clkconnect;[howclk i clkconnect(k,3:4)]]
1543             end
1544           end
1545         end
1546       end
1547     end
1548   elseif szclkIN==[] then
1549     if ~ALL & ~ALWAYS_ACTIVE then
1550       //superblock has no Event input, add a fictious clock
1551       output=ones((2^(size(cap,'*')))-1,1)
1552       if (output == []) then
1553         output=0;
1554       end
1555       bllst($+1)=scicos_model(sim=list('bidon',1),evtout=output,..
1556                               firing=-output,blocktype='d',dep_ut=[%f %f])
1557       corinv(size(bllst))=size(bllst)+1;
1558       howclk=size(bllst);
1559     else
1560       //@@ find block with output events
1561       ind_evtout_blk=[]
1562       nb_evtout=0
1563       firing_evtout=[]
1564       for i=1:size(bllst)
1565         if bllst(i).evtout<>[] then
1566            if type(bllst(i).sim)==15 then
1567              if bllst(i).sim(2)<>-1 & bllst(i).sim(2)<>-2 then
1568                ind_evtout_blk=[ind_evtout_blk;i]
1569                for j=1:size(bllst(i).evtout,'*')
1570                  firing_evtout=[firing_evtout;bllst(i).firing(j)]
1571                end
1572                nb_evtout=nb_evtout+size(bllst(i).evtout,'*')
1573              end
1574            else
1575              ind_evtout_blk=[ind_evtout_blk;i]
1576              for j=1:size(bllst(i).evtout,'*')
1577                firing_evtout=[firing_evtout;bllst(i).firing(j)]
1578              end
1579              nb_evtout=nb_evtout+size(bllst(i).evtout,'*')
1580            end
1581         end
1582       end
1583       //@@ Add an agenda_blk
1584       if ind_evtout_blk<>[] then
1585         bllst($+1)=scicos_model(sim=list('agenda_blk',1),evtout=ones(size(firing_evtout,1),1),..
1586                                 firing=-ones(size(firing_evtout,1),1),blocktype='d',dep_ut=[%f %f])
1587         agenda_blk = size(bllst);
1588         corinv(size(bllst))=size(bllst)+1;
1589         //@@ evt output connection from agenda_blk
1590         kk=1;
1591         for i=1:size(ind_evtout_blk,'*')
1592           for j=1:size(bllst(ind_evtout_blk(i)).evtout,'*')
1593             for jj=1:size(clkconnect,1)
1594                if clkconnect(jj,1)==ind_evtout_blk(i) & clkconnect(jj,2)==j then
1595                  clkconnect(jj,1) = agenda_blk;
1596                  clkconnect(jj,2) = kk;
1597                end
1598             end
1599             kk=kk+1
1600           end
1601         end
1602       end
1603
1604     end
1605   elseif szclkIN==1  then
1606     howclk=allhowclk;
1607   end
1608
1609   //mise en ordre de clkconnect
1610   if szclkIN>1 then
1611     newclkconnect=clkconnect;
1612     clkconnect=[];
1613     for i=1:size(newclkconnect,1)-1
1614       if or(newclkconnect(i,:)<>newclkconnect(i+1,:)) then
1615         clkconnect=[clkconnect;newclkconnect(i,:)]
1616       end
1617     end
1618     if or(newclkconnect($-1,:)<>newclkconnect($,:)) then
1619       clkconnect=[clkconnect;newclkconnect($,:)]
1620     end
1621
1622     //suppression des blocs bidons
1623     newclkconnect=clkconnect;nkt=[];
1624     for i=1:szclkIN
1625       for k=1:size(newclkconnect,1)
1626         if newclkconnect(k,1)~=allhowclk(i) then
1627           nkt=[nkt;newclkconnect(k,:)];
1628         end
1629       end
1630       newclkconnect=nkt;
1631       nkt=[];
1632     end
1633     clkconnect=newclkconnect;
1634   end
1635
1636   //**************************************************
1637   // nouveau clkconnect avec liaisons sur les capteurs
1638   //**************************************************
1639   if ~ALL then
1640     //Test for  ALWAYS_ACTIVE sblock (RN -25/06/07)
1641     // Fady 15/12/2008
1642     n=size(cap,1)
1643     if ~(szclkIN==[]) then  //triggered case
1644       for i=1:n
1645         if szclkIN>1 then
1646           for j=1:(2^szclkIN)-1
1647             clkconnect=[clkconnect;[howclk j cap(i) 1]];
1648           end
1649         elseif szclkIN==1 then
1650           clkconnect=[clkconnect;[howclk 1 cap(i) 1]];
1651         end
1652       end
1653     elseif ~ALWAYS_ACTIVE then
1654       //codage de l'activation des capteurs dans le cas de l'heritage
1655       for i=1:2^n-1
1656         vec=codebinaire(i,n);
1657         for j=1:n
1658           if (vec(j)==1) then
1659             clkconnect=[clkconnect;[howclk i cap(j) 1]];
1660           end
1661         end
1662       end
1663     end
1664   end
1665   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1666   //@@ Alan, 04/12/08, Remove problematic scopes
1667   for i=1:lstsize(bllst)
1668     ind = find(bllst(i).sim(1)==sim_to_be_removed(:,1))
1669     if ind<>[] then
1670       mess=mprintf("%s  block is not allowed.\nIt will be not called.',sim_to_be_removed(ind,2))
1671       okk = messagebox(mess,[_('Ok');_('Go Back')],'modal')
1672       if okk==1 then
1673         bllst(i).sim(1)='bidon'
1674         if type(bllst(i).sim(1))==13 then
1675           bllst(i).sim(2)=0
1676         end
1677       else
1678         ok=%f
1679         %cpr=list()
1680         return
1681       end
1682     end
1683   end
1684   //@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
1685
1686   FIRING=[]
1687   for i=1:size(allhowclk2,1)
1688     j = find(clkconnect(:,3)==allhowclk2(i))
1689     if j<>[] then
1690       FIRING=[FIRING;bllst(clkconnect(j,1)).firing(clkconnect(j,2))]
1691     end
1692   end
1693
1694   Code_gene_run=[];
1695   //******************** To avoid asking for size or type more than one time in incidence_mat*******
1696   //************************** when creating atomicity *********************************************
1697   //************************** in other cases it can be done in adjust_all_scs_m *******************
1698   //************************** Fady 15/12/2008 *****************************************************
1699   c_pass2=c_pass2;
1700   if ok then
1701     [ok,bllst]=adjust_inout(bllst,connectmat);
1702   end
1703   
1704   if ok then
1705     [ok,bllst]=adjust_typ(bllst,connectmat);
1706   end
1707   //*************************************************************************************************
1708   //## second pass of compilation
1709   cpr=c_pass2(bllst,connectmat,clkconnect,cor,corinv,"silent")
1710
1711   if cpr==list() then
1712     ok=%f,
1713     messagebox(_("Compilation problem\n perhaps an algebraic loop."),'modal','error')
1714     return,
1715   end
1716
1717   // computing the incidence matrix to derive actual block's depu
1718   [depu_mat,ok]=incidence_mat(bllst,connectmat,clkconnect,cor,corinv)
1719   if ~ok then
1720     return
1721   else
1722     depu_vec=depu_mat*ones(size(depu_mat,2),1)>0
1723   end
1724
1725   //## Detect synchro block and type1
1726   funs_save   = cpr.sim.funs;
1727   funtyp_save = cpr.sim.funtyp;
1728   with_work   = zeros(cpr.sim.nb,1)
1729   with_synchro = %f
1730   with_nrd     = %f
1731   with_type1   = %f
1732
1733   //## loop on blocks
1734   for i=1:lstsize(cpr.sim.funs)
1735     //## look at for funs of type string
1736     if type(cpr.sim.funs(i))==10 then
1737       if part(cpr.sim.funs(i),1:10)=='actionneur' then
1738         cpr.sim.funs(i) ='bidon'
1739         cpr.sim.funtyp(i) = 0
1740       elseif part(cpr.sim.funs(i),1:7)=='capteur' then
1741         cpr.sim.funs(i) ='bidon'
1742         cpr.sim.funtyp(i) = 0
1743       elseif cpr.sim.funs(i)=='bidon2' then
1744         cpr.sim.funs(i) ='bidon'
1745         cpr.sim.funtyp(i) = 0
1746       elseif cpr.sim.funs(i)=='agenda_blk' then
1747         cpr.sim.funs(i) ='bidon'
1748         cpr.sim.funtyp(i) = 0
1749       elseif cpr.sim.funs(i)=='affich' then
1750         cpr.sim.funs(i) ='bidon'
1751         cpr.sim.funtyp(i) = 0
1752       elseif cpr.sim.funs(i)=='affich2' then
1753         cpr.sim.funs(i) ='bidon'
1754         cpr.sim.funtyp(i) = 0
1755       end
1756     end
1757     //## look at for type of block
1758     if cpr.sim.funtyp(i) < 0 then
1759        with_synchro = %t //## with_synchro flag comes global
1760     elseif cpr.sim.funtyp(i) == 0 then
1761        with_nrd = %t //## with_nrd flag comes global
1762     elseif cpr.sim.funtyp(i) == 1 then
1763        if cpr.sim.funs(i) ~= 'bidon' then
1764          with_type1 = %t //## with_type1 flag comes global
1765        end
1766     end
1767   end //## end of for
1768
1769   //**** solve which blocks use work ****//
1770   BeforeCG_WinList = winsid();
1771
1772   ierr=execstr('[state,t]=scicosim(cpr.state,0,0,cpr.sim,'+..
1773                '''start'',scs_m.props.tol)','errcatch')
1774
1775   //** retrieve all open Scilab windows with winsid()
1776   AfterCG_WinList = winsid();
1777
1778   if ierr==0 then
1779     for i=1:cpr.sim.nb
1780        if state.iz(i)<>0 then
1781           with_work(i)=%t
1782        end
1783     end
1784     ierr=execstr('[state,t]=scicosim(state,0,0,cpr.sim,'+..
1785                  '''finish'',scs_m.props.tol)','errcatch')
1786   end
1787
1788   //@@ Remove windows opened by simulation
1789   xdel(setdiff(AfterCG_WinList,BeforeCG_WinList))
1790   //*************************************//
1791
1792   //fix for slow computer
1793   xpause(10000)
1794
1795   //@@ retrieve original funs name
1796   cpr.sim.funs=funs_save;
1797   cpr.sim.funtyp=funtyp_save;
1798
1799   //@@ add a work ptr for agenda blk
1800   for i=cpr.sim.nb:-1:1
1801     if cpr.sim.funs(i)=='agenda_blk' then
1802       with_work(i)=%t
1803       break
1804     end
1805   end
1806
1807   ///////////////////
1808   //les pointeurs de cpr :
1809   x=cpr.state.x;
1810   z=cpr.state.z;
1811   outtb=cpr.state.outtb;
1812
1813   //RN
1814   zcptr=cpr.sim.zcptr;
1815   ozptr=cpr.sim.ozptr;
1816   rpptr=cpr.sim.rpptr;
1817   ipptr=cpr.sim.ipptr;
1818   opptr=cpr.sim.opptr;
1819   funs=cpr.sim.funs;
1820   xptr=cpr.sim.xptr;
1821   zptr=cpr.sim.zptr;
1822   inpptr=cpr.sim.inpptr;
1823   inplnk=cpr.sim.inplnk;
1824   outptr=cpr.sim.outptr;
1825   outlnk=cpr.sim.outlnk;
1826   ordclk=cpr.sim.ordclk;
1827   funtyp=cpr.sim.funtyp;
1828   cord=cpr.sim.cord;
1829   ncord=size(cord,1);
1830   nblk=cpr.sim.nb;
1831   ztyp=cpr.sim.ztyp;
1832   clkptr=cpr.sim.clkptr
1833   //taille totale de z : nztotal
1834   nztotal=size(z,1);
1835
1836   //*******************************
1837   //Checking if superblock is valid
1838   //*******************************
1839   msg=[]
1840   for i=1:length(funs)-1
1841     if funtyp(i)==3 | funtyp(i)==5 then
1842       msg=[msg;_('Scilab block''s not allowed')]
1843 //RN   elseif ztyp(i)<>0 then
1844     //elseif (zcptr(i+1)-zcptr(i))<>0 then
1845 //
1846       //msg=[msg;'Active zero crossing block''s not allowed']
1847      elseif (clkptr(i+1)-clkptr(i))<>0 &funtyp(i)>-1 &funs(i)~='bidon' then
1848 //Alan      //msg=[msg;'Regular block generating activation not allowed yet']
1849     end
1850     if msg<>[] then messagebox(msg,'modal'),ok=%f,return,end
1851   end
1852
1853   //********************************************************
1854   // Change logical units for readf and writef blocks if any ???
1855   //********************************************************
1856   lunit=0
1857   for d=1:length(funs)
1858     if funs(d)=='readf'  then
1859       z(zptr(d)+2)=lunit
1860       lunit=lunit+1;
1861     elseif funs(d)=='writef'
1862       z(zptr(d)+1)=lunit
1863       lunit=lunit+1;
1864     end
1865   end
1866
1867   //***********************************
1868   // Get the name of the file
1869   //***********************************
1870   okk=%f;
1871   rdnom='foo';
1872   rpat=getcwd();
1873   if %scicos_libs<>[] then
1874     libs=sci2exp(%scicos_libs(:)',0);
1875   else
1876     libs=''
1877   end
1878   //## disable the 'ugly' / in windaube world
1879   if MSDOS then
1880     label1=[hname;getcwd()+'\'+hname;libs];
1881   else
1882     label1=[hname;getcwd()+'/'+hname;libs];
1883   end
1884
1885   while %t do //loop while the user answer are not ok
1886     ok=%t  // to avoid infinite loop
1887
1888     if atomicflag then
1889       rdnom=all_scs_m.props.title(1)+'_'+strcat(string(super_path),'_')+'_'+string(numk)
1890       rpat=TMPDIR;
1891     else
1892
1893       [okk,..
1894        rdnom,..
1895        rpat,..
1896        libs,..
1897        label1]=getvalue(_('Set code generator parameters :'),..
1898                         [_('New block''s name :');
1899                          _('Created files Path :');
1900                          _('Other object files to link with (if any)')],..
1901                          list('str',1,'str',1,'str',1),label1);
1902       if okk==%f then ok=-1; return; end
1903       
1904       rpat=stripblanks(rpat);
1905
1906       //** 1/07/06 Alan trying to solve multiple libraries
1907       if strindex(libs,'''')<>[] | strindex(libs,'""')<>[] then
1908         ierr=execstr('libs=evstr(libs)','errcatch')
1909         if ierr<>0  then
1910           messagebox(_('Can''t solve other files to link'),'modal','error')
1911           ok=-1;
1912           return
1913         end
1914       end
1915     end  //if atomicflag then
1916
1917     if stripblanks(rdnom)==emptystr() then
1918       ok=%f;
1919       messagebox(_('sorry C file name is not defined'),'modal','error');
1920       if atomicflag then return, end
1921     end
1922
1923     if ok then
1924       //@@replace special character which may cause problem to the compiler
1925       if strindex(rdnom,[' ','-','.'])<>[] then
1926         new = strsubst(strsubst(strsubst(rdnom,' ','_'),'-','_'),'.','_');
1927         mess=msprintf(_(' Superblock name cannot contains space, ""."" and \n'+..
1928                         '""-"" characters. \n'+..
1929                         'The superblock will be renamed : %s'),new);
1930         okk=messagebox(mess,_('Scicos message'),'question',[_('Ok');_('Go Back')],'modal')
1931         if okk==1 then
1932           rdnom = new
1933           label1=[rdnom;label1(2);label1(3)];
1934         else
1935            ok=%f;
1936            if atomicflag then return, end
1937         end
1938       end 
1939     end
1940     
1941     if ok then
1942       //@@ 13/12/08,
1943       //@@ Check if rdnom already exists in the linked routine table
1944       if c_link(rdnom) & ~atomicflag then
1945         mess=msprintf(_('Warning. An entry point with name ""%s"" is already linked.\n'+..
1946                         'The new generated block may have another name or the \n'+..
1947                         'old entry point will be unlinked\n'),rdnom);
1948         okk=messagebox(mess,_('Scicos message'),'question',[_('Change block name');_('Force unlink')],'modal')
1949         if okk==1 then //"Change block name" selected
1950           ok=%f
1951         end
1952       end
1953     end
1954     
1955     if ok then
1956       //@@ create destination directory
1957       [status,mess]=mkdir(rpat)
1958       
1959       if and(status<>[1 2]) then
1960         messagebox(mess,'error','modal');
1961         ok=%f
1962         if atomicflag then return, end
1963       end
1964     end
1965     
1966     if ok then    
1967       //@@ 13/12/08,
1968       //@@ add a test for %scicos_libs
1969       if MSDOS then
1970         target_lib = rpat+'\lib'+rdnom+'.dll'
1971       else
1972         target_lib =  rpat+'/lib'+rdnom+'.so'
1973       end
1974       ind = find(libs==target_lib)
1975       if ind<>[] then
1976         mess=msprintf(_(' Warning. You want to link an external library\n'+..
1977                         'which is the same than the target library.\n'+..
1978                         'That library can be here removed from the\n'+..
1979                         'list of external libraries (only for expert user).'))
1980         okk=message(mess,_('Scicos Message'),'question',[_('Change block name');_('Ok')],'modal')
1981         if okk==2 then
1982           new_libs=[]
1983           for i=1:size(libs,'*')
1984             if find(i==ind)==[] then
1985               new_libs=[new_libs,libs(i)]
1986             end
1987           end
1988           libs=new_libs
1989         else
1990           ok=%f;
1991           if atomicflag then return, end
1992         end
1993       end
1994     end
1995     if ok then break;end
1996   end //end of while loop
1997
1998
1999   //###################################################
2000   //generate blocs simulation function prototypes
2001   //and extract infos from ports for sensors/actuators
2002   //###################################################
2003
2004   nbcap=0;
2005   nbact=0;
2006   capt=[];
2007   actt=[];
2008   Protostalone=[];
2009   Protos=[];
2010   dfuns=[]
2011
2012   //## loop on number of blk
2013   for i=1:length(funs)
2014     //## block is a sensor
2015     if or(i==cap) then
2016       nbcap = nbcap+1;
2017       //## number of output ports
2018       nout=outptr(i+1)-outptr(i);
2019       if nout==0 then
2020          //yk    = 0;
2021          //nyk_1 = 0;
2022          //nyk_2 = 0;
2023          //yk_t  = 1;
2024          disp('nout=0 pour un capteur');pause
2025       else
2026          yk    = outlnk(outptr(i));
2027          nyk_1 = size(outtb(yk),1);
2028          nyk_2 = size(outtb(yk),2);
2029          yk_t  = mat2scs_c_nb(outtb(yk));
2030       end
2031       capt=[capt;
2032             i yk nyk_1 nyk_2 yk_t bllst(i).ipar]
2033
2034       //## only one proto for sensor
2035       if nbcap==1 then
2036         Protostalone=[Protostalone;
2037                       '';
2038                       'void '+rdnom+'_sensor(int *, int *, int *, double *, void *, \';
2039                       get_blank(rdnom)+'             int *, int *, int *, int, void *);']
2040       end
2041
2042     //## block is an actuator
2043     elseif or(i==act) then
2044       nbact = nbact+1;
2045       //## number of input ports
2046       nin=inpptr(i+1)-inpptr(i);
2047       if nin==0 then
2048         //uk    = 0;
2049         //nuk_1 = 0;
2050         //nuk_2 = 0;
2051         //uk_t  = 1;
2052         disp('nin=0 pour un actionneur');pause
2053       else
2054         uk    = inplnk(inpptr(i));
2055         nuk_1 = size(outtb(uk),1);
2056         nuk_2 = size(outtb(uk),2);
2057         uk_t  = mat2scs_c_nb(outtb(uk));
2058       end
2059       actt=[actt;
2060             i uk nuk_1 nuk_2 uk_t bllst(i).ipar]
2061
2062       //## only one proto for actuator
2063       if nbact==1 then
2064         Protostalone=[Protostalone;
2065                       ''
2066                       'void '+rdnom+'_actuator(int *, int *, int *, double *, void *, \';
2067                       get_blank(rdnom)+'               int *, int *, int *, int, void *);']
2068       end
2069
2070     //## all other types of blocks excepts evt sensors and evt actuators
2071     else
2072       if funs(i)<>'bidon' & funs(i)<>'bidon2' then
2073         ki=find(funs(i)==dfuns)
2074         dfuns=[dfuns;funs(i)]
2075         if ki==[] then
2076           Protos=[Protos;'';BlockProto(i)];
2077           Protostalone=[Protostalone;'';BlockProto(i)];
2078         end
2079       end
2080     end
2081   end
2082
2083   //**************************************
2084   //on prend en compte l'ordre des numerotation graphique des
2085   //capteur et des actionneur
2086   [junk,index]=sort(-actt(:,$));
2087   actt=actt(index,1:$) ;
2088   [junk,index]=sort(-capt(:,$));
2089   capt=capt(index,1:$) ;
2090
2091   //***************************************************
2092   // Compute the initial state and outtb (links) values
2093   //***************************************************
2094   //petite modification pour uniformiser les fichiers capteurs
2095   //et actionneurs ???
2096   rdcpr=cpr.sim.funs;
2097   for r=1:length(cap),rdcpr(cap(r))='bidon';end
2098   for r=1:length(act),rdcpr(act(r))='bidon';end
2099   Total_rdcpr=cpr.sim;Total_rdcpr.funs=rdcpr;
2100
2101   //
2102   tcur=0;
2103   tf=scs_m.props.tf;
2104   tolerances=scs_m.props.tol;
2105   //[state,t]=scicosim(cpr.state,tcur,tf,Total_rdcpr,'start',tolerances);
2106   //cpr.state=state;
2107   z=cpr.state.z;
2108   outtb=cpr.state.outtb;
2109   //[junk_state,t]=scicosim(cpr.state,tcur,tf,Total_rdcpr,'finish',tolerances);
2110
2111   //***********************************
2112   // Scilab and C files generation
2113   //***********************************
2114
2115   //** generate scilab interfacing function
2116   //   of the generated scicos block
2117   ok=gen_gui42();
2118
2119   //** generate code for atomic blocks
2120   // Fady*******************
2121   if ok & atomicflag then
2122     [ok,c_atomic_code]=gen_atomic_ccode42()
2123   else
2124     //***********************
2125     //** generate C files
2126     //   of the generated scicos block
2127     if ok then
2128       ok=gen_ccode42()
2129     end
2130
2131     //** Generates Makefile, loader
2132     //   and compile and link C files
2133
2134     //** def files to build
2135     files=[rdnom rdnom+'_Cblocks']
2136  
2137     //** def files to build for standalone
2138     filestan=[rdnom+'_standalone' rdnom+'_act_sens_events' rdnom+'_Cblocks']
2139
2140     //## def files to build for interfacing of the standalone
2141     filesint=[rdnom+'_void_io' rdnom+'_Cblocks' 'int'+rdnom rdnom+'_standalone']
2142
2143     //  In case of fortran blocks  (see =gen_ccode42)
2144     [fif,ierr]=fileinfo(rpat+'/'+rdnom+'f.f')
2145     if ierr==0&fif<>[] then 
2146       files=[files,rdnom+'f'],
2147       filestan=[filestan,rdnom+'f'],
2148       filesint=[filesint,rdnom+'f'],
2149     end
2150
2151     if ok then
2152       ok=buildnewblock(rdnom,files,filestan,filesint,libs,rpat,'','')
2153     end
2154   end
2155
2156   if ok then
2157
2158     if ~ALL then
2159       //global gui_path
2160       gui_path=rpat+'/'+rdnom+'_c.sci'
2161
2162       //exec the gui function
2163       exec(gui_path)
2164
2165       //Change diagram superblock to new generated block
2166       XX=update_block(XX)
2167
2168       //## update %scicos_libs if needed
2169       if MSDOS then
2170         libnam=rpat+'\lib'+rdnom+'.dll'
2171       else
2172         libnam=rpat+'/lib'+rdnom+'.so'
2173       end
2174       if exists('%scicos_libs') then
2175         if find(libnam==%scicos_libs)==[] then
2176           %scicos_libs=[%scicos_libs,libnam];
2177         end
2178       else
2179         %scicos_libs=libnam
2180       end
2181
2182       //## resume the interfacing function to the upper-level
2183       execstr('['+rdnom+'_c,%scicos_libs]=resume('+rdnom+'_c,%scicos_libs)')
2184
2185     else
2186       //@@ get new generated block
2187       XX = gen_allblk()
2188
2189     end
2190   end
2191 endfunction
2192
2193 //BlockProto : generate prototype
2194 //            of a scicos block
2195 //
2196 //inputs : bk   : bloc index
2197 //
2198 //output : txt  :
2199 //
2200 //Copyright INRIA
2201 function [txt]=BlockProto(bk)
2202
2203   nin=inpptr(bk+1)-inpptr(bk);  //* number of input ports */
2204   nout=outptr(bk+1)-outptr(bk); //* number of output ports */
2205
2206   //## check and adjust function type
2207   ftyp=funtyp(bk)
2208   ftyp_tmp=modulo(funtyp(bk),10000)
2209   if ftyp_tmp>2000 then
2210     ftyp=ftyp-2000
2211   elseif ftyp_tmp>1000 then
2212     ftyp=ftyp-1000
2213   end
2214
2215   //** check function type
2216   if ftyp < 0 then //** ifthenelse eselect blocks
2217       txt = [];
2218       return;
2219   else
2220     if (ftyp<>0 & ftyp<>1 & ftyp<>2 & ftyp<>3 & ftyp<>4  & ftyp<>10004) then
2221       disp("types other than 0,1,2,3 or 4/10004 are not yet supported.")
2222       txt = [];
2223       return;
2224     end
2225   end
2226
2227   //@@ agenda_blk
2228   if funs(bk)=='agenda_blk' then
2229     txt=[]
2230     return;
2231   end
2232
2233   //** add comment
2234   txt=[get_comment('proto_blk',list(funs(bk),funtyp(bk),bk));]
2235
2236   select ftyp
2237     //** zero funtyp
2238     case 0 then
2239
2240       //*********** prototype definition ***********//
2241       txtp=['(int *, int *, double *, double *, double *, int *, double *, \';
2242             ' int *, double *, int *, double *, int *,int *, int *, \';
2243             ' double *, int *, double *, int *);'];
2244       if (funtyp(bk)>2000 & funtyp(bk)<3000)
2245         blank = get_blank('void '+funs(bk)+'(');
2246         txtp(1) = 'void '+funs(bk)+txtp(1);
2247       elseif (funtyp(bk)<2000)
2248         txtp(1) = 'void C2F('+funs(bk)+')'+txtp(1);
2249         blank = get_blank('void C2F('+funs(bk)+')');
2250       end
2251       txtp(2:$) = blank + txtp(2:$);
2252       txt = [txt;txtp];
2253       //*******************************************//
2254
2255
2256     //**
2257     case 1 then
2258
2259       //*********** prototype definition ***********//
2260       txtp=['(int *, int *, double *, double *, double *, int *, double *, \';
2261             ' int *, double *, int *, double *, int *,int *, int *';]
2262       if (funtyp(bk)>2000 & funtyp(bk)<3000)
2263         blank = get_blank('void '+funs(bk)+'(');
2264         txtp(1) = 'void '+funs(bk)+txtp(1);
2265       elseif (funtyp(bk)<2000)
2266         txtp(1) = 'void C2F('+funs(bk)+')'+txtp(1);
2267         blank = get_blank('void C2F('+funs(bk)+')');
2268       end
2269       if nin>=1 | nout>=1 then
2270         txtp($)=txtp($)+', \'
2271         txtp=[txtp;'']
2272         if nin>=1 then
2273           for k=1:nin
2274             txtp($)=txtp($)+' double *, int * ,'
2275           end
2276           txtp($)=part(txtp($),1:length(txtp($))-1); //remove last ,
2277         end
2278         if nout>=1 then
2279           if nin>=1 then
2280             txtp($)=txtp($)+', \'
2281             txtp=[txtp;'']
2282           end
2283           for k=1:nout
2284             txtp($)=txtp($)+' double *, int * ,'
2285           end
2286           txtp($)=part(txtp($),1:length(txtp($))-1); //remove last ,
2287         end
2288       end
2289
2290       if ztyp(bk) then
2291         txtp($)=txtp($)+', \'
2292         txtp=[txtp;' double *,int *);'];
2293       else
2294         txtp($)=txtp($)+');';
2295       end
2296
2297       txtp(2:$) = blank + txtp(2:$);
2298       txt = [txt;txtp];
2299       //*******************************************//
2300
2301     //**
2302     case 2 then
2303
2304       //*********** prototype definition ***********//
2305
2306       txtp=['void '+funs(bk)+...
2307             '(int *, int *, double *, double *, double *, int *, double *, \';
2308             ' int *, double *, int *, double *, int *, int *, int *, \'
2309             ' double **, int *, int *, double **,int *, int *'];
2310       if ~ztyp(bk) then
2311         txtp($)=txtp($)+');';
2312       else
2313         txtp($)=txtp($)+', \';
2314         txtp=[txtp;
2315               ' double *,int *);']
2316       end
2317       blank = get_blank('void '+funs(bk));
2318       txtp(2:$) = blank + txtp(2:$);
2319       txt = [txt;txtp];
2320       //********************************************//
2321
2322     //**
2323     case 4 then
2324       txt=[txt;
2325            'void '+funs(bk)+'(scicos_block *, int );'];
2326
2327     //**
2328     case 10004 then
2329       txt=[txt;
2330            'void '+funs(bk)+'(scicos_block *, int );'];
2331
2332   end
2333 endfunction
2334
2335 //Generating the routine for actuators
2336 //sensors & events
2337 //
2338 //Copyright INRIA
2339 function [Code,reponse]=make_act_sens_events()
2340   Code=['#include <stdio.h>'
2341         '#include <stdlib.h>'
2342         '#include <math.h>'
2343         '#include <string.h>'
2344         '/* define file ptr to read/write signals data*/'
2345         'FILE *fprr,*fprw;'
2346         make_outevents()
2347         make_actuator()
2348         make_sensor()]
2349
2350   created=[];
2351   reponse=[];
2352
2353   created=fileinfo(rpat+'/'+rdnom+'_act_sens_events.c')
2354   if created~=[] then
2355     mess=msprintf(_('File: ""%s"" already exists,\n'+..
2356                     'do you want to replace it ?'),rdnom+'_act_sens_events.c')
2357     reponse=messagebox(mess,_('Scicos message'),'question',['Yes','No'],'modal');
2358   end
2359 endfunction
2360
2361
2362 //Generating the routine for actuators interfacing
2363 //
2364 //Copyright INRIA
2365 //
2366 //Authors : R. Djenid, R. Nikoukhah, A. Layec
2367 //
2368 //actt=[i uk nuk_1 nuk_2 uk_t bllst(i).ipar]
2369 function Code=make_actuator()
2370
2371   //## 
2372   Call=['/*'+part('-',ones(1,40))+' Actuators */';
2373         'void '+rdnom+'_actuator(flag,nport,nevprt,t,u,nu1,nu2,ut,typout,outptr)']
2374
2375   //## 
2376   comments=['     /*'
2377             '      * To be customized for standalone execution';
2378             '      * flag   : specifies the action to be done'
2379             '      * nport  : specifies the  index of the Super Bloc'
2380             '      *          regular input (The input ports are numbered'
2381             '      *          from the top to the bottom )'
2382             '      * nevprt : indicates if an activation had been received'
2383             '      *          0 = no activation'
2384             '      *          1 = activation'
2385             '      * t      : the current time value'
2386             '      * u      : the vector inputs value'
2387             '      * nu1    : the input size 1'
2388             '      * nu2    : the input size 2'
2389             '      * ut     : the input type'
2390             '      * typout : learn mode (0 from terminal,1 from input file)'
2391             '      * outptr : pointer to out data'
2392             '      *          typout=0, outptr not used'
2393             '      *          typout=1, outptr contains the output file name'
2394             '      */']
2395
2396   //## 
2397   dcl=['     int *flag,*nevprt,*nport;'
2398        '     int *nu1,*nu2,*ut;'
2399        ''
2400        '     int typout;'
2401        '     void *outptr;'
2402        ''
2403        '     double *t;'
2404        '     void *u;'
2405        '{'
2406        '  int k,l;'];
2407
2408   //## code for terminal
2409   a_actuator=['    /* skeleton to be customized */'
2410               '    switch (*flag) {'
2411               '    case 4 : /* actuator initialisation */'
2412               '      /* do whatever you want to initialize the actuator */'
2413               '      break;']
2414
2415   if szclkIN==[]&ALWAYS_ACTIVE then
2416     a_actuator=[a_actuator;
2417                 '    case 1 :']
2418   else
2419     a_actuator=[a_actuator;
2420                 '    case 2 :']
2421   end
2422
2423   a_actuator=[a_actuator;
2424               '      /*if(*nevprt>0) { print the input value */'
2425               '        switch (*ut) {'
2426               '        case 10 :'
2427               '          for (l=0;l<*nu2;l++) {'
2428               '            for (k=0;k<*nu1;k++) {'
2429               '              printf(""Actuator: time=%f, '+...
2430                                 'u(%d,%d) of actuator %d is %f '+...
2431                                 '\n"", \'
2432               '                     *t, k, l, *nport,'+...
2433                                     '*((double *) u+(k+l*(*nu1))));'
2434               '            }'
2435               '          }'
2436               '          break;'
2437               ''
2438               '        case 11 :'
2439               '          for (l=0;l<*nu2;l++) {'
2440               '            for (k=0;k<*nu1;k++) {'
2441               '              printf(""Actuator: time=%f, '+...
2442                                 'u(%d,%d) of actuator %d is %f,%f '+...
2443                                 '\n"", \'
2444               '                     *t, k, l, *nport,'+...
2445                                     '*((double *) u+(k+l*(*nu1))),'+...
2446                                     '*((double *) u+((*nu1)*(*nu2)+k+l*(*nu1))));'
2447               '            }'
2448               '          }'
2449               '          break;'
2450               ''
2451               '        case 81 :'
2452               '          for (l=0;l<*nu2;l++) {'
2453               '            for (k=0;k<*nu1;k++) {'
2454               '              printf(""Actuator: time=%f, '+...
2455                                 'u(%d,%d) of actuator %d is %i '+...
2456                                 '\n"", \'
2457               '                     *t, k, l, *nport,'+...
2458                                     '*((char *) u+(k+l*(*nu1))));'
2459               '            }'
2460               '          }'
2461               '          break;'
2462               ''
2463               '        case 82 :'
2464               '          for (l=0;l<*nu2;l++) {'
2465               '            for (k=0;k<*nu1;k++) {'
2466               '              printf(""Actuator: time=%f, '+...
2467                                 'u(%d,%d) of actuator %d is %hd '+...
2468                                 '\n"", \'
2469               '                     *t, k, l, *nport,'+...
2470                                     '*((short *) u+(k+l*(*nu1))));'
2471               '            }'
2472               '          }'
2473               '          break;'
2474               ''
2475               '        case 84 :'
2476               '          for (l=0;l<*nu2;l++) {'
2477               '            for (k=0;k<*nu1;k++) {'
2478               '              printf(""Actuator: time=%f, '+...
2479                                 'u(%d,%d) of actuator %d is %ld '+...
2480                                 '\n"", \'
2481               '                     *t, k, l, *nport,'+...
2482                                     '*((long *) u+(k+l*(*nu1))));'
2483               '            }'
2484               '          }'
2485               '          break;'
2486               ''
2487               '        case 811 :'
2488               '          for (l=0;l<*nu2;l++) {'
2489               '            for (k=0;k<*nu1;k++) {'
2490               '              printf(""Actuator: time=%f, '+...
2491                                 'u(%d,%d) of actuator %d is %d '+...
2492                                 '\n"", \'
2493               '                     *t, k, l, *nport,'+...
2494                                     '*((unsigned char *) u+(k+l*(*nu1))));'
2495               '            }'
2496               '          }'
2497               '          break;'
2498               ''
2499               '        case 812 :'
2500               '          for (l=0;l<*nu2;l++) {'
2501               '            for (k=0;k<*nu1;k++) {'
2502               '              printf(""Actuator: time=%f, '+...
2503                                 'u(%d,%d) of actuator %d is %hu '+...
2504                                 '\n"", \'
2505               '                     *t, k, l, *nport,'+...
2506                                     '*((unsigned short *) u+(k+l*(*nu1))));'
2507               '            }'
2508               '          }'
2509               '          break;'
2510               ''
2511               '        case 814 :'
2512               '          for (l=0;l<*nu2;l++) {'
2513               '            for (k=0;k<*nu1;k++) {'
2514               '              printf(""Actuator: time=%f, '+...
2515                                 'u(%d,%d) of actuator %d is %lu '+...
2516                                 '\n"", \'
2517               '                     *t, k, l, *nport,'+...
2518                                     '*((unsigned long *) u+(k+l*(*nu1))));'
2519               '            }'
2520               '          }'
2521               '          break;'
2522               '        }'
2523               '      /*} */'
2524               '      break;'
2525               '    case 5 : /* actuator ending */'
2526               '      /* do whatever you want to end the actuator */'
2527               '      break;'
2528               '    }']
2529
2530   //## code for output file
2531   b_actuator=['    /* skeleton to be customized */'
2532               '    switch (*flag) {'
2533               '    case 4 : /* actuator initialisation */'
2534               '      if (*nport == 1) {'
2535               '        fprw=fopen((char *) outptr,'"wt'");'
2536               '        if( fprw == NULL ) {'
2537               '          printf('"Error opening file: %s\n'", (char *) outptr);'
2538               '          return;'
2539               '        }'
2540               '      }'
2541               '      break;']
2542
2543   if szclkIN==[]&ALWAYS_ACTIVE then
2544     b_actuator=[b_actuator;
2545                 '    case 1 : /* fprintf the input value */']
2546   else
2547     b_actuator=[b_actuator;
2548                 '    case 2 : /* fprintf the input value */']
2549   end
2550
2551   b_actuator=[b_actuator
2552               '      /*if(*nevprt>0) {*/'
2553               '        /* write time */'
2554               '        fprintf(fprw,""%f "",*t);'
2555               ''
2556               '        switch (*ut) {'
2557               '        case 10 :'
2558               '          for (l=0;l<*nu2;l++) {'
2559               '            for (k=0;k<*nu1;k++) {'
2560               '              fprintf(fprw,""%f "", \'
2561               '                           *((double *) u+(k+l*(*nu1))));'
2562               '            }'
2563               '          }'
2564               '          fprintf(fprw,""\n"");'
2565               '          break;'
2566               ''
2567               '        case 11 :'
2568               '          for (l=0;l<*nu2;l++) {'
2569               '            for (k=0;k<*nu1;k++) {'
2570               '              fprintf(fprw,""%f "" \'
2571               '                           ""%f "", \'
2572               '                           *((double *) u+(k+l*(*nu1))), \'
2573               '                           *((double *) u+((*nu1)*(*nu2)+k+l*(*nu1))));'
2574               '            }'
2575               '          }'
2576               '          fprintf(fprw,""\n"");'
2577               '          break;'
2578               ''
2579               '        case 81 :'
2580               '          for (l=0;l<*nu2;l++) {'
2581               '            for (k=0;k<*nu1;k++) {'
2582               '              fprintf(fprw,""%i "", \'
2583               '                           *((char *) u+(k+l*(*nu1))));'
2584               '            }'
2585               '          }'
2586               '          fprintf(fprw,""\n"");'
2587               '          break;'
2588               ''
2589               '        case 82 :'
2590               '          for (l=0;l<*nu2;l++) {'
2591               '            for (k=0;k<*nu1;k++) {'
2592               '              fprintf(fprw,""%hd "", \'
2593               '                           *((short *) u+(k+l*(*nu1))));'
2594               '            }'
2595               '          }'
2596               '          fprintf(fprw,""\n"");'
2597               '          break;'
2598               ''
2599               '        case 84 :'
2600               '          for (l=0;l<*nu2;l++) {'
2601               '            for (k=0;k<*nu1;k++) {'
2602               '              fprintf(fprw,""%ld "", \'
2603               '                           *((long *) u+(k+l*(*nu1))));'
2604               '            }'
2605               '          }'
2606               '          fprintf(fprw,""\n"");'
2607               '          break;'
2608               ''
2609               '        case 811 :'
2610               '          for (l=0;l<*nu2;l++) {'
2611               '            for (k=0;k<*nu1;k++) {'
2612               '              fprintf(fprw,""%d \n"", \'
2613               '                           *((unsigned char *) u+(k+l*(*nu1))));'
2614               '            }'
2615               '          }'
2616               '          fprintf(fprw,""\n"");'
2617               '          break;'
2618               ''
2619               '        case 812 :'
2620               '          for (l=0;l<*nu2;l++) {'
2621               '            for (k=0;k<*nu1;k++) {'
2622               '              fprintf(fprw,""%hu "", \'
2623               '                           *((unsigned short *) u+(k+l*(*nu1))));'
2624               '            }'
2625               '          }'
2626               '          fprintf(fprw,""\n"");'
2627               '          break;'
2628               ''
2629               '        case 814 :'
2630               '          for (l=0;l<*nu2;l++) {'
2631               '            for (k=0;k<*nu1;k++) {'
2632               '              fprintf(fprw,""%lu "", \'
2633               '                           *((unsigned long *) u+(k+l*(*nu1))));'
2634               '            }'
2635               '          }'
2636               '          fprintf(fprw,""\n"");'
2637               '          break;'
2638               '        }'
2639               '      /*} */'
2640               '      break;'
2641               '    case 5 : /* actuator ending */'
2642               '      if (*nport == 1) {'
2643               '        fclose(fprw);'
2644               '      }'
2645               '      break;'
2646               '    }']
2647
2648
2649   // pour fprintf
2650   nc=size(act,'*')
2651
2652 //   typ=['""%f ']; //time
2653 //   for i=1:nc
2654 //     typ($)=typ($)+'"" \'
2655 //     typ=[typ;'""'];
2656 //     for j=1:sum(actt(i,3)*actt(i,4))
2657 //       //typ=typ+'%f ';
2658 //       typ($)=typ($)+scs_c_n2c_fmt(actt(i,5))+' ';
2659 //     end
2660 //   end
2661 //   typ($)=typ($)+'\n"", \'
2662 //   typ(1)='    fprintf(fprw,'+typ(1);
2663 //   bl    ='                 ';
2664 //   if size(typ,1) <> 1 then
2665 //     typ(2:$) = bl+typ(2:$);
2666 //   end
2667 //   //Code1='    fprintf(fprw, '"'+typ+' \n'",*t'
2668 //   Code1=[typ;bl+'*t'];
2669 //   //actt=[i uk nuk_1 nuk_2 uk_t bllst(i).ipar]
2670 //   for i=1:size(actt,1)
2671 //     ni=actt(i,3)*actt(i,4) // dimension of ith output
2672 //     Code1($)=Code1($)+','
2673 //     Code1=[Code1;bl];
2674 //     for j=1:ni
2675 //       if actt(i,5)<>11 then
2676 //         Code1($)=Code1($)+...
2677 //                   '*((('+scs_c_n2c_typ(actt(i,5))+' *)('+...
2678 //                    rdnom+'_block_outtbptr+'+string(actt(i,2)-1)+'))'+...
2679 //                    '+'+string(j-1)+')';
2680 //       else //CAS CMPLX
2681 //         Code1($)=Code1($)+...
2682 //                   '*((('+scs_c_n2c_typ(actt(i,5))+' *)('+...
2683 //                    rdnom+'_block_outtbptr+'+string(actt(i,2)-1)+'))'+...
2684 //                    '+'+string((j-1))+'), '+...
2685 //                   '*((('+scs_c_n2c_typ(actt(i,5))+' *)('+...
2686 //                    rdnom+'_block_outtbptr+'+string(actt(i,2)-1)+'))'+...
2687 //                    '+'+string(ni+(j-1))+')';
2688 //       end
2689 //       if j<>ni then
2690 //        Code1($)=Code1($)+', ';
2691 //       end
2692 //     end
2693 //   end
2694 //   Code1($)=Code1($)+');'
2695
2696   Code=[]
2697
2698   if nc==1 then
2699     Code=[Call
2700           comments
2701           dcl
2702           '  if (typout == 0) { /* terminal */'
2703           a_actuator
2704           '  }'
2705           '  else if (typout == 1) { /* file */'
2706           b_actuator
2707           '  }'
2708           '}']
2709   elseif nc>1 then
2710     S='    switch (*nport) {'
2711     for k=1:nc
2712       S=[S;
2713          '    case '+string(k)+' :/* Port number '+string(k)+' ----------*/'
2714          '    '+a_actuator
2715          '    break;']
2716     end
2717     S=[S;'    }']
2718
2719     T='    switch (*nport) {'
2720     for k=1:nc
2721       T=[T;
2722          '    case '+string(k)+' :/* Port number '+string(k)+' ----------*/'
2723          '    '+b_actuator
2724          '    break;']
2725     end
2726     T=[T;'    }']
2727
2728     Code=[Code
2729           Call
2730           comments
2731           dcl
2732           '  if (typout == 0) { /* terminal */'
2733           S
2734           '  }'
2735           '  else if (typout == 1) { /* file */'
2736           T
2737           '  }'
2738           '}']
2739   end
2740 endfunction
2741
2742 //** Generates the scicos computational function
2743 //   associated with the block
2744 //12/07/07 Alan Layec
2745 //Copyright INRIA
2746 function Code=make_computational42()
2747   z=cpr.state.z;
2748   oz=cpr.state.oz;
2749   outtb=cpr.state.outtb;
2750   tevts=cpr.state.tevts;
2751   evtspt=cpr.state.evtspt;
2752   outptr=cpr.sim.outptr;
2753   funtyp=cpr.sim.funtyp;
2754   clkptr=cpr.sim.clkptr;
2755   ordptr=cpr.sim.ordptr;
2756   pointi=cpr.state.pointi;
2757   ztyp=cpr.sim.ztyp;
2758   zcptr=cpr.sim.zcptr;
2759   zptr=cpr.sim.zptr;
2760   ozptr=cpr.sim.ozptr;
2761   opptr=cpr.sim.opptr;
2762   opar=cpr.sim.opar;
2763   rpptr=cpr.sim.rpptr;
2764   ipptr=cpr.sim.ipptr;
2765   inpptr=cpr.sim.inpptr;
2766   funs=cpr.sim.funs;
2767   xptr=cpr.sim.xptr;
2768   modptr=cpr.sim.modptr;
2769   inplnk=cpr.sim.inplnk;
2770   nblk=cpr.sim.nb;
2771   outlnk=cpr.sim.outlnk;
2772   oord=cpr.sim.oord;
2773   zord=cpr.sim.zord;
2774   iord=cpr.sim.iord;
2775   noord=size(cpr.sim.oord,1);
2776   nzord=size(cpr.sim.zord,1);
2777   niord=size(cpr.sim.iord,1);
2778
2779   Indent='  ';
2780   Indent2=Indent+Indent;
2781   BigIndent='          ';
2782
2783   nZ=size(z,'*'); //** index of work in z
2784   nO=lstsize(oz); //** index of outtb in oz
2785
2786   stalone=%f
2787
2788   Code=['/* SCILAB Computational function  */'
2789         '/*     Copyright INRIA */'
2790         '/*     Generated by Code_Generation toolbox of Scicos with '+ ..
2791         get_scicos_version()+' */';
2792         '/*     date : '+date()+' */'
2793         ''
2794         '/* ---- Headers ---- */'
2795         '#include <stdio.h>'
2796         '#include <stdlib.h>'
2797         '#include <memory.h>'
2798         '#include <string.h>'
2799         '#include <machine.h>'
2800         '#include <link.h>'
2801         '#include <scicos.h>'
2802         '']
2803
2804   if MSDOS then
2805    Code=[Code;
2806          ' '
2807          '#define max(a,b) ((a) >= (b) ? (a) : (b))'
2808          '#define min(a,b) ((a) <= (b) ? (a) : (b))'
2809          ' '
2810         ]
2811   end
2812
2813   Code=[Code;
2814         Protos]
2815
2816   //** find activation number
2817   blks=find(funtyp>-1);
2818   evs=[];
2819
2820   if ~ALL then
2821     for blk=blks
2822       for ev=clkptr(blk):clkptr(blk+1)-1
2823         if funs(blk)=='bidon' then
2824           if ev > clkptr(howclk) -1
2825           evs=[evs,ev];
2826          end
2827         end
2828       end
2829     end
2830   else
2831     for blk=blks
2832       for ev=clkptr(blk):clkptr(blk+1)-1
2833         if funs(blk)=='agenda_blk' then
2834           nb_agenda_blk=blk
2835           //if ev > clkptr(howclk) -1
2836           evs=[evs,ev];
2837          //end
2838         end
2839       end
2840     end
2841   end
2842
2843   if ALL & size(evs,'*')<>0 then
2844     Code=[Code;
2845           ''
2846           '/* define agenda struct */'
2847           'typedef struct {'
2848           '  int pointi;'
2849           '  int fromflag3;'
2850           '  int old_pointi;'
2851           '  int evtspt['+string(size(evs,'*'))+'];'
2852           '  double tevts['+string(size(evs,'*'))+'];'
2853           '} agenda_struct ;'
2854           ''
2855           '/* prototype of addevs function */'
2856           'void '+rdnom+'_addevs(agenda_struct *, double, int);'
2857          ]
2858   end
2859
2860   Code=[Code;
2861         ''
2862         '/*'+part('-',ones(1,40))+' Block Computational function */ ';
2863         'void '+rdnom+'(scicos_block *block, int flag)'
2864         '{']
2865
2866   //@@ TOBE IMPROVED
2867   Code=[Code;
2868         ''
2869         '  /* Some general static variables */'
2870         '  static double zero=0;'
2871         '  static double w[1];'
2872         ''
2873         '  /* declaration of local variables for that block struct */'
2874         '  double* z      = block->z;'
2875         '  void **ozptr   = block->ozptr;']
2876
2877   if max(opptr)>1 then
2878     Code=[Code;
2879           '  void **oparptr = block->oparptr;'
2880           '  /*int nopar      = block->nopar;*/']
2881   end
2882
2883   //## Add res if blk contains continuous state register
2884   if max(xptr)>1 then
2885     Code=[Code;
2886           '  double* x      = block->x;'
2887           '  double* xd     = block->xd;']
2888   end
2889
2890   //## Add res if blk is implicit
2891   if impl_blk then
2892     Code=[Code;
2893           '  double* res    = block->res;'
2894           '  int *xprop     = block->xprop;']
2895   end
2896
2897   if size(capt,'*')>0 then
2898     Code=[Code;
2899           '  void** u       = block->inptr;']
2900   end
2901
2902   Code=[Code;
2903         '  void** y       = block->outptr;']
2904
2905   //##12/04/08, Alan's patch : look at for use of
2906   // ipar,rpar (to disable warning)
2907   with_rpar=%f;
2908   with_ipar=%f;
2909   with_nrd2=%f;
2910
2911   for kf=1:nblk
2912     //## all blocks without sensor/actuator
2913     if (part(funs(kf),1:7) ~= 'capteur' &...
2914         part(funs(kf),1:10) ~= 'actionneur' &...
2915         funs(kf) ~= 'bidon' &...
2916         funs(kf) ~= 'bidon2') then
2917       //** rpar **//
2918       if (rpptr(kf+1)-rpptr(kf)>0) then
2919         with_rpar=%t;
2920       end
2921       //** ipar **//
2922       if (ipptr(kf+1)-ipptr(kf))>0 then
2923         with_ipar=%t;
2924       end
2925       //## with_nrd2 ##//
2926       if funtyp(kf)==0 then
2927         with_nrd2=%t;
2928       end
2929     end
2930   end
2931
2932   Code=[Code;
2933         '  int nevprt     = block->nevprt;']
2934
2935   if with_rpar then
2936     Code=[Code;
2937           '  double* rpar   = block->rpar;'
2938           '  /*int nrpar      = block->nrpar;*/']
2939   end
2940
2941   if with_ipar then
2942     Code=[Code;
2943           '  int* ipar      = block->ipar;'
2944           '  /*int nipar      = block->nipar;*/']
2945   end
2946
2947   if ALL & size(evs,'*')<>0 then
2948     Code=[Code;
2949           '  double *evout  = block->evout;']
2950   end
2951
2952   if max(zcptr)>1 then
2953     Code=[Code;
2954           '  double* g      = block->g;'
2955           '  int* jroot     = block->jroot;']
2956   end
2957   if max(modptr)>1 then
2958     Code=[Code;
2959           '  int* mode      = block->mode;']
2960   end
2961   Code=[Code;
2962         '  void **work    = block->work;'
2963         '']
2964
2965   if ALL & size(evs,'*')<>0 then
2966     Code=[Code;
2967           '  /* agenda struct ptr */'
2968           '  agenda_struct *ptr;'
2969           '']
2970   end
2971
2972 //  if (with_nrd&with_nrd2) | with_type1 then
2973     Code=[Code;
2974           '  /* time is given in argument of function block */'
2975           '  double t     = get_scicos_time();']
2976 //  end
2977
2978   if (max(zcptr)>1 | max(modptr)>1) & with_synchro then
2979     Code=[Code;
2980           '  int    phase = get_phase_simulation();']
2981   end
2982
2983   Code=[Code;
2984         '']
2985
2986   if with_nrd then
2987     if with_nrd2 then
2988       Code=[Code;
2989             '  /* Variables for constant values */'
2990             '  int nrd_1, nrd_2;'
2991             ''
2992             '  double *args[100];'
2993             '']
2994     end
2995   end
2996
2997   Code=[Code;
2998         '  int kf;']
2999
3000   if with_synchro | impl_blk | (zcptr($)-1)~=0 then
3001     Code=[Code;
3002           '  int i;']
3003   end
3004
3005   if ALL & size(evs,'*')<>0 then
3006     Code=[Code;
3007           '  int kever;']
3008   end
3009
3010   Code=[Code;
3011         '  int* reentryflag;'
3012         ''
3013         '  int local_flag;'
3014         //'  int nport;'
3015         '  void **'+rdnom+'_block_outtbptr;'
3016         '  scicos_block *block_'+rdnom+';'
3017         ''
3018         '  /*  work of blocks are catenated at the end of z */'
3019         '  work = (void **)(z+'+string(nZ)+');'
3020         ''
3021         '  /*  '+rdnom+'_block_outtbptr is catenated at the end of oz */'
3022         '  '+rdnom+'_block_outtbptr = (void **)(ozptr+'+string(nO)+');'
3023         ''
3024         '  /* struct of all blocks are stored in work of that block struct */'
3025         '  block_'+rdnom+'=(scicos_block*) *block->work;'
3026         ''];
3027
3028   Code=[Code;
3029         '  /* Copy inputs in the block outtb */'];
3030
3031   for i=1:size(capt,1)
3032     ni=capt(i,3)*capt(i,4); //** dimension of ith input
3033     if capt(i,5)<>11 then
3034       Code=[Code;
3035             '  memcpy(*('+rdnom+'_block_outtbptr+'+string(capt(i,2)-1)+'),'+...
3036             '*(u+'+string(capt(i,6)-1)+'),'+...
3037              string(ni)+'*sizeof('+mat2c_typ(capt(i,5))+'));']
3038     else //** Cas cmplx
3039       Code=[Code;
3040             '  memcpy(*('+rdnom+'_block_outtbptr+'+string(capt(i,2)-1)+'),'+...
3041             '*(u+'+string(capt(i,6)-1)+'),'+...
3042              string(2*ni)+'*sizeof('+mat2c_typ(capt(i,5))+'));']
3043     end
3044   end
3045
3046   Code=[Code;
3047         ''
3048         '  if (flag != 4 && flag != 6 && flag != 5) {']
3049
3050   //## adjust ptr array of continuous state before call
3051   txt = []
3052   block_has_output=%f
3053   for kf=1:nblk
3054      nx=xptr(kf+1)-xptr(kf);
3055      if nx <> 0 then
3056        txt=[txt;
3057             '    block_'+rdnom+'['+string(kf-1)+'].xd    = &(xd['+...
3058              string(xptr(kf)-1)+']);'
3059             '    block_'+rdnom+'['+string(kf-1)+'].x     = &(x['+...
3060              string(xptr(kf)-1)+']);']
3061        if funtyp(kf)>10000 then
3062         txt=[txt;
3063              '    block_'+rdnom+'['+string(kf-1)+'].res   = &(res['+...
3064               string(xptr(kf)-1)+']);'
3065              '    block_'+rdnom+'['+string(kf-1)+'].xprop = &(xprop['+...
3066               string(xptr(kf)-1)+']);']
3067        end
3068        if part(funs(kf),1:10) == 'actionneur' then
3069          block_has_output=%t
3070        end
3071      end
3072   end
3073
3074   if txt <> [] then
3075     Code=[Code;
3076           '    /* Adjust ptr array of continuous state */'
3077           txt
3078           ''];
3079   end
3080
3081   //## adjust ptr array of zero crossing before call
3082   txt = []
3083   for kf=1:nblk
3084      ng=zcptr(kf+1)-zcptr(kf);
3085      if ng <> 0 then
3086        txt=[txt;
3087             '    block_'+rdnom+'['+string(kf-1)+'].g    = &(g['+...
3088              string(zcptr(kf)-1)+']);'
3089             '    block_'+rdnom+'['+string(kf-1)+'].jroot = &(jroot['+...
3090              string(zcptr(kf)-1)+']);']
3091      end
3092   end
3093
3094   if txt <> [] then
3095     Code=[Code;
3096           '    /* Adjust ptr array of zero crossing */'
3097           txt
3098           ''];
3099   end
3100
3101   //@@ reentry flag
3102   Code=[Code;
3103         '    /*  Adjust ptr array that must be done only one times */'
3104         '    reentryflag=(int*) ((scicos_block *)(*block->work)+'+string(nblk)+');'
3105         '    if (*reentryflag==0) {'
3106         '      *reentryflag=1;']
3107
3108   for kf=1:nblk
3109     nin   = inpptr(kf+1)-inpptr(kf); //** number of input ports
3110     nout  = outptr(kf+1)-outptr(kf); //** number of output ports
3111     nx    = xptr(kf+1)-xptr(kf);     //@@ number of continuous state
3112     nz    = zptr(kf+1)-zptr(kf);     //@@ number of continuous state
3113     nmode = modptr(kf+1)-modptr(kf); //@@ number of mode
3114
3115     //** add comment
3116     txt=[get_comment('set_blk',list(funs(kf),funtyp(kf),kf));]
3117
3118     Code=[Code;
3119           ''
3120           '      '+txt];
3121
3122     //@@ regular input
3123     for k=1:nin
3124       lprt=inplnk(inpptr(kf)-1+k);
3125       Code=[Code;
3126             '      block_'+rdnom+'['+string(kf-1)+'].inptr['+string(k-1)+']  = '+...
3127             rdnom+'_block_outtbptr['+string(lprt-1)+'];']
3128     end
3129
3130     //@@ regular output
3131     for k=1:nout
3132        lprt=outlnk(outptr(kf)-1+k);
3133        Code=[Code
3134              '      block_'+rdnom+'['+string(kf-1)+'].outptr['+string(k-1)+'] = '+...
3135              rdnom+'_block_outtbptr['+string(lprt-1)+'];']
3136     end
3137
3138     //@@ discrete state
3139     if nz>0 then
3140       Code=[Code
3141             '      block_'+rdnom+'['+string(kf-1)+'].z         = &(z['+...
3142             string(zptr(kf)-1)+']);']
3143     end
3144
3145     //@@ mode
3146     if nmode <> 0 then
3147       Code=[Code;
3148             '      block_'+rdnom+'['+string(kf-1)+'].mode      = &(mode['+...
3149             string(modptr(kf)-1)+']);']
3150     end
3151
3152     if (part(funs(kf),1:7) ~= 'capteur' &...
3153         part(funs(kf),1:10) ~= 'actionneur' &...
3154         funs(kf) ~= 'bidon' &...
3155         funs(kf) ~= 'bidon2') then
3156       //** rpar **//
3157       if (rpptr(kf+1)-rpptr(kf)>0) then
3158         Code=[Code;
3159               '      block_'+rdnom+'['+string(kf-1)+'].rpar      = &(rpar['+...
3160               string(rpptr(kf)-1)+']);']
3161       end
3162
3163       //** ipar **//
3164       if (ipptr(kf+1)-ipptr(kf))>0 then
3165          Code=[Code;
3166                '      block_'+rdnom+'['+string(kf-1)+'].ipar      = &(ipar['+...
3167                string(ipptr(kf)-1)+']);']
3168       end
3169       //** opar **//
3170       if (opptr(kf+1)-opptr(kf)>0) then
3171         nopar = opptr(kf+1)-opptr(kf);
3172         for k=1:nopar
3173           Code=[Code;
3174                 '      block_'+rdnom+'['+string(kf-1)+'].oparptr['+string(k-1)+...
3175                 '] = oparptr['+string(opptr(kf)-1+k-1)+'];'];
3176         end
3177       end
3178       //** oz **//
3179       if (ozptr(kf+1)-ozptr(kf)>0) then
3180         noz = ozptr(kf+1)-ozptr(kf);
3181         for k=1:noz
3182           Code=[Code;
3183                 '      block_'+rdnom+'['+string(kf-1)+'].ozptr['+string(k-1)+...
3184                 ']  = ozptr['+string(ozptr(kf)-1+k-1)+'];'];
3185         end
3186       end
3187     end
3188
3189     //@@ work
3190     if with_work(kf)==1 then
3191       Code=[Code;
3192             '      block_'+rdnom+'['+string(kf-1)+'].work      ='+...
3193             ' (void **)(((double *)work)+'+string(kf-1)+');']
3194     end
3195   end
3196
3197   //** cst blocks and it's dep
3198   txt=write_code_idoit()
3199
3200   if txt<>[] then
3201     Code=[Code;
3202           ''
3203           '      /* initial blocks must be called with flag 1 */'
3204           '    '+txt];
3205   end
3206
3207   Code=[Code
3208         '    }'
3209         '  }'
3210         ''
3211        ]
3212   /////////////////////////////////////////////
3213
3214   //## get number of zero crossing
3215   ng=zcptr($)-1;
3216
3217   //** flag 0
3218   flag = 0;
3219
3220   txt22 = [];
3221
3222   txt22=[txt22;
3223          '  '+write_code_odoit(1) //** first pass
3224          '  '+write_code_odoit(0) //** second pass
3225         ]
3226
3227   if txt22<>[] then
3228     Code=[Code;
3229           '  if (flag == 0) { '+get_comment('flag',list(flag))
3230           txt22
3231           '  }'];
3232   end
3233
3234   //@@
3235   with_flag2=%f;
3236   with_flag3=%f;
3237
3238   //** flag 1,2,3
3239   for flag=[1,2,3]
3240
3241     txt3=[]
3242
3243     //** continuous time blocks must be activated
3244     //** for flag 1
3245     if flag==1 then
3246       txt = write_code_cdoit(flag);
3247
3248       if txt <> [] then
3249         if ~ALL then
3250           txt3=[txt3;
3251                 Indent+'  switch (nevprt) {'
3252                ];
3253           txt3=[txt3;
3254                 Indent2+'  case '+string(0)+' : '+...
3255                   get_comment('ev',list(0))
3256                 '    '+txt;
3257                ];
3258           txt3=[txt3;'      break;';'']
3259         else
3260           txt3=[txt3;
3261                 Indent+'  if (nevprt==0) {'+...
3262                   get_comment('ev',list(0))
3263                 '    '+txt;
3264                 Indent+'  }'
3265                ];
3266         end
3267       end
3268
3269     else
3270       txt=[];
3271     end
3272
3273     //** blocks with input discrete event must be activated
3274     //** for flag 1, 2 and 3
3275     if size(evs,'*')>=1 then
3276       txt4=[]
3277       //**
3278       for ev=evs
3279
3280         if ~ALL then
3281           new_ev=ev-(clkptr(howclk)-1)
3282         else
3283           new_ev=ev-min(evs)+1
3284         end
3285
3286         txt2=write_code_doit(ev,flag);
3287
3288         if ALL then
3289           if flag==2 then
3290             if txt2<>[] | with_flag2 then
3291               with_flag2=%t
3292               if ~with_flag3 then
3293                 tt = write_code_doit(ev,3)
3294                 if tt<>[] then
3295                   with_flag3=%t
3296                 end
3297               end
3298             end
3299           end
3300         end
3301
3302         if txt2<>[] then
3303           //** adjust event number because of bidon block
3304           //**
3305           txt4=[txt4;
3306                 Indent2+['  case '+string(new_ev)+' : '+...
3307                 get_comment('ev',list(new_ev))
3308                    txt2];
3309                 '      break;';'']
3310         end
3311       end
3312
3313       //**
3314       if txt == [] then
3315         if txt4 <> [] then
3316           if ~ALL then
3317             txt3=[txt3;
3318                   Indent+'  switch (nevprt) {'
3319                   txt4
3320                   '    }'];
3321           else
3322             txt3=[txt3;
3323                   Indent+'  ptr = *(block_'+rdnom+'['+string(nb_agenda_blk-1)+'].work);']
3324             if flag==2 & with_flag2 & with_flag3 then
3325               txt3=[txt3;
3326                     Indent+'  if (ptr->fromflag3) {'
3327                     Indent+'    kever = ptr->old_pointi;'
3328                     Indent+'    ptr->fromflag3 = 0;'
3329                     Indent+'  }'
3330                     Indent+'  else {'
3331                     Indent+'    kever = ptr->pointi;'
3332                     Indent+'  }']
3333             else
3334               txt3=[txt3;
3335                     Indent+'  kever = ptr->pointi;']
3336             end
3337             if flag==3 then
3338               txt3=[txt3;
3339                     Indent+'  ptr->pointi = ptr->evtspt[kever-1];'
3340                     Indent+'  ptr->evtspt[kever-1] = -1;']
3341               if with_flag2 & with_flag3 then
3342                 txt3=[txt3;
3343                       Indent+'  ptr->old_pointi = kever;'
3344                       Indent+'  ptr->fromflag3  = 1;']
3345               end
3346             end
3347             txt3=[txt3;
3348                   Indent+'  switch (kever) {'
3349                   txt4
3350                   '    }'];
3351             if flag==3 then
3352               txt3=[txt3;
3353                     Indent+'  block->evout[0] = ptr->tevts[ptr->pointi-1] - t;']
3354             end
3355           end
3356         end
3357       else
3358         if ~ALL then
3359           txt3=[txt3;
3360                 txt4]
3361         else
3362           txt3=[txt3;
3363                 '    else {'
3364                 '      ptr = *(block_'+rdnom+'['+string(nb_agenda_blk-1)+'].work);'
3365                 '      kever = ptr->pointi;']
3366             if flag==3 then
3367               txt3=[txt3;
3368                   '      ptr->pointi = ptr->evtspt[kever-1];'
3369                   '      ptr->evtspt[kever-1] = -1;']
3370             end
3371             txt3=[txt3;
3372                 Indent+'    switch (kever) {'
3373                 txt4
3374                 '      }'
3375                 '    }'];
3376           if flag==3 then
3377             txt3=[txt3;
3378                   Indent+'  block->evout[0] = ptr->tevts[ptr->pointi-1] - t;']
3379           end
3380         end
3381       end
3382     end
3383
3384     //**
3385     if ~ALL then
3386       if txt <> [] then
3387         txt3=[txt3;
3388               '    }'];
3389       end
3390     end
3391
3392     //**
3393     if txt3<>[] then
3394       if flag==1 & txt22==[] then
3395         Code=[Code;
3396               '  if (flag == '+string(flag)+') { '+...
3397               get_comment('flag',list(flag))
3398               txt3
3399               '  }'];
3400       else
3401         //## test for zero crossing
3402         if (ng ~= 0) & (flag~=1) then
3403           Code=[Code;
3404                 '  else if ((flag == '+string(flag)+')&&(nevprt>=0)) { '+...
3405                 get_comment('flag',list(flag))
3406                 txt3
3407                 '  }'];
3408         else
3409           Code=[Code;
3410                 '  else if (flag == '+string(flag)+') { '+...
3411                 get_comment('flag',list(flag))
3412                 txt3
3413                 '  }'];
3414         end
3415       end
3416     end
3417
3418     //## zero crossing internal events
3419     if (ng ~= 0) then
3420       //##
3421       if (flag<>1) then
3422         txt22 = [];
3423
3424         for k=1:nzord
3425           bk=zord(k,1);
3426           //@@ Ooups
3427           pt=abs(zord(k,2));
3428           pt=1;
3429           txt_tmp=call_block42(bk,-pt,flag)
3430           if txt_tmp<> [] then
3431             txt_tmp='    '+txt_tmp;
3432
3433             txt22=[txt22;
3434                    txt_tmp];
3435
3436           end
3437         end
3438
3439         //@@ get ptr of agenda blk
3440         txt222=[];
3441         if ALL & flag==3 then
3442           txt222=['    ptr = *(block_'+rdnom+'['+string(nb_agenda_blk-1)+'].work);';
3443                   '']
3444         end
3445
3446         if txt22<>[] then
3447           Code=[Code;
3448                 '  else if ((flag == '+string(flag)+')&&(nevprt<0)) { '+...
3449                  '/* zero crossing internal events */'
3450                 txt222
3451                 txt22]
3452           if ALL & flag==3 then
3453             Code=[Code;
3454                   ''
3455                   Indent+'  block->evout[0] = ptr->tevts[ptr->pointi-1] - t;'
3456                   '  }']
3457           else
3458             Code=[Code;
3459                   '  }']
3460           end
3461         end
3462       end
3463     end
3464
3465   end //## end of for flag=[1,2,3]
3466
3467   //** flag 7
3468   if impl_blk then
3469     txt22 = [];
3470
3471     txt22=[txt22;
3472            '  '+write_code_reinitdoit(1) //** first pass
3473            '  '+write_code_reinitdoit(7) //** second pass
3474           ]
3475
3476     if txt22<>[] then
3477       Code=[Code;
3478             '  else if (flag == 7) { /* x_pointer properties */'
3479             txt22
3480             '  }'];
3481     end
3482   end
3483
3484   //** flag 9
3485   if (ng ~= 0) then
3486     flag = 9;
3487 //     Code=[Code;
3488 //           '  else if (flag == '+string(flag)+') { '+...
3489 //            get_comment('flag',list(flag))
3490 //          ];
3491     Code=[Code;
3492           '  else if (flag == '+string(flag)+') { '+...
3493            get_comment('flag',list(flag))
3494          ];
3495
3496     txt=[]
3497 //     for kf=1:nblk
3498 //       if zcptr(kf+1)-zcptr(kf) <> 0 then
3499 //          txt=[txt;
3500 //               '    block_'+rdnom+'['+string(kf-1)+'].g='+...
3501 //               '&(g['+string(zcptr(kf)-1)+']);']
3502 //       end
3503 //     end
3504
3505     Code=[Code;
3506           '    '+get_comment('update_g',list())
3507           txt
3508           ''
3509           write_code_zdoit()
3510          ]
3511
3512     Code=[Code;
3513           '  }'];
3514   end
3515
3516   //** flag 4
3517   Code=[Code;
3518         '  else if (flag == 4) { '+get_comment('flag',list(4))
3519         '    /* work array allocation */'
3520         '    if ((*block->work=scicos_malloc(sizeof(scicos_block)*'+...
3521          string(nblk)+'+sizeof(int)))== NULL) return 0;';
3522         '    reentryflag=(int*) ((scicos_block *)(*block->work)+'+string(nblk)+');'
3523         '    *reentryflag=0;'
3524         '    block_'+rdnom+'=(scicos_block*) *block->work;'];
3525
3526   for kf=1:nblk
3527     nin   = inpptr(kf+1)-inpptr(kf); //* number of input ports */
3528     nout  = outptr(kf+1)-outptr(kf); //* number of output ports */
3529     nx    = xptr(kf+1)-xptr(kf);
3530     nz    = zptr(kf+1)-zptr(kf);
3531     ng    = zcptr(kf+1)-zcptr(kf);
3532     nmode = modptr(kf+1)-modptr(kf);
3533
3534     //** add comment
3535     txt=[get_comment('set_blk',list(funs(kf),funtyp(kf),kf));]
3536
3537     Code=[Code;
3538           ''
3539           '    '+txt];
3540
3541     Code=[Code;
3542           '    block_'+rdnom+'['+string(kf-1)+'].type   = '+...
3543             string(funtyp(kf))+';';
3544           '    block_'+rdnom+'['+string(kf-1)+'].ztyp   = '+...
3545             string(ztyp(kf))+';';
3546           '    block_'+rdnom+'['+string(kf-1)+'].ng     = '+...
3547             string(zcptr(kf+1)-zcptr(kf))+';']
3548
3549     //@@ continuous state
3550     if nx <> 0 then
3551       Code=[Code;
3552             '    block_'+rdnom+'['+string(kf-1)+'].nx     = '+...
3553              string(nx)+';';
3554             '    block_'+rdnom+'['+string(kf-1)+'].x      = &(x['+...
3555              string(xptr(kf)-1)+']);'
3556             '    block_'+rdnom+'['+string(kf-1)+'].xd     = &(xd['+...
3557                string(xptr(kf)-1)+']);']
3558       if impl_blk then
3559           Code=[Code;
3560                 '    block_'+rdnom+'['+string(kf-1)+'].res    = &(res['+...
3561                       string(xptr(kf)-1)+']);'
3562                 '    block_'+rdnom+'['+string(kf-1)+'].xprop  = &(xprop['+...
3563                       string(xptr(kf)-1)+']);']
3564       end
3565     else
3566       Code=[Code;
3567             '    block_'+rdnom+'['+string(kf-1)+'].nx     = 0;';
3568             '    block_'+rdnom+'['+string(kf-1)+'].x      = &(zero);'
3569             '    block_'+rdnom+'['+string(kf-1)+'].xd     = w;']
3570     end
3571
3572     //@@ zero-crossing
3573     if ng <> 0 then
3574       Code=[Code;
3575             '    block_'+rdnom+'['+string(kf-1)+'].g      = &(g['+...
3576             string(zcptr(kf)-1)+']);']
3577     else
3578       Code=[Code;
3579             '    block_'+rdnom+'['+string(kf-1)+'].g      = &(zero);';]
3580     end
3581
3582     //@@ mode
3583     if nmode <> 0 then
3584       Code=[Code;
3585             '    block_'+rdnom+'['+string(kf-1)+'].mode   = &(mode['+...
3586             string(modptr(kf)-1)+']);']
3587     end
3588
3589     Code=[Code;
3590           '    block_'+rdnom+'['+string(kf-1)+'].nz     = '+...
3591             string(zptr(kf+1)-zptr(kf))+';';
3592           '    block_'+rdnom+'['+string(kf-1)+'].noz    = '+...
3593             string(ozptr(kf+1)-ozptr(kf))+';';
3594           '    block_'+rdnom+'['+string(kf-1)+'].nrpar  = '+...
3595             string(rpptr(kf+1)-rpptr(kf))+';';
3596           '    block_'+rdnom+'['+string(kf-1)+'].nopar  = '+...
3597             string(opptr(kf+1)-opptr(kf))+';';
3598           '    block_'+rdnom+'['+string(kf-1)+'].nipar  = '+...
3599             string(ipptr(kf+1)-ipptr(kf))+';'
3600           '    block_'+rdnom+'['+string(kf-1)+'].nin    = '+...
3601             string(inpptr(kf+1)-inpptr(kf))+';';
3602           '    block_'+rdnom+'['+string(kf-1)+'].nout   = '+...
3603             string(outptr(kf+1)-outptr(kf))+';';
3604           '    block_'+rdnom+'['+string(kf-1)+'].nevout = '+...
3605             string(clkptr(kf+1)-clkptr(kf))+';';
3606           '    block_'+rdnom+'['+string(kf-1)+'].nmode  = '+...
3607             string(modptr(kf+1)-modptr(kf))+';'];
3608
3609     Code=[Code;
3610           '    if ((block_'+rdnom+'['+string(kf-1)+'].evout  = '+...
3611           'calloc(block_'+rdnom+'['+string(kf-1)+'].nevout,sizeof(double)))== NULL) return 0;'];
3612
3613     //***************************** input port *****************************//
3614     if nin>0 then
3615       //** alloc insz/inptr **//
3616       Code=[Code;
3617             '    if ((block_'+rdnom+'['+string(kf-1)+'].insz   = '+...
3618             'malloc(3*sizeof(int)*block_'+rdnom+'['+string(kf-1)+'].nin))== NULL) return 0;';
3619             '    if ((block_'+rdnom+'['+string(kf-1)+'].inptr  = '+...
3620             'malloc(sizeof(void *)*block_'+rdnom+'['+string(kf-1)+'].nin))== NULL) return 0;'];
3621
3622       //** inptr **//
3623       for k=1:nin
3624          lprt=inplnk(inpptr(kf)-1+k);
3625          Code=[Code
3626                '    block_'+rdnom+'['+string(kf-1)+'].inptr['+string(k-1)+']  = '+...
3627                rdnom+'_block_outtbptr['+string(lprt-1)+'];']
3628       end
3629
3630       //** 1st dim **//
3631       for k=1:nin
3632          lprt=inplnk(inpptr(kf)-1+k);
3633          Code=[Code
3634                '    block_'+rdnom+'['+string(kf-1)+'].insz['+string((k-1))+']   = '+...
3635                 string(size(outtb(lprt),1))+';']
3636       end
3637
3638       //** 2dn dim **//
3639       for k=1:nin
3640          lprt=inplnk(inpptr(kf)-1+k);
3641          Code=[Code
3642                '    block_'+rdnom+'['+string(kf-1)+'].insz['+string((k-1)+nin)+']   = '+...
3643                 string(size(outtb(lprt),2))+';']
3644       end
3645
3646       //** typ **//
3647       for k=1:nin
3648          lprt=inplnk(inpptr(kf)-1+k);
3649          Code=[Code
3650                '    block_'+rdnom+'['+string(kf-1)+'].insz['+string((k-1)+2*nin)+']   = '+...
3651                 mat2scs_c_typ(outtb(lprt))+';'];
3652       end
3653     end
3654     //**********************************************************************//
3655
3656     //***************************** output port *****************************//
3657     if nout>0 then
3658       //** alloc outsz/outptr **//
3659       Code=[Code
3660             '    if ((block_'+rdnom+'['+string(kf-1)+'].outsz  = '+...
3661              'malloc(3*sizeof(int)*block_'+rdnom+'['+string(kf-1)+'].nout))== NULL) return 0;';
3662             '    if ((block_'+rdnom+'['+string(kf-1)+'].outptr = '+...
3663              'malloc(sizeof(void*)*block_'+rdnom+'['+string(kf-1)+'].nout))== NULL) return 0;'];
3664
3665       //** outptr **//
3666       for k=1:nout
3667          lprt=outlnk(outptr(kf)-1+k);
3668          Code=[Code
3669                '    block_'+rdnom+'['+string(kf-1)+'].outptr['+string(k-1)+'] = '+...
3670                 rdnom+'_block_outtbptr['+string(lprt-1)+'];']
3671       end
3672
3673       //** 1st dim **//
3674       for k=1:nout
3675          lprt=outlnk(outptr(kf)-1+k);
3676          Code=[Code
3677                '    block_'+rdnom+'['+string(kf-1)+'].outsz['+string((k-1))+...
3678                ']  = '+string(size(outtb(lprt),1))+';']
3679       end
3680
3681       //** 2dn dim **//
3682       for k=1:nout
3683          lprt=outlnk(outptr(kf)-1+k);
3684          Code=[Code
3685                '    block_'+rdnom+'['+string(kf-1)+'].outsz['+string((k-1)+nout)+...
3686                ']  = '+string(size(outtb(lprt),2))+';']
3687       end
3688
3689       //** typ **//
3690       for k=1:nout
3691          lprt=outlnk(outptr(kf)-1+k);
3692          Code=[Code
3693                '    block_'+rdnom+'['+string(kf-1)+'].outsz['+string((k-1)+2*nout)+...
3694                ']  = '+mat2scs_c_typ(outtb(lprt))+';'];
3695       end
3696     end
3697     //**********************************************************************//
3698
3699     //@@ discrete state
3700     if nz>0 then
3701       Code=[Code
3702             '    block_'+rdnom+'['+string(kf-1)+'].z         = &(z['+...
3703             string(zptr(kf)-1)+']);']
3704     end
3705
3706     //***************************** object state *****************************//
3707     if (ozptr(kf+1)-ozptr(kf)>0) then
3708       noz = ozptr(kf+1)-ozptr(kf);
3709       Code=[Code
3710             '    if ((block_'+rdnom+'['+string(kf-1)+'].ozptr = '+...
3711             'malloc(sizeof(void *)*block_'+rdnom+'['+string(kf-1)+'].noz))== NULL) return 0;';
3712             '    if ((block_'+rdnom+'['+string(kf-1)+'].ozsz  = '+...
3713             'malloc(2*sizeof(int)*block_'+rdnom+'['+string(kf-1)+'].noz))== NULL) return 0;';
3714             '    if ((block_'+rdnom+'['+string(kf-1)+'].oztyp = '+...
3715             'malloc(sizeof(int)*block_'+rdnom+'['+string(kf-1)+'].noz))== NULL) return 0;';]
3716
3717       //** ozptr **//
3718       for k=1:noz
3719         Code=[Code;
3720               '    block_'+rdnom+'['+string(kf-1)+'].ozptr['+string(k-1)+...
3721               ']  = ozptr['+string(ozptr(kf)-1+k-1)+'];'];
3722       end
3723
3724       //** 1st dim **//
3725       for k=1:noz
3726         Code=[Code;
3727               '    block_'+rdnom+'['+string(kf-1)+'].ozsz['+string(k-1)+...
3728               ']   = '+string(size(oz(ozptr(kf)-1+k),1))+';'];
3729       end
3730
3731       //** 2nd dim **//
3732       for k=1:noz
3733         Code=[Code;
3734               '    block_'+rdnom+'['+string(kf-1)+'].ozsz['+string(noz+(k-1))+...
3735               ']   = '+string(size(oz(ozptr(kf)-1+k),2))+';'];
3736       end
3737
3738       //** typ **//
3739       for k=1:noz
3740         Code=[Code;
3741               '    block_'+rdnom+'['+string(kf-1)+'].oztyp['+string(k-1)+...
3742               ']  = '+mat2scs_c_typ(oz(ozptr(kf)-1+k))+';'];
3743       end
3744     end
3745     //************************************************************************//
3746
3747     if (part(funs(kf),1:7) ~= 'capteur' &...
3748         part(funs(kf),1:10) ~= 'actionneur' &...
3749         funs(kf) ~= 'bidon' &...
3750         funs(kf) ~= 'bidon2') then
3751       if (rpptr(kf+1)-rpptr(kf)>0) then
3752         Code=[Code;
3753               '    block_'+rdnom+'['+string(kf-1)+...
3754               '].rpar      = &(rpar['+string(rpptr(kf)-1)+']);']
3755       end
3756       if (ipptr(kf+1)-ipptr(kf)>0) then
3757         Code=[Code;
3758               '    block_'+rdnom+'['+string(kf-1)+...
3759               '].ipar      = &(ipar['+string(ipptr(kf)-1)+']);'] 
3760       end
3761       //** opar
3762       if (opptr(kf+1)-opptr(kf)>0) then
3763         Code=[Code;
3764               '    if ((block_'+rdnom+'['+string(kf-1)+'].oparptr = '+...
3765                'malloc(sizeof(void *)*block_'+rdnom+'['+string(kf-1)+'].nopar))== NULL) return 0;';
3766               '    if ((block_'+rdnom+'['+string(kf-1)+'].oparsz  = '+...
3767                'malloc(2*sizeof(int)*block_'+rdnom+'['+string(kf-1)+'].nopar))== NULL) return 0;';
3768               '    if ((block_'+rdnom+'['+string(kf-1)+'].opartyp = '+...
3769                'malloc(sizeof(int)*block_'+rdnom+'['+string(kf-1)+'].nopar))== NULL) return 0;';
3770               ]
3771         nopar = opptr(kf+1)-opptr(kf);
3772         //** oparptr **//
3773         for k=1:nopar
3774           Code=[Code;
3775                 '    block_'+rdnom+'['+string(kf-1)+'].oparptr['+string(k-1)+...
3776                  ']  = oparptr['+string(opptr(kf)-1+k-1)+'];'];
3777         end
3778         //** 1st dim **//
3779         for k=1:nopar
3780           Code=[Code;
3781                 '    block_'+rdnom+'['+string(kf-1)+'].oparsz['+string(k-1)+...
3782                  ']   = '+string(size(opar(opptr(kf)-1+k),1))+';'];
3783         end
3784         //** 2dn dim **//
3785         for k=1:nopar
3786           Code=[Code;
3787                 '    block_'+rdnom+'['+string(kf-1)+'].oparsz['+string(nopar+(k-1))+...
3788                  ']   = '+string(size(opar(opptr(kf)-1+k),2))+';'];
3789         end
3790         //** typ **//
3791         for k=1:nopar
3792           Code=[Code;
3793                 '    block_'+rdnom+'['+string(kf-1)+'].opartyp['+string(k-1)+...
3794                  ']  = '+mat2scs_c_typ(opar(opptr(kf)-1+k))+';'];
3795         end
3796       end
3797     end
3798
3799     //@@ work
3800     if with_work(kf)==1 then
3801       Code=[Code;
3802             '    block_'+rdnom+'['+string(kf-1)+...
3803              '].work      = (void **)(((double *)work)+'+string(kf-1)+');']
3804     end
3805
3806     //@@ nevptr
3807     Code=[Code;
3808           '    block_'+rdnom+'['+string(kf-1)+...
3809            '].nevprt    = nevprt;']
3810
3811     //@@ label
3812     Code=[Code;
3813           '    block_'+rdnom+'['+string(kf-1)+...
3814           '].label     = NULL;']
3815
3816 //     if length(cpr.sim.labels(kf))== 0 then
3817 //       Code=[Code;
3818 //             '    block_'+rdnom+'['+string(kf-1)+...
3819 //             '].label     = NULL;']
3820 //     else
3821 //       Code=[Code;
3822 //             '    if ((block_'+rdnom+'['+string(kf-1)+'].label  = '+...
3823 //              'malloc(sizeof(char)*'+string(length(cpr.sim.labels(kf))+1)+'))==NULL) return 0;';]
3824 //       Code=[Code;
3825 //             '    block_'+rdnom+'['+string(kf-1)+'].label     = ""'+cpr.sim.labels(kf)+'"";']
3826 //     end
3827
3828   end //for kf=1:nblk
3829
3830   //** init
3831   for kf=1:nblk
3832     if funs(kf)=='agenda_blk' then
3833       if ALL & size(evs,'*')<>0 then
3834         new_pointi=adjust_pointi(cpr.state.pointi,clkptr,funtyp)
3835         Code=[Code;
3836               '';
3837               '    /* Init of agenda_blk (blk nb '+string(kf)+') */'
3838               '    *(block_'+rdnom+'['+string(kf-1)+'].work) = '+...
3839                 '(agenda_struct*) scicos_malloc(sizeof(agenda_struct));'
3840               '    ptr = *(block_'+rdnom+'['+string(kf-1)+'].work);'
3841               '    ptr->pointi     = '+string(new_pointi)+';'
3842               '    ptr->fromflag3  = 0;'
3843               '    ptr->old_pointi = 0;'
3844              ]
3845         new_evtspt=adjust_agenda(cpr.state.evtspt,clkptr,funtyp)
3846         for i=1:size(new_evtspt,1)
3847           if new_evtspt(i)>0 then
3848             new_evtspt(i)=adjust_pointi(new_evtspt(i),clkptr,funtyp)
3849           end
3850         end
3851         for i=1:size(evs,'*')
3852           Code=[Code;
3853                 '    ptr->evtspt['+string(i-1)+'] = '+string(new_evtspt(i))+';'
3854                ]
3855         end
3856         new_tevts=adjust_agenda(cpr.state.tevts,clkptr,funtyp)
3857         for i=1:size(evs,'*')
3858           Code=[Code;
3859                 '    ptr->tevts['+string(i-1)+']  = '+string_to_c_string(new_tevts(i))+';'
3860                ]
3861         end
3862
3863       end
3864     else
3865       if ~(or(kf==act) | or(kf==cap)) then
3866         txt = call_block42(kf,0,4);
3867         if txt <> [] then
3868           Code=[Code;
3869                 '';
3870                 '    '+txt];
3871         end
3872       end
3873     end
3874   end
3875
3876   //## disable Jacobian computation
3877   if impl_blk then
3878     Code=[Code;
3879           '';
3880           '     /* Disable Jacobian computation */'
3881           '     Set_Jacobian_flag(0);'];
3882   end
3883
3884   Code=[Code;
3885         '  }'];
3886
3887   //** flag 5
3888   Code=[Code;
3889         '  else if (flag == 5) { '+get_comment('flag',list(5))
3890         '    /* get work ptr of thaht block */'
3891         '    block_'+rdnom+'=*block->work;']
3892
3893   for kf=1:nblk
3894      nin  = inpptr(kf+1)-inpptr(kf); //* number of input ports */
3895      nout = outptr(kf+1)-outptr(kf); //* number of output ports */
3896      nx   = xptr(kf+1)-xptr(kf);     //* number of continuous state */
3897      nz   = zptr(kf+1)-zptr(kf);     //@@ number of discrete state
3898
3899      //** add comment
3900      txt=[get_comment('set_blk',list(funs(kf),funtyp(kf),kf));]
3901
3902      Code=[Code;
3903            ''
3904            '    '+txt];
3905
3906      //@@ regular input
3907      for k=1:nin
3908         lprt=inplnk(inpptr(kf)-1+k);
3909          Code=[Code;
3910                '    block_'+rdnom+'['+string(kf-1)+'].inptr['+string(k-1)+...
3911                ']  = '+rdnom+'_block_outtbptr['+string(lprt-1)+'];']
3912      end
3913
3914      //@@ regular output
3915      for k=1:nout
3916         lprt=outlnk(outptr(kf)-1+k);
3917         Code=[Code
3918               '    block_'+rdnom+'['+string(kf-1)+'].outptr['+string(k-1)+...
3919               '] = '+rdnom+'_block_outtbptr['+string(lprt-1)+'];']
3920      end
3921
3922      //@@ discrete state
3923      if nz>0 then
3924        Code=[Code
3925              '    block_'+rdnom+'['+string(kf-1)+'].z         = &(z['+...
3926               string(zptr(kf)-1)+']);']
3927      end
3928
3929      //@@ continuous state
3930      if nx <> 0 then
3931        Code=[Code;
3932              '    block_'+rdnom+'['+string(kf-1)+'].nx     = '+...
3933               string(nx)+';';
3934              '    block_'+rdnom+'['+string(kf-1)+'].x      = &(x['+...
3935               string(xptr(kf)-1)+']);'
3936              '    block_'+rdnom+'['+string(kf-1)+'].xd     = &(xd['+...
3937               string(xptr(kf)-1)+']);']
3938        if impl_blk then
3939            Code=[Code;
3940                  '    block_'+rdnom+'['+string(kf-1)+'].res    = &(res['+...
3941                        string(xptr(kf)-1)+']);']
3942        end
3943      end
3944
3945      if (part(funs(kf),1:7) ~= 'capteur' &...
3946           part(funs(kf),1:10) ~= 'actionneur' &...
3947            funs(kf) ~= 'bidon' &...
3948             funs(kf) ~= 'bidon2') then
3949        //** rpar **//
3950        if (rpptr(kf+1)-rpptr(kf)>0) then
3951          Code=[Code;
3952                '    block_'+rdnom+'['+string(kf-1)+...
3953                 '].rpar   = &(rpar['+string(rpptr(kf)-1)+']);']
3954        end
3955        //** ipar **//
3956        if (ipptr(kf+1)-ipptr(kf)>0) then
3957          Code=[Code;
3958                '    block_'+rdnom+'['+string(kf-1)+...
3959                 '].ipar   = &(ipar['+string(ipptr(kf)-1)+']);'] 
3960        end
3961        //** opar **//
3962        if (opptr(kf+1)-opptr(kf)>0) then
3963          nopar = opptr(kf+1)-opptr(kf);
3964          for k=1:nopar
3965            Code=[Code;
3966                  '    block_'+rdnom+'['+string(kf-1)+'].oparptr['+string(k-1)+...
3967                  ']  = oparptr['+string(opptr(kf)-1+k-1)+'];'];
3968          end
3969        end
3970        //** oz **//
3971        if (ozptr(kf+1)-ozptr(kf)>0) then
3972          noz = ozptr(kf+1)-ozptr(kf);
3973          for k=1:noz
3974            Code=[Code;
3975                  '    block_'+rdnom+'['+string(kf-1)+'].ozptr['+string(k-1)+...
3976                 ']  = ozptr['+string(ozptr(kf)-1+k-1)+'];'];
3977          end
3978        end
3979      end
3980
3981      //@@ work
3982      if with_work(kf)==1 then
3983        Code=[Code;
3984              '    block_'+rdnom+'['+string(kf-1)+...
3985               '].work   = (void **)(((double *)work)+'+string(kf-1)+');']
3986      end
3987   end
3988
3989   for kf=1:nblk
3990     if funs(kf)=='agenda_blk' then
3991       if ALL & size(evs,'*')<>0 then
3992         Code=[Code;
3993               '';
3994               '    /* Free agenda_blk (blk nb '+string(kf)+') */'
3995               '    if(*(block_'+rdnom+'['+string(kf-1)+'].work) != NULL) {'
3996               '      scicos_free(*(block_'+rdnom+'['+string(kf-1)+'].work));'
3997               '    }'
3998              ]
3999
4000       end
4001     else
4002       if ~(or(kf==act) | or(kf==cap)) then
4003         txt = call_block42(kf,0,5);
4004         if txt <> [] then
4005           Code=[Code;
4006                 '';
4007                 '    '+txt];
4008         end
4009       end
4010     end
4011   end
4012
4013   Code=[Code;
4014         ''
4015         '    for (kf = 0; kf < '+string(nblk)+'; ++kf){'
4016         '      if (block_'+rdnom+'[kf].nin!=0){'
4017         '        if (block_'+rdnom+'[kf].insz!=NULL){'
4018         '          free(block_'+rdnom+'[kf].insz);'
4019         '        }'
4020         '      }'
4021         '      if (block_'+rdnom+'[kf].nout!=0){'
4022         '        if (block_'+rdnom+'[kf].outsz!=NULL){'
4023         '          free(block_'+rdnom+'[kf].outsz);'
4024         '        }'
4025         '      }'
4026         '      if (block_'+rdnom+'[kf].nopar!=0){'
4027         '        if (block_'+rdnom+'[kf].oparptr!=NULL){'
4028         '          free(block_'+rdnom+'[kf].oparptr);'
4029         '        }'
4030         '        if (block_'+rdnom+'[kf].oparsz!=NULL){'
4031         '          free(block_'+rdnom+'[kf].oparsz);'
4032         '        }'
4033         '        if (block_'+rdnom+'[kf].opartyp!=NULL){'
4034         '          free(block_'+rdnom+'[kf].opartyp);'
4035         '        }'
4036         '      }'
4037         '      if (block_'+rdnom+'[kf].noz!=0){'
4038         '        if (block_'+rdnom+'[kf].ozptr!=NULL){'
4039         '          free(block_'+rdnom+'[kf].ozptr);'
4040         '        }'
4041         '        if (block_'+rdnom+'[kf].ozsz!=NULL){'
4042         '          free(block_'+rdnom+'[kf].ozsz);'
4043         '        }'
4044         '        if (block_'+rdnom+'[kf].oztyp!=NULL){'
4045         '          free(block_'+rdnom+'[kf].oztyp);'
4046         '        }'
4047         '      }'
4048         '      if (block_'+rdnom+'[kf].evout!=NULL){'
4049         '        free(block_'+rdnom+'[kf].evout);'
4050         '      }'
4051         '      if (block_'+rdnom+'[kf].label!=NULL){'
4052         '        free(block_'+rdnom+'[kf].label);'
4053         '      }'
4054         '    }'
4055         '    scicos_free(block_'+rdnom+');'
4056         '  }'
4057         ''];
4058
4059   for i=1:size(actt,1)
4060     ni=actt(i,3)*actt(i,4); // dimension of ith input
4061     if actt(i,5)<>11 then
4062       Code=[Code;
4063             '  memcpy(*(y+'+string(actt(i,6)-1)+'),'+...
4064             '*('+rdnom+'_block_outtbptr+'+string(actt(i,2)-1)+'),'+...
4065              string(ni)+'*sizeof('+mat2c_typ(actt(i,5))+'));']
4066     else //** Cas cmplx
4067       Code=[Code;
4068             '  memcpy(*(y+'+string(actt(i,6)-1)+'),'+...
4069             '*('+rdnom+'_block_outtbptr+'+string(actt(i,2)-1)+'),'+...
4070              string(2*ni)+'*sizeof('+mat2c_typ(actt(i,5))+'));']
4071     end
4072   end
4073
4074   //**
4075   Code=[Code;
4076         '  return 0;'
4077         ''
4078         '} /* '+rdnom+' */']
4079
4080   //@@ addevs function
4081   if ALL & size(evs,'*')<>0 then
4082     Code=[Code;
4083           ''
4084           '/* addevs function */'
4085           'void '+rdnom+'_addevs(agenda_struct *ptr, double t, int evtnb)'
4086           '{'
4087           '  int i,j;'
4088           '']
4089
4090     if debug_agenda then
4091       Code=[Code;
4092             '  fprintf(stderr,""addevs (begin)\n \tpointi=%d\n \tevtnb=%d\n \tptr->evtspt[evtnb-1]=%d\n \tt=%f\n"", \'
4093             '                 ptr->pointi,evtnb,ptr->evtspt[evtnb-1],t);'
4094             '']
4095     end
4096
4097     Code=[Code;
4098           '  /*  */'
4099           '  if (ptr->evtspt[evtnb-1] != -1) {'
4100           '    if ((ptr->evtspt[evtnb-1] == 0) && (ptr->pointi==evtnb)) {'
4101           '      ptr->tevts[evtnb-1] = t;'
4102           '      return;'
4103           '    }'
4104           '    /* */'
4105           '    else {'
4106           '      /* (ptr->pointi == evtnb) && ((ptr->evtspt[evtnb] == 0) || (ptr->evtspt[evtnb] != 0)) */'
4107           '      if (ptr->pointi == evtnb) {'
4108           '        ptr->pointi = ptr->evtspt[evtnb-1]; /* remove from chain, pointi is now the event provided by ptr->evtspt[evtnb] */'
4109           '      }'
4110           '      /* (ptr->pointi != evtnb) && ((ptr->evtspt[evtnb] == 0) || (ptr->evtspt[evtnb] != 0)) */'
4111           '      else {'
4112           '        /* find where is the event to be updated in the agenda */'
4113           '        i = ptr->pointi;'
4114           '        while (evtnb != ptr->evtspt[i-1]) {'
4115           '          i = ptr->evtspt[i-1];'
4116           '        }'
4117           '        ptr->evtspt[i-1] = ptr->evtspt[evtnb-1]; /* remove old evtnb from chain */'
4118           ''
4119           '        /* if (TCritWarning == 0) {'
4120           '         *  sciprint(""\n\r Warning:an event is reprogrammed at t=%g by removing another"",t );'
4121           '         *  sciprint(""\n\r         (already programmed) event. There may be an error in"");'
4122           '         *  sciprint(""\n\r         your model. Please check your model\n\r"");'
4123           '         *  TCritWarning=1;'
4124           '         * }'
4125           '         */'
4126           ''
4127           '        /*do_cold_restart();*/ /* the erased event could be a critical event, '
4128           '                            * so do_cold_restart is added to'
4129           '                            * refresh the critical event table'
4130           '                            */'
4131           '      }'
4132           ''
4133           '      /* */'
4134           '      ptr->evtspt[evtnb-1] = 0;'
4135           '      ptr->tevts[evtnb-1]  = t;'
4136           '    }'
4137           '  }'
4138           '  else {'
4139           '    ptr->evtspt[evtnb-1] = 0;'
4140           '    ptr->tevts[evtnb-1]  = t;'
4141           '  }'
4142           ''
4143           '  /* */'
4144           '  if (ptr->pointi == 0) {'
4145           '    ptr->pointi = evtnb;'
4146           '    return;'
4147           '  }'
4148           '  if (t < ptr->tevts[ptr->pointi-1]) {'
4149           '    ptr->evtspt[evtnb-1] = ptr->pointi;'
4150           '    ptr->pointi = evtnb;'
4151           '    return;'
4152           '  }'
4153           ''
4154           '  /* */'
4155           '  i = ptr->pointi;'
4156           ''
4157           ' L100:'
4158           '  if (ptr->evtspt[i-1] == 0) {'
4159           '    ptr->evtspt[i-1] = evtnb;'
4160           '    return;'
4161           '  }'
4162           '  if (t >= ptr->tevts[ptr->evtspt[i-1]-1]) {'
4163           '    j = ptr->evtspt[i-1];'
4164           '    if (ptr->evtspt[j-1] == 0) {'
4165           '      ptr->evtspt[j-1] = evtnb;'
4166           '      return;'
4167           '    }'
4168           '    i = j;'
4169           '    goto L100;'
4170           '  }'
4171           '  else {'
4172           '    ptr->evtspt[evtnb-1] = ptr->evtspt[i-1];'
4173           '    ptr->evtspt[i-1] = evtnb;'
4174           '  }'
4175           '']
4176
4177     if debug_agenda then
4178       Code=[Code;
4179             '  fprintf(stderr,""addevs (end), pointi=%d\n"",ptr->pointi);'
4180             '']
4181     end
4182
4183     Code=[Code;
4184           '  return;'
4185           '}'
4186          ]
4187   end
4188
4189 endfunction
4190
4191 //generates skeleton of external world events handling function
4192 function Code=make_outevents()
4193   z='0'
4194   if szclkIN==[] then
4195     newszclkIN=0;
4196   else
4197     newszclkIN=szclkIN;
4198   end
4199
4200   Code=['/*'+part('-',ones(1,40))+'  External events handling function */';
4201          'void '+rdnom+'_events(int *nevprt,double *t)';
4202          '{'
4203          '/*  set next event time and associated events ports'
4204          ' *  nevprt has binary expression b1..b'+string(newszclkIN)+' where bi is a bit'
4205          ' *  bi is set to 1 if an activation is received by port i. Note that'
4206          ' *  more than one activation can be received simultaneously'
4207          ' *  Caution: at least one bi should be equal to one */'
4208          '']
4209
4210   if (newszclkIN <> 0) then
4211     Code=[Code;
4212           '    int i,p,b[]={'+strcat(z(ones(1,newszclkIN)),',')+'};'
4213           ''
4214           '/* this is an example for the activation of events ports */'
4215           '    b[0]=1;']
4216
4217     if newszclkIN>1 then
4218       for bb=2:newszclkIN
4219         Code($+1)='    b['+string(bb-1)+']=1;'
4220       end
4221     end
4222
4223     Code=[Code;
4224           ''
4225           '/* definition of the step time  */'
4226           '    *t = *t + 0.1;'
4227           ''
4228           '/* External events handling process */'
4229           '    *nevprt=0;p=1;'
4230           '    for (i=0;i<'+string(newszclkIN)+';i++) {'
4231           '      *nevprt=*nevprt+b[i]*p;'
4232           '      p=p*2;'
4233           '    }'
4234           '}']
4235   else
4236     Code=[Code;
4237           '';
4238           '/* definition of the step time  */'
4239           '    *t = *t + 0.1;'
4240           '}']
4241   end
4242 endfunction
4243
4244 //## [out]=rdnom([in][,te][,tf][,h][,solver])
4245 //##
4246 //## Rhs :
4247 //## in     : input signal(s) for sensors
4248 //## te     : sampling time (default : 0.1)
4249 //## tf     : final time (default : 30)
4250 //## h      : solver step (default : 0.001)
4251 //## solver : type of solver (1:Euler, 2:Heun, 3:R.Kutta 4th order)
4252 //##          (default : 3)
4253 //## Lhs :
4254 //## out    : output signal(s) coming from actuator
4255 //##
4256 //## Alan, initial rev xx/12/07
4257 //##
4258 //Copyright INRIA
4259 function Code=make_sci_interf()
4260
4261  //## get the number of sensors/actuators
4262  nbcapt=size(capt,1)
4263  nbact=size(actt,1)
4264
4265  //@@ get the length of the name of the interfacing scilab function
4266  l_rdnom=length(rdnom)
4267  l_rdnom=(l_rdnom>17)*17 + (l_rdnom<=17)*l_rdnom
4268
4269  //## header
4270  Code=['#include <string.h>'
4271        '#include <stdlib.h>'
4272        '#include ""stack-c.h""'
4273        '#include ""mex.h""'
4274        '']
4275
4276  //## external definition of standalone simulation function
4277  Code=[Code;
4278        '/* external defintion of standalone simulation function */'
4279        'extern int '+rdnom+'_sim(double tf, double dt, double h, int solver, \'
4280        get_blank(rdnom)+'                int *typin, void **inptr, int *typout, void **outptr);'
4281        ''
4282        '/* external definition of error table function */'
4283        'extern void get_err_msg(int ierr,char *err_msg);'
4284        ''
4285        '#if WIN32'
4286        '  #ifndef coserr'
4287        '    #define coserr _imp__coserr'
4288        '  #endif'
4289        '#endif'
4290        ''
4291        '/* standalone still use scicos.c here ! */'
4292        'extern struct {char buf[4096];} coserr;'
4293        '']
4294
4295  //## type of in/out structure definition
4296  Code=[Code;
4297        '/* structure definition of in/out sensors/actuators */'
4298        'typedef struct {'
4299        '  int typ;      /* data type */'
4300        '  int ndims;    /* number of dims */'
4301        '  int ndata;    /* number of data */'
4302        '  int *dims;    /* size of data (length ndims) */'
4303        '  double *time; /* date of data (length ndata) */'
4304        '  void *data;   /* data (length ndata*prod(dims)) */'
4305        '} scicos_inout;'
4306        '']
4307
4308  //## comment
4309  txt_in  = []
4310  txt_out = []
4311  for i=1:nbcapt
4312    txt_in = txt_in+'in'+string(i)+',';
4313    if i==nbcapt then
4314      txt_in=part(txt_in,1:length(txt_in)-1);
4315    end
4316  end
4317  for i=1:nbact
4318    txt_out = txt_out+'out'+string(i)+',';
4319    if i==nbact then
4320      txt_out=part(txt_out,1:length(txt_out)-1);
4321    end
4322  end
4323
4324  if txt_in<>[] then
4325    txt_rhs=txt_in+',[,te][,tf][,h][,solver]';
4326  else
4327    txt_rhs='[,te][,tf][,h][,solver]';
4328  end
4329
4330  Code=[Code;
4331        '/* ['+txt_out+']='+rdnom+'('+txt_rhs+')'
4332        ' *'
4333        ' * Rhs :']
4334  if txt_in<>[] then
4335    Code=[Code;
4336          ' * in     : input signal(s) for sensors']
4337  end
4338  Code=[Code;
4339        ' * te     : sampling time (default : 0.1)'
4340        ' * tf     : final time (default : 30)'
4341        ' * h      : solver step (default : 0.001)'
4342        ' * solver : type of solver (1:Euler, 2:Heun, 3:R.Kutta 4th order)'
4343        ' *          (default : 3)'
4344        ' *']
4345   if txt_out<>0 then
4346     Code=[Code;
4347           ' * Lhs :'
4348           ' * out    : output signal(s) coming from actuator']
4349   end
4350   Code=[Code;
4351         ' */']
4352
4353  //## interfacing function
4354  Code=[Code;
4355        'int int'+part(rdnom,1:l_rdnom)+'(fname,fname_len)'
4356        '   char *fname;'
4357        '   unsigned long fname_len;'
4358        '{']
4359
4360  //## declaration of variables for scilab stack
4361  Code = [Code;
4362          '  /* variables to handle ptr and dims coming from scilab stack */']
4363  //## for sensors
4364  for i=1:nbcapt
4365     Code = [Code;
4366             '  static int l'+string(i)+','+...
4367               'n'+string(i)+',m'+string(i)+';'+...
4368               '  /* sensor '+string(i)+' */']
4369  end
4370  //## for [,te][,tf][,h][,solver])
4371  Code = [Code;
4372          '  static int l'+string(nbcapt+1)+','+...
4373            'n'+string(nbcapt+1)+',m'+string(nbcapt+1)+';'+...
4374            '  /* te */'
4375          '  static int l'+string(nbcapt+2)+','+...
4376            'n'+string(nbcapt+2)+',m'+string(nbcapt+2)+';'+...
4377            '  /* tf */'
4378          '  static int l'+string(nbcapt+3)+','+...
4379            'n'+string(nbcapt+3)+',m'+string(nbcapt+3)+';'+...
4380            '  /* h */'
4381          '  static int l'+string(nbcapt+4)+','+...
4382            'n'+string(nbcapt+4)+',m'+string(nbcapt+4)+';'+...
4383            '  /* solver */']
4384  //## for actuators
4385  for i=1:nbact
4386     Code = [Code;
4387             '  static int l'+string(nbcapt+4+i)+','+...
4388               'n'+string(nbcapt+4+i)+',m'+string(nbcapt+4+i)+';'+...
4389               '  /* actuator '+string(i)+' */']
4390  end
4391  //## for scicos signal (mlist)
4392  if nbact>0 then
4393     Code = [Code;
4394             '  static int mL=4,nL=1,lL; /* def scicos signal */'
4395             '  static char *Str[]={""st"",""dims"",""values"",""time""};'
4396             '  static int V[]={1,1};'
4397             '  static SciIntMat M={1,2,4,-1,V};  /* dims field */']
4398  end
4399
4400  //## declaration of variables for standalone simulation function
4401  Code = [Code;
4402          ''
4403          '  /* variables for standalone simulation function */']
4404
4405  //## default values for te, tf, h and solver
4406  Code=[Code
4407        '  /* default values te,tf,h and solver */'
4408        '  double te  = 0.1;'
4409        '  double tf  = 30;'
4410        '  double h   = 0.001;'
4411        '  int solver = 3;']
4412
4413  //## sensors
4414  if nbcapt<>0 then
4415    Code=[Code
4416          ''
4417          '  /* Inputs of sensors */'
4418          '  /* int nin='+string(nbcapt)+'; */'
4419          cformatline('  int typin[]={'+...
4420               strcat(string(2*ones(nbcapt,1)),"," )+'};',70)
4421          cformatline('  void *inptr[]={'+...
4422               strcat(string(zeros(nbcapt,1)),"," )+'};',70)]
4423
4424    for i=1:nbcapt
4425      Code=[Code
4426            '  scicos_inout in_'+string(i)+';']
4427    end
4428  else
4429    Code=[Code;
4430          ''
4431          '  /* Inputs of sensors */'
4432          '  /* int nin=0; */'
4433          '  int *typin=NULL;'
4434          '  void **inptr=NULL;']
4435  end
4436
4437  //## actuators
4438  if nbact<>0 then
4439    Code=[Code
4440          ''
4441          '  /* Outputs of actuators */'
4442          '  /* int nout='+string(nbact)+'; */'
4443          cformatline('  int typout[]={'+...
4444               strcat(string(2*ones(nbact,1)),"," )+'};',70)
4445          cformatline('  void *outptr[]={'+...
4446               strcat(string(zeros(nbact,1)),"," )+'};',70)]
4447
4448    for i=1:nbact
4449      Code=[Code
4450            '  scicos_inout out_'+string(i)+';']
4451    end
4452  else
4453    Code=[Code;
4454          ''
4455          '  /* Outputs of actuators */'
4456          '  /* int nout=0; */'
4457          '  int *typout=NULL;'
4458          '  void **outptr=NULL;']
4459  end
4460
4461  //## template for actuator transposition
4462  if nbact<>0 then
4463    Code=[Code
4464          ''
4465          '  /* ptr for output transposition */']
4466    for i=1:nbact
4467      Code=[Code
4468            '  void *out_ptr'+string(i)+';']
4469    end
4470  end
4471
4472  //## error handling
4473  Code=[Code
4474        ''
4475        '  /* Ouput standalone error handling */'
4476        '  int ierr;'
4477        '  char err_msg[4096];']
4478
4479  //## counter variable
4480  Code=[Code
4481        ''
4482        '  /* counter local variable */'
4483        '  int i,j;']
4484
4485  //## CheckRhs min=nb sensors, max= nb sensors+4
4486  Code=[Code;
4487        ''
4488        '  /* check numbers of rhs/lhs */'
4489        '  CheckRhs('+string(nbcapt)+','+string(nbcapt+4)+');']
4490
4491  //## CheckLhs min/max=nb actuators
4492  Code=[Code;
4493        '  CheckLhs('+string(nbact)+','+string(nbact)+');'
4494        '']
4495
4496  Code=[Code;
4497        '  switch(Rhs) {']
4498
4499  //## Check/get rhs var
4500  for i=nbcapt+4:-1:1
4501
4502    //## str for stack handling
4503    i_str = string(i);
4504    m_str = 'm'+string(i);
4505    n_str = 'n'+string(i);
4506    l_str = 'l'+string(i);
4507
4508   //## solver (solver type)
4509    if i==nbcapt+4 then
4510      Code=[Code;
4511            '    case '+i_str+' :    /* check/get solver */'
4512            '       GetRhsVar('+i_str+',""d"",&'+m_str+',&'+n_str+',&'+l_str+');'
4513            '       CheckDims('+i_str+','+m_str+','+n_str+',1,1);'
4514            '       solver = (int) *stk(l'+i_str+');'
4515            '']
4516
4517   //## h (solver time step)
4518   elseif i==nbcapt+3 then
4519      Code=[Code;
4520            '    case '+i_str+' :    /* check/get h */'
4521            '       GetRhsVar('+i_str+',""d"",&'+m_str+',&'+n_str+',&'+l_str+');'
4522            '       CheckDims('+i_str+','+m_str+','+n_str+',1,1);'
4523            '       h = *stk(l'+i_str+');'
4524            '']
4525
4526   //## tf (final time simulation)
4527   elseif i==nbcapt+2 then
4528      Code=[Code;
4529            '    case '+i_str+' :    /* check/get tf */'
4530            '       GetRhsVar('+i_str+',""d"",&'+m_str+',&'+n_str+',&'+l_str+');'
4531            '       CheckDims('+i_str+','+m_str+','+n_str+',1,1);'
4532            '       tf = *stk(l'+i_str+');'
4533            '']
4534
4535   //## te (clock sampling time)
4536   elseif i==nbcapt+1 then
4537      Code=[Code;
4538            '    case '+i_str+' :    /* check/get te */'
4539            '       GetRhsVar('+i_str+',""d"",&'+m_str+',&'+n_str+',&'+l_str+');'
4540            '       CheckDims('+i_str+','+m_str+','+n_str+',1,1);'
4541            '       te = *stk(l'+i_str+');'
4542            '']
4543
4544   //## sensors
4545   else
4546      Code=[Code;
4547            '    case '+i_str+' :    /* check/get sensor '+i_str+' */'
4548            '       GetRhsVar('+i_str+',""d"",&'+m_str+',&'+n_str+',&'+l_str+');'
4549            '       /* Many thing to do */'
4550            '']
4551
4552   end
4553  end
4554
4555  Code=[Code;
4556        '  }'
4557        '']
4558
4559  //## inform in/out structure
4560  //## sensors
4561  for i=1:nbcapt
4562    //## in_x.dims
4563    Code=[Code
4564          '  /* inform in struct of sensor '+string(i)+' */'
4565          '  in_'+string(i)+'.typ       = '+string(capt(i,5))+';'
4566          '  in_'+string(i)+'.ndims     = 2;'
4567          '  in_'+string(i)+'.ndata     = m'+string(i)+';'
4568          '  if ((in_'+string(i)+'.dims = (int*) malloc(in_'+string(i)+'.ndims*sizeof(int)))==NULL){'];
4569    if i<>1 then
4570      for j=1:i-1
4571        Code=[Code
4572              '    free(in_'+string(j)+'.dims);'];
4573      end
4574    end
4575    Code=[Code
4576          '    return 0;'
4577          '  }']
4578
4579    //## in_x.data
4580    Code=[Code
4581          '  in_'+string(i)+'.dims[0] = 1;'
4582          '  in_'+string(i)+'.dims[1] = n'+string(i)+';']
4583    //## Alan : 05/09/08 : add complex number
4584    //##                   arbitrary data type should be done.
4585    if capt(i,5) == 11 then // cmplx case
4586      Code=[Code
4587            '  if ((in_'+string(i)+'.data = (double *) malloc(in_'+string(i)+'.ndata*'+...
4588                  'in_'+string(i)+'.dims[0]*in_'+string(i)+'.dims[1]*2*sizeof(double)))==NULL){']
4589    else
4590      Code=[Code
4591            '  if ((in_'+string(i)+'.data = (double *) malloc(in_'+string(i)+'.ndata*'+...
4592                  'in_'+string(i)+'.dims[0]*in_'+string(i)+'.dims[1]*sizeof(double)))==NULL){']
4593    end
4594
4595    for j=1:i
4596      Code=[Code
4597            '    free(in_'+string(j)+'.dims);']
4598    end
4599
4600    Code=[Code
4601          '    return 0;'
4602          '  }'
4603          '  if ((in_'+string(i)+'.dims[0] == 1) &&  (in_'+string(i)+'.dims[1] != 1)) {'
4604          '    for(i=0;i<in_'+string(i)+'.ndata;i++) {'
4605          '      for(j=0;j<in_'+string(i)+'.dims[1];j++) {'
4606          '         *((double *)in_'+string(i)+'.data + i*in_'+string(i)+'.dims[1] + j) = \'
4607          '             *((double *) stk(l'+string(i)+') + j*in_'+string(i)+'.ndata + i);']
4608
4609    if capt(i,5) == 11 then // cmplx case
4610      Code=[Code
4611            '         *((double *)in_'+string(i)+'.data + i*in_'+string(i)+'.dims[1] + j + '+...
4612                        'in_'+string(i)+'.dims[0]*in_'+string(i)+'.dims[1]) = \'
4613            '             *((double *) stk(l'+string(i)+') + j*in_'+string(i)+'.ndata + i + '+...
4614                        'in_'+string(i)+'.dims[0]*in_'+string(i)+'.dims[1]);']
4615    end
4616
4617    Code=[Code
4618          '      }'
4619          '    }'
4620          '  }'
4621          '  else {']
4622
4623    if capt(i,5) == 11 then // cmplx case
4624      Code=[Code
4625            '    for(i=0;i<in_'+string(i)+'.ndata*in_'+string(i)+'.dims[0]*in_'+string(i)+'.dims[1]*2;i++) {'
4626            '      *((double *)in_'+string(i)+'.data + i) = *((double *) stk(l'+string(i)+') + i);'
4627            '    }']
4628    else
4629      Code=[Code
4630            '    for(i=0;i<in_'+string(i)+'.ndata*in_'+string(i)+'.dims[0]*in_'+string(i)+'.dims[1];i++) {'
4631            '      *((double *)in_'+string(i)+'.data + i) = *((double *) stk(l'+string(i)+') + i);'
4632            '    }']
4633    end
4634
4635    Code=[Code
4636          '  }'
4637          ''];
4638  end
4639
4640  //## actuators
4641  for i=1:nbact
4642    //## out_x.dims
4643    Code=[Code
4644          '  /* inform out struct of actuator '+string(i)+' */'
4645          '  out_'+string(i)+'.typ       = '+string(actt(i,5))+';'
4646          '  out_'+string(i)+'.ndims     = 2;'
4647          '  out_'+string(i)+'.ndata     = 1000; /* default buffer size */'
4648          '  if ((out_'+string(i)+'.dims = (int *) malloc(out_'+string(i)+'.ndims*sizeof(int)))==NULL){'];
4649    for j=1:nbcapt
4650      Code=[Code
4651            '    free(in_'+string(j)+'.data);'
4652            '    free(in_'+string(j)+'.dims);'];
4653    end
4654
4655    for j=1:i-1
4656      Code=[Code
4657            '    free(out_'+string(j)+'.dims);'
4658            '    free(out_'+string(j)+'.data);'
4659            '    free(out_'+string(j)+'.time);'];
4660    end
4661
4662    Code=[Code
4663          '    return 0;'
4664          '  }']
4665
4666    //## out_x.data
4667    Code=[Code
4668          '  out_'+string(i)+'.dims[0]   = '+string(actt(i,3))+';'
4669          '  out_'+string(i)+'.dims[1]   = '+string(actt(i,4))+';'
4670          '  out_'+string(i)+'.data      = NULL;']
4671
4672    if actt(i,5) == 11 then // cmplx case
4673      Code=[Code
4674            '  if ((out_'+string(i)+'.data = (double *) realloc(out_'+string(i)+'.data, \'
4675            '       out_'+string(i)+'.ndata*'+...
4676             'out_'+string(i)+'.dims[0]*out_'+string(i)+'.dims[1]'+'*sizeof(double)*2))==NULL){'];
4677    else
4678      Code=[Code
4679            '  if ((out_'+string(i)+'.data = (double *) realloc(out_'+string(i)+'.data, \'
4680            '       out_'+string(i)+'.ndata*'+...
4681             'out_'+string(i)+'.dims[0]*out_'+string(i)+'.dims[1]'+'*sizeof(double)))==NULL){'];
4682    end
4683
4684    for j=1:nbcapt
4685      Code=[Code
4686            '    free(in_'+string(j)+'.data);'
4687            '    free(in_'+string(j)+'.dims);'];
4688    end
4689
4690    for j=1:i-1
4691      Code=[Code
4692            '    free(out_'+string(j)+'.dims);'
4693            '    free(out_'+string(j)+'.data);'
4694            '    free(out_'+string(j)+'.time);'];
4695    end
4696
4697    Code=[Code
4698          '    free(out_'+string(i)+'.dims);']
4699
4700
4701    Code=[Code
4702          '    return 0;'
4703          '  }']
4704
4705    //## out_x.time
4706    Code=[Code
4707          '  out_'+string(i)+'.time      = NULL;'
4708          '  if ((out_'+string(i)+'.time = (double *) realloc(out_'+string(i)+'.time,'+...
4709                  'out_'+string(i)+'.ndata*sizeof(double)))==NULL){'];
4710    for j=1:nbcapt
4711      Code=[Code
4712            '    free(in_'+string(j)+'.data);'
4713            '    free(in_'+string(j)+'.dims);'];
4714    end
4715
4716    for j=1:i-1
4717      Code=[Code
4718            '    free(out_'+string(j)+'.dims);'
4719            '    free(out_'+string(j)+'.data);'
4720            '    free(out_'+string(j)+'.time);'];
4721    end
4722
4723    Code=[Code
4724          '    free(out_'+string(i)+'.dims);'
4725          '    free(out_'+string(i)+'.data);'];
4726
4727    Code=[Code
4728          '    return 0;'
4729          '  }'
4730          ''
4731         ];
4732  end
4733
4734  //## store ptr of sensors/actuators
4735  if nbact<>0 & nbcapt<>0 then
4736    Code=[Code
4737          '  /* store ptr of sensors/actuators in inptr/outptr */']
4738  elseif nbcapt<>0 then
4739    Code=[Code
4740          '  /* store ptr of sensors in inptr */']
4741  elseif nbact<>0 then
4742    Code=[Code
4743          '  /* store ptr of actuators in outptr */']
4744  end
4745
4746  if nbcapt<>0 then
4747    for i=1:nbcapt
4748      Code=[Code;
4749            '  inptr['+string(i-1)+']  = &in_'+string(i)+';']
4750    end
4751  end
4752
4753  if nbact<>0 then
4754    for i=1:nbact
4755      Code=[Code;
4756            '  outptr['+string(i-1)+'] = &out_'+string(i)+';']
4757    end
4758  end
4759
4760  //## call standalone simulation function
4761  Code=[Code
4762        ''
4763        '  /* call standalone simulation function */'
4764        '  ierr='+rdnom+'_sim(tf, te, h, solver, typin, inptr, typout, outptr);'
4765        ''
4766        '  /* display error message */'
4767        '  if (ierr!=0) {'
4768        '    /* standalone still use scicos.c here ! */'
4769        '    if(ierr!=10) {'
4770        '      get_err_msg(ierr,err_msg);'
4771        '    }'
4772        '    else {'
4773        '      strcpy(err_msg,coserr.buf);'
4774        '    }'
4775        '    sciprint(""Simulation fails with error number %d :'+...
4776              '\n%s\n"",ierr,err_msg);'
4777        '  }'
4778       ]
4779
4780  //## create Lhsvar (actuators)
4781  if nbact<>0 then
4782    Code=[Code
4783          ''
4784          '  /* Create LhsVar */']
4785
4786    for i=1:nbact
4787      //## str for stack handling
4788      i_str = string(i+nbcapt+4);
4789      m_str = 'm'+string(i+nbcapt+4);
4790      n_str = 'n'+string(i+nbcapt+4);
4791      l_str = 'l'+string(i+nbcapt+4);
4792
4793      Code=[Code
4794            '  /* actuator '+string(i)+' */'
4795            '  CreateVar('+i_str+', ""m"", &mL, &nL, &lL);              /* mlist */'
4796            '  CreateListVarFromPtr('+i_str+',1,""S"", &nL, &mL, Str);  /* str of scicos signal */'
4797            '  CreateListVarFromPtr('+i_str+',2,""I"", &M.m, &M.n, &M); /* def dims of mlist */'
4798            '  '+m_str+'=out_'+string(i)+'.ndata;']
4799
4800      Code=[Code
4801            '  /* vector case */'
4802            '  if ((out_'+string(i)+'.dims[0]==1 && out_'+string(i)+'.dims[1]!=1) || \'
4803            '      (out_'+string(i)+'.dims[0]!=1 && out_'+string(i)+'.dims[1]==1)) {'
4804            '    if (out_'+string(i)+'.dims[0]!=1) {'
4805            '      '+n_str+'=out_'+string(i)+'.dims[0];'
4806            '    }'
4807            '    else {'
4808            '      '+n_str+'=out_'+string(i)+'.dims[1];'
4809            '    }'
4810            '    /*transpose output */']
4811
4812      if actt(i,5) == 11 then // cmplx case
4813        Code=[Code
4814              '    if ((out_ptr'+string(i)+' = (double *) malloc('+m_str+'*'+n_str+'*2*sizeof(double)))==NULL){']
4815      else
4816        Code=[Code
4817              '    if ((out_ptr'+string(i)+' = (double *) malloc('+m_str+'*'+n_str+'*sizeof(double)))==NULL){']
4818      end
4819
4820      if nbcapt<>0 then
4821        for j=1:nbcapt
4822          Code=[Code
4823                '      free(in_'+string(j)+'.data);'
4824                '      free(in_'+string(j)+'.dims);'];
4825        end
4826      end
4827      for j=1:nbact
4828        Code=[Code
4829              '      free(out_'+string(j)+'.dims);'
4830              '      free(out_'+string(j)+'.data);'
4831              '      free(out_'+string(j)+'.time);'];
4832      end
4833
4834      Code=[Code
4835            '      return 0;'
4836            '    }'
4837            '    for(i=0;i<'+m_str+';i++) {'
4838            '      for(j=0;j<'+n_str+';j++) {'
4839            '        *((double *)out_ptr'+string(i)+' + j*'+m_str+' + i) = *((double *) out_'+string(i)+'.data + i*'+n_str+' + j);']
4840
4841      if actt(i,5) == 11 then // cmplx case
4842        Code=[Code
4843              '        *((double *)out_ptr'+string(i)+' + j*'+m_str+' + i + m7*n7) = *((double *) out_'+string(i)+'.data + i*'+n_str+' + j + m7*n7);']
4844      end
4845
4846      Code=[Code
4847            '      }'
4848            '    }']
4849
4850      if actt(i,5) == 11 then // cmplx case
4851        Code=[Code
4852              '   {'
4853              '     int it=1;'
4854              '     double *ptr_d = ((double*) out_ptr'+string(i)+' + m7*n7);'
4855              '     CreateListCVarFromPtr('+i_str+',3,""d"", &it, &'+m_str+', &'+n_str+', &out_ptr'+string(i)+', &ptr_d);   /* data */'
4856              '   }']
4857      else
4858        Code=[Code
4859              '    CreateListVarFromPtr('+i_str+',3,""d"", &'+m_str+', &'+n_str+', &out_ptr'+string(i)+');   /* data */']
4860      end
4861
4862      Code=[Code
4863            '  }'
4864            '  else {'
4865            '    /* scalar case */'
4866            '    if (out_'+string(i)+'.dims[0]==1 && out_'+string(i)+'.dims[1]==1) {']
4867
4868      if actt(i,5) == 11 then // cmplx case
4869        Code=[Code
4870              '      '+n_str+'=1;'
4871              '      int it=1;'
4872              '      double *ptr_d = ((double*) out_'+string(i)+'.data + m7*n7);'
4873              '      CreateListCVarFromPtr('+i_str+',3,""d"", &it, &'+m_str+', &'+n_str+', &out_'+string(i)+'.data, &ptr_d);   /* data */']
4874      else
4875        Code=[Code
4876              '      '+n_str+'=1;'
4877              '      CreateListVarFromPtr('+i_str+',3,""d"", &'+m_str+', &'+n_str+', &out_'+string(i)+'.data);   /* data */']
4878      end
4879
4880      Code=[Code
4881            '    }'
4882            '    /* matrix case : TODO */'
4883            '    else {']
4884
4885      if nbcapt<>0 then
4886        for j=1:nbcapt
4887          Code=[Code
4888                '      free(in_'+string(j)+'.data);'
4889                '      free(in_'+string(j)+'.dims);'];
4890        end
4891      end
4892      for j=1:nbact
4893        Code=[Code
4894              '      free(out_'+string(j)+'.dims);'
4895              '      free(out_'+string(j)+'.data);'
4896              '      free(out_'+string(j)+'.time);'];
4897      end
4898
4899      Code=[Code
4900            '      return 0;'
4901            '    }'
4902            '  }']
4903
4904      //## event date
4905      Code=[Code
4906            '  '+n_str+'=1;'
4907            '  CreateListVarFromPtr('+i_str+',4,""d"", &'+m_str+', &'+n_str+...
4908               ', &out_'+string(i)+'.time);   /* event date */'
4909            '  /* Many thing to do */'
4910            ''];
4911    end
4912  end
4913
4914  //## put LhsVar
4915  if nbact<>0 then
4916    Code=[Code
4917          '  /* Put LhsVar */']
4918
4919    for i=1:nbact
4920      Code=[Code
4921            '  LhsVar('+string(i)+')='+string(i+nbcapt+4)+';']
4922    end
4923  end
4924
4925  //## free allocated array
4926  //## array of sensors
4927  if nbcapt<>0 | nbact<>0 then
4928    Code=[Code
4929          ''
4930          '  /* free allocated array */'];
4931  end
4932
4933  if nbcapt<>0 then
4934    for i=1:nbcapt
4935      Code=[Code
4936            '  free(in_'+string(i)+'.data);'
4937            '  free(in_'+string(i)+'.dims);'];
4938    end
4939  end
4940
4941  //## array of actuators
4942  if nbact<>0 then
4943    Code=[Code
4944          ''];
4945    for i=1:nbact
4946      Code=[Code
4947            '  free(out_'+string(i)+'.dims);'];
4948    end
4949
4950    for i=1:nbact
4951      Code=[Code
4952            '  free(out_'+string(i)+'.data);'];
4953    end
4954
4955    for i=1:nbact
4956      Code=[Code
4957            '  free(out_'+string(i)+'.time);'];
4958    end
4959
4960    for i=1:nbact
4961      n_str = 'n'+string(i+nbcapt+4);
4962      Code=[Code
4963            '  if ('+n_str+' != 1) {'
4964            '    free(out_ptr'+string(i)+');'
4965            '  }']
4966
4967    end
4968
4969  end
4970
4971  //## end
4972  Code=[Code;
4973        '  return 0;'
4974        '}'
4975        '']
4976
4977  //## Gateway
4978  // Code=[Code;
4979 //        'static GenericTable Tab[]='
4980 //        '{'
4981 //        ' {(Myinterfun)sci_gateway,int'+part(rdnom,1:l_rdnom)+'_sci,'
4982 //        ' """+rdnom+"""}'
4983 //        '};'
4984 //        ''
4985 //        'int C2F(int'+part(rdnom,1:l_rdnom)+'_sci)()'
4986 //        '{'
4987 //        ' Rhs = Max(0, Rhs);'
4988 //        ' (*(Tab[Fin-1].f))(Tab[Fin-1].name,Tab[Fin-1].F);'
4989 //        ' return 0;'
4990 //        '}'
4991 //        '']
4992
4993 endfunction
4994
4995 //Generating the routine for sensors interfacing
4996 //
4997 //Copyright INRIA
4998 //
4999 //Author : R. Djenidi, R. Nikoukhah, A. Layec
5000 //
5001 function Code=make_sensor()
5002   Call=['/*'+part('-',ones(1,40))+' Sensors */';
5003         'void '+rdnom+'_sensor(flag,nport,nevprt,t,y,ny1,ny2,yt,typin,inptr)']
5004
5005   comments=['     /*'
5006             '      * To be customized for standalone execution';
5007             '      * flag  : specifies the action to be done'
5008             '      * nport : specifies the  index of the Super Bloc'
5009             '      *         regular input (The input ports are numbered'
5010             '      *         from the top to the bottom )'
5011             '      * nevprt: indicates if an activation had been received'
5012             '      *         0 = no activation'
5013             '      *         1 = activation'
5014             '      * t     : the current time value'
5015             '      * y     : the vector outputs value'
5016             '      * ny1   : the output size 1'
5017             '      * ny2   : the output size 2'
5018             '      * yt    : the output type'
5019             '      * typin : learn mode (0 from terminal,1 from input file)'
5020             '      * inptr : pointer to out data'
5021             '      *          typin=0, inptr not used'
5022             '      *          typin=1, inptr contains the input file name'
5023             '      */']
5024
5025   dcl=['     int *flag,*nevprt,*nport;'
5026        '     int *ny1,*ny2,*yt;'
5027        ''
5028        '     int typin;'
5029        '     void *inptr;'
5030        ''
5031        '     double *t;'
5032        '     void *y;'
5033        '{'
5034        '  int j,k,l;'
5035        '  double temps;']
5036
5037   //## code for terminal
5038   a_sensor=['    /* skeleton to be customized */'
5039             '    switch (*flag) {'
5040             '    case 4 : /* sensor initialisation */'
5041             '      /* do whatever you want to initialize the sensor */'
5042             '      break;'
5043             '    case 1 : /* set the output value */'
5044             '      printf(""Require outputs of sensor number %d\n"", *nport);'
5045             '      printf(""time is: %f\n"", *t);'
5046             '      printf(""sizes of the sensor output is: %d,%d\n"", *ny1,*ny2);'
5047             '      switch (*yt) {'
5048             '      case 10 :'
5049             '        printf(""type of the sensor output is: %d (double) \n"", *yt);'
5050             '        puts(""Please set the sensor output values"");'
5051             '        for (l=0;l<*ny2;l++) {'
5052             '          for (k=0;k<*ny1;k++) {'
5053             '            printf(""y(%d,%d) : "",k,l);'
5054             '            scanf(""%lf"", (double *) y+(k+l*(*ny1)));'
5055             '          }'
5056             '        }'
5057             '        break;'
5058             ''
5059             '      case 11 :'
5060             '        printf(""type of the sensor output is: %d (complex) \n"", *yt);'
5061             '        puts(""Please set the sensor output values"");'
5062             '        for (l=0;l<*ny2;l++) {'
5063             '          for (k=0;k<*ny1;k++) {'
5064             '            printf(""y(%d,%d) real part : "",k,l);'
5065             '            scanf(""%lf"", (double *) y+(k+l*(*ny1)));'
5066             '            printf(""y(%d,%d) imag part : "",k,l);'
5067             '            scanf(""%lf"", (double *) y+((*ny1)*(*ny2)+k+l*(*ny1)));'
5068             '          }'
5069             '        }'
5070             '        break;'
5071             ''
5072             '      case 81 :'
5073             '        printf(""type of the sensor output is: %d (char) \n"", *yt);'
5074             '        puts(""Please set the sensor output values"");'
5075             '        for (l=0;l<*ny2;l++) {'
5076             '          for (k=0;k<*ny1;k++) {'
5077             '            printf(""y(%d,%d) : "",k,l);'
5078             '            scanf(""%i"", &j);'
5079             '            *((char *) y+(k+l*(*ny1))) = (char) j;'
5080             '          }'
5081             '        }'
5082             '        break;'
5083             ''
5084             '      case 82 :'
5085             '        printf(""type of the sensor output is: %d (char) \n"", *yt);'
5086             '        puts(""Please set the sensor output values"");'
5087             '        for (l=0;l<*ny2;l++) {'
5088             '          for (k=0;k<*ny1;k++) {'
5089             '            printf(""y(%d,%d) : "",k,l);'
5090             '            scanf(""%hd"", (short *) y+(k+l*(*ny1)));'
5091             '          }'
5092             '        }'
5093             '        break;'
5094             ''
5095             '      case 84 :'
5096             '        printf(""type of the sensor output is: %d (long) \n"", *yt);'
5097             '        puts(""Please set the sensor output values"");'
5098             '        for (l=0;l<*ny2;l++) {'
5099             '          for (k=0;k<*ny1;k++) {'
5100             '            printf(""y(%d,%d) : "",k,l);'
5101             '            scanf(""%ld"", (long *) y+(k+l*(*ny1)));'
5102             '          }'
5103             '        }'
5104             '        break;'
5105             ''
5106             '      case 811 :'
5107             '        printf(""type of the sensor output is: %d (unsigned char) \n"", *yt);'
5108             '        puts(""Please set the sensor output values"");'
5109             '        for (l=0;l<*ny2;l++) {'
5110             '          for (k=0;k<*ny1;k++) {'
5111             '            printf(""y(%d,%d) : "",k,l);'
5112             '            scanf(""%d"", &j);'
5113             '            *((unsigned char *) y+(k+l*(*ny1))) = (unsigned char) j;'
5114             '          }'
5115             '        }'
5116             '        break;'
5117             ''
5118             '      case 812 :'
5119             '        printf(""type of the sensor output is: %d (unsigned short) \n"", *yt);'
5120             '        puts(""Please set the sensor output values"");'
5121             '        for (l=0;l<*ny2;l++) {'
5122             '          for (k=0;k<*ny1;k++) {'
5123             '            printf(""y(%d,%d) : "",k,l);'
5124             '            scanf(""%hu"", (unsigned short *) y+(k+l*(*ny1)));'
5125             '          }'
5126             '        }'
5127             '        break;'
5128             ''
5129             '      case 814 :'
5130             '        printf(""type of the sensor output is: %d (unsigned long) \n"", *yt);'
5131             '        puts(""Please set the sensor output values"");'
5132             '        for (l=0;l<*ny2;l++) {'
5133             '          for (k=0;k<*ny1;k++) {'
5134             '            printf(""y(%d,%d) : "",k,l);'
5135             '            scanf(""%lu"", (unsigned long *) y+(k+l*(*ny1)));'
5136             '          }'
5137             '        }'
5138             '        break;'
5139             ''
5140             '      }'
5141             '      break;'
5142             '    case 5 : /* sensor ending */'
5143             '      /* do whatever you want to end the sensor */'
5144             '      break;'
5145             '    }']
5146
5147   //## code for input file
5148   b_sensor=['    /* skeleton to be customized */'
5149             '    switch (*flag) {'
5150             '    case 4 : /* sensor initialisation */'
5151             '      if (*nport == 1) {'
5152             '        fprr=fopen((char *) inptr,'"r'");'
5153             '        if( fprr == NULL ) {'
5154             '          printf('"Error opening file: %s\n'", (char *) inptr);'
5155             '          return;'
5156             '        }'
5157             '      }'
5158             '      break;'
5159             '    case 1 : /* fscanf the output value */'
5160             '    /*if(*nevprt>0) {*/'
5161             '      /* read time */'
5162             '      fscanf(fprr,""%lf "",&temps);'
5163             ''
5164             '      switch (*yt) {'
5165             '      case 10 :'
5166             '        for (l=0;l<*ny2;l++) {'
5167             '          for (k=0;k<*ny1;k++) {'
5168             '            fscanf(fprr,""%lf "", \'
5169             '                        (double *) y+(k+l*(*ny1)));'
5170             '          }'
5171             '        }'
5172             '        fscanf(fprr,""\n"");'
5173             '        break;'
5174             ''
5175             '      case 11 :'
5176             '        for (l=0;l<*ny2;l++) {'
5177             '          for (k=0;k<*ny1;k++) {'
5178             '            fscanf(fprr,""%lf "" \'
5179             '                        ""%lf "", \'
5180             '                        (double *) y+(k+l*(*ny1)), \'
5181             '                        (double *) y+((*ny1)*(*ny2)+k+l*(*ny1)));'
5182             '          }'
5183             '        }'
5184             '        fscanf(fprr,""\n"");'
5185             '        break;'
5186             ''
5187             '      case 81 :'
5188             '        for (l=0;l<*ny2;l++) {'
5189             '          for (k=0;k<*ny1;k++) {'
5190             '            fscanf(fprr,""%i "", \'
5191             '                        &j);'
5192             '            *((char *) y+(k+l*(*ny1))) = (char) j;'
5193             '          }'
5194             '        }'
5195             '        fscanf(fprr,""\n"");'
5196             '        break;'
5197             ''
5198             '      case 82 :'
5199             '        for (l=0;l<*ny2;l++) {'
5200             '          for (k=0;k<*ny1;k++) {'
5201             '            fscanf(fprr,""%hd "", \'
5202             '                        (short *) y+(k+l*(*ny1)));'
5203             '          }'
5204             '        }'
5205             '        fscanf(fprr,""\n"");'
5206             '        break;'
5207             ''
5208             '      case 84 :'
5209             '        for (l=0;l<*ny2;l++) {'
5210             '          for (k=0;k<*ny1;k++) {'
5211             '            fscanf(fprr,""%ld "", \'
5212             '                        (long *) y+(k+l*(*ny1)));'
5213             '          }'
5214             '        }'
5215             '        fscanf(fprr,""\n"");'
5216             '        break;'
5217             ''
5218             '      case 811 :'
5219             '        for (l=0;l<*ny2;l++) {'
5220             '          for (k=0;k<*ny1;k++) {'
5221             '            fscanf(fprr,""%d "", &j);'
5222             '            *((unsigned char *) y+(k+l*(*ny1))) = (unsigned char) j;'
5223             '          }'
5224             '        }'
5225             '        fscanf(fprr,""\n"");'
5226             '        break;'
5227             ''
5228             '      case 812 :'
5229             '        for (l=0;l<*ny2;l++) {'
5230             '          for (k=0;k<*ny1;k++) {'
5231             '            fscanf(fprr,""%hu "", \'
5232             '                        (unsigned short *) y+(k+l*(*ny1)));'
5233             '          }'
5234             '        }'
5235             '        fscanf(fprr,""\n"");'
5236             '        break;'
5237             ''
5238             '      case 814 :'
5239             '        printf(""type of the sensor output is: %d (unsigned long) \n"", *yt);'
5240             '        puts(""Please set the sensor output values"");'
5241             '        for (l=0;l<*ny2;l++) {'
5242             '          for (k=0;k<*ny1;k++) {'
5243             '            fscanf(fprr,""%lu "", \'
5244             '                        (unsigned long *) y+(k+l*(*ny1)));'
5245             '          }'
5246             '        }'
5247             '        fscanf(fprr,""\n"");'
5248             '        break;'
5249             '      }'
5250             '    /*} */'
5251             '      break;'
5252             '    case 5 : /* sensor ending */'
5253             '      /* do whatever you want to end the sensor */'
5254             '      break;'
5255             '    }']
5256
5257   // pour fscanf
5258   nc=size(cap,'*')
5259
5260 //   typ=['""%lf ']; //temps
5261 //   for i=1:nc
5262 //     typ($)=typ($)+'"" \'
5263 //     typ=[typ;'""'];
5264 //     for j=1:sum(capt(i,3)*capt(i,4))
5265 //       //typ=typ+'%f ';
5266 //       typ($)=typ($)+scs_c_n2c_fmt(capt(i,5))+' ';
5267 //     end
5268 //   end
5269 //   typ($)=typ($)+'\n"", \'
5270 //   typ=strsubst(typ,'%f','%lf');
5271 //   typ(1)='    fscanf(fprr,'+typ(1);
5272 //   bl    ='                ';
5273 //   if size(typ,1) <> 1 then
5274 //     typ(2:$) = bl+typ(2:$);
5275 //   end
5276 //   //Code1=['      fscanf( fprr, '"'+typ+' \n'",&temps'] 
5277 //   Code1=[typ;bl+'&temps'];
5278 //   for i=1:size(capt,1)
5279 //     ni=capt(i,3)*capt(i,4); // dimension of ith input
5280 //     Code1($)=Code1($)+',';
5281 //     Code1=[Code1;bl];
5282 //     for j=1:ni
5283 //       if capt(i,5)<>11 then
5284 //         Code1($)=Code1($)+...
5285 //                   '('+scs_c_n2c_typ(capt(i,5))+' *)('+...
5286 //                    rdnom+'_block_outtbptr+'+string(capt(i,2)-1)+')'+...
5287 //                    '+'+string(j-1)+'';
5288 //       else //CAS CMPLX
5289 //         Code1($)=Code1($)+...
5290 //                   '('+scs_c_n2c_typ(capt(i,5))+' *)('+...
5291 //                    rdnom+'_block_outtbptr+'+string(capt(i,2)-1)+')'+...
5292 //                    '+'+string((j-1))+', '+...
5293 //                   '('+scs_c_n2c_typ(capt(i,5))+' *)('+...
5294 //                    rdnom+'_block_outtbptr+'+string(capt(i,2)-1)+')'+...
5295 //                    '+'+string(ni+(j-1))+'';
5296 //       end
5297 //       if j<>ni then
5298 //        Code1($)=Code1($)+', ';
5299 //       end
5300 //     end
5301 //   end
5302 //   Code1($)=Code1($)+');'
5303
5304   Code=[]
5305
5306   if nc==1 then
5307     Code=[Code;
5308           Call
5309           comments
5310           dcl
5311           '  if (typin == 0) {'
5312           a_sensor;
5313           '  } '
5314           '  else if (typin == 1) {'
5315           b_sensor;
5316           '  }'
5317           '}']
5318   elseif nc>1 then
5319     S='    switch (*nport) {'
5320     for k=1:nc
5321       S=[S;
5322          '    case '+string(k)+' : /* Port number '+string(k)+' ----------*/'
5323          '    '+a_sensor
5324          '    break;']
5325     end
5326     S=[S;'    }']
5327
5328     T='    switch (*nport) {'
5329     for k=1:nc
5330       T=[T;
5331          '    case '+string(k)+' :/* Port number '+string(k)+' ----------*/'
5332          '    '+b_sensor
5333          '    break;']
5334     end
5335     T=[T;'    }']
5336
5337     Code=[Code
5338           Call
5339           comments
5340           dcl
5341           '  if (typin == 0) {'
5342           S
5343           '  }'
5344           '  else if (typin == 1) {'
5345           T
5346           '  }'
5347           '}']
5348   end
5349 endfunction
5350
5351 //generates code of the standalone simulation procedure
5352 //
5353 //Copyright INRIA
5354 //
5355 // rmq : La fonction zdoit n'est pas utilisee pour le moment
5356 function Code=make_standalone42()
5357   x=cpr.state.x;
5358   modptr=cpr.sim.modptr;
5359   rpptr=cpr.sim.rpptr;
5360   ipptr=cpr.sim.ipptr;
5361   opptr=cpr.sim.opptr;
5362   rpar=cpr.sim.rpar;
5363   ipar=cpr.sim.ipar;
5364   opar=cpr.sim.opar;
5365   oz=cpr.state.oz;
5366   ordptr=cpr.sim.ordptr;
5367   oord=cpr.sim.oord;
5368   zord=cpr.sim.zord;
5369   iord=cpr.sim.iord;
5370   tevts=cpr.state.tevts;
5371   evtspt=cpr.state.evtspt;
5372   zptr=cpr.sim.zptr;
5373   ozptr=cpr.sim.ozptr;
5374   clkptr=cpr.sim.clkptr;
5375   ordptr=cpr.sim.ordptr;
5376   pointi=cpr.state.pointi;
5377   funs=cpr.sim.funs;
5378   funtyp=cpr.sim.funtyp;
5379   noord=size(cpr.sim.oord,1);
5380   nzord=size(cpr.sim.zord,1);
5381   niord=size(cpr.sim.iord,1);
5382
5383   Indent='  ';
5384   Indent2=Indent+Indent;
5385   BigIndent='          ';
5386
5387   nX=size(x,'*');
5388
5389   stalone = %t;
5390
5391   //** evs : find source activation number
5392   //## with_nrd2 : find blk type 0 (wihtout)
5393   blks=find(funtyp>-1);
5394   evs=[];
5395
5396   with_nrd2=%f;
5397   for blk=blks
5398     for ev=clkptr(blk):clkptr(blk+1)-1
5399       if funs(blk)=='bidon' then
5400         if ev > clkptr(howclk) -1
5401          evs=[evs,ev];
5402         end
5403       end
5404     end
5405
5406     //## all blocks without sensor/actuator
5407     if (part(funs(blk),1:7) ~= 'capteur' &...
5408         part(funs(blk),1:10) ~= 'actionneur' &...
5409         funs(blk) ~= 'bidon') then
5410       //## with_nrd2 ##//
5411       if funtyp(blk)==0 then
5412         with_nrd2=%t;
5413       end
5414     end
5415
5416   end
5417
5418   Code=['/* Code prototype for standalone use  */'
5419         '/*     Generated by Code_Generation toolbox of Scicos with '+ ..
5420         get_scicos_version()+' */'
5421         '/*     date : '+date()+' */'
5422         ''
5423         '/* To learn how to use the standalone code, type '"./standalone -h'" */'
5424         ''
5425         '/* ---- Headers ---- */'
5426         '#include <stdio.h>'
5427         '#include <stdlib.h>'
5428         '#include <math.h>'
5429         '#include <string.h>'
5430         '#ifdef __STDC__'
5431         '#include <stdarg.h>'
5432         '#else'
5433         '#include <varargs.h>'
5434         '#endif'
5435         '#include <memory.h>'
5436         '#include '"scicos_block4.h'"'
5437         '#include '"machine.h'"'
5438         ''
5439         '/* ---- Internals functions and global variables declaration ---- */'
5440         Protostalone
5441         '']
5442
5443   Code=[Code
5444         '/* prototype for input simulation function */'
5445         'int '+rdnom+'_sim(double, double, double, int, \'
5446         '                  int *, void **, int *, void **);'
5447         '']
5448
5449   if x<>[] then
5450     if impl_blk then
5451       Code=[Code
5452             '/* ---- Solver functions prototype for standalone use ---- */'
5453             'int '+rdnom+'simblk_imp(double , double *, double *, double *);'
5454             'int dae1();'
5455             '']
5456     else
5457       Code=[Code
5458             '/* ---- Solver functions prototype for standalone use ---- */'
5459             'int '+rdnom+'simblk(double , double *, double *);'
5460             'int ode1();'
5461             'int ode2();'
5462             'int ode4();'
5463             '']
5464     end
5465   end
5466
5467   Code=[Code;
5468         '/* ---- Specific declaration for the main() function ---- */'
5469         'int getopt (int, char **, char *);'
5470         make_static_standalone42()]
5471
5472
5473   //## Alan, 06/09/08 : add a C macro for cosend
5474   //##                  to properly handle error in standalone
5475   Code_end=[''
5476             '  '+get_comment('flag',list(5))]
5477
5478   for kf=1:nblk
5479     if or(kf==act) | or(kf==cap) then
5480         txt = call_block42(kf,0,5);
5481         if txt <> [] then
5482           Code_end=[Code_end;
5483                     '';
5484                     '  '+txt];
5485         end
5486     else
5487       txt = call_block42(kf,0,5);
5488       if txt <> [] then
5489         Code_end=[Code_end;
5490                   '';
5491                   '  '+txt];
5492       end
5493     end
5494   end
5495
5496   Code_end_mac = ['#define Cosend() '+Code_end(1)+'\']
5497   for i=2:size(Code_end,1)
5498     len=length(Code_end(i))
5499     if len <> 0 then
5500       if part(Code_end(i),len)<>'\' then
5501          Code_end_mac($+1) = Code_end(i) + '\'
5502       else
5503          Code_end_mac($+1) = Code_end(i)
5504       end
5505     else
5506       Code_end_mac($+1) = '  \'
5507     end
5508   end
5509   //Code_end_mac = [Code_end_mac;Code_end($)]
5510
5511   Code=[Code;
5512         '/* Define Cosend macro */'
5513         Code_end_mac
5514         '  \'
5515         '  return get_block_error()'
5516         '']
5517
5518   //*** Continuous state ***//
5519   if x <> [] then
5520     //## implicit block
5521     if impl_blk then
5522       Code=[Code;
5523             '/* def number of continuous state */'
5524             '#define NEQ '+string(nX/2)
5525             '']
5526     //## explicit block
5527     else
5528       Code=[Code;
5529             '/* def number of continuous state */'
5530             '#define NEQ '+string(nX)
5531             '']
5532     end
5533   end
5534
5535   Code=[Code;
5536         '/* def phase sim variable */'
5537         'int phase;'
5538         ''
5539         '/* a variable for the current time */'
5540         'double scicos_time;'
5541         '']
5542
5543   if impl_blk then
5544     Code=[Code;
5545           '/* Jacobian parameters */'
5546           'double Jacobian_Flag;'
5547           'double CJJ;'
5548           'double SQuround;'
5549           '']
5550   end
5551
5552   Code=[Code
5553         '/* block_error must be pass in argument of _sim function */'
5554         'int *block_error;'
5555         'char err_msg[2048];'
5556         ''
5557         '/* prototype of error table function */'
5558         'void get_err_msg(int ierr,char *err_msg);'
5559         '']
5560
5561   //## rmk: Alan, 06/09/08 : on devrait pouvoir enlever une structure
5562   //##      ici : celle du bloc bidon tjs a la fin
5563   if funs(nblk)=='bidon' then nblk=nblk-1, end;
5564
5565   Code=[Code;
5566         '/* declaration of scicos block structures */'
5567         'scicos_block block_'+rdnom+'['+string(nblk)+'];'
5568         '']
5569
5570   Code=[Code;
5571         '/* Main program */'
5572         'int main(int argc, char *argv[])'
5573         '{'
5574         '  /* local variables */'
5575         '  char input[50],output[50];'
5576         '  char **p=NULL;'
5577         ''
5578         '  /* default values for parameters of _sim function */'
5579         '  double tf=30;         /* final time */'
5580         '  double dt=0.1;        /* clock time */'
5581         '  double h=0.001;       /* solver step */']
5582
5583   if impl_blk then
5584     Code=[Code;
5585        '  int solver=3;         /* type of solver */']
5586   else
5587     Code=[Code;
5588        '  int solver=1;         /* type of solver */']
5589   end
5590
5591   Code_in=[]
5592   if size(capt,1)>0 then
5593     Code_in='  int nin='+string(size(capt,1))+';'
5594     Code_in=[Code_in;
5595              cformatline('  int typin[]={'+...
5596                   strcat(string(zeros(size(capt,1),1)),"," )+'};',70)]
5597     Code_in=[Code_in;
5598              cformatline('  void *inptr[]={'+...
5599                   strcat(string(zeros(size(capt,1),1)),"," )+'};',70)]
5600   end
5601   if Code_in<>[] then
5602     Code=[Code;
5603           '  /* Inputs of sensors */'
5604           Code_in]
5605   else
5606     Code=[Code;
5607           '  /* Inputs of sensors */'
5608           '  int nin=0;'
5609           '  int *typin=NULL;'
5610           '  void **inptr=NULL;']
5611   end
5612
5613   Code_out=[]
5614   if size(actt,1)>0 then
5615     Code_out='  int nout='+string(size(actt,1))+';'
5616     Code_out=[Code_out;
5617               cformatline('  int typout[]={'+...
5618                   strcat(string(zeros(size(actt,1),1)),"," )+'};',70)]
5619     Code_out=[Code_out;
5620              cformatline('  void *outptr[]={'+...
5621                   strcat(string(zeros(size(actt,1),1)),"," )+'};',70)]
5622   end
5623   if Code_out<>[] then
5624     Code=[Code;
5625           '  /* Outputs of actuators */'
5626           Code_out]
5627   else
5628     Code=[Code;
5629           '  /* Outputs of actuators */'
5630           '  int nout=0;'
5631           '  int *typout=NULL;'
5632           '  void **outptr=NULL;']
5633   end
5634
5635   Code=[Code;
5636         '  /**/'
5637         '  char * progname = argv[0];'
5638         '  /* local counter variable */'
5639         '  int c,i;'
5640         '  /* error handling variable */'
5641         '  int ierr;'
5642         ''
5643         '  /* init in/output files */'
5644         '  strcpy(input,'"'");'
5645         '  strcpy(output,'"'");'
5646         ''
5647         '  /* check rhs args */'
5648         '  while ((c = getopt(argc , argv, '"i:o:d:t:e:s:hv'")) != -1)'
5649         '    switch (c) {'
5650         '    case ''i'':'
5651         '      strcpy(input,argv[optind-1]);'
5652         '      break;'
5653         '    case ''o'':'
5654         '      strcpy(output,argv[optind-1]);'
5655         '      break;'
5656         '    case ''d'':'
5657         '      dt=strtod(argv[optind-1],p);'
5658         '      break;'
5659         '    case ''t'':'
5660         '      tf=strtod(argv[optind-1],p);'
5661         '      break;'
5662         '    case ''e'':'
5663         '      h=strtod(argv[optind-1],p);'
5664         '      break;'
5665         '    case ''s'':'
5666         '      solver=(int) strtod(argv[optind-1],p);'
5667         '      break;'
5668         '    case ''h'':'
5669         '      usage(progname);'
5670         '      return 0;'
5671         '      break;'
5672         '    case ''v'':'
5673         '      printf(""Generated by Code_Generation toolbox of Scicos ""'
5674         '             ""with '+get_scicos_version()+'\n"");'
5675         '      return 0;'
5676         '      break;'
5677         '    case ''?'':'
5678         '      usage(progname);'
5679         '      return 0;'
5680         '      break;'
5681         '    }'
5682         '']
5683
5684   Code=[Code;
5685         '  /* adjust in/out of sensors/actuators */'
5686         '  if (strlen(input) > 0) {'
5687         '    for(i=0;i<nin;i++) {'
5688         '      typin[i]= 1;'
5689         '      inptr[i]= (void *) input;'
5690         '    }'
5691         '  }'
5692         '  if (strlen(output)> 0) {'
5693         '    for(i=0;i<nout;i++) {'
5694         '      typout[i]= 1;'
5695         '      outptr[i]= (void *) output;'
5696         '    }'
5697         '  }'
5698         '']
5699
5700   Code=[Code;
5701         '  /* call simulation function */'
5702         '  ierr='+rdnom+'_sim(tf,dt,h,solver,typin,inptr,typout,outptr);'
5703         ''
5704         '  /* display error message */'
5705         '  if (ierr!=0) {'
5706         '    get_err_msg(ierr,err_msg);'
5707         '    fprintf(stderr,""Simulation fails with error number %d :'+...
5708              '\n%s\n"",ierr,err_msg);'
5709         '  }'
5710         ''
5711         '  return ierr;'
5712         '}'
5713         '']
5714
5715   Code=[Code;
5716         '/* Error table function */'
5717         'void get_err_msg(int ierr,char *err_msg)'
5718         '{'
5719         '  switch (ierr)'
5720         '  {'
5721         '   case 1  : strcpy(err_msg,""scheduling problem"");'
5722         '             break;'
5723         ''
5724         '   case 2  : strcpy(err_msg,""input to zero-crossing stuck on zero"");'
5725         '             break;'
5726         ''
5727         '   case 3  : strcpy(err_msg,""event conflict"");'
5728         '             break;'
5729         ''
5730         '   case 4  : strcpy(err_msg,""algrebraic loop detected"");'
5731         '             break;'
5732         ''
5733         '   case 5  : strcpy(err_msg,""cannot allocate memory"");'
5734         '             break;'
5735         ''
5736         '   case 6  : strcpy(err_msg,""a block has been called with input out of its domain"");'
5737         '             break;'
5738         ''
5739         '   case 7  : strcpy(err_msg,""singularity in a block"");'
5740         '             break;'
5741         ''
5742         '   case 8  : strcpy(err_msg,""block produces an internal error"");'
5743         '             break;'
5744         ''
5745         '   case 10 : break;'
5746         ''
5747         '   /* other scicos error should be done */'
5748         ''
5749         '   default : strcpy(err_msg,""undefined error"");'
5750         '             break;'
5751         '  }'
5752         '}'
5753         '']
5754
5755   Code=[Code;
5756         'static void usage(prog)'
5757         '       char *prog;'
5758         '{'
5759         '  fprintf(stderr, ""Usage: %s [-h] [-v] [-i arg] [-o arg] ""'
5760         '                  ""[-d arg] [-t arg] [-e arg] [-s arg]\n"", prog);'
5761         '  fprintf(stderr, ""Options : \n"");'
5762         '  fprintf(stderr, ""     -h for the help  \n"");'
5763         '  fprintf(stderr, ""     -v for printing the Scilab Version \n"");'
5764         '  fprintf(stderr, ""     -i for input file name, by default is Terminal \n"");'
5765         '  fprintf(stderr, ""     -o for output file name, by default is Terminal \n"");'
5766         '  fprintf(stderr, ""     -d for the clock period, by default is 0.1 \n"");'
5767         '  fprintf(stderr, ""     -t for the final time, by default is 30 \n"");'
5768         '  fprintf(stderr, ""     -e for the solvers step size, by default is 0.001 \n"");'
5769         '  fprintf(stderr, ""     -s integer parameter for select the numerical solver : \n"");']
5770
5771   if impl_blk then
5772     Code=[Code;
5773           '  fprintf(stderr, ""        1 for a dae solver... \n"");']
5774   else
5775     Code=[Code;
5776           '  fprintf(stderr, ""        1 for Euler''s method \n"");'
5777           '  fprintf(stderr, ""        2 for Heun''s method \n"");'
5778           '  fprintf(stderr, ""        3 (default value) for the Fourth-Order Runge-Kutta'+...
5779            ' (RK4) Formula \n"");']
5780   end
5781   Code=[Code;
5782         '}'
5783         '']
5784
5785   Code=[Code
5786         '/*'+part('-',ones(1,40))+'  External simulation function */'
5787         'int '+rdnom+'_sim(tf,dt,h,solver,typin,inptr,typout,outptr)'
5788         ''
5789         '   double tf,dt,h;'
5790         '   int solver;'
5791         '   int *typin,*typout;'
5792         '   void **inptr,**outptr;'
5793         '{'
5794         '  double t;']
5795
5796   if evs<>[] then
5797     Code=[Code
5798           '  int nevprt=1;']
5799   end
5800
5801   Code=[Code
5802         '  int local_flag;'
5803         '  int nport;']
5804
5805   if with_synchro | impl_blk then
5806     Code=[Code
5807           '  int i;'
5808           '']
5809   else
5810     Code=[Code
5811          '']
5812   end
5813
5814   if (with_nrd & with_nrd2) then
5815     Code=[Code;
5816           '  /* Variables for constant values */'
5817           '  int nrd_1, nrd_2;'
5818           ''
5819           '  double *args[100];'
5820           '']
5821   end
5822
5823   if (x <> []) then
5824     Code=[Code
5825           '  double tout;'
5826           '  double he=0.1;'
5827           '']
5828   end
5829
5830   //## set a variable to trace error of block
5831   Code=[Code
5832         '  int err=0;'
5833         ''
5834         '  /* Initial values */'
5835         '']
5836
5837   //### Real parameters ###//
5838   if size(rpar,1) <> 0 then
5839     Code=[Code;
5840           '  /* Real parameters declaration */']
5841           //'static double RPAR1[ ] = {'];
5842
5843     for i=1:(length(rpptr)-1)
5844       if rpptr(i+1)-rpptr(i)>0  then
5845
5846         //** Add comments **//
5847
5848         //## Modelica block
5849         if type(corinv(i))==15 then
5850           //## 09/04/08, Alan : we can extract here all informations
5851           //## from original scicos blocks with corinv : TODO
5852           Code($+1)='  /* MODELICA BLK RPAR COMMENTS : TODO */';
5853         else
5854           if size(corinv(i),'*')==1 then
5855             OO=scs_m.objs(corinv(i));
5856           else
5857             path=list('objs');
5858             for l=cpr.corinv(i)(1:$-1)
5859               path($+1)=l;
5860               path($+1)='model';
5861               path($+1)='rpar';
5862               path($+1)='objs';
5863             end
5864             path($+1)=cpr.corinv(i)($);
5865             OO=scs_m(path);
5866           end
5867
5868           Code($+1)='  /* Routine name of block: '+strcat(string(cpr.sim.funs(i)));
5869           Code($+1)='   * Gui name of block: '+strcat(string(OO.gui));
5870           Code($+1)='   * Compiled structure index: '+strcat(string(i));
5871
5872           if stripblanks(OO.model.label)~=emptystr() then
5873             Code=[Code;
5874                   '  '+cformatline(' * Label: '+strcat(string(OO.model.label)),70)];
5875           end
5876           if stripblanks(OO.graphics.exprs(1))~=emptystr() then
5877             Code=[Code;
5878                   '  '+cformatline(' * Exprs: '+strcat(OO.graphics.exprs(1),","),70)];
5879           end
5880           if stripblanks(OO.graphics.id)~=emptystr() then
5881             Code=[Code;
5882                   '  '+cformatline(' * Identification: '+strcat(string(OO.graphics.id)),70)];
5883           end
5884           //txt=[txt;' * rpar='];
5885           Code($+1)='   */';
5886         end
5887         //******************//
5888
5889         txt=cformatline(strcat(msprintf('%.16g,\n',rpar(rpptr(i):rpptr(i+1)-1))),70);
5890
5891         txt(1)='double rpar_'+string(i)+'[]={'+txt(1);
5892         for j=2:size(txt,1)
5893           txt(j)=get_blank('double rpar_'+string(i)+'[]')+txt(j);
5894         end
5895         txt($)=part(txt($),1:length(txt($))-1)+'};'
5896         Code=[Code;
5897               '  '+txt
5898               '']
5899       end
5900     end
5901   end
5902   //#######################//
5903
5904   //### Integer parameters ###//
5905   if size(ipar,1) <> 0 then
5906     Code=[Code;
5907           '  /* Integers parameters declaration */']
5908
5909     for i=1:(length(ipptr)-1)
5910       if ipptr(i+1)-ipptr(i)>0  then
5911
5912         //** Add comments **//
5913
5914         //## Modelica block
5915         if type(corinv(i))==15 then
5916           //## 09/04/08, Alan : we can extract here all informations
5917           //## from original scicos blocks with corinv : TODO
5918           Code($+1)='  /* MODELICA BLK IPAR COMMENTS : TODO */';
5919         else
5920           if size(corinv(i),'*')==1 then
5921             OO=scs_m.objs(corinv(i));
5922           else
5923             path=list('objs');
5924             for l=cpr.corinv(i)(1:$-1)
5925               path($+1)=l
5926               path($+1)='model'
5927               path($+1)='rpar'
5928               path($+1)='objs'
5929             end
5930             path($+1)=cpr.corinv(i)($);
5931             OO=scs_m(path);
5932           end
5933
5934           Code($+1)='  /* Routine name of block: '+strcat(string(cpr.sim.funs(i)));
5935           Code($+1)='   * Gui name of block: '+strcat(string(OO.gui));
5936           Code($+1)='   * Compiled structure index: '+strcat(string(i));
5937           if stripblanks(OO.model.label)~=emptystr() then
5938             Code=[Code;
5939                   '  '+cformatline(' * Label: '+strcat(string(OO.model.label)),70)];
5940           end
5941
5942           if stripblanks(OO.graphics.exprs(1))~=emptystr() then
5943             Code=[Code;
5944                   '  '+cformatline(' * Exprs: '+strcat(OO.graphics.exprs(1),","),70)];
5945           end
5946           if stripblanks(OO.graphics.id)~=emptystr() then
5947             Code=[Code;
5948                   '  '+cformatline(' * Identification: '+strcat(string(OO.graphics.id)),70)];
5949           end
5950           Code=[Code;
5951                 '  '+cformatline(' * ipar= {'+strcat(string(ipar(ipptr(i):ipptr(i+1)-1)),",")+'};',70)];
5952           Code($+1)='   */';
5953         end
5954         //******************//
5955
5956         txt=cformatline(strcat(string(ipar(ipptr(i):ipptr(i+1)-1))+','),70);
5957
5958         txt(1)='int ipar_'+string(i)+'[]={'+txt(1);
5959         for j=2:size(txt,1)
5960           txt(j)=get_blank('int ipar_'+string(i)+'[]')+txt(j);
5961         end
5962         txt($)=part(txt($),1:length(txt($))-1)+'};'
5963         Code=[Code;
5964               '  '+txt
5965               '']
5966       end
5967     end
5968   end
5969   //##########################//
5970
5971   //### Object parameters ###//
5972
5973   //** declaration of opar
5974   Code_opar = [];
5975   Code_ooparsz=[];
5976   Code_oopartyp=[];
5977   Code_oparptr=[];
5978
5979   for i=1:(length(opptr)-1)
5980     nopar = opptr(i+1)-opptr(i)
5981     if nopar>0  then
5982       //** Add comments **//
5983
5984       //## Modelica block
5985       if type(corinv(i))==15 then
5986         //## 09/04/08, Alan : we can extract here all informations
5987         //## from original scicos blocks with corinv : TODO
5988         Code_opar($+1)='  /* MODELICA BLK OPAR COMMENTS : TODO */';
5989       else
5990         //@@ 04/11/08, disable generation of comment for opar
5991         //@@ for m_frequ because of sample clock
5992         if funs(i)=='m_frequ' then
5993         else
5994           if size(corinv(i),'*')==1 then
5995             OO=scs_m.objs(corinv(i));
5996           else
5997             path=list('objs');
5998             for l=cpr.corinv(i)(1:$-1)
5999               path($+1)=l;
6000               path($+1)='model';
6001               path($+1)='rpar';
6002               path($+1)='objs';
6003             end
6004             path($+1)=cpr.corinv(i)($);
6005             OO=scs_m(path);
6006           end
6007
6008           Code_opar($+1)='  /* Routine name of block: '+strcat(string(cpr.sim.funs(i)));
6009           Code_opar($+1)='   * Gui name of block: '+strcat(string(OO.gui));
6010           Code_opar($+1)='   * Compiled structure index: '+strcat(string(i));
6011           if stripblanks(OO.model.label)~=emptystr() then
6012             Code_opar=[Code_opar;
6013                   '  '+cformatline(' * Label: '+strcat(string(OO.model.label)),70)];
6014           end
6015           if stripblanks(OO.graphics.id)~=emptystr() then
6016             Code_opar=[Code_opar;
6017                   '  '+cformatline(' * Identification: '+strcat(string(OO.graphics.id)),70)];
6018           end
6019           Code_opar($+1)='   */';
6020         end
6021       end
6022       //******************//
6023
6024       for j=1:nopar
6025         if mat2scs_c_nb(opar(opptr(i)+j-1)) <> 11 then
6026           Code_opar =[Code_opar;
6027                  '  '+cformatline(mat2c_typ(opar(opptr(i)+j-1)) +...
6028                          ' opar_'+string(opptr(i)+j-1) + '[]={'+...
6029                              strcat(string(opar(opptr(i)+j-1)),',')+'};',70)]
6030         else //** cmplx test
6031           Code_opar =[Code_opar;
6032                  '  '+cformatline(mat2c_typ(opar(opptr(i)+j-1)) +...
6033                          ' opar_'+string(opptr(i)+j-1) + '[]={'+...
6034                              strcat(string([real(opar(opptr(i)+j-1)(:));
6035                                             imag(opar(opptr(i)+j-1)(:))]),',')+'};',70)]
6036         end
6037       end
6038       Code_opar($+1)='';
6039
6040       //## size
6041       Code_oparsz   = []
6042       //** 1st dim **//
6043       for j=1:nopar
6044         Code_oparsz=[Code_oparsz
6045                      string(size(opar(opptr(i)+j-1),1))]
6046       end
6047       //** 2dn dim **//
6048       for j=1:nopar
6049         Code_oparsz=[Code_oparsz
6050                      string(size(opar(opptr(i)+j-1),2))]
6051       end
6052       Code_tooparsz=cformatline(strcat(Code_oparsz,','),70);
6053       Code_tooparsz(1)='int oparsz_'+string(i)+'[]={'+Code_tooparsz(1);
6054       for j=2:size(Code_tooparsz,1)
6055         Code_tooparsz(j)=get_blank('int oparsz_'+string(i)+'[]')+Code_tooparsz(j);
6056       end
6057       Code_tooparsz($)=Code_tooparsz($)+'};'
6058       Code_ooparsz=[Code_ooparsz;
6059                     Code_tooparsz];
6060
6061       //## typ
6062       Code_opartyp   = []
6063       for j=1:nopar
6064         Code_opartyp=[Code_opartyp
6065                       mat2scs_c_typ(opar(opptr(i)+j-1))]
6066       end
6067       Code_toopartyp=cformatline(strcat(Code_opartyp,','),70);
6068       Code_toopartyp(1)='int opartyp_'+string(i)+'[]={'+Code_toopartyp(1);
6069       for j=2:size(Code_toopartyp,1)
6070         Code_toopartyp(j)=get_blank('int opartyp_'+string(i)+'[]')+Code_toopartyp(j);
6071       end
6072       Code_toopartyp($)=Code_toopartyp($)+'};'
6073       Code_oopartyp=[Code_oopartyp;
6074                      Code_toopartyp];
6075
6076       //## ptr
6077       Code_tooparptr=cformatline(strcat(string(zeros(1,nopar)),','),70);
6078       Code_tooparptr(1)='void *oparptr_'+string(i)+'[]={'+Code_tooparptr(1);
6079       for j=2:size(Code_tooparptr,1)
6080         Code_tooparptr(j)=get_blank('void *oparptr_'+string(i)+'[]')+Code_tooparptr(j);
6081       end
6082       Code_tooparptr($)=Code_tooparptr($)+'};'
6083       Code_oparptr=[Code_oparptr
6084                     Code_tooparptr]
6085
6086     end
6087   end
6088
6089   if Code_opar <> [] then
6090     Code=[Code;
6091           '  /* Object parameters declaration */'
6092           Code_opar
6093           ''
6094           '  '+Code_ooparsz
6095           ''
6096           '  '+Code_oopartyp
6097           ''
6098           '  '+Code_oparptr
6099           '']
6100   end
6101
6102   //##########################//
6103
6104   //*** Continuous state ***//
6105   if x <> [] then
6106    //## implicit block
6107    if impl_blk then
6108      Code=[Code;
6109            '  /* Continuous states declaration */'
6110            cformatline('  double x[]={'+strcat(string(x(1:nX/2)),',')+'};',70)
6111            cformatline('  double xd[]={'+strcat(string(zeros(nX/2+1:nX)),',')+'};',70)
6112            cformatline('  double res[]={'+strcat(string(zeros(1,nX/2)),',')+'};',70)
6113            ''
6114            '/* def xproperty */'
6115            cformatline('     int xprop[]={'+strcat(string(ones(1:nX/2)),',')+'};',70)
6116            '']
6117
6118    //## explicit block
6119    else
6120      Code=[Code;
6121            '  /* Continuous states declaration */'
6122            cformatline('  double x[]={'+strcat(string(x),',')+'};',70)
6123            cformatline('  double xd[]={'+strcat(string(zeros(1,nX)),',')+'};',70)
6124            '']
6125    end
6126   end
6127   //************************//
6128
6129   //### discrete states ###//
6130   if size(z,1) <> 0 then
6131     Code=[Code;
6132           '  /* Discrete states declaration */']
6133     for i=1:(length(zptr)-1)
6134       if zptr(i+1)-zptr(i)>0 then
6135
6136         //** Add comments **//
6137
6138         //## Modelica block
6139         if type(corinv(i))==15 then
6140           //## 09/04/08, Alan : we can extract here all informations
6141           //## from original scicos blocks with corinv : TODO
6142           Code($+1)='  /* MODELICA BLK Z COMMENTS : TODO ';
6143         else
6144           if size(corinv(i),'*')==1 then
6145             OO=scs_m.objs(corinv(i))
6146           else
6147             path=list('objs')
6148             for l=cpr.corinv(i)(1:$-1)
6149               path($+1)=l;path($+1)='model'
6150               path($+1)='rpar'
6151               path($+1)='objs'
6152             end
6153             path($+1)=cpr.corinv(i)($)
6154             OO=scs_m(path)
6155           end
6156           aaa=OO.gui
6157           bbb=emptystr(3,1);
6158           if and(aaa+bbb~=['INPUTPORTEVTS';'OUTPUTPORTEVTS';'EVTGEN_f']) then
6159             Code($+1)='  /* Routine name of block: '+strcat(string(cpr.sim.funs(i)));
6160             Code($+1)='     Gui name of block: '+strcat(string(OO.gui));
6161             //Code($+1)='/* Name block: '+strcat(string(cpr.sim.funs(i)));
6162             //Code($+1)='Object number in diagram: '+strcat(string(cpr.corinv(i)));
6163             Code($+1)='     Compiled structure index: '+strcat(string(i));
6164             if stripblanks(OO.model.label)~=emptystr() then
6165               Code=[Code;
6166                     cformatline('     Label: '+strcat(string(OO.model.label)),70)]
6167             end
6168             if stripblanks(OO.graphics.exprs(1))~=emptystr() then
6169               Code=[Code;
6170                     cformatline('     Exprs: '+strcat(OO.graphics.exprs(1),","),70)]
6171             end
6172             if stripblanks(OO.graphics.id)~=emptystr() then
6173               Code=[Code;
6174                     cformatline('     Identification: '+..
6175                        strcat(string(OO.graphics.id)),70)]
6176             end
6177           end
6178         end
6179         Code($+1)='  */';
6180         Code=[Code;
6181               cformatline('  double z_'+string(i)+'[]={'+...
6182               strcat(string(z(zptr(i):zptr(i+1)-1)),",")+'};',70)]
6183         Code($+1)='';
6184       end
6185       //******************//
6186     end
6187   end
6188   //#######################//
6189
6190   //** declaration of work
6191   Code_work=[]
6192   for i=1:size(with_work,1)
6193     if with_work(i)==1 then
6194        Code_work=[Code_work
6195                   '  void *work_'+string(i)+'[]={0};']
6196     end
6197   end
6198
6199   if Code_work<>[] then
6200     Code=[Code
6201           ''
6202           '  /* Work array declaration */'
6203           Code_work
6204           '']
6205   end
6206
6207   //### Object state ###//
6208   //** declaration of oz
6209   Code_oz = [];
6210   Code_oozsz=[];
6211   Code_ooztyp=[];
6212   Code_ozptr=[];
6213
6214   for i=1:(length(ozptr)-1)
6215     noz = ozptr(i+1)-ozptr(i)
6216     if noz>0 then
6217
6218       for j=1:noz
6219         if mat2scs_c_nb(oz(ozptr(i)+j-1)) <> 11 then
6220           Code_oz=[Code_oz;
6221                    cformatline('  '+mat2c_typ(oz(ozptr(i)+j-1))+...
6222                                ' oz_'+string(ozptr(i)+j-1)+'[]={'+...
6223                                strcat(string(oz(ozptr(i)+j-1)(:)),',')+'};',70)]
6224         else //** cmplx test
6225           Code_oz=[Code_oz;
6226                    cformatline('  '+mat2c_typ(oz(ozptr(i)+j-1))+...
6227                                ' oz_'+string(ozptr(i)+j-1)+'[]={'+...
6228                                strcat(string([real(oz(ozptr(i)+j-1)(:));
6229                                               imag(oz(ozptr(i)+j-1)(:))]),',')+'};',70)]
6230         end
6231       end
6232
6233       //## size
6234       Code_ozsz   = []
6235       //** 1st dim **//
6236       for j=1:noz
6237         Code_ozsz=[Code_ozsz
6238                      string(size(oz(ozptr(i)+j-1),1))]
6239       end
6240       //** 2dn dim **//
6241       for j=1:noz
6242         Code_ozsz=[Code_ozsz
6243                      string(size(oz(ozptr(i)+j-1),2))]
6244       end
6245       Code_toozsz=cformatline(strcat(Code_ozsz,','),70);
6246       Code_toozsz(1)='int ozsz_'+string(i)+'[]={'+Code_toozsz(1);
6247       for j=2:size(Code_toozsz,1)
6248         Code_toozsz(j)=get_blank('int ozsz_'+string(i)+'[]')+Code_toozsz(j);
6249       end
6250       Code_toozsz($)=Code_toozsz($)+'};'
6251       Code_oozsz=[Code_oozsz;
6252                     Code_toozsz];
6253
6254       //## typ
6255       Code_oztyp   = []
6256       for j=1:noz
6257         Code_oztyp=[Code_oztyp
6258                       mat2scs_c_typ(oz(ozptr(i)+j-1))]
6259       end
6260       Code_tooztyp=cformatline(strcat(Code_oztyp,','),70);
6261       Code_tooztyp(1)='int oztyp_'+string(i)+'[]={'+Code_tooztyp(1);
6262       for j=2:size(Code_tooztyp,1)
6263         Code_tooztyp(j)=get_blank('int oztyp_'+string(i)+'[]')+Code_tooztyp(j);
6264       end
6265       Code_tooztyp($)=Code_tooztyp($)+'};'
6266       Code_ooztyp=[Code_ooztyp;
6267                      Code_tooztyp];
6268
6269       //## ptr
6270       Code_toozptr=cformatline(strcat(string(zeros(1,noz)),','),70);
6271       Code_toozptr(1)='void *ozptr_'+string(i)+'[]={'+Code_toozptr(1);
6272       for j=2:size(Code_toozptr,1)
6273         Code_toozptr(j)=get_blank('void *ozptr_'+string(i)+'[]')+Code_toozptr(j);
6274       end
6275       Code_toozptr($)=Code_toozptr($)+'};'
6276       Code_ozptr=[Code_ozptr
6277                     Code_toozptr]
6278
6279     end
6280   end
6281
6282   if Code_oz <> [] then
6283     Code=[Code;
6284           '  /* Object discrete states declaration */'
6285           Code_oz
6286           ''
6287           '  '+Code_oozsz
6288           ''
6289           '  '+Code_ooztyp
6290           ''
6291           '  '+Code_ozptr]
6292   end
6293   //#######################//
6294
6295   //** declaration of outtb
6296   Code_outtb = [];
6297   for i=1:lstsize(outtb)
6298     if mat2scs_c_nb(outtb(i)) <> 11 then
6299       Code_outtb=[Code_outtb;
6300                   cformatline('  '+mat2c_typ(outtb(i))+...
6301                               ' outtb_'+string(i)+'[]={'+...
6302                               strcat(string(outtb(i)(:)),',')+'};',70)]
6303     else //** cmplx test
6304       Code_outtb=[Code_outtb;
6305                   cformatline('  '+mat2c_typ(outtb(i))+...
6306                               ' outtb_'+string(i)+'[]={'+...
6307                               strcat(string([real(outtb(i)(:));
6308                                              imag(outtb(i)(:))]),',')+'};',70)]
6309     end
6310   end
6311
6312   if Code_outtb<>[] then
6313     Code=[Code
6314           ''
6315           '  /* Output declaration */'
6316           Code_outtb
6317           '']
6318   end
6319
6320   Code_outtbptr=[];
6321   for i=1:lstsize(outtb)
6322     Code_outtbptr=[Code_outtbptr;
6323                    '  '+rdnom+'_block_outtbptr['+...
6324                     string(i-1)+'] = (void *) outtb_'+string(i)+';'];
6325   end
6326
6327   //##### insz/outsz #####//
6328   Code_iinsz=[];
6329   Code_inptr=[];
6330   Code_ooutsz=[];
6331   Code_outptr=[];
6332   for kf=1:nblk
6333     nin=inpptr(kf+1)-inpptr(kf);  //** number of input ports
6334     Code_insz=[];
6335
6336     //########
6337     //## insz
6338     //########
6339
6340     //## case sensor ##//
6341     if or(kf==capt(:,1)) then
6342       ind=find(kf==capt(:,1))
6343       //Code_insz = 'typin['+string(ind-1)+']'
6344     //## other blocks ##//
6345     elseif nin<>0 then
6346       //** 1st dim **//
6347       for kk=1:nin
6348          lprt=inplnk(inpptr(kf)-1+kk);
6349          Code_insz=[Code_insz
6350                     string(size(outtb(lprt),1))]
6351       end
6352       //** 2dn dim **//
6353       for kk=1:nin
6354          lprt=inplnk(inpptr(kf)-1+kk);
6355          Code_insz=[Code_insz
6356                     string(size(outtb(lprt),2))]
6357       end
6358       //** typ **//
6359       for kk=1:nin
6360          lprt=inplnk(inpptr(kf)-1+kk);
6361          Code_insz=[Code_insz
6362                     mat2scs_c_typ(outtb(lprt))]
6363       end
6364     end
6365     if Code_insz<>[] then
6366       Code_toinsz=cformatline(strcat(Code_insz,','),70);
6367       Code_toinsz(1)='int insz_'+string(kf)+'[]={'+Code_toinsz(1);
6368       for j=2:size(Code_toinsz,1)
6369         Code_toinsz(j)=get_blank('int insz_'+string(kf)+'[]')+Code_toinsz(j);
6370       end
6371       Code_toinsz($)=Code_toinsz($)+'};'
6372       Code_iinsz=[Code_iinsz
6373                   Code_toinsz]
6374     end
6375
6376     //########
6377     //## inptr
6378     //########
6379
6380     //## case sensor ##//
6381     if or(kf==capt(:,1)) then
6382       Code_inptr=[Code_inptr;
6383                   'void *inptr_'+string(kf)+'[]={0};';]
6384     //## other blocks ##//
6385     elseif nin<>0 then
6386       Code_toinptr=cformatline(strcat(string(zeros(1,nin)),','),70);
6387       Code_toinptr(1)='void *inptr_'+string(kf)+'[]={'+Code_toinptr(1);
6388       for j=2:size(Code_toinptr,1)
6389         Code_toinptr(j)=get_blank('void *inptr_'+string(kf)+'[]')+Code_toinptr(j);
6390       end
6391       Code_toinptr($)=Code_toinptr($)+'};'
6392       Code_inptr=[Code_inptr
6393                   Code_toinptr]
6394     end
6395
6396     nout=outptr(kf+1)-outptr(kf); //** number of output ports
6397     Code_outsz=[];
6398
6399     //########
6400     //## outsz
6401     //########
6402
6403     //## case actuators ##//
6404     if or(kf==actt(:,1)) then
6405       ind=find(kf==actt(:,1))
6406       //Code_outsz = 'typout['+string(ind-1)+']'
6407     //## other blocks ##//
6408     elseif nout<>0 then
6409       //** 1st dim **//
6410       for kk=1:nout
6411          lprt=outlnk(outptr(kf)-1+kk);
6412          Code_outsz=[Code_outsz
6413                      string(size(outtb(lprt),1))]
6414       end
6415       //** 2dn dim **//
6416       for kk=1:nout
6417          lprt=outlnk(outptr(kf)-1+kk);
6418          Code_outsz=[Code_outsz
6419                      string(size(outtb(lprt),2))]
6420       end
6421       //** typ **//
6422       for kk=1:nout
6423          lprt=outlnk(outptr(kf)-1+kk);
6424          Code_outsz=[Code_outsz
6425                      mat2scs_c_typ(outtb(lprt))]
6426       end
6427     end
6428     if Code_outsz<>[] then
6429       Code_tooustz=cformatline(strcat(Code_outsz,','),70);
6430       Code_tooustz(1)='int outsz_'+string(kf)+'[]={'+Code_tooustz(1);
6431       for j=2:size(Code_tooustz,1)
6432         Code_tooustz(j)=get_blank('int outsz_'+string(kf)+'[]')+Code_tooustz(j);
6433       end
6434       Code_tooustz($)=Code_tooustz($)+'};'
6435       Code_ooutsz=[Code_ooutsz
6436                    Code_tooustz]
6437     end
6438
6439     //#########
6440     //## outptr
6441     //#########
6442
6443     //## case actuators ##//
6444     if or(kf==actt(:,1)) then
6445       Code_outptr=[Code_outptr;
6446                    'void *outptr_'+string(kf)+'[]={0};';]
6447     //## other blocks ##//
6448     elseif nout<>0 then
6449       Code_tooutptr=cformatline(strcat(string(zeros(1,nout)),','),70);
6450       Code_tooutptr(1)='void *outptr_'+string(kf)+'[]={'+Code_tooutptr(1);
6451       for j=2:size(Code_tooutptr,1)
6452         Code_tooutptr(j)=get_blank('void *outptr_'+string(kf)+'[]')+Code_tooutptr(j);
6453       end
6454       Code_tooutptr($)=Code_tooutptr($)+'};'
6455       Code_outptr=[Code_outptr
6456                    Code_tooutptr]
6457     end
6458   end
6459
6460   if Code_iinsz<>[] then
6461      Code=[Code;
6462           '  /* Inputs */'
6463           '  '+Code_iinsz
6464           ''];
6465   end
6466   if Code_inptr<>[] then
6467      Code=[Code;
6468           '  '+Code_inptr
6469           ''];
6470   end
6471   if Code_ooutsz<>[] then
6472      Code=[Code;
6473           '  /* Outputs */'
6474           '  '+Code_ooutsz
6475           ''];
6476   end
6477   if Code_outptr<>[] then
6478      Code=[Code;
6479           '  '+Code_outptr
6480           ''];
6481   end
6482   //######################//
6483
6484   //##### out events #####//
6485   Code_evout=[];
6486   for kf=1:nblk
6487     if funs(kf)<>'bidon' then
6488       nevout=clkptr(kf+1)-clkptr(kf);
6489       if nevout <> 0 then
6490         Code_toevout=cformatline(strcat(string(cpr.state.evtspt((clkptr(kf):clkptr(kf+1)-1))),','),70);
6491         Code_toevout(1)='double evout_'+string(kf)+'[]={'+Code_toevout(1);
6492         for j=2:size(Code_toevout,1)
6493           Code_toevout(j)=get_blank('double evout_'+string(kf)+'[]')+Code_toevout(j);
6494         end
6495         Code_toevout($)=Code_toevout($)+'};';
6496         Code_evout=[Code_evout
6497                     Code_toevout];
6498       end
6499     end
6500   end
6501   if Code_evout<>[] then
6502      Code=[Code;
6503           '  /* Outputs event declaration */'
6504           '  '+Code_evout
6505           ''];
6506   end
6507   //################//
6508
6509   //## input connection to outtb
6510   Code_inptr=[]
6511   for kf=1:nblk
6512     nin=inpptr(kf+1)-inpptr(kf);  //** number of input ports
6513     //## case sensor ##//
6514     if or(kf==capt(:,1)) then
6515       ind=find(kf==capt(:,1))
6516       Code_inptr=[Code_inptr;
6517                   '  inptr_'+string(kf)+'[0] = inptr['+string(ind-1)+'];';]
6518     //## other blocks ##//
6519     elseif nin<>0 then
6520       for k=1:nin
6521         lprt=inplnk(inpptr(kf)-1+k);
6522         Code_inptr=[Code_inptr
6523                     '  inptr_'+string(kf)+'['+string(k-1)+'] = (void *) outtb_'+string(lprt)+';']
6524       end
6525     end
6526   end
6527   if Code_inptr<>[] then
6528     Code=[Code;
6529           '  /* Affectation of inptr */';
6530           Code_inptr;
6531           ''];
6532   end
6533
6534   //## output connection to outtb
6535   Code_outptr=[]
6536   for kf=1:nblk
6537     nout=outptr(kf+1)-outptr(kf); //** number of output ports
6538     //## case actuators ##//
6539     if or(kf==actt(:,1)) then
6540     ind=find(kf==actt(:,1))
6541     Code_outptr=[Code_outptr;
6542                  '  outptr_'+string(kf)+'[0] = outptr['+string(ind-1)+'];';]
6543     //## other blocks ##//
6544     elseif nout<>0 then
6545       for k=1:nout
6546         lprt=outlnk(outptr(kf)-1+k);
6547         Code_outptr=[Code_outptr
6548                     '  outptr_'+string(kf)+'['+string(k-1)+'] = (void *) outtb_'+string(lprt)+';']
6549       end
6550     end
6551   end
6552   if Code_outptr<>[] then
6553     Code=[Code;
6554           '  /* Affectation of outptr */';
6555           Code_outptr;
6556           ''];
6557   end
6558
6559   //## affectation of oparptr
6560   Code_oparptr=[]
6561   for kf=1:nblk
6562     nopar=opptr(kf+1)-opptr(kf); //** number of object parameters
6563     if nopar<>0 then
6564       for k=1:nopar
6565         Code_oparptr=[Code_oparptr
6566                     '  oparptr_'+string(kf)+'['+string(k-1)+'] = (void *) opar_'+string(opptr(kf)+k-1)+';']
6567       end
6568     end
6569   end
6570   if Code_oparptr<>[] then
6571     Code=[Code;
6572           '  /* Affectation of oparptr */';
6573           Code_oparptr;
6574           ''];
6575   end
6576
6577   //## affectation of ozptr
6578   Code_ozptr=[]
6579   for kf=1:nblk
6580     noz=ozptr(kf+1)-ozptr(kf); //** number of object states
6581     if noz<>0 then
6582       for k=1:noz
6583         Code_ozptr=[Code_ozptr
6584                     '  ozptr_'+string(kf)+'['+string(k-1)+'] = (void *) oz_'+string(ozptr(kf)+k-1)+';']
6585       end
6586     end
6587   end
6588   if Code_ozptr<>[] then
6589     Code=[Code;
6590           '  /* Affectation of ozptr */';
6591           Code_ozptr;
6592           ''];
6593   end
6594
6595   //## fields of each scicos structure
6596   for kf=1:nblk
6597     if funs(kf)<>'bidon' then
6598       nx=xptr(kf+1)-xptr(kf);         //** number of continuous state
6599       nz=zptr(kf+1)-zptr(kf);         //** number of discrete state
6600       nin=inpptr(kf+1)-inpptr(kf);    //** number of input ports
6601       nout=outptr(kf+1)-outptr(kf);   //** number of output ports
6602       nevout=clkptr(kf+1)-clkptr(kf); //** number of event output ports
6603
6604       //** add comment
6605       txt=[get_comment('set_blk',list(funs(kf),funtyp(kf),kf));]
6606
6607       Code=[Code;
6608             '  '+txt];
6609
6610       Code=[Code;
6611             '  block_'+rdnom+'['+string(kf-1)+'].type    = '+string(funtyp(kf))+';';
6612             '  block_'+rdnom+'['+string(kf-1)+'].ztyp    = '+string(ztyp(kf))+';';
6613             '  block_'+rdnom+'['+string(kf-1)+'].ng      = '+string(zcptr(kf+1)-zcptr(kf))+';';
6614             '  block_'+rdnom+'['+string(kf-1)+'].nz      = '+string(zptr(kf+1)-zptr(kf))+';';
6615             '  block_'+rdnom+'['+string(kf-1)+'].nx      = '+string(nx)+';';
6616             '  block_'+rdnom+'['+string(kf-1)+'].noz     = '+string(ozptr(kf+1)-ozptr(kf))+';';
6617             '  block_'+rdnom+'['+string(kf-1)+'].nrpar   = '+string(rpptr(kf+1)-rpptr(kf))+';';
6618             '  block_'+rdnom+'['+string(kf-1)+'].nopar   = '+string(opptr(kf+1)-opptr(kf))+';';
6619             '  block_'+rdnom+'['+string(kf-1)+'].nipar   = '+string(ipptr(kf+1)-ipptr(kf))+';'
6620             '  block_'+rdnom+'['+string(kf-1)+'].nin     = '+string(inpptr(kf+1)-inpptr(kf))+';';
6621             '  block_'+rdnom+'['+string(kf-1)+'].nout    = '+string(outptr(kf+1)-outptr(kf))+';';
6622             '  block_'+rdnom+'['+string(kf-1)+'].nevout  = '+string(clkptr(kf+1)-clkptr(kf))+';';
6623             '  block_'+rdnom+'['+string(kf-1)+'].nmode   = '+string(modptr(kf+1)-modptr(kf))+';';]
6624
6625       if nx <> 0 then
6626         Code=[Code;
6627               '  block_'+rdnom+'['+string(kf-1)+'].x       = &(x['+string(xptr(kf)-1)+']);'
6628               '  block_'+rdnom+'['+string(kf-1)+'].xd      = &(xd['+string(xptr(kf)-1)+']);']
6629         if impl_blk then
6630           Code=[Code;
6631                 '  block_'+rdnom+'['+string(kf-1)+'].res     = &(res['+string(xptr(kf)-1)+']);'
6632                 '  block_'+rdnom+'['+string(kf-1)+'].xprop   = &(xprop['+string(xptr(kf)-1)+']);'];
6633         end
6634       end
6635
6636       //** evout **//
6637       if nevout<>0 then
6638         Code=[Code;
6639               '  block_'+rdnom+'['+string(kf-1)+'].evout