diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-10-25 06:53:08 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-10-25 06:55:04 +0200 |
commit | 41384788259c77d0057375cb93a0cfd67002ab52 (patch) | |
tree | 652f188811d2c49eb34f9f319d6b04ce92d20a79 /src/vhdl/vhdl-sem_stmts.adb | |
parent | 5a90460ddc6963cb9c19f5ed230f31aad590369e (diff) | |
download | ghdl-41384788259c77d0057375cb93a0cfd67002ab52.tar.gz ghdl-41384788259c77d0057375cb93a0cfd67002ab52.tar.bz2 ghdl-41384788259c77d0057375cb93a0cfd67002ab52.zip |
vhdl: extract sem_concurrent_statement, to handle hdl stmt in vunits.
Diffstat (limited to 'src/vhdl/vhdl-sem_stmts.adb')
-rw-r--r-- | src/vhdl/vhdl-sem_stmts.adb | 181 |
1 files changed, 88 insertions, 93 deletions
diff --git a/src/vhdl/vhdl-sem_stmts.adb b/src/vhdl/vhdl-sem_stmts.adb index 70035c321..35d49fc33 100644 --- a/src/vhdl/vhdl-sem_stmts.adb +++ b/src/vhdl/vhdl-sem_stmts.adb @@ -1619,6 +1619,7 @@ package body Vhdl.Sem_Stmts is Label := Get_Label (Stmt); Set_Label (N_Stmt, Label); Set_Parent (N_Stmt, Get_Parent (Stmt)); + Set_Chain (N_Stmt, Get_Chain (Stmt)); Set_Instantiated_Unit (N_Stmt, Finish_Sem_Name (Imp)); Location_Copy (N_Stmt, Stmt); @@ -1964,113 +1965,107 @@ package body Vhdl.Sem_Stmts is -- FIXME: check for nature type... end Simple_Simultaneous_Statement; - procedure Sem_Concurrent_Statement_Chain (Parent : Iir) + procedure Sem_Concurrent_Statement (Stmt : in out Iir; Is_Passive : Boolean) is - Is_Passive : constant Boolean := - Get_Kind (Parent) = Iir_Kind_Entity_Declaration; - El: Iir; - New_El : Iir; - Next_El : Iir; + Prev_Concurrent_Statement : constant Iir := Current_Concurrent_Statement; procedure No_Generate_Statement is begin if Is_Passive then - Error_Msg_Sem (+El, "generate statement forbidden in entity"); + Error_Msg_Sem (+Stmt, "generate statement forbidden in entity"); end if; end No_Generate_Statement; - - Prev_El : Iir; - Prev_Concurrent_Statement : Iir; begin - Prev_Concurrent_Statement := Current_Concurrent_Statement; + Current_Concurrent_Statement := Stmt; - El := Get_Concurrent_Statement_Chain (Parent); - Prev_El := Null_Iir; - while El /= Null_Iir loop - Current_Concurrent_Statement := El; - New_El := El; - Next_El := Get_Chain (El); + case Get_Kind (Stmt) is + when Iir_Kind_Concurrent_Simple_Signal_Assignment + | Iir_Kind_Concurrent_Conditional_Signal_Assignment => + if Is_Passive then + Error_Msg_Sem (+Stmt, "signal assignment forbidden in entity"); + end if; + Sem_Signal_Assignment (Stmt); + when Iir_Kind_Concurrent_Selected_Signal_Assignment => + if Is_Passive then + Error_Msg_Sem (+Stmt, "signal assignment forbidden in entity"); + end if; + Sem_Concurrent_Selected_Signal_Assignment (Stmt); + when Iir_Kind_Sensitized_Process_Statement => + Set_Passive_Flag (Stmt, Is_Passive); + Sem_Sensitized_Process_Statement (Stmt); + when Iir_Kind_Process_Statement => + Set_Passive_Flag (Stmt, Is_Passive); + Sem_Process_Statement (Stmt); + when Iir_Kind_Component_Instantiation_Statement => + Sem_Component_Instantiation_Statement (Stmt, Is_Passive); + when Iir_Kind_Concurrent_Assertion_Statement => + -- FIXME: must check assertion expressions does not contain + -- non-passive subprograms ?? + Sem_Assertion_Statement (Stmt); + when Iir_Kind_Block_Statement => + if Is_Passive then + Error_Msg_Sem (+Stmt, "block forbidden in entity"); + end if; + Sem_Block_Statement (Stmt); + when Iir_Kind_If_Generate_Statement => + No_Generate_Statement; + Sem_If_Generate_Statement (Stmt); + when Iir_Kind_For_Generate_Statement => + No_Generate_Statement; + Sem_For_Generate_Statement (Stmt); + when Iir_Kind_Case_Generate_Statement => + No_Generate_Statement; + Sem_Case_Generate_Statement (Stmt); + when Iir_Kind_Concurrent_Procedure_Call_Statement => + Stmt := + Sem_Concurrent_Procedure_Call_Statement (Stmt, Is_Passive); + when Iir_Kind_Psl_Declaration => + Sem_Psl.Sem_Psl_Declaration (Stmt); + when Iir_Kind_Psl_Endpoint_Declaration => + Sem_Psl.Sem_Psl_Endpoint_Declaration (Stmt); + when Iir_Kind_Psl_Assert_Directive => + Stmt := Sem_Psl.Sem_Psl_Assert_Directive (Stmt, True); + when Iir_Kind_Psl_Assume_Directive => + Sem_Psl.Sem_Psl_Assume_Directive (Stmt); + when Iir_Kind_Psl_Cover_Directive => + Sem_Psl.Sem_Psl_Cover_Directive (Stmt); + when Iir_Kind_Psl_Restrict_Directive => + Sem_Psl.Sem_Psl_Restrict_Directive (Stmt); + when Iir_Kind_Psl_Default_Clock => + Sem_Psl.Sem_Psl_Default_Clock (Stmt); + when Iir_Kind_Simple_Simultaneous_Statement => + Simple_Simultaneous_Statement (Stmt); + when others => + Error_Kind ("sem_concurrent_statement", Stmt); + end case; - case Get_Kind (El) is - when Iir_Kind_Concurrent_Simple_Signal_Assignment - | Iir_Kind_Concurrent_Conditional_Signal_Assignment => - if Is_Passive then - Error_Msg_Sem (+El, "signal assignment forbidden in entity"); - end if; - Sem_Signal_Assignment (El); - when Iir_Kind_Concurrent_Selected_Signal_Assignment => - if Is_Passive then - Error_Msg_Sem (+El, "signal assignment forbidden in entity"); - end if; - Sem_Concurrent_Selected_Signal_Assignment (El); - when Iir_Kind_Sensitized_Process_Statement => - Set_Passive_Flag (El, Is_Passive); - Sem_Sensitized_Process_Statement (El); - when Iir_Kind_Process_Statement => - Set_Passive_Flag (El, Is_Passive); - Sem_Process_Statement (El); - when Iir_Kind_Component_Instantiation_Statement => - Sem_Component_Instantiation_Statement (El, Is_Passive); - when Iir_Kind_Concurrent_Assertion_Statement => - -- FIXME: must check assertion expressions does not contain - -- non-passive subprograms ?? - Sem_Assertion_Statement (El); - when Iir_Kind_Block_Statement => - if Is_Passive then - Error_Msg_Sem (+El, "block forbidden in entity"); - end if; - Sem_Block_Statement (El); - when Iir_Kind_If_Generate_Statement => - No_Generate_Statement; - Sem_If_Generate_Statement (El); - when Iir_Kind_For_Generate_Statement => - No_Generate_Statement; - Sem_For_Generate_Statement (El); - when Iir_Kind_Case_Generate_Statement => - No_Generate_Statement; - Sem_Case_Generate_Statement (El); - when Iir_Kind_Concurrent_Procedure_Call_Statement => - New_El := Sem_Concurrent_Procedure_Call_Statement - (El, Is_Passive); - when Iir_Kind_Psl_Declaration => - Sem_Psl.Sem_Psl_Declaration (El); - when Iir_Kind_Psl_Endpoint_Declaration => - Sem_Psl.Sem_Psl_Endpoint_Declaration (El); - when Iir_Kind_Psl_Assert_Directive => - New_El := Sem_Psl.Sem_Psl_Assert_Directive (El, True); - when Iir_Kind_Psl_Assume_Directive => - Sem_Psl.Sem_Psl_Assume_Directive (El); - when Iir_Kind_Psl_Cover_Directive => - Sem_Psl.Sem_Psl_Cover_Directive (El); - when Iir_Kind_Psl_Restrict_Directive => - Sem_Psl.Sem_Psl_Restrict_Directive (El); - when Iir_Kind_Psl_Default_Clock => - Sem_Psl.Sem_Psl_Default_Clock (El); - when Iir_Kind_Simple_Simultaneous_Statement => - Simple_Simultaneous_Statement (El); - when others => - Error_Kind ("sem_concurrent_statement_chain", El); - end case; + Current_Concurrent_Statement := Prev_Concurrent_Statement; + end Sem_Concurrent_Statement; - if New_El /= El then - -- Replace this node. - if Prev_El = Null_Iir then - Set_Concurrent_Statement_Chain (Parent, New_El); - else - Set_Chain (Prev_El, New_El); - end if; - Set_Chain (New_El, Next_El); - Set_Parent (New_El, Parent); - Prev_El := New_El; + procedure Sem_Concurrent_Statement_Chain (Parent : Iir) + is + Is_Passive : constant Boolean := + Get_Kind (Parent) = Iir_Kind_Entity_Declaration; + + Stmt : Iir; + Prev_Stmt : Iir; + begin + Stmt := Get_Concurrent_Statement_Chain (Parent); + Prev_Stmt := Null_Iir; + while Stmt /= Null_Iir loop + Sem_Concurrent_Statement (Stmt, Is_Passive); + + pragma Assert (Get_Parent (Stmt) = Parent); + + -- Replace this node. + if Prev_Stmt = Null_Iir then + Set_Concurrent_Statement_Chain (Parent, Stmt); else - Prev_El := El; - pragma Assert (Get_Parent (El) = Parent); + Set_Chain (Prev_Stmt, Stmt); end if; - - El := Next_El; + Prev_Stmt := Stmt; + Stmt := Get_Chain (Stmt); end loop; - - Current_Concurrent_Statement := Prev_Concurrent_Statement; end Sem_Concurrent_Statement_Chain; -- Put labels in declarative region. |