#pragma once #include #include #include #include namespace sim { struct Schedulable; struct Scheduler { std::set unsorted_schedulables; std::vector sorted_schedulables; bool sort_needed = false; std::multimap constraints; Schedulable *current_schedulable = nullptr; std::uint64_t now = 0; void add_schedulable(Schedulable *schedulable); void remove_schedulable(Schedulable *schedulable); void constrain(Schedulable *prior, Schedulable *later); void topo_sort(std::set &live, std::set &waiting, Schedulable *candidate); void sort(); void clock(); }; struct Schedulable { Scheduler &scheduler; Schedulable(Scheduler &scheduler); virtual ~Schedulable(); virtual void clock() = 0; std::uint64_t now(); }; }