aboutsummaryrefslogtreecommitdiffstats
path: root/src/vhdl/vhdl-canon.adb
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2023-02-08 16:03:13 +0100
committerTristan Gingold <tgingold@free.fr>2023-02-08 16:04:32 +0100
commitc348e697dd910173d6d64dc78b43adad316e892a (patch)
treef86d6d1aa2fa31d98c1acd85d50c2e8b3de3a1bc /src/vhdl/vhdl-canon.adb
parentd78acf8f24949f608fa0dd20719ea67ba5621a5c (diff)
downloadghdl-c348e697dd910173d6d64dc78b43adad316e892a.tar.gz
ghdl-c348e697dd910173d6d64dc78b43adad316e892a.tar.bz2
ghdl-c348e697dd910173d6d64dc78b43adad316e892a.zip
vhdl-canon: remove signal parameters for all-sensitized processes.
Fix #2344
Diffstat (limited to 'src/vhdl/vhdl-canon.adb')
-rw-r--r--src/vhdl/vhdl-canon.adb44
1 files changed, 43 insertions, 1 deletions
diff --git a/src/vhdl/vhdl-canon.adb b/src/vhdl/vhdl-canon.adb
index 6cb8ca5c0..906a4720b 100644
--- a/src/vhdl/vhdl-canon.adb
+++ b/src/vhdl/vhdl-canon.adb
@@ -696,7 +696,49 @@ package body Vhdl.Canon is
Set_Seen_Flag (Proc, True);
Clear_Seen_Flag (Proc);
- return Res;
+ -- Filter out signal parameters.
+ declare
+ It, It2 : List_Iterator;
+ Res2 : Iir_List;
+ El, El2 : Iir;
+ Base : Iir;
+ begin
+ Res2 := Null_Iir_List;
+
+ It := List_Iterate_Safe (Res);
+ while Is_Valid (It) loop
+ El := Get_Element (It);
+ Base := Get_Object_Prefix (El);
+ if Is_Signal_Parameter (Base) then
+ -- Discard
+ if Res2 = Null_Iir_List then
+ -- So we need a different list to discard some elements.
+ -- Duplicate the list until EL.
+ Res2 := Create_Iir_List;
+ It2 := List_Iterate (Res);
+ loop
+ El2 := Get_Element (It2);
+ exit when El2 = El;
+ Append_Element (Res2, El2);
+ Next (It2);
+ end loop;
+ end if;
+ else
+ if Res2 /= Null_Iir_List then
+ Append_Element (Res2, El);
+ end if;
+ end if;
+ Next (It);
+ end loop;
+
+ if Res2 /= Null_Iir_List then
+ Destroy_Iir_List (Res);
+ return Res2;
+ else
+ -- No element removed.
+ return Res;
+ end if;
+ end;
end Canon_Extract_Sensitivity_Process;
procedure Canon_Aggregate_Expression (Expr: Iir)