specialize DeratingFactors enums for insts
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
49398a97c8
commit
db7b807c6a
|
|
@ -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];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
24
sdc/Sdc.cc
24
sdc/Sdc.cc
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
19
tcl/StaTcl.i
19
tcl/StaTcl.i
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue