-- GHDL Run Time (GRT) - Common display subprograms. -- Copyright (C) 2002 - 2014 Tristan Gingold -- -- This program 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 of the License, or -- (at your option) any later version. -- -- This program 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 this program. If not, see . -- -- As a special exception, if other files instantiate generics from this -- unit, or you link this unit with other files to produce an executable, -- this unit does not by itself cause the resulting executable to be -- covered by the GNU General Public License. This exception does not -- however invalidate any other reasons why the executable file might be -- covered by the GNU Public License. with System.Storage_Elements; -- Work around GNAT bug. pragma Unreferenced (System.Storage_Elements); with Grt.Astdio; use Grt.Astdio; with Grt.Astdio.Vhdl; use Grt.Astdio.Vhdl; with Grt.Stdio; use Grt.Stdio; --with Grt.Errors; use Grt.Errors; package body Grt.Disp is -- procedure Put_Trim (Stream : FILEs; Str : String) -- is -- Start : Natural; -- begin -- Start := Str'First; -- while Start <= Str'Last and then Str (Start) = ' ' loop -- Start := Start + 1; -- end loop; -- Put (Stream, Str (Start .. Str'Last)); -- end Put_Trim; -- procedure Put_E8 (Stream : FILEs; E8 : Ghdl_E8; Type_Desc : Ghdl_Desc_Ptr) -- is -- begin -- Put_Str_Len (Stream, Type_Desc.E8.Values (Natural (E8))); -- end Put_E8; --procedure Put_E32 -- (Stream : FILEs; E32 : Ghdl_E32; Type_Desc : Ghdl_Desc_Ptr) --is --begin -- Put_Str_Len (Stream, Type_Desc.E32.Values (Natural (E32))); --end Put_E32; procedure Put_Sig_Index (Sig : Sig_Table_Index) is begin Put_I32 (stdout, Ghdl_I32 (Sig)); end Put_Sig_Index; procedure Put_Sig_Range (Sig : Sig_Table_Range) is begin Put_Sig_Index (Sig.First); if Sig.Last /= Sig.First then Put ("-"); Put_Sig_Index (Sig.Last); end if; end Put_Sig_Range; procedure Disp_Now is begin Put ("Now is "); Put_Time (stdout, Current_Time); Put (" +"); Put_I32 (stdout, Ghdl_I32 (Current_Delta)); New_Line; end Disp_Now; procedure Disp_Propagation_Kind (Kind : Propagation_Kind_Type) is begin case Kind is when Drv_One_Driver => Put ("Drv (1 drv) "); when Eff_One_Driver => Put ("Eff (1 drv) "); when Drv_One_Port => Put ("Drv (1 prt) "); when Eff_One_Port => Put ("Eff (1 prt) "); when Imp_Forward => Put ("Forward "); when Imp_Forward_Build => Put ("Forward_Build "); when Imp_Guard => Put ("Guard "); when Imp_Stable => Put ("Stable "); when Imp_Quiet => Put ("Quiet "); when Imp_Transaction => Put ("Transaction "); when Imp_Delayed => Put ("Delayed "); when Eff_Actual => Put ("Eff Actual "); when Eff_Multiple => Put ("Eff multiple "); when Drv_One_Resolved => Put ("Drv 1 resolved "); when Eff_One_Resolved => Put ("Eff 1 resolved "); when In_Conversion => Put ("In conv "); when Out_Conversion => Put ("Out conv "); when Drv_Error => Put ("Drv error "); when Drv_Multiple => Put ("Drv multiple "); when Prop_End => Put ("end "); end case; end Disp_Propagation_Kind; procedure Disp_Signals_Order is begin for I in Propagation.First .. Propagation.Last loop Put_I32 (stdout, Ghdl_I32 (I)); Put (": "); Disp_Propagation_Kind (Propagation.Table (I).Kind); case Propagation.Table (I).Kind is when Drv_One_Driver | Eff_One_Driver | Drv_One_Port | Eff_One_Port | Drv_One_Resolved | Eff_One_Resolved | Imp_Guard | Imp_Stable | Imp_Quiet | Imp_Transaction | Imp_Delayed | Eff_Actual => Put_Sig_Index (Signal_Ptr_To_Index (Propagation.Table (I).Sig)); New_Line; when Imp_Forward => Put_I32 (stdout, Ghdl_I32 (Propagation.Table (I).Sig.Net)); New_Line; when Imp_Forward_Build => declare Forward : Forward_Build_Acc; begin Forward := Propagation.Table (I).Forward; Put_Sig_Index (Signal_Ptr_To_Index (Forward.Src)); Put (" -> "); Put_Sig_Index (Signal_Ptr_To_Index (Forward.Targ)); New_Line; end; when Eff_Multiple | Drv_Multiple => Put_Sig_Range (Propagation.Table (I).Resolv.Sig_Range); New_Line; when In_Conversion | Out_Conversion => declare Conv : Sig_Conversion_Acc; begin Conv := Propagation.Table (I).Conv; Put_Sig_Range (Conv.Src); Put (" -> "); Put_Sig_Range (Conv.Dest); New_Line; end; when Prop_End => New_Line; when Drv_Error => null; end case; end loop; end Disp_Signals_Order; procedure Disp_Mode (Mode : Mode_Type) is begin case Mode is when Mode_B1 => Put (" b1"); when Mode_E8 => Put (" e8"); when Mode_E32 => Put ("e32"); when Mode_I32 => Put ("i32"); when Mode_I64 => Put ("i64"); when Mode_F64 => Put ("f64"); end case; end Disp_Mode; procedure Disp_Value (Value : Value_Union; Mode : Mode_Type) is begin case Mode is when Mode_B1 => if Value.B1 then Put ("T"); else Put ("F"); end if; when Mode_E8 => Put_I32 (stdout, Ghdl_I32 (Value.E8)); when Mode_E32 => Put_I32 (stdout, Ghdl_I32 (Value.E32)); when Mode_I32 => Put_I32 (stdout, Value.I32); when Mode_I64 => Put_I64 (stdout, Value.I64); when Mode_F64 => Put_F64 (stdout, Value.F64); end case; end Disp_Value; end Grt.Disp;