clang tidy

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2026-04-15 09:38:10 -07:00
parent 63efee64bf
commit 21848bcdd2
172 changed files with 1402 additions and 1589 deletions

View File

@ -59,6 +59,7 @@ Checks: >
-modernize-use-transparent-functors, -modernize-use-transparent-functors,
misc-*, misc-*,
-misc-const-correctness, -misc-const-correctness,
-misc-multiple-inheritance,
-misc-no-recursion, -misc-no-recursion,
-misc-non-private-member-variables-in-classes, -misc-non-private-member-variables-in-classes,
-misc-redundant-expression, -misc-redundant-expression,
@ -72,6 +73,8 @@ Checks: >
# Excludes system and third-party paths such as /opt/local/include. # Excludes system and third-party paths such as /opt/local/include.
HeaderFilterRegex: '.*/(app|cmake|dcalc|graph|liberty|network|parasitics|power|sdc|sdf|search|spice|tcl|util|verilog|include/sta|build/include/sta)/.*' HeaderFilterRegex: '.*/(app|cmake|dcalc|graph|liberty|network|parasitics|power|sdc|sdf|search|spice|tcl|util|verilog|include/sta|build/include/sta)/.*'
# Bison-generated parser headers (build/{Liberty,Verilog,...}Parse.hh); gzstream (e.g. util/gzstream.hh). # util/gzstream.hh
ExcludeHeaderFilterRegex: '.*/(gzstream\.h(?:h)?|(?:Liberty|Verilog|Sdf|Spef|Saif|LibExpr)Parse\.hh)$' # util/FlexDisableRegister.hh
# Bison-generated parser headers (build/{Liberty,Verilog,...}Parse.hh)
ExcludeHeaderFilterRegex: '(.*/)?(gzstream\.hh|FlexDisableRegister\.hh|(Liberty|Verilog|Sdf|Spef|Saif|LibExpr)Parse\.hh)$'
FormatStyle: none FormatStyle: none

View File

