This block realizes the 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 the 2's complement arithmetic. By definition,the value
of the output are comprise between
and this function acts as a
Nbit quantitizer. The output are negative, positive or zero.
/* imodulo Scicos integer modulo 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 soit négative soit positive */ /*Prototype*/ void imodulo(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*/ /*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]; /*Réalisation du tronquage code complément à 2*/ ent -= 2<<(ipar[i]-2); ent &= (2<<(ipar[i]-1)) - 1; ent -= 2<<(ipar[i]-2); /*Place valeur tronquée dans le registre de sortie*/ y[i] = ent; } }