mesytec-mnode/external/taskflow-3.8.0/3rd-party/ff/distributed/ff_dutils.hpp

80 lines
2.5 KiB
C++
Raw Normal View History

2025-01-04 01:25:05 +01:00
#include <set>
#include "ff/pipeline.hpp"
namespace ff {
enum NodeIOTypes { IN, OUT, INOUT};
enum SetEnum {L, R};
/**
* Check the coverage of the first level building blocks of the main pipe, which is the building block needed to create a distributed FF program.
* Specifically this method, given the main pipe and and the set of buildingblock from which the user created groups, check if all stages of the pipe belong to a group.
**/
static inline bool checkCoverageFirstLevel(ff_pipeline* mainPipe, const std::set<ff_node*>& groupBuildingBlock) {
ff::svector<ff_node*> stages = mainPipe->getStages();
for(size_t i = 0; i< stages.size(); i++)
if (!groupBuildingBlock.contains(stages[i])){
std::cerr << "Stage #" << i << " was not annotated in any group! Aborting!\n";
abort();
}
return true;
}
/**
* Helper function to detect sequential node from a bare node pointer.
**/
static inline bool isSeq(const ff_node* n){return (!n->isAll2All() && !n->isComp() && !n->isFarm() && !n->isOFarm() && !n->isPipe());}
/**
* Return the children builiding block of the given building block. We implemented only a2a and pipeline since, groups can be created just only from this two building block.
**/
static inline std::set<std::pair<ff_node*, SetEnum>> getChildBB(ff_node* parent){
std::set<std::pair<ff_node*, SetEnum>> out;
if (parent->isAll2All()){
for (ff_node* bb : reinterpret_cast<ff_a2a*>(parent)->getFirstSet())
out.emplace(bb, SetEnum::L);
for(ff_node* bb : reinterpret_cast<ff_a2a*>(parent)->getSecondSet())
out.emplace(bb, SetEnum::R);
}
if (parent->isPipe())
for(ff_node* bb : reinterpret_cast<ff_pipeline*>(parent)->getStages())
out.emplace(bb, SetEnum::L); // for pipelines the default List is L (left)
return out;
}
static inline bool isSource(const ff_node* n, const ff_pipeline* p){
return p->getStages().front() == n;
}
static inline bool isSink(const ff_node* n, const ff_pipeline* p){
return p->getStages().back() == n;
}
static inline ff_node* getPreviousStage(ff_pipeline* p, ff_node* s){
ff::svector<ff_node*> stages = p->getStages();
for(size_t i = 1; i < stages.size(); i++)
if (stages[i] == s) return stages[--i];
return nullptr;
}
static inline ff_node* getNextStage(ff_pipeline* p, ff_node* s){
ff::svector<ff_node*> stages = p->getStages();
for(size_t i = 0; i < stages.size() - 1; i++)
if(stages[i] == s) return stages[++i];
return nullptr;
}
}