/** Maps waveform to the platform. The platform is obtained using the man_platform_get_context() * function. * The mapping result is saved to each module in the module_t.processor_idx and module_t.exec_position * fields. module_t.node is pointed to the platform node object of the allocated processor. * The number of nodes allocated to each node is saved in the mapping_t.modules_x_node array. * \returns 0 if the mapping was feasible, -1 otherwise. The error description is saved in the * oesr_man_error class. */ int mapping_map(mapping_t *m, waveform_t *waveform) { /**@TODO: Use the oesr_man_error class for error messages */ mdebug("waveform_name=%s, nof_modules=%d\n",waveform->name, waveform->nof_modules); int i; int ret=-1; float total_mopts; man_platform_t *platform = man_platform_get_context(); man_node_t *node; if (!platform) { aerror("oesr_man not initialized\n"); return -1; } printf("Computing mapping for %d modules...\n",waveform->nof_modules); if (mapping_alloc(m,waveform->nof_modules,platform->nof_processors)) { return -1; } if (setup_algorithm(m)) { goto free; } if (generate_model(m, waveform, platform)) { goto free; } if (call_algorithm(m, waveform, platform)) { goto free; } total_mopts=0; memset(m->modules_x_node,0,sizeof(int)*MAX(nodes)); for (i=0;i<waveform->nof_modules;i++) { if (m->p_res[joined_function_inv[i]] >= platform->nof_processors) { aerror_msg("Module %d mapped to processor %d, but platform has %d processors only\n", joined_function_inv[i],m->p_res[joined_function_inv[i]]+1,platform->nof_processors); goto free; } man_processor_t *p = (man_processor_t*) platform->processors[m->p_res[joined_function_inv[i]]]; waveform->modules[i].node = p->node; waveform->modules[i].processor_idx = p->idx_in_node; waveform->modules[i].exec_position = i;/*waveform->nof_modules-i-1;*/ node = p->node; m->modules_x_node[node->id]++; total_mopts+=waveform->modules[i].c_mopts[0]; } printf("Done. %g GOPTS\n",total_mopts/1000); ret = 0; free: mapping_free(m,waveform->nof_modules,platform->nof_processors); return ret; }
int mpl_generate(MPL *mpl, char *file) { if (!(mpl->phase == 1 || mpl->phase == 2)) fault("mpl_generate: invalid call sequence"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* generate model */ mpl->phase = 3; open_output(mpl, file, "w"); generate_model(mpl); close_output(mpl); /* build problem instance */ build_problem(mpl); /* generation phase has been finished */ print("Model has been successfully generated"); done: /* return to the calling program */ return mpl->phase; }
int main(int argc,char *argv[]) { int number_processes = 0, process_deeper = 0, m_0_res = 0; char epilog_text[255]; FILE *of; if(argc < 4){ error("Invocation:\n\tmodel_generator <number_proc> <process_deeper> <initial_res_marking> <file>\n"); } number_processes = atoi(argv[1]); process_deeper = atoi(argv[2]); m_0_res = atoi(argv[3]); of = fopen(argv[4],"w"); /* Dealing with invocation parameters coreection */ if(of == NULL) error("I am having problems with the output file"); if(number_processes<2) error("At least 2 processes are required"); if(process_deeper<1) error("Process deeper must be of at leats 1 state"); if(m_0_res<1) error("Resource initial marking must be positive"); /* Parameters are correct: go */ preface(of); generate_model(of,number_processes,process_deeper,m_0_res); sprintf(epilog_text,"RAS_%1d_%1d_%1d",number_processes,process_deeper,m_0_res); epilog(of,epilog_text); return 0; }
int mpl_read_data(MPL *mpl, char *file) #if 0 /* 02/X-2008 */ { if (mpl->phase != 1) #else { if (!(mpl->phase == 1 || mpl->phase == 2)) #endif xfault("mpl_read_data: invalid call sequence\n"); if (file == NULL) xfault("mpl_read_data: no input filename specified\n"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* process data section */ mpl->phase = 2; xprintf("Reading data section from %s...\n", file); mpl->flag_d = 1; open_input(mpl, file); /* in this case the keyword 'data' is optional */ if (is_literal(mpl, "data")) { get_token(mpl /* data */); if (mpl->token != T_SEMICOLON) error(mpl, "semicolon missing where expected"); get_token(mpl /* ; */); } data_section(mpl); /* process end statement */ end_statement(mpl); xprintf("%d line%s were read\n", mpl->line, mpl->line == 1 ? "" : "s"); close_input(mpl); done: /* return to the calling program */ return mpl->phase; } /*---------------------------------------------------------------------- -- mpl_generate - generate model. -- -- *Synopsis* -- -- #include "glpmpl.h" -- int mpl_generate(MPL *mpl, char *file); -- -- *Description* -- -- The routine mpl_generate generates the model using its description -- stored in the translator database. This phase means generating all -- variables, constraints, and objectives, executing check and display -- statements, which precede the solve statement (if it is presented), -- and building the problem instance. -- -- The character string file specifies the name of output text file, to -- which output produced by display statements should be written. It is -- allowed to specify NULL, in which case the output goes to stdout via -- the routine print. -- -- This routine should be called once after the routine mpl_read_model -- or mpl_read_data and if one of the latters returned the code 2. -- -- *Returns* -- -- The routine mpl_generate returns one of the following codes: -- -- 3 - model has been successfully generated. In this case the calling -- program may call other api routines to obtain components of the -- problem instance from the translator database. -- 4 - processing failed due to some errors. In this case the calling -- program should call the routine mpl_terminate to terminate model -- processing. */ int mpl_generate(MPL *mpl, char *file) { if (!(mpl->phase == 1 || mpl->phase == 2)) xfault("mpl_generate: invalid call sequence\n"); /* set up error handler */ if (setjmp(mpl->jump)) goto done; /* generate model */ mpl->phase = 3; open_output(mpl, file); generate_model(mpl); flush_output(mpl); /* build problem instance */ build_problem(mpl); /* generation phase has been finished */ xprintf("Model has been successfully generated\n"); done: /* return to the calling program */ return mpl->phase; } /*---------------------------------------------------------------------- -- mpl_get_prob_name - obtain problem (model) name. -- -- *Synopsis* -- -- #include "glpmpl.h" -- char *mpl_get_prob_name(MPL *mpl); -- -- *Returns* -- -- The routine mpl_get_prob_name returns a pointer to internal buffer, -- which contains symbolic name of the problem (model). -- -- *Note* -- -- Currently MathProg has no feature to assign a symbolic name to the -- model. Therefore the routine mpl_get_prob_name tries to construct -- such name using the name of input text file containing model section, -- although this is not a good idea (due to portability problems). */ char *mpl_get_prob_name(MPL *mpl) { char *name = mpl->mpl_buf; char *file = mpl->mod_file; int k; if (mpl->phase != 3) xfault("mpl_get_prob_name: invalid call sequence\n"); for (;;) { if (strchr(file, '/') != NULL) file = strchr(file, '/') + 1; else if (strchr(file, '\\') != NULL) file = strchr(file, '\\') + 1; else if (strchr(file, ':') != NULL) file = strchr(file, ':') + 1; else break; } for (k = 0; ; k++) { if (k == 255) break; if (!(isalnum((unsigned char)*file) || *file == '_')) break; name[k] = *file++; } if (k == 0) strcpy(name, "Unknown"); else name[k] = '\0'; xassert(strlen(name) <= 255); return name; }