summaryrefslogtreecommitdiff
path: root/src/ghdldrv/foreigns.adb
blob: 15e3dd0095f67d3e587b8d7c183387c961d9ccbe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
with Interfaces.C; use Interfaces.C;

package body Foreigns is
   function Sin (Arg : double) return double;
   pragma Import (C, Sin);

   function Log (Arg : double) return double;
   pragma Import (C, Log);

   function Exp (Arg : double) return double;
   pragma Import (C, Exp);

   function Sqrt (Arg : double) return double;
   pragma Import (C, Sqrt);

   function Asin (Arg : double) return double;
   pragma Import (C, Asin);

   function Acos (Arg : double) return double;
   pragma Import (C, Acos);

   function Asinh (Arg : double) return double;
   pragma Import (C, Asinh);

   function Acosh (Arg : double) return double;
   pragma Import (C, Acosh);

   function Atanh (X : double) return double;
   pragma Import (C, Atanh);

   function Atan2 (X, Y : double) return double;
   pragma Import (C, Atan2);

   type String_Cacc is access constant String;
   type Foreign_Record is record
      Name : String_Cacc;
      Addr : Address;
   end record;


   Foreign_Arr : constant array (Natural range <>) of Foreign_Record :=
     (
      (new String'("sin"), Sin'Address),
      (new String'("log"), Log'Address),
      (new String'("exp"), Exp'Address),
      (new String'("sqrt"), Sqrt'Address),
      (new String'("asin"), Asin'Address),
      (new String'("acos"), Acos'Address),
      (new String'("asinh"), Asinh'Address),
      (new String'("acosh"), Acosh'Address),
      (new String'("atanh"), Atanh'Address),
      (new String'("atan2"), Atan2'Address)
     );

   function Find_Foreign (Name : String) return Address is
   begin
      for I in Foreign_Arr'Range loop
         if Foreign_Arr(I).Name.all = Name then
            return Foreign_Arr(I).Addr;
         end if;
      end loop;
      return Null_Address;
   end Find_Foreign;
end Foreigns;