1 /* Copyright (c) 2009 Da SimGrid Team. All rights reserved. */
3 /* This program is free software; you can redistribute it and/or modify it
4 * under the terms of the license (GNU LGPL) which comes with this package. */
7 #include "simdag/simdag.h"
11 XBT_LOG_NEW_DEFAULT_SUBCATEGORY(sd_daxparse, sd,"Parsing DAX files");
19 static void dax_parse_error(char *msg) {
20 fprintf(stderr, "Parse error on line %d: %s\n", dax_lineno, msg);
23 static double dax_parse_double(const char *string) {
27 ret = sscanf(string, "%lg", &value);
29 dax_parse_error(bprintf("%s is not a double", string));
32 static int dax_parse_int(const char *string) {
36 ret = sscanf(string, "%d", &value);
38 dax_parse_error(bprintf("%s is not an integer", string));
42 static YY_BUFFER_STATE input_buffer;
44 static xbt_dynar_t result;
45 static xbt_dict_t files;
46 static SD_task_t current_job;
58 short int is_comm_task;
65 static void dax_task_rmdata(SD_task_t t) {
69 static void dax_task_free(void*task){
74 xbt_dynar_t SD_daxload(const char*filename) {
76 FILE* in_file = fopen(filename,"r");
77 xbt_assert1(in_file, "Unable to open \"%s\"\n", filename);
78 input_buffer = dax__create_buffer(in_file, 10);
79 dax__switch_to_buffer(input_buffer);
82 result = xbt_dynar_new(sizeof(SD_task_t),dax_task_free);
84 task = SD_task_create("top",NULL,0);
85 xbt_dynar_push(result,&task);
87 xbt_assert2(!dax_lex(),"Parse error in %s: %s",filename,dax__parse_err_msg());
88 dax__delete_buffer(input_buffer);
89 xbt_dict_free(&files);
94 void STag_dax__adag(void) {
95 double version = dax_parse_double(A_dax__adag_version);
97 xbt_assert1((version == 2.1), "Expected version 2.1 in <adag> tag, got %f. Fix the parser or your file",version);
99 void STag_dax__job(void) {
100 double runtime = dax_parse_double(A_dax__job_runtime);
101 runtime*=4200000000.; /* Assume that timings were done on a 4.2GFlops machine. I mean, why not? */
102 INFO3("See <job id=%s runtime=%s %.0f>",A_dax__job_id,A_dax__job_runtime,runtime);
103 current_job = SD_task_create(A_dax__job_id,NULL,runtime);
104 xbt_dynar_push(result,current_job);
106 void STag_dax__child(void) {
107 // INFO0("See <child>");
109 void STag_dax__parent(void) {
110 // INFO0("See <parent>");
112 void STag_dax__uses(void) {
114 double size = dax_parse_double(A_dax__uses_size);
115 int is_input = (A_dax__uses_link == A_dax__uses_link_input);
117 INFO2("See <uses file=%s %s>",A_dax__uses_file,(is_input?"in":"out"));
118 file = xbt_dict_get_or_null(files,A_dax__uses_file);
120 file = SD_task_create(A_dax__uses_file,NULL,size);
121 xbt_dict_set(files,A_dax__uses_file,file,NULL);
123 if (SD_task_get_amount(file)!=size) {
124 WARN3("Ignoring file %s size redefinition from %.0f to %.0f",
125 A_dax__uses_file,SD_task_get_amount(file),size);
129 SD_task_dependency_add(NULL,NULL,file,current_job);
131 SD_task_dependency_add(NULL,NULL,file,current_job);
134 void ETag_dax__adag(void) {
135 // INFO0("See </adag>");
137 void ETag_dax__job(void) {
139 // INFO0("See </job>");
141 void ETag_dax__child(void) {
142 // INFO0("See </child>");
144 void ETag_dax__parent(void) {
145 // INFO0("See </parent>");
147 void ETag_dax__uses(void) {
148 // INFO0("See </uses>");