diff --git a/vhdlpp/sequential.cc b/vhdlpp/sequential.cc index 9d5d8d6e3..f5d4509eb 100644 --- a/vhdlpp/sequential.cc +++ b/vhdlpp/sequential.cc @@ -20,6 +20,14 @@ # include "sequential.h" # include "expression.h" +template +inline static void visit_stmt_list(std::list& stmts, void((*func))(SequentialStmt*)) +{ + for(typename std::list::iterator it = stmts.begin(); it != stmts.end(); ++it) { + (*it)->visit(func); + } +} + SequentialStmt::SequentialStmt() { } @@ -75,6 +83,14 @@ void IfSequential::extract_false(std::list&that) } } +void IfSequential::visit(void((*func))(SequentialStmt*)) +{ + visit_stmt_list(if_, func); + visit_stmt_list(elsif_, func); + visit_stmt_list(else_, func); + ((*func))(this); +} + IfSequential::Elsif::Elsif(Expression*cond, std::list*tr) : cond_(cond) { @@ -91,6 +107,11 @@ IfSequential::Elsif::~Elsif() } } +void IfSequential::Elsif::visit(void((*func))(SequentialStmt*)) +{ + visit_stmt_list(if_, func); +} + SignalSeqAssignment::SignalSeqAssignment(Expression*sig, std::list*wav) { lval_ = sig; @@ -118,6 +139,12 @@ CaseSeqStmt::~CaseSeqStmt() } } +void CaseSeqStmt::visit(void((*func))(SequentialStmt*)) +{ + visit_stmt_list(alt_, func); + ((*func))(this); +} + CaseSeqStmt::CaseStmtAlternative::CaseStmtAlternative(Expression* exp, list* stmts) : exp_(exp) { @@ -134,6 +161,11 @@ CaseSeqStmt::CaseStmtAlternative::~CaseStmtAlternative() } } +void CaseSeqStmt::CaseStmtAlternative::visit(void((*func))(SequentialStmt*)) +{ + visit_stmt_list(stmts_, func); +} + ProcedureCall::ProcedureCall(perm_string name) : name_(name), param_list_(0) { @@ -178,6 +210,12 @@ LoopStatement::~LoopStatement() } } +void LoopStatement::visit(void((*func))(SequentialStmt*)) +{ + visit_stmt_list(stmts_, func); + (*func)(this); +} + ForLoopStatement::ForLoopStatement(perm_string scope_name, perm_string it, prange_t* range, list* stmts) : LoopStatement(scope_name, stmts), it_(it), range_(range) { diff --git a/vhdlpp/sequential.h b/vhdlpp/sequential.h index 51973d159..881c9b002 100644 --- a/vhdlpp/sequential.h +++ b/vhdlpp/sequential.h @@ -38,6 +38,7 @@ class SequentialStmt : public LineInfo { virtual int elaborate(Entity*ent, Architecture*arc); virtual int emit(ostream&out, Entity*entity, Architecture*arc); virtual void dump(ostream&out, int indent) const; + virtual void visit(void(*func)(SequentialStmt*)) { (*func)(this); } }; /* @@ -52,6 +53,7 @@ class LoopStatement : public SequentialStmt { inline perm_string loop_name() const { return name_; } void dump(ostream&out, int indent) const; + void visit(void(*func)(SequentialStmt*)); protected: int elaborate_substatements(Entity*ent, Architecture*arc); @@ -75,6 +77,7 @@ class IfSequential : public SequentialStmt { int statement_emit(ostream&out, Entity*entity, Architecture*arc); void dump(ostream&out, int indent) const; + void visit(void(*func)(SequentialStmt*)); private: Expression*cond_; @@ -94,6 +97,7 @@ class IfSequential : public SequentialStmt { int elaborate(Entity*ent, Architecture*arc); int emit(ostream&out, Entity*entity, Architecture*arc); void dump(ostream&out, int indent) const; + void visit(void(*func)(SequentialStmt*)); const Expression*peek_condition() const { return cond_; } @@ -151,6 +155,7 @@ class CaseSeqStmt : public SequentialStmt { int elaborate_expr(Entity*ent, Architecture*arc, const VType*ltype); int elaborate(Entity*ent, Architecture*arc); int emit(ostream&out, Entity*entity, Architecture*arc); + void visit(void(*func)(SequentialStmt*)); private: Expression* exp_; @@ -168,6 +173,7 @@ class CaseSeqStmt : public SequentialStmt { void dump(ostream&out, int indent) const; int elaborate(Entity*ent, Architecture*arc); int emit(ostream&out, Entity*entity, Architecture*arc); + void visit(void(*func)(SequentialStmt*)); private: Expression* cond_;