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

This commit is contained in:
Wilson Snyder 2018-10-05 19:03:28 -04:00
parent 47a2e2aeb9
commit 159c653b4b
2 changed files with 14 additions and 8 deletions

View File

@ -51,16 +51,16 @@
//###################################################################### //######################################################################
// Simulate class functions // Simulate class functions
class SimulateStackNode { class SimStackNode {
public: public:
// MEMBERS // MEMBERS
AstFuncRef* m_funcp; AstFuncRef* m_funcp;
V3TaskConnects* m_tconnects; V3TaskConnects* m_tconnects;
// CONSTRUCTORS // CONSTRUCTORS
SimulateStackNode(AstFuncRef* funcp, V3TaskConnects* tconnects): SimStackNode(AstFuncRef* funcp, V3TaskConnects* tconnects):
m_funcp(funcp), m_funcp(funcp),
m_tconnects(tconnects) {} m_tconnects(tconnects) {}
~SimulateStackNode() {} ~SimStackNode() {}
}; };
class SimulateVisitor : public AstNVisitor { class SimulateVisitor : public AstNVisitor {
@ -103,7 +103,7 @@ private:
// Simulating: // Simulating:
std::deque<V3Number*> m_numFreeps; ///< List of all numbers free and not in use std::deque<V3Number*> m_numFreeps; ///< List of all numbers free and not in use
std::deque<V3Number*> m_numAllps; ///< List of all numbers free and in use std::deque<V3Number*> m_numAllps; ///< List of all numbers free and in use
std::deque<SimulateStackNode*> m_callStack; ///< Call stack for verbose error messages std::deque<SimStackNode*> m_callStack; ///< Call stack for verbose error messages
// Cleanup // Cleanup
// V3Numbers that represents strings are a bit special and the API for V3Number does not allow changing them. // V3Numbers that represents strings are a bit special and the API for V3Number does not allow changing them.
@ -178,7 +178,7 @@ public:
} }
m_whyNotOptimizable = why; m_whyNotOptimizable = why;
std::ostringstream stack; std::ostringstream stack;
for (std::deque<SimulateStackNode*>::iterator it=m_callStack.begin(); it !=m_callStack.end(); ++it) { for (std::deque<SimStackNode*>::iterator it=m_callStack.begin(); it !=m_callStack.end(); ++it) {
AstFuncRef* funcp = (*it)->m_funcp; AstFuncRef* funcp = (*it)->m_funcp;
stack<<"\nCalled from:\n"<<funcp->fileline()<<" "<<funcp->prettyName()<<"() with parameters:"; stack<<"\nCalled from:\n"<<funcp->fileline()<<" "<<funcp->prettyName()<<"() with parameters:";
V3TaskConnects* tconnects = (*it)->m_tconnects; V3TaskConnects* tconnects = (*it)->m_tconnects;
@ -242,6 +242,9 @@ public:
return (fetchOutNumber(nodep)); return (fetchOutNumber(nodep));
} }
} }
void newNumber(AstNode* nodep, const V3Number& numr) {
newNumber(nodep)->opAssign(numr);
}
V3Number* fetchNumberNull(AstNode* nodep) { V3Number* fetchNumberNull(AstNode* nodep) {
return ((V3Number*)nodep->user3p()); return ((V3Number*)nodep->user3p());
} }
@ -390,7 +393,7 @@ private:
} }
virtual void visit(AstVarXRef* nodep) { virtual void visit(AstVarXRef* nodep) {
if (jumpingOver(nodep)) return; if (jumpingOver(nodep)) return;
if (m_scoped) { badNodeType(nodep); return; } if (m_scoped) { badNodeType(nodep); return; }
else { clearOptimizable(nodep,"Language violation: Dotted hierarchical references not allowed in constant functions"); } else { clearOptimizable(nodep,"Language violation: Dotted hierarchical references not allowed in constant functions"); }
} }
virtual void visit(AstNodeFTask* nodep) { virtual void visit(AstNodeFTask* nodep) {
@ -793,7 +796,7 @@ private:
} }
} }
} }
SimulateStackNode stackNode(nodep, &tconnects); SimStackNode stackNode(nodep, &tconnects);
m_callStack.push_front(&stackNode); m_callStack.push_front(&stackNode);
// Evaluate the function // Evaluate the function
iterate(funcp); iterate(funcp);
@ -922,6 +925,7 @@ private:
public: public:
// CONSTRUCTORS // CONSTRUCTORS
SimulateVisitor() { SimulateVisitor() {
// 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()
} }

View File

@ -292,7 +292,9 @@ private:
for (std::deque<AstVarScope*>::iterator it = m_inVarps.begin(); it!=m_inVarps.end(); ++it) { for (std::deque<AstVarScope*>::iterator it = m_inVarps.begin(); it!=m_inVarps.end(); ++it) {
AstVarScope* invscp = *it; AstVarScope* invscp = *it;
// LSB is first variable, so extract it that way // LSB is first variable, so extract it that way
simvis.newNumber(invscp, VL_MASK_I(invscp->width()) & (inValue>>shift)); simvis.newNumber(invscp,
V3Number(invscp->fileline(), invscp->width(),
VL_MASK_I(invscp->width()) & (inValue>>shift)));
shift += invscp->width(); shift += invscp->width();
// We're just using32 bit arithmetic, because there's no way the input table can be 2^32 bytes! // We're just using32 bit arithmetic, because there's no way the input table can be 2^32 bytes!
if (shift>31) nodep->v3fatalSrc("shift overflow"); if (shift>31) nodep->v3fatalSrc("shift overflow");