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);
} }
} }
@ -351,7 +353,7 @@ private:
vscp->user1( vscp->user1() | VU_LVDLY); vscp->user1( vscp->user1() | VU_LVDLY);
if (m_checkOnly) varRefCb (nodep); if (m_checkOnly) varRefCb (nodep);
} }
} else { // nondly asn } else { // nondly asn
if (!(vscp->user1() & VU_LV)) { if (!(vscp->user1() & VU_LV)) {
if (!m_params && (vscp->user1() & VU_RV)) clearOptimizable(nodep,"Var read & write"); if (!m_params && (vscp->user1() & VU_RV)) clearOptimizable(nodep,"Var read & write");
vscp->user1( vscp->user1() | VU_LV); vscp->user1( vscp->user1() | VU_LV);
@ -364,16 +366,16 @@ private:
vscp->user1( vscp->user1() | VU_RV); vscp->user1( vscp->user1() | VU_RV);
bool isConst = nodep->varp()->isParam(); bool isConst = nodep->varp()->isParam();
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);
} }
} }
} }
if (!m_checkOnly && optimizable()) { // simulating if (!m_checkOnly && optimizable()) { // simulating
if (nodep->lvalue()) { if (nodep->lvalue()) {
nodep->v3fatalSrc("LHS varref should be handled in AstAssign visitor."); nodep->v3fatalSrc("LHS varref should be handled in AstAssign visitor.");
} else { } else {
@ -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()));
} }
} }
} }
@ -768,7 +773,7 @@ private:
UINFO(5," FUNCREF "<<nodep<<endl); UINFO(5," FUNCREF "<<nodep<<endl);
if (!m_params) { badNodeType(nodep); return; } if (!m_params) { badNodeType(nodep); return; }
AstNodeFTask* funcp = VN_CAST(nodep->taskp(), NodeFTask); if (!funcp) nodep->v3fatalSrc("Not linked"); AstNodeFTask* funcp = VN_CAST(nodep->taskp(), NodeFTask); if (!funcp) nodep->v3fatalSrc("Not linked");
if (m_params) { V3Width::widthParamsEdit(funcp); } VL_DANGLING(funcp); // Make sure we've sized the function if (m_params) { V3Width::widthParamsEdit(funcp); } VL_DANGLING(funcp); // Make sure we've sized the function
funcp = VN_CAST(nodep->taskp(), NodeFTask); if (!funcp) nodep->v3fatalSrc("Not linked"); funcp = VN_CAST(nodep->taskp(), NodeFTask); if (!funcp) nodep->v3fatalSrc("Not linked");
// Apply function call values to function // Apply function call values to function
V3TaskConnects tconnects = V3Task::taskConnects(nodep, nodep->taskp()->stmtsp()); V3TaskConnects tconnects = V3Task::taskConnects(nodep, nodep->taskp()->stmtsp());
@ -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()));
} }
} }
@ -833,9 +838,9 @@ private:
for (; pos != format.end(); ++pos) { for (; pos != format.end(); ++pos) {
if (!inPct && pos[0] == '%') { if (!inPct && pos[0] == '%') {
inPct = true; inPct = true;
} else if (!inPct) { // Normal text } else if (!inPct) { // Normal text
result += *pos; result += *pos;
} else { // Format character } else { // Format character
inPct = false; inPct = false;
if (V3Number::displayedFmtLegal(tolower(pos[0]))) { if (V3Number::displayedFmtLegal(tolower(pos[0]))) {
@ -927,7 +932,7 @@ public:
SimulateVisitor() { SimulateVisitor() {
// Note AstUser#InUse ensures only one invocation exists at once // Note AstUser#InUse ensures only one invocation exists at once
setMode(false,false,false); setMode(false,false,false);
clear(); // We reuse this structure in the main loop, so put initializers inside clear() clear(); // We reuse this structure in the main loop, so put initializers inside clear()
} }
void clear() { void clear() {
m_whyNotOptimizable = ""; m_whyNotOptimizable = "";
@ -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;
@ -975,4 +980,4 @@ public:
} }
}; };
#endif // Guard #endif // Guard