From c230ba0e1ad5f831c1ce95322b8024058ad7ed6b Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 25 Jun 2022 10:08:33 -0700 Subject: [PATCH] TimingArcSets share TimingArcAttrs Signed-off-by: James Cherry --- dcalc/DelayCalc.tcl | 5 ++++- include/sta/Liberty.hh | 4 ---- include/sta/TimingArc.hh | 7 +++++-- liberty/Liberty.cc | 16 ---------------- liberty/LibertyBuilder.cc | 2 +- liberty/LibertyReader.cc | 1 - liberty/LibertyWriter.cc | 6 ++++-- liberty/TableModel.cc | 4 ++-- liberty/TimingArc.cc | 36 ++++++++++++++++++++++-------------- search/MakeTimingModel.cc | 2 -- tcl/StaTcl.i | 8 ++++++-- 11 files changed, 44 insertions(+), 47 deletions(-) diff --git a/dcalc/DelayCalc.tcl b/dcalc/DelayCalc.tcl index 33846ee9..92e06b89 100644 --- a/dcalc/DelayCalc.tcl +++ b/dcalc/DelayCalc.tcl @@ -84,7 +84,10 @@ proc report_edge_dcalc { edge corner min_max digits } { || ($min_max=="min" && $role=="setup"))} { report_line "Library: [get_name $library]" report_line "Cell: [get_name $cell]" - report_line "Arc sense: [$edge sense]" + set sense [$edge sense] + if { $sense != "unknown" } { + report_line "Arc sense: $sense" + } report_line "Arc type: $role" foreach arc [$edge timing_arcs] { diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 93894cfa..516f9b58 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -72,7 +72,6 @@ typedef Map ModeDefMap; typedef Map ModeValueMap; typedef Map LatchEnableMap; typedef Map OcvDerateMap; -typedef Vector TimingArcAttrsSeq; typedef Vector InternalPowerAttrsSeq; typedef Map SupplyVoltageMap; typedef Map LibertyPgPortMap; @@ -467,7 +466,6 @@ public: void addScaledCell(OperatingConditions *op_cond, LibertyCell *scaled_cell); unsigned addTimingArcSet(TimingArcSet *set); - void addTimingArcAttrs(TimingArcAttrs *attrs); void addInternalPower(InternalPower *power); void addInternalPowerAttrs(InternalPowerAttrs *attrs); void addLeakagePower(LeakagePower *power); @@ -496,7 +494,6 @@ protected: void addPort(ConcretePort *port); void setHasInternalPorts(bool has_internal); void setLibertyLibrary(LibertyLibrary *library); - void deleteTimingArcAttrs(); void makeLatchEnables(Report *report, Debug *debug); FuncExpr *findLatchEnableFunc(LibertyPort *data, @@ -534,7 +531,6 @@ protected: LibertyPortPairTimingArcMap port_timing_arc_set_map_; LibertyPortTimingArcMap timing_arc_set_from_map_; LibertyPortTimingArcMap timing_arc_set_to_map_; - TimingArcAttrsSeq timing_arc_attrs_; bool has_infered_reg_timing_arcs_; InternalPowerSeq internal_powers_; PortInternalPowerSeq port_internal_powers_; diff --git a/include/sta/TimingArc.hh b/include/sta/TimingArc.hh index 2d19f280..2378c06f 100644 --- a/include/sta/TimingArc.hh +++ b/include/sta/TimingArc.hh @@ -85,8 +85,8 @@ class TimingArcAttrs { public: TimingArcAttrs(); + TimingArcAttrs(TimingSense sense); virtual ~TimingArcAttrs(); - void deleteContents(); TimingType timingType() const { return timing_type_; } void setTimingType(TimingType type); TimingSense timingSense() const { return timing_sense_; } @@ -194,12 +194,14 @@ public: protected: void init(LibertyCell *cell); - TimingArcSet(TimingRole *role); + TimingArcSet(TimingRole *role, + TimingArcAttrs *attrs); LibertyPort *from_; LibertyPort *to_; LibertyPort *related_out_; TimingRole *role_; + TimingArcAttrs *attrs_; TimingArcSeq arcs_; FuncExpr *cond_; bool is_cond_default_; @@ -214,6 +216,7 @@ protected: TimingArc *from_arc2_[RiseFall::index_count]; TimingArc *to_arc_[RiseFall::index_count]; + static TimingArcAttrs *wire_timing_arc_attrs_; static TimingArcSet *wire_timing_arc_set_; }; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 51870d36..4458a653 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -894,7 +894,6 @@ LibertyCell::~LibertyCell() mode_defs_.deleteContents(); latch_d_to_q_map_.deleteContents(); - deleteTimingArcAttrs(); timing_arc_sets_.deleteContents(); port_timing_arc_set_map_.deleteContents(); timing_arc_set_from_map_.deleteContents(); @@ -914,15 +913,6 @@ LibertyCell::~LibertyCell() pg_port_map_.deleteContents(); } -void -LibertyCell::deleteTimingArcAttrs() -{ - for (auto attrs : timing_arc_attrs_) { - attrs->deleteContents(); - delete attrs; - } -} - LibertyPort * LibertyCell::findLibertyPort(const char *name) const { @@ -1168,12 +1158,6 @@ LibertyCell::addTimingArcSet(TimingArcSet *arc_set) return set_index; } -void -LibertyCell::addTimingArcAttrs(TimingArcAttrs *attrs) -{ - timing_arc_attrs_.push_back(attrs); -} - void LibertyCell::addInternalPower(InternalPower *power) { diff --git a/liberty/LibertyBuilder.cc b/liberty/LibertyBuilder.cc index b0c88ea8..91ede02e 100644 --- a/liberty/LibertyBuilder.cc +++ b/liberty/LibertyBuilder.cc @@ -465,7 +465,7 @@ LibertyBuilder::makeTristateEnableArcs(LibertyCell *cell, TimingArcAttrs *attrs) { TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, related_out, - TimingRole::tristateEnable(),attrs); + TimingRole::tristateEnable(), attrs); FuncExpr *tristate_enable = to_port->tristateEnable(); TimingSense sense = attrs->timingSense(); if (sense == TimingSense::unknown && tristate_enable) diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 93354a9f..796d3a35 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -1903,7 +1903,6 @@ LibertyReader::makeTimingArcs(PortGroup *port_group) LibertyPort *port = port_iter.next(); makeTimingArcs(port, timing); } - cell_->addTimingArcAttrs(timing); } } diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 1643b554..b3575af7 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -363,9 +363,11 @@ LibertyWriter::writeTimingArcSet(const TimingArcSet *arc_set) { fprintf(stream_, " timing() {\n"); fprintf(stream_, " related_pin : \"%s\";\n", arc_set->from()->name()); - if (arc_set->sense() != TimingSense::non_unate) + TimingSense sense = arc_set->sense(); + if (sense != TimingSense::unknown + && sense != TimingSense::non_unate) fprintf(stream_, " timing_sense : %s;\n", - timingSenseString(arc_set->sense())); + timingSenseString(sense)); const char *timing_type = timingTypeString(arc_set); if (timing_type) fprintf(stream_, " timing_type : %s;\n", timing_type); diff --git a/liberty/TableModel.cc b/liberty/TableModel.cc index e5a6f7ee..1c759b8b 100644 --- a/liberty/TableModel.cc +++ b/liberty/TableModel.cc @@ -774,8 +774,8 @@ Table1::Table1(FloatSeq *values, Table1::~Table1() { delete values_; - if (own_axis1_) - delete axis1_; + //if (own_axis1_) + //delete axis1_; } float diff --git a/liberty/TimingArc.cc b/liberty/TimingArc.cc index bd502330..ca83f8f0 100644 --- a/liberty/TimingArc.cc +++ b/liberty/TimingArc.cc @@ -47,15 +47,21 @@ TimingArcAttrs::TimingArcAttrs() : { } -// Destructor does NOT delete contents because it is a component -// of TimingGroup (that is deleted after building the LibertyCell) -// and (potentially) multiple TimingArcSets. -TimingArcAttrs::~TimingArcAttrs() +TimingArcAttrs::TimingArcAttrs(TimingSense sense) : + timing_type_(TimingType::combinational), + timing_sense_(sense), + cond_(nullptr), + sdf_cond_(nullptr), + sdf_cond_start_(nullptr), + sdf_cond_end_(nullptr), + mode_name_(nullptr), + mode_value_(nullptr), + ocv_arc_depth_(0.0), + models_{nullptr, nullptr} { } -void -TimingArcAttrs::deleteContents() +TimingArcAttrs::~TimingArcAttrs() { if (cond_) cond_->deleteSubexprs(); @@ -164,6 +170,7 @@ TimingArc::intrinsicDelay() const //////////////////////////////////////////////////////////////// +TimingArcAttrs *TimingArcSet::wire_timing_arc_attrs_ = nullptr; TimingArcSet *TimingArcSet::wire_timing_arc_set_ = nullptr; TimingArcSet::TimingArcSet(LibertyCell *cell, @@ -176,6 +183,7 @@ TimingArcSet::TimingArcSet(LibertyCell *cell, to_(to), related_out_(related_out), role_(role), + attrs_(attrs), cond_(attrs->cond()), is_cond_default_(false), sdf_cond_start_(attrs->sdfCondStart()), @@ -193,11 +201,13 @@ TimingArcSet::TimingArcSet(LibertyCell *cell, init(cell); } -TimingArcSet::TimingArcSet(TimingRole *role) : +TimingArcSet::TimingArcSet(TimingRole *role, + TimingArcAttrs *attrs) : from_(nullptr), to_(nullptr), related_out_(nullptr), role_(role), + attrs_(attrs), cond_(nullptr), is_cond_default_(false), sdf_cond_start_(nullptr), @@ -226,6 +236,7 @@ TimingArcSet::init(LibertyCell *cell) TimingArcSet::~TimingArcSet() { arcs_.deleteContents(); + delete attrs_; } bool @@ -323,12 +334,7 @@ TimingArcSet::arcTo(const RiseFall *to_rf) const TimingSense TimingArcSet::sense() const { - if (arcs_.size() == 1) - return arcs_[0]->sense(); - else if (arcs_.size() == 2 && arcs_[0]->sense() == arcs_[1]->sense()) - return arcs_[0]->sense(); - else - return TimingSense::non_unate; + return attrs_->timingSense(); } RiseFall * @@ -521,7 +527,8 @@ TimingArcSet::wireArcIndex(const RiseFall *rf) void TimingArcSet::init() { - wire_timing_arc_set_ = new TimingArcSet(TimingRole::wire()); + wire_timing_arc_attrs_ = new TimingArcAttrs(TimingSense::positive_unate); + wire_timing_arc_set_ = new TimingArcSet(TimingRole::wire(), wire_timing_arc_attrs_); new TimingArc(wire_timing_arc_set_, Transition::rise(), Transition::rise(), nullptr); new TimingArc(wire_timing_arc_set_, Transition::fall(), @@ -533,6 +540,7 @@ TimingArcSet::destroy() { delete wire_timing_arc_set_; wire_timing_arc_set_ = nullptr; + wire_timing_arc_attrs_ = nullptr; } //////////////////////////////////////////////////////////////// diff --git a/search/MakeTimingModel.cc b/search/MakeTimingModel.cc index e27de852..d6505a90 100644 --- a/search/MakeTimingModel.cc +++ b/search/MakeTimingModel.cc @@ -346,7 +346,6 @@ MakeTimingModel::makeSetupHoldTimingArcs(const Pin *input_pin, lib_builder_->makeFromTransitionArcs(cell_, clk_port, input_port, nullptr, clk_rf, role, attrs); - cell_->addTimingArcAttrs(attrs); } } } @@ -434,7 +433,6 @@ MakeTimingModel::findClkedOutputPaths() output_port, nullptr, clk_rf, TimingRole::regClkToQ(), attrs); - cell_->addTimingArcAttrs(attrs); } } } diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index 6addfdb0..bdcc4ecf 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -1973,8 +1973,12 @@ report_file_warn(int id, void report_line(const char *msg) { - Report *report = Sta::sta()->report(); - report->reportLineString(msg); + Sta *sta = Sta::sta(); + if (sta) + sta->report()->reportLineString(msg); + else + // After sta::delete_all_memory souce -echo prints the cmd file line + printf("%s\n", msg); } void