Expression::Expression( const char* expr, const PiSDFParam* const * params, int nParam){ nElt_ = evaluateNTokens(expr); stack_ = CREATE_MUL(PISDF_STACK, nElt_, Token); Token* output = stack_; Token stack[MAX_NVAR_ELEMENTS]; int ixOutput = 0; int ixStack = 0; const char *ptr = expr; Token t; while(getNextToken(&t, &ptr, params, nParam)){ switch(t.type){ case VALUE: case PARAMETER: output[ixOutput++] = t; break; case OPERATOR: while(ixStack > 0 && stack[ixStack-1].type == OPERATOR && precedence[t.opType] <= precedence[stack[ixStack-1].opType]){ ixStack--; output[ixOutput++] = stack[ixStack]; } stack[ixStack++] = t; break; case LEFT_PAR: stack[ixStack++] = t; break; case RIGHT_PAR: while(ixStack > 0 && stack[ixStack-1].type != LEFT_PAR){ ixStack--; output[ixOutput++] = stack[ixStack]; } if(ixStack == 0){ throw "Parsing Error missing left parenthesis\n"; } ixStack--; break; } } while(ixStack > 0){ ixStack--; output[ixOutput++] = stack[ixStack]; } nElt_ = ixOutput; }
int nullSpace(int* topo_matrix, int* brv, int nbEdges, int nbVertices){ Rational* ratioMatrix = CREATE_MUL(TRANSFO_STACK, nbVertices*nbEdges, Rational); Rational* ratioResult = CREATE_MUL(TRANSFO_STACK, nbVertices, Rational); // printf("Topo Matrix:\n"); // for(int i=0; i<nbEdges; i++){ // for(int j=0; j<nbVertices; j++){ // printf("%d : ", topo_matrix[i*nbVertices+j]); // } //// printf("\033[2D"); // printf("\n"); // } /* Copy matrix into ratioMatrix */ for(int i=0; i<nbEdges*nbVertices; i++){ ratioMatrix[i] = topo_matrix[i]; } // printf("Topo Matrix: Rational\n"); // for(int i=0; i<nbEdges; i++){ // for(int j=0; j<nbVertices; j++){ // printf("%d,%d : ", ratioMatrix[i*nbVertices+j].getNominator(), ratioMatrix[i*nbVertices+j].getDenominator()); // } //// printf("\033[2D"); // printf("\n"); // } for (int i=0; i < nbEdges; i++) { Rational pivotMax = ratioMatrix[i*nbVertices+i].getAbs(); int maxIndex = i; for (int t = i+1; t < nbEdges; t++) { Rational newPivot = ratioMatrix[t*nbVertices+i].getAbs(); if (newPivot > pivotMax) { maxIndex = t; pivotMax = newPivot; } } if (pivotMax != 0 && maxIndex != i) { /* Switch Rows */ Rational tmp; for (int t = 0; t < nbVertices; t++) { tmp = ratioMatrix[maxIndex*nbVertices+t]; ratioMatrix[maxIndex*nbVertices+t] = ratioMatrix[i*nbVertices+t]; ratioMatrix[i*nbVertices+t] = tmp; } } else if (maxIndex == i && (pivotMax != 0)) { /* Do nothing */ } else { break; } Rational odlPivot = ratioMatrix[i*nbVertices+i]; for (int t = i; t < nbVertices; t++) { ratioMatrix[i*nbVertices+t] = ratioMatrix[i*nbVertices+t] / odlPivot; } for (int j = i + 1; j < nbEdges; j++) { if (ratioMatrix[j*nbVertices+i] != 0) { Rational oldji = ratioMatrix[j*nbVertices+i]; for (int k = 0; k < nbVertices; k++) { ratioMatrix[j*nbVertices+k] = ratioMatrix[j*nbVertices+k] - (oldji * ratioMatrix[i*nbVertices+k]); } } } } for (int i = 0; i < nbVertices; i++) { ratioResult[i] = 1; } for(int i = nbEdges-1; i >= 0; i--){ Rational val = 0; for (int k = i + 1; k < nbVertices; k++) { val = val + (ratioMatrix[i*nbVertices+k] * ratioResult[k]); } if (val != 0) { if(ratioMatrix[i*nbVertices+i] == 0){ throw "elt diagonal zero\n"; } ratioResult[i] = val.getAbs() / ratioMatrix[i*nbVertices+i]; } } int lcm = 1; for(int i=0; i<nbVertices; i++){ lcm = compute_lcm(lcm, ratioResult[i].getDenominator()); } for(int i=0; i<nbVertices; i++){ brv[i] = abs(ratioResult[i].getNominator() * lcm / ratioResult[i].getDenominator()); } StackMonitor::free(TRANSFO_STACK, ratioMatrix); StackMonitor::free(TRANSFO_STACK, ratioResult); return 0; }
int LRT::runOneJob(){ void* msg; if(Platform::getLrtCommunicator()->ctrl_start_recv(&msg)){ switch(((UndefinedMsg*) msg)->msgIx){ case MSG_START_JOB:{ StartJobMsg* jobMsg = (StartJobMsg*) msg; Fifo *inFifos = (Fifo*) ((char*)jobMsg + 1*sizeof(StartJobMsg)); Fifo *outFifos = (Fifo*) ((char*)inFifos + jobMsg->nbInEdge*sizeof(Fifo)); Param *inParams = (Param*) ((char*)outFifos + jobMsg->nbOutEdge*sizeof(Fifo)); void** inFifosAlloc = CREATE_MUL(stack_, jobMsg->nbInEdge, void*); void** outFifosAlloc = CREATE_MUL(stack_, jobMsg->nbOutEdge, void*); Param* outParams = CREATE_MUL(stack_, jobMsg->nbOutParam, Param); for(int i=0; i<(int)jobMsg->nbInEdge; i++){ inFifosAlloc[i] = (void*) Platform::getLrtCommunicator()->data_recv(&inFifos[i]); } for(int i=0; i<(int)jobMsg->nbOutEdge; i++){ outFifosAlloc[i] = (void*) Platform::getLrtCommunicator()->data_start_send(&outFifos[i]); } Time start = Platform::get()->getTime(); if(jobMsg->specialActor && jobMsg->fctIx < 6) specialActors[jobMsg->fctIx](inFifosAlloc, outFifosAlloc, inParams, outParams); else if((int)jobMsg->fctIx < nFct_) fcts_[jobMsg->fctIx](inFifosAlloc, outFifosAlloc, inParams, outParams); else throw "Cannot find actor function\n"; Time end = Platform::get()->getTime(); sendTrace(jobMsg->srdagIx, start, end); for(int i=0; i<(int)jobMsg->nbOutEdge; i++){ Platform::getLrtCommunicator()->data_end_send(&outFifos[i]); } if(jobMsg->nbOutParam != 0){ int size = sizeof(ParamValueMsg)+jobMsg->nbOutParam*sizeof(Param); ParamValueMsg* msgParam = (ParamValueMsg*) Platform::getLrtCommunicator()->ctrl_start_send(size); Param* params = (Param*)(msgParam+1); msgParam->msgIx = MSG_PARAM_VALUE; msgParam->srdagIx = jobMsg->srdagIx; memcpy(params, outParams, jobMsg->nbOutParam*sizeof(Param)); Platform::getLrtCommunicator()->ctrl_end_send(size); } stack_->free(inFifosAlloc); stack_->free(outFifosAlloc); stack_->free(outParams); stack_->freeAll(); break; } case MSG_CLEAR_TIME:{ ClearTimeMsg* timeMsg = (ClearTimeMsg*) msg; Platform::get()->rstTime(timeMsg); break;} case MSG_STOP_LRT: run_ = false; break; case MSG_PARAM_VALUE: default: throw "Unexpected message received\n"; } Platform::getLrtCommunicator()->ctrl_end_recv(); return 1; } return 0; }