Previous: Linking with Ada, Up: Interfacing to other languages


5.9.6 Using GRT from Ada

Warning: This topic is only for advanced users knowing how to use Ada and GNAT. This is provided only for reference, I have tested this once before releasing GHDL 0.19 but this is not checked at each release.

The simulator kernel of GHDL named GRT is written in Ada95 and contains a very light and slightly adapted version of VHPI. Since it is an Ada implementation it is called AVHPI. Although being tough, you may interface to AVHPI.

For using AVHPI, you need the sources of GHDL and to recompile them (at least the GRT library). This library is usually compiled with a No_Run_Time pragma, so that the user does not need to install the GNAT runtime library. However, you certainly want to use the usual runtime library and want to avoid this pragma. For this, reset the GRT_PRAGMA_FLAG variable.

     $ make GRT_PRAGMA_FLAG= grt-all

Since GRT is a self-contained library, you don't want gnatlink to fetch individual object files (furthermore this doesn't always work due to tricks used in GRT). For this, remove all the object files and make the .ali files read-only.

     $ rm *.o
     $ chmod -w *.ali

You may then install the sources files and the .ali files. I have never tested this step.

You are now ready to use it.

For example, here is an example, test_grt.adb which displays the top level design name.

     with System; use System;
     with Grt.Avhpi; use Grt.Avhpi;
     with Ada.Text_IO; use Ada.Text_IO;
     with Ghdl_Main;
     
     procedure Test_Grt is
        --  VHPI handle.
        H : VhpiHandleT;
        Status : Integer;
     
        --  Name.
        Name : String (1 .. 64);
        Name_Len : Integer;
     begin
        --  Elaborate and run the design.
        Status := Ghdl_Main (0, Null_Address);
     
        --  Display the status of the simulation.
        Put_Line ("Status is " & Integer'Image (Status));
     
        --  Get the root instance.
        Get_Root_Inst(H);
     
        --  Disp its name using vhpi API.
        Vhpi_Get_Str (VhpiNameP, H, Name, Name_Len);
        Put_Line ("Root instance name: " & Name (1 .. Name_Len));
     end Test_Grt;

First, analyze and bind your design:

     $ ghdl -a counter.vhdl
     $ ghdl --bind counter

Then build the whole:

     $ gnatmake test_grt -aLgrt_ali_path -aIgrt_src_path -largs
      `ghdl --list-link counter`

Finally, run your design:

     $ ./test_grt
     Status is  0
     Root instance name: counter