/******************************************************************************* * 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">'Exporter'</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"><$fh></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">""</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">"<$file"</span> <span class="ow">or</span> <span class="k">do</span> <span class="p">{</span> <span class="nb">warn</span> <span class="s">"Cannot open '$file': $!\n"</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"><FILE></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">-></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">-></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">-></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">-></span><span class="p">{</span><span class="n">default</span><span class="p">}</span> <span class="o">=</span> <span class="s">"m if ALL"</span><span class="p">;</span> <span class="nv">$pkg</span><span class="o">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">=></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">-></span><span class="p">{</span><span class="n">vdepends</span><span class="p">}},</span> <span class="nv">$pkg</span><span class="o">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></span><span class="p">{</span><span class="n">description</span><span class="p">}</span> <span class="o">=</span> <span class="s">"\t\t $1\n"</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">"\t\t "</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">-></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">-></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">-></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">-></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">-></span><span class="p">{</span><span class="n">config</span><span class="p">}</span> <span class="o">=</span> <span class="s">"$1\n"</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">"\t"</span><span class="p">);</span> <span class="sr">/^Prereq-Check:/</span> <span class="ow">and</span> <span class="nv">$pkg</span><span class="o">-></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">-></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">-></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">-></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">=></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">-></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">-></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">-></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">-></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 */