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

View File

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