/* destockbit Scicos binary shift register * Type 2 simulation function ver 1.1 - scilab-2.6&2.7&3.0 * 12 novembre 2003 - IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include "machine.h" /* Cette fonction réalise un registre à décalage binaire. * A chaque évènement présent sur port évènementiel numéro 1 * la fonction réalise une acquistion de la valeur présente * sur son port d'entrée régulier supposé etre de taille ipar[0..nu-1]*ipar[nu..2*nu-1] * puis délivre un paquet de taille ipar[0..nu-1] sur le port de sortie régulier lorsque * un évènement se présente sur son port événementiel 2. * A chaque événement 2, un ET logique de ipar[0..nu-1] bits est réalisé * et le registre est décalé de ipar[0..nu-1] bits vers la droite. * * Entrée régulière : u[0..nu-1] vecteur des entiers codés sur Nbit*Nbpaquets * Sortie régulière : y[0..nu-1] vecteur des entiers codés sur Nbit * Entrée évènementielle : nev=1 : Instant d'acquisition du mot en entrée de taille Nbit*Nbpaquet * nev=2 : Instant de délivrance du mot en sortie de taille Nbit * Sortie évènementielle : néant * Paramètres entiers : ipar[0..nu-1] : longueur des paquets du vecteur d'entrée (Nbit) * ipar[nu..2*nu-1] : Nombre de paquet * Mémoires : z[0..nu-1] : valeur paquet */ /*prototype*/ void destockbit(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 des variables*/ double *y; double *u; int nu,nev,i,j,k; /*Récupération des adresses des ports*/ y=(double *)outptr[0]; u=(double *)inptr[0]; nev=*nevprt; /*récupération de la taille du port d'entrée régulier*/ nu=insz[0]; /* Le flag 1 récupère le paquet à délivrer * et délivre sa valeur cc2 dans y[] * lorsque le port d'activation est 2 ou 3 */ if(*flag==1 && (nev==2||nev==3)) { for(k=0;k<nu;k++) { /*Récupération paquet entrée*/ i=(int)z[k]; /*Tronque valeur de i àux ipar[k] bits de poid faible*/ j=i&((1<<ipar[k])-1); /*Réalise conversion code complément à 2*/ j-= 2<<(ipar[k]-2); j&= (2<<(ipar[k]-1)) - 1; j-= 2<<(ipar[k]-2); /*place valeur dans y[]*/ y[k]=j; /*Décale paquet de ipar[0] vers la droite*/ i=i>>ipar[k]; /*Sauvegarde valeur décalée dans z[k]*/ z[k]=i; /*fprintf(stderr,"z[k]_sauv_bloc2=%f\n", z[k]);*/ } } /* Le flag 2 stocke la valeur en entrée dans z[] * et la convertie en nombre entier non signé lorsque * le numéro du port d'activation est 1 ou 3 */ else if(*flag==2 && (nev==1||nev==3)) { for(k=0;k<nu;k++) { /*aquisition paquet entrée*/ j=(int)u[k]; /*Conversion en nombre entier non signé*/ j &= (2<<((ipar[k]*ipar[nu+k])-1)) - 1; /*Sauvegarde paquet entrée dans z[k]*/ z[k]=j; } } }