00001 #include <stdlib.h>
00002 #include <stdio.h>
00003 #include <math.h>
00004
00005 #include "sci_mem_alloc.h"
00006
00007 #include "machine.h"
00008 #include "cc_pass2.h"
00009 #include <memory.h>
00010 #include <string.h>
00011
00012
00013 int OR(int* Vect)
00014 {
00015 int i=1;
00016 int next=false;
00017
00018 while(!(next) && (i<Vect[0]+1))
00019 {
00020 next=(Vect[i]!=0)? true:false ;
00021 i++;
00022 }
00023 return next;
00024 }
00025
00026
00027 int Sign(int x)
00028 {
00029 int y;
00030 if (x < 0) y=-1;
00031 else if (x > 0) y=1;
00032 else y=0;
00033 return y;
00034 }
00035
00036
00037 int Max1(int* vect)
00038 {
00039 int i,max1;
00040 if (vect[0]<1){
00041 max1=0;
00042 }else{
00043 max1=vect[1];
00044 for(i=2;i<vect[0]+1;i++)
00045 {
00046 max1=(max1<vect[i])? vect[i]:max1;
00047 }
00048 }
00049 return max1;
00050 }
00051
00052
00053 int Min1(int* vect)
00054 {
00055 int i,min1;
00056 if (vect[0]<1){
00057 min1=0;
00058 }else{
00059 min1=vect[1];
00060 for(i=2;i<vect[0]+1;i++)
00061 {
00062 min1=(min1>vect[i])? vect[i]:min1;
00063 }
00064 }
00065 return min1;
00066 }
00067
00068
00069
00070 int AND(int* Vect)
00071 {
00072 int i=1;
00073 int next=false;
00074 while((!(next)) && (i<Vect[0]+1))
00075 {
00076 next=(Vect[i]==0)? true :false;
00077 i++;
00078 }
00079 return !next;
00080 }
00081
00082
00083
00084 int cpass2(bllst111,bllst112,bllst2,bllst3,bllst4,bllst5,bllst9,bllst10,
00085 bllst11,bllst12,bllst13,nmode,nzcross,bllst2ptr,bllst3ptr,bllst4ptr,bllst5ptr,bllst6ptr,bllst9ptr,typ_x,
00086 bllst11ptr,connectmat,clkconnect,corinvec,corinvptr,
00087 iz0,tevts,evtspt,pointi,outtb,zcptr,modptr,outlnk,inplnk,
00088 lnkptr,ordptr,execlk,ordclk,cord,oord,zord,critev,nb,ztyp,
00089 nblk,ndcblk,subscr,iord,ok)
00090
00091 char ***bllst10,***bllst13,***bllst111;
00092 int **bllst2,**bllst3,**bllst4,**bllst5,**bllst2ptr,**bllst3ptr,**bllst4ptr;
00093 int **bllst5ptr,**typ_x,**bllst11ptr,*ok,**bllst112,**bllst9,**bllst9ptr;
00094 int **corinvec,**corinvptr,**evtspt,*pointi,**outtb,**zcptr,**modptr,**inplnk;
00095 int **outlnk,**lnkptr,**ordptr,**execlk,**ordclk,**cord,**oord;
00096 int **zord,**critev,**iz0,**subscr,**nzcross,**nmode,**bllst6ptr;
00097 int *nb,**ztyp,*nblk,*ndcblk,**iord,**bllst12,**connectmat,**clkconnect;
00098 double **bllst11,**tevts;
00099 {
00100
00101
00102 int need_newblk=1,i,l,nombr,a,prime_pointer=1;
00103 int done,ncblk,nxblk,ndblk,nblk1;
00104 int *typ_l,*typ_r,*typ_m,*tblock,*prime_act,*vec;
00105 int *typ_cons,*typ_z,*typ_s,*bexe,*boptr,*blnk,*blptr,*outoinptr,*typ_zx;
00106 int *outoin,*exe_cons,*evoutoin,*evoutoinptr,*ordptr1,*execlk0,*execlk_cons;
00107 double *initexe;
00108 nblk1=((int*) (*bllst10))[0];
00109 if (TEST)
00110 {
00111 Message("No block can be activated");
00112 *ok=false;
00113 return 0;
00114 }
00115
00116 mini_extract_info(*bllst2,bllst4,*bllst10,*bllst12,*bllst2ptr,*bllst3ptr,bllst4ptr,*typ_x,*connectmat,
00117 *clkconnect,inplnk,outlnk,&typ_l,&typ_r,&typ_m,&tblock,&typ_cons,&typ_zx,*nzcross,ok);
00118
00119 conn_mat(*inplnk,*outlnk,*bllst2ptr,*bllst3ptr,&outoin,&outoinptr,nblk);
00120 critical_events(*connectmat,*clkconnect,*bllst12,typ_r,typ_l,typ_zx,outoin,outoinptr,*bllst5ptr,critev);
00121 pak_ersi(clkconnect,typ_r,typ_l,outoin,outoinptr,tblock,typ_cons,*bllst5ptr,&exe_cons,*nblk);
00122 FREE(typ_r);
00123 typ_r=NULL;
00124 FREE(tblock);
00125 tblock=NULL;
00126 FREE(typ_zx);
00127 typ_zx=NULL;
00128 FREE(typ_cons);
00129 typ_cons=NULL;
00130 done=false;
00131 if ((prime_act=MALLOC(sizeof(int)*2))== NULL ) return 0;
00132 prime_act[0]=1;
00133 prime_act[1]=0;
00134
00135 for (i = 1; i <= nblk1; i++){
00136 if (!typ_l[i] && ((*bllst5ptr)[i+1]-(*bllst5ptr)[i] != 0)){
00137 if ((vec=MALLOC(sizeof(int)*((*bllst5ptr)[i+1]-(*bllst5ptr)[i]+1)))== NULL ) return 0;
00138 vec[0]=(*bllst5ptr)[i+1]-(*bllst5ptr)[i];
00139 if ((prime_act=(int*)REALLOC(prime_act,sizeof(int)*(prime_act[0]+vec[0]+1))) == NULL ) return 0;
00140 for (l = 1; l <= vec[0]; l++){
00141 prime_act[prime_act[0]+l]=(*bllst5ptr)[i]+l-1;
00142 }
00143 prime_act[0]=prime_act[0]+vec[0];
00144 FREE(vec);
00145 }
00146 }
00147 while(!done)
00148 {
00149 make_ptr(*bllst10,&typ_l,&typ_m);
00150 cleanup(clkconnect);
00151 if (OR(typ_l))
00152 paksazi(bllst111,bllst112,bllst2,bllst3,bllst4,bllst5,bllst9,bllst10,bllst12,nzcross,bllst2ptr,bllst3ptr,
00153 bllst4ptr,bllst5ptr,bllst9ptr,connectmat,clkconnect,typ_l,typ_m,&done,ok,&need_newblk,
00154 corinvec,corinvptr,critev,&prime_pointer,&prime_act);
00155 else done=true;
00156 if(!(*ok)) return 0;
00157 }
00158 FREE(prime_act);
00159 FREE(typ_l);
00160 typ_l=NULL;
00161 nombr=((int*) (*bllst10))[0];
00162 if (nblk1 < nombr)
00163 {
00164 if (((*typ_x)=(int*)REALLOC((*typ_x),sizeof(int)*(nombr+1))) == NULL ) return 0;
00165 (*typ_x)[0]=nombr;
00166 if (((*bllst11ptr)=(int*)REALLOC((*bllst11ptr),sizeof(int)*((*bllst11ptr)[0]+nombr-nblk1+1))) == NULL ) return 0;
00167 (*bllst11ptr)[0]=(*bllst11ptr)[0]+nombr-nblk1;
00168 if (((*bllst11)=(double*)REALLOC((*bllst11),sizeof(double)*(((int*) (*bllst11))[0]+2*(nombr-nblk1)+1))) == NULL ) return 0;
00169 ((int*)(*bllst11))[0]=((int*)(*bllst11))[0]+2*(nombr-nblk1);
00170 if (((*nmode)=(int*)REALLOC((*nmode),sizeof(int)*(nombr+1))) == NULL ) return 0;
00171 (*nmode)[0]=nombr;
00172 if (((*bllst13)=(char**)REALLOC((*bllst13),sizeof(char*)*(nombr+1))) == NULL ) return 0;
00173 ((int*) (*bllst13))[0]=nombr;
00174 for(i=nblk1+1;i<nombr+1;i++)
00175 {
00176 (*typ_x)[i]=0;
00177 (*nmode)[i]=1;
00178 (*bllst11ptr)[i+1]=(*bllst11ptr)[i]+2;
00179 for(l=(*bllst11ptr)[i];l<=(*bllst11ptr)[i+1]-1;l++)
00180 {
00181 (*bllst11)[l]=-1;
00182 }
00183 if (( (*bllst13)[i]=(char*) MALLOC(sizeof(char)*(2))) ==NULL ) return 0;
00184 ((char*) (*bllst13)[i])[1]='\0';
00185 *((*bllst13)[i])=' ';
00186 }
00187
00188 }
00189 FREE(typ_m);
00190 FREE(*inplnk);
00191 FREE(*outlnk);
00192 extract_info(*bllst2,*bllst3,*bllst5,*bllst10,*bllst11,*bllst12,*bllst2ptr,*bllst3ptr,*bllst4ptr,*bllst5ptr,
00193 *bllst11ptr,*connectmat,*clkconnect,lnkptr,inplnk,outlnk,*nzcross,*nmode,
00194 &typ_s,typ_x,&typ_m,&initexe,&bexe,&boptr,&blnk,&blptr,ok,*corinvec,*corinvptr);
00195 FREE(typ_m);
00196 typ_m=NULL;
00197 if(!(*ok))
00198 {
00199 Message("Problem in port size.");
00200 return 0;
00201 }
00202
00203 FREE(outoinptr);
00204 FREE(outoin);
00205 conn_mat(*inplnk,*outlnk,*bllst2ptr,*bllst3ptr,&outoin,&outoinptr,nblk);
00206 *nblk=nblk1;
00207 synch_clkconnect(typ_s,*clkconnect,&evoutoin,&evoutoinptr);
00208 discard(*bllst5ptr,*clkconnect,exe_cons,&ordptr1,execlk,&execlk0,&execlk_cons);
00209 FREE(*clkconnect);
00210 *clkconnect=NULL;
00211 FREE(exe_cons);
00212 exe_cons=NULL;
00213
00214 scheduler(*bllst12,*bllst5ptr,*execlk,execlk0,execlk_cons,ordptr1,outoin,outoinptr,evoutoin,
00215 evoutoinptr,&typ_z,typ_x,typ_s,bexe,boptr,blnk,blptr,ordptr,ordclk,cord,iord,oord,zord,ok,*nzcross);
00216
00217 FREE(typ_s);
00218 typ_s=NULL;
00219 FREE(*typ_x);
00220 *typ_x=NULL;
00221 FREE(bexe);
00222 bexe=NULL;
00223 FREE(boptr);
00224 boptr=NULL;
00225 FREE(blnk);
00226 blnk=NULL;
00227 FREE(blptr);
00228 blptr=NULL;
00229 FREE(outoinptr);
00230 outoinptr=NULL;
00231 FREE(outoin);
00232 outoin=NULL;
00233 FREE(evoutoin);
00234 evoutoin=NULL;
00235 FREE(evoutoinptr);
00236 evoutoinptr=NULL;
00237 FREE(ordptr1);
00238 ordptr1=NULL;
00239 FREE(execlk0);
00240 execlk0=NULL;
00241 FREE(execlk_cons);
00242 execlk_cons=NULL;
00243
00244 if(!(*ok)) return 0;
00245 if (((*zcptr)=MALLOC(sizeof(int)*((nombr+2))))== NULL ) return 0;
00246 (*zcptr)[0]=nombr+1;
00247 (*zcptr)[1]=1;
00248 if (((*modptr)=MALLOC(sizeof(int)*((nombr+2))))== NULL ) return 0;
00249 (*modptr)[0]=nombr+1;
00250 (*modptr)[1]=1;
00251 for (i=1; i<= nombr; i++)
00252 {
00253 (*zcptr)[i+1]=(*zcptr)[i] + typ_z[i];
00254 a=Sign(typ_z[i]);
00255 (*modptr)[i+1]=(*modptr)[i]+a*(*nmode)[i];
00256 }
00257 FREE(typ_z);
00258
00259 *ztyp=VecEg1(*nzcross);
00260 for (i=1;i<=(*ztyp)[0];i++)
00261 {
00262 if ((*nzcross)[i] < 0)
00263 {
00264 (*ztyp)[i]=-1;
00265 }
00266 else if ((*nzcross)[i] > 0)
00267 {
00268 (*ztyp)[i]=1;
00269 }
00270 else
00271 {
00272 (*ztyp)[i]=0;
00273 }
00274 }
00275
00276 if ((*bllst6ptr)[(*bllst6ptr)[0]]==1 && (*zcptr)[(*zcptr)[0]] > 1) {
00277 Message("No continuous-time state. Tresholds are ignored.");
00278 }
00279 ncblk=0;nxblk=0;ndblk=0;*ndcblk=0;
00280
00281 *nb=nombr;
00282
00283 init_agenda(initexe,*bllst5ptr,tevts,evtspt,pointi);
00284 FREE(initexe);
00285 initexe=NULL;
00286 if (((*outtb)=(int*)CALLOC((*lnkptr)[(*lnkptr)[0]],sizeof(int)))== NULL ) return 0;
00287 (*outtb)[0]=(*lnkptr)[(*lnkptr)[0]]-1;
00288 if (((*iz0)=(int*)CALLOC(*nb+1,sizeof(int)))== NULL ) return 0;
00289 (*iz0)[0]=*nb;
00290
00291
00292 *subscr=NULL;
00293 return 0;
00294 }
00295
00296
00297
00298 int scheduler(bllst12,bllst5ptr,execlk,execlk0,execlk_cons,ordptr1,outoin,outoinptr,evoutoin,
00299 evoutoinptr,typ_z,typ_x,typ_s,bexe,boptr,blnk,blptr,ordptr2,ordclk,cord,iord,oord,
00300 zord,ok,nzcross)
00301 int *bllst5ptr,*outoinptr,*evoutoin,*evoutoinptr,**typ_z,**typ_x,*typ_s,*bexe,*boptr;
00302 int *blnk,*blptr,**ordptr2,*ok,*ordptr1,*bllst12,*nzcross;
00303 int *execlk,*execlk0,*execlk_cons,*outoin,**ordclk,**cord,**iord,**oord,**zord;
00304 {
00305 int i,iii,k,l,j,jj,hh,o,maX,n,nblk=(*typ_x)[0],f,fin=0;
00306 int *vec,*wec,*ii,*ii1,*ii2,*r,*ext_cord1,*pp,*ppget,*ppget1,*ext_cord2,*typ_z_save;
00307 int *orddif,*cordX,*ext_cord,*ext_cord_old,*oordii,*ind,a,val=0;
00308 Mat2C ordclki,ext_cord1i;
00309
00310 vec=NULL;
00311 wec=NULL;
00312 cordX=NULL;
00313 oordii=NULL;
00314 r=NULL;
00315 orddif=NULL;
00316 ii=NULL;
00317 ii1=NULL;
00318 ii2=NULL;
00319 ext_cord=NULL;
00320 ext_cord1=NULL;
00321 ind=NULL;
00322 *typ_z=VecEg1(nzcross);
00323 if (execlk0)
00324 {
00325
00326 ind=GetPartVect(execlk0,1,execlk0[0]/2);
00327 if ((vec=(int*)CALLOC(ind[0]+1,sizeof(int)))== NULL ) return 0;
00328 vec[0]=ind[0];
00329 wec=GetPartVect(execlk0,execlk0[0]/2+1,execlk0[0]/2);
00330 tree2(vec,vec[0],wec,ind,bllst12,outoin,outoinptr,cord,ok);
00331 if (ind) FREE(ind);
00332 if(vec) FREE(vec);
00333 vec=NULL;
00334 if(wec) FREE(wec);
00335 wec=NULL;
00336 }
00337 else
00338 {
00339 (*cord)=NULL;
00340 }
00341
00342
00343 if (execlk_cons)
00344 {
00345 ind=GetPartVect(execlk_cons,1,execlk_cons[0]/2);
00346 if ((vec=(int*)CALLOC(ind[0]+1,sizeof(int)))== NULL ) return 0;
00347 vec[0]=ind[0];
00348 wec=GetPartVect(execlk_cons,execlk_cons[0]/2+1,execlk_cons[0]/2);
00349 tree2(vec,vec[0],wec,ind,bllst12,outoin,outoinptr,iord,ok);
00350 if (ind) FREE(ind);
00351 if(vec) FREE(vec);
00352 vec=NULL;
00353 if(wec) FREE(wec);
00354 wec=NULL;
00355 }
00356 else
00357 {
00358 (*iord)=NULL;
00359 }
00360
00361 if (!(*ok))
00362 {
00363 Message("Algebraic loop detected; cannot be compiled");
00364 (*cord)=NULL;
00365 (*iord)=NULL;
00366 return 0;
00367 }
00368 if (((*ordclk)=(int*)MALLOC(sizeof(int)))== NULL ) return 0;
00369 (*ordclk)[0]=0;
00370 (*ordptr2)=VecEg1(ordptr1);
00371 for(o=1;o<bllst5ptr[nblk+1];o++)
00372 {
00373 ind=GetPartVect(execlk,ordptr1[o],ordptr1[o+1]-ordptr1[o]);
00374 if (ind)
00375 {
00376 if ((vec=(int*)CALLOC(ind[0]+1,sizeof(int)))== NULL ) return 0;
00377 vec[0]=ind[0];
00378 wec=GetPartVect(execlk,ordptr1[o]+execlk[0]/2,ordptr1[o+1]-ordptr1[o]);
00379 tree2(vec,vec[0],wec,ind,bllst12,outoin,outoinptr,&r,ok);
00380 if (ind) FREE(ind);
00381 if(vec) FREE(vec);
00382 vec=NULL;
00383 if(wec) FREE(wec);
00384 wec=NULL;
00385 if (!(*ok))
00386 {
00387 Message("Algebraic loop detected; cannot be compiled");
00388 (*cord)=NULL;
00389 (*iord)=NULL;
00390 (*ordclk)=NULL;
00391 (*ordptr2)=NULL;
00392 return 0;
00393 }
00394 (*ordptr2)[o+1]=r[0]/2+(*ordptr2)[o];
00395 if ((ordclki.col1=(int*)MALLOC(sizeof(int)*((*ordclk)[0]/2+r[0]/2+1))) == NULL) return 0;
00396 ordclki.col1[0]=(*ordclk)[0]/2+r[0]/2;
00397 if ((ordclki.col2=(int*)MALLOC(sizeof(int)*((*ordclk)[0]/2+r[0]/2+1))) == NULL) return 0;
00398 ordclki.col2[0]=(*ordclk)[0]/2+r[0]/2;
00399 pp=&(ordclki.col1)[1];
00400 pp=memcpy(pp,&(*ordclk)[1],sizeof(int)*((*ordclk)[0]/2));
00401 pp=&(ordclki.col2)[1];
00402 pp=memcpy(pp,&(*ordclk)[(*ordclk)[0]/2+1],sizeof(int)*((*ordclk)[0]/2));
00403 pp=&(ordclki.col1)[(*ordclk)[0]/2+1];
00404 pp=memcpy(pp,&r[1],sizeof(int)*(r[0]/2));
00405 pp=&(ordclki.col2)[(*ordclk)[0]/2+1];
00406 pp=memcpy(pp,&r[1+r[0]/2],sizeof(int)*(r[0]/2));
00407 if (((*ordclk)=(int*)REALLOC((*ordclk),sizeof(int)*((*ordclk)[0]+r[0]+1))) == NULL ) return 0;
00408 (*ordclk)[0]=r[0]+(*ordclk)[0];
00409 pp=&(*ordclk)[1];
00410 pp=memcpy(pp,&(ordclki.col1)[1],sizeof(int)*(ordclki.col1[0]));
00411 pp=&(*ordclk)[(*ordclk)[0]/2+1];
00412 pp=memcpy(pp,&(ordclki.col2)[1],sizeof(int)*(ordclki.col1[0]));
00413 if(ordclki.col1) FREE(ordclki.col1);
00414 ordclki.col1=NULL;
00415 if(ordclki.col2) FREE(ordclki.col2);
00416 ordclki.col2=NULL;
00417
00418 if(r) FREE(r);
00419 r=NULL;
00420 }
00421 }
00422 if ((orddif=(int*)MALLOC(sizeof(int)*(ordptr1[0]+1)))== NULL ) return 0;
00423 orddif[0]=ordptr1[0];
00424 for (k=1;k<orddif[0]+1;k++)
00425 {
00426 if (ordptr1[k]!=(*ordptr2)[k]) orddif[k]=1;
00427 else orddif[k]=0;
00428 }
00429 if (AND(orddif))
00430 {
00431 sciprint("serious bug,report0");
00432 }
00433 if(orddif) FREE(orddif);
00434 if (!(*cord))
00435 {
00436 if ((*cord=(int*)MALLOC(sizeof(int)))== NULL ) return 0;
00437 (*cord)[0]=0;
00438 }
00439
00440 if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1)))== NULL ) return 0;
00441 vec[0]=nblk;
00442 Setmem(vec,-1);
00443 for(i=1;i<(*cord)[0]/2+1;i++)
00444 {
00445 vec[(*cord)[i]]=0;
00446 }
00447
00448 ext_cord1=VecEg1(*cord);
00449 if (ext_cord1[0] != 0){
00450 j=1;
00451 while (true) {
00452 if (typ_s[ext_cord1[j]]) {
00453 for (i=bllst5ptr[ext_cord1[j]]; i< bllst5ptr[ext_cord1[j]+1]; i++){
00454 a=ext_cord1[0]/2+ordptr1[i+1]-ordptr1[i];
00455 if ((ext_cord1i.col1=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
00456 ext_cord1i.col1[0]=a;
00457 if ((ext_cord1i.col2=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
00458 ext_cord1i.col2[0]=a;
00459 pp=&(ext_cord1i.col1)[1];
00460 pp=memcpy(pp,&ext_cord1[1],sizeof(int)*(ext_cord1[0]/2));
00461 pp=&(ext_cord1i.col2)[1];
00462 pp=memcpy(pp,&ext_cord1[ext_cord1[0]/2+1],sizeof(int)*(ext_cord1[0]/2));
00463 pp=&(ext_cord1i.col1)[ext_cord1[0]/2+1];
00464 pp=memcpy(pp,&(*ordclk)[ordptr1[i]],sizeof(int)*(ordptr1[i+1]-ordptr1[i]));
00465 pp=&(ext_cord1i.col2)[ext_cord1[0]/2+1];
00466 pp=memcpy(pp,&(*ordclk)[ordptr1[i]+(*ordclk)[0]/2],sizeof(int)*(ordptr1[i+1]-ordptr1[i]));
00467 if ((ext_cord1=(int*)REALLOC(ext_cord1,sizeof(int)*(2*a+1))) == NULL ) return 0;
00468 ext_cord1[0]=2*a;
00469 pp=&ext_cord1[1];
00470 pp=memcpy(pp,&(ext_cord1i.col1)[1],sizeof(int)*(a));
00471 pp=&ext_cord1[a+1];
00472 pp=memcpy(pp,&(ext_cord1i.col2)[1],sizeof(int)*(a));
00473 if(ext_cord1i.col1) FREE(ext_cord1i.col1);
00474 ext_cord1i.col1=NULL;
00475 if(ext_cord1i.col2) FREE(ext_cord1i.col2);
00476 ext_cord1i.col2=NULL;
00477 }
00478 }
00479 j++;
00480 if (j > ext_cord1[0]/2) break;
00481 }
00482 }
00483
00484 if ((ext_cord=(int*)MALLOC(sizeof(int)*(ext_cord1[0]/2+1))) == NULL ) return 0;
00485 ext_cord[0]=ext_cord1[0]/2;
00486 for (i=1; i<ext_cord[0]+1; i++){
00487 f=0;
00488 for (j=1; j<=val; j++){
00489 if ((ext_cord[j]-ext_cord1[i])==0){
00490 f=1;
00491 break;
00492 }
00493 }
00494 if ( !f ){
00495 val++;
00496 ext_cord[val]=ext_cord1[i];
00497 }
00498 }
00499 ext_cord[0]=val;
00500
00501
00502 tree3(vec,vec[0],bllst12,typ_s,bexe,boptr,blnk,blptr,&ext_cord_old,ok);
00503 if(vec) FREE(vec);
00504 vec=NULL;
00505 if ((ind=(int*)MALLOC(sizeof(int)*(ext_cord_old[0]+1))) == NULL ) return 0;
00506 ind[0]=ext_cord_old[0];
00507 C2F(isort)(&ext_cord_old[1],&ext_cord_old[0],&ind[1]);
00508 FREE(ind);
00509 if ((ind=(int*)MALLOC(sizeof(int)*(ext_cord[0]+1))) == NULL ) return 0;
00510 ind[0]=ext_cord[0];
00511 ext_cord2=VecEg1(ext_cord);
00512 C2F(isort)(&ext_cord2[1],&ext_cord2[0],&ind[1]);
00513 FREE(ind);
00514 if ((vec=(int*)CALLOC((ext_cord[0]+1),sizeof(int))) == NULL ) return 0;
00515 vec[0]=ext_cord[0];
00516 for (i=1; i<=ext_cord[0]; i++){
00517 if (ext_cord2[i] != ext_cord_old[i]) vec[i]=1;
00518 }
00519 FREE(ext_cord2);
00520 if (ext_cord_old) FREE(ext_cord_old);
00521 if ( OR(vec)){
00522 FREE(vec);
00523 return 0;
00524 }
00525 if (vec) FREE(vec);
00526
00527
00528
00529 for (i=1; i<=ext_cord[0]; i++)
00530 {
00531 (*typ_z)[ext_cord[i]]=-(*typ_z)[ext_cord[i]];
00532 }
00533 for (i=1; i<=(*typ_z)[0]; i++)
00534 {
00535 if ((*typ_z)[i] < 0)
00536 {
00537 (*typ_z)[i]=-(*typ_z)[i];
00538 }
00539 else
00540 {
00541 (*typ_z)[i]=0;
00542 }
00543 }
00544 if (!(*ok))
00545 {
00546 sciprint("serious bug,report1");
00547 }
00548 typ_z_save=VecEg1(*typ_z);
00549 while (!fin){
00550 fin=1;
00551 for (i=ext_cord[0]; i>0; i--){
00552 iii=ext_cord[i];
00553 ii=GetPartVect(outoin,outoinptr[iii],outoinptr[iii+1]-outoinptr[iii]);
00554 if (!ii)
00555 {
00556 if ((ii=(int*)MALLOC(sizeof(int)))== NULL ) return 0;
00557 ii[0]=0;
00558 }
00559 ppget=GetPartVect(evoutoin,evoutoinptr[iii],evoutoinptr[iii+1]-evoutoinptr[iii]);
00560 if(ppget)
00561 {
00562 if ((ii=(int*)REALLOC(ii,sizeof(int)*(ii[0]+ppget[0]+1)))== NULL ) return 0;
00563 pp=&ii[ii[0]+1];
00564 pp=memcpy(pp,&(ppget)[1],sizeof(int)*(ppget[0]));
00565 ii[0]=ii[0]+ppget[0];
00566 FREE(ppget);
00567 }
00568 for (j=1;j<ii[0]+1;j++)
00569 {
00570 l=ii[j];
00571 if ((*typ_z)[l]) {
00572 if ((*typ_z)[iii] == 0){
00573 (*typ_z)[iii]=1;
00574 fin=0;
00575 }
00576 }
00577 if ((*typ_x)[l]) {
00578 if (!(*typ_x)[iii]) {
00579 (*typ_x)[iii]=1;
00580 fin=0;
00581 }
00582 }
00583 if ((*typ_z)[iii] && (*typ_x)[iii]) break;
00584 }
00585 if (ii) FREE(ii);
00586 }
00587 }
00588
00589 FREE(ext_cord); ext_cord=NULL;
00590
00591 if ((*cord)[0] != 0)
00592 {
00593 if ((ppget=(int*)CALLOC((*cord)[0]/2+1,sizeof(int))) == NULL ) return 0;
00594 ppget[0]=(*cord)[0]/2;
00595 ppget1=VecEg1(ppget);
00596 for (i=1; i <= (*cord)[0]/2; i++){
00597 if ((*typ_z)[(*cord)[i]]) ppget[i]=1;
00598 if ((*typ_x)[(*cord)[i]]) ppget1[i]=1;
00599 }
00600 ii=FindDif(ppget,0);
00601 FREE(ppget);
00602 if (ii)
00603 {
00604 if (((*zord)=(int*)MALLOC(sizeof(int)*(2*ii[0]+1))) == NULL ) return 0;
00605 (*zord)[0]=2*ii[0];
00606 for(i=1;i<ii[0]+1;i++)
00607 {
00608 (*zord)[i]=(*cord)[ii[i]];
00609 (*zord)[i+ii[0]]=(*cord)[ii[i]+(*cord)[0]/2];
00610 }
00611 FREE(ii);
00612 }
00613 ii=FindDif(ppget1,0);
00614 FREE(ppget1);
00615 if (ii)
00616 {
00617 if (((*oord)=(int*)MALLOC(sizeof(int)*(2*ii[0]+1))) == NULL ) return 0;
00618 (*oord)[0]=2*ii[0];
00619 for(i=1;i<ii[0]+1;i++)
00620 {
00621 (*oord)[i]=(*cord)[ii[i]];
00622 (*oord)[i+ii[0]]=(*cord)[ii[i]+(*cord)[0]/2];
00623 }
00624 FREE(ii);
00625 }
00626 }
00627 else
00628 {
00629 *oord=NULL;
00630 *zord=NULL;
00631 }
00632
00633 FREE(*typ_z);
00634 (*typ_z)=VecEg1(typ_z_save);
00635 FREE(typ_z_save);
00636 ii=GetPartVect(ext_cord1,1,ext_cord1[0]/2);
00637 if ((ii=(int*)REALLOC(ii,sizeof(int)*(ext_cord1[0]/2+(*ordclk)[0]/2+1))) == NULL ) return 0;
00638 ii[0]=ext_cord1[0]/2+(*ordclk)[0]/2;
00639 pp=&ii[ext_cord1[0]/2+1];
00640 pp=memcpy(pp,&(*ordclk)[1],sizeof(int)*((*ordclk)[0]/2));
00641 maX=Max1(ii)+1;
00642 FREE(ii);
00643 ii=NULL;
00644 if ((cordX=(int*)MALLOC(sizeof(int)*(ext_cord1[0]/2+1))) == NULL ) return 0;
00645 cordX[0]=ext_cord1[0]/2;
00646 ii1=GetPartVect(ext_cord1,1,ext_cord1[0]/2);
00647 ii2=GetPartVect(ext_cord1,ext_cord1[0]/2+1,ext_cord1[0]/2);
00648 if (ii1 && ii2)
00649 {
00650 for(i=1;i<ext_cord1[0]/2+1;i++)
00651 {
00652 cordX[i]=maX*ii1[i]+ii2[i];
00653 }
00654 FREE(ii1);
00655 FREE(ii2);
00656 }
00657 if (ext_cord1) FREE(ext_cord1);
00658
00659 for (i=1;i<bllst5ptr[nblk+1];i++)
00660 {
00661 for (hh=ordptr1[i];hh<ordptr1[i+1];hh++)
00662 {
00663 jj=(*ordclk)[hh];
00664 if ((ii=(int*)MALLOC(sizeof(int)*(cordX[0]+1))) == NULL ) return 0;
00665 ii[0]=cordX[0];
00666 n=jj*maX+(*ordclk)[hh+(*ordclk)[0]/2];
00667 for (j=1;j<cordX[0]+1;j++)
00668 {
00669 if (cordX[j]==n) ii[j]=1;
00670 else ii[j]=0;
00671 }
00672 if (OR(ii))
00673 {
00674 (*ordclk)[hh+(*ordclk)[0]/2]=-(*ordclk)[hh+(*ordclk)[0]/2];
00675 }
00676 if(ii) FREE(ii);
00677 }
00678 }
00679 if(cordX) FREE(cordX);
00680 cordX=NULL;
00681
00682 return 0;
00683 }
00684
00685
00686 int paksazi(char*** bllst111,int** bllst112,int** bllst2,int** bllst3,int** bllst4,int** bllst5,int** bllst9,
00687 char*** bllst10,int** bllst12,int** nzcross,int** bllst2ptr,int** bllst3ptr,int** bllst4ptr,int** bllst5ptr,
00688 int** bllst9ptr,int** connectmat,int** clkconnect,int* typ_l,int* typ_m,int* done,int* ok,
00689 int* need_newblk,int** corinvec,int** corinvptr,int** critev,int* prime_pointer,int** prime_act)
00690 {
00691
00692 int i,j=1,k,l,o,leng,ki,sbb,m1,a;
00693 int *vectconnect,*iVect,*id,*dl,*ltmp,*idl,*lb,*indx,*tmpvect,*indxo,*indy,*bexe,*blnk;
00694 int *tmp,*clkconnecttmp,*clkconnect0,*texeclk0,*ind,*w2,*w1,*boptr,*blptr,*tclkconnect,*tcon,*ordptr1,*texeclki;
00695 int *b1,*typ_lm,*pointer,*r,*w3,*pointer1,*con,*vec,*clkconnectind,*connectmatind,*con1;
00696 int okk[1],nn=1,nblk=((int*) (*bllst10))[0];
00697 int nblkorg=nblk;
00698 int change=false;
00699 Mat4C clkconnecti,connectmati;
00700 Mat2C bllst12i;
00701 int bl_out;
00702 int *ptmp1,*ptmp2,*inter,*pp,*ppget;
00703 ptmp1=ptmp2=b1= typ_lm= pointer= r= w3= pointer1= con= vec= clkconnectind= connectmatind= con1=NULL;
00704 vectconnect=iVect= id= dl= ltmp= idl= lb= indx= tmpvect= indxo= indy= bexe= blnk=inter=NULL;
00705 tmp= clkconnecttmp= clkconnect0= texeclk0= ind= w2= w1= boptr= blptr= tclkconnect= tcon= ordptr1= texeclki=NULL;
00706 *ok=true;
00707
00708 if(*need_newblk)
00709 {
00710 vectconnect=GetPartVect((*clkconnect),(*clkconnect)[0]/2+1,(*clkconnect)[0]/4);
00711 Inv(vectconnect);
00712 if ((iVect=(int*)MALLOC(sizeof(int)*(vectconnect[0]+1))) == NULL ) return 0;
00713 iVect[0]=vectconnect[0];
00714 C2F(isort)(&vectconnect[1],&vectconnect[0],&iVect[1]);
00715 FREE(vectconnect);
00716 vectconnect=NULL;
00717 clkconnectind=VecEg1(*clkconnect);
00718 for(i=1;i<iVect[0]+1;i++)
00719 {
00720 (*clkconnect)[i]=clkconnectind[iVect[i]];
00721 (*clkconnect)[i+iVect[0]]=clkconnectind[iVect[i]+iVect[0]];
00722 (*clkconnect)[i+2*iVect[0]]=clkconnectind[iVect[i]+2*iVect[0]];
00723 (*clkconnect)[i+3*iVect[0]]=clkconnectind[iVect[i]+3*iVect[0]];
00724 }
00725 FREE(iVect);
00726 iVect=NULL;
00727 if(clkconnectind) FREE(clkconnectind);
00728 clkconnectind=NULL;
00729 if ((id=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
00730 id[0]=(*clkconnect)[0]/4;
00731 a=(*clkconnect)[0]/2;
00732 for(i=1;i<(*clkconnect)[0]/4+1;i++)
00733 {
00734 if(typ_l[(*clkconnect)[a+i]]==1) id[j++]=i;
00735 }
00736 id[0]=j-1;
00737 ltmp=GetCollVect(*clkconnect,id,3);
00738 if ((idl=(int*)MALLOC(sizeof(int)*(3+ltmp[0]))) == NULL ) return 0;
00739 idl[1]=1;
00740 j=2;
00741 for(i=1;i<ltmp[0];i++)
00742 {
00743 if(ltmp[i+1]-ltmp[i] != 0) idl[j++]=i+1;
00744 }
00745 idl[0]=j;
00746 idl[j]=1+ltmp[0];
00747 if(ltmp) FREE(ltmp);
00748 ki=0;
00749 lb=FindEg(typ_l,1);
00750 for(i=1;i<lb[0]+1;i++)
00751 {
00752 ki++;
00753 if (id[0] != 0) {
00754 indx=GetPartVect(id,idl[ki],idl[ki+1]-idl[ki]);
00755 } else { indx=NULL;}
00756 if (indx==NULL)
00757 {
00758 Message("A synchro block is inactive; cannot be compile");
00759 *ok=false;
00760 return 0;
00761 }
00762 if ((tmpvect=(int*)MALLOC(sizeof(int)*(indx[0]+1))) == NULL ) return 0;
00763 tmpvect[0]=indx[0];
00764 ppget=GetCollVect(*clkconnect,indx,1);
00765 for (l=1;l<ppget[0]+1;l++)
00766 {
00767 if (ppget[l]==lb[i]) tmpvect[l]=1;
00768 else tmpvect[l]=0;
00769 }
00770 FREE (ppget);
00771 if (OR(tmpvect))
00772 {
00773 Message("A algebric loop detected; on activation links");
00774 *ok=false;
00775 return 0;
00776 }
00777 FREE(tmpvect);
00778 tmpvect=NULL;
00779 *need_newblk=false;
00780 nn=indx[0];
00781 if (nn >= 2)
00782 {
00783 *need_newblk=true;
00784 ppget=GetPartVect(*clkconnect,1,(*clkconnect)[0]/4);
00785 indxo=FindEg(ppget,lb[i]);
00786 FREE(ppget);
00787 ppget=GetPartVect(*connectmat,(*connectmat)[0]/2+1,(*connectmat)[0]/4);
00788 indy=FindEg(ppget,lb[i]);
00789 FREE(ppget);
00790 if (indy[0] > 1) sciprint("Synchro block cannot have more than 1 input");
00791 if (((*bllst2ptr)=(int*)REALLOC((*bllst2ptr),sizeof(int)*((*bllst2ptr)[0]+nn))) == NULL ) return 0;
00792 if (((*bllst3ptr)=(int*)REALLOC((*bllst3ptr),sizeof(int)*((*bllst3ptr)[0]+nn))) == NULL ) return 0;
00793 if (((*bllst4ptr)=(int*)REALLOC((*bllst4ptr),sizeof(int)*((*bllst4ptr)[0]+nn))) == NULL ) return 0;
00794 if (((*bllst5ptr)=(int*)REALLOC((*bllst5ptr),sizeof(int)*((*bllst5ptr)[0]+nn))) == NULL ) return 0;
00795 if (((*bllst9ptr)=(int*)REALLOC((*bllst9ptr),sizeof(int)*((*bllst9ptr)[0]+nn))) == NULL ) return 0;
00796 if ((*bllst10=(char**)REALLOC(*bllst10,(nblk+nn)*sizeof(char*))) ==NULL ) return 0;
00797 ((int*)(*bllst10))[0]=nblk+nn-1;
00798 if ((*bllst111=(char**)REALLOC(*bllst111,sizeof(char*)*(nblk+nn))) == NULL ) return 0;
00799 ((int*) (*bllst111))[0]=nblk+nn-1;
00800 if (((*bllst112)=(int*)REALLOC((*bllst112),sizeof(int)*(nn+nblk))) == NULL ) return 0;
00801 (*bllst112)[0]=nblk+nn-1;
00802 if ((bllst12i.col1=(int*)MALLOC(sizeof(int)*(nblk+nn))) == NULL ) return 0;
00803 bllst12i.col1[0]=nblk+nn-1;
00804 if ((bllst12i.col2=(int*)MALLOC(sizeof(int)*(nblk+nn))) == NULL ) return 0;
00805 bllst12i.col2[0]=nblk+nn-1;
00806 if (((*bllst12)=(int*)REALLOC((*bllst12),sizeof(int)*(2*(nn+nblk)-1))) == NULL ) return 0;
00807 (*bllst12)[0]=2*(nblk+nn-1);
00808 if (((*corinvptr)=(int*)REALLOC((*corinvptr),sizeof(int)*((*corinvptr)[0]+nn))) == NULL ) return 0;
00809 if (((*corinvec)=(int*)REALLOC((*corinvec),sizeof(int)*((*corinvec)[0]+4*nn+1))) == NULL ) return 0;
00810 if (((*nzcross)=(int*)REALLOC((*nzcross),sizeof(int)*(nblk+nn))) == NULL ) return 0;
00811 (*nzcross)[0]=nblk+nn-1;
00812
00813 for(k=2;k<nn+1;k++)
00814 {
00815 if (((*critev)=(int*)REALLOC((*critev),sizeof(int)*((*critev)[0]+(*bllst5ptr)[lb[i]+1]-(*bllst5ptr)[lb[i]]+1))) == NULL ) return 0;
00816 a=(*critev)[0]-(*bllst5ptr)[lb[i]]+1;
00817 for(l=(*bllst5ptr)[lb[i]]; l<(*bllst5ptr)[lb[i]+1]; l++)
00818 (*critev)[l+a]=(*critev)[l];
00819 (*critev)[0]=(*critev)[0]+(*bllst5ptr)[lb[i]+1]-(*bllst5ptr)[lb[i]];
00820
00821 (*clkconnect)[indx[k]+(*clkconnect)[0]/2]=nblk+1;
00822
00823 if (((*bllst111)[nblk+1]=(char*) MALLOC(sizeof(char)*(strlen((*bllst111)[lb[i]])+1))) ==NULL ) return 0;
00824 ((char*) (*bllst111)[nblk+1])[strlen((*bllst111)[lb[i]])]='\0';
00825 strcpy((*bllst111)[nblk+1],(*bllst111)[lb[i]]);
00826 (*bllst112)[nblk+1]=(*bllst112)[lb[i]];
00827
00828 (*bllst2ptr)[(*bllst2ptr)[0]+1]=(*bllst2ptr)[(*bllst2ptr)[0]]+(*bllst2ptr)[lb[i]+1]-(*bllst2ptr)[lb[i]];
00829 (*bllst2ptr)[0]++;
00830 if (((*bllst2)=(int*)REALLOC((*bllst2),sizeof(int)*((*bllst2)[0]+(*bllst2ptr)[nblk+2]-(*bllst2ptr)[nblk+1]+1))) == NULL ) return 0;
00831 (*bllst2)[0]=(*bllst2)[0]+(*bllst2ptr)[nblk+2]-(*bllst2ptr)[nblk+1];
00832 a=(*bllst2ptr)[lb[i]]-(*bllst2ptr)[nblk+1];
00833 for(l=(*bllst2ptr)[nblk+1];l<(*bllst2ptr)[nblk+2];l++)
00834 {
00835 (*bllst2)[l]=(*bllst2)[a+l];
00836 }
00837 (*bllst3ptr)[(*bllst3ptr)[0]+1]=(*bllst3ptr)[(*bllst3ptr)[0]]+(*bllst3ptr)[lb[i]+1]-(*bllst3ptr)[lb[i]];
00838 (*bllst3ptr)[0]++;
00839 if (((*bllst3)=(int*)REALLOC((*bllst3),sizeof(int)*((*bllst3)[0]+(*bllst3ptr)[nblk+2]-(*bllst3ptr)[nblk+1]+1))) == NULL ) return 0;
00840 (*bllst3)[0]=(*bllst3)[0]+(*bllst3ptr)[nblk+2]-(*bllst3ptr)[nblk+1];
00841 a=(*bllst3ptr)[lb[i]]-(*bllst3ptr)[nblk+1];
00842 for(l=(*bllst3ptr)[nblk+1];l<=(*bllst3ptr)[nblk+2]-1;l++)
00843 {
00844 (*bllst3)[l]=(*bllst3)[a+l];
00845 }
00846 (*bllst4ptr)[(*bllst4ptr)[0]+1]=(*bllst4ptr)[(*bllst4ptr)[0]]+(*bllst4ptr)[lb[i]+1]-(*bllst4ptr)[lb[i]];
00847 (*bllst4ptr)[0]++;
00848 if (((*bllst4)=(int*)REALLOC((*bllst4),sizeof(int)*((*bllst4)[0]+(*bllst4ptr)[nblk+2]-(*bllst4ptr)[nblk+1]+1))) == NULL ) return 0;
00849 (*bllst4)[0]=(*bllst4)[0]+(*bllst4ptr)[nblk+2]-(*bllst4ptr)[nblk+1];
00850 a=(*bllst4ptr)[lb[i]]-(*bllst4ptr)[nblk+1];
00851 for(l=(*bllst4ptr)[nblk+1];l<=(*bllst4ptr)[nblk+2]-1;l++)
00852 {
00853 (*bllst4)[l]=(*bllst4)[a+l];
00854 }
00855 (*bllst5ptr)[(*bllst5ptr)[0]+1]=(*bllst5ptr)[(*bllst5ptr)[0]]+(*bllst5ptr)[lb[i]+1]-(*bllst5ptr)[lb[i]];
00856 (*bllst5ptr)[0]++;
00857 if (((*bllst5)=(int*)REALLOC((*bllst5),sizeof(int)*((*bllst5)[0]+(*bllst5ptr)[nblk+2]-(*bllst5ptr)[nblk+1]+1))) == NULL ) return 0;
00858 (*bllst5)[0]=(*bllst5)[0]+(*bllst5ptr)[nblk+2]-(*bllst5ptr)[nblk+1];
00859 a=(*bllst5ptr)[lb[i]]-(*bllst5ptr)[nblk+1];
00860 for(l=(*bllst5ptr)[nblk+1];l<=(*bllst5ptr)[nblk+2]-1;l++)
00861 {
00862 (*bllst5)[l]=(*bllst5)[a+l];
00863 }
00864 (*bllst9ptr)[(*bllst9ptr)[0]+1]=(*bllst9ptr)[(*bllst9ptr)[0]]+(*bllst9ptr)[lb[i]+1]-(*bllst9ptr)[lb[i]];
00865 (*bllst9ptr)[0]++;
00866 if (((*bllst9)=(int*)REALLOC((*bllst9),sizeof(int)*((*bllst9)[0]+(*bllst9ptr)[nblk+2]-(*bllst9ptr)[nblk+1]+1))) == NULL ) return 0;
00867 (*bllst9)[0]=(*bllst9)[0]+(*bllst9ptr)[nblk+2]-(*bllst9ptr)[nblk+1];
00868 a=(*bllst9ptr)[lb[i]]-(*bllst9ptr)[nblk+1];
00869 for(l=(*bllst9ptr)[nblk+1];l<=(*bllst9ptr)[nblk+2]-1;l++)
00870 {
00871 (*bllst9)[l]=(*bllst9)[a+l];
00872 }
00873
00874 if (((*bllst10)[nblk+1]=(char*)MALLOC(sizeof(char)*2)) ==NULL ) return 0;
00875 *(*bllst10)[nblk+1]=*(*bllst10)[lb[i]];
00876 (*bllst10)[nblk+1][1]='\0';
00877
00878 for (l=1;l<nblk+1;l++)
00879 {
00880 bllst12i.col1[l]=(*bllst12)[l];
00881 bllst12i.col2[l]=(*bllst12)[l+nblk];
00882 }
00883 bllst12i.col1[nblk+1]=(*bllst12)[lb[i]];
00884 bllst12i.col2[nblk+1]=(*bllst12)[lb[i]+nblk];
00885 for (l=1;l<nblk+2;l++)
00886 {
00887 (*bllst12)[l]=bllst12i.col1[l];
00888 (*bllst12)[l+nblk+1]=bllst12i.col2[l];
00889 }
00890 (*nzcross)[nblk+1]=(*nzcross)[lb[i]];
00891
00892 (*corinvptr)[(*corinvptr)[0]+1]=(*corinvptr)[(*corinvptr)[0]]+(*corinvptr)[lb[i]+1]-(*corinvptr)[lb[i]];
00893 (*corinvptr)[0]++;
00894 (*corinvec)[0]=(*corinvec)[0]+(*corinvptr)[nblk+2]-(*corinvptr)[nblk+1];
00895 a=(*corinvptr)[lb[i]]-(*corinvptr)[nblk+1];
00896 for(l=(*corinvptr)[nblk+1];l<(*corinvptr)[nblk+2];l++)
00897 {
00898 (*corinvec)[l]=(*corinvec)[a+l];
00899 }
00900
00901
00902 if ((tmp=(int*)MALLOC(sizeof(int)*(1+4*indxo[0]))) == NULL ) return 0;;
00903 tmp[0]=4*indxo[0];
00904 for(l=1;l<indxo[0]+1;l++)
00905 {
00906 tmp[l]=(*clkconnect)[indxo[l]];
00907 tmp[l+indxo[0]]=(*clkconnect)[indxo[l]+(*clkconnect)[0]/4];
00908 tmp[l+2*indxo[0]]=(*clkconnect)[indxo[l]+(*clkconnect)[0]/2];
00909 tmp[l+3*indxo[0]]=(*clkconnect)[indxo[l]+3*((*clkconnect)[0]/4)];
00910 }
00911
00912 leng=(*clkconnect)[0]/4;
00913 if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(leng+tmp[0]/4+1))) == NULL ) return 0;
00914 clkconnecti.col1[0]=leng+tmp[0]/4;
00915 if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(leng+1+tmp[0]/4))) == NULL ) return 0;
00916 clkconnecti.col2[0]=leng+tmp[0]/4;
00917 if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(leng+1+tmp[0]/4))) == NULL ) return 0;
00918 clkconnecti.col3[0]=leng+tmp[0]/4;
00919 if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(leng+1+tmp[0]/4))) == NULL ) return 0;
00920 clkconnecti.col4[0]=leng+tmp[0]/4;
00921 for(l=1;l<leng+1;l++)
00922 {
00923 clkconnecti.col1[l]=(*clkconnect)[l];
00924 clkconnecti.col2[l]=(*clkconnect)[l+leng];
00925 clkconnecti.col3[l]=(*clkconnect)[l+leng*2];
00926 clkconnecti.col4[l]=(*clkconnect)[l+leng*3];
00927 }
00928 for(l=1;l<tmp[0]/4+1;l++)
00929 {
00930 clkconnecti.col1[l+leng]=nblk+1;
00931 clkconnecti.col2[l+leng]=tmp[l+tmp[0]/4];
00932 clkconnecti.col3[l+leng]=tmp[l+tmp[0]/2];
00933 clkconnecti.col4[l+leng]=tmp[l+3*tmp[0]/4];
00934 }
00935 FREE(*clkconnect);
00936 if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*leng+tmp[0]+1))) == NULL ) return 0;
00937 (*clkconnect)[0]=4*leng+tmp[0];
00938 if(tmp) FREE(tmp);
00939 for(l=1;l<(*clkconnect)[0]/4+1;l++)
00940 {
00941 (*clkconnect)[l]=clkconnecti.col1[l];
00942 (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
00943 (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
00944 (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
00945 }
00946 nblk++;
00947 FREE(clkconnecti.col1);
00948 clkconnecti.col1=NULL;
00949 FREE(clkconnecti.col2);
00950 clkconnecti.col2=NULL;
00951 FREE(clkconnecti.col3);
00952 clkconnecti.col3=NULL;
00953 FREE(clkconnecti.col4);
00954 clkconnecti.col4=NULL;
00955 }
00956 FREE(bllst12i.col1);
00957 FREE(bllst12i.col2);
00958 leng=(*connectmat)[0]/4;
00959 if ((connectmati.col1=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00960 connectmati.col1[0]=leng+nn-1;
00961 if ((connectmati.col2=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00962 connectmati.col2[0]=leng+nn-1;
00963 if ((connectmati.col3=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00964 connectmati.col3[0]=leng+nn-1;
00965 if ((connectmati.col4=(int*)MALLOC(sizeof(int)*(leng+nn))) == NULL ) return 0;
00966 connectmati.col4[0]=leng+nn-1;
00967 for(l=1;l<leng+1;l++)
00968 {
00969 connectmati.col1[l]=(*connectmat)[l];
00970 connectmati.col2[l]=(*connectmat)[l+leng];
00971 connectmati.col3[l]=(*connectmat)[l+2*leng];
00972 connectmati.col4[l]=(*connectmat)[l+3*leng];
00973 }
00974 for (l=1;l<nn;l++)
00975 {
00976 connectmati.col1[l+leng]=connectmati.col1[indy[1]];
00977 connectmati.col2[l+leng]=connectmati.col2[indy[1]];
00978 connectmati.col3[l+leng]=nblkorg+l;
00979 connectmati.col4[l+leng]=1;
00980 }
00981 FREE(*connectmat);
00982 leng=4*connectmati.col1[0];
00983 if (((*connectmat)=(int*)MALLOC(sizeof(int)*(leng+1))) == NULL ) return 0;
00984 (*connectmat)[0]=leng;
00985 for(l=1;l<(*connectmat)[0]/4+1;l++)
00986 {
00987 (*connectmat)[l]=connectmati.col1[l];
00988 (*connectmat)[l+(*connectmat)[0]/4]=connectmati.col2[l];
00989 (*connectmat)[l+(*connectmat)[0]/2]=connectmati.col3[l];
00990 (*connectmat)[l+3*(*connectmat)[0]/4]=connectmati.col4[l];
00991 }
00992 change=true;
00993 nblkorg=nblk;
00994 FREE(connectmati.col1);
00995 connectmati.col1=NULL;
00996 FREE(connectmati.col2);
00997 connectmati.col2=NULL;
00998 FREE(connectmati.col3);
00999 connectmati.col3=NULL;
01000 FREE(connectmati.col4);
01001 connectmati.col4=NULL;
01002 if (indy) {FREE(indy);
01003 indy=NULL;}
01004 if (indxo) {FREE(indxo);
01005 indxo=NULL;}
01006 }
01007 FREE(indx);
01008 indx=NULL;
01009 }
01010 if (change)
01011 {
01012 *done=false;
01013 FREE(lb);
01014 FREE(idl);
01015 FREE(id);
01016 return 0;
01017 }
01018 if(lb) FREE(lb);
01019 if (idl) {FREE(idl);
01020 idl=NULL;}
01021 FREE(id);
01022 }
01023
01024 clkconnecttmp=VecEg1(*clkconnect);
01025 a=clkconnecttmp[0]/4;
01026 if ((ppget=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
01027 if ((idl=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
01028 j=k=1;
01029 for(l=1;l<a+1;l++)
01030 {
01031 if(clkconnecttmp[l] != 0) ppget[j++]=l;
01032 else idl[k++]=l;
01033 }
01034 ppget[0]=j-1;
01035 idl[0]=k-1;
01036 FREE(*clkconnect);
01037 if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*ppget[0]+1))) == NULL ) return 0;
01038 (*clkconnect)[0]=4*ppget[0];
01039 for(l=1;l<ppget[0]+1;l++)
01040 {
01041 (*clkconnect)[l]=clkconnecttmp[ppget[l]];
01042 (*clkconnect)[l+ppget[0]]=clkconnecttmp[ppget[l]+a];
01043 (*clkconnect)[l+2*ppget[0]]=clkconnecttmp[ppget[l]+2*a];
01044 (*clkconnect)[l+3*ppget[0]]=clkconnecttmp[ppget[l]+3*a];
01045 }
01046 FREE(ppget);
01047 if(!idl)
01048 {
01049 if ((idl=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01050 idl[0]=0;
01051 }
01052 if ((clkconnect0=(int*)MALLOC(sizeof(int)*(4*idl[0]+1))) == NULL ) return 0;
01053 clkconnect0[0]=4*idl[0];
01054 for(l=1;l<idl[0]+1;l++)
01055 {
01056 clkconnect0[l]=clkconnecttmp[idl[l]];
01057 clkconnect0[l+idl[0]]=clkconnecttmp[idl[l]+a];
01058 clkconnect0[l+2*idl[0]]=clkconnecttmp[idl[l]+2*a];
01059 clkconnect0[l+3*idl[0]]=clkconnecttmp[idl[l]+3*a];
01060 }
01061 if(clkconnecttmp) FREE(clkconnecttmp);
01062 FREE(idl);
01063 inter=GetPartVect(clkconnect0,1,clkconnect0[0]/4);
01064 if(!inter)
01065 {
01066 if ((inter=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01067 inter[0]=0;
01068 }
01069 idl=FindEg(inter,0);
01070 FREE(inter);
01071 inter=NULL;
01072 if(!idl)
01073 {
01074 if ((idl=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01075 idl[0]=0;
01076 }
01077 if ((texeclk0=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
01078 texeclk0[0]=idl[0];
01079 a=clkconnect0[0]/2;
01080 for (l=1;l<idl[0]+1;l++)
01081 {
01082 texeclk0[l]=clkconnect0[idl[l]+a];
01083 }
01084 FREE(idl);
01085 if ((con=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
01086 con[0]=(*clkconnect)[0]/4;
01087 for(l=1;l<con[0]+1;l++)
01088 {
01089 con[l]=-((*bllst5ptr)[(*clkconnect)[l]]+(*clkconnect)[l+(*clkconnect)[0]/4]-1);
01090 }
01091 if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01092 ind[0]=con[0];
01093 C2F(isort)(&con[1],&con[0],&ind[1]);
01094 Inv(con);
01095 clkconnectind=VecEg1(*clkconnect);
01096 for(l=1;l<ind[0]+1;l++)
01097 {
01098 (*clkconnect)[l]=clkconnectind[ind[l]];
01099 (*clkconnect)[l+ind[0]]=clkconnectind[ind[l]+ind[0]];
01100 (*clkconnect)[l+2*ind[0]]=clkconnectind[ind[l]+2*ind[0]];
01101 (*clkconnect)[l+3*ind[0]]=clkconnectind[ind[l]+3*ind[0]];
01102 }
01103 FREE(clkconnectind);
01104 clkconnectind=NULL;
01105 FREE(ind);
01106 bexe=GetPartVect(*clkconnect,(*clkconnect)[0]/2+1,(*clkconnect)[0]/4);
01107 sbb=(*clkconnect)[0]/4;
01108 if ((idl=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01109 idl[0]=sbb;
01110 for(l=1;l<sbb+1;l++)
01111 {
01112 idl[l]=l;
01113 }
01114 if ((w2=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01115 w2[0]=sbb;
01116 w2[1]=(*clkconnect)[1];
01117 for(l=1;l<sbb;l++)
01118 {
01119 w2[l+1]=(*clkconnect)[l+1]-(*clkconnect)[l];
01120 }
01121 boptr=Duplicataa(idl,w2);
01122 FREE(w2);
01123 w2=NULL;
01124 if(idl) FREE(idl);
01125 if ((boptr=(int*)REALLOC(boptr,sizeof(int)*(nblk+2))) == NULL ) return 0;
01126 a=sbb+1;
01127 for (l=1;l<nblk-boptr[0]+2;l++)
01128 {
01129 boptr[l+boptr[0]]=a;
01130 }
01131 boptr[0]=nblk+1;
01132 ptmp1=GetPartVect(*connectmat,(*connectmat)[0]/4+1,(*connectmat)[0]/4);
01133 m1=Max1(ptmp1);
01134 if ((w1=(int*)MALLOC(sizeof(int)*((*connectmat)[0]/4+1))) == NULL ) return 0;
01135 w1[0]=(*connectmat)[0]/4;
01136 for (l=1;l<w1[0]+1;l++)
01137 {
01138 w1[l]=-m1*(*connectmat)[l]-(*connectmat)[l+(*connectmat)[0]/4]+1;
01139 }
01140 FREE (ptmp1);
01141 if ((ind=(int*)MALLOC(sizeof(int)*(w1[0]+1))) == NULL ) return 0;
01142 ind[0]=w1[0];
01143 C2F(isort)(&w1[1],&w1[0],&ind[1]);
01144 FREE(w1);
01145 w1=NULL;
01146 connectmatind=VecEg1(*connectmat);
01147 for(l=1;l<ind[0]+1;l++)
01148 {
01149 (*connectmat)[l]=connectmatind[ind[l]];
01150 (*connectmat)[l+ind[0]]=connectmatind[ind[l]+ind[0]];
01151 (*connectmat)[l+2*ind[0]]=connectmatind[ind[l]+2*ind[0]];
01152 (*connectmat)[l+3*ind[0]]=connectmatind[ind[l]+3*ind[0]];
01153 }
01154 FREE(connectmatind);
01155 connectmatind=NULL;
01156 FREE(ind);
01157 blnk=GetPartVect(*connectmat,(*connectmat)[0]/2+1,(*connectmat)[0]/4);
01158 sbb=(*connectmat)[0]/4;
01159 if ((idl=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01160 idl[0]=sbb;
01161 for(l=1;l<sbb+1;l++)
01162 {
01163 idl[l]=l;
01164 }
01165 if ((w2=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01166 w2[0]=sbb;
01167 w2[1]=(*connectmat)[1];
01168 for(l=1;l<sbb;l++)
01169 {
01170 w2[l+1]=(*connectmat)[l+1]-(*connectmat)[l];
01171 }
01172 blptr=Duplicataa(idl,w2);
01173 FREE(w2);
01174 FREE(idl);
01175 idl=NULL;
01176 if ((blptr=(int*)REALLOC(blptr,sizeof(int)*(nblk+2))) == NULL ) return 0;
01177 a=sbb+1;
01178 for (l=1;l<nblk-blptr[0]+2;l++)
01179 {
01180 blptr[l+blptr[0]]=a;
01181 }
01182 blptr[0]=nblk+1;
01183 if ((w1=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
01184 w1[0]=(*clkconnect)[0]/4;
01185 w2=GetPartVect(*clkconnect,1,(*clkconnect)[0]/4);
01186 for (l=1;l<w1[0]+1;l++)
01187 {
01188 w1[l]=typ_l[w2[l]];
01189 }
01190 FREE(w2);
01191 w2=FindEg(w1,0);
01192 FREE(w1);
01193 w1=NULL;
01194 if ((tclkconnect=(int*)MALLOC(sizeof(int)*(4*w2[0]+1))) == NULL ) return 0;
01195 tclkconnect[0]=4*w2[0];
01196 for(l=1;l<w2[0]+1;l++)
01197 {
01198 tclkconnect[l]=(*clkconnect)[w2[l]];
01199 tclkconnect[l+w2[0]]=(*clkconnect)[w2[l]+(*clkconnect)[0]/4];
01200 tclkconnect[l+2*w2[0]]=(*clkconnect)[w2[l]+(*clkconnect)[0]/2];
01201 tclkconnect[l+3*w2[0]]=(*clkconnect)[w2[l]+3*(*clkconnect)[0]/4];
01202 }
01203 if(w2) FREE(w2);
01204 w2=NULL;
01205 if ((tcon=(int*)MALLOC(sizeof(int)*(tclkconnect[0]/4+1))) == NULL ) return 0;
01206 tcon[0]=tclkconnect[0]/4;
01207 w1=GetPartVect(tclkconnect,1,tclkconnect[0]/4);
01208 w2=GetPartVect(tclkconnect,tclkconnect[0]/4+1,tclkconnect[0]/4);
01209 for(l=1;l<tcon[0]+1;l++)
01210 {
01211 tcon[l]=(*bllst5ptr)[w1[l]]+w2[l]-1;
01212 }
01213 FREE(w1);
01214 w1=NULL;
01215 FREE(w2);
01216 w2=NULL;
01217 sbb=tcon[0];
01218 if ((idl=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01219 idl[0]=sbb;
01220 for(l=1;l<sbb+1;l++)
01221 {
01222 idl[l]=l;
01223 }
01224 if ((w2=(int*)MALLOC(sizeof(int)*(sbb+1))) == NULL ) return 0;
01225 w2[0]=sbb;
01226 w2[1]=tcon[1];
01227 for(l=1;l<sbb;l++)
01228 {
01229 w2[l+1]=tcon[l+1]-tcon[l];
01230 }
01231 FREE(tcon);
01232 ordptr1=Duplicataa(idl,w2);
01233 FREE(w2);
01234 w2=NULL;
01235 FREE(idl);
01236 if ((ordptr1=(int*)REALLOC(ordptr1,sizeof(int)*((*bllst5ptr)[(*bllst5ptr)[0]-nn+1]+1))) == NULL ) return 0;
01237 a=sbb+1;
01238 for(l=1;l<(*bllst5ptr)[(*bllst5ptr)[0]-nn+1]-ordptr1[0]+1;l++)
01239 {
01240 ordptr1[l+ordptr1[0]]=a;
01241 }
01242 ordptr1[0]=(*bllst5ptr)[(*bllst5ptr)[0]-nn+1];
01243 leng=clkconnect0[0]/4;
01244 if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01245 clkconnecti.col1[0]=leng+(*clkconnect)[0]/4;
01246 if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01247 clkconnecti.col2[0]=leng+(*clkconnect)[0]/4;
01248 if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01249 clkconnecti.col3[0]=leng+(*clkconnect)[0]/4;
01250 if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(leng+(*clkconnect)[0]/4+1))) == NULL ) return 0;
01251 clkconnecti.col4[0]=leng+(*clkconnect)[0]/4;
01252
01253 for(l=1;l<clkconnect0[0]/4+1;l++)
01254 {
01255 clkconnecti.col1[l]=clkconnect0[l];
01256 clkconnecti.col2[l]=clkconnect0[l+clkconnect0[0]/4];
01257 clkconnecti.col3[l]=clkconnect0[l+clkconnect0[0]/2];
01258 clkconnecti.col4[l]=clkconnect0[l+3*clkconnect0[0]/4];
01259 }
01260 for(l=1;l<(*clkconnect)[0]/4+1;l++)
01261 {
01262 clkconnecti.col1[l+clkconnect0[0]/4]=(*clkconnect)[l];
01263 clkconnecti.col2[l+clkconnect0[0]/4]=(*clkconnect)[l+(*clkconnect)[0]/4];
01264 clkconnecti.col3[l+clkconnect0[0]/4]=(*clkconnect)[l+(*clkconnect)[0]/2];
01265 clkconnecti.col4[l+clkconnect0[0]/4]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
01266 }
01267 FREE(*clkconnect);
01268 if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col4[0]+1))) == NULL ) return 0;
01269 (*clkconnect)[0]=4*clkconnecti.col4[0];
01270 for(l=1;l<clkconnecti.col4[0]+1;l++)
01271 {
01272 (*clkconnect)[l]=clkconnecti.col1[l];
01273 (*clkconnect)[l+clkconnecti.col4[0]]=clkconnecti.col2[l];
01274 (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
01275 (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
01276 }
01277 FREE(clkconnecti.col1);
01278 FREE(clkconnecti.col2);
01279 FREE(clkconnecti.col3);
01280 FREE(clkconnecti.col4);
01281 con1=VecEg1(con);
01282 FREE(con);
01283 if ((con=(int*)MALLOC(sizeof(int)*(con1[0]+clkconnect0[0]/4+1))) == NULL ) return 0;
01284 con[0]=con1[0]+clkconnect0[0]/4;
01285 pp=&con[clkconnect0[0]/4+1];
01286 pp=memcpy(pp,&con1[1],sizeof(int)*(con1[0]));
01287 FREE(con1);
01288 for(l=1;l<clkconnect0[0]/4+1;l++)
01289 {
01290 con[l]=0;
01291 }
01292 FREE(clkconnect0);
01293
01294 while ( *prime_pointer <= (*prime_act)[0]){
01295 o=(*prime_act)[*prime_pointer];
01296 (*prime_pointer)++;
01297 if (o==0)
01298 {
01299 texeclki=VecEg1(texeclk0);
01300 FREE(texeclk0);
01301 }
01302 else
01303 {
01304 w1=GetPartVect(tclkconnect,tclkconnect[0]/2+1,tclkconnect[0]/4);
01305 texeclki=GetPartVect(w1,ordptr1[o],ordptr1[o+1]-ordptr1[o]);
01306 if(w1) FREE(w1);
01307 }
01308 if (!texeclki)
01309 {
01310 if ((texeclki=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
01311 texeclki[0]=0;
01312 }
01313 if ((idl=(int*)MALLOC(sizeof(int)*(texeclki[0]+1))) == NULL ) return 0;
01314 idl[0]=texeclki[0];
01315 for(l=1;l<texeclki[0]+1;l++)
01316 {
01317 idl[l]=typ_l[texeclki[l]];
01318 }
01319 if ( OR(idl) )
01320 {
01321 if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
01322 vec[0]=nblk;
01323 Setmem(vec,-1);
01324 for (l=1;l<texeclki[0]+1;l++)
01325 {
01326 vec[texeclki[l]]=0;
01327 }
01328 if ((typ_lm=(int*)MALLOC(sizeof(int)*(typ_l[0]+1))) == NULL ) return 0;
01329 typ_lm[0]=typ_l[0];
01330 for(l=1;l<typ_l[0]+1;l++)
01331 {
01332 if (typ_l[l]) typ_lm[l]=1;
01333 else
01334 {
01335 if (typ_m[l]) typ_lm[l]=-1;
01336 else typ_lm[l]=0;
01337 }
01338 }
01339 tree3(vec,vec[0],*bllst12,typ_lm,bexe,boptr,blnk,blptr,&r,okk);
01340 FREE(typ_lm);
01341 FREE(vec);
01342 if (!*okk)
01343 {
01344 Message("Algebraic loop detected; cannot be compiled.");
01345 *bllst2=NULL;*bllst3=NULL;**bllst10=NULL;
01346 *ok=false;
01347 *done=true;
01348 return 0;
01349 }
01350 pointer=FindEg(con,o);
01351 for(j=1;j<r[0]+1;j++)
01352 {
01353 if (typ_l[r[j]])
01354 {
01355
01356 *((*bllst10)[r[j]])='s';
01357 typ_l[r[j]]=false;
01358
01359 if ((vec=MALLOC(sizeof(int)*((*bllst5ptr)[r[j]+1]-(*bllst5ptr)[r[j]]+1)))== NULL ) return 0;
01360 vec[0]=(*bllst5ptr)[r[j]+1]-(*bllst5ptr)[r[j]];
01361 if ((*prime_act=(int*)REALLOC(*prime_act,sizeof(int)*((*prime_act)[0]+vec[0]+1))) == NULL ) return 0;
01362 for (l = 1; l <= vec[0]; l++){
01363 (*prime_act)[(*prime_act)[0]+l]=(*bllst5ptr)[r[j]]+l-1;
01364 }
01365 (*prime_act)[0]=(*prime_act)[0]+vec[0];
01366 FREE(vec);
01367
01368 w1=GetCollVect(*clkconnect,pointer,3);
01369 w2=FindDif(w1,r[j]);
01370 pointer1=VecEg1(pointer);
01371 if(pointer) FREE(pointer);
01372 pointer=NULL;
01373 if ((pointer=(int*)MALLOC(sizeof(int)*(w2[0]+1))) == NULL ) return 0;
01374 pointer[0]=w2[0];
01375 for(l=1;l<w2[0]+1;l++)
01376 {
01377 pointer[l]=pointer1[w2[l]];
01378 }
01379 if(w1) FREE(w1);
01380 w1=NULL;
01381 if(w2) FREE(w2);
01382 FREE(pointer1);
01383 w1=GetCollVect(*clkconnect,pointer,3);
01384 w3=GetCollVect(*clkconnect,pointer,4);
01385 for (l=1;l<pointer[0]+1;l++)
01386 {
01387 (*clkconnect)[pointer[l]]=r[j];
01388 (*clkconnect)[pointer[l]+(*clkconnect)[0]/4]=1;
01389 (*clkconnect)[pointer[l]+(*clkconnect)[0]/2]=w1[l];
01390 (*clkconnect)[pointer[l]+3*(*clkconnect)[0]/4]=w3[l];
01391 }
01392 if(w1) FREE(w1);
01393 if(w3) FREE(w3);
01394 for (bl_out=2;bl_out<(*bllst5ptr)[r[j]+1]-(*bllst5ptr)[r[j]]+1;bl_out++)
01395 {
01396 leng=(*clkconnect)[0]/4;
01397 if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01398 clkconnecti.col1[0]=leng+pointer[0];
01399 if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01400 clkconnecti.col2[0]=leng+pointer[0];
01401 if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01402 clkconnecti.col3[0]=leng+pointer[0];
01403 if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(leng+pointer[0]+1))) == NULL ) return 0;
01404 clkconnecti.col4[0]=leng+pointer[0];
01405 for(l=1;l<(*clkconnect)[0]/4+1;l++)
01406 {
01407 clkconnecti.col1[l]=(*clkconnect)[l];
01408 clkconnecti.col2[l]=(*clkconnect)[l+(*clkconnect)[0]/4];
01409 clkconnecti.col3[l]=(*clkconnect)[l+(*clkconnect)[0]/2];
01410 clkconnecti.col4[l]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
01411 }
01412 w1=GetCollVect(*clkconnect,pointer,3);
01413 w3=GetCollVect(*clkconnect,pointer,4);
01414 for(l=1;l<pointer[0]+1;l++)
01415 {
01416 clkconnecti.col1[l+(*clkconnect)[0]/4]=r[j];
01417 clkconnecti.col2[l+(*clkconnect)[0]/4]=bl_out;
01418 clkconnecti.col3[l+(*clkconnect)[0]/4]=w1[l];
01419 clkconnecti.col4[l+(*clkconnect)[0]/4]=w3[l];
01420 }
01421 if(w1) FREE(w1);
01422 if(w3) FREE(w3);
01423 FREE(*clkconnect);
01424 if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
01425 (*clkconnect)[0]=4*clkconnecti.col1[0];
01426 for(l=1;l<(*clkconnect)[0]/4+1;l++)
01427 {
01428 (*clkconnect)[l]=clkconnecti.col1[l];
01429 (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
01430 (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
01431 (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
01432 }
01433 FREE(clkconnecti.col1);
01434 clkconnecti.col1=NULL;
01435 FREE(clkconnecti.col2);
01436 clkconnecti.col2=NULL;
01437 FREE(clkconnecti.col3);
01438 clkconnecti.col3=NULL;
01439 FREE(clkconnecti.col4);
01440 clkconnecti.col4=NULL;
01441 }
01442 *need_newblk=true;
01443 *ok=true;
01444 *done=false;
01445 FREE(r);
01446 FREE(pointer);
01447 FREE(idl);
01448 FREE (texeclki);
01449 FREE(bexe);
01450 FREE(blnk);
01451 FREE(boptr);
01452 FREE(blptr);
01453 FREE(tclkconnect);
01454 FREE(ordptr1);
01455 FREE(con);
01456 return 0;
01457 }
01458 else
01459 {
01460 w1=GetCollVect(*clkconnect,pointer,3);
01461 w2=FindDif(w1,r[j]);
01462 if (w1) FREE(w1);
01463 pointer1=VecEg1(pointer);
01464 FREE(pointer);
01465 if ((pointer=(int*)MALLOC(sizeof(int)*(w2[0]+1))) == NULL ) return 0;
01466 pointer[0]=w2[0];
01467 for(l=1;l<w2[0]+1;l++)
01468 {
01469 pointer[l]=pointer1[w2[l]];
01470 }
01471 FREE(pointer1);
01472 if (w2) FREE(w2);
01473 }
01474 }
01475 FREE(r);
01476 }
01477 if (pointer && pointer[0] != 0)
01478 {
01479 FREE(pointer);
01480 sciprint("warning(problem1)");
01481 return 0;
01482 }
01483 FREE(idl);
01484 FREE (texeclki);
01485 }
01486 if ( OR(typ_l) )
01487 {
01488 sciprint("warning(problem2)");
01489 }
01490
01491 *ok=true;
01492 *done=true;
01493 FREE(bexe);
01494 FREE(blnk);
01495 FREE(boptr);
01496 FREE(blptr);
01497 FREE(tclkconnect);
01498 FREE(ordptr1);
01499 FREE(con);
01500
01501 return 0;
01502 }
01503
01504
01505 void *discard(int* bllst5ptr,int* clkconnect,int* exe_cons,int** ordptr1,int** execlk,int** clkconnectj0,
01506 int** clkconnectj_cons )
01507 {
01508
01509 int mma,j,m,l,a,b,k,sum;
01510 int *clkconnectj,*con,*ind,*con1,*iini,*clkconnectj1,*clkconnecttmp,*clkconnect0;
01511 int *clkconnectjj,*new_ordptr1,*clkconnectjind,*clkconnectj3,*clkconnectj4;
01512 int *clkconnectjind3,*clkconnectjind4;
01513 double *clkconnectjd;
01514 int *ppget;
01515 Mat2C execlki;
01516 *clkconnectj0=NULL;
01517 *clkconnectj_cons=NULL;
01518 clkconnectjj=NULL;
01519 execlki.col1=NULL;
01520 execlki.col2=NULL;
01521 *execlk=NULL;
01522 clkconnectjd=NULL;
01523 con=NULL;
01524 ind=NULL;
01525 con1=NULL;
01526 iini=NULL;
01527 clkconnectj1=NULL;
01528 clkconnecttmp=NULL;
01529 clkconnect0=NULL;
01530 clkconnectj=NULL;
01531 clkconnectjind=NULL;
01532 execlki.col1=NULL;
01533 execlki.col2=NULL;
01534 clkconnectj3=NULL;
01535 clkconnectj4=NULL;
01536 clkconnectjind3=NULL;
01537 clkconnectjind4=NULL;
01538 if (exe_cons && exe_cons[0] !=0 )
01539 {
01540 a=exe_cons[0]/2;
01541 ppget=GetPartVect(exe_cons,a+1,a);
01542 mma=Max1(ppget)+1;
01543 FREE(ppget);
01544 if ((con=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
01545 con[0]=a;
01546 for(j=1;j<a+1;j++)
01547 {
01548 con[j]=-mma*exe_cons[j]-exe_cons[j+a];
01549 }
01550 if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01551 ind[0]=con[0];
01552 C2F(isort)(&con[1],&con[0],&ind[1]);
01553 Inv(con);
01554 clkconnectjind=VecEg1(exe_cons);
01555 for(j=1;j<ind[0]+1;j++)
01556 {
01557 exe_cons[j]=clkconnectjind[ind[j]];
01558 exe_cons[j+ind[0]]=clkconnectjind[ind[j]+ind[0]];
01559 }
01560
01561 FREE(clkconnectjind);
01562 clkconnectjind=NULL;
01563 FREE(ind);
01564 ind=NULL;
01565 if (con[0]>=2)
01566 {
01567 if ((con1=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01568 k=1;
01569 for(j=1; j < con[0]; j++)
01570 {
01571 if ((con[j+1] - con[j]) == 0) con1[k++]=j;
01572 }
01573 con1[0]=k-1;
01574 if (con1)
01575 {
01576 for(j=con1[0];j>0;j--)
01577 {
01578 Incr2(exe_cons,con1[j]);
01579 }
01580 FREE(con1);con1=NULL;
01581 }
01582 }
01583 FREE(con);con=NULL;
01584 a=exe_cons[0]/2;
01585 if ((clkconnectjd=(double*)MALLOC(sizeof(double)*(a+1))) == NULL) return 0;
01586 clkconnectjd[0]=a;
01587 for(j=1;j<a+1;j++)
01588 {
01589
01590 clkconnectjd[j]=powerd(2,exe_cons[j+a]-1);
01591 exe_cons[j+a]=(int) clkconnectjd[j];
01592 }
01593 FREE(clkconnectjd);
01594 clkconnectjd=NULL;
01595 con=GetPartVect(exe_cons,1,a);
01596 if (con[0]>=2)
01597 {
01598 if ((iini=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01599 k=1;
01600 for(j=1; j < con[0]; j++)
01601 {
01602 if((con[j+1]-con[j]) != 0) iini[k++]=j;
01603 }
01604 iini[0]=k-1;
01605 if ((iini=(int*)REALLOC(iini,sizeof(int)*(iini[0]+2))) == NULL) return 0;
01606 iini[iini[0]+1]=a;
01607 iini[0]++;
01608 }
01609 else
01610 {
01611 if ((iini=(int*)MALLOC(sizeof(int)*(2))) == NULL) return 0;
01612 iini[0]=1;
01613 iini[1]=1;
01614 }
01615 if (((*clkconnectj_cons)=(int*)MALLOC(sizeof(int)*(2*iini[0]+1))) == NULL) return 0;
01616 (*clkconnectj_cons)[0]=2*iini[0];
01617
01618 for (j=1;j<iini[0]+1;j++)
01619 {
01620 ind=FindEg(con,con[iini[j]]);
01621 (*clkconnectj_cons)[j]=con[iini[j]];
01622 sum=0;
01623 for(l=1; l < ind[0]+1; l++)
01624 {
01625 sum+=exe_cons[ind[l]+a];
01626 }
01627
01628 (*clkconnectj_cons)[j+iini[0]]=sum;
01629 FREE(ind);ind=NULL;
01630 }
01631 FREE(con); con=NULL;
01632 FREE(iini); iini=NULL;
01633 }
01634 else
01635 {
01636 if ((*clkconnectj_cons))
01637 {
01638 FREE((*clkconnectj_cons));
01639 (*clkconnectj_cons)=NULL;
01640 }
01641 }
01642
01643 if(clkconnect[0] !=0)
01644 {
01645 clkconnecttmp=VecEg1(clkconnect);
01646 a=clkconnecttmp[0]/4;
01647 ppget=GetPartVect(clkconnecttmp,1,a);
01648 ind=FindDif(ppget,0);
01649 FREE(ppget);
01650 if ((clkconnect=(int*)MALLOC(sizeof(int)*(4*ind[0]+1))) == NULL) return 0;
01651 clkconnect[0]=4*ind[0];
01652 for(l=1;l<ind[0]+1;l++)
01653 {
01654 clkconnect[l]=clkconnecttmp[ind[l]];
01655 clkconnect[l+ind[0]]=clkconnecttmp[ind[l]+a];
01656 clkconnect[l+2*ind[0]]=clkconnecttmp[ind[l]+clkconnecttmp[0]/2];
01657 clkconnect[l+3*ind[0]]=clkconnecttmp[ind[l]+3*a];
01658 }
01659 if(ind) FREE(ind);
01660 ind=NULL;
01661 ppget=GetPartVect(clkconnecttmp,1,a);
01662 ind=FindEg(ppget,0);
01663 FREE(ppget);
01664 if (ind)
01665 {
01666 if ((clkconnect0=(int*)MALLOC(sizeof(int)*(4*ind[0]+1))) == NULL) return 0;
01667 clkconnect0[0]=4*ind[0];
01668 for(l=1;l<ind[0]+1;l++)
01669 {
01670 clkconnect0[l]=clkconnecttmp[ind[l]];
01671 clkconnect0[l+ind[0]]=clkconnecttmp[ind[l]+a];
01672 clkconnect0[l+2*ind[0]]=clkconnecttmp[ind[l]+clkconnecttmp[0]/2];
01673 clkconnect0[l+3*ind[0]]=clkconnecttmp[ind[l]+3*a];
01674 }
01675 FREE(ind);
01676 ind=NULL;
01677 }
01678 FREE(clkconnecttmp);clkconnecttmp=NULL;
01679 if (clkconnect0 && clkconnect0[0] != 0)
01680 {
01681 a=clkconnect0[0]/4;
01682 clkconnectj3=GetPartVect(clkconnect0,a+a+1,a);
01683 clkconnectj4=GetPartVect(clkconnect0,3*a+1,a);
01684 mma=Max1(clkconnectj4)+1;
01685 if ((con=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
01686 con[0]=a;
01687 for(j=1;j<a+1;j++)
01688 {
01689 con[j]=-mma*clkconnectj3[j]-clkconnectj4[j];
01690 }
01691 if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01692 ind[0]=con[0];
01693 C2F(isort)(&con[1],&con[0],&ind[1]);
01694 Inv(con);
01695 clkconnectjind3=VecEg1(clkconnectj3);
01696 clkconnectjind4=VecEg1(clkconnectj4);
01697 for(j=1;j<ind[0]+1;j++)
01698 {
01699 clkconnectj3[j]=clkconnectjind3[ind[j]];
01700 clkconnectj4[j]=clkconnectjind4[ind[j]];
01701 }
01702 FREE(clkconnectjind3); clkconnectjind3=NULL;
01703 FREE(clkconnectjind4); clkconnectjind4=NULL;
01704 FREE(ind); ind=NULL;
01705 if (con[0]>=2)
01706 {
01707 if ((con1=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01708 k=1;
01709 for (j = 1; j< con[0]; j++)
01710 {
01711 if ((con[j+1] - con[j]) == 0) con1[k++]=j;
01712 }
01713 con1[0]=k-1;
01714 if (con1)
01715 {
01716 for(j=con1[0];j>0;j--)
01717 {
01718 Incr1(clkconnectj3,con1[j]);
01719 Incr1(clkconnectj4,con1[j]);
01720 }
01721 FREE(con1);con1=NULL;
01722 }
01723 }
01724 a=clkconnectj3[0];
01725 FREE(con);con=NULL;
01726 if ((clkconnectjd=(double*)MALLOC(sizeof(double)*(a+1))) == NULL) return 0;
01727 clkconnectjd[0]=a;
01728 for(j=1;j<a+1;j++)
01729 {
01730 clkconnectjd[j]=powerd(2,clkconnectj4[j]-1);
01731 clkconnectj4[j]=(int) clkconnectjd[j];
01732 }
01733
01734 FREE(clkconnectjd); clkconnectjd=NULL;
01735 if (clkconnectj3[0]>=2)
01736 {
01737 if ((iini=(int*)MALLOC(sizeof(int)*(a))) == NULL) return 0;
01738 k=1;
01739 for(j=1;j<a;j++)
01740 {
01741 if ((clkconnectj3[j+1]-clkconnectj3[j]) != 0) iini[k++]=j;
01742 }
01743 iini[0]=k-1;
01744 if ((iini=(int*)REALLOC(iini,sizeof(int)*(iini[0]+2))) == NULL) return 0;
01745 iini[iini[0]+1]=a;
01746 iini[0]++;
01747 }
01748 else
01749 {
01750 if ((iini=(int*)MALLOC(sizeof(int)*(2))) == NULL) return 0;
01751 iini[0]=1;
01752 iini[1]=1;
01753 }
01754 if (((*clkconnectj0)=(int*)MALLOC(sizeof(int)*(2*iini[0]+1))) == NULL) return 0;
01755 (*clkconnectj0)[0]=2*iini[0];
01756 for (j=1;j<iini[0]+1;j++)
01757 {
01758 ind=FindEg(clkconnectj3,clkconnectj3[iini[j]]);
01759 (*clkconnectj0)[j]=clkconnectj3[iini[j]];
01760 sum=0;
01761 for (l=1; l <= ind[0]; l++)
01762 {
01763 sum+=clkconnectj4[ind[l]];
01764 }
01765 (*clkconnectj0)[j+iini[0]]=sum;
01766 FREE(ind);ind=NULL;
01767 }
01768
01769 FREE(con);con=NULL;
01770 FREE(iini);iini=NULL;
01771 FREE(clkconnectj3);clkconnectj3=NULL;
01772 FREE(clkconnectj4);clkconnectj4=NULL;
01773 }
01774 else
01775 {
01776 if ((*clkconnectj0))
01777 {
01778 FREE((*clkconnectj0));
01779 (*clkconnectj0)=NULL;
01780 }
01781 }
01782 FREE(clkconnect0);clkconnect0=NULL;
01783 a=clkconnect[0]/4;
01784 if ((con=(int*)MALLOC(sizeof(int)*(a+1))) == NULL) return 0;
01785 con[0]=a;
01786 for(l=1;l<a+1;l++)
01787 {
01788 con[l]=-bllst5ptr[clkconnect[l]]-clkconnect[l+a]+1;
01789 }
01790 if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01791 ind[0]=con[0];
01792 C2F(isort)(&con[1],&con[0],&ind[1]);
01793 Inv(con);
01794 clkconnectjind=VecEg1(clkconnect);
01795 for(j=1;j<ind[0]+1;j++)
01796 {
01797 clkconnect[j]=clkconnectjind[ind[j]];
01798 clkconnect[j+ind[0]]=clkconnectjind[ind[j]+ind[0]];
01799 clkconnect[j+2*ind[0]]=clkconnectjind[ind[j]+2*ind[0]];
01800 clkconnect[j+3*ind[0]]=clkconnectjind[ind[j]+3*ind[0]];
01801 }
01802
01803 FREE(clkconnectjind);
01804 clkconnectjind=NULL;
01805 FREE(ind);ind=NULL;
01806 }
01807 else
01808 {
01809 if ((con=(int*)MALLOC(sizeof(int))) == NULL) return 0;
01810 con[0]=0;
01811 }
01812 if (((*ordptr1)=(int*)MALLOC(sizeof(int)*(bllst5ptr[bllst5ptr[0]]+1))) == NULL) return 0;
01813 (*ordptr1)[0]=bllst5ptr[bllst5ptr[0]];
01814 (*ordptr1)[1]=1;
01815 for (j=1;j<bllst5ptr[bllst5ptr[0]];j++)
01816 {
01817 con1=FindInfEg(con,j);
01818 if ((con1 == NULL) || (con1[0] == 0 ))
01819 {
01820 (*ordptr1)[j+1]=(*ordptr1)[j];
01821 }
01822 else
01823 {
01824 (*ordptr1)[j+1]=Max1(con1)+1;
01825 FREE(con1);con1=NULL;
01826 }
01827
01828 }
01829
01830 if ((new_ordptr1=(int*)MALLOC(sizeof(int)*(bllst5ptr[bllst5ptr[0]]+1))) == NULL) return 0;
01831 new_ordptr1[0]=bllst5ptr[bllst5ptr[0]];
01832 new_ordptr1[1]=1;
01833 FREE(con); con=NULL;
01834 if (((*execlk)=(int*)MALLOC(sizeof(int))) == NULL) return 0;
01835 (*execlk)[0]=0;
01836 for (m=1;m<bllst5ptr[bllst5ptr[0]];m++)
01837 {
01838 if ((*ordptr1)[m]!=(*ordptr1)[m+1])
01839 {
01840 clkconnectj3=GetPartVect(clkconnect,(*ordptr1)[m]+a+a,(*ordptr1)[m+1]-(*ordptr1)[m]);
01841 clkconnectj4=GetPartVect(clkconnect,(*ordptr1)[m]+3*a,(*ordptr1)[m+1]-(*ordptr1)[m]);
01842
01843
01844 mma=Max1(clkconnectj4)+1;
01845 if ((con=(int*)MALLOC(sizeof(int)*(clkconnectj4[0]+1))) == NULL) return 0;
01846 con[0]=clkconnectj4[0];
01847
01848 for(l=1;l<con[0]+1;l++)
01849 {
01850 con[l]=-mma*clkconnectj3[l]-clkconnectj4[l];
01851 }
01852 if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
01853 ind[0]=con[0];
01854 C2F(isort)(&con[1],&con[0],&ind[1]);
01855 Inv(con);
01856 clkconnectjind3=VecEg1(clkconnectj3);
01857 clkconnectjind4=VecEg1(clkconnectj4);
01858 for(j=1;j<ind[0]+1;j++)
01859 {
01860 clkconnectj3[j]=clkconnectjind3[ind[j]];
01861 clkconnectj4[j]=clkconnectjind4[ind[j]];
01862 }
01863 FREE(clkconnectjind3); clkconnectjind3=NULL;
01864 FREE(clkconnectjind4); clkconnectjind4=NULL;
01865 FREE(ind); ind=NULL;
01866 if (con[0]>=2)
01867 {
01868 if ((con1=(int*)MALLOC(sizeof(int)*(con[0]))) == NULL) return 0;
01869 k=1;
01870 for(j = 1;j < con[0]; j++)
01871 {
01872 if ((con[j+1] - con[j]) == 0) con1[k++]=j;
01873 }
01874 con1[0]=k-1;
01875 if (con1)
01876 {
01877 for(j=con1[0];j>0;j--)
01878 {
01879 Incr1(clkconnectj3,con1[j]);
01880 Incr1(clkconnectj4,con1[j]);
01881 }
01882 FREE(con1);con1=NULL;
01883 }
01884 }
01885 FREE(con);con=NULL;
01886 b=clkconnectj3[0];
01887 if ((clkconnectjd=(double*)MALLOC(sizeof(double)*(b+1))) == NULL) return 0;
01888 clkconnectjd[0]=b;
01889 for(j=1;j<b+1;j++)
01890 {
01891 clkconnectjd[j]=powerd(2,clkconnectj4[j]-1);
01892 clkconnectj4[j]=(int) clkconnectjd[j];
01893 }
01894 FREE(clkconnectjd); clkconnectjd=NULL;
01895 if (clkconnectj3[0]>=2)
01896 {
01897 if ((iini=(int*)MALLOC(sizeof(int)*(clkconnectj3[0]))) == NULL) return 0;
01898 k=1;
01899 for(j=1; j < b; j++)
01900 {
01901 if((clkconnectj3[j+1]-clkconnectj3[j]) != 0) iini[k++]=j;
01902 }
01903 iini[0]=k-1;
01904 if ((iini=(int*)REALLOC(iini,sizeof(int)*(iini[0]+2))) == NULL) return 0;
01905 iini[iini[0]+1]=b;
01906 iini[0]++;
01907 }
01908 else
01909 {
01910 if ((iini=(int*)MALLOC(sizeof(int)*(2))) == NULL) return 0;
01911 iini[0]=1;
01912 iini[1]=1;
01913 }
01914 if ((clkconnectjj=(int*)MALLOC(sizeof(int)*(2*iini[0]+1))) == NULL) return 0;
01915 clkconnectjj[0]=2*iini[0];
01916 for (j=1;j<iini[0]+1;j++)
01917 {
01918 ind=FindEg(clkconnectj3,clkconnectj3[iini[j]]);
01919 clkconnectjj[j]=clkconnectj3[iini[j]];
01920 sum=0;
01921 for (l=1; l <= ind[0]; l++)
01922 {
01923 sum+=clkconnectj4[ind[l]];
01924 }
01925 clkconnectjj[j+iini[0]]=sum;
01926 FREE(ind); ind=NULL;
01927 }
01928
01929 FREE(con);con=NULL;
01930 FREE(iini);iini=NULL;
01931 FREE(clkconnectj3);clkconnectj3=NULL;
01932 FREE(clkconnectj4);clkconnectj4=NULL;
01933 }
01934 else
01935 {
01936 if (clkconnectjj)
01937 {
01938 FREE(clkconnectjj);
01939 clkconnectjj=NULL;
01940 }
01941 }
01942
01943
01944 if(clkconnectjj)
01945 {
01946 if (((*execlk)=(int*)REALLOC((*execlk),sizeof(int)*((*execlk)[0]+clkconnectjj[0]+1))) == NULL ) return 0;
01947 if ((execlki.col1=(int*)MALLOC(sizeof(int)*((*execlk)[0]/2+clkconnectjj[0]/2+1))) == NULL) return 0;
01948 execlki.col1[0]=(*execlk)[0]/2+clkconnectjj[0]/2;
01949 if ((execlki.col2=(int*)MALLOC(sizeof(int)*((*execlk)[0]/2+clkconnectjj[0]/2+1))) == NULL) return 0;
01950 execlki.col2[0]=(*execlk)[0]/2+clkconnectjj[0]/2;
01951 for(l=1;l<(*execlk)[0]/2+1;l++)
01952 {
01953 execlki.col1[l]=(*execlk)[l];
01954 execlki.col2[l]=(*execlk)[l+(*execlk)[0]/2];
01955 }
01956 for(l=1;l<clkconnectjj[0]/2+1;l++)
01957 {
01958 execlki.col1[l+(*execlk)[0]/2]=clkconnectjj[l];
01959 execlki.col2[l+(*execlk)[0]/2]=clkconnectjj[l+clkconnectjj[0]/2];
01960 }
01961
01962 (*execlk)[0]=clkconnectjj[0]+(*execlk)[0];
01963 for(l=1;l<(*execlk)[0]/2+1;l++)
01964 {
01965 (*execlk)[l]=execlki.col1[l];
01966 (*execlk)[l+(*execlk)[0]/2]=execlki.col2[l];
01967 }
01968 if(execlki.col1) FREE(execlki.col1);
01969 if(execlki.col2) FREE(execlki.col2);
01970
01971 new_ordptr1[m+1]=new_ordptr1[m]+clkconnectjj[0]/2;
01972 FREE(clkconnectjj);
01973 clkconnectjj=NULL;
01974 }
01975 else
01976 {
01977 new_ordptr1[m+1]=new_ordptr1[m];
01978 }
01979
01980 }
01981 FREE( *ordptr1);
01982 *ordptr1=new_ordptr1;
01983 if (clkconnect[0] != 0) FREE(clkconnect);
01984 return NULL;
01985 }
01986
01987
01988
01989 int extract_info(int* bllst2,int* bllst3,int* bllst5,char **bllst10,double* bllst11,int* bllst12,int* bllst2ptr,
01990 int* bllst3ptr,int* bllst4ptr,int* bllst5ptr,int* bllst11ptr,int* connectmat,int* clkconnect,
01991 int** lnkptr,int** inplnk,int** outlnk,int* nzcross,int* nmode,int** typ_s,int** typ_x,
01992 int** typ_m,double** initexe,int** bexe,int** boptr,int** blnk,int** blptr,int* ok,
01993 int* corinvec,int* corinvptr)
01994 {
01995 int j,l,ko,ki,nlnk,ptlnk,siz_unco,m1,n,jj,a,nbl=((int*)bllst10)[0];
01996 int *prt,*clkconnecttmp,*fff,*clkconnectind;
01997 int *idl,*ind,*con,*unco,*lnkbsz,*ppget,*mm;
01998 double *ll11;
01999 Mat3C initexei;
02000 ind=NULL;
02001 idl=NULL;
02002 ll11=NULL;
02003 clkconnecttmp=NULL;
02004 *ok=true;
02005 prt=NULL;
02006 if ((fff=(int*)MALLOC(sizeof(int)*(nbl+1))) == NULL) return 0;
02007 fff[0]=nbl;
02008 Setmem(fff,1);
02009
02010 *typ_s=VecEg1(fff);
02011 *typ_m=VecEg1(fff);
02012 FREE(fff); fff=NULL;
02013 adjust_inout(bllst2,bllst3,bllst2ptr,bllst3ptr,nzcross,nmode,connectmat,ok,corinvec,corinvptr,nbl);
02014 if(!*ok) return 0;
02015
02016 if (((*initexe)=(double*)MALLOC(sizeof(double))) == NULL) return 0;
02017 (*initexe)[0]=0;
02018
02019 for (j=1;j<nbl+1;j++)
02020 {
02021 if (nmode[j] < 0){
02022 Message("Number of modes in block j cannot be determined");
02023 *ok=false;
02024 }
02025 if (*(bllst10[j]) == 's' ) (*typ_s)[j]=1;
02026 else (*typ_s)[j]=0;
02027 if (*(bllst10[j]) == 'x' ) (*typ_x)[j]=1;
02028 if (*(bllst10[j])=='m') (*typ_m)[j]=1;
02029 else (*typ_m)[j]=0;
02030 fff=GetPartVect(bllst5,bllst5ptr[j],bllst5ptr[j+1]-bllst5ptr[j]);
02031 if (fff)
02032 {
02033 ll11=GetPartVectd(bllst11,bllst11ptr[j],bllst11ptr[j+1]-bllst11ptr[j]);
02034 if(ll11)
02035 {
02036 prt=FindSupEgd(ll11,0);
02037
02038 if ((initexei.col1=(double*)MALLOC(sizeof(double)*((int) ((*initexe)[0])/3+prt[0]+1))) == NULL) return 0;
02039 initexei.col1[0]=(int) ((*initexe)[0])/3+prt[0];
02040 if ((initexei.col2=(double*)MALLOC(sizeof(double)*((int) ((*initexe)[0])/3+prt[0]+1))) == NULL) return 0;
02041 initexei.col2[0]=(int) ((*initexe)[0])/3+prt[0];
02042 if ((initexei.col3=(double*)MALLOC(sizeof(double)*((int) ((*initexe)[0])/3+prt[0]+1))) == NULL) return 0;
02043 initexei.col3[0]=(int) ((*initexe)[0])/3+prt[0];
02044 for(l=1;l<(int) ((*initexe)[0])/3+1;l++)
02045 {
02046 initexei.col1[l]=(*initexe)[l];
02047 initexei.col2[l]=(*initexe)[l+(int) ((*initexe)[0])/3];
02048 initexei.col3[l]=(*initexe)[l+2* (int) ((*initexe)[0])/3];
02049 }
02050 for(l=1;l<prt[0]+1;l++)
02051 {
02052 initexei.col1[l+(int) ((*initexe)[0])/3]=j;
02053 initexei.col2[l+(int) ((*initexe)[0])/3]=prt[l];
02054 initexei.col3[l+(int) ((*initexe)[0])/3]=ll11[prt[l]];
02055 }
02056 if (((*initexe)=(double*)REALLOC((*initexe),(size_t) (sizeof(double)*(3*initexei.col1[0]+1)))) == NULL ) return 0;
02057 ((*initexe)[0])=3*((int) initexei.col1[0]);
02058 for(l=1;l<(int) (*initexe)[0]/3+1;l++)
02059 {
02060 (*initexe)[l]=initexei.col1[l];
02061 (*initexe)[l+(int) ((*initexe)[0])/3]=initexei.col2[l];
02062 (*initexe)[l+2*(int) ((*initexe)[0])/3]=initexei.col3[l];
02063 }
02064 FREE(initexei.col1);
02065 FREE(initexei.col2);
02066 FREE(initexei.col3);
02067 FREE(prt);prt=NULL;
02068 FREE(ll11); ll11=NULL;
02069 }
02070 FREE(fff);
02071 }
02072 }
02073 if (clkconnect[0] != 0)
02074 {
02075 clkconnecttmp=VecEg1(clkconnect);
02076 ppget=GetPartVect(clkconnecttmp,1,clkconnecttmp[0]/4);
02077 idl=FindDif(ppget,0);
02078 FREE(ppget);
02079 if ((clkconnect=(int*)MALLOC(sizeof(int)*(4*idl[0]+1))) == NULL ) return 0;
02080 clkconnect[0]=4*idl[0];
02081 for(l=1;l<idl[0]+1;l++)
02082 {
02083 clkconnect[l]=clkconnecttmp[idl[l]];
02084 clkconnect[l+idl[0]]=clkconnecttmp[clkconnecttmp[0]/4+idl[l]];
02085 clkconnect[l+2*idl[0]]=clkconnecttmp[idl[l]+clkconnecttmp[0]/2];
02086 clkconnect[l+3*idl[0]]=clkconnecttmp[idl[l]+3*clkconnecttmp[0]/4];
02087 }
02088 FREE(clkconnecttmp);clkconnecttmp=NULL;
02089 FREE(idl);idl=NULL;
02090 clkconnecttmp=GetPartVect(clkconnect,1,clkconnect[0]/4);
02091 idl=GetPartVect(clkconnect,clkconnect[0]/4+1,clkconnect[0]/4);
02092 if (!idl)
02093 {
02094 if ((idl=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02095 idl[0]=0;
02096 }
02097 if ((con=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
02098 con[0]=idl[0];
02099 for(l=1;l<clkconnect[0]/4+1;l++)
02100 {
02101 con[l]=-bllst5ptr[clkconnecttmp[l]]-idl[l]+1;
02102 }
02103 FREE(clkconnecttmp);clkconnecttmp=NULL;
02104 FREE(idl);idl=NULL;
02105 if ((ind=(int*)MALLOC(sizeof(int)*(con[0]+1))) == NULL ) return 0;
02106 ind[0]=con[0];
02107 C2F(isort)(&con[1],&con[0],&ind[1]);
02108 FREE(con);con=NULL;
02109 clkconnectind=VecEg1(clkconnect);
02110 for(l=1;l<ind[0]+1;l++)
02111 {
02112 clkconnect[l]=clkconnectind[ind[l]];
02113 clkconnect[l+ind[0]]=clkconnectind[ind[l]+ind[0]];
02114 clkconnect[l+2*ind[0]]=clkconnectind[ind[l]+2*ind[0]];
02115 clkconnect[l+3*ind[0]]=clkconnectind[ind[l]+3*ind[0]];
02116 }
02117 FREE(clkconnectind);
02118 clkconnectind=NULL;
02119 FREE(ind);ind=NULL;
02120 }
02121 if (((*boptr)=(int*)MALLOC(sizeof(int)*(nbl+2))) == NULL ) return 0;
02122 (*boptr)[0]=nbl+1;
02123 (*boptr)[1]=1;
02124 if (((*bexe)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02125 (*bexe)[0]=0;
02126 ppget=GetPartVect(clkconnect,1,clkconnect[0]/4);
02127 if (!ppget)
02128 {
02129 if ((ppget=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02130 ppget[0]=0;
02131 }
02132 for (j=1;j<nbl+1;j++)
02133 {
02134 idl=FindEg(ppget,j);
02135 if(idl)
02136 {
02137 if ((ind=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
02138 ind[0]=idl[0];
02139 for (l=1;l<ind[0]+1;l++)
02140 {
02141 ind[l]=clkconnect[idl[l]+clkconnect[0]/2];
02142 }
02143 if (((*bexe)=(int*)REALLOC((*bexe),sizeof(int)*((*bexe)[0]+ind[0]+1))) == NULL ) return 0;
02144 for (l=1;l<ind[0]+1;l++)
02145 {
02146 (*bexe)[l+(*bexe)[0]]=ind[l];
02147 }
02148 (*bexe)[0]=(*bexe)[0]+ind[0];
02149 (*boptr)[j+1]=(*boptr)[j]+ind[0];
02150 FREE(idl);idl=NULL;
02151 FREE(ind);ind=NULL;
02152 }
02153 else (*boptr)[j+1]=(*boptr)[j];
02154 }
02155 FREE(ppget); ppget=NULL;
02156 if (clkconnect[0] != 0) {FREE(clkconnect);clkconnect=NULL;}
02157 if (((*blptr)=(int*)MALLOC(sizeof(int)*(nbl+2))) == NULL ) return 0;
02158 (*blptr)[0]=nbl+1;
02159 (*blptr)[1]=1;
02160 if (((*blnk)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02161 (*blnk)[0]=0;
02162 ppget=GetPartVect(connectmat,1,connectmat[0]/4);
02163 if(!ppget)
02164 {
02165 if ((ppget=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02166 ppget[0]=0;
02167 }
02168 for (j=1;j<nbl+1;j++)
02169 {
02170 idl=FindEg(ppget,j);
02171 if(idl && idl[0] != 0)
02172 {
02173 if ((ind=(int*)MALLOC(sizeof(int)*(idl[0]+1))) == NULL ) return 0;
02174 ind[0]=idl[0];
02175 for (l=1;l<ind[0]+1;l++)
02176 {
02177 ind[l]=connectmat[idl[l]+connectmat[0]/2];
02178 }
02179 if (((*blnk)=(int*)REALLOC((*blnk),sizeof(int)*((*blnk)[0]+ind[0]+1))) == NULL ) return 0;
02180 for (l=1;l<ind[0]+1;l++)
02181 {
02182 (*blnk)[l+(*blnk)[0]]=ind[l];
02183 }
02184 (*blnk)[0]=(*blnk)[0]+ind[0];
02185 (*blptr)[j+1]=(*blptr)[j]+ind[0];
02186 FREE(ind);ind=NULL;
02187 }
02188 else (*blptr)[j+1]=(*blptr)[j];
02189 FREE(idl);idl=NULL;
02190 }
02191 FREE(ppget);ppget=NULL;
02192
02193 nlnk=connectmat[0]/4;
02194 if (((*inplnk)=(int*)CALLOC(bllst2ptr[bllst2ptr[0]],sizeof(int))) == NULL ) return 0;
02195 (*inplnk)[0]=bllst2ptr[bllst2ptr[0]]-1;
02196 if (((*outlnk)=(int*)CALLOC(bllst3ptr[bllst3ptr[0]],sizeof(int))) == NULL ) return 0;
02197 (*outlnk)[0]=bllst3ptr[bllst3ptr[0]]-1;
02198 ptlnk=1;
02199 if ((lnkbsz=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02200 lnkbsz[0]=0;
02201
02202 for (jj=1;jj<nlnk+1;jj++)
02203 {
02204 ko=(*outlnk)[bllst3ptr[connectmat[jj]]+connectmat[jj+nlnk]-1];
02205 ki=(*inplnk)[bllst2ptr[connectmat[jj+2*nlnk]]+connectmat[jj+3*nlnk]-1];
02206 if (ko != 0 && ki !=0)
02207 {
02208 if (ko > ki )
02209 {
02210 ind=FindSup(*outlnk,ko);
02211 for(l=1;l<ind[0]+1;l++)
02212 {
02213 (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
02214 }
02215 FREE(ind);ind=NULL;
02216 ind=FindEg(*outlnk,ko);
02217 for(l=1;l<ind[0]+1;l++)
02218 {
02219 (*outlnk)[ind[l]]=ki;
02220 }
02221 FREE(ind); ind=NULL;
02222 ind=FindSup(*inplnk,ko);
02223 for(l=1;l<ind[0]+1;l++)
02224 {
02225 (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
02226 }
02227 FREE(ind);ind=NULL;
02228 ind=FindEg(*inplnk,ko);
02229 for(l=1;l<ind[0]+1;l++)
02230 {
02231 (*inplnk)[ind[l]]=ki;
02232 }
02233 ptlnk--;
02234 }
02235 else if (ki > ko)
02236 {
02237 ind=FindSup(*outlnk,ki);
02238 for(l=1;l<ind[0]+1;l++)
02239 {
02240 (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
02241 }
02242 FREE(ind); ind=NULL;
02243 ind=FindEg(*outlnk,ki);
02244 for(l=1;l<ind[0]+1;l++)
02245 {
02246 (*outlnk)[ind[l]]=ko;
02247 }
02248 FREE(ind); ind=NULL;
02249 ind=FindSup(*inplnk,ki);
02250 for(l=1;l<ind[0]+1;l++)
02251 {
02252 (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
02253 }
02254 FREE(ind); ind=NULL;
02255 ind=FindEg(*inplnk,ki);
02256 for(l=1;l<ind[0]+1;l++)
02257 {
02258 (*inplnk)[ind[l]]=ko;
02259 }
02260 ptlnk--;
02261 }
02262 }
02263 else if (ko != 0)
02264 {
02265 (*inplnk)[bllst2ptr[connectmat[jj+2*nlnk]]+connectmat[jj+3*nlnk]-1]=ko;
02266 }
02267 else if (ki != 0)
02268 {
02269 (*outlnk)[bllst3ptr[connectmat[jj]]+connectmat[jj+nlnk]-1]=ki;
02270 }
02271 else
02272 {
02273 (*outlnk)[bllst3ptr[connectmat[jj]]+connectmat[jj+nlnk]-1]=ptlnk;
02274 (*inplnk)[bllst2ptr[connectmat[jj+2*nlnk]]+connectmat[jj+3*nlnk]-1]=ptlnk;
02275 ind=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02276 if ((lnkbsz=(int*)REALLOC(lnkbsz,sizeof(int)*(lnkbsz[0]+2))) == NULL ) return 0;
02277 lnkbsz[lnkbsz[0]+1]=ind[connectmat[jj+nlnk]];
02278 lnkbsz[0]++;
02279 ptlnk++;
02280 FREE(ind);ind=NULL;
02281 }
02282 }
02283
02284 if ((ind=(int*)MALLOC(sizeof(int)*(lnkbsz[0]+2))) == NULL ) return 0;
02285 ind[0]=lnkbsz[0]+1;
02286 ind[1]=1;
02287 for (l=2;l<ind[0]+1;l++)
02288 {
02289 ind[l]=lnkbsz[l-1];
02290 }
02291 FREE(lnkbsz);lnkbsz=NULL;
02292 CumSum(ind);
02293 if (((*lnkptr)=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02294 (*lnkptr)[0]=ind[0];
02295 for (l = 1; l < ind[0]+1; l++)
02296 {
02297 (*lnkptr)[l]=ind[l];
02298 }
02299 FREE(ind);ind=NULL;
02300 unco=FindEg(*outlnk,0);
02301 if (unco && unco[0] !=0)
02302 {
02303 siz_unco=0;
02304 for (l=1;l<unco[0]+1;l++)
02305 {
02306 j=unco[l];
02307 ppget=FindInfEg(bllst3ptr,j);
02308 m1=Max1(ppget);
02309 n=j-bllst3ptr[m1]+1;
02310 FREE(ppget);ppget=NULL;
02311 ind=GetPartVect(bllst3,bllst3ptr[m1],bllst3ptr[m1+1]-bllst3ptr[m1]);
02312 if (ind)
02313 {
02314 if ((idl=(int*)MALLOC(sizeof(int)*(3))) == NULL ) return 0;
02315 idl[0]=2;
02316 idl[1]=siz_unco;
02317 idl[2]=ind[n];
02318 if (ind[n] < 1)
02319 {
02320 ppget=GetPartVect(corinvec,corinvptr[m1],corinvptr[m1+1]-corinvptr[m1]);
02321 if ((mm=(int*)MALLOC(sizeof(int)*(2))) == NULL ) return 0;
02322 mm[0]=1;
02323 mm[1]=-1;
02324 *ok=connection(ppget,mm);
02325 FREE(ppget);
02326 FREE(mm);
02327 return 0;
02328 }
02329 siz_unco=Max1(idl);
02330 FREE(idl);idl=NULL;
02331 FREE(ind);ind=NULL;
02332 }
02333 }
02334 if (((*lnkptr)=(int*)REALLOC((*lnkptr),sizeof(int)*((*lnkptr)[0]+2))) == NULL ) return 0;
02335 (*lnkptr)[(*lnkptr)[0]+1]=(*lnkptr)[(*lnkptr)[0]]+siz_unco;
02336 (*lnkptr)[0]=(*lnkptr)[0]+1;
02337 a=Max1(*outlnk)+1;
02338 for (l=1;l<unco[0]+1;l++)
02339 {
02340 (*outlnk)[unco[l]]=a;
02341 }
02342 }
02343 FREE(unco);unco=NULL;
02344 return 0;
02345 }
02346
02347
02348
02349
02350 int conn_mat(int* inplnk,int* outlnk,int* bllst2ptr,int* bllst3ptr,int** outoin,int** outoinptr,int* nblk)
02351 {
02352 int l,ll,j,jj,jjj,m1,n;
02353 int *outoini,*ind,*k,*ppget,a;
02354 int *ii;
02355 Mat2C outoinii;
02356 ii=NULL;
02357 outoini=NULL;
02358 *nblk=bllst2ptr[0]-1;
02359 if (((*outoinptr)=(int*)MALLOC(sizeof(int)*(*nblk+2))) == NULL ) return 0;
02360 (*outoinptr)[0]=*nblk+1;
02361 if (((*outoin)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02362 (*outoin)[0]=0;
02363 (*outoinptr)[1]=1;
02364 for (j=1;j<*nblk+1;j++)
02365 {
02366 if ((k=(int*)MALLOC(sizeof(int)*(bllst3ptr[j+1]-bllst3ptr[j]+1))) == NULL ) return 0;
02367 k[0]=bllst3ptr[j+1]-bllst3ptr[j];
02368 a=-bllst3ptr[j]+1;
02369 for (l=bllst3ptr[j];l<bllst3ptr[j+1];l++)
02370 {
02371 k[l+a]=l;
02372 }
02373 if ((ii=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02374 ii[0]=0;
02375 for (l=1;l<k[0]+1;l++)
02376 {
02377 jjj=outlnk[k[l]];
02378 ind=FindEg(inplnk,jjj);
02379 if (ind)
02380 {
02381 if ((ii=(int*)REALLOC(ii,sizeof(int)*(ii[0]+ind[0]+1))) == NULL ) return 0;
02382 for (ll=1;ll<ind[0]+1;ll++)
02383 {
02384 ii[ii[0]+ll]=ind[ll];
02385 }
02386
02387 ii[0]=ii[0]+ind[0];
02388 FREE(ind); ind=NULL;
02389 }
02390 }
02391 jj=0;
02392 if (ii && ii[0] != 0)
02393 {
02394 if ((outoini=(int*)MALLOC(sizeof(int)*(2*ii[0]+1))) == NULL ) return 0;
02395 outoini[0]=2*ii[0];
02396 for (ll=1;ll<ii[0]+1;ll++)
02397 {
02398 l=ii[ll];
02399 ppget=FindInfEg(bllst2ptr,l);
02400 m1=Max1(ppget);
02401 FREE(ppget);ppget=NULL;
02402 n=l-bllst2ptr[m1]+1;
02403 outoini[ll]=m1;
02404 outoini[ll+ii[0]]=n;
02405 jj++;
02406 }
02407 if ((outoinii.col1=(int*)MALLOC(sizeof(int)*(outoini[0]/2+(*outoin)[0]/2+1))) == NULL) return 0;
02408 outoinii.col1[0]=outoini[0]/2+(*outoin)[0]/2;
02409 if ((outoinii.col2=(int*)MALLOC(sizeof(int)*(outoini[0]/2+(*outoin)[0]/2+1))) == NULL) return 0;
02410 outoinii.col2[0]=outoini[0]/2+(*outoin)[0]/2;
02411 for(l=1;l<(*outoin)[0]/2+1;l++)
02412 {
02413 outoinii.col1[l]=(*outoin)[l];
02414 outoinii.col2[l]=(*outoin)[l+(*outoin)[0]/2];
02415 }
02416 for(l=1;l<outoini[0]/2+1;l++)
02417 {
02418 outoinii.col1[l+(*outoin)[0]/2]=outoini[l];
02419 outoinii.col2[l+(*outoin)[0]/2]=outoini[l+outoini[0]/2];
02420 }
02421
02422 if (((*outoin)=(int*)REALLOC((*outoin),sizeof(int)*((*outoin)[0]+outoini[0]+1))) == NULL ) return 0;
02423 (*outoin)[0]=(*outoin)[0]+outoini[0];
02424
02425 for(l=1;l<(*outoin)[0]/2+1;l++)
02426 {
02427 (*outoin)[l]=outoinii.col1[l];
02428 (*outoin)[l+(*outoin)[0]/2]=outoinii.col2[l];
02429 }
02430 FREE(outoinii.col1); outoinii.col1=NULL;
02431 FREE(outoinii.col2); outoinii.col2=NULL;
02432 FREE(outoini);outoini=NULL;
02433 }
02434 (*outoinptr)[j+1]=(*outoinptr)[j]+jj;
02435 FREE(k);k=NULL;
02436 FREE(ii);ii=NULL;
02437 }
02438 return 0;
02439 }
02440
02441
02442
02443 int critical_events(int* connectmat,int* clkconnect,int *bllst12,int *typ_r,int *typ_l,int *typ_zx,int *outoin,
02444 int *outoinptr,int *bllst5ptr,int **critev)
02445 {
02446 int i,j,k,*typ_c,done1,mm,a,*cll,val=0,*cllind,*typr;
02447 int *clkconnecttmp,*clkconnectind,*ind,*ii,*oo,*vec,nblk,*r,*nd,max1,nnd,done,*jj;
02448 Mat4C clkconnecti;
02449
02450 typr=VecEg1(typ_r);
02451 nblk=bllst12[0]/2;
02452 if ((typ_c=(int*)MALLOC(sizeof(int)*(typ_l[0]+1))) == NULL ) return 0;
02453 typ_c[0]=typ_l[0];
02454 Setmem(typ_c,0);
02455 for (i=1; i<=typr[0]; i++){
02456 if (bllst12[i+bllst12[0]/2]){
02457 typr[i]=1;
02458 }
02459 }
02460 clkconnecttmp=VecEg1(clkconnect);
02461 done1=0;
02462 while (!done1){
02463 done1=1;
02464 mm=Max1(clkconnecttmp)+1;
02465 a=clkconnecttmp[0]/4;
02466 if ((cll=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
02467 cll[0]=a;
02468 for (i=1; i<=a; i++)
02469 {
02470 cll[i]=-clkconnecttmp[i]*mm-clkconnecttmp[i+a];
02471 }
02472 if ((ind=(int*)MALLOC(sizeof(int)*(a+2))) == NULL ) return 0;
02473 C2F(isort)(&cll[1],&a,&ind[0]);
02474 clkconnectind=VecEg1(clkconnecttmp);
02475 for(i=1; i<=a; i++)
02476 {
02477 clkconnecttmp[i]=clkconnectind[ind[i-1]];
02478 clkconnecttmp[i+a]=clkconnectind[ind[i-1]+a];
02479 clkconnecttmp[i+2*a]=clkconnectind[ind[i-1]+2*a];
02480 clkconnecttmp[i+3*a]=clkconnectind[ind[i-1]+3*a];
02481 }
02482 if (ind) FREE(ind);
02483 FREE(clkconnectind); clkconnectind=NULL;
02484 if ((cll=(int*)REALLOC(cll,sizeof(int)*(a+3))) == NULL ) return 0;
02485 cll[0]=a+2;
02486 cllind=VecEg1(cll);
02487 for (j=2;j<cll[0]+1;j++)
02488 {
02489 cll[j]=-cllind[j-1];
02490 }
02491 if(cllind) FREE(cllind);
02492 cllind=NULL;
02493 cll[1]=-1;
02494 cll[cll[0]]=mm;
02495
02496 if ((ii=(int*)MALLOC(sizeof(int)*(a+2))) == NULL ) return 0;
02497 ii[0]=a+1;
02498 for (i=1; i<=ii[0]; i++)
02499 ii[i]=cll[i+1]-cll[i];
02500 if (cll) FREE(cll);
02501
02502 ind=FindDif(ii,0);
02503 if (ii) FREE(ii);
02504 if (ind){
02505 for (i=1; i<ind[0]; i++){
02506 if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
02507 vec[0]=nblk;
02508 Setmem(vec,-1);
02509 a=clkconnecttmp[0]/4;
02510 for (j=ind[i]; j<ind[i+1]; j++)
02511 vec[clkconnecttmp[j+2*a]]=0;
02512
02513 nd=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
02514 if (!nd)
02515 {
02516 if ((nd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02517 nd[0]=0;
02518 }
02519 max1=Max1(nd);
02520 FREE(nd);
02521 nnd=max1+1;
02522 if ((nd=(int*)CALLOC((nblk*nnd+1),sizeof(int))) == NULL ) return 0;
02523 nd[0]=nblk*nnd;
02524
02525 tree4(vec,nd,nnd,outoin,outoinptr,typr,&r);
02526 if(nd) FREE(nd);
02527 if(vec) FREE(vec); vec=NULL;
02528
02529 if (r) {
02530 if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02531 clkconnecti.col1[0]=a+r[0]/2;
02532 if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02533 clkconnecti.col2[0]=a+r[0]/2;
02534 if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02535 clkconnecti.col3[0]=a+r[0]/2;
02536 if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*(a+r[0]/2+1))) == NULL ) return 0;
02537 clkconnecti.col4[0]=a+r[0]/2;
02538 for(j=1; j<a+1; j++)
02539 {
02540 clkconnecti.col1[j]=clkconnecttmp[j];
02541 clkconnecti.col2[j]=clkconnecttmp[j+a];
02542 clkconnecti.col3[j]=clkconnecttmp[j+2*a];
02543 clkconnecti.col4[j]=clkconnecttmp[j+3*a];
02544 }
02545 for (j=1; j<r[0]/2+1; j++)
02546 {
02547 clkconnecti.col1[j+a]=clkconnecttmp[ind[i]];
02548 clkconnecti.col2[j+a]=clkconnecttmp[ind[i]+a];
02549 clkconnecti.col3[j+a]=r[j];
02550 clkconnecti.col4[j+a]=r[j+r[0]/2];
02551 }
02552 FREE(clkconnecttmp);
02553 if ((clkconnecttmp=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
02554 clkconnecttmp[0]=4*clkconnecti.col1[0];
02555 for (j=1; j<clkconnecttmp[0]/4+1; j++)
02556 {
02557 clkconnecttmp[j]=clkconnecti.col1[j];
02558 clkconnecttmp[j+clkconnecttmp[0]/4]=clkconnecti.col2[j];
02559 clkconnecttmp[j+clkconnecttmp[0]/2]=clkconnecti.col3[j];
02560 clkconnecttmp[j+3*clkconnecttmp[0]/4]=clkconnecti.col4[j];
02561 }
02562 FREE(clkconnecti.col1);
02563 clkconnecti.col1=NULL;
02564 FREE(clkconnecti.col2);
02565 clkconnecti.col2=NULL;
02566 FREE(clkconnecti.col3);
02567 clkconnecti.col3=NULL;
02568 FREE(clkconnecti.col4);
02569 clkconnecti.col4=NULL;
02570 FREE(r); r=NULL;
02571 }
02572 }
02573 FREE(ind);
02574 }
02575 done=0;
02576 while (!done){
02577 done=1;
02578 if ((vec=(int*)CALLOC(typ_c[0]+1,sizeof(int))) == NULL ) return 0;
02579 vec[0]=typ_c[0];
02580 for (i=1; i<=typ_c[0]; i++){
02581 if ( typ_l[i] && !(typ_c[i]) )
02582 vec[i]=1;
02583 }
02584 jj=FindEg(vec,1);
02585 if (vec) FREE(vec);
02586 if (jj[0] != 0){
02587 if ((vec=(int*)CALLOC(clkconnecttmp[0]/4+1,sizeof(int))) == NULL ) return 0;
02588 vec[0]=clkconnecttmp[0]/4;
02589 for (i=1; i<=jj[0]; i++){
02590 for (j=1; j<=clkconnecttmp[0]/4; j++){
02591 if (clkconnecttmp[j+clkconnecttmp[0]/2] == jj[i]) vec[j]=1;
02592 }
02593 if (!OR(vec)){
02594 oo=GetPartVect(clkconnecttmp,1,clkconnecttmp[0]/4);
02595 ind=FindEg(oo,jj[i]);
02596 if (oo) FREE(oo);
02597 if (ind){
02598 for (j=1; j<=ind[0]; j++){
02599 typr[clkconnecttmp[ind[j]+clkconnecttmp[0]/2]]=1;
02600 clkconnecttmp[ind[j]]=-4321;
02601 clkconnecttmp[ind[j]+clkconnecttmp[0]/4]=-4321;
02602 clkconnecttmp[ind[j]+clkconnecttmp[0]/2]=-4321;
02603 clkconnecttmp[ind[j]+3*clkconnecttmp[0]/4]=-4321;
02604 }
02605 for (j=1; j<clkconnecttmp[0]+1; j++)
02606 {
02607 if ( clkconnecttmp[j] != -4321 ) clkconnecttmp[j-val]=clkconnecttmp[j];
02608 else
02609 val++;
02610 }
02611 clkconnecttmp[0]=clkconnecttmp[0]-4*ind[0];
02612 FREE(ind); ind=NULL;
02613 }
02614 typ_c[jj[i]]=1;
02615 done1=0;
02616 done=0;
02617 }
02618 }
02619 if (vec) FREE(vec);
02620 }
02621 FREE(jj);
02622 }
02623 }
02624 FREE(typ_c);
02625 FREE(typr);
02626 if (((*critev)=(int*)CALLOC(bllst5ptr[bllst5ptr[0]],sizeof(int))) == NULL ) return 0;
02627 (*critev)[0]=bllst5ptr[bllst5ptr[0]]-1;
02628 for (i=1; i<bllst5ptr[0]; i++){
02629 for (j=bllst5ptr[i]; j<bllst5ptr[i+1]; j++){
02630 if ((vec=(int*)CALLOC(clkconnecttmp[0]/4+1,sizeof(int))) == NULL ) return 0;
02631 vec[0]=clkconnecttmp[0]/4;
02632 for (k=1; k<=clkconnecttmp[0]/4; k++){
02633 if ((clkconnecttmp[k] == i) && (clkconnecttmp[k+clkconnecttmp[0]/4] == j-bllst5ptr[i]+1)) vec[k]=1;
02634 }
02635 ind=FindEg(vec,1);
02636 if (ind){
02637 if (vec) FREE(vec);
02638 if ((vec=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02639 vec[0]=ind[0];
02640 for (k=1; k<=ind[0]; k++)
02641 vec[k]=typ_zx[clkconnecttmp[ind[k]+clkconnecttmp[0]/2]];
02642 if (OR(vec)) (*critev)[j]=1;
02643 if (vec) FREE(vec);
02644 FREE(ind);
02645 }
02646 }
02647 }
02648 FREE(clkconnecttmp);
02649 return 0;
02650 }
02651
02652
02653
02654 int make_ptr(char** bllst10,int** typ_l,int** typ_m)
02655 {
02656 int ll,j=1;
02657 int *typ_l1,*pp,*typ_m1;
02658 if (((int *)bllst10)[0]<(*typ_l)[0]+1) return 0;
02659 ll=((int*)bllst10)[0]-(*typ_l)[0];
02660 if ((typ_l1=(int*)CALLOC((ll+1),sizeof(int))) == NULL ) return 0;
02661 typ_l1[0]=ll;
02662 if ((typ_m1=(int*)CALLOC((ll+1),sizeof(int))) == NULL ) return 0;
02663 typ_m1[0]=ll;
02664 if (*(bllst10[(*typ_l)[0]+1])=='l') typ_l1[1]=1;
02665 j=1;
02666 for (ll=(*typ_l)[0]+2;ll<((int*)bllst10)[0]+1;ll++)
02667 {
02668 j++;
02669 if (*(bllst10[ll]) == 'l') typ_l1[j]=1;
02670 else typ_l1[j]=0;
02671 }
02672 if (((*typ_l)=(int*)REALLOC((*typ_l),sizeof(int)*((*typ_l)[0]+typ_l1[0]+1))) == NULL ) return 0;
02673 pp=&(*typ_l)[1+(*typ_l)[0]];
02674 pp=memcpy(pp,&typ_l1[1],sizeof(int)*(typ_l1[0]));
02675 (*typ_l)[0]+=typ_l1[0];
02676
02677 if (((*typ_m)=(int*)REALLOC((*typ_m),sizeof(int)*((*typ_m)[0]+typ_m1[0]+1))) == NULL ) return 0;
02678 pp=&(*typ_m)[1+(*typ_m)[0]];
02679 pp=memcpy(pp,&typ_m1[1],sizeof(int)*(typ_m1[0]));
02680 (*typ_m)[0]+=typ_m1[0];
02681 FREE(typ_l1);typ_l1=NULL;
02682 FREE(typ_m1);typ_m1=NULL;
02683 return 0;
02684 }
02685
02686
02687 int adjust_inout(int* bllst2,int* bllst3,int* bllst2ptr,int* bllst3ptr,int* nzcross,int* nmode,int* connectmat,int* ok,int* corinvec,int* corinvptr,int nblk1)
02688 {
02689 int hhjj,j,hh,jj,nout,nin,findflag,mini1,mini2;
02690 int *wwi,*ww,*nww,*ind,*ind1,*wwi1,a,ninnout,*nww1;
02691 double k,k1;
02692 int kint,prt_out,prt_in;
02693 wwi=ww=nww=ind=ind1=wwi1=nww1=NULL;
02694
02695 for (hhjj=1;hhjj<nblk1+2;hhjj++)
02696 {
02697 for (hh=1;hh<nblk1+2;hh++)
02698 {
02699 *ok=true;
02700 for (jj=1;jj<connectmat[0]/4+1;jj++)
02701 {
02702 ww=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02703 nout=ww[connectmat[jj+connectmat[0]/4]];
02704 FREE(ww);
02705 ww=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02706 nin=ww[connectmat[jj+3*connectmat[0]/4]];
02707 FREE(ww);
02708 if (nout>0 && nin>0)
02709 {
02710 if (nin != nout)
02711 {
02712 ind1=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
02713 ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
02714 prt_out=connectmat[jj+connectmat[0]/4];
02715 prt_in=connectmat[jj+3*connectmat[0]/4];
02716 badconnection(ind1,prt_out,nout,ind,prt_in,nin);
02717 *ok=false;
02718 if(ind1) FREE (ind1);
02719 if(ind) FREE (ind);
02720 return 0;
02721 }
02722 }
02723 else if (nout>0 && nin<0)
02724 {
02725 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02726 ww=FindEg(wwi,nin);
02727 for (j=1;j<ww[0]+1;j++)
02728 {
02729 wwi[ww[j]]=nout;
02730 }
02731 for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02732 {
02733 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02734 }
02735 if(wwi) FREE(wwi);
02736 if(ww) FREE(ww);
02737 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
02738 if (wwi)
02739 {
02740 ww=FindEg(wwi,nin);
02741 if (ww)
02742 {
02743 for (j=1;j<ww[0]+1;j++)
02744 {
02745 wwi[ww[j]]=nout;
02746 }
02747 FREE(ww);
02748 for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02749 {
02750 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
02751 }
02752 }
02753
02754 FREE(wwi);
02755 }
02756 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
02757 if (wwi)
02758 {
02759 ww=FindEg(wwi,0);
02760 wwi1=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02761 mini1=Min1(wwi1);
02762 if (ww && (mini1 > 0))
02763 {
02764 a=Sum(wwi1);
02765 for (j=1;j<ww[0]+1;j++)
02766 {
02767 wwi[ww[j]]=a;
02768 }
02769 for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02770 {
02771 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
02772 }
02773 }
02774 FREE(ww);ww=NULL;
02775 FREE(wwi);wwi=NULL;
02776 if (wwi1) FREE(wwi1);
02777 wwi1=NULL;
02778 }
02779 if (nzcross[connectmat[jj+connectmat[0]/2]] == nin){
02780 nzcross[connectmat[jj+connectmat[0]/2]] = nout;
02781 }
02782 if (nmode[connectmat[jj+connectmat[0]/2]] == nin){
02783 nmode[connectmat[jj+connectmat[0]/2]] = nout;
02784 }
02785 }
02786 else if (nin>0 && nout<0)
02787 {
02788 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02789 ww=FindEg(wwi,nout);
02790 for (j=1;j<ww[0]+1;j++)
02791 {
02792 wwi[ww[j]]=nin;
02793 }
02794 for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
02795 {
02796 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
02797 }
02798 if(wwi) FREE(wwi);
02799 if(ww) FREE(ww);
02800
02801 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
02802 if (wwi)
02803 {
02804 ww=FindEg(wwi,nout);
02805 if (ww)
02806 {
02807 for (j=1;j<ww[0]+1;j++)
02808 {
02809 wwi[ww[j]]=nin;
02810 }
02811 if(ww) FREE(ww);
02812 }
02813 for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
02814 {
02815 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
02816 }
02817 if(wwi) FREE(wwi);
02818 }
02819 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
02820 if (!wwi)
02821 {
02822 if ((wwi=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
02823 wwi[0]=0;
02824 }
02825 ww=FindEg(wwi,0);
02826 wwi1=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02827 mini2=Min1(wwi1);
02828
02829 if ((ww != NULL) && (mini2 > 0))
02830 {
02831 a=Sum(wwi1);
02832 for (j=1;j<ww[0]+1;j++)
02833 {
02834 wwi[ww[j]]=a;
02835 }
02836 for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
02837 {
02838 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
02839 }
02840 }
02841 FREE(ww);ww=NULL;
02842 if(wwi1) FREE(wwi1);
02843 wwi1=NULL;
02844 if(wwi) FREE(wwi);
02845 wwi=NULL;
02846 if (nzcross[connectmat[jj]] == nout){
02847 nzcross[connectmat[jj]] = nin;
02848 }
02849 if (nmode[connectmat[jj]] == nout){
02850 nmode[connectmat[jj]] = nin;
02851 }
02852 }
02853 else if (nin==0)
02854 {
02855 ww=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
02856 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
02857 if (Min1(ww)>0)
02858 {
02859 if (nout>0)
02860 {
02861 if (Sum(ww)==nout)
02862 {
02863 wwi[connectmat[jj+3*connectmat[0]/4]]=nout;
02864 for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02865 {
02866 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02867 }
02868 }
02869 else
02870 {
02871 ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
02872 if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
02873 ind1[0]=1;
02874 ind1[1]=-1;
02875 badconnection(ind,0,0,ind1,0,0);
02876 *ok=false;
02877 if(ind) FREE (ind);
02878 if(ind1) FREE (ind1);
02879 return 0;
02880 }
02881 }
02882 else
02883 {
02884 wwi[connectmat[jj+3*connectmat[0]/4]]=Sum(ww);
02885 for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02886 {
02887 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02888 }
02889 *ok=false;
02890 }
02891 }
02892 else
02893 {
02894 ind=FindInf(ww,0);
02895 if ((nww=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02896 nww[0]=ind[0];
02897 for (j=1;j<ind[0]+1;j++)
02898 {
02899 nww[j]=ww[ind[j]]-ww[ind[1]];
02900 }
02901 if (Norm(nww)==0 && nout>0)
02902 {
02903 wwi[connectmat[jj+3*connectmat[0]/4]]=nout;
02904 for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02905 {
02906 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
02907 }
02908 ind1=FindSup(ww,0);
02909 if ((nww1=(int*)MALLOC(sizeof(int)*(ind1[0]+1))) == NULL ) return 0;
02910 nww1[0]=ind1[0];
02911 for (j=1;j<ind1[0]+1;j++)
02912 {
02913 nww1[j]=ww[ind1[j]];
02914 }
02915 k1=nout-Sum(nww1);
02916 k=k1/nww[0];
02917 kint=(int) k;
02918 FREE(nww1);
02919 FREE(ind1);
02920 if (k == (double) kint && k>0)
02921 {
02922 for (j=1;j<ind[0]+1;j++)
02923 {
02924 ww[ind[j]]=(int) k;
02925 }
02926 for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
02927 {
02928 bllst3[j]=ww[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
02929 }
02930 }
02931 else
02932 {
02933 ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
02934 if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
02935 ind1[0]=1;
02936 ind1[1]=-1;
02937 badconnection(ind,0,0,ind1,0,0);
02938 *ok=false;
02939 if(ind) FREE (ind);
02940 if(ind1) FREE (ind1);
02941 return 0;
02942 }
02943 }
02944 else
02945 {
02946 *ok=false;
02947 }
02948 FREE(ind);ind=NULL;
02949 FREE(nww);
02950 }
02951 FREE(ww);ww=NULL;
02952 FREE(wwi);wwi=NULL;
02953 }
02954 else if (nout==0)
02955 {
02956 ww=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
02957 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
02958 if (Min1(ww)>0)
02959 {
02960 if (nin>0)
02961 {
02962 if (Sum(ww)==nin)
02963 {
02964 wwi[connectmat[jj+connectmat[0]/4]]=nin;
02965 for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
02966 {
02967 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
02968 }
02969 }
02970 else
02971 {
02972 ind=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
02973 if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
02974 ind1[0]=1;
02975 ind1[1]=-1;
02976 badconnection(ind,0,0,ind1,0,0);
02977 *ok=false;
02978 if(ind) FREE (ind);
02979 if(ind1) FREE (ind1);
02980 return 0;
02981 }
02982 }
02983 else
02984 {
02985 wwi[connectmat[jj+connectmat[0]/4]]=Sum(ww);
02986 for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
02987 {
02988 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
02989 }
02990 *ok=false;
02991 }
02992 }
02993 else
02994 {
02995 ind=FindInf(ww,0);
02996 if ((nww=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
02997 nww[0]=ind[0];
02998 for (j=1;j<ind[0]+1;j++)
02999 {
03000 nww[j]=ww[ind[j]]-ww[ind[1]];
03001 }
03002 if (Norm(nww)==0 && nin>0)
03003 {
03004 wwi[connectmat[jj+connectmat[0]/4]]=nin;
03005 for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
03006 {
03007 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
03008 }
03009 ind1=FindSup(ww,0);
03010 if ((nww1=(int*)MALLOC(sizeof(int)*(ind1[0]+1))) == NULL ) return 0;
03011 nww1[0]=ind1[0];
03012 for (j=1;j<ind1[0]+1;j++)
03013 {
03014 nww1[j]=ww[ind1[j]];
03015 }
03016 FREE(ind1);
03017 k1=nin-Sum(nww1);
03018 k=k1/nww[0];
03019 FREE(nww1);
03020 kint=(int)k;
03021 if (k==(double) kint && k>0)
03022 {
03023 for (j=1;j<ind[0]+1;j++)
03024 {
03025 ww[ind[j]]= (int) k;
03026 }
03027 for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
03028 {
03029 bllst2[j]=ww[j-bllst2ptr[connectmat[jj]]+1];
03030 }
03031 }
03032 else
03033 {
03034 ind=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
03035 if ((ind1=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
03036 ind1[0]=1;
03037 ind1[1]=-1;
03038 badconnection(ind,0,0,ind1,0,0);
03039 *ok=false;
03040 if(ind) FREE (ind);
03041 if(ind1) FREE (ind1);
03042 return 0;
03043 }
03044 }
03045 else
03046 {
03047 *ok=false;
03048 }
03049 if(ind) FREE(ind); ind=NULL;
03050 if(nww) FREE(nww); nww=NULL;
03051 }
03052
03053 if(ww) FREE(ww); ww=NULL;
03054 if(wwi) FREE(wwi); wwi=NULL;
03055 }
03056 else
03057 {
03058 *ok=false;
03059 }
03060 }
03061 if (*ok) return 0;
03062 }
03063 Message("Not enough information to find port sizes, I try to find the problem");
03064 findflag=false;
03065 for (jj=1;jj<connectmat[0]/4+1;jj++)
03066 {
03067 ww=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
03068 nout=ww[connectmat[jj+connectmat[0]/4]];
03069 FREE(ww);
03070 ww=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
03071 nin=ww[connectmat[jj+3*connectmat[0]/4]];
03072 FREE(ww);
03073 if (nout<=0 && nin<=0)
03074 {
03075 findflag=true;
03076 ind1=GetPartVect(corinvec,corinvptr[connectmat[jj]],corinvptr[connectmat[jj]+1]-corinvptr[connectmat[jj]]);
03077 ind=GetPartVect(corinvec,corinvptr[connectmat[jj+connectmat[0]/2]],corinvptr[connectmat[jj+connectmat[0]/2]+1]-corinvptr[connectmat[jj+connectmat[0]/2]]);
03078
03079 ninnout=connection(ind1,ind);
03080 if(ind1) FREE (ind1);
03081 if(ind) FREE (ind);
03082 if (!(ninnout))
03083 {
03084 *ok=false;
03085 return 0;
03086 }
03087 if (ninnout<=0)
03088 {
03089 *ok=false;
03090 return 0;
03091 }
03092 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
03093 ww=FindEg(wwi,nout);
03094 for (j=1;j<ww[0]+1;j++)
03095 {
03096 wwi[ww[j]]=ninnout;
03097 }
03098 for (j=bllst3ptr[connectmat[jj]];j<bllst3ptr[connectmat[jj]+1];j++)
03099 {
03100 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj]]+1];
03101 }
03102 if(wwi) FREE(wwi);
03103 if(ww) FREE(ww);
03104 if (nzcross[connectmat[jj]] == nout){
03105 nzcross[connectmat[jj]] = ninnout;
03106 }
03107 if (nmode[connectmat[jj]] == nout){
03108 nmode[connectmat[jj]] = ninnout;
03109 }
03110
03111 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
03112 if (wwi)
03113 {
03114 ww=FindEg(wwi,nout);
03115 if (ww)
03116 {
03117 for (j=1;j<ww[0]+1;j++)
03118 {
03119 wwi[ww[j]]=ninnout;
03120 }
03121 if(ww) FREE(ww);
03122 }
03123 for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
03124 {
03125 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
03126 }
03127 if(wwi) FREE(wwi);
03128 }
03129 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj]],bllst2ptr[connectmat[jj]+1]-bllst2ptr[connectmat[jj]]);
03130 if (!wwi)
03131 {
03132 if ((wwi=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03133 wwi[0]=0;
03134 }
03135 ww=FindEg(wwi,0);
03136 wwi1=GetPartVect(bllst3,bllst3ptr[connectmat[jj]],bllst3ptr[connectmat[jj]+1]-bllst3ptr[connectmat[jj]]);
03137 mini2=Min1(wwi1);
03138
03139 if ((ww != NULL) && (mini2 > 0))
03140 {
03141 a=Sum(wwi1);
03142 for (j=1;j<ww[0]+1;j++)
03143 {
03144 wwi[ww[j]]=a;
03145 }
03146 for (j=bllst2ptr[connectmat[jj]];j<bllst2ptr[connectmat[jj]+1];j++)
03147 {
03148 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj]]+1];
03149 }
03150 }
03151 FREE(ww);ww=NULL;
03152 if(wwi1) FREE(wwi1);
03153 wwi1=NULL;
03154 if(wwi) FREE(wwi);
03155 wwi=NULL;
03156
03157 wwi=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
03158 ww=FindEg(wwi,nin);
03159 for (j=1;j<ww[0]+1;j++)
03160 {
03161 wwi[ww[j]]=ninnout;
03162 }
03163 for (j=bllst2ptr[connectmat[jj+connectmat[0]/2]];j<bllst2ptr[connectmat[jj+connectmat[0]/2]+1];j++)
03164 {
03165 bllst2[j]=wwi[j-bllst2ptr[connectmat[jj+connectmat[0]/2]]+1];
03166 }
03167 if(wwi) FREE(wwi);
03168 if(ww) FREE(ww);
03169
03170 if (nzcross[connectmat[jj+connectmat[0]/2]] == nin){
03171 nzcross[connectmat[jj+connectmat[0]/2]] = ninnout;
03172 }
03173 if (nmode[connectmat[jj+connectmat[0]/2]] == nin){
03174 nmode[connectmat[jj+connectmat[0]/2]] = ninnout;
03175 }
03176 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
03177 if (wwi)
03178 {
03179 ww=FindEg(wwi,nin);
03180 if (ww)
03181 {
03182 for (j=1;j<ww[0]+1;j++)
03183 {
03184 wwi[ww[j]]=ninnout;
03185 }
03186 FREE(ww);
03187 for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
03188 {
03189 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
03190 }
03191 }
03192
03193 FREE(wwi);
03194 }
03195 wwi=GetPartVect(bllst3,bllst3ptr[connectmat[jj+connectmat[0]/2]],bllst3ptr[connectmat[jj+connectmat[0]/2]+1]-bllst3ptr[connectmat[jj+connectmat[0]/2]]);
03196 if (wwi)
03197 {
03198 ww=FindEg(wwi,0);
03199 wwi1=GetPartVect(bllst2,bllst2ptr[connectmat[jj+connectmat[0]/2]],bllst2ptr[connectmat[jj+connectmat[0]/2]+1]-bllst2ptr[connectmat[jj+connectmat[0]/2]]);
03200 mini1=Min1(wwi1);
03201 if (ww && (mini1 > 0))
03202 {
03203 a=Sum(wwi1);
03204 for (j=1;j<ww[0]+1;j++)
03205 {
03206 wwi[ww[j]]=a;
03207 }
03208 for (j=bllst3ptr[connectmat[jj+connectmat[0]/2]];j<bllst3ptr[connectmat[jj+connectmat[0]/2]+1];j++)
03209 {
03210 bllst3[j]=wwi[j-bllst3ptr[connectmat[jj+connectmat[0]/2]]+1];
03211 }
03212 }
03213 FREE(ww);ww=NULL;
03214 FREE(wwi);wwi=NULL;
03215 if (wwi1) FREE(wwi1);
03216 wwi1=NULL;
03217 }
03218 }
03219 }
03220 if (!findflag )
03221 {
03222 Message("I cannot find a link with undetermined size; My guess is that you have a block with unconnected; undetermined output ports");
03223 *ok=false;
03224 return 0;
03225 }
03226 }
03227 return 0;
03228 }
03229
03230
03231
03232 int pak_ersi(int** clkconnect,int* typ_r,int* typ_l,int* outoin,int* outoinptr,
03233 int* tblock,int* typ_cons,int* bllst5ptr,int** exe_cons,int nblk)
03234 {
03235 int *all_out,*ind,*ind1,*vec,*cll,*ii,*oo,*r,*clkconnectind,*cllind,*nd,*pp,*ppget;
03236 int mm,j,l,k,a,nnd,max1;
03237 Mat4C clkconnecti;
03238 Mat2C exe_consi;
03239 Mat2C all_outi;
03240 nd=ind=ind1=all_out=vec=cll=ii=oo=r=clkconnectind=cllind=ppget=NULL;
03241 *exe_cons=NULL;
03242 if ((all_out=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03243 all_out[0]=0;
03244 for (k=1;k<bllst5ptr[0];k++)
03245 {
03246 if (typ_l[k]!=1)
03247 {
03248 a=bllst5ptr[k+1]-bllst5ptr[k];
03249 if (a >= 1)
03250 {
03251 if ((all_out=(int*)REALLOC(all_out,sizeof(int)*(all_out[0]+2*a+1))) == NULL ) return 0;
03252 if ((all_outi.col1=(int*)MALLOC(sizeof(int)*(all_out[0]/2+a+1))) == NULL ) return 0;
03253 all_outi.col1[0]=all_out[0]/2+a;
03254 if ((all_outi.col2=(int*)MALLOC(sizeof(int)*(all_out[0]/2+a+1))) == NULL ) return 0;
03255 all_outi.col2[0]=all_out[0]/2+a;
03256 for(l=1;l<all_out[0]/2+1;l++)
03257 {
03258 all_outi.col1[l]=all_out[l];
03259 all_outi.col2[l]=all_out[l+all_out[0]/2];
03260 }
03261 for (j=1;j<a+1;j++)
03262 {
03263 all_outi.col1[all_out[0]/2+j]=k;
03264 all_outi.col2[all_out[0]/2+j]=j;
03265 }
03266 all_out[0]=2*all_outi.col1[0];
03267 for(l=1;l<all_out[0]/2+1;l++)
03268 {
03269 all_out[l]=all_outi.col1[l];
03270 all_out[l+all_out[0]/2]=all_outi.col2[l];
03271 }
03272 FREE(all_outi.col1); all_outi.col1=NULL;
03273 FREE(all_outi.col2); all_outi.col2=NULL;
03274 }
03275 }
03276 }
03277 if ((all_outi.col1=(int*)MALLOC(sizeof(int)*(all_out[0]/2+2))) == NULL ) return 0;
03278 all_outi.col1[0]=all_out[0]/2+1;
03279 if ((all_outi.col2=(int*)MALLOC(sizeof(int)*(all_out[0]/2+2))) == NULL ) return 0;
03280 all_outi.col2[0]=all_out[0]/2+1;
03281 for(l=1;l<all_out[0]/2+1;l++)
03282 {
03283 all_outi.col1[l]=all_out[l];
03284 all_outi.col2[l]=all_out[l+all_out[0]/2];
03285 }
03286 all_outi.col1[all_out[0]/2+1]=0;
03287 all_outi.col2[all_out[0]/2+1]=0;
03288 if ((all_out=(int*)REALLOC(all_out,sizeof(int)*(2*all_outi.col1[0]+1))) == NULL ) return 0;
03289 all_out[0]=2*all_outi.col1[0];
03290 for(l=1;l<all_out[0]/2+1;l++)
03291 {
03292 all_out[l]=all_outi.col1[l];
03293 all_out[l+all_out[0]/2]=all_outi.col2[l];
03294 }
03295 FREE(all_outi.col1);
03296 all_outi.col1=NULL;
03297 FREE(all_outi.col2);
03298 all_outi.col2=NULL;
03299
03300 ind=FindEg(tblock,1);
03301 if (!ind)
03302 {
03303 if ((ind=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03304 ind[0]=0;
03305 }
03306 for (j=1;j<ind[0]+1;j++)
03307 {
03308 k=ind[j];
03309 if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03310 clkconnecti.col1[0]=(*clkconnect)[0]/4+all_out[0]/2;
03311 if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03312 clkconnecti.col2[0]=(*clkconnect)[0]/4+all_out[0]/2;
03313 if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03314 clkconnecti.col3[0]=(*clkconnect)[0]/4+all_out[0]/2;
03315 if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+all_out[0]/2+1))) == NULL ) return 0;
03316 clkconnecti.col4[0]=(*clkconnect)[0]/4+all_out[0]/2;
03317 for(l=1;l<(*clkconnect)[0]/4+1;l++)
03318 {
03319 clkconnecti.col1[l]=(*clkconnect)[l];
03320 clkconnecti.col2[l]=(*clkconnect)[l+(*clkconnect)[0]/4];
03321 clkconnecti.col3[l]=(*clkconnect)[l+(*clkconnect)[0]/2];
03322 clkconnecti.col4[l]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
03323 }
03324 for(l=1;l<all_out[0]/2+1;l++)
03325 {
03326 clkconnecti.col1[l+(*clkconnect)[0]/4]=all_out[l];
03327 clkconnecti.col2[l+(*clkconnect)[0]/4]=all_out[l+all_out[0]/2];
03328 clkconnecti.col3[l+(*clkconnect)[0]/4]=k;
03329 clkconnecti.col4[l+(*clkconnect)[0]/4]=0;
03330 }
03331 FREE(*clkconnect);
03332 if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
03333 (*clkconnect)[0]=4*clkconnecti.col1[0];
03334 for(l=1;l<(*clkconnect)[0]/4+1;l++)
03335 {
03336 (*clkconnect)[l]=clkconnecti.col1[l];
03337 (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
03338 (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
03339 (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
03340 }
03341 FREE(clkconnecti.col1);
03342 clkconnecti.col1=NULL;
03343 FREE(clkconnecti.col2);
03344 clkconnecti.col2=NULL;
03345 FREE(clkconnecti.col3);
03346 clkconnecti.col3=NULL;
03347 FREE(clkconnecti.col4);
03348 clkconnecti.col4=NULL;
03349 }
03350 FREE(all_out);all_out=NULL;
03351 ind1=FindEg(typ_cons,1);
03352 if (ind1)
03353 {
03354 if ((ind=(int*)REALLOC(ind,sizeof(int)*(ind[0]+ind1[0]+1))) == NULL ) return 0;
03355 pp=&ind[1+ind[0]];
03356 pp=memcpy(pp,&ind1[1],ind1[0]*sizeof(int));
03357 ind[0]=ind[0]+ind1[0];
03358 FREE(ind1); ind1=NULL;
03359 }
03360 if (((*exe_cons)=(int*)MALLOC(sizeof(int)*(2*ind[0]+1))) == NULL ) return 0;
03361 (*exe_cons)[0]=2*ind[0];
03362 for (j=1;j<ind[0]+1;j++)
03363 {
03364 (*exe_cons)[j]=ind[j];
03365 (*exe_cons)[j+ind[0]]=0;
03366 }
03367 if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
03368 vec[0]=nblk;
03369 Setmem(vec,-1);
03370 for (j=1;j<ind[0]+1;j++)
03371 {
03372 vec[ind[j]]=0;
03373 }
03374 nd=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
03375 if (!nd)
03376 {
03377 if ((nd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03378 nd[0]=0;
03379 }
03380 max1=Max1(nd);
03381 FREE(nd);
03382 nnd=max1+1;
03383 if ((nd=(int*)CALLOC((nblk*nnd+1),sizeof(int))) == NULL ) return 0;
03384 nd[0]=nblk*nnd;
03385
03386 tree4(vec,nd,nnd,outoin,outoinptr,typ_r,&r);
03387 if(nd) FREE(nd);
03388 if(vec) FREE(vec); vec=NULL;
03389 if (r)
03390 {
03391 if ((exe_consi.col1=(int*)MALLOC(sizeof(int)*((*exe_cons)[0]/2+r[0]/2+1))) == NULL) return 0;
03392
03393 if ((exe_consi.col2=(int*)MALLOC(sizeof(int)*(r[0]/2+(*exe_cons)[0]/2+1))) == NULL) return 0;
03394 exe_consi.col2[0]=(*exe_cons)[0]/2+r[0]/2;
03395 pp=&(exe_consi.col1)[1];
03396 pp=memcpy(pp,&(*exe_cons)[1],sizeof(int)*((*exe_cons)[0]/2));
03397 exe_consi.col1[0]=(*exe_cons)[0]/2+r[0]/2;
03398 pp=&(exe_consi.col2)[1];
03399 pp=memcpy(pp,&(*exe_cons)[(*exe_cons)[0]/2+1],sizeof(int)*((*exe_cons)[0]/2));
03400 pp=&(exe_consi.col1)[(*exe_cons)[0]/2+1];
03401 pp=memcpy(pp,&r[1],sizeof(int)*(r[0]/2));
03402 pp=&(exe_consi.col2)[(*exe_cons)[0]/2+1];
03403 pp=memcpy(pp,&r[1+r[0]/2],sizeof(int)*(r[0]/2));
03404
03405 if (((*exe_cons)=(int*)REALLOC((*exe_cons),sizeof(int)*((*exe_cons)[0]+r[0]+1))) == NULL ) return 0;
03406 (*exe_cons)[0]=(*exe_cons)[0]+r[0];
03407 for(l=1;l<(*exe_cons)[0]/2+1;l++)
03408 {
03409 (*exe_cons)[l]=exe_consi.col1[l];
03410 (*exe_cons)[l+(*exe_cons)[0]/2]=exe_consi.col2[l];
03411 }
03412 FREE(exe_consi.col1);
03413 exe_consi.col1=NULL;
03414 exe_consi.col1=NULL;
03415 FREE(exe_consi.col2);
03416 exe_consi.col2=NULL;
03417 FREE(r); r=NULL;
03418 }
03419 if(ind) FREE(ind);
03420
03421 mm=Max1(*clkconnect)+1;
03422 if ((cll=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
03423 cll[0]=(*clkconnect)[0]/4;
03424 for(j=1;j<cll[0]+1;j++)
03425 {
03426 cll[j]=-(*clkconnect)[j]*mm-(*clkconnect)[j+(*clkconnect)[0]/4];
03427 }
03428 if ((ind=(int*)MALLOC(sizeof(int)*(cll[0]+1))) == NULL ) return 0;
03429 ind[0]=cll[0];
03430 C2F(isort)(&cll[1],&cll[0],&ind[1]);
03431 clkconnectind=VecEg1(*clkconnect);
03432 for(j=1;j<ind[0]+1;j++)
03433 {
03434 (*clkconnect)[j]=clkconnectind[ind[j]];
03435 (*clkconnect)[j+ind[0]]=clkconnectind[ind[j]+ind[0]];
03436 (*clkconnect)[j+2*ind[0]]=clkconnectind[ind[j]+2*ind[0]];
03437 (*clkconnect)[j+3*ind[0]]=clkconnectind[ind[j]+3*ind[0]];
03438 }
03439 if(ind) FREE(ind);
03440 ind=NULL;
03441 if(clkconnectind) FREE(clkconnectind);
03442 clkconnectind=NULL;
03443 if ((cll=(int*)REALLOC(cll,sizeof(int)*((*clkconnect)[0]/4+3))) == NULL ) return 0;
03444 cll[0]=(*clkconnect)[0]/4+2;
03445 cllind=VecEg1(cll);
03446 for (j=2;j<cll[0]+1;j++)
03447 {
03448 cll[j]=-cllind[j-1];
03449 }
03450 if(cllind) FREE(cllind);
03451 cllind=NULL;
03452 cll[1]=-1;
03453 cll[cll[0]]=mm;
03454 if ((vec=(int*)MALLOC(sizeof(int)*(cll[0]))) == NULL ) return 0;
03455 vec[0]=cll[0]-1;
03456 for (j=1;j<vec[0]+1;j++)
03457 {
03458 vec[j]=cll[j+1]-cll[j];
03459 }
03460 if(cll) FREE(cll);
03461 cll=NULL;
03462 ii=FindDif(vec,0);
03463 if(vec) FREE(vec);
03464 for (k=1;k<ii[0];k++)
03465 {
03466 if ((oo=(int*)MALLOC(sizeof(int)*(ii[k+1]-ii[k]+1))) == NULL ) return 0;
03467 oo[0]=ii[k+1]-ii[k];
03468 for (l=ii[k];l<ii[k+1];l++)
03469 {
03470 oo[l-ii[k]+1]=l;
03471 }
03472 if ((vec=(int*)MALLOC(sizeof(int)*(nblk+1))) == NULL ) return 0;
03473 vec[0]=nblk;
03474 Setmem(vec,-1);
03475 for(j=1;j<oo[0]+1;j++)
03476 {
03477 vec[(*clkconnect)[oo[j]+(*clkconnect)[0]/2]]=0;
03478 }
03479 if (oo) FREE(oo); oo=NULL;
03480 ppget=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
03481 if(!ppget)
03482 {
03483 if ((ppget=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03484 ppget[0]=0;
03485 }
03486 max1=Max1(ppget);
03487 if (ppget) FREE(ppget);
03488 ppget=NULL;
03489 nnd=max1+1;
03490 if ((nd=(int*)CALLOC((nblk*nnd+1),sizeof(int))) == NULL ) return 0;
03491 nd[0]=nblk*nnd;
03492
03493 tree4(vec,nd,nnd,outoin,outoinptr,typ_r,&r);
03494
03495 if (nd) FREE(nd); nd=NULL;
03496 if(vec) FREE(vec); vec=NULL;
03497
03498 if (r)
03499 {
03500 if ((clkconnecti.col1=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03501 clkconnecti.col1[0]=(*clkconnect)[0]/4+r[0]/2;
03502 if ((clkconnecti.col2=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03503 clkconnecti.col2[0]=(*clkconnect)[0]/4+r[0]/2;
03504 if ((clkconnecti.col3=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03505 clkconnecti.col3[0]=(*clkconnect)[0]/4+r[0]/2;
03506 if ((clkconnecti.col4=(int*)MALLOC(sizeof(int)*((*clkconnect)[0]/4+r[0]/2+1))) == NULL ) return 0;
03507 clkconnecti.col4[0]=(*clkconnect)[0]/4+r[0]/2;
03508 for(l=1;l<(*clkconnect)[0]/4+1;l++)
03509 {
03510 clkconnecti.col1[l]=(*clkconnect)[l];
03511 clkconnecti.col2[l]=(*clkconnect)[l+(*clkconnect)[0]/4];
03512 clkconnecti.col3[l]=(*clkconnect)[l+(*clkconnect)[0]/2];
03513 clkconnecti.col4[l]=(*clkconnect)[l+3*(*clkconnect)[0]/4];
03514 }
03515 for(l=1;l<r[0]/2+1;l++)
03516 {
03517 clkconnecti.col1[l+(*clkconnect)[0]/4]=(*clkconnect)[ii[k]];
03518 clkconnecti.col2[l+(*clkconnect)[0]/4]=(*clkconnect)[ii[k]+(*clkconnect)[0]/4];
03519 clkconnecti.col3[l+(*clkconnect)[0]/4]=r[l];
03520 clkconnecti.col4[l+(*clkconnect)[0]/4]=r[l+r[0]/2];
03521 }
03522 FREE(*clkconnect);
03523 if (((*clkconnect)=(int*)MALLOC(sizeof(int)*(4*clkconnecti.col1[0]+1))) == NULL ) return 0;
03524 (*clkconnect)[0]=4*clkconnecti.col1[0];
03525 for(l=1;l<(*clkconnect)[0]/4+1;l++)
03526 {
03527 (*clkconnect)[l]=clkconnecti.col1[l];
03528 (*clkconnect)[l+(*clkconnect)[0]/4]=clkconnecti.col2[l];
03529 (*clkconnect)[l+(*clkconnect)[0]/2]=clkconnecti.col3[l];
03530 (*clkconnect)[l+3*(*clkconnect)[0]/4]=clkconnecti.col4[l];
03531 }
03532 FREE(clkconnecti.col1);
03533 clkconnecti.col1=NULL;
03534 FREE(clkconnecti.col2);
03535 clkconnecti.col2=NULL;
03536 FREE(clkconnecti.col3);
03537 clkconnecti.col3=NULL;
03538 FREE(clkconnecti.col4);
03539 clkconnecti.col4=NULL;
03540 FREE(r); r=NULL;
03541 }
03542 }
03543 if(ii) FREE(ii);
03544 ii=NULL;
03545
03546 return 0;
03547 }
03548
03549
03550 int mini_extract_info(int* bllst2,int** bllst4,char **bllst10,int* bllst12,int* bllst2ptr,int* bllst3ptr,int** bllst4ptr,
03551 int* typ_x,int* connectmat,int* clkconnect,int** inplnk,int** outlnk,int** typ_l,int** typ_r,int** typ_m,
03552 int** tblock,int** typ_cons,int** typ_zx,int* nzcross,int* ok)
03553
03554 {
03555 int j,ptlnk,l,ko,ki,nbl=((int*)bllst10)[0];
03556 int *inpnum,*cinpnum,*bllst4i,*ind,*fff,*bllst4ptri;
03557 inpnum=cinpnum=bllst4i=ind=fff=bllst4ptri=NULL;
03558 *ok=true;
03559 if ((fff=(int*)MALLOC(sizeof(int)*(nbl+1)))==NULL) return 0;
03560 fff[0]=nbl;
03561 Setmem(fff,1);
03562 (*typ_l)=VecEg1(fff);
03563 (*typ_r)=VecEg1(fff);
03564 (*typ_cons)=VecEg1(fff);
03565 (*typ_m)=VecEg1(fff);
03566 (*typ_zx)=VecEg1(fff);
03567 (*tblock)=VecEg1(fff);
03568 if (fff) {FREE(fff);
03569 fff=NULL;}
03570
03571 for(j=1;j<nbl+1;j++)
03572 {
03573 if ( !(typ_x[j]) && (nzcross[j] == 0)) (*typ_zx)[j]=0;
03574 bllst4ptri=VecEg1(*bllst4ptr);
03575 inpnum=GetPartVect(bllst2,bllst2ptr[j],bllst2ptr[j+1]-bllst2ptr[j]);
03576 cinpnum=GetPartVect(*bllst4,(*bllst4ptr)[j],(*bllst4ptr)[j+1]-(*bllst4ptr)[j]);
03577 if (cinpnum == NULL)
03578 {
03579 ok= false;
03580 ((int*)(*typ_r))[j]=!(bllst12[j+bllst12[0]/2]);
03581 ((int*)(*tblock))[j]=bllst12[j+bllst12[0]/2];
03582 if(!(bllst12[j+bllst12[0]/2]))
03583 {
03584 if (inpnum)
03585 {
03586 if ((cinpnum=(int*)MALLOC(sizeof(int)*(inpnum[0]+1))) == NULL) return 0;
03587 cinpnum[0]=inpnum[0];
03588 Setmem(cinpnum,1);
03589 bllst4i=VecEg1(*bllst4);
03590 if (((*bllst4)=(int*)REALLOC((*bllst4),sizeof(int)*((*bllst4)[0]+cinpnum[0]+1))) == NULL ) return 0;
03591 (*bllst4)[0]=(*bllst4)[0]+cinpnum[0];
03592 for(l=j+1;l<(*bllst4ptr)[0]+1;l++) (*bllst4ptr)[l]=bllst4ptri[l]+cinpnum[0];
03593
03594 for (l=(*bllst4ptr)[1];l<(*bllst4ptr)[j];l++)
03595 {
03596 (*bllst4)[l]=bllst4i[l];
03597 }
03598 for (l=1;l<cinpnum[0]+1;l++)
03599 {
03600 (*bllst4)[l+(*bllst4ptr)[j]-1]=cinpnum[l];
03601 }
03602 for (l=(*bllst4ptr)[j+1];l<(*bllst4ptr)[(*bllst4ptr)[0]];l++)
03603 {
03604 (*bllst4)[l]=bllst4i[l-cinpnum[0]];
03605 }
03606 if (bllst4i) FREE(bllst4i);
03607 }
03608 }
03609 }
03610 else
03611 {
03612 (*tblock)[j]=bllst12[j+bllst12[0]/2];
03613 (*typ_r)[j]=false;
03614 }
03615 (*typ_l)[j]=*(bllst10[j]) == 'l';
03616 (*typ_m)[j]=*(bllst10[j]) == 'm';
03617 (*typ_cons)[j]=((cinpnum==NULL)&&(inpnum==NULL)&&(!bllst12[j+bllst12[0]/2]));
03618 if(bllst4ptri) FREE(bllst4ptri);
03619 if (inpnum) FREE(inpnum);
03620 if (cinpnum) FREE(cinpnum);
03621 }
03622
03623 if (((*inplnk)=(int*)CALLOC(bllst2ptr[bllst2ptr[0]],sizeof(int))) == NULL) return 0;
03624 (*inplnk)[0]=bllst2ptr[bllst2ptr[0]]-1;
03625 if (((*outlnk)=(int*)CALLOC(bllst3ptr[bllst3ptr[0]],sizeof(int))) == NULL) return 0;
03626 (*outlnk)[0]=bllst3ptr[bllst3ptr[0]]-1;
03627 ptlnk=1;
03628 for (j=1;j<connectmat[0]/4+1;j++)
03629 {
03630 ko=(*outlnk)[bllst3ptr[connectmat[j]]+connectmat[j+connectmat[0]/4]-1];
03631 ki=(*inplnk)[bllst2ptr[connectmat[j+connectmat[0]/2]]+connectmat[j+3*connectmat[0]/4]-1];
03632 if (ko!=0 && ki!=0)
03633 {
03634 if (ko>ki)
03635 {
03636 ind=FindSup(*outlnk,ko);
03637 for (l=1;l<ind[0]+1;l++)
03638 {
03639 (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
03640 }
03641 if(ind) FREE(ind); ind=NULL;
03642 ind=FindEg(*outlnk,ko);
03643 for (l=1;l<ind[0]+1;l++)
03644 {
03645 (*outlnk)[ind[l]]=ki;
03646 }
03647
03648 if(ind) FREE(ind);ind=NULL;
03649 ind=FindSup(*inplnk,ko);
03650 for (l=1;l<ind[0]+1;l++)
03651 {
03652 (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
03653 }
03654 if (ind) FREE(ind);ind=NULL;
03655 ind=FindEg(*inplnk,ko);
03656 for (l=1;l<ind[0]+1;l++)
03657 {
03658 (*inplnk)[ind[l]]=ki;
03659 }
03660 ptlnk--;
03661 if(ind) FREE(ind); ind=NULL;
03662 }
03663 else if (ki>ko)
03664 {
03665 ind=FindSup(*outlnk,ki);
03666 for (l=1;l<ind[0]+1;l++)
03667 {
03668 (*outlnk)[ind[l]]=(*outlnk)[ind[l]]-1;
03669 }
03670 if(ind) FREE(ind); ind=NULL;
03671 ind=FindEg(*outlnk,ki);
03672 for (l=1;l<ind[0]+1;l++)
03673 {
03674 (*outlnk)[ind[l]]=ko;
03675 }
03676 if(ind) FREE(ind); ind=NULL;
03677 ind=FindSup(*inplnk,ki);
03678 for (l=1;l<ind[0]+1;l++)
03679 {
03680 (*inplnk)[ind[l]]=(*inplnk)[ind[l]]-1;
03681 }
03682 if (ind) FREE(ind); ind=NULL;
03683 ind=FindEg(*inplnk,ki);
03684 for (l=1;l<ind[0]+1;l++)
03685 {
03686 (*inplnk)[ind[l]]=ko;
03687 }
03688 ptlnk--;
03689 if (ind) FREE(ind); ind=NULL;
03690 }
03691 }
03692 else if (ko!=0)
03693 {
03694 (*inplnk)[bllst2ptr[connectmat[j+connectmat[0]/2]]+connectmat[j+3*connectmat[0]/4]-1]=ko;
03695 }
03696 else if (ki!=0)
03697 {
03698 (*outlnk)[bllst3ptr[connectmat[j]]+connectmat[j+connectmat[0]/4]-1]=ki;
03699 }
03700 else
03701 {
03702 (*outlnk)[bllst3ptr[connectmat[j]]+connectmat[j+connectmat[0]/4]-1]=ptlnk;
03703 (*inplnk)[bllst2ptr[connectmat[j+connectmat[0]/2]]+connectmat[j+3*connectmat[0]/4]-1]=ptlnk;
03704 ptlnk++;
03705 }
03706 }
03707 ind=FindEg(*outlnk,0);
03708 if (ind)
03709 {
03710 ko=Max1(*outlnk);
03711 for (j=1;j<ind[0]+1;j++)
03712 {
03713 (*outlnk)[ind[j]]=ko+1;
03714 }
03715 FREE(ind);ind=NULL;
03716 }
03717
03718 return 0;
03719 }
03720
03721
03722 int synch_clkconnect(int* typ_s,int* clkconnect,int** evoutoin,int** evoutoinptr)
03723 {
03724 int *dd,*ind,*ppget;
03725 register int j,l;
03726 ind=NULL;
03727 dd=NULL;
03728 ppget=NULL;
03729 if (((*evoutoin)=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03730 (*evoutoin)[0]=0;
03731 if (((*evoutoinptr)=(int*)MALLOC(sizeof(int)*2)) == NULL ) return 0;
03732 (*evoutoinptr)[0]=1;
03733 (*evoutoinptr)[1]=1;
03734 for (j=1;j<typ_s[0]+1;j++)
03735 {
03736 if (typ_s[j])
03737 {
03738
03739 ppget=GetPartVect(clkconnect,1,clkconnect[0]/4);
03740 ind=FindEg(ppget,j);
03741 if (ppget)FREE(ppget); ppget=NULL;
03742 if (ind)
03743 {
03744 if ((dd=(int*)MALLOC(sizeof(int)*(ind[0]+1))) == NULL ) return 0;
03745 dd[0]=ind[0];
03746 for(l=1;l<ind[0]+1;l++)
03747 {
03748 dd[l]=clkconnect[ind[l]+clkconnect[0]/2];
03749 }
03750 FREE(ind); ind=NULL;
03751 if (!dd)
03752 {
03753 if ((dd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03754 dd[0]=0;
03755 }
03756 }
03757 }
03758 else
03759 {
03760 if ((dd=(int*)MALLOC(sizeof(int))) == NULL ) return 0;
03761 dd[0]=0;
03762 }
03763
03764 if (((*evoutoin)=(int*)REALLOC((*evoutoin),sizeof(int)*((*evoutoin)[0]+dd[0]+1))) == NULL ) return 0;
03765 if (((*evoutoinptr)=(int*)REALLOC((*evoutoinptr),sizeof(int)*((*evoutoinptr)[0]+2))) == NULL ) return 0;
03766 for(l=1;l<dd[0]+1;l++)
03767 {
03768 (*evoutoin)[l+(*evoutoin)[0]]=dd[l];
03769 }
03770
03771 (*evoutoinptr)[(*evoutoinptr)[0]+1]=(*evoutoinptr)[(*evoutoinptr)[0]]+dd[0];
03772 (*evoutoin)[0]=(*evoutoin)[0]+dd[0];
03773 (*evoutoinptr)[0]++;
03774 FREE(dd); dd=NULL;
03775 }
03776
03777 return 0;
03778 }
03779
03780
03781 int cleanup(int** clkconnect)
03782 {
03783 int a,i,mm,j,*ind,*vec,*clkconnectind,val=0;
03784 double *cc;
03785 ind=vec=NULL;
03786 cc=NULL;
03787 mm=Max1(*clkconnect)+1;
03788 if ((cc=(double*)MALLOC(sizeof(double)*((*clkconnect)[0]/4+1))) == NULL ) return 0;
03789 a=(*clkconnect)[0]/4;
03790 cc[0]=a;
03791 for (j=1;j<(*clkconnect)[0]/4+1;j++)
03792 {
03793 cc[j]=-(*clkconnect)[j+3*(*clkconnect)[0]/4]-mm*(*clkconnect)[j+(*clkconnect)[0]/2]-power(mm,2)*(*clkconnect)[j+(*clkconnect)[0]/4]-(double) power(mm,3)*(*clkconnect)[j];
03794 }
03795 if ((ind=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
03796 ind[0]=a;
03797 C2F(dsort)(&cc[1],&a,&ind[1]);
03798 clkconnectind=VecEg1(*clkconnect);
03799 for(j=1;j<ind[0]+1;j++)
03800 {
03801 (*clkconnect)[j]=clkconnectind[ind[j]];
03802 (*clkconnect)[j+ind[0]]=clkconnectind[ind[j]+ind[0]];
03803 (*clkconnect)[j+2*ind[0]]=clkconnectind[ind[j]+2*ind[0]];
03804 (*clkconnect)[j+3*ind[0]]=clkconnectind[ind[j]+3*ind[0]];
03805 }
03806 FREE(clkconnectind); clkconnectind=NULL;
03807 if(ind) FREE(ind);ind=NULL;
03808 if ((vec=(int*)MALLOC((size_t) (sizeof(int)*(cc[0])))) == NULL ) return 0;
03809 vec[0]=(int) cc[0]-1;
03810 for (j=1;j<vec[0]+1;j++)
03811 {
03812 vec[j]=(int) (cc[j+1]-cc[j]);
03813 }
03814 if(cc) FREE(cc); cc=NULL;
03815 ind=FindEg(vec,0);
03816 if(vec) FREE(vec); vec=NULL;
03817 if (ind)
03818 {
03819 for(j=1;j<ind[0]+1;j++)
03820 {
03821 (*clkconnect)[ind[j]]=-4321;
03822 (*clkconnect)[ind[j]+(*clkconnect)[0]/4]=-4321;
03823 (*clkconnect)[ind[j]+(*clkconnect)[0]/2]=-4321;
03824 (*clkconnect)[ind[j]+3*(*clkconnect)[0]/4]=-4321;
03825 }
03826 for(i=1;i<(*clkconnect)[0]+1;i++)
03827 {
03828 if( (*clkconnect)[i]!=-4321 ) (*clkconnect)[i-val]=(*clkconnect)[i];
03829 else
03830 val++;
03831 }
03832 (*clkconnect)[0]=(*clkconnect)[0]-4*ind[0];
03833 FREE(ind); ind=NULL;
03834 }
03835
03836 return 0;
03837 }
03838
03839
03840 int init_agenda(double* initexe,int* bllst5ptr,double** tevts,int** evtspt,int* pointi)
03841 {
03842 int nblk,j,ninit,nevts;
03843 int *indtime,a;
03844 double *timevec,*initexeind,*pp;
03845 initexeind=NULL;
03846 timevec=NULL;
03847 indtime=NULL;
03848 nblk=bllst5ptr[0]-1;
03849 timevec=GetPartVectd(initexe,2*((int) initexe[0])/3+1,(int) initexe[0]/3);
03850 if ( timevec )
03851 {
03852 Invd(timevec);
03853 a=(int) timevec[0];
03854 if ((indtime=(int*)MALLOC(sizeof(int)*(a+1))) == NULL ) return 0;
03855 indtime[0]=a;
03856 C2F(dsort)(&timevec[1],&a,&indtime[1]);
03857 if ((initexeind=(double*)MALLOC(sizeof(double)*((int) initexe[0]+1))) == NULL ) return 0;
03858 initexeind[0]=(int) initexe[0];
03859 pp=&initexeind[1];
03860 pp=memcpy(pp,&initexe[1],sizeof(double)*((int) initexe[0]));
03861 for(j=1;j<indtime[0]+1;j++)
03862 {
03863 initexe[j]=initexeind[indtime[j]];
03864 initexe[j+(int) initexeind[0]/3]=initexeind[indtime[j]+(int) initexeind[0]/3];
03865 initexe[j+2* (int) initexeind[0]/3]=initexeind[indtime[j]+2* (int) initexeind[0]/3];
03866 }
03867 if(initexeind) FREE(initexeind);
03868 if(indtime) FREE(indtime);
03869 FREE(timevec);
03870 ninit=(int) initexe[0]/3;
03871 }
03872 else {initexe=NULL;ninit=0;}
03873
03874 *pointi=0;
03875 nevts=bllst5ptr[nblk+1]-1;
03876 if (((*tevts)=(double*)CALLOC((nevts+1),sizeof(double))) == NULL) return 0 ;
03877 ((*tevts)[0])=nevts;
03878 if ( initexe != NULL)
03879 {
03880 for (j=1;j<ninit+1;j++)
03881 {
03882 (*tevts)[bllst5ptr[(int) initexe[j]]+(int) initexe[j+ninit]-1]=initexe[j+2*ninit];
03883 }
03884 }
03885 if (((*evtspt)=(int*)MALLOC(sizeof(int)*(nevts+1))) == NULL) return 0 ;
03886 (*evtspt)[0]=nevts;
03887 Setmem(*evtspt,-1);
03888 if ( ninit > 0 )
03889 {
03890 *pointi=bllst5ptr[(int) initexe[1]]+(int) initexe[1+ninit]-1;
03891 (*evtspt)[*pointi]=0;
03892 }
03893 if ( ninit > 1 )
03894 {
03895 for (j=1;j<ninit;j++)
03896 {
03897 (*evtspt)[bllst5ptr[(int) initexe[j]]+(int) initexe[j+ninit]-1]=bllst5ptr[(int) initexe[j+1]]+(int) initexe[j+1+ninit]-1;
03898 }
03899 (*evtspt)[bllst5ptr[(int) initexe[ninit]]+(int) initexe[ninit+ninit]-1]=0;
03900 }
03901 return 0;
03902 }
03903
03904
03905 int tree4(int* vec,int* nd,int nnd,int* outoin,int* outoinptr,int* typ_r,int** r)
03906 {
03907 int i,j,fini=0,k,ii,*ind,*ind1,l,nb=vec[0];
03908 Mat2C ri;
03909 if ((*r=(int*)MALLOC(sizeof(int))) == NULL) return 0 ;
03910 (*r)[0]=0;
03911 ind=GetPartVect(outoin,1,outoin[0]/2);
03912 ind1=GetPartVect(outoin,outoin[0]/2+1,outoin[0]/2);
03913 for (j = 1 ; (j < nb) && (! fini); j++)
03914 {
03915 fini=1;
03916 for (i=1;i<nb+1;i++)
03917 {
03918 if (vec[i] > -1)
03919 {
03920 if (outoinptr[i+1]-outoinptr[i] !=0){
03921 for (k=outoinptr[i];k<outoinptr[i+1];k++)
03922 {
03923 ii=ind[k];
03924 if(typ_r[ii] == 1)
03925 {
03926 if(nd[ind1[k]+1+(ii-1)*nnd] == 0){
03927 if ((ri.col1=(int*)MALLOC(sizeof(int)*((*r)[0]/2+2))) == NULL ) return 0;
03928 ri.col1[0]=(*r)[0]/2+1;
03929 if ((ri.col2=(int*)MALLOC(sizeof(int)*((*r)[0]/2+2))) == NULL ) return 0;
03930 ri.col2[0]=(*r)[0]/2+1;
03931 for(l=1;l<(*r)[0]/2+1;l++)
03932 {
03933 ri.col1[l]=(*r)[l];
03934 ri.col2[l]=(*r)[l+(*r)[0]/2];
03935 }
03936 ri.col1[(*r)[0]/2+1]=ind[k];
03937 ri.col2[(*r)[0]/2+1]=ind1[k];
03938 FREE(*r);
03939 if ((*r=(int*)MALLOC(sizeof(int)*(2*ri.col1[0]+1))) == NULL ) return 0;
03940 (*r)[0]=2*ri.col1[0];
03941 for(l=1;l<(*r)[0]/2+1;l++)
03942 {
03943 (*r)[l]=ri.col1[l];
03944 (*r)[l+(*r)[0]/2]=ri.col2[l];
03945 }
03946 FREE(ri.col1);
03947 ri.col1=NULL;
03948 FREE(ri.col2);
03949 ri.col2=NULL;
03950 vec[ii]=0;
03951 fini=0;
03952 nd[ind1[k]+1+(ii-1)*nnd]=1;
03953 }
03954 }
03955 }
03956 }
03957 }
03958 }
03959 }
03960 if ((*r)[0]==0)
03961 {
03962 FREE(*r);
03963 *r=NULL;
03964 }
03965 FREE(ind1);
03966 ind1=NULL;
03967 FREE(ind);
03968 ind=NULL;
03969
03970 return 0;
03971 }
03972
03973
03974
03975 int tree2(vect, nb, wec, ind, deput, outoin, outoinptr, ord, ok)
03976 int *vect,nb,*wec,*ind,*deput,*outoin,*outoinptr,**ord,*ok;
03977 {
03978 int fini=0,i,j,k,m,ii,*ord1,n;
03979 ord1=NULL;
03980 *ok = 1;
03981 for (j = 1; (j <= nb+2) && (! fini); ++j)
03982 {
03983 fini = 1;
03984 for (i = 1; i <= nb; ++i)
03985 {
03986 if (vect[i] == j - 1)
03987 {
03988 if (j == nb + 2)
03989 {
03990 *ok = 0;
03991 *ord=NULL;
03992 return 0;
03993 }
03994 if (outoinptr[ind[i] + 1] - outoinptr[ind[i]] != 0)
03995 {
03996 for (k = outoinptr[ind[i]]; k <= outoinptr[ind[i] + 1] - 1; ++k)
03997 {
03998 ii = outoin[k];
03999 for (n = 1; n <= nb; ++n)
04000 {
04001 if (ind[n] == ii && vect[n] > -1 && deput[ii] == 1)
04002 {
04003 fini = 0;
04004 vect[n] = j;
04005 }
04006 }
04007 }
04008 }
04009 }
04010 }
04011 }
04012 Inv(vect);
04013 if ((ord1=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return 0;
04014 ord1[0]=vect[0];
04015 C2F(isort)(&vect[1],&vect[0],&ord1[1]);
04016 if ((*ord=(int*)MALLOC(sizeof(int)*(2*nb+1))) == NULL ) return 0;
04017 (*ord)[0]=2*nb;
04018 for(m=1 ; m <= nb; ++m)
04019 {
04020 (*ord)[m]=ind[ord1[m]];
04021 (*ord)[m+nb]=wec[ord1[m]];
04022 }
04023 if(ord1) FREE(ord1);
04024 ord1=NULL;
04025 return 0;
04026 }
04027
04028
04029 int tree3(vec, nb, deput, typl, bexe, boptr, blnk, blptr,ord, ok)
04030 int *vec,nb,*deput,*typl,*bexe,*boptr,*blnk,*blptr,**ord,*ok;
04031 {
04032 int fini,i,l,j,m,nkk,*w,kk,*ind;
04033
04034 w=NULL;
04035 *ok = 1;
04036 for( i= 1; i <= nb; ++i)
04037 {
04038 if ((vec[i] == 0) && (typl[i] == 1)) vec[i]=1;
04039 }
04040 fini=0;
04041 for (j = 1; (j <= nb+2) &&(! fini); ++j)
04042 {
04043 fini = 1;
04044 if (j == nb + 2)
04045 {
04046 *ok = 0;
04047 *ord = NULL;
04048 return 0;
04049 }
04050
04051 for (i = 1; i <= nb; ++i)
04052 {
04053 if (vec[i] > -1 && typl[i] != -1)
04054 {
04055 if (typl[i] == 1)
04056 {
04057 nkk = boptr[i + 1] - boptr[i];
04058 if (nkk != 0)
04059 {
04060 for (m = 1; m <= nkk; ++m)
04061 {
04062 kk = bexe[m + boptr[i] - 1];
04063 if (typl[kk] == 1)
04064 {
04065 if (vec[kk] < vec[i]+2)
04066 {
04067 fini=0;
04068 vec[kk]=vec[i]+2;
04069 }
04070 }
04071 else
04072 {
04073 if (vec[kk] < vec[i]+1)
04074 {
04075 fini=0;
04076 vec[kk]=vec[i]+1;
04077 }
04078 }
04079 }
04080 }
04081 }
04082 else
04083 {
04084 nkk = blptr[i+1]-blptr[i];
04085 if (nkk != 0)
04086 {
04087 for (m = 1; m <= nkk; ++m)
04088 {
04089 kk = blnk[m+blptr[i]-1];
04090 if (vec[kk] > -1 && (deput[kk] == 1 || typl[kk] == 1))
04091 {
04092 if (vec[kk] < vec[i])
04093 {
04094 fini=0;
04095 vec[kk]=vec[i];
04096 }
04097 }
04098 }
04099 }
04100 }
04101 }
04102
04103 }
04104 }
04105 Inv(vec);
04106 if ((ind=(int*)MALLOC(sizeof(int)*(vec[0]+1))) == NULL ) return 0;
04107 ind[0]=vec[0];
04108 C2F(isort)(&vec[1],&vec[0],&ind[1]);
04109 w=FindDif(vec,1);
04110 if (((*ord)=(int*)MALLOC(sizeof(int)*(w[0]+1))) == NULL) return 0;
04111 (*ord)[0]=w[0];
04112 for (l= 1; l<w[0]+1;l++)
04113 {
04114 (*ord)[l]=ind[w[l]];
04115 }
04116 FREE(w); w=NULL;
04117 FREE(ind); ind=NULL;
04118 return 0;
04119 }
04120
04121
04122
04123
04124
04125
04126
04127 int* GetCollVect(int* vect,int* vectid,int numcoll)
04128 {
04129 int *vectr;
04130 int i;
04131 if ((vectr=(int*)MALLOC(sizeof(int)*(vectid[0]+1))) == NULL ) return (int*) NULL;
04132 vectr[0]=vectid[0];
04133
04134 for(i=1;i<vectid[0]+1;i++)
04135 {
04136 vectr[i]=vect[vectid[i]+vect[0]*(numcoll-1)/4];
04137 }
04138 return (int*) vectr;
04139 }
04140
04141 int* FindDif(int* vect,int val)
04142 {
04143 int *vectr,i,j=1;
04144 if (vect[0]==0) return NULL;
04145 if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04146 for(i=1; i<vect[0]+1;i++)
04147 {
04148 if(vect[i]!=val) vectr[j++]=i;
04149 }
04150 vectr[0]=j-1;
04151 return (int*) vectr;
04152 }
04153
04154 int* FindEg(int* vect,int val)
04155 {
04156 int *vectr,i,j=1;
04157 if (vect[0]==0) return NULL;
04158 if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04159 for(i=1; i<vect[0]+1;i++)
04160 {
04161 if(vect[i]==val) vectr[j++]=i;
04162 }
04163 vectr[0]=j-1;
04164 return (int*) vectr;
04165 }
04166
04167 int* FindSupEgd(double* vect,int val)
04168 {
04169 int *vectr;
04170 register int i,j=1;
04171 if (vect[0]==0) return NULL;
04172 if ((vectr=(int*)MALLOC(sizeof(int)*((int) vect[0]+1))) == NULL ) return (int*) NULL;
04173 for(i=1; i<vect[0]+1;i++)
04174 {
04175 if((int) vect[i]>=val) vectr[j++]=i;
04176 }
04177 vectr[0]=j-1;
04178 return (int*) vectr;
04179
04180 }
04181
04182 int* GetPartVect(int* vect,int idebut,int taille)
04183 {
04184 int *vectr,*p;
04185 if (taille < 1) return (int*) NULL;
04186 if ((vectr=(int*)MALLOC(sizeof(int)*(taille+1))) == NULL ) return (int*) NULL;
04187 vectr[0]=taille;
04188 p=&vectr[1];
04189 p=memcpy(p,&vect[idebut],sizeof(int)*taille);
04190 return (int*) vectr;
04191 }
04192
04193 double* GetPartVectd(double* vect,int idebut,int taille)
04194 {
04195 double *vectr,*p;
04196 if (taille < 1) return (double*) NULL;
04197 if ((vectr=(double*)MALLOC(sizeof(double)*(taille+1))) == NULL ) return (double*) NULL;
04198 vectr[0]=taille;
04199 p=&vectr[1];
04200 p=memcpy(p,&vect[idebut],sizeof(double)*taille);
04201 return (double*) vectr;
04202 }
04203
04204 int* Duplicataa(v,w)
04205 int *v,*w;
04206 {
04207 register int i,j,k;
04208 int *ww;
04209 register int pp;
04210 k=1;
04211 if ((ww=(int*)MALLOC(sizeof(int))) == NULL ) return (int*) NULL;
04212 ww[0]=0;
04213 for (i=1;i<v[0]+1;i++)
04214 {
04215 if (w[i]!=0)
04216 {
04217 if ((ww=(int*)REALLOC(ww,sizeof(int)*(w[i]+ww[0]+1))) == NULL ) return (int*) NULL;
04218 ww[0]=ww[0]+w[i];
04219 pp=v[i];
04220 for (j=1;j<w[i]+1;j++)
04221 {
04222 ww[k]=pp;
04223 k++;
04224 }
04225 }
04226 }
04227 return (int*) ww;
04228 }
04229
04230 int power (int base, int n)
04231 {
04232 register int i,p;
04233 p = 1;
04234 for (i = 1; i <= n; i++)
04235 p *= base;
04236 return p;
04237 }
04238
04239 double powerd (double base, int n)
04240 {
04241 int i;
04242 double p;
04243 p = 1;
04244
04245 if ( n < 0 )
04246 {
04247 base = 1/base;
04248 n=-n;
04249 }
04250 for (i = 1; i <= n; i++)
04251 p *= base;
04252 return (double) p;
04253 }
04254
04255 int* FindInfEg(int* vect,int val)
04256 {
04257 int *vectr;
04258 register int i,j=1;
04259 if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04260 for(i=1; i<vect[0]+1;i++)
04261 {
04262 if(vect[i]<=val) vectr[j++]=i;
04263 }
04264 vectr[0]=j-1;
04265 return (int*) vectr;
04266 }
04267
04268 int* FindInf(int* vect,int val)
04269 {
04270 int *vectr;
04271 register int i,j=1;
04272 if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04273 for(i=1; i<vect[0]+1;i++)
04274 {
04275 if(vect[i]<val) vectr[j++]=i;
04276 }
04277 vectr[0]=j-1;
04278 return (int*) vectr;
04279 }
04280
04281 int* FindSup(int* vect,int val)
04282 {
04283 int *vectr;
04284 register int i,j=1;
04285 if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04286 for(i=1; i<vect[0]+1;i++)
04287 {
04288 if(vect[i]>val) vectr[j++]=i;
04289 }
04290 vectr[0]=j-1;
04291 return (int*) vectr;
04292 }
04293
04294 int Sum (int *vect)
04295 {
04296 int i,sum=0;
04297 for (i = 1; i <= vect[0]; i++)
04298 {
04299 sum+=vect[i];
04300 }
04301 return sum;
04302 }
04303
04304 int Norm (int *vect)
04305 {
04306 int i,sum=0;
04307 for (i = 1; i <= vect[0]; i++)
04308 {
04309 if(vect[i]>=0) {
04310 sum+=vect[i];
04311 }else{
04312 sum+=-vect[i];
04313 }
04314 }
04315 return sum;
04316 }
04317
04318 void CumSum (int* vect)
04319 {
04320 int i;
04321 for (i = 2; i <= vect[0]; i++)
04322 {
04323 vect[i]+=vect[i-1];
04324 }
04325 }
04326
04327
04328
04329 int* VecEg1 (int* vect)
04330 {
04331 int *vectr;
04332 if ((vectr=(int*)MALLOC(sizeof(int)*(vect[0]+1))) == NULL ) return (int*) NULL;
04333 vectr=memcpy(vectr,vect,(vect[0]+1)*sizeof(int));
04334 return (int*) vectr;
04335 }
04336
04337 void Setmem (int* vect,int val)
04338 {
04339 int j;
04340 for (j = 1; j <= vect[0]; j++)
04341 {
04342 vect[j]=val;
04343 }
04344 }
04345
04346 void Inv(int* vect)
04347 {
04348 int i;
04349 for(i=1;i<vect[0]+1;i++)
04350 {
04351 vect[i]=-vect[i];
04352 }
04353 }
04354
04355 void Incr2(int* vect,int j)
04356 {
04357 int i;
04358 for (i = j; i <= vect[0]/2-1; i++)
04359 {
04360 vect[i]=vect[i+1];
04361 vect[i+vect[0]/2]=vect[i+1+vect[0]/2];
04362 }
04363 vect[0]=vect[0]-2;
04364 }
04365 void Invd(double* vect)
04366 {
04367 int i;
04368 for(i=1;i<(int) vect[0]+1;i++)
04369 {
04370 vect[i]=-vect[i];
04371 }
04372 }
04373 void Incr1(int* vect,int j)
04374 {
04375 int i;
04376 for (i = j; i <= vect[0]-1; i++)
04377 {
04378 vect[i]=vect[i+1];
04379 }
04380 vect[0]--;
04381 }
04382
04383
04384