diff options
author | Tristan Gingold <tgingold@free.fr> | 2022-05-31 05:22:07 +0200 |
---|---|---|
committer | Tristan Gingold <tgingold@free.fr> | 2022-05-31 18:28:24 +0200 |
commit | 03bbe8a6b26b5572d546559d9fb87b232f0fb945 (patch) | |
tree | 33a53fdc9bf68a89a35b8df612ced74a0e2463ba /src | |
parent | c8dffe5ce5f11f4da59dba36129c2e754425f047 (diff) | |
download | ghdl-03bbe8a6b26b5572d546559d9fb87b232f0fb945.tar.gz ghdl-03bbe8a6b26b5572d546559d9fb87b232f0fb945.tar.bz2 ghdl-03bbe8a6b26b5572d546559d9fb87b232f0fb945.zip |
synth-vhdl_static_proc: handle write_real
Diffstat (limited to 'src')
-rw-r--r-- | src/synth/synth-vhdl_static_proc.adb | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/synth/synth-vhdl_static_proc.adb b/src/synth/synth-vhdl_static_proc.adb index a20865696..9a724cc89 100644 --- a/src/synth/synth-vhdl_static_proc.adb +++ b/src/synth/synth-vhdl_static_proc.adb @@ -16,16 +16,21 @@ -- You should have received a copy of the GNU General Public License -- along with this program. If not, see <gnu.org/licenses>. +with Interfaces; + with Types; use Types; with Vhdl.Errors; use Vhdl.Errors; +with Elab.Memtype; with Elab.Vhdl_Values; use Elab.Vhdl_Values; with Elab.Vhdl_Heap; with Elab.Vhdl_Files; use Elab.Vhdl_Files; with Synth.Errors; use Synth.Errors; +with Grt.Fcvt; + package body Synth.Vhdl_Static_Proc is procedure Synth_Deallocate (Syn_Inst : Synth_Instance_Acc; Imp : Node) @@ -45,6 +50,31 @@ package body Synth.Vhdl_Static_Proc is end if; end Synth_Deallocate; + procedure Synth_Textio_Write_Real (Syn_Inst : Synth_Instance_Acc; + Imp : Node) + is + use Elab.Memtype; + Param1 : constant Node := Get_Interface_Declaration_Chain (Imp); + Str : constant Valtyp := Get_Value (Syn_Inst, Param1); + Param2 : constant Node := Get_Chain (Param1); + Len : constant Valtyp := Get_Value (Syn_Inst, Param2); + Param3 : constant Node := Get_Chain (Param2); + Val : constant Valtyp := Get_Value (Syn_Inst, Param3); + Param4 : constant Node := Get_Chain (Param3); + Ndigits : constant Valtyp := Get_Value (Syn_Inst, Param4); + + S : String (1 .. Natural (Str.Typ.Abound.Len)); + Last : Natural; + begin + Grt.Fcvt.Format_Digits (S, Last, + Interfaces.IEEE_Float_64 (Read_Fp64 (Val)), + Natural (Read_Discrete (Ndigits))); + Write_Discrete (Len, Int64 (Last)); + for I in 1 .. Last loop + Write_U8 (Str.Val.Mem + Size_Type (I - 1), Character'Pos (S (I))); + end loop; + end Synth_Textio_Write_Real; + procedure Synth_Static_Procedure (Syn_Inst : Synth_Instance_Acc; Imp : Node; Loc : Node) is @@ -70,6 +100,8 @@ package body Synth.Vhdl_Static_Proc is else raise Internal_Error; end if; + when Iir_Predefined_Foreign_Textio_Write_Real => + Synth_Textio_Write_Real (Syn_Inst, Imp); when others => Error_Msg_Synth (+Loc, "call to implicit %n is not supported", +Imp); |