Internals: V3Simulate refactoring prep for future work. No functional change.
This commit is contained in:
parent
159c653b4b
commit
1f5913a83c
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue