Subversion Repositories shark

Rev

Rev 1258 | 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;
1304 giacomo 71
  int muxpres;
72
  char muxtemp[30];
1254 giacomo 73
 
74
  file_event_header = fopen(EVENT_DEFINE,"a+");
75
  if (file_event_header == NULL) return 1;
1304 giacomo 76
 
77
  if (c->crit_type == PAR_CRIT) {
78
    muxpres = 1;
79
    sprintf(muxtemp,"block_%s",c->name);
80
  } else {
81
    muxpres = 0;
82
    sprintf(muxtemp,"NULL");
83
  }
84
 
85
  fprintf(file_event_header, "  {\"%s\",%d,%d,%d,%d,%d,{%d,%d},{%d,%d},%d,0,%d,%d,act_%s,exec_%s,%s},\n",
1254 giacomo 86
                             c->name,(int)c->task_type,(int)c->server,(int)c->local_scheduler,(int)c->number,(int)c->group,
87
                             (int)c->deadline.tv_sec, (int)c->deadline.tv_nsec,
88
                             (int)c->wcet.tv_sec, (int)c->wcet.tv_nsec,
1304 giacomo 89
                             (int)c->act_number, (int)c->resource, muxpres, c->name, c->name, muxtemp);
1254 giacomo 90
 
91
  fclose(file_event_header);
92
 
93
  return 0;  
94
 
95
}
96
 
97
int write_contract(struct loader_contract *c)
98
{
99
 
100
  FILE *file_event_header;
101
 
102
  file_event_header = fopen(EVENT_DEFINE,"a+");
103
  if (file_event_header == NULL) return 1;
104
 
105
  fprintf(file_event_header, "  {%d,{%d,%d},{%d,%d},{%d,%d},{%d,%d},%d,%d,-1},\n",
106
                             (int)c->number,(int)c->cmin.tv_sec,(int)c->cmin.tv_nsec,
107
                             (int)c->tmax.tv_sec,(int)c->tmax.tv_nsec,
108
                             (int)c->cmax.tv_sec,(int)c->cmax.tv_nsec,
109
                             (int)c->tmin.tv_sec,(int)c->tmin.tv_nsec,
110
                             (int)c->workload,(int)c->local_scheduler);
111
 
112
  fclose(file_event_header);
113
 
114
  return 0;
115
 
116
}
117
 
118
int close_loader_task(int total_task_number)
119
{
120
 
121
  FILE *file_event_header;
122
 
123
  file_event_header = fopen(EVENT_DEFINE,"a+");
124
  if (file_event_header == NULL) return 1;
125
 
126
  fprintf(file_event_header,"};\n\n");
127
 
128
  fprintf(file_event_header,"int total_loader_task = %d;\n\n",total_task_number);
129
 
130
  fclose(file_event_header);
131
 
132
  return 0;
133
 
134
}
135
 
136
int close_loader_contract(int total_contract_number)
137
{
138
 
139
  FILE *file_event_header;
140
 
141
  file_event_header = fopen(EVENT_DEFINE,"a+");
142
  if (file_event_header == NULL) return 1;
143
 
144
  fprintf(file_event_header,"};\n\n");
145
 
146
  fprintf(file_event_header,"int total_loader_contract = %d;\n\n",total_contract_number);
147
 
148
  fclose(file_event_header);
149
 
150
  return 0;
151
 
152
}
153
 
154
int write_simulation_time(struct timespec *total)
155
{
156
 
157
  FILE *file_event_header;
158
 
159
  file_event_header = fopen(EVENT_DEFINE,"a+");
160
  if (file_event_header == NULL) return 1;
161
 
162
  fprintf(file_event_header,"struct timespec total_time = {%d,%d};\n\n",(int)total->tv_sec,(int)total->tv_nsec);
163
 
164
  fclose(file_event_header);
165
 
166
  return 0;
167
 
168
 
169
}
170
 
171
int write_single_act(struct timespec *t, struct loader_task *c)
172
{
173
 
174
  FILE *file_act_header;
175
 
176
  file_act_header = fopen(ACT_LIST,"a+");
177
  if (file_act_header == NULL) return 1;
178
 
179
  if (TIMESPEC_A_GT_B(t,&c->act_par_1)) {
180
    fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d}};\n\n",c->name,
181
          (int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec);
182
    c->act_number = 1;
183
  } else {
184
    fprintf(file_act_header,"struct timespec act_%s[] = {{0,0}};\n\n",c->name);
185
    c->act_number = 0;
186
  }
187
 
188
  fclose(file_act_header);
189
 
190
  return 0;
191
 
192
}
193
 
