21struct sc_time_syncronizer : sc_core::sc_stage_callback_if, sc_core::sc_process_host {
22 ~sc_time_syncronizer() =
default;
28 static sc_time_syncronizer&
get() {
40 auto idx = gtk.get_channel_index();
41 client_deputies.emplace_back();
42 auto& client = client_deputies[client_deputies.size() - 1];
44 [
this, &client, idx]() {
47 if(!client.peq.has_next())
48 this->notify_client_blocked(idx,
false);
51 sc_core::sc_gen_unique_name(
"peq_cb",
false));
56 inline void notify_client_blocked(
size_t idx,
bool is_blocked) {
57 assert(idx < client_deputies.size());
58 client_deputies[idx].blocked = is_blocked;
60 !std::any_of(std::begin(client_deputies), std::end(client_deputies), [](
client_deputy const& d) {
return !d.blocked; });
61#ifdef DEBUG_MT_SCHEDULING
62 SCCTRACEALL(__PRETTY_FUNCTION__) << (is_blocked ?
"blocking" :
"unblocking") <<
" thread " << idx
63 <<
", sc_is_free_running=" << sc_is_free_running;
68 enum class sync_state { INITIAL, PROCESSING, ARMED };
69 sc_time_syncronizer(global_time_keeper& gtk);
71 bool process_pending_tasks();
72 sync_state state{sync_state::INITIAL};
73 void stage_callback(
const sc_core::sc_stage& stage)
override;
74 inline void notify_task(
size_t idx, callback_task&& task, sc_core::sc_time
const& d) {
75 client_deputies[idx].peq.notify(std::move(task), d);
76 notify_client_blocked(idx,
true);
78 sc_core::sc_time get_min_time() {
return sc_core::sc_time::from_value(gtk.get_client_min_time_ticks()); }
80 global_time_keeper& gtk;
81 sc_core::sc_vector<client_deputy> client_deputies;
82 sc_core::sc_process_handle method_handle;
83 bool sc_is_free_running{
true};