/* getcd get corrected data */ int getcd (unsigned char *data, int *mdat, struct cmd *pcmd) { int i; int err; /* read answer of weather station from serial port */ if ( ( err = getrd(data, mdat, pcmd)) == -1) return(-1); /* echo raw dataframe */ err = echodata(data, *mdat); /* check data frame and do data correction for masqueraded bytes */ if ( ( err = chkframe(data, mdat, pcmd)) == -1) return(-1); /* echo raw demasqueraded dataframe */ err = echodata(data, *mdat); /* extract message: eliminiate first and last 2 bytes */ for ( i = 0; i < *mdat - 4; i++ ) { data[i] = data[i+2]; } *mdat = *mdat - 4; syslog(LOG_DEBUG, "getcd : Data length getcd : %d\n", *mdat); return(0); }
/* Funct wb, stage five, assumes the mwBasket */ void wb(MIPS_SIM* sim, FDB* fdBasket, DEB* deBasket, EMB* emBasket, MWB* mwBasket) { /* Check in Basket */ unsigned func = getFunct(mwBasket->ir); if(mwBasket->mdr != 0 || mwBasket->aluOut != 0 || func == 0x2A) { int funct = getFunct(mwBasket->ir); printf(" ---- In WB ----\n"); switch (mwBasket->type) { case 0: /* R type */ /* need two jumps else */ if(funct == 0x08) /* jr */ { printf("in wb: exe jr\n"); sim->pcValue = sim->regs[mwBasket->aluOut]; basketDefault(fdBasket, deBasket, emBasket, mwBasket); } else if(funct == 0x09) { printf("in wb: exe jalr\n"); sim->regs[31] = sim->pcValue; sim->pcValue = sim->regs[mwBasket->aluOut]; basketDefault(fdBasket, deBasket, emBasket, mwBasket); } else sim->regs[getrd(mwBasket->ir)] = mwBasket->aluOut; printRegs(sim); clearmw(mwBasket); break; case 1: /* I type */ printf("in wb: exe I type\n"); sim->regs[mwBasket->bReg] = mwBasket->aluOut; printRegs(sim); clearmw(mwBasket); break; case 2: /* Load Word */ printf("in wb: exe lw type\n"); if(mwBasket->mdr != 0) sim->regs[mwBasket->bReg] = mwBasket->mdr; printRegs(sim); clearmw(mwBasket); break; } clearmw(mwBasket); } else return; }
int jacobi(double *A, double *b, double *x0, double conv, int n) { double *Dinv = NULL, *C = NULL, *xkp1 = NULL, *xconv = NULL, *R = NULL, e = conv + 1.0, alpha = -1.0, beta = 1.0, gamma = 0.0; int i, j, k = 0; // Ejecutar sólo si la matriz de términos independientes // es estrictamente dominante. if (!isdom(A, n)) { return ENONDOM; } C = (double*) malloc(sizeof(double)*n); xkp1 = (double*) malloc(sizeof(double)*n); xconv = (double*) malloc(sizeof(double)*n); Dinv = (double*) malloc(sizeof(double)*n); R = (double*) malloc(sizeof(double)*n*n); // Ha ocurrido un error al reservar memoria if (Dinv == NULL || C == NULL || xkp1 == NULL || xconv == NULL || R == NULL) { return errno; } // Obtenemos R, Dinv y C getrd(Dinv, R, A, b, C, n, n); // Iteramos hasta alcanzar la razón de convergencia while (e > conv) { e = jaciter(A, b, R, C, Dinv, x0, xkp1, xconv, n); #ifdef DEBUG printf("(k = %d) e = %e / conv = %e\n", k, e, conv); #endif k++; } // Liberamos la memoria utilizada free(C); free(xkp1); free(xconv); free(Dinv); free(R); return k; }