194
int write_periodic_act(struct timespec *t, struct loader_task *c)
195
{
196
 
197
  FILE *file_act_header;
198
  struct timespec tot_time;
199
  int period;
200
 
201
  file_act_header = fopen(ACT_LIST,"a+");
202
  if (file_act_header == NULL) return 1;
203
 
204
  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name,
205
          (int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec);
206
 
207
  c->act_number = 1;
208
  TIMESPEC_ASSIGN(&tot_time,&c->act_par_1);
209
  period = TIMESPEC2USEC(&c->act_par_2);
210
  while (TIMESPEC_A_GT_B(t, &tot_time)) {
211
    c->act_number++;
212
    ADDUSEC2TIMESPEC(period,&tot_time);
213
    fprintf(file_act_header,"  {%d,%d},\n",
214
            (int)c->act_par_2.tv_sec,(int)c->act_par_2.tv_nsec);
215
  }
216
 
217
  fprintf(file_act_header,"  };\n\n");
218
 
219
  fclose(file_act_header);
220
 
221
  return 0;
222
 
223
}
224
 
225
int write_mean_act(struct timespec *t,struct loader_task *c)
226
{
227
 
228
  FILE *file_act_header;
229
  struct timespec tot_time;
230
  int next_act;          
231
 
232
  file_act_header = fopen(ACT_LIST,"a+");
233
  if (file_act_header == NULL) return 1;
234
 
235
  fprintf(file_act_header,"struct timespec act_%s[] = {{%d,%d},\n",c->name,
236
          (int)c->act_par_1.tv_sec,(int)c->act_par_1.tv_nsec);
237
 
238
  c->act_number = 1;                                                                                                        
239
  TIMESPEC_ASSIGN(&tot_time,&c->act_par_1);
240
  while (TIMESPEC_A_GT_B(t, &tot_time)) {
241
    c->act_number++;
242
    next_act = TIMESPEC2USEC(&c->act_par_2) + random() % TIMESPEC2USEC(&c->act_par_3) - TIMESPEC2USEC(&c->act_par_3) / 2;
243
    ADDUSEC2TIMESPEC(next_act,&tot_time);
244
    fprintf(file_act_header,"  {%d,%d},\n",
245
            next_act / 1000000, next_act % 1000000 * 1000);
246
  }
247
 
248
  fprintf(file_act_header,"  };\n\n");
249
 
250
  fclose(file_act_header);
251
 
252
  return 0;
253
 
254
}
255
 
1304 giacomo 256
int write_block_const(struct loader_task *c)
257
{
258
 
259
  FILE *file_block_header;
260
  int i;
261
 
262
  file_block_header = fopen(ACT_LIST,"a+");
263
  if (file_block_header == NULL) return 1;
264
 
265
  fprintf(file_block_header,"struct timespec block_%s[] =  {{%d,%d},\n",c->name,
266
          (int)c->crit_par.tv_sec,(int)c->crit_par.tv_nsec);
267
 
268
  for (i=0; i< c->act_number-1; i++)
269
    fprintf(file_block_header,"  {%d,%d},\n",
270
          (int)c->crit_par.tv_sec,(int)c->crit_par.tv_nsec);
271
 
272
  fprintf(file_block_header,"  };\n\n");
273
 
274
  fclose(file_block_header);
275
 
276
  return 0;
277
 
278
}
279
 