@ -22,16 +22,16 @@
// //
// This notice may not be removed or altered from any source distribution. // This notice may not be removed or altered from any source distribution.
#include <memory>
#include "ArcDcalcWaveforms.hh" #include "ArcDcalcWaveforms.hh"
#include "Report.hh" #include <memory>
#include "ArcDelayCalc.hh"
#include "Graph.hh"
#include "GraphDelayCalc.hh"
#include "Liberty.hh" #include "Liberty.hh"
#include "Network.hh" #include "Network.hh"
#include "Graph.hh" #include "Report.hh"
#include "ArcDelayCalc.hh"
#include "GraphDelayCalc.hh"
namespace sta { namespace sta {

View File

@ -27,12 +27,12 @@
#include <cstdlib> #include <cstdlib>
#include <string> #include <string>
#include "StringUtil.hh"
#include "Units.hh"
#include "Liberty.hh"
#include "TimingArc.hh"
#include "Network.hh"
#include "Graph.hh" #include "Graph.hh"
#include "Liberty.hh"
#include "Network.hh"
#include "StringUtil.hh"
#include "TimingArc.hh"
#include "Units.hh"
namespace sta { namespace sta {
@ -165,17 +165,7 @@ ArcDcalcArg::ArcDcalcArg(const Pin *in_pin,
{ {
} }
ArcDcalcArg::ArcDcalcArg(const ArcDcalcArg &arg) : ArcDcalcArg::ArcDcalcArg(const ArcDcalcArg &arg) = default;
in_pin_(arg.in_pin_),
drvr_pin_(arg.drvr_pin_),
edge_(arg.edge_),
arc_(arg.arc_),
in_slew_(arg.in_slew_),
load_cap_(arg.load_cap_),
parasitic_(arg.parasitic_),
input_delay_(arg.input_delay_)
{
}
const RiseFall * const RiseFall *
ArcDcalcArg::inEdge() const ArcDcalcArg::inEdge() const

View File

@ -45,7 +45,7 @@ class arnoldi1
public: public:
arnoldi1() { order=0; n=0; d=nullptr; e=nullptr; U=nullptr; ctot=0.0; sqc=0.0; } arnoldi1() { order=0; n=0; d=nullptr; e=nullptr; U=nullptr; ctot=0.0; sqc=0.0; }
~arnoldi1(); ~arnoldi1();
double elmore(int term_index); double elmore(int k);
// //
// calculate poles/residues for given rdrive // calculate poles/residues for given rdrive
@ -70,12 +70,12 @@ class rcmodel : public ConcreteParasitic,
{ {
public: public:
rcmodel(); rcmodel();
virtual ~rcmodel(); ~rcmodel() override;
virtual float capacitance() const; float capacitance() const override;
virtual PinSet unannotatedLoads(const Pin *drvr_pin, PinSet unannotatedLoads(const Pin *drvr_pin,
const Parasitics *parasitics) const; const Parasitics *parasitics) const override;
const Pin **pinV; // [n] const Pin **pinV{nullptr}; // [n]
}; };
struct timing_table struct timing_table

View File

@ -28,30 +28,34 @@
#include "ArnoldiDelayCalc.hh" #include "ArnoldiDelayCalc.hh"
#include <cstdio> #include <algorithm>
#include <cmath> // abs #include <cmath> // abs
#include <cstddef>
#include <cstdio>
#include <numbers>
#include "Report.hh"
#include "Debug.hh"
#include "Units.hh"
#include "Liberty.hh"
#include "TimingModel.hh"
#include "TimingArc.hh"
#include "TableModel.hh"
#include "PortDirection.hh"
#include "Network.hh"
#include "Graph.hh"
#include "Parasitics.hh"
#include "Sdc.hh"
#include "DelayCalc.hh"
#include "ArcDelayCalc.hh" #include "ArcDelayCalc.hh"
#include "LumpedCapDelayCalc.hh"
#include "GraphDelayCalc.hh"
#include "Variables.hh"
#include "Arnoldi.hh" #include "Arnoldi.hh"
#include "ArnoldiReduce.hh" #include "ArnoldiReduce.hh"
#include "Debug.hh"
#include "DelayCalc.hh"
#include "Graph.hh"
#include "GraphDelayCalc.hh"
#include "Liberty.hh"
#include "LumpedCapDelayCalc.hh"
#include "Network.hh"
#include "Parasitics.hh"
#include "PortDirection.hh"
#include "Report.hh"
#include "Sdc.hh"
#include "TableModel.hh"
#include "TimingArc.hh"
#include "TimingModel.hh"
#include "Units.hh"
#include "Variables.hh"
namespace sta { namespace sta {
// NOLINTBEGIN(modernize-avoid-c-style-cast)
// wireload8 is n^2 // wireload8 is n^2
// do not delete arnoldi parasitics // do not delete arnoldi parasitics
@ -76,7 +80,11 @@ delay_work_get_residues(delay_work *D,
int term_index); int term_index);
static bool static bool
tridiagEV(int n,double *d,double *e,double *p,double **v); tridiagEV(int n,
const double *din,
const double *ein,
double *d,
double **v);
////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////
@ -229,7 +237,7 @@ private:
double *c_x1, double *c_x1,
double *c_y1); double *c_y1);
rcmodel *rcmodel_; rcmodel *rcmodel_{nullptr};
int _pinNmax; int _pinNmax;
double *_delayV; double *_delayV;
double *_slewV; double *_slewV;
@ -246,7 +254,6 @@ makeArnoldiDelayCalc(StaState *sta)
ArnoldiDelayCalc::ArnoldiDelayCalc(StaState *sta) : ArnoldiDelayCalc::ArnoldiDelayCalc(StaState *sta) :
LumpedCapDelayCalc(sta), LumpedCapDelayCalc(sta),
rcmodel_(nullptr),
reduce_(new ArnoldiReduce(sta)), reduce_(new ArnoldiReduce(sta)),
delay_work_(delay_work_create()) delay_work_(delay_work_create())
{ {
@ -362,7 +369,7 @@ ArnoldiDelayCalc::inputPortDelay(const Pin *,
for (int j=1;j<pin_n_;j++) { for (int j=1;j<pin_n_;j++) {
double elmore = rcmodel_->elmore(j); double elmore = rcmodel_->elmore(j);
double wire_delay = 0.6931472*elmore; double wire_delay = std::numbers::ln2 * elmore;
double load_slew = in_slew + c_log*elmore/slew_derate; double load_slew = in_slew + c_log*elmore/slew_derate;
_delayV[j] = wire_delay; _delayV[j] = wire_delay;
_slewV[j] = load_slew; _slewV[j] = load_slew;
@ -487,7 +494,7 @@ ArnoldiDelayCalc::reportGateDelay(const Pin *drvr_pin,
arnoldi1::~arnoldi1() arnoldi1::~arnoldi1()
{ {
free(d); free(d);
free(U); free(reinterpret_cast<void *>(U));
} }
double double
@ -506,13 +513,16 @@ delay_work_create()
int j; int j;
delay_work *D = (delay_work*)malloc(sizeof(delay_work)); delay_work *D = (delay_work*)malloc(sizeof(delay_work));
D->nmax = 256; D->nmax = 256;
D->resi = (double**)malloc(D->nmax*sizeof(double*)); D->resi = (double**)malloc(static_cast<size_t>(D->nmax) * sizeof(double *));
D->resi[0] = (double*)malloc(D->nmax*32*sizeof(double)); D->resi[0] = (double*)malloc(static_cast<size_t>(D->nmax) * 32u * sizeof(double));
for (j=1;j<D->nmax;j++) D->resi[j] = D->resi[0] + j*32; for (j=1;j<D->nmax;j++)
D->v[0] = (double*)malloc(32*32*sizeof(double)); D->resi[j] = D->resi[0] + static_cast<ptrdiff_t>(j) * 32;
for (j=1;j<32;j++) D->v[j] = D->v[0] + j*32; D->v[0] = (double*)malloc(static_cast<size_t>(32) * 32u * sizeof(double));
D->w[0] = (double*)malloc(32*D->nmax*sizeof(double)); for (j=1;j<32;j++)
for (j=1;j<32;j++) D->w[j] = D->w[0] + j*D->nmax; D->v[j] = D->v[0] + static_cast<ptrdiff_t>(j) * 32;
D->w[0] = (double*)malloc(32u * static_cast<size_t>(D->nmax) * sizeof(double));
for (j=1;j<32;j++)
D->w[j] = D->w[0] + static_cast<ptrdiff_t>(j) * D->nmax;
D->lo_thresh = 0.0; D->lo_thresh = 0.0;
D->hi_thresh = 0.0; D->hi_thresh = 0.0;
D->slew_derate = 0.0; D->slew_derate = 0.0;
@ -535,7 +545,7 @@ static void
delay_work_destroy(delay_work *D) delay_work_destroy(delay_work *D)
{ {
free(D->resi[0]); free(D->resi[0]);
free(D->resi); free(reinterpret_cast<void *>(D->resi));
free(D->v[0]); free(D->v[0]);
free(D->w[0]); free(D->w[0]);
free(D); free(D);
@ -547,15 +557,17 @@ delay_work_alloc(delay_work *D,int n)
if (n<=D->nmax) return; if (n<=D->nmax) return;
free(D->w[0]); free(D->w[0]);
free(D->resi[0]); free(D->resi[0]);
free(D->resi); free(reinterpret_cast<void *>(D->resi));
D->nmax *= 2; D->nmax *= 2;
if (n > D->nmax) D->nmax = n; D->nmax = std::max(n, D->nmax);
int j; int j;
D->resi = (double**)malloc(D->nmax*sizeof(double*)); D->resi = (double**)malloc(static_cast<size_t>(D->nmax) * sizeof(double *));
D->resi[0] = (double*)malloc(D->nmax*32*sizeof(double)); D->resi[0] = (double*)malloc(static_cast<size_t>(D->nmax) * 32u * sizeof(double));
for (j=1;j<D->nmax;j++) D->resi[j] = D->resi[0] + j*32; for (j=1;j<D->nmax;j++)
D->w[0] = (double*)malloc(32*D->nmax*sizeof(double)); D->resi[j] = D->resi[0] + static_cast<ptrdiff_t>(j) * 32;
for (j=1;j<32;j++) D->w[j] = D->w[0] + j*D->nmax; D->w[0] = (double*)malloc(32u * static_cast<size_t>(D->nmax) * sizeof(double));
for (j=1;j<32;j++)
D->w[j] = D->w[0] + static_cast<ptrdiff_t>(j) * D->nmax;
} }
void void
@ -622,8 +634,7 @@ void arnoldi1::calculate_poles_res(delay_work *D,
d[0] = dsave; d[0] = dsave;
for (h=0;h<order;h++) { for (h=0;h<order;h++) {
if (p[h]<1e-14) // .01ps p[h] = std::max(p[h], 1e-14); // .01ps floor
p[h]=1e-14;
p[h] = 1.0/p[h]; p[h] = 1.0/p[h];
} }
@ -653,10 +664,10 @@ void arnoldi1::calculate_poles_res(delay_work *D,
// tridiagonal eigenvalues and eigenvectors // tridiagonal eigenvalues and eigenvectors
// assuming all eigenvalues are positive // assuming all eigenvalues are positive
// //
// tridiagEV(int n,double *d,double *e,double *p,double **v) // tridiagEV(n, din, ein, d, v)
// d[0]..d[n-1] diagonal elements // din[0]..din[n-1] diagonal elements (input)
// e[0]..e[n-2] off-diagonal elements // ein[0]..ein[n-2] off-diagonal elements (input)
// p[0],..p[n-1] the eigenvalues // d[0],..d[n-1] the eigenvalues (output)
// v[0],..v[n-1] the eigenvectors // v[0],..v[n-1] the eigenvectors
// M*v[j] = p[j]*v[j] // M*v[j] = p[j]*v[j]
// //
@ -665,7 +676,11 @@ void arnoldi1::calculate_poles_res(delay_work *D,
// (M*v[j])[n-1] = d[n-1]*v[j][n-1]+e[n-2]*v[j][n-2] // (M*v[j])[n-1] = d[n-1]*v[j][n-1]+e[n-2]*v[j][n-2]
// //
static bool static bool
tridiagEV(int n,double *din,double *ein,double *d,double **v) tridiagEV(int n,
const double *din,
const double *ein,
double *d,
double **v)
{ {
int j,k; int j,k;
for (j=0;j<n;j++) for (k=0;k<n;k++) v[j][k]=0.0; for (j=0;j<n;j++) for (k=0;k<n;k++) v[j][k]=0.0;
@ -747,7 +762,12 @@ tridiagEV(int n,double *din,double *ein,double *d,double **v)
// get a waveform point // get a waveform point
static void static void
pr_get_v(double t, double s, int order, double *p, double *rr, double *va) pr_get_v(double t,
double s,
int order,
const double *p,
const double *rr,
double *va)
{ {
*va = 0.0; *va = 0.0;
int h; int h;
@ -765,8 +785,13 @@ pr_get_v(double t, double s, int order, double *p, double *rr, double *va)
} }
static void static void
get_dv(double t, double s, int order, double *p, double *rr, get_dv(double t,
double *va, double *dva) double s,
int order,
const double *p,
const double *rr,
double *va,
double *dva)
{ {
*va = 0.0; *va = 0.0;
*dva = 0.0; *dva = 0.0;
@ -790,12 +815,19 @@ get_dv(double t, double s, int order, double *p, double *rr,
} }
static double static double
solve_t_bracketed(double s,int order,double *p,double *rr, solve_t_bracketed(double s,
double val,double x1,double x2,double v1,double v2) int order,
const double *p,
const double *rr,
double val,
double x1,
double x2,
double v1,
double v2)
{ {
int j; int j;
double df,dx,dxold,f,f2,f1; double df,dx,dxold,f,f2,f1;
double temp,xh,xl,rts; double temp,xh,x_lo,rts;
double xacc = .001e-12; // .001ps double xacc = .001e-12; // .001ps
f1 = v1-val; f1 = v1-val;
f2 = v2-val; f2 = v2-val;
@ -803,12 +835,12 @@ solve_t_bracketed(double s,int order,double *p,double *rr,
if (f2==0.0) return x2; if (f2==0.0) return x2;
rts = (f1*x2-f2*x1)/(f1-f2); rts = (f1*x2-f2*x1)/(f1-f2);
if (f1<f2) { if (f1<f2) {
xl = x1; x_lo = x1;
xh = x2; xh = x2;
if (0.0<f1) return x1; if (0.0<f1) return x1;
if (f2<0.0) return x2; if (f2<0.0) return x2;
} else { } else {
xl = x2; x_lo = x2;
xh = x1; xh = x1;
if (0.0<f2) return x2; if (0.0<f2) return x2;
if (f1<0.0) return x1; if (f1<0.0) return x1;
@ -819,19 +851,19 @@ solve_t_bracketed(double s,int order,double *p,double *rr,
f -= val; f -= val;
double flast = 0.0; double flast = 0.0;
for (j=1;j<10;j++) { for (j=1;j<10;j++) {
if ((((rts-xh)*df-f)*((rts-xl)*df-f) >= 0.0) if ((((rts-xh)*df-f)*((rts-x_lo)*df-f) >= 0.0)
|| (std::abs(2.0*f) > std::abs(dxold*df))) { || (std::abs(2.0*f) > std::abs(dxold*df))) {
dxold = dx; dxold = dx;
dx = 0.5*(xh-xl); dx = 0.5*(xh-x_lo);
if (flast*f >0.0) { if (flast*f >0.0) {
// 2 successive bisections in same direction, // 2 successive bisections in same direction,
// accelerate // accelerate
if (f<0.0) dx = 0.9348*(xh-xl); if (f<0.0) dx = 0.9348*(xh-x_lo);
else dx = 0.0625*(xh-xl); else dx = 0.0625*(xh-x_lo);
} }
flast = f; flast = f;
rts = xl+dx; rts = x_lo+dx;
if (xl == rts) { if (x_lo == rts) {
return rts; return rts;
} }
} else { } else {
@ -849,13 +881,13 @@ solve_t_bracketed(double s,int order,double *p,double *rr,
} }
get_dv(rts,s,order,p,rr,&f,&df); f -= val; get_dv(rts,s,order,p,rr,&f,&df); f -= val;
if (f<0.0) if (f<0.0)
xl = rts; x_lo = rts;
else else
xh = rts; xh = rts;
} }
if (std::abs(f)<1e-6) // 1uV if (std::abs(f)<1e-6) // 1uV
return rts; return rts;
return 0.5*(xl+xh); return 0.5*(x_lo+xh);
} }
void void
@ -949,8 +981,7 @@ ArnoldiDelayCalc::pr_solve3(double s,
for (h=1;h<order;h++) if (rr[h]>0.3 && rr[h]>rr[0]) { h0 = h; break; } for (h=1;h<order;h++) if (rr[h]>0.3 && rr[h]>rr[0]) { h0 = h; break; }
} }
double p0 = p[h0]; double p0 = p[h0];
if (p0>10e+9) // 1/10ns p0 = std::min(p0, 10e+9); // 1/10ns cap
p0=10e+9;
double ps,vs,ta,va; double ps,vs,ta,va;
vs = 0.0; vs = 0.0;
for (h=0;h<order;h++) { for (h=0;h<order;h++) {
@ -1034,7 +1065,9 @@ ArnoldiDelayCalc::pr_solve3(double s,
ta = s + 0.7/p0; ta = s + 0.7/p0;
pr_get_v(ta,s,order,p,rr,&va); pr_get_v(ta,s,order,p,rr,&va);
while (va>vmid) { while (va>vmid) {
tmin5 = tmin8 = ta; vmin5 = tmin8 = va; tmin5 = ta;
tmin8 = ta;
vmin5 = va;
ta += 0.7/p0; ta += 0.7/p0;
pr_get_v(ta,s,order,p,rr,&va); pr_get_v(ta,s,order,p,rr,&va);
} }
@ -1064,18 +1097,14 @@ ArnoldiDelayCalc::pr_solve3(double s,
pr_get_v(ta,s,order,p,rr,&va); pr_get_v(ta,s,order,p,rr,&va);
} }
tmax2 = ta; vmax2 = va; tmax2 = ta; vmax2 = va;
if (va < vmid) { while (va > vmid) {
tmax5 = ta; vmax5 = va;
} else while (va > vmid) {
tmin5 = tmin8 = ta; tmin5 = tmin8 = ta;
vmin5 = vmin8 = va; vmin5 = vmin8 = va;
ta += 1.0/p0; ta += 1.0/p0;
pr_get_v(ta,s,order,p,rr,&va); pr_get_v(ta,s,order,p,rr,&va);
} }
tmax5 = ta; vmax5 = va; tmax5 = ta; vmax5 = va;
if (va < vlo) { while (va > vlo) {
tmax8 = ta; vmax8 = va;
} else while (va > vlo) {
tmin8 = ta; tmin8 = ta;
vmin8 = va; vmin8 = va;
ta += 1.0/p0; ta += 1.0/p0;
@ -1248,11 +1277,12 @@ ArnoldiDelayCalc::ra_solve_for_s(delay_work *D,
if (x <= x1) { if (x <= x1) {
y = y1 - 0.5*(x-x1); y = y1 - 0.5*(x-x1);
if (y>1.0) y=1.0; y = std::min(y, 1.0);
} else { } else {
y = y1 - (x-x1)*(0.5 + 8*(x-x1)); y = y1 - (x-x1)*(0.5 + 8*(x-x1));
if (y<y2) y=y2; y = std::max(y, y2);
} }
(void)y;
ra_solve_for_pt(p*s,vlo,&ptlo,&dlo); ra_solve_for_pt(p*s,vlo,&ptlo,&dlo);
ra_solve_for_pt(p*s,vhi,&pthi,&dhi); ra_solve_for_pt(p*s,vhi,&pthi,&dhi);
@ -1405,7 +1435,6 @@ ArnoldiDelayCalc::ar1_ceff_delay(delay_work *D,
if (rdelay == 0.0) { if (rdelay == 0.0) {
rdelay = 1e+3; // 1kohm rdelay = 1e+3; // 1kohm
} }
r = rdelay;
r = ra_get_r(D,tab,rdelay,ctot); r = ra_get_r(D,tab,rdelay,ctot);
if (! (r>0.0 if (! (r>0.0
&& r<100e+3)) // 100khom && r<100e+3)) // 100khom
@ -1436,9 +1465,6 @@ ArnoldiDelayCalc::ar1_ceff_delay(delay_work *D,
units_->timeUnit()->asString(tlox-thix)); units_->timeUnit()->asString(tlox-thix));
} }
ceff = ctot; ceff = ctot;
tab->table->gateDelay(tab->pvt, tab->in_slew, ceff, df, sf);
t50_sy = delayAsFloat(df);
t50_sr = ra_solve_for_t(1.0/(r*ceff),s,0.5);
// calculate s,r,mod -> t50_srmod, // calculate s,r,mod -> t50_srmod,
// then t50_srmod+t50_sy-t50_sr // then t50_srmod+t50_sy-t50_sr
@ -1488,4 +1514,5 @@ ArnoldiDelayCalc::ar1_ceff_delay(delay_work *D,
} }
} }
// NOLINTEND(modernize-avoid-c-style-cast)
} // namespace sta } // namespace sta

View File

@ -28,19 +28,22 @@
#include "ArnoldiReduce.hh" #include "ArnoldiReduce.hh"
#include "Debug.hh" #include <algorithm>
#include "MinMax.hh"
#include "Sdc.hh"
#include "Network.hh"
#include "Units.hh"
#include "Arnoldi.hh" #include "Arnoldi.hh"
#include "Debug.hh"
#include "Format.hh" #include "Format.hh"
#include "MinMax.hh"
#include "Network.hh"
#include "Sdc.hh"
#include "Units.hh"
#include "parasitics/ConcreteParasiticsPvt.hh" #include "parasitics/ConcreteParasiticsPvt.hh"
namespace sta { namespace sta {
// This is legacy C-style code.
// NOLINTBEGIN(modernize-avoid-c-style-cast, bugprone-multi-level-implicit-pointer-conversion, bugprone-implicit-widening-of-multiplication-result)
rcmodel::rcmodel() : rcmodel::rcmodel()
pinV(nullptr)
{ {
} }
@ -87,11 +90,7 @@ const int ArnoldiReduce::ts_point_count_incr_ = 1024;
const int ArnoldiReduce::ts_edge_count_incr_ = 1024; const int ArnoldiReduce::ts_edge_count_incr_ = 1024;
ArnoldiReduce::ArnoldiReduce(StaState *sta) : ArnoldiReduce::ArnoldiReduce(StaState *sta) :
StaState(sta), StaState(sta)
ts_pointNmax(1024),
ts_edgeNmax(1024),
termNmax(256),
dNmax(8)
{ {
ts_pointV = (ts_point *)malloc(ts_pointNmax * sizeof(ts_point)); ts_pointV = (ts_point *)malloc(ts_pointNmax * sizeof(ts_point));
ts_ordV = (int *)malloc(ts_pointNmax * sizeof(int)); ts_ordV = (int *)malloc(ts_pointNmax * sizeof(int));
@ -351,14 +350,14 @@ ArnoldiReduce::makeRcmodelDfs(ts_point *pdrv)
ts_point *p0 = ts_pointV; ts_point *p0 = ts_pointV;
ts_point *pend = p0 + ts_pointN; ts_point *pend = p0 + ts_pointN;
for (p = p0; p != pend; p++) for (p = p0; p != pend; p++)
p->visited = 0; p->visited = false;
ts_edge *e; ts_edge *e;
ts_edge **stackV = ts_stackV; ts_edge **stackV = ts_stackV;
int stackN = 1; int stackN = 1;
stackV[0] = e = pdrv->eV[0]; stackV[0] = e = pdrv->eV[0];
ts_orient(pdrv, e); ts_orient(pdrv, e);
pdrv->visited = 1; pdrv->visited = true;
pdrv->in_edge = nullptr; pdrv->in_edge = nullptr;
pdrv->ts = 0; pdrv->ts = 0;
ts_ordV[0] = pdrv - p0; ts_ordV[0] = pdrv - p0;
@ -376,7 +375,7 @@ ArnoldiReduce::makeRcmodelDfs(ts_point *pdrv)
} }
else { else {
// try to descend // try to descend
q->visited = 1; q->visited = true;
q->ts = ts_ordN++; q->ts = ts_ordN++;
ts_pordV[q->ts] = q; ts_pordV[q->ts] = q;
ts_ordV[q->ts] = q - p0; ts_ordV[q->ts] = q - p0;
@ -531,9 +530,7 @@ ArnoldiReduce::makeRcmodelFromTs()
u0 = _u0; u0 = _u0;
u1 = _u1; u1 = _u1;
double sum, e1; double sum, e1;
order = max_order; order = std::min(n, max_order);
if (n < order)
order = n;
par[0] = -1; par[0] = -1;
r[0] = 0.0; r[0] = 0.0;
@ -682,4 +679,5 @@ ArnoldiReduce::makeRcmodelFromW()
return mod; return mod;
} }
// NOLINTEND(modernize-avoid-c-style-cast, bugprone-multi-level-implicit-pointer-conversion, bugprone-implicit-widening-of-multiplication-result)
} // namespace sta } // namespace sta

View File

@ -52,7 +52,7 @@ class ArnoldiReduce : public StaState
{ {
public: public:
ArnoldiReduce(StaState *sta); ArnoldiReduce(StaState *sta);
~ArnoldiReduce(); ~ArnoldiReduce() override;
rcmodel *reduceToArnoldi(Parasitic *parasitic, rcmodel *reduceToArnoldi(Parasitic *parasitic,
const Pin *drvr_pin, const Pin *drvr_pin,
float coupling_cap_factor, float coupling_cap_factor,
@ -86,11 +86,11 @@ protected:
// rcWork // rcWork
ts_point *ts_pointV; ts_point *ts_pointV;
int ts_pointN; int ts_pointN;
int ts_pointNmax; int ts_pointNmax{1024};
static const int ts_point_count_incr_; static const int ts_point_count_incr_;
ts_edge *ts_edgeV; ts_edge *ts_edgeV;
int ts_edgeN; int ts_edgeN;
int ts_edgeNmax; int ts_edgeNmax{1024};
static const int ts_edge_count_incr_; static const int ts_edge_count_incr_;
ts_edge **ts_eV; ts_edge **ts_eV;
ts_edge **ts_stackV; ts_edge **ts_stackV;
@ -98,14 +98,14 @@ protected:
ts_point **ts_pordV; ts_point **ts_pordV;
int ts_ordN; int ts_ordN;
int termNmax; int termNmax{256};
int termN; int termN;
ts_point *pterm0; ts_point *pterm0;
const Pin **pinV; // fixed order, offset from pterm0 const Pin **pinV; // fixed order, offset from pterm0
int *termV; // from drv-ordered to fixed order int *termV; // from drv-ordered to fixed order
int *outV; // from drv-ordered to ts_pordV int *outV; // from drv-ordered to ts_pordV
int dNmax; int dNmax{8};
double *d; double *d;
double *e; double *e;
double *U0; double *U0;

View File

@ -24,19 +24,20 @@
#include "CcsCeffDelayCalc.hh" #include "CcsCeffDelayCalc.hh"
#include <algorithm>
#include <cmath> #include <cmath>
#include "Debug.hh" #include "Debug.hh"
#include "Units.hh"
#include "Liberty.hh"
#include "TimingArc.hh"
#include "Network.hh"
#include "Graph.hh"
#include "Scene.hh"
#include "Parasitics.hh"
#include "GraphDelayCalc.hh"
#include "DmpDelayCalc.hh" #include "DmpDelayCalc.hh"
#include "FindRoot.hh" #include "FindRoot.hh"
#include "Graph.hh"
#include "GraphDelayCalc.hh"
#include "Liberty.hh"
#include "Network.hh"
#include "Parasitics.hh"
#include "Scene.hh"
#include "TimingArc.hh"
#include "Units.hh"
namespace sta { namespace sta {
@ -53,10 +54,6 @@ makeCcsCeffDelayCalc(StaState *sta)
CcsCeffDelayCalc::CcsCeffDelayCalc(StaState *sta) : CcsCeffDelayCalc::CcsCeffDelayCalc(StaState *sta) :
LumpedCapDelayCalc(sta), LumpedCapDelayCalc(sta),
output_waveforms_(nullptr),
// Includes the Vh:Vdd region.
region_count_(0),
vl_fail_(false),
watch_pin_values_(network_), watch_pin_values_(network_),
capacitance_unit_(units_->capacitanceUnit()), capacitance_unit_(units_->capacitanceUnit()),
table_dcalc_(makeDmpCeffElmoreDelayCalc(sta)) table_dcalc_(makeDmpCeffElmoreDelayCalc(sta))
@ -176,8 +173,8 @@ CcsCeffDelayCalc::gateDelaySlew(const LibertyLibrary *drvr_library,
} }
for (size_t i = 0; i < region_count_; i++) { for (size_t i = 0; i < region_count_; i++) {
double v1 = region_volts_[i]; double seg_v1 = region_volts_[i];
double v2 = region_volts_[i + 1]; double seg_v2 = region_volts_[i + 1];
double t1 = region_times_[i]; double t1 = region_times_[i];
double t2 = region_times_[i + 1]; double t2 = region_times_[i + 1];
@ -186,11 +183,11 @@ CcsCeffDelayCalc::gateDelaySlew(const LibertyLibrary *drvr_library,
// for the charge on c1 from previous segments so it does not // for the charge on c1 from previous segments so it does not
// work well. // work well.
double c1_v1, c1_v2, ignore; double c1_v1, c1_v2, ignore;
vl(t1, rpi_ * c1_, c1_v1, ignore); vLoad(t1, rpi_ * c1_, c1_v1, ignore);
vl(t2, rpi_ * c1_, c1_v2, ignore); vLoad(t2, rpi_ * c1_, c1_v2, ignore);
double q1 = v1 * c2_ + c1_v1 * c1_; double q1 = seg_v1 * c2_ + c1_v1 * c1_;
double q2 = v2 * c2_ + c1_v2 * c1_; double q2 = seg_v2 * c2_ + c1_v2 * c1_;
double ceff = (q2 - q1) / (v2 - v1); double ceff = (q2 - q1) / (seg_v2 - seg_v1);
debugPrint(debug_, "ccs_dcalc", 2, "ceff {}", debugPrint(debug_, "ccs_dcalc", 2, "ceff {}",
capacitance_unit_->asString(ceff)); capacitance_unit_->asString(ceff));
@ -297,7 +294,7 @@ CcsCeffDelayCalc::initRegions(const LibertyLibrary *drvr_library,
report_->error(1701, "unsupported ccs region count."); report_->error(1701, "unsupported ccs region count.");
break; break;
} }
fill(region_ceff_.begin(), region_ceff_.end(), c2_ + c1_); std::ranges::fill(region_ceff_, c2_ + c1_);
} }
void void
@ -402,11 +399,11 @@ rampElmoreV(double t,
// Elmore (one pole) response to 2 segment ramps [0, vth] slew1, [vth, vdd] slew2. // Elmore (one pole) response to 2 segment ramps [0, vth] slew1, [vth, vdd] slew2.
void void
CcsCeffDelayCalc::vl(double t, CcsCeffDelayCalc::vLoad(double t,
double elmore, double elmore,
// Return values. // Return values.
double &vl, double &vl,
double &dvl_dt) double &dvl_dt)
{ {
vl = 0.0; vl = 0.0;
dvl_dt = 0.0; dvl_dt = 0.0;
@ -431,11 +428,11 @@ CcsCeffDelayCalc::vl(double t,
// for debugging // for debugging
double double
CcsCeffDelayCalc::vl(double t, CcsCeffDelayCalc::vLoad(double t,
double elmore) double elmore)
{ {
double vl1, dvl_dt; double vl1, dvl_dt;
vl(t, elmore, vl1, dvl_dt); vLoad(t, elmore, vl1, dvl_dt);
return vl1; return vl1;
} }
@ -447,7 +444,7 @@ CcsCeffDelayCalc::findVlTime(double v,
double t_final = region_ramp_times_[region_count_]; double t_final = region_ramp_times_[region_count_];
auto [time, failed] = auto [time, failed] =
findRoot([&](double t, double &y, double &dy) { findRoot([&](double t, double &y, double &dy) {
vl(t, elmore, y, dy); vLoad(t, elmore, y, dy);
y -= v; y -= v;
}, },
t_init, t_final + elmore * 3.0, .001, 20); t_init, t_final + elmore * 3.0, .001, 20);
@ -539,7 +536,7 @@ CcsCeffDelayCalc::loadWaveform(const Pin *load_pin)
load_times->push_back(t); load_times->push_back(t);
double ignore; double ignore;
vl(t, elmore, v, ignore); vLoad(t, elmore, v, ignore);
double v1 = (drvr_rf_ == RiseFall::rise()) ? v : vdd_ - v; double v1 = (drvr_rf_ == RiseFall::rise()) ? v : vdd_ - v;
load_volts->push_back(v1); load_volts->push_back(v1);
} }

View File

@ -24,8 +24,8 @@
#pragma once #pragma once
#include "LumpedCapDelayCalc.hh"
#include "ArcDcalcWaveforms.hh" #include "ArcDcalcWaveforms.hh"
#include "LumpedCapDelayCalc.hh"
namespace sta { namespace sta {
@ -39,7 +39,7 @@ class CcsCeffDelayCalc : public LumpedCapDelayCalc,
{ {
public: public:
CcsCeffDelayCalc(StaState *sta); CcsCeffDelayCalc(StaState *sta);
virtual ~CcsCeffDelayCalc(); ~CcsCeffDelayCalc() override;
ArcDelayCalc *copy() override; ArcDelayCalc *copy() override;
std::string_view name() const override { return "ccs_ceff"; } std::string_view name() const override { return "ccs_ceff"; }
bool reduceSupported() const override { return true; } bool reduceSupported() const override { return true; }
@ -68,7 +68,7 @@ public:
Waveform watchWaveform(const Pin *pin) override; Waveform watchWaveform(const Pin *pin) override;
protected: protected:
typedef std::vector<double> Region; using Region = std::vector<double>;
void gateDelaySlew(const LibertyLibrary *drvr_library, void gateDelaySlew(const LibertyLibrary *drvr_library,
// Return values. // Return values.
@ -106,13 +106,13 @@ protected:
const Pin *load_pin, const Pin *load_pin,
const Scene *scene, const Scene *scene,
const MinMax *min_max); const MinMax *min_max);
void vl(double t, void vLoad(double t,
double elmore, double elmore,
// Return values. // Return values.
double &vl, double &vl,
double &dvl_dt); double &dvl_dt);
double vl(double t, double vLoad(double t,
double elmore); double elmore);
void fail(std::string_view reason); void fail(std::string_view reason);
const Pin *drvr_pin_; const Pin *drvr_pin_;
@ -122,7 +122,7 @@ protected:
Parasitics *parasitics_; Parasitics *parasitics_;
const Parasitic *parasitic_; const Parasitic *parasitic_;
OutputWaveforms *output_waveforms_; OutputWaveforms *output_waveforms_{nullptr};
double ref_time_; double ref_time_;
float vdd_; float vdd_;
float vth_; float vth_;
@ -133,7 +133,7 @@ protected:
float rpi_; float rpi_;
float c1_; float c1_;
size_t region_count_; size_t region_count_{0};
size_t region_vl_idx_; size_t region_vl_idx_;
size_t region_vth_idx_; size_t region_vth_idx_;
size_t region_vh_idx_; size_t region_vh_idx_;
@ -146,7 +146,7 @@ protected:
Region region_time_offsets_; Region region_time_offsets_;
Region region_ramp_times_; Region region_ramp_times_;
Region region_ramp_slopes_; Region region_ramp_slopes_;
bool vl_fail_; bool vl_fail_{false};
// Waveform recording. // Waveform recording.
WatchPinValuesMap watch_pin_values_; WatchPinValuesMap watch_pin_values_;

View File

@ -26,10 +26,10 @@
#include <cmath> #include <cmath>
#include "StaConfig.hh"
#include "Fuzzy.hh" #include "Fuzzy.hh"
#include "Units.hh" #include "StaConfig.hh"
#include "StaState.hh" #include "StaState.hh"
#include "Units.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {

View File

@ -27,18 +27,18 @@
#include <map> #include <map>
#include <string> #include <string>
#include "ContainerHelpers.hh"
#include "StringUtil.hh"
#include "UnitDelayCalc.hh"
#include "LumpedCapDelayCalc.hh"
#include "DmpDelayCalc.hh"
#include "ArnoldiDelayCalc.hh" #include "ArnoldiDelayCalc.hh"
#include "CcsCeffDelayCalc.hh" #include "CcsCeffDelayCalc.hh"
#include "ContainerHelpers.hh"
#include "DmpDelayCalc.hh"
#include "LumpedCapDelayCalc.hh"
#include "PrimaDelayCalc.hh" #include "PrimaDelayCalc.hh"
#include "StringUtil.hh"
#include "UnitDelayCalc.hh"
namespace sta { namespace sta {
typedef std::map<std::string, MakeArcDelayCalc, std::less<>> DelayCalcMap; using DelayCalcMap = std::map<std::string, MakeArcDelayCalc, std::less<>>;
static DelayCalcMap delay_calcs; static DelayCalcMap delay_calcs;

View File

@ -28,11 +28,11 @@
%{ %{
#include "DelayCalc.hh"
#include "ArcDelayCalc.hh" #include "ArcDelayCalc.hh"
#include "DelayCalc.hh"
#include "Sta.hh"
#include "dcalc/ArcDcalcWaveforms.hh" #include "dcalc/ArcDcalcWaveforms.hh"
#include "dcalc/PrimaDelayCalc.hh" #include "dcalc/PrimaDelayCalc.hh"
#include "Sta.hh"
%} %}

View File

@ -24,16 +24,16 @@
#include "DelayCalcBase.hh" #include "DelayCalcBase.hh"
#include "Graph.hh"
#include "GraphDelayCalc.hh"
#include "Liberty.hh" #include "Liberty.hh"
#include "TimingArc.hh"
#include "TimingModel.hh"
#include "TableModel.hh"
#include "Network.hh" #include "Network.hh"
#include "Parasitics.hh" #include "Parasitics.hh"
#include "Graph.hh"
#include "Sdc.hh"
#include "Scene.hh" #include "Scene.hh"
#include "GraphDelayCalc.hh" #include "Sdc.hh"
#include "TableModel.hh"
#include "TimingArc.hh"
#include "TimingModel.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {

View File

@ -72,7 +72,7 @@ protected:
void thresholdAdjust(const Pin *load_pin, void thresholdAdjust(const Pin *load_pin,
const LibertyLibrary *drvr_library, const LibertyLibrary *drvr_library,
const RiseFall *rf, const RiseFall *rf,
double &load_delay, double &wire_delay,
double &load_slew); double &load_slew);
// Helper function for input ports driving dspf parasitic. // Helper function for input ports driving dspf parasitic.
void dspfWireDelaySlew(const Pin *load_pin, void dspfWireDelaySlew(const Pin *load_pin,

View File

@ -27,10 +27,10 @@
#include <cmath> // sqrt #include <cmath> // sqrt
#include "Error.hh" #include "Error.hh"
#include "Fuzzy.hh"
#include "Units.hh"
#include "Format.hh" #include "Format.hh"
#include "Fuzzy.hh"
#include "StaState.hh" #include "StaState.hh"
#include "Units.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {

View File

@ -27,8 +27,8 @@
#include "DelayScalar.hh" #include "DelayScalar.hh"
#include "Fuzzy.hh" #include "Fuzzy.hh"
#include "Units.hh"
#include "StaState.hh" #include "StaState.hh"
#include "Units.hh"
namespace sta { namespace sta {

View File

@ -27,10 +27,10 @@
#include <cmath> // sqrt #include <cmath> // sqrt
#include "Error.hh" #include "Error.hh"
#include "Fuzzy.hh"
#include "Units.hh"
#include "Format.hh" #include "Format.hh"
#include "Fuzzy.hh"
#include "StaState.hh" #include "StaState.hh"
#include "Units.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {

View File

@ -40,17 +40,17 @@
#include <tuple> #include <tuple>
#include <utility> #include <utility>
#include "Format.hh"
#include "Report.hh"
#include "Debug.hh"
#include "Units.hh"
#include "TimingArc.hh"
#include "TableModel.hh"
#include "Liberty.hh"
#include "Sdc.hh"
#include "Parasitics.hh"
#include "ArcDelayCalc.hh" #include "ArcDelayCalc.hh"
#include "Debug.hh"
#include "FindRoot.hh" #include "FindRoot.hh"
#include "Format.hh"
#include "Liberty.hh"
#include "Parasitics.hh"
#include "Report.hh"
#include "Sdc.hh"
#include "TableModel.hh"
#include "TimingArc.hh"
#include "Units.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {
@ -72,7 +72,7 @@ class DmpError : public Exception
{ {
public: public:
DmpError(std::string_view what); DmpError(std::string_view what);
virtual const char *what() const noexcept { return what_.c_str(); } const char *what() const noexcept override { return what_.c_str(); }
private: private:
std::string what_; std::string what_;
@ -127,7 +127,7 @@ protected:
void newtonRaphson(); void newtonRaphson();
// Find driver parameters t0, delta_t, Ceff. // Find driver parameters t0, delta_t, Ceff.
void findDriverParams(double ceff); void findDriverParams(double ceff);
std::pair<double, double> gateCapDelaySlew(double cl); std::pair<double, double> gateCapDelaySlew(double ceff);
std::tuple<double, double, double> gateDelays(double ceff); std::tuple<double, double, double> gateDelays(double ceff);
// Partial derivatives of y(t) jacobian (dydt0, dyddt, dydcl). // Partial derivatives of y(t) jacobian (dydt0, dyddt, dydcl).
std::tuple<double, double, double> dy(double t, std::tuple<double, double, double> dy(double t,
@ -143,12 +143,12 @@ protected:
void showJacobian(); void showJacobian();
std::pair<double, double> findDriverDelaySlew(); std::pair<double, double> findDriverDelaySlew();
double findVoCrossing(double vth, double findVoCrossing(double vth,
double lower_bound, double t_lower,
double upper_bound); double t_upper);
void showVo(); void showVo();
double findVlCrossing(double vth, double findVlCrossing(double vth,
double lower_bound, double t_lower,
double upper_bound); double t_upper);
void showVl(); void showVl();
void fail(std::string_view reason); void fail(std::string_view reason);
@ -177,9 +177,9 @@ protected:
const Pvt *pvt_; const Pvt *pvt_;
const GateTableModel *gate_model_; const GateTableModel *gate_model_;
double in_slew_; double in_slew_;
double c2_; double c2_{0.0};
double rpi_; double rpi_{0.0};
double c1_; double c1_{0.0};
double rd_; double rd_;
// Logic threshold (percentage of supply voltage). // Logic threshold (percentage of supply voltage).
@ -232,9 +232,6 @@ protected:
DmpAlg::DmpAlg(int nr_order, DmpAlg::DmpAlg(int nr_order,
StaState *sta) : StaState *sta) :
StaState(sta), StaState(sta),
c2_(0.0),
rpi_(0.0),
c1_(0.0),
nr_order_(nr_order) nr_order_(nr_order)
{ {
} }
@ -465,8 +462,13 @@ DmpAlg::showVo()
{ {
report_->report(" t vo(t)"); report_->report(" t vo(t)");
double ub = voCrossingUpperBound(); double ub = voCrossingUpperBound();
for (double t = t0_; t < t0_ + ub; t += dt_ / 10.0) const double step = dt_ / 10.0;
for (int i = 0;; ++i) {
double t = t0_ + step * i;
if (!(t < t0_ + ub))
break;
report_->report(" {:g} {:g}", t, Vo(t).first); report_->report(" {:g} {:g}", t, Vo(t).first);
}
} }
std::pair<double, double> std::pair<double, double>
@ -567,8 +569,14 @@ DmpAlg::showVl()
{ {
report_->report(" t vl(t)"); report_->report(" t vl(t)");
double ub = vlCrossingUpperBound(); double ub = vlCrossingUpperBound();
for (double t = t0_; t < t0_ + ub * 2.0; t += ub / 10.0) const double step = ub / 10.0;
const double t_end = t0_ + ub * 2.0;
for (int i = 0;; ++i) {
double t = t0_ + step * i;
if (!(t < t_end))
break;
report_->report(" {:g} {:g}", t, Vl(t).first); report_->report(" {:g} {:g}", t, Vl(t).first);
}
} }
void void
@ -605,9 +613,9 @@ public:
std::pair<double, double> loadDelaySlew(const Pin *, std::pair<double, double> loadDelaySlew(const Pin *,
double elmore) override; double elmore) override;
void evalDmpEqns() override; void evalDmpEqns() override;
double voCrossingUpperBound() override;
private: protected:
double voCrossingUpperBound() override;
std::pair<double, double> V0(double t) override; std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override; std::pair<double, double> Vl0(double t) override;
}; };
@ -702,7 +710,11 @@ public:
double c1) override; double c1) override;
std::pair<double, double> gateDelaySlew() override; std::pair<double, double> gateDelaySlew() override;
void evalDmpEqns() override; void evalDmpEqns() override;
protected:
double voCrossingUpperBound() override; double voCrossingUpperBound() override;
std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override;
private: private:
void findDriverParamsPi(); void findDriverParamsPi();
@ -710,39 +722,26 @@ private:
double dt, double dt,
double ceff_time, double ceff_time,
double ceff); double ceff);
std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override;
// Poles/zero. // Poles/zero.
double p1_; double p1_{0.0};
double p2_; double p2_{0.0};
double z1_; double z1_{0.0};
// Residues. // Residues.
double k0_; double k0_{0.0};
double k1_; double k1_{0.0};
double k2_; double k2_{0.0};
double k3_; double k3_{0.0};
double k4_; double k4_{0.0};
// Ipi coefficients. // Ipi coefficients.
double A_; double A_{0.0};
double B_; double B_{0.0};
double D_; double D_{0.0};
}; };
DmpPi::DmpPi(StaState *sta) : DmpPi::DmpPi(StaState *sta) :
DmpAlg(3, DmpAlg(3,
sta), sta)
p1_(0.0),
p2_(0.0),
z1_(0.0),
k0_(0.0),
k1_(0.0),
k2_(0.0),
k3_(0.0),
k4_(0.0),
A_(0.0),
B_(0.0),
D_(0.0)
{ {
} }
@ -846,8 +845,7 @@ DmpPi::evalDmpEqns()
throw DmpError("eqn eval failed: slew = 0"); throw DmpError("eqn eval failed: slew = 0");
double ceff_time = slew / (vh_ - vl_); double ceff_time = slew / (vh_ - vl_);
if (ceff_time > 1.4 * dt) ceff_time = std::min(ceff_time, 1.4 * dt);
ceff_time = 1.4 * dt;
if (dt <= 0.0) if (dt <= 0.0)
throw DmpError("eqn eval failed: dt < 0"); throw DmpError("eqn eval failed: dt < 0");
@ -949,6 +947,8 @@ class DmpOnePole : public DmpAlg
public: public:
DmpOnePole(StaState *sta); DmpOnePole(StaState *sta);
void evalDmpEqns() override; void evalDmpEqns() override;
protected:
double voCrossingUpperBound() override; double voCrossingUpperBound() override;
}; };
@ -1018,29 +1018,24 @@ public:
double c1) override; double c1) override;
std::pair<double, double> gateDelaySlew() override; std::pair<double, double> gateDelaySlew() override;
private: protected:
std::pair<double, double> V0(double t) override; std::pair<double, double> V0(double t) override;
std::pair<double, double> Vl0(double t) override; std::pair<double, double> Vl0(double t) override;
double voCrossingUpperBound() override; double voCrossingUpperBound() override;
private:
// Pole/zero. // Pole/zero.
double p1_; double p1_{0.0};
double z1_; double z1_{0.0};
// Residues. // Residues.
double k0_; double k0_{0.0};
double k1_; double k1_{0.0};
double k2_; double k2_{0.0};
double k3_; double k3_{0.0};
}; };
DmpZeroC2::DmpZeroC2(StaState *sta) : DmpZeroC2::DmpZeroC2(StaState *sta) :
DmpOnePole(sta), DmpOnePole(sta)
p1_(0.0),
z1_(0.0),
k0_(0.0),
k1_(0.0),
k2_(0.0),
k3_(0.0)
{ {
} }
@ -1172,8 +1167,7 @@ DmpAlg::luDecomp()
double big = 0.0; double big = 0.0;
for (int j = 0; j < size; j++) { for (int j = 0; j < size; j++) {
double temp = std::abs(fjac_[i][j]); double temp = std::abs(fjac_[i][j]);
if (temp > big) big = std::max(temp, big);
big = temp;
} }
if (big == 0.0) if (big == 0.0)
throw DmpError("LU decomposition: no non-zero row element"); throw DmpError("LU decomposition: no non-zero row element");
@ -1268,8 +1262,7 @@ DmpCeffDelayCalc::DmpCeffDelayCalc(StaState *sta) :
LumpedCapDelayCalc(sta), LumpedCapDelayCalc(sta),
dmp_cap_(new DmpCap(sta)), dmp_cap_(new DmpCap(sta)),
dmp_pi_(new DmpPi(sta)), dmp_pi_(new DmpPi(sta)),
dmp_zero_c2_(new DmpZeroC2(sta)), dmp_zero_c2_(new DmpZeroC2(sta))
dmp_alg_(nullptr)
{ {
} }

View File

@ -44,7 +44,7 @@ class DmpCeffDelayCalc : public LumpedCapDelayCalc
{ {
public: public:
DmpCeffDelayCalc(StaState *sta); DmpCeffDelayCalc(StaState *sta);
virtual ~DmpCeffDelayCalc(); ~DmpCeffDelayCalc() override;
bool reduceSupported() const override { return true; } bool reduceSupported() const override { return true; }
ArcDcalcResult gateDelay(const Pin *drvr_pin, ArcDcalcResult gateDelay(const Pin *drvr_pin,
const TimingArc *arc, const TimingArc *arc,
@ -98,7 +98,7 @@ private:
DmpCap *dmp_cap_; DmpCap *dmp_cap_;
DmpPi *dmp_pi_; DmpPi *dmp_pi_;
DmpZeroC2 *dmp_zero_c2_; DmpZeroC2 *dmp_zero_c2_;
DmpAlg *dmp_alg_; DmpAlg *dmp_alg_{nullptr};
}; };
} // namespace sta } // namespace sta

View File

@ -24,15 +24,15 @@
#include "DmpDelayCalc.hh" #include "DmpDelayCalc.hh"
#include "DmpCeff.hh"
#include "GraphDelayCalc.hh"
#include "Liberty.hh"
#include "Network.hh"
#include "Parasitics.hh"
#include "PortDirection.hh"
#include "Sdc.hh"
#include "TableModel.hh" #include "TableModel.hh"
#include "TimingArc.hh" #include "TimingArc.hh"
#include "Liberty.hh"
#include "PortDirection.hh"
#include "Network.hh"
#include "Sdc.hh"
#include "Parasitics.hh"
#include "GraphDelayCalc.hh"
#include "DmpCeff.hh"
namespace sta { namespace sta {
@ -164,7 +164,7 @@ public:
const Scene *scene, const Scene *scene,
const MinMax *min_max) override; const MinMax *min_max) override;
private: protected:
void loadDelaySlew(const Pin *load_pin, void loadDelaySlew(const Pin *load_pin,
double drvr_slew, double drvr_slew,
const RiseFall *rf, const RiseFall *rf,
@ -173,6 +173,8 @@ private:
// Return values. // Return values.
double &wire_delay, double &wire_delay,
double &load_slew) override; double &load_slew) override;
private:
void loadDelay(double drvr_slew, void loadDelay(double drvr_slew,
Parasitic *pole_residue, Parasitic *pole_residue,
double p1, double p1,
@ -190,11 +192,11 @@ private:
double tt, double tt,
double y_tt); double y_tt);
bool parasitic_is_pole_residue_; bool parasitic_is_pole_residue_{false};
float vth_; float vth_{0.0F};
float vl_; float vl_{0.0F};
float vh_; float vh_{0.0F};
float slew_derate_; float slew_derate_{0.0F};
}; };
ArcDelayCalc * ArcDelayCalc *
@ -204,12 +206,7 @@ makeDmpCeffTwoPoleDelayCalc(StaState *sta)
} }
DmpCeffTwoPoleDelayCalc::DmpCeffTwoPoleDelayCalc(StaState *sta) : DmpCeffTwoPoleDelayCalc::DmpCeffTwoPoleDelayCalc(StaState *sta) :
DmpCeffDelayCalc(sta), DmpCeffDelayCalc(sta)
parasitic_is_pole_residue_(false),
vth_(0.0),
vl_(0.0),
vh_(0.0),
slew_derate_(0.0)
{ {
} }
@ -334,7 +331,7 @@ DmpCeffTwoPoleDelayCalc::loadDelaySlew(const Pin *load_pin,
// Should handle PiElmore parasitic. // Should handle PiElmore parasitic.
wire_delay = 0.0; wire_delay = 0.0;
load_slew = drvr_slew; load_slew = drvr_slew;
Parasitic *pole_residue = 0; Parasitic *pole_residue = nullptr;
if (parasitic_is_pole_residue_) if (parasitic_is_pole_residue_)
pole_residue = parasitics_->findPoleResidue(parasitic, load_pin); pole_residue = parasitics_->findPoleResidue(parasitic, load_pin);
if (pole_residue) { if (pole_residue) {

View File

@ -29,7 +29,7 @@
namespace sta { namespace sta {
std::pair<double, bool> std::pair<double, bool>
findRoot(FindRootFunc func, findRoot(const FindRootFunc &func,
double x1, double x1,
double x2, double x2,
double x_tol, double x_tol,
@ -42,7 +42,7 @@ findRoot(FindRootFunc func,
} }
std::pair<double, bool> std::pair<double, bool>
findRoot(FindRootFunc func, findRoot(const FindRootFunc &func,
double x1, double x1,
double y1, double y1,
double x2, double x2,

View File

@ -36,7 +36,7 @@ using FindRootFunc = const std::function<void (double x,
// first: root estimate; second: true if the search failed. // first: root estimate; second: true if the search failed.
std::pair<double, bool> std::pair<double, bool>
findRoot(FindRootFunc func, findRoot(const FindRootFunc &func,
double x1, double x1,
double x2, double x2,
double x_tol, double x_tol,
@ -44,7 +44,7 @@ findRoot(FindRootFunc func,
// first: root estimate; second: true if the search failed. // first: root estimate; second: true if the search failed.
std::pair<double, bool> std::pair<double, bool>
findRoot(FindRootFunc func, findRoot(const FindRootFunc &func,
double x1, double x1,
double y1, double y1,
double x2, double x2,

View File

@ -24,35 +24,35 @@
#include "GraphDelayCalc.hh" #include "GraphDelayCalc.hh"
#include <cmath>
#include <array> #include <array>
#include <cmath>
#include <set> #include <set>
#include <string_view> #include <string_view>
#include "ArcDelayCalc.hh"
#include "Bfs.hh"
#include "ClkNetwork.hh"
#include "ContainerHelpers.hh" #include "ContainerHelpers.hh"
#include "Debug.hh" #include "Debug.hh"
#include "Stats.hh"
#include "MinMax.hh"
#include "Mutex.hh"
#include "TimingRole.hh"
#include "TimingArc.hh"
#include "Liberty.hh"
#include "PortDirection.hh"
#include "Network.hh"
#include "InputDrive.hh"
#include "Sdc.hh"
#include "Mode.hh"
#include "Graph.hh" #include "Graph.hh"
#include "InputDrive.hh"
#include "Liberty.hh"
#include "MinMax.hh"
#include "Mode.hh"
#include "Mutex.hh"
#include "NetCaps.hh"
#include "Network.hh"
#include "Parasitics.hh" #include "Parasitics.hh"
#include "search/Levelize.hh" #include "PortDirection.hh"
#include "Sdc.hh"
#include "Scene.hh" #include "Scene.hh"
#include "SearchPred.hh" #include "SearchPred.hh"
#include "Bfs.hh" #include "Stats.hh"
#include "ArcDelayCalc.hh" #include "TimingArc.hh"
#include "NetCaps.hh" #include "TimingRole.hh"
#include "ClkNetwork.hh"
#include "Variables.hh" #include "Variables.hh"
#include "search/Latches.hh" #include "search/Latches.hh"
#include "search/Levelize.hh"
namespace sta { namespace sta {
@ -143,15 +143,10 @@ DcalcNonLatchPred::searchThru(Edge *edge,
GraphDelayCalc::GraphDelayCalc(StaState *sta) : GraphDelayCalc::GraphDelayCalc(StaState *sta) :
StaState(sta), StaState(sta),
observer_(nullptr),
delays_seeded_(false),
incremental_(false),
delays_exist_(false),
invalid_delays_(makeVertexSet(this)), invalid_delays_(makeVertexSet(this)),
search_pred_(new DcalcPred(sta)), search_pred_(new DcalcPred(sta)),
search_non_latch_pred_(new DcalcNonLatchPred(sta)), search_non_latch_pred_(new DcalcNonLatchPred(sta)),
iter_(new BfsFwdIterator(BfsIndex::dcalc, search_non_latch_pred_, sta)), iter_(new BfsFwdIterator(BfsIndex::dcalc, search_non_latch_pred_, sta))
incremental_delay_tolerance_(0.0)
{ {
} }
@ -297,9 +292,9 @@ class FindVertexDelays : public VertexVisitor
{ {
public: public:
FindVertexDelays(GraphDelayCalc *graph_delay_calc1); FindVertexDelays(GraphDelayCalc *graph_delay_calc1);
virtual ~FindVertexDelays(); ~FindVertexDelays() override;
virtual void visit(Vertex *vertex); void visit(Vertex *vertex) override;
virtual VertexVisitor *copy() const; VertexVisitor *copy() const override;
protected: protected:
GraphDelayCalc *graph_delay_calc_; GraphDelayCalc *graph_delay_calc_;
@ -419,7 +414,7 @@ GraphDelayCalc::seedDrvrSlew(Vertex *drvr_vertex,
if (drive) { if (drive) {
const LibertyCell *drvr_cell; const LibertyCell *drvr_cell;
const LibertyPort *from_port, *to_port; const LibertyPort *from_port, *to_port;
float *from_slews; const DriveCellSlews *from_slews;
drive->driveCell(rf, min_max, drvr_cell, from_port, drive->driveCell(rf, min_max, drvr_cell, from_port,
from_slews, to_port); from_slews, to_port);
if (drvr_cell) { if (drvr_cell) {
@ -562,7 +557,7 @@ LibertyPort *
GraphDelayCalc::driveCellDefaultFromPort(const LibertyCell *cell, GraphDelayCalc::driveCellDefaultFromPort(const LibertyCell *cell,
const LibertyPort *to_port) const LibertyPort *to_port)
{ {
LibertyPort *from_port = 0; LibertyPort *from_port = nullptr;
int from_port_index = 0; int from_port_index = 0;
for (TimingArcSet *arc_set : cell->timingArcSetsTo(to_port)) { for (TimingArcSet *arc_set : cell->timingArcSetsTo(to_port)) {
LibertyPort *set_from_port = arc_set->from(); LibertyPort *set_from_port = arc_set->from();
@ -599,7 +594,7 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell,
Vertex *drvr_vertex, Vertex *drvr_vertex,
const RiseFall *rf, const RiseFall *rf,
const LibertyPort *from_port, const LibertyPort *from_port,
float *from_slews, const DriveCellSlews *from_slews,
const LibertyPort *to_port, const LibertyPort *to_port,
const Scene *scene, const Scene *scene,
const MinMax *min_max, const MinMax *min_max,
@ -611,7 +606,7 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell,
for (TimingArcSet *arc_set : drvr_cell->timingArcSets(from_port, to_port)) { for (TimingArcSet *arc_set : drvr_cell->timingArcSets(from_port, to_port)) {
for (TimingArc *arc : arc_set->arcs()) { for (TimingArc *arc : arc_set->arcs()) {
if (arc->toEdge()->asRiseFall() == rf) { if (arc->toEdge()->asRiseFall() == rf) {
float from_slew = from_slews[arc->fromEdge()->index()]; float from_slew = (*from_slews)[arc->fromEdge()->index()];
findInputArcDelay(drvr_pin, drvr_vertex, arc, from_slew, scene, min_max, findInputArcDelay(drvr_pin, drvr_vertex, arc, from_slew, scene, min_max,
arc_delay_calc); arc_delay_calc);
} }
@ -1270,19 +1265,19 @@ GraphDelayCalc::annotateLoadDelays(Vertex *drvr_vertex,
bool load_changed = false; bool load_changed = false;
if (!load_vertex->slewAnnotated(drvr_rf, min_max)) { if (!load_vertex->slewAnnotated(drvr_rf, min_max)) {
if (drvr_vertex->slewAnnotated(drvr_rf, min_max)) { if (drvr_vertex->slewAnnotated(drvr_rf, min_max)) {
// Copy the driver slew to the load if it is annotated. // Copy the driver slew to the load if it is annotated.
const Slew drvr_slew = graph_->slew(drvr_vertex,drvr_rf,ap_index); const Slew drvr_slew = graph_->slew(drvr_vertex, drvr_rf, ap_index);
graph_->setSlew(load_vertex, drvr_rf, ap_index, drvr_slew); graph_->setSlew(load_vertex, drvr_rf, ap_index, drvr_slew);
load_changed = true; load_changed = true;
} }
else { else {
const Slew slew = graph_->slew(load_vertex, drvr_rf, ap_index); const Slew slew = graph_->slew(load_vertex, drvr_rf, ap_index);
if (!merge if (!merge
|| delayGreater(load_slew, slew, min_max, this)) { || delayGreater(load_slew, slew, min_max, this)) {
graph_->setSlew(load_vertex, drvr_rf, ap_index, load_slew); graph_->setSlew(load_vertex, drvr_rf, ap_index, load_slew);
load_changed = true; load_changed = true;
} }
} }
} }
if (!graph_->wireDelayAnnotated(wire_edge, drvr_rf, ap_index)) { if (!graph_->wireDelayAnnotated(wire_edge, drvr_rf, ap_index)) {
// Multiple timing arcs with the same output transition // Multiple timing arcs with the same output transition
@ -1594,9 +1589,9 @@ GraphDelayCalc::findCheckEdgeDelays(Edge *edge,
const RiseFall *to_rf = arc->toEdge()->asRiseFall(); const RiseFall *to_rf = arc->toEdge()->asRiseFall();
if (from_rf && to_rf) { if (from_rf && to_rf) {
const LibertyPort *related_out_port = arc_set->relatedOut(); const LibertyPort *related_out_port = arc_set->relatedOut();
const Pin *related_out_pin = 0; const Pin *related_out_pin = nullptr;
if (related_out_port) if (related_out_port)
related_out_pin = network_->findPin(inst, related_out_port); related_out_pin = network_->findPin(inst, related_out_port);
for (Scene *scene : scenes_) { for (Scene *scene : scenes_) {
for (const MinMax *min_max : MinMax::range()) { for (const MinMax *min_max : MinMax::range()) {
@ -1677,7 +1672,7 @@ GraphDelayCalc::reportDelayCalc(const Edge *edge,
const RiseFall *to_rf = arc->toEdge()->asRiseFall(); const RiseFall *to_rf = arc->toEdge()->asRiseFall();
if (from_rf && to_rf) { if (from_rf && to_rf) {
const LibertyPort *related_out_port = arc_set->relatedOut(); const LibertyPort *related_out_port = arc_set->relatedOut();
const Pin *related_out_pin = 0; const Pin *related_out_pin = nullptr;
if (related_out_port) if (related_out_port)
related_out_pin = network_->findPin(inst, related_out_port); related_out_pin = network_->findPin(inst, related_out_port);
float related_out_cap = 0.0; float related_out_cap = 0.0;
@ -1767,11 +1762,6 @@ GraphDelayCalc::minPeriod(const Pin *pin,
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
MultiDrvrNet::MultiDrvrNet() :
dcalc_drvr_(nullptr)
{
}
void void
MultiDrvrNet::netCaps(const RiseFall *drvr_rf, MultiDrvrNet::netCaps(const RiseFall *drvr_rf,
const Scene *scene, const Scene *scene,

View File

@ -27,15 +27,15 @@
#include <cmath> // isnan #include <cmath> // isnan
#include "Debug.hh" #include "Debug.hh"
#include "Units.hh" #include "GraphDelayCalc.hh"
#include "Liberty.hh"
#include "Network.hh"
#include "Parasitics.hh"
#include "PortDirection.hh"
#include "Sdc.hh"
#include "TimingArc.hh" #include "TimingArc.hh"
#include "TimingModel.hh" #include "TimingModel.hh"
#include "Liberty.hh" #include "Units.hh"
#include "PortDirection.hh"
#include "Network.hh"
#include "Sdc.hh"
#include "Parasitics.hh"
#include "GraphDelayCalc.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {

View File

@ -61,7 +61,7 @@ public:
const LoadPinIndexMap &load_pin_index_map, const LoadPinIndexMap &load_pin_index_map,
const Scene *scene, const Scene *scene,
const MinMax *min_max) override; const MinMax *min_max) override;
std::string reportGateDelay(const Pin *drvr_pin, std::string reportGateDelay(const Pin *check_pin,
const TimingArc *arc, const TimingArc *arc,
const Slew &in_slew, const Slew &in_slew,
float load_cap, float load_cap,

View File

@ -26,10 +26,6 @@
namespace sta { namespace sta {
NetCaps::NetCaps()
{
}
NetCaps::NetCaps(float pin_cap, NetCaps::NetCaps(float pin_cap,
float wire_cap, float wire_cap,
float fanout, float fanout,

View File

@ -30,7 +30,7 @@ namespace sta {
class NetCaps class NetCaps
{ {
public: public:
NetCaps(); NetCaps() = default;
NetCaps(float pin_cap, NetCaps(float pin_cap,
float wire_cap, float wire_cap,
float fanout, float fanout,

View File

@ -24,13 +24,13 @@
#include "ParallelDelayCalc.hh" #include "ParallelDelayCalc.hh"
#include "TimingArc.hh"
#include "Scene.hh"
#include "Network.hh"
#include "Graph.hh" #include "Graph.hh"
#include "Sdc.hh"
#include "Liberty.hh"
#include "GraphDelayCalc.hh" #include "GraphDelayCalc.hh"
#include "Liberty.hh"
#include "Network.hh"
#include "Scene.hh"
#include "Sdc.hh"
#include "TimingArc.hh"
namespace sta { namespace sta {

View File

@ -24,8 +24,8 @@
#pragma once #pragma once
#include <vector>
#include <map> #include <map>
#include <vector>
#include "DelayCalcBase.hh" #include "DelayCalcBase.hh"

View File

@ -24,32 +24,27 @@
#include "PrimaDelayCalc.hh" #include "PrimaDelayCalc.hh"
#include <Eigen/LU>
#include <Eigen/QR>
#include <cmath> // abs #include <cmath> // abs
#include <string_view> #include <string_view>
#include "Debug.hh" #include "Debug.hh"
#include "Units.hh"
#include "TimingArc.hh"
#include "Liberty.hh"
#include "PortDirection.hh"
#include "Network.hh"
#include "Sdc.hh"
#include "Scene.hh"
#include "Graph.hh"
#include "Parasitics.hh"
#include "GraphDelayCalc.hh"
#include "DmpDelayCalc.hh" #include "DmpDelayCalc.hh"
#include "Format.hh" #include "Format.hh"
#include "Graph.hh"
#include <Eigen/LU> #include "GraphDelayCalc.hh"
#include <Eigen/QR> #include "Liberty.hh"
#include "Network.hh"
#include "Parasitics.hh"
#include "PortDirection.hh"
#include "Scene.hh"
#include "Sdc.hh"
#include "TimingArc.hh"
#include "Units.hh"
namespace sta { namespace sta {
using Eigen::ColPivHouseholderQR;
using Eigen::HouseholderQR;
using Eigen::SparseLU;
// Lawrence Pillage - “Electronic Circuit & System Simulation Methods” 1998 // Lawrence Pillage - “Electronic Circuit & System Simulation Methods” 1998
// McGraw-Hill, Inc. New York, NY. // McGraw-Hill, Inc. New York, NY.
@ -61,17 +56,7 @@ makePrimaDelayCalc(StaState *sta)
PrimaDelayCalc::PrimaDelayCalc(StaState *sta) : PrimaDelayCalc::PrimaDelayCalc(StaState *sta) :
DelayCalcBase(sta), DelayCalcBase(sta),
dcalc_args_(nullptr),
scene_(nullptr),
min_max_(nullptr),
parasitics_(nullptr),
parasitic_network_(nullptr),
load_pin_index_map_(nullptr),
pin_node_map_(network_), pin_node_map_(network_),
prima_order_(3),
make_waveforms_(false),
waveform_drvr_pin_(nullptr),
waveform_load_pin_(nullptr),
watch_pin_values_(network_), watch_pin_values_(network_),
table_dcalc_(makeDmpCeffElmoreDelayCalc(sta)) table_dcalc_(makeDmpCeffElmoreDelayCalc(sta))
{ {
@ -79,20 +64,18 @@ PrimaDelayCalc::PrimaDelayCalc(StaState *sta) :
PrimaDelayCalc::PrimaDelayCalc(const PrimaDelayCalc &dcalc) : PrimaDelayCalc::PrimaDelayCalc(const PrimaDelayCalc &dcalc) :
DelayCalcBase(dcalc), DelayCalcBase(dcalc),
dcalc_args_(nullptr),
load_pin_index_map_(nullptr),
pin_node_map_(network_), pin_node_map_(network_),
node_index_map_(dcalc.node_index_map_), node_index_map_(dcalc.node_index_map_),
prima_order_(dcalc.prima_order_), prima_order_(dcalc.prima_order_),
make_waveforms_(false),
waveform_drvr_pin_(nullptr),
waveform_load_pin_(nullptr),
watch_pin_values_(network_), watch_pin_values_(network_),
table_dcalc_(makeDmpCeffElmoreDelayCalc(this)) table_dcalc_(makeDmpCeffElmoreDelayCalc(this))
{ {
} }
PrimaDelayCalc::~PrimaDelayCalc() { delete table_dcalc_; } PrimaDelayCalc::~PrimaDelayCalc()
{
delete table_dcalc_;
}
ArcDelayCalc * ArcDelayCalc *
PrimaDelayCalc::copy() PrimaDelayCalc::copy()
@ -359,7 +342,7 @@ PrimaDelayCalc::simulate1(const MatrixSd &G,
const Eigen::MatrixXd &B, const Eigen::MatrixXd &B,
const Eigen::VectorXd &x_init, const Eigen::VectorXd &x_init,
const Eigen::MatrixXd &x_to_v, const Eigen::MatrixXd &x_to_v,
const size_t order) size_t order)
{ {
Eigen::VectorXd x(order); Eigen::VectorXd x(order);
Eigen::VectorXd x_prev(order); Eigen::VectorXd x_prev(order);
@ -379,7 +362,7 @@ PrimaDelayCalc::simulate1(const MatrixSd &G,
MatrixSd A(order, order); MatrixSd A(order, order);
A = G + (2.0 / time_step_) * C; A = G + (2.0 / time_step_) * C;
A.makeCompressed(); A.makeCompressed();
SparseLU<MatrixSd> A_solver; Eigen::SparseLU<MatrixSd> A_solver;
A_solver.compute(A); A_solver.compute(A);
// Initial time depends on ceff which impact delay, so use a sim step // Initial time depends on ceff which impact delay, so use a sim step
@ -403,7 +386,10 @@ PrimaDelayCalc::simulate1(const MatrixSd &G,
if (make_waveforms_) if (make_waveforms_)
recordWaveformStep(time_begin); recordWaveformStep(time_begin);
for (double time = time_begin; time <= time_end; time += time_step_) { for (size_t step = 0;; ++step) {
const double time = time_begin + step * time_step_;
if (time > time_end)
break;
setPortCurrents(); setPortCurrents();
rhs = B * u_ + (1.0 / time_step_) * C * (3.0 * x_prev - x_prev2); rhs = B * u_ + (1.0 / time_step_) * C * (3.0 * x_prev - x_prev2);
x = A_solver.solve(rhs); x = A_solver.solve(rhs);
@ -850,7 +836,7 @@ PrimaDelayCalc::primaReduce()
{ {
G_.makeCompressed(); G_.makeCompressed();
// Step 3: solve G*R = B for R // Step 3: solve G*R = B for R
SparseLU<MatrixSd> G_solver(G_); Eigen::SparseLU<MatrixSd> G_solver(G_);
if (G_solver.info() != Eigen::Success) if (G_solver.info() != Eigen::Success)
report_->error(1752, "G matrix is singular."); report_->error(1752, "G matrix is singular.");
Eigen::MatrixXd R(order_, port_count_); Eigen::MatrixXd R(order_, port_count_);
@ -1038,7 +1024,7 @@ PinSeq
PrimaDelayCalc::watchPins() const PrimaDelayCalc::watchPins() const
{ {
PinSeq pins; PinSeq pins;
for (auto pin_values : watch_pin_values_) { for (const auto &pin_values : watch_pin_values_) {
const Pin *pin = pin_values.first; const Pin *pin = pin_values.first;
pins.push_back(pin); pins.push_back(pin);
} }
@ -1117,10 +1103,8 @@ void
PrimaDelayCalc::reportMatrix(Eigen::VectorXd &matrix) PrimaDelayCalc::reportMatrix(Eigen::VectorXd &matrix)
{ {
std::string line = "| "; std::string line = "| ";
for (Eigen::Index i = 0; i < matrix.rows(); i++) { for (Eigen::Index i = 0; i < matrix.rows(); i++)
std::string entry =
line += sta::format("{:10.3e}", matrix.coeff(i)) + " "; line += sta::format("{:10.3e}", matrix.coeff(i)) + " ";
}
line += "|"; line += "|";
report_->reportLine(line); report_->reportLine(line);
} }
@ -1129,8 +1113,8 @@ void
PrimaDelayCalc::reportVector(std::vector<double> &matrix) PrimaDelayCalc::reportVector(std::vector<double> &matrix)
{ {
std::string line = "| "; std::string line = "| ";
for (size_t i = 0; i < matrix.size(); i++) for (const double &entry : matrix)
line += sta::format("{:10.3e}", matrix[i]) + " "; line += sta::format("{:10.3e}", entry) + " ";
line += "|"; line += "|";
report_->reportLine(line); report_->reportLine(line);
} }

View File

@ -24,13 +24,14 @@
#pragma once #pragma once
#include <vector>
#include <map>
#include <Eigen/SparseCore> #include <Eigen/SparseCore>
#include <Eigen/SparseLU> #include <Eigen/SparseLU>
#include <array>
#include <map>
#include <vector>
#include "LumpedCapDelayCalc.hh"
#include "ArcDcalcWaveforms.hh" #include "ArcDcalcWaveforms.hh"
#include "LumpedCapDelayCalc.hh"
#include "Parasitics.hh" #include "Parasitics.hh"
namespace sta { namespace sta {
@ -57,7 +58,7 @@ class PrimaDelayCalc : public DelayCalcBase,
public: public:
PrimaDelayCalc(StaState *sta); PrimaDelayCalc(StaState *sta);
PrimaDelayCalc(const PrimaDelayCalc &dcalc); PrimaDelayCalc(const PrimaDelayCalc &dcalc);
~PrimaDelayCalc(); ~PrimaDelayCalc() override;
ArcDelayCalc *copy() override; ArcDelayCalc *copy() override;
void copyState(const StaState *sta) override; void copyState(const StaState *sta) override;
std::string_view name() const override { return "prima"; } std::string_view name() const override { return "prima"; }
@ -123,7 +124,7 @@ protected:
const Eigen::MatrixXd &B, const Eigen::MatrixXd &B,
const Eigen::VectorXd &x_init, const Eigen::VectorXd &x_init,
const Eigen::MatrixXd &x_to_v, const Eigen::MatrixXd &x_to_v,
const size_t order); size_t order);
double maxTime(); double maxTime();
double timeStep(); double timeStep();
float driverResistance(); float driverResistance();
@ -178,15 +179,15 @@ protected:
void reportMatrix(Eigen::VectorXd &matrix); void reportMatrix(Eigen::VectorXd &matrix);
void reportVector(std::vector<double> &matrix); void reportVector(std::vector<double> &matrix);
ArcDcalcArgSeq *dcalc_args_; ArcDcalcArgSeq *dcalc_args_{nullptr};
size_t drvr_count_; size_t drvr_count_;
float load_cap_; float load_cap_;
const Scene *scene_; const Scene *scene_{nullptr};
const MinMax *min_max_; const MinMax *min_max_{nullptr};
Parasitics *parasitics_; Parasitics *parasitics_{nullptr};
const Parasitic *parasitic_network_; const Parasitic *parasitic_network_{nullptr};
const RiseFall *drvr_rf_; const RiseFall *drvr_rf_;
const LoadPinIndexMap *load_pin_index_map_; const LoadPinIndexMap *load_pin_index_map_{nullptr};
PinNodeMap pin_node_map_; // Parasitic pin -> array index PinNodeMap pin_node_map_; // Parasitic pin -> array index
NodeIndexMap node_index_map_; // Parasitic node -> array index NodeIndexMap node_index_map_; // Parasitic node -> array index
@ -210,7 +211,7 @@ protected:
Eigen::VectorXd u_; Eigen::VectorXd u_;
// Prima reduced MNA eqns // Prima reduced MNA eqns
size_t prima_order_; size_t prima_order_{3};
Eigen::MatrixXd Vq_; Eigen::MatrixXd Vq_;
MatrixSd Gq_; MatrixSd Gq_;
MatrixSd Cq_; MatrixSd Cq_;
@ -231,9 +232,9 @@ protected:
double time_step_prev_; double time_step_prev_;
// Waveform recording. // Waveform recording.
bool make_waveforms_; bool make_waveforms_{false};
const Pin *waveform_drvr_pin_; const Pin *waveform_drvr_pin_{nullptr};
const Pin *waveform_load_pin_; const Pin *waveform_load_pin_{nullptr};
FloatSeq drvr_voltages_; FloatSeq drvr_voltages_;
FloatSeq load_voltages_; FloatSeq load_voltages_;
WatchPinValuesMap watch_pin_values_; WatchPinValuesMap watch_pin_values_;
@ -248,7 +249,7 @@ protected:
static constexpr size_t threshold_vth = 1; static constexpr size_t threshold_vth = 1;
static constexpr size_t threshold_vh = 2; static constexpr size_t threshold_vh = 2;
static constexpr size_t measure_threshold_count_ = 3; static constexpr size_t measure_threshold_count_ = 3;
typedef std::array<double, measure_threshold_count_> ThresholdTimes; using ThresholdTimes = std::array<double, measure_threshold_count_>;
// Vl Vth Vh // Vl Vth Vh
ThresholdTimes measure_thresholds_; ThresholdTimes measure_thresholds_;
// Indexed by node number. // Indexed by node number.

View File

@ -26,16 +26,16 @@
#include "ContainerHelpers.hh" #include "ContainerHelpers.hh"
#include "Debug.hh" #include "Debug.hh"
#include "Stats.hh" #include "FuncExpr.hh"
#include "Liberty.hh"
#include "MinMax.hh" #include "MinMax.hh"
#include "Mutex.hh" #include "Mutex.hh"
#include "Transition.hh"
#include "TimingRole.hh"
#include "TimingArc.hh"
#include "Liberty.hh"
#include "PortDirection.hh"
#include "Network.hh" #include "Network.hh"
#include "FuncExpr.hh" #include "PortDirection.hh"
#include "Stats.hh"
#include "TimingArc.hh"
#include "TimingRole.hh"
#include "Transition.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {
@ -49,8 +49,6 @@ namespace sta {
Graph::Graph(StaState *sta, Graph::Graph(StaState *sta,
DcalcAPIndex ap_count) : DcalcAPIndex ap_count) :
StaState(sta), StaState(sta),
vertices_(nullptr),
edges_(nullptr),
ap_count_(ap_count), ap_count_(ap_count),
period_check_annotations_(network_), period_check_annotations_(network_),
reg_clk_vertices_(makeVertexSet(this)) reg_clk_vertices_(makeVertexSet(this))
@ -342,11 +340,10 @@ class MakeEdgesThruHierPin : public HierPinThruVisitor
{ {
public: public:
MakeEdgesThruHierPin(Graph *graph); MakeEdgesThruHierPin(Graph *graph);
private:
void visit(const Pin *drvr, void visit(const Pin *drvr,
const Pin *load) override; const Pin *load) override;
private:
Graph *graph_; Graph *graph_;
}; };
@ -585,7 +582,7 @@ Graph::slew(const Vertex *vertex,
size_t slew_index = ap_index * RiseFall::index_count + rf->index(); size_t slew_index = ap_index * RiseFall::index_count + rf->index();
const float *slews_flt = vertex->slewsFloat(); const float *slews_flt = vertex->slewsFloat();
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
const Slew *slews = std::bit_cast<const Slew*>(slews_flt); const Slew *slews = reinterpret_cast<const Slew*>(slews_flt);
return slews[slew_index]; return slews[slew_index];
} }
else else
@ -598,7 +595,7 @@ Graph::slew(const Vertex *vertex,
{ {
const float *slews_flt = vertex->slewsFloat(); const float *slews_flt = vertex->slewsFloat();
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
const Slew *slews = std::bit_cast<const Slew*>(slews_flt); const Slew *slews = reinterpret_cast<const Slew*>(slews_flt);
return slews[index]; return slews[index];
} }
else else
@ -678,7 +675,7 @@ Graph::arcDelay(const Edge *edge,
{ {
size_t index = arc->index() * ap_count_ + ap_index; size_t index = arc->index() * ap_count_ + ap_index;
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
ArcDelay *delays = std::bit_cast<ArcDelay*>(edge->arcDelays()); const ArcDelay *delays = reinterpret_cast<const ArcDelay*>(edge->arcDelays());
return delays[index]; return delays[index];
} }
else { else {
@ -695,7 +692,7 @@ Graph::setArcDelay(Edge *edge,
{ {
size_t index = arc->index() * ap_count_ + ap_index; size_t index = arc->index() * ap_count_ + ap_index;
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
ArcDelay *delays = std::bit_cast<ArcDelay*>(edge->arcDelays()); ArcDelay *delays = reinterpret_cast<ArcDelay*>(edge->arcDelays());
delays[index] = delay; delays[index] = delay;
} }
else { else {
@ -711,7 +708,7 @@ Graph::wireArcDelay(const Edge *edge,
{ {
size_t index = rf->index() * ap_count_ + ap_index; size_t index = rf->index() * ap_count_ + ap_index;
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
ArcDelay *delays = std::bit_cast<ArcDelay*>(edge->arcDelays()); const ArcDelay *delays = reinterpret_cast<const ArcDelay*>(edge->arcDelays());
return delays[index]; return delays[index];
} }
else { else {
@ -728,7 +725,7 @@ Graph::setWireArcDelay(Edge *edge,
{ {
size_t index = rf->index() * ap_count_ + ap_index; size_t index = rf->index() * ap_count_ + ap_index;
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
ArcDelay *delays = std::bit_cast<ArcDelay*>(edge->arcDelays()); ArcDelay *delays = reinterpret_cast<ArcDelay*>(edge->arcDelays());
delays[index] = delay; delays[index] = delay;
} }
else { else {
@ -753,7 +750,7 @@ Graph::setArcDelayAnnotated(Edge *edge,
DcalcAPIndex ap_index, DcalcAPIndex ap_index,
bool annotated) bool annotated)
{ {
return edge->setArcDelayAnnotated(arc, ap_index, ap_count_, annotated); edge->setArcDelayAnnotated(arc, ap_index, ap_count_, annotated);
} }
bool bool
@ -774,7 +771,7 @@ Graph::setWireDelayAnnotated(Edge *edge,
{ {
int arc_index = TimingArcSet::wireArcIndex(rf); int arc_index = TimingArcSet::wireArcIndex(rf);
TimingArc *arc = TimingArcSet::wireTimingArcSet()->findTimingArc(arc_index); TimingArc *arc = TimingArcSet::wireTimingArcSet()->findTimingArc(arc_index);
return edge->setArcDelayAnnotated(arc, ap_index, ap_count_, annotated); edge->setArcDelayAnnotated(arc, ap_index, ap_count_, annotated);
} }
void void
@ -819,7 +816,7 @@ Graph::initSlews(Vertex *vertex)
{ {
size_t slew_count = slewCount(); size_t slew_count = slewCount();
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
float *slews = std::bit_cast<float*>(new Slew[slew_count]{}); float *slews = reinterpret_cast<float*>(new Slew[slew_count]{});
vertex->setSlews(slews); vertex->setSlews(slews);
} }
else { else {
@ -840,7 +837,7 @@ Graph::initArcDelays(Edge *edge)
size_t arc_count = edge->timingArcSet()->arcCount(); size_t arc_count = edge->timingArcSet()->arcCount();
size_t delay_count = arc_count * ap_count_; size_t delay_count = arc_count * ap_count_;
if (variables_->pocvEnabled()) { if (variables_->pocvEnabled()) {
float *delays = std::bit_cast<float*>(new ArcDelay[delay_count]{}); float *delays = reinterpret_cast<float*>(new ArcDelay[delay_count]{});
edge->setArcDelays(delays); edge->setArcDelays(delays);
} }
else { else {
@ -1187,7 +1184,7 @@ Vertex::setHasDownstreamClkPin(bool has_clk_pin)
bool bool
Vertex::bfsInQueue(BfsIndex index) const Vertex::bfsInQueue(BfsIndex index) const
{ {
return (bfs_in_queue_ >> unsigned(index)) & 1; return (bfs_in_queue_ >> static_cast<unsigned>(index)) & 1;
} }
void void
@ -1195,9 +1192,9 @@ Vertex::setBfsInQueue(BfsIndex index,
bool value) bool value)
{ {
if (value) if (value)
bfs_in_queue_ |= 1 << int(index); bfs_in_queue_ |= 1 << static_cast<unsigned>(index);
else else
bfs_in_queue_ &= ~(1 << int(index)); bfs_in_queue_ &= ~(1 << static_cast<unsigned>(index));
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -1400,10 +1397,7 @@ VertexIterator::VertexIterator(Graph *graph) :
graph_(graph), graph_(graph),
network_(graph->network()), network_(graph->network()),
top_inst_(network_->topInstance()), top_inst_(network_->topInstance()),
inst_iter_(network_->leafInstanceIterator()), inst_iter_(network_->leafInstanceIterator())
pin_iter_(nullptr),
vertex_(nullptr),
bidir_vertex_(nullptr)
{ {
if (inst_iter_) if (inst_iter_)
findNext(); findNext();

View File

@ -25,16 +25,16 @@
%module graph %module graph
%{ %{
#include "Graph.hh" #include "Clock.hh"
#include "FuncExpr.hh" #include "FuncExpr.hh"
#include "TimingRole.hh" #include "Graph.hh"
#include "Liberty.hh" #include "Liberty.hh"
#include "Network.hh" #include "Network.hh"
#include "Clock.hh"
#include "Scene.hh" #include "Scene.hh"
#include "Search.hh" #include "Search.hh"
#include "Sdc.hh" #include "Sdc.hh"
#include "Sta.hh" #include "Sta.hh"
#include "TimingRole.hh"
using namespace sta; using namespace sta;

View File

@ -22,12 +22,13 @@
// //
// This notice may not be removed or altered from any source distribution. // This notice may not be removed or altered from any source distribution.
#include "GraphCmp.hh"
#include "ContainerHelpers.hh" #include "ContainerHelpers.hh"
#include "StringUtil.hh" #include "Graph.hh"
#include "Network.hh" #include "Network.hh"
#include "NetworkCmp.hh" #include "NetworkCmp.hh"
#include "Graph.hh" #include "StringUtil.hh"
#include "GraphCmp.hh"
namespace sta { namespace sta {
@ -73,4 +74,4 @@ sortEdges(EdgeSeq *edges,
sort(edges, EdgeLess(network, graph)); sort(edges, EdgeLess(network, graph));
} }
} } // namespace sta

View File

@ -24,20 +24,20 @@
#pragma once #pragma once
#include <map>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include <map>
#include "MinMax.hh"
#include "LibertyClass.hh"
#include "TimingArc.hh"
#include "TableModel.hh"
#include "NetworkClass.hh"
#include "GraphClass.hh"
#include "Delay.hh" #include "Delay.hh"
#include "GraphClass.hh"
#include "LibertyClass.hh"
#include "MinMax.hh"
#include "NetworkClass.hh"
#include "ParasiticsClass.hh" #include "ParasiticsClass.hh"
#include "StaState.hh" #include "StaState.hh"
#include "TableModel.hh"
#include "TimingArc.hh"
namespace sta { namespace sta {
@ -70,7 +70,7 @@ public:
const Pin *drvr_pin, const Pin *drvr_pin,
Edge *edge, Edge *edge,
const TimingArc *arc, const TimingArc *arc,
float in_delay); float input_delay);
const Pin *inPin() const { return in_pin_; } const Pin *inPin() const { return in_pin_; }
const RiseFall *inEdge() const; const RiseFall *inEdge() const;
const Pin *drvrPin() const { return drvr_pin_; } const Pin *drvrPin() const { return drvr_pin_; }

View File

@ -26,8 +26,8 @@
#include <map> #include <map>
#include "StaState.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "StaState.hh"
struct DdNode; struct DdNode;
struct DdManager; struct DdManager;

View File

@ -27,10 +27,10 @@
#include <mutex> #include <mutex>
#include <vector> #include <vector>
#include "Iterator.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "VertexVisitor.hh" #include "Iterator.hh"
#include "StaState.hh" #include "StaState.hh"
#include "VertexVisitor.hh"
namespace sta { namespace sta {

View File

@ -24,10 +24,10 @@
#pragma once #pragma once
#include <vector>
#include <algorithm> #include <algorithm>
#include <functional> #include <functional>
#include <optional> #include <optional>
#include <vector>
namespace sta { namespace sta {

View File

@ -26,10 +26,10 @@
#include <map> #include <map>
#include "StaState.hh"
#include "NetworkClass.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "NetworkClass.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "StaState.hh"
namespace sta { namespace sta {

View File

@ -27,11 +27,11 @@
#include <map> #include <map>
#include <string> #include <string>
#include "GraphClass.hh"
#include "MinMax.hh" #include "MinMax.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "SdcCmdComment.hh" #include "SdcCmdComment.hh"
#include "GraphClass.hh"
namespace sta { namespace sta {
@ -170,31 +170,31 @@ protected:
std::string name_; std::string name_;
PinSet pins_; PinSet pins_;
bool add_to_pins_; bool add_to_pins_{false};
// Hierarchical pins in pins_ become driver pins through the pin. // Hierarchical pins in pins_ become driver pins through the pin.
PinSet leaf_pins_; PinSet leaf_pins_;
float period_; float period_{0.0};
FloatSeq *waveform_; FloatSeq *waveform_{nullptr};
bool waveform_valid_; bool waveform_valid_{false};
const int index_; const int index_;
ClockEdge **clk_edges_; ClockEdge **clk_edges_{nullptr};
bool is_propagated_; bool is_propagated_{false};
RiseFallMinMax slews_; RiseFallMinMax slews_;
RiseFallMinMax slew_limits_[path_clk_or_data_count]; RiseFallMinMax slew_limits_[path_clk_or_data_count];
ClockUncertainties *uncertainties_; ClockUncertainties *uncertainties_{nullptr};
bool is_generated_; bool is_generated_{false};
// Generated clock variables. // Generated clock variables.
Pin *src_pin_; Pin *src_pin_{nullptr};
Clock *master_clk_; Clock *master_clk_{nullptr};
// True if the master clock is infered rather than specified by command. // True if the master clock is infered rather than specified by command.
bool master_clk_infered_; bool master_clk_infered_{false};
int divide_by_; int divide_by_{0};
int multiply_by_; int multiply_by_{0};
float duty_cycle_; float duty_cycle_{0};
bool invert_; bool invert_{false};
bool combinational_; bool combinational_{false};
IntSeq *edges_; IntSeq *edges_{nullptr};
FloatSeq *edge_shifts_; FloatSeq *edge_shifts_{nullptr};
private: private:
friend class Sdc; friend class Sdc;
@ -205,7 +205,6 @@ class ClockEdge
{ {
public: public:
Clock *clock() const { return clock_; } Clock *clock() const { return clock_; }
~ClockEdge();
const RiseFall *transition() const { return rf_; } const RiseFall *transition() const { return rf_; }
float time() const { return time_; } float time() const { return time_; }
const std::string &name() const { return name_; } const std::string &name() const { return name_; }
@ -223,7 +222,7 @@ private:
Clock *clock_; Clock *clock_;
const RiseFall *rf_; const RiseFall *rf_;
std::string name_; std::string name_;
float time_; float time_{0.0};
int index_; int index_;
}; };

View File

@ -24,22 +24,21 @@
#pragma once #pragma once
#include "SdcClass.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh"
namespace sta { namespace sta {
class ClockGatingCheck class ClockGatingCheck
{ {
public: public:
ClockGatingCheck();
RiseFallMinMax *margins() { return &margins_; } RiseFallMinMax *margins() { return &margins_; }
void setActiveValue(LogicValue value); void setActiveValue(LogicValue value);
LogicValue activeValue() const { return active_value_; } LogicValue activeValue() const { return active_value_; }
private: private:
RiseFallMinMax margins_; RiseFallMinMax margins_;
LogicValue active_value_; LogicValue active_value_{LogicValue::unknown};
}; };
} // namespace sta } // namespace sta

View File

@ -26,8 +26,8 @@
#include <string> #include <string>
#include "SdcCmdComment.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "SdcCmdComment.hh"
namespace sta { namespace sta {

View File

@ -26,8 +26,8 @@
#include "MinMax.hh" #include "MinMax.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "SdcClass.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh"
#include "Transition.hh" #include "Transition.hh"
namespace sta { namespace sta {

View File

@ -26,9 +26,9 @@
#include "MinMax.hh" #include "MinMax.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "Transition.hh"
#include "SdcClass.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh"
#include "Transition.hh"
namespace sta { namespace sta {

View File

@ -25,12 +25,12 @@
#pragma once #pragma once
#include <functional> #include <functional>
#include <map>
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include <map>
#include "StringUtil.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "StringUtil.hh"
// The classes defined in this file are a contrete implementation of // The classes defined in this file are a contrete implementation of
// the library API. They can be used by a reader to construct classes // the library API. They can be used by a reader to construct classes
@ -84,8 +84,8 @@ protected:
ObjectId id_; ObjectId id_;
std::string filename_; std::string filename_;
bool is_liberty_; bool is_liberty_;
char bus_brkt_left_; char bus_brkt_left_{'['};
char bus_brkt_right_; char bus_brkt_right_{']'};
ConcreteCellMap cell_map_; ConcreteCellMap cell_map_;
private: private:
@ -129,7 +129,7 @@ public:
// Group previously defined bus bit ports together. // Group previously defined bus bit ports together.
void groupBusPorts(char bus_brkt_left, void groupBusPorts(char bus_brkt_left,
char bus_brkt_right, char bus_brkt_right,
std::function<bool(std::string_view)> port_msb_first); const std::function<bool(std::string_view)> &port_msb_first);
size_t portCount() const; size_t portCount() const;
void setName(std::string_view name); void setName(std::string_view name);
virtual void addPort(ConcretePort *port); virtual void addPort(ConcretePort *port);
@ -149,7 +149,7 @@ protected:
int from_index, int from_index,
int to_index); int to_index);
// Bus port bit (internal to makeBusPortBits). // Bus port bit (internal to makeBusPortBits).
ConcretePort *makePort(std::string bit_name, ConcretePort *makePort(std::string_view bit_name,
int bit_index); int bit_index);
void makeBusPortBit(ConcretePort *bus_port, void makeBusPortBit(ConcretePort *bus_port,
std::string_view bus_name, std::string_view bus_name,
@ -160,14 +160,14 @@ protected:
// Filename is optional. // Filename is optional.
std::string filename_; std::string filename_;
ConcreteLibrary *library_; ConcreteLibrary *library_;
LibertyCell *liberty_cell_; LibertyCell *liberty_cell_{nullptr};
// External application cell. // External application cell.
void *ext_cell_; void *ext_cell_{nullptr};
// Non-bus and bus ports (but no expanded bus bit ports). // Non-bus and bus ports (but no expanded bus bit ports).
ConcretePortSeq ports_; ConcretePortSeq ports_;
ConcretePortMap port_map_; ConcretePortMap port_map_;
// Port bit count (expanded buses). // Port bit count (expanded buses).
int port_bit_count_; int port_bit_count_{0};
bool is_leaf_; bool is_leaf_;
AttributeMap attribute_map_; AttributeMap attribute_map_;
@ -242,10 +242,10 @@ protected:
ObjectId id_; ObjectId id_;
ConcreteCell *cell_; ConcreteCell *cell_;
PortDirection *direction_; PortDirection *direction_;
LibertyPort *liberty_port_; LibertyPort *liberty_port_{nullptr};
// External application port. // External application port.
void *ext_port_; void *ext_port_{nullptr};
int pin_index_; int pin_index_{-1};
bool is_bundle_; bool is_bundle_;
bool is_bus_; bool is_bus_;
int from_index_; int from_index_;
@ -253,7 +253,7 @@ protected:
// Expanded bus bit ports (ordered by from_index_ to to_index_) // Expanded bus bit ports (ordered by from_index_ to to_index_)
// or bundle member ports. // or bundle member ports.
ConcretePortSeq *member_ports_; ConcretePortSeq *member_ports_;
ConcretePort *bundle_port_; ConcretePort *bundle_port_{nullptr};
private: private:
friend class ConcreteCell; friend class ConcreteCell;
@ -271,8 +271,8 @@ private:
const ConcretePortSeq &ports_; const ConcretePortSeq &ports_;
ConcretePortSeq::const_iterator port_iter_; ConcretePortSeq::const_iterator port_iter_;
ConcretePortMemberIterator *member_iter_; ConcretePortMemberIterator *member_iter_{nullptr};
ConcretePort *next_; ConcretePort *next_{nullptr};
}; };
} // namespace sta } // namespace sta

View File

@ -25,14 +25,14 @@
#pragma once #pragma once
#include <functional> #include <functional>
#include <string_view>
#include <vector>
#include <map> #include <map>
#include <set> #include <set>
#include <string_view>
#include <vector>
#include "StringUtil.hh"
#include "Network.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "Network.hh"
#include "StringUtil.hh"
namespace sta { namespace sta {
@ -263,6 +263,9 @@ public:
using Network::isLeaf; using Network::isLeaf;
protected: protected:
void clearImpl();
void deleteCellNetworkViewsImpl();
void deleteInstanceImpl(Instance *inst);
void addLibrary(ConcreteLibrary *library); void addLibrary(ConcreteLibrary *library);
void setName(std::string_view name); void setName(std::string_view name);
void clearConstantNets(); void clearConstantNets();
@ -280,8 +283,8 @@ protected:
// Cell lookup search order sequence. // Cell lookup search order sequence.
ConcreteLibrarySeq library_seq_; ConcreteLibrarySeq library_seq_;
ConcreteLibraryMap library_map_; ConcreteLibraryMap library_map_;
Instance *top_instance_; Instance *top_instance_{nullptr};
NetSet constant_nets_[2]; // LogicValue::zero/one NetSet constant_nets_[2]{NetSet(this), NetSet(this)}; // LogicValue::zero/one
LinkNetworkFunc link_func_; LinkNetworkFunc link_func_;
CellNetworkViewMap cell_network_view_map_; CellNetworkViewMap cell_network_view_map_;
static ObjectId object_id_; static ObjectId object_id_;
@ -293,7 +296,7 @@ private:
class ConcreteInstance class ConcreteInstance
{ {
public: public:
std::string_view name() const { return name_; } const std::string &name() const { return name_; }
ObjectId id() const { return id_; } ObjectId id() const { return id_; }
Cell *cell() const; Cell *cell() const;
ConcreteInstance *parent() const { return parent_; } ConcreteInstance *parent() const { return parent_; }
@ -332,8 +335,8 @@ protected:
ConcreteInstance *parent_; ConcreteInstance *parent_;
// Array of pins indexed by pin->port->index(). // Array of pins indexed by pin->port->index().
ConcretePinSeq pins_; ConcretePinSeq pins_;
ConcreteInstanceChildMap *children_; ConcreteInstanceChildMap *children_{nullptr};
ConcreteInstanceNetMap *nets_; ConcreteInstanceNetMap *nets_{nullptr};
AttributeMap attribute_map_; AttributeMap attribute_map_;
private: private:
@ -344,7 +347,7 @@ private:
class ConcretePin class ConcretePin
{ {
public: public:
std::string_view name() const; const std::string &name() const;
ConcreteInstance *instance() const { return instance_; } ConcreteInstance *instance() const { return instance_; }
ConcreteNet *net() const { return net_; } ConcreteNet *net() const { return net_; }
ConcretePort *port() const { return port_; } ConcretePort *port() const { return port_; }
@ -362,12 +365,12 @@ protected:
ConcreteInstance *instance_; ConcreteInstance *instance_;
ConcretePort *port_; ConcretePort *port_;
ConcreteNet *net_; ConcreteNet *net_;
ConcreteTerm *term_; ConcreteTerm *term_{nullptr};
ObjectId id_; ObjectId id_;
// Doubly linked list of net pins. // Doubly linked list of net pins.
ConcretePin *net_next_; ConcretePin *net_next_{nullptr};
ConcretePin *net_prev_; ConcretePin *net_prev_{nullptr};
VertexId vertex_id_; VertexId vertex_id_{vertex_id_null};
private: private:
friend class ConcreteNetwork; friend class ConcreteNetwork;
@ -378,7 +381,7 @@ private:
class ConcreteTerm class ConcreteTerm
{ {
public: public:
std::string_view name() const; const std::string &name() const;
ObjectId id() const { return id_; } ObjectId id() const { return id_; }
ConcreteNet *net() const { return net_; } ConcreteNet *net() const { return net_; }
ConcretePin *pin() const { return pin_; } ConcretePin *pin() const { return pin_; }
@ -392,7 +395,7 @@ protected:
ConcreteNet *net_; ConcreteNet *net_;
ObjectId id_; ObjectId id_;
// Linked list of net terms. // Linked list of net terms.
ConcreteTerm *net_next_; ConcreteTerm *net_next_{nullptr};
private: private:
friend class ConcreteNetwork; friend class ConcreteNetwork;
@ -403,7 +406,7 @@ private:
class ConcreteNet class ConcreteNet
{ {
public: public:
std::string_view name() const { return name_; } const std::string &name() const { return name_; }
ObjectId id() const { return id_; } ObjectId id() const { return id_; }
ConcreteInstance *instance() const { return instance_; } ConcreteInstance *instance() const { return instance_; }
void addPin(ConcretePin *pin); void addPin(ConcretePin *pin);
@ -420,12 +423,12 @@ protected:
ObjectId id_; ObjectId id_;
ConcreteInstance *instance_; ConcreteInstance *instance_;
// Pointer to head of linked list of pins. // Pointer to head of linked list of pins.
ConcretePin *pins_; ConcretePin *pins_{nullptr};
// Pointer to head of linked list of terminals. // Pointer to head of linked list of terminals.
// These terminals correspond to the pins attached to the instance that // These terminals correspond to the pins attached to the instance that
// contains this net in the hierarchy level above. // contains this net in the hierarchy level above.
ConcreteTerm *terms_; ConcreteTerm *terms_{nullptr};
ConcreteNet *merged_into_; ConcreteNet *merged_into_{nullptr};
friend class ConcreteNetwork; friend class ConcreteNetwork;
friend class ConcreteNetTermIterator; friend class ConcreteNetTermIterator;

View File

@ -27,9 +27,9 @@
#include <unordered_set> #include <unordered_set>
#include "MinMax.hh" #include "MinMax.hh"
#include "TimingRole.hh"
#include "StaState.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "StaState.hh"
#include "TimingRole.hh"
namespace sta { namespace sta {
@ -127,7 +127,7 @@ private:
int src_cycle_[TimingRole::index_max + 1]; int src_cycle_[TimingRole::index_max + 1];
// Target clock cycle offset. // Target clock cycle offset.
int tgt_cycle_[TimingRole::index_max + 1]; int tgt_cycle_[TimingRole::index_max + 1];
bool max_cycles_exceeded_; bool max_cycles_exceeded_{false};
}; };
} // namespace sta } // namespace sta

View File

@ -24,12 +24,12 @@
#pragma once #pragma once
#include "MinMax.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "MinMax.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "NetworkCmp.hh" #include "NetworkCmp.hh"
#include "SdcClass.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh"
namespace sta { namespace sta {

View File

@ -24,10 +24,10 @@
#pragma once #pragma once
#include <string>
#include <string_view>
#include <map> #include <map>
#include <mutex> #include <mutex>
#include <string>
#include <string_view>
#include "Format.hh" #include "Format.hh"
#include "Report.hh" #include "Report.hh"

View File

@ -27,8 +27,8 @@
#include <array> #include <array>
#include <cstddef> #include <cstddef>
#include "StaConfig.hh"
#include "MinMax.hh" #include "MinMax.hh"
#include "StaConfig.hh"
namespace sta { namespace sta {
@ -78,7 +78,7 @@ class DelayDbl
{ {
public: public:
DelayDbl() noexcept; DelayDbl() noexcept;
DelayDbl(double value) noexcept; DelayDbl(double mean) noexcept;
double mean() const { return values_[0]; } double mean() const { return values_[0]; }
void setMean(double mean); void setMean(double mean);
double meanShift() const { return values_[1]; } double meanShift() const { return values_[1]; }

View File

@ -24,10 +24,10 @@
#pragma once #pragma once
#include "MinMax.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "SdcClass.hh" #include "MinMax.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh"
namespace sta { namespace sta {
@ -111,10 +111,4 @@ private:
DeratingFactors factors_[timing_derate_cell_type_count]; DeratingFactors factors_[timing_derate_cell_type_count];
}; };
class DeratingFactorsNet : public DeratingFactors
{
public:
DeratingFactorsNet();
};
} // namespace sta } // namespace sta

View File

@ -27,8 +27,8 @@
#include <set> #include <set>
#include <vector> #include <vector>
#include "NetworkClass.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
namespace sta { namespace sta {
@ -46,7 +46,6 @@ using TimingArcSetSet = std::set<TimingArcSet*, TimingArcSetLess>;
class DisabledPorts class DisabledPorts
{ {
public: public:
DisabledPorts();
~DisabledPorts(); ~DisabledPorts();
void setDisabledAll(); void setDisabledAll();
void removeDisabledAll(); void removeDisabledAll();
@ -67,10 +66,10 @@ public:
[[nodiscard]] bool all() const { return all_; } [[nodiscard]] bool all() const { return all_; }
private: private:
bool all_; bool all_{false};
LibertyPortSet *from_; LibertyPortSet *from_{nullptr};
LibertyPortSet *to_; LibertyPortSet *to_{nullptr};
LibertyPortPairSet *from_to_; LibertyPortPairSet *from_to_{nullptr};
}; };
// set_disable_timing cell [-from] [-to] // set_disable_timing cell [-from] [-to]
@ -89,7 +88,7 @@ public:
private: private:
LibertyCell *cell_; LibertyCell *cell_;
TimingArcSetSet *arc_sets_; TimingArcSetSet *arc_sets_{nullptr};
}; };
// set_disable_timing instance [-from] [-to] // set_disable_timing instance [-from] [-to]

View File

@ -5,14 +5,14 @@
#pragma once #pragma once
#include <thread>
#include <functional>
#include <vector>
#include <cstdint>
#include <queue>
#include <mutex>
#include <condition_variable>
#include <atomic> #include <atomic>
#include <condition_variable>
#include <cstdint>
#include <functional>
#include <mutex>
#include <queue>
#include <thread>
#include <vector>
namespace sta { namespace sta {

View File

@ -35,7 +35,6 @@ namespace sta {
class Exception : public std::exception class Exception : public std::exception
{ {
public: public:
Exception();
const char *what() const noexcept override = 0; const char *what() const noexcept override = 0;
}; };

View File

@ -29,8 +29,8 @@
#include <vector> #include <vector>
#include "Error.hh" #include "Error.hh"
#include "SdcCmdComment.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "SdcCmdComment.hh"
namespace sta { namespace sta {
@ -145,7 +145,7 @@ protected:
const MinMaxAll *min_max_; const MinMaxAll *min_max_;
bool own_pts_; bool own_pts_;
int priority_; int priority_;
size_t id_; // Unique ID assigned by Sdc. size_t id_{0}; // Unique ID assigned by Sdc.
ExceptionState *states_; ExceptionState *states_;
}; };
@ -301,7 +301,6 @@ public:
ExceptionTo *to, ExceptionTo *to,
bool own_pts, bool own_pts,
std::string_view comment); std::string_view comment);
~GroupPath() override;
ExceptionPath *clone(ExceptionFrom *from, ExceptionPath *clone(ExceptionFrom *from,
ExceptionThruSeq *thrus, ExceptionThruSeq *thrus,
ExceptionTo *to, ExceptionTo *to,
@ -367,7 +366,7 @@ protected:
bool own_pts_; bool own_pts_;
// Hash is cached because there may be many objects to speed up // Hash is cached because there may be many objects to speed up
// exception merging. // exception merging.
size_t hash_; size_t hash_{0};
// Maximum number of objects for to_string() to show. // Maximum number of objects for to_string() to show.
static const int to_string_max_objects_; static const int to_string_max_objects_;
@ -583,7 +582,7 @@ protected:
// Leaf/port pins. // Leaf/port pins.
PinSet *pins_; PinSet *pins_;
// Graph edges that traverse thru hierarchical pins. // Graph edges that traverse thru hierarchical pins.
EdgePinsSet *edges_; EdgePinsSet *edges_{nullptr};
NetSet *nets_; NetSet *nets_;
InstanceSet *insts_; InstanceSet *insts_;
}; };
@ -602,9 +601,9 @@ public:
private: private:
const ExceptionPath *exception_; const ExceptionPath *exception_;
bool from_done_; bool from_done_{false};
ExceptionThruSeq::iterator thru_iter_; ExceptionThruSeq::iterator thru_iter_;
bool to_done_; bool to_done_{false};
}; };
// Visitor for exception point sets expanded into single object paths. // Visitor for exception point sets expanded into single object paths.
@ -665,7 +664,7 @@ public:
private: private:
ExceptionPath *exception_; ExceptionPath *exception_;
ExceptionThru *next_thru_; ExceptionThru *next_thru_;
ExceptionState *next_state_; ExceptionState *next_state_{nullptr};
int index_; int index_;
}; };

View File

@ -41,52 +41,52 @@ class Report;
PortSeq PortSeq
filterPorts(std::string_view filter_expression, filterPorts(std::string_view filter_expression,
PortSeq *objects, PortSeq *ports,
Sta *sta); Sta *sta);
InstanceSeq InstanceSeq
filterInstances(std::string_view filter_expression, filterInstances(std::string_view filter_expression,
InstanceSeq *objects, InstanceSeq *insts,
Sta *sta); Sta *sta);
PinSeq PinSeq
filterPins(std::string_view filter_expression, filterPins(std::string_view filter_expression,
PinSeq *objects, PinSeq *pins,
Sta *sta); Sta *sta);
NetSeq NetSeq
filterNets(std::string_view filter_expression, filterNets(std::string_view filter_expression,
NetSeq *objects, NetSeq *nets,
Sta *sta); Sta *sta);
ClockSeq ClockSeq
filterClocks(std::string_view filter_expression, filterClocks(std::string_view filter_expression,
ClockSeq *objects, ClockSeq *clks,
Sta *sta); Sta *sta);
LibertyCellSeq LibertyCellSeq
filterLibCells(std::string_view filter_expression, filterLibCells(std::string_view filter_expression,
LibertyCellSeq *objects, LibertyCellSeq *cells,
Sta *sta); Sta *sta);
LibertyPortSeq LibertyPortSeq
filterLibPins(std::string_view filter_expression, filterLibPins(std::string_view filter_expression,
LibertyPortSeq *objects, LibertyPortSeq *ports,
Sta *sta); Sta *sta);
LibertyLibrarySeq LibertyLibrarySeq
filterLibertyLibraries(std::string_view filter_expression, filterLibertyLibraries(std::string_view filter_expression,
LibertyLibrarySeq *objects, LibertyLibrarySeq *libs,
Sta *sta); Sta *sta);
EdgeSeq EdgeSeq
filterTimingArcs(std::string_view filter_expression, filterTimingArcs(std::string_view filter_expression,
EdgeSeq *objects, EdgeSeq *edges,
Sta *sta); Sta *sta);
PathEndSeq PathEndSeq
filterPathEnds(std::string_view filter_expression, filterPathEnds(std::string_view filter_expression,
PathEndSeq *objects, PathEndSeq *ends,
Sta *sta); Sta *sta);
// For FilterExpr unit tests. // For FilterExpr unit tests.

View File

@ -26,8 +26,8 @@
#include <string> #include <string>
#include "NetworkClass.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "NetworkClass.hh"
namespace sta { namespace sta {

View File

@ -24,19 +24,19 @@
#pragma once #pragma once
#include <mutex>
#include <atomic> #include <atomic>
#include <map> #include <map>
#include <mutex>
#include "Iterator.hh"
#include "ObjectTable.hh"
#include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "Delay.hh" #include "Delay.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "VertexId.hh" #include "Iterator.hh"
#include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "ObjectTable.hh"
#include "Path.hh" #include "Path.hh"
#include "StaState.hh" #include "StaState.hh"
#include "VertexId.hh"
namespace sta { namespace sta {
@ -102,7 +102,7 @@ public:
const Slew &slew); const Slew &slew);
// Edge functions. // Edge functions.
Edge *edge(EdgeId edge_index) const; Edge *edge(EdgeId edge_id) const;
EdgeId id(const Edge *edge) const; EdgeId id(const Edge *edge) const;
Edge *makeEdge(Vertex *from, Edge *makeEdge(Vertex *from,
Vertex *to, Vertex *to,
@ -211,8 +211,8 @@ protected:
void initArcDelays(Edge *edge); void initArcDelays(Edge *edge);
void removeDelayAnnotated(Edge *edge); void removeDelayAnnotated(Edge *edge);
VertexTable *vertices_; VertexTable *vertices_{nullptr};
EdgeTable *edges_; EdgeTable *edges_{nullptr};
// Bidirect pins are split into two vertices: // Bidirect pins are split into two vertices:
// load/sink (top level output, instance pin input) vertex in pin_vertex_map // load/sink (top level output, instance pin input) vertex in pin_vertex_map
// driver/source (top level input, instance pin output) vertex // driver/source (top level input, instance pin output) vertex
@ -436,9 +436,9 @@ private:
Network *network_; Network *network_;
Instance *top_inst_; Instance *top_inst_;
LeafInstanceIterator *inst_iter_; LeafInstanceIterator *inst_iter_;
InstancePinIterator *pin_iter_; InstancePinIterator *pin_iter_{nullptr};
Vertex *vertex_; Vertex *vertex_{nullptr};
Vertex *bidir_vertex_; Vertex *bidir_vertex_{nullptr};
}; };
class VertexInEdgeIterator : public VertexEdgeIterator class VertexInEdgeIterator : public VertexEdgeIterator

View File

@ -25,13 +25,13 @@
#pragma once #pragma once
#include <limits> #include <limits>
#include <vector>
#include <set> #include <set>
#include <vector>
#include "ObjectId.hh"
#include "MinMax.hh"
#include "Transition.hh"
#include "Delay.hh" #include "Delay.hh"
#include "MinMax.hh"
#include "ObjectId.hh"
#include "Transition.hh"
namespace sta { namespace sta {

View File

@ -24,9 +24,9 @@
#pragma once #pragma once
#include "GraphClass.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "NetworkCmp.hh" #include "NetworkCmp.hh"
#include "GraphClass.hh"
namespace sta { namespace sta {

View File

@ -25,16 +25,16 @@
#pragma once #pragma once
#include <array> #include <array>
#include <vector>
#include <map> #include <map>
#include <mutex> #include <mutex>
#include <vector>
#include "NetworkClass.hh"
#include "GraphClass.hh"
#include "SearchClass.hh"
#include "SdcClass.hh"
#include "StaState.hh"
#include "ArcDelayCalc.hh" #include "ArcDelayCalc.hh"
#include "GraphClass.hh"
#include "NetworkClass.hh"
#include "SdcClass.hh"
#include "SearchClass.hh"
#include "StaState.hh"
namespace sta { namespace sta {
@ -104,7 +104,7 @@ public:
float &pin_cap, float &pin_cap,
float &wire_cap, float &wire_cap,
float &fanout, float &fanout,
bool &has_set_load) const; bool &has_net_load) const;
void parasiticLoad(const Pin *drvr_pin, void parasiticLoad(const Pin *drvr_pin,
const RiseFall *rf, const RiseFall *rf,
const Scene *scene, const Scene *scene,
@ -171,7 +171,7 @@ protected:
Vertex *drvr_vertex, Vertex *drvr_vertex,
const RiseFall *rf, const RiseFall *rf,
const LibertyPort *from_port, const LibertyPort *from_port,
float *from_slews, const DriveCellSlews *from_slews,
const LibertyPort *to_port, const LibertyPort *to_port,
const Scene *scene, const Scene *scene,
const MinMax *min_max, const MinMax *min_max,
@ -191,7 +191,7 @@ protected:
ArcDelayCalc *arc_delay_calc, ArcDelayCalc *arc_delay_calc,
LoadPinIndexMap &load_pin_index_map); LoadPinIndexMap &load_pin_index_map);
MultiDrvrNet *multiDrvrNet(const Vertex *drvr_vertex) const; MultiDrvrNet *multiDrvrNet(const Vertex *drvr_vertex) const;
MultiDrvrNet *findMultiDrvrNet(Vertex *drvr_pin); MultiDrvrNet *findMultiDrvrNet(Vertex *drvr_vertex);
MultiDrvrNet *makeMultiDrvrNet(Vertex *drvr_vertex); MultiDrvrNet *makeMultiDrvrNet(Vertex *drvr_vertex);
bool hasMultiDrvrs(Vertex *drvr_vertex); bool hasMultiDrvrs(Vertex *drvr_vertex);
Vertex *firstLoad(Vertex *drvr_vertex); Vertex *firstLoad(Vertex *drvr_vertex);
@ -235,7 +235,7 @@ protected:
ArcDelayCalc *arc_delay_calc, ArcDelayCalc *arc_delay_calc,
bool propagate); bool propagate);
DrvrLoadSlews loadSlews(LoadPinIndexMap &load_pin_index_map); DrvrLoadSlews loadSlews(LoadPinIndexMap &load_pin_index_map);
bool loadSlewsChanged(DrvrLoadSlews &prev_load_slews, bool loadSlewsChanged(DrvrLoadSlews &load_slews_prev,
LoadPinIndexMap &load_pin_index_map); LoadPinIndexMap &load_pin_index_map);
void enqueueTimingChecksEdges(Vertex *vertex); void enqueueTimingChecksEdges(Vertex *vertex);
bool annotateDelaysSlews(Edge *edge, bool annotateDelaysSlews(Edge *edge,
@ -294,10 +294,10 @@ protected:
bool &has_net_load) const; bool &has_net_load) const;
// Observer for edge delay changes. // Observer for edge delay changes.
DelayCalcObserver *observer_; DelayCalcObserver *observer_{nullptr};
bool delays_seeded_; bool delays_seeded_{false};
bool incremental_; bool incremental_{false};
bool delays_exist_; bool delays_exist_{false};
// Vertices with invalid -to delays. // Vertices with invalid -to delays.
VertexSet invalid_delays_; VertexSet invalid_delays_;
// Timing check edges with invalid delays. // Timing check edges with invalid delays.
@ -313,7 +313,7 @@ protected:
std::mutex multi_drvr_lock_; std::mutex multi_drvr_lock_;
// Percentage (0.0:1.0) change in delay that causes downstream // Percentage (0.0:1.0) change in delay that causes downstream
// delays to be recomputed during incremental delay calculation. // delays to be recomputed during incremental delay calculation.
float incremental_delay_tolerance_; float incremental_delay_tolerance_{0.0};
friend class FindVertexDelays; friend class FindVertexDelays;
friend class MultiDrvrNet; friend class MultiDrvrNet;
@ -334,7 +334,6 @@ public:
class MultiDrvrNet class MultiDrvrNet
{ {
public: public:
MultiDrvrNet();
VertexSeq &drvrs() { return drvrs_; } VertexSeq &drvrs() { return drvrs_; }
const VertexSeq &drvrs() const { return drvrs_; } const VertexSeq &drvrs() const { return drvrs_; }
bool parallelGates(const Network *network) const; bool parallelGates(const Network *network) const;
@ -352,7 +351,7 @@ public:
private: private:
// Driver that triggers delay calculation for all the drivers on the net. // Driver that triggers delay calculation for all the drivers on the net.
Vertex *dcalc_drvr_; Vertex *dcalc_drvr_{nullptr};
VertexSeq drvrs_; VertexSeq drvrs_;
// [drvr_rf->index][dcalc_ap->index] // [drvr_rf->index][dcalc_ap->index]
std::vector<NetCaps> net_caps_; std::vector<NetCaps> net_caps_;

View File

@ -24,8 +24,8 @@
#pragma once #pragma once
#include <cstdint>
#include <cstddef> #include <cstddef>
#include <cstdint>
#include <string_view> #include <string_view>
namespace sta { namespace sta {

View File

@ -24,10 +24,11 @@
#pragma once #pragma once
#include "MinMax.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "MinMax.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "RiseFallMinMax.hh" #include "RiseFallMinMax.hh"
#include "SdcClass.hh"
namespace sta { namespace sta {
@ -58,7 +59,7 @@ public:
void setDriveCell(const LibertyLibrary *library, void setDriveCell(const LibertyLibrary *library,
const LibertyCell *cell, const LibertyCell *cell,
const LibertyPort *from_port, const LibertyPort *from_port,
float *from_slews, const DriveCellSlews &from_slews,
const LibertyPort *to_port, const LibertyPort *to_port,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const MinMaxAll *min_max); const MinMaxAll *min_max);
@ -67,7 +68,7 @@ public:
// Return values. // Return values.
const LibertyCell *&cell, const LibertyCell *&cell,
const LibertyPort *&from_port, const LibertyPort *&from_port,
float *&from_slews, const DriveCellSlews *&from_slews,
const LibertyPort *&to_port) const; const LibertyPort *&to_port) const;
InputDriveCell *driveCell(const RiseFall *rf, InputDriveCell *driveCell(const RiseFall *rf,
const MinMax *min_max) const; const MinMax *min_max) const;
@ -94,7 +95,7 @@ public:
InputDriveCell(const LibertyLibrary *library, InputDriveCell(const LibertyLibrary *library,
const LibertyCell *cell, const LibertyCell *cell,
const LibertyPort *from_port, const LibertyPort *from_port,
float *from_slews, const DriveCellSlews &from_slews,
const LibertyPort *to_port); const LibertyPort *to_port);
const LibertyLibrary *library() const { return library_; } const LibertyLibrary *library() const { return library_; }
void setLibrary(const LibertyLibrary *library); void setLibrary(const LibertyLibrary *library);
@ -102,8 +103,8 @@ public:
void setCell(const LibertyCell *cell); void setCell(const LibertyCell *cell);
const LibertyPort *fromPort() const { return from_port_; } const LibertyPort *fromPort() const { return from_port_; }
void setFromPort(const LibertyPort *from_port); void setFromPort(const LibertyPort *from_port);
float *fromSlews() { return from_slews_; } const DriveCellSlews &fromSlews() const { return from_slews_; }
void setFromSlews(float *from_slews); void setFromSlews(const DriveCellSlews &from_slews);
const LibertyPort *toPort() const { return to_port_; } const LibertyPort *toPort() const { return to_port_; }
void setToPort(const LibertyPort *to_port); void setToPort(const LibertyPort *to_port);
bool equal(const InputDriveCell *drive) const; bool equal(const InputDriveCell *drive) const;
@ -112,7 +113,7 @@ private:
const LibertyLibrary *library_; const LibertyLibrary *library_;
const LibertyCell *cell_; const LibertyCell *cell_;
const LibertyPort *from_port_; const LibertyPort *from_port_;
float from_slews_[RiseFall::index_count]; DriveCellSlews from_slews_;
const LibertyPort *to_port_; const LibertyPort *to_port_;
}; };

View File

@ -24,27 +24,27 @@
#pragma once #pragma once
#include <memory>
#include <mutex>
#include <atomic> #include <atomic>
#include <functional> #include <functional>
#include <set>
#include <map> #include <map>
#include <memory>
#include <mutex>
#include <set>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include "ContainerHelpers.hh"
#include "MinMax.hh"
#include "RiseFallMinMax.hh"
#include "ConcreteLibrary.hh" #include "ConcreteLibrary.hh"
#include "RiseFallValues.hh" #include "ContainerHelpers.hh"
#include "MinMaxValues.hh"
#include "Transition.hh"
#include "Delay.hh" #include "Delay.hh"
#include "InternalPower.hh" #include "InternalPower.hh"
#include "LeakagePower.hh" #include "LeakagePower.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "MinMax.hh"
#include "MinMaxValues.hh"
#include "RiseFallMinMax.hh"
#include "RiseFallValues.hh"
#include "Transition.hh"
namespace sta { namespace sta {

View File

@ -24,10 +24,10 @@
#pragma once #pragma once
#include <memory>
#include <vector>
#include <map> #include <map>
#include <memory>
#include <set> #include <set>
#include <vector>
namespace sta { namespace sta {

View File

@ -25,8 +25,8 @@
#pragma once #pragma once
#include <array> #include <array>
#include <vector>
#include <string> #include <string>
#include <vector>
#include "Iterator.hh" #include "Iterator.hh"

View File

@ -24,8 +24,8 @@
#pragma once #pragma once
#include "MinMax.hh"
#include "Error.hh" #include "Error.hh"
#include "MinMax.hh"
namespace sta { namespace sta {

View File

@ -29,11 +29,11 @@
#include <string> #include <string>
#include <string_view> #include <string_view>
#include "StringUtil.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "VertexId.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "StaState.hh" #include "StaState.hh"
#include "StringUtil.hh"
#include "VertexId.hh"
namespace sta { namespace sta {
@ -93,7 +93,7 @@ using NetDrvrPinsMap = std::map<const Net*, PinSet*>;
class Network : public StaState class Network : public StaState
{ {
public: public:
Network(); Network() = default;
~Network() override; ~Network() override;
virtual void clear(); virtual void clear();
@ -446,7 +446,7 @@ protected:
void findInstancesMatching1(const Instance *context, void findInstancesMatching1(const Instance *context,
size_t context_name_length, size_t context_name_length,
const PatternMatch *pattern, const PatternMatch *pattern,
InstanceSeq &insts) const; InstanceSeq &matches) const;
void findInstancesHierMatching1(const Instance *instance, void findInstancesHierMatching1(const Instance *instance,
const PatternMatch *pattern, const PatternMatch *pattern,
InstanceSeq &matches) const; InstanceSeq &matches) const;
@ -475,7 +475,7 @@ protected:
const PatternMatch *pattern, const PatternMatch *pattern,
// Return value. // Return value.
PinSeq &matches) const; PinSeq &matches) const;
void findInstPinsHierMatching(const Instance *parent, void findInstPinsHierMatching(const Instance *instance,
const PatternMatch *pattern, const PatternMatch *pattern,
// Return value. // Return value.
PinSeq &matches) const; PinSeq &matches) const;
@ -490,9 +490,9 @@ protected:
// nets may be connected across hierarchy levels. // nets may be connected across hierarchy levels.
void clearNetDrvrPinMap(); void clearNetDrvrPinMap();
LibertyLibrary *default_liberty_; LibertyLibrary *default_liberty_{nullptr};
char divider_; char divider_{'/'};
char escape_; char escape_{'\\'};
NetDrvrPinsMap net_drvr_pin_map_; NetDrvrPinsMap net_drvr_pin_map_;
}; };
@ -500,7 +500,7 @@ protected:
class NetworkEdit : public Network class NetworkEdit : public Network
{ {
public: public:
NetworkEdit(); NetworkEdit() = default;
bool isEditable() const override { return true; } bool isEditable() const override { return true; }
virtual Instance *makeInstance(LibertyCell *cell, virtual Instance *makeInstance(LibertyCell *cell,
std::string_view name, std::string_view name,
@ -619,7 +619,7 @@ private:
PinSet &pins); PinSet &pins);
const Network *network_; const Network *network_;
PinSet constant_pins_[2]; PinSet constant_pins_[2]{PinSet(network_), PinSet(network_)};
LogicValue value_; LogicValue value_;
PinSet::iterator pin_iter_; PinSet::iterator pin_iter_;
}; };

View File

@ -25,11 +25,11 @@
#pragma once #pragma once
#include <cstdint> #include <cstdint>
#include <string>
#include <vector>
#include <map> #include <map>
#include <set> #include <set>
#include <string>
#include <unordered_set> #include <unordered_set>
#include <vector>
#include "Iterator.hh" #include "Iterator.hh"

View File

@ -28,11 +28,11 @@
#include <map> #include <map>
#include <vector> #include <vector>
#include "StaState.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "SdcClass.hh"
#include "ParasiticsClass.hh" #include "ParasiticsClass.hh"
#include "SdcClass.hh"
#include "StaState.hh"
namespace sta { namespace sta {
@ -164,12 +164,12 @@ public:
// Parasitic network component builders. // Parasitic network component builders.
virtual ParasiticNode *findParasiticNode(Parasitic *parasitic, virtual ParasiticNode *findParasiticNode(Parasitic *parasitic,
const Net *net, const Net *net,
int id, uint32_t id,
const Network *network) const = 0; const Network *network) const = 0;
// Make a subnode of the parasitic network net. // Make a subnode of the parasitic network net.
virtual ParasiticNode *ensureParasiticNode(Parasitic *parasitic, virtual ParasiticNode *ensureParasiticNode(Parasitic *parasitic,
const Net *net, const Net *net,
int id, uint32_t id,
const Network *network) = 0; const Network *network) = 0;
// Find the parasitic node connected to pin. // Find the parasitic node connected to pin.
virtual ParasiticNode *findParasiticNode(const Parasitic *parasitic, virtual ParasiticNode *findParasiticNode(const Parasitic *parasitic,
@ -195,11 +195,11 @@ public:
// Coupling capacitor between parasitic nodes on a net. // Coupling capacitor between parasitic nodes on a net.
virtual void makeCapacitor(Parasitic *parasitic, virtual void makeCapacitor(Parasitic *parasitic,
size_t id, uint32_t id,
float cap, float cap,
ParasiticNode *node1, ParasiticNode *node1,
ParasiticNode *node2) = 0; ParasiticNode *node2) = 0;
virtual size_t id(const ParasiticCapacitor *capacitor) const = 0; virtual uint32_t id(const ParasiticCapacitor *capacitor) const = 0;
virtual float value(const ParasiticCapacitor *capacitor) const = 0; virtual float value(const ParasiticCapacitor *capacitor) const = 0;
virtual ParasiticNode *node1(const ParasiticCapacitor *capacitor) const = 0; virtual ParasiticNode *node1(const ParasiticCapacitor *capacitor) const = 0;
virtual ParasiticNode *node2(const ParasiticCapacitor *capacitor) const = 0; virtual ParasiticNode *node2(const ParasiticCapacitor *capacitor) const = 0;
@ -207,15 +207,15 @@ public:
ParasiticNode *node) const; ParasiticNode *node) const;
virtual void makeResistor(Parasitic *parasitic, virtual void makeResistor(Parasitic *parasitic,
size_t id, uint32_t id,
float res, float res,
ParasiticNode *node1, ParasiticNode *node1,
ParasiticNode *node2) = 0; ParasiticNode *node2) = 0;
virtual size_t id(const ParasiticResistor *resistor) const = 0; virtual uint32_t id(const ParasiticResistor *resistor) const = 0;
virtual float value(const ParasiticResistor *resistor) const = 0; virtual float value(const ParasiticResistor *resistor) const = 0;
virtual ParasiticNode *node1(const ParasiticResistor *resistor) const = 0; virtual ParasiticNode *node1(const ParasiticResistor *resistor) const = 0;
virtual ParasiticNode *node2(const ParasiticResistor *resistor) const = 0; virtual ParasiticNode *node2(const ParasiticResistor *resistor) const = 0;
virtual ParasiticNode *otherNode(const ParasiticResistor *capacitor, virtual ParasiticNode *otherNode(const ParasiticResistor *resistor,
ParasiticNode *node) const; ParasiticNode *node) const;
// Iteration over resistors connected to a nodes. // Iteration over resistors connected to a nodes.
@ -287,7 +287,7 @@ protected:
const Net *findParasiticNet(const Pin *pin) const; const Net *findParasiticNet(const Pin *pin) const;
float coupling_cap_factor_; float coupling_cap_factor_ {1.0};
}; };
class ParasiticNodeLess class ParasiticNodeLess

View File

@ -24,14 +24,14 @@
#pragma once #pragma once
#include "Delay.hh"
#include "GraphClass.hh"
#include "MinMax.hh" #include "MinMax.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "Transition.hh"
#include "GraphClass.hh"
#include "Delay.hh"
#include "StaState.hh"
#include "SearchClass.hh" #include "SearchClass.hh"
#include "StaState.hh"
#include "Transition.hh"
namespace sta { namespace sta {

View File

@ -26,11 +26,11 @@
#include <string> #include <string>
#include "LibertyClass.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "LibertyClass.hh"
#include "Path.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "SearchClass.hh" #include "SearchClass.hh"
#include "Path.hh"
#include "StaState.hh" #include "StaState.hh"
namespace sta { namespace sta {

View File

@ -24,11 +24,11 @@
#pragma once #pragma once
#include "TimingArc.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "SearchClass.hh"
#include "Path.hh" #include "Path.hh"
#include "SearchClass.hh"
#include "StaState.hh" #include "StaState.hh"
#include "TimingArc.hh"
namespace sta { namespace sta {

View File

@ -24,17 +24,17 @@
#pragma once #pragma once
#include <map>
#include <mutex>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include <map>
#include <mutex>
#include "SdcClass.hh"
#include "StaState.hh"
#include "SearchClass.hh"
#include "StringUtil.hh"
#include "PathEnd.hh" #include "PathEnd.hh"
#include "SdcClass.hh"
#include "SearchClass.hh"
#include "StaState.hh"
#include "StringUtil.hh"
namespace sta { namespace sta {

View File

@ -59,9 +59,9 @@ protected:
const Pin *pin_; const Pin *pin_;
const ClockEdge *clk_edge_; const ClockEdge *clk_edge_;
bool source_latency_included_; bool source_latency_included_{false};
bool network_latency_included_; bool network_latency_included_{false};
const Pin *ref_pin_; const Pin *ref_pin_{nullptr};
RiseFallMinMax delays_; RiseFallMinMax delays_;
PinSet leaf_pins_; PinSet leaf_pins_;
}; };

View File

@ -25,10 +25,10 @@
#pragma once #pragma once
#include "MinMax.hh" #include "MinMax.hh"
#include "Transition.hh"
#include "RiseFallMinMax.hh"
#include "MinMaxValues.hh" #include "MinMaxValues.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "RiseFallMinMax.hh"
#include "Transition.hh"
namespace sta { namespace sta {
@ -38,7 +38,6 @@ using FanoutValues = MinMaxIntValues;
class PortExtCap class PortExtCap
{ {
public: public:
PortExtCap();
const Port *port() { return port_; } const Port *port() { return port_; }
void pinCap(const RiseFall *rf, void pinCap(const RiseFall *rf,
const MinMax *min_max, const MinMax *min_max,
@ -70,7 +69,7 @@ public:
const FanoutValues *fanout() const { return &fanout_; } const FanoutValues *fanout() const { return &fanout_; }
private: private:
const Port *port_; const Port *port_{nullptr};
RiseFallMinMax pin_cap_; RiseFallMinMax pin_cap_;
RiseFallMinMax wire_cap_; RiseFallMinMax wire_cap_;
FanoutValues fanout_; FanoutValues fanout_;

View File

@ -24,12 +24,13 @@
#pragma once #pragma once
#include <vector>
#include <utility> #include <utility>
#include <vector>
namespace sta { namespace sta {
class Power; class Power;
class Instance;
enum class PwrActivityOrigin enum class PwrActivityOrigin
{ {

View File

@ -24,16 +24,16 @@
#pragma once #pragma once
#include <functional>
#include <map> #include <map>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <functional>
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "NetworkClass.hh" #include "NetworkClass.hh"
#include "SearchClass.hh"
#include "SdcClass.hh"
#include "PowerClass.hh" #include "PowerClass.hh"
#include "SdcClass.hh"
#include "SearchClass.hh"
namespace sta { namespace sta {

View File

@ -24,15 +24,15 @@
#pragma once #pragma once
#include <stdio.h>
#include <cstdarg> #include <cstdarg>
#include <string>
#include <string_view>
#include <mutex> #include <mutex>
#include <set> #include <set>
#include <cstdio>
#include <string>
#include <string_view>
#include "Machine.hh" // __attribute__
#include "Format.hh" #include "Format.hh"
#include "Machine.hh" // __attribute__
struct Tcl_Interp; struct Tcl_Interp;

View File

@ -24,9 +24,9 @@
#pragma once #pragma once
#include "Delay.hh"
#include "MinMax.hh" #include "MinMax.hh"
#include "Transition.hh" #include "Transition.hh"
#include "Delay.hh"
namespace sta { namespace sta {

View File

@ -24,9 +24,9 @@
#pragma once #pragma once
#include <set>
#include <string> #include <string>
#include <vector> #include <vector>
#include <set>
#include "GraphClass.hh" #include "GraphClass.hh"
#include "SearchClass.hh" #include "SearchClass.hh"

View File

@ -24,25 +24,25 @@
#pragma once #pragma once
#include <vector>
#include <map> #include <map>
#include <unordered_map>
#include <mutex> #include <mutex>
#include <string_view> #include <string_view>
#include <unordered_map>
#include <vector>
#include "StringUtil.hh"
#include "MinMax.hh"
#include "StaState.hh"
#include "NetworkClass.hh"
#include "LibertyClass.hh"
#include "GraphClass.hh"
#include "SdcClass.hh"
#include "RiseFallValues.hh"
#include "Clock.hh" #include "Clock.hh"
#include "DataCheck.hh"
#include "CycleAccting.hh" #include "CycleAccting.hh"
#include "DataCheck.hh"
#include "ExceptionPath.hh" #include "ExceptionPath.hh"
#include "GraphClass.hh"
#include "LibertyClass.hh"
#include "MinMax.hh"
#include "NetworkClass.hh"
#include "PinPair.hh" #include "PinPair.hh"
#include "RiseFallValues.hh"
#include "SdcClass.hh"
#include "StaState.hh"
#include "StringUtil.hh"
namespace sta { namespace sta {
@ -54,7 +54,7 @@ class DisabledPorts;
class GraphLoop; class GraphLoop;
class DeratingFactors; class DeratingFactors;
class DeratingFactorsGlobal; class DeratingFactorsGlobal;
class DeratingFactorsNet; class DeratingFactors;
class DeratingFactorsCell; class DeratingFactorsCell;
class PatternMatch; class PatternMatch;
class FindNetCaps; class FindNetCaps;
@ -174,7 +174,7 @@ using InstancePvtMap = std::map<const Instance*, Pvt*>;
using PinMinPulseWidthMap = std::map<const Pin*, RiseFallValues*>; using PinMinPulseWidthMap = std::map<const Pin*, RiseFallValues*>;
using ClockMinPulseWidthMap = std::map<const Clock*, RiseFallValues*>; using ClockMinPulseWidthMap = std::map<const Clock*, RiseFallValues*>;
using InstMinPulseWidthMap = std::map<const Instance*, RiseFallValues*>; using InstMinPulseWidthMap = std::map<const Instance*, RiseFallValues*>;
using NetDeratingFactorsMap = std::map<const Net*, DeratingFactorsNet*>; using NetDeratingFactorsMap = std::map<const Net*, DeratingFactors*>;
using InstDeratingFactorsMap = std::map<const Instance*, DeratingFactorsCell*>; using InstDeratingFactorsMap = std::map<const Instance*, DeratingFactorsCell*>;
using CellDeratingFactorsMap = std::map<const LibertyCell*, DeratingFactorsCell*>; using CellDeratingFactorsMap = std::map<const LibertyCell*, DeratingFactorsCell*>;
using ClockGroupsSet = std::set<ClockGroups*>; using ClockGroupsSet = std::set<ClockGroups*>;
@ -279,7 +279,7 @@ public:
const LibertyCell *cell, const LibertyCell *cell,
const Port *port, const Port *port,
const LibertyPort *from_port, const LibertyPort *from_port,
float *from_slews, const DriveCellSlews &from_slews,
const LibertyPort *to_port, const LibertyPort *to_port,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const MinMaxAll *min_max); const MinMaxAll *min_max);

View File

@ -29,9 +29,10 @@
#include <vector> #include <vector>
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "MinMaxValues.hh" #include "MinMaxValues.hh"
#include "NetworkClass.hh"
#include "PinPair.hh" #include "PinPair.hh"
#include "Transition.hh"
namespace sta { namespace sta {
@ -126,11 +127,13 @@ using ExceptionStateSet = std::set<ExceptionState*, ExceptionStateLess>;
// Constraint applies to clock or data paths. // Constraint applies to clock or data paths.
enum class PathClkOrData { clk, data }; enum class PathClkOrData { clk, data };
const int path_clk_or_data_count = 2; const size_t path_clk_or_data_count = 2;
enum class TimingDerateType { cell_delay, cell_check, net_delay }; enum class TimingDerateType { cell_delay, cell_check, net_delay };
constexpr int timing_derate_type_count = 3; constexpr size_t timing_derate_type_count = 3;
enum class TimingDerateCellType { cell_delay, cell_check }; enum class TimingDerateCellType { cell_delay, cell_check };
constexpr int timing_derate_cell_type_count = 2; constexpr size_t timing_derate_cell_type_count = 2;
using DriveCellSlews = std::array<float, RiseFall::index_count>;
} // namespace sta } // namespace sta

View File

@ -217,15 +217,15 @@ public:
InstanceSeq findInstancesMatching(const Instance *context, InstanceSeq findInstancesMatching(const Instance *context,
const PatternMatch *pattern) const override; const PatternMatch *pattern) const override;
Net *findNet(std::string_view path_name) const override; Net *findNet(std::string_view path_name) const override;
Net *findNetRelative(const Instance *instance, Net *findNetRelative(const Instance *inst,
std::string_view net_name) const override; std::string_view path_name) const override;
Net *findNet(const Instance *instance, Net *findNet(const Instance *instance,
std::string_view net_name) const override; std::string_view net_name) const override;
NetSeq findNetsMatching(const Instance *parent, NetSeq findNetsMatching(const Instance *parent,
const PatternMatch *pattern) const override; const PatternMatch *pattern) const override;
void findInstNetsMatching(const Instance *instance, void findInstNetsMatching(const Instance *instance,
const PatternMatch *pattern, const PatternMatch *pattern,
NetSeq &nets) const override; NetSeq &matches) const override;
Instance *findChild(const Instance *parent, Instance *findChild(const Instance *parent,
std::string_view name) const override; std::string_view name) const override;
Pin *findPin(std::string_view path_name) const override; Pin *findPin(std::string_view path_name) const override;
@ -266,9 +266,9 @@ protected:
std::string &path_tail) const; std::string &path_tail) const;
bool visitMatches(const Instance *parent, bool visitMatches(const Instance *parent,
const PatternMatch *pattern, const PatternMatch *pattern,
std::function<bool (const Instance *instance, const std::function<bool (const Instance *instance,
const PatternMatch *tail)> const PatternMatch *tail)>
visit_tail) const; &visit_tail) const;
bool visitPinTail(const Instance *instance, bool visitPinTail(const Instance *instance,
const PatternMatch *tail, const PatternMatch *tail,
PinSeq &matches) const; PinSeq &matches) const;

View File

@ -24,23 +24,23 @@
#pragma once #pragma once
#include <mutex>
#include <atomic> #include <atomic>
#include <mutex>
#include <unordered_set> #include <unordered_set>
#include "MinMax.hh"
#include "Transition.hh"
#include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "GraphClass.hh"
#include "Delay.hh" #include "Delay.hh"
#include "GraphClass.hh"
#include "LibertyClass.hh"
#include "MinMax.hh"
#include "NetworkClass.hh"
#include "Path.hh"
#include "SdcClass.hh" #include "SdcClass.hh"
#include "StaState.hh"
#include "SearchClass.hh" #include "SearchClass.hh"
#include "SearchPred.hh" #include "SearchPred.hh"
#include "VertexVisitor.hh" #include "StaState.hh"
#include "Path.hh"
#include "StringUtil.hh" #include "StringUtil.hh"
#include "Transition.hh"
#include "VertexVisitor.hh"
namespace sta { namespace sta {
@ -696,7 +696,6 @@ protected:
// Class for visiting fanin/fanout paths of a vertex. // Class for visiting fanin/fanout paths of a vertex.
// This used by forward/backward search to find arrival/required path times. // This used by forward/backward search to find arrival/required path times.
// NOLINTNEXTLINE(misc-multiple-inheritance)
class PathVisitor : public VertexVisitor, class PathVisitor : public VertexVisitor,
public StaState public StaState
{ {

View File

@ -25,14 +25,14 @@
#pragma once #pragma once
#include <limits> #include <limits>
#include <vector>
#include <map> #include <map>
#include <vector>
#include "VectorMap.hh"
#include "MinMaxValues.hh"
#include "Delay.hh" #include "Delay.hh"
#include "NetworkClass.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "MinMaxValues.hh"
#include "NetworkClass.hh"
#include "VectorMap.hh"
namespace sta { namespace sta {

View File

@ -24,9 +24,9 @@
#pragma once #pragma once
#include "NetworkClass.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "StaState.hh" #include "StaState.hh"
namespace sta { namespace sta {

View File

@ -24,27 +24,27 @@
#pragma once #pragma once
#include <vector> #include <functional>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <functional> #include <vector>
#include "StringUtil.hh"
#include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "SdcClass.hh"
#include "Scene.hh"
#include "GraphClass.hh"
#include "ParasiticsClass.hh"
#include "StaState.hh"
#include "VertexVisitor.hh"
#include "SearchClass.hh"
#include "PowerClass.hh"
#include "ArcDelayCalc.hh" #include "ArcDelayCalc.hh"
#include "CircuitSim.hh" #include "CircuitSim.hh"
#include "Variables.hh" #include "GraphClass.hh"
#include "LibertyClass.hh"
#include "NetworkClass.hh"
#include "ParasiticsClass.hh"
#include "PowerClass.hh"
#include "Property.hh" #include "Property.hh"
#include "RiseFallMinMaxDelay.hh" #include "RiseFallMinMaxDelay.hh"
#include "Scene.hh"
#include "SdcClass.hh"
#include "SearchClass.hh"
#include "StaState.hh"
#include "StringUtil.hh"
#include "Variables.hh"
#include "VertexVisitor.hh"
struct Tcl_Interp; struct Tcl_Interp;
@ -267,7 +267,7 @@ public:
const LibertyCell *cell, const LibertyCell *cell,
const Port *port, const Port *port,
const LibertyPort *from_port, const LibertyPort *from_port,
float *from_slews, const DriveCellSlews &from_slews,
const LibertyPort *to_port, const LibertyPort *to_port,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const MinMaxAll *min_max, const MinMaxAll *min_max,

View File

@ -28,10 +28,10 @@
#include <cctype> #include <cctype>
#include <cstdarg> #include <cstdarg>
#include <cstring> #include <cstring>
#include <set>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include <set>
#include "Machine.hh" // __attribute__ #include "Machine.hh" // __attribute__

View File

@ -30,10 +30,10 @@
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include "MinMax.hh"
#include "Transition.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "MinMax.hh"
#include "TimingModel.hh" #include "TimingModel.hh"
#include "Transition.hh"
#include "Variables.hh" #include "Variables.hh"
namespace sta { namespace sta {

View File

@ -30,17 +30,17 @@
namespace sta { namespace sta {
#if TCL_MAJOR_VERSION < 9 #if TCL_MAJOR_VERSION < 9
typedef int Tcl_Size; using Tcl_Size = int ;
#endif #endif
StringSeq StringSeq
tclListStringSeq(Tcl_Obj *const source, tclListStringSeq(Tcl_Obj *source,
Tcl_Interp *interp); Tcl_Interp *interp);
StringSeq * StringSeq *
tclListStringSeqPtr(Tcl_Obj *const source, tclListStringSeqPtr(Tcl_Obj *source,
Tcl_Interp *interp); Tcl_Interp *interp);
StringSet * StringSet *
tclListStringSet(Tcl_Obj *const source, tclListStringSet(Tcl_Obj *source,
Tcl_Interp *interp); Tcl_Interp *interp);
void void

View File

@ -24,14 +24,14 @@
#pragma once #pragma once
#include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include <vector> #include <vector>
#include <map>
#include "Transition.hh"
#include "Delay.hh" #include "Delay.hh"
#include "LibertyClass.hh" #include "LibertyClass.hh"
#include "Transition.hh"
namespace sta { namespace sta {

View File

@ -34,7 +34,6 @@ enum class CrprMode { same_pin, same_transition };
class Variables class Variables
{ {
public: public:
Variables();
// TCL variable sta_crpr_enabled. // TCL variable sta_crpr_enabled.
bool crprEnabled() const { return crpr_enabled_; } bool crprEnabled() const { return crpr_enabled_; }
void setCrprEnabled(bool enabled); void setCrprEnabled(bool enabled);
@ -78,23 +77,23 @@ public:
PocvMode pocvMode() const { return pocv_mode_; } PocvMode pocvMode() const { return pocv_mode_; }
void setPocvMode(PocvMode mode); void setPocvMode(PocvMode mode);
float pocvQuantile() const { return pocv_quantile_; } float pocvQuantile() const { return pocv_quantile_; }
void setPocvQuantile(float quartile); void setPocvQuantile(float quantile);
private: private:
bool crpr_enabled_; bool crpr_enabled_{true};
CrprMode crpr_mode_; CrprMode crpr_mode_{CrprMode::same_pin};
bool propagate_gated_clock_enable_; bool propagate_gated_clock_enable_{true};
bool preset_clr_arcs_enabled_; bool preset_clr_arcs_enabled_{false};
bool cond_default_arcs_enabled_; bool cond_default_arcs_enabled_{true};
bool bidirect_inst_paths_enabled_; bool bidirect_inst_paths_enabled_{false};
bool recovery_removal_checks_enabled_; bool recovery_removal_checks_enabled_{true};
bool gated_clk_checks_enabled_; bool gated_clk_checks_enabled_{true};
bool clk_thru_tristate_enabled_; bool clk_thru_tristate_enabled_{false};
bool dynamic_loop_breaking_; bool dynamic_loop_breaking_{false};
bool propagate_all_clks_; bool propagate_all_clks_{false};
bool use_default_arrival_clock_; bool use_default_arrival_clock_{false};
PocvMode pocv_mode_; PocvMode pocv_mode_{PocvMode::scalar};
float pocv_quantile_; float pocv_quantile_{3.0};
}; };
} // namespace sta } // namespace sta

View File

@ -24,12 +24,12 @@
#pragma once #pragma once
#include <vector>
#include <algorithm> #include <algorithm>
#include <utility>
#include <iterator> #include <iterator>
#include <stdexcept> #include <stdexcept>
#include <type_traits> #include <type_traits>
#include <utility>
#include <vector>
namespace sta { namespace sta {

View File

@ -39,12 +39,12 @@ std::string
portVerilogName(std::string_view sta_name); portVerilogName(std::string_view sta_name);
std::string std::string
moduleVerilogToSta(std::string_view sta_name); moduleVerilogToSta(std::string_view module_name);
std::string std::string
instanceVerilogToSta(std::string_view sta_name); instanceVerilogToSta(std::string_view inst_name);
std::string std::string
netVerilogToSta(std::string_view sta_name); netVerilogToSta(std::string_view net_name);
std::string std::string
portVerilogToSta(std::string_view sta_name); portVerilogToSta(std::string_view port_name);
} // namespace sta } // namespace sta

View File

@ -24,15 +24,15 @@
#pragma once #pragma once
#include <map>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include <vector> #include <vector>
#include <map>
#include "Format.hh" #include "Format.hh"
#include "NetworkClass.hh"
#include "Report.hh" #include "Report.hh"
#include "StringUtil.hh" #include "StringUtil.hh"
#include "NetworkClass.hh"
namespace sta { namespace sta {
@ -104,12 +104,12 @@ public:
~VerilogReader(); ~VerilogReader();
bool read(std::string_view filename); bool read(std::string_view filename);
void makeModule(std::string_view module_name, void makeModule(std::string_view module_vname,
VerilogNetSeq *ports, VerilogNetSeq *ports,
VerilogStmtSeq *stmts, VerilogStmtSeq *stmts,
VerilogAttrStmtSeq *attr_stmts, VerilogAttrStmtSeq *attr_stmts,
int line); int line);
void makeModule(std::string_view module_name, void makeModule(std::string_view module_vname,
VerilogStmtSeq *port_dcls, VerilogStmtSeq *port_dcls,
VerilogStmtSeq *stmts, VerilogStmtSeq *stmts,
VerilogAttrStmtSeq *attr_stmts, VerilogAttrStmtSeq *attr_stmts,
@ -122,8 +122,8 @@ public:
VerilogDclArg *arg, VerilogDclArg *arg,
VerilogAttrStmtSeq *attr_stmts, VerilogAttrStmtSeq *attr_stmts,
int line); int line);
VerilogDclArg *makeDclArg(std::string_view net_name); VerilogDclArg *makeDclArg(std::string_view net_vname);
VerilogDclArg*makeDclArg(VerilogAssign *assign); VerilogDclArg *makeDclArg(VerilogAssign *assign);
VerilogDclBus *makeDclBus(PortDirection *dir, VerilogDclBus *makeDclBus(PortDirection *dir,
int from_index, int from_index,
int to_index, int to_index,
@ -136,8 +136,8 @@ public:
VerilogDclArgSeq *args, VerilogDclArgSeq *args,
VerilogAttrStmtSeq *attr_stmts, VerilogAttrStmtSeq *attr_stmts,
int line); int line);
VerilogInst *makeModuleInst(std::string_view module_name, VerilogInst *makeModuleInst(std::string_view module_vname,
std::string_view inst_name, std::string_view inst_vname,
VerilogNetSeq *pins, VerilogNetSeq *pins,
VerilogAttrStmtSeq *attr_stmts, VerilogAttrStmtSeq *attr_stmts,
int line); int line);
@ -146,17 +146,17 @@ public:
int line); int line);
VerilogNetScalar *makeNetScalar(std::string_view name); VerilogNetScalar *makeNetScalar(std::string_view name);
VerilogNetPortRef *makeNetNamedPortRefScalarNet(std::string_view port_vname); VerilogNetPortRef *makeNetNamedPortRefScalarNet(std::string_view port_vname);
VerilogNetPortRef *makeNetNamedPortRefScalarNet(std::string_view port_name, VerilogNetPortRef *makeNetNamedPortRefScalarNet(std::string_view port_vname,
std::string_view net_name); std::string_view net_vname);
VerilogNetPortRef *makeNetNamedPortRefBitSelect(std::string_view port_name, VerilogNetPortRef *makeNetNamedPortRefBitSelect(std::string_view port_vname,
std::string_view bus_name, std::string_view bus_vname,
int index); int index);
VerilogNetPortRef *makeNetNamedPortRefScalar(std::string_view port_name, VerilogNetPortRef *makeNetNamedPortRefScalar(std::string_view port_vname,
VerilogNet *net); VerilogNet *net);
VerilogNetPortRef *makeNetNamedPortRefBit(std::string_view port_name, VerilogNetPortRef *makeNetNamedPortRefBit(std::string_view port_vname,
int index, int index,
VerilogNet *net); VerilogNet *net);
VerilogNetPortRef *makeNetNamedPortRefPart(std::string_view port_name, VerilogNetPortRef *makeNetNamedPortRefPart(std::string_view port_vname,
int from_index, int from_index,
int to_index, int to_index,
VerilogNet *net); VerilogNet *net);
@ -306,8 +306,8 @@ protected:
Debug *debug_; Debug *debug_;
NetworkReader *network_; NetworkReader *network_;
Library *library_; Library *library_{nullptr};
int black_box_index_; int black_box_index_{0};
VerilogModuleMap module_map_; VerilogModuleMap module_map_;
VerilogErrorSeq link_errors_; VerilogErrorSeq link_errors_;
const std::string zero_net_name_; const std::string zero_net_name_;

View File

@ -24,8 +24,8 @@
#pragma once #pragma once
#include "NetworkClass.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "NetworkClass.hh"
namespace sta { namespace sta {

View File

@ -24,8 +24,8 @@
#pragma once #pragma once
#include "SdcClass.hh"
#include "GraphClass.hh" #include "GraphClass.hh"
#include "SdcClass.hh"
#include "SearchClass.hh" #include "SearchClass.hh"
#include "StaState.hh" #include "StaState.hh"

View File

@ -28,11 +28,11 @@
#include <cstdlib> #include <cstdlib>
#include <limits> #include <limits>
#include "ConcreteNetwork.hh"
#include "ContainerHelpers.hh" #include "ContainerHelpers.hh"
#include "ParseBus.hh"
#include "PatternMatch.hh" #include "PatternMatch.hh"
#include "PortDirection.hh" #include "PortDirection.hh"
#include "ParseBus.hh"
#include "ConcreteNetwork.hh"
namespace sta { namespace sta {
@ -44,9 +44,7 @@ ConcreteLibrary::ConcreteLibrary(std::string_view name,
name_(name), name_(name),
id_(ConcreteNetwork::nextObjectId()), id_(ConcreteNetwork::nextObjectId()),
filename_(filename), filename_(filename),
is_liberty_(is_liberty), is_liberty_(is_liberty)
bus_brkt_left_('['),
bus_brkt_right_(']')
{ {
} }
@ -125,9 +123,6 @@ ConcreteCell::ConcreteCell(std::string_view name,
id_(ConcreteNetwork::nextObjectId()), id_(ConcreteNetwork::nextObjectId()),
filename_(filename), filename_(filename),
library_(library), library_(library),
liberty_cell_(nullptr),
ext_cell_(nullptr),
port_bit_count_(0),
is_leaf_(is_leaf) is_leaf_(is_leaf)
{ {
} }
@ -234,7 +229,7 @@ ConcreteCell::makeBusPortBit(ConcretePort *bus_port,
} }
ConcretePort * ConcretePort *
ConcreteCell::makePort(std::string bit_name, ConcreteCell::makePort(std::string_view bit_name,
int bit_index) int bit_index)
{ {
ConcretePort *port = new ConcretePort(bit_name, false, ConcretePort *port = new ConcretePort(bit_name, false,
@ -353,7 +348,7 @@ BusPort::addBusBit(ConcretePort *port,
void void
ConcreteCell::groupBusPorts(char bus_brkt_left, ConcreteCell::groupBusPorts(char bus_brkt_left,
char bus_brkt_right, char bus_brkt_right,
std::function<bool(std::string_view)> port_msb_first) const std::function<bool(std::string_view)> &port_msb_first)
{ {
const char bus_brkts_left[2]{bus_brkt_left, '\0'}; const char bus_brkts_left[2]{bus_brkt_left, '\0'};
const char bus_brkts_right[2]{bus_brkt_right, '\0'}; const char bus_brkts_right[2]{bus_brkt_right, '\0'};
@ -415,15 +410,11 @@ ConcretePort::ConcretePort(std::string_view name,
id_(ConcreteNetwork::nextObjectId()), id_(ConcreteNetwork::nextObjectId()),
cell_(cell), cell_(cell),
direction_(PortDirection::unknown()), direction_(PortDirection::unknown()),
liberty_port_(nullptr),
ext_port_(nullptr),
pin_index_(-1),
is_bundle_(is_bundle), is_bundle_(is_bundle),
is_bus_(is_bus), is_bus_(is_bus),
from_index_(from_index), from_index_(from_index),
to_index_(to_index), to_index_(to_index),
member_ports_(member_ports), member_ports_(member_ports)
bundle_port_(nullptr)
{ {
} }
@ -575,9 +566,7 @@ ConcretePort::memberIterator() const
ConcreteCellPortBitIterator::ConcreteCellPortBitIterator(const ConcreteCell* cell) : ConcreteCellPortBitIterator::ConcreteCellPortBitIterator(const ConcreteCell* cell) :
ports_(cell->ports_), ports_(cell->ports_),
port_iter_(ports_.begin()), port_iter_(ports_.begin())
member_iter_(nullptr),
next_(nullptr)
{ {
findNext(); findNext();
} }

View File

@ -24,15 +24,16 @@
#include "ConcreteNetwork.hh" #include "ConcreteNetwork.hh"
#include <algorithm>
#include <map> #include <map>
#include <string_view> #include <string_view>
#include "PatternMatch.hh"
#include "Report.hh"
#include "Liberty.hh"
#include "PortDirection.hh"
#include "ConcreteLibrary.hh" #include "ConcreteLibrary.hh"
#include "Liberty.hh"
#include "Network.hh" #include "Network.hh"
#include "PatternMatch.hh"
#include "PortDirection.hh"
#include "Report.hh"
namespace sta { namespace sta {
@ -105,13 +106,12 @@ private:
ConcreteInstanceNetMap *nets_; ConcreteInstanceNetMap *nets_;
ConcreteInstanceNetMap::iterator iter_; ConcreteInstanceNetMap::iterator iter_;
ConcreteNet *next_; ConcreteNet *next_{nullptr};
}; };
ConcreteInstanceNetIterator:: ConcreteInstanceNetIterator::
ConcreteInstanceNetIterator(ConcreteInstanceNetMap *nets): ConcreteInstanceNetIterator(ConcreteInstanceNetMap *nets):
nets_(nets), nets_(nets)
next_(nullptr)
{ {
if (nets) { if (nets) {
iter_ = nets->begin(); iter_ = nets->begin();
@ -161,7 +161,7 @@ private:
const ConcretePinSeq &pins_; const ConcretePinSeq &pins_;
int pin_count_; int pin_count_;
int pin_index_; int pin_index_{0};
ConcretePin *next_; ConcretePin *next_;
}; };
@ -169,8 +169,7 @@ ConcreteInstancePinIterator::
ConcreteInstancePinIterator(const ConcreteInstance *inst, ConcreteInstancePinIterator(const ConcreteInstance *inst,
int pin_count) : int pin_count) :
pins_(inst->pins_), pins_(inst->pins_),
pin_count_(pin_count), pin_count_(pin_count)
pin_index_(0)
{ {
findNext(); findNext();
} }
@ -271,24 +270,31 @@ ObjectId ConcreteNetwork::object_id_ = 0;
ConcreteNetwork::ConcreteNetwork() : ConcreteNetwork::ConcreteNetwork() :
NetworkReader(), NetworkReader(),
top_instance_(nullptr),
constant_nets_{NetSet(this), NetSet(this)},
link_func_(nullptr) link_func_(nullptr)
{ {
} }
ConcreteNetwork::~ConcreteNetwork() ConcreteNetwork::~ConcreteNetwork()
{ {
clear(); // Cannot call virtual functions in destructor.
clearImpl();
}
void
ConcreteNetwork::clearImpl()
{
if (top_instance_)
deleteInstanceImpl(top_instance_);
top_instance_ = nullptr;
deleteCellNetworkViewsImpl();
deleteContents(library_seq_);
library_map_.clear();
} }
void void
ConcreteNetwork::clear() ConcreteNetwork::clear()
{ {
deleteTopInstance(); clearImpl();
deleteCellNetworkViews();
deleteContents(library_seq_);
library_map_.clear();
Network::clear(); Network::clear();
} }
@ -303,6 +309,12 @@ ConcreteNetwork::deleteTopInstance()
void void
ConcreteNetwork::deleteCellNetworkViews() ConcreteNetwork::deleteCellNetworkViews()
{
deleteCellNetworkViewsImpl();
}
void
ConcreteNetwork::deleteCellNetworkViewsImpl()
{ {
for (auto [cell, view] : cell_network_view_map_) { for (auto [cell, view] : cell_network_view_map_) {
if (view) if (view)
@ -361,7 +373,6 @@ class ConcreteLibertyLibraryIterator : public Iterator<LibertyLibrary*>
{ {
public: public:
ConcreteLibertyLibraryIterator(const ConcreteNetwork *network); ConcreteLibertyLibraryIterator(const ConcreteNetwork *network);
virtual ~ConcreteLibertyLibraryIterator();
bool hasNext() override; bool hasNext() override;
LibertyLibrary *next() override; LibertyLibrary *next() override;
@ -370,22 +381,17 @@ private:
const ConcreteLibrarySeq &libs_; const ConcreteLibrarySeq &libs_;
ConcreteLibrarySeq::const_iterator iter_; ConcreteLibrarySeq::const_iterator iter_;
LibertyLibrary *next_; LibertyLibrary *next_{nullptr};
}; };
ConcreteLibertyLibraryIterator:: ConcreteLibertyLibraryIterator::
ConcreteLibertyLibraryIterator(const ConcreteNetwork *network): ConcreteLibertyLibraryIterator(const ConcreteNetwork *network):
libs_(network->library_seq_), libs_(network->library_seq_),
iter_(libs_.begin()), iter_(libs_.begin())
next_(nullptr)
{ {
findNext(); findNext();
} }
ConcreteLibertyLibraryIterator::~ConcreteLibertyLibraryIterator()
{
}
bool bool
ConcreteLibertyLibraryIterator::hasNext() ConcreteLibertyLibraryIterator::hasNext()
{ {
@ -462,7 +468,7 @@ ConcreteNetwork::deleteLibrary(Library *library)
{ {
ConcreteLibrary *clib = reinterpret_cast<ConcreteLibrary*>(library); ConcreteLibrary *clib = reinterpret_cast<ConcreteLibrary*>(library);
library_map_.erase(clib->name()); library_map_.erase(clib->name());
library_seq_.erase(std::find(library_seq_.begin(), library_seq_.end(), clib)); library_seq_.erase(std::ranges::find(library_seq_, clib));
delete clib; delete clib;
} }
@ -721,7 +727,7 @@ class ConcreteCellPortIterator1 : public CellPortIterator
{ {
public: public:
ConcreteCellPortIterator1(const ConcreteCell *cell); ConcreteCellPortIterator1(const ConcreteCell *cell);
~ConcreteCellPortIterator1(); ~ConcreteCellPortIterator1() override;
bool hasNext() override { return iter_->hasNext(); } bool hasNext() override { return iter_->hasNext(); }
Port *next() override; Port *next() override;
@ -758,7 +764,7 @@ class ConcreteCellPortBitIterator1 : public CellPortIterator
{ {
public: public:
ConcreteCellPortBitIterator1(const ConcreteCell *cell); ConcreteCellPortBitIterator1(const ConcreteCell *cell);
~ConcreteCellPortBitIterator1(); ~ConcreteCellPortBitIterator1() override;
bool hasNext() override { return iter_->hasNext(); } bool hasNext() override { return iter_->hasNext(); }
Port *next() override; Port *next() override;
@ -905,19 +911,18 @@ class ConcretePortMemberIterator1 : public PortMemberIterator
{ {
public: public:
ConcretePortMemberIterator1(const ConcretePort *port); ConcretePortMemberIterator1(const ConcretePort *port);
~ConcretePortMemberIterator1(); ~ConcretePortMemberIterator1() override;
bool hasNext() override; bool hasNext() override;
Port *next() override; Port *next() override;
private: private:
ConcretePortMemberIterator *iter_; ConcretePortMemberIterator *iter_;
ConcretePort *next_; ConcretePort *next_{nullptr};
}; };
ConcretePortMemberIterator1::ConcretePortMemberIterator1(const ConcretePort * ConcretePortMemberIterator1::ConcretePortMemberIterator1(const ConcretePort *
port) : port) :
iter_(port->memberIterator()), iter_(port->memberIterator())
next_(nullptr)
{ {
} }
@ -1051,7 +1056,7 @@ ConcreteNetwork::findInstNetsMatching(const Instance *instance,
{ {
const ConcreteInstance *inst = const ConcreteInstance *inst =
reinterpret_cast<const ConcreteInstance*>(instance); reinterpret_cast<const ConcreteInstance*>(instance);
return inst->findNetsMatching(pattern, matches); inst->findNetsMatching(pattern, matches);
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -1191,13 +1196,13 @@ ConcreteNetwork::instance(const Net *net) const
bool bool
ConcreteNetwork::isPower(const Net *net) const ConcreteNetwork::isPower(const Net *net) const
{ {
return constant_nets_[int(LogicValue::one)].contains(const_cast<Net*>(net)); return constant_nets_[static_cast<int>(LogicValue::one)].contains(const_cast<Net*>(net));
} }
bool bool
ConcreteNetwork::isGround(const Net *net) const ConcreteNetwork::isGround(const Net *net) const
{ {
return constant_nets_[int(LogicValue::zero)].contains(const_cast<Net*>(net)); return constant_nets_[static_cast<int>(LogicValue::zero)].contains(const_cast<Net*>(net));
} }
NetPinIterator * NetPinIterator *
@ -1308,6 +1313,12 @@ ConcreteNetwork::replaceCell(Instance *inst,
void void
ConcreteNetwork::deleteInstance(Instance *inst) ConcreteNetwork::deleteInstance(Instance *inst)
{
deleteInstanceImpl(inst);
}
void
ConcreteNetwork::deleteInstanceImpl(Instance *inst)
{ {
ConcreteInstance *cinst = reinterpret_cast<ConcreteInstance*>(inst); ConcreteInstance *cinst = reinterpret_cast<ConcreteInstance*>(inst);
ConcreteInstanceNetMap *nets = cinst->nets_; ConcreteInstanceNetMap *nets = cinst->nets_;
@ -1504,8 +1515,7 @@ ConcreteNetwork::deletePin(Pin *pin)
ConcreteNet *cnet = cpin->net(); ConcreteNet *cnet = cpin->net();
if (cnet) if (cnet)
disconnectNetPin(cnet, cpin); disconnectNetPin(cnet, cpin);
ConcreteInstance *cinst = ConcreteInstance *cinst = cpin->instance();
reinterpret_cast<ConcreteInstance*>(cpin->instance());
if (cinst) if (cinst)
cinst->deletePin(cpin); cinst->deletePin(cpin);
delete cpin; delete cpin;
@ -1533,16 +1543,15 @@ ConcreteNetwork::deleteNet(Net *net)
pin->net_ = nullptr; pin->net_ = nullptr;
} }
constant_nets_[int(LogicValue::zero)].erase(net); constant_nets_[static_cast<int>(LogicValue::zero)].erase(net);
constant_nets_[int(LogicValue::one)].erase(net); constant_nets_[static_cast<int>(LogicValue::one)].erase(net);
PinSet *drvrs = findKey(net_drvr_pin_map_, net); PinSet *drvrs = findKey(net_drvr_pin_map_, net);
if (drvrs) { if (drvrs) {
delete drvrs; delete drvrs;
net_drvr_pin_map_.erase(net); net_drvr_pin_map_.erase(net);
} }
ConcreteInstance *cinst = ConcreteInstance *cinst = cnet->instance();
reinterpret_cast<ConcreteInstance*>(cnet->instance());
cinst->deleteNet(cnet); cinst->deleteNet(cnet);
delete cnet; delete cnet;
} }
@ -1550,8 +1559,8 @@ ConcreteNetwork::deleteNet(Net *net)
void void
ConcreteNetwork::clearConstantNets() ConcreteNetwork::clearConstantNets()
{ {
constant_nets_[int(LogicValue::zero)].clear(); constant_nets_[static_cast<int>(LogicValue::zero)].clear();
constant_nets_[int(LogicValue::one)].clear(); constant_nets_[static_cast<int>(LogicValue::one)].clear();
} }
void void
@ -1560,15 +1569,15 @@ ConcreteNetwork::addConstantNet(Net *net,
{ {
if (value == LogicValue::zero if (value == LogicValue::zero
|| value == LogicValue::one) || value == LogicValue::one)
constant_nets_[int(value)].insert(net); constant_nets_[static_cast<int>(value)].insert(net);
} }
ConstantPinIterator * ConstantPinIterator *
ConcreteNetwork::constantPinIterator() ConcreteNetwork::constantPinIterator()
{ {
return new NetworkConstantPinIterator(this, return new NetworkConstantPinIterator(this,
constant_nets_[int(LogicValue::zero)], constant_nets_[static_cast<int>(LogicValue::zero)],
constant_nets_[int(LogicValue::one)]); constant_nets_[static_cast<int>(LogicValue::one)]);
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -1617,9 +1626,7 @@ ConcreteInstance::ConcreteInstance(std::string_view name,
name_(name), name_(name),
id_(ConcreteNetwork::nextObjectId()), id_(ConcreteNetwork::nextObjectId()),
cell_(cell), cell_(cell),
parent_(parent), parent_(parent)
children_(nullptr),
nets_(nullptr)
{ {
initPins(); initPins();
} }
@ -1738,13 +1745,13 @@ ConcreteInstance::addChild(ConcreteInstance *child)
{ {
if (children_ == nullptr) if (children_ == nullptr)
children_ = new ConcreteInstanceChildMap; children_ = new ConcreteInstanceChildMap;
(*children_)[child->name().data()] = child; (*children_)[child->name()] = child;
} }
void void
ConcreteInstance::deleteChild(ConcreteInstance *child) ConcreteInstance::deleteChild(ConcreteInstance *child)
{ {
children_->erase(child->name().data()); children_->erase(child->name());
} }
void void
@ -1769,7 +1776,7 @@ ConcreteInstance::addNet(ConcreteNet *net)
{ {
if (nets_ == nullptr) if (nets_ == nullptr)
nets_ = new ConcreteInstanceNetMap; nets_ = new ConcreteInstanceNetMap;
(*nets_)[net->name().data()] = net; (*nets_)[net->name()] = net;
} }
void void
@ -1778,13 +1785,13 @@ ConcreteInstance::addNet(std::string_view,
{ {
if (nets_ == nullptr) if (nets_ == nullptr)
nets_ = new ConcreteInstanceNetMap; nets_ = new ConcreteInstanceNetMap;
(*nets_)[net->name().data()] = net; (*nets_)[net->name()] = net;
} }
void void
ConcreteInstance::deleteNet(ConcreteNet *net) ConcreteInstance::deleteNet(ConcreteNet *net)
{ {
nets_->erase(net->name().data()); nets_->erase(net->name());
} }
void void
@ -1801,15 +1808,11 @@ ConcretePin::ConcretePin(ConcreteInstance *instance,
instance_(instance), instance_(instance),
port_(port), port_(port),
net_(net), net_(net),
term_(nullptr), id_(ConcreteNetwork::nextObjectId())
id_(ConcreteNetwork::nextObjectId()),
net_next_(nullptr),
net_prev_(nullptr),
vertex_id_(vertex_id_null)
{ {
} }
std::string_view const std::string&
ConcretePin::name() const ConcretePin::name() const
{ {
return port_->name(); return port_->name();
@ -1823,12 +1826,11 @@ ConcretePin::setVertexId(VertexId id)
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
std::string_view const std::string &
ConcreteTerm::name() const ConcreteTerm::name() const
{ {
ConcretePin *cpin = reinterpret_cast<ConcretePin*>(pin_); ConcretePin *cpin = reinterpret_cast<ConcretePin*>(pin_);
const ConcretePort *cport = const ConcretePort *cport = cpin->port();
reinterpret_cast<const ConcretePort*>(cpin->port());
return cport->name(); return cport->name();
} }
@ -1836,8 +1838,7 @@ ConcreteTerm::ConcreteTerm(ConcretePin *pin,
ConcreteNet *net) : ConcreteNet *net) :
pin_(pin), pin_(pin),
net_(net), net_(net),
id_(ConcreteNetwork::nextObjectId()), id_(ConcreteNetwork::nextObjectId())
net_next_(nullptr)
{ {
} }
@ -1847,10 +1848,7 @@ ConcreteNet::ConcreteNet(std::string_view name,
ConcreteInstance *instance) : ConcreteInstance *instance) :
name_(name), name_(name),
id_(ConcreteNetwork::nextObjectId()), id_(ConcreteNetwork::nextObjectId()),
instance_(instance), instance_(instance)
pins_(nullptr),
terms_(nullptr),
merged_into_(nullptr)
{ {
} }

Some files were not shown because too many files have changed in this diff Show More