From 64c3c1f8488eb529d06881683c97c4480413f83e Mon Sep 17 00:00:00 2001 From: Rasmus Munk Larsen Date: Tue, 12 Dec 2023 12:33:52 -0800 Subject: [PATCH] Optimize use of std::shared_ptr. This change speeds up the OpenRoad Gate Resizer tool by 35% for a circuit we care about. --- include/sta/TableModel.hh | 16 ++++++++-- liberty/TableModel.cc | 66 +++++++++++++++++++++++++-------------- 2 files changed, 56 insertions(+), 26 deletions(-) diff --git a/include/sta/TableModel.hh b/include/sta/TableModel.hh index 81b03895..f2711d5b 100644 --- a/include/sta/TableModel.hh +++ b/include/sta/TableModel.hh @@ -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; diff --git a/liberty/TableModel.cc b/liberty/TableModel.cc index 8400bc2f..1a4772d4 100644 --- a/liberty/TableModel.cc +++ b/liberty/TableModel.cc @@ -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;