diff options
author | Tristan Gingold <tgingold@free.fr> | 2019-05-30 10:07:25 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2019-05-30 10:07:25 +0200 |
commit | f771391fd9c0a99e1652209a74c1687c77a7ab35 (patch) | |
tree | e7a995d52b7f61909294f2952d8b900ec1e1e1ee /src/vhdl/vhdl-prints.adb | |
parent | 3bce793cfe3bcf88065acbd1365976782746f5a4 (diff) | |
download | ghdl-f771391fd9c0a99e1652209a74c1687c77a7ab35.tar.gz ghdl-f771391fd9c0a99e1652209a74c1687c77a7ab35.tar.bz2 ghdl-f771391fd9c0a99e1652209a74c1687c77a7ab35.zip |
vhdl: renames disp_vhdl to prints
Diffstat (limited to 'src/vhdl/vhdl-prints.adb')
-rw-r--r-- | src/vhdl/vhdl-prints.adb | 4155 |
1 files changed, 4155 insertions, 0 deletions
diff --git a/src/vhdl/vhdl-prints.adb b/src/vhdl/vhdl-prints.adb new file mode 100644 index 000000000..a97f413ec --- /dev/null +++ b/src/vhdl/vhdl-prints.adb @@ -0,0 +1,4155 @@ +-- VHDL regeneration from internal nodes. +-- Copyright (C) 2002, 2003, 2004, 2005 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GHDL; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +-- Re-print a tree as VHDL sources. Except for comments and parenthesis, the +-- sequence of tokens displayed is the same as the sequence of tokens in the +-- input file. If parenthesis are kept by the parser, the only differences +-- are comments and layout. +with Types; use Types; +with Simple_IO; +with Flags; use Flags; +with Name_Table; +with Str_Table; +with Std_Names; use Std_Names; +with Files_Map; +with Vhdl.Errors; use Vhdl.Errors; +with Vhdl.Utils; use Vhdl.Utils; +with Vhdl.Std_Package; +with PSL.Nodes; +with PSL.Prints; +with PSL.NFAs; +with PSL.Errors; + +package body Vhdl.Prints is + + -- If True, display extra parenthesis to make priority of operators + -- explicit. + Flag_Parenthesis : constant Boolean := False; + + -- If set, disp after a string literal the type enclosed into brackets. + Flag_Disp_String_Literal_Type: constant Boolean := False; + + -- If set, disp implicit declarations. + Flag_Implicit : constant Boolean := False; + + procedure Disp_Type (Ctxt : in out Ctxt_Class; A_Type: Iir); + procedure Disp_Range (Ctxt : in out Ctxt_Class; Rng : Iir); + procedure Print (Ctxt : in out Ctxt_Class; Expr: Iir); + + procedure Disp_Concurrent_Statement (Ctxt : in out Ctxt_Class; Stmt: Iir); + procedure Disp_Concurrent_Statement_Chain + (Ctxt : in out Ctxt_Class; Parent: Iir); + procedure Disp_Declaration_Chain + (Ctxt : in out Ctxt_Class; Parent : Iir); + procedure Disp_Process_Statement (Ctxt : in out Ctxt_Class; Process: Iir); + procedure Disp_Sequential_Statements + (Ctxt : in out Ctxt_Class; First : Iir); + procedure Disp_Choice (Ctxt : in out Ctxt_Class; Choice: in out Iir); + procedure Disp_Association_Chain (Ctxt : in out Ctxt_Class; Chain : Iir); + procedure Disp_Block_Configuration + (Ctxt : in out Ctxt_Class; Block: Iir_Block_Configuration); + procedure Disp_Subprogram_Declaration + (Ctxt : in out Ctxt_Class; Subprg: Iir; Implicit : Boolean := False); + procedure Disp_Binding_Indication + (Ctxt : in out Ctxt_Class; Bind : Iir); + procedure Disp_Subtype_Indication + (Ctxt : in out Ctxt_Class; Def : Iir; Full_Decl : Boolean := False); + procedure Disp_Parametered_Attribute + (Ctxt : in out Ctxt_Class; Name : Name_Id; Expr : Iir); + procedure Disp_String_Literal + (Ctxt : in out Ctxt_Class; Str : Iir; El_Type : Iir); + procedure Disp_Package_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Package_Declaration); + procedure Disp_Package_Instantiation_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir); + procedure Disp_Package_Body (Ctxt : in out Ctxt_Class; Decl: Iir); + procedure Disp_Attribute_Name (Ctxt : in out Ctxt_Class; Attr : Iir); + + procedure Disp_Int64 (Ctxt : in out Ctxt_Class; Val: Int64); + procedure Disp_Int32 (Ctxt : in out Ctxt_Class; Val: Iir_Int32); + procedure Disp_Fp64 (Ctxt : in out Ctxt_Class; Val: Fp64); + + procedure Put (Str : String) is + begin + Simple_IO.Put_Err (Str); + end Put; + + procedure Put (C : Character) is + begin + Put ((1 => C)); + end Put; + + procedure New_Line is + begin + Put (ASCII.LF); + end New_Line; + + procedure Put_Line (Str : String) is + begin + Put (Str); + New_Line; + end Put_Line; + + procedure Disp_Token (Ctxt : in out Ctxt_Class; Tok1, Tok2 : Token_Type) is + begin + Disp_Token (Ctxt, Tok1); + Disp_Token (Ctxt, Tok2); + end Disp_Token; + + procedure Disp_Ident (Ctxt : in out Ctxt_Class; Id: Name_Id) is + begin + if Name_Table.Is_Character (Id) then + Start_Lit (Ctxt, Tok_Character); + Disp_Char (Ctxt, '''); + Disp_Char (Ctxt, Name_Table.Get_Character (Id)); + Disp_Char (Ctxt, '''); + Close_Lit (Ctxt); + else + Start_Lit (Ctxt, Tok_Identifier); + if Id = Null_Identifier then + Disp_Str (Ctxt, "<anonymous>"); + else + Disp_Str (Ctxt, Name_Table.Image (Id)); + end if; + Close_Lit (Ctxt); + end if; + end Disp_Ident; + + function Or_Else (L, R : Iir) return Iir is + begin + if L /= Null_Iir then + return L; + end if; + pragma Assert (R /= Null_Iir); + return R; + end Or_Else; + + -- Disp a literal from the sources (so using exactely the same characters). + procedure Disp_From_Source + (Ctxt : in out Ctxt_Class; + Loc : Location_Type; Len : Int32; Tok : Token_Type) + is + use Files_Map; + pragma Assert (Len > 0); + File : Source_File_Entry; + Pos : Source_Ptr; + Buf : File_Buffer_Acc; + begin + Location_To_File_Pos (Loc, File, Pos); + Buf := Get_File_Source (File); + Start_Lit (Ctxt, Tok); + for I in 1 .. Len loop + Disp_Char (Ctxt, Buf (Pos)); + Pos := Pos + 1; + end loop; + Close_Lit (Ctxt); + end Disp_From_Source; + + procedure Disp_Identifier (Ctxt : in out Ctxt_Class; Node : Iir) + is + use Name_Table; + Id : constant Name_Id := Get_Identifier (Node); + Loc : constant Location_Type := Get_Location (Node); + begin + -- Try to display the one from the sources. + if Id /= Null_Identifier + and then not Is_Character (Id) + and then Loc /= No_Location + and then Loc /= Std_Package.Std_Location + then + Disp_From_Source + (Ctxt, Loc, Int32 (Get_Name_Length (Id)), Tok_Identifier); + else + Disp_Ident (Ctxt, Id); + end if; + end Disp_Identifier; + + procedure Disp_Literal_From_Source + (Ctxt : in out Ctxt_Class; Lit : Iir; Tok : Token_Type) is + begin + Disp_From_Source + (Ctxt, Get_Location (Lit), Get_Literal_Length (Lit), Tok); + end Disp_Literal_From_Source; + + procedure Disp_Function_Name (Ctxt : in out Ctxt_Class; Func: Iir) + is + use Name_Table; + Id: Name_Id; + begin + Id := Get_Identifier (Func); + case Id is + when Name_Id_Operators + | Name_Word_Operators + | Name_Logical_Operators + | Name_Xnor + | Name_Shift_Operators => + Start_Lit (Ctxt, Tok_String); + Disp_Char (Ctxt, '"'); + Disp_Str (Ctxt, Image (Id)); + Disp_Char (Ctxt, '"'); + Close_Lit (Ctxt); + when others => + Disp_Ident (Ctxt, Id); + end case; + end Disp_Function_Name; + + -- Disp the name of DECL. + procedure Disp_Name_Of (Ctxt : in out Ctxt_Class; Decl: Iir) is + begin + case Get_Kind (Decl) is + when Iir_Kind_Component_Declaration + | Iir_Kind_Entity_Declaration + | Iir_Kind_Architecture_Body + | Iir_Kind_Configuration_Declaration + | Iir_Kind_Context_Declaration + | Iir_Kinds_Interface_Object_Declaration + | Iir_Kind_Interface_Type_Declaration + | Iir_Kind_Constant_Declaration + | Iir_Kind_Signal_Declaration + | Iir_Kind_Guard_Signal_Declaration + | Iir_Kind_Variable_Declaration + | Iir_Kind_Type_Declaration + | Iir_Kind_File_Declaration + | Iir_Kind_Subtype_Declaration + | Iir_Kind_Element_Declaration + | Iir_Kind_Record_Element_Constraint + | Iir_Kind_Package_Declaration + | Iir_Kind_Object_Alias_Declaration + | Iir_Kind_Non_Object_Alias_Declaration + | Iir_Kind_Iterator_Declaration + | Iir_Kind_Library_Declaration + | Iir_Kind_Unit_Declaration + | Iir_Kind_Nature_Declaration + | Iir_Kind_Terminal_Declaration + | Iir_Kinds_Quantity_Declaration + | Iir_Kind_Group_Template_Declaration + | Iir_Kind_Character_Literal + | Iir_Kinds_Process_Statement => + Disp_Identifier (Ctxt, Decl); + when Iir_Kind_Anonymous_Type_Declaration => + Start_Lit (Ctxt, Tok_Identifier); + Disp_Char (Ctxt, '<'); + Disp_Str (Ctxt, Name_Table.Image (Get_Identifier (Decl))); + Disp_Char (Ctxt, '>'); + Close_Lit (Ctxt); + when Iir_Kind_Function_Declaration => + Disp_Function_Name (Ctxt, Decl); + when Iir_Kind_Procedure_Declaration => + Disp_Identifier (Ctxt, Decl); + when Iir_Kind_Physical_Subtype_Definition + | Iir_Kind_Enumeration_Type_Definition + | Iir_Kind_Physical_Type_Definition + | Iir_Kind_Record_Type_Definition + | Iir_Kind_Protected_Type_Declaration => + -- Used for 'end' DECL_NAME. + Disp_Identifier (Ctxt, Get_Type_Declarator (Decl)); + when Iir_Kind_Component_Instantiation_Statement => + Disp_Ident (Ctxt, Get_Label (Decl)); + when Iir_Kind_Design_Unit => + Disp_Name_Of (Ctxt, Get_Library_Unit (Decl)); + when Iir_Kind_Enumeration_Literal + | Iir_Kind_Simple_Name => + Disp_Identifier (Ctxt, Decl); + when Iir_Kind_Block_Statement + | Iir_Kind_If_Generate_Statement + | Iir_Kind_Case_Generate_Statement + | Iir_Kind_For_Generate_Statement => + Disp_Ident (Ctxt, Get_Label (Decl)); + when Iir_Kind_Package_Body => + Disp_Identifier (Ctxt, Decl); + when Iir_Kind_Procedure_Body + | Iir_Kind_Function_Body => + Disp_Function_Name (Ctxt, Get_Subprogram_Specification (Decl)); + when Iir_Kind_Protected_Type_Body => + Disp_Identifier (Ctxt, Decl); + when others => + Error_Kind ("disp_name_of", Decl); + end case; + end Disp_Name_Of; + + procedure Disp_Name_Attribute + (Ctxt : in out Ctxt_Class; Attr : Iir; Name : Name_Id) is + begin + Print (Ctxt, Get_Prefix (Attr)); + Disp_Token (Ctxt, Tok_Tick); + Disp_Ident (Ctxt, Name); + end Disp_Name_Attribute; + + procedure Disp_Range (Ctxt : in out Ctxt_Class; Rng : Iir) is + begin + case Get_Kind (Rng) is + when Iir_Kind_Range_Expression => + declare + Origin : constant Iir := Get_Range_Origin (Rng); + begin + if Dump_Origin_Flag and then Origin /= Null_Iir then + Print (Ctxt, Origin); + else + Print (Ctxt, Or_Else (Get_Left_Limit_Expr (Rng), + Get_Left_Limit (Rng))); + if Get_Direction (Rng) = Iir_To then + Disp_Token (Ctxt, Tok_To); + else + Disp_Token (Ctxt, Tok_Downto); + end if; + Print (Ctxt, Or_Else (Get_Right_Limit_Expr (Rng), + Get_Right_Limit (Rng))); + end if; + end; + when Iir_Kind_Range_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Range, Rng); + when Iir_Kind_Reverse_Range_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Reverse_Range, Rng); + when Iir_Kind_Simple_Name + | Iir_Kind_Selected_Name + | Iir_Kind_Attribute_Name + | Iir_Kind_Parenthesis_Name => + Print (Ctxt, Rng); + when others => + Disp_Subtype_Indication (Ctxt, Rng); + -- Disp_Name_Of (Get_Type_Declarator (Decl)); + end case; + end Disp_Range; + + procedure Disp_After_End + (Ctxt : in out Ctxt_Class; + Decl : Iir; Tok1 : Token_Type; Tok2 : Token_Type := Tok_Invalid) is + begin + if Get_End_Has_Reserved_Id (Decl) then + Disp_Token (Ctxt, Tok1); + if Tok2 /= Tok_Invalid then + Disp_Token (Ctxt, Tok2); + end if; + end if; + if Get_End_Has_Identifier (Decl) then + Disp_Name_Of (Ctxt, Decl); + end if; + end Disp_After_End; + + procedure Disp_End_No_Close + (Ctxt : in out Ctxt_Class; + Decl : Iir; Tok1 : Token_Type; Tok2 : Token_Type := Tok_Invalid) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_End); + Disp_After_End (Ctxt, Decl, Tok1, Tok2); + end Disp_End_No_Close; + + procedure Disp_End + (Ctxt : in out Ctxt_Class; + Decl : Iir; Tok1 : Token_Type; Tok2 : Token_Type := Tok_Invalid) is + begin + Disp_End_No_Close (Ctxt, Decl, Tok1, Tok2); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_End; + + procedure Disp_End (Ctxt : in out Ctxt_Class; Tok1 : Token_Type) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_End); + Disp_Token (Ctxt, Tok1); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_End; + + procedure Disp_End_Label_No_Close + (Ctxt : in out Ctxt_Class; Stmt : Iir; Tok : Token_Type) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_End); + Disp_Token (Ctxt, Tok); + if Get_End_Has_Identifier (Stmt) then + Disp_Ident (Ctxt, Get_Label (Stmt)); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + end Disp_End_Label_No_Close; + + procedure Disp_End_Label + (Ctxt : in out Ctxt_Class; Stmt : Iir; Tok : Token_Type) is + begin + Disp_End_Label_No_Close (Ctxt, Stmt, Tok); + Close_Hbox (Ctxt); + end Disp_End_Label; + + procedure Disp_Use_Clause (Ctxt : in out Ctxt_Class; Clause: Iir_Use_Clause) + is + Name : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Use); + Name := Clause; + loop + Print (Ctxt, Get_Selected_Name (Name)); + Name := Get_Use_Clause_Chain (Name); + exit when Name = Null_Iir; + Disp_Token (Ctxt, Tok_Comma); + end loop; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Use_Clause; + + -- Disp the resolution function (if any) of type definition DEF. + procedure Disp_Resolution_Indication + (Ctxt : in out Ctxt_Class; Subtype_Def: Iir) + is + procedure Inner (Ind : Iir) is + begin + case Get_Kind (Ind) is + when Iir_Kinds_Denoting_Name => + Print (Ctxt, Ind); + when Iir_Kind_Array_Element_Resolution => + declare + Res : constant Iir := Get_Resolution_Indication (Ind); + begin + Disp_Token (Ctxt, Tok_Left_Paren); + if Is_Valid (Res) then + Inner (Res); + else + Print (Ctxt, Get_Resolution_Indication + (Get_Element_Subtype_Indication (Ind))); + end if; + Disp_Token (Ctxt, Tok_Right_Paren); + end; + when others => + Error_Kind ("disp_resolution_indication", Ind); + end case; + end Inner; + + Ind : Iir; + begin + case Get_Kind (Subtype_Def) is + when Iir_Kind_Access_Subtype_Definition => + -- No resolution indication on access subtype. + return; + when others => + Ind := Get_Resolution_Indication (Subtype_Def); + if Ind = Null_Iir then + -- No resolution indication. + return; + end if; + end case; + + if False then + declare + Type_Mark : constant Iir := Get_Denoted_Type_Mark (Subtype_Def); + begin + if Get_Kind (Type_Mark) in Iir_Kinds_Subtype_Definition + and then Get_Resolution_Indication (Type_Mark) = Ind + then + -- Resolution indication was inherited from the type_mark. + return; + end if; + end; + end if; + + Inner (Ind); + end Disp_Resolution_Indication; + + procedure Disp_Element_Constraint + (Ctxt : in out Ctxt_Class; Def : Iir; Type_Mark : Iir); + + procedure Disp_Array_Element_Constraint + (Ctxt : in out Ctxt_Class; Def : Iir; Type_Mark : Iir) + is + Def_El : constant Iir := Get_Element_Subtype (Def); + Tm_El : constant Iir := Get_Element_Subtype (Type_Mark); + Has_Index : constant Boolean := Get_Index_Constraint_Flag (Def); + Has_Own_Element_Subtype : constant Boolean := Def_El /= Tm_El; + Indexes : Iir_Flist; + Index : Iir; + begin + if not Has_Index and not Has_Own_Element_Subtype then + return; + end if; + + if Get_Constraint_State (Type_Mark) /= Fully_Constrained + and then Has_Index + then + Indexes := Get_Index_Constraint_List (Def); + if Indexes = Null_Iir_Flist then + Indexes := Get_Index_Subtype_List (Def); + end if; + Disp_Token (Ctxt, Tok_Left_Paren); + for I in Flist_First .. Flist_Last (Indexes) loop + Index := Get_Nth_Element (Indexes, I); + if I /= 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + --Print (Get_Range_Constraint (Index)); + Disp_Range (Ctxt, Index); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + + if Has_Own_Element_Subtype + and then Get_Kind (Def_El) in Iir_Kinds_Composite_Type_Definition + then + Disp_Element_Constraint (Ctxt, Def_El, Tm_El); + end if; + end Disp_Array_Element_Constraint; + + procedure Disp_Record_Element_Constraint + (Ctxt : in out Ctxt_Class; Def : Iir) + is + El_List : constant Iir_Flist := Get_Elements_Declaration_List (Def); + El : Iir; + Has_El : Boolean := False; + begin + for I in Flist_First .. Flist_Last (El_List) loop + El := Get_Nth_Element (El_List, I); + if Get_Kind (El) = Iir_Kind_Record_Element_Constraint + and then Get_Parent (El) = Def + then + if Has_El then + Disp_Token (Ctxt, Tok_Comma); + else + Disp_Token (Ctxt, Tok_Left_Paren); + Has_El := True; + end if; + Disp_Name_Of (Ctxt, El); + Disp_Element_Constraint (Ctxt, Get_Type (El), + Get_Base_Type (Get_Type (El))); + end if; + end loop; + if Has_El then + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + end Disp_Record_Element_Constraint; + + procedure Disp_Element_Constraint + (Ctxt : in out Ctxt_Class; Def : Iir; Type_Mark : Iir) is + begin + case Get_Kind (Def) is + when Iir_Kind_Record_Subtype_Definition => + Disp_Record_Element_Constraint (Ctxt, Def); + when Iir_Kind_Array_Subtype_Definition => + Disp_Array_Element_Constraint (Ctxt, Def, Type_Mark); + when others => + Error_Kind ("disp_element_constraint", Def); + end case; + end Disp_Element_Constraint; + + procedure Disp_Tolerance_Opt (Ctxt : in out Ctxt_Class; N : Iir) + is + Tol : constant Iir := Get_Tolerance (N); + begin + if Tol /= Null_Iir then + Disp_Token (Ctxt, Tok_Tolerance); + Print (Ctxt, Tol); + end if; + end Disp_Tolerance_Opt; + + procedure Disp_Subtype_Indication + (Ctxt : in out Ctxt_Class; Def : Iir; Full_Decl : Boolean := False) + is + Type_Mark : Iir; + Base_Type : Iir; + Decl : Iir; + begin + case Get_Kind (Def) is + when Iir_Kinds_Denoting_Name + | Iir_Kind_Subtype_Attribute + | Iir_Kind_Attribute_Name => + Print (Ctxt, Def); + return; + when others => + null; + end case; + + Decl := Get_Type_Declarator (Def); + if not Full_Decl and then Decl /= Null_Iir then + Disp_Name_Of (Ctxt, Decl); + return; + end if; + + -- Resolution function name. + Disp_Resolution_Indication (Ctxt, Def); + + -- type mark. + Type_Mark := Get_Subtype_Type_Mark (Def); + if Type_Mark /= Null_Iir then + Print (Ctxt, Type_Mark); + Type_Mark := Get_Type (Type_Mark); + end if; + + case Get_Kind (Def) is + when Iir_Kind_Array_Subtype_Definition => + Disp_Array_Element_Constraint + (Ctxt, Def, Or_Else (Type_Mark, Def)); + when Iir_Kind_Subtype_Definition => + declare + Rng : constant Iir := Get_Range_Constraint (Def); + begin + if Rng /= Null_Iir then + Disp_Token (Ctxt, Tok_Range); + Print (Ctxt, Get_Range_Constraint (Def)); + end if; + Disp_Tolerance_Opt (Ctxt, Def); + end; + when others => + Base_Type := Get_Base_Type (Def); + case Get_Kind (Base_Type) is + when Iir_Kind_Integer_Type_Definition + | Iir_Kind_Enumeration_Type_Definition + | Iir_Kind_Floating_Type_Definition + | Iir_Kind_Physical_Type_Definition => + if Type_Mark = Null_Iir + or else Get_Range_Constraint (Def) + /= Get_Range_Constraint (Type_Mark) + then + if Type_Mark /= Null_Iir then + Disp_Token (Ctxt, Tok_Range); + end if; + Print (Ctxt, Get_Range_Constraint (Def)); + end if; + if Get_Kind (Base_Type) = Iir_Kind_Floating_Type_Definition + then + Disp_Tolerance_Opt (Ctxt, Def); + end if; + when Iir_Kind_Access_Type_Definition => + declare + Des_Ind : constant Iir := + Get_Designated_Subtype_Indication (Def); + begin + if Des_Ind /= Null_Iir then + pragma Assert (Get_Kind (Des_Ind) + = Iir_Kind_Array_Subtype_Definition); + Disp_Array_Element_Constraint + (Ctxt, Des_Ind, Get_Designated_Type (Base_Type)); + end if; + end; + when Iir_Kind_Array_Type_Definition => + Disp_Array_Element_Constraint + (Ctxt, Def, Or_Else (Type_Mark, Def)); + when Iir_Kind_Record_Type_Definition => + Disp_Record_Element_Constraint (Ctxt, Def); + when others => + Error_Kind ("disp_subtype_indication", Base_Type); + end case; + end case; + end Disp_Subtype_Indication; + + procedure Disp_Enumeration_Type_Definition + (Ctxt : in out Ctxt_Class; Def: Iir_Enumeration_Type_Definition) + is + Lits : constant Iir_Flist := Get_Enumeration_Literal_List (Def); + A_Lit: Iir; --Enumeration_Literal_Acc; + begin + Disp_Token (Ctxt, Tok_Left_Paren); + for I in Flist_First .. Flist_Last (Lits) loop + A_Lit := Get_Nth_Element (Lits, I); + if I > 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + Disp_Name_Of (Ctxt, A_Lit); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren); + end Disp_Enumeration_Type_Definition; + + procedure Disp_Discrete_Range + (Ctxt : in out Ctxt_Class; Iterator: Iir) is + begin + if Get_Kind (Iterator) in Iir_Kinds_Subtype_Definition then + Disp_Subtype_Indication (Ctxt, Iterator); + else + Disp_Range (Ctxt, Iterator); + end if; + end Disp_Discrete_Range; + + procedure Disp_Array_Type_Definition + (Ctxt : in out Ctxt_Class; Def: Iir_Array_Type_Definition) + is + Indexes : Iir_Flist; + Index: Iir; + begin + Indexes := Get_Index_Subtype_Definition_List (Def); + if Indexes = Null_Iir_Flist then + Indexes := Get_Index_Subtype_List (Def); + end if; + Disp_Token (Ctxt, Tok_Array, Tok_Left_Paren); + for I in Flist_First .. Flist_Last (Indexes) loop + Index := Get_Nth_Element (Indexes, I); + if I /= 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + Print (Ctxt, Index); + Disp_Token (Ctxt, Tok_Range, Tok_Box); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren, Tok_Of); + Disp_Subtype_Indication (Ctxt, Get_Element_Subtype_Indication (Def)); + end Disp_Array_Type_Definition; + + procedure Disp_Physical_Literal (Ctxt : in out Ctxt_Class; Lit: Iir) + is + Len : constant Int32 := Get_Literal_Length (Lit); + Unit : Iir; + begin + case Iir_Kinds_Physical_Literal (Get_Kind (Lit)) is + when Iir_Kind_Physical_Int_Literal => + if Len /= 0 then + Disp_Literal_From_Source (Ctxt, Lit, Tok_Integer); + else + Disp_Int64 (Ctxt, Get_Value (Lit)); + end if; + when Iir_Kind_Physical_Fp_Literal => + if Len /= 0 then + Disp_Literal_From_Source (Ctxt, Lit, Tok_Real); + else + Disp_Fp64 (Ctxt, Get_Fp_Value (Lit)); + end if; + end case; + + Unit := Get_Unit_Name (Lit); + if Is_Valid (Unit) then + -- No unit in range_constraint of physical type declaration. + Print (Ctxt, Unit); + end if; + end Disp_Physical_Literal; + + procedure Disp_Record_Type_Definition + (Ctxt : in out Ctxt_Class; Def: Iir_Record_Type_Definition) + is + List : constant Iir_Flist := Get_Elements_Declaration_List (Def); + El: Iir_Element_Declaration; + El_Subtype : Iir; + Reindent : Boolean; + begin + Disp_Token (Ctxt, Tok_Record); + Close_Hbox (Ctxt); + Reindent := True; + Start_Vbox (Ctxt); + for I in Flist_First .. Flist_Last (List) loop + El := Get_Nth_Element (List, I); + if Reindent then + El_Subtype := Get_Subtype_Indication (El); + Start_Hbox (Ctxt); + end if; + Disp_Identifier (Ctxt, El); + if Get_Has_Identifier_List (El) then + Disp_Token (Ctxt, Tok_Comma); + Reindent := False; + else + Disp_Token (Ctxt, Tok_Colon); + Disp_Subtype_Indication (Ctxt, Or_Else (El_Subtype, + Get_Type (El))); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + Reindent := True; + end if; + end loop; + Close_Vbox (Ctxt); + Disp_End_No_Close (Ctxt, Def, Tok_Record); + end Disp_Record_Type_Definition; + + procedure Disp_Designator_List (Ctxt : in out Ctxt_Class; List: Iir_List) + is + El : Iir; + It : List_Iterator; + Is_First : Boolean; + begin + case List is + when Null_Iir_List => + null; + when Iir_List_All => + Disp_Token (Ctxt, Tok_All); + when others => + It := List_Iterate (List); + Is_First := True; + while Is_Valid (It) loop + El := Get_Element (It); + if not Is_First then + Disp_Token (Ctxt, Tok_Comma); + else + Is_First := False; + end if; + Print (Ctxt, El); + Next (It); + end loop; + end case; + end Disp_Designator_List; + + procedure Disp_Array_Subtype_Definition + (Ctxt : in out Ctxt_Class; Def : Iir; El_Def : Iir) + is + Indexes : Iir_Flist; + Index : Iir; + begin + Indexes := Get_Index_Constraint_List (Def); + if Indexes = Null_Iir_Flist then + Indexes := Get_Index_Subtype_List (Def); + end if; + Disp_Token (Ctxt, Tok_Array, Tok_Left_Paren); + for I in Flist_First .. Flist_Last (Indexes) loop + Index := Get_Nth_Element (Indexes, I); + if I /= 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + Disp_Discrete_Range (Ctxt, Index); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren, Tok_Of); + Disp_Subtype_Indication (Ctxt, El_Def); + end Disp_Array_Subtype_Definition; + + -- Display the full definition of a type, ie the sequence that can create + -- such a type. + procedure Disp_Type_Definition (Ctxt : in out Ctxt_Class; Def: Iir) is + begin + case Get_Kind (Def) is + when Iir_Kind_Enumeration_Type_Definition => + Disp_Enumeration_Type_Definition (Ctxt, Def); + when Iir_Kind_Array_Type_Definition => + Disp_Array_Type_Definition (Ctxt, Def); + when Iir_Kind_Array_Subtype_Definition => + Disp_Array_Subtype_Definition + (Ctxt, Def, Get_Element_Subtype (Get_Base_Type (Def))); + when Iir_Kind_Record_Type_Definition => + Disp_Record_Type_Definition (Ctxt, Def); + when Iir_Kind_Access_Type_Definition => + Disp_Token (Ctxt, Tok_Access); + Disp_Subtype_Indication + (Ctxt, Get_Designated_Subtype_Indication (Def)); + when Iir_Kind_File_Type_Definition => + Disp_Token (Ctxt, Tok_File, Tok_Of); + Disp_Subtype_Indication (Ctxt, Get_File_Type_Mark (Def)); + when Iir_Kind_Protected_Type_Declaration => + Disp_Token (Ctxt, Tok_Protected); + Close_Hbox (Ctxt); + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Def); + Close_Vbox (Ctxt); + Disp_End_No_Close (Ctxt, Def, Tok_Protected); + when Iir_Kind_Attribute_Name + | Iir_Kind_Range_Expression + | Iir_Kind_Parenthesis_Name => + Disp_Token (Ctxt, Tok_Range); + Print (Ctxt, Def); + when others => + Error_Kind ("disp_type_definition", Def); + end case; + end Disp_Type_Definition; + + procedure Disp_Type_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Type_Declaration) + is + Def : constant Iir := Get_Type_Definition (Decl); + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Type); + Disp_Name_Of (Ctxt, Decl); + if Def /= Null_Iir + and then Get_Kind (Def) /= Iir_Kind_Incomplete_Type_Definition + then + Disp_Token (Ctxt, Tok_Is); + Disp_Type_Definition (Ctxt, Def); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Type_Declaration; + + procedure Disp_Physical_Type_Definition + (Ctxt : in out Ctxt_Class; Decl : Iir) + is + Def : constant Iir := Get_Type_Definition (Decl); + St : constant Iir := Get_Subtype_Definition (Decl); + Unit : Iir_Unit_Declaration; + Rng : Iir; + begin + Disp_Token (Ctxt, Tok_Range); + Rng := Or_Else (St, Def); + Print (Ctxt, Get_Range_Constraint (Rng)); + Disp_Token (Ctxt, Tok_Units); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Unit := Get_Unit_Chain (Def); + Start_Hbox (Ctxt); + Disp_Identifier (Ctxt, Unit); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + Unit := Get_Chain (Unit); + while Unit /= Null_Iir loop + Start_Hbox (Ctxt); + Disp_Identifier (Ctxt, Unit); + Disp_Token (Ctxt, Tok_Equal); + Print (Ctxt, Get_Physical_Literal (Unit)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + Unit := Get_Chain (Unit); + end loop; + Close_Vbox (Ctxt); + Disp_End_No_Close (Ctxt, Def, Tok_Units); + end Disp_Physical_Type_Definition; + + procedure Disp_Anonymous_Type_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Anonymous_Type_Declaration) + is + Def : constant Iir := Get_Type_Definition (Decl); + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Type); + Disp_Identifier (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + case Get_Kind (Def) is + when Iir_Kind_Array_Type_Definition => + Disp_Array_Subtype_Definition + (Ctxt, Get_Subtype_Definition (Decl), + Get_Element_Subtype_Indication (Def)); + when Iir_Kind_Array_Subtype_Definition => + Disp_Array_Subtype_Definition + (Ctxt, Def, Get_Array_Element_Constraint (Def)); + when Iir_Kind_Physical_Type_Definition => + Disp_Physical_Type_Definition (Ctxt, Decl); + when Iir_Kind_Floating_Type_Definition + | Iir_Kind_Integer_Type_Definition => + declare + St : constant Iir := Get_Subtype_Definition (Decl); + begin + Disp_Token (Ctxt, Tok_Range); + Print (Ctxt, Get_Range_Constraint (St)); + end; + when others => + Disp_Type_Definition (Ctxt, Def); + end case; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Anonymous_Type_Declaration; + + procedure Disp_Subtype_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Subtype_Declaration) + is + Def : constant Iir := Get_Type (Decl); + begin + -- If the subtype declaration was implicit (added because of a type + -- declaration), put it as a comment. + if Def /= Null_Iir + and then + (Get_Identifier (Decl) + = Get_Identifier (Get_Type_Declarator (Get_Base_Type (Def)))) + then + if Flag_Implicit then + Put ("-- "); + else + return; + end if; + end if; + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Subtype); + Disp_Name_Of (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Disp_Subtype_Indication + (Ctxt, Or_Else (Get_Subtype_Indication (Decl), Get_Type (Decl)), True); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Subtype_Declaration; + + procedure Disp_Type (Ctxt : in out Ctxt_Class; A_Type: Iir) + is + Decl: Iir; + begin + Decl := Get_Type_Declarator (A_Type); + if Decl /= Null_Iir then + Disp_Name_Of (Ctxt, Decl); + else + case Get_Kind (A_Type) is + when Iir_Kind_Enumeration_Type_Definition + | Iir_Kind_Integer_Type_Definition => + raise Program_Error; + when Iir_Kind_Integer_Subtype_Definition + | Iir_Kind_Enumeration_Subtype_Definition + | Iir_Kind_Access_Subtype_Definition => + Disp_Subtype_Indication (Ctxt, A_Type); + when Iir_Kind_Array_Subtype_Definition => + Disp_Subtype_Indication (Ctxt, A_Type); + when others => + Error_Kind ("disp_type", A_Type); + end case; + end if; + end Disp_Type; + + procedure Disp_Nature_Definition (Ctxt : in out Ctxt_Class; Def : Iir) is + begin + case Get_Kind (Def) is + when Iir_Kind_Scalar_Nature_Definition => + Disp_Subtype_Indication (Ctxt, Get_Across_Type (Def)); + Disp_Token (Ctxt, Tok_Across); + Disp_Subtype_Indication (Ctxt, Get_Through_Type (Def)); + Disp_Token (Ctxt, Tok_Through); + Disp_Name_Of (Ctxt, Get_Reference (Def)); + Disp_Token (Ctxt, Tok_Reference); + when others => + Error_Kind ("disp_nature_definition", Def); + end case; + end Disp_Nature_Definition; + + procedure Disp_Nature_Declaration (Ctxt : in out Ctxt_Class; Decl : Iir) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Nature); + Disp_Name_Of (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Disp_Nature_Definition (Ctxt, Get_Nature (Decl)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Nature_Declaration; + + procedure Disp_Subnature_Indication (Ctxt : in out Ctxt_Class; Ind : Iir) + is + Decl: Iir; + begin + case Get_Kind (Ind) is + when Iir_Kinds_Denoting_Name + | Iir_Kind_Subtype_Attribute + | Iir_Kind_Attribute_Name => + Print (Ctxt, Ind); + return; + when others => + null; + end case; + + Decl := Get_Nature_Declarator (Ind); + if Decl /= Null_Iir then + Disp_Name_Of (Ctxt, Decl); + else + Error_Kind ("disp_subnature_indication", Ind); + end if; + end Disp_Subnature_Indication; + + procedure Disp_Mode (Ctxt : in out Ctxt_Class; Mode: Iir_Mode) is + begin + case Mode is + when Iir_In_Mode => + Disp_Token (Ctxt, Tok_In); + when Iir_Out_Mode => + Disp_Token (Ctxt, Tok_Out); + when Iir_Inout_Mode => + Disp_Token (Ctxt, Tok_Inout); + when Iir_Buffer_Mode => + Disp_Token (Ctxt, Tok_Buffer); + when Iir_Linkage_Mode => + Disp_Token (Ctxt, Tok_Linkage); + when Iir_Unknown_Mode => + Put ("<unknown> "); + end case; + end Disp_Mode; + + procedure Disp_Signal_Kind (Ctxt : in out Ctxt_Class; Sig : Iir) is + begin + if Get_Guarded_Signal_Flag (Sig) then + case Get_Signal_Kind (Sig) is + when Iir_Register_Kind => + Disp_Token (Ctxt, Tok_Register); + when Iir_Bus_Kind => + Disp_Token (Ctxt, Tok_Bus); + end case; + end if; + end Disp_Signal_Kind; + + procedure Disp_Interface_Class (Ctxt : in out Ctxt_Class; Inter: Iir) is + begin + if Get_Has_Class (Inter) then + case Get_Kind (Inter) is + when Iir_Kind_Interface_Signal_Declaration => + Disp_Token (Ctxt, Tok_Signal); + when Iir_Kind_Interface_Variable_Declaration => + Disp_Token (Ctxt, Tok_Variable); + when Iir_Kind_Interface_Constant_Declaration => + Disp_Token (Ctxt, Tok_Constant); + when Iir_Kind_Interface_File_Declaration => + Disp_Token (Ctxt, Tok_File); + when others => + Error_Kind ("disp_interface_class", Inter); + end case; + end if; + end Disp_Interface_Class; + + procedure Disp_Interface_Mode_And_Type + (Ctxt : in out Ctxt_Class; Inter: Iir) + is + Default: constant Iir := Get_Default_Value (Inter); + Ind : constant Iir := Get_Subtype_Indication (Inter); + begin + Disp_Token (Ctxt, Tok_Colon); + if Get_Has_Mode (Inter) then + Disp_Mode (Ctxt, Get_Mode (Inter)); + end if; + if Ind = Null_Iir then + -- For implicit subprogram + Disp_Type (Ctxt, Get_Type (Inter)); + else + Disp_Subtype_Indication (Ctxt, Get_Subtype_Indication (Inter)); + end if; + if Get_Kind (Inter) = Iir_Kind_Interface_Signal_Declaration then + Disp_Signal_Kind (Ctxt, Inter); + end if; + if Default /= Null_Iir then + Disp_Token (Ctxt, Tok_Assign); + Print (Ctxt, Default); + end if; + end Disp_Interface_Mode_And_Type; + + -- Disp interfaces, followed by END_STR (';' in general). + procedure Disp_Interface_Chain (Ctxt : in out Ctxt_Class; Chain: Iir) + is + Inter: Iir; + Next_Inter : Iir; + First_Inter : Iir; + begin + if Chain = Null_Iir then + return; + end if; + Disp_Token (Ctxt, Tok_Left_Paren); + + Inter := Chain; + loop + Next_Inter := Get_Chain (Inter); + + First_Inter := Inter; + + case Get_Kind (Inter) is + when Iir_Kinds_Interface_Object_Declaration => + Disp_Interface_Class (Ctxt, Inter); + Disp_Name_Of (Ctxt, Inter); + while Get_Has_Identifier_List (Inter) loop + Disp_Token (Ctxt, Tok_Comma); + Inter := Next_Inter; + Next_Inter := Get_Chain (Inter); + Disp_Name_Of (Ctxt, Inter); + end loop; + Disp_Interface_Mode_And_Type (Ctxt, First_Inter); + when Iir_Kind_Interface_Package_Declaration => + Disp_Token (Ctxt, Tok_Package); + Disp_Identifier (Ctxt, Inter); + Disp_Token (Ctxt, Tok_Is, Tok_New); + Print (Ctxt, Get_Uninstantiated_Package_Name (Inter)); + Disp_Token (Ctxt, Tok_Generic, Tok_Map); + declare + Assoc_Chain : constant Iir := + Get_Generic_Map_Aspect_Chain (Inter); + begin + if Assoc_Chain = Null_Iir then + Disp_Token (Ctxt, Tok_Left_Paren); + Disp_Token (Ctxt, Tok_Box); + Disp_Token (Ctxt, Tok_Right_Paren); + else + Disp_Association_Chain (Ctxt, Assoc_Chain); + end if; + end; + when Iir_Kind_Interface_Type_Declaration => + Disp_Token (Ctxt, Tok_Type); + Disp_Identifier (Ctxt, Inter); + when Iir_Kinds_Interface_Subprogram_Declaration => + Disp_Subprogram_Declaration (Ctxt, Inter); + when others => + Error_Kind ("disp_interface_chain", Inter); + end case; + + exit when Next_Inter = Null_Iir; + Disp_Token (Ctxt, Tok_Semi_Colon); + + Inter := Next_Inter; + Next_Inter := Get_Chain (Inter); + end loop; + + Disp_Token (Ctxt, Tok_Right_Paren); + end Disp_Interface_Chain; + + procedure Disp_Ports (Ctxt : in out Ctxt_Class; Parent : Iir) + is + Ports : constant Iir := Get_Port_Chain (Parent); + begin + if Ports /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Port); + Disp_Interface_Chain (Ctxt, Ports); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + end Disp_Ports; + + procedure Disp_Generics (Ctxt : in out Ctxt_Class; Parent : Iir) + is + Generics : constant Iir := Get_Generic_Chain (Parent); + begin + if Generics /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Generic); + Disp_Interface_Chain (Ctxt, Generics); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + end Disp_Generics; + + procedure Disp_Entity_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Entity_Declaration) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Entity); + Disp_Name_Of (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Generics (Ctxt, Decl); + Disp_Ports (Ctxt, Decl); + Disp_Declaration_Chain (Ctxt, Decl); + Close_Vbox (Ctxt); + + if Get_Has_Begin (Decl) then + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Begin); + Close_Hbox (Ctxt); + end if; + if Get_Concurrent_Statement_Chain (Decl) /= Null_Iir then + Start_Vbox (Ctxt); + Disp_Concurrent_Statement_Chain (Ctxt, Decl); + Close_Vbox (Ctxt); + end if; + Disp_End (Ctxt, Decl, Tok_Entity); + end Disp_Entity_Declaration; + + procedure Disp_Component_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Component_Declaration) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Component); + Disp_Name_Of (Ctxt, Decl); + if Get_Has_Is (Decl) then + Disp_Token (Ctxt, Tok_Is); + end if; + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + if Get_Generic_Chain (Decl) /= Null_Iir then + Disp_Generics (Ctxt, Decl); + end if; + if Get_Port_Chain (Decl) /= Null_Iir then + Disp_Ports (Ctxt, Decl); + end if; + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Decl, Tok_Component); + end Disp_Component_Declaration; + + procedure Disp_Concurrent_Statement_Chain + (Ctxt : in out Ctxt_Class; Parent : Iir) + is + El: Iir; + begin + El := Get_Concurrent_Statement_Chain (Parent); + while El /= Null_Iir loop + Disp_Concurrent_Statement (Ctxt, El); + El := Get_Chain (El); + end loop; + end Disp_Concurrent_Statement_Chain; + + procedure Disp_Architecture_Body + (Ctxt : in out Ctxt_Class; Arch: Iir_Architecture_Body) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Architecture); + Disp_Name_Of (Ctxt, Arch); + Disp_Token (Ctxt, Tok_Of); + Print (Ctxt, Get_Entity_Name (Arch)); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Arch); + Close_Vbox (Ctxt); + + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Begin); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Concurrent_Statement_Chain (Ctxt, Arch); + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Arch, Tok_Architecture); + end Disp_Architecture_Body; + + procedure Disp_Signature (Ctxt : in out Ctxt_Class; Sig : Iir) + is + Prefix : constant Iir := Get_Signature_Prefix (Sig); + List : constant Iir_Flist := Get_Type_Marks_List (Sig); + El : Iir; + begin + if Is_Valid (Prefix) then + -- Only in alias. + Print (Ctxt, Prefix); + end if; + Disp_Token (Ctxt, Tok_Left_Bracket); + if List /= Null_Iir_Flist then + for I in Flist_First .. Flist_Last (List) loop + El := Get_Nth_Element (List, I); + if I /= 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + Print (Ctxt, El); + end loop; + end if; + El := Get_Return_Type_Mark (Sig); + if El /= Null_Iir then + Disp_Token (Ctxt, Tok_Return); + Print (Ctxt, El); + end if; + Disp_Token (Ctxt, Tok_Right_Bracket); + end Disp_Signature; + + procedure Disp_Object_Alias_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Object_Alias_Declaration) + is + St_Ind : constant Iir := Get_Subtype_Indication (Decl); + Atype : constant Iir := Get_Type (Decl); + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Alias); + Disp_Function_Name (Ctxt, Decl); + if St_Ind /= Null_Iir or else Atype /= Null_Iir then + Disp_Token (Ctxt, Tok_Colon); + Disp_Subtype_Indication (Ctxt, Or_Else (St_Ind, Atype)); + end if; + Disp_Token (Ctxt, Tok_Is); + Print (Ctxt, Get_Name (Decl)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Object_Alias_Declaration; + + procedure Disp_Non_Object_Alias_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Non_Object_Alias_Declaration) + is + Sig : constant Iir := Get_Alias_Signature (Decl); + begin + if Get_Implicit_Alias_Flag (Decl) then + if Flag_Implicit then + Put ("-- "); + else + return; + end if; + end if; + + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Alias); + Disp_Function_Name (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Print (Ctxt, Get_Name (Decl)); + if Sig /= Null_Iir then + Disp_Signature (Ctxt, Sig); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Non_Object_Alias_Declaration; + + procedure Disp_File_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_File_Declaration) + is + Next_Decl : Iir; + Expr: Iir; + begin + Disp_Token (Ctxt, Tok_File); + Disp_Name_Of (Ctxt, Decl); + Next_Decl := Decl; + while Get_Has_Identifier_List (Next_Decl) loop + Next_Decl := Get_Chain (Next_Decl); + Disp_Token (Ctxt, Tok_Comma); + Disp_Name_Of (Ctxt, Next_Decl); + end loop; + Disp_Token (Ctxt, Tok_Colon); + Disp_Subtype_Indication (Ctxt, Or_Else (Get_Subtype_Indication (Decl), + Get_Type (Decl))); + if Vhdl_Std = Vhdl_87 then + Disp_Token (Ctxt, Tok_Is); + if Get_Has_Mode (Decl) then + Disp_Mode (Ctxt, Get_Mode (Decl)); + end if; + Print (Ctxt, Get_File_Logical_Name (Decl)); + else + Expr := Get_File_Open_Kind (Decl); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Open); + Print (Ctxt, Expr); + end if; + Expr := Get_File_Logical_Name (Decl); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Is); + Print (Ctxt, Expr); + end if; + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + end Disp_File_Declaration; + + procedure Disp_Quantity_Declaration (Ctxt : in out Ctxt_Class; Decl: Iir) + is + Expr : Iir; + Term : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Quantity); + Disp_Name_Of (Ctxt, Decl); + + case Get_Kind (Decl) is + when Iir_Kinds_Branch_Quantity_Declaration => + Disp_Tolerance_Opt (Ctxt, Decl); + Expr := Get_Default_Value (Decl); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Assign); + Print (Ctxt, Expr); + end if; + if Get_Kind (Decl) = Iir_Kind_Across_Quantity_Declaration then + Disp_Token (Ctxt, Tok_Across); + else + Disp_Token (Ctxt, Tok_Through); + end if; + Disp_Name_Of (Ctxt, Get_Plus_Terminal (Decl)); + Term := Get_Minus_Terminal (Decl); + if Term /= Null_Iir then + Disp_Token (Ctxt, Tok_To); + Disp_Name_Of (Ctxt, Term); + end if; + when Iir_Kind_Free_Quantity_Declaration => + Disp_Token (Ctxt, Tok_Colon); + Disp_Subtype_Indication + (Ctxt, Or_Else (Get_Subtype_Indication (Decl), Get_Type (Decl))); + Expr := Get_Default_Value (Decl); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Assign); + Print (Ctxt, Expr); + end if; + when others => + raise Program_Error; + end case; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Quantity_Declaration; + + procedure Disp_Terminal_Declaration (Ctxt : in out Ctxt_Class; Decl: Iir) + is + Ndecl : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Terminal); + Disp_Name_Of (Ctxt, Decl); + Ndecl := Decl; + while Get_Has_Identifier_List (Ndecl) loop + Disp_Token (Ctxt, Tok_Comma); + Ndecl := Get_Chain (Ndecl); + Disp_Name_Of (Ctxt, Ndecl); + end loop; + Disp_Token (Ctxt, Tok_Colon); + Disp_Subnature_Indication (Ctxt, Get_Nature (Decl)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Terminal_Declaration; + + procedure Disp_Object_Declaration (Ctxt : in out Ctxt_Class; Decl: Iir) + is + Next_Decl : Iir; + begin + Start_Hbox (Ctxt); + case Get_Kind (Decl) is + when Iir_Kind_Variable_Declaration => + if Get_Shared_Flag (Decl) then + Disp_Token (Ctxt, Tok_Shared); + end if; + Disp_Token (Ctxt, Tok_Variable); + when Iir_Kind_Constant_Declaration => + Disp_Token (Ctxt, Tok_Constant); + when Iir_Kind_Signal_Declaration => + Disp_Token (Ctxt, Tok_Signal); + when Iir_Kind_File_Declaration => + Disp_File_Declaration (Ctxt, Decl); + Close_Hbox (Ctxt); + return; + when others => + raise Internal_Error; + end case; + Disp_Name_Of (Ctxt, Decl); + Next_Decl := Decl; + while Get_Has_Identifier_List (Next_Decl) loop + Next_Decl := Get_Chain (Next_Decl); + Disp_Token (Ctxt, Tok_Comma); + Disp_Name_Of (Ctxt, Next_Decl); + end loop; + Disp_Token (Ctxt, Tok_Colon); + Disp_Subtype_Indication (Ctxt, Get_Subtype_Indication (Decl)); + if Get_Kind (Decl) = Iir_Kind_Signal_Declaration then + Disp_Signal_Kind (Ctxt, Decl); + end if; + + if Get_Default_Value (Decl) /= Null_Iir then + Disp_Token (Ctxt, Tok_Assign); + Print (Ctxt, Get_Default_Value (Decl)); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Object_Declaration; + + procedure Disp_Pure (Ctxt : in out Ctxt_Class; Subprg : Iir) is + begin + if Get_Pure_Flag (Subprg) then + Disp_Token (Ctxt, Tok_Pure); + else + Disp_Token (Ctxt, Tok_Impure); + end if; + end Disp_Pure; + + procedure Disp_Subprogram_Declaration + (Ctxt : in out Ctxt_Class; Subprg: Iir; Implicit : Boolean := False) + is + Inter : Iir; + begin + if Implicit then + Put ("-- "); + end if; + + case Get_Kind (Subprg) is + when Iir_Kind_Function_Declaration + | Iir_Kind_Interface_Function_Declaration => + if Get_Has_Pure (Subprg) then + Disp_Pure (Ctxt, Subprg); + end if; + Disp_Token (Ctxt, Tok_Function); + when Iir_Kind_Procedure_Declaration + | Iir_Kind_Interface_Procedure_Declaration => + Disp_Token (Ctxt, Tok_Procedure); + when others => + raise Internal_Error; + end case; + + Disp_Function_Name (Ctxt, Subprg); + + if Get_Has_Parameter (Subprg) then + Disp_Token (Ctxt, Tok_Parameter); + end if; + + Inter := Get_Interface_Declaration_Chain (Subprg); + Disp_Interface_Chain (Ctxt, Inter); + + case Get_Kind (Subprg) is + when Iir_Kind_Function_Declaration + | Iir_Kind_Interface_Function_Declaration => + Disp_Token (Ctxt, Tok_Return); + Disp_Subtype_Indication + (Ctxt, Or_Else (Get_Return_Type_Mark (Subprg), + Get_Return_Type (Subprg))); + when Iir_Kind_Procedure_Declaration + | Iir_Kind_Interface_Procedure_Declaration => + null; + when others => + raise Internal_Error; + end case; + end Disp_Subprogram_Declaration; + + procedure Disp_Subprogram_Body (Ctxt : in out Ctxt_Class; Subprg : Iir) is + begin + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Subprg); + Close_Vbox (Ctxt); + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Begin); + Close_Hbox (Ctxt); + Start_Vbox (Ctxt); + Disp_Sequential_Statements + (Ctxt, Get_Sequential_Statement_Chain (Subprg)); + Close_Vbox (Ctxt); + if Get_Kind (Subprg) = Iir_Kind_Function_Body then + Disp_End (Ctxt, Subprg, Tok_Function); + else + Disp_End (Ctxt, Subprg, Tok_Procedure); + end if; + end Disp_Subprogram_Body; + + procedure Disp_Instantiation_List + (Ctxt : in out Ctxt_Class; Insts: Iir_Flist) + is + El : Iir; + begin + case Insts is + when Iir_Flist_All => + Disp_Token (Ctxt, Tok_All); + when Iir_Flist_Others => + Disp_Token (Ctxt, Tok_Others); + when others => + for I in Flist_First .. Flist_Last (Insts) loop + El := Get_Nth_Element (Insts, I); + if I /= Flist_First then + Disp_Token (Ctxt, Tok_Comma); + end if; + Print (Ctxt, El); + end loop; + end case; + end Disp_Instantiation_List; + + procedure Disp_Configuration_Specification + (Ctxt : in out Ctxt_Class; Spec : Iir_Configuration_Specification) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_For); + Disp_Instantiation_List (Ctxt, Get_Instantiation_List (Spec)); + Disp_Token (Ctxt, Tok_Colon); + Print (Ctxt, Get_Component_Name (Spec)); + Disp_Binding_Indication (Ctxt, Get_Binding_Indication (Spec)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Configuration_Specification; + + procedure Disp_Disconnection_Specification + (Ctxt : in out Ctxt_Class; Dis : Iir_Disconnection_Specification) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Disconnect); + Disp_Instantiation_List (Ctxt, Get_Signal_List (Dis)); + Disp_Token (Ctxt, Tok_Colon); + Print (Ctxt, Get_Type_Mark (Dis)); + Disp_Token (Ctxt, Tok_After); + Print (Ctxt, Get_Expression (Dis)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Disconnection_Specification; + + procedure Disp_Attribute_Declaration + (Ctxt : in out Ctxt_Class; Attr : Iir_Attribute_Declaration) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Attribute); + Disp_Identifier (Ctxt, Attr); + Disp_Token (Ctxt, Tok_Colon); + Print (Ctxt, Get_Type_Mark (Attr)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Attribute_Declaration; + + procedure Disp_Attribute_Value (Ctxt : in out Ctxt_Class; Attr : Iir) is + begin + Disp_Name_Of (Ctxt, Get_Designated_Entity (Attr)); + Put ("'"); + Disp_Identifier + (Ctxt, Get_Attribute_Designator (Get_Attribute_Specification (Attr))); + end Disp_Attribute_Value; + + procedure Disp_Attribute_Name (Ctxt : in out Ctxt_Class; Attr : Iir) + is + Sig : constant Iir := Get_Attribute_Signature (Attr); + begin + Print (Ctxt, Get_Prefix (Attr)); + if Sig /= Null_Iir then + Disp_Signature (Ctxt, Sig); + end if; + Disp_Token (Ctxt, Tok_Tick); + Disp_Ident (Ctxt, Get_Identifier (Attr)); + end Disp_Attribute_Name; + + procedure Disp_Entity_Kind (Ctxt : in out Ctxt_Class; Tok : Token_Type) is + begin + Disp_Token (Ctxt, Tok); + end Disp_Entity_Kind; + + procedure Disp_Entity_Name_List (Ctxt : in out Ctxt_Class; List : Iir_Flist) + is + El : Iir; + begin + case List is + when Iir_Flist_All => + Disp_Token (Ctxt, Tok_All); + when Iir_Flist_Others => + Disp_Token (Ctxt, Tok_Others); + when others => + for I in Flist_First .. Flist_Last (List) loop + El := Get_Nth_Element (List, I); + if I /= Flist_First then + Disp_Token (Ctxt, Tok_Comma); + end if; + Print (Ctxt, El); + end loop; + end case; + end Disp_Entity_Name_List; + + procedure Disp_Attribute_Specification + (Ctxt : in out Ctxt_Class; Attr : Iir_Attribute_Specification) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Attribute); + Disp_Identifier (Ctxt, Get_Attribute_Designator (Attr)); + Disp_Token (Ctxt, Tok_Of); + Disp_Entity_Name_List (Ctxt, Get_Entity_Name_List (Attr)); + Disp_Token (Ctxt, Tok_Colon); + Disp_Entity_Kind (Ctxt, Get_Entity_Class (Attr)); + Disp_Token (Ctxt, Tok_Is); + Print (Ctxt, Get_Expression (Attr)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Attribute_Specification; + + procedure Disp_Protected_Type_Body + (Ctxt : in out Ctxt_Class; Bod : Iir_Protected_Type_Body) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Type); + Disp_Identifier (Ctxt, Bod); + Disp_Token (Ctxt, Tok_Is); + Disp_Token (Ctxt, Tok_Protected, Tok_Body); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Bod); + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Bod, Tok_Protected, Tok_Body); + end Disp_Protected_Type_Body; + + procedure Disp_Group_Template_Declaration + (Ctxt : in out Ctxt_Class; Decl : Iir) + is + Ent : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Group); + Disp_Identifier (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is, Tok_Left_Paren); + Ent := Get_Entity_Class_Entry_Chain (Decl); + loop + Disp_Entity_Kind (Ctxt, Get_Entity_Class (Ent)); + Ent := Get_Chain (Ent); + exit when Ent = Null_Iir; + if Get_Entity_Class (Ent) = Tok_Box then + Disp_Token (Ctxt, Tok_Box); + exit; + else + Disp_Token (Ctxt, Tok_Comma); + end if; + end loop; + Disp_Token (Ctxt, Tok_Right_Paren, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Group_Template_Declaration; + + procedure Disp_Group_Declaration (Ctxt : in out Ctxt_Class; Decl : Iir) + is + List : Iir_Flist; + El : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Group); + Disp_Identifier (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Colon); + Print (Ctxt, Get_Group_Template_Name (Decl)); + Disp_Token (Ctxt, Tok_Left_Paren); + List := Get_Group_Constituent_List (Decl); + for I in Flist_First .. Flist_Last (List) loop + El := Get_Nth_Element (List, I); + if I /= 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + Disp_Name_Of (Ctxt, El); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Group_Declaration; + + procedure Disp_PSL_HDL_Expr + (N : PSL.Nodes.HDL_Node) is + begin + Disp_Expression (Iir (N)); + end Disp_PSL_HDL_Expr; + + procedure Disp_Psl_Expression + (Ctxt : in out Ctxt_Class; Expr : PSL_Node) is + begin + PSL.Prints.HDL_Expr_Printer := Disp_PSL_HDL_Expr'Access; + -- Hack. + Disp_Char (Ctxt, ' '); + PSL.Prints.Print_Property (Expr); + end Disp_Psl_Expression; + + procedure Disp_Psl_Sequence + (Ctxt : in out Ctxt_Class; Expr : PSL_Node) is + begin + PSL.Prints.HDL_Expr_Printer := Disp_PSL_HDL_Expr'Access; + -- Hack. + Disp_Char (Ctxt, ' '); + PSL.Prints.Print_Sequence (Expr); + end Disp_Psl_Sequence; + + procedure Disp_Psl_Default_Clock (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + if Vhdl_Std < Vhdl_08 then + Put ("--psl "); + end if; + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Psl_Default, Tok_Psl_Clock); + Disp_Token (Ctxt, Tok_Is); + Disp_Psl_Expression (Ctxt, Get_Psl_Boolean (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Psl_Default_Clock; + + procedure Disp_Psl_Declaration (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + use PSL.Nodes; + Decl : constant PSL_Node := Get_Psl_Declaration (Stmt); + begin + if Vhdl_Std < Vhdl_08 then + Put ("--psl "); + end if; + case Get_Kind (Decl) is + when N_Property_Declaration => + Put ("property "); + Disp_Ident (Ctxt, Get_Identifier (Decl)); + Put (" is "); + Disp_Psl_Expression (Ctxt, Get_Property (Decl)); + Put_Line (";"); + when N_Sequence_Declaration => + Put ("sequence "); + Disp_Ident (Ctxt, Get_Identifier (Decl)); + Put (" is "); + Disp_Psl_Sequence (Ctxt, Get_Sequence (Decl)); + Put_Line (";"); + when N_Endpoint_Declaration => + Put ("endpoint "); + Disp_Ident (Ctxt, Get_Identifier (Decl)); + Put (" is "); + Disp_Psl_Sequence (Ctxt, Get_Sequence (Decl)); + Put_Line (";"); + Disp_PSL_NFA (Get_PSL_NFA (Stmt)); + when others => + PSL.Errors.Error_Kind ("disp_psl_declaration", Decl); + end case; + end Disp_Psl_Declaration; + + procedure Disp_Declaration_Chain + (Ctxt : in out Ctxt_Class; Parent : Iir) + is + Decl: Iir; + begin + Decl := Get_Declaration_Chain (Parent); + while Decl /= Null_Iir loop + case Get_Kind (Decl) is + when Iir_Kind_Type_Declaration => + Disp_Type_Declaration (Ctxt, Decl); + when Iir_Kind_Anonymous_Type_Declaration => + Disp_Anonymous_Type_Declaration (Ctxt, Decl); + when Iir_Kind_Subtype_Declaration => + Disp_Subtype_Declaration (Ctxt, Decl); + when Iir_Kind_Use_Clause => + Disp_Use_Clause (Ctxt, Decl); + when Iir_Kind_Component_Declaration => + Disp_Component_Declaration (Ctxt, Decl); + when Iir_Kind_File_Declaration + | Iir_Kind_Signal_Declaration + | Iir_Kind_Constant_Declaration + | Iir_Kind_Variable_Declaration => + Disp_Object_Declaration (Ctxt, Decl); + while Get_Has_Identifier_List (Decl) loop + Decl := Get_Chain (Decl); + end loop; + when Iir_Kind_Object_Alias_Declaration => + Disp_Object_Alias_Declaration (Ctxt, Decl); + when Iir_Kind_Terminal_Declaration => + Disp_Terminal_Declaration (Ctxt, Decl); + while Get_Has_Identifier_List (Decl) loop + Decl := Get_Chain (Decl); + end loop; + when Iir_Kinds_Quantity_Declaration => + Disp_Quantity_Declaration (Ctxt, Decl); + when Iir_Kind_Nature_Declaration => + Disp_Nature_Declaration (Ctxt, Decl); + when Iir_Kind_Non_Object_Alias_Declaration => + Disp_Non_Object_Alias_Declaration (Ctxt, Decl); + when Iir_Kind_Function_Declaration + | Iir_Kind_Procedure_Declaration => + declare + Implicit : constant Boolean := + Is_Implicit_Subprogram (Decl) + and then (Get_Implicit_Definition (Decl) + /= Iir_Predefined_Now_Function); + begin + if not Implicit or else Flag_Implicit then + Start_Hbox (Ctxt); + Disp_Subprogram_Declaration (Ctxt, Decl, Implicit); + if not Get_Has_Body (Decl) then + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + end if; + end; + when Iir_Kind_Function_Body + | Iir_Kind_Procedure_Body => + -- The declaration was just displayed. + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + Disp_Subprogram_Body (Ctxt, Decl); + when Iir_Kind_Protected_Type_Body => + Disp_Protected_Type_Body (Ctxt, Decl); + when Iir_Kind_Configuration_Specification => + Disp_Configuration_Specification (Ctxt, Decl); + when Iir_Kind_Disconnection_Specification => + Disp_Disconnection_Specification (Ctxt, Decl); + when Iir_Kind_Attribute_Declaration => + Disp_Attribute_Declaration (Ctxt, Decl); + when Iir_Kind_Attribute_Specification => + Disp_Attribute_Specification (Ctxt, Decl); + when Iir_Kind_Signal_Attribute_Declaration => + null; + when Iir_Kind_Group_Template_Declaration => + Disp_Group_Template_Declaration (Ctxt, Decl); + when Iir_Kind_Group_Declaration => + Disp_Group_Declaration (Ctxt, Decl); + when Iir_Kind_Package_Declaration => + Disp_Package_Declaration (Ctxt, Decl); + when Iir_Kind_Package_Body => + Disp_Package_Body (Ctxt, Decl); + when Iir_Kind_Package_Instantiation_Declaration => + Disp_Package_Instantiation_Declaration (Ctxt, Decl); + when Iir_Kind_Psl_Default_Clock => + Disp_Psl_Default_Clock (Ctxt, Decl); + when others => + Error_Kind ("disp_declaration_chain", Decl); + end case; + Decl := Get_Chain (Decl); + end loop; + end Disp_Declaration_Chain; + + procedure Disp_Waveform + (Ctxt : in out Ctxt_Class; Chain : Iir_Waveform_Element) + is + We: Iir_Waveform_Element; + Val : Iir; + begin + if Chain = Null_Iir then + Put ("null after {disconnection_time}"); + return; + elsif Get_Kind (Chain) = Iir_Kind_Unaffected_Waveform then + Disp_Token (Ctxt, Tok_Unaffected); + return; + end if; + We := Chain; + while We /= Null_Iir loop + if We /= Chain then + Disp_Token (Ctxt, Tok_Comma); + end if; + Val := Get_We_Value (We); + Print (Ctxt, Val); + if Get_Time (We) /= Null_Iir then + Disp_Token (Ctxt, Tok_After); + Print (Ctxt, Get_Time (We)); + end if; + We := Get_Chain (We); + end loop; + end Disp_Waveform; + + procedure Disp_Delay_Mechanism (Ctxt : in out Ctxt_Class; Stmt: Iir) is + Expr: Iir; + begin + case Get_Delay_Mechanism (Stmt) is + when Iir_Transport_Delay => + Disp_Token (Ctxt, Tok_Transport); + when Iir_Inertial_Delay => + Expr := Get_Reject_Time_Expression (Stmt); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Reject); + Print (Ctxt, Expr); + Disp_Token (Ctxt, Tok_Inertial); + end if; + end case; + end Disp_Delay_Mechanism; + + procedure Disp_Label (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Label: constant Name_Id := Get_Label (Stmt); + begin + if Label /= Null_Identifier then + Disp_Identifier (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Colon); + end if; + end Disp_Label; + + procedure Disp_Simple_Signal_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Less_Equal); + Disp_Delay_Mechanism (Ctxt, Stmt); + Disp_Waveform (Ctxt, Get_Waveform_Chain (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Simple_Signal_Assignment; + + procedure Disp_Conditional_Waveform (Ctxt : in out Ctxt_Class; Chain : Iir) + is + Cond_Wf : Iir; + Expr : Iir; + begin + Cond_Wf := Chain; + while Cond_Wf /= Null_Iir loop + Disp_Waveform (Ctxt, Get_Waveform_Chain (Cond_Wf)); + Expr := Get_Condition (Cond_Wf); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_When); + Print (Ctxt, Expr); + Disp_Token (Ctxt, Tok_Else); + end if; + Cond_Wf := Get_Chain (Cond_Wf); + end loop; + end Disp_Conditional_Waveform; + + procedure Disp_Conditional_Signal_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Less_Equal); + Disp_Delay_Mechanism (Ctxt, Stmt); + Disp_Conditional_Waveform (Ctxt, Get_Conditional_Waveform_Chain (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Conditional_Signal_Assignment; + + procedure Disp_Selected_Waveforms + (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Assoc_Chain : constant Iir := Get_Selected_Waveform_Chain (Stmt); + Assoc: Iir; + begin + Assoc := Assoc_Chain; + while Assoc /= Null_Iir loop + if Assoc /= Assoc_Chain then + Disp_Token (Ctxt, Tok_Comma); + end if; + Disp_Waveform (Ctxt, Get_Associated_Chain (Assoc)); + Disp_Token (Ctxt, Tok_When); + Disp_Choice (Ctxt, Assoc); + end loop; + Disp_Token (Ctxt, Tok_Semi_Colon); + end Disp_Selected_Waveforms; + + procedure Disp_Selected_Waveform_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Put ("with "); + Print (Ctxt, Get_Expression (Stmt)); + Put (" select "); + Print (Ctxt, Get_Target (Stmt)); + Put (" <= "); + Disp_Delay_Mechanism (Ctxt, Stmt); + Disp_Selected_Waveforms (Ctxt, Stmt); + Close_Hbox (Ctxt); + end Disp_Selected_Waveform_Assignment; + + procedure Disp_Variable_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Assign); + Print (Ctxt, Get_Expression (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Variable_Assignment; + + procedure Disp_Conditional_Expression + (Ctxt : in out Ctxt_Class; Exprs : Iir) + is + Expr : Iir; + Cond : Iir; + begin + Expr := Exprs; + loop + Print (Ctxt, Get_Expression (Expr)); + Cond := Get_Condition (Expr); + if Cond /= Null_Iir then + Disp_Token (Ctxt, Tok_When); + Print (Ctxt, Cond); + end if; + Expr := Get_Chain (Expr); + exit when Expr = Null_Iir; + Disp_Token (Ctxt, Tok_Else); + end loop; + end Disp_Conditional_Expression; + + procedure Disp_Conditional_Variable_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Assign); + Disp_Conditional_Expression (Ctxt, Get_Conditional_Expression (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Conditional_Variable_Assignment; + + procedure Disp_Postponed (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + if Get_Postponed_Flag (Stmt) then + Disp_Token (Ctxt, Tok_Postponed); + end if; + end Disp_Postponed; + + procedure Disp_Concurrent_Simple_Signal_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Postponed (Ctxt, Stmt); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Less_Equal); + if Get_Guard (Stmt) /= Null_Iir then + Disp_Token (Ctxt, Tok_Guarded); + end if; + Disp_Delay_Mechanism (Ctxt, Stmt); + Disp_Waveform (Ctxt, Get_Waveform_Chain (Stmt)); + + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Concurrent_Simple_Signal_Assignment; + + procedure Disp_Concurrent_Selected_Signal_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Postponed (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_With); + Print (Ctxt, Get_Expression (Stmt)); + Disp_Token (Ctxt, Tok_Select); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Less_Equal); + if Get_Guard (Stmt) /= Null_Iir then + Disp_Token (Ctxt, Tok_Guarded); + end if; + Disp_Delay_Mechanism (Ctxt, Stmt); + Disp_Selected_Waveforms (Ctxt, Stmt); + Close_Hbox (Ctxt); + end Disp_Concurrent_Selected_Signal_Assignment; + + procedure Disp_Concurrent_Conditional_Signal_Assignment + (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Postponed (Ctxt, Stmt); + Print (Ctxt, Get_Target (Stmt)); + Disp_Token (Ctxt, Tok_Less_Equal); + if Get_Guard (Stmt) /= Null_Iir then + Disp_Token (Ctxt, Tok_Guarded); + end if; + Disp_Delay_Mechanism (Ctxt, Stmt); + Disp_Conditional_Waveform (Ctxt, Get_Conditional_Waveform_Chain (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Concurrent_Conditional_Signal_Assignment; + + procedure Disp_Severity_Expression (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Expr : constant Iir := Get_Severity_Expression (Stmt); + begin + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Severity); + Print (Ctxt, Expr); + end if; + end Disp_Severity_Expression; + + procedure Disp_Report_Expression (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Expr : constant Iir := Get_Report_Expression (Stmt); + begin + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Report); + Print (Ctxt, Expr); + end if; + end Disp_Report_Expression; + + procedure Disp_Assertion_Statement (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + if Get_Kind (Stmt) = Iir_Kind_Concurrent_Assertion_Statement then + Disp_Postponed (Ctxt, Stmt); + end if; + Disp_Token (Ctxt, Tok_Assert); + Print (Ctxt, Get_Assertion_Condition (Stmt)); + Disp_Report_Expression (Ctxt, Stmt); + Disp_Severity_Expression (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Assertion_Statement; + + procedure Disp_Report_Statement (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Report); + Print (Ctxt, Get_Report_Expression (Stmt)); + Disp_Severity_Expression (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Report_Statement; + + function Get_Operator_Token (Op : Iir) return Token_Type is + begin + case Get_Kind (Op) is + when Iir_Kind_And_Operator + | Iir_Kind_Reduction_And_Operator => + return Tok_And; + when Iir_Kind_Or_Operator + | Iir_Kind_Reduction_Or_Operator => + return Tok_Or; + when Iir_Kind_Nand_Operator + | Iir_Kind_Reduction_Nand_Operator => + return Tok_Nand; + when Iir_Kind_Nor_Operator + | Iir_Kind_Reduction_Nor_Operator => + return Tok_Nor; + when Iir_Kind_Xor_Operator + | Iir_Kind_Reduction_Xor_Operator => + return Tok_Xor; + when Iir_Kind_Xnor_Operator + | Iir_Kind_Reduction_Xnor_Operator => + return Tok_Xnor; + + when Iir_Kind_Equality_Operator => + return Tok_Equal; + when Iir_Kind_Inequality_Operator => + return Tok_Not_Equal; + when Iir_Kind_Less_Than_Operator => + return Tok_Less; + when Iir_Kind_Less_Than_Or_Equal_Operator => + return Tok_Less_Equal; + when Iir_Kind_Greater_Than_Operator => + return Tok_Greater; + when Iir_Kind_Greater_Than_Or_Equal_Operator => + return Tok_Greater_Equal; + + when Iir_Kind_Match_Equality_Operator => + return Tok_Match_Equal; + when Iir_Kind_Match_Inequality_Operator => + return Tok_Match_Not_Equal; + when Iir_Kind_Match_Less_Than_Operator => + return Tok_Match_Less; + when Iir_Kind_Match_Less_Than_Or_Equal_Operator => + return Tok_Match_Less_Equal; + when Iir_Kind_Match_Greater_Than_Operator => + return Tok_Match_Greater; + when Iir_Kind_Match_Greater_Than_Or_Equal_Operator => + return Tok_Match_Greater_Equal; + + when Iir_Kind_Sll_Operator => + return Tok_Sll; + when Iir_Kind_Sla_Operator => + return Tok_Sla; + when Iir_Kind_Srl_Operator => + return Tok_Srl; + when Iir_Kind_Sra_Operator => + return Tok_Sra; + when Iir_Kind_Rol_Operator => + return Tok_Rol; + when Iir_Kind_Ror_Operator => + return Tok_Ror; + + when Iir_Kind_Addition_Operator => + return Tok_Plus; + when Iir_Kind_Substraction_Operator => + return Tok_Minus; + when Iir_Kind_Concatenation_Operator => + return Tok_Ampersand; + when Iir_Kind_Multiplication_Operator => + return Tok_Star; + when Iir_Kind_Division_Operator => + return Tok_Slash; + when Iir_Kind_Modulus_Operator => + return Tok_Mod; + when Iir_Kind_Remainder_Operator => + return Tok_Rem; + when Iir_Kind_Exponentiation_Operator => + return Tok_Double_Star; + when Iir_Kind_Not_Operator => + return Tok_Not; + when Iir_Kind_Negation_Operator => + return Tok_Minus; + when Iir_Kind_Identity_Operator => + return Tok_Plus; + when Iir_Kind_Absolute_Operator => + return Tok_Abs; + when Iir_Kind_Condition_Operator + | Iir_Kind_Implicit_Condition_Operator => + return Tok_Condition; + when others => + raise Internal_Error; + end case; + end Get_Operator_Token; + + procedure Disp_Dyadic_Operator (Ctxt : in out Ctxt_Class; Expr: Iir) is + begin + if Flag_Parenthesis then + Put ("("); + end if; + Print (Ctxt, Get_Left (Expr)); + Disp_Token (Ctxt, Get_Operator_Token (Expr)); + Print (Ctxt, Get_Right (Expr)); + if Flag_Parenthesis then + Put (")"); + end if; + end Disp_Dyadic_Operator; + + procedure Disp_Monadic_Operator (Ctxt : in out Ctxt_Class; Expr: Iir) is + begin + if Get_Kind (Expr) = Iir_Kind_Implicit_Condition_Operator then + Print (Ctxt, Get_Operand (Expr)); + return; + end if; + + Disp_Token (Ctxt, Get_Operator_Token (Expr)); + if Flag_Parenthesis then + Put ('('); + end if; + Print (Ctxt, Get_Operand (Expr)); + if Flag_Parenthesis then + Put (')'); + end if; + end Disp_Monadic_Operator; + + procedure Disp_Case_Statement + (Ctxt : in out Ctxt_Class; Stmt: Iir_Case_Statement) + is + Assoc: Iir; + Sel_Stmt : Iir; + begin + Disp_Token (Ctxt, Tok_Case); + Print (Ctxt, Get_Expression (Stmt)); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Assoc := Get_Case_Statement_Alternative_Chain (Stmt); + while Assoc /= Null_Iir loop + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_When); + Sel_Stmt := Get_Associated_Chain (Assoc); + Disp_Choice (Ctxt, Assoc); + Disp_Token (Ctxt, Tok_Double_Arrow); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Sequential_Statements (Ctxt, Sel_Stmt); + Close_Vbox (Ctxt); + end loop; + Close_Vbox (Ctxt); + + Disp_End_Label_No_Close (Ctxt, Stmt, Tok_Case); + end Disp_Case_Statement; + + procedure Disp_Wait_Statement + (Ctxt : in out Ctxt_Class; Stmt: Iir_Wait_Statement) + is + List: Iir_List; + Expr: Iir; + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Wait); + List := Get_Sensitivity_List (Stmt); + if List /= Null_Iir_List then + Disp_Token (Ctxt, Tok_On); + Disp_Designator_List (Ctxt, List); + end if; + Expr := Get_Condition_Clause (Stmt); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Until); + Print (Ctxt, Expr); + end if; + Expr := Get_Timeout_Clause (Stmt); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_For); + Print (Ctxt, Expr); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Wait_Statement; + + procedure Disp_If_Statement + (Ctxt : in out Ctxt_Class; Stmt : Iir_If_Statement) + is + Clause : Iir; + Expr : Iir; + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_If); + Clause := Stmt; + Print (Ctxt, Get_Condition (Clause)); + Disp_Token (Ctxt, Tok_Then); + Close_Hbox (Ctxt); + while Clause /= Null_Iir loop + Start_Vbox (Ctxt); + Disp_Sequential_Statements + (Ctxt, Get_Sequential_Statement_Chain (Clause)); + Close_Vbox (Ctxt); + Clause := Get_Else_Clause (Clause); + exit when Clause = Null_Iir; + Start_Hbox (Ctxt); + Expr := Get_Condition (Clause); + if Expr /= Null_Iir then + Disp_Token (Ctxt, Tok_Elsif); + Print (Ctxt, Expr); + Disp_Token (Ctxt, Tok_Then); + else + Disp_Token (Ctxt, Tok_Else); + end if; + Close_Hbox (Ctxt); + end loop; + Disp_End_Label (Ctxt, Stmt, Tok_If); + end Disp_If_Statement; + + procedure Disp_Parameter_Specification + (Ctxt : in out Ctxt_Class; Iterator : Iir_Iterator_Declaration) is + begin + Disp_Identifier (Ctxt, Iterator); + Disp_Token (Ctxt, Tok_In); + Disp_Discrete_Range (Ctxt, Or_Else (Get_Discrete_Range (Iterator), + Get_Subtype_Indication (Iterator))); + end Disp_Parameter_Specification; + + procedure Disp_Procedure_Call (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Call : constant Iir := Get_Procedure_Call (Stmt); + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + if Get_Kind (Stmt) = Iir_Kind_Concurrent_Procedure_Call_Statement then + Disp_Postponed (Ctxt, Stmt); + end if; + Print (Ctxt, Get_Prefix (Call)); + Disp_Association_Chain (Ctxt, Get_Parameter_Association_Chain (Call)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Procedure_Call; + + procedure Disp_For_Loop_Statement (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_For); + Disp_Parameter_Specification (Ctxt, Get_Parameter_Specification (Stmt)); + Disp_Token (Ctxt, Tok_Loop); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Sequential_Statements (Ctxt, Get_Sequential_Statement_Chain (Stmt)); + Close_Vbox (Ctxt); + + Disp_End_Label (Ctxt, Stmt, Tok_Loop); + end Disp_For_Loop_Statement; + + procedure Disp_Sequential_Statements (Ctxt : in out Ctxt_Class; First : Iir) + is + Stmt: Iir; + begin + Stmt := First; + while Stmt /= Null_Iir loop + case Iir_Kinds_Sequential_Statement (Get_Kind (Stmt)) is + when Iir_Kind_Null_Statement => + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Null, Tok_Semi_Colon); + Close_Hbox (Ctxt); + when Iir_Kind_If_Statement => + Disp_If_Statement (Ctxt, Stmt); + when Iir_Kind_For_Loop_Statement => + Disp_For_Loop_Statement (Ctxt, Stmt); + when Iir_Kind_While_Loop_Statement => + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + if Get_Condition (Stmt) /= Null_Iir then + Disp_Token (Ctxt, Tok_While); + Print (Ctxt, Get_Condition (Stmt)); + end if; + Disp_Token (Ctxt, Tok_Loop); + Close_Hbox (Ctxt); + Start_Vbox (Ctxt); + Disp_Sequential_Statements + (Ctxt, Get_Sequential_Statement_Chain (Stmt)); + Close_Vbox (Ctxt); + Disp_End_Label (Ctxt, Stmt, Tok_Loop); + when Iir_Kind_Simple_Signal_Assignment_Statement => + Disp_Simple_Signal_Assignment (Ctxt, Stmt); + when Iir_Kind_Conditional_Signal_Assignment_Statement => + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Conditional_Signal_Assignment (Ctxt, Stmt); + Close_Hbox (Ctxt); + when Iir_Kind_Selected_Waveform_Assignment_Statement => + Disp_Selected_Waveform_Assignment (Ctxt, Stmt); + when Iir_Kind_Variable_Assignment_Statement => + Disp_Variable_Assignment (Ctxt, Stmt); + when Iir_Kind_Conditional_Variable_Assignment_Statement => + Disp_Conditional_Variable_Assignment (Ctxt, Stmt); + when Iir_Kind_Assertion_Statement => + Disp_Assertion_Statement (Ctxt, Stmt); + when Iir_Kind_Report_Statement => + Disp_Report_Statement (Ctxt, Stmt); + when Iir_Kind_Return_Statement => + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Return); + if Get_Expression (Stmt) /= Null_Iir then + Print (Ctxt, Get_Expression (Stmt)); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + when Iir_Kind_Case_Statement => + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Case_Statement (Ctxt, Stmt); + Close_Hbox (Ctxt); + when Iir_Kind_Wait_Statement => + Disp_Wait_Statement (Ctxt, Stmt); + when Iir_Kind_Procedure_Call_Statement => + Disp_Procedure_Call (Ctxt, Stmt); + when Iir_Kind_Exit_Statement + | Iir_Kind_Next_Statement => + declare + Label : constant Iir := Get_Loop_Label (Stmt); + Cond : constant Iir := Get_Condition (Stmt); + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + if Get_Kind (Stmt) = Iir_Kind_Exit_Statement then + Disp_Token (Ctxt, Tok_Exit); + else + Disp_Token (Ctxt, Tok_Next); + end if; + if Label /= Null_Iir then + Print (Ctxt, Label); + end if; + if Cond /= Null_Iir then + Disp_Token (Ctxt, Tok_When); + Print (Ctxt, Cond); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end; + end case; + Stmt := Get_Chain (Stmt); + end loop; + end Disp_Sequential_Statements; + + procedure Disp_Process_Statement (Ctxt : in out Ctxt_Class; Process: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Process); + Disp_Postponed (Ctxt, Process); + + Disp_Token (Ctxt, Tok_Process); + if Get_Kind (Process) = Iir_Kind_Sensitized_Process_Statement then + Disp_Token (Ctxt, Tok_Left_Paren); + Disp_Designator_List (Ctxt, Get_Sensitivity_List (Process)); + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + if Get_Has_Is (Process) then + Disp_Token (Ctxt, Tok_Is); + end if; + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Process); + Close_Vbox (Ctxt); + + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Begin); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Sequential_Statements + (Ctxt, Get_Sequential_Statement_Chain (Process)); + Close_Vbox (Ctxt); + + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_End); + if Get_End_Has_Postponed (Process) then + Disp_Token (Ctxt, Tok_Postponed); + end if; + Disp_After_End (Ctxt, Process, Tok_Process); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Process_Statement; + + procedure Disp_Conversion (Ctxt : in out Ctxt_Class; Conv : Iir) is + begin + case Get_Kind (Conv) is + when Iir_Kind_Function_Call => + Disp_Function_Name (Ctxt, Get_Implementation (Conv)); + when Iir_Kind_Type_Conversion => + Disp_Name_Of (Ctxt, Get_Type_Mark (Conv)); + when others => + Error_Kind ("disp_conversion", Conv); + end case; + end Disp_Conversion; + + procedure Disp_Association_Chain (Ctxt : in out Ctxt_Class; Chain : Iir) + is + El: Iir; + Formal: Iir; + Need_Comma : Boolean; + Conv : Iir; + begin + if Chain = Null_Iir then + return; + end if; + Disp_Token (Ctxt, Tok_Left_Paren); + Need_Comma := False; + + El := Chain; + while El /= Null_Iir loop + if Get_Kind (El) /= Iir_Kind_Association_Element_By_Individual then + if Need_Comma then + Disp_Token (Ctxt, Tok_Comma); + end if; + + -- Formal part. + if Get_Kind (El) = Iir_Kind_Association_Element_By_Expression then + Conv := Get_Formal_Conversion (El); + if Conv /= Null_Iir then + Disp_Conversion (Ctxt, Conv); + Disp_Token (Ctxt, Tok_Left_Paren); + end if; + else + Conv := Null_Iir; + end if; + Formal := Get_Formal (El); + if Formal /= Null_Iir then + case Get_Kind (El) is + when Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type + | Iir_Kind_Association_Element_Subprogram => + Print (Ctxt, Formal); + when Iir_Kind_Association_Element_By_Expression + | Iir_Kind_Association_Element_By_Individual + | Iir_Kind_Association_Element_Open => + Print (Ctxt, Formal); + when others => + raise Internal_Error; + end case; + if Conv /= Null_Iir then + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + Disp_Token (Ctxt, Tok_Double_Arrow); + end if; + + case Get_Kind (El) is + when Iir_Kind_Association_Element_Open => + Disp_Token (Ctxt, Tok_Open); + when Iir_Kind_Association_Element_Package + | Iir_Kind_Association_Element_Type + | Iir_Kind_Association_Element_Subprogram => + Print (Ctxt, Get_Actual (El)); + when others => + Conv := Get_Actual_Conversion (El); + if Conv /= Null_Iir then + Disp_Conversion (Ctxt, Conv); + Disp_Token (Ctxt, Tok_Left_Paren); + end if; + Print (Ctxt, Get_Actual (El)); + if Conv /= Null_Iir then + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + end case; + Need_Comma := True; + end if; + El := Get_Chain (El); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren); + end Disp_Association_Chain; + + procedure Disp_Generic_Map_Aspect + (Ctxt : in out Ctxt_Class; Parent : Iir) is + begin + Disp_Token (Ctxt, Tok_Generic, Tok_Map); + Disp_Association_Chain (Ctxt, Get_Generic_Map_Aspect_Chain (Parent)); + end Disp_Generic_Map_Aspect; + + procedure Disp_Port_Map_Aspect (Ctxt : in out Ctxt_Class; Parent : Iir) is + begin + Disp_Token (Ctxt, Tok_Port, Tok_Map); + Disp_Association_Chain (Ctxt, Get_Port_Map_Aspect_Chain (Parent)); + end Disp_Port_Map_Aspect; + + procedure Disp_Entity_Aspect (Ctxt : in out Ctxt_Class; Aspect : Iir) is + Arch : Iir; + begin + case Get_Kind (Aspect) is + when Iir_Kind_Entity_Aspect_Entity => + Disp_Token (Ctxt, Tok_Entity); + Print (Ctxt, Get_Entity_Name (Aspect)); + Arch := Get_Architecture (Aspect); + if Arch /= Null_Iir then + Disp_Token (Ctxt, Tok_Left_Paren); + Disp_Name_Of (Ctxt, Arch); + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + when Iir_Kind_Entity_Aspect_Configuration => + Disp_Token (Ctxt, Tok_Configuration); + Print (Ctxt, Get_Configuration_Name (Aspect)); + when Iir_Kind_Entity_Aspect_Open => + Disp_Token (Ctxt, Tok_Open); + when others => + Error_Kind ("disp_entity_aspect", Aspect); + end case; + end Disp_Entity_Aspect; + + procedure Disp_Component_Instantiation_Statement + (Ctxt : in out Ctxt_Class; Stmt: Iir_Component_Instantiation_Statement) + is + Component: constant Iir := Get_Instantiated_Unit (Stmt); + Gen_Map : constant Iir := Get_Generic_Map_Aspect_Chain (Stmt); + Port_Map : constant Iir := Get_Port_Map_Aspect_Chain (Stmt); + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + if Get_Kind (Component) in Iir_Kinds_Denoting_Name then + if Get_Has_Component (Stmt) then + Disp_Token (Ctxt, Tok_Component); + end if; + Print (Ctxt, Component); + else + Disp_Entity_Aspect (Ctxt, Component); + end if; + + if Gen_Map = Null_Iir and Port_Map = Null_Iir then + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + else + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + if Gen_Map /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Generic_Map_Aspect (Ctxt, Stmt); + if Port_Map = Null_Iir then + Disp_Token (Ctxt, Tok_Semi_Colon); + end if; + Close_Hbox (Ctxt); + end if; + + if Port_Map /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Port_Map_Aspect (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + + Close_Vbox (Ctxt); + end if; + end Disp_Component_Instantiation_Statement; + + procedure Disp_Function_Call + (Ctxt : in out Ctxt_Class; Expr: Iir_Function_Call) is + begin + Print (Ctxt, Get_Prefix (Expr)); + Disp_Association_Chain (Ctxt, Get_Parameter_Association_Chain (Expr)); + end Disp_Function_Call; + + procedure Disp_Indexed_Name (Ctxt : in out Ctxt_Class; Indexed: Iir) + is + List : Iir_Flist; + El: Iir; + begin + Print (Ctxt, Get_Prefix (Indexed)); + Disp_Token (Ctxt, Tok_Left_Paren); + List := Get_Index_List (Indexed); + for I in Flist_First .. Flist_Last (List) loop + El := Get_Nth_Element (List, I); + if I /= 0 then + Disp_Token (Ctxt, Tok_Comma); + end if; + Print (Ctxt, El); + end loop; + Disp_Token (Ctxt, Tok_Right_Paren); + end Disp_Indexed_Name; + + procedure Disp_A_Choice (Ctxt : in out Ctxt_Class; Choice : Iir) is + begin + case Iir_Kinds_Choice (Get_Kind (Choice)) is + when Iir_Kind_Choice_By_Others => + Disp_Token (Ctxt, Tok_Others); + when Iir_Kind_Choice_By_None => + null; + when Iir_Kind_Choice_By_Expression => + Print (Ctxt, Get_Choice_Expression (Choice)); + when Iir_Kind_Choice_By_Range => + Disp_Range (Ctxt, Get_Choice_Range (Choice)); + when Iir_Kind_Choice_By_Name => + Disp_Name_Of (Ctxt, Get_Choice_Name (Choice)); + end case; + end Disp_A_Choice; + + procedure Disp_Choice (Ctxt : in out Ctxt_Class; Choice: in out Iir) is + begin + loop + Disp_A_Choice (Ctxt, Choice); + Choice := Get_Chain (Choice); + exit when Choice = Null_Iir; + exit when Get_Same_Alternative_Flag (Choice) = False; + --exit when Choice = Null_Iir; + Disp_Token (Ctxt, Tok_Bar); + end loop; + end Disp_Choice; + + -- EL_TYPE is Null_Iir for record aggregates. + procedure Disp_Aggregate_1 + (Ctxt : in out Ctxt_Class; + Aggr: Iir_Aggregate; Index : Positive; El_Type : Iir) + is + Assoc : Iir; + Expr : Iir; + Is_First : Boolean; + begin + Disp_Token (Ctxt, Tok_Left_Paren); + Assoc := Get_Association_Choices_Chain (Aggr); + Is_First := True; + while Assoc /= Null_Iir loop + if Is_First then + Is_First := False; + else + Disp_Token (Ctxt, Tok_Comma); + end if; + pragma Assert (not Get_Same_Alternative_Flag (Assoc)); + Expr := Get_Associated_Expr (Assoc); + Disp_A_Choice (Ctxt, Assoc); + if Get_Kind (Assoc) /= Iir_Kind_Choice_By_None then + Assoc := Get_Chain (Assoc); + while Assoc /= Null_Iir + and then Get_Same_Alternative_Flag (Assoc) + loop + Disp_Token (Ctxt, Tok_Bar); + Disp_A_Choice (Ctxt, Assoc); + Assoc := Get_Chain (Assoc); + end loop; + Disp_Token (Ctxt, Tok_Double_Arrow); + else + Assoc := Get_Chain (Assoc); + end if; + if Index > 1 then + if Get_Kind (Expr) = Iir_Kind_String_Literal8 then + Disp_String_Literal (Ctxt, Expr, El_Type); + else + Disp_Aggregate_1 (Ctxt, Expr, Index - 1, El_Type); + end if; + else + Print (Ctxt, Expr); + end if; + end loop; + Disp_Token (Ctxt, Tok_Right_Paren); + end Disp_Aggregate_1; + + procedure Disp_Aggregate (Ctxt : in out Ctxt_Class; Aggr: Iir_Aggregate) + is + Aggr_Type : constant Iir := Get_Type (Aggr); + Base_Type : Iir; + begin + if Aggr_Type /= Null_Iir + and then Get_Kind (Aggr_Type) in Iir_Kinds_Array_Type_Definition + then + Base_Type := Get_Base_Type (Aggr_Type); + Disp_Aggregate_1 + (Ctxt, Aggr, Get_Nbr_Elements (Get_Index_Subtype_List (Base_Type)), + Get_Element_Subtype (Base_Type)); + else + Disp_Aggregate_1 (Ctxt, Aggr, 1, Null_Iir); + end if; + end Disp_Aggregate; + + procedure Disp_Simple_Aggregate + (Ctxt : in out Ctxt_Class; Aggr: Iir_Simple_Aggregate) + is + List : constant Iir_Flist := Get_Simple_Aggregate_List (Aggr); + El : Iir; + First : Boolean := True; + begin + Put ("("); + for I in Flist_First .. Flist_Last (List) loop + El := Get_Nth_Element (List, I); + if First then + First := False; + else + Put (", "); + end if; + Print (Ctxt, El); + end loop; + Put (")"); + end Disp_Simple_Aggregate; + + procedure Disp_Parametered_Attribute + (Ctxt : in out Ctxt_Class; Name : Name_Id; Expr : Iir) + is + Param : Iir; + Pfx : Iir; + begin + Pfx := Get_Prefix (Expr); + case Get_Kind (Pfx) is + when Iir_Kind_Type_Declaration + | Iir_Kind_Subtype_Declaration => + Disp_Name_Of (Ctxt, Pfx); + when others => + Print (Ctxt, Pfx); + end case; + Disp_Token (Ctxt, Tok_Tick); + Disp_Ident (Ctxt, Name); + Param := Get_Parameter (Expr); + if Param /= Null_Iir + and then Param /= Vhdl.Std_Package.Universal_Integer_One + then + Disp_Token (Ctxt, Tok_Left_Paren); + Print (Ctxt, Param); + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + end Disp_Parametered_Attribute; + + procedure Disp_Parametered_Type_Attribute + (Ctxt : in out Ctxt_Class; Name : Name_Id; Expr : Iir) is + begin + Print (Ctxt, Get_Prefix (Expr)); + Disp_Token (Ctxt, Tok_Tick); + Disp_Ident (Ctxt, Name); + Disp_Token (Ctxt, Tok_Left_Paren); + Print (Ctxt, Get_Parameter (Expr)); + Disp_Token (Ctxt, Tok_Right_Paren); + end Disp_Parametered_Type_Attribute; + + procedure Disp_String_Literal_Raw + (Ctxt : in out Ctxt_Class; Str : Iir; El_Type : Iir) + is + Str_Id : constant String8_Id := Get_String8_Id (Str); + Len : constant Nat32 := Get_String_Length (Str); + Literal_List : Iir_Flist; + Pos : Nat8; + Lit : Iir; + Id : Name_Id; + C : Character; + begin + if Get_Bit_String_Base (Str) /= Base_None then + Start_Lit (Ctxt, Tok_Bit_String); + if Get_Has_Length (Str) then + Disp_Int32 (Ctxt, Iir_Int32 (Get_String_Length (Str))); + end if; + Disp_Char (Ctxt, 'b'); + else + Start_Lit (Ctxt, Tok_String); + end if; + + Disp_Char (Ctxt, '"'); + + if El_Type /= Null_Iir then + Literal_List := + Get_Enumeration_Literal_List (Get_Base_Type (El_Type)); + else + Literal_List := Null_Iir_Flist; + end if; + + for I in 1 .. Len loop + Pos := Str_Table.Element_String8 (Str_Id, I); + if Literal_List /= Null_Iir_Flist then + Lit := Get_Nth_Element (Literal_List, Natural (Pos)); + Id := Get_Identifier (Lit); + else + Id := Name_Table.Get_Identifier (Character'Val (Pos)); + end if; + pragma Assert (Name_Table.Is_Character (Id)); + C := Name_Table.Get_Character (Id); + if C = '"' then + Disp_Char (Ctxt, C); + end if; + Disp_Char (Ctxt, C); + end loop; + + Disp_Char (Ctxt, '"'); + Close_Lit (Ctxt); + end Disp_String_Literal_Raw; + + procedure Disp_String_Literal + (Ctxt : in out Ctxt_Class; Str : Iir; El_Type : Iir) is + begin + if Get_Literal_Length (Str) /= 0 then + declare + Tkind : Token_Type; + begin + if Get_Bit_String_Base (Str) /= Base_None then + Tkind := Tok_Bit_String; + else + Tkind := Tok_String; + end if; + Disp_Literal_From_Source (Ctxt, Str, Tkind); + end; + else + Disp_String_Literal_Raw (Ctxt, Str, El_Type); + end if; + end Disp_String_Literal; + + procedure Print (Ctxt : in out Ctxt_Class; Expr: Iir) + is + Orig : Iir; + begin + case Get_Kind (Expr) is + when Iir_Kind_Integer_Literal => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + if Get_Literal_Length (Expr) /= 0 then + Disp_Literal_From_Source (Ctxt, Expr, Tok_Integer); + else + Disp_Int64 (Ctxt, Get_Value (Expr)); + end if; + end if; + when Iir_Kind_Floating_Point_Literal => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + if Get_Literal_Length (Expr) /= 0 then + Disp_Literal_From_Source (Ctxt, Expr, Tok_Real); + else + Disp_Fp64 (Ctxt, Get_Fp_Value (Expr)); + end if; + end if; + when Iir_Kind_String_Literal8 => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + declare + Expr_Type : constant Iir := Get_Type (Expr); + El_Type : Iir; + begin + if Expr_Type /= Null_Iir then + El_Type := Get_Element_Subtype (Expr_Type); + else + El_Type := Null_Iir; + end if; + Disp_String_Literal (Ctxt, Expr, El_Type); + if Flag_Disp_String_Literal_Type or Flags.List_Verbose then + Put ("[type: "); + Disp_Type (Ctxt, Expr_Type); + Put ("]"); + end if; + end; + end if; + when Iir_Kind_Physical_Fp_Literal + | Iir_Kind_Physical_Int_Literal => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + Disp_Physical_Literal (Ctxt, Expr); + end if; + when Iir_Kind_Enumeration_Literal => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + Disp_Name_Of (Ctxt, Expr); + end if; + when Iir_Kind_Overflow_Literal => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + Put ("*OVERFLOW*"); + end if; + + when Iir_Kind_Object_Alias_Declaration => + Disp_Name_Of (Ctxt, Expr); + when Iir_Kind_Aggregate => + Disp_Aggregate (Ctxt, Expr); + when Iir_Kind_Null_Literal => + Disp_Token (Ctxt, Tok_Null); + when Iir_Kind_Simple_Aggregate => + Orig := Get_Literal_Origin (Expr); + if Dump_Origin_Flag and then Orig /= Null_Iir then + Print (Ctxt, Orig); + else + Disp_Simple_Aggregate (Ctxt, Expr); + end if; + + when Iir_Kind_Attribute_Value => + Disp_Attribute_Value (Ctxt, Expr); + when Iir_Kind_Attribute_Name => + Disp_Attribute_Name (Ctxt, Expr); + + when Iir_Kind_Element_Declaration => + Disp_Name_Of (Ctxt, Expr); + + when Iir_Kind_Signal_Declaration + | Iir_Kind_Guard_Signal_Declaration + | Iir_Kind_File_Declaration + | Iir_Kind_Iterator_Declaration => + Disp_Name_Of (Ctxt, Expr); + return; + when Iir_Kind_Reference_Name => + declare + Name : constant Iir := Get_Referenced_Name (Expr); + begin + if Is_Valid (Name) then + Print (Ctxt, Name); + else + Print (Ctxt, Get_Named_Entity (Expr)); + end if; + end; + + when Iir_Kinds_Dyadic_Operator => + Disp_Dyadic_Operator (Ctxt, Expr); + when Iir_Kinds_Monadic_Operator => + Disp_Monadic_Operator (Ctxt, Expr); + when Iir_Kind_Function_Call => + Disp_Function_Call (Ctxt, Expr); + when Iir_Kind_Parenthesis_Expression => + Disp_Token (Ctxt, Tok_Left_Paren); + Print (Ctxt, Get_Expression (Expr)); + Disp_Token (Ctxt, Tok_Right_Paren); + when Iir_Kind_Type_Conversion => + Print (Ctxt, Get_Type_Mark (Expr)); + Disp_Token (Ctxt, Tok_Left_Paren); + Print (Ctxt, Get_Expression (Expr)); + Disp_Token (Ctxt, Tok_Right_Paren); + when Iir_Kind_Qualified_Expression => + declare + Qexpr : constant Iir := Get_Expression (Expr); + Has_Paren : constant Boolean := + Get_Kind (Qexpr) = Iir_Kind_Parenthesis_Expression + or else Get_Kind (Qexpr) = Iir_Kind_Aggregate; + begin + Print (Ctxt, Get_Type_Mark (Expr)); + Disp_Token (Ctxt, Tok_Tick); + if not Has_Paren then + Disp_Token (Ctxt, Tok_Left_Paren); + end if; + Print (Ctxt, Qexpr); + if not Has_Paren then + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + end; + when Iir_Kind_Allocator_By_Expression => + Disp_Token (Ctxt, Tok_New); + Print (Ctxt, Get_Expression (Expr)); + when Iir_Kind_Allocator_By_Subtype => + Disp_Token (Ctxt, Tok_New); + Disp_Subtype_Indication (Ctxt, Get_Subtype_Indication (Expr)); + + when Iir_Kind_Indexed_Name => + Disp_Indexed_Name (Ctxt, Expr); + when Iir_Kind_Slice_Name => + Print (Ctxt, Get_Prefix (Expr)); + Disp_Token (Ctxt, Tok_Left_Paren); + Disp_Range (Ctxt, Get_Suffix (Expr)); + Disp_Token (Ctxt, Tok_Right_Paren); + when Iir_Kind_Selected_Element => + Print (Ctxt, Get_Prefix (Expr)); + Disp_Token (Ctxt, Tok_Dot); + Disp_Name_Of (Ctxt, Get_Named_Entity (Expr)); + when Iir_Kind_Implicit_Dereference => + Print (Ctxt, Get_Prefix (Expr)); + + when Iir_Kind_Left_Type_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Left); + when Iir_Kind_Right_Type_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Right); + when Iir_Kind_High_Type_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_High); + when Iir_Kind_Low_Type_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Low); + when Iir_Kind_Ascending_Type_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Ascending); + + when Iir_Kind_Stable_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Stable, Expr); + when Iir_Kind_Quiet_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Quiet, Expr); + when Iir_Kind_Delayed_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Delayed, Expr); + when Iir_Kind_Transaction_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Transaction); + when Iir_Kind_Event_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Event); + when Iir_Kind_Active_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Active); + when Iir_Kind_Driving_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Driving); + when Iir_Kind_Driving_Value_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Driving_Value); + when Iir_Kind_Last_Value_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Last_Value); + when Iir_Kind_Last_Active_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Last_Active); + when Iir_Kind_Last_Event_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Last_Event); + + when Iir_Kind_Pos_Attribute => + Disp_Parametered_Type_Attribute (Ctxt, Name_Pos, Expr); + when Iir_Kind_Val_Attribute => + Disp_Parametered_Type_Attribute (Ctxt, Name_Val, Expr); + when Iir_Kind_Succ_Attribute => + Disp_Parametered_Type_Attribute (Ctxt, Name_Succ, Expr); + when Iir_Kind_Pred_Attribute => + Disp_Parametered_Type_Attribute (Ctxt, Name_Pred, Expr); + when Iir_Kind_Leftof_Attribute => + Disp_Parametered_Type_Attribute (Ctxt, Name_Leftof, Expr); + when Iir_Kind_Rightof_Attribute => + Disp_Parametered_Type_Attribute (Ctxt, Name_Rightof, Expr); + + when Iir_Kind_Length_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Length, Expr); + when Iir_Kind_Range_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Range, Expr); + when Iir_Kind_Reverse_Range_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Reverse_Range, Expr); + when Iir_Kind_Left_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Left, Expr); + when Iir_Kind_Right_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Right, Expr); + when Iir_Kind_Low_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Low, Expr); + when Iir_Kind_High_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_High, Expr); + when Iir_Kind_Ascending_Array_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Ascending, Expr); + + when Iir_Kind_Image_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Image, Expr); + when Iir_Kind_Value_Attribute => + Disp_Parametered_Attribute (Ctxt, Name_Value, Expr); + when Iir_Kind_Simple_Name_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Simple_Name); + when Iir_Kind_Instance_Name_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Instance_Name); + when Iir_Kind_Path_Name_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Path_Name); + + when Iir_Kinds_Type_And_Subtype_Definition => + Disp_Type (Ctxt, Expr); + + when Iir_Kind_Range_Expression => + Disp_Range (Ctxt, Expr); + + when Iir_Kind_Selected_By_All_Name + | Iir_Kind_Dereference => + Print (Ctxt, Get_Prefix (Expr)); + Disp_Token (Ctxt, Tok_Dot, Tok_All); + when Iir_Kind_Simple_Name + | Iir_Kind_Character_Literal => + Disp_Identifier (Ctxt, Expr); + when Iir_Kind_Operator_Symbol => + Disp_Function_Name (Ctxt, Expr); + when Iir_Kind_Selected_Name => + Print (Ctxt, Get_Prefix (Expr)); + Disp_Token (Ctxt, Tok_Dot); + Disp_Function_Name (Ctxt, Expr); + when Iir_Kind_Parenthesis_Name => + Print (Ctxt, Get_Prefix (Expr)); + Disp_Association_Chain (Ctxt, Get_Association_Chain (Expr)); + when Iir_Kind_Base_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Base); + when Iir_Kind_Subtype_Attribute => + Disp_Name_Attribute (Ctxt, Expr, Name_Subtype); + when Iir_Kind_Type_Declaration + | Iir_Kind_Subtype_Declaration + | Iir_Kind_Unit_Declaration + | Iir_Kinds_Interface_Object_Declaration + | Iir_Kind_Variable_Declaration + | Iir_Kind_Constant_Declaration + | Iir_Kind_Function_Declaration + | Iir_Kind_Procedure_Declaration + | Iir_Kind_Terminal_Declaration + | Iir_Kind_Component_Declaration + | Iir_Kind_Group_Template_Declaration => + Disp_Name_Of (Ctxt, Expr); + + when Iir_Kind_Signature => + Disp_Signature (Ctxt, Expr); + + when others => + Error_Kind ("print", Expr); + end case; + end Print; + + procedure Disp_Block_Header + (Ctxt : in out Ctxt_Class; Header : Iir_Block_Header) + is + Chain : Iir; + begin + if Header = Null_Iir then + return; + end if; + Chain := Get_Generic_Chain (Header); + if Chain /= Null_Iir then + Disp_Generics (Ctxt, Header); + + Chain := Get_Generic_Map_Aspect_Chain (Header); + if Chain /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Generic_Map_Aspect (Ctxt, Header); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + end if; + Chain := Get_Port_Chain (Header); + if Chain /= Null_Iir then + Disp_Ports (Ctxt, Header); + + Chain := Get_Port_Map_Aspect_Chain (Header); + if Chain /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Port_Map_Aspect (Ctxt, Header); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + end if; + end Disp_Block_Header; + + procedure Disp_Block_Statement + (Ctxt : in out Ctxt_Class; Block: Iir_Block_Statement) + is + Sensitivity: Iir_List; + Guard : Iir_Guard_Signal_Declaration; + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Block); + Disp_Token (Ctxt, Tok_Block); + Guard := Get_Guard_Decl (Block); + if Guard /= Null_Iir then + Disp_Token (Ctxt, Tok_Left_Paren); + Print (Ctxt, Get_Guard_Expression (Guard)); + Disp_Token (Ctxt, Tok_Right_Paren); + end if; + if Get_Has_Is (Block) then + Disp_Token (Ctxt, Tok_Is); + end if; + Close_Hbox (Ctxt); + + if Flags.List_Verbose and then Guard /= Null_Iir then + Sensitivity := Get_Guard_Sensitivity_List (Guard); + if Sensitivity /= Null_Iir_List then + Put ("-- guard sensitivity list "); + Disp_Designator_List (Ctxt, Sensitivity); + end if; + end if; + + Start_Vbox (Ctxt); + Disp_Block_Header (Ctxt, Get_Block_Header (Block)); + Disp_Declaration_Chain (Ctxt, Block); + Close_Vbox (Ctxt); + + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Begin); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Concurrent_Statement_Chain (Ctxt, Block); + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Block, Tok_Block); + end Disp_Block_Statement; + + procedure Disp_Generate_Statement_Body (Ctxt : in out Ctxt_Class; Bod : Iir) + is + Has_Beg : constant Boolean := Get_Has_Begin (Bod); + Has_End : constant Boolean := Get_Has_End (Bod); + begin + Disp_Declaration_Chain (Ctxt, Bod); + if Has_Beg then + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Begin); + Close_Hbox (Ctxt); + end if; + + if Has_Beg or Has_End then + Start_Vbox (Ctxt); + end if; + Disp_Concurrent_Statement_Chain (Ctxt, Bod); + if Has_Beg or Has_End then + Close_Vbox (Ctxt); + end if; + + if Has_End then + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_End); + if Get_End_Has_Identifier (Bod) then + Disp_Ident (Ctxt, Get_Alternative_Label (Bod)); + end if; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + end Disp_Generate_Statement_Body; + + procedure Disp_For_Generate_Statement + (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_For); + Disp_Parameter_Specification (Ctxt, Get_Parameter_Specification (Stmt)); + Disp_Token (Ctxt, Tok_Generate); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Generate_Statement_Body + (Ctxt, Get_Generate_Statement_Body (Stmt)); + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Stmt, Tok_Generate); + end Disp_For_Generate_Statement; + + procedure Disp_If_Generate_Statement (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Bod : Iir; + Clause : Iir; + Cond : Iir; + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_If); + Cond := Get_Condition (Stmt); + Clause := Stmt; + loop + Bod := Get_Generate_Statement_Body (Clause); + if Get_Has_Label (Bod) then + Disp_Ident (Ctxt, Get_Alternative_Label (Bod)); + Disp_Token (Ctxt, Tok_Colon); + end if; + if Cond /= Null_Iir then + Print (Ctxt, Cond); + end if; + Disp_Token (Ctxt, Tok_Generate); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Generate_Statement_Body (Ctxt, Bod); + Close_Vbox (Ctxt); + + Clause := Get_Generate_Else_Clause (Clause); + exit when Clause = Null_Iir; + + Start_Hbox (Ctxt); + Cond := Get_Condition (Clause); + if Cond = Null_Iir then + Disp_Token (Ctxt, Tok_Else); + else + Disp_Token (Ctxt, Tok_Elsif); + end if; + end loop; + Disp_End (Ctxt, Stmt, Tok_Generate); + end Disp_If_Generate_Statement; + + procedure Disp_Case_Generate_Statement + (Ctxt : in out Ctxt_Class; Stmt : Iir) + is + Bod : Iir; + Assoc : Iir; + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Case); + Print (Ctxt, Get_Expression (Stmt)); + Disp_Token (Ctxt, Tok_Generate); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Assoc := Get_Case_Statement_Alternative_Chain (Stmt); + while Assoc /= Null_Iir loop + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_When); + Bod := Get_Associated_Block (Assoc); + if Get_Has_Label (Bod) then + Disp_Ident (Ctxt, Get_Alternative_Label (Bod)); + Disp_Token (Ctxt, Tok_Colon); + end if; + Disp_Choice (Ctxt, Assoc); + Disp_Token (Ctxt, Tok_Double_Arrow); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Generate_Statement_Body (Ctxt, Bod); + Close_Vbox (Ctxt); + end loop; + Close_Vbox (Ctxt); + Disp_End (Ctxt, Stmt, Tok_Generate); + end Disp_Case_Generate_Statement; + + procedure Disp_PSL_NFA (Ctxt : in out Ctxt_Class; N : PSL.Nodes.NFA) + is + use PSL.NFAs; + + procedure Disp_State (S : NFA_State) is + Str : constant String := Int32'Image (Get_State_Label (S)); + begin + Put (Str (2 .. Str'Last)); + end Disp_State; + + S : NFA_State; + E : NFA_Edge; + begin + if N /= No_NFA then + Put ("-- start: "); + Disp_State (Get_Start_State (N)); + Put (", final: "); + Disp_State (Get_Final_State (N)); + New_Line; + + S := Get_First_State (N); + while S /= No_State loop + E := Get_First_Src_Edge (S); + while E /= No_Edge loop + Put ("-- "); + Disp_State (S); + Put (" -> "); + Disp_State (Get_Edge_Dest (E)); + Put (": "); + Disp_Psl_Expression (Ctxt, Get_Edge_Expr (E)); + New_Line; + E := Get_Next_Src_Edge (E); + end loop; + S := Get_Next_State (S); + end loop; + end if; + end Disp_PSL_NFA; + + procedure Disp_Psl_Assert_Statement + (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + Start_Hbox (Ctxt); + if Vhdl_Std < Vhdl_08 then + Put ("--psl "); + end if; + Disp_Label (Ctxt, Stmt); + Disp_Postponed (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Assert); + Disp_Psl_Expression (Ctxt, Get_Psl_Property (Stmt)); + Disp_Report_Expression (Ctxt, Stmt); + Disp_Severity_Expression (Ctxt, Stmt); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + Disp_PSL_NFA (Get_PSL_NFA (Stmt)); + end Disp_Psl_Assert_Statement; + + procedure Disp_Psl_Cover_Statement + (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + Put ("--psl "); + Disp_Label (Ctxt, Stmt); + Put ("cover "); + Disp_Psl_Sequence (Ctxt, Get_Psl_Sequence (Stmt)); + Put_Line (";"); + Disp_PSL_NFA (Get_PSL_NFA (Stmt)); + end Disp_Psl_Cover_Statement; + + procedure Disp_Simple_Simultaneous_Statement + (Ctxt : in out Ctxt_Class; Stmt : Iir) is + begin + Start_Hbox (Ctxt); + Disp_Label (Ctxt, Stmt); + Print (Ctxt, Get_Simultaneous_Left (Stmt)); + Disp_Token (Ctxt, Tok_Equal_Equal); + Print (Ctxt, Get_Simultaneous_Right (Stmt)); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Simple_Simultaneous_Statement; + + procedure Disp_Concurrent_Statement (Ctxt : in out Ctxt_Class; Stmt: Iir) is + begin + case Get_Kind (Stmt) is + when Iir_Kind_Concurrent_Simple_Signal_Assignment => + Disp_Concurrent_Simple_Signal_Assignment (Ctxt, Stmt); + when Iir_Kind_Concurrent_Conditional_Signal_Assignment => + Disp_Concurrent_Conditional_Signal_Assignment (Ctxt, Stmt); + when Iir_Kind_Concurrent_Selected_Signal_Assignment => + Disp_Concurrent_Selected_Signal_Assignment (Ctxt, Stmt); + when Iir_Kind_Sensitized_Process_Statement + | Iir_Kind_Process_Statement => + Disp_Process_Statement (Ctxt, Stmt); + when Iir_Kind_Concurrent_Assertion_Statement => + Disp_Assertion_Statement (Ctxt, Stmt); + when Iir_Kind_Component_Instantiation_Statement => + Disp_Component_Instantiation_Statement (Ctxt, Stmt); + when Iir_Kind_Concurrent_Procedure_Call_Statement => + Disp_Procedure_Call (Ctxt, Stmt); + when Iir_Kind_Block_Statement => + Disp_Block_Statement (Ctxt, Stmt); + when Iir_Kind_If_Generate_Statement => + Disp_If_Generate_Statement (Ctxt, Stmt); + when Iir_Kind_Case_Generate_Statement => + Disp_Case_Generate_Statement (Ctxt, Stmt); + when Iir_Kind_For_Generate_Statement => + Disp_For_Generate_Statement (Ctxt, Stmt); + when Iir_Kind_Psl_Default_Clock => + Disp_Psl_Default_Clock (Ctxt, Stmt); + when Iir_Kind_Psl_Declaration + | Iir_Kind_Psl_Endpoint_Declaration => + Disp_Psl_Declaration (Ctxt, Stmt); + when Iir_Kind_Psl_Assert_Statement => + Disp_Psl_Assert_Statement (Ctxt, Stmt); + when Iir_Kind_Psl_Cover_Statement => + Disp_Psl_Cover_Statement (Ctxt, Stmt); + when Iir_Kind_Simple_Simultaneous_Statement => + Disp_Simple_Simultaneous_Statement (Ctxt, Stmt); + when others => + Error_Kind ("disp_concurrent_statement", Stmt); + end case; + end Disp_Concurrent_Statement; + + procedure Disp_Package_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Package_Declaration) + is + Header : constant Iir := Get_Package_Header (Decl); + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Package); + Disp_Identifier (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + Start_Vbox (Ctxt); + if Header /= Null_Iir then + Disp_Generics (Ctxt, Header); + end if; + Disp_Declaration_Chain (Ctxt, Decl); + Close_Vbox (Ctxt); + Disp_End (Ctxt, Decl, Tok_Package); + end Disp_Package_Declaration; + + procedure Disp_Package_Body (Ctxt : in out Ctxt_Class; Decl: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Package, Tok_Body); + Disp_Identifier (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Decl); + Close_Vbox (Ctxt); + Disp_End (Ctxt, Decl, Tok_Package, Tok_Body); + end Disp_Package_Body; + + procedure Disp_Package_Instantiation_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Package); + Disp_Identifier (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is, Tok_New); + Print (Ctxt, Get_Uninstantiated_Package_Name (Decl)); + Disp_Generic_Map_Aspect (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end Disp_Package_Instantiation_Declaration; + + procedure Disp_Binding_Indication (Ctxt : in out Ctxt_Class; Bind : Iir) + is + El : Iir; + begin + El := Get_Entity_Aspect (Bind); + if El /= Null_Iir then + Disp_Token (Ctxt, Tok_Use); + Disp_Entity_Aspect (Ctxt, El); + end if; + El := Get_Generic_Map_Aspect_Chain (Bind); + if El /= Null_Iir then + Disp_Generic_Map_Aspect (Ctxt, Bind); + end if; + El := Get_Port_Map_Aspect_Chain (Bind); + if El /= Null_Iir then + Disp_Port_Map_Aspect (Ctxt, Bind); + end if; + end Disp_Binding_Indication; + + procedure Disp_Component_Configuration + (Ctxt : in out Ctxt_Class; Conf : Iir_Component_Configuration) + is + Block : Iir_Block_Configuration; + Binding : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_For); + Disp_Instantiation_List (Ctxt, Get_Instantiation_List (Conf)); + Disp_Token (Ctxt, Tok_Colon); + Print (Ctxt, Get_Component_Name (Conf)); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Binding := Get_Binding_Indication (Conf); + if Binding /= Null_Iir then + Start_Hbox (Ctxt); + Disp_Binding_Indication (Ctxt, Binding); + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + end if; + Block := Get_Block_Configuration (Conf); + if Block /= Null_Iir then + Disp_Block_Configuration (Ctxt, Block); + end if; + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Tok_For); + end Disp_Component_Configuration; + + procedure Disp_Configuration_Items + (Ctxt : in out Ctxt_Class; Conf : Iir_Block_Configuration) + is + El : Iir; + begin + El := Get_Configuration_Item_Chain (Conf); + while El /= Null_Iir loop + case Get_Kind (El) is + when Iir_Kind_Block_Configuration => + Disp_Block_Configuration (Ctxt, El); + when Iir_Kind_Component_Configuration => + Disp_Component_Configuration (Ctxt, El); + when Iir_Kind_Configuration_Specification => + -- This may be created by canon. + Disp_Configuration_Specification (Ctxt, El); + Put_Line ("end for;"); + when others => + Error_Kind ("disp_configuration_item_list", El); + end case; + El := Get_Chain (El); + end loop; + end Disp_Configuration_Items; + + procedure Disp_Block_Configuration + (Ctxt : in out Ctxt_Class; Block: Iir_Block_Configuration) + is + Spec : Iir; + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_For); + Spec := Get_Block_Specification (Block); + case Get_Kind (Spec) is + when Iir_Kind_Block_Statement + | Iir_Kind_If_Generate_Statement + | Iir_Kind_For_Generate_Statement + | Iir_Kind_Architecture_Body => + Disp_Name_Of (Ctxt, Spec); + when Iir_Kind_Indexed_Name => + declare + Index_List : constant Iir_Flist := Get_Index_List (Spec); + begin + Disp_Name_Of (Ctxt, Get_Prefix (Spec)); + Disp_Token (Ctxt, Tok_Left_Paren); + if Index_List = Iir_Flist_Others then + Put ("others"); + else + Print (Ctxt, Get_Nth_Element (Index_List, 0)); + end if; + Disp_Token (Ctxt, Tok_Right_Paren); + end; + when Iir_Kind_Slice_Name => + Disp_Name_Of (Ctxt, Get_Prefix (Spec)); + Disp_Token (Ctxt, Tok_Left_Paren); + Disp_Range (Ctxt, Get_Suffix (Spec)); + Disp_Token (Ctxt, Tok_Right_Paren); + when Iir_Kind_Simple_Name + | Iir_Kind_Parenthesis_Name => + Print (Ctxt, Spec); + when others => + Error_Kind ("disp_block_configuration", Spec); + end case; + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Block); + Disp_Configuration_Items (Ctxt, Block); + Close_Vbox (Ctxt); + Disp_End (Ctxt, Tok_For); + end Disp_Block_Configuration; + + procedure Disp_Configuration_Declaration + (Ctxt : in out Ctxt_Class; Decl: Iir_Configuration_Declaration) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Configuration); + Disp_Name_Of (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Of); + Print (Ctxt, Get_Entity_Name (Decl)); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + + Start_Vbox (Ctxt); + Disp_Declaration_Chain (Ctxt, Decl); + Disp_Block_Configuration (Ctxt, Get_Block_Configuration (Decl)); + Close_Vbox (Ctxt); + + Disp_End (Ctxt, Decl, Tok_Configuration); + end Disp_Configuration_Declaration; + + procedure Disp_Context_Items (Ctxt : in out Ctxt_Class; First : Iir) + is + Decl: Iir; + Next_Decl : Iir; + begin + Decl := First; + while Decl /= Null_Iir loop + Next_Decl := Get_Chain (Decl); + + case Iir_Kinds_Clause (Get_Kind (Decl)) is + when Iir_Kind_Use_Clause => + Disp_Use_Clause (Ctxt, Decl); + when Iir_Kind_Library_Clause => + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Library); + Disp_Identifier (Ctxt, Decl); + while Get_Has_Identifier_List (Decl) loop + Decl := Next_Decl; + Next_Decl := Get_Chain (Decl); + Disp_Token (Ctxt, Tok_Comma); + Disp_Identifier (Ctxt, Decl); + end loop; + Disp_Token (Ctxt, Tok_Semi_Colon); + Close_Hbox (Ctxt); + when Iir_Kind_Context_Reference => + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Context); + declare + Ref : Iir; + begin + Ref := Decl; + loop + Print (Ctxt, Get_Selected_Name (Ref)); + Ref := Get_Context_Reference_Chain (Ref); + exit when Ref = Null_Iir; + Disp_Token (Ctxt, Tok_Comma); + end loop; + Disp_Token (Ctxt, Tok_Semi_Colon); + end; + Close_Hbox (Ctxt); + end case; + Decl := Next_Decl; + end loop; + end Disp_Context_Items; + + procedure Disp_Context_Declaration (Ctxt : in out Ctxt_Class; Decl: Iir) is + begin + Start_Hbox (Ctxt); + Disp_Token (Ctxt, Tok_Context); + Disp_Name_Of (Ctxt, Decl); + Disp_Token (Ctxt, Tok_Is); + Close_Hbox (Ctxt); + Start_Vbox (Ctxt); + Disp_Context_Items (Ctxt, Get_Context_Items (Decl)); + Close_Vbox (Ctxt); + Disp_End (Ctxt, Decl, Tok_Context); + end Disp_Context_Declaration; + + procedure Disp_Design_Unit (Ctxt : in out Ctxt_Class; Unit: Iir_Design_Unit) + is + Decl: Iir; + begin + Disp_Context_Items (Ctxt, Get_Context_Items (Unit)); + + Decl := Get_Library_Unit (Unit); + case Iir_Kinds_Library_Unit (Get_Kind (Decl)) is + when Iir_Kind_Entity_Declaration => + Disp_Entity_Declaration (Ctxt, Decl); + when Iir_Kind_Architecture_Body => + Disp_Architecture_Body (Ctxt, Decl); + when Iir_Kind_Package_Declaration => + Disp_Package_Declaration (Ctxt, Decl); + when Iir_Kind_Package_Body => + Disp_Package_Body (Ctxt, Decl); + when Iir_Kind_Package_Instantiation_Declaration => + Disp_Package_Instantiation_Declaration (Ctxt, Decl); + when Iir_Kind_Configuration_Declaration => + Disp_Configuration_Declaration (Ctxt, Decl); + when Iir_Kind_Context_Declaration => + Disp_Context_Declaration (Ctxt, Decl); + end case; + end Disp_Design_Unit; + + procedure Disp_Vhdl (Ctxt : in out Ctxt_Class; N : Iir) is + begin + case Get_Kind (N) is + when Iir_Kind_Design_File => + declare + Unit : Iir; + begin + Unit := Get_First_Design_Unit (N); + while Unit /= Null_Iir loop + Disp_Vhdl (Ctxt, Unit); + Unit := Get_Chain (Unit); + end loop; + end; + when Iir_Kind_Design_Unit => + Disp_Design_Unit (Ctxt, N); + when Iir_Kind_Enumeration_Type_Definition => + Disp_Enumeration_Type_Definition (Ctxt, N); + when Iir_Kind_Concurrent_Conditional_Signal_Assignment => + Disp_Concurrent_Conditional_Signal_Assignment (Ctxt, N); + when Iir_Kinds_Dyadic_Operator => + Disp_Dyadic_Operator (Ctxt, N); + when Iir_Kind_Interface_Signal_Declaration + | Iir_Kind_Signal_Declaration + | Iir_Kind_Object_Alias_Declaration => + Disp_Name_Of (Ctxt, N); + when Iir_Kind_Enumeration_Literal => + Disp_Identifier (Ctxt, N); + when Iir_Kind_Component_Instantiation_Statement => + Disp_Component_Instantiation_Statement (Ctxt, N); + when Iir_Kind_Array_Type_Definition => + Disp_Array_Type_Definition (Ctxt, N); + when Iir_Kind_Package_Declaration => + Disp_Package_Declaration (Ctxt, N); + when Iir_Kind_Wait_Statement => + Disp_Wait_Statement (Ctxt, N); + when Iir_Kind_Selected_Name + | Iir_Kind_Selected_Element + | Iir_Kind_Indexed_Name + | Iir_Kind_Slice_Name => + Print (Ctxt, N); + when Iir_Kind_Psl_Cover_Statement => + Disp_Psl_Cover_Statement (Ctxt, N); + when others => + Error_Kind ("disp", N); + end case; + end Disp_Vhdl; + + procedure Disp_Int_Trim (Ctxt : in out Ctxt_Class; Str : String) is + begin + Start_Lit (Ctxt, Tok_Integer); + if Str (Str'First) = ' ' then + Disp_Str (Ctxt, Str (Str'First + 1 .. Str'Last)); + else + Disp_Str (Ctxt, Str); + end if; + Close_Lit (Ctxt); + end Disp_Int_Trim; + + procedure Disp_Int64 (Ctxt : in out Ctxt_Class; Val: Int64) is + begin + Disp_Int_Trim (Ctxt, Int64'Image (Val)); + end Disp_Int64; + + procedure Disp_Int32 (Ctxt : in out Ctxt_Class; Val: Iir_Int32) is + begin + Disp_Int_Trim (Ctxt, Iir_Int32'Image (Val)); + end Disp_Int32; + + procedure Disp_Fp64 (Ctxt : in out Ctxt_Class; Val: Fp64) + is + Str: constant String := Fp64'Image (Val); + begin + Start_Lit (Ctxt, Tok_Real); + if Str (Str'First) = ' ' then + Disp_Str (Ctxt, Str (Str'First + 1 .. Str'Last)); + else + Disp_Str (Ctxt, Str); + end if; + Close_Lit (Ctxt); + end Disp_Fp64; + + procedure Disp_Str (Ctxt : in out Ctxt_Class; Str : String) is + begin + for I in Str'Range loop + Disp_Char (Ctxt, Str (I)); + end loop; + end Disp_Str; + + + function Need_Space (Tok, Prev_Tok : Token_Type) return Boolean is + begin + if Prev_Tok = Tok_Newline then + return False; + elsif Prev_Tok >= Tok_First_Keyword then + -- A space after a keyword. + if Tok /= Tok_Semi_Colon + and Tok /= Tok_Dot + then + return True; + end if; + elsif Tok >= Tok_First_Keyword then + -- Space before a keyword. + if Prev_Tok /= Tok_Dot + and Prev_Tok /= Tok_Left_Paren + then + return True; + end if; + elsif (Tok = Tok_Identifier + or Tok = Tok_String) + and (Prev_Tok = Tok_Identifier + or Prev_Tok = Tok_String + or Prev_Tok = Tok_Integer + or Prev_Tok = Tok_Real) + then + -- A space is needed between 2 identifiers. + return True; + elsif Prev_Tok = Tok_Comma + or Prev_Tok = Tok_Semi_Colon + or Prev_Tok = Tok_Colon + or Prev_Tok = Tok_Assign + or Prev_Tok = Tok_Double_Arrow + or Prev_Tok in Token_Relational_Operator_Type + or Prev_Tok in Token_Adding_Operator_Type + or Prev_Tok in Token_Multiplying_Operator_Type + or Prev_Tok = Tok_Bar + then + -- Always a space after ',', ':', ':=' + return True; + elsif Tok = Tok_Left_Paren then + if Prev_Tok /= Tok_Tick and Prev_Tok /= Tok_Left_Paren then + -- A space before '('. + return True; + end if; + elsif Tok = Tok_Left_Bracket + or Tok = Tok_Assign + or Tok = Tok_Double_Arrow + or Tok in Token_Relational_Operator_Type + or Tok in Token_Adding_Operator_Type + or Tok in Token_Multiplying_Operator_Type + or Tok = Tok_Bar + then + -- Always a space before '[', ':='. + return True; + end if; + return False; + end Need_Space; + + package Simple_Disp_Ctxt is + type Simple_Ctxt is new Disp_Ctxt with record + Vnum : Natural; + Hnum : Natural; + Prev_Tok : Token_Type; + end record; + + procedure Init (Ctxt : out Simple_Ctxt); + procedure Start_Hbox (Ctxt : in out Simple_Ctxt); + procedure Close_Hbox (Ctxt : in out Simple_Ctxt); + procedure Start_Vbox (Ctxt : in out Simple_Ctxt); + procedure Close_Vbox (Ctxt : in out Simple_Ctxt); + procedure Disp_Token (Ctxt : in out Simple_Ctxt; Tok : Token_Type); + procedure Start_Lit (Ctxt : in out Simple_Ctxt; Tok : Token_Type); + procedure Disp_Char (Ctxt : in out Simple_Ctxt; C : Character); + procedure Close_Lit (Ctxt : in out Simple_Ctxt); + private + procedure Put (Ctxt : in out Simple_Ctxt; C : Character); + end Simple_Disp_Ctxt; + + package body Simple_Disp_Ctxt is + procedure Init (Ctxt : out Simple_Ctxt) is + begin + Ctxt := (Vnum => 0, + Hnum => 0, + Prev_Tok => Tok_Newline); + end Init; + + procedure Put (Ctxt : in out Simple_Ctxt; C : Character) + is + pragma Unreferenced (Ctxt); + begin + Simple_IO.Put (C); + end Put; + + procedure Start_Hbox (Ctxt : in out Simple_Ctxt) is + begin + if Ctxt.Hnum = 0 then + for I in 1 .. Ctxt.Vnum loop + Put (Ctxt, ' '); + Put (Ctxt, ' '); + end loop; + end if; + Ctxt.Hnum := Ctxt.Hnum + 1; + end Start_Hbox; + + procedure Close_Hbox (Ctxt : in out Simple_Ctxt) is + begin + Ctxt.Hnum := Ctxt.Hnum - 1; + if Ctxt.Hnum = 0 then + Put (Ctxt, ASCII.LF); + Ctxt.Prev_Tok := Tok_Newline; + end if; + end Close_Hbox; + + procedure Start_Vbox (Ctxt : in out Simple_Ctxt) is + begin + pragma Assert (Ctxt.Hnum = 0); + Ctxt.Vnum := Ctxt.Vnum + 1; + end Start_Vbox; + + procedure Close_Vbox (Ctxt : in out Simple_Ctxt) is + begin + Ctxt.Vnum := Ctxt.Vnum - 1; + end Close_Vbox; + + procedure Disp_Space (Ctxt : in out Simple_Ctxt; Tok : Token_Type) + is + Prev_Tok : constant Token_Type := Ctxt.Prev_Tok; + begin + if Need_Space (Tok, Prev_Tok) then + Put (Ctxt, ' '); + end if; + Ctxt.Prev_Tok := Tok; + end Disp_Space; + + procedure Disp_Token (Ctxt : in out Simple_Ctxt; Tok : Token_Type) is + begin + Disp_Space (Ctxt, Tok); + Disp_Str (Ctxt, Image (Tok)); + end Disp_Token; + + procedure Start_Lit (Ctxt : in out Simple_Ctxt; Tok : Token_Type) is + begin + Disp_Space (Ctxt, Tok); + end Start_Lit; + + procedure Disp_Char (Ctxt : in out Simple_Ctxt; C : Character) is + begin + Put (Ctxt, C); + end Disp_Char; + + procedure Close_Lit (Ctxt : in out Simple_Ctxt) is + begin + null; + end Close_Lit; + end Simple_Disp_Ctxt; + + procedure Disp_Vhdl (N : Iir) + is + use Simple_Disp_Ctxt; + Ctxt : Simple_Ctxt; + begin + Init (Ctxt); + Disp_Vhdl (Ctxt, N); + end Disp_Vhdl; + + procedure Disp_Expression (Expr: Iir) + is + use Simple_Disp_Ctxt; + Ctxt : Simple_Ctxt; + begin + Init (Ctxt); + Print (Ctxt, Expr); + end Disp_Expression; + + procedure Disp_PSL_NFA (N : PSL.Nodes.NFA) + is + use Simple_Disp_Ctxt; + Ctxt : Simple_Ctxt; + begin + Init (Ctxt); + Disp_PSL_NFA (Ctxt, N); + end Disp_PSL_NFA; + +end Vhdl.Prints; |