vhdlpp: Visitor for SequentialStmt.
This commit is contained in:
parent
a02ebc3114
commit
e6b22a2bea
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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_;
|
||||
|
|
|
|||
Loading…
Reference in New Issue