Style cleanups.

This commit is contained in:
Wilson Snyder 2020-02-23 20:57:41 -05:00
parent 7db7d3df0d
commit 2575d02fc1
1 changed files with 58 additions and 53 deletions

View File

@ -81,12 +81,12 @@
#include VL_INCLUDE_UNORDERED_MAP #include VL_INCLUDE_UNORDERED_MAP
#include VL_INCLUDE_UNORDERED_SET #include VL_INCLUDE_UNORDERED_SET
static AstNodeAssign* newAssign(FileLine* fileline, AstNode* lhs, AstNode* rhs, static AstNodeAssign* newAssign(FileLine* fileline, AstNode* lhsp, AstNode* rhsp,
const AstVar* varp) { const AstVar* varp) {
if (varp->isFuncLocal() || varp->isFuncReturn()) { if (varp->isFuncLocal() || varp->isFuncReturn()) {
return new AstAssign(fileline, lhs, rhs); return new AstAssign(fileline, lhsp, rhsp);
} else { } else {
return new AstAssignW(fileline, lhs, rhs); return new AstAssignW(fileline, lhsp, rhsp);
} }
} }
@ -195,7 +195,7 @@ static AstNode* toEndOfPort(AstVar* startp) {
class UnpackRef { class UnpackRef {
// m_nodep is called in this context (AstNodeStmt, AstCell, AstNodeFTask, or AstAlways) // m_nodep is called in this context (AstNodeStmt, AstCell, AstNodeFTask, or AstAlways)
AstNode* m_context; AstNode* m_contextp;
AstNode* m_nodep; // ArraySel, SliceSel, ArrayVarRef (entire value) AstNode* m_nodep; // ArraySel, SliceSel, ArrayVarRef (entire value)
int m_index; // for ArraySel int m_index; // for ArraySel
int m_msb; // for SliceSel int m_msb; // for SliceSel
@ -204,7 +204,7 @@ class UnpackRef {
bool m_ftask; // true if the reference is in function/task. false if in module. bool m_ftask; // true if the reference is in function/task. false if in module.
public: public:
UnpackRef(AstNode* stmtp, AstVarRef* nodep, bool ftask) UnpackRef(AstNode* stmtp, AstVarRef* nodep, bool ftask)
: m_context(stmtp) : m_contextp(stmtp)
, m_nodep(nodep) , m_nodep(nodep)
, m_index(-1) , m_index(-1)
, m_msb(0) , m_msb(0)
@ -212,7 +212,7 @@ public:
, m_lvalue(nodep->lvalue()) , m_lvalue(nodep->lvalue())
, m_ftask(ftask) {} , m_ftask(ftask) {}
UnpackRef(AstNode* stmtp, AstArraySel* nodep, int idx, bool lvalue, bool ftask) UnpackRef(AstNode* stmtp, AstArraySel* nodep, int idx, bool lvalue, bool ftask)
: m_context(stmtp) : m_contextp(stmtp)
, m_nodep(nodep) , m_nodep(nodep)
, m_index(idx) , m_index(idx)
, m_msb(0) , m_msb(0)
@ -220,7 +220,7 @@ public:
, m_lvalue(lvalue) , m_lvalue(lvalue)
, m_ftask(ftask) {} , m_ftask(ftask) {}
UnpackRef(AstNode* stmtp, AstSliceSel* nodep, int msb, int lsb, bool lvalue, bool ftask) UnpackRef(AstNode* stmtp, AstSliceSel* nodep, int msb, int lsb, bool lvalue, bool ftask)
: m_context(stmtp) : m_contextp(stmtp)
, m_nodep(nodep) , m_nodep(nodep)
, m_index(msb == lsb ? msb : -1) // Equivalent to ArraySel , m_index(msb == lsb ? msb : -1) // Equivalent to ArraySel
, m_msb(msb) , m_msb(msb)
@ -235,7 +235,7 @@ public:
UASSERT_OBJ(isSingleRef(), m_nodep, "not array sel"); UASSERT_OBJ(isSingleRef(), m_nodep, "not array sel");
return m_index; return m_index;
} }
AstNode* context() const { return m_context; } AstNode* context() const { return m_contextp; }
std::pair<int, int> range() const { std::pair<int, int> range() const {
UASSERT_OBJ(VN_IS(m_nodep, SliceSel), m_nodep, "not slice sel"); UASSERT_OBJ(VN_IS(m_nodep, SliceSel), m_nodep, "not slice sel");
return std::make_pair(m_msb, m_lsb); return std::make_pair(m_msb, m_lsb);
@ -318,9 +318,9 @@ public:
// Compare AstVar* to get deterministic ordering when showing messages. // Compare AstVar* to get deterministic ordering when showing messages.
struct AstNodeComparator { struct AstNodeComparator {
bool operator()(const AstNode* a, const AstNode* b) const { bool operator()(const AstNode* ap, const AstNode* bp) const {
const FileLine* afp = a->fileline(); const FileLine* afp = ap->fileline();
const FileLine* bfp = b->fileline(); const FileLine* bfp = bp->fileline();
if (afp->firstLineno() != bfp->firstLineno()) if (afp->firstLineno() != bfp->firstLineno())
return afp->firstLineno() < bfp->firstLineno(); return afp->firstLineno() < bfp->firstLineno();
if (afp->firstColumn() != bfp->firstColumn()) if (afp->firstColumn() != bfp->firstColumn())
@ -331,7 +331,7 @@ struct AstNodeComparator {
// The comparison of this pointer may differ on different run, // The comparison of this pointer may differ on different run,
// but this is just warning message order. (mostly for CI) // but this is just warning message order. (mostly for CI)
// Verilated result is same anyway. // Verilated result is same anyway.
return a < b; return ap < bp;
} }
}; };
@ -395,7 +395,7 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
UnpackRefMap m_refs; UnpackRefMap m_refs;
AstNodeModule* m_modp; AstNodeModule* m_modp;
// AstNodeStmt, AstCell, AstNodeFTaskRef, or AstAlways(Public) for sensitivity // AstNodeStmt, AstCell, AstNodeFTaskRef, or AstAlways(Public) for sensitivity
AstNode* m_context; AstNode* m_contextp;
AstNodeFTask* m_inFTask; AstNodeFTask* m_inFTask;
size_t m_numSplit; size_t m_numSplit;
// List for SplitPackedVarVisitor // List for SplitPackedVarVisitor
@ -414,11 +414,11 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
} }
void setContextAndIterateChildren(AstNode* nodep) { void setContextAndIterateChildren(AstNode* nodep) {
const ContextKeeper keeper(&m_context, nodep); const ContextKeeper keeper(&m_contextp, nodep);
iterateChildren(nodep); iterateChildren(nodep);
} }
void setContextAndIterate(AstNode* context, AstNode* nodep) { void setContextAndIterate(AstNode* contextp, AstNode* nodep) {
const ContextKeeper keeper(&m_context, context); const ContextKeeper keeper(&m_contextp, contextp);
iterate(nodep); iterate(nodep);
} }
void pushDeletep(AstNode* nodep) { // overriding AstNVisitor::pusDeletep() void pushDeletep(AstNode* nodep) { // overriding AstNVisitor::pusDeletep()
@ -446,7 +446,7 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
UINFO(4, "Skip " << nodep->prettyNameQ() << "\n"); UINFO(4, "Skip " << nodep->prettyNameQ() << "\n");
return; return;
} }
UASSERT_OBJ(m_modp == NULL, m_modp, "Nested module declration"); UASSERT_OBJ(!m_modp, m_modp, "Nested module declration");
UASSERT_OBJ(m_refs.empty(), nodep, "The last module didn't finish split()"); UASSERT_OBJ(m_refs.empty(), nodep, "The last module didn't finish split()");
m_modp = nodep; m_modp = nodep;
iterateChildren(nodep); iterateChildren(nodep);
@ -468,24 +468,24 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
if (AstNode* bodysp = nodep->bodysp()) iterate(bodysp); if (AstNode* bodysp = nodep->bodysp()) iterate(bodysp);
} }
virtual void visit(AstNodeFTaskRef* nodep) VL_OVERRIDE { virtual void visit(AstNodeFTaskRef* nodep) VL_OVERRIDE {
const ContextKeeper keeper(&m_context, nodep); const ContextKeeper keeper(&m_contextp, nodep);
AstNodeFTask* ftaskp = nodep->taskp(); AstNodeFTask* ftaskp = nodep->taskp();
// Iterate arguments of a function/task. // Iterate arguments of a function/task.
for (AstNode *arg = nodep->pinsp(), *param = ftaskp->stmtsp(); arg && param; for (AstNode *argp = nodep->pinsp(), *paramp = ftaskp->stmtsp(); argp && paramp;
arg = arg->nextp(), param = param->nextp()) { argp = argp->nextp(), paramp = paramp->nextp()) {
bool ok = false; bool ok = false;
const char* reason = NULL; const char* reason = NULL;
if (AstVar* vparam = VN_CAST(param, Var)) { if (AstVar* vparamp = VN_CAST(paramp, Var)) {
reason = cannotSplitVarDirectionReason(vparam->direction()); reason = cannotSplitVarDirectionReason(vparamp->direction());
if (!reason) iterate(arg); if (!reason) iterate(argp);
} }
if (reason) { if (reason) {
m_foundTargetVar.clear(); m_foundTargetVar.clear();
iterate(arg); iterate(argp);
for (VarSet::iterator it = m_foundTargetVar.begin(), for (VarSet::iterator it = m_foundTargetVar.begin(),
it_end = m_foundTargetVar.end(); it_end = m_foundTargetVar.end();
it != it_end; ++it) { it != it_end; ++it) {
arg->v3warn(SPLITVAR, (*it)->prettyNameQ() << notSplitMsg << reason << ".\n"); argp->v3warn(SPLITVAR, (*it)->prettyNameQ() << notSplitMsg << reason << ".\n");
m_refs.remove(*it); m_refs.remove(*it);
} }
m_foundTargetVar.clear(); m_foundTargetVar.clear();
@ -525,7 +525,9 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
} }
virtual void visit(AstVarRef* nodep) VL_OVERRIDE { virtual void visit(AstVarRef* nodep) VL_OVERRIDE {
if (!nodep->varp()->attrSplitVar()) return; // Nothing to do if (!nodep->varp()->attrSplitVar()) return; // Nothing to do
if (m_refs.tryAdd(m_context, nodep, m_inFTask)) { m_foundTargetVar.insert(nodep->varp()); } if (m_refs.tryAdd(m_contextp, nodep, m_inFTask)) {
m_foundTargetVar.insert(nodep->varp());
}
m_refsForPackedSplit[m_modp].add(nodep); m_refsForPackedSplit[m_modp].add(nodep);
} }
virtual void visit(AstSel* nodep) VL_OVERRIDE { virtual void visit(AstSel* nodep) VL_OVERRIDE {
@ -538,7 +540,7 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
if (indexp) { // OK if (indexp) { // OK
UINFO(4, "add " << nodep << " for " << refp->varp()->prettyName() << "\n"); UINFO(4, "add " << nodep << " for " << refp->varp()->prettyName() << "\n");
if (indexp->toUInt() < outerMostSizeOfUnpackedArray(refp->varp())) { if (indexp->toUInt() < outerMostSizeOfUnpackedArray(refp->varp())) {
m_refs.tryAdd(m_context, refp, nodep, indexp->toSInt(), m_inFTask); m_refs.tryAdd(m_contextp, refp, nodep, indexp->toSInt(), m_inFTask);
} else { } else {
nodep->bitp()->v3warn(SPLITVAR, refp->prettyNameQ() nodep->bitp()->v3warn(SPLITVAR, refp->prettyNameQ()
<< notSplitMsg << notSplitMsg
@ -563,7 +565,7 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
if (dtypep->lsb() <= nodep->declRange().lo() if (dtypep->lsb() <= nodep->declRange().lo()
&& nodep->declRange().hi() <= dtypep->msb()) { // Range is ok && nodep->declRange().hi() <= dtypep->msb()) { // Range is ok
UINFO(4, "add " << nodep << " for " << refp->varp()->prettyName() << "\n"); UINFO(4, "add " << nodep << " for " << refp->varp()->prettyName() << "\n");
m_refs.tryAdd(m_context, refp, nodep, nodep->declRange().hi(), m_refs.tryAdd(m_contextp, refp, nodep, nodep->declRange().hi(),
nodep->declRange().lo(), m_inFTask); nodep->declRange().lo(), m_inFTask);
} else { } else {
nodep->v3warn(SPLITVAR, refp->prettyNameQ() nodep->v3warn(SPLITVAR, refp->prettyNameQ()
@ -622,7 +624,7 @@ class SplitUnpackedVarVisitor : public AstNVisitor {
// Continuous assignment must be in module context. // Continuous assignment must be in module context.
varp->addNextHere(newassignp); varp->addNextHere(newassignp);
} }
UASSERT_OBJ(!m_context, m_context, "must be null"); UASSERT_OBJ(!m_contextp, m_contextp, "must be null");
setContextAndIterate(newassignp, refp); setContextAndIterate(newassignp, refp);
} }
return newVarRef(nodep->fileline(), varp, lvalue); return newVarRef(nodep->fileline(), varp, lvalue);
@ -741,7 +743,7 @@ public:
explicit SplitUnpackedVarVisitor(AstNetlist* nodep) explicit SplitUnpackedVarVisitor(AstNetlist* nodep)
: m_refs() : m_refs()
, m_modp(NULL) , m_modp(NULL)
, m_context(NULL) , m_contextp(NULL)
, m_inFTask(NULL) , m_inFTask(NULL)
, m_numSplit(0) { , m_numSplit(0) {
iterate(nodep); iterate(nodep);
@ -1032,25 +1034,27 @@ class SplitPackedVarVisitor : public AstNVisitor {
return selp; return selp;
} }
} }
static void connectPortAndVar(const std::vector<SplitNewVar>& vars, AstVar* port, static void connectPortAndVar(const std::vector<SplitNewVar>& vars, AstVar* portp,
AstNode* insertp) { AstNode* insertp) {
for (; insertp; insertp = insertp->backp()) { for (; insertp; insertp = insertp->backp()) {
if (AstNodeStmt* stmtp = VN_CAST(insertp, NodeStmt)) { if (AstNodeStmt* stmtp = VN_CAST(insertp, NodeStmt)) {
if (stmtp->isStatement()) break; if (stmtp->isStatement()) break;
} }
} }
const bool in = port->isReadOnly(); const bool in = portp->isReadOnly();
for (size_t i = 0; i < vars.size(); ++i) { for (size_t i = 0; i < vars.size(); ++i) {
AstNode* rhs = new AstSel(port->fileline(), new AstVarRef(port->fileline(), port, !in), AstNode* rhsp = new AstSel(portp->fileline(),
vars[i].lsb(), vars[i].bitwidth()); new AstVarRef(portp->fileline(), portp, !in),
AstNode* lhs = new AstVarRef(port->fileline(), vars[i].varp(), in); vars[i].lsb(), vars[i].bitwidth());
if (!in) std::swap(lhs, rhs); AstNode* lhsp = new AstVarRef(portp->fileline(), vars[i].varp(), in);
AstNodeAssign* assignp = newAssign(port->fileline(), lhs, rhs, port); if (!in) std::swap(lhsp, rhsp);
AstNodeAssign* assignp = newAssign(portp->fileline(), lhsp, rhsp, portp);
if (insertp) { if (insertp) {
if (in) if (in) {
insertp->addHereThisAsNext(assignp); insertp->addHereThisAsNext(assignp);
else } else {
insertp->addNextHere(assignp); insertp->addNextHere(assignp);
}
} else { } else {
vars[i].varp()->addNextHere(assignp); vars[i].varp()->addNextHere(assignp);
} }
@ -1105,35 +1109,35 @@ class SplitPackedVarVisitor : public AstNVisitor {
UASSERT_OBJ(varit != vars.end(), refit->nodep(), "Not found"); UASSERT_OBJ(varit != vars.end(), refit->nodep(), "Not found");
UASSERT(!(varit->msb() < refit->lsb() || refit->msb() < varit->lsb()), UASSERT(!(varit->msb() < refit->lsb() || refit->msb() < varit->lsb()),
"wrong search result"); "wrong search result");
AstNode* prev; AstNode* prevp;
bool inSentitivityList = false; bool inSentitivityList = false;
if (AstSenItem* senitemp = refit->backSenItemp()) { if (AstSenItem* senitemp = refit->backSenItemp()) {
AstNode* oldsenrefp = senitemp->sensp(); AstNode* oldsenrefp = senitemp->sensp();
oldsenrefp->replaceWith(new AstVarRef(senitemp->fileline(), varit->varp(), false)); oldsenrefp->replaceWith(new AstVarRef(senitemp->fileline(), varit->varp(), false));
VL_DO_DANGLING(oldsenrefp->deleteTree(), oldsenrefp); VL_DO_DANGLING(oldsenrefp->deleteTree(), oldsenrefp);
prev = senitemp; prevp = senitemp;
inSentitivityList = true; inSentitivityList = true;
} else { } else {
prev = extractBits(*refit, *varit, lvalue); prevp = extractBits(*refit, *varit, lvalue);
} }
for (int residue = refit->msb() - varit->msb(); residue > 0; for (int residue = refit->msb() - varit->msb(); residue > 0;
residue -= varit->bitwidth()) { residue -= varit->bitwidth()) {
++varit; ++varit;
UASSERT_OBJ(varit != vars.end(), refit->nodep(), "not enough split variables"); UASSERT_OBJ(varit != vars.end(), refit->nodep(), "not enough split variables");
if (AstSenItem* senitemp = VN_CAST(prev, SenItem)) { if (AstSenItem* senitemp = VN_CAST(prevp, SenItem)) {
prev = new AstSenItem(senitemp->fileline(), senitemp->edgeType(), prevp = new AstSenItem(senitemp->fileline(), senitemp->edgeType(),
new AstVarRef(senitemp->fileline(), varit->varp(), false)); new AstVarRef(senitemp->fileline(), varit->varp(), false));
senitemp->addNextHere(prev); senitemp->addNextHere(prevp);
} else { } else {
AstNode* bitsp = extractBits(*refit, *varit, lvalue); AstNode* bitsp = extractBits(*refit, *varit, lvalue);
prev = new AstConcat(refit->nodep()->fileline(), bitsp, prev); prevp = new AstConcat(refit->nodep()->fileline(), bitsp, prevp);
} }
} }
// If varp is an argument of task/func, need to update temporary var // If varp is an argument of task/func, need to update temporary var
// everytime the var is updated. See also another call of connectPortAndVar() in split(). // everytime the var is updated. See also another call of connectPortAndVar() in split().
if (varp->isIO() && (varp->isFuncLocal() || varp->isFuncReturn())) if (varp->isIO() && (varp->isFuncLocal() || varp->isFuncReturn()))
connectPortAndVar(vars, varp, refit->nodep()); connectPortAndVar(vars, varp, refit->nodep());
if (!inSentitivityList) refit->replaceNodeWith(prev); if (!inSentitivityList) refit->replaceNodeWith(prevp);
UASSERT_OBJ(varit->msb() >= refit->msb(), varit->varp(), "Out of range"); UASSERT_OBJ(varit->msb() >= refit->msb(), varit->varp(), "Out of range");
} }
} }
@ -1164,15 +1168,16 @@ class SplitPackedVarVisitor : public AstNVisitor {
connectPortAndVar(vars, varp, NULL); connectPortAndVar(vars, varp, NULL);
} else if (varp->isTrace()) { } else if (varp->isTrace()) {
// Let's reuse the original variable for tracing // Let's reuse the original variable for tracing
AstNode* rhs AstNode* rhsp
= new AstVarRef(vars.front().varp()->fileline(), vars.front().varp(), false); = new AstVarRef(vars.front().varp()->fileline(), vars.front().varp(), false);
for (size_t i = 1; i < vars.size(); ++i) { for (size_t i = 1; i < vars.size(); ++i) {
rhs = new AstConcat(varp->fileline(), rhsp = new AstConcat(varp->fileline(),
new AstVarRef(varp->fileline(), vars[i].varp(), false), new AstVarRef(varp->fileline(), vars[i].varp(), false),
rhs); rhsp);
} }
varp->addNextHere(newAssign(varp->fileline(), varp->addNextHere(newAssign(varp->fileline(),
new AstVarRef(varp->fileline(), varp, true), rhs, varp)); new AstVarRef(varp->fileline(), varp, true),
rhsp, varp));
} else { // the original variable is not used anymore. } else { // the original variable is not used anymore.
VL_DO_DANGLING(varp->unlinkFrBack()->deleteTree(), varp); VL_DO_DANGLING(varp->unlinkFrBack()->deleteTree(), varp);
} }