Standardize some error messages.
This commit is contained in:
parent
464e19caaa
commit
7521c2c644
|
|
@ -295,7 +295,7 @@ private:
|
||||||
popp->makeStmt()});
|
popp->makeStmt()});
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
nodep->v3fatal("Invalid direction");
|
nodep->v3fatalSrc("Invalid direction");
|
||||||
}
|
}
|
||||||
VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep);
|
VL_DO_DANGLING(pushDeletep(nodep->unlinkFrBack()), nodep);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1340,7 +1340,7 @@ void AstNode::dumpTreeFile(const string& filename, bool doDump) {
|
||||||
{ // Write log & close
|
{ // Write log & close
|
||||||
UINFO(2, "Dumping " << filename << endl);
|
UINFO(2, "Dumping " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> logsp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logsp{V3File::new_ofstream(filename)};
|
||||||
if (logsp->fail()) v3fatal("Can't write " << filename);
|
if (logsp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
*logsp << "Verilator Tree Dump (format 0x3900) from <e" << std::dec << editCountLast();
|
*logsp << "Verilator Tree Dump (format 0x3900) from <e" << std::dec << editCountLast();
|
||||||
*logsp << "> to <e" << std::dec << editCountGbl() << ">\n";
|
*logsp << "> to <e" << std::dec << editCountGbl() << ">\n";
|
||||||
if (editCountGbl() == editCountLast() && ::dumpTreeLevel() < 9) {
|
if (editCountGbl() == editCountLast() && ::dumpTreeLevel() < 9) {
|
||||||
|
|
@ -1385,7 +1385,7 @@ void AstNode::dumpTreeJsonFile(const string& filename, bool doDump) {
|
||||||
if (!doDump) return;
|
if (!doDump) return;
|
||||||
UINFO(2, "Dumping " << filename << endl);
|
UINFO(2, "Dumping " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)};
|
||||||
if (treejsonp->fail()) v3fatal("Can't write " << filename);
|
if (treejsonp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
dumpTreeJson(*treejsonp);
|
dumpTreeJson(*treejsonp);
|
||||||
*treejsonp << '\n';
|
*treejsonp << '\n';
|
||||||
}
|
}
|
||||||
|
|
@ -1394,7 +1394,7 @@ void AstNode::dumpJsonMetaFileGdb(const char* filename) { dumpJsonMetaFile(filen
|
||||||
void AstNode::dumpJsonMetaFile(const string& filename) {
|
void AstNode::dumpJsonMetaFile(const string& filename) {
|
||||||
UINFO(2, "Dumping " << filename << endl);
|
UINFO(2, "Dumping " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> treejsonp{V3File::new_ofstream(filename)};
|
||||||
if (treejsonp->fail()) v3fatalStatic("Can't write " << filename);
|
if (treejsonp->fail()) v3fatalStatic("Can't write file: " << filename);
|
||||||
*treejsonp << '{';
|
*treejsonp << '{';
|
||||||
FileLine::fileNameNumMapDumpJson(*treejsonp);
|
FileLine::fileNameNumMapDumpJson(*treejsonp);
|
||||||
*treejsonp << ',';
|
*treejsonp << ',';
|
||||||
|
|
@ -1408,7 +1408,7 @@ void AstNode::dumpTreeDotFile(const string& filename, bool doDump) {
|
||||||
if (doDump) {
|
if (doDump) {
|
||||||
UINFO(2, "Dumping " << filename << endl);
|
UINFO(2, "Dumping " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> treedotp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> treedotp{V3File::new_ofstream(filename)};
|
||||||
if (treedotp->fail()) v3fatal("Can't write " << filename);
|
if (treedotp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
*treedotp << "digraph vTree{\n";
|
*treedotp << "digraph vTree{\n";
|
||||||
*treedotp << "\tgraph\t[label=\"" << filename + ".dot"
|
*treedotp << "\tgraph\t[label=\"" << filename + ".dot"
|
||||||
<< "\",\n";
|
<< "\",\n";
|
||||||
|
|
|
||||||
|
|
@ -193,7 +193,7 @@ void DfgGraph::dumpDotFile(const string& filename, const string& label) const {
|
||||||
// This generates a file used by graphviz, https://www.graphviz.org
|
// This generates a file used by graphviz, https://www.graphviz.org
|
||||||
// "hardcoded" parameters:
|
// "hardcoded" parameters:
|
||||||
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(filename)};
|
||||||
if (os->fail()) v3fatal("Cannot write to file: " << filename);
|
if (os->fail()) v3fatal("Can't write file: " << filename);
|
||||||
dumpDot(*os.get(), label);
|
dumpDot(*os.get(), label);
|
||||||
os->close();
|
os->close();
|
||||||
}
|
}
|
||||||
|
|
@ -244,7 +244,7 @@ void DfgGraph::dumpDotUpstreamCone(const string& fileName, const DfgVertex& vtx,
|
||||||
const string& name) const {
|
const string& name) const {
|
||||||
// Open output file
|
// Open output file
|
||||||
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)};
|
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)};
|
||||||
if (os->fail()) v3fatal("Cannot write to file: " << fileName);
|
if (os->fail()) v3fatal("Can't write file: " << fileName);
|
||||||
|
|
||||||
// Header
|
// Header
|
||||||
*os << "digraph dfg {\n";
|
*os << "digraph dfg {\n";
|
||||||
|
|
@ -278,7 +278,7 @@ void DfgGraph::dumpDotAllVarConesPrefixed(const string& label) const {
|
||||||
const string coneName{prefix + sinkp->varp()->name()};
|
const string coneName{prefix + sinkp->varp()->name()};
|
||||||
const string fileName{v3Global.debugFilename(coneName) + ".dot"};
|
const string fileName{v3Global.debugFilename(coneName) + ".dot"};
|
||||||
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)};
|
const std::unique_ptr<std::ofstream> os{V3File::new_ofstream(fileName)};
|
||||||
if (os->fail()) v3fatal("Cannot write to file: " << fileName);
|
if (os->fail()) v3fatal("Can't write file: " << fileName);
|
||||||
|
|
||||||
// Header
|
// Header
|
||||||
*os << "digraph dfg {\n";
|
*os << "digraph dfg {\n";
|
||||||
|
|
|
||||||
|
|
@ -199,7 +199,7 @@ class DfgToAstVisitor final : DfgVisitor {
|
||||||
|
|
||||||
// VISITORS
|
// VISITORS
|
||||||
void visit(DfgVertex* vtxp) override { // LCOV_EXCL_START
|
void visit(DfgVertex* vtxp) override { // LCOV_EXCL_START
|
||||||
vtxp->v3fatal("Unhandled DfgVertex: " << vtxp->typeName());
|
vtxp->v3fatalSrc("Unhandled DfgVertex: " << vtxp->typeName());
|
||||||
} // LCOV_EXCL_STOP
|
} // LCOV_EXCL_STOP
|
||||||
|
|
||||||
void visit(DfgVarPacked* vtxp) override {
|
void visit(DfgVarPacked* vtxp) override {
|
||||||
|
|
|
||||||
|
|
@ -85,7 +85,7 @@ V3DfgOptimizationContext::~V3DfgOptimizationContext() {
|
||||||
+ "__stats_dfg_patterns__" + ident + ".txt";
|
+ "__stats_dfg_patterns__" + ident + ".txt";
|
||||||
// Open, write, close
|
// Open, write, close
|
||||||
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
||||||
if (ofp->fail()) v3fatal("Can't write " << filename);
|
if (ofp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
m_patternStats.dump(m_label, *ofp);
|
m_patternStats.dump(m_label, *ofp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ V3DupFinder::iterator V3DupFinder::findDuplicate(AstNode* nodep, V3DupFinderUser
|
||||||
void V3DupFinder::dumpFile(const string& filename, bool tree) {
|
void V3DupFinder::dumpFile(const string& filename, bool tree) {
|
||||||
UINFO(2, "Dumping " << filename << endl);
|
UINFO(2, "Dumping " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
std::unordered_map<int, int> dist;
|
std::unordered_map<int, int> dist;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -95,7 +95,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
void visit(AstInitItem* nodep) override { // LCOV_EXCL_START
|
void visit(AstInitItem* nodep) override { // LCOV_EXCL_START
|
||||||
nodep->v3fatal("Handled by AstInitArray");
|
nodep->v3fatalSrc("Handled by AstInitArray");
|
||||||
} // LCOV_EXCL_STOP
|
} // LCOV_EXCL_STOP
|
||||||
|
|
||||||
void visit(AstConst* nodep) override {
|
void visit(AstConst* nodep) override {
|
||||||
|
|
|
||||||
|
|
@ -408,7 +408,7 @@ private:
|
||||||
const string filename = v3Global.debugFilename("outputgroup") + ".txt";
|
const string filename = v3Global.debugFilename("outputgroup") + ".txt";
|
||||||
UINFO(5, "Dumping " << filename << endl);
|
UINFO(5, "Dumping " << filename << endl);
|
||||||
m_logp = std::unique_ptr<std::ofstream>{V3File::new_ofstream(filename)};
|
m_logp = std::unique_ptr<std::ofstream>{V3File::new_ofstream(filename)};
|
||||||
if (m_logp->fail()) v3fatal("Can't write " << filename);
|
if (m_logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_logp) dumpLogScoreHistogram(*m_logp);
|
if (m_logp) dumpLogScoreHistogram(*m_logp);
|
||||||
|
|
|
||||||
|
|
@ -98,7 +98,7 @@ private:
|
||||||
void dumpDotFile(const V3Graph& graph, const string& filename) const {
|
void dumpDotFile(const V3Graph& graph, const string& filename) const {
|
||||||
// This generates a file used by graphviz, https://www.graphviz.org
|
// This generates a file used by graphviz, https://www.graphviz.org
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
// Header
|
// Header
|
||||||
*logp << "digraph v3graph {\n";
|
*logp << "digraph v3graph {\n";
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,7 @@ V3FileDependImp dependImp; // Depend implementation class
|
||||||
|
|
||||||
void V3FileDependImp::writeDepend(const string& filename) {
|
void V3FileDependImp::writeDepend(const string& filename) {
|
||||||
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
||||||
if (ofp->fail()) v3fatal("Can't write " << filename);
|
if (ofp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
for (const DependFile& i : m_filenameList) {
|
for (const DependFile& i : m_filenameList) {
|
||||||
if (i.target()) *ofp << i.filename() << " ";
|
if (i.target()) *ofp << i.filename() << " ";
|
||||||
|
|
@ -179,7 +179,7 @@ std::vector<string> V3FileDependImp::getAllDeps() const {
|
||||||
|
|
||||||
void V3FileDependImp::writeTimes(const string& filename, const string& cmdlineIn) {
|
void V3FileDependImp::writeTimes(const string& filename, const string& cmdlineIn) {
|
||||||
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
||||||
if (ofp->fail()) v3fatal("Can't write " << filename);
|
if (ofp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
const string cmdline = stripQuotes(cmdlineIn);
|
const string cmdline = stripQuotes(cmdlineIn);
|
||||||
*ofp << "# DESCR"
|
*ofp << "# DESCR"
|
||||||
|
|
@ -936,7 +936,7 @@ V3OutFile::V3OutFile(const string& filename, V3OutFormatter::Language lang)
|
||||||
: V3OutFormatter{filename, lang}
|
: V3OutFormatter{filename, lang}
|
||||||
, m_bufferp{new std::array<char, WRITE_BUFFER_SIZE_BYTES>{}} {
|
, m_bufferp{new std::array<char, WRITE_BUFFER_SIZE_BYTES>{}} {
|
||||||
if ((m_fp = V3File::new_fopen_w(filename)) == nullptr) {
|
if ((m_fp = V3File::new_fopen_w(filename)) == nullptr) {
|
||||||
v3fatal("Cannot write " << filename);
|
v3fatal("Can't write file: " << filename);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -284,7 +284,7 @@ void V3Graph::dumpDotFile(const string& filename, bool colorAsSubgraph) const {
|
||||||
// This generates a file used by graphviz, https://www.graphviz.org
|
// This generates a file used by graphviz, https://www.graphviz.org
|
||||||
// "hardcoded" parameters:
|
// "hardcoded" parameters:
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
// Header
|
// Header
|
||||||
*logp << "digraph v3graph {\n";
|
*logp << "digraph v3graph {\n";
|
||||||
|
|
|
||||||
|
|
@ -603,10 +603,10 @@ class InlineVisitor final : public VNVisitor {
|
||||||
|
|
||||||
//--------------------
|
//--------------------
|
||||||
void visit(AstCell* nodep) override { // LCOV_EXCL_START
|
void visit(AstCell* nodep) override { // LCOV_EXCL_START
|
||||||
nodep->v3fatal("Traversal should have been short circuited");
|
nodep->v3fatalSrc("Traversal should have been short circuited");
|
||||||
}
|
}
|
||||||
void visit(AstNodeStmt* nodep) override {
|
void visit(AstNodeStmt* nodep) override {
|
||||||
nodep->v3fatal("Traversal should have been short circuited");
|
nodep->v3fatalSrc("Traversal should have been short circuited");
|
||||||
} // LCOV_EXCL_STOP
|
} // LCOV_EXCL_STOP
|
||||||
void visit(AstNodeFile*) override {} // Accelerate
|
void visit(AstNodeFile*) override {} // Accelerate
|
||||||
void visit(AstNodeDType*) override {} // Accelerate
|
void visit(AstNodeDType*) override {} // Accelerate
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@ public:
|
||||||
if (dumpLevel() >= 6 || force) {
|
if (dumpLevel() >= 6 || force) {
|
||||||
const string filename = v3Global.debugFilename(nameComment) + ".txt";
|
const string filename = v3Global.debugFilename(nameComment) + ".txt";
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
std::ostream& os = *logp;
|
std::ostream& os = *logp;
|
||||||
// TODO the symbol table has node pointers which may be
|
// TODO the symbol table has node pointers which may be
|
||||||
// dangling, as we call deleteTree in these visitors without
|
// dangling, as we call deleteTree in these visitors without
|
||||||
|
|
|
||||||
|
|
@ -474,7 +474,7 @@ void V3Options::decorations(FileLine* fl, const string& arg) { // --decorations
|
||||||
m_decoration = true;
|
m_decoration = true;
|
||||||
m_decorationNodes = false;
|
m_decorationNodes = false;
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Unknown setting for --decorations: '"
|
fl->v3error("Unknown setting for --decorations: '"
|
||||||
<< arg << "'\n"
|
<< arg << "'\n"
|
||||||
<< fl->warnMore() << "... Suggest 'none', 'medium', or 'node'");
|
<< fl->warnMore() << "... Suggest 'none', 'medium', or 'node'");
|
||||||
}
|
}
|
||||||
|
|
@ -1196,7 +1196,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
DECL_OPTION("-build-jobs", CbVal, [this, fl](const char* valp) {
|
DECL_OPTION("-build-jobs", CbVal, [this, fl](const char* valp) {
|
||||||
int val = std::atoi(valp);
|
int val = std::atoi(valp);
|
||||||
if (val < 0) {
|
if (val < 0) {
|
||||||
fl->v3fatal("--build-jobs requires a non-negative integer, but '" << valp
|
fl->v3error("--build-jobs requires a non-negative integer, but '" << valp
|
||||||
<< "' was passed");
|
<< "' was passed");
|
||||||
val = 1;
|
val = 1;
|
||||||
} else if (val == 0) {
|
} else if (val == 0) {
|
||||||
|
|
@ -1229,7 +1229,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
m_compLimitMembers = 0; // probably ok, and AFAIK doesn't support anon structs
|
m_compLimitMembers = 0; // probably ok, and AFAIK doesn't support anon structs
|
||||||
m_compLimitParens = 80; // 128, but allow some room
|
m_compLimitParens = 80; // 128, but allow some room
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Unknown setting for --compiler: '"
|
fl->v3error("Unknown setting for --compiler: '"
|
||||||
<< valp << "'\n"
|
<< valp << "'\n"
|
||||||
<< fl->warnMore() << "... Suggest 'clang', 'gcc', or 'msvc'");
|
<< fl->warnMore() << "... Suggest 'clang', 'gcc', or 'msvc'");
|
||||||
}
|
}
|
||||||
|
|
@ -1417,7 +1417,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
for (int i = V3LangCode::L_ERROR + 1; i < V3LangCode::_ENUM_END; ++i) {
|
for (int i = V3LangCode::L_ERROR + 1; i < V3LangCode::_ENUM_END; ++i) {
|
||||||
spell.pushCandidate(V3LangCode{i}.ascii());
|
spell.pushCandidate(V3LangCode{i}.ascii());
|
||||||
}
|
}
|
||||||
fl->v3fatal("Unknown language specified: " << valp << spell.bestCandidateMsg(valp));
|
fl->v3error("Unknown language specified: " << valp << spell.bestCandidateMsg(valp));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
DECL_OPTION("-default-language", CbVal, setLang);
|
DECL_OPTION("-default-language", CbVal, setLang);
|
||||||
|
|
@ -1446,7 +1446,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
} else if (!std::strcmp(valp, "json")) {
|
} else if (!std::strcmp(valp, "json")) {
|
||||||
m_makeJson = true;
|
m_makeJson = true;
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Unknown --make system specified: '" << valp << "'");
|
fl->v3error("Unknown --make system specified: '" << valp << "'");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
DECL_OPTION("-max-num-width", Set, &m_maxNumWidth);
|
DECL_OPTION("-max-num-width", Set, &m_maxNumWidth);
|
||||||
|
|
@ -1487,7 +1487,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
DECL_OPTION("-no-pins64", CbCall, [this]() { m_pinsBv = 33; });
|
DECL_OPTION("-no-pins64", CbCall, [this]() { m_pinsBv = 33; });
|
||||||
DECL_OPTION("-pins-bv", CbVal, [this, fl](const char* valp) {
|
DECL_OPTION("-pins-bv", CbVal, [this, fl](const char* valp) {
|
||||||
m_pinsBv = std::atoi(valp);
|
m_pinsBv = std::atoi(valp);
|
||||||
if (m_pinsBv > 65) fl->v3fatal("--pins-bv maximum is 65: " << valp);
|
if (m_pinsBv > 65) fl->v3error("--pins-bv maximum is 65: " << valp);
|
||||||
});
|
});
|
||||||
DECL_OPTION("-pins-inout-enables", OnOff, &m_pinsInoutEnables);
|
DECL_OPTION("-pins-inout-enables", OnOff, &m_pinsInoutEnables);
|
||||||
DECL_OPTION("-pins-sc-uint", CbOnOff, [this](bool flag) {
|
DECL_OPTION("-pins-sc-uint", CbOnOff, [this](bool flag) {
|
||||||
|
|
@ -1608,7 +1608,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
m_threadsDpiPure = true;
|
m_threadsDpiPure = true;
|
||||||
m_threadsDpiUnpure = false;
|
m_threadsDpiUnpure = false;
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Unknown setting for --threads-dpi: '"
|
fl->v3error("Unknown setting for --threads-dpi: '"
|
||||||
<< valp << "'\n"
|
<< valp << "'\n"
|
||||||
<< fl->warnMore() << "... Suggest 'all', 'none', or 'pure'");
|
<< fl->warnMore() << "... Suggest 'all', 'none', or 'pure'");
|
||||||
}
|
}
|
||||||
|
|
@ -1796,7 +1796,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
} else if (!std::strcmp(valp, "unique")) {
|
} else if (!std::strcmp(valp, "unique")) {
|
||||||
m_xAssign = "unique";
|
m_xAssign = "unique";
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Unknown setting for --x-assign: '"
|
fl->v3error("Unknown setting for --x-assign: '"
|
||||||
<< valp << "'\n"
|
<< valp << "'\n"
|
||||||
<< fl->warnMore() << "... Suggest '0', '1', 'fast', or 'unique'");
|
<< fl->warnMore() << "... Suggest '0', '1', 'fast', or 'unique'");
|
||||||
}
|
}
|
||||||
|
|
@ -1809,7 +1809,7 @@ void V3Options::parseOptsList(FileLine* fl, const string& optdir, int argc,
|
||||||
} else if (!std::strcmp(valp, "unique")) {
|
} else if (!std::strcmp(valp, "unique")) {
|
||||||
m_xInitial = "unique";
|
m_xInitial = "unique";
|
||||||
} else {
|
} else {
|
||||||
fl->v3fatal("Unknown setting for --x-initial: '"
|
fl->v3error("Unknown setting for --x-initial: '"
|
||||||
<< valp << "'\n"
|
<< valp << "'\n"
|
||||||
<< fl->warnMore() << "... Suggest '0', 'fast', or 'unique'");
|
<< fl->warnMore() << "... Suggest '0', 'fast', or 'unique'");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -556,7 +556,7 @@ public:
|
||||||
UINFO(1, "Writing " << filename << endl);
|
UINFO(1, "Writing " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
||||||
std::ostream* const osp = &(*ofp); // &* needed to deref unique_ptr
|
std::ostream* const osp = &(*ofp); // &* needed to deref unique_ptr
|
||||||
if (osp->fail()) v3fatalStatic("Can't write " << filename);
|
if (osp->fail()) v3fatalStatic("Can't write file: " << filename);
|
||||||
|
|
||||||
// Find start vertex with longest CP
|
// Find start vertex with longest CP
|
||||||
const LogicMTask* startp = nullptr;
|
const LogicMTask* startp = nullptr;
|
||||||
|
|
|
||||||
|
|
@ -158,7 +158,7 @@ class V3OrderProcessDomains final {
|
||||||
// Make report of all signal names and what clock edges they have
|
// Make report of all signal names and what clock edges they have
|
||||||
const string filename = v3Global.debugFilename(m_tag + "_order_edges.txt");
|
const string filename = v3Global.debugFilename(m_tag + "_order_edges.txt");
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
std::deque<string> report;
|
std::deque<string> report;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -336,7 +336,7 @@ void V3ParseImp::parseFile(FileLine* fileline, const string& modfilename, bool i
|
||||||
osp = ofp = V3File::new_ofstream(vppfilename);
|
osp = ofp = V3File::new_ofstream(vppfilename);
|
||||||
}
|
}
|
||||||
if (osp->fail()) {
|
if (osp->fail()) {
|
||||||
fileline->v3error("Cannot write preprocessor output: " + vppfilename);
|
fileline->v3error("Can't write file: " + vppfilename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (v3Global.opt.dumpDefines()) {
|
if (v3Global.opt.dumpDefines()) {
|
||||||
|
|
@ -371,7 +371,7 @@ void V3ParseImp::dumpInputsFile() {
|
||||||
= v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__inputs.vpp";
|
= v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__inputs.vpp";
|
||||||
std::ofstream* ofp = V3File::new_ofstream(vppfilename, append);
|
std::ofstream* ofp = V3File::new_ofstream(vppfilename, append);
|
||||||
if (ofp->fail()) {
|
if (ofp->fail()) {
|
||||||
v3error("Cannot write preprocessor output: " + vppfilename);
|
v3error("Can't write file: " + vppfilename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!append) {
|
if (!append) {
|
||||||
|
|
|
||||||
|
|
@ -242,7 +242,7 @@ private:
|
||||||
void statePop() {
|
void statePop() {
|
||||||
m_states.pop();
|
m_states.pop();
|
||||||
if (VL_UNCOVERABLE(m_states.empty())) {
|
if (VL_UNCOVERABLE(m_states.empty())) {
|
||||||
error("InternalError: Pop of parser state with nothing on stack"); // LCOV_EXCL_LINE
|
fileline()->v3fatalSrc("Pop of parser state with nothing on stack");
|
||||||
m_states.push(ps_TOP); // LCOV_EXCL_LINE
|
m_states.push(ps_TOP); // LCOV_EXCL_LINE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -640,8 +640,8 @@ string V3PreProcImp::defineSubst(VDefineRef* refp) {
|
||||||
const string arg = trimWhitespace(refp->args()[numArgs], true);
|
const string arg = trimWhitespace(refp->args()[numArgs], true);
|
||||||
if (arg != "") valueDef = arg;
|
if (arg != "") valueDef = arg;
|
||||||
} else if (!haveDefault) {
|
} else if (!haveDefault) {
|
||||||
error("Define missing argument '" + argName + "' for: " + refp->name()
|
fileline()->v3error("Define missing argument '" + argName
|
||||||
+ "\n");
|
+ "' for: " + refp->name());
|
||||||
return " `" + refp->name() + " ";
|
return " `" + refp->name() + " ";
|
||||||
}
|
}
|
||||||
numArgs++;
|
numArgs++;
|
||||||
|
|
@ -679,7 +679,7 @@ string V3PreProcImp::defineSubst(VDefineRef* refp) {
|
||||||
// `define X() is ok to call with nothing
|
// `define X() is ok to call with nothing
|
||||||
&& !(refp->args().size() == 1 && numArgs == 0
|
&& !(refp->args().size() == 1 && numArgs == 0
|
||||||
&& trimWhitespace(refp->args()[0], false) == "")) {
|
&& trimWhitespace(refp->args()[0], false) == "")) {
|
||||||
error("Define passed too many arguments: " + refp->name() + "\n");
|
fileline()->v3error("Define passed too many arguments: " + refp->name());
|
||||||
return " `" + refp->name() + " ";
|
return " `" + refp->name() + " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -800,7 +800,7 @@ void V3PreProcImp::openFile(FileLine*, VInFilter* filterp, const string& filenam
|
||||||
StrList wholefile;
|
StrList wholefile;
|
||||||
const bool ok = filterp->readWholefile(filename, wholefile /*ref*/);
|
const bool ok = filterp->readWholefile(filename, wholefile /*ref*/);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
error("File not found: " + filename + "\n");
|
fileline()->v3error("File not found: " + filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -808,7 +808,7 @@ void V3PreProcImp::openFile(FileLine*, VInFilter* filterp, const string& filenam
|
||||||
// We allow the same include file twice, because occasionally it pops
|
// We allow the same include file twice, because occasionally it pops
|
||||||
// up, with guards preventing a real recursion.
|
// up, with guards preventing a real recursion.
|
||||||
if (m_lexp->m_streampStack.size() > V3PreProc::INCLUDE_DEPTH_MAX) {
|
if (m_lexp->m_streampStack.size() > V3PreProc::INCLUDE_DEPTH_MAX) {
|
||||||
error("Recursive inclusion of file: " + filename);
|
fileline()->v3error("Recursive inclusion of file: " + filename);
|
||||||
// Include might be a tree of includes that is O(n^2) or worse.
|
// Include might be a tree of includes that is O(n^2) or worse.
|
||||||
// Once hit this error then, ignore all further includes so can unwind.
|
// Once hit this error then, ignore all further includes so can unwind.
|
||||||
m_incError = true;
|
m_incError = true;
|
||||||
|
|
@ -964,8 +964,9 @@ int V3PreProcImp::getRawToken() {
|
||||||
m_lastLineno = m_lexp->m_tokFilelinep->lineno();
|
m_lastLineno = m_lexp->m_tokFilelinep->lineno();
|
||||||
m_tokensOnLine = 0;
|
m_tokensOnLine = 0;
|
||||||
} else if (++m_tokensOnLine > v3Global.opt.preprocTokenLimit()) {
|
} else if (++m_tokensOnLine > v3Global.opt.preprocTokenLimit()) {
|
||||||
error("Too many preprocessor tokens on a line (>"
|
fileline()->v3error("Too many preprocessor tokens on a line (>"
|
||||||
+ cvtToStr(v3Global.opt.preprocTokenLimit()) + "); perhaps recursive `define");
|
+ cvtToStr(v3Global.opt.preprocTokenLimit())
|
||||||
|
+ "); perhaps recursive `define");
|
||||||
tok = VP_EOF_ERROR;
|
tok = VP_EOF_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1103,7 +1104,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
} else if (state() == ps_DEFNAME_ELSIF) {
|
} else if (state() == ps_DEFNAME_ELSIF) {
|
||||||
if (m_ifdefStack.empty()) {
|
if (m_ifdefStack.empty()) {
|
||||||
error("`elsif with no matching `if\n");
|
fileline()->v3error("`elsif with no matching `if");
|
||||||
} else {
|
} else {
|
||||||
// Handle `else portion
|
// Handle `else portion
|
||||||
const VPreIfEntry lastIf = m_ifdefStack.top();
|
const VPreIfEntry lastIf = m_ifdefStack.top();
|
||||||
|
|
@ -1159,7 +1160,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
// IE, `ifdef `MACRO(x): Substitute and come back here when state pops.
|
// IE, `ifdef `MACRO(x): Substitute and come back here when state pops.
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
error("Expecting define name. Found: "s + tokenName(tok) + "\n");
|
fileline()->v3error("Expecting define name. Found: "s + tokenName(tok));
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1208,7 +1209,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
} else if (state() == ps_EXPR_ELSIF) {
|
} else if (state() == ps_EXPR_ELSIF) {
|
||||||
if (m_ifdefStack.empty()) {
|
if (m_ifdefStack.empty()) {
|
||||||
error("`elsif with no matching `if\n");
|
fileline()->v3error("`elsif with no matching `if");
|
||||||
} else {
|
} else {
|
||||||
// Handle `else portion
|
// Handle `else portion
|
||||||
const VPreIfEntry lastIf = m_ifdefStack.top();
|
const VPreIfEntry lastIf = m_ifdefStack.top();
|
||||||
|
|
@ -1243,8 +1244,8 @@ int V3PreProcImp::getStateToken() {
|
||||||
if (VString::removeWhitespace(string{yyourtext(), yyourleng()}).empty()) {
|
if (VString::removeWhitespace(string{yyourtext(), yyourleng()}).empty()) {
|
||||||
return tok;
|
return tok;
|
||||||
} else {
|
} else {
|
||||||
error("Syntax error in `ifdef () expression; unexpected: '"s + tokenName(tok)
|
fileline()->v3error("Syntax error in `ifdef () expression; unexpected: '"s
|
||||||
+ "'\n");
|
+ tokenName(tok) + "'");
|
||||||
}
|
}
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
|
|
@ -1266,7 +1267,8 @@ int V3PreProcImp::getStateToken() {
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
error("Expecting define formal arguments. Found: "s + tokenName(tok) + "\n");
|
fileline()->v3error("Expecting define formal arguments. Found: "s + tokenName(tok)
|
||||||
|
+ "\n");
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1318,8 +1320,8 @@ int V3PreProcImp::getStateToken() {
|
||||||
} else {
|
} else {
|
||||||
UASSERT(!m_defRefs.empty(), "Shouldn't be in DEFPAREN w/o active defref");
|
UASSERT(!m_defRefs.empty(), "Shouldn't be in DEFPAREN w/o active defref");
|
||||||
const VDefineRef* const refp = &(m_defRefs.top());
|
const VDefineRef* const refp = &(m_defRefs.top());
|
||||||
error("Expecting ( to begin argument list for define reference `"s + refp->name()
|
fileline()->v3error("Expecting ( to begin argument list for define reference `"s
|
||||||
+ "\n");
|
+ refp->name());
|
||||||
statePop();
|
statePop();
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
|
|
@ -1392,8 +1394,8 @@ int V3PreProcImp::getStateToken() {
|
||||||
statePush(ps_STRIFY);
|
statePush(ps_STRIFY);
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
} else {
|
} else {
|
||||||
error(std::string{
|
fileline()->v3error(
|
||||||
"Expecting ) or , to end argument list for define reference. Found: "}
|
"Expecting ) or , to end argument list for define reference. Found: "s
|
||||||
+ tokenName(tok));
|
+ tokenName(tok));
|
||||||
statePop();
|
statePop();
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
|
|
@ -1419,7 +1421,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
statePop();
|
statePop();
|
||||||
error("Expecting include filename. Found: "s + tokenName(tok) + "\n");
|
fileline()->v3error("Expecting include filename. Found: "s + tokenName(tok));
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1427,12 +1429,12 @@ int V3PreProcImp::getStateToken() {
|
||||||
if (tok == VP_STRING) {
|
if (tok == VP_STRING) {
|
||||||
if (!m_off) {
|
if (!m_off) {
|
||||||
m_lastSym.assign(yyourtext(), yyourleng());
|
m_lastSym.assign(yyourtext(), yyourleng());
|
||||||
error(m_lastSym);
|
fileline()->v3error(m_lastSym);
|
||||||
}
|
}
|
||||||
statePop();
|
statePop();
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
} else {
|
} else {
|
||||||
error("Expecting `error string. Found: "s + tokenName(tok) + "\n");
|
fileline()->v3error("Expecting `error string. Found: "s + tokenName(tok));
|
||||||
statePop();
|
statePop();
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
|
|
@ -1479,7 +1481,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
statePop();
|
statePop();
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
} else if (tok == VP_EOF) {
|
} else if (tok == VP_EOF) {
|
||||||
error("`\" not terminated at EOF\n");
|
fileline()->v3error("`\" not terminated at EOF");
|
||||||
break;
|
break;
|
||||||
} else if (tok == VP_BACKQUOTE) {
|
} else if (tok == VP_BACKQUOTE) {
|
||||||
m_strify += "\\\"";
|
m_strify += "\\\"";
|
||||||
|
|
@ -1513,7 +1515,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
case VP_ELSIF: statePush(ps_DEFNAME_ELSIF); goto next_tok;
|
case VP_ELSIF: statePush(ps_DEFNAME_ELSIF); goto next_tok;
|
||||||
case VP_ELSE:
|
case VP_ELSE:
|
||||||
if (m_ifdefStack.empty()) {
|
if (m_ifdefStack.empty()) {
|
||||||
error("`else with no matching `if\n");
|
fileline()->v3error("`else with no matching `if");
|
||||||
} else {
|
} else {
|
||||||
const VPreIfEntry lastIf = m_ifdefStack.top();
|
const VPreIfEntry lastIf = m_ifdefStack.top();
|
||||||
m_ifdefStack.pop();
|
m_ifdefStack.pop();
|
||||||
|
|
@ -1527,7 +1529,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
case VP_ENDIF:
|
case VP_ENDIF:
|
||||||
UINFO(4, "Endif " << endl);
|
UINFO(4, "Endif " << endl);
|
||||||
if (m_ifdefStack.empty()) {
|
if (m_ifdefStack.empty()) {
|
||||||
error("`endif with no matching `if\n");
|
fileline()->v3error("`endif with no matching `if");
|
||||||
} else {
|
} else {
|
||||||
const VPreIfEntry lastIf = m_ifdefStack.top();
|
const VPreIfEntry lastIf = m_ifdefStack.top();
|
||||||
m_ifdefStack.pop();
|
m_ifdefStack.pop();
|
||||||
|
|
@ -1547,7 +1549,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
unputString("``");
|
unputString("``");
|
||||||
}
|
}
|
||||||
if (m_defDepth++ > V3PreProc::DEFINE_RECURSION_LEVEL_MAX) {
|
if (m_defDepth++ > V3PreProc::DEFINE_RECURSION_LEVEL_MAX) {
|
||||||
error("Recursive `define substitution: `" + name);
|
fileline()->v3error("Recursive `define substitution: `" + name);
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
// Substitute
|
// Substitute
|
||||||
|
|
@ -1618,7 +1620,7 @@ int V3PreProcImp::getStateToken() {
|
||||||
goto next_tok;
|
goto next_tok;
|
||||||
}
|
}
|
||||||
case VP_EOF:
|
case VP_EOF:
|
||||||
if (!m_ifdefStack.empty()) error("`ifdef not terminated at EOF\n");
|
if (!m_ifdefStack.empty()) fileline()->v3error("`ifdef not terminated at EOF");
|
||||||
return tok;
|
return tok;
|
||||||
case VP_UNDEFINEALL:
|
case VP_UNDEFINEALL:
|
||||||
if (!m_off) {
|
if (!m_off) {
|
||||||
|
|
|
||||||
|
|
@ -84,8 +84,6 @@ public:
|
||||||
virtual string removeDefines(const string& text) = 0; // Remove defines in a text string
|
virtual string removeDefines(const string& text) = 0; // Remove defines in a text string
|
||||||
|
|
||||||
// UTILITIES
|
// UTILITIES
|
||||||
void error(const string& msg) { fileline()->v3error(msg); } ///< Report an error
|
|
||||||
void fatal(const string& msg) { fileline()->v3fatalSrc(msg); } ///< Report a fatal error
|
|
||||||
virtual void dumpDefines(std::ostream& os) = 0; ///< Print list of `defines
|
virtual void dumpDefines(std::ostream& os) = 0; ///< Print list of `defines
|
||||||
virtual void candidateDefines(VSpellCheck* spellerp) = 0; ///< Spell check candidate defines
|
virtual void candidateDefines(VSpellCheck* spellerp) = 0; ///< Spell check candidate defines
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -235,7 +235,7 @@ class RandomizeMarkVisitor final : public VNVisitor {
|
||||||
"Unsupported: 'rand_mode()' on dynamic array element");
|
"Unsupported: 'rand_mode()' on dynamic array element");
|
||||||
valid = false;
|
valid = false;
|
||||||
} else {
|
} else {
|
||||||
methodHardp->v3fatal("Unknown rand_mode() receiver");
|
methodHardp->v3fatalSrc("Unknown rand_mode() receiver");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!nodep->pinsp() && VN_IS(nodep->backp(), StmtExpr)) {
|
if (!nodep->pinsp() && VN_IS(nodep->backp(), StmtExpr)) {
|
||||||
|
|
|
||||||
|
|
@ -108,7 +108,7 @@ public:
|
||||||
case REACTIVE | OBSERVED | INPUT | NBA: return "plum";
|
case REACTIVE | OBSERVED | INPUT | NBA: return "plum";
|
||||||
case REACTIVE | OBSERVED | ACTIVE | NBA: return "lightSeaGreen";
|
case REACTIVE | OBSERVED | ACTIVE | NBA: return "lightSeaGreen";
|
||||||
case REACTIVE | OBSERVED | INPUT | ACTIVE | NBA: return "gray50";
|
case REACTIVE | OBSERVED | INPUT | ACTIVE | NBA: return "gray50";
|
||||||
default: v3fatal("There are only 5 region bits"); return "";
|
default: v3fatalSrc("There are only 5 region bits"); return "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// LCOV_EXCL_STOP
|
// LCOV_EXCL_STOP
|
||||||
|
|
|
||||||
|
|
@ -234,7 +234,7 @@ void V3Stats::statsReport() {
|
||||||
const string filename
|
const string filename
|
||||||
= v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__stats.txt";
|
= v3Global.opt.hierTopDataDir() + "/" + v3Global.opt.prefix() + "__stats.txt";
|
||||||
std::ofstream* ofp{V3File::new_ofstream(filename)};
|
std::ofstream* ofp{V3File::new_ofstream(filename)};
|
||||||
if (ofp->fail()) v3fatal("Can't write " << filename);
|
if (ofp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
{ StatsReport{ofp}; } // Destruct before cleanup
|
{ StatsReport{ofp}; } // Destruct before cleanup
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -319,7 +319,7 @@ public:
|
||||||
const string filename = v3Global.debugFilename(nameComment) + ".txt";
|
const string filename = v3Global.debugFilename(nameComment) + ".txt";
|
||||||
UINFO(2, "Dumping " << filename << endl);
|
UINFO(2, "Dumping " << filename << endl);
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
dumpSelf(*logp, "");
|
dumpSelf(*logp, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -397,7 +397,7 @@ public:
|
||||||
if (dumpLevel()) {
|
if (dumpLevel()) {
|
||||||
const string filename = v3Global.debugFilename(nameComment) + ".txt";
|
const string filename = v3Global.debugFilename(nameComment) + ".txt";
|
||||||
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> logp{V3File::new_ofstream(filename)};
|
||||||
if (logp->fail()) v3fatal("Can't write " << filename);
|
if (logp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
dumpGraph(*logp, nameComment);
|
dumpGraph(*logp, nameComment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,7 +77,7 @@ void V3Waiver::addEntry(V3ErrorCode errorCode, const std::string& filename, cons
|
||||||
|
|
||||||
void V3Waiver::write(const std::string& filename) VL_MT_SAFE_EXCLUDES(s_mutex) {
|
void V3Waiver::write(const std::string& filename) VL_MT_SAFE_EXCLUDES(s_mutex) {
|
||||||
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
const std::unique_ptr<std::ofstream> ofp{V3File::new_ofstream(filename)};
|
||||||
if (ofp->fail()) v3fatal("Can't write " << filename);
|
if (ofp->fail()) v3fatal("Can't write file: " << filename);
|
||||||
|
|
||||||
*ofp << "// DESCR"
|
*ofp << "// DESCR"
|
||||||
"IPTION: Verilator output: Waivers generated with --waiver-output\n\n";
|
"IPTION: Verilator output: Waivers generated with --waiver-output\n\n";
|
||||||
|
|
|
||||||
|
|
@ -5881,7 +5881,7 @@ class WidthVisitor final : public VNVisitor {
|
||||||
} else if (VN_IS(propStmtp, PropSpec)) {
|
} else if (VN_IS(propStmtp, PropSpec)) {
|
||||||
iterateCheckSelf(nodep, "PropSpec", propStmtp, SELF, BOTH);
|
iterateCheckSelf(nodep, "PropSpec", propStmtp, SELF, BOTH);
|
||||||
} else {
|
} else {
|
||||||
propStmtp->v3fatal("Invalid statement under AstProperty");
|
propStmtp->v3fatalSrc("Invalid statement under AstProperty");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nodep->didWidth(true);
|
nodep->didWidth(true);
|
||||||
|
|
|
||||||
|
|
@ -35,7 +35,7 @@ void VlcTop::readCoverage(const string& filename, bool nonfatal) {
|
||||||
|
|
||||||
std::ifstream is{filename.c_str()};
|
std::ifstream is{filename.c_str()};
|
||||||
if (!is) {
|
if (!is) {
|
||||||
if (!nonfatal) v3fatal("Can't read " << filename);
|
if (!nonfatal) v3fatal("Can't read coverage file: " << filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -70,7 +70,7 @@ void VlcTop::writeCoverage(const string& filename) {
|
||||||
|
|
||||||
std::ofstream os{filename.c_str()};
|
std::ofstream os{filename.c_str()};
|
||||||
if (!os) {
|
if (!os) {
|
||||||
v3fatal("Can't write " << filename);
|
v3fatal("Can't write file: " << filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -86,7 +86,7 @@ void VlcTop::writeInfo(const string& filename) {
|
||||||
|
|
||||||
std::ofstream os{filename.c_str()};
|
std::ofstream os{filename.c_str()};
|
||||||
if (!os) {
|
if (!os) {
|
||||||
v3fatal("Can't write " << filename);
|
v3fatal("Can't write file: " << filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -285,13 +285,13 @@ void VlcTop::annotateOutputFiles(const string& dirname) {
|
||||||
|
|
||||||
std::ifstream is{filename.c_str()};
|
std::ifstream is{filename.c_str()};
|
||||||
if (!is) {
|
if (!is) {
|
||||||
v3error("Can't read " << filename);
|
v3error("Can't read annotation file: " << filename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::ofstream os{outfilename.c_str()};
|
std::ofstream os{outfilename.c_str()};
|
||||||
if (!os) {
|
if (!os) {
|
||||||
v3fatal("Can't write " << outfilename);
|
v3error("Can't write file: " << outfilename);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -29,19 +29,30 @@ for s in [
|
||||||
'dynamic new() not expected in this context (expected under an assign)', # Instead get syntax error
|
'dynamic new() not expected in this context (expected under an assign)', # Instead get syntax error
|
||||||
# Not yet analyzed
|
# Not yet analyzed
|
||||||
' loading non-variable',
|
' loading non-variable',
|
||||||
|
'--pins-bv maximum is 65: ',
|
||||||
'--pipe-filter protocol error, unexpected: ',
|
'--pipe-filter protocol error, unexpected: ',
|
||||||
|
'--pipe-filter returned bad status',
|
||||||
|
'--pipe-filter: Can\'t pipe: ',
|
||||||
|
'--pipe-filter: fork failed: ',
|
||||||
|
'--threads must be >= 0: ',
|
||||||
|
'--threads-max-mtasks must be >= 1: ',
|
||||||
|
'--trace-threads must be >= 1: ',
|
||||||
'/*verilator sformat*/ can only be applied to last argument of ',
|
'/*verilator sformat*/ can only be applied to last argument of ',
|
||||||
'Argument needed for string.',
|
'Argument needed for string.',
|
||||||
'Array initialization has too few elements, need element ',
|
'Array initialization has too few elements, need element ',
|
||||||
'Assigned pin is neither input nor output',
|
'Assigned pin is neither input nor output',
|
||||||
'Assignment pattern with no members',
|
'Assignment pattern with no members',
|
||||||
'Can\'t find varpin scope of ',
|
'Can\'t find varpin scope of ',
|
||||||
|
'Can\'t read annotation file: ',
|
||||||
'Can\'t resolve module reference: \'',
|
'Can\'t resolve module reference: \'',
|
||||||
'Cannot write preprocessor output: ',
|
'Can\'t write file: ',
|
||||||
'Circular logic when ordering code (non-cutable edge loop)',
|
'Circular logic when ordering code (non-cutable edge loop)',
|
||||||
|
'Define missing argument \'',
|
||||||
'Define or directive not defined: `',
|
'Define or directive not defined: `',
|
||||||
'Exceeded limit of ',
|
'Exceeded limit of ',
|
||||||
|
'Expecting define formal arguments. Found: ',
|
||||||
'Extern declaration\'s scope is not a defined class',
|
'Extern declaration\'s scope is not a defined class',
|
||||||
|
'File not found: ',
|
||||||
'Format to $display-like function must have constant format string',
|
'Format to $display-like function must have constant format string',
|
||||||
'Forward typedef used as class/package does not resolve to class/package: ',
|
'Forward typedef used as class/package does not resolve to class/package: ',
|
||||||
'Illegal +: or -: select; type already selected, or bad dimension: ',
|
'Illegal +: or -: select; type already selected, or bad dimension: ',
|
||||||
|
|
@ -62,6 +73,7 @@ for s in [
|
||||||
'String of ',
|
'String of ',
|
||||||
'Symbol matching ',
|
'Symbol matching ',
|
||||||
'Unexpected connection to arrayed port',
|
'Unexpected connection to arrayed port',
|
||||||
|
'Unmatched brackets in variable substitution in file: ',
|
||||||
'Unsized numbers/parameters not allowed in streams.',
|
'Unsized numbers/parameters not allowed in streams.',
|
||||||
'Unsupported RHS tristate construct: ',
|
'Unsupported RHS tristate construct: ',
|
||||||
'Unsupported or syntax error: Unsized range in instance or other declaration',
|
'Unsupported or syntax error: Unsized range in instance or other declaration',
|
||||||
|
|
@ -72,9 +84,6 @@ for s in [
|
||||||
'Unsupported: $bits for queue',
|
'Unsupported: $bits for queue',
|
||||||
'Unsupported: $c can\'t generate wider than 64 bits',
|
'Unsupported: $c can\'t generate wider than 64 bits',
|
||||||
'Unsupported: &&& expression',
|
'Unsupported: &&& expression',
|
||||||
'Unsupported: \'default :/\' constraint',
|
|
||||||
'Unsupported: \'{} .* patterns',
|
|
||||||
'Unsupported: \'{} tagged patterns',
|
|
||||||
'Unsupported: +%- range',
|
'Unsupported: +%- range',
|
||||||
'Unsupported: +/- range',
|
'Unsupported: +/- range',
|
||||||
'Unsupported: 4-state numbers in this context',
|
'Unsupported: 4-state numbers in this context',
|
||||||
|
|
@ -96,9 +105,11 @@ for s in [
|
||||||
'Unsupported: Verilog 1995 deassign',
|
'Unsupported: Verilog 1995 deassign',
|
||||||
'Unsupported: Verilog 1995 gate primitive: ',
|
'Unsupported: Verilog 1995 gate primitive: ',
|
||||||
'Unsupported: [] dimensions',
|
'Unsupported: [] dimensions',
|
||||||
|
'Unsupported: \'default :/\' constraint',
|
||||||
|
'Unsupported: \'{} .* patterns',
|
||||||
|
'Unsupported: \'{} tagged patterns',
|
||||||
'Unsupported: always[] (in property expression)',
|
'Unsupported: always[] (in property expression)',
|
||||||
'Unsupported: assertion items in clocking blocks',
|
'Unsupported: assertion items in clocking blocks',
|
||||||
'Unsupported: covergroup within class',
|
|
||||||
'Unsupported: default clocking identifier',
|
'Unsupported: default clocking identifier',
|
||||||
'Unsupported: don\'t know how to deal with ',
|
'Unsupported: don\'t know how to deal with ',
|
||||||
'Unsupported: eventually[] (in property expression)',
|
'Unsupported: eventually[] (in property expression)',
|
||||||
|
|
@ -106,18 +117,18 @@ for s in [
|
||||||
'Unsupported: extern interface',
|
'Unsupported: extern interface',
|
||||||
'Unsupported: extern module',
|
'Unsupported: extern module',
|
||||||
'Unsupported: extern task',
|
'Unsupported: extern task',
|
||||||
|
'Unsupported: modport export',
|
||||||
|
'Unsupported: no_inline for tasks',
|
||||||
'Unsupported: property port \'local\'',
|
'Unsupported: property port \'local\'',
|
||||||
'Unsupported: randsequence production list',
|
'Unsupported: randsequence production list',
|
||||||
'Unsupported: randsequence repeat',
|
'Unsupported: randsequence repeat',
|
||||||
'Unsupported: repeat event control',
|
'Unsupported: repeat event control',
|
||||||
'Unsupported: s_always (in property expression)',
|
'Unsupported: s_always (in property expression)',
|
||||||
|
'Unsupported: static cast to ',
|
||||||
|
'Unsupported: super',
|
||||||
'Unsupported: this.super',
|
'Unsupported: this.super',
|
||||||
'Unsupported: trireg',
|
'Unsupported: trireg',
|
||||||
'Unsupported: with[] stream expression',
|
'Unsupported: with[] stream expression',
|
||||||
'Unsupported: modport export',
|
|
||||||
'Unsupported: no_inline for tasks',
|
|
||||||
'Unsupported: static cast to ',
|
|
||||||
'Unsupported: super',
|
|
||||||
]:
|
]:
|
||||||
Suppressed[s] = True
|
Suppressed[s] = True
|
||||||
|
|
||||||
|
|
@ -137,11 +148,11 @@ def read_messages():
|
||||||
continue
|
continue
|
||||||
if re.match(r'^\s*/\*', line):
|
if re.match(r'^\s*/\*', line):
|
||||||
continue
|
continue
|
||||||
if re.search(r'\b(v3error|v3warn|BBUNSUP)\b\($', line):
|
if re.search(r'\b(v3error|v3warn|v3fatal|BBUNSUP)\b\($', line):
|
||||||
if 'LCOV_EXCL_LINE' not in line:
|
if 'LCOV_EXCL_LINE' not in line:
|
||||||
read_next = True
|
read_next = True
|
||||||
continue
|
continue
|
||||||
m = re.search(r'.*\b(v3error|v3warn|BBUNSUP)\b(.*)', line)
|
m = re.search(r'.*\b(v3error|v3warn|v3fatal|BBUNSUP)\b(.*)', line)
|
||||||
if m:
|
if m:
|
||||||
line = m.group(2)
|
line = m.group(2)
|
||||||
if 'LCOV_EXCL_LINE' not in line:
|
if 'LCOV_EXCL_LINE' not in line:
|
||||||
|
|
@ -185,13 +196,13 @@ def check():
|
||||||
read_outputs()
|
read_outputs()
|
||||||
|
|
||||||
print("Number of suppressions = " + str(len(Suppressed)))
|
print("Number of suppressions = " + str(len(Suppressed)))
|
||||||
print("Coverage = ", str(100 - int(100 * len(Suppressed) / len(Messages))))
|
print("Coverage = %3.1f%%" % (100 - int(100 * len(Suppressed) / len(Messages))))
|
||||||
print()
|
print()
|
||||||
|
|
||||||
print("Checking for v3error/v3warn messages in sources without")
|
print("Checking for v3error/v3warn messages in sources without")
|
||||||
print("coverage in test_regress/t/*.out:")
|
print("coverage in test_regress/t/*.out:")
|
||||||
print("(Developers: If a message is impossible to test, use UASSERT or")
|
print("(Developers: If a message is impossible to test, consider using")
|
||||||
print("v3fatalSrc instead of v3error)")
|
print("UASSERT or v3fatalSrc instead of v3error)")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
used_suppressed = {}
|
used_suppressed = {}
|
||||||
|
|
|
||||||
|
|
@ -1 +1,3 @@
|
||||||
%Error: --build-jobs requires a non-negative integer, but '-1' was passed
|
%Error: --build-jobs requires a non-negative integer, but '-1' was passed
|
||||||
|
%Error: The following cannot be used together: --build, --lint-only. Suggest see manual
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
%Error: Unknown setting for --compiler: 'bad_one'
|
%Error: Unknown setting for --compiler: 'bad_one'
|
||||||
... Suggest 'clang', 'gcc', or 'msvc'
|
... Suggest 'clang', 'gcc', or 'msvc'
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
%Error: Unknown setting for --decorations: 'BAD'
|
%Error: Unknown setting for --decorations: 'BAD'
|
||||||
... Suggest 'none', 'medium', or 'node'
|
... Suggest 'none', 'medium', or 'node'
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1 +1,2 @@
|
||||||
%Error: Unknown --make system specified: 'bad_one'
|
%Error: Unknown --make system specified: 'bad_one'
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -9,3 +9,4 @@
|
||||||
%Error: Invalid option: -Won-SPLITVAR... Suggested alternative: '-Wno-SPLITVAR'
|
%Error: Invalid option: -Won-SPLITVAR... Suggested alternative: '-Wno-SPLITVAR'
|
||||||
%Error: Unknown warning specified: -Wno-SPLITVER... Suggested alternative: '-Wno-SPLITVAR'
|
%Error: Unknown warning specified: -Wno-SPLITVER... Suggested alternative: '-Wno-SPLITVAR'
|
||||||
%Error: Unknown language specified: 1364-1997... Suggested alternative: '1364-1995'
|
%Error: Unknown language specified: 1364-1997... Suggested alternative: '1364-1995'
|
||||||
|
%Error: verilator: No Input Verilog file specified on command line, see verilator --help for more information
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
%Error: Unknown setting for --threads-dpi: 'bad_one'
|
%Error: Unknown setting for --threads-dpi: 'bad_one'
|
||||||
... Suggest 'all', 'none', or 'pure'
|
... Suggest 'all', 'none', or 'pure'
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
%Error: Unknown setting for --x-assign: 'bad_one'
|
%Error: Unknown setting for --x-assign: 'bad_one'
|
||||||
... Suggest '0', '1', 'fast', or 'unique'
|
... Suggest '0', '1', 'fast', or 'unique'
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
%Error: Unknown setting for --x-initial: 'bad_one'
|
%Error: Unknown setting for --x-initial: 'bad_one'
|
||||||
... Suggest '0', 'fast', or 'unique'
|
... Suggest '0', 'fast', or 'unique'
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,4 @@
|
||||||
|
%Error: t/t_preproc_ifdefend_bad.v:9:1: `ifdef not terminated at EOF
|
||||||
|
9 | %Error-internal-contents-bad-ct2-ln9
|
||||||
|
| ^
|
||||||
|
%Error: Exiting due to
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
|
||||||
|
#
|
||||||
|
# Copyright 2024 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.
|
||||||
|
# SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
|
||||||
|
|
||||||
|
import vltest_bootstrap
|
||||||
|
|
||||||
|
test.scenarios('linter')
|
||||||
|
|
||||||
|
test.lint(fails=True, verilator_flags2=['--no-std'], expect_filename=test.golden_filename)
|
||||||
|
|
||||||
|
test.passes()
|
||||||
|
|
@ -0,0 +1,7 @@
|
||||||
|
// DESCRIPTION: Verilator: Verilog Test module
|
||||||
|
//
|
||||||
|
// This file ONLY is placed under the Creative Commons Public Domain, for
|
||||||
|
// any use, without warranty, 2019 by Wilson Snyder.
|
||||||
|
// SPDX-License-Identifier: CC0-1.0
|
||||||
|
|
||||||
|
`ifdef FOO
|
||||||
|
|
@ -1 +1 @@
|
||||||
%Error: Can't read t/t_NOT_FOUND
|
%Error: Can't read coverage file: t/t_NOT_FOUND
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue