Skip to content

Commit

Permalink
Check recursive deps in model definition.
Browse files Browse the repository at this point in the history
  • Loading branch information
joaquinffernandez committed Apr 21, 2023
1 parent 8a8b253 commit be1e5da
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 25 deletions.
44 changes: 28 additions & 16 deletions src/mmoc/ir/qss_model.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,14 +40,14 @@ namespace IR {

QSSModelGenerator::QSSModelGenerator() : _qss_model_def(), _tabs(0), _post_process_eval(false) {}

void QSSModelGenerator::setup(EquationTable eqs) { _eqs = eqs; }
void QSSModelGenerator::setup(QSSModelConfig config) { _config = config; }

void QSSModelGenerator::postProcess(SB::Deps::SetVertex vertex)
{
if (_post_process_eval) {
return;
}
EquationTable equations = _eqs;
EquationTable equations = _config.eqs;
EquationTable::iterator it;
std::stringstream simple;
std::stringstream generic;
Expand Down Expand Up @@ -77,19 +77,19 @@ void QSSModelGenerator::visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep
void QSSModelGenerator::visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::Deps::VariableDep var_dep, int index_shift)
{
if (var_dep.isRecursive()) {
Equation v_eq = getEquation(v_vertex, _eqs);
Equation g_eq = getEquation(g_vertex, _eqs);
Equation v_eq = getEquation(v_vertex, _config.eqs);
Equation g_eq = getEquation(g_vertex, _config.eqs);
DefAlgDepsUse new_dep(g_eq, var_dep);
insertAlg(_der_deps, v_eq.id(), new_dep);
insertAlg(((v_eq.type() == IR::EQUATION::Algebraic) ? _alg_deps : _der_deps), v_eq.id(), new_dep);
}
}

void QSSModelGenerator::visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::PWLMap use_map,
SB::Deps::LMapExp use_map_exp, Expression use_exp, SB::PWLMap def_map, SB::Deps::LMapExp def_map_exp,
SB::Set intersection)
{
Equation v_eq = getEquation(v_vertex, _eqs);
Equation g_eq = getEquation(g_vertex, _eqs);
Equation v_eq = getEquation(v_vertex, _config.eqs);
Equation g_eq = getEquation(g_vertex, _config.eqs);
DefAlgDepsUse new_dep(g_eq, def_map, use_exp, use_map_exp, def_map_exp, g_vertex.id());
insertAlg(((v_eq.type() == IR::EQUATION::Algebraic) ? _alg_deps : _der_deps), v_eq.id(), new_dep);
}
Expand All @@ -98,27 +98,39 @@ void QSSModelGenerator::initG(SB::Deps::SetVertex vertex, SB::Deps::SetEdge edge

QSSModelDef QSSModelGenerator::def() { return _qss_model_def; }

template<typename GraphBuilder>
QSSModel<GraphBuilder>::QSSModel() {}
template <typename GraphBuilder>
QSSModel<GraphBuilder>::QSSModel()
{
}

template<typename GraphBuilder>
template <typename GraphBuilder>
void QSSModel<GraphBuilder>::build(EquationTable eqs)
{
EquationTable algebraics = ModelConfig::instance().algebraics();
VarSymbolTable symbols = ModelConfig::instance().symbols();
QSSModelBuilder qss_model;
IndexShiftBuilder index_shifts(algebraics);
GraphBuilder EQSBGraph(eqs, algebraics);
qss_model.setup(eqs);
qss_model.compute(EQSBGraph.build(), index_shifts.build());
SB::Deps::Graph graph = EQSBGraph.build();
QSSModelConfig config;
config.eqs = eqs;
config.graph = graph;
qss_model.setup(config);
qss_model.compute(graph, index_shifts.build());
_qss_model_def = qss_model.def();
}

template<typename GraphBuilder>
string QSSModel<GraphBuilder>::simpleDef() { return _qss_model_def.simple; }
template <typename GraphBuilder>
string QSSModel<GraphBuilder>::simpleDef()
{
return _qss_model_def.simple;
}

template<typename GraphBuilder>
string QSSModel<GraphBuilder>::genericDef() { return _qss_model_def.generic; }
template <typename GraphBuilder>
string QSSModel<GraphBuilder>::genericDef()
{
return _qss_model_def.generic;
}

template class QSSModel<SDSBGraphBuilder>;

Expand Down
16 changes: 7 additions & 9 deletions src/mmoc/ir/qss_model.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ struct QSSModelDef {
std::string generic;
};


class QSSModelGenerator {
public:
QSSModelGenerator();
Expand All @@ -48,25 +47,25 @@ class QSSModelGenerator {
void postProcess(SB::Deps::SetVertex vertex);
void visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep);
void visitF(SB::Deps::SetVertex vertex, SB::Deps::VariableDep var_dep, SB::Deps::SetVertex gen_vertex);
void visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::Deps::VariableDep var_dep, int index_shift);
void visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::PWLMap use_map, SB::Deps::LMapExp use_map_exp, Expression use_exp, SB::PWLMap def_map,
SB::Deps::LMapExp def_map_exp, SB::Set intersection);
void visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::Deps::VariableDep var_dep, int index_shift = 0);
void visitG(SB::Deps::SetVertex v_vertex, SB::Deps::SetVertex g_vertex, SB::PWLMap use_map, SB::Deps::LMapExp use_map_exp,
Expression use_exp, SB::PWLMap def_map, SB::Deps::LMapExp def_map_exp, SB::Set intersection);
void initG(SB::Deps::SetVertex vertex, SB::Deps::SetEdge edge);
QSSModelDef def();

void setup(EquationTable eqs);
EquationTable config() { return EquationTable(); }
void setup(QSSModelConfig config);
QSSModelConfig config() { return _config; }

protected:
QSSModelDef _qss_model_def;
int _tabs;
AlgDepsMap _der_deps;
AlgDepsMap _alg_deps;
bool _post_process_eval;
EquationTable _eqs;
QSSModelConfig _config;
};

template<typename GraphBuilder>
template <typename GraphBuilder>
class QSSModel {
public:
QSSModel();
Expand All @@ -88,6 +87,5 @@ typedef QSSModel<Deps::SZSBGraphBuilder> ZCModelGen;

typedef QSSModel<Deps::SOSBGraphBuilder> OutputModelGen;


} // namespace IR
} // namespace MicroModelica

0 comments on commit be1e5da

Please sign in to comment.