1
0
mirror of https://github.com/verilator/verilator.git synced 2025-04-11 23:46:55 +00:00

Fix table optimizing logic with side effect ( prep)

This commit is contained in:
Wilson Snyder 2024-07-02 09:22:32 -04:00
parent 85356f464f
commit 8bffb8c391
2 changed files with 8 additions and 10 deletions

View File

@ -107,7 +107,7 @@ private:
bool m_anyAssignDly; ///< True if found a delayed assignment bool m_anyAssignDly; ///< True if found a delayed assignment
bool m_anyAssignComb; ///< True if found a non-delayed assignment bool m_anyAssignComb; ///< True if found a non-delayed assignment
bool m_inDlyAssign; ///< Under delayed assignment bool m_inDlyAssign; ///< Under delayed assignment
bool m_isOutputter; // Creates output bool m_isImpure; // Not pure
int m_instrCount; ///< Number of nodes int m_instrCount; ///< Number of nodes
int m_dataCount; ///< Bytes of data int m_dataCount; ///< Bytes of data
AstJumpGo* m_jumpp = nullptr; ///< Jump label we're branching from AstJumpGo* m_jumpp = nullptr; ///< Jump label we're branching from
@ -214,7 +214,7 @@ public:
AstNode* whyNotNodep() const { return m_whyNotNodep; } AstNode* whyNotNodep() const { return m_whyNotNodep; }
bool isAssignDly() const { return m_anyAssignDly; } bool isAssignDly() const { return m_anyAssignDly; }
bool isOutputter() const { return m_isOutputter; } bool isImpure() const { return m_isImpure; }
int instrCount() const { return m_instrCount; } int instrCount() const { return m_instrCount; }
int dataCount() const { return m_dataCount; } int dataCount() const { return m_dataCount; }
@ -359,7 +359,7 @@ private:
// UINFO(9, " !predictopt " << nodep << endl); // UINFO(9, " !predictopt " << nodep << endl);
clearOptimizable(nodep, "Isn't predictable"); clearOptimizable(nodep, "Isn't predictable");
} }
if (nodep->isOutputter()) m_isOutputter = true; if (!nodep->isPure()) m_isImpure = true;
} }
void knownBadNodeType(AstNode* nodep) { void knownBadNodeType(AstNode* nodep) {
@ -1231,7 +1231,7 @@ public:
m_anyAssignComb = false; m_anyAssignComb = false;
m_anyAssignDly = false; m_anyAssignDly = false;
m_inDlyAssign = false; m_inDlyAssign = false;
m_isOutputter = false; m_isImpure = false;
m_instrCount = 0; m_instrCount = 0;
m_dataCount = 0; m_dataCount = 0;
m_jumpp = nullptr; m_jumpp = nullptr;

View File

@ -209,6 +209,10 @@ private:
// Instruction count bytes (ok, it's space also not time :) // Instruction count bytes (ok, it's space also not time :)
const double time // max(_, 1), so we won't divide by zero const double time // max(_, 1), so we won't divide by zero
= std::max<double>(chkvis.instrCount() * TABLE_BYTES_PER_INST + chkvis.dataCount(), 1); = std::max<double>(chkvis.instrCount() * TABLE_BYTES_PER_INST + chkvis.dataCount(), 1);
if (chkvis.isImpure()) chkvis.clearOptimizable(nodep, "Table creates side effects");
if (!m_outWidthBytes || !m_inWidthBits) {
chkvis.clearOptimizable(nodep, "Table has no outputs");
}
if (chkvis.instrCount() < TABLE_MIN_NODE_COUNT) { if (chkvis.instrCount() < TABLE_MIN_NODE_COUNT) {
chkvis.clearOptimizable(nodep, "Table has too few nodes involved"); chkvis.clearOptimizable(nodep, "Table has too few nodes involved");
} }
@ -221,12 +225,6 @@ private:
if (m_totalBytes > TABLE_TOTAL_BYTES) { if (m_totalBytes > TABLE_TOTAL_BYTES) {
chkvis.clearOptimizable(nodep, "Table out of memory"); chkvis.clearOptimizable(nodep, "Table out of memory");
} }
if (!m_outWidthBytes || !m_inWidthBits) {
chkvis.clearOptimizable(nodep, "Table has no outputs");
}
if (chkvis.isOutputter()) {
chkvis.clearOptimizable(nodep, "Table creates display output");
}
UINFO(4, " Test: Opt=" << (chkvis.optimizable() ? "OK" : "NO") << ", Instrs=" UINFO(4, " Test: Opt=" << (chkvis.optimizable() ? "OK" : "NO") << ", Instrs="
<< chkvis.instrCount() << " Data=" << chkvis.dataCount() << chkvis.instrCount() << " Data=" << chkvis.dataCount()
<< " in width (bits)=" << m_inWidthBits << " out width (bytes)=" << " in width (bits)=" << m_inWidthBits << " out width (bytes)="