specialize DeratingFactors enums for insts

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2022-01-13 16:29:38 -07:00
parent 49398a97c8
commit db7b807c6a
10 changed files with 76 additions and 53 deletions

View File

@ -68,6 +68,12 @@ public:
const EarlyLate *early_late, const EarlyLate *early_late,
float &factor, float &factor,
bool &exists) const; bool &exists) const;
void factor(TimingDerateCellType type,
PathClkOrData clk_data,
const RiseFall *rf,
const EarlyLate *early_late,
float &factor,
bool &exists) const;
DeratingFactors *factors(TimingDerateType type); DeratingFactors *factors(TimingDerateType type);
void clear(); void clear();
@ -81,26 +87,24 @@ class DeratingFactorsCell
{ {
public: public:
DeratingFactorsCell(); DeratingFactorsCell();
void setFactor(TimingDerateType type, void setFactor(TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float factor); float factor);
void factor(TimingDerateType type, void factor(TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFall *rf, const RiseFall *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float &factor, float &factor,
bool &exists) const; bool &exists) const;
DeratingFactors *factors(TimingDerateType type); DeratingFactors *factors(TimingDerateCellType type);
void clear(); void clear();
void isOneValue(const EarlyLate *early_late, void isOneValue(const EarlyLate *early_late,
bool &is_one_value, bool &is_one_value,
float &value) const; float &value) const;
private: private:
DISALLOW_COPY_AND_ASSIGN(DeratingFactorsCell);
DeratingFactors factors_[timing_derate_cell_type_count]; DeratingFactors factors_[timing_derate_cell_type_count];
}; };

View File

@ -205,19 +205,19 @@ public:
const EarlyLate *early_late, const EarlyLate *early_late,
float derate); float derate);
void setTimingDerate(const Instance *inst, void setTimingDerate(const Instance *inst,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float derate); float derate);
void setTimingDerate(const LibertyCell *cell, void setTimingDerate(const LibertyCell *cell,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float derate); float derate);
float timingDerateInstance(const Pin *pin, float timingDerateInstance(const Pin *pin,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFall *rf, const RiseFall *rf,
const EarlyLate *early_late) const; const EarlyLate *early_late) const;

View File

@ -97,7 +97,8 @@ enum class PathClkOrData { clk, data };
const int path_clk_or_data_count = 2; const int path_clk_or_data_count = 2;
enum class TimingDerateType { cell_delay, cell_check, net_delay }; enum class TimingDerateType { cell_delay, cell_check, net_delay };
const int timing_derate_type_count = int(TimingDerateType::net_delay) + 1 ; constexpr int timing_derate_type_count = 3;
const int timing_derate_cell_type_count = 2; enum class TimingDerateCellType { cell_delay, cell_check };
constexpr int timing_derate_cell_type_count = 2;
} // namespace } // namespace

View File

