diff options
author | Jonas Baggett <jonas17b@gmail.com> | 2016-11-01 19:23:38 +0100 |
---|---|---|
committer | tgingold <tgingold@users.noreply.github.com> | 2016-11-01 19:23:38 +0100 |
commit | b869a4acb52358fe8ca5decaac826af056bfdfca (patch) | |
tree | bf9f65e7be9f06ab401e5f23f22194846aa1c389 | |
parent | dc6a82418653ce5b732d2bc26b393d3259fd93d5 (diff) | |
download | ghdl-b869a4acb52358fe8ca5decaac826af056bfdfca.tar.gz ghdl-b869a4acb52358fe8ca5decaac826af056bfdfca.tar.bz2 ghdl-b869a4acb52358fe8ca5decaac826af056bfdfca.zip |
There is a new --write-opt-file option that will create a wave option file with all the signals of the design. (#179)
The --wave-opt-file option is renamed to --read-opt-file for consistency
Some code cleanup and bug fixes
-rw-r--r-- | doc/Simulation_and_runtime.rst | 19 | ||||
-rw-r--r-- | src/grt/grt-fst.adb | 46 | ||||
-rw-r--r-- | src/grt/grt-options.adb | 14 | ||||
-rw-r--r-- | src/grt/grt-types.ads | 1 | ||||
-rw-r--r-- | src/grt/grt-vcd.adb | 59 | ||||
-rw-r--r-- | src/grt/grt-wave_opt-design.adb (renamed from src/grt/grt-wave_opt_file-tree_reading.adb) | 118 | ||||
-rw-r--r-- | src/grt/grt-wave_opt-design.ads (renamed from src/grt/grt-wave_opt_file-tree_reading.ads) | 27 | ||||
-rw-r--r-- | src/grt/grt-wave_opt-file-debug.adb (renamed from src/grt/grt-wave_opt_file-parse-debug.adb) | 8 | ||||
-rw-r--r-- | src/grt/grt-wave_opt-file-debug.ads (renamed from src/grt/grt-wave_opt_file-parse-debug.ads) | 4 | ||||
-rw-r--r-- | src/grt/grt-wave_opt-file.adb (renamed from src/grt/grt-wave_opt_file-parse.adb) | 270 | ||||
-rw-r--r-- | src/grt/grt-wave_opt-file.ads (renamed from src/grt/grt-wave_opt_file-parse.ads) | 47 | ||||
-rw-r--r-- | src/grt/grt-wave_opt.adb (renamed from src/grt/grt-wave_opt_file.adb) | 18 | ||||
-rw-r--r-- | src/grt/grt-wave_opt.ads (renamed from src/grt/grt-wave_opt_file.ads) | 32 | ||||
-rw-r--r-- | src/grt/grt-waves.adb | 51 |
14 files changed, 441 insertions, 273 deletions
diff --git a/doc/Simulation_and_runtime.rst b/doc/Simulation_and_runtime.rst index 979a9892a..518c8a290 100644 --- a/doc/Simulation_and_runtime.rst +++ b/doc/Simulation_and_runtime.rst @@ -118,11 +118,28 @@ all options available, including the debugging one. Disable buffering on stdout, stderr and files opened in write or append mode (TEXTIO). -.. option:: --wave-opt-file=<FILENAME> +.. option:: --read-opt-file=<FILENAME> Filter signals to be dumped to the wave file according to the wave option file provided. + Here is a description of the wave option file format : + + $ version = 1.0 # Optional + + # Signals in packages : + my_pkg.global_signal_a + + # Signals in entities : + /top/sub/clk + + +.. option:: --write-opt-file=<FILENAME> + + If the wave option file doesn't exist, creates it with all the signals of + the design. Otherwise throws an error, because it won't erase an existing + file. + .. option:: --vcd=<FILENAME> diff --git a/src/grt/grt-fst.adb b/src/grt/grt-fst.adb index 29bc5acad..20455b3aa 100644 --- a/src/grt/grt-fst.adb +++ b/src/grt/grt-fst.adb @@ -52,8 +52,8 @@ with Grt.Hooks; use Grt.Hooks; with Grt.Rtis; use Grt.Rtis; with Grt.Rtis_Types; use Grt.Rtis_Types; with Grt.Vstrings; -with Grt.Wave_Opt_File; use Grt.Wave_Opt_File; -with Grt.Wave_Opt_File.Tree_Reading; use Grt.Wave_Opt_File.Tree_Reading; +with Grt.Wave_Opt; use Grt.Wave_Opt; +with Grt.Wave_Opt.Design; use Grt.Wave_Opt.Design; with Ada.Unchecked_Deallocation; pragma Elaborate_All (Grt.Table); @@ -413,11 +413,10 @@ package body Grt.Fst is end Fst_Add_Signal; procedure Fst_Put_Hierarchy - (Inst : VhpiHandleT; Wave_Elem : Wave_Opt_File.Elem_Acc); + (Inst : VhpiHandleT; Wave_Elem : Wave_Opt.Elem_Acc); - procedure Fst_Put_Scope (Scope : fstScopeType; - Decl : VhpiHandleT; - Wave_Elem : Wave_Opt_File.Elem_Acc) + procedure Fst_Put_Scope + (Scope : fstScopeType; Decl : VhpiHandleT; Wave_Elem : Wave_Opt.Elem_Acc) is Name : String (1 .. 128); Name_Len : Integer; @@ -473,12 +472,12 @@ package body Grt.Fst is end Fst_Put_Scope; procedure Fst_Put_Hierarchy - (Inst : VhpiHandleT; Wave_Elem : Wave_Opt_File.Elem_Acc) + (Inst : VhpiHandleT; Wave_Elem : Wave_Opt.Elem_Acc) is Decl_It : VhpiHandleT; Decl : VhpiHandleT; Error : AvhpiErrorT; - Wave_Elem_Child : Wave_Opt_File.Elem_Acc; + Wave_Elem_Child : Wave_Opt.Elem_Acc; begin Vhpi_Iterator (VhpiDecls, Inst, Decl_It, Error); if Error /= AvhpiErrorOk then @@ -495,18 +494,17 @@ package body Grt.Fst is return; end if; - - 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 Vhpi_Get_Kind (Decl) is + when VhpiPortDeclK + | VhpiSigDeclK => + Wave_Elem_Child := Get_Cursor + (Wave_Elem, Avhpi_Get_Base_Name (Decl), Is_Signal => True); + if Is_Displayed (Wave_Elem_Child) then Fst_Add_Signal (Decl); - when others => - null; - end case; - end if; + end if; + when others => + null; + end case; end loop; -- Extract sub-scopes. @@ -529,7 +527,7 @@ package body Grt.Fst is return; end if; - Wave_Elem_Child := Get_Cursor (Avhpi_Get_Base_Name (Decl), Wave_Elem); + Wave_Elem_Child := Get_Cursor (Wave_Elem, Avhpi_Get_Base_Name (Decl)); if Is_Displayed (Wave_Elem_Child) then case Vhpi_Get_Kind (Decl) is when VhpiIfGenerateK => @@ -626,7 +624,7 @@ package body Grt.Fst is Pack : VhpiHandleT; Error : AvhpiErrorT; Root : VhpiHandleT; - Wave_Elem : Wave_Opt_File.Elem_Acc; + Wave_Elem : Wave_Opt.Elem_Acc; begin -- Do nothing if there is no VCD file to generate. if Context = Null_fstContext then @@ -652,7 +650,7 @@ package body Grt.Fst is Avhpi_Error (Error); return; end if; - Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Pack), Pkg); + Wave_Elem := Get_Top_Cursor (Pkg, Avhpi_Get_Base_Name (Pack)); if Is_Displayed (Wave_Elem) then Fst_Put_Hierarchy (Pack, Wave_Elem); end if; @@ -660,11 +658,11 @@ package body Grt.Fst is -- Then top entity. Get_Root_Inst (Root); - Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Root), Entity); + Wave_Elem := Get_Top_Cursor (Entity, Avhpi_Get_Base_Name (Root)); if Is_Displayed (Wave_Elem) then Fst_Put_Hierarchy (Root, Wave_Elem); end if; - Wave_Opt_File.Tree_Reading.Check_If_All_Found; + Wave_Opt.Design.Last_Checks; if Flag_Aliases then Free_Hash_Tab; diff --git a/src/grt/grt-options.adb b/src/grt/grt-options.adb index 6c3f333d3..8c045bd7d 100644 --- a/src/grt/grt-options.adb +++ b/src/grt/grt-options.adb @@ -28,7 +28,7 @@ with Grt.Errors; use Grt.Errors; with Grt.Stdio; use Grt.Stdio; with Grt.Astdio; with Grt.Hooks; -with Grt.Wave_Opt_File.Parse; +with Grt.Wave_Opt.File; package body Grt.Options is @@ -165,7 +165,8 @@ package body Grt.Options is P (" --no-run do not simulate, only elaborate"); P (" --unbuffered disable buffering on stdout, stderr and"); P (" files opened in write or append mode (TEXTIO)."); - P (" --wave-opt-file=FILENAME read a wave option file"); + P (" --read-wave-opt=FILENAME read a wave option file."); + P (" --write-wave-opt=FILENAME write a wave option file."); -- P (" --threads=N use N threads for simulation"); P ("Additional features:"); P (" --has-feature=X test presence of feature X"); @@ -486,9 +487,14 @@ package body Grt.Options is Unbuffered_Writes := True; setbuf (stdout, NULL_voids); setbuf (stderr, NULL_voids); - elsif Option'Length >= 16 and then Option (1 .. 16) = "--wave-opt-file=" + elsif Len >= 16 and then Option (1 .. 16) = "--read-wave-opt=" then - Wave_Opt_File.Parse.Start (Option (17 .. Option'Last)); + Wave_Opt.File.Start + (Option (17 .. Option'Last), To_Be_Created => False); + elsif Len >= 17 and then Option (1 .. 17) = "--write-wave-opt=" + then + Wave_Opt.File.Start + (Option (18 .. Option'Last), To_Be_Created => True); elsif not Grt.Hooks.Call_Option_Hooks (Option) then Error_C ("unknown option '"); Error_C (Option); diff --git a/src/grt/grt-types.ads b/src/grt/grt-types.ads index 4824762b7..5fb60f2d5 100644 --- a/src/grt/grt-types.ads +++ b/src/grt/grt-types.ads @@ -49,6 +49,7 @@ package Grt.Types is -- Access to an unconstrained string. type String_Access is access String; + type String_Cst is access constant String; procedure Unchecked_Deallocation is new Ada.Unchecked_Deallocation (Name => String_Access, Object => String); diff --git a/src/grt/grt-vcd.adb b/src/grt/grt-vcd.adb index 95a724c76..b44090ed5 100644 --- a/src/grt/grt-vcd.adb +++ b/src/grt/grt-vcd.adb @@ -49,8 +49,8 @@ with Grt.Rtis; use Grt.Rtis; with Grt.Rtis_Addr; use Grt.Rtis_Addr; with Grt.Rtis_Types; use Grt.Rtis_Types; with Grt.Vstrings; -with Grt.Wave_Opt_File; use Grt.Wave_Opt_File; -with Grt.Wave_Opt_File.Tree_Reading; use Grt.Wave_Opt_File.Tree_Reading; +with Grt.Wave_Opt; use Grt.Wave_Opt; +with Grt.Wave_Opt.Design; use Grt.Wave_Opt.Design; pragma Elaborate_All (Grt.Table); package body Grt.Vcd is @@ -532,12 +532,12 @@ package body Grt.Vcd is end Add_Signal; procedure Vcd_Put_Hierarchy - (Inst : VhpiHandleT; Wave_Elem : Wave_Opt_File.Elem_Acc) + (Inst : VhpiHandleT; Wave_Elem : Wave_Opt.Elem_Acc) is Decl_It : VhpiHandleT; Decl : VhpiHandleT; Error : AvhpiErrorT; - Wave_Elem_Child : Wave_Opt_File.Elem_Acc; + Wave_Elem_Child : Wave_Opt.Elem_Acc; begin Vhpi_Iterator (VhpiDecls, Inst, Decl_It, Error); if Error /= AvhpiErrorOk then @@ -554,17 +554,17 @@ package body Grt.Vcd is return; end if; - 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 Vhpi_Get_Kind (Decl) is + when VhpiPortDeclK + | VhpiSigDeclK => + Wave_Elem_Child := Get_Cursor + (Wave_Elem, Avhpi_Get_Base_Name (Decl), Is_Signal => True); + if Is_Displayed (Wave_Elem_Child) then Add_Signal (Decl); - when others => - null; - end case; - end if; + end if; + when others => + null; + end case; end loop; -- Extract sub-scopes. @@ -585,13 +585,14 @@ package body Grt.Vcd is Avhpi_Error (Error); return; end if; - 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 => + case Vhpi_Get_Kind (Decl) is + when VhpiIfGenerateK + | VhpiForGenerateK + | VhpiBlockStmtK + | VhpiCompInstStmtK => + Wave_Elem_Child := Get_Cursor + (Wave_Elem, Avhpi_Get_Base_Name (Decl)); + if Is_Displayed (Wave_Elem_Child) then Vcd_Put ("$scope module "); Vcd_Put_Name (Decl); Vcd_Putc (' '); @@ -599,10 +600,10 @@ package body Grt.Vcd is Vcd_Put_Hierarchy (Decl, Wave_Elem_Child); Vcd_Put ("$upscope "); Vcd_Put_End; - when others => - null; - end case; - end if; + end if; + when others => + null; + end case; end loop; end Vcd_Put_Hierarchy; @@ -872,7 +873,7 @@ package body Grt.Vcd is Pack : VhpiHandleT; Error : AvhpiErrorT; Root : VhpiHandleT; - Wave_Elem : Wave_Opt_File.Elem_Acc; + Wave_Elem : Wave_Opt.Elem_Acc; begin -- Do nothing if there is no VCD file to generate. if Vcd_Close = null then @@ -893,7 +894,7 @@ package body Grt.Vcd is Avhpi_Error (Error); return; end if; - Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Pack), Pkg); + Wave_Elem := Get_Top_Cursor (Pkg, Avhpi_Get_Base_Name (Pack)); if Is_Displayed (Wave_Elem) then Vcd_Put_Hierarchy (Pack, Wave_Elem); end if; @@ -901,11 +902,11 @@ package body Grt.Vcd is -- Then top entity. Get_Root_Inst (Root); - Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Root), Entity); + Wave_Elem := Get_Top_Cursor (Entity, Avhpi_Get_Base_Name (Root)); if Is_Displayed (Wave_Elem) then Vcd_Put_Hierarchy (Root, Wave_Elem); end if; - Wave_Opt_File.Tree_Reading.Check_If_All_Found; + Wave_Opt.Design.Last_Checks; -- End of header. Vcd_Put ("$enddefinitions "); diff --git a/src/grt/grt-wave_opt_file-tree_reading.adb b/src/grt/grt-wave_opt-design.adb index ba3834e50..2002cca0d 100644 --- a/src/grt/grt-wave_opt_file-tree_reading.adb +++ b/src/grt/grt-wave_opt-design.adb @@ -26,70 +26,67 @@ -- Description: See package specifications with Grt.Errors; use Grt.Errors; +with Grt.Wave_Opt.File; use Grt.Wave_Opt.File; -package body Grt.Wave_Opt_File.Tree_Reading is - -- Returns true is all signals are displayed. This is the case when no - -- wave option file was provided or the one provided contains no paths - function All_Signals_Displayed return Boolean; +package body Grt.Wave_Opt.Design is -- Find the element that matches the name given. Starts with the element -- given, then go thru all its siblings - function Find_Cursor (Name : Ghdl_C_String; + function Find_Cursor (Name : String; First_Sibling : Elem_Acc; Is_Signal : Boolean := False) return Elem_Acc; - function Get_Top_Cursor (Name : Ghdl_C_String; Index : Tree_Index_Type) - return Elem_Acc is + function Get_Top_Cursor (Tree_Index : Tree_Index_Type; Name : Ghdl_C_String) + return Elem_Acc + is + Root : Elem_Acc; begin - return Find_Cursor (Name, Trees (Index)); + Root := Trees (Tree_Index); + if State = Write_File and then Root.Next_Child = null then + Write_Tree_Comment (Tree_Index); + end if; + return Get_Cursor (Root, Name); end Get_Top_Cursor; - function Get_Cursor - (Name : Ghdl_C_String; Parent : Elem_Acc; Is_Signal : Boolean := False) - return Elem_Acc is + function Get_Cursor (Parent : Elem_Acc; + Name : Ghdl_C_String; + Is_Signal : Boolean := False) return Elem_Acc + is + Cursor : Elem_Acc; + Dummy_Bool : Boolean; + Str_Name : constant String := Name (1 .. strlen (Name)); begin - if All_Signals_Displayed then - return null; - end if; - return Find_Cursor (Name, Parent.Next_Child, Is_Signal); + case State is + when Write_File => + Cursor := Parent; + Update_Tree (Cursor => Cursor, + Updated => Dummy_Bool, + Elem_Name => Str_Name, + Level => Parent.Level + 1); + if Is_Signal then + Write_Signal_Path (Cursor); + end if; + return Cursor; + when Display_Tree => + return Find_Cursor (Str_Name, Parent.Next_Child, Is_Signal); + when Display_All => + return null; + end case; end Get_Cursor; - function Is_Displayed (Cursor : Elem_Acc) return Boolean is - begin - if All_Signals_Displayed or else Cursor /= null then - return True; - end if; - return False; - end Is_Displayed; - - -- Read the whole sub tree given and check if every element was found in - -- design. Called by Check_If_All_Found - procedure Check_Sub_Tree_If_All_Found - (Previous_Cursor : Elem_Acc; Sep : Character); - - procedure Check_If_All_Found is - begin - for Index in Tree_Index_Type'Range loop - Check_Sub_Tree_If_All_Found (Trees (Index), Seps (Index)); - end loop; - end Check_If_All_Found; - -------------------------------------------------------------------------------- - - function Find_Cursor (Name : Ghdl_C_String; + function Find_Cursor (Name : String; First_Sibling : Elem_Acc; Is_Signal : Boolean := False) return Elem_Acc is - Len : constant Natural := strlen (Name); Cursor : Elem_Acc; begin Cursor := First_Sibling; loop if Cursor = null then return null; - elsif Cursor.Name.all = Name (1 .. Len) then + elsif Cursor.Name.all = Name then if Is_Signal then Cursor.Kind := Signal; else @@ -101,8 +98,30 @@ package body Grt.Wave_Opt_File.Tree_Reading is end loop; end Find_Cursor; - procedure Check_Sub_Tree_If_All_Found - (Previous_Cursor : Elem_Acc; Sep : Character) + function Is_Displayed (Cursor : Elem_Acc) return Boolean is + begin + if State /= Display_Tree or else Cursor /= null then + return True; + end if; + return False; + end Is_Displayed; + + -- Read the whole sub tree given and check if every element was found in + -- design. Called by Last_Checks + procedure Check_Sub_Tree_If_All_Found (Previous_Cursor : Elem_Acc); + + procedure Last_Checks is + begin + if Wave_Opt.State = Display_Tree then + for Index in Tree_Index_Type'Range loop + Check_Sub_Tree_If_All_Found (Trees (Index).Next_Child); + end loop; + end if; + -- TODO : The tree of the wave option file should be deallocated here, + -- but the memory gain shouldn't be significative + end Last_Checks; + + procedure Check_Sub_Tree_If_All_Found (Previous_Cursor : Elem_Acc) is Cursor : Elem_Acc; begin @@ -110,8 +129,9 @@ package body Grt.Wave_Opt_File.Tree_Reading is while Cursor /= null loop if Cursor.Kind = Not_Found then Print_Context (Cursor, Warning); - Report_C ("no VHDL object in design matches "); - Report_E (Cursor.Name.all); + Report_C (Cursor.Name.all); + Report_C (" : first element of the path not found in design."); + Report_E (" more references may follow"); elsif Cursor.Level = Cursor.Path_Context.Max_Level and then Cursor.Kind = Pkg_Entity then @@ -119,17 +139,11 @@ package body Grt.Wave_Opt_File.Tree_Reading is Report_C (Cursor.Name.all); Report_E (" is not a signal"); else - Check_Sub_Tree_If_All_Found (Cursor.Next_Child, Sep); + Check_Sub_Tree_If_All_Found (Cursor.Next_Child); end if; Cursor := Cursor.Next_Sibling; end loop; end Check_Sub_Tree_If_All_Found; - function All_Signals_Displayed return Boolean is - begin - return Trees = Tree_Array'(others => null); - end All_Signals_Displayed; - - -end Grt.Wave_Opt_File.Tree_Reading; +end Grt.Wave_Opt.Design; diff --git a/src/grt/grt-wave_opt_file-tree_reading.ads b/src/grt/grt-wave_opt-design.ads index adeaaeb12..54a96acfa 100644 --- a/src/grt/grt-wave_opt_file-tree_reading.ads +++ b/src/grt/grt-wave_opt-design.ads @@ -23,31 +23,38 @@ -- however invalidate any other reasons why the executable file might be -- covered by the GNU Public License. --- Description: Wave option file child package for reading the tree created --- after parsing the wave option file. It provides functions to --- find in the tree which signals are to be displayed or not +-- Description: Wave option file child package doing the link between the +-- design and the other wave option packages. +-- Provides functions to find in the tree which signals are to be +-- displayed or not. +-- When State = Display_Tree, it reads the tree created after +-- parsing the wave option file and filters signals accordingly. +-- When State = Write_File, it calls File.Update_Tree to create +-- the tree from the design tree and write the signal paths of all +-- the design to a new wave option file. with Grt.Types; use Grt.Types; -package Grt.Wave_Opt_File.Tree_Reading is +package Grt.Wave_Opt.Design is pragma Preelaborate; -- Returns the top element of the tree corresponding to the index given, but -- only if the name given matches with it. Otherwise returns null - function Get_Top_Cursor (Name : Ghdl_C_String; Index : Tree_Index_Type) + function Get_Top_Cursor (Tree_Index : Tree_Index_Type; Name : Ghdl_C_String) return Elem_Acc; - -- If there is an element in the parent element given that match the name + -- If there is an element in the parent element given that matches the name -- given, returns it, otherwise returns null function Get_Cursor - (Name : Ghdl_C_String; Parent : Elem_Acc; Is_Signal : Boolean := False) + (Parent : Elem_Acc; Name : Ghdl_C_String; Is_Signal : Boolean := False) return Elem_Acc; -- Returns true if the element given is not null, which means it exists in -- the tree of the VHDL elements to be displayed function Is_Displayed (Cursor : Elem_Acc) return Boolean; - -- Read the whole tree and check if every element was found in design - procedure Check_If_All_Found; + -- If relevent, read the whole tree and check if every element was found in + -- design + procedure Last_Checks; -end Grt.Wave_Opt_File.Tree_Reading; +end Grt.Wave_Opt.Design; diff --git a/src/grt/grt-wave_opt_file-parse-debug.adb b/src/grt/grt-wave_opt-file-debug.adb index 3461c9f3c..44878077a 100644 --- a/src/grt/grt-wave_opt_file-parse-debug.adb +++ b/src/grt/grt-wave_opt-file-debug.adb @@ -27,7 +27,7 @@ with Grt.Astdio; use Grt.Astdio; -package body Grt.Wave_Opt_File.Parse.Debug is +package body Grt.Wave_Opt.File.Debug is -- Dump recursively an element of the tree. procedure Dump_Sub_Tree (Cursor : Elem_Acc); @@ -42,14 +42,12 @@ package body Grt.Wave_Opt_File.Parse.Debug is else Put_Line ("Instances : "); end if; - Dump_Sub_Tree (Trees (Index)); + Dump_Sub_Tree (Trees (Index).Next_Child); end loop; Put_Line ("----------- END -----------------"); New_Line; end Dump_Tree; -------------------------------------------------------------------------------- - procedure Dump_Sub_Tree (Cursor : Elem_Acc) is Sibling_Cursor : Elem_Acc; @@ -64,4 +62,4 @@ package body Grt.Wave_Opt_File.Parse.Debug is end loop; end Dump_Sub_Tree; -end Grt.Wave_Opt_File.Parse.Debug; +end Grt.Wave_Opt.File.Debug; diff --git a/src/grt/grt-wave_opt_file-parse-debug.ads b/src/grt/grt-wave_opt-file-debug.ads index dcf2e51e9..a8542b43f 100644 --- a/src/grt/grt-wave_opt_file-parse-debug.ads +++ b/src/grt/grt-wave_opt-file-debug.ads @@ -26,10 +26,10 @@ -- Description: Wave option file child package for debugging purpose. -- Prints the tree created after parsing. -private package Grt.Wave_Opt_File.Parse.Debug is +private package Grt.Wave_Opt.File.Debug is pragma Preelaborate; -- Dump all the tree procedure Dump_Tree; -end Grt.Wave_Opt_File.Parse.Debug; +end Grt.Wave_Opt.File.Debug; diff --git a/src/grt/grt-wave_opt_file-parse.adb b/src/grt/grt-wave_opt-file.adb index 7c6537b4f..bad572f15 100644 --- a/src/grt/grt-wave_opt_file-parse.adb +++ b/src/grt/grt-wave_opt-file.adb @@ -43,45 +43,60 @@ with System; use System; with Grt.Types; use Grt.Types; -with Grt.Stdio; use Grt.Stdio; with Grt.Strings; use Grt.Strings; -with Grt.Vstrings; use Grt.Vstrings; +with Grt.Astdio; use Grt.Astdio; with Grt.Errors; use Grt.Errors; +--~ with Grt.Wave_Opt.File.Debug; ---~ with Grt.Wave_Opt_File.Parse.Debug; +package body Grt.Wave_Opt.File is -package body Grt.Wave_Opt_File.Parse is -- Open the wave option file - function File_Open (Option_File : String) return FILEs; + function Open (Option_File : String; To_Be_Created : Boolean) return FILEs; - -- Update the tree with the current VHDL element parsed from the current - -- path. Returns True if the tree was actually updated. - function Update_Tree (Elem_Name : String; Tree_Index : Tree_Index_Type) - return Boolean; + -- Initialize the root of the tree + procedure Initialize_Tree; + + -- Tell if the tree is empty (beside the root) + function Tree_Is_Empty return Boolean; + + -- Parse the wave option file + procedure Parse_File (Stream : FILEs); -- Parse the line where the version is set - procedure Parse_Version (Line : String; Line_Pos : Positive); + procedure Parse_Version (Line : String; Lineno : Positive); -- Print the version variable given as parameter procedure Print_Version (Version : Version_Type); -- Parse a line where a signal path is set - procedure Parse_Path (Line : in out String); + procedure Parse_Path (Line : in out String; Lineno : Positive); + + procedure Start (Option_File : String; To_Be_Created : Boolean) is + Stream : FILEs; + begin + File_Path := new String'(Option_File); + Stream := Open (Option_File, To_Be_Created); - procedure Start (Option_File : String) + if State = Display_Tree then + Parse_File (Stream); + -- Otherwise, State = Write_File + else + Write_Stream := Stream; + end if; + end Start; + + procedure Parse_File (Stream : FILEs) is - Stream : constant FILEs := File_Open (Option_File); First, Last : Integer; Line : String (1 .. Buf_Size); - Line_Pos : Natural; + Lineno : Natural; begin - File_Path := new String'(Option_File); - Line_Pos := 0; + Lineno := 0; -- Processes line after line. loop exit when fgets (Line'Address, Line'Length, Stream) = Null_Address; - Line_Pos := Line_Pos + 1; + Lineno := Lineno + 1; -- Determine end of line. Last := New_Line_Pos (Line) - 1; @@ -98,13 +113,10 @@ package body Grt.Wave_Opt_File.Parse is -- Create a line string without beginning and ending whitespaces Last := Last_Non_Whitespace_Pos (Line (First .. Last)); - if Line (First) = '$' then - Parse_Version (Line (First .. Last), Line_Pos); + Parse_Version (Line (First .. Last), Lineno); else - Path_Context := new Path_Context_Type'(Line_Pos => Line_Pos, - Max_Level => 0); - Parse_Path (Line (First .. Last)); + Parse_Path (Line (First .. Last), Lineno); end if; <<Continue>> null; @@ -117,73 +129,72 @@ package body Grt.Wave_Opt_File.Parse is Report_E (""); end if; - if Trees = Tree_Array'(others => null) then + if Tree_Is_Empty then Report_E ("No signal path was found in the wave option file," & " then every signals will be displayed."); end if; + fclose (Stream); --~ Debug.Dump_Tree; - end Start; - -------------------------------------------------------------------------------- + end Parse_File; - procedure Parse_Version (Line : String; Line_Pos : Positive) + procedure Parse_Version (Line : String; Lineno : Positive) is Msg_Invalid_Format : constant String := "invalid version format"; First, Dot_Index, Num : Integer; begin if Version /= (others => -1) then - Error_Context ("version is set more than once", Line_Pos, Line'First); + Error_Context ("version is set more than once", Lineno, Line'First); end if; - if Trees /= Tree_Array'(others => null) then + if not Tree_Is_Empty then Error_Context - ("version cannot be set after signal paths", Line_Pos, Line'First); + ("version cannot be set after signal paths", Lineno, Line'First); end if; First := First_Non_Whitespace_Pos (Line (Line'First + 1 .. Line'Last)); if Line (First .. First + 6) /= "version" then - Error_Context (Msg_Invalid_Format, Line_Pos, Line'First); + Error_Context (Msg_Invalid_Format, Lineno, Line'First); end if; -- Catch "version\n", "version1.0" First := First + 7; if not Is_Whitespace (Line (First)) then - Error_Context (Msg_Invalid_Format, Line_Pos, Line'First); + Error_Context (Msg_Invalid_Format, Lineno, Line'First); end if; -- Catch "version \n", "version \n", etc First := First_Non_Whitespace_Pos (Line (First + 1 .. Line'Last)); if First = -1 then - Error_Context (Msg_Invalid_Format, Line_Pos, Line'First); + Error_Context (Msg_Invalid_Format, Lineno, Line'First); end if; -- Catch the absence of "." or "version ." Dot_Index := Find (Line (First + 1 .. Line'Last), '.'); if Dot_Index = -1 then - Error_Context (Msg_Invalid_Format, Line_Pos, Line'First); + Error_Context (Msg_Invalid_Format, Lineno, Line'First); end if; -- Catch version a.2 Num := Value (Line (First .. Dot_Index - 1)); if Num = -1 then - Error_Context (Msg_Invalid_Format, Line_Pos, Line'First); + Error_Context (Msg_Invalid_Format, Lineno, Line'First); end if; Version.Major := Num; -- Catch version 1.a Num := Value (Line (Dot_Index + 1 .. Line'Last)); if Num = -1 then - Error_Context (Msg_Invalid_Format, Line_Pos, Line'First); + Error_Context (Msg_Invalid_Format, Lineno, Line'First); end if; Version.Minor := Num; if Version.Major /= Current_Version.Major or else Version.Minor > Current_Version.Minor then - Print_Context (Line'First, Line_Pos, Error); + Print_Context (Line'First, Lineno, Error); Error_C ("unsupported format version; it must be "); if Current_Version.Minor /= 0 then Error_C ("between "); @@ -196,27 +207,39 @@ package body Grt.Wave_Opt_File.Parse is end Parse_Version; - procedure Print_Version (Version : Version_Type) - is - Num_Str : String (1 .. Value_String_Size); - First : Positive; + procedure Print_Version (Version : Version_Type) is begin - To_String (Num_Str, First, Ghdl_I32 (Version.Major)); - Report_C (Num_Str (First .. Num_Str'Last)); + Report_C (Version.Major); Report_C ("."); - To_String (Num_Str, First, Ghdl_I32 (Version.Minor)); - Report_C (Num_Str (First .. Num_Str'Last)); + Report_C (Version.Minor); end Print_Version; - -------------------------------------------------------------------------- + procedure Initialize_Tree is + begin + for I in Tree_Index_Type'Range loop + Trees (I) := new Elem_Type; + Trees (I).Name := new String'(1 => Seps (I)); + Trees (I).Level := 0; + end loop; + end Initialize_Tree; + + function Tree_Is_Empty return Boolean is + begin + return Trees (Pkg).Next_Child = null + and Trees (Entity).Next_Child = null; + end Tree_Is_Empty; - procedure Parse_Path (Line : in out String) + procedure Parse_Path (Line : in out String; Lineno : Positive) is -- Can equal to 0 in case of error (like '.' as a full path) First, Last : Natural; - Tree_Updated : Boolean; + Path_Context : Path_Context_Acc; Tree_Index : Tree_Index_Type; + Tree_Cursor : Elem_Acc; + Tree_Updated : Boolean; begin + Path_Context := new Path_Context_Type'(Lineno => Lineno, + Max_Level => 0); To_Lower (Line); Last := Line'First; if Line (Line'First) = '/' then @@ -225,7 +248,7 @@ package body Grt.Wave_Opt_File.Parse is -- Catch '/' as a full path if Last > Line'Length then Error_Context - ("invalid signal path", Path_Context.Line_Pos, Line'First); + ("invalid signal path", Path_Context.Lineno, Line'First); end if; else -- '/' not allowed for package signal paths in a. Catch also the @@ -233,12 +256,11 @@ package body Grt.Wave_Opt_File.Parse is -- code to believe it's inside a package if Find (Line, '/') > 0 then Error_Context - ("invalid signal path", Path_Context.Line_Pos, Line'First); + ("invalid signal path", Path_Context.Lineno, Line'First); end if; Tree_Index := Pkg; end if; Tree_Cursor := Trees (Tree_Index); - Previous_Tree_Cursor := null; loop First := Last; @@ -255,12 +277,16 @@ package body Grt.Wave_Opt_File.Parse is end loop; Path_Context.Max_Level := Path_Context.Max_Level + 1; - Tree_Updated := Update_Tree (Line (First .. Last), Tree_Index); + Update_Tree (Cursor => Tree_Cursor, + Updated => Tree_Updated, + Elem_Name => Line (First .. Last), + Level => Path_Context.Max_Level, + Path_Context => Path_Context); if Last = Line'Last then if not Tree_Updated then Error_Context ("ignored already known signal path", - Path_Context.Line_Pos, + Path_Context.Lineno, Line'First, Warning); end if; @@ -272,75 +298,141 @@ package body Grt.Wave_Opt_File.Parse is -- Catch signal paths ending with / or . if Last > Line'Last then Error_Context - ("invalid signal path", Path_Context.Line_Pos, Line'First); + ("invalid signal path", Path_Context.Lineno, Line'First); end if; end loop; end Parse_Path; - function Update_Tree (Elem_Name : String; Tree_Index : Tree_Index_Type) - return Boolean + procedure Update_Tree (Cursor : in out Elem_Acc; + Updated : out Boolean; + Elem_Name : String; + Level : Natural; + Path_Context : Path_Context_Acc := null) is Sibling_Cursor, Previous_Sibling_Cursor : Elem_Acc; - Elem : Elem_Acc; + Created_Elem : Elem_Acc; begin - Sibling_Cursor := Tree_Cursor; Previous_Sibling_Cursor := null; - + Sibling_Cursor := Cursor.Next_Child; loop -- Already reached the last sibling and current identifier corresponds -- to no existing element ? Then we will create an element if Sibling_Cursor = null then - Elem := new Elem_Type'(Name => new String'(Elem_Name), - Path_Context => Path_Context, - Column_Pos => Elem_Name'First, - Level => Path_Context.Max_Level, - Kind => Not_Found, - Next_Sibling | Next_Child => null); + Created_Elem := new Elem_Type; + Created_Elem.Name := new String'(Elem_Name); + Created_Elem.Path_Context := Path_Context; + Created_Elem.Column := Elem_Name'First; + Created_Elem.Level := Level; + Created_Elem.Parent := Cursor; -- First element of level ? if Previous_Sibling_Cursor = null then - -- Is a top level ? - if Previous_Tree_Cursor = null then - Trees (Tree_Index) := Elem; - else - Previous_Tree_Cursor.Next_Child := Elem; - end if; + Cursor.Next_Child := Created_Elem; else - Previous_Sibling_Cursor.Next_Sibling := Elem; + Previous_Sibling_Cursor.Next_Sibling := Created_Elem; end if; - Previous_Tree_Cursor := Elem; - -- Point to Elem.Next_Child which is null - Tree_Cursor := null; - return True; + Cursor := Created_Elem; + Updated := True; + return; -- Identifier was found in the tree ? Then move to its first child elsif Elem_Name = Sibling_Cursor.Name.all then - Previous_Tree_Cursor := Sibling_Cursor; - Tree_Cursor := Sibling_Cursor.Next_Child; - return False; + Cursor := Sibling_Cursor; + Updated := False; + return; end if; Previous_Sibling_Cursor := Sibling_Cursor; Sibling_Cursor := Sibling_Cursor.Next_Sibling; end loop; end Update_Tree; - -------------------------------------------------------------------------- - - function File_Open (Option_File : String) return FILEs + procedure Write_Version (Stream : FILEs) is + begin + Put (Stream, "$ version "); + Put_I32 (Stream, Ghdl_I32 (Current_Version.Major)); + Put (Stream, '.'); + Put_I32 (Stream, Ghdl_I32 (Current_Version.Minor)); + New_Line (Stream); + end Write_Version; + + function Open (Option_File : String; To_Be_Created : Boolean) return FILEs is - Mode : constant String := "rt" & ASCII.Nul; + Read_Mode : constant String := "rt" & ASCII.Nul; + Write_Mode : constant String := "wt" & ASCII.Nul; Stream : FILEs; Option_File_C : String (1 .. Option_File'Length + 1); begin Option_File_C (1 .. Option_File'Length) := Option_File; Option_File_C (Option_File_C'Last) := ASCII.Nul; - Stream := fopen (Option_File_C'Address, Mode'Address); - if Stream = NULL_Stream then - Error_C ("cannot open '"); + State := Display_Tree; + Stream := fopen (Option_File_C'Address, Read_Mode'Address); + + if To_Be_Created then + if Stream /= NULL_Stream then + fclose (Stream); + Error_C ("'"); + Error_C (Option_File); + Error_E ("' already exists and it won't be erased."); + end if; + State := Write_File; + Stream := fopen (Option_File_C'Address, Write_Mode'Address); + if Stream = NULL_Stream then + Error_C ("cannot create '"); + Error_C (Option_File); + Error_E ("'."); + end if; + Write_Version (Stream); + elsif Stream = NULL_Stream then + Error_C ("cannot read '"); Error_C (Option_File); - Error_E ("'"); + Error_E ("'."); end if; + + Initialize_Tree; + return Stream; - end File_Open; + end Open; + + procedure Write_Tree_Comment (Tree_Index : Tree_Index_Type) is + begin + New_Line (Write_Stream); + if Tree_Index = Pkg then + Put_Line (Write_Stream, "# Signals in packages :"); + else + Put_Line (Write_Stream, "# Signals in entities :"); + end if; + end Write_Tree_Comment; + + procedure Write_Signal_Path (Signal : Elem_Acc) is + type Elem_Array is array (Positive range <>) of Elem_Acc; + Signal_Path : Elem_Array (1 .. Signal.Level - 1); + Cursor : Elem_Acc; + Sep : Character; + begin + Cursor := Signal.Parent; + for I in reverse Signal_Path'Range loop + Signal_Path (I) := Cursor; + Cursor := Cursor.Parent; + end loop; + if Signal_Path (1).Parent.Name.all = "/" then + Sep := '/'; + Put (Write_Stream, Sep); + else + Sep := '.'; + end if; + for I in Signal_Path'Range loop + Put (Write_Stream, Signal_Path (I).Name.all); + Put (Write_Stream, Sep); + end loop; + Put_Line (Write_Stream, Signal.Name.all); + end Write_Signal_Path; + + procedure Finalize is + begin + if State = Write_File then + fclose (Write_Stream); + State := Display_All; + end if; + end Finalize; -end Grt.Wave_Opt_File.Parse; +end Grt.Wave_Opt.File; diff --git a/src/grt/grt-wave_opt_file-parse.ads b/src/grt/grt-wave_opt-file.ads index a0e4ac74b..fafc8eb0e 100644 --- a/src/grt/grt-wave_opt_file-parse.ads +++ b/src/grt/grt-wave_opt-file.ads @@ -23,24 +23,47 @@ -- however invalidate any other reasons why the executable file might be -- covered by the GNU Public License. --- Description: Wave option file child package for parsing. --- Parse a wave option file provided in the command line and --- create a tree with the path of the signals to be displayed on --- the waveform +-- Description: Wave option file child package for file manipulation and +-- tree creation. +-- When State = Display_Tree, it parse the wave option file +-- provided in the command line and create a tree with the path of +-- the signals to be displayed on the waveform. -package Grt.Wave_Opt_File.Parse is +with Grt.Stdio; use Grt.Stdio; + +package Grt.Wave_Opt.File is pragma Preelaborate; - -- Parse the wave option file given as parameter - procedure Start (Option_File : String); + -- Open the wave option file given as parameter and parses it if it exists, + -- otherwise creates it and it will be written when reading the design + -- hierarchy + procedure Start (Option_File : String; To_Be_Created : Boolean); -private + -- Write the path of a signal to the option file + procedure Write_Signal_Path (Signal : Elem_Acc); - Buf_Size : constant := 1024; + -- Write a starting comment before the first signal path of the packages + -- tree or of the entities tree is ever written + procedure Write_Tree_Comment (Tree_Index : Tree_Index_Type); + + -- Update_Tree : Update the tree with the current VHDL element read from + -- the current path. + -- Called when the option file is read or when the option file is created + -- while reading the design hierarchy. + procedure Update_Tree (Cursor : in out Elem_Acc; + Updated : out Boolean; + Elem_Name : String; + Level : Natural; + Path_Context : Path_Context_Acc := null); - Path_Context : Path_Context_Acc; + -- Destructor + procedure Finalize; - Tree_Cursor, Previous_Tree_Cursor : Elem_Acc; +private + + Write_Stream : FILEs; + + Buf_Size : constant := 1024; type Version_Type is record Major : Integer; @@ -51,4 +74,4 @@ private type Sep_Array is array (Tree_Index_Type) of Character; -end Grt.Wave_Opt_File.Parse; +end Grt.Wave_Opt.File; diff --git a/src/grt/grt-wave_opt_file.adb b/src/grt/grt-wave_opt.adb index 8147e1bb7..0a6059adc 100644 --- a/src/grt/grt-wave_opt_file.adb +++ b/src/grt/grt-wave_opt.adb @@ -27,10 +27,10 @@ with Grt.Errors; use Grt.Errors; -package body Grt.Wave_Opt_File is +package body Grt.Wave_Opt is procedure Print_Context - (Line_Pos, Column_Pos : Positive; Severity : Severity_Type) is + (Lineno, Column : Positive; Severity : Severity_Type) is begin case Severity is when Error => @@ -40,23 +40,23 @@ package body Grt.Wave_Opt_File is end case; Report_C (File_Path.all); Report_C (":"); - Report_C (Line_Pos); + Report_C (Lineno); Report_C (":"); - Report_C (Column_Pos); + Report_C (Column); Report_C (": "); end Print_Context; procedure Print_Context (Element : Elem_Acc; Severity : Severity_Type) is begin Print_Context - (Element.Path_Context.Line_Pos, Element.Column_Pos, Severity); + (Element.Path_Context.Lineno, Element.Column, Severity); end Print_Context; procedure Error_Context (Msg : String; - Line_Pos, Column_Pos : Positive; + Lineno, Column : Positive; Severity : Severity_Type := Error) is begin - Print_Context (Line_Pos, Column_Pos, Severity); + Print_Context (Lineno, Column, Severity); case Severity is when Error => Error_E (Msg); @@ -69,7 +69,7 @@ package body Grt.Wave_Opt_File is (Msg : String; Element : Elem_Acc; Severity : Severity_Type := Error) is begin Error_Context - (Msg, Element.Path_Context.Line_Pos, Element.Column_Pos, Severity); + (Msg, Element.Path_Context.Lineno, Element.Column, Severity); end Error_Context; -end Grt.Wave_Opt_File; +end Grt.Wave_Opt; diff --git a/src/grt/grt-wave_opt_file.ads b/src/grt/grt-wave_opt.ads index 3999f317c..f14ed7ac5 100644 --- a/src/grt/grt-wave_opt_file.ads +++ b/src/grt/grt-wave_opt.ads @@ -28,16 +28,25 @@ -- the help of it's child units) -- Contains common stuff for it's child units -package Grt.Wave_Opt_File is +package Grt.Wave_Opt is pragma Preelaborate; + -- State : + -- Display_All : No signal filtering, display all + -- Write_File : Write in a new wave option file the signals found in the + -- design. No signal filtering too. + -- Display_Tree : Parse the given option file and create the tree. Display + -- only the signals that are in the tree + type State_Type is (Display_All, Write_File, Display_Tree); + State : State_Type := Display_All; + type String_Cst is access constant String; Value_String_Size : constant := 10; File_Path : String_Cst; type Path_Context_Type is record - Line_Pos : Natural; + Lineno : Natural; Max_Level : Natural; end record; type Path_Context_Acc is access Path_Context_Type; @@ -47,12 +56,12 @@ package Grt.Wave_Opt_File is type Elem_Acc is access Elem_Type; type Elem_Type is record Name : String_Cst; - Path_Context : Path_Context_Acc; - Column_Pos : Positive; - Level : Positive; - Kind : Elem_Kind_Type; - Next_Sibling : Elem_Acc; - Next_Child : Elem_Acc; + Path_Context : Path_Context_Acc := null; + Column : Natural := 0; + Level : Natural; + Kind : Elem_Kind_Type := Not_Found; + Parent : Elem_Acc := null; + Next_Sibling, Next_Child : Elem_Acc := null; end record; type Tree_Index_Type is (Pkg, Entity); @@ -64,17 +73,18 @@ package Grt.Wave_Opt_File is type Severity_Type is (Error, Warning); private + -- An error/warning message start with the context or the error/warning. -- This procedure print this context procedure Print_Context - (Line_Pos, Column_Pos : Positive; Severity : Severity_Type); + (Lineno, Column : Positive; Severity : Severity_Type); procedure Print_Context (Element : Elem_Acc; Severity : Severity_Type); -- Print an error/warning with it's context procedure Error_Context (Msg : String; - Line_Pos, Column_Pos : Positive; + Lineno, Column : Positive; Severity : Severity_Type := Error); procedure Error_Context (Msg : String; Element : Elem_Acc; Severity : Severity_Type := Error); -end Grt.Wave_Opt_File; +end Grt.Wave_Opt; diff --git a/src/grt/grt-waves.adb b/src/grt/grt-waves.adb index db8cf9174..a94eae23f 100644 --- a/src/grt/grt-waves.adb +++ b/src/grt/grt-waves.adb @@ -44,8 +44,9 @@ 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; +with Grt.Wave_Opt; use Grt.Wave_Opt; +with Grt.Wave_Opt.File; use Grt.Wave_Opt.File; +with Grt.Wave_Opt.Design; use Grt.Wave_Opt.Design; pragma Elaborate_All (Grt.Rtis_Utils); pragma Elaborate_All (Grt.Table); @@ -915,15 +916,15 @@ package body Grt.Waves is -- Create a hierarchy block. procedure Wave_Put_Hierarchy_Block (Inst : VhpiHandleT; Step : Step_Type; - Wave_Elem : Wave_Opt_File.Elem_Acc); + Wave_Elem : Wave_Opt.Elem_Acc); procedure Wave_Put_Hierarchy_1 - (Inst : VhpiHandleT; Step : Step_Type; Wave_Elem : Wave_Opt_File.Elem_Acc) + (Inst : VhpiHandleT; Step : Step_Type; Wave_Elem : Wave_Opt.Elem_Acc) is Decl_It : VhpiHandleT; Decl : VhpiHandleT; Error : AvhpiErrorT; - Wave_Elem_Child : Wave_Opt_File.Elem_Acc; + Wave_Elem_Child : Wave_Opt.Elem_Acc; begin Vhpi_Iterator (VhpiDecls, Inst, Decl_It, Error); if Error /= AvhpiErrorOk then @@ -940,12 +941,12 @@ package body Grt.Waves is return; end if; - 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 Vhpi_Get_Kind (Decl) is + when VhpiPortDeclK + | VhpiSigDeclK => + Wave_Elem_Child := Get_Cursor + (Wave_Elem, Avhpi_Get_Base_Name (Decl), Is_Signal => True); + if Is_Displayed (Wave_Elem_Child) then case Step is when Step_Name => Create_String_Id (Avhpi_Get_Base_Name (Decl)); @@ -954,12 +955,12 @@ package body Grt.Waves is when Step_Hierarchy => Write_Hierarchy_El (Decl); end case; - --Wave_Put_Name (Decl); - --Wave_Newline; - when others => - null; - end case; - end if; + end if; + --Wave_Put_Name (Decl); + --Wave_Newline; + when others => + null; + end case; end loop; -- No sub-scopes for packages. @@ -984,7 +985,7 @@ package body Grt.Waves is Nbr_Scopes := Nbr_Scopes + 1; - Wave_Elem_Child := Get_Cursor (Avhpi_Get_Base_Name (Decl), Wave_Elem); + Wave_Elem_Child := Get_Cursor (Wave_Elem, Avhpi_Get_Base_Name (Decl)); if Is_Displayed (Wave_Elem_Child) then case Vhpi_Get_Kind (Decl) is when VhpiIfGenerateK @@ -1011,7 +1012,7 @@ package body Grt.Waves is procedure Wave_Put_Hierarchy_Block (Inst : VhpiHandleT; Step : Step_Type; - Wave_Elem : Wave_Opt_File.Elem_Acc) is + Wave_Elem : Wave_Opt.Elem_Acc) is begin case Step is when Step_Name => @@ -1035,7 +1036,7 @@ package body Grt.Waves is Pack_It : VhpiHandleT; Pack : VhpiHandleT; Error : AvhpiErrorT; - Wave_Elem : Wave_Opt_File.Elem_Acc; + Wave_Elem : Wave_Opt.Elem_Acc; begin -- First packages. Get_Package_Inst (Pack_It); @@ -1046,14 +1047,14 @@ package body Grt.Waves is Avhpi_Error (Error); return; end if; - Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Pack), Pkg); + Wave_Elem := Get_Top_Cursor (Pkg, Avhpi_Get_Base_Name (Pack)); if Is_Displayed (Wave_Elem) then Wave_Put_Hierarchy_Block (Pack, Step, Wave_Elem); end if; end loop; -- Then top entity. - Wave_Elem := Get_Top_Cursor (Avhpi_Get_Base_Name (Root), Entity); + Wave_Elem := Get_Top_Cursor (Entity, Avhpi_Get_Base_Name (Root)); if Is_Displayed (Wave_Elem) then Wave_Put_Hierarchy_Block (Root, Step, Wave_Elem); end if; @@ -1577,9 +1578,7 @@ package body Grt.Waves is -- Vcd_Search_Packages; Wave_Put_Hierarchy (Root, Step_Name); - 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 + Wave_Opt.File.Finalize; if Str_Table.Last > 0 then Freeze_Strings; @@ -1591,6 +1590,8 @@ package body Grt.Waves is Write_Known_Types; Write_Hierarchy (Root); + Wave_Opt.Design.Last_Checks; + -- End of header mark. Wave_Section ("EOH" & NUL); |