Internals: V3Simulate refactoring prep for future work. No functional change.

This commit is contained in:
Wilson Snyder 2018-10-05 20:20:28 -04:00
parent 159c653b4b
commit 1f5913a83c
1 changed files with 34 additions and 29 deletions

View File

@ -245,6 +245,9 @@ public:
void newNumber(AstNode* nodep, const V3Number& numr) { void newNumber(AstNode* nodep, const V3Number& numr) {
newNumber(nodep)->opAssign(numr); newNumber(nodep)->opAssign(numr);
} }
void newOutNumber(AstNode* nodep, const V3Number& numr) {
newOutNumber(nodep)->opAssign(numr);
}
V3Number* fetchNumberNull(AstNode* nodep) { V3Number* fetchNumberNull(AstNode* nodep) {
return ((V3Number*)nodep->user3p()); return ((V3Number*)nodep->user3p());
} }
@ -312,13 +315,12 @@ private:
return (m_jumpp && m_jumpp->labelp()!=nodep); return (m_jumpp && m_jumpp->labelp()!=nodep);
} }
void assignOutNumber(AstNodeAssign* nodep, AstNode* vscp, const V3Number* nump) { void assignOutNumber(AstNodeAssign* nodep, AstNode* vscp, const V3Number* nump) {
// Don't do setNumber, as value isn't yet visible to following statements
if (VN_IS(nodep, AssignDly)) { if (VN_IS(nodep, AssignDly)) {
// Don't do setNumber, as value isn't yet visible to following statements // Don't do setNumber, as value isn't yet visible to following statements
newOutNumber(vscp)->opAssign(*nump); newOutNumber(vscp, *nump);
} else { } else {
newNumber(vscp)->opAssign(*nump); newNumber(vscp, *nump);
newOutNumber(vscp)->opAssign(*nump); newOutNumber(vscp, *nump);
} }
} }
@ -366,7 +368,7 @@ private:
V3Number* nump = isConst ? fetchNumberNull(nodep->varp()->valuep()) : NULL; V3Number* nump = isConst ? fetchNumberNull(nodep->varp()->valuep()) : NULL;
if (isConst && nump) { // Propagate PARAM constants for constant function analysis if (isConst && nump) { // Propagate PARAM constants for constant function analysis
if (!m_checkOnly && optimizable()) { if (!m_checkOnly && optimizable()) {
newNumber(vscp)->opAssign(*nump); newNumber(vscp, *nump);
} }
} else { } else {
if (m_checkOnly) varRefCb (nodep); if (m_checkOnly) varRefCb (nodep);
@ -434,7 +436,7 @@ private:
if (valuep) { if (valuep) {
iterateAndNextNull(valuep); iterateAndNextNull(valuep);
if (optimizable()) { if (optimizable()) {
newNumber(nodep)->opAssign(*fetchNumber(valuep)); newNumber(nodep, *fetchNumber(valuep));
} }
} else { } else {
clearOptimizable(nodep, "No value found for enum item"); clearOptimizable(nodep, "No value found for enum item");
@ -446,7 +448,8 @@ private:
checkNodeInfo(nodep); checkNodeInfo(nodep);
iterateChildren(nodep); iterateChildren(nodep);
if (!m_checkOnly && optimizable()) { if (!m_checkOnly && optimizable()) {
nodep->numberOperate(*newNumber(nodep), *fetchNumber(nodep->lhsp())); nodep->numberOperate(*newNumber(nodep),
*fetchNumber(nodep->lhsp()));
} }
} }
virtual void visit(AstNodeBiop* nodep) { virtual void visit(AstNodeBiop* nodep) {
@ -454,7 +457,9 @@ private:
checkNodeInfo(nodep); checkNodeInfo(nodep);
iterateChildren(nodep); iterateChildren(nodep);
if (!m_checkOnly && optimizable()) { if (!m_checkOnly && optimizable()) {
nodep->numberOperate(*newNumber(nodep), *fetchNumber(nodep->lhsp()), *fetchNumber(nodep->rhsp())); nodep->numberOperate(*newNumber(nodep),
*fetchNumber(nodep->lhsp()),
*fetchNumber(nodep->rhsp()));
} }
} }
virtual void visit(AstNodeTriop* nodep) { virtual void visit(AstNodeTriop* nodep) {
@ -479,9 +484,9 @@ private:
if (optimizable()) { if (optimizable()) {
if (fetchNumber(nodep->lhsp())->isNeqZero()) { if (fetchNumber(nodep->lhsp())->isNeqZero()) {
iterate(nodep->rhsp()); iterate(nodep->rhsp());
newNumber(nodep)->opAssign(*fetchNumber(nodep->rhsp())); newNumber(nodep, *fetchNumber(nodep->rhsp()));
} else { } else {
newNumber(nodep)->opAssign(*fetchNumber(nodep->lhsp())); // a zero newNumber(nodep, *fetchNumber(nodep->lhsp())); // a zero
} }
} }
} }
@ -496,10 +501,10 @@ private:
iterate(nodep->lhsp()); iterate(nodep->lhsp());
if (optimizable()) { if (optimizable()) {
if (fetchNumber(nodep->lhsp())->isNeqZero()) { if (fetchNumber(nodep->lhsp())->isNeqZero()) {
newNumber(nodep)->opAssign(*fetchNumber(nodep->lhsp())); // a one newNumber(nodep, *fetchNumber(nodep->lhsp())); // a one
} else { } else {
iterate(nodep->rhsp()); iterate(nodep->rhsp());
newNumber(nodep)->opAssign(*fetchNumber(nodep->rhsp())); newNumber(nodep, *fetchNumber(nodep->rhsp()));
} }
} }
} }
@ -514,10 +519,10 @@ private:
iterate(nodep->lhsp()); iterate(nodep->lhsp());
if (optimizable()) { if (optimizable()) {
if (fetchNumber(nodep->lhsp())->isEqZero()) { if (fetchNumber(nodep->lhsp())->isEqZero()) {
newNumber(nodep)->opAssign(V3Number(nodep->fileline(), 1, 1)); // a one newNumber(nodep, V3Number(nodep->fileline(), 1, 1)); // a one
} else { } else {
iterate(nodep->rhsp()); iterate(nodep->rhsp());
newNumber(nodep)->opAssign(*fetchNumber(nodep->rhsp())); newNumber(nodep, *fetchNumber(nodep->rhsp()));
} }
} }
} }
@ -534,10 +539,10 @@ private:
if (optimizable()) { if (optimizable()) {
if (fetchNumber(nodep->condp())->isNeqZero()) { if (fetchNumber(nodep->condp())->isNeqZero()) {
iterate(nodep->expr1p()); iterate(nodep->expr1p());
newNumber(nodep)->opAssign(*fetchNumber(nodep->expr1p())); newNumber(nodep, *fetchNumber(nodep->expr1p()));
} else { } else {
iterate(nodep->expr2p()); iterate(nodep->expr2p());
newNumber(nodep)->opAssign(*fetchNumber(nodep->expr2p())); newNumber(nodep, *fetchNumber(nodep->expr2p()));
} }
} }
} }
@ -792,7 +797,7 @@ private:
if (pinp) { // Else too few arguments in function call - ignore it if (pinp) { // Else too few arguments in function call - ignore it
// Apply value to the function // Apply value to the function
if (!m_checkOnly && optimizable()) { if (!m_checkOnly && optimizable()) {
newNumber(portp)->opAssign(*fetchNumber(pinp)); newNumber(portp, *fetchNumber(pinp));
} }
} }
} }
@ -804,7 +809,7 @@ private:
if (!m_checkOnly && optimizable()) { if (!m_checkOnly && optimizable()) {
// Grab return value from output variable (if it's a function) // Grab return value from output variable (if it's a function)
if (!funcp->fvarp()) nodep->v3fatalSrc("Function reference points at non-function"); if (!funcp->fvarp()) nodep->v3fatalSrc("Function reference points at non-function");
newNumber(nodep)->opAssign(*fetchNumber(funcp->fvarp())); newNumber(nodep, *fetchNumber(funcp->fvarp()));
} }
} }
@ -939,9 +944,9 @@ public:
m_dataCount = 0; m_dataCount = 0;
m_jumpp = NULL; m_jumpp = NULL;
AstNode::user1ClearTree(); // user1p() used on entire tree AstNode::user1ClearTree();
AstNode::user2ClearTree(); // user2p() used on entire tree AstNode::user2ClearTree();
AstNode::user3ClearTree(); // user3p() used on entire tree AstNode::user3ClearTree();
// Move all allocated numbers to the free pool // Move all allocated numbers to the free pool
m_numFreeps = m_numAllps; m_numFreeps = m_numAllps;