62 |
58 |
63 private: |
59 private: |
64 generate_c_il_c *generate_c_il; |
60 generate_c_il_c *generate_c_il; |
65 generate_c_st_c *generate_c_st; |
61 generate_c_st_c *generate_c_st; |
66 generate_c_SFC_IL_ST_c *generate_c_code; |
62 generate_c_SFC_IL_ST_c *generate_c_code; |
67 search_var_instance_decl_c *search_var_instance_decl; |
|
68 |
63 |
69 int transition_number; |
64 int transition_number; |
70 std::list<TRANSITION> transition_list; |
65 std::list<TRANSITION> transition_list; |
71 |
66 |
72 symbol_c *current_step; |
67 symbol_c *current_step; |
78 generate_c_sfc_elements_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) |
73 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) { |
74 : generate_c_base_c(s4o_ptr) { |
80 generate_c_il = new generate_c_il_c(s4o_ptr, name, scope, variable_prefix); |
75 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, name, scope, variable_prefix); |
76 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, name, scope, variable_prefix); |
77 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); |
|
84 this->set_variable_prefix(variable_prefix); |
78 this->set_variable_prefix(variable_prefix); |
85 } |
79 } |
86 |
80 |
87 ~generate_c_sfc_elements_c(void) { |
81 ~generate_c_sfc_elements_c(void) { |
88 transition_list.clear(); |
82 transition_list.clear(); |
89 delete generate_c_il; |
83 delete generate_c_il; |
90 delete generate_c_st; |
84 delete generate_c_st; |
91 delete generate_c_code; |
85 delete generate_c_code; |
92 delete search_var_instance_decl; |
|
93 } |
86 } |
94 |
87 |
95 void reset_transition_number(void) {transition_number = 0;} |
88 void reset_transition_number(void) {transition_number = 0;} |
96 |
89 |
97 void generate(symbol_c *symbol, sfcgeneration_t generation_type) { |
90 void generate(symbol_c *symbol, sfcgeneration_t generation_type) { |
152 s4o.print(",1);\n" + s4o.indent_spaces); |
143 s4o.print(",1);\n" + s4o.indent_spaces); |
153 print_step_argument(step_name, "elapsed_time"); |
144 print_step_argument(step_name, "elapsed_time"); |
154 s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
145 s4o.print(" = __time_to_timespec(1, 0, 0, 0, 0, 0);\n"); |
155 } |
146 } |
156 |
147 |
157 bool is_variable(symbol_c *symbol) { |
|
158 /* we try to find the variable instance declaration, to determine its type... */ |
|
159 symbol_c *var_decl = search_var_instance_decl->get_decl(symbol); |
|
160 |
|
161 return var_decl != NULL; |
|
162 } |
|
163 |
|
164 /*********************************************/ |
148 /*********************************************/ |
165 /* B.1.6 Sequential function chart elements */ |
149 /* B.1.6 Sequential function chart elements */ |
166 /*********************************************/ |
150 /*********************************************/ |
167 |
151 |
168 void *visit(initial_step_c *symbol) { |
152 void *visit(initial_step_c *symbol) { |
562 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { |
546 strcmp(qualifier, "D") == 0 || strcmp(qualifier, "L") == 0) { |
563 print_action_argument(current_action, "state"); |
547 print_action_argument(current_action, "state"); |
564 s4o.print(" = 1;\n"); |
548 s4o.print(" = 1;\n"); |
565 } |
549 } |
566 if (strcmp(qualifier, "S") == 0) { |
550 if (strcmp(qualifier, "S") == 0) { |
567 if (is_variable(current_action)) { |
551 print_action_argument(current_action, "set"); |
568 print_variable_prefix(); |
|
569 current_action->accept(*this); |
|
570 } |
|
571 else |
|
572 print_action_argument(current_action, "set"); |
|
573 s4o.print(" = 1;\n"); |
552 s4o.print(" = 1;\n"); |
574 } |
553 } |
575 if (strcmp(qualifier, "R") == 0) { |
554 if (strcmp(qualifier, "R") == 0) { |
576 if (is_variable(current_action)) { |
555 print_action_argument(current_action, "reset"); |
577 print_variable_prefix(); |
556 s4o.print(" = 1;\n"); |
578 current_action->accept(*this); |
|
579 s4o.print(" = 0;\n"); |
|
580 } |
|
581 else { |
|
582 print_action_argument(current_action, "reset"); |
|
583 s4o.print(" = 1;\n"); |
|
584 } |
|
585 } |
557 } |
586 if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || |
558 if (strcmp(qualifier, "SD") == 0 || strcmp(qualifier, "DS") == 0 || |
587 strcmp(qualifier, "SL") == 0) { |
559 strcmp(qualifier, "SL") == 0) { |
588 if (strcmp(qualifier, "SL") == 0) { |
560 if (strcmp(qualifier, "SL") == 0) { |
589 print_action_argument(current_action, "reset_remaining_time"); |
561 print_action_argument(current_action, "reset_remaining_time"); |
590 } |
562 } |
591 else { |
563 else { |
592 print_action_argument(current_action, "set_remaining_time"); |
564 print_action_argument(current_action, "set_remaining_time"); |
593 } |
565 } |
594 s4o.print(" = "); |
566 s4o.print(" = "); |
621 } |
593 } |
622 |
594 |
623 }; /* generate_c_sfc_actiondecl_c */ |
595 }; /* generate_c_sfc_actiondecl_c */ |
624 |
596 |
625 |
597 |
626 |
|
627 /***********************************************************************/ |
598 /***********************************************************************/ |
628 /***********************************************************************/ |
599 /***********************************************************************/ |
629 /***********************************************************************/ |
600 /***********************************************************************/ |
630 /***********************************************************************/ |
601 /***********************************************************************/ |
631 |
602 |
632 class generate_c_sfc_c: public generate_c_typedecl_c { |
603 class generate_c_sfc_c: public generate_c_typedecl_c { |
633 |
604 |
634 private: |
605 private: |
|
606 std::list<VARIABLE> variable_list; |
|
607 |
635 generate_c_sfc_elements_c *generate_c_sfc_elements; |
608 generate_c_sfc_elements_c *generate_c_sfc_elements; |
|
609 search_var_instance_decl_c *search_var_instance_decl; |
636 |
610 |
637 public: |
611 public: |
638 generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) |
612 generate_c_sfc_c(stage4out_c *s4o_ptr, symbol_c *name, symbol_c *scope, const char *variable_prefix = NULL) |
639 : generate_c_typedecl_c(s4o_ptr) { |
613 : generate_c_typedecl_c(s4o_ptr) { |
640 generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix); |
614 generate_c_sfc_elements = new generate_c_sfc_elements_c(s4o_ptr, name, scope, variable_prefix); |
|
615 search_var_instance_decl = new search_var_instance_decl_c(scope); |
641 this->set_variable_prefix(variable_prefix); |
616 this->set_variable_prefix(variable_prefix); |
642 } |
617 } |
643 |
618 |
644 virtual ~generate_c_sfc_c(void) { |
619 virtual ~generate_c_sfc_c(void) { |
|
620 variable_list.clear(); |
645 delete generate_c_sfc_elements; |
621 delete generate_c_sfc_elements; |
|
622 delete search_var_instance_decl; |
|
623 } |
|
624 |
|
625 bool is_variable(symbol_c *symbol) { |
|
626 /* we try to find the variable instance declaration, to determine if symbol is variable... */ |
|
627 symbol_c *var_decl = search_var_instance_decl->get_decl(symbol); |
|
628 |
|
629 return var_decl != NULL; |
646 } |
630 } |
647 |
631 |
648 /*********************************************/ |
632 /*********************************************/ |
649 /* B.1.6 Sequential function chart elements */ |
633 /* B.1.6 Sequential function chart elements */ |
650 /*********************************************/ |
634 /*********************************************/ |
652 void *visit(sequential_function_chart_c *symbol) { |
636 void *visit(sequential_function_chart_c *symbol) { |
653 int i; |
637 int i; |
654 |
638 |
655 generate_c_sfc_elements->reset_transition_number(); |
639 generate_c_sfc_elements->reset_transition_number(); |
656 for(i = 0; i < symbol->n; i++) { |
640 for(i = 0; i < symbol->n; i++) { |
|
641 symbol->elements[i]->accept(*this); |
657 generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::transitionlist_sg); |
642 generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::transitionlist_sg); |
658 } |
643 } |
659 |
644 |
660 s4o.print(s4o.indent_spaces +"INT i;\n"); |
645 s4o.print(s4o.indent_spaces +"INT i;\n"); |
661 s4o.print(s4o.indent_spaces +"BOOL transition;\n"); |
646 s4o.print(s4o.indent_spaces +"BOOL transition;\n"); |
848 s4o.indent_left(); |
833 s4o.indent_left(); |
849 s4o.print(s4o.indent_spaces + "}\n\n"); |
834 s4o.print(s4o.indent_spaces + "}\n\n"); |
850 |
835 |
851 /* generate action execution */ |
836 /* generate action execution */ |
852 s4o.print(s4o.indent_spaces + "// Actions execution\n"); |
837 s4o.print(s4o.indent_spaces + "// Actions execution\n"); |
|
838 { |
|
839 std::list<VARIABLE>::iterator pt; |
|
840 for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { |
|
841 symbol_c *var_decl = search_var_instance_decl->get_decl(pt->symbol); |
|
842 if (var_decl != NULL) { |
|
843 unsigned int vartype = search_var_instance_decl->get_vartype(); |
|
844 |
|
845 s4o.print(s4o.indent_spaces); |
|
846 if (vartype == search_var_instance_decl_c::external_vt) { |
|
847 s4o.print(SET_EXTERNAL); |
|
848 s4o.print("("); |
|
849 pt->symbol->accept(*this); |
|
850 s4o.print(","); |
|
851 } |
|
852 else { |
|
853 if (vartype == search_var_instance_decl_c::located_vt) |
|
854 s4o.print(SET_LOCATED); |
|
855 else |
|
856 s4o.print(SET_VAR); |
|
857 s4o.print("("); |
|
858 } |
|
859 print_variable_prefix(); |
|
860 pt->symbol->accept(*this); |
|
861 s4o.print(","); |
|
862 print_variable_prefix(); |
|
863 s4o.print("__action_list["); |
|
864 s4o.print(SFC_STEP_ACTION_PREFIX); |
|
865 pt->symbol->accept(*this); |
|
866 s4o.print("].state);\n"); |
|
867 } |
|
868 } |
|
869 } |
853 for(i = 0; i < symbol->n; i++) { |
870 for(i = 0; i < symbol->n; i++) { |
854 generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg); |
871 generate_c_sfc_elements->generate(symbol->elements[i], generate_c_sfc_elements_c::actionbody_sg); |
855 } |
872 } |
856 s4o.print("\n"); |
873 s4o.print("\n"); |
857 |
874 |
858 return NULL; |
875 return NULL; |
859 } |
876 } |
860 |
877 |
|
878 void *visit(initial_step_c *symbol) { |
|
879 symbol->action_association_list->accept(*this); |
|
880 return NULL; |
|
881 } |
|
882 |
|
883 void *visit(step_c *symbol) { |
|
884 symbol->action_association_list->accept(*this); |
|
885 return NULL; |
|
886 } |
|
887 |
|
888 void *visit(action_association_c *symbol) { |
|
889 symbol_c *var_decl = search_var_instance_decl->get_decl(symbol->action_name); |
|
890 |
|
891 if (var_decl != NULL) { |
|
892 std::list<VARIABLE>::iterator pt; |
|
893 for(pt = variable_list.begin(); pt != variable_list.end(); pt++) { |
|
894 if (!compare_identifiers(pt->symbol, symbol->action_name)) |
|
895 return NULL; |
|
896 } |
|
897 VARIABLE *variable; |
|
898 variable = new VARIABLE; |
|
899 variable->symbol = (identifier_c*)(symbol->action_name); |
|
900 variable_list.push_back(*variable); |
|
901 } |
|
902 return NULL; |
|
903 } |
|
904 |
|
905 void *visit(transition_c *symbol) { |
|
906 return NULL; |
|
907 } |
|
908 |
|
909 void *visit(action_c *symbol) { |
|
910 return NULL; |
|
911 } |
|
912 |
861 void generate(sequential_function_chart_c *sfc) { |
913 void generate(sequential_function_chart_c *sfc) { |
862 sfc->accept(*this); |
914 sfc->accept(*this); |
863 } |
915 } |
864 |
916 |
865 }; /* generate_c_sfc_c */ |
917 }; /* generate_c_sfc_c */ |