#include "echo_loader.hpp" EchoLoader::EchoLoader() { tg_ = std::unique_ptr(new tatum::TimingGraph); tc_ = std::unique_ptr(new tatum::TimingConstraints); gr_ = std::unique_ptr(new GoldenReference); } void EchoLoader::add_node(int node_id, tatumparse::NodeType type, std::vector /*in_edge_ids*/, std::vector /*out_edge_ids*/) { tatum::NodeId created_node_id = tg_->add_node(to_tatum_node_type(type)); TATUM_ASSERT(created_node_id == tatum::NodeId(node_id)); } void EchoLoader::add_edge(int edge_id, tatumparse::EdgeType type, int src_node_id, int sink_node_id, bool disabled) { tatum::EdgeId created_edge_id = tg_->add_edge(to_tatum_edge_type(type), tatum::NodeId(src_node_id), tatum::NodeId(sink_node_id)); TATUM_ASSERT(created_edge_id == tatum::EdgeId(edge_id)); tg_->disable_edge(created_edge_id, disabled); } void EchoLoader::finish_graph() { max_delay_edges_.resize(tg_->edges().size()); min_delay_edges_.resize(tg_->edges().size()); setup_times_.resize(tg_->edges().size()); hold_times_.resize(tg_->edges().size()); } void EchoLoader::add_clock_domain(int domain_id, std::string name) { tatum::DomainId created_domain_id = tc_->create_clock_domain(name); TATUM_ASSERT(created_domain_id == tatum::DomainId(domain_id)); } void EchoLoader::add_clock_source(int node_id, int domain_id) { tc_->set_clock_domain_source(tatum::NodeId(node_id), tatum::DomainId(domain_id)); } void EchoLoader::add_constant_generator(int node_id) { tc_->set_constant_generator(tatum::NodeId(node_id)); } void EchoLoader::add_max_input_constraint(int node_id, int domain_id, float constraint) { tc_->set_input_constraint(tatum::NodeId(node_id), tatum::DomainId(domain_id), tatum::DelayType::MAX, tatum::Time(constraint)); } void EchoLoader::add_min_input_constraint(int node_id, int domain_id, float constraint) { tc_->set_input_constraint(tatum::NodeId(node_id), tatum::DomainId(domain_id), tatum::DelayType::MIN, tatum::Time(constraint)); } void EchoLoader::add_max_output_constraint(int node_id, int domain_id, float constraint) { tc_->set_output_constraint(tatum::NodeId(node_id), tatum::DomainId(domain_id), tatum::DelayType::MAX, tatum::Time(constraint)); } void EchoLoader::add_min_output_constraint(int node_id, int domain_id, float constraint) { tc_->set_output_constraint(tatum::NodeId(node_id), tatum::DomainId(domain_id), tatum::DelayType::MIN, tatum::Time(constraint)); } void EchoLoader::add_setup_constraint(int src_domain_id, int sink_domain_id, int capture_node, float constraint) { tc_->set_setup_constraint(tatum::DomainId(src_domain_id), tatum::DomainId(sink_domain_id), tatum::NodeId(capture_node), tatum::Time(constraint)); } void EchoLoader::add_hold_constraint(int src_domain_id, int sink_domain_id, int capture_node,float constraint) { tc_->set_hold_constraint(tatum::DomainId(src_domain_id), tatum::DomainId(sink_domain_id), tatum::NodeId(capture_node), tatum::Time(constraint)); } void EchoLoader::add_setup_uncertainty(int src_domain_id, int sink_domain_id, float uncertainty) { tc_->set_setup_clock_uncertainty(tatum::DomainId(src_domain_id), tatum::DomainId(sink_domain_id), tatum::Time(uncertainty)); } void EchoLoader::add_hold_uncertainty(int src_domain_id, int sink_domain_id, float uncertainty) { tc_->set_hold_clock_uncertainty(tatum::DomainId(src_domain_id), tatum::DomainId(sink_domain_id), tatum::Time(uncertainty)); } void EchoLoader::add_early_source_latency(int domain_id, float latency) { tc_->set_source_latency(tatum::DomainId(domain_id), tatum::ArrivalType::EARLY, tatum::Time(latency)); } void EchoLoader::add_late_source_latency(int domain_id, float latency) { tc_->set_source_latency(tatum::DomainId(domain_id), tatum::ArrivalType::LATE, tatum::Time(latency)); } void EchoLoader::add_edge_setup_hold_time(int edge_id, float setup_time, float hold_time) { setup_times_[tatum::EdgeId(edge_id)] = tatum::Time(setup_time); hold_times_[tatum::EdgeId(edge_id)] = tatum::Time(hold_time); } void EchoLoader::add_edge_delay(int edge_id, float min_delay, float max_delay) { min_delay_edges_[tatum::EdgeId(edge_id)] = tatum::Time(min_delay); max_delay_edges_[tatum::EdgeId(edge_id)] = tatum::Time(max_delay); } void EchoLoader::add_node_tag(tatumparse::TagType type, int node_id, int launch_domain_id, int capture_domain_id, float time) { gr_->set_result(tatum::NodeId(node_id), type, tatum::DomainId(launch_domain_id), tatum::DomainId(capture_domain_id), time); } void EchoLoader::add_edge_slack(tatumparse::TagType /*type*/, int /*edge_id*/, int /*launch_domain_id*/, int /*capture_domain_id*/, float /*slack*/) { //nop } void EchoLoader::add_node_slack(tatumparse::TagType /*type*/, int /*node_id*/, int /*launch_domain_id*/, int /*capture_domain_id*/, float /*slack*/) { //nop } std::unique_ptr EchoLoader::timing_graph() { return std::move(tg_); } std::unique_ptr EchoLoader::timing_constraints() { return std::move(tc_); } std::unique_ptr EchoLoader::delay_calculator() { return std::unique_ptr(new tatum::FixedDelayCalculator(max_delay_edges_, setup_times_, min_delay_edges_, hold_times_)); } std::unique_ptr EchoLoader::golden_reference() { return std::move(gr_); } tatum::NodeType EchoLoader::to_tatum_node_type(tatumparse::NodeType type) { if(type == tatumparse::NodeType::SOURCE) { return tatum::NodeType::SOURCE; } else if(type == tatumparse::NodeType::SINK) { return tatum::NodeType::SINK; } else if(type == tatumparse::NodeType::IPIN) { return tatum::NodeType::IPIN; } else if(type == tatumparse::NodeType::CPIN) { return tatum::NodeType::CPIN; } else { TATUM_ASSERT(type == tatumparse::NodeType::OPIN); return tatum::NodeType::OPIN; } } tatum::EdgeType EchoLoader::to_tatum_edge_type(tatumparse::EdgeType type) { if(type == tatumparse::EdgeType::PRIMITIVE_COMBINATIONAL) { return tatum::EdgeType::PRIMITIVE_COMBINATIONAL; } else if(type == tatumparse::EdgeType::PRIMITIVE_CLOCK_LAUNCH) { return tatum::EdgeType::PRIMITIVE_CLOCK_LAUNCH; } else if(type == tatumparse::EdgeType::PRIMITIVE_CLOCK_CAPTURE) { return tatum::EdgeType::PRIMITIVE_CLOCK_CAPTURE; } else { TATUM_ASSERT(type == tatumparse::EdgeType::INTERCONNECT); return tatum::EdgeType::INTERCONNECT; } } void EchoLoader::parse_error(const int curr_lineno, const std::string& near_text, const std::string& msg) { fprintf(stderr, "%s:%d Failed to parse echo file: %s near '%s'\n", filename_.c_str(), curr_lineno, msg.c_str(), near_text.c_str()); std::exit(1); }