aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/translate/trans-chap9.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/vhdl/translate/trans-chap9.adb')
-rw-r--r--src/vhdl/translate/trans-chap9.adb26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/vhdl/translate/trans-chap9.adb b/src/vhdl/translate/trans-chap9.adb
index 158adea33..4acb0c01f 100644
--- a/src/vhdl/translate/trans-chap9.adb
+++ b/src/vhdl/translate/trans-chap9.adb
@@ -355,6 +355,9 @@ package body Trans.Chap9 is
(Create_Var_Identifier ("COUNT"), Ghdl_Index_Type);
end if;
+ Info.Psl_State_Var := Create_Var
+ (Create_Var_Identifier ("STATE"), Trans.Rtis.Ghdl_Rti_Psl_State);
+
Info.Psl_Vect_Var := Create_Var
(Create_Var_Identifier ("VECT"), Info.Psl_Vect_Type);
@@ -599,6 +602,10 @@ package body Trans.Chap9 is
Start_If_Stmt (Clk_Blk,
Translate_Psl_Expr (Get_PSL_Clock (Stmt), False));
+ -- Default simplified state -> Inactive
+ New_Assign_Stmt (Get_Var (Info.Psl_State_Var),
+ New_Lit (Trans.Rtis.Ghdl_Rti_Psl_State_Inactive));
+
-- For each state: if set, evaluate all outgoing edges.
NFA := Get_PSL_NFA (Stmt);
S := Get_First_State (NFA);
@@ -613,6 +620,15 @@ package body Trans.Chap9 is
New_Lit (New_Index_Lit
(Unsigned_64 (S_Num))))));
+ -- Get simplified state:
+ -- - If in transient state -> In progress.
+ -- Set also if in final state, will be overrided later in
+ -- failure check.
+ if S /= Get_First_State(NFA) then
+ New_Assign_Stmt (Get_Var (Info.Psl_State_Var),
+ New_Lit (Trans.Rtis.Ghdl_Rti_Psl_State_Running));
+ end if;
+
E := Get_First_Src_Edge (S);
while E /= No_Edge loop
Sd := Get_Edge_Dest (E);
@@ -640,6 +656,7 @@ package body Trans.Chap9 is
S := Get_Next_State (S);
end loop;
+
-- Check fail state.
S := Get_Final_State (NFA);
S_Num := Get_State_Label (S);
@@ -658,8 +675,14 @@ package body Trans.Chap9 is
when Iir_Kind_Psl_Assert_Directive =>
Chap8.Translate_Report
(Stmt, Ghdl_Psl_Assert_Failed, Severity_Level_Error);
+ New_Assign_Stmt (
+ Get_Var (Info.Psl_State_Var),
+ New_Lit (Trans.Rtis.Ghdl_Rti_Psl_State_Failed));
when Iir_Kind_Psl_Assume_Directive =>
Call_Psl_Fail (Stmt, Ghdl_Psl_Assume_Failed);
+ New_Assign_Stmt (
+ Get_Var (Info.Psl_State_Var),
+ New_Lit (Trans.Rtis.Ghdl_Rti_Psl_State_Failed));
when Iir_Kind_Psl_Cover_Directive =>
if Get_Report_Expression (Stmt) /= Null_Iir then
Start_Association (Assocs, Report_Proc);
@@ -667,6 +690,9 @@ package body Trans.Chap9 is
New_Association (Assocs, New_Lit (Ghdl_Bool_True_Node));
New_Procedure_Call (Assocs);
end if;
+ New_Assign_Stmt (
+ Get_Var (Info.Psl_State_Var),
+ New_Lit (Trans.Rtis.Ghdl_Rti_Psl_State_Covered));
when others =>
Error_Kind ("Translate_Psl_Directive_Statement", Stmt);
end case;