63 |
63 |
64 private: |
64 private: |
65 generate_cc_il_c *generate_cc_il; |
65 generate_cc_il_c *generate_cc_il; |
66 generate_cc_st_c *generate_cc_st; |
66 generate_cc_st_c *generate_cc_st; |
67 generate_cc_SFC_IL_ST_c *generate_cc_code; |
67 generate_cc_SFC_IL_ST_c *generate_cc_code; |
|
68 search_var_instance_decl_c *search_var_instance_decl; |
68 |
69 |
69 int transition_number; |
70 int transition_number; |
70 std::list<TRANSITION> transition_list; |
71 std::list<TRANSITION> transition_list; |
71 |
72 |
72 symbol_c *current_step; |
73 symbol_c *current_step; |
78 generate_cc_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) |
79 generate_cc_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *scope, const char *variable_prefix = NULL) |
79 : generate_cc_base_c(s4o_ptr) { |
80 : generate_cc_base_c(s4o_ptr) { |
80 generate_cc_il = new generate_cc_il_c(s4o_ptr, scope, variable_prefix); |
81 generate_cc_il = new generate_cc_il_c(s4o_ptr, scope, variable_prefix); |
81 generate_cc_st = new generate_cc_st_c(s4o_ptr, scope, variable_prefix); |
82 generate_cc_st = new generate_cc_st_c(s4o_ptr, scope, variable_prefix); |
82 generate_cc_code = new generate_cc_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix); |
83 generate_cc_code = new generate_cc_SFC_IL_ST_c(s4o_ptr, scope, variable_prefix); |
|
84 search_var_instance_decl = new search_var_instance_decl_c(scope); |
83 this->set_variable_prefix(variable_prefix); |
85 this->set_variable_prefix(variable_prefix); |
84 } |
86 } |
85 |
87 |
86 ~generate_cc_sfc_elements_c(void) { |
88 ~generate_cc_sfc_elements_c(void) { |
87 delete generate_cc_il; |
89 delete generate_cc_il; |
88 delete generate_cc_st; |
90 delete generate_cc_st; |
89 delete generate_cc_code; |
91 delete generate_cc_code; |
|
92 delete search_var_instance_decl; |
90 } |
93 } |
91 |
94 |
92 void reset_transition_number(void) {transition_number = 0;} |
95 void reset_transition_number(void) {transition_number = 0;} |
93 |
96 |
94 void generate(symbol_c *symbol, sfcgeneration_t generation_type) { |
97 void generate(symbol_c *symbol, sfcgeneration_t generation_type) { |
145 s4o.print(" = 1;\n" + s4o.indent_spaces); |
148 s4o.print(" = 1;\n" + s4o.indent_spaces); |
146 print_step_argument(step_name, "elapsed_time"); |
149 print_step_argument(step_name, "elapsed_time"); |
147 s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
150 s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
148 } |
151 } |
149 |
152 |
|
153 bool is_variable(symbol_c *symbol) { |
|
154 /* we try to find the variable instance declaration, to determine its type... */ |
|
155 symbol_c *var_decl = search_var_instance_decl->get_decl(symbol); |
|
156 |
|
157 return var_decl != NULL; |
|
158 } |
150 |
159 |
151 /*********************************************/ |
160 /*********************************************/ |
152 /* B.1.6 Sequential function chart elements */ |
161 /* B.1.6 Sequential function chart elements */ |
153 /*********************************************/ |
162 /*********************************************/ |
154 |
163 |
229 transition->symbol = symbol; |
238 transition->symbol = symbol; |
230 transition->index = transition_number; |
239 transition->index = transition_number; |
231 if (symbol->integer != NULL) { |
240 if (symbol->integer != NULL) { |
232 transition->priority = atoi(((token_c *)symbol->integer)->value); |
241 transition->priority = atoi(((token_c *)symbol->integer)->value); |
233 std::list<TRANSITION>::iterator pt = transition_list.begin(); |
242 std::list<TRANSITION>::iterator pt = transition_list.begin(); |
234 while (pt != transition_list.end() && pt->priority > transition->priority) { |
243 while (pt != transition_list.end() && pt->priority <= transition->priority) { |
235 pt++; |
244 pt++; |
236 } |
245 } |
237 transition_list.insert(pt, *transition); |
246 transition_list.insert(pt, *transition); |
238 } |
247 } |
239 else { |
248 else { |
465 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { |
474 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { |
466 print_action_argument(current_action, "state"); |
475 print_action_argument(current_action, "state"); |
467 s4o.print(" = 1;\n"); |
476 s4o.print(" = 1;\n"); |
468 } |
477 } |
469 if (strcmp(qualifier, "S") == 0) { |
478 if (strcmp(qualifier, "S") == 0) { |
470 print_action_argument(current_action, "set"); |
479 if (is_variable(current_action)) { |
|
480 print_variable_prefix(); |
|
481 current_action->accept(*this); |
|
482 } |
|
483 else |
|
484 print_action_argument(current_action, "set"); |
471 s4o.print(" = 1;\n"); |
485 s4o.print(" = 1;\n"); |
472 } |
486 } |
473 if (strcmp(qualifier, "R") == 0) { |
487 if (strcmp(qualifier, "R") == 0) { |
474 print_action_argument(current_action, "reset"); |
488 if (is_variable(current_action)) { |
475 s4o.print(" = 1;\n"); |
489 print_variable_prefix(); |
|
490 current_action->accept(*this); |
|
491 s4o.print(" = 0;\n"); |
|
492 } |
|
493 else { |
|
494 print_action_argument(current_action, "reset"); |
|
495 s4o.print(" = 1;\n"); |
|
496 } |
476 } |
497 } |
477 if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || |
498 if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || |
478 strcmp(qualifier, "SL") == 0) { |
499 strcmp(qualifier, "SL") == 0) { |
479 if (strcmp(qualifier, "SL") == 0) { |
500 if (strcmp(qualifier, "SL") == 0) { |
480 print_action_argument(current_action, "reset_remaining_time"); |
501 print_action_argument(current_action, "reset_remaining_time"); |
562 s4o.indent_right(); |
583 s4o.indent_right(); |
563 s4o.print(s4o.indent_spaces); |
584 s4o.print(s4o.indent_spaces); |
564 print_variable_prefix(); |
585 print_variable_prefix(); |
565 s4o.print("step_list[i].elapsed_time = __time_add("); |
586 s4o.print("step_list[i].elapsed_time = __time_add("); |
566 print_variable_prefix(); |
587 print_variable_prefix(); |
567 s4o.print("step_list[i].elapsed_time, PERIOD);\n"); |
588 s4o.print("step_list[i].elapsed_time, "); |
|
589 print_variable_prefix(); |
|
590 s4o.print("period);\n"); |
568 s4o.indent_left(); |
591 s4o.indent_left(); |
569 s4o.print(s4o.indent_spaces + "}\n"); |
592 s4o.print(s4o.indent_spaces + "}\n"); |
570 s4o.indent_left(); |
593 s4o.indent_left(); |
571 s4o.print(s4o.indent_spaces + "}\n"); |
594 s4o.print(s4o.indent_spaces + "}\n"); |
572 |
595 |
584 s4o.print("action_list[i].set = 0;\n"); |
607 s4o.print("action_list[i].set = 0;\n"); |
585 s4o.print(s4o.indent_spaces); |
608 s4o.print(s4o.indent_spaces); |
586 print_variable_prefix(); |
609 print_variable_prefix(); |
587 s4o.print("action_list[i].reset = 0;\n"); |
610 s4o.print("action_list[i].reset = 0;\n"); |
588 s4o.print(s4o.indent_spaces + "if ("); |
611 s4o.print(s4o.indent_spaces + "if ("); |
589 print_variable_prefix(); |
612 s4o.print("__gt_TIME(2, "); |
590 s4o.print("__gt_TIME(action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n"); |
613 print_variable_prefix(); |
|
614 s4o.print("action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n"); |
591 s4o.indent_right(); |
615 s4o.indent_right(); |
592 s4o.print(s4o.indent_spaces); |
616 s4o.print(s4o.indent_spaces); |
593 print_variable_prefix(); |
617 print_variable_prefix(); |
594 s4o.print("action_list[i].set_remaining_time = __time_sub("); |
618 s4o.print("action_list[i].set_remaining_time = __time_sub("); |
595 print_variable_prefix(); |
619 print_variable_prefix(); |
596 s4o.print("action_list[i].set_remaining_time, PERIOD);\n"); |
620 s4o.print("action_list[i].set_remaining_time, "); |
|
621 print_variable_prefix(); |
|
622 s4o.print("period);\n"); |
597 s4o.print(s4o.indent_spaces + "if ("); |
623 s4o.print(s4o.indent_spaces + "if ("); |
598 print_variable_prefix(); |
624 s4o.print("__le_TIME(2, "); |
599 s4o.print("__le_TIME(action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n"); |
625 print_variable_prefix(); |
|
626 s4o.print("action_list[i].set_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n"); |
600 s4o.indent_right(); |
627 s4o.indent_right(); |
601 s4o.print(s4o.indent_spaces); |
628 s4o.print(s4o.indent_spaces); |
602 print_variable_prefix(); |
629 print_variable_prefix(); |
603 s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
630 s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
604 s4o.print(s4o.indent_spaces); |
631 s4o.print(s4o.indent_spaces); |
607 s4o.indent_left(); |
634 s4o.indent_left(); |
608 s4o.print(s4o.indent_spaces + "}\n"); |
635 s4o.print(s4o.indent_spaces + "}\n"); |
609 s4o.indent_left(); |
636 s4o.indent_left(); |
610 s4o.print(s4o.indent_spaces + "}\n"); |
637 s4o.print(s4o.indent_spaces + "}\n"); |
611 s4o.print(s4o.indent_spaces + "if ("); |
638 s4o.print(s4o.indent_spaces + "if ("); |
612 print_variable_prefix(); |
639 s4o.print("__gt_TIME(2, "); |
613 s4o.print("__gt_TIME(action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n"); |
640 print_variable_prefix(); |
|
641 s4o.print("action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n"); |
614 s4o.indent_right(); |
642 s4o.indent_right(); |
615 s4o.print(s4o.indent_spaces); |
643 s4o.print(s4o.indent_spaces); |
616 print_variable_prefix(); |
644 print_variable_prefix(); |
617 s4o.print("action_list[i].reset_remaining_time = __time_sub("); |
645 s4o.print("action_list[i].reset_remaining_time = __time_sub("); |
618 print_variable_prefix(); |
646 print_variable_prefix(); |
619 s4o.print("action_list[i].reset_remaining_time, PERIOD);\n"); |
647 s4o.print("action_list[i].reset_remaining_time, "); |
|
648 print_variable_prefix(); |
|
649 s4o.print("period);\n"); |
620 s4o.print(s4o.indent_spaces + "if ("); |
650 s4o.print(s4o.indent_spaces + "if ("); |
621 print_variable_prefix(); |
651 s4o.print("__le_TIME(2, "); |
622 s4o.print("__le_TIME(action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0)) {\n"); |
652 print_variable_prefix(); |
|
653 s4o.print("action_list[i].reset_remaining_time, __time_to_timespec(1, 0, 0, 0, 0, 0))) {\n"); |
623 s4o.indent_right(); |
654 s4o.indent_right(); |
624 s4o.print(s4o.indent_spaces); |
655 s4o.print(s4o.indent_spaces); |
625 print_variable_prefix(); |
656 print_variable_prefix(); |
626 s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
657 s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
627 s4o.print(s4o.indent_spaces); |
658 s4o.print(s4o.indent_spaces); |
674 print_variable_prefix(); |
705 print_variable_prefix(); |
675 s4o.print("action_list[i].reset) {\n"); |
706 s4o.print("action_list[i].reset) {\n"); |
676 s4o.indent_right(); |
707 s4o.indent_right(); |
677 s4o.print(s4o.indent_spaces); |
708 s4o.print(s4o.indent_spaces); |
678 print_variable_prefix(); |
709 print_variable_prefix(); |
679 s4o.print("action_list[i].set_remaining_time = 0;\n" + s4o.indent_spaces); |
710 s4o.print("action_list[i].set_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces); |
680 print_variable_prefix(); |
711 print_variable_prefix(); |
681 s4o.print("action_list[i].reset_remaining_time = 0;\n" + s4o.indent_spaces); |
712 s4o.print("action_list[i].reset_remaining_time = __time_to_timespec(1, 0, 0, 0, 0, 0);\n" + s4o.indent_spaces); |
682 print_variable_prefix(); |
713 print_variable_prefix(); |
683 s4o.print("action_list[i].stored = 0;\n"); |
714 s4o.print("action_list[i].stored = 0;\n"); |
684 s4o.indent_left(); |
715 s4o.indent_left(); |
685 s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces); |
716 s4o.print(s4o.indent_spaces + "}\n" + s4o.indent_spaces); |
686 print_variable_prefix(); |
717 print_variable_prefix(); |