vhdlpp: Improved SequentialStmt visitor.
This commit is contained in:
parent
b05a19dffc
commit
ff5b696569
|
|
@ -21,7 +21,7 @@
|
|||
# include "expression.h"
|
||||
|
||||
template<typename T>
|
||||
inline static void visit_stmt_list(std::list<T*>& stmts, void((*func))(SequentialStmt*))
|
||||
inline static void visit_stmt_list(std::list<T*>& stmts, SeqStmtVisitor& func)
|
||||
{
|
||||
for(typename std::list<T*>::iterator it = stmts.begin(); it != stmts.end(); ++it) {
|
||||
(*it)->visit(func);
|
||||
|
|
@ -83,12 +83,12 @@ void IfSequential::extract_false(std::list<SequentialStmt*>&that)
|
|||
}
|
||||
}
|
||||
|
||||
void IfSequential::visit(void((*func))(SequentialStmt*))
|
||||
void IfSequential::visit(SeqStmtVisitor& func)
|
||||
{
|
||||
visit_stmt_list(if_, func);
|
||||
visit_stmt_list(elsif_, func);
|
||||
visit_stmt_list(else_, func);
|
||||
((*func))(this);
|
||||
func(this);
|
||||
}
|
||||
|
||||
IfSequential::Elsif::Elsif(Expression*cond, std::list<SequentialStmt*>*tr)
|
||||
|
|
@ -107,7 +107,7 @@ IfSequential::Elsif::~Elsif()
|
|||
}
|
||||
}
|
||||
|
||||
void IfSequential::Elsif::visit(void((*func))(SequentialStmt*))
|
||||
void IfSequential::Elsif::visit(SeqStmtVisitor& func)
|
||||
{
|
||||
visit_stmt_list(if_, func);
|
||||
}
|
||||
|
|
@ -139,10 +139,10 @@ CaseSeqStmt::~CaseSeqStmt()
|
|||
}
|
||||
}
|
||||
|
||||
void CaseSeqStmt::visit(void((*func))(SequentialStmt*))
|
||||
void CaseSeqStmt::visit(SeqStmtVisitor& func)
|
||||
{
|
||||
visit_stmt_list(alt_, func);
|
||||
((*func))(this);
|
||||
func(this);
|
||||
}
|
||||
|
||||
CaseSeqStmt::CaseStmtAlternative::CaseStmtAlternative(Expression* exp, list<SequentialStmt*>* stmts)
|
||||
|
|
@ -161,7 +161,7 @@ CaseSeqStmt::CaseStmtAlternative::~CaseStmtAlternative()
|
|||
}
|
||||
}
|
||||
|
||||
void CaseSeqStmt::CaseStmtAlternative::visit(void((*func))(SequentialStmt*))
|
||||
void CaseSeqStmt::CaseStmtAlternative::visit(SeqStmtVisitor& func)
|
||||
{
|
||||
visit_stmt_list(stmts_, func);
|
||||
}
|
||||
|
|
@ -210,10 +210,10 @@ LoopStatement::~LoopStatement()
|
|||
}
|
||||
}
|
||||
|
||||
void LoopStatement::visit(void((*func))(SequentialStmt*))
|
||||
void LoopStatement::visit(SeqStmtVisitor& func)
|
||||
{
|
||||
visit_stmt_list(stmts_, func);
|
||||
(*func)(this);
|
||||
func(this);
|
||||
}
|
||||
|
||||
ForLoopStatement::ForLoopStatement(perm_string scope_name, perm_string it, prange_t* range, list<SequentialStmt*>* stmts)
|
||||
|
|
|
|||
|
|
@ -23,10 +23,17 @@
|
|||
# include "LineInfo.h"
|
||||
# include "parse_types.h"
|
||||
# include <list>
|
||||
# include <functional>
|
||||
|
||||
class Architecture;
|
||||
class Entity;
|
||||
class Expression;
|
||||
class SequentialStmt;
|
||||
|
||||
struct SeqStmtVisitor {
|
||||
virtual ~SeqStmtVisitor() {};
|
||||
virtual void operator() (SequentialStmt*s) = 0;
|
||||
};
|
||||
|
||||
class SequentialStmt : public LineInfo {
|
||||
|
||||
|
|
@ -38,7 +45,9 @@ 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); }
|
||||
|
||||
// Recursively visits a tree of sequential statements.
|
||||
virtual void visit(SeqStmtVisitor& func) { func(this); }
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
@ -53,7 +62,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*));
|
||||
void visit(SeqStmtVisitor& func);
|
||||
|
||||
protected:
|
||||
int elaborate_substatements(Entity*ent, Architecture*arc);
|
||||
|
|
@ -77,7 +86,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*));
|
||||
void visit(SeqStmtVisitor& func);
|
||||
|
||||
private:
|
||||
Expression*cond_;
|
||||
|
|
@ -97,7 +106,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*));
|
||||
void visit(SeqStmtVisitor& func);
|
||||
|
||||
const Expression*peek_condition() const { return cond_; }
|
||||
|
||||
|
|
@ -155,7 +164,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*));
|
||||
void visit(SeqStmtVisitor& func);
|
||||
|
||||
private:
|
||||
Expression* exp_;
|
||||
|
|
@ -173,7 +182,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*));
|
||||
void visit(SeqStmtVisitor& func);
|
||||
|
||||
private:
|
||||
Expression* cond_;
|
||||
|
|
|
|||
Loading…
Reference in New Issue