stockbit
/* 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.
*/
/* stockbit Scicos bit accumulator
* Type 2 simulation function ver 1.1 - scilab-2.6&2.7
* 12 novembre 2003 - IRCOM GROUP - Author : A.Layec
*/
/* REVISION HISTORY :
* $Log$
*/
#include "machine.h"
/* Cette fonction de simulation réalise un accumulateur de bit
* Chaque paquet de bit en entrée (de longueur ipar[0..nu-1])
* est stocké dans un mot de longueur ipar[0..nu-1]*ipar[nu..2*nu-1]
* où ipar[nu..2*nu-1] représente le nombre de paquets à stocker.
* Le ième mot est placé à la place i*ipar[0..nu-1] et le mot
* de sortie de longueur ipar[nu..2*nu-1] est codé en code complément à 2
*
* Entrée régulière : u[0..nu-1] vecteur des entiers codés sur Nbit
* Sortie régulière : y[0..nu-1] vecteur des entiers codés sur Nbit*Nbpaquet
* Entrée évènementielle : Instant d'acquisition du mot en entrée
* 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 à stocker
* Mémoires : z[0..nu-1] : compteur paquet
* z[nu..2*nu-1] : valeur du mot de sortie.
*/
/*prototype*/
void stockbit(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,j,k,nu;
double *y;
double *u;
/*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];
if(*flag==1)
{
for(k=0;k<nu;k++)
{
/*Incrément compteur paquet*/
z[k]++;
/*Acquisition de l'entrée dans i*/
i = (int)u[k];
/*fprintf(stderr,"stockbit z[k]=%f, u=%f\n", z[k],u[k]);*/
/*Conversion en nombre entier non signé*/
i &= (2<<(ipar[k]-1)) - 1;
/*Décale à gauche le paquet de z[k]*ipar[k] bits*/
i=i<<(ipar[k]*(int)(z[k]-1));
/*Incrémente valeur paquet*/
z[nu+k] = z[nu+k]+i;
/*Réalise test sur compteur paquet*/
if (z[k]==ipar[nu+k])
{
/*Passe valeur de z[nu+k] dans j*/
j=(int)z[nu+k];
/*Réalise conversion code complément à 2*/
j-= 2<<((ipar[k]*ipar[nu+k])-2);
j&= (2<<((ipar[k]*ipar[nu+k])-1)) - 1;
j-= 2<<((ipar[k]*ipar[nu+k])-2);
/*Place la valeur du paquet dans registre y[]*/
y[k]=j;
/*fprintf(stderr,"stockbit y=%f\n", y[k]);*/
/*Met la valeur du compteur paquet à zéro*/
z[k]=0;
/*Réinitialise la valeur du paquet de sortie à zéro*/
z[nu+k]=0;
}
}
}
}