aboutsummaryrefslogtreecommitdiffstats
path: root/src/grt/grt-waves.adb
diff options
context:
space:
mode:
authorJonsba <jonasb@tranquille.ch>2016-07-26 18:59:08 +0200
committertgingold <tgingold@users.noreply.github.com>2016-07-26 18:59:08 +0200
commitcc352d278fcce918d374406ff64c27cde0a59402 (patch)
tree74372f5905b98a854324431761aa9b002915894b /src/grt/grt-waves.adb
parent7776856c175ed776c7606ad48f8170dcb79243a9 (diff)
downloadghdl-cc352d278fcce918d374406ff64c27cde0a59402.tar.gz
ghdl-cc352d278fcce918d374406ff64c27cde0a59402.tar.bz2
ghdl-cc352d278fcce918d374406ff64c27cde0a59402.zip
Adding support for a wave option file that selects signals to be displayed (#121)
Adding support for a wave option file that selects signals to be displayed on the waveform (currently only works with the ghw wave format). Only full signal paths are supported now (no wildcards). Wave option file version set to 1.0.
Diffstat (limited to 'src/grt/grt-waves.adb')
-rw-r--r--src/grt/grt-waves.adb114
1 files changed, 70 insertions, 44 deletions
diff --git a/src/grt/grt-waves.adb b/src/grt/grt-waves.adb
index d14d2b0c4..11caef838 100644
--- a/src/grt/grt-waves.adb
+++ b/src/grt/grt-waves.adb
@@ -44,6 +44,8 @@ with Grt.Signals; use Grt.Signals;
with System; use System;
with Grt.Vstrings; use Grt.Vstrings;
with Grt.Ghw; use Grt.Ghw;
+with Grt.Wave_Opt_File; use Grt.Wave_Opt_File;
+with Grt.Wave_Opt_File.Tree_Reading; use Grt.Wave_Opt_File.Tree_Reading;
pragma Elaborate_All (Grt.Rtis_Utils);
pragma Elaborate_All (Grt.Table);
@@ -911,13 +913,17 @@ package body Grt.Waves is
end Write_Hierarchy_El;
-- Create a hierarchy block.
- procedure Wave_Put_Hierarchy_Block (Inst : VhpiHandleT; Step : Step_Type);
+ procedure Wave_Put_Hierarchy_Block (Inst : VhpiHandleT;
+ Step : Step_Type;
+ Wave_Elem : Wave_Opt_File.Elem_Acc);
- procedure Wave_Put_Hierarchy_1 (Inst : VhpiHandleT; Step : Step_Type)
+ procedure Wave_Put_Hierarchy_1
+ (Inst : VhpiHandleT; Step : Step_Type; Wave_Elem : Wave_Opt_File.Elem_Acc)
is
Decl_It : VhpiHandleT;
Decl : VhpiHandleT;
Error : AvhpiErrorT;
+ Wave_Elem_Child : Wave_Opt_File.Elem_Acc;
begin
Vhpi_Iterator (VhpiDecls, Inst, Decl_It, Error);
if Error /= AvhpiErrorOk then
@@ -934,22 +940,26 @@ package body Grt.Waves is
return;
end if;
- case Vhpi_Get_Kind (Decl) is
- when VhpiPortDeclK
- | VhpiSigDeclK =>
- case Step is
- when Step_Name =>
- Create_String_Id (Avhpi_Get_Base_Name (Decl));
- Nbr_Scope_Signals := Nbr_Scope_Signals + 1;
- Create_Object_Type (Decl);
- when Step_Hierarchy =>
- Write_Hierarchy_El (Decl);
- end case;
- --Wave_Put_Name (Decl);
- --Wave_Newline;
- when others =>
- null;
- end case;
+ Wave_Elem_Child := Get_Cursor (Avhpi_Get_Base_Name (Decl), Wave_Elem,
+ Is_Signal => True);
+ if Is_Displayed (Wave_Elem_Child) then
+ case Vhpi_Get_Kind (Decl) is
+ when VhpiPortDeclK
+ | VhpiSigDeclK =>
+ case Step is
+ when Step_Name =>
+ Create_String_Id (Avhpi_Get_Base_Name (Decl));
+ Nbr_Scope_Signals := Nbr_Scope_Signals + 1;
+ Create_Object_Type (Decl);
+ when Step_Hierarchy =>
+ Write_Hierarchy_El (Decl);
+ end case;
+ --Wave_Put_Name (Decl);
+ --Wave_Newline;
+ when others =>
+ null;
+ end case;
+ end if;
end loop;
-- No sub-scopes for packages.
@@ -974,30 +984,34 @@ package body Grt.Waves is
Nbr_Scopes := Nbr_Scopes + 1;
- case Vhpi_Get_Kind (Decl) is
- when VhpiIfGenerateK
- | VhpiForGenerateK
- | VhpiBlockStmtK
- | VhpiCompInstStmtK =>
- Wave_Put_Hierarchy_Block (Decl, Step);
- when VhpiProcessStmtK =>
- case Step is
- when Step_Name =>
- Create_String_Id (Avhpi_Get_Base_Name (Decl));
- when Step_Hierarchy =>
- Write_Hierarchy_El (Decl);
- end case;
- when others =>
- Internal_Error ("wave_put_hierarchy_1");
--- Wave_Put ("unknown ");
--- Wave_Put (VhpiClassKindT'Image (Vhpi_Get_Kind (Decl)));
--- Wave_Newline;
- end case;
+ Wave_Elem_Child := Get_Cursor (Avhpi_Get_Base_Name (Decl), Wave_Elem);
+ if Is_Displayed (Wave_Elem_Child) then
+ case Vhpi_Get_Kind (Decl) is
+ when VhpiIfGenerateK
+ | VhpiForGenerateK
+ | VhpiBlockStmtK
+ | VhpiCompInstStmtK =>
+ Wave_Put_Hierarchy_Block (Decl, Step, Wave_Elem_Child);
+ when VhpiProcessStmtK =>
+ case Step is
+ when Step_Name =>
+ Create_String_Id (Avhpi_Get_Base_Name (Decl));
+ when Step_Hierarchy =>
+ Write_Hierarchy_El (Decl);
+ end case;
+ when others =>
+ Internal_Error ("wave_put_hierarchy_1");
+ -- Wave_Put ("unknown ");
+ -- Wave_Put (VhpiClassKindT'Image (Vhpi_Get_Kind (Decl)));
+ -- Wave_Newline;
+ end case;
+ end if;
end loop;
end Wave_Put_Hierarchy_1;
- procedure Wave_Put_Hierarchy_Block (Inst : VhpiHandleT; Step : Step_Type)
- is
+ procedure Wave_Put_Hierarchy_Block (Inst : VhpiHandleT;
+ Step : Step_Type;
+ Wave_Elem : Wave_Opt_File.Elem_Acc) is
begin
case Step is
when Step_Name =>
@@ -1009,7 +1023,7 @@ package body Grt.Waves is
Write_Hierarchy_El (Inst);
end case;
- Wave_Put_Hierarchy_1 (Inst, Step);
+ Wave_Put_Hierarchy_1 (Inst, Step, Wave_Elem);
if Step = Step_Hierarchy then
Wave_Put_Byte (Ghw_Hie_Eos);
@@ -1021,6 +1035,7 @@ package body Grt.Waves is
Pack_It : VhpiHandleT;
Pack : VhpiHandleT;
Error : AvhpiErrorT;
+ Wave_Elem : Wave_Opt_File.Elem_Acc;
begin
-- First packages.
Get_Package_Inst (Pack_It);
@@ -1031,12 +1046,17 @@ package body Grt.Waves is
Avhpi_Error (Error);
return;
end if;
-
- Wave_Put_Hierarchy_Block (Pack, Step);
+ Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Pack), Pkg);
+ if Is_Displayed (Wave_Elem) then
+ Wave_Put_Hierarchy_Block (Pack, Step, Wave_Elem);
+ end if;
end loop;
-- Then top entity.
- Wave_Put_Hierarchy_Block (Root, Step);
+ Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Root), Entity);
+ if Is_Displayed (Wave_Elem) then
+ Wave_Put_Hierarchy_Block (Root, Step, Wave_Elem);
+ end if;
end Wave_Put_Hierarchy;
procedure Disp_Str_AVL (Str : AVL_Nid; Indent : Natural)
@@ -1557,7 +1577,13 @@ package body Grt.Waves is
-- Vcd_Search_Packages;
Wave_Put_Hierarchy (Root, Step_Name);
- Freeze_Strings;
+ Wave_Opt_File.Tree_Reading.Check_If_All_Found;
+ -- TODO : The tree of the wave option file should be deallocated here,
+ -- but the memory gain shouldn't be significative
+
+ if Str_Table.Last > 0 then
+ Freeze_Strings;
+ end if;
-- Register_Cycle_Hook (Vcd_Cycle'Access);
Write_Strings_Compress;