aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTristan Gingold <tgingold@free.fr>2022-05-31 05:22:07 +0200
committerTristan Gingold <tgingold@free.fr>2022-05-31 18:28:24 +0200
commit03bbe8a6b26b5572d546559d9fb87b232f0fb945 (patch)
tree33a53fdc9bf68a89a35b8df612ced74a0e2463ba /src
parentc8dffe5ce5f11f4da59dba36129c2e754425f047 (diff)
downloadghdl-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.adb32
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);