// DESCRIPTION: Verilator: Verilog Test module
//
// This program is free software; you can redistribute it and/or modify it
// under the terms of either the GNU Lesser General Public License Version 3
// or the Perl Artistic License Version 2.0.
// SPDX-FileCopyrightText: 2020 Yutetsu TAKATSUKASA
// SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0

// verilog_format: off
`ifdef VCS
 `define NO_TIME
`endif

`ifdef NC
 `define NO_TIME
 `define NO_INTEGER
 `define NO_SHORTREAL
`endif

`ifdef MS
 `define NO_BITS_TO_SCALAR
`endif

`ifdef VERILATOR
 `define NO_SHORTREAL
 `define NO_UNPACK_STRUCT
//%Error-TASKNSVAR: Unsupported: Function/task input argument is not simple variable
 `define NO_INOUT_COMPLEX_TYPE
`endif

`ifdef NO_BITS_TO_SCALAR
 `define ARE_SAME(act, exp) ($bits((act)) == 1 ? (act) == ((exp) & 1) : (act) == (exp))
`else
 `define ARE_SAME(act, exp) ((act) == (($bits(act))'(exp)))
`endif

`define CHECK_VAL(act, exp) if (`ARE_SAME(act, exp)) begin \
  if (ENABLE_VERBOSE_MESSAGE)$display(`"act`", ":", (act), " as expected"); \
    end else begin \
      $display("Mismatch %s expected:%d actual:%d at %d", `"act`", int'(exp), int'(act), `__LINE__); \
        $stop; \
          end

`define CHECK_CHANDLE_VAL(act, exp) if ((act) == (exp)) begin \
  if (ENABLE_VERBOSE_MESSAGE)$display(`"act`", ":non-null as expected"); \
    end else begin \
      $display("Mismatch %s expected:%s but %s at %d", `"act`", \
               (exp) != null ? "null" : "non-null", \
               (act) != null ? "null" : "non-null", `__LINE__); \
                        $stop; \
                        end

`define CHECK_STRING_VAL(act, exp) if ((act) == (exp)) begin \
  if (ENABLE_VERBOSE_MESSAGE)$display(`"act`", ":", (act), " as expected"); \
    end else begin \
      $display("Mismatch %s expected:%s actual:%s at %d", `"act`", (exp), (act), `__LINE__); \
        $stop; \
          end

`define UPDATE_VAL(var, val) `CHECK_VAL(var, val); var += 1

`define UPDATE_0D(val) \
  `UPDATE_VAL(val, 42)
`define UPDATE_1D(val) \
  `UPDATE_VAL(val[0], 43); \
  `UPDATE_VAL(val[1], 44)
`define UPDATE_2D(val) \
  `UPDATE_VAL(val[0][1], 45); \
  `UPDATE_VAL(val[1][1], 46); \
  `UPDATE_VAL(val[2][1], 47)
`define UPDATE_3D(val) \
  `UPDATE_VAL(val[0][0][0], 48); \
  `UPDATE_VAL(val[1][0][0], 49); \
  `UPDATE_VAL(val[2][0][0], 50); \
  `UPDATE_VAL(val[3][0][0], 51)

`define UPDATE_1D1(val) \
  `UPDATE_VAL(val[0], 52)
`define UPDATE_2D1(val) \
  `UPDATE_VAL(val[0][0], 53)
`define UPDATE_3D1(val) \
  `UPDATE_VAL(val[0][0][0], 54)


`define CHECK_0D(val) \
  `CHECK_VAL((val), 43)
`define CHECK_1D(val) \
  `CHECK_VAL(val[0], 44); \
  `CHECK_VAL(val[1], 45)
`define CHECK_2D(val) \
  `CHECK_VAL(val[0][1], 46); \
  `CHECK_VAL(val[1][1], 47); \
  `CHECK_VAL(val[2][1], 48)
`define CHECK_3D(val) \
  `CHECK_VAL(val[0][0][0], 49); \
  `CHECK_VAL(val[1][0][0], 50); \
  `CHECK_VAL(val[2][0][0], 51); \
  `CHECK_VAL(val[3][0][0], 52)

`define CHECK_1D1(val) \
  `CHECK_VAL(val[0], 53)
`define CHECK_2D1(val) \
  `CHECK_VAL(val[0][0], 54)
`define CHECK_3D1(val) \
  `CHECK_VAL(val[0][0][0], 55)

`define CHECK_DOUBLE_VAL(act, exp) if ((act) == (exp)) begin \
  if (ENABLE_VERBOSE_MESSAGE)$display("%s:%f as expected", `"act`", (act)); \
    end else begin \
      $display("Mismatch %s expected:%f actual:%f at %d", `"act`", (exp), (act), `__LINE__); \
        $stop; \
          end

`define CHECK_DOUBLE_0D(val) \
  `CHECK_DOUBLE_VAL((val), 43.0)
`define CHECK_DOUBLE_1D(val) \
  `CHECK_DOUBLE_VAL(val[0], 44.0); \
  `CHECK_DOUBLE_VAL(val[1], 45.0)
`define CHECK_DOUBLE_2D(val) \
  `CHECK_DOUBLE_VAL(val[0][1], 46.0); \
  `CHECK_DOUBLE_VAL(val[1][1], 47.0); \
  `CHECK_DOUBLE_VAL(val[2][1], 48.0)
`define CHECK_DOUBLE_3D(val) \
  `CHECK_DOUBLE_VAL(val[0][0][0], 49.0); \
  `CHECK_DOUBLE_VAL(val[1][0][0], 50.0); \
  `CHECK_DOUBLE_VAL(val[2][0][0], 51.0); \
  `CHECK_DOUBLE_VAL(val[3][0][0], 52.0)

`define CHECK_DOUBLE_1D1(val) \
  `CHECK_DOUBLE_VAL(val[0], 53.0)
`define CHECK_DOUBLE_2D1(val) \
  `CHECK_DOUBLE_VAL(val[0][0], 54.0)
`define CHECK_DOUBLE_3D1(val) \
  `CHECK_DOUBLE_VAL(val[0][0][0], 55.0)

`define SET_VALUE_0D(val) \
  /*verilator lint_off WIDTH */ \
  val = 42 \
  /*verilator lint_on WIDTH */
`define SET_VALUE_1D(val) \
  /*verilator lint_off WIDTH */ \
  val[0] = 43; val[1] = 44 \
  /*verilator lint_on WIDTH */
`define SET_VALUE_2D(val) \
  /*verilator lint_off WIDTH */ \
  val[0][1] = 45; val[1][1] = 46; val[2][1] = 47 \
  /*verilator lint_on WIDTH */
`define SET_VALUE_3D(val) \
  /*verilator lint_off WIDTH */ \
  val[3][2][1] = 42; \
  val[2][1][0] = 43; val[2][1][1] = 44; \
  val[1][0][1] = 45; val[1][1][1] = 46; val[1][2][1] = 47; \
  val[0][0][0] = 48; val[1][0][0] = 49; val[2][0][0] = 50; val[3][0][0] = 51 \
  /*verilator lint_on WIDTH */

`define SET_VALUE_1D1(val) \
  /*verilator lint_off WIDTH */ \
  val[0] = 52; \
  /*verilator lint_on WIDTH */
`define SET_VALUE_2D1(val) \
  /*verilator lint_off WIDTH */ \
  val[0][0] = 53; \
  /*verilator lint_on WIDTH */
`define SET_VALUE_3D1(val) \
  /*verilator lint_off WIDTH */ \
  val[0][0][0] = 54; \
  /*verilator lint_on WIDTH */

module t;

  localparam ENABLE_VERBOSE_MESSAGE = 0;

  // Legal output argument types for DPI functions

  //======================================================================
  // Type definitions
  //======================================================================

  typedef byte                   byte_t;
  typedef byte_t                 byte_array_t[4][3][2];
  typedef byte_t                 byte_array1_t[1][1][1];
  typedef byte unsigned          byte_unsigned_t;
  typedef byte_unsigned_t        byte_unsigned_array_t[4][3][2];
  typedef byte_unsigned_t        byte_unsigned_array1_t[1][1][1];
  typedef shortint               shortint_t;
  typedef shortint_t             shortint_array_t[4][3][2];
  typedef shortint_t             shortint_array1_t[1][1][1];
  typedef shortint unsigned      shortint_unsigned_t;
  typedef shortint_unsigned_t    shortint_unsigned_array_t[4][3][2];
  typedef shortint_unsigned_t    shortint_unsigned_array1_t[1][1][1];
  typedef int                    int_t;
  typedef int_t                  int_array_t[4][3][2];
  typedef int_t                  int_array1_t[1][1][1];
  typedef int unsigned           int_unsigned_t;
  typedef int_unsigned_t         int_unsigned_array_t[4][3][2];
  typedef int_unsigned_t         int_unsigned_array1_t[1][1][1];
  typedef longint                longint_t;
  typedef longint_t              longint_array_t[4][3][2];
  typedef longint_t              longint_array1_t[1][1][1];
  typedef longint unsigned       longint_unsigned_t;
  typedef longint_unsigned_t     longint_unsigned_array_t[4][3][2];
  typedef longint_unsigned_t     longint_unsigned_array1_t[1][1][1];
`ifndef NO_TIME
  typedef time              time_t;
  typedef time_t            time_array_t[4][3][2];
  typedef time_t            time_array1_t[1][1][1];
`endif
`ifndef NO_INTEGER
  typedef integer           integer_t;
  typedef integer_t         integer_array_t[4][3][2];
  typedef integer_t         integer_array1_t[1][1][1];
`endif
  typedef real              real_t;
  typedef real_t            real_array_t[4][3][2];
  typedef real_t            real_array1_t[1][1][1];
`ifndef NO_SHORTREAL
  typedef shortreal         shortreal_t;
  typedef shortreal_t       shortreal_array_t[4][3][2];
  typedef shortreal_t       shortreal_array1_t[1][1][1];
`endif
  typedef chandle           chandle_t;
  typedef chandle_t         chandle_array_t[4][3][2];
  typedef chandle_t         chandle_array1_t[1][1][1];
  typedef string            string_t;
  typedef string_t          string_array_t[4][3][2];
  typedef string_t          string_array1_t[1][1][1];
  typedef bit               bit1_t;
  typedef bit1_t            bit1_array_t[4][3][2];
  typedef bit1_t            bit1_array1_t[1][1][1];
  typedef bit [6:0]         bit7_t;
  typedef bit7_t            bit7_array_t[4][3][2];
  typedef bit7_t            bit7_array1_t[1][1][1];
  typedef bit [120:0]       bit121_t;
  typedef bit121_t          bit121_array_t[4][3][2];
  typedef bit121_t          bit121_array1_t[1][1][1];
  typedef logic             logic1_t;
  typedef logic1_t          logic1_array_t[4][3][2];
  typedef logic1_t          logic1_array1_t[1][1][1];
  typedef logic [6:0]       logic7_t;
  typedef logic7_t          logic7_array_t[4][3][2];
  typedef logic7_t          logic7_array1_t[1][1][1];
  typedef logic [120:0]     logic121_t;
  typedef logic121_t        logic121_array_t[4][3][2];
  typedef logic121_t        logic121_array1_t[1][1][1];

  typedef struct            packed {
    logic [6:0]            val;
  } pack_struct_t;
  typedef pack_struct_t     pack_struct_array_t[4][3][2];
  typedef pack_struct_t     pack_struct_array1_t[1][1][1];
`ifndef NO_UNPACK_STRUCT
  typedef struct            {
    logic [120:0]          val;
  } unpack_struct_t;
  typedef unpack_struct_t   unpack_struct_array_t[4][3][2];
  typedef unpack_struct_t   unpack_struct_array1_t[1][1][1];
`endif

  //======================================================================
  // Imports
  //======================================================================

  // Returns non-null pointer
  import "DPI-C" function chandle get_non_null();

  import "DPI-C" function void i_byte_0d(inout byte_t val);
  import "DPI-C" function void i_byte_1d(inout byte_t val[2]);
  import "DPI-C" function void i_byte_2d(inout byte_t val[3][2]);
  import "DPI-C" function void i_byte_3d(inout byte_array_t val);
  import "DPI-C" function void i_byte_1d1(inout byte_t val[1]);
  import "DPI-C" function void i_byte_2d1(inout byte_t val[1][1]);
  import "DPI-C" function void i_byte_3d1(inout byte_array1_t val);

  import "DPI-C" function void i_byte_unsigned_0d(inout byte unsigned val);
  import "DPI-C" function void i_byte_unsigned_1d(inout byte unsigned val[2]);
  import "DPI-C" function void i_byte_unsigned_2d(inout byte unsigned val[3][2]);
  import "DPI-C" function void i_byte_unsigned_3d(inout byte_unsigned_array_t val);
  import "DPI-C" function void i_byte_unsigned_1d1(inout byte unsigned val[1]);
  import "DPI-C" function void i_byte_unsigned_2d1(inout byte unsigned val[1][1]);
  import "DPI-C" function void i_byte_unsigned_3d1(inout byte_unsigned_array1_t val);

  import "DPI-C" function void i_shortint_0d(inout shortint val);
  import "DPI-C" function void i_shortint_1d(inout shortint val[2]);
  import "DPI-C" function void i_shortint_2d(inout shortint val[3][2]);
  import "DPI-C" function void i_shortint_3d(inout shortint_array_t val);
  import "DPI-C" function void i_shortint_1d1(inout shortint val[1]);
  import "DPI-C" function void i_shortint_2d1(inout shortint val[1][1]);
  import "DPI-C" function void i_shortint_3d1(inout shortint_array1_t val);

  import "DPI-C" function void i_shortint_unsigned_0d(inout shortint unsigned val);
  import "DPI-C" function void i_shortint_unsigned_1d(inout shortint unsigned val[2]);
  import "DPI-C" function void i_shortint_unsigned_2d(inout shortint unsigned val[3][2]);
  import "DPI-C" function void i_shortint_unsigned_3d(inout shortint_unsigned_array_t val);
  import "DPI-C" function void i_shortint_unsigned_1d1(inout shortint unsigned val[1]);
  import "DPI-C" function void i_shortint_unsigned_2d1(inout shortint unsigned val[1][1]);
  import "DPI-C" function void i_shortint_unsigned_3d1(inout shortint_unsigned_array1_t val);

  import "DPI-C" function void i_int_0d(inout int val);
  import "DPI-C" function void i_int_1d(inout int val[2]);
  import "DPI-C" function void i_int_2d(inout int val[3][2]);
  import "DPI-C" function void i_int_3d(inout int_array_t val);
  import "DPI-C" function void i_int_1d1(inout int val[1]);
  import "DPI-C" function void i_int_2d1(inout int val[1][1]);
  import "DPI-C" function void i_int_3d1(inout int_array1_t val);

  import "DPI-C" function void i_int_unsigned_0d(inout int unsigned val);
  import "DPI-C" function void i_int_unsigned_1d(inout int unsigned val[2]);
  import "DPI-C" function void i_int_unsigned_2d(inout int unsigned val[3][2]);
  import "DPI-C" function void i_int_unsigned_3d(inout int_unsigned_array_t val);
  import "DPI-C" function void i_int_unsigned_1d1(inout int unsigned val[1]);
  import "DPI-C" function void i_int_unsigned_2d1(inout int unsigned val[1][1]);
  import "DPI-C" function void i_int_unsigned_3d1(inout int_unsigned_array1_t val);

  import "DPI-C" function void i_longint_0d(inout longint val);
  import "DPI-C" function void i_longint_1d(inout longint val[2]);
  import "DPI-C" function void i_longint_2d(inout longint val[3][2]);
  import "DPI-C" function void i_longint_3d(inout longint_array_t val);
  import "DPI-C" function void i_longint_1d1(inout longint val[1]);
  import "DPI-C" function void i_longint_2d1(inout longint val[1][1]);
  import "DPI-C" function void i_longint_3d1(inout longint_array1_t val);

  import "DPI-C" function void i_longint_unsigned_0d(inout longint unsigned val);
  import "DPI-C" function void i_longint_unsigned_1d(inout longint unsigned val[2]);
  import "DPI-C" function void i_longint_unsigned_2d(inout longint unsigned val[3][2]);
  import "DPI-C" function void i_longint_unsigned_3d(inout longint_unsigned_array_t val);
  import "DPI-C" function void i_longint_unsigned_1d1(inout longint unsigned val[1]);
  import "DPI-C" function void i_longint_unsigned_2d1(inout longint unsigned val[1][1]);
  import "DPI-C" function void i_longint_unsigned_3d1(inout longint_unsigned_array1_t val);

`ifndef NO_TIME
  import "DPI-C" function void i_time_0d(inout time val);
  import "DPI-C" function void i_time_1d(inout time val[2]);
  import "DPI-C" function void i_time_2d(inout time val[3][2]);
  import "DPI-C" function void i_time_3d(inout time_array_t val);
  import "DPI-C" function void i_time_1d1(inout time val[1]);
  import "DPI-C" function void i_time_2d1(inout time val[1][1]);
  import "DPI-C" function void i_time_3d1(inout time_array1_t val);
`endif

`ifndef NO_INTEGER
  import "DPI-C" function void i_integer_0d(inout integer val);
  import "DPI-C" function void i_integer_1d(inout integer val[2]);
  import "DPI-C" function void i_integer_2d(inout integer val[3][2]);
  import "DPI-C" function void i_integer_3d(inout integer_array_t val);
  import "DPI-C" function void i_integer_1d1(inout integer val[1]);
  import "DPI-C" function void i_integer_2d1(inout integer val[1][1]);
  import "DPI-C" function void i_integer_3d1(inout integer_array1_t val);
`endif

  import "DPI-C" function void i_real_0d(inout real val);
  import "DPI-C" function void i_real_1d(inout real val[2]);
  import "DPI-C" function void i_real_2d(inout real val[3][2]);
  import "DPI-C" function void i_real_3d(inout real_array_t val);
  import "DPI-C" function void i_real_1d1(inout real val[1]);
  import "DPI-C" function void i_real_2d1(inout real val[1][1]);
  import "DPI-C" function void i_real_3d1(inout real_array1_t val);

`ifndef NO_SHORTREAL
  import "DPI-C" function void i_shortreal_0d(inout shortreal val);
  import "DPI-C" function void i_shortreal_1d(inout shortreal val[2]);
  import "DPI-C" function void i_shortreal_2d(inout shortreal val[3][2]);
  import "DPI-C" function void i_shortreal_3d(inout shortreal_array_t val);
  import "DPI-C" function void i_shortreal_1d1(inout shortreal val[1]);
  import "DPI-C" function void i_shortreal_2d1(inout shortreal val[1][1]);
  import "DPI-C" function void i_shortreal_3d1(inout shortreal_array1_t val);
`endif

  import "DPI-C" function void i_chandle_0d(inout chandle val);
  import "DPI-C" function void i_chandle_1d(inout chandle val[2]);
  import "DPI-C" function void i_chandle_2d(inout chandle val[3][2]);
  import "DPI-C" function void i_chandle_3d(inout chandle_array_t val);
  import "DPI-C" function void i_chandle_1d1(inout chandle val[1]);
  import "DPI-C" function void i_chandle_2d1(inout chandle val[1][1]);
  import "DPI-C" function void i_chandle_3d1(inout chandle_array1_t val);

  import "DPI-C" function void i_string_0d(inout string val);
  import "DPI-C" function void i_string_1d(inout string val[2]);
  import "DPI-C" function void i_string_2d(inout string val[3][2]);
  import "DPI-C" function void i_string_3d(inout string_array_t val);
  import "DPI-C" function void i_string_1d1(inout string val[1]);
  import "DPI-C" function void i_string_2d1(inout string val[1][1]);
  import "DPI-C" function void i_string_3d1(inout string_array1_t val);

  import "DPI-C" function void i_bit1_0d(inout bit val);
  import "DPI-C" function void i_bit1_1d(inout bit val[2]);
  import "DPI-C" function void i_bit1_2d(inout bit val[3][2]);
  import "DPI-C" function void i_bit1_3d(inout bit1_array_t val);
  import "DPI-C" function void i_bit1_1d1(inout bit val[1]);
  import "DPI-C" function void i_bit1_2d1(inout bit val[1][1]);
  import "DPI-C" function void i_bit1_3d1(inout bit1_array1_t val);

  import "DPI-C" function void i_bit7_0d(inout bit[6:0] val);
  import "DPI-C" function void i_bit7_1d(inout bit[6:0] val[2]);
  import "DPI-C" function void i_bit7_2d(inout bit[6:0] val[3][2]);
  import "DPI-C" function void i_bit7_3d(inout bit7_array_t val);
  import "DPI-C" function void i_bit7_1d1(inout bit[6:0] val[1]);
  import "DPI-C" function void i_bit7_2d1(inout bit[6:0] val[1][1]);
  import "DPI-C" function void i_bit7_3d1(inout bit7_array1_t val);

  import "DPI-C" function void i_bit121_0d(inout bit[120:0] val);
  import "DPI-C" function void i_bit121_1d(inout bit[120:0] val[2]);
  import "DPI-C" function void i_bit121_2d(inout bit[120:0] val[3][2]);
  import "DPI-C" function void i_bit121_3d(inout bit121_array_t val);
  import "DPI-C" function void i_bit121_1d1(inout bit[120:0] val[1]);
  import "DPI-C" function void i_bit121_2d1(inout bit[120:0] val[1][1]);
  import "DPI-C" function void i_bit121_3d1(inout bit121_array1_t val);

  import "DPI-C" function void i_logic1_0d(inout logic val);
  import "DPI-C" function void i_logic1_1d(inout logic val[2]);
  import "DPI-C" function void i_logic1_2d(inout logic val[3][2]);
  import "DPI-C" function void i_logic1_3d(inout logic1_array_t val);
  import "DPI-C" function void i_logic1_1d1(inout logic val[1]);
  import "DPI-C" function void i_logic1_2d1(inout logic val[1][1]);
  import "DPI-C" function void i_logic1_3d1(inout logic1_array1_t val);

  import "DPI-C" function void i_logic7_0d(inout logic[6:0] val);
  import "DPI-C" function void i_logic7_1d(inout logic[6:0] val[2]);
  import "DPI-C" function void i_logic7_2d(inout logic[6:0] val[3][2]);
  import "DPI-C" function void i_logic7_3d(inout logic7_array_t val);
  import "DPI-C" function void i_logic7_1d1(inout logic[6:0] val[1]);
  import "DPI-C" function void i_logic7_2d1(inout logic[6:0] val[1][1]);
  import "DPI-C" function void i_logic7_3d1(inout logic7_array1_t val);

  import "DPI-C" function void i_logic121_0d(inout logic[120:0] val);
  import "DPI-C" function void i_logic121_1d(inout logic[120:0] val[2]);
  import "DPI-C" function void i_logic121_2d(inout logic[120:0] val[3][2]);
  import "DPI-C" function void i_logic121_3d(inout logic121_array_t val);
  import "DPI-C" function void i_logic121_1d1(inout logic[120:0] val[1]);
  import "DPI-C" function void i_logic121_2d1(inout logic[120:0] val[1][1]);
  import "DPI-C" function void i_logic121_3d1(inout logic121_array1_t val);

  import "DPI-C" function void i_pack_struct_0d(inout pack_struct_t val);
  import "DPI-C" function void i_pack_struct_1d(inout pack_struct_t val[2]);
  import "DPI-C" function void i_pack_struct_2d(inout pack_struct_t val[3][2]);
  import "DPI-C" function void i_pack_struct_3d(inout pack_struct_array_t val);
  import "DPI-C" function void i_pack_struct_1d1(inout pack_struct_t val[1]);
  import "DPI-C" function void i_pack_struct_2d1(inout pack_struct_t val[1][1]);
  import "DPI-C" function void i_pack_struct_3d1(inout pack_struct_array1_t val);

`ifndef NO_UNPACK_STRUCT
  import "DPI-C" function void i_unpack_struct_0d(inout unpack_struct_t val);
  import "DPI-C" function void i_unpack_struct_1d(inout unpack_struct_t val[2]);
  import "DPI-C" function void i_unpack_struct_2d(inout unpack_struct_t val[3][2]);
  import "DPI-C" function void i_unpack_struct_3d(inout unpack_struct_array_t val);
  import "DPI-C" function void i_unpack_struct_1d1(inout unpack_struct_t val[1]);
  import "DPI-C" function void i_unpack_struct_2d1(inout unpack_struct_t val[1][1]);
  import "DPI-C" function void i_unpack_struct_3d1(inout unpack_struct_array1_t val);
`endif

  //======================================================================
  // Exports
  //======================================================================
  export "DPI-C" function e_byte_0d;
  export "DPI-C" function e_byte_1d;
  export "DPI-C" function e_byte_2d;
  export "DPI-C" function e_byte_3d;
  export "DPI-C" function e_byte_1d1;
  export "DPI-C" function e_byte_2d1;
  export "DPI-C" function e_byte_3d1;

  export "DPI-C" function e_byte_unsigned_0d;
  export "DPI-C" function e_byte_unsigned_1d;
  export "DPI-C" function e_byte_unsigned_2d;
  export "DPI-C" function e_byte_unsigned_3d;
  export "DPI-C" function e_byte_unsigned_1d1;
  export "DPI-C" function e_byte_unsigned_2d1;
  export "DPI-C" function e_byte_unsigned_3d1;

  export "DPI-C" function e_shortint_0d;
  export "DPI-C" function e_shortint_1d;
  export "DPI-C" function e_shortint_2d;
  export "DPI-C" function e_shortint_3d;
  export "DPI-C" function e_shortint_1d1;
  export "DPI-C" function e_shortint_2d1;
  export "DPI-C" function e_shortint_3d1;

  export "DPI-C" function e_shortint_unsigned_0d;
  export "DPI-C" function e_shortint_unsigned_1d;
  export "DPI-C" function e_shortint_unsigned_2d;
  export "DPI-C" function e_shortint_unsigned_3d;
  export "DPI-C" function e_shortint_unsigned_1d1;
  export "DPI-C" function e_shortint_unsigned_2d1;
  export "DPI-C" function e_shortint_unsigned_3d1;

  export "DPI-C" function e_int_0d;
  export "DPI-C" function e_int_1d;
  export "DPI-C" function e_int_2d;
  export "DPI-C" function e_int_3d;
  export "DPI-C" function e_int_1d1;
  export "DPI-C" function e_int_2d1;
  export "DPI-C" function e_int_3d1;

  export "DPI-C" function e_int_unsigned_0d;
  export "DPI-C" function e_int_unsigned_1d;
  export "DPI-C" function e_int_unsigned_2d;
  export "DPI-C" function e_int_unsigned_3d;
  export "DPI-C" function e_int_unsigned_1d1;
  export "DPI-C" function e_int_unsigned_2d1;
  export "DPI-C" function e_int_unsigned_3d1;

  export "DPI-C" function e_longint_0d;
  export "DPI-C" function e_longint_1d;
  export "DPI-C" function e_longint_2d;
  export "DPI-C" function e_longint_3d;
  export "DPI-C" function e_longint_1d1;
  export "DPI-C" function e_longint_2d1;
  export "DPI-C" function e_longint_3d1;

  export "DPI-C" function e_longint_unsigned_0d;
  export "DPI-C" function e_longint_unsigned_1d;
  export "DPI-C" function e_longint_unsigned_2d;
  export "DPI-C" function e_longint_unsigned_3d;
  export "DPI-C" function e_longint_unsigned_1d1;
  export "DPI-C" function e_longint_unsigned_2d1;
  export "DPI-C" function e_longint_unsigned_3d1;

`ifndef NO_TIME
  export "DPI-C" function e_time_0d;
  export "DPI-C" function e_time_1d;
  export "DPI-C" function e_time_2d;
  export "DPI-C" function e_time_3d;
  export "DPI-C" function e_time_1d1;
  export "DPI-C" function e_time_2d1;
  export "DPI-C" function e_time_3d1;
`endif

`ifndef NO_INTEGER
  export "DPI-C" function e_integer_0d;
  export "DPI-C" function e_integer_1d;
  export "DPI-C" function e_integer_2d;
  export "DPI-C" function e_integer_3d;
  export "DPI-C" function e_integer_1d1;
  export "DPI-C" function e_integer_2d1;
  export "DPI-C" function e_integer_3d1;
`endif

  export "DPI-C" function e_real_0d;
  export "DPI-C" function e_real_1d;
  export "DPI-C" function e_real_2d;
  export "DPI-C" function e_real_3d;
  export "DPI-C" function e_real_1d1;
  export "DPI-C" function e_real_2d1;
  export "DPI-C" function e_real_3d1;

`ifndef NO_SHORTREAL
  export "DPI-C" function e_shortreal_0d;
  export "DPI-C" function e_shortreal_1d;
  export "DPI-C" function e_shortreal_2d;
  export "DPI-C" function e_shortreal_3d;
  export "DPI-C" function e_shortreal_1d1;
  export "DPI-C" function e_shortreal_2d1;
  export "DPI-C" function e_shortreal_3d1;
`endif

  export "DPI-C" function e_chandle_0d;
  export "DPI-C" function e_chandle_1d;
  export "DPI-C" function e_chandle_2d;
  export "DPI-C" function e_chandle_3d;
  export "DPI-C" function e_chandle_1d1;
  export "DPI-C" function e_chandle_2d1;
  export "DPI-C" function e_chandle_3d1;

  export "DPI-C" function e_string_0d;
  export "DPI-C" function e_string_1d;
  export "DPI-C" function e_string_2d;
  export "DPI-C" function e_string_3d;
  export "DPI-C" function e_string_1d1;
  export "DPI-C" function e_string_2d1;
  export "DPI-C" function e_string_3d1;

  export "DPI-C" function e_bit1_0d;
  export "DPI-C" function e_bit1_1d;
  export "DPI-C" function e_bit1_2d;
  export "DPI-C" function e_bit1_3d;
  export "DPI-C" function e_bit1_1d1;
  export "DPI-C" function e_bit1_2d1;
  export "DPI-C" function e_bit1_3d1;

  export "DPI-C" function e_bit7_0d;
  export "DPI-C" function e_bit7_1d;
  export "DPI-C" function e_bit7_2d;
  export "DPI-C" function e_bit7_3d;
  export "DPI-C" function e_bit7_1d1;
  export "DPI-C" function e_bit7_2d1;
  export "DPI-C" function e_bit7_3d1;

  export "DPI-C" function e_bit121_0d;
  export "DPI-C" function e_bit121_1d;
  export "DPI-C" function e_bit121_2d;
  export "DPI-C" function e_bit121_3d;
  export "DPI-C" function e_bit121_1d1;
  export "DPI-C" function e_bit121_2d1;
  export "DPI-C" function e_bit121_3d1;

  export "DPI-C" function e_logic1_0d;
  export "DPI-C" function e_logic1_1d;
  export "DPI-C" function e_logic1_2d;
  export "DPI-C" function e_logic1_3d;
  export "DPI-C" function e_logic1_1d1;
  export "DPI-C" function e_logic1_2d1;
  export "DPI-C" function e_logic1_3d1;

  export "DPI-C" function e_logic7_0d;
  export "DPI-C" function e_logic7_1d;
  export "DPI-C" function e_logic7_2d;
  export "DPI-C" function e_logic7_3d;
  export "DPI-C" function e_logic7_1d1;
  export "DPI-C" function e_logic7_2d1;
  export "DPI-C" function e_logic7_3d1;

  export "DPI-C" function e_logic121_0d;
  export "DPI-C" function e_logic121_1d;
  export "DPI-C" function e_logic121_2d;
  export "DPI-C" function e_logic121_3d;
  export "DPI-C" function e_logic121_1d1;
  export "DPI-C" function e_logic121_2d1;
  export "DPI-C" function e_logic121_3d1;

  export "DPI-C" function e_pack_struct_0d;
  export "DPI-C" function e_pack_struct_1d;
  export "DPI-C" function e_pack_struct_2d;
  export "DPI-C" function e_pack_struct_3d;
  export "DPI-C" function e_pack_struct_1d1;
  export "DPI-C" function e_pack_struct_2d1;
  export "DPI-C" function e_pack_struct_3d1;

`ifndef NO_UNPACK_STRUCT
  export "DPI-C" function e_unpack_struct_0d;
  export "DPI-C" function e_unpack_struct_1d;
  export "DPI-C" function e_unpack_struct_2d;
  export "DPI-C" function e_unpack_struct_3d;
  export "DPI-C" function e_unpack_struct_1d1;
  export "DPI-C" function e_unpack_struct_2d1;
  export "DPI-C" function e_unpack_struct_3d1;
`endif
  //======================================================================
  // Definitions of exported functions
  //======================================================================

  function void e_byte_0d(inout byte val); `UPDATE_0D(val); endfunction
  function void e_byte_1d(inout byte val[2]); `UPDATE_1D(val); endfunction
  function void e_byte_2d(inout byte val[3][2]); `UPDATE_2D(val); endfunction
  function void e_byte_3d(inout byte_array_t val); `UPDATE_3D(val); endfunction
  function void e_byte_1d1(inout byte val[1]); `UPDATE_1D1(val); endfunction
  function void e_byte_2d1(inout byte val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_byte_3d1(inout byte_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_byte_unsigned_0d(inout byte unsigned val); `UPDATE_0D(val); endfunction
  function void e_byte_unsigned_1d(inout byte unsigned val[2]); `UPDATE_1D(val); endfunction
  function void e_byte_unsigned_2d(inout byte unsigned val[3][2]); `UPDATE_2D(val); endfunction
  function void e_byte_unsigned_3d(inout byte_unsigned_array_t val); `UPDATE_3D(val); endfunction
  function void e_byte_unsigned_1d1(inout byte unsigned val[1]); `UPDATE_1D1(val); endfunction
  function void e_byte_unsigned_2d1(inout byte unsigned val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_byte_unsigned_3d1(inout byte_unsigned_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_shortint_0d(inout shortint val); `UPDATE_0D(val); endfunction
  function void e_shortint_1d(inout shortint val[2]); `UPDATE_1D(val); endfunction
  function void e_shortint_2d(inout shortint val[3][2]); `UPDATE_2D(val); endfunction
  function void e_shortint_3d(inout shortint_array_t val); `UPDATE_3D(val); endfunction
  function void e_shortint_1d1(inout shortint val[1]); `UPDATE_1D1(val); endfunction
  function void e_shortint_2d1(inout shortint val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_shortint_3d1(inout shortint_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_shortint_unsigned_0d(inout shortint unsigned val); `UPDATE_0D(val); endfunction
  function void e_shortint_unsigned_1d(inout shortint unsigned val[2]); `UPDATE_1D(val); endfunction
  function void e_shortint_unsigned_2d(inout shortint unsigned val[3][2]); `UPDATE_2D(val); endfunction
  function void e_shortint_unsigned_3d(inout shortint_unsigned_array_t val); `UPDATE_3D(val); endfunction
  function void e_shortint_unsigned_1d1(inout shortint unsigned val[1]); `UPDATE_1D1(val); endfunction
  function void e_shortint_unsigned_2d1(inout shortint unsigned val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_shortint_unsigned_3d1(inout shortint_unsigned_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_int_0d(inout int val); `UPDATE_0D(val); endfunction
  function void e_int_1d(inout int val[2]); `UPDATE_1D(val); endfunction
  function void e_int_2d(inout int val[3][2]); `UPDATE_2D(val); endfunction
  function void e_int_3d(inout int_array_t val); `UPDATE_3D(val); endfunction
  function void e_int_1d1(inout int val[1]); `UPDATE_1D1(val); endfunction
  function void e_int_2d1(inout int val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_int_3d1(inout int_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_int_unsigned_0d(inout int unsigned val); `UPDATE_0D(val); endfunction
  function void e_int_unsigned_1d(inout int unsigned val[2]); `UPDATE_1D(val); endfunction
  function void e_int_unsigned_2d(inout int unsigned val[3][2]); `UPDATE_2D(val); endfunction
  function void e_int_unsigned_3d(inout int_unsigned_array_t val); `UPDATE_3D(val); endfunction
  function void e_int_unsigned_1d1(inout int unsigned val[1]); `UPDATE_1D1(val); endfunction
  function void e_int_unsigned_2d1(inout int unsigned val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_int_unsigned_3d1(inout int_unsigned_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_longint_0d(inout longint val); `UPDATE_0D(val); endfunction
  function void e_longint_1d(inout longint val[2]); `UPDATE_1D(val); endfunction
  function void e_longint_2d(inout longint val[3][2]); `UPDATE_2D(val); endfunction
  function void e_longint_3d(inout longint_array_t val); `UPDATE_3D(val); endfunction
  function void e_longint_1d1(inout longint val[1]); `UPDATE_1D1(val); endfunction
  function void e_longint_2d1(inout longint val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_longint_3d1(inout longint_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_longint_unsigned_0d(inout longint unsigned val); `UPDATE_0D(val); endfunction
  function void e_longint_unsigned_1d(inout longint unsigned val[2]); `UPDATE_1D(val); endfunction
  function void e_longint_unsigned_2d(inout longint unsigned val[3][2]); `UPDATE_2D(val); endfunction
  function void e_longint_unsigned_3d(inout longint_unsigned_array_t val); `UPDATE_3D(val); endfunction
  function void e_longint_unsigned_1d1(inout longint unsigned val[1]); `UPDATE_1D1(val); endfunction
  function void e_longint_unsigned_2d1(inout longint unsigned val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_longint_unsigned_3d1(inout longint_unsigned_array1_t val); `UPDATE_3D1(val); endfunction

`ifndef NO_TIME
  function void e_time_0d(inout time val); `UPDATE_0D(val); endfunction
  function void e_time_1d(inout time val[2]); `UPDATE_1D(val); endfunction
  function void e_time_2d(inout time val[3][2]); `UPDATE_2D(val); endfunction
  function void e_time_3d(inout time_array_t val); `UPDATE_3D(val); endfunction
  function void e_time_1d1(inout time val[1]); `UPDATE_1D1(val); endfunction
  function void e_time_2d1(inout time val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_time_3d1(inout time_array1_t val); `UPDATE_3D1(val); endfunction
`endif

`ifndef NO_INTEGER
  function void e_integer_0d(inout integer val); `UPDATE_0D(val); endfunction
  function void e_integer_1d(inout integer val[2]); `UPDATE_1D(val); endfunction
  function void e_integer_2d(inout integer val[3][2]); `UPDATE_2D(val); endfunction
  function void e_integer_3d(inout integer_array_t val); `UPDATE_3D(val); endfunction
  function void e_integer_1d1(inout integer val[1]); `UPDATE_1D1(val); endfunction
  function void e_integer_2d1(inout integer val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_integer_3d1(inout integer_array1_t val); `UPDATE_3D1(val); endfunction
`endif

  function void e_real_0d(inout real val); `UPDATE_0D(val); endfunction
  function void e_real_1d(inout real val[2]); `UPDATE_1D(val); endfunction
  function void e_real_2d(inout real val[3][2]); `UPDATE_2D(val); endfunction
  function void e_real_3d(inout real_array_t val); `UPDATE_3D(val); endfunction
  function void e_real_1d1(inout real val[1]); `UPDATE_1D1(val); endfunction
  function void e_real_2d1(inout real val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_real_3d1(inout real_array1_t val); `UPDATE_3D1(val); endfunction

`ifndef NO_SHORTREAL
  function void e_shortreal_0d(inout shortreal val); `UPDATE_0D(val); endfunction
  function void e_shortreal_1d(inout shortreal val[2]); `UPDATE_1D(val); endfunction
  function void e_shortreal_2d(inout shortreal val[3][2]); `UPDATE_2D(val); endfunction
  function void e_shortreal_3d(inout shortreal_array_t val); `UPDATE_3D(val); endfunction
  function void e_shortreal_1d1(inout shortreal val[1]); `UPDATE_1D1(val); endfunction
  function void e_shortreal_2d1(inout shortreal val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_shortreal_3d1(inout shortreal_array1_t val); `UPDATE_3D1(val); endfunction
`endif

  function void e_chandle_0d(inout chandle val);
    `CHECK_CHANDLE_VAL(val, get_non_null());
    val = null;
  endfunction
  function void e_chandle_1d(inout chandle val[2]);
    `CHECK_CHANDLE_VAL(val[0], get_non_null());
    `CHECK_CHANDLE_VAL(val[1], get_non_null());
    val[0] = null;
    val[1] = null;
  endfunction
  function void e_chandle_2d(inout chandle val[3][2]);
    `CHECK_CHANDLE_VAL(val[0][1], get_non_null());
    `CHECK_CHANDLE_VAL(val[1][1], get_non_null());
    `CHECK_CHANDLE_VAL(val[2][1], get_non_null());
    val[0][1] = null;
    val[1][1] = null;
    val[2][1] = null;
  endfunction
  function void e_chandle_3d(inout chandle_array_t val);
    `CHECK_CHANDLE_VAL(val[0][0][0], get_non_null());
    `CHECK_CHANDLE_VAL(val[1][0][0], get_non_null());
    `CHECK_CHANDLE_VAL(val[2][0][0], get_non_null());
    `CHECK_CHANDLE_VAL(val[3][0][0], get_non_null());
    val[0][0][0] = null;
    val[1][0][0] = null;
    val[2][0][0] = null;
    val[3][0][0] = null;
  endfunction
  function void e_chandle_1d1(inout chandle val[1]);
    `CHECK_CHANDLE_VAL(val[0], get_non_null());
    val[0] = null;
  endfunction
  function void e_chandle_2d1(inout chandle val[1][1]);
    `CHECK_CHANDLE_VAL(val[0][0], get_non_null());
    val[0][0] = null;
  endfunction
  function void e_chandle_3d1(inout chandle_array1_t val);
    `CHECK_CHANDLE_VAL(val[0][0][0], get_non_null());
    val[0][0][0] = null;
  endfunction

  function void e_string_0d(inout string val);
    `CHECK_STRING_VAL(val, "42");
    val = "43";
  endfunction
  function void e_string_1d(inout string val[2]);
    `CHECK_STRING_VAL(val[0], "43");
    `CHECK_STRING_VAL(val[1], "44");
    val[0] = "44";
    val[1] = "45";
  endfunction
  function void e_string_2d(inout string val[3][2]);
    `CHECK_STRING_VAL(val[0][1], "45");
    `CHECK_STRING_VAL(val[1][1], "46");
    `CHECK_STRING_VAL(val[2][1], "47");
    val[0][1] = "46";
    val[1][1] = "47";
    val[2][1] = "48";
  endfunction
  function void e_string_3d(inout string_array_t val);
    `CHECK_STRING_VAL(val[0][0][0], "48");
    `CHECK_STRING_VAL(val[1][0][0], "49");
    `CHECK_STRING_VAL(val[2][0][0], "50");
    `CHECK_STRING_VAL(val[3][0][0], "51");
    val[0][0][0] = "49";
    val[1][0][0] = "50";
    val[2][0][0] = "51";
    val[3][0][0] = "52";
  endfunction
  function void e_string_1d1(inout string val[1]);
    `CHECK_STRING_VAL(val[0], "52");
    val[0] = "53";
  endfunction
  function void e_string_2d1(inout string val[1][1]);
    `CHECK_STRING_VAL(val[0][0], "53");
    val[0][0] = "54";
  endfunction
  function void e_string_3d1(inout string_array1_t val);
    `CHECK_STRING_VAL(val[0][0][0], "54");
    val[0][0][0] = "55";
  endfunction

  function void e_bit1_0d(inout bit val); `UPDATE_0D(val); endfunction
  function void e_bit1_1d(inout bit val[2]); `UPDATE_1D(val); endfunction
  function void e_bit1_2d(inout bit val[3][2]); `UPDATE_2D(val); endfunction
  function void e_bit1_3d(inout bit1_array_t val); `UPDATE_3D(val); endfunction
  function void e_bit1_1d1(inout bit val[1]); `UPDATE_1D1(val); endfunction
  function void e_bit1_2d1(inout bit val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_bit1_3d1(inout bit1_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_bit7_0d(inout bit[6:0] val); `UPDATE_0D(val); endfunction
  function void e_bit7_1d(inout bit[6:0] val[2]); `UPDATE_1D(val); endfunction
  function void e_bit7_2d(inout bit[6:0] val[3][2]); `UPDATE_2D(val); endfunction
  function void e_bit7_3d(inout bit7_array_t val); `UPDATE_3D(val); endfunction
  function void e_bit7_1d1(inout bit[6:0] val[1]); `UPDATE_1D1(val); endfunction
  function void e_bit7_2d1(inout bit[6:0] val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_bit7_3d1(inout bit7_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_bit121_0d(inout bit[120:0] val); `UPDATE_0D(val); endfunction
  function void e_bit121_1d(inout bit[120:0] val[2]); `UPDATE_1D(val); endfunction
  function void e_bit121_2d(inout bit[120:0] val[3][2]); `UPDATE_2D(val); endfunction
  function void e_bit121_3d(inout bit121_array_t val); `UPDATE_3D(val); endfunction
  function void e_bit121_1d1(inout bit[120:0] val[1]); `UPDATE_1D1(val); endfunction
  function void e_bit121_2d1(inout bit[120:0] val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_bit121_3d1(inout bit121_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_logic1_0d(inout logic val); `UPDATE_0D(val); endfunction
  function void e_logic1_1d(inout logic val[2]); `UPDATE_1D(val); endfunction
  function void e_logic1_2d(inout logic val[3][2]); `UPDATE_2D(val); endfunction
  function void e_logic1_3d(inout logic1_array_t val); `UPDATE_3D(val); endfunction
  function void e_logic1_1d1(inout logic val[1]); `UPDATE_1D1(val); endfunction
  function void e_logic1_2d1(inout logic val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_logic1_3d1(inout logic1_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_logic7_0d(inout logic[6:0] val); `UPDATE_0D(val); endfunction
  function void e_logic7_1d(inout logic[6:0] val[2]); `UPDATE_1D(val); endfunction
  function void e_logic7_2d(inout logic[6:0] val[3][2]); `UPDATE_2D(val); endfunction
  function void e_logic7_3d(inout logic7_array_t val); `UPDATE_3D(val); endfunction
  function void e_logic7_1d1(inout logic[6:0] val[1]); `UPDATE_1D1(val); endfunction
  function void e_logic7_2d1(inout logic[6:0] val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_logic7_3d1(inout logic7_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_logic121_0d(inout logic[120:0] val); `UPDATE_0D(val); endfunction
  function void e_logic121_1d(inout logic[120:0] val[2]); `UPDATE_1D(val); endfunction
  function void e_logic121_2d(inout logic[120:0] val[3][2]); `UPDATE_2D(val); endfunction
  function void e_logic121_3d(inout logic121_array_t val); `UPDATE_3D(val); endfunction
  function void e_logic121_1d1(inout logic[120:0] val[1]); `UPDATE_1D1(val); endfunction
  function void e_logic121_2d1(inout logic[120:0] val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_logic121_3d1(inout logic121_array1_t val); `UPDATE_3D1(val); endfunction

  function void e_pack_struct_0d(inout pack_struct_t val); `UPDATE_0D(val); endfunction
  function void e_pack_struct_1d(inout pack_struct_t val[2]); `UPDATE_1D(val); endfunction
  function void e_pack_struct_2d(inout pack_struct_t val[3][2]); `UPDATE_2D(val); endfunction
  function void e_pack_struct_3d(inout pack_struct_array_t val); `UPDATE_3D(val); endfunction
  function void e_pack_struct_1d1(inout pack_struct_t val[1]); `UPDATE_1D1(val); endfunction
  function void e_pack_struct_2d1(inout pack_struct_t val[1][1]); `UPDATE_2D1(val); endfunction
  function void e_pack_struct_3d1(inout pack_struct_array1_t val); `UPDATE_3D1(val); endfunction

`ifndef NO_UNPACK_STRUCT
  function void e_unpack_struct_0d(inout unpack_struct_t val);
    `CHECK_VAL(val.val, 42);
    val.val = 43;
  endfunction
  function void e_unpack_struct_1d(inout unpack_struct_t val[2]);
    `CHECK_VAL(val[0].val, 43);
    `CHECK_VAL(val[1].val, 44);
    val[0].val = 44;
    val[1].val = 45;
  endfunction
  function void e_unpack_struct_2d(inout unpack_struct_t val[3][2]);
    `CHECK_VAL(val[0][1].val, 45);
    `CHECK_VAL(val[1][1].val, 46);
    `CHECK_VAL(val[2][1].val, 47);
    val[0][1].val = 46;
    val[1][1].val = 47;
    val[2][1].val = 48;
  endfunction
  function void e_unpack_struct_3d(inout unpack_struct_array_t val);
    `CHECK_VAL(val[0][0][0].val, 48);
    `CHECK_VAL(val[1][0][0].val, 49);
    `CHECK_VAL(val[2][0][0].val, 50);
    `CHECK_VAL(val[3][0][0].val, 51);
    val[0][0][0].val = 49;
    val[1][0][0].val = 50;
    val[2][0][0].val = 51;
    val[3][0][0].val = 52;
  endfunction
  function void e_unpack_struct_1d1(inout unpack_struct_t val[1]);
    `CHECK_VAL(val[0].val, 52);
    val[0].val = 53;
  endfunction
  function void e_unpack_struct_2d1(inout unpack_struct_t val[1][1]);
    `CHECK_VAL(val[0][0].val, 53);
    val[0][0].val = 54;
  endfunction
  function void e_unpack_struct_3d1(inout unpack_struct_array1_t val);
    `CHECK_VAL(val[0][0][0].val, 54);
    val[0][0][0].val = 55;
  endfunction
`endif

  //======================================================================
  // Invoke all imported functions
  //======================================================================

  import "DPI-C" context function void check_exports();
  initial begin
    byte_t byte_array_0d;
    byte_t byte_array_1d[2];
    byte_t byte_array_2d[3][2];
    byte_array_t byte_array_3d;
    byte_t byte_array_1d1[1];
    byte_t byte_array_2d1[1][1];
    byte_array1_t byte_array_3d1;

    byte_unsigned_t byte_unsigned_array_0d;
    byte_unsigned_t byte_unsigned_array_1d[2];
    byte_unsigned_t byte_unsigned_array_2d[3][2];
    byte_unsigned_array_t byte_unsigned_array_3d;
    byte_unsigned_t byte_unsigned_array_1d1[1];
    byte_unsigned_t byte_unsigned_array_2d1[1][1];
    byte_unsigned_array1_t byte_unsigned_array_3d1;

    shortint_t shortint_array_0d;
    shortint_t shortint_array_1d[2];
    shortint_t shortint_array_2d[3][2];
    shortint_array_t shortint_array_3d;
    shortint_t shortint_array_1d1[1];
    shortint_t shortint_array_2d1[1][1];
    shortint_array1_t shortint_array_3d1;

    shortint_unsigned_t shortint_unsigned_array_0d;
    shortint_unsigned_t shortint_unsigned_array_1d[2];
    shortint_unsigned_t shortint_unsigned_array_2d[3][2];
    shortint_unsigned_array_t shortint_unsigned_array_3d;
    shortint_unsigned_t shortint_unsigned_array_1d1[1];
    shortint_unsigned_t shortint_unsigned_array_2d1[1][1];
    shortint_unsigned_array1_t shortint_unsigned_array_3d1;

    int_t int_array_0d;
    int_t int_array_1d[2];
    int_t int_array_2d[3][2];
    int_array_t int_array_3d;
    int_t int_array_1d1[1];
    int_t int_array_2d1[1][1];
    int_array1_t int_array_3d1;

    int_unsigned_t int_unsigned_array_0d;
    int_unsigned_t int_unsigned_array_1d[2];
    int_unsigned_t int_unsigned_array_2d[3][2];
    int_unsigned_array_t int_unsigned_array_3d;
    int_unsigned_t int_unsigned_array_1d1[1];
    int_unsigned_t int_unsigned_array_2d1[1][1];
    int_unsigned_array1_t int_unsigned_array_3d1;

    longint_t longint_array_0d;
    longint_t longint_array_1d[2];
    longint_t longint_array_2d[3][2];
    longint_array_t longint_array_3d;
    longint_t longint_array_1d1[1];
    longint_t longint_array_2d1[1][1];
    longint_array1_t longint_array_3d1;

    longint_unsigned_t longint_unsigned_array_0d;
    longint_unsigned_t longint_unsigned_array_1d[2];
    longint_unsigned_t longint_unsigned_array_2d[3][2];
    longint_unsigned_array_t longint_unsigned_array_3d;
    longint_unsigned_t longint_unsigned_array_1d1[1];
    longint_unsigned_t longint_unsigned_array_2d1[1][1];
    longint_unsigned_array1_t longint_unsigned_array_3d1;

`ifndef NO_TIME
    time_t time_array_0d;
    time_t time_array_1d[2];
    time_t time_array_2d[3][2];
    time_array_t time_array_3d;
    time_t time_array_1d1[1];
    time_t time_array_2d1[1][1];
    time_array1_t time_array_3d1;
`endif

`ifndef NO_INTEGER
    integer_t integer_array_0d;
    integer_t integer_array_1d[2];
    integer_t integer_array_2d[3][2];
    integer_array_t integer_array_3d;
    integer_t integer_array_1d1[1];
    integer_t integer_array_2d1[1][1];
    integer_array1_t integer_array_3d1;
`endif

    real_t real_array_0d;
    real_t real_array_1d[2];
    real_t real_array_2d[3][2];
    real_array_t real_array_3d;
    real_t real_array_1d1[1];
    real_t real_array_2d1[1][1];
    real_array1_t real_array_3d1;

`ifndef NO_SHORTREAL
    shortreal_t shortreal_array_0d;
    shortreal_t shortreal_array_1d[2];
    shortreal_t shortreal_array_2d[3][2];
    shortreal_array_t shortreal_array_3d;
    shortreal_t shortreal_array_1d1[1];
    shortreal_t shortreal_array_2d1[1][1];
    shortreal_array1_t shortreal_array_3d1;
`endif

    chandle_t chandle_array_0d;
    chandle_t chandle_array_1d[2];
    chandle_t chandle_array_2d[3][2];
    chandle_array_t chandle_array_3d;
    chandle_t chandle_array_1d1[1];
    chandle_t chandle_array_2d1[1][1];
    chandle_array1_t chandle_array_3d1;

    string_t string_array_0d;
    string_t string_array_1d[2];
    string_t string_array_2d[3][2];
    string_array_t string_array_3d;
    string_t string_array_1d1[1];
    string_t string_array_2d1[1][1];
    string_array1_t string_array_3d1;

    bit1_t bit1_array_0d;
    bit1_t bit1_array_1d[2];
    bit1_t bit1_array_2d[3][2];
    bit1_array_t bit1_array_3d;
    bit1_t bit1_array_1d1[1];
    bit1_t bit1_array_2d1[1][1];
    bit1_array1_t bit1_array_3d1;

    bit7_t bit7_array_0d;
    bit7_t bit7_array_1d[2];
    bit7_t bit7_array_2d[3][2];
    bit7_array_t bit7_array_3d;
    bit7_t bit7_array_1d1[1];
    bit7_t bit7_array_2d1[1][1];
    bit7_array1_t bit7_array_3d1;

    bit121_t bit121_array_0d;
    bit121_t bit121_array_1d[2];
    bit121_t bit121_array_2d[3][2];
    bit121_array_t bit121_array_3d;
    bit121_t bit121_array_1d1[1];
    bit121_t bit121_array_2d1[1][1];
    bit121_array1_t bit121_array_3d1;

    logic1_t logic1_array_0d;
    logic1_t logic1_array_1d[2];
    logic1_t logic1_array_2d[3][2];
    logic1_array_t logic1_array_3d;
    logic1_t logic1_array_1d1[1];
    logic1_t logic1_array_2d1[1][1];
    logic1_array1_t logic1_array_3d1;

    logic7_t logic7_array_0d;
    logic7_t logic7_array_1d[2];
    logic7_t logic7_array_2d[3][2];
    logic7_array_t logic7_array_3d;
    logic7_t logic7_array_1d1[1];
    logic7_t logic7_array_2d1[1][1];
    logic7_array1_t logic7_array_3d1;

    logic121_t logic121_array_0d;
    logic121_t logic121_array_1d[2];
    logic121_t logic121_array_2d[3][2];
    logic121_array_t logic121_array_3d;
    logic121_t logic121_array_1d1[1];
    logic121_t logic121_array_2d1[1][1];
    logic121_array1_t logic121_array_3d1;

    pack_struct_t pack_struct_array_0d;
    pack_struct_t pack_struct_array_1d[2];
    pack_struct_t pack_struct_array_2d[3][2];
    pack_struct_array_t pack_struct_array_3d;
    pack_struct_t pack_struct_array_1d1[1];
    pack_struct_t pack_struct_array_2d1[1][1];
    pack_struct_array1_t pack_struct_array_3d1;

`ifndef NO_UNPACK_STRUCT
    unpack_struct_array_t unpack_struct_array_3d;
    unpack_struct_array1_t unpack_struct_array_3d1;
`endif

    `SET_VALUE_0D(byte_array_0d);
    `SET_VALUE_1D(byte_array_1d);
    `SET_VALUE_2D(byte_array_2d);
    `SET_VALUE_3D(byte_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_byte_0d(byte_array_3d[3][2][1]);
    `CHECK_0D(byte_array_3d[3][2][1]);
    i_byte_1d(byte_array_3d[2][1]);
    `CHECK_1D(byte_array_3d[2][1]);
    i_byte_2d(byte_array_3d[1]);
    `CHECK_2D(byte_array_3d[1]);
`endif
    i_byte_0d(byte_array_0d);
    `CHECK_0D(byte_array_0d);
    i_byte_1d(byte_array_1d);
    `CHECK_1D(byte_array_1d);
    i_byte_2d(byte_array_2d);
    `CHECK_2D(byte_array_2d);
    i_byte_3d(byte_array_3d);
    `CHECK_3D(byte_array_3d);

    `SET_VALUE_1D1(byte_array_1d1);
    `SET_VALUE_2D1(byte_array_2d1);
    `SET_VALUE_3D1(byte_array_3d1);
    i_byte_1d1(byte_array_1d1);
    `CHECK_1D1(byte_array_1d1);
    i_byte_2d1(byte_array_2d1);
    `CHECK_2D1(byte_array_2d1);
    i_byte_3d1(byte_array_3d1);
    `CHECK_3D1(byte_array_3d1);

    `SET_VALUE_0D(byte_unsigned_array_0d);
    `SET_VALUE_1D(byte_unsigned_array_1d);
    `SET_VALUE_2D(byte_unsigned_array_2d);
    `SET_VALUE_3D(byte_unsigned_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_byte_unsigned_0d(byte_unsigned_array_3d[3][2][1]);
    `CHECK_0D(byte_unsigned_array_3d[3][2][1]);
    i_byte_unsigned_1d(byte_unsigned_array_3d[2][1]);
    `CHECK_1D(byte_unsigned_array_3d[2][1]);
    i_byte_unsigned_2d(byte_unsigned_array_3d[1]);
    `CHECK_2D(byte_unsigned_array_3d[1]);
`endif
    i_byte_unsigned_0d(byte_unsigned_array_0d);
    `CHECK_0D(byte_unsigned_array_0d);
    i_byte_unsigned_1d(byte_unsigned_array_1d);
    `CHECK_1D(byte_unsigned_array_1d);
    i_byte_unsigned_2d(byte_unsigned_array_2d);
    `CHECK_2D(byte_unsigned_array_2d);
    i_byte_unsigned_3d(byte_unsigned_array_3d);
    `CHECK_3D(byte_unsigned_array_3d);

    `SET_VALUE_1D1(byte_unsigned_array_1d1);
    `SET_VALUE_2D1(byte_unsigned_array_2d1);
    `SET_VALUE_3D1(byte_unsigned_array_3d1);
    i_byte_unsigned_1d1(byte_unsigned_array_1d1);
    `CHECK_1D1(byte_unsigned_array_1d1);
    i_byte_unsigned_2d1(byte_unsigned_array_2d1);
    `CHECK_2D1(byte_unsigned_array_2d1);
    i_byte_unsigned_3d1(byte_unsigned_array_3d1);
    `CHECK_3D1(byte_unsigned_array_3d1);

    `SET_VALUE_0D(shortint_array_0d);
    `SET_VALUE_1D(shortint_array_1d);
    `SET_VALUE_2D(shortint_array_2d);
    `SET_VALUE_3D(shortint_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_shortint_0d(shortint_array_3d[3][2][1]);
    `CHECK_0D(shortint_array_3d[3][2][1]);
    i_shortint_1d(shortint_array_3d[2][1]);
    `CHECK_1D(shortint_array_3d[2][1]);
    i_shortint_2d(shortint_array_3d[1]);
    `CHECK_2D(shortint_array_3d[1]);
`endif
    i_shortint_0d(shortint_array_0d);
    `CHECK_0D(shortint_array_0d);
    i_shortint_1d(shortint_array_1d);
    `CHECK_1D(shortint_array_1d);
    i_shortint_2d(shortint_array_2d);
    `CHECK_2D(shortint_array_2d);
    i_shortint_3d(shortint_array_3d);
    `CHECK_3D(shortint_array_3d);

    `SET_VALUE_1D1(shortint_array_1d1);
    `SET_VALUE_2D1(shortint_array_2d1);
    `SET_VALUE_3D1(shortint_array_3d1);
    i_shortint_1d1(shortint_array_1d1);
    `CHECK_1D1(shortint_array_1d1);
    i_shortint_2d1(shortint_array_2d1);
    `CHECK_2D1(shortint_array_2d1);
    i_shortint_3d1(shortint_array_3d1);
    `CHECK_3D1(shortint_array_3d1);

    `SET_VALUE_0D(shortint_unsigned_array_0d);
    `SET_VALUE_1D(shortint_unsigned_array_1d);
    `SET_VALUE_2D(shortint_unsigned_array_2d);
    `SET_VALUE_3D(shortint_unsigned_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_shortint_unsigned_0d(shortint_unsigned_array_3d[3][2][1]);
    `CHECK_0D(shortint_unsigned_array_3d[3][2][1]);
    i_shortint_unsigned_1d(shortint_unsigned_array_3d[2][1]);
    `CHECK_1D(shortint_unsigned_array_3d[2][1]);
    i_shortint_unsigned_2d(shortint_unsigned_array_3d[1]);
    `CHECK_2D(shortint_unsigned_array_3d[1]);
`endif
    i_shortint_unsigned_0d(shortint_unsigned_array_0d);
    `CHECK_0D(shortint_unsigned_array_0d);
    i_shortint_unsigned_1d(shortint_unsigned_array_1d);
    `CHECK_1D(shortint_unsigned_array_1d);
    i_shortint_unsigned_2d(shortint_unsigned_array_2d);
    `CHECK_2D(shortint_unsigned_array_2d);
    i_shortint_unsigned_3d(shortint_unsigned_array_3d);
    `CHECK_3D(shortint_unsigned_array_3d);

    `SET_VALUE_1D1(shortint_unsigned_array_1d1);
    `SET_VALUE_2D1(shortint_unsigned_array_2d1);
    `SET_VALUE_3D1(shortint_unsigned_array_3d1);
    i_shortint_unsigned_1d1(shortint_unsigned_array_1d1);
    `CHECK_1D1(shortint_unsigned_array_1d1);
    i_shortint_unsigned_2d1(shortint_unsigned_array_2d1);
    `CHECK_2D1(shortint_unsigned_array_2d1);
    i_shortint_unsigned_3d1(shortint_unsigned_array_3d1);
    `CHECK_3D1(shortint_unsigned_array_3d1);

    `SET_VALUE_0D(int_array_0d);
    `SET_VALUE_1D(int_array_1d);
    `SET_VALUE_2D(int_array_2d);
    `SET_VALUE_3D(int_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_int_0d(int_array_3d[3][2][1]);
    `CHECK_0D(int_array_3d[3][2][1]);
    i_int_1d(int_array_3d[2][1]);
    `CHECK_1D(int_array_3d[2][1]);
    i_int_2d(int_array_3d[1]);
    `CHECK_2D(int_array_3d[1]);
`endif
    i_int_0d(int_array_0d);
    `CHECK_0D(int_array_0d);
    i_int_1d(int_array_1d);
    `CHECK_1D(int_array_1d);
    i_int_2d(int_array_2d);
    `CHECK_2D(int_array_2d);
    i_int_3d(int_array_3d);
    `CHECK_3D(int_array_3d);

    `SET_VALUE_1D1(int_array_1d1);
    `SET_VALUE_2D1(int_array_2d1);
    `SET_VALUE_3D1(int_array_3d1);
    i_int_1d1(int_array_1d1);
    `CHECK_1D1(int_array_1d1);
    i_int_2d1(int_array_2d1);
    `CHECK_2D1(int_array_2d1);
    i_int_3d1(int_array_3d1);
    `CHECK_3D1(int_array_3d1);

    `SET_VALUE_0D(int_unsigned_array_0d);
    `SET_VALUE_1D(int_unsigned_array_1d);
    `SET_VALUE_2D(int_unsigned_array_2d);
    `SET_VALUE_3D(int_unsigned_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_int_unsigned_0d(int_unsigned_array_3d[3][2][1]);
    `CHECK_0D(int_unsigned_array_3d[3][2][1]);
    i_int_unsigned_1d(int_unsigned_array_3d[2][1]);
    `CHECK_1D(int_unsigned_array_3d[2][1]);
    i_int_unsigned_2d(int_unsigned_array_3d[1]);
    `CHECK_2D(int_unsigned_array_3d[1]);
`endif
    i_int_unsigned_0d(int_unsigned_array_0d);
    `CHECK_0D(int_unsigned_array_0d);
    i_int_unsigned_1d(int_unsigned_array_1d);
    `CHECK_1D(int_unsigned_array_1d);
    i_int_unsigned_2d(int_unsigned_array_2d);
    `CHECK_2D(int_unsigned_array_2d);
    i_int_unsigned_3d(int_unsigned_array_3d);
    `CHECK_3D(int_unsigned_array_3d);

    `SET_VALUE_1D1(int_unsigned_array_1d1);
    `SET_VALUE_2D1(int_unsigned_array_2d1);
    `SET_VALUE_3D1(int_unsigned_array_3d1);
    i_int_unsigned_1d1(int_unsigned_array_1d1);
    `CHECK_1D1(int_unsigned_array_1d1);
    i_int_unsigned_2d1(int_unsigned_array_2d1);
    `CHECK_2D1(int_unsigned_array_2d1);
    i_int_unsigned_3d1(int_unsigned_array_3d1);
    `CHECK_3D1(int_unsigned_array_3d1);

    `SET_VALUE_0D(longint_array_0d);
    `SET_VALUE_1D(longint_array_1d);
    `SET_VALUE_2D(longint_array_2d);
    `SET_VALUE_3D(longint_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_longint_0d(longint_array_3d[3][2][1]);
    `CHECK_0D(longint_array_3d[3][2][1]);
    i_longint_1d(longint_array_3d[2][1]);
    `CHECK_1D(longint_array_3d[2][1]);
    i_longint_2d(longint_array_3d[1]);
    `CHECK_2D(longint_array_3d[1]);
`endif
    i_longint_0d(longint_array_0d);
    `CHECK_0D(longint_array_0d);
    i_longint_1d(longint_array_1d);
    `CHECK_1D(longint_array_1d);
    i_longint_2d(longint_array_2d);
    `CHECK_2D(longint_array_2d);
    i_longint_3d(longint_array_3d);
    `CHECK_3D(longint_array_3d);

    `SET_VALUE_1D1(longint_array_1d1);
    `SET_VALUE_2D1(longint_array_2d1);
    `SET_VALUE_3D1(longint_array_3d1);
    i_longint_1d1(longint_array_1d1);
    `CHECK_1D1(longint_array_1d1);
    i_longint_2d1(longint_array_2d1);
    `CHECK_2D1(longint_array_2d1);
    i_longint_3d1(longint_array_3d1);
    `CHECK_3D1(longint_array_3d1);

    `SET_VALUE_0D(longint_unsigned_array_0d);
    `SET_VALUE_1D(longint_unsigned_array_1d);
    `SET_VALUE_2D(longint_unsigned_array_2d);
    `SET_VALUE_3D(longint_unsigned_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_longint_unsigned_0d(longint_unsigned_array_3d[3][2][1]);
    `CHECK_0D(longint_unsigned_array_3d[3][2][1]);
    i_longint_unsigned_1d(longint_unsigned_array_3d[2][1]);
    `CHECK_1D(longint_unsigned_array_3d[2][1]);
    i_longint_unsigned_2d(longint_unsigned_array_3d[1]);
    `CHECK_2D(longint_unsigned_array_3d[1]);
`endif
    i_longint_unsigned_0d(longint_unsigned_array_0d);
    `CHECK_0D(longint_unsigned_array_0d);
    i_longint_unsigned_1d(longint_unsigned_array_1d);
    `CHECK_1D(longint_unsigned_array_1d);
    i_longint_unsigned_2d(longint_unsigned_array_2d);
    `CHECK_2D(longint_unsigned_array_2d);
    i_longint_unsigned_3d(longint_unsigned_array_3d);
    `CHECK_3D(longint_unsigned_array_3d);

    `SET_VALUE_1D1(longint_unsigned_array_1d1);
    `SET_VALUE_2D1(longint_unsigned_array_2d1);
    `SET_VALUE_3D1(longint_unsigned_array_3d1);
    i_longint_unsigned_1d1(longint_unsigned_array_1d1);
    `CHECK_1D1(longint_unsigned_array_1d1);
    i_longint_unsigned_2d1(longint_unsigned_array_2d1);
    `CHECK_2D1(longint_unsigned_array_2d1);
    i_longint_unsigned_3d1(longint_unsigned_array_3d1);
    `CHECK_3D1(longint_unsigned_array_3d1);

`ifndef NO_TIME
    `SET_VALUE_0D(time_array_0d);
    `SET_VALUE_1D(time_array_1d);
    `SET_VALUE_2D(time_array_2d);
    `SET_VALUE_3D(time_array_3d);
 `ifndef NO_INOUT_COMPLEX_TYPE
    i_time_0d(time_array_3d[3][2][1]);
    `CHECK_0D(time_array_3d[3][2][1]);
    i_time_1d(time_array_3d[2][1]);
    `CHECK_1D(time_array_3d[2][1]);
    i_time_2d(time_array_3d[1]);
    `CHECK_2D(time_array_3d[1]);
 `endif
    i_time_0d(time_array_0d);
    `CHECK_0D(time_array_0d);
    i_time_1d(time_array_1d);
    `CHECK_1D(time_array_1d);
    i_time_2d(time_array_2d);
    `CHECK_2D(time_array_2d);
    i_time_3d(time_array_3d);
    `CHECK_3D(time_array_3d);

    `SET_VALUE_1D1(time_array_1d1);
    `SET_VALUE_2D1(time_array_2d1);
    `SET_VALUE_3D1(time_array_3d1);
    i_time_1d1(time_array_1d1);
    `CHECK_1D1(time_array_1d1);
    i_time_2d1(time_array_2d1);
    `CHECK_2D1(time_array_2d1);
    i_time_3d1(time_array_3d1);
    `CHECK_3D1(time_array_3d1);
`endif

`ifndef NO_INTEGER
    `SET_VALUE_0D(integer_array_0d);
    `SET_VALUE_1D(integer_array_1d);
    `SET_VALUE_2D(integer_array_2d);
    `SET_VALUE_3D(integer_array_3d);
 `ifndef NO_INOUT_COMPLEX_TYPE
    i_integer_0d(integer_array_3d[3][2][1]);
    `CHECK_0D(integer_array_3d[3][2][1]);
    i_integer_1d(integer_array_3d[2][1]);
    `CHECK_1D(integer_array_3d[2][1]);
    i_integer_2d(integer_array_3d[1]);
    `CHECK_2D(integer_array_3d[1]);
 `endif
    i_integer_0d(integer_array_0d);
    `CHECK_0D(integer_array_0d);
    i_integer_1d(integer_array_1d);
    `CHECK_1D(integer_array_1d);
    i_integer_2d(integer_array_2d);
    `CHECK_2D(integer_array_2d);
    i_integer_3d(integer_array_3d);
    `CHECK_3D(integer_array_3d);

    `SET_VALUE_1D1(integer_array_1d1);
    `SET_VALUE_2D1(integer_array_2d1);
    `SET_VALUE_3D1(integer_array_3d1);
    i_integer_1d1(integer_array_1d1);
    `CHECK_1D1(integer_array_1d1);
    i_integer_2d1(integer_array_2d1);
    `CHECK_2D1(integer_array_2d1);
    i_integer_3d1(integer_array_3d1);
    `CHECK_3D1(integer_array_3d1);
`endif

    `SET_VALUE_0D(real_array_0d);
    `SET_VALUE_1D(real_array_1d);
    `SET_VALUE_2D(real_array_2d);
    `SET_VALUE_3D(real_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_real_0d(real_array_3d[3][2][1]);
    `CHECK_DOUBLE_0D(real_array_3d[3][2][1]);
    i_real_1d(real_array_3d[2][1]);
    `CHECK_DOUBLE_1D(real_array_3d[2][1]);
    i_real_2d(real_array_3d[1]);
    `CHECK_DOUBLE_2D(real_array_3d[1]);
`endif
    i_real_0d(real_array_0d);
    `CHECK_DOUBLE_0D(real_array_0d);
    i_real_1d(real_array_1d);
    `CHECK_DOUBLE_1D(real_array_1d);
    i_real_2d(real_array_2d);
    `CHECK_DOUBLE_2D(real_array_2d);
    i_real_3d(real_array_3d);
    `CHECK_DOUBLE_3D(real_array_3d);

    `SET_VALUE_1D1(real_array_1d1);
    `SET_VALUE_2D1(real_array_2d1);
    `SET_VALUE_3D1(real_array_3d1);
    i_real_1d1(real_array_1d1);
    `CHECK_1D1(real_array_1d1);
    i_real_2d1(real_array_2d1);
    `CHECK_2D1(real_array_2d1);
    i_real_3d1(real_array_3d1);
    `CHECK_3D1(real_array_3d1);

`ifndef NO_SHORTREAL
    `SET_VALUE_0D(shortreal_array_0d);
    `SET_VALUE_1D(shortreal_array_1d);
    `SET_VALUE_2D(shortreal_array_2d);
    `SET_VALUE_3D(shortreal_array_3d);
 `ifndef NO_INOUT_COMPLEX_TYPE
    i_shortreal_0d(shortreal_array_3d[3][2][1]);
    `CHECK_DOUBLE_0D(shortreal_array_3d[3][2][1]);
    i_shortreal_1d(shortreal_array_3d[2][1]);
    `CHECK_DOUBLE_1D(shortreal_array_3d[2][1]);
    i_shortreal_2d(shortreal_array_3d[1]);
    `CHECK_DOUBLE_2D(shortreal_array_3d[1]);
 `endif
    i_shortreal_0d(shortreal_array_0d);
    `CHECK_DOUBLE_0D(shortreal_array_0d);
    i_shortreal_1d(shortreal_array_1d);
    `CHECK_DOUBLE_1D(shortreal_array_1d);
    i_shortreal_2d(shortreal_array_2d);
    `CHECK_DOUBLE_2D(shortreal_array_2d);
    i_shortreal_3d(shortreal_array_3d);
    `CHECK_DOUBLE_3D(shortreal_array_3d);

    `SET_VALUE_1D1(shortreal_array_1d1);
    `SET_VALUE_2D1(shortreal_array_2d1);
    `SET_VALUE_3D1(shortreal_array_3d1);
    i_shortreal_1d1(shortreal_array_1d1);
    `CHECK_1D1(shortreal_array_1d1);
    i_shortreal_2d1(shortreal_array_2d1);
    `CHECK_2D1(shortreal_array_2d1);
    i_shortreal_3d1(shortreal_array_3d1);
    `CHECK_3D1(shortreal_array_3d1);
`endif

    for (int i = 0; i < 4; ++i)
      for (int j = 0; j < 3; ++j)
        for (int k = 0; k < 2; ++k)
          chandle_array_3d[i][j][k] = null;
`ifndef NO_INOUT_COMPLEX_TYPE
    i_chandle_0d(chandle_array_3d[3][2][1]);
    `CHECK_CHANDLE_VAL(chandle_array_3d[3][2][1], get_non_null());
    i_chandle_1d(chandle_array_3d[2][1]);
    `CHECK_CHANDLE_VAL(chandle_array_3d[2][1][0], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_3d[2][1][1], get_non_null());
    i_chandle_2d(chandle_array_3d[1]);
    `CHECK_CHANDLE_VAL(chandle_array_3d[1][0][1], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_3d[1][1][1], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_3d[1][2][1], get_non_null());
`endif
    chandle_array_0d = null;
    i_chandle_0d(chandle_array_0d);
    `CHECK_CHANDLE_VAL(chandle_array_0d, get_non_null());
    chandle_array_1d[0] = null;
    chandle_array_1d[1] = null;
    i_chandle_1d(chandle_array_1d);
    `CHECK_CHANDLE_VAL(chandle_array_1d[0], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_1d[1], get_non_null());
    chandle_array_2d[0][1] = null;
    chandle_array_2d[1][1] = null;
    chandle_array_2d[2][1] = null;
    i_chandle_2d(chandle_array_2d);
    `CHECK_CHANDLE_VAL(chandle_array_2d[0][1], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_2d[1][1], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_2d[2][1], get_non_null());
    i_chandle_3d(chandle_array_3d);
    `CHECK_CHANDLE_VAL(chandle_array_3d[0][0][0], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_3d[1][0][0], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_3d[2][0][0], get_non_null());
    `CHECK_CHANDLE_VAL(chandle_array_3d[3][0][0], get_non_null());

    chandle_array_1d1[0] = null;
    i_chandle_1d1(chandle_array_1d1);
    `CHECK_CHANDLE_VAL(chandle_array_1d1[0], get_non_null());
    chandle_array_2d1[0][0] = null;
    i_chandle_2d1(chandle_array_2d1);
    `CHECK_CHANDLE_VAL(chandle_array_2d1[0][0], get_non_null());
    chandle_array_3d1[0][0][0] = null;
    i_chandle_3d1(chandle_array_3d1);
    `CHECK_CHANDLE_VAL(chandle_array_3d1[0][0][0], get_non_null());

`ifndef NO_INOUT_COMPLEX_TYPE
    string_array_3d[3][2][1] = "42";
    i_string_0d(string_array_3d[3][2][1]);
    `CHECK_STRING_VAL(string_array_3d[3][2][1], "43");

    string_array_3d[2][1][0] = "43";
    string_array_3d[2][1][1] = "44";
    i_string_1d(string_array_3d[2][1]);
    `CHECK_STRING_VAL(string_array_3d[2][1][0], "44");
    `CHECK_STRING_VAL(string_array_3d[2][1][1], "45");

    string_array_3d[1][0][1] = "45";
    string_array_3d[1][1][1] = "46";
    string_array_3d[1][2][1] = "47";
    i_string_2d(string_array_3d[1]);
    `CHECK_STRING_VAL(string_array_3d[1][0][1], "46");
    `CHECK_STRING_VAL(string_array_3d[1][1][1], "47");
    `CHECK_STRING_VAL(string_array_3d[1][2][1], "48");
`endif
    string_array_0d = "42";
    i_string_0d(string_array_0d);
    `CHECK_STRING_VAL(string_array_0d, "43");
    string_array_1d[0] = "43";
    string_array_1d[1] = "44";
    i_string_1d(string_array_1d);
    `CHECK_STRING_VAL(string_array_1d[0], "44");
    `CHECK_STRING_VAL(string_array_1d[1], "45");

    string_array_2d[0][1] = "45";
    string_array_2d[1][1] = "46";
    string_array_2d[2][1] = "47";
    i_string_2d(string_array_2d);
    `CHECK_STRING_VAL(string_array_2d[0][1], "46");
    `CHECK_STRING_VAL(string_array_2d[1][1], "47");
    `CHECK_STRING_VAL(string_array_2d[2][1], "48");

    string_array_3d[0][0][0] = "48";
    string_array_3d[1][0][0] = "49";
    string_array_3d[2][0][0] = "50";
    string_array_3d[3][0][0] = "51";
    i_string_3d(string_array_3d);
    `CHECK_STRING_VAL(string_array_3d[0][0][0], "49");
    `CHECK_STRING_VAL(string_array_3d[1][0][0], "50");
    `CHECK_STRING_VAL(string_array_3d[2][0][0], "51");
    `CHECK_STRING_VAL(string_array_3d[3][0][0], "52");

    string_array_1d1[0] = "52";
    i_string_1d1(string_array_1d1);
    `CHECK_STRING_VAL(string_array_1d1[0], "53");
    string_array_2d1[0][0] = "53";
    i_string_2d1(string_array_2d1);
    `CHECK_STRING_VAL(string_array_2d1[0][0], "54");
    string_array_3d1[0][0][0] = "54";
    i_string_3d1(string_array_3d1);
    `CHECK_STRING_VAL(string_array_3d1[0][0][0], "55");

    `SET_VALUE_0D(bit1_array_0d);
    `SET_VALUE_1D(bit1_array_1d);
    `SET_VALUE_2D(bit1_array_2d);
    `SET_VALUE_3D(bit1_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_bit1_0d(bit1_array_3d[3][2][1]);
    `CHECK_0D(bit1_array_3d[3][2][1]);
    i_bit1_1d(bit1_array_3d[2][1]);
    `CHECK_1D(bit1_array_3d[2][1]);
    i_bit1_2d(bit1_array_3d[1]);
    `CHECK_2D(bit1_array_3d[1]);
`endif
    i_bit1_0d(bit1_array_0d);
    `CHECK_0D(bit1_array_0d);
    i_bit1_1d(bit1_array_1d);
    `CHECK_1D(bit1_array_1d);
    i_bit1_2d(bit1_array_2d);
    `CHECK_2D(bit1_array_2d);
    i_bit1_3d(bit1_array_3d);
    `CHECK_3D(bit1_array_3d);

    `SET_VALUE_1D1(bit1_array_1d1);
    `SET_VALUE_2D1(bit1_array_2d1);
    `SET_VALUE_3D1(bit1_array_3d1);
    i_bit1_1d1(bit1_array_1d1);
    `CHECK_1D1(bit1_array_1d1);
    i_bit1_2d1(bit1_array_2d1);
    `CHECK_2D1(bit1_array_2d1);
    i_bit1_3d1(bit1_array_3d1);
    `CHECK_3D1(bit1_array_3d1);

    `SET_VALUE_0D(bit7_array_0d);
    `SET_VALUE_1D(bit7_array_1d);
    `SET_VALUE_2D(bit7_array_2d);
    `SET_VALUE_3D(bit7_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_bit7_0d(bit7_array_3d[3][2][1]);
    `CHECK_0D(bit7_array_3d[3][2][1]);
    i_bit7_1d(bit7_array_3d[2][1]);
    `CHECK_1D(bit7_array_3d[2][1]);
    i_bit7_2d(bit7_array_3d[1]);
    `CHECK_2D(bit7_array_3d[1]);
`endif
    i_bit7_0d(bit7_array_0d);
    `CHECK_0D(bit7_array_0d);
    i_bit7_1d(bit7_array_1d);
    `CHECK_1D(bit7_array_1d);
    i_bit7_2d(bit7_array_2d);
    `CHECK_2D(bit7_array_2d);
    i_bit7_3d(bit7_array_3d);
    `CHECK_3D(bit7_array_3d);

    `SET_VALUE_1D1(bit7_array_1d1);
    `SET_VALUE_2D1(bit7_array_2d1);
    `SET_VALUE_3D1(bit7_array_3d1);
    i_bit7_1d1(bit7_array_1d1);
    `CHECK_1D1(bit7_array_1d1);
    i_bit7_2d1(bit7_array_2d1);
    `CHECK_2D1(bit7_array_2d1);
    i_bit7_3d1(bit7_array_3d1);
    `CHECK_3D1(bit7_array_3d1);

    `SET_VALUE_0D(bit121_array_0d);
    `SET_VALUE_1D(bit121_array_1d);
    `SET_VALUE_2D(bit121_array_2d);
    `SET_VALUE_3D(bit121_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_bit121_0d(bit121_array_3d[3][2][1]);
    `CHECK_0D(bit121_array_3d[3][2][1]);
    i_bit121_1d(bit121_array_3d[2][1]);
    `CHECK_1D(bit121_array_3d[2][1]);
    i_bit121_2d(bit121_array_3d[1]);
    `CHECK_2D(bit121_array_3d[1]);
`endif
    i_bit121_0d(bit121_array_0d);
    `CHECK_0D(bit121_array_0d);
    i_bit121_1d(bit121_array_1d);
    `CHECK_1D(bit121_array_1d);
    i_bit121_2d(bit121_array_2d);
    `CHECK_2D(bit121_array_2d);
    i_bit121_3d(bit121_array_3d);
    `CHECK_3D(bit121_array_3d);

    `SET_VALUE_1D1(bit121_array_1d1);
    `SET_VALUE_2D1(bit121_array_2d1);
    `SET_VALUE_3D1(bit121_array_3d1);
    i_bit121_1d1(bit121_array_1d1);
    `CHECK_1D1(bit121_array_1d1);
    i_bit121_2d1(bit121_array_2d1);
    `CHECK_2D1(bit121_array_2d1);
    i_bit121_3d1(bit121_array_3d1);
    `CHECK_3D1(bit121_array_3d1);

    `SET_VALUE_0D(logic1_array_0d);
    `SET_VALUE_1D(logic1_array_1d);
    `SET_VALUE_2D(logic1_array_2d);
    `SET_VALUE_3D(logic1_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_logic1_0d(logic1_array_3d[3][2][1]);
    `CHECK_0D(logic1_array_3d[3][2][1]);
    i_logic1_1d(logic1_array_3d[2][1]);
    `CHECK_1D(logic1_array_3d[2][1]);
    i_logic1_2d(logic1_array_3d[1]);
    `CHECK_2D(logic1_array_3d[1]);
`endif
    i_logic1_0d(logic1_array_0d);
    `CHECK_0D(logic1_array_0d);
    i_logic1_1d(logic1_array_1d);
    `CHECK_1D(logic1_array_1d);
    i_logic1_2d(logic1_array_2d);
    `CHECK_2D(logic1_array_2d);
    i_logic1_3d(logic1_array_3d);
    `CHECK_3D(logic1_array_3d);

    `SET_VALUE_1D1(logic1_array_1d1);
    `SET_VALUE_2D1(logic1_array_2d1);
    `SET_VALUE_3D1(logic1_array_3d1);
    i_logic1_1d1(logic1_array_1d1);
    `CHECK_1D1(logic1_array_1d1);
    i_logic1_2d1(logic1_array_2d1);
    `CHECK_2D1(logic1_array_2d1);
    i_logic1_3d1(logic1_array_3d1);
    `CHECK_3D1(logic1_array_3d1);

    `SET_VALUE_0D(logic7_array_0d);
    `SET_VALUE_1D(logic7_array_1d);
    `SET_VALUE_2D(logic7_array_2d);
    `SET_VALUE_3D(logic7_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_logic7_0d(logic7_array_3d[3][2][1]);
    `CHECK_0D(logic7_array_3d[3][2][1]);
    i_logic7_1d(logic7_array_3d[2][1]);
    `CHECK_1D(logic7_array_3d[2][1]);
    i_logic7_2d(logic7_array_3d[1]);
    `CHECK_2D(logic7_array_3d[1]);
`endif
    i_logic7_0d(logic7_array_0d);
    `CHECK_0D(logic7_array_0d);
    i_logic7_1d(logic7_array_1d);
    `CHECK_1D(logic7_array_1d);
    i_logic7_2d(logic7_array_2d);
    `CHECK_2D(logic7_array_2d);
    i_logic7_3d(logic7_array_3d);
    `CHECK_3D(logic7_array_3d);

    `SET_VALUE_1D1(logic7_array_1d1);
    `SET_VALUE_2D1(logic7_array_2d1);
    `SET_VALUE_3D1(logic7_array_3d1);
    i_logic7_1d1(logic7_array_1d1);
    `CHECK_1D1(logic7_array_1d1);
    i_logic7_2d1(logic7_array_2d1);
    `CHECK_2D1(logic7_array_2d1);
    i_logic7_3d1(logic7_array_3d1);
    `CHECK_3D1(logic7_array_3d1);

    `SET_VALUE_0D(logic121_array_0d);
    `SET_VALUE_1D(logic121_array_1d);
    `SET_VALUE_2D(logic121_array_2d);
    `SET_VALUE_3D(logic121_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_logic121_0d(logic121_array_3d[3][2][1]);
    `CHECK_0D(logic121_array_3d[3][2][1]);
    i_logic121_1d(logic121_array_3d[2][1]);
    `CHECK_1D(logic121_array_3d[2][1]);
    i_logic121_2d(logic121_array_3d[1]);
    `CHECK_2D(logic121_array_3d[1]);
`endif
    i_logic121_0d(logic121_array_0d);
    `CHECK_0D(logic121_array_0d);
    i_logic121_1d(logic121_array_1d);
    `CHECK_1D(logic121_array_1d);
    i_logic121_2d(logic121_array_2d);
    `CHECK_2D(logic121_array_2d);
    i_logic121_3d(logic121_array_3d);
    `CHECK_3D(logic121_array_3d);

    `SET_VALUE_1D1(logic121_array_1d1);
    `SET_VALUE_2D1(logic121_array_2d1);
    `SET_VALUE_3D1(logic121_array_3d1);
    i_logic121_1d1(logic121_array_1d1);
    `CHECK_1D1(logic121_array_1d1);
    i_logic121_2d1(logic121_array_2d1);
    `CHECK_2D1(logic121_array_2d1);
    i_logic121_3d1(logic121_array_3d1);
    `CHECK_3D1(logic121_array_3d1);

    `SET_VALUE_0D(pack_struct_array_0d);
    `SET_VALUE_1D(pack_struct_array_1d);
    `SET_VALUE_2D(pack_struct_array_2d);
    `SET_VALUE_3D(pack_struct_array_3d);
`ifndef NO_INOUT_COMPLEX_TYPE
    i_pack_struct_0d(pack_struct_array_3d[3][2][1]);
    `CHECK_0D(pack_struct_array_3d[3][2][1]);
    i_pack_struct_1d(pack_struct_array_3d[2][1]);
    `CHECK_1D(pack_struct_array_3d[2][1]);
    i_pack_struct_2d(pack_struct_array_3d[1]);
    `CHECK_2D(pack_struct_array_3d[1]);
`endif
    i_pack_struct_0d(pack_struct_array_0d);
    `CHECK_0D(pack_struct_array_0d);
    i_pack_struct_1d(pack_struct_array_1d);
    `CHECK_1D(pack_struct_array_1d);
    i_pack_struct_2d(pack_struct_array_2d);
    `CHECK_2D(pack_struct_array_2d);
    i_pack_struct_3d(pack_struct_array_3d);
    `CHECK_3D(pack_struct_array_3d);

    `SET_VALUE_1D1(pack_struct_array_1d1);
    `SET_VALUE_2D1(pack_struct_array_2d1);
    `SET_VALUE_3D1(pack_struct_array_3d1);
    i_pack_struct_1d1(pack_struct_array_1d1);
    `CHECK_1D1(pack_struct_array_1d1);
    i_pack_struct_2d1(pack_struct_array_2d1);
    `CHECK_2D1(pack_struct_array_2d1);
    i_pack_struct_3d1(pack_struct_array_3d1);
    `CHECK_3D1(pack_struct_array_3d1);

`ifndef NO_UNPACK_STRUCT
    unpack_struct_array_3d[3][2][1].val = 42;
    i_unpack_struct_0d(unpack_struct_array_3d[3][2][1]);
    `CHECK_VAL(unpack_struct_array_3d[3][2][1].val, 43);

    unpack_struct_array_3d[2][1][0].val = 43;
    unpack_struct_array_3d[2][1][1].val = 44;
    i_unpack_struct_1d(unpack_struct_array_3d[2][1]);
    `CHECK_VAL(unpack_struct_array_3d[2][1][0].val, 44);
    `CHECK_VAL(unpack_struct_array_3d[2][1][1].val, 45);

    unpack_struct_array_3d[1][0][1].val = 45;
    unpack_struct_array_3d[1][1][1].val = 46;
    unpack_struct_array_3d[1][2][1].val = 47;
    i_unpack_struct_2d(unpack_struct_array_3d[1]);
    `CHECK_VAL(unpack_struct_array_3d[1][0][1].val, 46);
    `CHECK_VAL(unpack_struct_array_3d[1][1][1].val, 47);
    `CHECK_VAL(unpack_struct_array_3d[1][2][1].val, 48);

    unpack_struct_array_3d[0][0][0].val = 48;
    unpack_struct_array_3d[1][0][0].val = 49;
    unpack_struct_array_3d[2][0][0].val = 50;
    unpack_struct_array_3d[3][0][0].val = 51;
    i_unpack_struct_3d(unpack_struct_array_3d);
    `CHECK_VAL(unpack_struct_array_3d[0][0][0].val, 49);
    `CHECK_VAL(unpack_struct_array_3d[1][0][0].val, 50);
    `CHECK_VAL(unpack_struct_array_3d[2][0][0].val, 51);
    `CHECK_VAL(unpack_struct_array_3d[3][0][0].val, 52);

    unpack_struct_array_3d1[0][0][0].val = 52;
    i_unpack_struct_1d1(unpack_struct_array_3d1[0][0]);
    `CHECK_VAL(unpack_struct_array_3d1[0][0][0].val, 53);
    unpack_struct_array_3d1[0][0][0].val = 53;
    i_unpack_struct_2d1(unpack_struct_array_3d1[0]);
    `CHECK_VAL(unpack_struct_array_3d1[0][0][0].val, 54);
    unpack_struct_array_3d1[0][0][0].val = 54;
    i_unpack_struct_3d1(unpack_struct_array_3d1);
    `CHECK_VAL(unpack_struct_array_3d1[0][0][0].val, 55);
`endif

    check_exports();
    $write("*-* All Finished *-*\n");
    $finish;
  end

endmodule
