Subversion Repositories shark

Rev

Rev 1254 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1254 giacomo 1
/* Event Generator
2
 *
3
 * Giacomo Guidi
4
 */
5
 
6
#include <stdio.h>
7
#include <stdlib.h>
8
 
9
#include "lparser.h"
10
#include "lread.h"
11
#include "time.h"
12
#include "common/time.h"
13
 
14
#define LOADFILE_DIR "../loadfile/"
15
 
16
#define EVENT_DEFINE "event.c"
17
#define ACT_LIST "event.c"
18
 
19
int write_struct(void)
20
{
21
 
22
  FILE *file_event_header;
23
 
24
  file_event_header = fopen(EVENT_DEFINE,"w");
25
  if (file_event_header == NULL) return 1;
26
 
27
  fprintf(file_event_header, "\n#include \"func.h\"\n");
28
 
29
  fclose(file_event_header);
30
 
31
  return 0;
32
 
33
}
34
 
35
int write_basic_par_start(void)
36
{
37
 
38
  FILE *file_event_header;
39
 
40
  file_event_header = fopen(EVENT_DEFINE,"a+");
41
  if (file_event_header == NULL) return 1;
42
 
43
  fprintf(file_event_header, "struct loader_task loader_task_list[] = {\n");
44
 
45
  fclose(file_event_header);
46
 
47
  return 0;
48
 
49
}
50
 
51
int write_contract_start(void)
52
{
53
 
54
  FILE *file_event_header;
55
 
56
  file_event_header = fopen(EVENT_DEFINE,"a+");
57
  if (file_event_header == NULL) return 1;
58
 
59
  fprintf(file_event_header, "struct loader_contract loader_contract_list[] = {\n");
60
 
61
  fclose(file_event_header);
62
 
63
  return 0;
64
 
65
}
66
 
67
int write_basic_par(struct loader_task *c)
68
{
69
 
70
  FILE *file_event_header;
71
 
72
  file_event_header = fopen(EVENT_DEFINE,"a+");
73
  if (file_event_header == NULL) return 1;
74
 
75
  fprintf(file_event_header, "  {\"%s\",%d,%d,%d,%d,%d,{%d,%d},{%d,%d},%d,0,act_%s,exec_%s},\n",
76
                             c->name,(int)c->task_type,(int)c->server,(int)c->local_scheduler,(int)c->number,(int)c->group,
77
                             (int)c->deadline.tv_sec, (int)c->deadline.tv_nsec,
78
                             (int)c->wcet.tv_sec, (int)c->wcet.tv_nsec,
79
                             (int)c->act_number, c->name, c->name);
80
 
81
  fclose(file_event_header);
82
 
83
  return 0;  
84
 
85
}
86
 
87
int write_contract(struct loader_contract *c)
88
{
89
 
90
  FILE *file_event_header;
91
 
92
  file_event_header = fopen(EVENT_DEFINE,"a+");
93
  if (file_event_header == NULL) return 1;
94
 
95
  fprintf(file_event_header, "  {%d,{%d,%d},{%d,%d},{%d,%d},{%d,%d},%d,%d,-1},\n",
96
                             (int)c->number,(int)c->cmin.tv_sec,(int)c->cmin.tv_nsec,
97
                             (int)c->tmax.tv_sec,(int)c->tmax.tv_nsec,
98
                             (int)c->cmax.tv_sec,(int)c->cmax.tv_nsec,
99
                             (int)c->tmin.tv_sec,(int)c->tmin.tv_nsec,
100
                             (int)c->workload,(int)c->local_scheduler);
101
 
102
  fclose(file_event_header);
103
 
104
  return 0;
105
 
106
}
107
 
108
int close_loader_task(int total_task_number)
109
{
110
 
111
  FILE *file_event_header;
112
 
113
  file_event_header = fopen(EVENT_DEFINE,"a+");
114
  if (file_event_header == NULL) return 1;
115
 
116
  fprintf(file_event_header,"};\n\n");
117
 
118
  fprintf(file_event_header,"int total_loader_task = %d;\n\n",total_task_number);
119
 
120
  fclose(file_event_header);
121
 
122
  return 0;
123
 
124
}
125
 
126
int close_loader_contract(int total_contract_number)
127
{
128
 
129
  FILE *file_event_header;
130
 
131
  file_event_header = fopen(EVENT_DEFINE,"a+");
132
  if (file_event_header == NULL) return 1;
133
 
134
  fprintf(file_event_header,"};\n\n");
135
 
136
  fprintf(file_event_header,"int total_loader_contract = %d;\n\n",total_contract_number);
137
 
138
  fclose(file_event_header);
139
 
140
  return 0;
141
 
142
}
143
 
