blob: cb1e5f93c106b38b058b67902fe91729a2939dfe [file]
#pragma once
/*
* Forward declarations for Timing Graph and related types
*/
#include <iosfwd>
#include "tatum/util/tatum_strong_id.hpp"
namespace tatum {
//The timing graph
class TimingGraph;
struct GraphIdMaps;
/**
* Potential types for nodes in the timing graph
*/
enum class NodeType : unsigned char {
SOURCE, //The start of a clock/data path
SINK, //The end of a clock/data path
IPIN, //An intermediate input pin
OPIN, //An intermediate output pin
CPIN, //An intermediate clock (input) pin
};
//Stream operators for NodeType
enum class EdgeType : unsigned char {
PRIMITIVE_COMBINATIONAL,
PRIMITIVE_CLOCK_LAUNCH,
PRIMITIVE_CLOCK_CAPTURE,
INTERCONNECT
};
//Stream operators for Edge/Node Type
std::ostream& operator<<(std::ostream& os, const NodeType type);
std::ostream& operator<<(std::ostream& os, const EdgeType type);
//Various IDs used by the timing graph
struct node_id_tag;
struct edge_id_tag;
struct domain_id_tag;
struct level_id_tag;
typedef tatum::util::StrongId<node_id_tag> NodeId;
typedef tatum::util::StrongId<edge_id_tag> EdgeId;
typedef tatum::util::StrongId<level_id_tag> LevelId;
//We expect far fewer domains than nodes/edges so we use a smaller
//data type, as this allows for more efficient packing in TimingTag
typedef tatum::util::StrongId<domain_id_tag,unsigned short> DomainId;
std::ostream& operator<<(std::ostream& os, NodeId node_id);
std::ostream& operator<<(std::ostream& os, EdgeId edge_id);
std::ostream& operator<<(std::ostream& os, DomainId domain_id);
std::ostream& operator<<(std::ostream& os, LevelId level_id);
} //namepsace