mirror of
https://github.com/verilator/verilator.git
synced 2026-09-01 10:27:04 +02:00
Strengthen AstNode types to AstNodeExpr
Declare every AstNode children and variables as AstNodeExpr where we statically know this is the appropriate sub-type.
This commit is contained in:
+11
-11
@@ -46,11 +46,11 @@ VL_DEFINE_DEBUG_FUNCTIONS;
|
||||
class ConvertWriteRefsToRead final : public VNVisitor {
|
||||
private:
|
||||
// MEMBERS
|
||||
AstNode* m_result = nullptr;
|
||||
AstNodeExpr* m_result = nullptr;
|
||||
|
||||
// CONSTRUCTORS
|
||||
explicit ConvertWriteRefsToRead(AstNode* nodep) {
|
||||
m_result = iterateSubtreeReturnEdits(nodep);
|
||||
explicit ConvertWriteRefsToRead(AstNodeExpr* nodep) {
|
||||
m_result = VN_AS(iterateSubtreeReturnEdits(nodep), NodeExpr);
|
||||
}
|
||||
|
||||
// VISITORS
|
||||
@@ -65,7 +65,7 @@ private:
|
||||
void visit(AstNode* nodep) override { iterateChildren(nodep); }
|
||||
|
||||
public:
|
||||
static AstNode* main(AstNode* nodep) { return ConvertWriteRefsToRead(nodep).m_result; }
|
||||
static AstNodeExpr* main(AstNodeExpr* nodep) { return ConvertWriteRefsToRead(nodep).m_result; }
|
||||
};
|
||||
|
||||
//######################################################################
|
||||
@@ -82,11 +82,11 @@ private:
|
||||
|
||||
// METHODS
|
||||
|
||||
AstNode* createSenseEquation(AstSenItem* nodesp) {
|
||||
AstNode* senEqnp = nullptr;
|
||||
AstNodeExpr* createSenseEquation(AstSenItem* nodesp) {
|
||||
AstNodeExpr* senEqnp = nullptr;
|
||||
for (AstSenItem* senp = nodesp; senp; senp = VN_AS(senp->nextp(), SenItem)) {
|
||||
UASSERT_OBJ(senp->edgeType() == VEdgeType::ET_TRUE, senp, "Should have been lowered");
|
||||
AstNode* const senOnep = senp->sensp()->cloneTree(false);
|
||||
AstNodeExpr* const senOnep = senp->sensp()->cloneTree(false);
|
||||
senEqnp = senEqnp ? new AstOr{senp->fileline(), senEqnp, senOnep} : senOnep;
|
||||
}
|
||||
return senEqnp;
|
||||
@@ -111,7 +111,7 @@ private:
|
||||
return newvscp;
|
||||
}
|
||||
AstIf* makeActiveIf(AstSenTree* sensesp) {
|
||||
AstNode* const senEqnp = createSenseEquation(sensesp->sensesp());
|
||||
AstNodeExpr* const senEqnp = createSenseEquation(sensesp->sensesp());
|
||||
UASSERT_OBJ(senEqnp, sensesp, "No sense equation, shouldn't be in sequent activation.");
|
||||
AstIf* const newifp = new AstIf{sensesp->fileline(), senEqnp};
|
||||
return newifp;
|
||||
@@ -126,9 +126,9 @@ private:
|
||||
// COVERTOGGLE(INC, ORIG, CHANGE) ->
|
||||
// IF(ORIG ^ CHANGE) { INC; CHANGE = ORIG; }
|
||||
AstNode* const incp = nodep->incp()->unlinkFrBack();
|
||||
AstNode* const origp = nodep->origp()->unlinkFrBack();
|
||||
AstNode* const changeWrp = nodep->changep()->unlinkFrBack();
|
||||
AstNode* const changeRdp = ConvertWriteRefsToRead::main(changeWrp->cloneTree(false));
|
||||
AstNodeExpr* const origp = nodep->origp()->unlinkFrBack();
|
||||
AstNodeExpr* const changeWrp = nodep->changep()->unlinkFrBack();
|
||||
AstNodeExpr* const changeRdp = ConvertWriteRefsToRead::main(changeWrp->cloneTree(false));
|
||||
AstIf* const newp
|
||||
= new AstIf{nodep->fileline(), new AstXor{nodep->fileline(), origp, changeRdp}, incp};
|
||||
// We could add another IF to detect posedges, and only increment if so.
|
||||
|
||||
Reference in New Issue
Block a user