00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 # include <stdlib.h>
00064 # include <stdio.h>
00065 # include <ctype.h>
00066 # include <string.h>
00067
00068 #include <osl/macros.h>
00069 #include <osl/util.h>
00070 #include <osl/extensions/arrays.h>
00071 #include <osl/extensions/textual.h>
00072 #include <osl/strings.h>
00073 #include <osl/relation.h>
00074 #include <osl/interface.h>
00075 #include <osl/generic.h>
00076 #include <osl/statement.h>
00077 #include <osl/scop.h>
00078
00079
00080
00081
00082
00083
00084
00095 void osl_scop_idump(FILE * file, osl_scop_p scop, int level) {
00096 int j, first = 1;
00097
00098
00099 for (j = 0; j < level; j++)
00100 fprintf(file, "|\t");
00101
00102 if (scop != NULL)
00103 fprintf(file, "+-- osl_scop_t\n");
00104 else
00105 fprintf(file, "+-- NULL scop\n");
00106
00107 while (scop != NULL) {
00108 if (!first) {
00109
00110 for (j = 0; j < level; j++)
00111 fprintf(file, "|\t");
00112 fprintf(file, "| osl_scop_t\n");
00113 }
00114 else
00115 first = 0;
00116
00117
00118 for (j = 0; j <= level+1; j++)
00119 fprintf(file, "|\t");
00120 fprintf(file, "\n");
00121
00122
00123 for (j = 0; j < level; j++)
00124 fprintf(file, "|\t");
00125 fprintf(file, "|\tVersion: %d\n", scop->version);
00126
00127
00128 for (j = 0; j <= level+1; j++)
00129 fprintf(file, "|\t");
00130 fprintf(file, "\n");
00131
00132
00133 for (j = 0; j < level; j++)
00134 fprintf(file, "|\t");
00135 fprintf(file, "|\tLanguage: %s\n", scop->language);
00136
00137
00138 for (j = 0; j <= level+1; j++)
00139 fprintf(file, "|\t");
00140 fprintf(file, "\n");
00141
00142
00143 osl_relation_idump(file, scop->context, level+1);
00144
00145
00146 osl_generic_idump(file, scop->parameters, level+1);
00147
00148
00149 osl_statement_idump(file, scop->statement, level+1);
00150
00151
00152 osl_interface_idump(file, scop->registry, level+1);
00153
00154
00155 osl_generic_idump(file, scop->extension, level+1);
00156
00157 scop = scop->next;
00158
00159
00160 if (scop != NULL) {
00161 for (j = 0; j <= level; j++)
00162 fprintf(file, "|\t");
00163 fprintf(file, "V\n");
00164 }
00165 }
00166
00167
00168 for (j = 0; j <= level; j++)
00169 fprintf(file, "|\t");
00170 fprintf(file, "\n");
00171 }
00172
00173
00181 void osl_scop_dump(FILE * file, osl_scop_p scop) {
00182 osl_scop_idump(file, scop, 0);
00183 }
00184
00185
00193 static
00194 osl_names_p osl_scop_names(osl_scop_p scop) {
00195 int nb_parameters = OSL_UNDEFINED;
00196 int nb_iterators = OSL_UNDEFINED;
00197 int nb_scattdims = OSL_UNDEFINED;
00198 int nb_localdims = OSL_UNDEFINED;
00199 int array_id = OSL_UNDEFINED;
00200
00201 osl_scop_get_attributes(scop, &nb_parameters, &nb_iterators,
00202 &nb_scattdims, &nb_localdims, &array_id);
00203
00204 return osl_names_generate("P", nb_parameters,
00205 "i", nb_iterators,
00206 "c", nb_scattdims,
00207 "l", nb_localdims,
00208 "A", array_id);
00209 }
00210
00211
00219 void osl_scop_print(FILE * file, osl_scop_p scop) {
00220 int parameters_backedup = 0;
00221 int arrays_backedup = 0;
00222 osl_strings_p parameters_backup = NULL;
00223 osl_strings_p arrays_backup = NULL;
00224 osl_names_p names;
00225 osl_arrays_p arrays;
00226
00227 if (scop == NULL) {
00228 fprintf(file, "# NULL scop\n");
00229 return;
00230 }
00231 else {
00232 fprintf(file, "# [File generated by the OpenScop Library %s]\n",
00233 OSL_RELEASE);
00234 }
00235
00236 if (osl_scop_integrity_check(scop) == 0)
00237 OSL_warning("OpenScop integrity check failed. Something may go wrong.");
00238
00239
00240 names = osl_scop_names(scop);
00241
00242 while (scop != NULL) {
00243
00244 if (osl_generic_has_URI(scop->parameters, OSL_URI_STRINGS)) {
00245 parameters_backedup = 1;
00246 parameters_backup = names->parameters;
00247 names->parameters = scop->parameters->data;
00248 }
00249
00250
00251 arrays = osl_generic_lookup(scop->extension, OSL_URI_ARRAYS);
00252 if (arrays != NULL) {
00253 arrays_backedup = 1;
00254 arrays_backup = names->arrays;
00255 names->arrays = osl_arrays_to_strings(arrays);
00256 }
00257
00258 fprintf(file, "\n"OSL_TAG_START_SCOP"\n\n");
00259 fprintf(file, "# =============================================== "
00260 "Global\n");
00261 fprintf(file, "# Language\n");
00262 fprintf(file, "%s\n\n", scop->language);
00263
00264 fprintf(file, "# Context\n");
00265 osl_relation_pprint(file, scop->context, names);
00266 fprintf(file, "\n");
00267
00268 osl_util_print_provided(file,
00269 osl_generic_has_URI(scop->parameters, OSL_URI_STRINGS),
00270 "Parameters are");
00271 osl_generic_print(file, scop->parameters);
00272
00273 fprintf(file, "\n# Number of statements\n");
00274 fprintf(file, "%d\n\n",osl_statement_number(scop->statement));
00275
00276 osl_statement_pprint(file, scop->statement, names);
00277
00278 if (scop->extension) {
00279 fprintf(file, "# =============================================== "
00280 "Extensions\n");
00281 osl_generic_print(file, scop->extension);
00282 }
00283 fprintf(file, "\n"OSL_TAG_END_SCOP"\n\n");
00284
00285
00286 if (parameters_backedup) {
00287 parameters_backedup = 0;
00288 names->parameters = parameters_backup;
00289 }
00290
00291
00292 if (arrays_backedup) {
00293 arrays_backedup = 0;
00294 osl_strings_free(names->arrays);
00295 names->arrays = arrays_backup;
00296 }
00297
00298 scop = scop->next;
00299 }
00300
00301 osl_names_free(names);
00302 }
00303
00304
00305
00306
00307
00308
00309
00322 osl_scop_p osl_scop_pread(FILE * file, osl_interface_p registry,
00323 int precision) {
00324 osl_scop_p list = NULL, current = NULL, scop;
00325 osl_statement_p stmt = NULL;
00326 osl_statement_p prev = NULL;
00327 osl_strings_p language;
00328 int nb_statements;
00329 char * tmp;
00330 int first = 1;
00331 int i;
00332
00333 if (file == NULL)
00334 return NULL;
00335
00336 while(1) {
00337
00338
00339
00340 tmp = osl_util_read_uptotag(file, OSL_TAG_START_SCOP);
00341 if (tmp == NULL) {
00342 OSL_debug("no more scop in the file");
00343 break;
00344 }
00345 else {
00346 free(tmp);
00347 }
00348
00349 scop = osl_scop_malloc();
00350 scop->registry = osl_interface_clone(registry);
00351
00352
00353
00354
00355
00356
00357 language = osl_strings_read(file);
00358 if (osl_strings_size(language) == 0)
00359 OSL_error("no language (backend) specified");
00360
00361 if (osl_strings_size(language) > 1)
00362 OSL_warning("uninterpreted information (after language)");
00363
00364 if (language != NULL) {
00365 scop->language = strdup(language->string[0]);
00366 osl_strings_free(language);
00367 }
00368
00369
00370 scop->context = osl_relation_pread(file, precision);
00371
00372
00373 if (osl_util_read_int(file, NULL) > 0)
00374 scop->parameters = osl_generic_read_one(file, scop->registry);
00375
00376
00377
00378
00379
00380
00381 nb_statements = osl_util_read_int(file, NULL);
00382
00383 for (i = 0; i < nb_statements; i++) {
00384
00385 stmt = osl_statement_pread(file, scop->registry, precision);
00386 if (scop->statement == NULL)
00387 scop->statement = stmt;
00388 else
00389 prev->next = stmt;
00390 prev = stmt;
00391 }
00392
00393
00394
00395
00396
00397
00398 scop->extension = osl_generic_read(file, scop->registry);
00399
00400
00401 if (first) {
00402 list = scop;
00403 first = 0;
00404 }
00405 else {
00406 current->next = scop;
00407 }
00408 current = scop;
00409 }
00410
00411 if (!osl_scop_integrity_check(list))
00412 OSL_warning("scop integrity check failed");
00413
00414 return list;
00415 }
00416
00417
00426 osl_scop_p osl_scop_read(FILE * foo) {
00427 int precision = osl_util_get_precision();
00428 osl_interface_p registry = osl_interface_get_default_registry();
00429 osl_scop_p scop = osl_scop_pread(foo, registry, precision);
00430
00431 osl_interface_free(registry);
00432 return scop;
00433 }
00434
00435
00436
00437
00438
00439
00440
00448 osl_scop_p osl_scop_malloc() {
00449 osl_scop_p scop;
00450
00451 OSL_malloc(scop, osl_scop_p, sizeof(osl_scop_t));
00452 scop->version = 1;
00453 scop->language = NULL;
00454 scop->context = NULL;
00455 scop->parameters = NULL;
00456 scop->statement = NULL;
00457 scop->registry = NULL;
00458 scop->extension = NULL;
00459 scop->usr = NULL;
00460 scop->next = NULL;
00461
00462 return scop;
00463 }
00464
00465
00471 void osl_scop_free(osl_scop_p scop) {
00472 osl_scop_p tmp;
00473
00474 while (scop != NULL) {
00475 if (scop->language != NULL)
00476 free(scop->language);
00477 osl_generic_free(scop->parameters);
00478 osl_relation_free(scop->context);
00479 osl_statement_free(scop->statement);
00480 osl_interface_free(scop->registry);
00481 osl_generic_free(scop->extension);
00482
00483 tmp = scop->next;
00484 free(scop);
00485 scop = tmp;
00486 }
00487 }
00488
00489
00490
00491
00492
00493
00494
00502 void osl_scop_add(osl_scop_p * location, osl_scop_p scop) {
00503 while (*location != NULL)
00504 location = &((*location)->next);
00505
00506 *location = scop;
00507 }
00508
00509
00518 osl_scop_p osl_scop_clone(osl_scop_p scop) {
00519 osl_scop_p clone = NULL, node, previous = NULL;
00520 int first = 1;
00521
00522 while (scop != NULL) {
00523 node = osl_scop_malloc();
00524 node->version = scop->version;
00525 if (scop->language != NULL)
00526 node->language = strdup(scop->language);
00527 node->context = osl_relation_clone(scop->context);
00528 node->parameters = osl_generic_clone(scop->parameters);
00529 node->statement = osl_statement_clone(scop->statement);
00530 node->registry = osl_interface_clone(scop->registry);
00531 node->extension = osl_generic_clone(scop->extension);
00532
00533 if (first) {
00534 first = 0;
00535 clone = node;
00536 previous = node;
00537 }
00538 else {
00539 previous->next = node;
00540 previous = previous->next;
00541 }
00542
00543 scop = scop->next;
00544 }
00545
00546 return clone;
00547 }
00548
00549
00558 int osl_scop_equal(osl_scop_p s1, osl_scop_p s2) {
00559
00560 while ((s1 != NULL) && (s2 != NULL)) {
00561 if (s1 == s2)
00562 return 1;
00563
00564 if (s1->version != s2->version) {
00565 OSL_info("versions are not the same");
00566 return 0;
00567 }
00568
00569 if (strcmp(s1->language, s2->language) != 0) {
00570 OSL_info("languages are not the same");
00571 return 0;
00572 }
00573
00574 if (!osl_relation_equal(s1->context, s2->context)) {
00575 OSL_info("contexts are not the same");
00576 return 0;
00577 }
00578
00579 if (!osl_generic_equal(s1->parameters, s2->parameters)) {
00580 OSL_info("parameters are not the same");
00581 return 0;
00582 }
00583
00584 if (!osl_statement_equal(s1->statement, s2->statement)) {
00585 OSL_info("statements are not the same");
00586 return 0;
00587 }
00588
00589 if (!osl_interface_equal(s1->registry, s2->registry)) {
00590 OSL_info("registries are not the same");
00591 return 0;
00592 }
00593
00594 if (!osl_generic_equal(s1->extension, s2->extension)) {
00595 OSL_info("extensions are not the same");
00596 return 0;
00597 }
00598
00599 s1 = s1->next;
00600 s2 = s2->next;
00601 }
00602
00603 if (((s1 == NULL) && (s2 != NULL)) || ((s1 != NULL) && (s2 == NULL)))
00604 return 0;
00605
00606 return 1;
00607 }
00608
00609
00617 int osl_scop_integrity_check(osl_scop_p scop) {
00618 int expected_nb_parameters;
00619
00620
00621 while (scop != NULL) {
00622
00623 if ((scop->language != NULL) &&
00624 (!strcmp(scop->language, "caml") || !strcmp(scop->language, "Caml") ||
00625 !strcmp(scop->language, "ocaml") || !strcmp(scop->language, "OCaml")))
00626 fprintf(stderr, "[OpenScop] Alert: What ?! Caml ?! Are you sure ?!?!\n");
00627
00628
00629 if (!osl_relation_integrity_check(scop->context,
00630 OSL_TYPE_CONTEXT,
00631 OSL_UNDEFINED,
00632 OSL_UNDEFINED,
00633 OSL_UNDEFINED))
00634 return 0;
00635
00636
00637 if (scop->context != NULL)
00638 expected_nb_parameters = scop->context->nb_parameters;
00639 else
00640 expected_nb_parameters = OSL_UNDEFINED;
00641
00642
00643
00644 if (!osl_statement_integrity_check(scop->statement,
00645 expected_nb_parameters))
00646 return 0;
00647
00648 scop = scop->next;
00649 }
00650
00651 return 1;
00652 }
00653
00654
00661 int osl_scop_get_nb_parameters(osl_scop_p scop) {
00662
00663 if (scop->context == NULL) {
00664 OSL_debug("no context domain, assuming 0 parameters");
00665 return 0;
00666 }
00667 else {
00668 return scop->context->nb_parameters;
00669 }
00670 }
00671
00672
00682 void osl_scop_register_extension(osl_scop_p scop, osl_interface_p interface) {
00683 osl_generic_p textual, new;
00684 char * extension_string;
00685
00686 if ((interface != NULL) && (scop != NULL)) {
00687 osl_interface_add(&scop->registry, interface);
00688
00689 textual = osl_generic_lookup(scop->extension, interface->URI);
00690 if (textual != NULL) {
00691 extension_string = ((osl_textual_p)textual->data)->textual;
00692 new = osl_generic_sread(extension_string, interface);
00693 osl_generic_add(&scop->extension, new);
00694 }
00695 }
00696 }
00697
00698
00717 void osl_scop_get_attributes(osl_scop_p scop,
00718 int * nb_parameters,
00719 int * nb_iterators,
00720 int * nb_scattdims,
00721 int * nb_localdims,
00722 int * array_id) {
00723 int local_nb_parameters = OSL_UNDEFINED;
00724 int local_nb_iterators = OSL_UNDEFINED;
00725 int local_nb_scattdims = OSL_UNDEFINED;
00726 int local_nb_localdims = OSL_UNDEFINED;
00727 int local_array_id = OSL_UNDEFINED;
00728
00729 while (scop != NULL) {
00730 osl_relation_get_attributes(scop->context,
00731 &local_nb_parameters,
00732 &local_nb_iterators,
00733 &local_nb_scattdims,
00734 &local_nb_localdims,
00735 &local_array_id);
00736
00737 osl_statement_get_attributes(scop->statement,
00738 &local_nb_parameters,
00739 &local_nb_iterators,
00740 &local_nb_scattdims,
00741 &local_nb_localdims,
00742 &local_array_id);
00743
00744 *nb_parameters = OSL_max(*nb_parameters, local_nb_parameters);
00745 *nb_iterators = OSL_max(*nb_iterators, local_nb_iterators);
00746 *nb_scattdims = OSL_max(*nb_scattdims, local_nb_scattdims);
00747 *nb_localdims = OSL_max(*nb_localdims, local_nb_localdims);
00748 *array_id = OSL_max(*array_id, local_array_id);
00749 scop = scop->next;
00750 }
00751 }
00752
00753
00761 void osl_scop_normalize_scattering(osl_scop_p scop) {
00762 int max_scattering_dims = 0;
00763 osl_statement_p statement;
00764 osl_relation_p extended;
00765
00766 if ((scop != NULL) && (scop->statement != NULL)) {
00767
00768 statement = scop->statement;
00769 while (statement != NULL) {
00770 if (statement->scattering != NULL) {
00771 max_scattering_dims = OSL_max(max_scattering_dims,
00772 statement->scattering->nb_output_dims);
00773 }
00774 statement = statement->next;
00775 }
00776
00777
00778 statement = scop->statement;
00779 while (statement != NULL) {
00780 if (statement->scattering != NULL) {
00781 extended = osl_relation_extend_output(statement->scattering,
00782 max_scattering_dims);
00783 osl_relation_free(statement->scattering);
00784 statement->scattering = extended;
00785 }
00786 statement = statement->next;
00787 }
00788 }
00789 }
00790