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,
|
||||
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];
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
24
sdc/Sdc.cc
24
sdc/Sdc.cc
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
19
tcl/StaTcl.i
19
tcl/StaTcl.i
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Reference in New Issue