21 #ifndef SRC_TIMING_STA_TIMING_ARC_CALCULATOR_H_
22 #define SRC_TIMING_STA_TIMING_ARC_CALCULATOR_H_
24 #include <lemon/list_graph.h>
25 #include "graph_nodes_timing.h"
26 #include "graph_arcs_timing.h"
29 #include "sta_arc_calculator.h"
35 class sta_timing_arc_calculator:
public sta_timing_edge_calculator {
36 const library & m_library;
39 sta_timing_arc_calculator(
const library & lib);
40 virtual ~sta_timing_arc_calculator();
42 void update(
const graph& g,
const graph_nodes_timing& nodes_timing, sta_timing_point_calculator & tpoints, graph_arcs_timing & m_arcs) {
43 boost::units::quantity<boost::units::si::capacitance> target_load;
44 boost::units::quantity<boost::units::si::time> source_slew ;
45 for (std::deque<lemon::ListDigraph::Arc>::const_iterator arc_it = m_to_process.begin(); arc_it != m_to_process.end(); ++arc_it) {
46 target_load = nodes_timing.load(g.edge_target(*arc_it));
47 source_slew = nodes_timing.slew(g.edge_source(*arc_it));
48 const entity::entity tarc = g.edge_entity(*arc_it);
49 boost::units::quantity<boost::units::si::time> delay, slew;
50 switch (g.node_edge( g.edge_target(*arc_it) )) {
52 delay = m_library.timing_arc_rise_delay(tarc).compute(target_load, source_slew);
53 slew = m_library.timing_arc_rise_slew(tarc).compute(target_load, source_slew);
56 delay = m_library.timing_arc_fall_delay(tarc).compute(target_load, source_slew);
57 slew = m_library.timing_arc_fall_slew(tarc).compute(target_load, source_slew);
62 m_arcs.slew(*arc_it, slew);
63 m_arcs.delay(*arc_it, delay);
66 for (lemon::ListDigraph::Arc arc : m_to_process) {
67 tpoints.push(g.edge_target(arc));