HAL
group_by_successors_predecessors.cpp
Go to the documentation of this file.
2 
6 
7 #include <list>
8 #include <map>
9 #include <set>
10 
11 namespace hal
12 {
13  namespace dataflow
14  {
15  namespace group_by_successors_predecessors
16  {
17  std::shared_ptr<Grouping> process(const processing::Configuration& config, const std::shared_ptr<Grouping>& state, bool successors)
18  {
19  auto new_state = std::make_shared<Grouping>(state->netlist_abstr);
20 
21  /* check characteristics */
22  std::map<std::set<u32>, std::list<u32>> characteristics_map;
23  for (const auto& [group_id, group] : state->gates_of_group)
24  {
25  std::set<u32> characteristics_of_group;
26 
27  if (successors)
28  {
29  auto successing_group = state->get_successor_groups_of_group(group_id);
30  characteristics_of_group.insert(successing_group.begin(), successing_group.end());
31  }
32  else
33  {
34  auto predecessing_group = state->get_predecessor_groups_of_group(group_id);
35  characteristics_of_group.insert(predecessing_group.begin(), predecessing_group.end());
36  }
37 
38  characteristics_map[characteristics_of_group].push_back(group_id);
39  }
40 
41  /* check if merge is allowed */
42  std::vector<std::vector<u32>> merge_sets;
43  for (auto& merge_candidates : characteristics_map)
44  {
45  auto& work_list = merge_candidates.second;
46  while (!work_list.empty())
47  {
48  auto it = work_list.begin();
49  auto group_id = *it;
50  it = work_list.erase(it);
51 
52  std::vector<u32> merge_set = {group_id};
53 
54  while (it != work_list.end())
55  {
56  auto test_group_id = *it;
57 
58  if (!state->are_groups_allowed_to_merge(group_id, test_group_id, config.enforce_type_consistency))
59  {
60  ++it;
61  continue;
62  }
63 
64  merge_set.push_back(test_group_id);
65  it = work_list.erase(it);
66  }
67  merge_sets.push_back(merge_set);
68  }
69  }
70 
71  /* merge groups */
72  u32 id_counter = -1;
73  for (const auto& groups_to_merge : merge_sets)
74  {
75  u32 new_group_id = ++id_counter;
76 
77  for (const auto& old_group : groups_to_merge)
78  {
79  auto gates = state->gates_of_group.at(old_group);
80  new_state->group_control_fingerprint_map[new_group_id] = new_state->netlist_abstr.gate_to_fingerprint.at(*gates.begin());
81  new_state->operations_on_group_allowed[new_group_id] = state->operations_on_group_allowed.at(old_group);
82  new_state->gates_of_group[new_group_id].insert(gates.begin(), gates.end());
83  for (const auto& sg : gates)
84  {
85  new_state->parent_group_of_gate[sg] = new_group_id;
86  }
87  }
88  }
89 
90  return new_state;
91  }
92 
93  } // namespace group_by_successors_predecessors
94  } // namespace dataflow
95 } // namespace hal
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
quint32 u32
This file contains the struct that holds all information on the netlist abstraction used for dataflow...
This file contains the class that holds all information of a dataflow analysis grouping.