HAL
pass_collection.cpp
Go to the documentation of this file.
2 
11 
12 #include <algorithm>
13 
14 namespace hal
15 {
16  namespace dataflow
17  {
18  namespace processing
19  {
21  {
22  static pass_id m_unique_id_it = 0;
23 
24  function = func;
25  id = ++m_unique_id_it;
26  }
27 
28  namespace pass_collection
29  {
30  namespace
31  {
32  std::vector<PassConfiguration> m_all_passes;
33  std::vector<PassConfiguration> m_intermediate_passes;
34  std::unordered_map<pass_id, std::unordered_set<pass_id>> m_useless_follow_ups;
35  bool m_initialized = false;
36 
37  PassConfiguration group_by_ctrl_sigs;
38 
39  PassConfiguration group_by_output_size;
40  PassConfiguration group_by_input_size;
41 
42  PassConfiguration group_by_successors;
43  PassConfiguration group_by_predecessors;
44 
45  PassConfiguration group_by_successor_known_groups;
46  PassConfiguration group_by_predecessor_known_groups;
47 
48  PassConfiguration group_by_successors_iteratively;
49  PassConfiguration group_by_predecessors_iteratively;
50 
51  PassConfiguration split_by_successors;
52  PassConfiguration split_by_predecessors;
53 
54  PassConfiguration split_by_successor_known_groups;
55  PassConfiguration split_by_predecessor_known_groups;
56 
57  void initialize(const Configuration& config)
58  {
59  using namespace std::placeholders;
60 
61  // start passes
62 
63  group_by_ctrl_sigs = m_all_passes.emplace_back(std::bind(&group_by_control_signals::process, config, _1));
64 
65  group_by_output_size = m_all_passes.emplace_back(std::bind(&group_by_input_output_size::process, config, _1, false));
66  group_by_input_size = m_all_passes.emplace_back(std::bind(&group_by_input_output_size::process, config, _1, true));
67 
68  group_by_successors = m_all_passes.emplace_back(std::bind(&group_by_successors_predecessors::process, config, _1, true));
69  group_by_predecessors = m_all_passes.emplace_back(std::bind(&group_by_successors_predecessors::process, config, _1, false));
70 
71  group_by_successors_iteratively = m_all_passes.emplace_back(std::bind(&group_by_successors_predecessors_iteratively::process, config, _1, true));
72  group_by_predecessors_iteratively = m_all_passes.emplace_back(std::bind(&group_by_successors_predecessors_iteratively::process, config, _1, false));
73 
74  split_by_successors = m_all_passes.emplace_back(std::bind(&split_by_successors_predecessors::process, config, _1, true));
75  split_by_predecessors = m_all_passes.emplace_back(std::bind(&split_by_successors_predecessors::process, config, _1, false));
76 
77  if (config.has_known_groups)
78  {
79  group_by_successor_known_groups = m_all_passes.emplace_back(std::bind(&group_by_successor_predecessor_known_groups::process, config, _1, true));
80  group_by_predecessor_known_groups = m_all_passes.emplace_back(std::bind(&group_by_successor_predecessor_known_groups::process, config, _1, false));
81  split_by_successor_known_groups = m_all_passes.emplace_back(std::bind(&split_by_successor_predecessor_known_groups::process, config, _1, true));
82  split_by_predecessor_known_groups = m_all_passes.emplace_back(std::bind(&split_by_successor_predecessor_known_groups::process, config, _1, false));
83  }
84 
85  m_useless_follow_ups[group_by_successors.id].insert(split_by_successors.id);
86  m_useless_follow_ups[group_by_predecessors.id].insert(split_by_predecessors.id);
87  m_useless_follow_ups[group_by_successors_iteratively.id].insert(group_by_successors.id);
88  m_useless_follow_ups[group_by_predecessors_iteratively.id].insert(group_by_predecessors.id);
89  m_useless_follow_ups[group_by_successor_known_groups.id].insert(split_by_successor_known_groups.id);
90  m_useless_follow_ups[group_by_predecessor_known_groups.id].insert(split_by_predecessor_known_groups.id);
91 
92  m_initialized = true;
93  }
94 
95  } // namespace
96 
97  std::vector<PassConfiguration> get_passes(const processing::Configuration& config, const std::vector<std::vector<pass_id>>& previous_passes)
98  {
99  if (!m_initialized)
100  {
101  m_all_passes.clear();
102  m_useless_follow_ups.clear();
103  initialize(config);
104  }
105  std::vector<pass_id> last_pass_ids;
106  last_pass_ids.reserve(previous_passes.size());
107  std::transform(previous_passes.begin(), previous_passes.end(), std::back_inserter(last_pass_ids), [](auto& vec) { return vec.back(); });
108 
109  std::vector<PassConfiguration> passes;
110 
111  for (auto& pass : m_all_passes)
112  {
113  if (m_useless_follow_ups[pass.id].find(pass.id) == m_useless_follow_ups[pass.id].end())
114  {
115  passes.push_back(pass);
116  }
117  }
118 
119  if (last_pass_ids.empty())
120  {
121  if (auto it = std::find_if(passes.begin(), passes.end(), [](auto& p) { return p.id == split_by_successors.id; }); it != passes.end())
122  {
123  passes.erase(it);
124  }
125  if (auto it = std::find_if(passes.begin(), passes.end(), [](auto& p) { return p.id == split_by_predecessors.id; }); it != passes.end())
126  {
127  passes.erase(it);
128  }
129  }
130 
131  return passes;
132  }
133 
134  void clear()
135  {
136  m_initialized = false;
137  }
138  } // namespace pass_collection
139  } // namespace processing
140  } // namespace dataflow
141 } // namespace hal
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state)
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
std::vector< PassConfiguration > get_passes(const Configuration &config, const std::vector< std::vector< pass_id >> &previous_passes)
std::function< std::shared_ptr< Grouping >(const std::shared_ptr< Grouping > &)> pass_function
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
void initialize()
Definition: event_log.cpp:302