mirror of
https://github.com/verilator/verilator.git
synced 2026-10-06 01:54:01 +02:00
Merge branch 'master' into develop-v5
This commit is contained in:
+36
-18
@@ -148,6 +148,7 @@ class EmitCImp final : EmitCFunc {
|
||||
const std::set<string>* m_requiredHeadersp; // Header files required by output file
|
||||
std::string m_subFileName; // substring added to output filenames
|
||||
V3UniqueNames m_uniqueNames; // For generating unique file names
|
||||
std::deque<AstCFile*>& m_cfilesr; // cfiles generated by this emit
|
||||
|
||||
// METHODS
|
||||
void openNextOutputFile(const std::set<string>& headers, const string& subFileName) {
|
||||
@@ -160,7 +161,8 @@ class EmitCImp final : EmitCFunc {
|
||||
// Unfortunately we have some lint checks here, so we can't just skip processing.
|
||||
// We should move them to a different stage.
|
||||
const string filename = VL_DEV_NULL;
|
||||
newCFile(filename, /* slow: */ m_slow, /* source: */ true);
|
||||
m_cfilesr.push_back(
|
||||
newCFile(filename, /* slow: */ m_slow, /* source: */ true, /* add */ false));
|
||||
m_ofp = new V3OutCFile(filename);
|
||||
} else {
|
||||
string filename = v3Global.opt.makeDir() + "/" + prefixNameProtect(m_fileModp);
|
||||
@@ -170,7 +172,8 @@ class EmitCImp final : EmitCFunc {
|
||||
}
|
||||
if (m_slow) filename += "__Slow";
|
||||
filename += ".cpp";
|
||||
newCFile(filename, /* slow: */ m_slow, /* source: */ true);
|
||||
m_cfilesr.push_back(
|
||||
newCFile(filename, /* slow: */ m_slow, /* source: */ true, /* add */ false));
|
||||
m_ofp = v3Global.opt.systemC() ? new V3OutScFile(filename) : new V3OutCFile(filename);
|
||||
}
|
||||
|
||||
@@ -527,9 +530,10 @@ class EmitCImp final : EmitCFunc {
|
||||
EmitCFunc::visit(nodep);
|
||||
}
|
||||
|
||||
explicit EmitCImp(const AstNodeModule* modp, bool slow)
|
||||
explicit EmitCImp(const AstNodeModule* modp, bool slow, std::deque<AstCFile*>& cfilesr)
|
||||
: m_fileModp{modp}
|
||||
, m_slow{slow} {
|
||||
, m_slow{slow}
|
||||
, m_cfilesr{cfilesr} {
|
||||
UINFO(5, " Emitting implementation of " << prefixNameProtect(modp) << endl);
|
||||
|
||||
m_modp = modp;
|
||||
@@ -548,7 +552,9 @@ class EmitCImp final : EmitCFunc {
|
||||
virtual ~EmitCImp() override = default;
|
||||
|
||||
public:
|
||||
static void main(const AstNodeModule* modp, bool slow) { EmitCImp{modp, slow}; }
|
||||
static void main(const AstNodeModule* modp, bool slow, std::deque<AstCFile*>& cfilesr) {
|
||||
EmitCImp{modp, slow, cfilesr};
|
||||
}
|
||||
};
|
||||
|
||||
//######################################################################
|
||||
@@ -556,14 +562,14 @@ public:
|
||||
|
||||
class EmitCTrace final : EmitCFunc {
|
||||
// NODE STATE/TYPES
|
||||
// Cleared on netlist
|
||||
// AstNode::user1() -> int. Enum number
|
||||
const VNUser1InUse m_inuser1;
|
||||
// None allowed to support threaded emitting
|
||||
|
||||
// MEMBERS
|
||||
const bool m_slow; // Making slow file
|
||||
int m_enumNum = 0; // Enumeration number (whole netlist)
|
||||
V3UniqueNames m_uniqueNames; // For generating unique file names
|
||||
std::unordered_map<AstNode*, int> m_enumNumMap; // EnumDType to enumeration number
|
||||
std::deque<AstCFile*>& m_cfilesr; // cfiles generated by this emit
|
||||
|
||||
// METHODS
|
||||
void openNextOutputFile() {
|
||||
@@ -578,8 +584,9 @@ class EmitCTrace final : EmitCFunc {
|
||||
if (m_slow) filename += "__Slow";
|
||||
filename += ".cpp";
|
||||
|
||||
AstCFile* const cfilep = newCFile(filename, m_slow, true /*source*/);
|
||||
AstCFile* const cfilep = newCFile(filename, m_slow, true /*source*/, false /*add*/);
|
||||
cfilep->support(true);
|
||||
m_cfilesr.push_back(cfilep);
|
||||
|
||||
if (optSystemC()) {
|
||||
m_ofp = new V3OutScFile(filename);
|
||||
@@ -715,10 +722,10 @@ class EmitCTrace final : EmitCFunc {
|
||||
// Skip over refs-to-refs, but stop before final ref so can get data type name
|
||||
// Alternatively back in V3Width we could push enum names from upper typedefs
|
||||
if (AstEnumDType* const enump = VN_CAST(nodep->skipRefToEnump(), EnumDType)) {
|
||||
int enumNum = enump->user1();
|
||||
int enumNum = m_enumNumMap[enump];
|
||||
if (!enumNum) {
|
||||
enumNum = ++m_enumNum;
|
||||
enump->user1(enumNum);
|
||||
m_enumNumMap[enump] = enumNum;
|
||||
int nvals = 0;
|
||||
puts("{\n");
|
||||
puts("const char* " + protect("__VenumItemNames") + "[]\n");
|
||||
@@ -868,8 +875,9 @@ class EmitCTrace final : EmitCFunc {
|
||||
}
|
||||
}
|
||||
|
||||
explicit EmitCTrace(AstNodeModule* modp, bool slow)
|
||||
: m_slow{slow} {
|
||||
explicit EmitCTrace(AstNodeModule* modp, bool slow, std::deque<AstCFile*>& cfilesr)
|
||||
: m_slow{slow}
|
||||
, m_cfilesr{cfilesr} {
|
||||
m_modp = modp;
|
||||
// Open output file
|
||||
openNextOutputFile();
|
||||
@@ -883,7 +891,9 @@ class EmitCTrace final : EmitCFunc {
|
||||
virtual ~EmitCTrace() override = default;
|
||||
|
||||
public:
|
||||
static void main(AstNodeModule* modp, bool slow) { EmitCTrace{modp, slow}; }
|
||||
static void main(AstNodeModule* modp, bool slow, std::deque<AstCFile*>& cfilesr) {
|
||||
EmitCTrace{modp, slow, cfilesr};
|
||||
}
|
||||
};
|
||||
|
||||
//######################################################################
|
||||
@@ -893,19 +903,27 @@ void V3EmitC::emitcImp() {
|
||||
UINFO(2, __FUNCTION__ << ": " << endl);
|
||||
// Make parent module pointers available.
|
||||
const EmitCParentModule emitCParentModule;
|
||||
std::list<std::deque<AstCFile*>> cfiles;
|
||||
|
||||
// Process each module in turn
|
||||
for (const AstNode* nodep = v3Global.rootp()->modulesp(); nodep; nodep = nodep->nextp()) {
|
||||
if (VN_IS(nodep, Class)) continue; // Imped with ClassPackage
|
||||
const AstNodeModule* const modp = VN_AS(nodep, NodeModule);
|
||||
EmitCImp::main(modp, /* slow: */ true);
|
||||
EmitCImp::main(modp, /* slow: */ false);
|
||||
cfiles.emplace_back();
|
||||
EmitCImp::main(modp, /* slow: */ true, cfiles.back());
|
||||
cfiles.emplace_back();
|
||||
EmitCImp::main(modp, /* slow: */ false, cfiles.back());
|
||||
}
|
||||
|
||||
// Emit trace routines (currently they can only exist in the top module)
|
||||
if (v3Global.opt.trace() && !v3Global.opt.lintOnly()) {
|
||||
EmitCTrace::main(v3Global.rootp()->topModulep(), /* slow: */ true);
|
||||
EmitCTrace::main(v3Global.rootp()->topModulep(), /* slow: */ false);
|
||||
cfiles.emplace_back();
|
||||
EmitCTrace::main(v3Global.rootp()->topModulep(), /* slow: */ true, cfiles.back());
|
||||
cfiles.emplace_back();
|
||||
EmitCTrace::main(v3Global.rootp()->topModulep(), /* slow: */ false, cfiles.back());
|
||||
}
|
||||
for (const auto& collr : cfiles) {
|
||||
for (const auto cfilep : collr) v3Global.rootp()->addFilesp(cfilep);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user