diff options
Diffstat (limited to 'src/vhdl/vhdl-parse.adb')
-rw-r--r-- | src/vhdl/vhdl-parse.adb | 121 |
1 files changed, 110 insertions, 11 deletions
diff --git a/src/vhdl/vhdl-parse.adb b/src/vhdl/vhdl-parse.adb index 820594579..7ac389a13 100644 --- a/src/vhdl/vhdl-parse.adb +++ b/src/vhdl/vhdl-parse.adb @@ -7250,31 +7250,27 @@ package body Vhdl.Parse is return Decl; end Parse_Parameter_Specification; - -- precond: '<=' + -- precond: delay_mechanism or waveform -- postcond: next token -- -- [ LRM93 8.4 ] -- signal_assignment_statement ::= - -- [ label : ] target <= [ delay_mechanism ] waveform ; + -- [ label : ] target <= [ delay_mechanism ] waveform ; -- -- [ LRM08 10.5 Signal assignment statement ] - -- signal_assignement_statement ::= - -- [ label : ] simple_signal_assignement - -- | [ label : ] conditional_signal_assignement - -- | [ label : ] selected_signal_assignement (TODO) - function Parse_Signal_Assignment_Statement (Target : Iir) return Iir + -- simple_waveform_assignment ::= + -- target <= [ delay_mechanism ] waveform ; + function Parse_Signal_Waveform_Assignment + (Target : Iir; Loc : Location_Type) return Iir is Stmt : Iir; N_Stmt : Iir; Wave_Chain : Iir; begin Stmt := Create_Iir (Iir_Kind_Simple_Signal_Assignment_Statement); - Set_Location (Stmt); + Set_Location (Stmt, Loc); Set_Target (Stmt, Target); - -- Skip '<='. - Scan; - Parse_Delay_Mechanism (Stmt); Wave_Chain := Parse_Conditional_Waveforms; @@ -7308,6 +7304,109 @@ package body Vhdl.Parse is end if; return Stmt; + end Parse_Signal_Waveform_Assignment; + + -- precond: - + -- postcond: next token + -- + -- [ LRM08 10.5.2 Simple signal assignments ] + -- force_mode ::= IN | OUT + procedure Parse_Force_Mode_Opt (Stmt : Iir) is + begin + case Current_Token is + when Tok_In => + Set_Force_Mode (Stmt, Iir_Force_In); + Set_Has_Force_Mode (Stmt, True); + when Tok_Out => + Set_Force_Mode (Stmt, Iir_Force_Out); + Set_Has_Force_Mode (Stmt, True); + when others => + null; + end case; + end Parse_Force_Mode_Opt; + + -- precond: 'force' + -- postcond: next token + -- + -- [ LRM08 10.5 Signal assignment statement ] + -- simple_force_assignment ::= + -- target <= FORCE [ force_mode ] expression ; + function Parse_Signal_Force_Assignment + (Target : Iir; Loc : Location_Type) return Iir + is + Stmt : Iir; + begin + Stmt := Create_Iir (Iir_Kind_Signal_Force_Assignment_Statement); + Set_Location (Stmt, Loc); + Set_Target (Stmt, Target); + + -- Skip 'force'. + Scan; + + Parse_Force_Mode_Opt (Stmt); + + Set_Expression (Stmt, Parse_Expression); + + return Stmt; + end Parse_Signal_Force_Assignment; + + -- precond: 'release' + -- postcond: next token + -- + -- [ LRM08 10.5 Signal assignment statement ] + -- simple_release_assignment ::= + -- target <= RELEASE [ force_mode ] expression ; + function Parse_Signal_Release_Assignment + (Target : Iir; Loc : Location_Type) return Iir + is + Stmt : Iir; + begin + Stmt := Create_Iir (Iir_Kind_Signal_Release_Assignment_Statement); + Set_Location (Stmt, Loc); + Set_Target (Stmt, Target); + + -- Skip 'release'. + Scan; + + Parse_Force_Mode_Opt (Stmt); + + return Stmt; + end Parse_Signal_Release_Assignment; + + -- precond: '<=' + -- postcond: next token + -- + -- [ LRM93 8.4 ] + -- signal_assignment_statement ::= + -- [ label : ] target <= [ delay_mechanism ] waveform ; + -- + -- [ LRM08 10.5 Signal assignment statement ] + -- signal_assignement_statement ::= + -- [ label : ] simple_signal_assignement + -- | [ label : ] conditional_signal_assignement + -- | [ label : ] selected_signal_assignement + -- + -- simple_signal_assignment ::= + -- simple_waveform_assignment + -- | simple_force_assignment + -- | simple_release_assignment + function Parse_Signal_Assignment_Statement (Target : Iir) return Iir + is + Loc : Location_Type; + begin + Loc := Get_Token_Location; + + -- Skip '<='. + Scan; + + case Current_Token is + when Tok_Force => + return Parse_Signal_Force_Assignment (Target, Loc); + when Tok_Release => + return Parse_Signal_Release_Assignment (Target, Loc); + when others => + return Parse_Signal_Waveform_Assignment (Target, Loc); + end case; end Parse_Signal_Assignment_Statement; -- precond: WHEN |