@ -140,13 +140,13 @@ public:
const EarlyLate *early_late, const EarlyLate *early_late,
float derate); float derate);
void setTimingDerate(const Instance *inst, void setTimingDerate(const Instance *inst,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float derate); float derate);
void setTimingDerate(const LibertyCell *cell, void setTimingDerate(const LibertyCell *cell,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,

View File

@ -19,7 +19,13 @@
namespace sta { namespace sta {
inline int inline int
TimingDerateIndex(TimingDerateType type) index(TimingDerateType type)
{
return int(type);
}
inline int
index(TimingDerateCellType type)
{ {
return int(type); return int(type);
} }
@ -101,7 +107,7 @@ DeratingFactorsGlobal::setFactor(TimingDerateType type,
const EarlyLate *early_late, const EarlyLate *early_late,
float factor) float factor)
{ {
factors_[TimingDerateIndex(type)].setFactor(clk_data, rf, early_late, factor); factors_[index(type)].setFactor(clk_data, rf, early_late, factor);
} }
void void
@ -112,7 +118,18 @@ DeratingFactorsGlobal::factor(TimingDerateType type,
float &factor, float &factor,
bool &exists) const bool &exists) const
{ {
factors_[TimingDerateIndex(type)].factor(clk_data, rf, early_late, factor, exists); factors_[index(type)].factor(clk_data, rf, early_late, factor, exists);
}
void
DeratingFactorsGlobal::factor(TimingDerateCellType type,
PathClkOrData clk_data,
const RiseFall *rf,
const EarlyLate *early_late,
float &factor,
bool &exists) const
{
factors_[index(type)].factor(clk_data, rf, early_late, factor, exists);
} }
void void
@ -125,7 +142,7 @@ DeratingFactorsGlobal::clear()
DeratingFactors * DeratingFactors *
DeratingFactorsGlobal::factors(TimingDerateType type) DeratingFactorsGlobal::factors(TimingDerateType type)
{ {
return &factors_[TimingDerateIndex(type)]; return &factors_[index(type)];
} }
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -136,24 +153,24 @@ DeratingFactorsCell::DeratingFactorsCell()
} }
void void
DeratingFactorsCell::setFactor(TimingDerateType type, DeratingFactorsCell::setFactor(TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float factor) float factor)
{ {
factors_[TimingDerateIndex(type)].setFactor(clk_data, rf, early_late, factor); factors_[index(type)].setFactor(clk_data, rf, early_late, factor);
} }
void void
DeratingFactorsCell::factor(TimingDerateType type, DeratingFactorsCell::factor(TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFall *rf, const RiseFall *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
float &factor, float &factor,
bool &exists) const bool &exists) const
{ {
factors_[TimingDerateIndex(type)].factor(clk_data, rf, early_late, factor, exists); factors_[index(type)].factor(clk_data, rf, early_late, factor, exists);
} }
void void
@ -164,9 +181,9 @@ DeratingFactorsCell::clear()
} }
DeratingFactors * DeratingFactors *
DeratingFactorsCell::factors(TimingDerateType type) DeratingFactorsCell::factors(TimingDerateCellType type)
{ {
return &factors_[TimingDerateIndex(type)]; return &factors_[index(type)];
} }
void void
@ -176,9 +193,9 @@ DeratingFactorsCell::isOneValue(const EarlyLate *early_late,
{ {
bool is_one_value1, is_one_value2; bool is_one_value1, is_one_value2;
float value1, value2; float value1, value2;
factors_[TimingDerateIndex(TimingDerateType::cell_delay)] factors_[index(TimingDerateType::cell_delay)]
.isOneValue(early_late, is_one_value1, value1); .isOneValue(early_late, is_one_value1, value1);
factors_[TimingDerateIndex(TimingDerateType::cell_check)] factors_[index(TimingDerateType::cell_check)]
.isOneValue(early_late, is_one_value2, value2); .isOneValue(early_late, is_one_value2, value2);
is_one_value = is_one_value1 is_one_value = is_one_value1
&& is_one_value2 && is_one_value2

View File

@ -579,7 +579,7 @@ Sdc::setTimingDerate(const Net *net,
void void
Sdc::setTimingDerate(const Instance *inst, Sdc::setTimingDerate(const Instance *inst,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
@ -597,7 +597,7 @@ Sdc::setTimingDerate(const Instance *inst,
void void
Sdc::setTimingDerate(const LibertyCell *cell, Sdc::setTimingDerate(const LibertyCell *cell,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
@ -615,7 +615,7 @@ Sdc::setTimingDerate(const LibertyCell *cell,
float float
Sdc::timingDerateInstance(const Pin *pin, Sdc::timingDerateInstance(const Pin *pin,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFall *rf, const RiseFall *rf,
const EarlyLate *early_late) const const EarlyLate *early_late) const
@ -694,31 +694,19 @@ void
Sdc::deleteDeratingFactors() Sdc::deleteDeratingFactors()
{ {
if (net_derating_factors_) { if (net_derating_factors_) {
NetDeratingFactorsMap::Iterator net_iter(net_derating_factors_); net_derating_factors_->deleteContents();
while (net_iter.hasNext()) {
DeratingFactorsNet *factors = net_iter.next();
delete factors;
}
delete net_derating_factors_; delete net_derating_factors_;
net_derating_factors_ = nullptr; net_derating_factors_ = nullptr;
} }
if (inst_derating_factors_) { if (inst_derating_factors_) {
InstDeratingFactorsMap::Iterator inst_iter(inst_derating_factors_); inst_derating_factors_->deleteContents();
while (inst_iter.hasNext()) {
DeratingFactorsCell *factors = inst_iter.next();
delete factors;
}
delete inst_derating_factors_; delete inst_derating_factors_;
inst_derating_factors_ = nullptr; inst_derating_factors_ = nullptr;
} }
if (cell_derating_factors_) { if (cell_derating_factors_) {
CellDeratingFactorsMap::Iterator cell_iter(cell_derating_factors_); cell_derating_factors_->deleteContents();
while (cell_iter.hasNext()) {
DeratingFactorsCell *factors = cell_iter.next();
delete factors;
}
delete cell_derating_factors_; delete cell_derating_factors_;
cell_derating_factors_ = nullptr; cell_derating_factors_ = nullptr;
} }

View File

@ -2049,9 +2049,9 @@ WriteSdc::writeDerating(DeratingFactorsCell *factors,
WriteSdcObject *write_obj) const WriteSdcObject *write_obj) const
{ {
for (auto early_late : EarlyLate::range()) { for (auto early_late : EarlyLate::range()) {
DeratingFactors *delay_factors=factors->factors(TimingDerateType::cell_delay); DeratingFactors *delay_factors=factors->factors(TimingDerateCellType::cell_delay);
writeDerating(delay_factors, TimingDerateType::cell_delay, early_late, write_obj); writeDerating(delay_factors, TimingDerateType::cell_delay, early_late, write_obj);
DeratingFactors *check_factors=factors->factors(TimingDerateType::cell_check); DeratingFactors *check_factors=factors->factors(TimingDerateCellType::cell_check);
writeDerating(check_factors, TimingDerateType::cell_check, early_late, write_obj); writeDerating(check_factors, TimingDerateType::cell_check, early_late, write_obj);
} }
} }

View File

@ -3009,14 +3009,14 @@ Search::timingDerate(Vertex *from_vertex,
path_ap->pathMinMax()); path_ap->pathMinMax());
} }
else { else {
TimingDerateType derate_type; TimingDerateCellType derate_type;
const RiseFall *rf; const RiseFall *rf;
if (role->isTimingCheck()) { if (role->isTimingCheck()) {
derate_type = TimingDerateType::cell_check; derate_type = TimingDerateCellType::cell_check;
rf = arc->toTrans()->asRiseFall(); rf = arc->toTrans()->asRiseFall();
} }
else { else {
derate_type = TimingDerateType::cell_delay; derate_type = TimingDerateCellType::cell_delay;
rf = arc->fromTrans()->asRiseFall(); rf = arc->fromTrans()->asRiseFall();
} }
return sdc_->timingDerateInstance(pin, derate_type, derate_clk_data, rf, return sdc_->timingDerateInstance(pin, derate_type, derate_clk_data, rf,

View File

@ -847,7 +847,7 @@ Sta::setTimingDerate(const Net *net,
void void
Sta::setTimingDerate(const Instance *inst, Sta::setTimingDerate(const Instance *inst,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
@ -861,7 +861,7 @@ Sta::setTimingDerate(const Instance *inst,
void void
Sta::setTimingDerate(const LibertyCell *cell, Sta::setTimingDerate(const LibertyCell *cell,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,

View File

@ -1020,7 +1020,20 @@ using namespace sta;
else if (stringEq(arg, "cell_check")) else if (stringEq(arg, "cell_check"))
$1 = TimingDerateType::cell_check; $1 = TimingDerateType::cell_check;
else { else {
tclArgError(interp, "%s not clk or data.", arg); tclArgError(interp, "%s not net_delay, cell_delay or cell_check.", arg);
return TCL_ERROR;
}
}
%typemap(in) TimingDerateCellType {
int length;
char *arg = Tcl_GetStringFromObj($input, &length);
if (stringEq(arg, "cell_delay"))
$1 = TimingDerateCellType::cell_delay;
else if (stringEq(arg, "cell_check"))
$1 = TimingDerateCellType::cell_check;
else {
tclArgError(interp, "%s not cell_delay or cell_check.", arg);
return TCL_ERROR; return TCL_ERROR;
} }
} }
@ -3735,7 +3748,7 @@ set_timing_derate_net_cmd(const Net *net,
void void
set_timing_derate_inst_cmd(const Instance *inst, set_timing_derate_inst_cmd(const Instance *inst,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,
@ -3746,7 +3759,7 @@ set_timing_derate_inst_cmd(const Instance *inst,
void void
set_timing_derate_cell_cmd(const LibertyCell *cell, set_timing_derate_cell_cmd(const LibertyCell *cell,
TimingDerateType type, TimingDerateCellType type,
PathClkOrData clk_data, PathClkOrData clk_data,
const RiseFallBoth *rf, const RiseFallBoth *rf,
const EarlyLate *early_late, const EarlyLate *early_late,