mirror of
https://github.com/verilator/verilator.git
synced 2025-01-23 14:54:15 +00:00
Add vl_mc_scan_plusargs
This commit is contained in:
parent
5d5952d354
commit
56a03e1a10
@ -913,6 +913,12 @@ IData VL_VALUEPLUSARGS_IW(int rbits, const char* prefixp, char fmt, WDataOutP rw
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char* vl_mc_scan_plusargs(const char* prefixp) {
|
||||||
|
string match = VerilatedImp::argPlusMatch(prefixp);
|
||||||
|
if (match == "") return 0;
|
||||||
|
else return match.c_str()+strlen(prefixp)+1; // +1 to skip the "+"
|
||||||
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
// Heavy functions
|
// Heavy functions
|
||||||
|
|
||||||
|
@ -303,6 +303,7 @@ extern void VL_SFORMAT_X(int obits, void* destp, const char* formatp, ...);
|
|||||||
|
|
||||||
extern IData VL_TESTPLUSARGS_I(const char* formatp);
|
extern IData VL_TESTPLUSARGS_I(const char* formatp);
|
||||||
extern IData VL_VALUEPLUSARGS_IW(int rbits, const char* prefixp, char fmt, WDataOutP rwp);
|
extern IData VL_VALUEPLUSARGS_IW(int rbits, const char* prefixp, char fmt, WDataOutP rwp);
|
||||||
|
extern const char* vl_mc_scan_plusargs(const char* prefixp); // PLIish
|
||||||
|
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
// Base macros
|
// Base macros
|
||||||
|
@ -80,6 +80,7 @@ public: // But only for verilated*.cpp
|
|||||||
s_s.m_argVecLoaded = true; // Can't just test later for empty vector, no arguments is ok
|
s_s.m_argVecLoaded = true; // Can't just test later for empty vector, no arguments is ok
|
||||||
}
|
}
|
||||||
static string argPlusMatch(const char* prefixp) {
|
static string argPlusMatch(const char* prefixp) {
|
||||||
|
// Note prefixp does not include the leading "+"
|
||||||
size_t len = strlen(prefixp);
|
size_t len = strlen(prefixp);
|
||||||
if (VL_UNLIKELY(!s_s.m_argVecLoaded)) {
|
if (VL_UNLIKELY(!s_s.m_argVecLoaded)) {
|
||||||
s_s.m_argVecLoaded = true; // Complain only once
|
s_s.m_argVecLoaded = true; // Complain only once
|
||||||
@ -134,7 +135,7 @@ public: // But only for verilated*.cpp
|
|||||||
}
|
}
|
||||||
static inline const VerilatedScope* scopeFind(const char* namep) {
|
static inline const VerilatedScope* scopeFind(const char* namep) {
|
||||||
ScopeNameMap::iterator it=s_s.m_nameMap.find(namep);
|
ScopeNameMap::iterator it=s_s.m_nameMap.find(namep);
|
||||||
if (it != s_s.m_nameMap.end()) return it->second;
|
if (VL_LIKELY(it != s_s.m_nameMap.end())) return it->second;
|
||||||
else return NULL;
|
else return NULL;
|
||||||
}
|
}
|
||||||
static void scopeErase(const VerilatedScope* scopep) {
|
static void scopeErase(const VerilatedScope* scopep) {
|
||||||
@ -174,7 +175,7 @@ public: // But only for verilated*.cpp
|
|||||||
}
|
}
|
||||||
static int exportFind(const char* namep) {
|
static int exportFind(const char* namep) {
|
||||||
ExportNameMap::iterator it=s_s.m_exportMap.find(namep);
|
ExportNameMap::iterator it=s_s.m_exportMap.find(namep);
|
||||||
if (it != s_s.m_exportMap.end()) return it->second;
|
if (VL_LIKELY(it != s_s.m_exportMap.end())) return it->second;
|
||||||
string msg = (string("%Error: Testbench C called ")+namep
|
string msg = (string("%Error: Testbench C called ")+namep
|
||||||
+" but no such DPI export function name exists in ANY model");
|
+" but no such DPI export function name exists in ANY model");
|
||||||
vl_fatal("unknown",0,"", msg.c_str());
|
vl_fatal("unknown",0,"", msg.c_str());
|
||||||
|
Loading…
Reference in New Issue
Block a user