144
int write_simulation_time(struct timespec *total)
145
{
146
 
147
  FILE *file_event_header;
148
 
149
  file_event_header = fopen(EVENT_DEFINE,"a+");
150
  if (file_event_header == NULL) return 1;
151
 
152
  fprintf(file_event_header,"struct timespec total_time = {%d,%d};\n\n",(int)total->tv_sec,(int)total->tv_nsec);
153
 
154
  fclose(file_event_header);
155
 
156
  return 0;
157
 
158
 
159
}
160
 
161
int write_single_act(struct timespec *t, struct loader_task *c)
162
{
163
 
164
  FILE *file_act_header;
165
 
166
  file_act_header = fopen(ACT_LIST,"a+");
167
  if (file_act_header == NULL) return 1;
168
 
169
  if (TIMESPEC_A_GT_B(t,&c->act_par_1)) {
170
    fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d}};\n\n",c->name,
171
          (int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec);
172
    c->act_number = 1;
173
  } else {
174
    fprintf(file_act_header,"struct timespec act_%s[] = {{0,0}};\n\n",c->name);
175
    c->act_number = 0;
176
  }
177
 
178
  fclose(file_act_header);
179
 
180
  return 0;
181
 
182
}
183
 
184
int write_periodic_act(struct timespec *t, struct loader_task *c)
185
{
186
 
187
  FILE *file_act_header;
188
  struct timespec tot_time;
189
  int period;
190
 
191
  file_act_header = fopen(ACT_LIST,"a+");
192
  if (file_act_header == NULL) return 1;
193
 
194
  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name,
195
          (int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec);
196
 
197
  c->act_number = 1;
198
  TIMESPEC_ASSIGN(&tot_time,&c->act_par_1);
199
  period = TIMESPEC2USEC(&c->act_par_2);
200
  while (TIMESPEC_A_GT_B(t, &tot_time)) {
201
    c->act_number++;
202
    ADDUSEC2TIMESPEC(period,&tot_time);
203
    fprintf(file_act_header,"  {%d,%d},\n",
204
            (int)c->act_par_2.tv_sec,(int)c->act_par_2.tv_nsec);
205
  }
206
 
207
  fprintf(file_act_header,"  };\n\n");
208
 
209
  fclose(file_act_header);
210
 
211
  return 0;
212
 
213
}
214
 
215
int write_mean_act(struct timespec *t,struct loader_task *c)
216
{
217
 
218
  FILE *file_act_header;
219
  struct timespec tot_time;
220
  int next_act;          
221
 
222
  file_act_header = fopen(ACT_LIST,"a+");
223
  if (file_act_header == NULL) return 1;
224
 
225
  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name,
226
          (int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec);
227
 
228
  c->act_number = 1;                                                                                                        
229
  TIMESPEC_ASSIGN(&tot_time,&c->act_par_1);
230
  while (TIMESPEC_A_GT_B(t, &tot_time)) {
231
    c->act_number++;
232
    next_act = TIMESPEC2USEC(&c->act_par_2) + random() % TIMESPEC2USEC(&c->act_par_3) - TIMESPEC2USEC(&c->act_par_3) / 2;
233
    ADDUSEC2TIMESPEC(next_act,&tot_time);
234
    fprintf(file_act_header,"  {%d,%d},\n",
235
            next_act / 1000000, next_act % 1000000 * 1000);
236
  }
237
 
238
  fprintf(file_act_header,"  };\n\n");
239
 
240
  fclose(file_act_header);
241
 
242
  return 0;
243
 
244
}
245
 
