OpenSTA/dcalc/DmpCeff.hh

370 lines
12 KiB
C++
Raw Normal View History

2018-09-28 17:54:21 +02:00
// OpenSTA, Static Timing Analyzer
// Copyright (c) 2026, Parallax Software, Inc.
2018-09-28 17:54:21 +02:00
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2018-09-28 17:54:21 +02:00
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software.
//
// Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
//
// This notice may not be removed or altered from any source distribution.
2018-09-28 17:54:21 +02:00
2020-02-16 01:13:16 +01:00
#pragma once
2018-09-28 17:54:21 +02:00
#include <optional>
#include <utility>
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
#include <Eigen/Core>
#include <Eigen/Dense>
2020-04-05 23:53:44 +02:00
#include "LibertyClass.hh"
DelayCalc reorg commit 410ed56c2c2d0d7afb0e84d0c65d5ff75234e9e3 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Nov 19 08:44:13 2023 -0700 ArcDelayCalcBase -> DelayCalcBase Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 1fdfebe2838c47f6c1866c8a10b14df6439506e0 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Nov 19 08:25:36 2023 -0700 LumpedCapDelayCalc::inputPortDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 3a5e1d01aaff240b2f71d006d620ccd6a70bce6d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 16:32:32 2023 -0700 gateDelayInit cleanup Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d0133319126ae4a488a7b31679fbf6507c7f6266 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 15:36:12 2023 -0700 mv RCDelayCalc to ArcDelayCalcBase Signed-off-by: James Cherry <cherry@parallaxsw.com> commit fd028e6ba5e092243a84685eb1756a8e4e4bad76 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 14:32:53 2023 -0700 ArcDelayCalcBase Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0ce9cf4c766f7419b998b40aed5af14df97249f1 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 10:57:41 2023 -0700 ParallelArcDelayCalc -> ParallelDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 7fa7db6b252f1450fa5b546f5d33d8cb8a94d4bb Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 08:45:01 2023 -0700 parallelGateDelay args Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6b85756774ce049c0f5f123f6d60ebbcd62cdd2b Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 19:55:20 2023 -0700 TimingModel cell_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit e536d6b0ca0d01e2ad8bd609ad20f9a02497d8f5 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 18:07:11 2023 -0700 TimingModel cell_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d2d622da4206e06d176e4ae741334fde8df35007 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 17:21:15 2023 -0700 rm drvr_cell from arc dcalc funcs Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 522961e8f58bc1a0f0530a0a5218086280a2bcb0 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 16:24:34 2023 -0700 tr -> rf Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 29aa0ed40345611b9e3a898342ecc17f6355396f Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 13:17:44 2023 -0700 GraphDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 934d9f19c52c62925b23ae9b457f14d25e818f1a Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 12:52:55 2023 -0700 ParallelArcDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d5687d9482ad0f572b017f0ef806ba8e6ff8b6fa Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 12:16:05 2023 -0700 ParallelArcDelayCalc pvt Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0de501e5bf2329364b572d1360c18d5aedf3b841 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 10:46:22 2023 -0700 ParallelArcDelayCalc::findMultiDrvrGateDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d7457b9e335ed5fa583798e0512914aab6524fcc Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 10:19:01 2023 -0700 mv multi_drvr_slew_factor_ to ParallelArcDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit afec4daa2ab6dd61a2450f1ac8a8cad1ef015a29 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 08:02:40 2023 -0700 MultiDrvrNet::net_caps vector Signed-off-by: James Cherry <cherry@parallaxsw.com> commit b450b3a35616ffc8d85610158a91c5d9483b6958 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 07:46:43 2023 -0700 sic Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 65767403b3b2ab4e6f7552625accf9aa4766628a Author: James Cherry <cherry@parallaxsw.com> Date: Tue Nov 14 17:49:22 2023 -0700 Sta::connectedCap simplify Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 85bdb8f3362413e7b05f49447a0383140cbb924f Author: James Cherry <cherry@parallaxsw.com> Date: Tue Nov 14 16:43:38 2023 -0700 ParallelArcDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 4feea3ba2277d53697b644d79832e309ce98058a Author: James Cherry <cherry@parallaxsw.com> Date: Tue Nov 14 15:10:18 2023 -0700 mv parallel dcalc to arc delay calc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 915ed28a2c05acce6569c7933366ef94da8bfaeb Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 13 17:47:14 2023 -0700 rm MultiDrvrNet::delays_valid_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2384eb4e5bdca1410c4bf5e23f35bfb49f013e74 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 13 16:02:57 2023 -0700 mkae MultiDrvrNets on the fly Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2023-11-19 18:04:45 +01:00
#include "LumpedCapDelayCalc.hh"
2018-09-28 17:54:21 +02:00
namespace sta {
2020-04-05 20:35:51 +02:00
class GateTableModel;
2018-09-28 17:54:21 +02:00
// Base class for Dartu/Menezes/Pileggi algorithm.
// Derived classes handle different cases of zero values in the Pi model.
class DmpAlg : public StaState
{
public:
DmpAlg(int nr_order,
StaState *sta);
~DmpAlg() override = default;
virtual std::string_view name() = 0;
// Set driver model and pi model parameters for delay calculation.
virtual void init(const LibertyLibrary *library,
const LibertyCell *drvr_cell,
const Pvt *pvt,
const GateTableModel *gate_model,
const RiseFall *rf,
double rd,
double in_slew,
double c2,
double rpi,
double c1);
virtual std::pair<double, double> gateDelaySlew() = 0;
virtual std::pair<double, double> loadDelaySlew(const Pin *load_pin,
double elmore);
double ceff() { return ceff_; }
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
virtual void
evalDmpEqns(Eigen::Vector3d &x,
Eigen::Vector3d &fvec,
Eigen::Matrix3d &fjac) = 0;
// Output response to vs(t) ramp driving pi model load (vo, dvo_dt).
std::pair<double, double> Vo(double t);
// Load response to driver waveform (vl, dvl/dt).
std::pair<double, double> Vl(double t);
protected:
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
void newtonRaphson(Eigen::Vector3d &x);
// Solves J * p = -f using a fast analytical solver with singularity checks.
// Can be easily swapped to LU with partial pivoting if needed.
Eigen::Vector3d solveNewtonStep(const Eigen::Matrix3d &fjac,
const Eigen::Vector3d &fvec);
// Find driver parameters t0, delta_t, Ceff.
void findDriverParams(double ceff);
std::pair<double, double> gateCapDelaySlew(double ceff);
std::tuple<double, double, double> gateDelays(double ceff);
// Partial derivatives of y(t) jacobian (dydt0, dyddt, dydcl).
std::tuple<double, double, double> dy(double t,
double t0,
double dt,
double cl);
double y0dt(double t,
double cl);
double y0dcl(double t,
double cl);
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
void showX(const Eigen::Vector3d &x);
void showFvec(const Eigen::Vector3d &fvec);
void showJacobian(const Eigen::Matrix3d &fjac);
std::pair<double, double> findDriverDelaySlew();
double findVoCrossing(double vth,
double t_lower,
double t_upper);
void showVo();
double findVlCrossing(double vth,
double t_lower,
double t_upper);
void showVl();
void fail(std::string_view reason);
// Output response to vs(t) ramp driving capacitive load (y, t1).
std::pair<double, double> y(double t,
double t0,
double dt,
double cl);
// Output response to unit ramp driving capacitive load.
double y0(double t,
double cl);
// Output response to unit ramp driving pi model load.
// Unit ramp output at pi load (vo, dvo_dt).
virtual std::pair<double, double> V0(double t) = 0;
// Upper bound on time that vo crosses vh.
virtual double voCrossingUpperBound() = 0;
// Load responce to driver unit ramp.
// Unit ramp load response (vl, dvl_dt).
virtual std::pair<double, double> Vl0(double t) = 0;
// Upper bound on time that vl crosses vh.
double vlCrossingUpperBound();
// Inputs to the delay calculator.
const LibertyCell *drvr_cell_;
const LibertyLibrary *drvr_library_;
const Pvt *pvt_;
const GateTableModel *gate_model_;
double in_slew_;
double c2_{0.0};
double rpi_{0.0};
double c1_{0.0};
double rd_;
// Logic threshold (percentage of supply voltage).
double vth_;
// Slew lower limit (percentage of supply voltage).
double vl_;
// Slew upper limit (percentage of supply voltage).
double vh_;
// Table slews are scaled by slew_derate to get
// measured slews from vl to vh.
double slew_derate_;
// Driver parameters calculated by this algorithm.
double t0_;
double dt_;
double ceff_;
// Driver parameter Newton-Raphson state.
int nr_order_;
static constexpr int max_nr_order_ = 3;
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
// Driver slew used to check load delay.
double drvr_slew_;
double vo_delay_;
// True if the driver parameters are valid for finding the load delays.
bool driver_valid_;
// Load rspf elmore delay.
double elmore_;
double p3_;
// Tolerance (as a scale of value) for driver parameters (Ceff, delta t, t0).
static constexpr double driver_param_tol_ = .01;
// Waveform threshold crossing time tolerance (1.0 = 100%).
static constexpr double vth_time_tol_ = .01;
// Max iterations for findRoot.
static constexpr int find_root_max_iter_ = 20;
static inline int newton_raphson_max_iter_ = 100;
// A small number used by luDecomp.
static constexpr double tiny_double_ = 1.0e-20;
};
// Capacitive load.
class DmpCap : public DmpAlg
{
public:
DmpCap(StaState *sta);
std::string_view name() override { return "cap"; }
void init(const LibertyLibrary *library,
const LibertyCell *drvr_cell,
const Pvt *pvt,
const GateTableModel *gate_model,
const RiseFall *rf,
double rd,
double in_slew,
double c2,
double rpi,
double c1) override;
std::pair<double, double> gateDelaySlew() override;
std::pair<double, double> loadDelaySlew(const Pin *,
double elmore) override;
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
void
evalDmpEqns(Eigen::Vector3d &x,
Eigen::Vector3d &fvec,
Eigen::Matrix3d &fjac) override;
protected:
double voCrossingUpperBound() override;
std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override;
};
// No non-zero pi model parameters, two poles, one zero
class DmpPi : public DmpAlg
{
public:
DmpPi(StaState *sta);
std::string_view name() override { return "Pi"; }
void init(const LibertyLibrary *library,
const LibertyCell *drvr_cell,
const Pvt *pvt,
const GateTableModel *gate_model,
const RiseFall *rf,
double rd,
double in_slew,
double c2,
double rpi,
double c1) override;
std::pair<double, double> gateDelaySlew() override;
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
void
evalDmpEqns(Eigen::Vector3d &x,
Eigen::Vector3d &fvec,
Eigen::Matrix3d &fjac) override;
protected:
double voCrossingUpperBound() override;
std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override;
private:
void findDriverParamsPi();
double ipiIceff(double t0,
double dt,
double ceff_time,
double ceff);
// Poles/zero.
double p1_{0.0};
double p2_{0.0};
double z1_{0.0};
// Residues.
double k0_{0.0};
double k1_{0.0};
double k2_{0.0};
double k3_{0.0};
double k4_{0.0};
// Ipi coefficients.
double A_{0.0};
double B_{0.0};
double D_{0.0};
};
// Capacitive load, so Ceff is known.
// Solve for t0, delta t.
class DmpOnePole : public DmpAlg
{
public:
DmpOnePole(StaState *sta);
Refactor DMP solver to use Eigen and implement Determinant Guarded solver (#450) This commit refactors the Dartu-Menezes-Pileggi (DMP) effective capacitance algorithm solver to use the Eigen library, and implements a Determinant Guarded solver to handle singular and near-singular Jacobians safely and efficiently. Key changes: 1. Refactored the DMP solver to use Eigen stack-based data structures, replacing the custom Crout LU decomposition and solver. 2. Extracted the linear solver logic into a dedicated helper function DmpAlg::solveNewtonStep. 3. Implemented a "Determinant Guarded" solver: - Manually checks the determinant of the Jacobian (safety guard). - Throws a DmpError if the determinant is dangerously close to zero (|det| < 1e-12), safely triggering the lumped capacitance fallback. - Otherwise, solves using Eigen's highly optimized analytical inverse (fast path). 4. Added documentation in the comments on how to easily swap back to LU decomposition with partial pivoting (PartialPivLU) if any numerical precision issues arise in the future. Benchmark Results (Optimized Release Build, 5,288 DMP calls): | Test Case | Calls | 1. Original (Crout LU) | 2. Eigen (PartialPivLU) | 3. Eigen (Determinant Guarded) | Speedup (3 vs 1) | Speedup (3 vs 2) | | :--- | :---: | :---: | :---: | :---: | :---: | :---: | | power | 2,608 | 1.8822 ms | 1.6791 ms | 1.2702 ms | +32.5% | +24.4% | | power_vcd | 2,608 | 1.8729 ms | 1.6704 ms | 1.2768 ms | +31.8% | +23.6% | | spef_parasitics | 24 | 0.0193 ms | 0.0187 ms | 0.0140 ms | +27.5% | +25.1% | | mcmm3 | 48 | 0.0728 ms | 0.0756 ms | 0.0817 ms | -12.2% | -8.1% | | Total DMP Time | 5,288 | 3.8472 ms | 3.4438 ms | 2.6427 ms | +31.3% | +23.3% |
2026-06-18 22:52:14 +02:00
void
evalDmpEqns(Eigen::Vector3d &x,
Eigen::Vector3d &fvec,
Eigen::Matrix3d &fjac) override;
protected:
double voCrossingUpperBound() override;
};
// C2 = 0, one pole, one zero.
class DmpZeroC2 : public DmpOnePole
{
public:
DmpZeroC2(StaState *sta);
std::string_view name() override { return "c2=0"; }
void init(const LibertyLibrary *drvr_library,
const LibertyCell *drvr_cell,
const Pvt *pvt,
const GateTableModel *gate_model,
const RiseFall *rf,
double rd,
double in_slew,
double c2,
double rpi,
double c1) override;
std::pair<double, double> gateDelaySlew() override;
protected:
std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override;
double voCrossingUpperBound() override;
private:
// Pole/zero.
double p1_{0.0};
double z1_{0.0};
// Residues.
double k0_{0.0};
double k1_{0.0};
double k2_{0.0};
double k3_{0.0};
};
2018-09-28 17:54:21 +02:00
// Delay calculator using Dartu/Menezes/Pileggi effective capacitance
// algorithm for RSPF loads.
DelayCalc reorg commit 410ed56c2c2d0d7afb0e84d0c65d5ff75234e9e3 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Nov 19 08:44:13 2023 -0700 ArcDelayCalcBase -> DelayCalcBase Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 1fdfebe2838c47f6c1866c8a10b14df6439506e0 Author: James Cherry <cherry@parallaxsw.com> Date: Sun Nov 19 08:25:36 2023 -0700 LumpedCapDelayCalc::inputPortDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 3a5e1d01aaff240b2f71d006d620ccd6a70bce6d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 16:32:32 2023 -0700 gateDelayInit cleanup Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d0133319126ae4a488a7b31679fbf6507c7f6266 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 15:36:12 2023 -0700 mv RCDelayCalc to ArcDelayCalcBase Signed-off-by: James Cherry <cherry@parallaxsw.com> commit fd028e6ba5e092243a84685eb1756a8e4e4bad76 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 14:32:53 2023 -0700 ArcDelayCalcBase Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0ce9cf4c766f7419b998b40aed5af14df97249f1 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 10:57:41 2023 -0700 ParallelArcDelayCalc -> ParallelDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 7fa7db6b252f1450fa5b546f5d33d8cb8a94d4bb Author: James Cherry <cherry@parallaxsw.com> Date: Fri Nov 17 08:45:01 2023 -0700 parallelGateDelay args Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6b85756774ce049c0f5f123f6d60ebbcd62cdd2b Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 19:55:20 2023 -0700 TimingModel cell_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit e536d6b0ca0d01e2ad8bd609ad20f9a02497d8f5 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 18:07:11 2023 -0700 TimingModel cell_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d2d622da4206e06d176e4ae741334fde8df35007 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 17:21:15 2023 -0700 rm drvr_cell from arc dcalc funcs Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 522961e8f58bc1a0f0530a0a5218086280a2bcb0 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 16:24:34 2023 -0700 tr -> rf Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 29aa0ed40345611b9e3a898342ecc17f6355396f Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 13:17:44 2023 -0700 GraphDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 934d9f19c52c62925b23ae9b457f14d25e818f1a Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 12:52:55 2023 -0700 ParallelArcDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d5687d9482ad0f572b017f0ef806ba8e6ff8b6fa Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 12:16:05 2023 -0700 ParallelArcDelayCalc pvt Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0de501e5bf2329364b572d1360c18d5aedf3b841 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 10:46:22 2023 -0700 ParallelArcDelayCalc::findMultiDrvrGateDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit d7457b9e335ed5fa583798e0512914aab6524fcc Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 10:19:01 2023 -0700 mv multi_drvr_slew_factor_ to ParallelArcDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit afec4daa2ab6dd61a2450f1ac8a8cad1ef015a29 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 08:02:40 2023 -0700 MultiDrvrNet::net_caps vector Signed-off-by: James Cherry <cherry@parallaxsw.com> commit b450b3a35616ffc8d85610158a91c5d9483b6958 Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 16 07:46:43 2023 -0700 sic Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 65767403b3b2ab4e6f7552625accf9aa4766628a Author: James Cherry <cherry@parallaxsw.com> Date: Tue Nov 14 17:49:22 2023 -0700 Sta::connectedCap simplify Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 85bdb8f3362413e7b05f49447a0383140cbb924f Author: James Cherry <cherry@parallaxsw.com> Date: Tue Nov 14 16:43:38 2023 -0700 ParallelArcDelayCalc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 4feea3ba2277d53697b644d79832e309ce98058a Author: James Cherry <cherry@parallaxsw.com> Date: Tue Nov 14 15:10:18 2023 -0700 mv parallel dcalc to arc delay calc Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 915ed28a2c05acce6569c7933366ef94da8bfaeb Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 13 17:47:14 2023 -0700 rm MultiDrvrNet::delays_valid_ Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2384eb4e5bdca1410c4bf5e23f35bfb49f013e74 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 13 16:02:57 2023 -0700 mkae MultiDrvrNets on the fly Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2023-11-19 18:04:45 +01:00
class DmpCeffDelayCalc : public LumpedCapDelayCalc
2018-09-28 17:54:21 +02:00
{
public:
DmpCeffDelayCalc(StaState *sta);
bool reduceSupported() const override { return true; }
ArcDelayCalc api update for multiple drivers commit a78442d7d6672bfcbea5f5007803ab27891b9eab Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 7 13:40:02 2024 -0700 rm OutputWaveforms::currentVoltage Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 074e1c93d4957425c0f2a3afdfce8f0e06ff98a1 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 13 16:49:08 2023 -0700 MultiDrvrNet remove instead of update Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0f6deec2ffcbe85a1c473525b93f6a6514692181 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 13 16:43:24 2023 -0700 MultiDrvrNet remove instead of update Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2f5f48fe09bacd101d1e909f45e087ba8c620561 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Dec 11 09:24:54 2023 -0700 compile errors Signed-off-by: James Cherry <cherry@parallaxsw.com> commit e8fc4292e325f7ac10bd8e5d57b5a8111abb05ed Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 18:25:04 2023 -0700 ArcDcalcWaveforms Signed-off-by: James Cherry <cherry@parallaxsw.com> commit be114b10adca194d80ac9529e8635c11ed9c1c32 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 11:34:59 2023 -0700 GraphDelayCalc::findDriverArcDelays Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 7b71e137b088c1293e628e594dde6a8223927ee8 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 10:39:30 2023 -0700 GraphDelayCalc::findDriverArcDelays Signed-off-by: James Cherry <cherry@parallaxsw.com> commit b13a791cd57c5b9f9b454b3cf22959fbe3b9667e Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:14:09 2023 -0700 unused arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit abf90ca7c08fd349cfb68554bdeae5a9c3b91a23 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:12:52 2023 -0700 unused arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6bda70448ef133586594503d78b8838421f7a52d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:10:04 2023 -0700 gateDelay rm pvt arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2f51ed07fa14f039a048c3a146ca1b017fb45f16 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 10:24:57 2023 -0700 dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 362950b9d9aa52f3c331c1007a6ee6a34140812e Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 6 17:00:45 2023 -0700 ArcDcalcResult gateDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 91f1307ac04752e00dfde42b34e84f66fdb60a57 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Dec 4 17:22:40 2023 -0700 ArcDcalcArg/Result Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 74d289e450edf54b1a9215b92c85b1d6a011820d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 1 17:45:04 2023 -0700 multi drvr init Signed-off-by: James Cherry <cherry@parallaxsw.com> commit c956838aba74c2f27280253f0452e0350bb05c33 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 1 12:10:23 2023 -0800 arc dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 5aa2c42833e5f68e901d4ac61d8bef426252e5ab Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 30 15:42:43 2023 -0800 dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 434327b7d80fdf8fe3410390c88b299b46e9139b Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 30 11:36:21 2023 -0800 arc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 263e1dee49d7133653fbe0bad9b8243ba5259548 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Nov 29 18:48:32 2023 -0800 ArcDelayCalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a9f05513c09564d75cb377a5a89399a250ab5d6b Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 27 10:48:59 2023 -0800 ArcDelayCalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2024-01-07 21:44:04 +01:00
ArcDcalcResult gateDelay(const Pin *drvr_pin,
const TimingArc *arc,
const Slew &in_slew,
float load_cap,
const Parasitic *parasitic,
const LoadPinIndexMap &load_pin_index_map,
const Scene *scene,
const MinMax *min_max) override;
std::string reportGateDelay(const Pin *drvr_pin,
const TimingArc *arc,
const Slew &in_slew,
float load_cap,
const Parasitic *parasitic,
const LoadPinIndexMap &load_pin_index_map,
const Scene *scene,
const MinMax *min_max,
int digits) override;
ArcDelayCalc api update for multiple drivers commit a78442d7d6672bfcbea5f5007803ab27891b9eab Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 7 13:40:02 2024 -0700 rm OutputWaveforms::currentVoltage Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 074e1c93d4957425c0f2a3afdfce8f0e06ff98a1 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 13 16:49:08 2023 -0700 MultiDrvrNet remove instead of update Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0f6deec2ffcbe85a1c473525b93f6a6514692181 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 13 16:43:24 2023 -0700 MultiDrvrNet remove instead of update Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2f5f48fe09bacd101d1e909f45e087ba8c620561 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Dec 11 09:24:54 2023 -0700 compile errors Signed-off-by: James Cherry <cherry@parallaxsw.com> commit e8fc4292e325f7ac10bd8e5d57b5a8111abb05ed Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 18:25:04 2023 -0700 ArcDcalcWaveforms Signed-off-by: James Cherry <cherry@parallaxsw.com> commit be114b10adca194d80ac9529e8635c11ed9c1c32 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 11:34:59 2023 -0700 GraphDelayCalc::findDriverArcDelays Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 7b71e137b088c1293e628e594dde6a8223927ee8 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 10:39:30 2023 -0700 GraphDelayCalc::findDriverArcDelays Signed-off-by: James Cherry <cherry@parallaxsw.com> commit b13a791cd57c5b9f9b454b3cf22959fbe3b9667e Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:14:09 2023 -0700 unused arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit abf90ca7c08fd349cfb68554bdeae5a9c3b91a23 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:12:52 2023 -0700 unused arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6bda70448ef133586594503d78b8838421f7a52d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:10:04 2023 -0700 gateDelay rm pvt arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2f51ed07fa14f039a048c3a146ca1b017fb45f16 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 10:24:57 2023 -0700 dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 362950b9d9aa52f3c331c1007a6ee6a34140812e Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 6 17:00:45 2023 -0700 ArcDcalcResult gateDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 91f1307ac04752e00dfde42b34e84f66fdb60a57 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Dec 4 17:22:40 2023 -0700 ArcDcalcArg/Result Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 74d289e450edf54b1a9215b92c85b1d6a011820d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 1 17:45:04 2023 -0700 multi drvr init Signed-off-by: James Cherry <cherry@parallaxsw.com> commit c956838aba74c2f27280253f0452e0350bb05c33 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 1 12:10:23 2023 -0800 arc dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 5aa2c42833e5f68e901d4ac61d8bef426252e5ab Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 30 15:42:43 2023 -0800 dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 434327b7d80fdf8fe3410390c88b299b46e9139b Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 30 11:36:21 2023 -0800 arc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 263e1dee49d7133653fbe0bad9b8243ba5259548 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Nov 29 18:48:32 2023 -0800 ArcDelayCalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a9f05513c09564d75cb377a5a89399a250ab5d6b Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 27 10:48:59 2023 -0800 ArcDelayCalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2024-01-07 21:44:04 +01:00
void copyState(const StaState *sta) override;
2018-09-28 17:54:21 +02:00
protected:
ArcDelayCalc api update for multiple drivers commit a78442d7d6672bfcbea5f5007803ab27891b9eab Author: James Cherry <cherry@parallaxsw.com> Date: Sun Jan 7 13:40:02 2024 -0700 rm OutputWaveforms::currentVoltage Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 074e1c93d4957425c0f2a3afdfce8f0e06ff98a1 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 13 16:49:08 2023 -0700 MultiDrvrNet remove instead of update Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 0f6deec2ffcbe85a1c473525b93f6a6514692181 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 13 16:43:24 2023 -0700 MultiDrvrNet remove instead of update Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2f5f48fe09bacd101d1e909f45e087ba8c620561 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Dec 11 09:24:54 2023 -0700 compile errors Signed-off-by: James Cherry <cherry@parallaxsw.com> commit e8fc4292e325f7ac10bd8e5d57b5a8111abb05ed Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 18:25:04 2023 -0700 ArcDcalcWaveforms Signed-off-by: James Cherry <cherry@parallaxsw.com> commit be114b10adca194d80ac9529e8635c11ed9c1c32 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 11:34:59 2023 -0700 GraphDelayCalc::findDriverArcDelays Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 7b71e137b088c1293e628e594dde6a8223927ee8 Author: James Cherry <cherry@parallaxsw.com> Date: Sat Dec 9 10:39:30 2023 -0700 GraphDelayCalc::findDriverArcDelays Signed-off-by: James Cherry <cherry@parallaxsw.com> commit b13a791cd57c5b9f9b454b3cf22959fbe3b9667e Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:14:09 2023 -0700 unused arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit abf90ca7c08fd349cfb68554bdeae5a9c3b91a23 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:12:52 2023 -0700 unused arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 6bda70448ef133586594503d78b8838421f7a52d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 13:10:04 2023 -0700 gateDelay rm pvt arg Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 2f51ed07fa14f039a048c3a146ca1b017fb45f16 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 8 10:24:57 2023 -0700 dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 362950b9d9aa52f3c331c1007a6ee6a34140812e Author: James Cherry <cherry@parallaxsw.com> Date: Wed Dec 6 17:00:45 2023 -0700 ArcDcalcResult gateDelay Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 91f1307ac04752e00dfde42b34e84f66fdb60a57 Author: James Cherry <cherry@parallaxsw.com> Date: Mon Dec 4 17:22:40 2023 -0700 ArcDcalcArg/Result Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 74d289e450edf54b1a9215b92c85b1d6a011820d Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 1 17:45:04 2023 -0700 multi drvr init Signed-off-by: James Cherry <cherry@parallaxsw.com> commit c956838aba74c2f27280253f0452e0350bb05c33 Author: James Cherry <cherry@parallaxsw.com> Date: Fri Dec 1 12:10:23 2023 -0800 arc dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 5aa2c42833e5f68e901d4ac61d8bef426252e5ab Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 30 15:42:43 2023 -0800 dcalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 434327b7d80fdf8fe3410390c88b299b46e9139b Author: James Cherry <cherry@parallaxsw.com> Date: Thu Nov 30 11:36:21 2023 -0800 arc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit 263e1dee49d7133653fbe0bad9b8243ba5259548 Author: James Cherry <cherry@parallaxsw.com> Date: Wed Nov 29 18:48:32 2023 -0800 ArcDelayCalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> commit a9f05513c09564d75cb377a5a89399a250ab5d6b Author: James Cherry <cherry@parallaxsw.com> Date: Mon Nov 27 10:48:59 2023 -0800 ArcDelayCalc api Signed-off-by: James Cherry <cherry@parallaxsw.com> Signed-off-by: James Cherry <cherry@parallaxsw.com>
2024-01-07 21:44:04 +01:00
virtual void loadDelaySlew(const Pin *load_pin,
double drvr_slew,
const RiseFall *rf,
const LibertyLibrary *drvr_library,
const Parasitic *parasitic,
// Return values.
double &wire_delay,
double &load_slew) = 0;
std::pair<double, double> gateDelaySlew();
std::optional<std::pair<double, double>>
loadDelaySlewElmore(const Pin *load_pin,
double elmore);
2018-09-28 17:54:21 +02:00
// Select the appropriate special case Dartu/Menezes/Pileggi algorithm.
void setCeffAlgorithm(const LibertyLibrary *library,
const LibertyCell *cell,
const Pvt *pvt,
const GateTableModel *gate_model,
const RiseFall *rf,
double in_slew,
double c2,
double rpi,
double c1);
2018-09-28 17:54:21 +02:00
const Parasitics *parasitics_;
2018-09-28 17:54:21 +02:00
static bool unsuppored_model_warned_;
private:
// Dmp algorithms for each special pi model case.
DmpCap dmp_cap_;
DmpPi dmp_pi_;
DmpZeroC2 dmp_zero_c2_;
DmpAlg *dmp_alg_{nullptr};
2018-09-28 17:54:21 +02:00
};
2026-04-13 23:58:16 +02:00
} // namespace sta