21 #ifndef SRC_TIMING_GRAPH_H_
22 #define SRC_TIMING_GRAPH_H_
24 #include <lemon/list_graph.h>
25 #include "../entity_system/entity_system.h"
26 #include "transition.h"
27 #include <unordered_map>
32 enum class edge_types {
39 lemon::ListDigraph::Node ck;
40 lemon::ListDigraph::Node d;
41 entity_system::entity tarc;
46 using graph_t = lemon::ListDigraph;
47 using node = graph_t::Node;
48 using edge = graph_t::Arc;
52 lemon::ListDigraph::NodeMap< entity_system::entity > m_pins;
53 lemon::ListDigraph::NodeMap< edges > m_node_edges;
54 lemon::ListDigraph::ArcMap< edge_types > m_arc_types;
55 lemon::ListDigraph::ArcMap< entity_system::entity > m_arcs;
58 std::unordered_map< entity_system::entity, node > m_rise_nodes;
59 std::unordered_map< entity_system::entity, node > m_fall_nodes;
61 std::vector< test > m_tests;
63 node node_create(entity_system::entity pin, edges node_edge, std::unordered_map<entity_system::entity, node> &map);
71 void test_insert(node ck,
73 entity_system::entity tarc);
75 const std::vector< test > & tests()
const {
79 const graph_t & G()
const {
84 std::size_t nodes_count()
const {
85 return lemon::countNodes(m_graph);
88 std::size_t edges_count()
const {
89 return lemon::countArcs(m_graph);
92 node rise_node_create(entity_system::entity pin);
93 node rise_node(entity_system::entity pin)
const {
94 return m_rise_nodes.at(pin);
97 node fall_node_create(entity_system::entity pin);
98 node fall_node(entity_system::entity pin)
const {
99 return m_fall_nodes.at(pin);
102 void node_edge(node u, edges e);
103 edges node_edge(node u)
const {
104 return m_node_edges[u];
108 edge edge_create(node u, node v, edge_types type, entity_system::entity entity);
109 entity_system::entity edge_entity(edge e)
const{
113 entity_system::entity pin(node u)
const {
117 graph_t::OutArcIt out_edges_it(node u)
const {
118 return graph_t::OutArcIt(m_graph, u);
121 node edge_source(edge e)
const {
122 return m_graph.source(e);
124 node edge_target(edge e)
const {
125 return m_graph.target(e);
127 edge_types edge_type(edge e)
const {
128 return m_arc_types[e];
131 void edge_source(edge e, node u);
134 template <
class Iterator>
135 void edge_destroy(
const Iterator begin,
const Iterator end) {
136 for(Iterator it{begin}; it != end; ++it)