From 79f5c7fbda5e87cb78c0ac9a635afbb69eaaa6ee Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Sat, 16 Dec 2017 10:52:43 -0500 Subject: [PATCH] Internals: Split verilated_syms.h and rename some methods. No functional change intended. --- include/verilated.cpp | 10 ++-- include/verilated_sym_props.h | 87 ++++++++++++++++++++++++++++++++++ include/verilated_syms.h | 69 +++++---------------------- include/verilated_vpi.cpp | 50 +++++++++---------- test_regress/t/t_scope_map.cpp | 6 +-- 5 files changed, 131 insertions(+), 91 deletions(-) create mode 100644 include/verilated_sym_props.h diff --git a/include/verilated.cpp b/include/verilated.cpp index 9658a91d8..bbebfa27d 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -1642,7 +1642,7 @@ vluint32_t VerilatedVar::entSize() const { case VLVT_UINT16: size=sizeof(SData); break; case VLVT_UINT32: size=sizeof(IData); break; case VLVT_UINT64: size=sizeof(QData); break; - case VLVT_WDATA: size=VL_WORDS_I(range().elements())*sizeof(IData); break; + case VLVT_WDATA: size=VL_WORDS_I(packed().elements())*sizeof(IData); break; default: size=0; break; } return size; @@ -1715,11 +1715,11 @@ void VerilatedScope::varInsert(int finalize, const char* namep, void* datap, int msb = va_arg(ap,int); int lsb = va_arg(ap,int); if (i==0) { - var.m_range.m_left = msb; - var.m_range.m_right = lsb; + var.m_packed.m_left = msb; + var.m_packed.m_right = lsb; } else if (i==1) { - var.m_array.m_left = msb; - var.m_array.m_right = lsb; + var.m_unpacked[0].m_left = msb; + var.m_unpacked[0].m_right = lsb; } else { // We could have a linked list of ranges, but really this whole thing needs // to be generalized to support structs and unions, etc. diff --git a/include/verilated_sym_props.h b/include/verilated_sym_props.h new file mode 100644 index 000000000..52fbcd70e --- /dev/null +++ b/include/verilated_sym_props.h @@ -0,0 +1,87 @@ +// -*- mode: C++; c-file-style: "cc-mode" -*- +//************************************************************************* +// +// Copyright 2003-2017 by Wilson Snyder. This program is free software; you can +// redistribute it and/or modify it under the terms of either the GNU +// Lesser General Public License Version 3 or the Perl Artistic License. +// Version 2.0. +// +// Verilator is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +//************************************************************************* +/// +/// \file +/// \brief Verilator: Include to provide information about symbol inspection +/// +/// This file is for inclusion by internal files that need to inspect +/// specific symbols. +/// +/// User routines wanting to inspect the symbol table should use +/// verilated_syms.h instead. +/// +/// These classes are thread safe, and read only. +/// +/// Code available from: http://www.veripool.org/verilator +/// +//************************************************************************* + + +#ifndef _VERILATED_SYM_PROPS_H_ +#define _VERILATED_SYM_PROPS_H_ 1 ///< Header Guard + +//=========================================================================== +/// Verilator range +/// Thread safety: Assume is constructed only with model, then any number of readers + +// See also V3Ast::VNumRange +class VerilatedRange { + int m_left; + int m_right; +protected: + friend class VerilatedVar; + friend class VerilatedScope; + VerilatedRange() : m_left(0), m_right(0) {} + void init(int left, int right) { m_left=left; m_right=right; } +public: + ~VerilatedRange() {} + int left() const { return m_left; } + int right() const { return m_right; } + int elements() const { return (VL_LIKELY(m_left>=m_right)?(m_left-m_right+1):(m_right-m_left+1)); } +}; + +//=========================================================================== +/// Verilator variable +/// Thread safety: Assume is constructed only with model, then any number of readers + +class VerilatedVar { + void* m_datap; // Location of data + VerilatedVarType m_vltype; // Data type + VerilatedVarFlags m_vlflags; // Direction + VerilatedRange m_packed; // Packed array range + VerilatedRange m_unpacked[1]; // Unpacked array range + int m_dims; // Dimensions + const char* m_namep; // Name - slowpath +protected: + friend class VerilatedScope; + VerilatedVar(const char* namep, void* datap, + VerilatedVarType vltype, VerilatedVarFlags vlflags, int dims) + : m_datap(datap), m_vltype(vltype), m_vlflags(vlflags), m_dims(dims), m_namep(namep) {} +public: + ~VerilatedVar() {} + void* datap() const { return m_datap; } + VerilatedVarType vltype() const { return m_vltype; } + VerilatedVarFlags vldir() const { return static_cast(static_cast(m_vlflags) & VLVF_MASK_DIR); } + vluint32_t entSize() const; + bool isPublicRW() const { return ((m_vlflags & VLVF_PUB_RW) != 0); } + const VerilatedRange& packed() const { return m_packed; } + const VerilatedRange& unpacked() const { return m_unpacked[0]; } + const VerilatedRange& range() const { return packed(); } // Deprecated + const VerilatedRange& array() const { return unpacked(); } // Deprecated + const char* name() const { return m_namep; } + int dims() const { return m_dims; } +}; + +#endif // Guard diff --git a/include/verilated_syms.h b/include/verilated_syms.h index c24ba7cd2..c53f70a72 100644 --- a/include/verilated_syms.h +++ b/include/verilated_syms.h @@ -16,12 +16,12 @@ /// \file /// \brief Verilator: Include to allow symbol inspection /// -/// This file is for inclusion by files that need to inspect -/// the symbol table. It is not included in verilated.h -/// as it requires some heavyweight C++ classes. +/// This file is for inclusion by files that need to inspect the symbol +/// table. It is not included in verilated.h (instead see +/// verilated_sym_props.h) as it requires some heavyweight C++ classes. /// -/// These classes are thread safe on read only. It is constructed -/// only when a model is built (from the main thread). +/// These classes are thread safe and read only. It is constructed only +/// when a model is built (from the main thread). /// /// Code available from: http://www.veripool.org/verilator /// @@ -31,70 +31,22 @@ #ifndef _VERILATED_SYMS_H_ #define _VERILATED_SYMS_H_ 1 ///< Header Guard +#include "verilated_sym_props.h" + #include "verilated_heavy.h" - #include -//=========================================================================== -/// Verilator range -/// Thread safety: Assume is constructed only with model, then any number of readers - -// See also V3Ast::VNumRange -class VerilatedRange { - int m_left; - int m_right; -protected: - friend class VerilatedVar; - friend class VerilatedScope; - VerilatedRange() : m_left(0), m_right(0) {} - void sets(int left, int right) { m_left=left; m_right=right; } -public: - ~VerilatedRange() {} - int left() const { return m_left; } - int right() const { return m_right; } - int elements() const { return (VL_LIKELY(m_left>=m_right)?(m_left-m_right+1):(m_right-m_left+1)); } -}; - -//=========================================================================== -/// Verilator variable -/// Thread safety: Assume is constructed only with model, then any number of readers - -class VerilatedVar { - void* m_datap; // Location of data - VerilatedVarType m_vltype; // Data type - VerilatedVarFlags m_vlflags; // Direction - VerilatedRange m_range; // First range - VerilatedRange m_array; // Array - int m_dims; // Dimensions - const char* m_namep; // Name - slowpath -protected: - friend class VerilatedScope; - VerilatedVar(const char* namep, void* datap, - VerilatedVarType vltype, VerilatedVarFlags vlflags, int dims) - : m_datap(datap), m_vltype(vltype), m_vlflags(vlflags), m_dims(dims), m_namep(namep) {} -public: - ~VerilatedVar() {} - void* datap() const { return m_datap; } - VerilatedVarType vltype() const { return m_vltype; } - VerilatedVarFlags vldir() const { return static_cast(static_cast(m_vlflags) & VLVF_MASK_DIR); } - vluint32_t entSize() const; - bool isPublicRW() const { return ((m_vlflags & VLVF_PUB_RW) != 0); } - const VerilatedRange& range() const { return m_range; } - const VerilatedRange& array() const { return m_array; } - const char* name() const { return m_namep; } - int dims() const { return m_dims; } -}; - //====================================================================== /// Types +/// Class to sort maps keyed by const char*'s struct VerilatedCStrCmp { - /// Ordering maps keyed by const char*'s bool operator() (const char *a, const char *b) const { - return std::strcmp(a, b) < 0; + return std::strcmp(a, b) < 0; } }; +/// Map of sorted scope names to find associated scope class class VerilatedScopeNameMap : public std::map { public: @@ -102,6 +54,7 @@ public: ~VerilatedScopeNameMap() {} }; +/// Map of sorted variable names to find associated variable class class VerilatedVarNameMap : public std::map { public: diff --git a/include/verilated_vpi.cpp b/include/verilated_vpi.cpp index 5d6458465..53ab91411 100644 --- a/include/verilated_vpi.cpp +++ b/include/verilated_vpi.cpp @@ -185,13 +185,13 @@ protected: vlsint32_t m_index; const VerilatedRange& get_range() const { // Determine number of dimensions and return outermost - return (m_varp->dims()>1) ? m_varp->array() : m_varp->range(); + return (m_varp->dims()>1) ? m_varp->unpacked() : m_varp->packed(); } public: VerilatedVpioVar(const VerilatedVar* varp, const VerilatedScope* scopep) : m_varp(varp), m_scopep(scopep), m_index(0) { m_prevDatap = NULL; - m_mask.u32 = VL_MASK_I(varp->range().elements()); + m_mask.u32 = VL_MASK_I(varp->packed().elements()); m_entSize = varp->entSize(); m_varDatap = varp->datap(); } @@ -238,8 +238,8 @@ public: virtual ~VerilatedVpioMemoryWord() {} static inline VerilatedVpioMemoryWord* castp(vpiHandle h) { return dynamic_cast((VerilatedVpio*)h); } virtual vluint32_t type() const { return vpiMemoryWord; } - virtual vluint32_t size() const { return varp()->range().elements(); } - virtual const VerilatedRange* rangep() const { return &(varp()->range()); } + virtual vluint32_t size() const { return varp()->packed().elements(); } + virtual const VerilatedRange* rangep() const { return &(varp()->packed()); } virtual const char* fullname() const { static VL_THREAD_LOCAL std::string out; char num[20]; sprintf(num,"%d",m_index); @@ -281,12 +281,12 @@ class VerilatedVpioMemoryWordIter : public VerilatedVpio { bool m_done; public: VerilatedVpioMemoryWordIter(const vpiHandle handle, const VerilatedVar* varp) - : m_handle(handle), m_varp(varp), m_iteration(varp->array().right()), m_direction(VL_LIKELY(varp->array().left()>varp->array().right())?1:-1), m_done(false) { } + : m_handle(handle), m_varp(varp), m_iteration(varp->unpacked().right()), m_direction(VL_LIKELY(varp->unpacked().left()>varp->unpacked().right())?1:-1), m_done(false) { } virtual ~VerilatedVpioMemoryWordIter() {} static inline VerilatedVpioMemoryWordIter* castp(vpiHandle h) { return dynamic_cast((VerilatedVpio*)h); } virtual vluint32_t type() const { return vpiIterator; } void iterationInc() { - if (!(m_done = (m_iteration == m_varp->array().left()))) m_iteration+=m_direction; + if (!(m_done = (m_iteration == m_varp->unpacked().left()))) m_iteration+=m_direction; } virtual vpiHandle dovpi_scan() { vpiHandle result; @@ -1015,15 +1015,15 @@ vpiHandle vpi_handle_by_index(vpiHandle object, PLI_INT32 indx) { _VL_VPI_ERROR_RESET(); // reset vpi error status if (VL_LIKELY(varop)) { if (varop->varp()->dims()<2) return 0; - if (VL_LIKELY(varop->varp()->array().left() >= varop->varp()->array().right())) { - if (VL_UNLIKELY(indx > varop->varp()->array().left() || indx < varop->varp()->array().right())) return 0; + if (VL_LIKELY(varop->varp()->unpacked().left() >= varop->varp()->unpacked().right())) { + if (VL_UNLIKELY(indx > varop->varp()->unpacked().left() || indx < varop->varp()->unpacked().right())) return 0; return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx, - indx - varop->varp()->array().right())) + indx - varop->varp()->unpacked().right())) ->castVpiHandle(); } else { - if (VL_UNLIKELY(indx < varop->varp()->array().left() || indx > varop->varp()->array().right())) return 0; + if (VL_UNLIKELY(indx < varop->varp()->unpacked().left() || indx > varop->varp()->unpacked().right())) return 0; return (new VerilatedVpioMemoryWord(varop->varp(), varop->scopep(), indx, - indx - varop->varp()->array().left())) + indx - varop->varp()->unpacked().left())) ->castVpiHandle(); } } else { @@ -1235,7 +1235,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { out[0].bval = 0; return; case VLVT_WDATA: { - int words = VL_WORDS_I(vop->varp()->range().elements()); + int words = VL_WORDS_I(vop->varp()->packed().elements()); if (VL_UNLIKELY(words >= VL_MULS_MAX_WORDS)) { VL_FATAL_MT(__FILE__,__LINE__,"", "vpi_get_value with more than VL_MULS_MAX_WORDS; increase and recompile"); } @@ -1268,7 +1268,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int bits = vop->varp()->range().elements(); + int bits = vop->varp()->packed().elements(); CData* datap = (reinterpret_cast(vop->varDatap())); int i; if (bits > outStrSz) { @@ -1297,8 +1297,8 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int chars = (vop->varp()->range().elements()+2)/3; - int bytes = VL_BYTES_I(vop->varp()->range().elements()); + int chars = (vop->varp()->packed().elements()+2)/3; + int bytes = VL_BYTES_I(vop->varp()->packed().elements()); CData* datap = (reinterpret_cast(vop->varDatap())); int i; if (chars > outStrSz) { @@ -1320,7 +1320,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { if (i==(chars-1)) { // most signifcant char, mask off non existant bits when vector // size is not a multiple of 3 - unsigned int rem = vop->varp()->range().elements() % 3; + unsigned int rem = vop->varp()->packed().elements() % 3; if (rem) { // generate bit mask & zero non existant bits val &= (1<varp()->range().elements()+3)>>2; + int chars = (vop->varp()->packed().elements()+3)>>2; CData* datap = (reinterpret_cast(vop->varDatap())); int i; if (chars > outStrSz) { @@ -1377,7 +1377,7 @@ void vpi_get_value(vpiHandle object, p_vpi_value value_p) { if (i==(chars-1)) { // most signifcant char, mask off non existant bits when vector // size is not a multiple of 4 - unsigned int rem = vop->varp()->range().elements() & 3; + unsigned int rem = vop->varp()->packed().elements() & 3; if (rem) { // generate bit mask & zero non existant bits val &= (1<varp()->range().elements()); + int bytes = VL_BYTES_I(vop->varp()->packed().elements()); CData* datap = (reinterpret_cast(vop->varDatap())); int i; if (bytes > outStrSz) { @@ -1494,7 +1494,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, *(reinterpret_cast(vop->varDatap())) = value_p->value.vector[0].aval & vop->mask(); return object; case VLVT_WDATA: { - int words = VL_WORDS_I(vop->varp()->range().elements()); + int words = VL_WORDS_I(vop->varp()->packed().elements()); WDataOutP datap = (reinterpret_cast(vop->varDatap())); for (int i=0; ivalue.vector[i].aval; @@ -1523,7 +1523,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int bits = vop->varp()->range().elements(); + int bits = vop->varp()->packed().elements(); int len = strlen(value_p->value.str); CData* datap = (reinterpret_cast(vop->varDatap())); for (int i=0; ivarp()->range().elements()+2)/3; - int bytes = VL_BYTES_I(vop->varp()->range().elements()); + int chars = (vop->varp()->packed().elements()+2)/3; + int bytes = VL_BYTES_I(vop->varp()->packed().elements()); int len = strlen(value_p->value.str); CData* datap = (reinterpret_cast(vop->varDatap())); div_t idx; @@ -1637,7 +1637,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int chars = (vop->varp()->range().elements()+3)>>2; + int chars = (vop->varp()->packed().elements()+3)>>2; CData* datap = (reinterpret_cast(vop->varDatap())); char* val = value_p->value.str; // skip hex ident if one is detected at the start of the string @@ -1684,7 +1684,7 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, case VLVT_UINT32: case VLVT_UINT64: case VLVT_WDATA: { - int bytes = VL_BYTES_I(vop->varp()->range().elements()); + int bytes = VL_BYTES_I(vop->varp()->packed().elements()); int len = strlen(value_p->value.str); CData* datap = (reinterpret_cast(vop->varDatap())); for (int i=0; ibegin(); varIt != varNameMap->end(); ++varIt) { VerilatedVar * var = &varIt->second; - int varLeft = var->range().left(); - int varRight = var->range().right(); + int varLeft = var->packed().left(); + int varRight = var->packed().right(); #ifdef TEST_VERBOSE VL_PRINTF("\tVar = %s\n", varIt->first); @@ -124,7 +124,7 @@ int main(int argc, char **argv, char **env) { for (VerilatedVarNameMap::iterator varIt = varNameMap->begin(); varIt != varNameMap->end(); ++varIt) { VerilatedVar * var = &varIt->second; - int varLeft = var->range().left(); + int varLeft = var->packed().left(); int varBits = varLeft + 1; vluint8_t * varData = reinterpret_cast(var->datap());