4 * Created on: Dec 1, 2010
13 #include "instr/jedule/jedule_output.h"
15 #include "xbt/dynar.h"
16 #include "xbt/asserts.h"
20 /*********************************************************/
22 xbt_dynar_t jedule_event_list;
24 static FILE *jed_file;
26 static void print_platform(jed_simgrid_container_t root_container);
27 static void print_container(jed_simgrid_container_t container);
28 static void print_resources(jed_simgrid_container_t resource_parent);
29 static void print_key_value_dict(xbt_dict_t meta_info_dict);
30 static void print_events(xbt_dynar_t event_list);
31 static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t container);
33 /*********************************************************/
36 static void get_hierarchy_list(xbt_dynar_t hier_list, jed_simgrid_container_t container) {
38 xbt_assert( container != NULL );
40 if( container->parent != NULL ) {
42 if( container->parent->container_children == NULL ) {
43 // we are in the last level
44 get_hierarchy_list(hier_list, container->parent);
49 jed_simgrid_container_t child_container;
51 xbt_dynar_foreach(container->parent->container_children, i, child_container) {
52 if( child_container == container ) {
58 xbt_assert( child_nb > - 1);
60 xbt_dynar_insert_at(hier_list, 0, &child_nb);
62 get_hierarchy_list(hier_list, container->parent);
66 xbt_dynar_insert_at(hier_list, 0, &top_level);
71 static void print_key_value_dict(xbt_dict_t key_value_dict) {
72 xbt_dict_cursor_t cursor=NULL;
75 if( key_value_dict != NULL ) {
76 xbt_dict_foreach(key_value_dict,cursor,key,data) {
77 fprintf(jed_file, "<prop key=\"%s\" values=\"%s\" />\n",key,data);
82 static void print_container(jed_simgrid_container_t container) {
84 jed_simgrid_container_t child_container;
86 xbt_assert( container != NULL );
88 fprintf(jed_file, "<res name=\"%s\">\n", container->name);
89 if( container->container_children != NULL ) {
90 xbt_dynar_foreach(container->container_children, i, child_container) {
91 print_container(child_container);
94 print_resources(container);
96 fprintf(jed_file, "</res>\n");
99 static void print_resources(jed_simgrid_container_t resource_parent) {
103 xbt_assert( resource_parent->resource_list != NULL );
105 res_nb = xbt_dynar_length(resource_parent->resource_list);
107 fprintf(jed_file, "<rset nb=\"%d\" names=\"", res_nb);
108 xbt_dynar_foreach(resource_parent->resource_list, i, res_name) {
109 fprintf(jed_file, "%s", res_name);
110 if( i != res_nb-1 ) {
111 fprintf(jed_file, "|");
114 fprintf(jed_file, "\" />\n");
118 static void print_platform(jed_simgrid_container_t root_container) {
120 fprintf(jed_file, "<platform>\n");
121 print_container(root_container);
122 fprintf(jed_file, "</platform>\n");
125 static void print_event(jed_event_t event) {
127 jed_res_subset_t subset;
130 xbt_assert( event != NULL );
131 xbt_assert( event->resource_subsets != NULL );
133 fprintf(jed_file, "<event>\n");
136 fprintf(jed_file, "<prop value=\"name\" value=\"%s\" />\n", event->name);
137 fprintf(jed_file, "<prop value=\"start\" value=\"%g\" />\n", event->start_time);
138 fprintf(jed_file, "<prop value=\"end\" value=\"%g\" />\n", event->end_time);
139 fprintf(jed_file, "<prop value=\"type\" value=\"%s\" />\n", event->type);
141 fprintf(jed_file, "<res_util>\n");
143 xbt_dynar_foreach(event->resource_subsets, i, subset) {
145 int start = subset->start_idx;
146 int end = subset->start_idx + subset->nres - 1;
147 xbt_dynar_t hier_list;
151 hier_list = xbt_dynar_new(sizeof(int), NULL);
153 //printf("subset start %d nres %d\n", subset->start_idx, subset->nres);
155 //printf("parent %s\n", event->resource_selection[i]->parent->name);
156 get_hierarchy_list(hier_list, subset->parent);
158 fprintf(jed_file, "<select resources=\"");
160 xbt_dynar_foreach(hier_list, iter, number) {
161 fprintf(jed_file, "%d.", number);
163 fprintf(jed_file, "[%d-%d]", start, end);
164 fprintf(jed_file, "\" />\n");
166 xbt_dynar_free(&hier_list);
169 fprintf(jed_file, "</res_util>\n");
171 fprintf(jed_file, "<characteristics>\n");
175 xbt_dynar_foreach(event->characteristics_list, iter, ch) {
176 fprintf(jed_file, "<characteristic name=\"%s\" />\n", ch);
179 fprintf(jed_file, "</characteristics>\n");
181 fprintf(jed_file, "<info>\n");
182 print_key_value_dict(event->info_hash);
183 fprintf(jed_file, "</info>\n");
185 fprintf(jed_file, "</event>\n");
188 static void print_events(xbt_dynar_t event_list) {
192 fprintf(jed_file, "<events>\n");
193 xbt_dynar_foreach(event_list, i, event) {
196 fprintf(jed_file, "</events>\n");
200 void write_jedule_output(FILE *file, jedule_t jedule,
201 xbt_dynar_t event_list, xbt_dict_t meta_info_dict) {
203 // xbt_assert( jed_file != NULL );
207 fprintf(jed_file, "<jedule>\n");
209 fprintf(jed_file, "<jedule_meta>\n");
210 print_key_value_dict(jedule->jedule_meta_info);
211 fprintf(jed_file, "</jedule_meta>\n");
213 print_platform(jedule->root_container);
215 print_events(event_list);
217 fprintf(jed_file, "</jedule>\n");
221 void jedule_init_output() {
222 jedule_event_list = xbt_dynar_new(sizeof(jed_event_t), NULL);
225 void jedule_cleanup_output() {
226 xbt_dynar_free(&jedule_event_list);
229 void jedule_store_event(jed_event_t event) {
230 xbt_assert(event != NULL);
231 xbt_dynar_push(jedule_event_list, &event);