Optimize use of std::shared_ptr. This change speeds up the OpenRoad

Gate Resizer tool by 35% for a circuit we care about.
This commit is contained in:
Rasmus Munk Larsen 2023-12-12 12:33:52 -08:00
parent e9189bbd60
commit 64c3c1f848
2 changed files with 56 additions and 26 deletions

View File

@ -89,7 +89,7 @@ protected:
float &slew, float &slew,
float &cap) const; float &cap) const;
void setIsScaled(bool is_scaled) override; void setIsScaled(bool is_scaled) override;
float axisValue(TableAxisPtr axis, float axisValue(const TableAxisPtr& axis,
float load_cap, float load_cap,
float in_slew, float in_slew,
float related_out_cap) const; float related_out_cap) const;
@ -164,7 +164,7 @@ protected:
float &axis_value1, float &axis_value1,
float &axis_value2, float &axis_value2,
float &axis_value3) const; float &axis_value3) const;
float axisValue(TableAxisPtr axis, float axisValue(const TableAxisPtr& axis,
float load_cap, float load_cap,
float in_slew, float in_slew,
float related_out_cap) const; float related_out_cap) const;
@ -196,6 +196,9 @@ public:
TableAxisPtr axis1() const; TableAxisPtr axis1() const;
TableAxisPtr axis2() const; TableAxisPtr axis2() const;
TableAxisPtr axis3() const; TableAxisPtr axis3() const;
const TableAxisPtr& readonly_axis1() const;
const TableAxisPtr& readonly_axis2() const;
const TableAxisPtr& readonly_axis3() const;
void setIsScaled(bool is_scaled); void setIsScaled(bool is_scaled);
float value(size_t index1, float value(size_t index1,
size_t index2, size_t index2,
@ -248,6 +251,9 @@ public:
virtual TableAxisPtr axis1() const { return nullptr; } virtual TableAxisPtr axis1() const { return nullptr; }
virtual TableAxisPtr axis2() const { return nullptr; } virtual TableAxisPtr axis2() const { return nullptr; }
virtual TableAxisPtr axis3() const { return nullptr; } virtual TableAxisPtr axis3() const { return nullptr; }
virtual const TableAxisPtr& readonly_axis1() const { return nullptr; }
virtual const TableAxisPtr& readonly_axis2() const { return nullptr; }
virtual const TableAxisPtr& readonly_axis3() const { return nullptr; }
void setIsScaled(bool is_scaled); void setIsScaled(bool is_scaled);
virtual float value(size_t axis_idx1, virtual float value(size_t axis_idx1,
size_t axis_idx2, size_t axis_idx2,
@ -317,6 +323,7 @@ public:
Table1 &operator= (Table1 &&table); Table1 &operator= (Table1 &&table);
int order() const override { return 1; } int order() const override { return 1; }
TableAxisPtr axis1() const override { return axis1_; } TableAxisPtr axis1() const override { return axis1_; }
const TableAxisPtr& readonly_axis1() const override { return axis1_; }
float value(size_t axis_index1, float value(size_t axis_index1,
size_t axis_index2, size_t axis_index2,
size_t axis_index3) const override; size_t axis_index3) const override;
@ -363,6 +370,8 @@ public:
int order() const override { return 2; } int order() const override { return 2; }
TableAxisPtr axis1() const override { return axis1_; } TableAxisPtr axis1() const override { return axis1_; }
TableAxisPtr axis2() const override { return axis2_; } TableAxisPtr axis2() const override { return axis2_; }
const TableAxisPtr& readonly_axis1() const override { return axis1_; }
const TableAxisPtr& readonly_axis2() const override { return axis2_; }
float value(size_t axis_index1, float value(size_t axis_index1,
size_t axis_index2, size_t axis_index2,
size_t axis_index3) const override; size_t axis_index3) const override;
@ -409,6 +418,9 @@ public:
TableAxisPtr axis1() const override { return axis1_; } TableAxisPtr axis1() const override { return axis1_; }
TableAxisPtr axis2() const override { return axis2_; } TableAxisPtr axis2() const override { return axis2_; }
TableAxisPtr axis3() const override { return axis3_; } TableAxisPtr axis3() const override { return axis3_; }
const TableAxisPtr& readonly_axis1() const override { return axis1_; }
const TableAxisPtr& readonly_axis2() const override { return axis2_; }
const TableAxisPtr& readonly_axis3() const override { return axis3_; }
float value(size_t axis_index1, float value(size_t axis_index1,
size_t axis_index2, size_t axis_index2,
size_t axis_index3) const override; size_t axis_index3) const override;

View File

@ -225,24 +225,24 @@ GateTableModel::findAxisValues(const TableModel *model,
axis_value3 = 0.0; axis_value3 = 0.0;
break; break;
case 1: case 1:
axis_value1 = axisValue(model->axis1(), in_slew, load_cap, axis_value1 = axisValue(model->readonly_axis1(), in_slew, load_cap,
related_out_cap); related_out_cap);
axis_value2 = 0.0; axis_value2 = 0.0;
axis_value3 = 0.0; axis_value3 = 0.0;
break; break;
case 2: case 2:
axis_value1 = axisValue(model->axis1(), in_slew, load_cap, axis_value1 = axisValue(model->readonly_axis1(), in_slew, load_cap,
related_out_cap); related_out_cap);
axis_value2 = axisValue(model->axis2(), in_slew, load_cap, axis_value2 = axisValue(model->readonly_axis2(), in_slew, load_cap,
related_out_cap); related_out_cap);
axis_value3 = 0.0; axis_value3 = 0.0;
break; break;
case 3: case 3:
axis_value1 = axisValue(model->axis1(), in_slew, load_cap, axis_value1 = axisValue(model->readonly_axis1(), in_slew, load_cap,
related_out_cap); related_out_cap);
axis_value2 = axisValue(model->axis2(), in_slew, load_cap, axis_value2 = axisValue(model->readonly_axis2(), in_slew, load_cap,
related_out_cap); related_out_cap);
axis_value3 = axisValue(model->axis3(), in_slew, load_cap, axis_value3 = axisValue(model->readonly_axis3(), in_slew, load_cap,
related_out_cap); related_out_cap);
break; break;
default: default:
@ -269,9 +269,9 @@ GateTableModel::maxCapSlew(float in_slew,
float &slew, float &slew,
float &cap) const float &cap) const
{ {
TableAxisPtr axis1 = slew_model_->axis1(); const TableAxisPtr& axis1 = slew_model_->readonly_axis1();
TableAxisPtr axis2 = slew_model_->axis2(); const TableAxisPtr& axis2 = slew_model_->readonly_axis2();
TableAxisPtr axis3 = slew_model_->axis3(); const TableAxisPtr& axis3 = slew_model_->readonly_axis3();
if (axis1 if (axis1
&& axis1->variable() == TableAxisVariable::total_output_net_capacitance) { && axis1->variable() == TableAxisVariable::total_output_net_capacitance) {
cap = axis1->axisValue(axis1->size() - 1); cap = axis1->axisValue(axis1->size() - 1);
@ -298,7 +298,7 @@ GateTableModel::maxCapSlew(float in_slew,
} }
float float
GateTableModel::axisValue(TableAxisPtr axis, GateTableModel::axisValue(const TableAxisPtr& axis,
float in_slew, float in_slew,
float load_cap, float load_cap,
float related_out_cap) const float related_out_cap) const
@ -320,9 +320,9 @@ GateTableModel::axisValue(TableAxisPtr axis,
bool bool
GateTableModel::checkAxes(const TablePtr table) GateTableModel::checkAxes(const TablePtr table)
{ {
TableAxisPtr axis1 = table->axis1(); const TableAxisPtr& axis1 = table->readonly_axis1();
TableAxisPtr axis2 = table->axis2(); const TableAxisPtr& axis2 = table->readonly_axis2();
TableAxisPtr axis3 = table->axis3(); const TableAxisPtr& axis3 = table->readonly_axis3();
bool axis_ok = true; bool axis_ok = true;
if (axis1) if (axis1)
axis_ok &= checkAxis(axis1); axis_ok &= checkAxis(axis1);
@ -369,9 +369,9 @@ ReceiverModel::setCapacitanceModel(TableModel *table_model,
bool bool
ReceiverModel::checkAxes(TablePtr table) ReceiverModel::checkAxes(TablePtr table)
{ {
TableAxisPtr axis1 = table->axis1(); const TableAxisPtr& axis1 = table->readonly_axis1();
TableAxisPtr axis2 = table->axis2(); const TableAxisPtr& axis2 = table->readonly_axis2();
TableAxisPtr axis3 = table->axis3(); const TableAxisPtr& axis3 = table->readonly_axis3();
return (axis1 && axis1->variable() == TableAxisVariable::input_net_transition return (axis1 && axis1->variable() == TableAxisVariable::input_net_transition
&& axis2 == nullptr && axis2 == nullptr
&& axis3 == nullptr) && axis3 == nullptr)
@ -540,7 +540,7 @@ CheckTableModel::findAxisValues(float from_slew,
} }
float float
CheckTableModel::axisValue(TableAxisPtr axis, CheckTableModel::axisValue(const TableAxisPtr& axis,
float from_slew, float from_slew,
float to_slew, float to_slew,
float related_out_cap) const float related_out_cap) const
@ -561,9 +561,9 @@ CheckTableModel::axisValue(TableAxisPtr axis,
bool bool
CheckTableModel::checkAxes(const TablePtr table) CheckTableModel::checkAxes(const TablePtr table)
{ {
TableAxisPtr axis1 = table->axis1(); const TableAxisPtr& axis1 = table->readonly_axis1();
TableAxisPtr axis2 = table->axis2(); const TableAxisPtr& axis2 = table->readonly_axis2();
TableAxisPtr axis3 = table->axis3(); const TableAxisPtr& axis3 = table->readonly_axis3();
bool axis_ok = true; bool axis_ok = true;
if (axis1) if (axis1)
axis_ok &= checkAxis(axis1); axis_ok &= checkAxis(axis1);
@ -633,6 +633,24 @@ TableModel::axis3() const
return table_->axis3(); return table_->axis3();
} }
const TableAxisPtr&
TableModel::readonly_axis1() const
{
return table_->readonly_axis1();
}
const TableAxisPtr&
TableModel::readonly_axis2() const
{
return table_->readonly_axis2();
}
const TableAxisPtr&
TableModel::readonly_axis3() const
{
return table_->readonly_axis3();
}
float float
TableModel::value(size_t axis_index1, TableModel::value(size_t axis_index1,
size_t axis_index2, size_t axis_index2,
@ -1608,9 +1626,9 @@ OutputWaveforms::~OutputWaveforms()
bool bool
OutputWaveforms::checkAxes(TableTemplate *tbl_template) OutputWaveforms::checkAxes(TableTemplate *tbl_template)
{ {
TableAxisPtr axis1 = tbl_template->axis1(); const TableAxisPtr& axis1 = tbl_template->readonly_axis1();
TableAxisPtr axis2 = tbl_template->axis2(); const TableAxisPtr& axis2 = tbl_template->readonly_axis2();
TableAxisPtr axis3 = tbl_template->axis3(); const TableAxisPtr& axis3 = tbl_template->readonly_axis3();
return (axis1 && axis1->variable() == TableAxisVariable::input_net_transition return (axis1 && axis1->variable() == TableAxisVariable::input_net_transition
&& axis2->variable() == TableAxisVariable::time && axis2->variable() == TableAxisVariable::time
&& axis3 == nullptr) && axis3 == nullptr)
@ -1778,7 +1796,7 @@ OutputWaveforms::findVoltages(size_t wave_index,
// i = C dv/dt // i = C dv/dt
FloatSeq volts; FloatSeq volts;
Table1 *currents = current_waveforms_[wave_index]; Table1 *currents = current_waveforms_[wave_index];
TableAxisPtr time_axis = currents->axis1(); const TableAxisPtr& time_axis = currents->readonly_axis1();
float prev_time = time_axis->axisValue(0); float prev_time = time_axis->axisValue(0);
float prev_current = currents->value(0); float prev_current = currents->value(0);
float voltage = 0.0; float voltage = 0.0;