15 namespace group_by_successor_predecessor_known_groups
19 auto new_state = std::make_shared<Grouping>(
state->netlist_abstr);
22 std::map<std::set<u32>, std::list<u32>> characteristics_map;
23 std::vector<u32> groups_with_no_characteristics;
24 for (
const auto& [group_id, group] :
state->gates_of_group)
26 std::set<u32> characteristics_of_group;
30 auto successing_known_group =
state->get_known_successor_groups_of_group(group_id);
31 characteristics_of_group.insert(successing_known_group.begin(), successing_known_group.end());
35 auto predecessing_known_group =
state->get_known_predecessor_groups_of_group(group_id);
36 characteristics_of_group.insert(predecessing_known_group.begin(), predecessing_known_group.end());
39 if (characteristics_of_group.empty())
41 groups_with_no_characteristics.push_back(group_id);
45 characteristics_map[characteristics_of_group].push_back(group_id);
50 std::vector<std::vector<u32>> merge_sets;
51 for (
auto& merge_candidates : characteristics_map)
53 auto& work_list = merge_candidates.second;
54 while (!work_list.empty())
56 auto it = work_list.begin();
58 it = work_list.erase(it);
60 std::vector<u32> merge_set = {group_id};
62 while (it != work_list.end())
64 auto test_group_id = *it;
72 merge_set.push_back(test_group_id);
73 it = work_list.erase(it);
75 merge_sets.push_back(merge_set);
80 for (
const auto& group_id : groups_with_no_characteristics)
82 merge_sets.push_back({group_id});
87 for (
const auto& groups_to_merge : merge_sets)
89 u32 new_group_id = ++id_counter;
91 for (
const auto& old_group : groups_to_merge)
93 auto gates =
state->gates_of_group.at(old_group);
94 new_state->group_control_fingerprint_map[new_group_id] = new_state->netlist_abstr.gate_to_fingerprint.at(*gates.begin());
95 new_state->operations_on_group_allowed[new_group_id] =
state->operations_on_group_allowed.at(old_group);
96 new_state->gates_of_group[new_group_id].insert(gates.begin(), gates.end());
97 for (
const auto& sg : gates)
99 new_state->parent_group_of_gate[sg] = new_group_id;
std::shared_ptr< Grouping > process(const processing::Configuration &config, const std::shared_ptr< Grouping > &state, bool successors)
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.
bool enforce_type_consistency