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,
float &factor,
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);
void clear();
@ -81,26 +87,24 @@ class DeratingFactorsCell
{
public:
DeratingFactorsCell();
void setFactor(TimingDerateType type,
void setFactor(TimingDerateCellType type,
PathClkOrData clk_data,
const RiseFallBoth *rf,
const EarlyLate *early_late,
float factor);
void factor(TimingDerateType type,
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(TimingDerateCellType type);
void clear();
void isOneValue(const EarlyLate *early_late,
bool &is_one_value,
float &value) const;
private:
DISALLOW_COPY_AND_ASSIGN(DeratingFactorsCell);
DeratingFactors factors_[timing_derate_cell_type_count];
};

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2049,9 +2049,9 @@ WriteSdc::writeDerating(DeratingFactorsCell *factors,
WriteSdcObject *write_obj) const
{
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);
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);
}
}

View File

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

View File

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

View File

@ -1020,7 +1020,20 @@ using namespace sta;
else if (stringEq(arg, "cell_check"))
$1 = TimingDerateType::cell_check;
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;
}
}
@ -3735,7 +3748,7 @@ set_timing_derate_net_cmd(const Net *net,
void
set_timing_derate_inst_cmd(const Instance *inst,
TimingDerateType type,
TimingDerateCellType type,
PathClkOrData clk_data,
const RiseFallBoth *rf,
const EarlyLate *early_late,
@ -3746,7 +3759,7 @@ set_timing_derate_inst_cmd(const Instance *inst,
void
set_timing_derate_cell_cmd(const LibertyCell *cell,
TimingDerateType type,
TimingDerateCellType type,
PathClkOrData clk_data,
const RiseFallBoth *rf,
const EarlyLate *early_late,