aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/vhdl-parse_psl.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/vhdl/vhdl-parse_psl.adb')
-rw-r--r--src/vhdl/vhdl-parse_psl.adb80
1 files changed, 61 insertions, 19 deletions
diff --git a/src/vhdl/vhdl-parse_psl.adb b/src/vhdl/vhdl-parse_psl.adb
index b4957b1ab..956414e0f 100644
--- a/src/vhdl/vhdl-parse_psl.adb
+++ b/src/vhdl/vhdl-parse_psl.adb
@@ -485,24 +485,27 @@ package body Vhdl.Parse_Psl is
end if;
end Parse_Parenthesis_FL_Property;
- -- Parse [ '!' ] '[' finite_Range ']' '(' FL_Property ')'
- function Parse_Range_Property (K : Nkind) return Node is
+ -- Parse '[' finite_Range ']' '(' FL_Property ')'
+ function Parse_Range_Property (K : Nkind; Strong : Boolean) return Node
+ is
Res : Node;
begin
Res := Create_Node_Loc (K);
- Set_Strong_Flag (Res, Scan_Exclam_Mark);
+ Set_Strong_Flag (Res, Strong);
Scan;
Parse_Bracket_Range (Res);
Set_Property (Res, Parse_Parenthesis_FL_Property);
return Res;
end Parse_Range_Property;
- -- Parse [ '!' ] '(' Boolean ')' '[' Range ']' '(' FL_Property ')'
- function Parse_Boolean_Range_Property (K : Nkind) return Node is
+ -- Parse '(' Boolean ')' '[' Range ']' '(' FL_Property ')'
+ function Parse_Boolean_Range_Property (K : Nkind; Strong : Boolean)
+ return Node
+ is
Res : Node;
begin
Res := Create_Node_Loc (K);
- Set_Strong_Flag (Res, Scan_Exclam_Mark);
+ Set_Strong_Flag (Res, Strong);
Scan;
Set_Boolean (Res, Parse_Parenthesis_Boolean);
Parse_Bracket_Range (Res);
@@ -524,11 +527,8 @@ package body Vhdl.Parse_Psl is
Res := Create_Node_Loc (N_Never);
Scan;
Set_Property (Res, Parse_FL_Property (Prio_FL_Invariance));
- when Tok_Eventually =>
+ when Tok_Eventually_Em =>
Res := Create_Node_Loc (N_Eventually);
- if not Scan_Exclam_Mark then
- Error_Msg_Parse ("'eventually' must be followed by '!'");
- end if;
Scan;
Set_Property (Res, Parse_FL_Property (Prio_FL_Occurence));
when Tok_Next =>
@@ -541,9 +541,13 @@ package body Vhdl.Parse_Psl is
Set_Property (Res, Parse_FL_Property (Prio_FL_Occurence));
end if;
when Tok_Next_A =>
- Res := Parse_Range_Property (N_Next_A);
+ Res := Parse_Range_Property (N_Next_A, False);
+ when Tok_Next_A_Em =>
+ Res := Parse_Range_Property (N_Next_A, True);
when Tok_Next_E =>
- Res := Parse_Range_Property (N_Next_E);
+ Res := Parse_Range_Property (N_Next_E, False);
+ when Tok_Next_E_Em =>
+ Res := Parse_Range_Property (N_Next_E, True);
when Tok_Next_Event =>
Res := Create_Node_Loc (N_Next_Event);
Scan;
@@ -553,9 +557,13 @@ package body Vhdl.Parse_Psl is
end if;
Set_Property (Res, Parse_Parenthesis_FL_Property);
when Tok_Next_Event_A =>
- Res := Parse_Boolean_Range_Property (N_Next_Event_A);
+ Res := Parse_Boolean_Range_Property (N_Next_Event_A, False);
+ when Tok_Next_Event_A_Em =>
+ Res := Parse_Boolean_Range_Property (N_Next_Event_A, True);
when Tok_Next_Event_E =>
- Res := Parse_Boolean_Range_Property (N_Next_Event_E);
+ Res := Parse_Boolean_Range_Property (N_Next_Event_E, False);
+ when Tok_Next_Event_E_Em =>
+ Res := Parse_Boolean_Range_Property (N_Next_Event_E, True);
when Tok_Left_Paren =>
return Parse_Parenthesis_FL_Property;
when Tok_Left_Curly =>
@@ -576,12 +584,15 @@ package body Vhdl.Parse_Psl is
return Res;
end Parse_FL_Property_1;
- function Parse_St_Binary_FL_Property (K : Nkind; Left : Node) return Node is
+ function Parse_St_Binary_FL_Property
+ (K : Nkind; Left : Node; Strong : Boolean; Inclusive : Boolean)
+ return Node
+ is
Res : Node;
begin
Res := Create_Node_Loc (K);
- Set_Strong_Flag (Res, Scan_Exclam_Mark);
- Set_Inclusive_Flag (Res, Scan_Underscore);
+ Set_Strong_Flag (Res, Strong);
+ Set_Inclusive_Flag (Res, Inclusive);
Scan;
Set_Left (Res, Left);
Set_Right (Res, Parse_FL_Property (Prio_FL_Bounding));
@@ -746,12 +757,43 @@ package body Vhdl.Parse_Psl is
if Prio > Prio_FL_Bounding then
return Res;
end if;
- Res := Parse_St_Binary_FL_Property (N_Until, Res);
+ Res := Parse_St_Binary_FL_Property (N_Until, Res, False, False);
+ when Tok_Until_Em =>
+ if Prio > Prio_FL_Bounding then
+ return Res;
+ end if;
+ Res := Parse_St_Binary_FL_Property (N_Until, Res, True, False);
+ when Tok_Until_Un =>
+ if Prio > Prio_FL_Bounding then
+ return Res;
+ end if;
+ Res := Parse_St_Binary_FL_Property (N_Until, Res, False, True);
+ when Tok_Until_Em_Un =>
+ if Prio > Prio_FL_Bounding then
+ return Res;
+ end if;
+ Res := Parse_St_Binary_FL_Property (N_Until, Res, True, True);
when Tok_Before =>
if Prio > Prio_FL_Bounding then
return Res;
end if;
- Res := Parse_St_Binary_FL_Property (N_Before, Res);
+ Res := Parse_St_Binary_FL_Property
+ (N_Before, Res, False, False);
+ when Tok_Before_Em =>
+ if Prio > Prio_FL_Bounding then
+ return Res;
+ end if;
+ Res := Parse_St_Binary_FL_Property (N_Before, Res, True, False);
+ when Tok_Before_Un =>
+ if Prio > Prio_FL_Bounding then
+ return Res;
+ end if;
+ Res := Parse_St_Binary_FL_Property (N_Before, Res, False, True);
+ when Tok_Before_Em_Un =>
+ if Prio > Prio_FL_Bounding then
+ return Res;
+ end if;
+ Res := Parse_St_Binary_FL_Property (N_Before, Res, True, True);
when Tok_Or =>
if Prio > Prio_Seq_Or then
return Res;