1254 giacomo 280
int write_exec_const(struct loader_task *c)
281
{
282
 
283
  FILE *file_exec_header;
284
  int i;
285
 
286
  file_exec_header = fopen(ACT_LIST,"a+");
287
  if (file_exec_header == NULL) return 1;
288
 
289
  fprintf(file_exec_header,"struct timespec exec_%s[] =  {{%d,%d},\n",c->name,
290
          (int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec);
291
 
292
  for (i=0; i< c->act_number-1; i++)  
293
    fprintf(file_exec_header,"  {%d,%d},\n",
294
          (int)c->exec_par_1.tv_sec,(int)c->exec_par_1.tv_nsec);
295
 
296
  fprintf(file_exec_header,"  };\n\n");
297
 
298
  fclose(file_exec_header);
299
 
300
  return 0;
301
 
302
}
303
 
304
int write_exec_mean(struct loader_task *c)
305
{
306
 
307
  FILE *file_exec_header;
308
  int exec_time_usec;
309
  int i;
310
 
311
  file_exec_header = fopen(ACT_LIST,"a+");
312
  if (file_exec_header == NULL) return 1;
313
 
1258 giacomo 314
  exec_time_usec = TIMESPEC2USEC(&c->exec_par_1)
315
                        + random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2;
1254 giacomo 316
  fprintf(file_exec_header,"struct timespec exec_%s[] = {{%d,%d},\n",c->name,
317
          exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000);
318
 
319
  for (i=0; i< c->act_number-1; i++) {
1258 giacomo 320
    exec_time_usec = TIMESPEC2USEC(&c->exec_par_1)
321
                        + random() % TIMESPEC2USEC(&c->exec_par_2) - TIMESPEC2USEC(&c->exec_par_2) / 2;
1254 giacomo 322
    fprintf(file_exec_header,"  {%d,%d},\n",
323
          exec_time_usec / 1000000, exec_time_usec % 1000000 * 1000);
324
  }
325
 
326
  fprintf(file_exec_header,"  };\n\n");
327
 
328
  fclose(file_exec_header);
329
 
330
  return 0;
331
 
332
}
333
 
334
void *start;
335
void *end;
336
 
337
int main(int argc, char **argv) {
338
 
339
  char loadfile[100];
340
  struct timespec total_time;
341
  struct loader_task *start_loader_task = NULL, *current_t;
342
  struct loader_contract *start_loader_contract = NULL, *current_c;
343
  int err,ldnum;
344
  int total_task_number;
345
  int total_contract_number;
346
 
347
  printf("\nEvent Generator\n");
348
 
349
  if (argc < 2) {
350
    printf("Error: event_gen loadfile.fsf\n");
351
    exit(1);
352
  }
353
 
354
  printf("Read loader file %s\n",argv[1]);
355
 
356
  sprintf(loadfile,"%s%s",LOADFILE_DIR,argv[1]);
357
  err = dos_preload(loadfile,100000,&start,&end);
358
 
359
  if (err != 0) {
360
    printf("Error: File not found\n");
361
    exit(1);
362
  }
363
 
364
  printf("Parsing file\n");
365
 
366
  line_reader(start, end, &total_time, &start_loader_task, &start_loader_contract);
367
 
368
  srandom(time(NULL));
369
 
370
  write_struct();
371
 
372
  current_t = start_loader_task;
373
  ldnum = 1;
374
 
375
  while(current_t != NULL) {
376
 
377
    sprintf(current_t->name,"ltask%d",ldnum);    
378
    current_t->group = ldnum;
379
    ldnum++;
380
 
381
    switch (current_t->act_type) {
382
     case PAR_ACT_SINGLE:
383
       err = write_single_act(&total_time,current_t);
384
        if (err != 0) {
385
          printf("Error writing activation header\n");
386
          exit(1);
387
        }
388
        break;
389
      case PAR_ACT_PERIODIC:
390
        err = write_periodic_act(&total_time,current_t);
391
        if (err != 0) {
392
          printf("Error writing activation header\n");
393
          exit(1);
394
        }
395
        break;
396
      case PAR_ACT_MEAN:
397
        err = write_mean_act(&total_time,current_t);
398
        if (err != 0) {
399
          printf("Error writing activation header\n");
400
          exit(1);
401
        }
402
        break;
403
    }
404
 
405
    switch (current_t->exec_type) {
406
      case PAR_EXEC_CONST:
407
        err = write_exec_const(current_t);
408
        if (err != 0) {
409
          printf("Error writing exec header\n");
410
          exit(1);
411
        }
412
        break;
413
      case PAR_EXEC_MEAN:
414
        err = write_exec_mean(current_t);
415
        if (err != 0) {
416
          printf("Error writing exec header\n");
417
          exit(1);
418
        }
419
        break;
420
    }
421
 
1304 giacomo 422
    switch (current_t->crit_type) {
423
      case PAR_CRIT:
424
        err = write_block_const(current_t);
425
        if (err != 0) {
426
          printf("Error writing block header\n");
427
          exit(1);
428
        }
429
        break;
430
    }
431
 
1254 giacomo 432
    current_t = current_t->next;
433
 
434
  }
435
 
436
  write_basic_par_start();
437
 
438
  total_task_number = 0;
439
  current_t = start_loader_task;
440
  while(current_t != NULL) {
441
 
442
    write_basic_par(current_t);
443
 
444
    current_t = current_t->next;
445
 
446
    total_task_number++;
447
 
448
  }
449
 
450
  close_loader_task(total_task_number);
451
 
452
  write_contract_start();
453
 
454
  total_contract_number = 0;
455
  current_c = start_loader_contract;
456
  while(current_c != NULL) {
457
 
458
    write_contract(current_c);
459
 
460
    current_c = current_c->next;
461
 
462
    total_contract_number++;
463
 
464
  }
465
 
466
  close_loader_contract(total_contract_number);
467
 
468
  write_simulation_time(&total_time);
469
 
470
  return 0;
471
 
472
}