73 symbol_c *current_action; |
73 symbol_c *current_action; |
74 |
74 |
75 sfcgeneration_t wanted_sfcgeneration; |
75 sfcgeneration_t wanted_sfcgeneration; |
76 |
76 |
77 public: |
77 public: |
78 generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) |
78 generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) |
79 : generate_c_base_c(s4o_ptr) { |
79 : generate_c_base_c(s4o_ptr) { |
80 generate_c_il = new generate_c_il_c(s4o_ptr, scope, variable_prefix); |
80 generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix); |
81 generate_c_st = new generate_c_st_c(s4o_ptr, scope, variable_prefix); |
81 generate_c_st = new generate_c_st_c(s4o_ptr, name, scope, variable_prefix); |
82 generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix); |
82 generate_c_code = new generate_c_SFC_IL_ST_c(s4o_ptr, name, scope, variable_prefix); |
83 search_var_instance_decl = new search_var_instance_decl_c(scope); |
83 search_var_instance_decl = new search_var_instance_decl_c(scope); |
84 this->set_variable_prefix(variable_prefix); |
84 this->set_variable_prefix(variable_prefix); |
85 } |
85 } |
86 |
86 |
87 ~generate_c_sfc_elements_c(void) { |
87 ~generate_c_sfc_elements_c(void) { |
136 s4o.print(str); |
136 s4o.print(str); |
137 } |
137 } |
138 |
138 |
139 void print_reset_step(symbol_c *step_name) { |
139 void print_reset_step(symbol_c *step_name) { |
140 s4o.print(s4o.indent_spaces); |
140 s4o.print(s4o.indent_spaces); |
|
141 s4o.print(SET_VAR); |
|
142 s4o.print("("); |
141 print_step_argument(step_name, "state"); |
143 print_step_argument(step_name, "state"); |
142 s4o.print(" = 0;\n"); |
144 s4o.print(",0);\n"); |
143 } |
145 } |
144 |
146 |
145 void print_set_step(symbol_c *step_name) { |
147 void print_set_step(symbol_c *step_name) { |
146 s4o.print(s4o.indent_spaces); |
148 s4o.print(s4o.indent_spaces); |
|
149 s4o.print(SET_VAR); |
|
150 s4o.print("("); |
147 print_step_argument(step_name, "state"); |
151 print_step_argument(step_name, "state"); |
148 s4o.print(" = 1;\n" + s4o.indent_spaces); |
152 s4o.print(",1);\n" + s4o.indent_spaces); |
149 print_step_argument(step_name, "elapsed_time"); |
153 print_step_argument(step_name, "elapsed_time"); |
150 s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
154 s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
151 } |
155 } |
152 |
156 |
153 bool is_variable(symbol_c *symbol) { |
157 bool is_variable(symbol_c *symbol) { |
170 s4o.print(" action associations\n"); |
174 s4o.print(" action associations\n"); |
171 current_step = symbol->step_name; |
175 current_step = symbol->step_name; |
172 s4o.print(s4o.indent_spaces + "{\n"); |
176 s4o.print(s4o.indent_spaces + "{\n"); |
173 s4o.indent_right(); |
177 s4o.indent_right(); |
174 s4o.print(s4o.indent_spaces + "char activated = "); |
178 s4o.print(s4o.indent_spaces + "char activated = "); |
|
179 s4o.print(GET_VAR); |
|
180 s4o.print("("); |
175 print_step_argument(current_step, "state"); |
181 print_step_argument(current_step, "state"); |
176 s4o.print(" && !"); |
182 s4o.print(") && !"); |
177 print_step_argument(current_step, "prev_state"); |
183 print_step_argument(current_step, "prev_state"); |
178 s4o.print(";\n"); |
184 s4o.print(";\n"); |
179 s4o.print(s4o.indent_spaces + "char desactivated = !"); |
185 s4o.print(s4o.indent_spaces + "char desactivated = !"); |
|
186 s4o.print(GET_VAR); |
|
187 s4o.print("("); |
180 print_step_argument(current_step, "state"); |
188 print_step_argument(current_step, "state"); |
181 s4o.print(" && "); |
189 s4o.print(") && "); |
182 print_step_argument(current_step, "prev_state"); |
190 print_step_argument(current_step, "prev_state"); |
183 s4o.print(";\n"); |
191 s4o.print(";\n"); |
184 s4o.print(s4o.indent_spaces + "char active = "); |
192 s4o.print(s4o.indent_spaces + "char active = "); |
|
193 s4o.print(GET_VAR); |
|
194 s4o.print("("); |
185 print_step_argument(current_step, "state"); |
195 print_step_argument(current_step, "state"); |
186 s4o.print(";\n"); |
196 s4o.print(");\n"); |
187 symbol->action_association_list->accept(*this); |
197 symbol->action_association_list->accept(*this); |
188 s4o.indent_left(); |
198 s4o.indent_left(); |
189 s4o.print(s4o.indent_spaces + "}\n\n"); |
199 s4o.print(s4o.indent_spaces + "}\n\n"); |
190 } |
200 } |
191 break; |
201 break; |
204 s4o.print(" action associations\n"); |
214 s4o.print(" action associations\n"); |
205 current_step = symbol->step_name; |
215 current_step = symbol->step_name; |
206 s4o.print(s4o.indent_spaces + "{\n"); |
216 s4o.print(s4o.indent_spaces + "{\n"); |
207 s4o.indent_right(); |
217 s4o.indent_right(); |
208 s4o.print(s4o.indent_spaces + "char activated = "); |
218 s4o.print(s4o.indent_spaces + "char activated = "); |
|
219 s4o.print(GET_VAR); |
|
220 s4o.print("("); |
209 print_step_argument(current_step, "state"); |
221 print_step_argument(current_step, "state"); |
210 s4o.print(" && !"); |
222 s4o.print(") && !"); |
211 print_step_argument(current_step, "prev_state"); |
223 print_step_argument(current_step, "prev_state"); |
212 s4o.print(";\n"); |
224 s4o.print(";\n"); |
213 s4o.print(s4o.indent_spaces + "char desactivated = !"); |
225 s4o.print(s4o.indent_spaces + "char desactivated = !"); |
|
226 s4o.print(GET_VAR); |
|
227 s4o.print("("); |
214 print_step_argument(current_step, "state"); |
228 print_step_argument(current_step, "state"); |
215 s4o.print(" && "); |
229 s4o.print(") && "); |
216 print_step_argument(current_step, "prev_state"); |
230 print_step_argument(current_step, "prev_state"); |
217 s4o.print(";\n"); |
231 s4o.print(";\n"); |
218 s4o.print(s4o.indent_spaces + "char active = "); |
232 s4o.print(s4o.indent_spaces + "char active = "); |
|
233 s4o.print(GET_VAR); |
|
234 s4o.print("("); |
219 print_step_argument(current_step, "state"); |
235 print_step_argument(current_step, "state"); |
220 s4o.print(";\n"); |
236 s4o.print(");\n"); |
221 symbol->action_association_list->accept(*this); |
237 symbol->action_association_list->accept(*this); |
222 s4o.indent_left(); |
238 s4o.indent_left(); |
223 s4o.print(s4o.indent_spaces + "}\n\n"); |
239 s4o.print(s4o.indent_spaces + "}\n\n"); |
224 } |
240 } |
225 break; |
241 break; |
261 // Calculate transition value |
277 // Calculate transition value |
262 symbol->transition_condition->accept(*this); |
278 symbol->transition_condition->accept(*this); |
263 |
279 |
264 if (symbol->integer != NULL) { |
280 if (symbol->integer != NULL) { |
265 s4o.print(s4o.indent_spaces + "if ("); |
281 s4o.print(s4o.indent_spaces + "if ("); |
|
282 s4o.print(GET_VAR); |
|
283 s4o.print("("); |
266 print_variable_prefix(); |
284 print_variable_prefix(); |
267 s4o.print("__transition_list["); |
285 s4o.print("__transition_list["); |
268 print_transition_number(); |
286 print_transition_number(); |
269 s4o.print("]) {\n"); |
287 s4o.print("])) {\n"); |
270 s4o.indent_right(); |
288 s4o.indent_right(); |
271 wanted_sfcgeneration = stepreset_sg; |
289 wanted_sfcgeneration = stepreset_sg; |
272 symbol->from_steps->accept(*this); |
290 symbol->from_steps->accept(*this); |
273 wanted_sfcgeneration = transitiontest_sg; |
291 wanted_sfcgeneration = transitiontest_sg; |
274 s4o.indent_left(); |
292 s4o.indent_left(); |
285 symbol->transition_condition->accept(*this); |
303 symbol->transition_condition->accept(*this); |
286 wanted_sfcgeneration = transitiontest_sg; |
304 wanted_sfcgeneration = transitiontest_sg; |
287 s4o.indent_left(); |
305 s4o.indent_left(); |
288 s4o.print(s4o.indent_spaces + "}\n"); |
306 s4o.print(s4o.indent_spaces + "}\n"); |
289 s4o.print(s4o.indent_spaces); |
307 s4o.print(s4o.indent_spaces); |
|
308 s4o.print(SET_VAR); |
|
309 s4o.print("("); |
290 print_variable_prefix(); |
310 print_variable_prefix(); |
291 s4o.print("__transition_list["); |
311 s4o.print("__transition_list["); |
292 print_transition_number(); |
312 print_transition_number(); |
293 s4o.print("] = 0;\n"); |
313 s4o.print("],0);\n"); |
294 s4o.indent_left(); |
314 s4o.indent_left(); |
295 s4o.print(s4o.indent_spaces + "}\n"); |
315 s4o.print(s4o.indent_spaces + "}\n"); |
296 break; |
316 break; |
297 case stepset_sg: |
317 case stepset_sg: |
298 s4o.print(s4o.indent_spaces + "if ("); |
318 s4o.print(s4o.indent_spaces + "if ("); |
|
319 s4o.print(GET_VAR); |
|
320 s4o.print("("); |
299 print_variable_prefix(); |
321 print_variable_prefix(); |
300 s4o.print("__transition_list["); |
322 s4o.print("__transition_list["); |
301 print_transition_number(); |
323 print_transition_number(); |
302 s4o.print("]) {\n"); |
324 s4o.print("])) {\n"); |
303 s4o.indent_right(); |
325 s4o.indent_right(); |
304 symbol->to_steps->accept(*this); |
326 symbol->to_steps->accept(*this); |
305 s4o.indent_left(); |
327 s4o.indent_left(); |
306 s4o.print(s4o.indent_spaces + "}\n"); |
328 s4o.print(s4o.indent_spaces + "}\n"); |
307 transition_number++; |
329 transition_number++; |
308 break; |
330 break; |
309 case stepreset_sg: |
331 case stepreset_sg: |
310 if (symbol->integer == NULL) { |
332 if (symbol->integer == NULL) { |
311 s4o.print(s4o.indent_spaces + "if ("); |
333 s4o.print(s4o.indent_spaces + "if ("); |
|
334 s4o.print(GET_VAR); |
|
335 s4o.print("("); |
312 print_variable_prefix(); |
336 print_variable_prefix(); |
313 s4o.print("__transition_list["); |
337 s4o.print("__transition_list["); |
314 print_transition_number(); |
338 print_transition_number(); |
315 s4o.print("]) {\n"); |
339 s4o.print("])) {\n"); |
316 s4o.indent_right(); |
340 s4o.indent_right(); |
317 symbol->from_steps->accept(*this); |
341 symbol->from_steps->accept(*this); |
318 s4o.indent_left(); |
342 s4o.indent_left(); |
319 s4o.print(s4o.indent_spaces + "}\n"); |
343 s4o.print(s4o.indent_spaces + "}\n"); |
320 } |
344 } |
333 // Transition condition is in IL |
357 // Transition condition is in IL |
334 if (symbol->transition_condition_il != NULL) { |
358 if (symbol->transition_condition_il != NULL) { |
335 generate_c_il->declare_backup_variable(); |
359 generate_c_il->declare_backup_variable(); |
336 s4o.print(s4o.indent_spaces); |
360 s4o.print(s4o.indent_spaces); |
337 symbol->transition_condition_il->accept(*generate_c_il); |
361 symbol->transition_condition_il->accept(*generate_c_il); |
|
362 s4o.print(SET_VAR); |
|
363 s4o.print("("); |
338 print_variable_prefix(); |
364 print_variable_prefix(); |
339 if (wanted_sfcgeneration == transitiontestdebug_sg) |
365 if (wanted_sfcgeneration == transitiontestdebug_sg) |
340 s4o.print("__debug_"); |
366 s4o.print("__debug_"); |
341 else |
367 else |
342 s4o.print("__"); |
368 s4o.print("__"); |
343 s4o.print("transition_list["); |
369 s4o.print("transition_list["); |
344 print_transition_number(); |
370 print_transition_number(); |
345 s4o.print("] = "); |
371 s4o.print("],"); |
346 generate_c_il->print_backup_variable(); |
372 generate_c_il->print_backup_variable(); |
347 s4o.print(";\n"); |
373 s4o.print(");\n"); |
348 } |
374 } |
349 // Transition condition is in ST |
375 // Transition condition is in ST |
350 if (symbol->transition_condition_st != NULL) { |
376 if (symbol->transition_condition_st != NULL) { |
351 s4o.print(s4o.indent_spaces); |
377 s4o.print(s4o.indent_spaces); |
|
378 s4o.print(SET_VAR); |
|
379 s4o.print("("); |
352 print_variable_prefix(); |
380 print_variable_prefix(); |
353 if (wanted_sfcgeneration == transitiontestdebug_sg) |
381 if (wanted_sfcgeneration == transitiontestdebug_sg) |
354 s4o.print("__debug_"); |
382 s4o.print("__debug_"); |
355 else |
383 else |
356 s4o.print("__"); |
384 s4o.print("__"); |
357 s4o.print("transition_list["); |
385 s4o.print("transition_list["); |
358 print_transition_number(); |
386 print_transition_number(); |
359 s4o.print("] = "); |
387 s4o.print("],"); |
360 symbol->transition_condition_st->accept(*generate_c_st); |
388 symbol->transition_condition_st->accept(*generate_c_st); |
361 s4o.print(";\n"); |
389 s4o.print(");\n"); |
362 } |
390 } |
363 if (wanted_sfcgeneration == transitiontest_sg) { |
391 if (wanted_sfcgeneration == transitiontest_sg) { |
364 s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n"); |
392 s4o.print(s4o.indent_spaces + "if (__DEBUG) {\n"); |
365 s4o.indent_right(); |
393 s4o.indent_right(); |
366 s4o.print(s4o.indent_spaces); |
394 s4o.print(s4o.indent_spaces); |
|
395 s4o.print(SET_VAR); |
|
396 s4o.print("("); |
367 print_variable_prefix(); |
397 print_variable_prefix(); |
368 s4o.print("__debug_transition_list["); |
398 s4o.print("__debug_transition_list["); |
369 print_transition_number(); |
399 print_transition_number(); |
370 s4o.print("] = "); |
400 s4o.print("],"); |
371 print_variable_prefix(); |
401 print_variable_prefix(); |
372 s4o.print("__transition_list["); |
402 s4o.print("__transition_list["); |
373 print_transition_number(); |
403 print_transition_number(); |
374 s4o.print("];\n"); |
404 s4o.print("]);\n"); |
375 s4o.indent_left(); |
405 s4o.indent_left(); |
376 s4o.print(s4o.indent_spaces + "}\n"); |
406 s4o.print(s4o.indent_spaces + "}\n"); |
377 } |
407 } |
378 break; |
408 break; |
379 default: |
409 default: |
407 |
437 |
408 void *visit(steps_c *symbol) { |
438 void *visit(steps_c *symbol) { |
409 if (symbol->step_name != NULL) { |
439 if (symbol->step_name != NULL) { |
410 switch (wanted_sfcgeneration) { |
440 switch (wanted_sfcgeneration) { |
411 case transitiontest_sg: |
441 case transitiontest_sg: |
|
442 s4o.print(GET_VAR); |
|
443 s4o.print("("); |
412 print_step_argument(symbol->step_name, "state"); |
444 print_step_argument(symbol->step_name, "state"); |
|
445 s4o.print(")"); |
413 break; |
446 break; |
414 case stepset_sg: |
447 case stepset_sg: |
415 print_set_step(symbol->step_name); |
448 print_set_step(symbol->step_name); |
416 break; |
449 break; |
417 case stepreset_sg: |
450 case stepreset_sg: |
429 |
462 |
430 void *visit(step_name_list_c *symbol) { |
463 void *visit(step_name_list_c *symbol) { |
431 switch (wanted_sfcgeneration) { |
464 switch (wanted_sfcgeneration) { |
432 case transitiontest_sg: |
465 case transitiontest_sg: |
433 for(int i = 0; i < symbol->n; i++) { |
466 for(int i = 0; i < symbol->n; i++) { |
|
467 s4o.print(GET_VAR); |
|
468 s4o.print("("); |
434 print_step_argument(symbol->elements[i], "state"); |
469 print_step_argument(symbol->elements[i], "state"); |
|
470 s4o.print(")"); |
435 if (i < symbol->n - 1) { |
471 if (i < symbol->n - 1) { |
436 s4o.print(" && "); |
472 s4o.print(" && "); |
437 } |
473 } |
438 } |
474 } |
439 break; |
475 break; |
471 current_action = symbol->action_name; |
507 current_action = symbol->action_name; |
472 symbol->action_qualifier->accept(*this); |
508 symbol->action_qualifier->accept(*this); |
473 } |
509 } |
474 else { |
510 else { |
475 s4o.print(s4o.indent_spaces + "if ("); |
511 s4o.print(s4o.indent_spaces + "if ("); |
|
512 s4o.print(GET_VAR); |
|
513 s4o.print("("); |
476 print_step_argument(current_step, "state"); |
514 print_step_argument(current_step, "state"); |
477 s4o.print(") {\n"); |
515 s4o.print(")) {\n"); |
478 s4o.indent_right(); |
516 s4o.indent_right(); |
479 s4o.print(s4o.indent_spaces); |
517 s4o.print(s4o.indent_spaces); |
480 print_action_argument(symbol->action_name, "state"); |
518 print_action_argument(symbol->action_name, "state"); |
481 s4o.print(" = 1;\n"); |
519 s4o.print(" = 1;\n"); |
482 s4o.indent_left(); |
520 s4o.indent_left(); |
593 |
631 |
594 private: |
632 private: |
595 generate_c_sfc_elements_c *generate_c_sfc_elements; |
633 generate_c_sfc_elements_c *generate_c_sfc_elements; |
596 |
634 |
597 public: |
635 public: |
598 generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) |
636 generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) |
599 : generate_c_typedecl_c(s4o_ptr) { |
637 : generate_c_typedecl_c(s4o_ptr) { |
600 generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, scope, variable_prefix); |
638 generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix); |
601 this->set_variable_prefix(variable_prefix); |
639 this->set_variable_prefix(variable_prefix); |
602 } |
640 } |
603 |
641 |
604 virtual ~generate_c_sfc_c(void) { |
642 virtual ~generate_c_sfc_c(void) { |
605 delete generate_c_sfc_elements; |
643 delete generate_c_sfc_elements; |
638 s4o.print("__nb_steps; i++) {\n"); |
676 s4o.print("__nb_steps; i++) {\n"); |
639 s4o.indent_right(); |
677 s4o.indent_right(); |
640 s4o.print(s4o.indent_spaces); |
678 s4o.print(s4o.indent_spaces); |
641 print_variable_prefix(); |
679 print_variable_prefix(); |
642 s4o.print("__step_list[i].prev_state = "); |
680 s4o.print("__step_list[i].prev_state = "); |
643 print_variable_prefix(); |
681 s4o.print(GET_VAR); |
644 s4o.print("__step_list[i].state;\n"); |
682 s4o.print("("); |
|
683 print_variable_prefix(); |
|
684 s4o.print("__step_list[i].state);\n"); |
645 s4o.print(s4o.indent_spaces + "if ("); |
685 s4o.print(s4o.indent_spaces + "if ("); |
646 print_variable_prefix(); |
686 s4o.print(GET_VAR); |
647 s4o.print("__step_list[i].state) {\n"); |
687 s4o.print("("); |
|
688 print_variable_prefix(); |
|
689 s4o.print("__step_list[i].state)) {\n"); |
648 s4o.indent_right(); |
690 s4o.indent_right(); |
649 s4o.print(s4o.indent_spaces); |
691 s4o.print(s4o.indent_spaces); |
650 print_variable_prefix(); |
692 print_variable_prefix(); |
651 s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, "); |
693 s4o.print("__step_list[i].elapsed_time = __time_add(__BOOL_LITERAL(TRUE), NULL, "); |
652 print_variable_prefix(); |
694 print_variable_prefix(); |