OpenFPGA/vpr/src/route/router_lookahead.h

97 lines
3.7 KiB
C++

#ifndef VPR_ROUTER_LOOKAHEAD_H
#define VPR_ROUTER_LOOKAHEAD_H
#include <memory>
#include "vpr_types.h"
#include "vpr_error.h"
struct t_conn_cost_params; //Forward declaration
class RouterLookahead {
public:
// Get expected cost from node to target_node.
//
// Either compute or read methods must be invoked before invoking
// get_expected_cost.
virtual float get_expected_cost(const RRNodeId& node, const RRNodeId& target_node, const t_conn_cost_params& params, float R_upstream) const = 0;
// Compute router lookahead (if needed).
virtual void compute(const std::vector<t_segment_inf>& segment_inf) = 0;
// Read router lookahead data (if any) from specified file.
// May be unimplemented, in which case method should throw an exception.
virtual void read(const std::string& file) = 0;
// Write router lookahead data (if any) to specified file.
// May be unimplemented, in which case method should throw an exception.
virtual void write(const std::string& file) const = 0;
virtual ~RouterLookahead() {}
};
// Force creation of lookahead object.
//
// This may involve recomputing the lookahead, so only use if lookahead cache
// cannot be used.
std::unique_ptr<RouterLookahead> make_router_lookahead(
e_router_lookahead router_lookahead_type,
std::string write_lookahead,
std::string read_lookahead,
const std::vector<t_segment_inf>& segment_inf);
// Clear router lookahead cache (e.g. when changing or free rrgraph).
void invalidate_router_lookahead_cache();
// Returns lookahead for given rr graph.
//
// Object is cached in RouterContext, but access to cached object should
// performed via this function.
const RouterLookahead* get_cached_router_lookahead(
e_router_lookahead router_lookahead_type,
std::string write_lookahead,
std::string read_lookahead,
const std::vector<t_segment_inf>& segment_inf);
class ClassicLookahead : public RouterLookahead {
public:
float get_expected_cost(const RRNodeId& node, const RRNodeId& target_node, const t_conn_cost_params& params, float R_upstream) const override;
void compute(const std::vector<t_segment_inf>& /*segment_inf*/) override {
}
void read(const std::string& /*file*/) override {
VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::read unimplemented");
}
void write(const std::string& /*file*/) const override {
VPR_THROW(VPR_ERROR_ROUTE, "ClassicLookahead::write unimplemented");
}
private:
float classic_wire_lookahead_cost(const RRNodeId& node, const RRNodeId& target_node, float criticality, float R_upstream) const;
};
class MapLookahead : public RouterLookahead {
protected:
float get_expected_cost(const RRNodeId& node, const RRNodeId& target_node, const t_conn_cost_params& params, float R_upstream) const override;
void compute(const std::vector<t_segment_inf>& segment_inf) override;
void read(const std::string& /*file*/) override {
VPR_THROW(VPR_ERROR_ROUTE, "MapLookahead::read unimplemented");
}
void write(const std::string& /*file*/) const override {
VPR_THROW(VPR_ERROR_ROUTE, "MapLookahead::write unimplemented");
}
};
class NoOpLookahead : public RouterLookahead {
protected:
float get_expected_cost(const RRNodeId& node, const RRNodeId& target_node, const t_conn_cost_params& params, float R_upstream) const override;
void compute(const std::vector<t_segment_inf>& /*segment_inf*/) override {
}
void read(const std::string& /*file*/) override {
VPR_THROW(VPR_ERROR_ROUTE, "Read not supported for NoOpLookahead");
}
void write(const std::string& /*file*/) const override {
VPR_THROW(VPR_ERROR_ROUTE, "Write not supported for NoOpLookahead");
}
};
#endif