/* Modnumlib Scicos interfacing function * Copyright (C) 2009 Alan Layec * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. */ /* ndelay Scicos vector delay block * Type 2 simulation function ver 1.0 - scilab-2.6&2.7 * 18 novembre 2003 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include "machine.h" /* Cette fonction de simulation présente la valeur du vecteur u[] * sur le vecteur de sortie y[] après n période de déclenchements. * Elle se compose d'un vecteur de registre à décalage dont chaque registre * a une taille donnée par le paramètre entier ipar[0..Nu-1] où Nu représente * la taille des vecteurs d'entrées/sorties. * * entrée régulière u[0..Nu-1] : vecteur d'entrée * sortie régulièer y[0..Nu-1] : vecteur de sortie * entrée évènementielle : période de déclenchement * sortie évènementielle : néant * * paramètre entier ipar[0..Nu-1] : vecteur des nombres de retard * états discrets : z[0..ipar[0]-1] : buffer entrée u[0] * z[ipar[0]..ipar[1]-1] : buffer entrée u[1] * ........... * z[ipar[Nu-2]..ipar[Nu-1] : buffer entrée u[Nu-1] */ /*prototype*/ void ndelay(flag,nevprt,t,xd,x,nx,z,nz,tvec,ntvec,rpar,nrpar, ipar,nipar,inptr,insz,nin,outptr,outsz,nout) integer *flag,*nevprt,*nx,*nz,*ntvec,*nrpar,ipar[],*nipar,insz[],*nin,outsz[],*nout; double x[],xd[],z[],tvec[],rpar[]; double *inptr[],*outptr[],*t; { /*Déclaration*/ double *y; double *u; int nu,i,j,n; /*récupération des adresses des ports réguliers*/ y = (double *)outptr[0]; u = (double *)inptr[0]; /*récupération de la taille du port d'entrée*/ nu=insz[0]; switch (*flag) { /* Le flag 1 place la première valeur du buffer * dans le registre de sortie y[] */ case 1 : { n = 0; for (i=0;i<nu;i++) { y[i]=z[n]; n=n+ipar[i]; } break; } /* Le flag 2 fait un décalage à gauche des buffers * et place la valeur de u[] à la sortie des buffers */ case 2 : { /*Décale buffer*/ n = 0; for (i=0;i<nu;i++) { for (j=0;j<ipar[i];j++) z[n+j]=z[n+j+1]; n=n+ipar[i]; } /*Ajoute nouvelle valeur dans buffer*/ n = 0; for(j=0;j<nu;j++) { n=n+ipar[j]; z[n-1]=u[j]; } break; } break; } }