This block realizes a non linear function modulo where the input and output are treated with
integer values. In accord to the parameters 'Nbit', the input are tronqued at this integer
value witch are defined by using a unsigned integer value. By definition,the value
of the output are comprise between
and this function acts as a
Nbit quantitizer. The value of the output are positive or zero.
/* imodulob Scicos integer modulob function block * Type 2 simulation function - scilab-2.6&2.7&3.0 * IRCOM GROUP - Author : A.Layec */ /* REVISION HISTORY : * $Log$ */ #include "machine.h" #include <stdio.h> /* Cette fonction de simulation propose de réaliser la fonction * modulo rencontrée dans les systèmes numériques traitant les opérations * sur entier en code complément à 2. * entrées régulières : u[0..nu-1] * sorties régulières : y[0..nu-1] = mod[u[0..nu-1]] * paramètres entiers : ipar[0..nu-1] : nombre de bits des mots entiers. * * Rmq : l'entrée de type double est tronquée à sa valeur entière. * la sortie est tjs positive */ /*Prototype*/ void imodulob(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*/ int i,nu; double *y; double *u; long ent; /*Déclaration d'un entier de type long long int*/ /*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]; for(i=0;i<nu;i++) { /*Récupération de la valeur d'entrée*/ ent = (long) u[i]; /*Conversion en nombre entier non signé*/ ent &= (2<<(ipar[i]-1)) - 1; /*Place nombre converti dans le registre de sortie*/ y[i] = ent; } }