33 std::unique_ptr<user_feedback::ProgressPrinter> m_progress_printer;
35 void process_pass_configuration(
const Configuration& config, Context& ctx)
37 u32 num_passes = ctx.current_passes.size();
46 std::lock_guard<std::mutex> guard(ctx.progress_mutex);
56 start_id = ctx.pass_counter;
57 u32 remaining_passes = num_passes - start_id;
61 if (remaining_passes < config.num_threads * work / 2)
63 work = std::max(1u, remaining_passes / config.num_threads);
66 end_id = std::min(start_id + work, (
u32)num_passes);
68 ctx.pass_counter = end_id;
69 if (ctx.pass_counter >= num_passes)
71 std::lock_guard guard(ctx.result_mutex);
76 for (
u32 current_id = start_id; current_id < end_id; ++current_id)
78 const auto& [current_state, current_pass] = ctx.current_passes[current_id];
80 if (
auto it = ctx.pass_outcome.find({current_state, current_pass.id}); it != ctx.pass_outcome.end())
84 std::lock_guard guard(ctx.result_mutex);
85 ctx.new_recurring_results.emplace_back(current_state, current_pass.id, it->second);
86 ctx.finished_passes++;
87 m_progress_printer->report((
float)ctx.finished_passes / ctx.current_passes.size(),
88 std::to_string(ctx.finished_passes) +
"\\" + std::to_string(ctx.current_passes.size()) +
" ("
89 + std::to_string(ctx.new_unique_groupings.size()) +
" new results)");
95 auto new_state = current_pass.function(current_state);
98 std::shared_ptr<Grouping> duplicate =
nullptr;
99 for (
const auto& other : ctx.result.unique_groupings)
101 if (*new_state == *other)
108 std::lock_guard guard(ctx.result_mutex);
109 if (duplicate ==
nullptr)
111 ctx.new_unique_groupings.emplace_back(current_state, current_pass.id, new_state);
115 ctx.new_recurring_results.emplace_back(current_state, current_pass.id, duplicate);
118 ctx.finished_passes++;
119 m_progress_printer->report((
float)ctx.finished_passes / ctx.current_passes.size(),
120 std::to_string(ctx.finished_passes) +
"\\" + std::to_string(ctx.current_passes.size()) +
" ("
121 + std::to_string(ctx.new_unique_groupings.size()) +
" new results)");
127 std::vector<std::pair<std::shared_ptr<Grouping>, PassConfiguration>>
128 generate_pass_combinations(Context& ctx,
const Configuration& config,
const std::shared_ptr<Grouping>& initial_grouping)
131 std::vector<std::pair<std::shared_ptr<Grouping>, PassConfiguration>>
output;
133 if (initial_grouping !=
nullptr)
137 output.emplace_back(initial_grouping, pass);
142 for (
const auto& state : ctx.result.unique_groupings)
146 output.emplace_back(state, pass);
167 log_info(
"dataflow",
"start processing layer {}", layer);
168 auto begin_time = std::chrono::high_resolution_clock::now();
171 ctx.
current_passes = generate_pass_combinations(ctx, config, (layer == 0) ? initial_grouping :
nullptr);
178 m_progress_printer = std::make_unique<user_feedback::ProgressPrinter>(
"dataflow: processing …", 30);
181 std::vector<std::thread> workers;
184 workers.emplace_back([&]() { process_pass_configuration(config, ctx); });
187 process_pass_configuration(config, ctx);
190 for (
auto& worker : workers)
195 m_progress_printer.reset();
201 begin_time = std::chrono::high_resolution_clock::now();
204 u32 num_unique_filtered = 0;
208 if (do_not_consider[i])
215 if (do_not_consider[j])
222 if (*new_state_i == *new_state_j)
224 do_not_consider[j] =
true;
225 all_new_results.emplace_back(start_state_j, pass_j, new_state_i);
230 num_unique_filtered++;
232 log_info(
"dataflow",
" filtered results in {:3.2f}s, got {} new unique results",
seconds_since(begin_time), num_unique_filtered);
234 begin_time = std::chrono::high_resolution_clock::now();
239 for (
const auto& [start_state, pass, new_state] : all_new_results)
245 if (start_pass_combinations.empty())
247 std::vector<pass_id> path{pass};
248 new_pass_combinations.push_back(path);
253 std::vector<std::vector<pass_id>> new_paths;
254 new_paths.reserve(start_pass_combinations.size());
255 for (
const auto& path : start_pass_combinations)
257 if (path.size() != layer)
261 std::vector<pass_id> new_path(path);
262 new_path.push_back(pass);
263 new_paths.push_back(new_path);
266 new_pass_combinations.insert(new_pass_combinations.end(), new_paths.begin(), new_paths.end());
#define log_info(channel,...)
std::vector< PassConfiguration > get_passes(const Configuration &config, const std::vector< std::vector< pass_id >> &previous_passes)
processing::Result run(const processing::Configuration &config, const std::shared_ptr< Grouping > &initial_grouping)
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.
std::vector< std::pair< std::shared_ptr< Grouping >, PassConfiguration > > current_passes
std::vector< std::tuple< std::shared_ptr< Grouping >, pass_id, std::shared_ptr< Grouping > > > new_recurring_results
std::map< std::pair< std::shared_ptr< Grouping >, pass_id >, std::shared_ptr< Grouping > > pass_outcome
std::vector< std::tuple< std::shared_ptr< Grouping >, pass_id, std::shared_ptr< Grouping > > > new_unique_groupings
processing::Result result
std::map< std::shared_ptr< Grouping >, std::vector< std::vector< pass_id > > > pass_combinations_leading_to_grouping
std::map< std::vector< pass_id >, std::shared_ptr< Grouping > > groupings
std::vector< std::shared_ptr< Grouping > > unique_groupings