#ifndef VPR_ROUTING_PREDICTOR_H #define VPR_ROUTING_PREDICTOR_H #include #include //When the estimated number of routing iterations exceeds these factors //(for SAFE or AGGRESSIVE mode respectively) times the max router iterations //specified by the router aborts early constexpr float ROUTING_PREDICTOR_ITERATION_ABORT_FACTOR_SAFE = 3; constexpr float ROUTING_PREDICTOR_ITERATION_ABORT_FACTOR_AGGRESSIVE = 1.5; //If the number of overused resources is below this threshold do not abort. // This avoids giving up when solutions are nearly legal, but converging slowly constexpr size_t ROUTING_PREDICTOR_MIN_ABSOLUTE_OVERUSE_THRESHOLD = 100; class RoutingPredictor { public: RoutingPredictor(size_t min_history = 8, float history_factor = 0.5); //Returns the estimated iteration when routing will succeed float estimate_success_iteration(); //Returns the current estimated slope (RR nodes per iteration) float estimate_overuse_slope(); void add_iteration_overuse(size_t iteration, size_t overused_rr_node_count); float get_slope(); private: size_t min_history_; float history_factor_; std::vector iterations_; std::vector iteration_overused_rr_node_counts_; }; #endif