vhdlpp: Visitor for SequentialStmt.

This commit is contained in:
Maciej Suminski 2015-01-19 16:12:04 +01:00
parent a02ebc3114
commit e6b22a2bea
2 changed files with 44 additions and 0 deletions

View File

@ -20,6 +20,14 @@
# include "sequential.h"
# include "expression.h"
template<typename T>
inline static void visit_stmt_list(std::list<T*>& stmts, void((*func))(SequentialStmt*))
{
for(typename std::list<T*>::iterator it = stmts.begin(); it != stmts.end(); ++it) {
(*it)->visit(func);
}
}
SequentialStmt::SequentialStmt()
{
}
@ -75,6 +83,14 @@ void IfSequential::extract_false(std::list<SequentialStmt*>&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<SequentialStmt*>*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<Expression*>*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<SequentialStmt*>* 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<SequentialStmt*>* stmts)
: LoopStatement(scope_name, stmts), it_(it), range_(range)
{

View File

@ -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_;