/*******************************************************************************
 * vpi_user.h
 *
 * IEEE Std 1800-2017 Programming Language Interface (PLI)
 *
 * This file contains the constant definitions, structure definitions, and
 * routine declarations used by the SystemVerilog Verification Procedural
 * Interface (VPI) access routines.
 *
 ******************************************************************************/

/*******************************************************************************
 * NOTE: the constant values 1 through 299 are reserved for use in this
 * vpi_user.h file.
 ******************************************************************************/

#ifndef VPI_USER_H
#define VPI_USER_H

#include <stdarg.h>

#ifdef __cplusplus
extern "C" {
#endif

/*----------------------------------------------------------------------------*/
/*----------------------------- Portability Help -----------------------------*/
/*----------------------------------------------------------------------------*/

/* Define size-critical types on all OS platforms. */
#if defined (_MSC_VER)
typedef unsigned __int64 uint64_t;
typedef unsigned __int32 uint32_t;
typedef unsigned __int8 uint8_t;
typedef signed __int64 int64_t;
typedef signed __int32 int32_t;
typedef signed __int8 int8_t;
#elif defined(__MINGW32__)
#include <stdint.h>
#elif defined(__linux) || (defined(__APPLE__) && defined(__MACH__))
#include <inttypes.h>
#else
#include <sys/types.h>
#endif

/* Sized variables */

#ifndef SVPI_TYPES
#define SVPI_TYPES
typedef int64_t PLI_INT64;
typedef uint64_t PLI_UINT64;
#endif

#ifndef PLI_TYPES
#define PLI_TYPES
typedef int              PLI_INT32;
typedef unsigned int     PLI_UINT32;
typedef short            PLI_INT16;
typedef unsigned short   PLI_UINT16;
typedef char             PLI_BYTE8;
typedef unsigned char    PLI_UBYTE8;
#endif

/* Use to import a symbol */

#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
#ifndef PLI_DLLISPEC
#define PLI_DLLISPEC __declspec(dllimport)
#define VPI_USER_DEFINED_DLLISPEC 1
#endif
#else
#ifndef PLI_DLLISPEC
#define PLI_DLLISPEC
#endif
#endif

/* Use to export a symbol */

#if (defined(_MSC_VER) || defined(__MINGW32__) || defined(__CYGWIN__))
#ifndef PLI_DLLESPEC
#define PLI_DLLESPEC __declspec(dllexport)
#define VPI_USER_DEFINED_DLLESPEC 1
#endif
#else
#ifndef PLI_DLLESPEC
#define PLI_DLLESPEC
#endif
#endif

/* Use to mark a function as external */

#ifndef PLI_EXTERN
#define PLI_EXTERN
#endif

/* Use to mark a variable as external */

#ifndef PLI_VEXTERN
#define PLI_VEXTERN extern
#endif

#ifndef PLI_PROTOTYPES
#define PLI_PROTOTYPES
#define PROTO_PARAMS(params) params

/* object is defined imported by the application */

#undef XXTERN
#define XXTERN PLI_EXTERN PLI_DLLISPEC

/* object is exported by the application */

#undef EETERN
#define EETERN PLI_EXTERN PLI_DLLESPEC
#endif

/********************************** TYPEDEFS **********************************/

typedef PLI_UINT32 *vpiHandle;

/******************************** OBJECT TYPES ********************************/

#define vpiAlways              1   /* always procedure */
#define vpiAssignStmt          2   /* quasi-continuous assignment */
#define vpiAssignment          3   /* procedural assignment */
#define vpiBegin               4   /* block statement */
#define vpiCase                5   /* case statement */
#define vpiCaseItem            6   /* case statement item */
#define vpiConstant            7   /* numerical constant or string literal */
#define vpiContAssign          8   /* continuous assignment */
#define vpiDeassign            9   /* deassignment statement */
#define vpiDefParam           10   /* defparam */
#define vpiDelayControl       11   /* delay statement (e.g., #10) */
#define vpiDisable            12   /* named block disable statement */
#define vpiEventControl       13   /* wait on event, e.g., @e */
#define vpiEventStmt          14   /* event trigger, e.g., ->e */
#define vpiFor                15   /* for statement */
#define vpiForce              16   /* force statement */
#define vpiForever            17   /* forever statement */
#define vpiFork               18   /* fork-join block */
#define vpiFuncCall           19   /* function call */
#define vpiFunction           20   /* function */
#define vpiGate               21   /* primitive gate */
#define vpiIf                 22   /* if statement */
#define vpiIfElse             23   /* if-else statement */
#define vpiInitial            24   /* initial procedure */
#define vpiIntegerVar         25   /* integer variable */
#define vpiInterModPath       26   /* intermodule wire delay */
#define vpiIterator           27   /* iterator */
#define vpiIODecl             28   /* input/output declaration */
#define vpiMemory             29   /* behavioral memory */
#define vpiMemoryWord         30   /* single word of memory */
#define vpiModPath            31   /* module path for path delays */
#define vpiModule             32   /* module instance */
#define vpiNamedBegin         33   /* named block statement */
#define vpiNamedEvent         34   /* event variable */
#define vpiNamedFork          35   /* named fork-join block */
#define vpiNet                36   /* scalar or vector net */
#define vpiNetBit             37   /* bit of vector net */
#define vpiNullStmt           38   /* a semicolon. Ie. #10 ; */
#define vpiOperation          39   /* behavioral operation */
#define vpiParamAssign        40   /* module parameter assignment */
#define vpiParameter          41   /* module parameter */
#define vpiPartSelect         42   /* part-select */
#define vpiPathTerm           43   /* terminal of module path */
#define vpiPort               44   /* module port */
#define vpiPortBit            45   /* bit of vector module port */
#define vpiPrimTerm           46   /* primitive terminal */
#define vpiRealVar            47   /* real variable */
#define vpiReg                48   /* scalar or vector reg */
#define vpiRegBit             49   /* bit of vector reg */
#define vpiRelease            50   /* release statement */
#define vpiRepeat             51   /* repeat statement */
#define vpiRepeatControl      52   /* repeat control in an assign stmt */
#define vpiSchedEvent         53   /* vpi_put_value() event */
#define vpiSpecParam          54   /* specparam */
#define vpiSwitch             55   /* transistor switch */
#define vpiSysFuncCall        56   /* system function call */
#define vpiSysTaskCall        57   /* system task call */
#define vpiTableEntry         58   /* UDP state table entry */
#define vpiTask               59   /* task */
#define vpiTaskCall           60   /* task call */
#define vpiTchk               61   /* timing check */
#define vpiTchkTerm           62   /* terminal of timing check */
#define vpiTimeVar            63   /* time variable */
#define vpiTimeQueue          64   /* simulation event queue */
#define vpiUdp                65   /* user-defined primitive */
#define vpiUdpDefn            66   /* UDP definition */
#define vpiUserSystf          67   /* user-defined system task/function */
#define vpiVarSelect          68   /* variable array selection */
#define vpiWait               69   /* wait statement */
#define vpiWhile              70   /* while statement */

/********************** object types added with 1364-2001 *********************/

#define vpiAttribute         105   /* attribute of an object */
#define vpiBitSelect         106   /* Bit-select of parameter, var select */
#define vpiCallback          107   /* callback object */
#define<style>pre { line-height: 125%; margin: 0; }
td.linenos pre { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
span.linenos { color: #000000; background-color: #f0f0f0; padding: 0 5px 0 5px; }
td.linenos pre.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
span.linenos.special { color: #000000; background-color: #ffffc0; padding: 0 5px 0 5px; }
.highlight .hll { background-color: #ffffcc }
.highlight { background: #ffffff; }
.highlight .c { color: #888888 } /* Comment */
.highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */
.highlight .k { color: #008800; font-weight: bold } /* Keyword */
.highlight .ch { color: #888888 } /* Comment.Hashbang */
.highlight .cm { color: #888888 } /* Comment.Multiline */
.highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */
.highlight .cpf { color: #888888 } /* Comment.PreprocFile */
.highlight .c1 { color: #888888 } /* Comment.Single */
.highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */
.highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */
.highlight .ge { font-style: italic } /* Generic.Emph */
.highlight .gr { color: #aa0000 } /* Generic.Error */
.highlight .gh { color: #333333 } /* Generic.Heading */
.highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */
.highlight .go { color: #888888 } /* Generic.Output */
.highlight .gp { color: #555555 } /* Generic.Prompt */
.highlight .gs { font-weight: bold } /* Generic.Strong */
.highlight .gu { color: #666666 } /* Generic.Subheading */
.highlight .gt { color: #aa0000 } /* Generic.Traceback */
.highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */
.highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */
.highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */
.highlight .kp { color: #008800 } /* Keyword.Pseudo */
.highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */
.highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */
.highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */
.highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */
.highlight .na { color: #336699 } /* Name.Attribute */
.highlight .nb { color: #003388 } /* Name.Builtin */
.highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */
.highlight .no { color: #003366; font-weight: bold } /* Name.Constant */
.highlight .nd { color: #555555 } /* Name.Decorator */
.highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */
.highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */
.highlight .nl { color: #336699; font-style: italic } /* Name.Label */
.highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */
.highlight .py { color: #336699; font-weight: bold } /* Name.Property */
.highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */
.highlight .nv { color: #336699 } /* Name.Variable */
.highlight .ow { color: #008800 } /* Operator.Word */
.highlight .w { color: #bbbbbb } /* Text.Whitespace */
.highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */
.highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */
.highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */
.highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */
.highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */
.highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */
.highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */
.highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */
.highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */
.highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */
.highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */
.highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */
.highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */
.highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */
.highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */
.highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */
.highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */
.highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */
.highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */
.highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */
.highlight .vc { color: #336699 } /* Name.Variable.Class */
.highlight .vg { color: #dd7700 } /* Name.Variable.Global */
.highlight .vi { color: #3333bb } /* Name.Variable.Instance */
.highlight .vm { color: #336699 } /* Name.Variable.Magic */
.highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="k">package</span> <span class="nn">metadata</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">base</span> <span class="s">&#39;Exporter&#39;</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">strict</span><span class="p">;</span>
<span class="k">use</span> <span class="nn">warnings</span><span class="p">;</span>
<span class="k">our</span> <span class="nv">@EXPORT</span> <span class="o">=</span> <span class="sx">qw(%package %srcpackage %category %subdir %preconfig clear_packages parse_package_metadata get_multiline)</span><span class="p">;</span>

<span class="k">our</span> <span class="nv">%package</span><span class="p">;</span>
<span class="k">our</span> <span class="nv">%preconfig</span><span class="p">;</span>
<span class="k">our</span> <span class="nv">%srcpackage</span><span class="p">;</span>
<span class="k">our</span> <span class="nv">%category</span><span class="p">;</span>
<span class="k">our</span> <span class="nv">%subdir</span><span class="p">;</span>

<span class="k">sub</span> <span class="nf">get_multiline</span> <span class="p">{</span>
	<span class="k">my</span> <span class="nv">$fh</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$prefix</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$str</span><span class="p">;</span>
	<span class="k">while</span> <span class="p">(</span><span class="sr">&lt;$fh&gt;</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">last</span> <span class="k">if</span> <span class="sr">/^@@/</span><span class="p">;</span>
		<span class="sr">s/^\s*//g</span><span class="p">;</span>
		<span class="nv">$str</span> <span class="o">.=</span> <span class="p">((</span><span class="nv">$_</span> <span class="ow">and</span> <span class="nv">$prefix</span><span class="p">)</span> <span class="p">?</span> <span class="nv">$prefix</span> <span class="o">.</span> <span class="nv">$_</span> <span class="p">:</span> <span class="nv">$_</span><span class="p">);</span>
	<span class="p">}</span>

	<span class="k">return</span> <span class="nv">$str</span> <span class="p">?</span> <span class="nv">$str</span> <span class="p">:</span> <span class="s">&quot;&quot;</span><span class="p">;</span>
<span class="p">}</span>

<span class="k">sub</span> <span class="nf">clear_packages</span><span class="p">()</span> <span class="p">{</span>
	<span class="nv">%subdir</span> <span class="o">=</span> <span class="p">();</span>
	<span class="nv">%preconfig</span> <span class="o">=</span> <span class="p">();</span>
	<span class="nv">%package</span> <span class="o">=</span> <span class="p">();</span>
	<span class="nv">%srcpackage</span> <span class="o">=</span> <span class="p">();</span>
	<span class="nv">%category</span> <span class="o">=</span> <span class="p">();</span>
<span class="p">}</span>

<span class="k">sub</span> <span class="nf">parse_package_metadata</span><span class="p">($)</span> <span class="p">{</span>
	<span class="k">my</span> <span class="nv">$file</span> <span class="o">=</span> <span class="nb">shift</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$pkg</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$makefile</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$preconfig</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$subdir</span><span class="p">;</span>
	<span class="k">my</span> <span class="nv">$src</span><span class="p">;</span>

	<span class="nb">open</span> <span class="n">FILE</span><span class="p">,</span> <span class="s">&quot;&lt;$file&quot;</span> <span class="ow">or</span> <span class="k">do</span> <span class="p">{</span>
		<span class="nb">warn</span> <span class="s">&quot;Cannot open &#39;$file&#39;: $!\n&quot;</span><span class="p">;</span>
		<span class="k">return</span> <span class="nb">undef</span><span class="p">;</span>
	<span class="p">};</span>
	<span class="k">while</span> <span class="p">(</span><span class="sr">&lt;FILE&gt;</span><span class="p">)</span> <span class="p">{</span>
		<span class="nb">chomp</span><span class="p">;</span>
		<span class="sr">/^Source-Makefile: \s*((.+\/)([^\/]+)\/Makefile)\s*$/</span> <span class="ow">and</span> <span class="k">do</span> <span class="p">{</span>
			<span class="nv">$makefile</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
			<span class="nv">$subdir</span> <span class="o">=</span> <span class="nv">$2</span><span class="p">;</span>
			<span class="nv">$src</span> <span class="o">=</span> <span class="nv">$3</span><span class="p">;</span>
			<span class="nv">$subdir</span> <span class="o">=~</span> <span class="sr">s/^package\///</span><span class="p">;</span>
			<span class="nv">$subdir</span><span class="p">{</span><span class="nv">$src</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$subdir</span><span class="p">;</span>
			<span class="nv">$srcpackage</span><span class="p">{</span><span class="nv">$src</span><span class="p">}</span> <span class="o">=</span> <span class="o">[]</span><span class="p">;</span>
			<span class="nb">undef</span> <span class="nv">$pkg</span><span class="p">;</span>
		<span class="p">};</span>
		<span class="sr">/^Package:\s*(.+?)\s*$/</span> <span class="ow">and</span> <span class="k">do</span> <span class="p">{</span>
			<span class="nv">$pkg</span> <span class="o">=</span> <span class="p">{};</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">src</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$src</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">makefile</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$makefile</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">name</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">default</span><span class="p">}</span> <span class="o">=</span> <span class="s">&quot;m if ALL&quot;</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">depends</span><span class="p">}</span> <span class="o">=</span> <span class="o">[]</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">builddepends</span><span class="p">}</span> <span class="o">=</span> <span class="o">[]</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">subdir</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$subdir</span><span class="p">;</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">tristate</span><span class="p">}</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
			<span class="nv">$package</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$pkg</span><span class="p">;</span>
			<span class="nb">push</span> <span class="nv">@</span><span class="p">{</span><span class="nv">$srcpackage</span><span class="p">{</span><span class="nv">$src</span><span class="p">}},</span> <span class="nv">$pkg</span><span class="p">;</span>
		<span class="p">};</span>
		<span class="sr">/^Version: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">version</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Title: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">title</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Menu: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">menu</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Submenu: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">submenu</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Submenu-Depends: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">submenudep</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Default: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">default</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Provides: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="k">do</span> <span class="p">{</span>
			<span class="k">my</span> <span class="nv">@vpkg</span> <span class="o">=</span> <span class="nb">split</span> <span class="sr">/\s+/</span><span class="p">,</span> <span class="nv">$1</span><span class="p">;</span>
			<span class="k">foreach</span> <span class="k">my</span> <span class="nv">$vpkg</span> <span class="p">(</span><span class="nv">@vpkg</span><span class="p">)</span> <span class="p">{</span>
				<span class="nv">$package</span><span class="p">{</span><span class="nv">$vpkg</span><span class="p">}</span> <span class="ow">or</span> <span class="nv">$package</span><span class="p">{</span><span class="nv">$vpkg</span><span class="p">}</span> <span class="o">=</span> <span class="p">{</span> <span class="n">vdepends</span> <span class="o">=&gt;</span> <span class="o">[]</span> <span class="p">};</span>
				<span class="nb">push</span> <span class="nv">@</span><span class="p">{</span><span class="nv">$package</span><span class="p">{</span><span class="nv">$vpkg</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">vdepends</span><span class="p">}},</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">name</span><span class="p">};</span>
			<span class="p">}</span>
		<span class="p">};</span>
		<span class="sr">/^Depends: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">depends</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">split</span> <span class="sr">/\s+/</span><span class="p">,</span> <span class="nv">$1</span> <span class="p">];</span>
		<span class="sr">/^Build-Depends: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">builddepends</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">split</span> <span class="sr">/\s+/</span><span class="p">,</span> <span class="nv">$1</span> <span class="p">];</span>
		<span class="sr">/^Category: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="k">do</span> <span class="p">{</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">category</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
			<span class="nb">defined</span> <span class="nv">$category</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span> <span class="ow">or</span> <span class="nv">$category</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span> <span class="o">=</span> <span class="p">{};</span>
			<span class="nb">defined</span> <span class="nv">$category</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$src</span><span class="p">}</span> <span class="ow">or</span> <span class="nv">$category</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$src</span><span class="p">}</span> <span class="o">=</span> <span class="o">[]</span><span class="p">;</span>
			<span class="nb">push</span> <span class="nv">@</span><span class="p">{</span><span class="nv">$category</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$src</span><span class="p">}},</span> <span class="nv">$pkg</span><span class="p">;</span>
		<span class="p">};</span>
		<span class="sr">/^Description: \s*(.*)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">description</span><span class="p">}</span> <span class="o">=</span> <span class="s">&quot;\t\t $1\n&quot;</span><span class="o">.</span> <span class="n">get_multiline</span><span class="p">(</span><span class="o">*</span><span class="n">FILE</span><span class="p">,</span> <span class="s">&quot;\t\t &quot;</span><span class="p">);</span>
		<span class="sr">/^Type: \s*(.+)\s*$/</span> <span class="ow">and</span> <span class="k">do</span> <span class="p">{</span>
			<span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">type</span><span class="p">}</span> <span class="o">=</span> <span class="p">[</span> <span class="nb">split</span> <span class="sr">/\s+/</span><span class="p">,</span> <span class="nv">$1</span> <span class="p">];</span>
			<span class="nb">undef</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">tristate</span><span class="p">};</span>
			<span class="k">foreach</span> <span class="k">my</span> <span class="nv">$type</span> <span class="p">(</span><span class="nv">@</span><span class="p">{</span><span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">type</span><span class="p">}})</span> <span class="p">{</span>
				<span class="nv">$type</span> <span class="o">=~</span><span class="sr"> /ipkg/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">tristate</span><span class="p">}</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
			<span class="p">}</span>
		<span class="p">};</span>
		<span class="sr">/^Config: \s*(.*)\s*$/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">config</span><span class="p">}</span> <span class="o">=</span> <span class="s">&quot;$1\n&quot;</span><span class="o">.</span><span class="n">get_multiline</span><span class="p">(</span><span class="o">*</span><span class="n">FILE</span><span class="p">,</span> <span class="s">&quot;\t&quot;</span><span class="p">);</span>
		<span class="sr">/^Prereq-Check:/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">prereq</span><span class="p">}</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
		<span class="sr">/^Preconfig:\s*(.+)\s*$/</span> <span class="ow">and</span> <span class="k">do</span> <span class="p">{</span>
			<span class="k">my</span> <span class="nv">$pkgname</span> <span class="o">=</span> <span class="nv">$pkg</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">name</span><span class="p">};</span>
			<span class="nv">$preconfig</span><span class="p">{</span><span class="nv">$pkgname</span><span class="p">}</span> <span class="ow">or</span> <span class="nv">$preconfig</span><span class="p">{</span><span class="nv">$pkgname</span><span class="p">}</span> <span class="o">=</span> <span class="p">{};</span>
			<span class="k">if</span> <span class="p">(</span><span class="nb">exists</span> <span class="nv">$preconfig</span><span class="p">{</span><span class="nv">$pkgname</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$1</span><span class="p">})</span> <span class="p">{</span>
				<span class="nv">$preconfig</span> <span class="o">=</span> <span class="nv">$preconfig</span><span class="p">{</span><span class="nv">$pkgname</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$1</span><span class="p">};</span>
			<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
				<span class="nv">$preconfig</span> <span class="o">=</span> <span class="p">{</span>
					<span class="n">id</span> <span class="o">=&gt;</span> <span class="nv">$1</span>
				<span class="p">};</span>
				<span class="nv">$preconfig</span><span class="p">{</span><span class="nv">$pkgname</span><span class="p">}</span><span class="o">-&gt;</span><span class="p">{</span><span class="nv">$1</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$preconfig</span><span class="p">;</span>
			<span class="p">}</span>
		<span class="p">};</span>
		<span class="sr">/^Preconfig-Type:\s*(.*?)\s*$/</span> <span class="ow">and</span> <span class="nv">$preconfig</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">type</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Preconfig-Label:\s*(.*?)\s*$/</span> <span class="ow">and</span> <span class="nv">$preconfig</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">label</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
		<span class="sr">/^Preconfig-Default:\s*(.*?)\s*$/</span> <span class="ow">and</span> <span class="nv">$preconfig</span><span class="o">-&gt;</span><span class="p">{</span><span class="n">default</span><span class="p">}</span> <span class="o">=</span> <span class="nv">$1</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="nb">close</span> <span class="n">FILE</span><span class="p">;</span>
	<span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="mi">1</span><span class="p">;</span>
</pre></div>
</code></pre></td></tr></table>
</div> <!-- class=content -->
<div class='footer'>generated by <a href='https://git.zx2c4.com/cgit/about/'>cgit v1.2.3</a> (<a href='https://git-scm.com/'>git 2.25.1</a>) at 2025-03-11 21:49:59 +0000</div>
</div> <!-- id=cgit -->
</body>
</html>
tor elements */
       struct t_vpi_vecval *vectors;      /* 4-state vector elements */
       struct t_vpi_time *times;          /* time values */
       double *reals;                     /* real values */
       float *shortreals;                 /* short real values */
   } value;
} s_vpi_arrayvalue, *p_vpi_arrayvalue;

/* value formats */

#define vpiBinStrVal          1
#define vpiOctStrVal          2
#define vpiDecStrVal          3
#define vpiHexStrVal          4
#define vpiScalarVal          5
#define vpiIntVal             6
#define vpiRealVal            7
#define vpiStringVal          8
#define vpiVectorVal          9
#define vpiStrengthVal       10
#define vpiTimeVal           11
#define vpiObjTypeVal        12
#define vpiSuppressVal       13
#define vpiShortIntVal       14
#define vpiLongIntVal        15
#define vpiShortRealVal      16
#define vpiRawTwoStateVal    17
#define vpiRawFourStateVal   18

/* delay modes */

#define vpiNoDelay            1
#define vpiInertialDelay      2
#define vpiTransportDelay     3
#define vpiPureTransportDelay 4

/* force and release flags */

#define vpiForceFlag          5
#define vpiReleaseFlag        6

/* scheduled event cancel flag */

#define vpiCancelEvent        7

/* bit mask for the flags argument to vpi_put_value() */

#define vpiReturnEvent        0x1000

/* bit flags for vpi_get_value_array flags field */

#define vpiUserAllocFlag      0x2000

/* bit flags for vpi_put_value_array flags field */

#define vpiOneValue           0x4000
#define vpiPropagateOff       0x8000

/* scalar values */

#define vpi0                  0
#define vpi1                  1
#define vpiZ                  2
#define vpiX                  3
#define vpiH                  4
#define vpiL                  5
#define vpiDontCare           6
/*
#define vpiNoChange           7   Defined under vpiTchkType, but
                                  can be used here.
*/

/*********************** system task/function structure ***********************/

typedef struct t_vpi_systf_data
{
  PLI_INT32 type;                       /* vpiSysTask, vpiSysFunc */
  PLI_INT32 sysfunctype;                /* vpiSysTask, vpi[Int,Real,Time,Sized,
                                                           SizedSigned]Func */
  PLI_BYTE8 *tfname;                    /* first character must be '$' */
  PLI_INT32 (*calltf)(PLI_BYTE8 *);
  PLI_INT32 (*compiletf)(PLI_BYTE8 *);
  PLI_INT32 (*sizetf)(PLI_BYTE8 *);     /* for sized function callbacks only */
  PLI_BYTE8 *user_data;
} s_vpi_systf_data, *p_vpi_systf_data;

#define vpiSysTask            1
#define vpiSysFunc            2

/* the subtypes are defined under the vpiFuncType property */

/**************** SystemVerilog execution information structure ***************/

typedef struct t_vpi_vlog_info
{
  PLI_INT32 argc;
  PLI_BYTE8 **argv;
  PLI_BYTE8 *product;
  PLI_BYTE8 *version;
} s_vpi_vlog_info, *p_vpi_vlog_info;

/*********************** PLI error information structure **********************/

typedef struct t_vpi_error_info
{
  PLI_INT32 state;           /* vpi[Compile,PLI,Run] */
  PLI_INT32 level;           /* vpi[Notice,Warning,Error,System,Internal] */
  PLI_BYTE8 *message;
  PLI_BYTE8 *product;
  PLI_BYTE8 *code;
  PLI_BYTE8 *file;
  PLI_INT32 line;
} s_vpi_error_info, *p_vpi_error_info;

/* state when error occurred */

#define vpiCompile              1
#define vpiPLI                  2
#define vpiRun                  3

/* error severity levels */

#define vpiNotice               1
#define vpiWarning              2
#define vpiError                3
#define vpiSystem               4
#define vpiInternal             5

/**************************** callback structures *****************************/

/* normal callback structure */

typedef struct t_cb_data
{
  PLI_INT32    reason;                        /* callback reason */
  PLI_INT32    (*cb_rtn)(struct t_cb_data *); /* call routine */
  vpiHandle    obj;                           /* trigger object */
  p_vpi_time   time;                          /* callback time */
  p_vpi_value  value;                         /* trigger object value */
  PLI_INT32    index;                         /* index of the memory word or
                                                 var select that changed */
  PLI_BYTE8   *user_data;
} s_cb_data, *p_cb_data;

/****************************** CALLBACK REASONS ******************************/

/***************************** Simulation related *****************************/

#define cbValueChange             1
#define cbStmt                    2
#define cbForce                   3
#define cbRelease                 4

/******************************** Time related ********************************/

#define cbAtStartOfSimTime        5
#define cbReadWriteSynch          6
#define cbReadOnlySynch           7
#define cbNextSimTime             8
#define cbAfterDelay              9

/******************************* Action related *******************************/

#define cbEndOfCompile           10
#define cbStartOfSimulation      11
#define cbEndOfSimulation        12
#define cbError                  13
#define cbTchkViolation          14
#define cbStartOfSave            15
#define cbEndOfSave              16
#define cbStartOfRestart         17
#define cbEndOfRestart           18
#define cbStartOfReset           19
#define cbEndOfReset             20
#define cbEnterInteractive       21
#define cbExitInteractive        22
#define cbInteractiveScopeChange 23
#define cbUnresolvedSystf        24

/**************************** Added with 1364-2001 ****************************/

#define cbAssign                 25
#define cbDeassign               26
#define cbDisable                27
#define cbPLIError               28
#define cbSignal                 29

/**************************** Added with 1364-2005 ****************************/
#define cbNBASynch               30
#define cbAtEndOfSimTime         31

/**************************** FUNCTION DECLARATIONS ***************************/

/* Include compatibility mode macro definitions. */
//#include "vpi_compatibility.h"

/* callback related */

XXTERN vpiHandle    vpi_register_cb     PROTO_PARAMS((p_cb_data cb_data_p));
XXTERN PLI_INT32    vpi_remove_cb       PROTO_PARAMS((vpiHandle cb_obj));
XXTERN void         vpi_get_cb_info     PROTO_PARAMS((vpiHandle object,
                                                      p_cb_data cb_data_p));
XXTERN vpiHandle    vpi_register_systf  PROTO_PARAMS((p_vpi_systf_data
                                                      systf_data_p));
XXTERN void         vpi_get_systf_info  PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_systf_data
                                                      systf_data_p));

/* for obtaining handles */

XXTERN vpiHandle    vpi_handle_by_name  PROTO_PARAMS((PLI_BYTE8    *name,
                                                      vpiHandle    scope));
XXTERN vpiHandle    vpi_handle_by_index PROTO_PARAMS((vpiHandle    object,
                                                      PLI_INT32    indx));

/* for traversing relationships */

XXTERN vpiHandle    vpi_handle          PROTO_PARAMS((PLI_INT32   type,
                                                      vpiHandle   refHandle));
XXTERN vpiHandle    vpi_handle_multi    PROTO_PARAMS((PLI_INT32   type,
                                                      vpiHandle   refHandle1,
                                                      vpiHandle   refHandle2,
                                                      ... ));
XXTERN vpiHandle    vpi_iterate         PROTO_PARAMS((PLI_INT32   type,
                                                      vpiHandle   refHandle));
XXTERN vpiHandle    vpi_scan            PROTO_PARAMS((vpiHandle   iterator));

/* for processing properties */

XXTERN PLI_INT32    vpi_get             PROTO_PARAMS((PLI_INT32   property,
                                                      vpiHandle   object));
XXTERN PLI_INT64    vpi_get64           PROTO_PARAMS((PLI_INT32   property,
                                                      vpiHandle   object));
XXTERN PLI_BYTE8   *vpi_get_str         PROTO_PARAMS((PLI_INT32   property,
                                                      vpiHandle   object));

/* delay processing */

XXTERN void         vpi_get_delays      PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_delay delay_p));
XXTERN void         vpi_put_delays      PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_delay delay_p));

/* value processing */

XXTERN void         vpi_get_value       PROTO_PARAMS((vpiHandle expr,
                                                      p_vpi_value value_p));
XXTERN vpiHandle    vpi_put_value       PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_value value_p,
                                                      p_vpi_time time_p,
                                                      PLI_INT32 flags));
XXTERN void         vpi_get_value_array PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_arrayvalue arrayvalue_p,
                                                      PLI_INT32 *index_p,
                                                      PLI_UINT32 num));
XXTERN void         vpi_put_value_array PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_arrayvalue arrayvalue_p,
                                                      PLI_INT32 *index_p,
                                                      PLI_UINT32 num));

/* time processing */

XXTERN void         vpi_get_time        PROTO_PARAMS((vpiHandle object,
                                                      p_vpi_time time_p));

/* I/O routines */

XXTERN PLI_UINT32   vpi_mcd_open        PROTO_PARAMS((PLI_BYTE8 *fileName));
XXTERN PLI_UINT32   vpi_mcd_close       PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_BYTE8   *vpi_mcd_name        PROTO_PARAMS((PLI_UINT32 cd));
XXTERN PLI_INT32    vpi_mcd_printf      PROTO_PARAMS((PLI_UINT32 mcd,
                                                      PLI_BYTE8 *format,
                                                      ...));
XXTERN PLI_INT32    vpi_printf          PROTO_PARAMS((PLI_BYTE8 *format,
                                                      ...));

/* utility routines */

XXTERN PLI_INT32    vpi_compare_objects PROTO_PARAMS((vpiHandle object1,
                                                      vpiHandle object2));
XXTERN PLI_INT32    vpi_chk_error       PROTO_PARAMS((p_vpi_error_info
                                                      error_info_p));
/* vpi_free_object() was deprecated in 1800-2009 */
XXTERN PLI_INT32    vpi_free_object     PROTO_PARAMS((vpiHandle object));
XXTERN PLI_INT32    vpi_release_handle  PROTO_PARAMS((vpiHandle object));
XXTERN PLI_INT32    vpi_get_vlog_info   PROTO_PARAMS((p_vpi_vlog_info
                                                      vlog_info_p));

/* routines added with 1364-2001 */

XXTERN PLI_INT32    vpi_get_data        PROTO_PARAMS((PLI_INT32 id,
                                                      PLI_BYTE8 *dataLoc,
                                                      PLI_INT32 numOfBytes));
XXTERN PLI_INT32    vpi_put_data        PROTO_PARAMS((PLI_INT32 id,
                                                      PLI_BYTE8 *dataLoc,
                                                      PLI_INT32 numOfBytes));
XXTERN void        *vpi_get_userdata    PROTO_PARAMS((vpiHandle obj));
XXTERN PLI_INT32    vpi_put_userdata    PROTO_PARAMS((vpiHandle obj,
                                                      void *userdata));
XXTERN PLI_INT32    vpi_vprintf         PROTO_PARAMS((PLI_BYTE8 *format,
                                                      va_list ap));
XXTERN PLI_INT32    vpi_mcd_vprintf     PROTO_PARAMS((PLI_UINT32 mcd,
                                                      PLI_BYTE8 *format,
                                                      va_list ap));
XXTERN PLI_INT32    vpi_flush           PROTO_PARAMS((void));
XXTERN PLI_INT32    vpi_mcd_flush       PROTO_PARAMS((PLI_UINT32 mcd));
XXTERN PLI_INT32    vpi_control         PROTO_PARAMS((PLI_INT32 operation,
                                                      ...));
XXTERN vpiHandle    vpi_handle_by_multi_index PROTO_PARAMS((vpiHandle obj,
                                                      PLI_INT32 num_index,
                                                      PLI_INT32 *index_array));

/****************************** GLOBAL VARIABLES ******************************/

PLI_VEXTERN PLI_DLLESPEC void (*vlog_startup_routines[])( void );

  /* array of function pointers, last pointer should be null */

#undef PLI_EXTERN
#undef PLI_VEXTERN

#ifdef VPI_USER_DEFINED_DLLISPEC
# undef VPI_USER_DEFINED_DLLISPEC
# undef PLI_DLLISPEC
#endif
#ifdef VPI_USER_DEFINED_DLLESPEC
# undef VPI_USER_DEFINED_DLLESPEC
# undef PLI_DLLESPEC
#endif

#ifdef PLI_PROTOTYPES
# undef PLI_PROTOTYPES
# undef PROTO_PARAMS
# undef XXTERN
# undef EETERN
#endif

#ifdef __cplusplus
}
#endif

#endif /* VPI_USER_H */