aboutsummaryrefslogtreecommitdiffstats
path: root/src/synth/synth-vhdl_static_proc.adb
diff options
context:
space:
mode:
Diffstat (limited to 'src/synth/synth-vhdl_static_proc.adb')
-rw-r--r--src/synth/synth-vhdl_static_proc.adb42
1 files changed, 42 insertions, 0 deletions
diff --git a/src/synth/synth-vhdl_static_proc.adb b/src/synth/synth-vhdl_static_proc.adb
index 0764d35c1..9144d5061 100644
--- a/src/synth/synth-vhdl_static_proc.adb
+++ b/src/synth/synth-vhdl_static_proc.adb
@@ -16,14 +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)
@@ -43,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
@@ -62,6 +94,16 @@ package body Synth.Vhdl_Static_Proc is
Synth_File_Read (Syn_Inst, Imp, Loc);
when Iir_Predefined_Write =>
Synth_File_Write (Syn_Inst, Imp, Loc);
+ when Iir_Predefined_Flush =>
+ Synth_File_Flush (Syn_Inst, Imp, Loc);
+ when Iir_Predefined_Std_Env_Finish_Status =>
+ if Hook_Finish /= null then
+ Hook_Finish.all (Syn_Inst, Imp);
+ 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);