30 #ifndef OPHIDIAN_TIMING_CEFF_H
31 #define OPHIDIAN_TIMING_CEFF_H
34 #include <boost/units/cmath.hpp>
36 #include "../interconnection/rc_tree.h"
38 #include "elmore_second_moment.h"
45 using CapacitanceType = boost::units::quantity < boost::units::si::capacitance >;
46 using SlewType = boost::units::quantity < boost::units::si::time >;
47 std::vector< SlewType > * m_slews;
48 std::vector< SlewType > * m_delays;
49 std::vector< CapacitanceType > * m_ceff;
56 void slew_map(std::vector< SlewType >& sm);
57 void delay_map(std::vector< SlewType >& dm);
58 void ceff_map(std::vector<CapacitanceType> &cm);
59 const std::vector< SlewType >& slews()
const {
62 const std::vector< SlewType >& delays()
const {
65 const std::vector< CapacitanceType >& ceffs()
const {
68 template <
class SlewCalculator>
72 m_slews =
new std::vector< SlewType >(tree.node_count());
74 m_delays =
new std::vector< SlewType >(tree.node_count());
76 m_ceff =
new std::vector< CapacitanceType >(tree.node_count());
78 std::vector< SlewType > & slews = *m_slews;
79 std::vector< SlewType > & delays = *m_delays;
80 std::vector< CapacitanceType > & ceff = *m_ceff;
83 CapacitanceType lumped;
84 for(std::size_t i = 0; i < tree.node_count(); ++i)
85 lumped += tree.capacitance(i);
87 auto source_slew = slew_calculator(lumped);
94 second_moment.elmore(delay);
95 second_moment.tree(tree);
98 for(std::size_t i = 0; i < tree.node_count(); ++i)
100 delays[i] = delay.at(i);
101 auto step_slew = boost::units::sqrt( second_moment.at(i)*2.0 - boost::units::pow<2>(delay.at(i)) );
102 slews[i] = boost::units::sqrt(boost::units::pow<2>(source_slew) + boost::units::pow<2>(step_slew));
112 using CapacitanceType = boost::units::quantity < boost::units::si::capacitance >;
113 using SlewType = boost::units::quantity < boost::units::si::time >;
116 std::vector< SlewType > * m_slews;
117 std::vector< SlewType > * m_delays;
118 std::vector< CapacitanceType > * m_ceff;
126 void precision(
double epsilon);
128 void slew_map(std::vector< SlewType >& sm);
129 void delay_map(std::vector< SlewType >& dm);
130 void ceff_map(std::vector<CapacitanceType> &cm);
132 const std::vector< SlewType >& slews()
const {
135 const std::vector< SlewType >& delays()
const {
138 const std::vector< CapacitanceType >& ceffs()
const {
142 template <
class SlewCalculator>
146 m_slews =
new std::vector< SlewType >(tree.node_count());
148 m_delays =
new std::vector< SlewType >(tree.node_count());
150 m_ceff =
new std::vector< CapacitanceType >(tree.node_count());
152 std::vector< SlewType > & slews = *m_slews;
153 std::vector< SlewType > & delays = *m_delays;
154 std::vector< CapacitanceType > & ceff = *m_ceff;
159 std::size_t iteration = 0;
161 CapacitanceType current_ceff;
162 delays[0] = SlewType(0.0*boost::units::si::seconds);
163 while (error > m_precision) {
164 current_ceff = ceff[0];
166 slews[0] = slew_calculator(current_ceff);
167 for(std::size_t current = 1; current < tree.node_count(); ++current)
169 auto parent = tree.pred(current);
170 auto resistance_with_parent = tree.resistance(current);
172 slews[current] = slews[parent];
173 if(slews[parent] > 0.0*boost::units::si::seconds){
174 double x = resistance_with_parent*ceff[current]/slews[parent];
175 slews[current] = slews[parent]/ (1-x*(1-std::exp(-1/x)));
177 delays[current] = delays[parent] + resistance_with_parent*ceff[current];
179 for(std::size_t node = 0; node < tree.node_count(); ++node)
180 ceff[node] = tree.capacitance(node);
181 for(std::size_t i = 0; i < tree.node_count()-1; ++i)
183 std::size_t current = tree.node_count() - (i+1);
184 auto parent = tree.pred(current);
185 auto resistance_with_parent = tree.resistance(current);
186 double x = 2.0 * resistance_with_parent * ceff[current] / slews[parent];
187 double y = 1.0 - std::exp(-1.0/x);
188 double shielding_factor = (slews[parent] > 0.0*boost::units::si::seconds?1.0 - x * y:1.0);
189 ceff[parent] += shielding_factor*ceff[current];
191 error = boost::units::abs(current_ceff-ceff[0])/std::max(current_ceff, ceff[0]);
200 #endif // OPHIDIAN_TIMING_CEFF_H
Packed RC Tree Class.
Definition: rc_tree.h:39
Definition: elmore_second_moment.h:48