246
int write_exec_const(struct loader_task *c)
247
{
248
 
249
  FILE *file_exec_header;
250
  int i;
251
 
252
  file_exec_header = fopen(ACT_LIST,"a+");
253
  if (file_exec_header == NULL) return 1;
254
 
255
  fprintf(file_exec_header,"struct timespec exec_%s[] =  {{%d,%d},\n",c->name,
256
          (int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec);
257
 
258
  for (i=0; i< c->act_number-1; i++)  
259
    fprintf(file_exec_header,"  {%d,%d},\n",
260
          (int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec);
261
 
262
  fprintf(file_exec_header,"  };\n\n");
263
 
264
  fclose(file_exec_header);
265
 
266
  return 0;
267
 
268
}
269
 
270
int write_exec_mean(struct loader_task *c)
271
{
272
 
273
  FILE *file_exec_header;
274
  int exec_time_usec;
275
  int i;
276
 
277
  file_exec_header = fopen(ACT_LIST,"a+");
278
  if (file_exec_header == NULL) return 1;
279
 
1258 giacomo 280
  exec_time_usec = TIMESPEC2USEC(&c->exec_par_1)
281
                        + random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2;
1254 giacomo 282
  fprintf(file_exec_header,"struct timespec exec_%s[] = {{%d,%d},\n",c->name,
283
          exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000);
284
 
285
  for (i=0; i< c->act_number-1; i++) {
1258 giacomo 286
    exec_time_usec = TIMESPEC2USEC(&c->exec_par_1)
287
                        + random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2;
1254 giacomo 288
    fprintf(file_exec_header,"  {%d,%d},\n",
289
          exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000);
290
  }
291
 
292
  fprintf(file_exec_header,"  };\n\n");
293
 
294
  fclose(file_exec_header);
295
 
296
  return 0;
297
 
298
}
299
 
300
void *start;
301
void *end;
302
 
303
int main(int argc, char **argv) {
304
 
305
  char loadfile[100];
306
  struct timespec total_time;
307
  struct loader_task *start_loader_task = NULL, *current_t;
308
  struct loader_contract *start_loader_contract = NULL, *current_c;
309
  int err,ldnum;
310
  int total_task_number;
311
  int total_contract_number;
312
 
313
  printf("\nEvent Generator\n");
314
 
315
  if (argc < 2) {
316
    printf("Error: event_gen loadfile.fsf\n");
317
    exit(1);
318
  }
319
 
320
  printf("Read loader file %s\n",argv[1]);
321
 
322
  sprintf(loadfile,"%s%s",LOADFILE_DIR,argv[1]);
323
  err = dos_preload(loadfile,100000,&start,&end);
324
 
325
  if (err != 0) {
326
    printf("Error: File not found\n");
327
    exit(1);
328
  }
329
 
330
  printf("Parsing file\n");
331
 
332
  line_reader(start, end, &total_time, &start_loader_task, &start_loader_contract);
333
 
334
  srandom(time(NULL));
335
 
336
  write_struct();
337
 
338
  current_t = start_loader_task;
339
  ldnum = 1;
340
 
341
  while(current_t != NULL) {
342
 
343
    sprintf(current_t->name,"ltask%d",ldnum);    
344
    current_t->group = ldnum;
345
    ldnum++;
346
 
347
    switch (current_t->act_type) {
348
     case PAR_ACT_SINGLE:
349
       err = write_single_act(&total_time,current_t);
350
        if (err != 0) {
351
          printf("Error writing activation header\n");
352
          exit(1);
353
        }
354
        break;
355
      case PAR_ACT_PERIODIC:
356
        err = write_periodic_act(&total_time,current_t);
357
        if (err != 0) {
358
          printf("Error writing activation header\n");
359
          exit(1);
360
        }
361
        break;
362
      case PAR_ACT_MEAN:
363
        err = write_mean_act(&total_time,current_t);
364
        if (err != 0) {
365
          printf("Error writing activation header\n");
366
          exit(1);
367
        }
368
        break;
369
    }
370
 
371
    switch (current_t->exec_type) {
372
      case PAR_EXEC_CONST:
373
        err = write_exec_const(current_t);
374
        if (err != 0) {
375
          printf("Error writing exec header\n");
376
          exit(1);
377
        }
378
        break;
379
      case PAR_EXEC_MEAN:
380
        err = write_exec_mean(current_t);
381
        if (err != 0) {
382
          printf("Error writing exec header\n");
383
          exit(1);
384
        }
385
        break;
386
    }
387
 
388
    current_t = current_t->next;
389
 
390
  }
391
 
392
  write_basic_par_start();
393
 
394
  total_task_number = 0;
395
  current_t = start_loader_task;
396
  while(current_t != NULL) {
397
 
398
    write_basic_par(current_t);
399
 
400
    current_t = current_t->next;
401
 
402
    total_task_number++;
403
 
404
  }
405
 
406
  close_loader_task(total_task_number);
407
 
408
  write_contract_start();
409
 
410
  total_contract_number = 0;
411
  current_c = start_loader_contract;
412
  while(current_c != NULL) {
413
 
414
    write_contract(current_c);
415
 
416
    current_c = current_c->next;
417
 
418
    total_contract_number++;
419
 
420
  }
421
 
422
  close_loader_contract(total_contract_number);
423
 
424
  write_simulation_time(&total_time);
425
 
426
  return 0;
427
 
428
}