Internals: Detab and fix spacing style issues in include files. No functional change.

When merging, recommend using "git merge -Xignore-all-space"
This commit is contained in:
Wilson Snyder 2019-05-08 21:13:38 -04:00
parent b23fc06388
commit f96942a526
4 changed files with 1617 additions and 1588 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -92,32 +92,32 @@ public:
// METHODS // METHODS
//// Add message to queue (called by producer) //// Add message to queue (called by producer)
void post(const VerilatedMsg& msg) VL_EXCLUDES(m_mutex) { void post(const VerilatedMsg& msg) VL_EXCLUDES(m_mutex) {
VerilatedLockGuard lock(m_mutex); VerilatedLockGuard lock(m_mutex);
m_queue.insert(msg); // Pass by value to copy the message into queue m_queue.insert(msg); // Pass by value to copy the message into queue
++m_depth; ++m_depth;
} }
/// Service queue until completion (called by consumer) /// Service queue until completion (called by consumer)
void process() VL_EXCLUDES(m_mutex) { void process() VL_EXCLUDES(m_mutex) {
// Tracking m_depth is redundant to e.g. getting the mutex and looking at queue size, // Tracking m_depth is redundant to e.g. getting the mutex and looking at queue size,
// but on the reader side it's 4x faster to test an atomic then getting a mutex // but on the reader side it's 4x faster to test an atomic then getting a mutex
while (m_depth) { while (m_depth) {
// Wait for a message to be added to the queue // Wait for a message to be added to the queue
// We don't use unique_lock as want to unlock with the message copy still in scope // We don't use unique_lock as want to unlock with the message copy still in scope
m_mutex.lock(); m_mutex.lock();
assert(!m_queue.empty()); // Otherwise m_depth is wrong assert(!m_queue.empty()); // Otherwise m_depth is wrong
// Unfortunately to release the lock we need to copy the message // Unfortunately to release the lock we need to copy the message
// (Or have the message be a pointer, but then new/delete cost on each message) // (Or have the message be a pointer, but then new/delete cost on each message)
// We assume messages are small, so copy // We assume messages are small, so copy
auto it = m_queue.begin(); auto it = m_queue.begin();
const VerilatedMsg msg = *(it); const VerilatedMsg msg = *(it);
m_queue.erase(it); m_queue.erase(it);
m_mutex.unlock(); m_mutex.unlock();
m_depth--; // Ok if outside critical section as only this code checks the value m_depth--; // Ok if outside critical section as only this code checks the value
{ {
VL_DEBUG_IF(VL_DBG_MSGF("Executing callback from mtaskId=%d\n", msg.mtaskId());); VL_DEBUG_IF(VL_DBG_MSGF("Executing callback from mtaskId=%d\n", msg.mtaskId()););
msg.run(); msg.run();
} }
} }
} }
}; };
@ -128,15 +128,15 @@ public:
// CONSTRUCTORS // CONSTRUCTORS
VerilatedThreadMsgQueue() { } VerilatedThreadMsgQueue() { }
~VerilatedThreadMsgQueue() { ~VerilatedThreadMsgQueue() {
// The only call of this with a non-empty queue is a fatal error. // The only call of this with a non-empty queue is a fatal error.
// So this does not flush the queue, as the destination queue is not known to this class. // So this does not flush the queue, as the destination queue is not known to this class.
} }
private: private:
VL_UNCOPYABLE(VerilatedThreadMsgQueue); VL_UNCOPYABLE(VerilatedThreadMsgQueue);
// METHODS // METHODS
static VerilatedThreadMsgQueue& threadton() { static VerilatedThreadMsgQueue& threadton() {
static VL_THREAD_LOCAL VerilatedThreadMsgQueue t_s; static VL_THREAD_LOCAL VerilatedThreadMsgQueue t_s;
return t_s; return t_s;
} }
public: public:
/// Add message to queue, called by producer /// Add message to queue, called by producer
@ -153,11 +153,11 @@ public:
} }
/// Push all messages to the eval's queue /// Push all messages to the eval's queue
static void flush(VerilatedEvalMsgQueue* evalMsgQp) VL_MT_SAFE { static void flush(VerilatedEvalMsgQueue* evalMsgQp) VL_MT_SAFE {
while (!threadton().m_queue.empty()) { while (!threadton().m_queue.empty()) {
evalMsgQp->post(threadton().m_queue.front()); evalMsgQp->post(threadton().m_queue.front());
threadton().m_queue.pop(); threadton().m_queue.pop();
Verilated::endOfEvalReqdDec(); Verilated::endOfEvalReqdDec();
} }
} }
}; };
#endif // VL_THREADED #endif // VL_THREADED
@ -200,11 +200,11 @@ class VerilatedImp {
public: // But only for verilated*.cpp public: // But only for verilated*.cpp
// CONSTRUCTORS // CONSTRUCTORS
VerilatedImp() VerilatedImp()
: m_argVecLoaded(false), m_exportNext(0) { : m_argVecLoaded(false), m_exportNext(0) {
m_fdps.resize(3); m_fdps.resize(3);
m_fdps[0] = stdin; m_fdps[0] = stdin;
m_fdps[1] = stdout; m_fdps[1] = stdout;
m_fdps[2] = stderr; m_fdps[2] = stderr;
} }
~VerilatedImp() {} ~VerilatedImp() {}
private: private:
@ -219,21 +219,21 @@ public:
static void commandArgs(int argc, const char** argv) VL_EXCLUDES(s_s.m_argMutex); static void commandArgs(int argc, const char** argv) VL_EXCLUDES(s_s.m_argMutex);
static void commandArgsAdd(int argc, const char** argv) VL_EXCLUDES(s_s.m_argMutex); static void commandArgsAdd(int argc, const char** argv) VL_EXCLUDES(s_s.m_argMutex);
static std::string argPlusMatch(const char* prefixp) VL_EXCLUDES(s_s.m_argMutex) { static std::string argPlusMatch(const char* prefixp) VL_EXCLUDES(s_s.m_argMutex) {
VerilatedLockGuard lock(s_s.m_argMutex); VerilatedLockGuard lock(s_s.m_argMutex);
// Note prefixp does not include the leading "+" // 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
VL_FATAL_MT("unknown",0,"", VL_FATAL_MT("unknown", 0, "",
"%Error: Verilog called $test$plusargs or $value$plusargs without" "%Error: Verilog called $test$plusargs or $value$plusargs without"
" testbench C first calling Verilated::commandArgs(argc,argv)."); " testbench C first calling Verilated::commandArgs(argc,argv).");
} }
for (ArgVec::const_iterator it=s_s.m_argVec.begin(); it!=s_s.m_argVec.end(); ++it) { for (ArgVec::const_iterator it=s_s.m_argVec.begin(); it!=s_s.m_argVec.end(); ++it) {
if ((*it)[0]=='+') { if ((*it)[0]=='+') {
if (0==strncmp(prefixp, it->c_str()+1, len)) return *it; if (0==strncmp(prefixp, it->c_str()+1, len)) return *it;
} }
} }
return ""; return "";
} }
private: private:
static void commandArgsAddGuts(int argc, const char** argv) VL_REQUIRES(s_s.m_argMutex); static void commandArgsAddGuts(int argc, const char** argv) VL_REQUIRES(s_s.m_argMutex);
@ -247,75 +247,77 @@ public:
// There's often many more scopes than userdata's and thus having a ~48byte // There's often many more scopes than userdata's and thus having a ~48byte
// per map overhead * N scopes would take much more space and cache thrashing. // per map overhead * N scopes would take much more space and cache thrashing.
static inline void userInsert(const void* scopep, void* userKey, void* userData) VL_MT_SAFE { static inline void userInsert(const void* scopep, void* userKey, void* userData) VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_userMapMutex); VerilatedLockGuard lock(s_s.m_userMapMutex);
UserMap::iterator it=s_s.m_userMap.find(std::make_pair(scopep,userKey)); UserMap::iterator it=s_s.m_userMap.find(std::make_pair(scopep, userKey));
if (it != s_s.m_userMap.end()) it->second = userData; if (it != s_s.m_userMap.end()) it->second = userData;
// When we support VL_THREADs, we need a lock around this insert, as it's runtime // When we support VL_THREADs, we need a lock around this insert, as it's runtime
else s_s.m_userMap.insert(it, std::make_pair(std::make_pair(scopep,userKey),userData)); else s_s.m_userMap.insert(it, std::make_pair(std::make_pair(scopep, userKey), userData));
} }
static inline void* userFind(const void* scopep, void* userKey) VL_MT_SAFE { static inline void* userFind(const void* scopep, void* userKey) VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_userMapMutex); VerilatedLockGuard lock(s_s.m_userMapMutex);
UserMap::const_iterator it=s_s.m_userMap.find(std::make_pair(scopep,userKey)); UserMap::const_iterator it=s_s.m_userMap.find(std::make_pair(scopep, userKey));
if (VL_LIKELY(it != s_s.m_userMap.end())) return it->second; if (VL_LIKELY(it != s_s.m_userMap.end())) return it->second;
else return NULL; else return NULL;
} }
private: private:
/// Symbol table destruction cleans up the entries for each scope. /// Symbol table destruction cleans up the entries for each scope.
static void userEraseScope(const VerilatedScope* scopep) VL_MT_SAFE { static void userEraseScope(const VerilatedScope* scopep) VL_MT_SAFE {
// Slow ok - called once/scope on destruction, so we simply iterate. // Slow ok - called once/scope on destruction, so we simply iterate.
VerilatedLockGuard lock(s_s.m_userMapMutex); VerilatedLockGuard lock(s_s.m_userMapMutex);
for (UserMap::iterator it=s_s.m_userMap.begin(); it!=s_s.m_userMap.end(); ) { for (UserMap::iterator it=s_s.m_userMap.begin(); it!=s_s.m_userMap.end(); ) {
if (it->first.first == scopep) { if (it->first.first == scopep) {
s_s.m_userMap.erase(it++); s_s.m_userMap.erase(it++);
} else { } else {
++it; ++it;
} }
} }
} }
static void userDump() VL_MT_SAFE { static void userDump() VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_userMapMutex); // Avoid it changing in middle of dump VerilatedLockGuard lock(s_s.m_userMapMutex); // Avoid it changing in middle of dump
bool first = true; bool first = true;
for (UserMap::const_iterator it=s_s.m_userMap.begin(); it!=s_s.m_userMap.end(); ++it) { for (UserMap::const_iterator it=s_s.m_userMap.begin(); it!=s_s.m_userMap.end(); ++it) {
if (first) { VL_PRINTF_MT(" userDump:\n"); first=false; } if (first) { VL_PRINTF_MT(" userDump:\n"); first=false; }
VL_PRINTF_MT(" DPI_USER_DATA scope %p key %p: %p\n", VL_PRINTF_MT(" DPI_USER_DATA scope %p key %p: %p\n",
it->first.first, it->first.second, it->second); it->first.first, it->first.second, it->second);
} }
} }
public: // But only for verilated*.cpp public: // But only for verilated*.cpp
// METHODS - scope name // METHODS - scope name
static void scopeInsert(const VerilatedScope* scopep) VL_MT_SAFE { static void scopeInsert(const VerilatedScope* scopep) VL_MT_SAFE {
// Slow ok - called once/scope at construction // Slow ok - called once/scope at construction
VerilatedLockGuard lock(s_s.m_nameMutex); VerilatedLockGuard lock(s_s.m_nameMutex);
VerilatedScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name()); VerilatedScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name());
if (it == s_s.m_nameMap.end()) { if (it == s_s.m_nameMap.end()) {
s_s.m_nameMap.insert(it, std::make_pair(scopep->name(),scopep)); s_s.m_nameMap.insert(it, std::make_pair(scopep->name(), scopep));
} }
} }
static inline const VerilatedScope* scopeFind(const char* namep) VL_MT_SAFE { static inline const VerilatedScope* scopeFind(const char* namep) VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_nameMutex); // If too slow, can assume this is only VL_MT_SAFE_POSINIT VerilatedLockGuard lock(s_s.m_nameMutex);
VerilatedScopeNameMap::const_iterator it=s_s.m_nameMap.find(namep); // If too slow, can assume this is only VL_MT_SAFE_POSINIT
if (VL_LIKELY(it != s_s.m_nameMap.end())) return it->second; VerilatedScopeNameMap::const_iterator it=s_s.m_nameMap.find(namep);
else return NULL; if (VL_LIKELY(it != s_s.m_nameMap.end())) return it->second;
else return NULL;
} }
static void scopeErase(const VerilatedScope* scopep) VL_MT_SAFE { static void scopeErase(const VerilatedScope* scopep) VL_MT_SAFE {
// Slow ok - called once/scope at destruction // Slow ok - called once/scope at destruction
VerilatedLockGuard lock(s_s.m_nameMutex); VerilatedLockGuard lock(s_s.m_nameMutex);
userEraseScope(scopep); userEraseScope(scopep);
VerilatedScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name()); VerilatedScopeNameMap::iterator it=s_s.m_nameMap.find(scopep->name());
if (it != s_s.m_nameMap.end()) s_s.m_nameMap.erase(it); if (it != s_s.m_nameMap.end()) s_s.m_nameMap.erase(it);
} }
static void scopesDump() VL_MT_SAFE { static void scopesDump() VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_nameMutex); VerilatedLockGuard lock(s_s.m_nameMutex);
VL_PRINTF_MT(" scopesDump:\n"); VL_PRINTF_MT(" scopesDump:\n");
for (VerilatedScopeNameMap::const_iterator it=s_s.m_nameMap.begin(); it!=s_s.m_nameMap.end(); ++it) { for (VerilatedScopeNameMap::const_iterator it=s_s.m_nameMap.begin();
const VerilatedScope* scopep = it->second; it!=s_s.m_nameMap.end(); ++it) {
scopep->scopeDump(); const VerilatedScope* scopep = it->second;
} scopep->scopeDump();
VL_PRINTF_MT("\n"); }
VL_PRINTF_MT("\n");
} }
static const VerilatedScopeNameMap* scopeNameMap() VL_MT_SAFE_POSTINIT { static const VerilatedScopeNameMap* scopeNameMap() VL_MT_SAFE_POSTINIT {
// Thread save only assuming this is called only after model construction completed // Thread save only assuming this is called only after model construction completed
return &s_s.m_nameMap; return &s_s.m_nameMap;
} }
@ -329,40 +331,42 @@ public: // But only for verilated*.cpp
// Rather than a 2D map, the integer scheme saves 500ish ns on a likely // Rather than a 2D map, the integer scheme saves 500ish ns on a likely
// miss at the cost of a multiply, and all lookups move to slowpath. // miss at the cost of a multiply, and all lookups move to slowpath.
static int exportInsert(const char* namep) VL_MT_SAFE { static int exportInsert(const char* namep) VL_MT_SAFE {
// Slow ok - called once/function at creation // Slow ok - called once/function at creation
VerilatedLockGuard lock(s_s.m_exportMutex); VerilatedLockGuard lock(s_s.m_exportMutex);
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()) { if (it == s_s.m_exportMap.end()) {
s_s.m_exportMap.insert(it, std::make_pair(namep, s_s.m_exportNext++)); s_s.m_exportMap.insert(it, std::make_pair(namep, s_s.m_exportNext++));
return s_s.m_exportNext++; return s_s.m_exportNext++;
} else { } else {
return it->second; return it->second;
} }
} }
static int exportFind(const char* namep) VL_MT_SAFE { static int exportFind(const char* namep) VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_exportMutex); VerilatedLockGuard lock(s_s.m_exportMutex);
ExportNameMap::const_iterator it=s_s.m_exportMap.find(namep); ExportNameMap::const_iterator it=s_s.m_exportMap.find(namep);
if (VL_LIKELY(it != s_s.m_exportMap.end())) return it->second; if (VL_LIKELY(it != s_s.m_exportMap.end())) return it->second;
std::string msg = (std::string("%Error: Testbench C called ")+namep std::string msg = (std::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_MT("unknown",0,"", msg.c_str()); VL_FATAL_MT("unknown", 0, "", msg.c_str());
return -1; return -1;
} }
static const char* exportName(int funcnum) VL_MT_SAFE { static const char* exportName(int funcnum) VL_MT_SAFE {
// Slowpath; find name for given export; errors only so no map to reverse-map it // Slowpath; find name for given export; errors only so no map to reverse-map it
VerilatedLockGuard lock(s_s.m_exportMutex); VerilatedLockGuard lock(s_s.m_exportMutex);
for (ExportNameMap::const_iterator it=s_s.m_exportMap.begin(); it!=s_s.m_exportMap.end(); ++it) { for (ExportNameMap::const_iterator it=s_s.m_exportMap.begin();
if (it->second == funcnum) return it->first; it!=s_s.m_exportMap.end(); ++it) {
} if (it->second == funcnum) return it->first;
return "*UNKNOWN*"; }
return "*UNKNOWN*";
} }
static void exportsDump() VL_MT_SAFE { static void exportsDump() VL_MT_SAFE {
VerilatedLockGuard lock(s_s.m_exportMutex); VerilatedLockGuard lock(s_s.m_exportMutex);
bool first = true; bool first = true;
for (ExportNameMap::const_iterator it=s_s.m_exportMap.begin(); it!=s_s.m_exportMap.end(); ++it) { for (ExportNameMap::const_iterator it=s_s.m_exportMap.begin();
if (first) { VL_PRINTF_MT(" exportDump:\n"); first=false; } it!=s_s.m_exportMap.end(); ++it) {
VL_PRINTF_MT(" DPI_EXPORT_NAME %05d: %s\n", it->second, it->first); if (first) { VL_PRINTF_MT(" exportDump:\n"); first=false; }
} VL_PRINTF_MT(" DPI_EXPORT_NAME %05d: %s\n", it->second, it->first);
}
} }
// We don't free up m_exportMap until the end, because we can't be sure // We don't free up m_exportMap until the end, because we can't be sure
// what other models are using the assigned funcnum's. // what other models are using the assigned funcnum's.
@ -370,32 +374,32 @@ public: // But only for verilated*.cpp
public: // But only for verilated*.cpp public: // But only for verilated*.cpp
// METHODS - file IO // METHODS - file IO
static IData fdNew(FILE* fp) VL_MT_SAFE { static IData fdNew(FILE* fp) VL_MT_SAFE {
if (VL_UNLIKELY(!fp)) return 0; if (VL_UNLIKELY(!fp)) return 0;
// Bit 31 indicates it's a descriptor not a MCD // Bit 31 indicates it's a descriptor not a MCD
VerilatedLockGuard lock(s_s.m_fdMutex); VerilatedLockGuard lock(s_s.m_fdMutex);
if (s_s.m_fdFree.empty()) { if (s_s.m_fdFree.empty()) {
// Need to create more space in m_fdps and m_fdFree // Need to create more space in m_fdps and m_fdFree
size_t start = s_s.m_fdps.size(); size_t start = s_s.m_fdps.size();
s_s.m_fdps.resize(start*2); s_s.m_fdps.resize(start*2);
for (size_t i=start; i<start*2; ++i) s_s.m_fdFree.push_back(static_cast<IData>(i)); for (size_t i=start; i<start*2; ++i) s_s.m_fdFree.push_back(static_cast<IData>(i));
} }
IData idx = s_s.m_fdFree.back(); s_s.m_fdFree.pop_back(); IData idx = s_s.m_fdFree.back(); s_s.m_fdFree.pop_back();
s_s.m_fdps[idx] = fp; s_s.m_fdps[idx] = fp;
return (idx | (1UL<<31)); // bit 31 indicates not MCD return (idx | (1UL<<31)); // bit 31 indicates not MCD
} }
static void fdDelete(IData fdi) VL_MT_SAFE { static void fdDelete(IData fdi) VL_MT_SAFE {
IData idx = VL_MASK_I(31) & fdi; IData idx = VL_MASK_I(31) & fdi;
VerilatedLockGuard lock(s_s.m_fdMutex); VerilatedLockGuard lock(s_s.m_fdMutex);
if (VL_UNLIKELY(!(fdi & (1ULL<<31)) || idx >= s_s.m_fdps.size())) return; if (VL_UNLIKELY(!(fdi & (1ULL<<31)) || idx >= s_s.m_fdps.size())) return;
if (VL_UNLIKELY(!s_s.m_fdps[idx])) return; // Already free if (VL_UNLIKELY(!s_s.m_fdps[idx])) return; // Already free
s_s.m_fdps[idx] = NULL; s_s.m_fdps[idx] = NULL;
s_s.m_fdFree.push_back(idx); s_s.m_fdFree.push_back(idx);
} }
static inline FILE* fdToFp(IData fdi) VL_MT_SAFE { static inline FILE* fdToFp(IData fdi) VL_MT_SAFE {
IData idx = VL_MASK_I(31) & fdi; IData idx = VL_MASK_I(31) & fdi;
VerilatedLockGuard lock(s_s.m_fdMutex); // This might get slow, if it does we can cache it VerilatedLockGuard lock(s_s.m_fdMutex); // This might get slow, if it does we can cache it
if (VL_UNLIKELY(!(fdi & (1ULL<<31)) || idx >= s_s.m_fdps.size())) return NULL; if (VL_UNLIKELY(!(fdi & (1ULL<<31)) || idx >= s_s.m_fdps.size())) return NULL;
return s_s.m_fdps[idx]; return s_s.m_fdps[idx];
} }
}; };

File diff suppressed because it is too large Load Diff