From f0c9971015015fa9cded7d2c1427bee55718ddfb Mon Sep 17 00:00:00 2001 From: Robert O'Callahan Date: Thu, 26 Feb 2026 05:13:51 +1300 Subject: [PATCH 01/59] Expose 'TimingType' from `TimingArc`. (#380) When using the OpenSTA Liberty file parser as a general-purpose Liberty reader, it's useful to be able to extract the original `TimingType` for a timing arc, and trivial to support. --- include/sta/TimingArc.hh | 1 + 1 file changed, 1 insertion(+) diff --git a/include/sta/TimingArc.hh b/include/sta/TimingArc.hh index 347e37f1..caccedf1 100644 --- a/include/sta/TimingArc.hh +++ b/include/sta/TimingArc.hh @@ -170,6 +170,7 @@ public: void deleteTimingArc(TimingArc *arc); TimingArc *findTimingArc(unsigned arc_index); void setRole(const TimingRole *role); + TimingType timingType() const { return attrs_->timingType(); } FuncExpr *cond() const { return attrs_->cond(); } // Cond default is the timing arcs with no condition when there are // other conditional timing arcs between the same pins. From a2cd40f57c53d4a6a6a71d5fa3df400b877334f1 Mon Sep 17 00:00:00 2001 From: Kazuto Iris <78157415+kazutoiris@users.noreply.github.com> Date: Thu, 26 Feb 2026 10:08:47 +0800 Subject: [PATCH 02/59] fix: Revert "Expose 'TimingType' from `TimingArc`. (#380)" (#390) Now the `TimingArcSet` class in `TimingArc.hh` has two identical declarations of the `timingType()` member function with the same signature, return type and implementation, which causes an overload conflict error during the build process. This reverts commit f0c9971015015fa9cded7d2c1427bee55718ddfb. --- include/sta/TimingArc.hh | 1 - 1 file changed, 1 deletion(-) diff --git a/include/sta/TimingArc.hh b/include/sta/TimingArc.hh index caccedf1..347e37f1 100644 --- a/include/sta/TimingArc.hh +++ b/include/sta/TimingArc.hh @@ -170,7 +170,6 @@ public: void deleteTimingArc(TimingArc *arc); TimingArc *findTimingArc(unsigned arc_index); void setRole(const TimingRole *role); - TimingType timingType() const { return attrs_->timingType(); } FuncExpr *cond() const { return attrs_->cond(); } // Cond default is the timing arcs with no condition when there are // other conditional timing arcs between the same pins. From 95d5ebb47cda31c6f4fe360fe4f29becc623ada8 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 26 Feb 2026 09:32:20 -0800 Subject: [PATCH 03/59] test/helpers.tcl Signed-off-by: James Cherry --- test/helpers.tcl | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 test/helpers.tcl diff --git a/test/helpers.tcl b/test/helpers.tcl new file mode 100644 index 00000000..46eb84c9 --- /dev/null +++ b/test/helpers.tcl @@ -0,0 +1,41 @@ +# Helper functions common to multiple regressions. + +set test_dir [file dirname [file normalize [info script]]] +set result_dir [file join $test_dir "results"] + +# puts [exec cat $file] without forking. +proc report_file { file } { + set stream [open $file r] + if { [file extension $file] == ".gz" } { + zlib push gunzip $stream + } + gets $stream line + while { ![eof $stream] } { + puts $line + gets $stream line + } + close $stream +} + +proc report_file_filter { file filter } { + set stream [open $file r] + gets $stream line + while { ![eof $stream] } { + set index [string first $filter $line] + if { $index != -1 } { + set line [string replace $line $index [expr $index + [string length $filter] - 1]] + } + puts $line + gets $stream line + } + close $stream +} + +proc make_result_file { filename } { + variable result_dir + return [file join $result_dir $filename] +} + +proc sort_objects { objects } { + return [sta::sort_by_full_name $objects] +} From a47a8dd8315f6e8d55a90c3f55d4c433e55bff7d Mon Sep 17 00:00:00 2001 From: Kazuto Iris <78157415+kazutoiris@users.noreply.github.com> Date: Sat, 28 Feb 2026 05:51:28 +0800 Subject: [PATCH 04/59] Add GitHub Action for CI and fix broken testcases (#391) * feat(ci): add GitHub Action for push and pull request * fix(ci): fix broken testcases * chore: add CODEOWNERS for ci * ci: bump actions/upload-artifact from 6 to 7 --- .github/dependabot.yml | 6 +++++ .github/workflows/ci.yml | 54 ++++++++++++++++++++++++++++++++++++++++ CODEOWNERS | 2 ++ test/get_filter.ok | 2 +- test/report_json1.ok | 10 ++++---- test/suppress_msg.ok | 8 +++--- 6 files changed, 72 insertions(+), 10 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/ci.yml create mode 100644 CODEOWNERS diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..c7fc735e --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: "daily" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..74255543 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: true + + - name: Set up dependencies + run: | + sudo apt-get update && sudo apt-get install -y flex libfl-dev bison tcl-dev tcl-tclreadline libeigen3-dev ninja-build + + - name: Set up cudd-3.0.0 + run: | + wget https://github.com/oscc-ip/artifact/releases/download/cudd-3.0.0/build.tar.gz + mkdir -p cudd + tar -zxvf build.tar.gz -Ccudd + + - name: Build + run: | + mkdir build + cd build + cmake .. -G Ninja -DCUDD_DIR=$(pwd)/../cudd -DCMAKE_INSTALL_PREFIX=$(pwd)/install -DCMAKE_BUILD_TYPE=Release + cmake --build . --target all -- -j $(nproc) + cmake --install . + tar -zcvf build.tar.gz -Cinstall . + + - name: Test + run: | + cd test + ./regression + + - name: Upload Artifacts + uses: actions/upload-artifact@v7 + if: ${{ !cancelled() }} + with: + name: artifact + path: | + build/install/* + + - name: Upload Test Result + uses: actions/upload-artifact@v7 + if: ${{ !cancelled() }} + with: + name: result + path: | + test/results/* diff --git a/CODEOWNERS b/CODEOWNERS new file mode 100644 index 00000000..c6c2b793 --- /dev/null +++ b/CODEOWNERS @@ -0,0 +1,2 @@ +# For CI/CD issues +/.github/ @kazutoiris diff --git a/test/get_filter.ok b/test/get_filter.ok index deaa54f3..b66978cd 100644 --- a/test/get_filter.ok +++ b/test/get_filter.ok @@ -53,4 +53,4 @@ in2 [get_ports -filter direction==output *] out [get_cells -filter {name ~= *r1*} *] -Error: get_filter.tcl line 48, unknown filter operand. +Error 336: get_filter.tcl line 48, unknown filter operand. diff --git a/test/report_json1.ok b/test/report_json1.ok index 7f70fbf7..51e8ae79 100644 --- a/test/report_json1.ok +++ b/test/report_json1.ok @@ -36,7 +36,7 @@ "net": "mid", "arrival": 3.296e-10, "capacitance": 1.949e-15, - "slew": 4.035e-11 + "slew": 3.612e-11 }, { "instance": "_1416_[0]", @@ -45,7 +45,7 @@ "pin": "_1416_[0]/D", "net": "mid", "arrival": 3.296e-10, - "slew": 4.035e-11 + "slew": 3.612e-11 } ], "target_clock": "clk", @@ -72,9 +72,9 @@ ], "data_arrival_time": 3.296e-10, "crpr": 0.000e+00, - "margin": 1.225e-10, - "required_time": 9.877e-09, - "slack": 9.548e-09 + "margin": 1.207e-10, + "required_time": 9.879e-09, + "slack": 9.550e-09 } ] } diff --git a/test/suppress_msg.ok b/test/suppress_msg.ok index 0fd4d548..2673ab25 100644 --- a/test/suppress_msg.ok +++ b/test/suppress_msg.ok @@ -1,12 +1,12 @@ Warning 1: suppress_msg.tcl line 18, cmd warn 1 -caught Error: suppress_msg.tcl line 18, cmd error 1 +caught Error 2: suppress_msg.tcl line 18, cmd error 1 Warning 1: cmd warn 2 -caught Error: 2cmd error 2 +caught Error: 2 cmd error 2 after error caught caught after error Warning 1: suppress_msg.tcl line 51, cmd warn 7 -caught Error: suppress_msg.tcl line 51, cmd error 7 +caught Error 2: suppress_msg.tcl line 51, cmd error 7 Warning 1: cmd warn 8 -caught Error: 2cmd error 8 +caught Error: 2 cmd error 8 From c010a0f99e10d4bfb39849a6c964e6ded7b5cbda Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 27 Feb 2026 16:57:08 -0800 Subject: [PATCH 05/59] liberty reader rewrite Signed-off-by: James Cherry --- examples/multi_corner.tcl | 1 - graph/Graph.cc | 2 + graph/Graph.i | 1 + include/sta/Liberty.hh | 4 +- include/sta/TableModel.hh | 26 +- include/sta/TimingArc.hh | 9 +- include/sta/TokenParser.hh | 10 + include/sta/Transition.hh | 1 + liberty/LibExprReader.cc | 6 +- liberty/LibExprReader.hh | 2 +- liberty/LibExprReaderPvt.hh | 4 +- liberty/Liberty.cc | 56 +- liberty/Liberty.i | 1 + liberty/Liberty.tcl | 16 + liberty/LibertyBuilder.cc | 71 +- liberty/LibertyBuilder.hh | 57 +- liberty/LibertyExt.cc | 49 +- liberty/LibertyLex.ll | 8 +- liberty/LibertyParse.yy | 10 +- liberty/LibertyParser.cc | 622 ++- liberty/LibertyParser.hh | 296 +- liberty/LibertyReader.cc | 8365 +++++++++++--------------------- liberty/LibertyReaderPvt.hh | 1152 ++--- liberty/TableModel.cc | 109 +- liberty/TimingArc.cc | 12 +- power/Power.cc | 2 +- search/MakeTimingModel.cc | 18 +- search/PathEnd.cc | 2 +- test/get_is_memory.tcl | 2 +- test/gf180mcu_sram.lib.gz | Bin 7015 -> 6997 bytes test/liberty_arcs_one2one_1.ok | 1 + test/liberty_arcs_one2one_2.ok | 1 + util/TokenParser.cc | 23 + 33 files changed, 4109 insertions(+), 6830 deletions(-) diff --git a/examples/multi_corner.tcl b/examples/multi_corner.tcl index 4900d867..fa5fab18 100644 --- a/examples/multi_corner.tcl +++ b/examples/multi_corner.tcl @@ -17,4 +17,3 @@ define_scene ff -liberty NangateOpenCellLibrary_fast report_checks -path_delay min_max # report typical scene report_checks -scene tt - diff --git a/graph/Graph.cc b/graph/Graph.cc index 2fe4d934..9e0b189d 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -1236,6 +1236,8 @@ Edge::to_string(const StaState *sta) const string str = from(graph)->to_string(sta); str += " -> "; str += to(graph)->to_string(sta); + str += " "; + str += role()->to_string(); FuncExpr *when = arc_set_->cond(); if (when) { str += " "; diff --git a/graph/Graph.i b/graph/Graph.i index ed9ad710..b6f3c3c5 100644 --- a/graph/Graph.i +++ b/graph/Graph.i @@ -171,6 +171,7 @@ path_iterator(const RiseFall *rf, } // Vertex methods %extend Edge { +std::string to_string() { return self->to_string(Sta::sta()); }; Vertex *from() { return self->from(Sta::sta()->graph()); } Vertex *to() { return self->to(Sta::sta()->graph()); } Pin *from_pin() { return self->from(Sta::sta()->graph())->pin(); } diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 68d43bb3..02769b84 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -253,7 +253,7 @@ public: float wire_delay) const; // Check for supported axis variables. // Return true if axes are supported. - static bool checkSlewDegradationAxes(const TablePtr &table); + static bool checkSlewDegradationAxes(const TableModel *table_model); float defaultInputPinCap() const { return default_input_pin_cap_; } void setDefaultInputPinCap(float cap); @@ -1051,7 +1051,7 @@ public: void setScale(ScaleFactorType type, ScaleFactorPvt pvt, float scale); - void print(); + void report(Report *report); protected: std::string name_; diff --git a/include/sta/TableModel.hh b/include/sta/TableModel.hh index 1d08d751..1e88faf6 100644 --- a/include/sta/TableModel.hh +++ b/include/sta/TableModel.hh @@ -49,6 +49,7 @@ using FloatTable = std::vector; // Sequence of 1D tables (order 1). using Table1Seq = std::vector; using Waveform = Table; +using TableModelsEarlyLate = std::array; TableAxisVariable stringTableAxisVariable(const char *variable); @@ -63,11 +64,14 @@ class GateTableModel : public GateTimingModel public: GateTableModel(LibertyCell *cell, TableModel *delay_model, - TableModel *delay_sigma_models[EarlyLate::index_count], + TableModelsEarlyLate delay_sigma_models, TableModel *slew_model, - TableModel *slew_sigma_models[EarlyLate::index_count], + TableModelsEarlyLate slew_sigma_models, ReceiverModelPtr receiver_model, OutputWaveforms *output_waveforms); + GateTableModel(LibertyCell *cell, + TableModel *delay_model, + TableModel *slew_model); ~GateTableModel() override; void gateDelay(const Pvt *pvt, float in_slew, @@ -100,7 +104,7 @@ public: OutputWaveforms *outputWaveforms() const { return output_waveforms_.get(); } // Check the axes before making the model. // Return true if the model axes are supported. - static bool checkAxes(const TablePtr &table); + static bool checkAxes(const TableModel *table); protected: void maxCapSlew(float in_slew, @@ -135,9 +139,9 @@ protected: static bool checkAxis(const TableAxis *axis); std::unique_ptr delay_model_; - std::array, EarlyLate::index_count> delay_sigma_models_; + TableModelsEarlyLate delay_sigma_models_; std::unique_ptr slew_model_; - std::array, EarlyLate::index_count> slew_sigma_models_; + TableModelsEarlyLate slew_sigma_models_; ReceiverModelPtr receiver_model_; std::unique_ptr output_waveforms_; }; @@ -147,7 +151,9 @@ class CheckTableModel : public CheckTimingModel public: CheckTableModel(LibertyCell *cell, TableModel *model, - TableModel *sigma_models[EarlyLate::index_count]); + TableModelsEarlyLate sigma_models); + CheckTableModel(LibertyCell *cell, + TableModel *model); ~CheckTableModel() override; ArcDelay checkDelay(const Pvt *pvt, float from_slew, @@ -166,7 +172,7 @@ public: // Check the axes before making the model. // Return true if the model axes are supported. - static bool checkAxes(const TablePtr table); + static bool checkAxes(const TableModel *table); protected: void setIsScaled(bool is_scaled) override; @@ -197,7 +203,7 @@ protected: static bool checkAxis(const TableAxis *axis); std::unique_ptr model_; - std::array, EarlyLate::index_count> sigma_models_; + TableModelsEarlyLate sigma_models_; }; class TableAxis @@ -254,6 +260,8 @@ public: const TableAxis *axis2() const { return axis2_.get(); } const TableAxis *axis3() const { return axis3_.get(); } const TableAxisPtr axis1ptr() const { return axis1_; } + const TableAxisPtr axis2ptr() const { return axis2_; } + const TableAxisPtr axis3ptr() const { return axis3_; } void setIsScaled(bool is_scaled); float value(size_t axis_idx1, @@ -409,7 +417,7 @@ public: void setCapacitanceModel(TableModel table_model, size_t segment, const RiseFall *rf); - static bool checkAxes(TablePtr table); + static bool checkAxes(const TableModel *table); private: std::vector capacitance_models_; diff --git a/include/sta/TimingArc.hh b/include/sta/TimingArc.hh index 347e37f1..63c04d49 100644 --- a/include/sta/TimingArc.hh +++ b/include/sta/TimingArc.hh @@ -99,7 +99,7 @@ class TimingArcAttrs public: TimingArcAttrs(); TimingArcAttrs(TimingSense sense); - virtual ~TimingArcAttrs(); + ~TimingArcAttrs(); TimingType timingType() const { return timing_type_; } void setTimingType(TimingType type); TimingSense timingSense() const { return timing_sense_; } @@ -145,7 +145,8 @@ class TimingArcSet friend class LibertyCell; public: - virtual ~TimingArcSet(); + ~TimingArcSet(); + std::string to_string(); LibertyCell *libertyCell() const; LibertyPort *from() const { return from_; } LibertyPort *to() const { return to_; } @@ -249,7 +250,7 @@ public: TimingArcSet *set() const { return set_; } TimingSense sense() const; // Index in TimingArcSet. - unsigned index() const { return index_; } + size_t index() const { return index_; } TimingModel *model() const { return model_; } GateTimingModel *gateModel(const Scene *scene, const MinMax *min_max) const; @@ -270,7 +271,7 @@ public: protected: TimingModel *model(const Scene *scene, const MinMax *min_max) const; - void setIndex(unsigned index); + void setIndex(size_t index); void addScaledModel(const OperatingConditions *op_cond, TimingModel *scaled_model); diff --git a/include/sta/TokenParser.hh b/include/sta/TokenParser.hh index a339a6a8..27db37f9 100644 --- a/include/sta/TokenParser.hh +++ b/include/sta/TokenParser.hh @@ -24,8 +24,13 @@ #pragma once +#include +#include + namespace sta { +using StdStringSeq = std::vector; + // Iterate over the tokens in str separated by character sep. // Similar in functionality to strtok, but does not leave the string // side-effected. This is preferable to using strtok because it leaves @@ -49,4 +54,9 @@ private: bool first_; }; +// Parse delimiter separated tokens and skipp spaces. +StdStringSeq +parseTokens(const std::string &s, + const char delimiter); + } // namespace diff --git a/include/sta/Transition.hh b/include/sta/Transition.hh index 39190c6c..3f3e03c6 100644 --- a/include/sta/Transition.hh +++ b/include/sta/Transition.hh @@ -48,6 +48,7 @@ public: static const RiseFall *fall() { return &fall_; } static int riseIndex() { return rise_.sdf_triple_index_; } static int fallIndex() { return fall_.sdf_triple_index_; } + const std::string &to_string_long() const { return name_; } const std::string &to_string() const { return short_name_; } const char *name() const { return name_.c_str(); } const char *shortName() const { return short_name_.c_str(); } diff --git a/liberty/LibExprReader.cc b/liberty/LibExprReader.cc index c9bc84bc..dfb2d679 100644 --- a/liberty/LibExprReader.cc +++ b/liberty/LibExprReader.cc @@ -37,7 +37,7 @@ namespace sta { FuncExpr * parseFuncExpr(const char *func, - LibertyCell *cell, + const LibertyCell *cell, const char *error_msg, Report *report) { @@ -56,7 +56,7 @@ parseFuncExpr(const char *func, } LibExprReader::LibExprReader(const char *func, - LibertyCell *cell, + const LibertyCell *cell, const char *error_msg, Report *report) : func_(func), @@ -69,7 +69,7 @@ LibExprReader::LibExprReader(const char *func, // defined in LibertyReader.cc LibertyPort * -libertyReaderFindPort(LibertyCell *cell, +libertyReaderFindPort(const LibertyCell *cell, const char *port_name); FuncExpr * diff --git a/liberty/LibExprReader.hh b/liberty/LibExprReader.hh index 79d6d35f..fa36aaa3 100644 --- a/liberty/LibExprReader.hh +++ b/liberty/LibExprReader.hh @@ -32,7 +32,7 @@ class LibertyCell; FuncExpr * parseFuncExpr(const char *func, - LibertyCell *cell, + const LibertyCell *cell, const char *error_msg, Report *report); diff --git a/liberty/LibExprReaderPvt.hh b/liberty/LibExprReaderPvt.hh index 4532b2e8..06a65ea2 100644 --- a/liberty/LibExprReaderPvt.hh +++ b/liberty/LibExprReaderPvt.hh @@ -35,7 +35,7 @@ class LibExprReader { public: LibExprReader(const char *func, - LibertyCell *cell, + const LibertyCell *cell, const char *error_msg, Report *report); FuncExpr *makeFuncExprPort(const char *port_name); @@ -55,7 +55,7 @@ public: private: const char *func_; - LibertyCell *cell_; + const LibertyCell *cell_; const char *error_msg_; Report *report_; FuncExpr *result_; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index d83d06b7..5df31143 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -111,8 +111,6 @@ LibertyLibrary::LibertyLibrary(const char *name, LibertyLibrary::~LibertyLibrary() { - delete scale_factors_; - for (auto rf_index : RiseFall::rangeIndex()) { TableModel *model = wire_slew_degradation_tbls_[rf_index]; delete model; @@ -271,14 +269,14 @@ LibertyLibrary::setScaleFactors(ScaleFactors *scales) ScaleFactors * LibertyLibrary::makeScaleFactors(const char *name) { - auto [it, inserted] = scale_factors_map_.emplace(std::string(name), name); + auto [it, inserted] = scale_factors_map_.emplace(name, name); return &it->second; } ScaleFactors * LibertyLibrary::findScaleFactors(const char *name) { - return findKeyValuePtr(scale_factors_map_, std::string(name)); + return findKeyValuePtr(scale_factors_map_, name); } float @@ -400,20 +398,20 @@ LibertyLibrary::degradeWireSlew(const TableModel *model, // Check for supported axis variables. // Return true if axes are supported. bool -LibertyLibrary::checkSlewDegradationAxes(const TablePtr &table) +LibertyLibrary::checkSlewDegradationAxes(const TableModel *table_model) { - switch (table->order()) { + switch (table_model->order()) { case 0: return true; case 1: { - const TableAxis *axis1 = table->axis1(); + const TableAxis *axis1 = table_model->axis1(); TableAxisVariable var1 = axis1->variable(); return var1 == TableAxisVariable::output_pin_transition || var1 == TableAxisVariable::connect_delay; } case 2: { - const TableAxis *axis1 = table->axis1(); - const TableAxis *axis2 = table->axis2(); + const TableAxis *axis1 = table_model->axis1(); + const TableAxis *axis2 = table_model->axis2(); TableAxisVariable var1 = axis1->variable(); TableAxisVariable var2 = axis2->variable(); return (var1 == TableAxisVariable::output_pin_transition @@ -1269,8 +1267,7 @@ LibertyCell::makeInternalPower(LibertyPort *port, const std::shared_ptr &when, InternalPowerModels &models) { - internal_powers_.emplace_back(port, related_port, related_pg_pin, - when, models); + internal_powers_.emplace_back(port, related_port, related_pg_pin, when, models); port_internal_powers_[port].push_back(internal_powers_.size() - 1); } @@ -1485,6 +1482,10 @@ LibertyCell::makeSequential(int size, port_to_seq_map_[sequentials_.back().output()] = idx; port_to_seq_map_[sequentials_.back().outputInv()] = idx; } + delete clk; + delete data; + delete clear; + delete preset; } Sequential * @@ -3087,7 +3088,8 @@ OperatingConditions::setWireloadTree(WireloadTree tree) static EnumNameMap scale_factor_type_map = {{ScaleFactorType::pin_cap, "pin_cap"}, - {ScaleFactorType::wire_cap, "wire_res"}, + {ScaleFactorType::wire_cap, "wire_cap"}, + {ScaleFactorType::wire_res, "wire_res"}, {ScaleFactorType::min_period, "min_period"}, {ScaleFactorType::cell, "cell"}, {ScaleFactorType::hold, "hold"}, @@ -3124,7 +3126,9 @@ scaleFactorTypeRiseFallSuffix(ScaleFactorType type) || type == ScaleFactorType::recovery || type == ScaleFactorType::removal || type == ScaleFactorType::nochange - || type == ScaleFactorType::skew; + || type == ScaleFactorType::skew + || type == ScaleFactorType::leakage_power + || type == ScaleFactorType::internal_power; } bool @@ -3144,7 +3148,8 @@ scaleFactorTypeLowHighSuffix(ScaleFactorType type) EnumNameMap scale_factor_pvt_names = {{ScaleFactorPvt::process, "process"}, {ScaleFactorPvt::volt, "volt"}, - {ScaleFactorPvt::temp, "temp"} + {ScaleFactorPvt::temp, "temp"}, + {ScaleFactorPvt::unknown, "unknown"} }; ScaleFactorPvt @@ -3214,31 +3219,32 @@ ScaleFactors::scale(ScaleFactorType type, } void -ScaleFactors::print() +ScaleFactors::report(Report *report) { - printf("%10s", " "); + std::string line = " "; for (int pvt_index = 0; pvt_index < scale_factor_pvt_count; pvt_index++) { ScaleFactorPvt pvt = (ScaleFactorPvt) pvt_index; - printf("%10s", scaleFactorPvtName(pvt)); + stringAppend(line, "%10s", scaleFactorPvtName(pvt)); } - printf("\n"); + report->reportLineString(line); + for (int type_index = 0; type_index < scale_factor_type_count; type_index++) { ScaleFactorType type = (ScaleFactorType) type_index; - printf("%10s ", scaleFactorTypeName(type)); + stringPrint(line, "%10s ", scaleFactorTypeName(type)); for (int pvt_index = 0; pvt_index < scale_factor_pvt_count; pvt_index++) { if (scaleFactorTypeRiseFallSuffix(type) || scaleFactorTypeRiseFallPrefix(type) || scaleFactorTypeLowHighSuffix(type)) { - printf(" %.3f,%.3f", - scales_[type_index][pvt_index][RiseFall::riseIndex()], - scales_[type_index][pvt_index][RiseFall::fallIndex()]); + stringAppend(line, " %.3f,%.3f", + scales_[type_index][pvt_index][RiseFall::riseIndex()], + scales_[type_index][pvt_index][RiseFall::fallIndex()]); } else { - printf(" %.3f", - scales_[type_index][pvt_index][0]); + stringAppend(line, " %.3f", + scales_[type_index][pvt_index][0]); } } - printf("\n"); + report->reportLineString(line); } } diff --git a/liberty/Liberty.i b/liberty/Liberty.i index 96223170..2257b2eb 100644 --- a/liberty/Liberty.i +++ b/liberty/Liberty.i @@ -363,6 +363,7 @@ scan_signal_type() %extend TimingArcSet { LibertyPort *from() { return self->from(); } LibertyPort *to() { return self->to(); } +std::string to_string() { return self->to_string(); } const TimingRole *role() { return self->role(); } const char *sdf_cond() { return self->sdfCond().c_str(); } diff --git a/liberty/Liberty.tcl b/liberty/Liberty.tcl index 672e876f..fd75a8bf 100644 --- a/liberty/Liberty.tcl +++ b/liberty/Liberty.tcl @@ -74,6 +74,11 @@ proc report_lib_cell_ { cell scene } { if { $filename != "" } { report_line "File $filename" } + report_lib_ports $cell $scene + report_timing_arcs $cell +} + +proc report_lib_ports { cell scene } { set iter [$cell liberty_port_iterator] while {[$iter has_next]} { set port [$iter next] @@ -115,5 +120,16 @@ proc report_lib_port { port scene } { report_line " ${indent}$port_name [liberty_port_direction $port]$enable$func[port_capacitance_str $port $scene $sta_report_default_digits]" } +proc report_timing_arcs { cell } { + set timing_arcs [$cell timing_arc_sets] + if { [llength $timing_arcs] > 0 } { + puts "" + puts "Timing arcs" + foreach timing_arc $timing_arcs { + puts [$timing_arc to_string] + } + } +} + # sta namespace end } diff --git a/liberty/LibertyBuilder.cc b/liberty/LibertyBuilder.cc index b20d8c62..988c32e9 100644 --- a/liberty/LibertyBuilder.cc +++ b/liberty/LibertyBuilder.cc @@ -35,14 +35,11 @@ namespace sta { -using std::string; - -void -LibertyBuilder::init(Debug *debug, - Report *report) +LibertyBuilder::LibertyBuilder(Debug *debug, + Report *report) : + debug_(debug), + report_(report) { - debug_ = debug; - report_ = report; } LibertyCell * @@ -105,7 +102,7 @@ LibertyBuilder::makeBusPortBit(ConcreteLibrary *library, const char *bus_name, int bit_index) { - string bit_name; + std::string bit_name; stringPrint(bit_name, "%s%c%d%c", bus_name, library->busBrktLeft(), @@ -189,6 +186,7 @@ LibertyBuilder::makeTimingArcs(LibertyCell *cell, case TimingType::combinational: if (seq && seq->isLatch() + && seq->data() && seq->data()->hasPort(from_port)) // Latch D->Q timing arcs. return makeLatchDtoQArcs(cell, from_port, to_port, @@ -307,8 +305,9 @@ LibertyBuilder::makeCombinationalArcs(LibertyCell *cell, { FuncExpr *func = to_port->function(); FuncExpr *enable = to_port->tristateEnable(); - TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, - TimingRole::combinational(), attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(from_port, to_port, nullptr, + TimingRole::combinational(), + attrs); TimingSense sense = attrs->timingSense(); if (sense == TimingSense::unknown) { // Timing sense not specified - find it from function. @@ -388,8 +387,9 @@ LibertyBuilder::makeLatchDtoQArcs(LibertyCell *cell, TimingSense sense, TimingArcAttrsPtr attrs) { - TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, - TimingRole::latchDtoQ(), attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(from_port, to_port, nullptr, + TimingRole::latchDtoQ(), + attrs); TimingModel *model; const RiseFall *to_rf = RiseFall::rise(); model = attrs->model(to_rf); @@ -456,8 +456,8 @@ LibertyBuilder::makeFromTransitionArcs(LibertyCell *cell, const TimingRole *role, TimingArcAttrsPtr attrs) { - TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, - related_out, role, attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(from_port, to_port, + related_out, role, attrs); for (auto to_rf : RiseFall::range()) { TimingModel *model = attrs->model(to_rf); if (model) @@ -476,8 +476,8 @@ LibertyBuilder::makePresetClrArcs(LibertyCell *cell, TimingArcSet *arc_set = nullptr; TimingModel *model = attrs->model(to_rf); if (model) { - arc_set = makeTimingArcSet(cell, from_port, to_port, - TimingRole::regSetClr(), attrs); + arc_set = cell->makeTimingArcSet(from_port, to_port, nullptr, + TimingRole::regSetClr(), attrs); const RiseFall *opp_rf = to_rf->opposite(); switch (attrs->timingSense()) { case TimingSense::positive_unate: @@ -509,8 +509,9 @@ LibertyBuilder::makeTristateEnableArcs(LibertyCell *cell, bool to_fall, TimingArcAttrsPtr attrs) { - TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, - TimingRole::tristateEnable(), attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(from_port, to_port, nullptr, + TimingRole::tristateEnable(), + attrs); FuncExpr *tristate_enable = to_port->tristateEnable(); TimingSense sense = attrs->timingSense(); if (sense == TimingSense::unknown && tristate_enable) @@ -579,9 +580,9 @@ LibertyBuilder::makeTristateDisableArcs(LibertyCell *cell, bool to_fall, TimingArcAttrsPtr attrs) { - TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, - TimingRole::tristateDisable(), - attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(from_port, to_port, nullptr, + TimingRole::tristateDisable(), + attrs); TimingSense sense = attrs->timingSense(); FuncExpr *tristate_enable = to_port->tristateEnable(); if (sense == TimingSense::unknown && tristate_enable) @@ -648,7 +649,8 @@ LibertyBuilder::makeClockTreePathArcs(LibertyCell *cell, const TimingRole *role, TimingArcAttrsPtr attrs) { - TimingArcSet *arc_set = makeTimingArcSet(cell, nullptr, to_port, role, attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(nullptr, to_port, nullptr, + role, attrs); for (const RiseFall *to_rf : RiseFall::range()) { TimingModel *model = attrs->model(to_rf); if (model) { @@ -683,8 +685,8 @@ LibertyBuilder::makeMinPulseWidthArcs(LibertyCell *cell, { if (from_port == nullptr) from_port = to_port; - TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, related_out, - role, attrs); + TimingArcSet *arc_set = cell->makeTimingArcSet(from_port, to_port, related_out, + role, attrs); for (const RiseFall *from_rf : RiseFall::range()) { TimingModel *model = attrs->model(from_rf); if (model) @@ -695,27 +697,6 @@ LibertyBuilder::makeMinPulseWidthArcs(LibertyCell *cell, //////////////////////////////////////////////////////////////// -TimingArcSet * -LibertyBuilder::makeTimingArcSet(LibertyCell *cell, - LibertyPort *from, - LibertyPort *to, - const TimingRole *role, - TimingArcAttrsPtr attrs) -{ - return cell->makeTimingArcSet(from, to, nullptr, role, attrs); -} - -TimingArcSet * -LibertyBuilder::makeTimingArcSet(LibertyCell *cell, - LibertyPort *from, - LibertyPort *to, - LibertyPort *related_out, - const TimingRole *role, - TimingArcAttrsPtr attrs) -{ - return cell->makeTimingArcSet(from, to, related_out, role, attrs); -} - TimingArc * LibertyBuilder::makeTimingArc(TimingArcSet *set, const RiseFall *from_rf, diff --git a/liberty/LibertyBuilder.hh b/liberty/LibertyBuilder.hh index dacbbb41..06538687 100644 --- a/liberty/LibertyBuilder.hh +++ b/liberty/LibertyBuilder.hh @@ -38,23 +38,21 @@ class Report; class LibertyBuilder { public: - LibertyBuilder() {} - virtual ~LibertyBuilder() {} - void init(Debug *debug, - Report *report); - virtual LibertyCell *makeCell(LibertyLibrary *library, - const char *name, - const char *filename); - virtual LibertyPort *makePort(LibertyCell *cell, - const char *name); - virtual LibertyPort *makeBusPort(LibertyCell *cell, - const char *bus_name, - int from_index, - int to_index, - BusDcl *bus_dcl); - virtual LibertyPort *makeBundlePort(LibertyCell *cell, - const char *name, - ConcretePortSeq *members); + LibertyBuilder(Debug *debug, + Report *report); + LibertyCell *makeCell(LibertyLibrary *library, + const char *name, + const char *filename); + LibertyPort *makePort(LibertyCell *cell, + const char *name); + LibertyPort *makeBusPort(LibertyCell *cell, + const char *bus_name, + int from_index, + int to_index, + BusDcl *bus_dcl); + LibertyPort *makeBundlePort(LibertyCell *cell, + const char *name, + ConcretePortSeq *members); // Build timing arc sets and their arcs given a type and sense. // Port functions and cell latches are also used by this builder // to get the correct roles. @@ -100,29 +98,18 @@ protected: int from_index, int to_index); // Bus port bit (internal to makeBusPortBits). - virtual LibertyPort *makePort(LibertyCell *cell, - const char *bit_name, - int bit_index); + LibertyPort *makePort(LibertyCell *cell, + const char *bit_name, + int bit_index); void makeBusPortBit(ConcreteLibrary *library, LibertyCell *cell, ConcretePort *bus_port, const char *bus_name, int index); - virtual TimingArcSet *makeTimingArcSet(LibertyCell *cell, - LibertyPort *from, - LibertyPort *to, - const TimingRole *role, - TimingArcAttrsPtr attrs); - virtual TimingArcSet *makeTimingArcSet(LibertyCell *cell, - LibertyPort *from, - LibertyPort *to, - LibertyPort *related_out, - const TimingRole *role, - TimingArcAttrsPtr attrs); - virtual TimingArc *makeTimingArc(TimingArcSet *set, - const Transition *from_rf, - const Transition *to_rf, - TimingModel *model); + TimingArc *makeTimingArc(TimingArcSet *set, + const Transition *from_rf, + const Transition *to_rf, + TimingModel *model); TimingArc *makeTimingArc(TimingArcSet *set, const RiseFall *from_rf, const RiseFall *to_rf, diff --git a/liberty/LibertyExt.cc b/liberty/LibertyExt.cc index d45a7420..32c10b5e 100644 --- a/liberty/LibertyExt.cc +++ b/liberty/LibertyExt.cc @@ -42,8 +42,8 @@ using sta::Report; using sta::Debug; using sta::Network; using sta::LibertyReader; -using sta::LibertyAttr; using sta::LibertyGroup; +using sta::LibertySimpleAttr; using sta::TimingGroup; using sta::LibertyCell; using sta::LibertyPort; @@ -164,13 +164,6 @@ class BigcoLibertyBuilder : public LibertyBuilder public: virtual LibertyCell *makeCell(LibertyLibrary *library, const char *name, const char *filename); - -protected: - virtual TimingArcSet *makeTimingArcSet(LibertyCell *cell, LibertyPort *from, - LibertyPort *to, - LibertyPort *related_out, - const TimingRole *role, - TimingArcAttrsPtr attrs) override; }; LibertyCell * @@ -182,16 +175,6 @@ BigcoLibertyBuilder::makeCell(LibertyLibrary *library, const char *name, return cell; } -TimingArcSet * -BigcoLibertyBuilder::makeTimingArcSet(LibertyCell *cell, LibertyPort *from, - LibertyPort *to, - LibertyPort *related_out, - const TimingRole *role, - TimingArcAttrsPtr attrs) -{ - return cell->makeTimingArcSet(from, to, related_out, role, attrs); -} - //////////////////////////////////////////////////////////////// // Liberty reader to parse Bigco attributes. @@ -201,22 +184,18 @@ public: BigcoLibertyReader(LibertyBuilder *builder); protected: - virtual void visitAttr1(LibertyAttr *attr); - virtual void visitAttr2(LibertyAttr *attr); - virtual void beginLibrary(LibertyGroup *group); + virtual void visitAttr1(const LibertySimpleAttr *attr); + virtual void visitAttr2(const LibertySimpleAttr *attr); + virtual void beginLibrary(const LibertyGroup *group, + const LibertyGroup *library_group); virtual TimingGroup *makeTimingGroup(int line); - virtual void beginCell(LibertyGroup *group); + virtual void beginCell(const LibertyGroup *group, + const LibertyGroup *library_group); }; BigcoLibertyReader::BigcoLibertyReader(LibertyBuilder *builder) : LibertyReader(builder) { - // Define a visitor for the "thingy" attribute. - // Note that the function descriptor passed to defineAttrVisitor - // must be defined by the LibertyVisitor class, so a number of - // extra visitor functions are pre-defined for extensions. - defineAttrVisitor("thingy", &LibertyReader::visitAttr1); - defineAttrVisitor("frob", &LibertyReader::visitAttr2); } bool @@ -228,12 +207,13 @@ libertyCellRequired(const char *) // Prune cells from liberty file based on libertyCellRequired predicate. void -BigcoLibertyReader::beginCell(LibertyGroup *group) +BigcoLibertyReader::beginCell(const LibertyGroup *group, + const LibertyGroup *library_group) { const char *name = group->firstName(); if (name && libertyCellRequired(name)) - LibertyReader::beginCell(group); + LibertyReader::beginCell(group, library_group); } TimingGroup * @@ -244,15 +224,16 @@ BigcoLibertyReader::makeTimingGroup(int line) // Called at the beginning of a library group. void -BigcoLibertyReader::beginLibrary(LibertyGroup *group) +BigcoLibertyReader::beginLibrary(const LibertyGroup *group, + const LibertyGroup *library_group) { - LibertyReader::beginLibrary(group); + LibertyReader::beginLibrary(group, library_group); // Do Bigco stuff here. printf("Bigco was here.\n"); } void -BigcoLibertyReader::visitAttr1(LibertyAttr *attr) +BigcoLibertyReader::visitAttr1(const LibertySimpleAttr *attr) { const char *thingy = getAttrString(attr); if (thingy) { @@ -263,7 +244,7 @@ BigcoLibertyReader::visitAttr1(LibertyAttr *attr) } void -BigcoLibertyReader::visitAttr2(LibertyAttr *attr) +BigcoLibertyReader::visitAttr2(const LibertySimpleAttr *attr) { const char *frob = getAttrString(attr); if (frob) { diff --git a/liberty/LibertyLex.ll b/liberty/LibertyLex.ll index 6df7d07b..22edd696 100644 --- a/liberty/LibertyLex.ll +++ b/liberty/LibertyLex.ll @@ -87,14 +87,14 @@ EOL \r?\n {FLOAT}{TOKEN_END} { /* Push back the TOKEN_END character. */ yyless(yyleng - 1); - yylval->emplace(strtod(yytext, nullptr)); + yylval->emplace(strtof(yytext, nullptr)); return token::FLOAT; } {ALPHA}({ALPHA}|_|{DIGIT})*{TOKEN_END} { /* Push back the TOKEN_END character. */ yyless(yyleng - 1); - yylval->emplace(yytext); + yylval->emplace(yytext, yyleng); return token::KEYWORD; } @@ -107,7 +107,7 @@ EOL \r?\n {TOKEN}{TOKEN_END} { /* Push back the TOKEN_END character. */ yyless(yyleng - 1); - yylval->emplace(yytext); + yylval->emplace(yytext, yyleng); return token::STRING; } @@ -141,7 +141,7 @@ EOL \r?\n {EOL} { error("unterminated string constant"); BEGIN(INITIAL); - yylval->emplace(token_); + yylval->emplace(token_); return token::STRING; } diff --git a/liberty/LibertyParse.yy b/liberty/LibertyParse.yy index 7423c4fe..a3d4b715 100644 --- a/liberty/LibertyParse.yy +++ b/liberty/LibertyParse.yy @@ -52,7 +52,7 @@ sta::LibertyParse::error(const location_type &loc, %require "3.2" %skeleton "lalr1.cc" -%debug +//%debug %define api.namespace {sta} %locations %define api.location.file "LibertyLocation.hh" @@ -72,7 +72,7 @@ sta::LibertyParse::error(const location_type &loc, %left '^' %left '!' -%type statement complex_attr simple_attr variable group file +%type statement complex_attr simple_attr variable group file %type attr_values %type attr_value %type string expr expr_term expr_term1 volt_expr @@ -158,11 +158,11 @@ string: attr_value: FLOAT - { $$ = reader->makeFloatAttrValue($1); } + { $$ = reader->makeAttrValueFloat($1); } | expr - { $$ = reader->makeStringAttrValue(std::move($1)); } + { $$ = reader->makeAttrValueString(std::move($1)); } | volt_expr - { $$ = reader->makeStringAttrValue(std::move($1)); } + { $$ = reader->makeAttrValueString(std::move($1)); } ; /* Voltage expressions are ignored. */ diff --git a/liberty/LibertyParser.cc b/liberty/LibertyParser.cc index 9cf52702..4660aa42 100644 --- a/liberty/LibertyParser.cc +++ b/liberty/LibertyParser.cc @@ -70,21 +70,23 @@ LibertyParser::setFilename(const string &filename) filename_ = filename; } -LibertyStmt * -LibertyParser::makeDefine(LibertyAttrValueSeq *values, +LibertyDefine * +LibertyParser::makeDefine(const LibertyAttrValueSeq *values, int line) { LibertyDefine *define = nullptr; if (values->size() == 3) { - std::string define_name = (*values)[0]->stringValue(); + const std::string &define_name = (*values)[0]->stringValue(); const std::string &group_type_name = (*values)[1]->stringValue(); const std::string &value_type_name = (*values)[2]->stringValue(); - LibertyAttrType value_type = attrValueType(value_type_name.c_str()); - LibertyGroupType group_type = groupType(group_type_name.c_str()); - define = new LibertyDefine(std::move(define_name), group_type, - value_type, line); + LibertyAttrType value_type = attrValueType(value_type_name); + LibertyGroupType group_type = groupType(group_type_name); + define = new LibertyDefine(std::move(define_name), group_type, value_type, line); LibertyGroup *group = this->group(); - group->addStmt(define); + group->addDefine(define); + for (auto value : *values) + delete value; + delete values; } else report_->fileWarn(24, filename_.c_str(), line, @@ -96,42 +98,47 @@ LibertyParser::makeDefine(LibertyAttrValueSeq *values, // used to define valid attribute types. Beyond "string" these are // guesses. LibertyAttrType -LibertyParser::attrValueType(const char *value_type_name) +LibertyParser::attrValueType(const std::string &value_type_name) { - if (stringEq(value_type_name, "string")) + if (value_type_name == "string") return LibertyAttrType::attr_string; - else if (stringEq(value_type_name, "integer")) + else if (value_type_name == "integer") return LibertyAttrType::attr_int; - else if (stringEq(value_type_name, "float")) + else if (value_type_name == "float") return LibertyAttrType::attr_double; - else if (stringEq(value_type_name, "boolean")) + else if (value_type_name == "boolean") return LibertyAttrType::attr_boolean; else return LibertyAttrType::attr_unknown; } LibertyGroupType -LibertyParser::groupType(const char *group_type_name) +LibertyParser::groupType(const std::string &group_type_name) { - if (stringEq(group_type_name, "library")) + if (group_type_name == "library") return LibertyGroupType::library; - else if (stringEq(group_type_name, "cell")) + else if (group_type_name == "cell") return LibertyGroupType::cell; - else if (stringEq(group_type_name, "pin")) + else if (group_type_name == "pin") return LibertyGroupType::pin; - else if (stringEq(group_type_name, "timing")) + else if (group_type_name == "timing") return LibertyGroupType::timing; else return LibertyGroupType::unknown; } void -LibertyParser::groupBegin(std::string type, +LibertyParser::groupBegin(const std::string type, LibertyAttrValueSeq *params, int line) { - LibertyGroup *group = new LibertyGroup(std::move(type), params, line); - group_visitor_->begin(group); + LibertyGroup *group = + new LibertyGroup(std::move(type), + params ? std::move(*params) : LibertyAttrValueSeq(), + line); + delete params; + LibertyGroup *parent_group = group_stack_.empty() ? nullptr : group_stack_.back(); + group_visitor_->begin(group, parent_group); group_stack_.push_back(group); } @@ -139,20 +146,13 @@ LibertyGroup * LibertyParser::groupEnd() { LibertyGroup *group = this->group(); - group_visitor_->end(group); group_stack_.pop_back(); LibertyGroup *parent = group_stack_.empty() ? nullptr : group_stack_.back(); - if (parent && group_visitor_->save(group)) { - parent->addStmt(group); - return group; - } - else if (group_visitor_->save(group)) - return group; - else { - delete group; - return nullptr; - } + if (parent) + parent->addSubgroup(group); + group_visitor_->end(group, parent); + return group; } LibertyGroup * @@ -167,240 +167,65 @@ LibertyParser::deleteGroups() deleteContents(group_stack_); } -LibertyStmt * -LibertyParser::makeSimpleAttr(std::string name, - LibertyAttrValue *value, +LibertySimpleAttr * +LibertyParser::makeSimpleAttr(const std::string name, + const LibertyAttrValue *value, int line) { - LibertyAttr *attr = new LibertySimpleAttr(std::move(name), value, line); - group_visitor_->visitAttr(attr); + LibertySimpleAttr *attr = new LibertySimpleAttr(std::move(name), + std::move(*value), line); + delete value; LibertyGroup *group = this->group(); - if (group && group_visitor_->save(attr)) { - group->addStmt(attr); - return attr; - } - else { - delete attr; - return nullptr; - } + group->addAttr(attr); + group_visitor_->visitAttr(attr); + return attr; } -LibertyStmt * -LibertyParser::makeComplexAttr(std::string name, - LibertyAttrValueSeq *values, +LibertyComplexAttr * +LibertyParser::makeComplexAttr(const std::string name, + const LibertyAttrValueSeq *values, int line) { // Defines have the same syntax as complex attributes. // Detect and convert them. if (name == "define") { - LibertyStmt *define = makeDefine(values, line); - deleteContents(values); - delete values; - return define; + makeDefine(values, line); + return nullptr; // Define is not a complex attr; already added to group } else { - LibertyAttr *attr = new LibertyComplexAttr(std::move(name), values, line); + LibertyComplexAttr *attr = new LibertyComplexAttr(std::move(name), + std::move(*values), + line); + delete values; + LibertyGroup *group = this->group(); + group->addAttr(attr); group_visitor_->visitAttr(attr); - if (group_visitor_->save(attr)) { - LibertyGroup *group = this->group(); - group->addStmt(attr); - return attr; - } - delete attr; - return nullptr; + return attr; } } -LibertyStmt * -LibertyParser::makeVariable(std::string var, +LibertyVariable * +LibertyParser::makeVariable(const std::string var, float value, int line) { LibertyVariable *variable = new LibertyVariable(std::move(var), value, line); + LibertyGroup *group = this->group(); + group->addVariable(variable); group_visitor_->visitVariable(variable); - if (group_visitor_->save(variable)) - return variable; - else { - delete variable; - return nullptr; - } + return variable; } LibertyAttrValue * -LibertyParser::makeStringAttrValue(std::string value) +LibertyParser::makeAttrValueString(std::string value) { - return new LibertyStringAttrValue(std::move(value)); + return new LibertyAttrValue(std::move(value)); } LibertyAttrValue * -LibertyParser::makeFloatAttrValue(float value) -{ - return new LibertyFloatAttrValue(value); -} - -const std::string & -LibertyFloatAttrValue::stringValue() const -{ - criticalError(1127, "LibertyStringAttrValue called for float value"); - static std::string null; - return null; -} - -//////////////////////////////////////////////////////////////// - -LibertyStmt::LibertyStmt(int line) : - line_(line) -{ -} - -LibertyGroup::LibertyGroup(std::string type, - LibertyAttrValueSeq *params, - int line) : - LibertyStmt(line), - type_(std::move(type)), - params_(params), - stmts_(nullptr) -{ -} - -void -LibertyGroup::addStmt(LibertyStmt *stmt) -{ - if (stmts_ == nullptr) - stmts_ = new LibertyStmtSeq; - stmts_->push_back(stmt); -} - -LibertyGroup::~LibertyGroup() -{ - if (params_) { - deleteContents(params_); - delete params_; - } - if (stmts_) { - deleteContents(stmts_); - delete stmts_; - } -} - -const char * -LibertyGroup::firstName() -{ - if (params_ && params_->size() > 0) { - LibertyAttrValue *value = (*params_)[0]; - if (value->isString()) - return value->stringValue().c_str(); - } - return nullptr; -} - -const char * -LibertyGroup::secondName() -{ - if (params_ && params_->size() > 1) { - LibertyAttrValue *value = (*params_)[1]; - if (value->isString()) - return value->stringValue().c_str(); - } - return nullptr; -} - -//////////////////////////////////////////////////////////////// - -LibertyAttr::LibertyAttr(std::string name, - int line) : - LibertyStmt(line), - name_(std::move(name)) -{ -} - -LibertySimpleAttr::LibertySimpleAttr(std::string name, - LibertyAttrValue *value, - int line) : - LibertyAttr(std::move(name), line), - value_(value) -{ -} - -LibertySimpleAttr::~LibertySimpleAttr() -{ - delete value_; -} - -LibertyAttrValueSeq * -LibertySimpleAttr::values() const -{ - criticalError(1125, "valueIterator called for LibertySimpleAttribute"); - return nullptr; -} - -//////////////////////////////////////////////////////////////// - -LibertyComplexAttr::LibertyComplexAttr(std::string name, - LibertyAttrValueSeq *values, - int line) : - LibertyAttr(std::move(name), line), - values_(values) -{ -} - -LibertyComplexAttr::~LibertyComplexAttr() -{ - if (values_) { - deleteContents(values_); - delete values_; - } -} - -LibertyAttrValue * -LibertyComplexAttr::firstValue() -{ - if (values_ && values_->size() > 0) - return (*values_)[0]; - else - return nullptr; -} - -LibertyStringAttrValue::LibertyStringAttrValue(std::string value) : - LibertyAttrValue(), - value_(std::move(value)) -{ -} - -float -LibertyStringAttrValue::floatValue() const -{ - criticalError(1126, "LibertyStringAttrValue called for float value"); - return 0.0; -} - -LibertyFloatAttrValue::LibertyFloatAttrValue(float value) : - value_(value) -{ -} - -//////////////////////////////////////////////////////////////// - -LibertyDefine::LibertyDefine(std::string name, - LibertyGroupType group_type, - LibertyAttrType value_type, - int line) : - LibertyStmt(line), - name_(std::move(name)), - group_type_(group_type), - value_type_(value_type) -{ -} - -//////////////////////////////////////////////////////////////// - -LibertyVariable::LibertyVariable(std::string var, - float value, - int line) : - LibertyStmt(line), - var_(std::move(var)), - value_(value) +LibertyParser::makeAttrValueFloat(float value) { + return new LibertyAttrValue(value); } //////////////////////////////////////////////////////////////// @@ -425,13 +250,13 @@ LibertyScanner::includeBegin() error("nested include_file's are not supported"); else { // include_file(filename); - std::regex include_regexp("include_file *\\( *([^)]+) *\\) *;?"); + static const std::regex include_regexp("include_file *\\( *([^)]+) *\\) *;?"); std::cmatch matches; if (std::regex_match(yytext, matches, include_regexp)) { string filename = matches[1].str(); gzstream::igzstream *stream = new gzstream::igzstream(filename.c_str()); if (stream->is_open()) { - yypush_buffer_state(yy_create_buffer(stream, 256)); + yypush_buffer_state(yy_create_buffer(stream, 16384)); filename_prev_ = filename_; stream_prev_ = stream_; @@ -471,4 +296,323 @@ LibertyScanner::error(const char *msg) report_->fileError(1866, filename_.c_str(), lineno(), "%s", msg); } +//////////////////////////////////////////////////////////////// + +LibertyGroup::LibertyGroup(std::string type, + LibertyAttrValueSeq params, + int line) : + type_(std::move(type)), + params_(std::move(params)), + line_(line) +{ +} + +LibertyGroup::~LibertyGroup() +{ + clear(); +} + +void +LibertyGroup::clear() +{ + deleteContents(params_); + deleteContents(simple_attr_map_); + for (auto &attr : complex_attr_map_) + deleteContents(attr.second); + complex_attr_map_.clear(); + deleteContents(subgroups_); + subgroup_map_.clear(); + deleteContents(define_map_); + deleteContents(variables_); +} + +void +LibertyGroup::addSubgroup(LibertyGroup *subgroup) +{ + subgroups_.push_back(subgroup); + subgroup_map_[subgroup->type()].push_back(subgroup); +} + +void +LibertyGroup::deleteSubgroup(const LibertyGroup *subgroup) +{ + if (subgroup == subgroups_.back()) { + subgroups_.pop_back(); + subgroup_map_[subgroup->type()].pop_back(); + delete subgroup; + } + else + criticalError(1128, "LibertyAttrValue::floatValue() called on string"); +} + +void +LibertyGroup::addDefine(LibertyDefine *define) +{ + const string &define_name = define->name(); + LibertyDefine *prev_define = findKey(define_map_, define_name); + if (prev_define) { + define_map_.erase(define_name); + delete prev_define; + } + define_map_[define_name] = define; +} + +void +LibertyGroup::addAttr(LibertySimpleAttr *attr) +{ + // Only keep the most recent simple attribute value. + const auto &itr = simple_attr_map_.find(attr->name()); + if (itr != simple_attr_map_.end()) + delete itr->second; + simple_attr_map_[attr->name()] = attr; +} + +void +LibertyGroup::addAttr(LibertyComplexAttr *attr) +{ + complex_attr_map_[attr->name()].push_back(attr); +} + +void +LibertyGroup::addVariable(LibertyVariable *var) +{ + variables_.push_back(var); +} + +const char * +LibertyGroup::firstName() const +{ + if (params_.size() >= 1) { + LibertyAttrValue *value = params_[0]; + if (value->isString()) + return value->stringValue().c_str(); + } + return nullptr; +} + +const char * +LibertyGroup::secondName() const +{ + LibertyAttrValue *value = params_[1]; + if (value->isString()) + return value->stringValue().c_str(); + else + return nullptr; +} + +const LibertyGroupSeq & +LibertyGroup::findSubgroups(const std::string type) const +{ + return findKeyValue(subgroup_map_, type); +} + +const LibertyGroup * +LibertyGroup::findSubgroup(const std::string type) const +{ + const LibertyGroupSeq &groups = findKeyValue(subgroup_map_, type); + if (groups.size() >= 1) + return groups[0]; + else + return nullptr; +} + +const LibertySimpleAttr * +LibertyGroup::findSimpleAttr(const std::string attr_name) const +{ + return findKeyValue(simple_attr_map_, attr_name); +} + +const LibertyComplexAttrSeq & +LibertyGroup::findComplexAttrs(const std::string attr_name) const +{ + return findKeyValue(complex_attr_map_, attr_name); +} + +const LibertyComplexAttr * +LibertyGroup::findComplexAttr(const std::string attr_name) const +{ + const LibertyComplexAttrSeq &attrs = findKeyValue(complex_attr_map_, attr_name); + if (attrs.size() >= 1) + return attrs[0]; + else + return nullptr; +} + +const std::string * +LibertyGroup::findAttrString(const std::string attr_name) const +{ + const LibertySimpleAttr *attr = findSimpleAttr(attr_name); + if (attr) + return &attr->value().stringValue(); + else + return nullptr; +} + +void +LibertyGroup::findAttrFloat(const std::string attr_name, + // Return values. + float &value, + bool &exists) const +{ + const LibertySimpleAttr *attr = findSimpleAttr(attr_name); + if (attr) { + const LibertyAttrValue &attr_value = attr->value(); + if (attr_value.isFloat()) { + value = attr_value.floatValue(); + exists = true; + return; + } + else { + // Possibly quoted string float. + const std::string &float_str = attr_value.stringValue(); + char *end = nullptr; + value = std::strtof(float_str.c_str(), &end); + if (end) { + exists = true; + return; + } + } + } + exists = false; +} + +void +LibertyGroup::findAttrInt(const std::string attr_name, + // Return values. + int &value, + bool &exists) const +{ + const LibertySimpleAttr *attr = findSimpleAttr(attr_name); + if (attr) { + const LibertyAttrValue &attr_value = attr->value(); + if (attr_value.isFloat()) { + value = static_cast(attr_value.floatValue()); + exists = true; + return; + } + } + exists = false; +} + +//////////////////////////////////////////////////////////////// + +LibertySimpleAttr::LibertySimpleAttr(const std::string name, + const LibertyAttrValue value, + int line) : + name_(std::move(name)), + line_(line), + value_(std::move(value)) +{ +} + +const std::string * +LibertySimpleAttr::stringValue() const +{ + return &value().stringValue(); +} + +//////////////////////////////////////////////////////////////// + +LibertyComplexAttr::LibertyComplexAttr(std::string name, + const LibertyAttrValueSeq values, + int line) : + name_(std::move(name)), + values_(std::move(values)), + line_(line) +{ +} + +LibertyComplexAttr::~LibertyComplexAttr() +{ + deleteContents(values_); +} + +const LibertyAttrValue * +LibertyComplexAttr::firstValue() const +{ + if (values_.size() > 0) + return values_[0]; + else + return nullptr; +} + +//////////////////////////////////////////////////////////////// + +LibertyAttrValue::LibertyAttrValue(std::string value) : + string_value_(std::move(value)) +{ +} + +LibertyAttrValue::LibertyAttrValue(float value) : + float_value_(value) +{ +} + +bool +LibertyAttrValue::isFloat() const +{ + return string_value_.empty(); +} + +bool +LibertyAttrValue::isString() const +{ + return !string_value_.empty(); +} + +float +LibertyAttrValue::floatValue() const +{ + if (!string_value_.empty()) + criticalError(1127, "LibertyAttrValue::floatValue() called on string"); + return float_value_; +} + +void +LibertyAttrValue::floatValue(// Return values. + float &value, + bool &valid) const +{ + valid = false; + if (string_value_.empty()) { + value = float_value_; + valid = true; + } + else { + // Some floats are enclosed in quotes. + char *end; + value = strtof(string_value_.c_str(), &end); + if ((*end == '\0' + || isspace(*end)) + // strtof support INF as a valid float. + && string_value_ != "inf") { + valid = true; + } + } +} + +//////////////////////////////////////////////////////////////// + +LibertyDefine::LibertyDefine(std::string name, + LibertyGroupType group_type, + LibertyAttrType value_type, + int line) : + name_(std::move(name)), + group_type_(group_type), + value_type_(value_type), + line_(line) +{ +} + +//////////////////////////////////////////////////////////////// + +LibertyVariable::LibertyVariable(std::string var, + float value, + int line) : + var_(std::move(var)), + value_(value), + line_(line) +{ +} + } // namespace diff --git a/liberty/LibertyParser.hh b/liberty/LibertyParser.hh index e27d859a..2f533c36 100644 --- a/liberty/LibertyParser.hh +++ b/liberty/LibertyParser.hh @@ -34,20 +34,22 @@ namespace sta { class Report; class LibertyGroupVisitor; -class LibertyStmt; class LibertyGroup; -class LibertyAttr; class LibertyDefine; +class LibertySimpleAttr; +class LibertyComplexAttr; class LibertyAttrValue; class LibertyVariable; class LibertyScanner; -using LibertyStmtSeq = std::vector; using LibertyGroupSeq = std::vector; -using LibertyAttrSeq = std::vector; -using LibertyAttrMap = std::map; +using LibertySubGroupMap = std::map; +using LibertySimpleAttrMap = std::map; +using LibertyComplexAttrSeq = std::vector; +using LibertyComplexAttrMap = std::map; using LibertyDefineMap = std::map; using LibertyAttrValueSeq = std::vector; +using LibertyVariableSeq = std::vector; using LibertyVariableMap = std::map; using LibertyGroupVisitorMap = std::map; @@ -65,27 +67,27 @@ public: const std::string &filename() const { return filename_; } void setFilename(const std::string &filename); Report *report() const { return report_; } - LibertyStmt *makeDefine(LibertyAttrValueSeq *values, - int line); - LibertyAttrType attrValueType(const char *value_type_name); - LibertyGroupType groupType(const char *group_type_name); - void groupBegin(std::string type, + LibertyDefine *makeDefine(const LibertyAttrValueSeq *values, + int line); + LibertyAttrType attrValueType(const std::string &value_type_name); + LibertyGroupType groupType(const std::string &group_type_name); + void groupBegin(const std::string type, LibertyAttrValueSeq *params, int line); LibertyGroup *groupEnd(); LibertyGroup *group(); void deleteGroups(); - LibertyStmt *makeSimpleAttr(std::string name, - LibertyAttrValue *value, - int line); - LibertyStmt *makeComplexAttr(std::string name, - LibertyAttrValueSeq *values, - int line); - LibertyAttrValue *makeStringAttrValue(std::string value); - LibertyAttrValue *makeFloatAttrValue(float value); - LibertyStmt *makeVariable(std::string var, - float value, - int line); + LibertySimpleAttr *makeSimpleAttr(const std::string name, + const LibertyAttrValue *value, + int line); + LibertyComplexAttr *makeComplexAttr(const std::string name, + const LibertyAttrValueSeq *values, + int line); + LibertyAttrValue *makeAttrValueString(const std::string value); + LibertyAttrValue *makeAttrValueFloat(float value); + LibertyVariable *makeVariable(const std::string var, + float value, + int line); private: std::string filename_; @@ -94,178 +96,171 @@ private: LibertyGroupSeq group_stack_; }; -// Abstract base class for liberty statements. -class LibertyStmt -{ -public: - LibertyStmt(int line); - virtual ~LibertyStmt() {} - int line() const { return line_; } - virtual bool isGroup() const { return false; } - virtual bool isAttribute() const { return false; } - virtual bool isSimpleAttr() const { return false; } - virtual bool isComplexAttr() const { return false; } - virtual bool isDefine() const { return false; } - virtual bool isVariable() const { return false; } - -protected: - int line_; -}; - -// Groups are a type keyword with a set of parameters and statements -// enclosed in brackets. -// type([param1][, param2]...) { stmts.. } -class LibertyGroup : public LibertyStmt -{ -public: - LibertyGroup(std::string type, - LibertyAttrValueSeq *params, - int line); - virtual ~LibertyGroup(); - virtual bool isGroup() const { return true; } - const std::string &type() const { return type_; } - LibertyAttrValueSeq *params() const { return params_; } - // First param as a string. - const char *firstName(); - // Second param as a string. - const char *secondName(); - void addStmt(LibertyStmt *stmt); - LibertyStmtSeq *stmts() const { return stmts_; } - -protected: - void parseNames(LibertyAttrValueSeq *values); - - std::string type_; - LibertyAttrValueSeq *params_; - LibertyStmtSeq *stmts_; -}; - -// Abstract base class for attributes. -class LibertyAttr : public LibertyStmt -{ -public: - LibertyAttr(std::string name, - int line); - const std::string &name() const { return name_; } - virtual LibertyAttrValueSeq *values() const = 0; - virtual LibertyAttrValue *firstValue() = 0; - -protected: - std::string name_; -}; - -// Abstract base class for simple attributes. -// name : value; -class LibertySimpleAttr : public LibertyAttr -{ -public: - LibertySimpleAttr(std::string name, - LibertyAttrValue *value, - int line); - virtual ~LibertySimpleAttr(); - bool isSimpleAttr() const override { return true; }; - LibertyAttrValue *firstValue() override { return value_; }; - LibertyAttrValueSeq *values() const override; - -private: - LibertyAttrValue *value_; -}; - -// Complex attributes have multiple values. -// name(attr_value1[, attr_value2]...); -class LibertyComplexAttr : public LibertyAttr -{ -public: - LibertyComplexAttr(std::string name, - LibertyAttrValueSeq *values, - int line); - virtual ~LibertyComplexAttr(); - bool isComplexAttr() const override { return true; }; - LibertyAttrValue *firstValue() override ; - LibertyAttrValueSeq *values() const override { return values_; } - -private: - LibertyAttrValueSeq *values_; -}; - // Attribute values are a string or float. class LibertyAttrValue { public: LibertyAttrValue() {} - virtual ~LibertyAttrValue() {} - virtual bool isString() const = 0; - virtual bool isFloat() const = 0; - virtual float floatValue() const = 0; - virtual const std::string &stringValue() const = 0; -}; - -class LibertyStringAttrValue : public LibertyAttrValue -{ -public: - LibertyStringAttrValue(std::string value); - virtual ~LibertyStringAttrValue() {} - bool isFloat() const override { return false; } - bool isString() const override { return true; } - float floatValue() const override ; - const std::string &stringValue() const override { return value_; } + LibertyAttrValue(float value); + LibertyAttrValue(std::string value); + bool isString() const; + bool isFloat() const; + float floatValue() const; + void floatValue(// Return values. + float &value, + bool &valid) const; + const std::string &stringValue() const { return string_value_; } private: - std::string value_; + float float_value_; + std::string string_value_; }; -class LibertyFloatAttrValue : public LibertyAttrValue +// Groups are a type keyword with a set of parameters and statements +// enclosed in brackets. +// type([param1][, param2]...) { stmts.. } +class LibertyGroup { public: - LibertyFloatAttrValue(float value); - virtual ~LibertyFloatAttrValue() {} - bool isString() const override { return false; } - bool isFloat() const override { return true; } - float floatValue() const override { return value_; } - const std::string &stringValue() const override; + LibertyGroup(const std::string type, + const LibertyAttrValueSeq params, + int line); + ~LibertyGroup(); + void clear(); + const std::string &type() const { return type_; } + const LibertyAttrValueSeq ¶ms() const { return params_; } + // First param as a string. + const char *firstName() const; + // Second param as a string. + const char *secondName() const; + int line() const { return line_; } + + const LibertyGroupSeq &findSubgroups(const std::string type) const; + const LibertyGroup *findSubgroup(const std::string type) const; + const LibertySimpleAttr *findSimpleAttr(const std::string attr_name) const; + const LibertyComplexAttrSeq &findComplexAttrs(const std::string attr_name) const; + const LibertyComplexAttr *findComplexAttr(const std::string attr_name) const; + const std::string *findAttrString(const std::string attr_name) const; + void findAttrFloat(const std::string attr_name, + // Return values. + float &value, + bool &exists) const; + void findAttrInt(const std::string attr_name, + // Return values. + int &value, + bool &exists) const; + + const LibertyGroupSeq &subgroups() const { return subgroups_; } + const LibertyDefineMap &defineMap() const { return define_map_; } + + void addSubgroup(LibertyGroup *subgroup); + void deleteSubgroup(const LibertyGroup *subgroup); + void addAttr(LibertySimpleAttr *attr); + void addAttr(LibertyComplexAttr *attr); + void addDefine(LibertyDefine *define); + void addVariable(LibertyVariable *var); + +protected: + std::string type_; + LibertyAttrValueSeq params_; + int line_; + + LibertySimpleAttrMap simple_attr_map_; + LibertyComplexAttrMap complex_attr_map_; + LibertyGroupSeq subgroups_; + LibertySubGroupMap subgroup_map_; + LibertyDefineMap define_map_; + LibertyVariableSeq variables_; +}; + +class LibertyGroupLineLess +{ +public: + bool + operator()(const LibertyGroup *group1, + const LibertyGroup *group2) const { + return group1->line() < group2->line(); + } +}; + +// Simple attributes: name : value; +class LibertySimpleAttr +{ +public: + LibertySimpleAttr(const std::string name, + const LibertyAttrValue value, + int line); + const std::string &name() const { return name_; } + const LibertyAttrValue &value() const { return value_; }; + const std::string *stringValue() const; + int line() const { return line_; } private: - float value_; + std::string name_; + int line_; + LibertyAttrValue value_; +}; + +// Complex attributes have multiple values. +// name(attr_value1[, attr_value2]...); +class LibertyComplexAttr +{ +public: + LibertyComplexAttr(const std::string name, + const LibertyAttrValueSeq values, + int line); + ~LibertyComplexAttr(); + const std::string &name() const { return name_; } + const LibertyAttrValue *firstValue() const; + const LibertyAttrValueSeq &values() const { return values_; } + int line() const { return line_; } + +private: + std::string name_; + LibertyAttrValueSeq values_; + int line_; }; // Define statements define new simple attributes. // define(attribute_name, group_name, attribute_type); // attribute_type is string|integer|float. -class LibertyDefine : public LibertyStmt +class LibertyDefine { public: LibertyDefine(std::string name, LibertyGroupType group_type, LibertyAttrType value_type, int line); - virtual bool isDefine() const { return true; } const std::string &name() const { return name_; } LibertyGroupType groupType() const { return group_type_; } LibertyAttrType valueType() const { return value_type_; } + int line() const { return line_; } private: std::string name_; LibertyGroupType group_type_; LibertyAttrType value_type_; + int line_; }; // The Liberty User Guide Version 2003.12 fails to document variables. // var = value; // The only example I have only uses float values, so I am assuming // that is all that is supported (which is probably wrong). -class LibertyVariable : public LibertyStmt +class LibertyVariable { public: LibertyVariable(std::string var, float value, int line); - bool isVariable() const override { return true; } + int line() const { return line_; } const std::string &variable() const { return var_; } float value() const { return value_; } private: std::string var_; float value_; + int line_; }; class LibertyGroupVisitor @@ -273,14 +268,13 @@ class LibertyGroupVisitor public: LibertyGroupVisitor() {} virtual ~LibertyGroupVisitor() {} - virtual void begin(LibertyGroup *group) = 0; - virtual void end(LibertyGroup *group) = 0; - virtual void visitAttr(LibertyAttr *attr) = 0; + virtual void begin(const LibertyGroup *group, + LibertyGroup *parent_group) = 0; + virtual void end(const LibertyGroup *group, + LibertyGroup *parent_group) = 0; + virtual void visitAttr(const LibertySimpleAttr *attr) = 0; + virtual void visitAttr(const LibertyComplexAttr *attr) = 0; virtual void visitVariable(LibertyVariable *variable) = 0; - // Predicates to save parse structure after visits. - virtual bool save(LibertyGroup *group) = 0; - virtual bool save(LibertyAttr *attr) = 0; - virtual bool save(LibertyVariable *variable) = 0; }; void diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index edcde894..974ab7ec 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -26,6 +26,7 @@ #include #include +#include #include #include "ContainerHelpers.hh" @@ -55,9 +56,6 @@ extern int LibertyParse_debug; namespace sta { -using std::make_shared; -using std::string; - static void scaleFloats(FloatSeq &floats, float scale); @@ -74,76 +72,19 @@ readLibertyFile(const char *filename, LibertyReader::LibertyReader(const char *filename, bool infer_latches, Network *network) : - LibertyGroupVisitor() + LibertyGroupVisitor(), + filename_(filename), + infer_latches_(infer_latches), + report_(network->report()), + debug_(network->debug()), + network_(network), + builder_(debug_, report_), + library_(nullptr), + first_cell_(true) { - init(filename, infer_latches, network); defineVisitors(); } -void -LibertyReader::init(const char *filename, - bool infer_latches, - Network *network) -{ - filename_ = filename; - infer_latches_ = infer_latches; - report_ = network->report(); - debug_ = network->debug(); - network_ = network; - var_map_ = nullptr; - library_ = nullptr; - wireload_ = nullptr; - wireload_selection_ = nullptr; - default_wireload_ = nullptr; - default_wireload_selection_ = nullptr; - scale_factors_ = nullptr; - save_scale_factors_ = nullptr; - tbl_template_ = nullptr; - cell_ = nullptr; - save_cell_ = nullptr; - scaled_cell_owner_ = nullptr; - test_cell_ = nullptr; - ocv_derate_name_ = nullptr; - op_cond_ = nullptr; - ports_ = nullptr; - port_group_ = nullptr; - saved_ports_ = nullptr; - saved_port_group_ = nullptr; - in_bus_ = false; - in_bundle_ = false; - in_ccsn_ = false; - in_ecsm_waveform_ = false; - sequential_ = nullptr; - statetable_ = nullptr; - timing_ = nullptr; - internal_power_ = nullptr; - leakage_power_ = nullptr; - table_ = nullptr; - rf_ = nullptr; - index_ = 0; - table_model_scale_ = 1.0; - mode_def_ = nullptr; - mode_value_ = nullptr; - ocv_derate_ = nullptr; - pg_port_ = nullptr; - default_operating_condition_ = nullptr; - receiver_model_ = nullptr; - - builder_.init(debug_, report_); - - for (auto rf_index : RiseFall::rangeIndex()) { - have_input_threshold_[rf_index] = false; - have_output_threshold_[rf_index] = false; - have_slew_lower_threshold_[rf_index] = false; - have_slew_upper_threshold_[rf_index] = false; - } -} - -LibertyReader::~LibertyReader() -{ - delete var_map_; -} - LibertyLibrary * LibertyReader::readLibertyFile(const char *filename) { @@ -157,498 +98,179 @@ LibertyReader::defineGroupVisitor(const char *type, LibraryGroupVisitor begin_visitor, LibraryGroupVisitor end_visitor) { - group_begin_map_[type] = begin_visitor; - group_end_map_[type] = end_visitor; -} - -void -LibertyReader::defineAttrVisitor(const char *attr_name, - LibraryAttrVisitor visitor) -{ - attr_visitor_map_[attr_name] = visitor; + if (begin_visitor) + group_begin_map_[type] = begin_visitor; + if (end_visitor) + group_end_map_[type] = end_visitor; } void LibertyReader::defineVisitors() { - // Library defineGroupVisitor("library", &LibertyReader::beginLibrary, &LibertyReader::endLibrary); - defineAttrVisitor("time_unit", &LibertyReader::visitTimeUnit); - defineAttrVisitor("pulling_resistance_unit", - &LibertyReader::visitPullingResistanceUnit); - defineAttrVisitor("resistance_unit", &LibertyReader::visitResistanceUnit); - defineAttrVisitor("capacitive_load_unit", - &LibertyReader::visitCapacitiveLoadUnit); - defineAttrVisitor("voltage_unit", &LibertyReader::visitVoltageUnit); - defineAttrVisitor("current_unit", &LibertyReader::visitCurrentUnit); - defineAttrVisitor("leakage_power_unit", &LibertyReader::visitPowerUnit); - defineAttrVisitor("distance_unit", &LibertyReader::visitDistanceUnit); - defineAttrVisitor("delay_model", &LibertyReader::visitDelayModel); - defineAttrVisitor("bus_naming_style", &LibertyReader::visitBusStyle); - defineAttrVisitor("voltage_map", &LibertyReader::visitVoltageMap); - defineAttrVisitor("nom_temperature", &LibertyReader::visitNomTemp); - defineAttrVisitor("nom_voltage", &LibertyReader::visitNomVolt); - defineAttrVisitor("nom_process", &LibertyReader::visitNomProc); - defineAttrVisitor("default_inout_pin_cap", - &LibertyReader::visitDefaultInoutPinCap); - defineAttrVisitor("default_input_pin_cap", - &LibertyReader::visitDefaultInputPinCap); - defineAttrVisitor("default_output_pin_cap", - &LibertyReader::visitDefaultOutputPinCap); - defineAttrVisitor("default_max_transition", - &LibertyReader::visitDefaultMaxTransition); - defineAttrVisitor("default_max_fanout", - &LibertyReader::visitDefaultMaxFanout); - defineAttrVisitor("default_intrinsic_rise", - &LibertyReader::visitDefaultIntrinsicRise); - defineAttrVisitor("default_intrinsic_fall", - &LibertyReader::visitDefaultIntrinsicFall); - defineAttrVisitor("default_inout_pin_rise_res", - &LibertyReader::visitDefaultInoutPinRiseRes); - defineAttrVisitor("default_inout_pin_fall_res", - &LibertyReader::visitDefaultInoutPinFallRes); - defineAttrVisitor("default_output_pin_rise_res", - &LibertyReader::visitDefaultOutputPinRiseRes); - defineAttrVisitor("default_output_pin_fall_res", - &LibertyReader::visitDefaultOutputPinFallRes); - defineAttrVisitor("default_fanout_load", - &LibertyReader::visitDefaultFanoutLoad); - defineAttrVisitor("default_wire_load", - &LibertyReader::visitDefaultWireLoad); - defineAttrVisitor("default_wire_load_mode", - &LibertyReader::visitDefaultWireLoadMode); - defineAttrVisitor("default_wire_load_selection", - &LibertyReader::visitDefaultWireLoadSelection); - defineAttrVisitor("default_operating_conditions", - &LibertyReader::visitDefaultOperatingConditions); - defineAttrVisitor("input_threshold_pct_fall", - &LibertyReader::visitInputThresholdPctFall); - defineAttrVisitor("input_threshold_pct_rise", - &LibertyReader::visitInputThresholdPctRise); - defineAttrVisitor("output_threshold_pct_fall", - &LibertyReader::visitOutputThresholdPctFall); - defineAttrVisitor("output_threshold_pct_rise", - &LibertyReader::visitOutputThresholdPctRise); - defineAttrVisitor("slew_lower_threshold_pct_fall", - &LibertyReader::visitSlewLowerThresholdPctFall); - defineAttrVisitor("slew_lower_threshold_pct_rise", - &LibertyReader::visitSlewLowerThresholdPctRise); - defineAttrVisitor("slew_upper_threshold_pct_fall", - &LibertyReader::visitSlewUpperThresholdPctFall); - defineAttrVisitor("slew_upper_threshold_pct_rise", - &LibertyReader::visitSlewUpperThresholdPctRise); - defineAttrVisitor("slew_derate_from_library", - &LibertyReader::visitSlewDerateFromLibrary); - - defineGroupVisitor("lu_table_template", - &LibertyReader::beginTableTemplateDelay, - &LibertyReader::endTableTemplate); - defineGroupVisitor("output_current_template", - &LibertyReader::beginTableTemplateOutputCurrent, - &LibertyReader::endTableTemplate); - defineAttrVisitor("variable_1", &LibertyReader::visitVariable1); - defineAttrVisitor("variable_2", &LibertyReader::visitVariable2); - defineAttrVisitor("variable_3", &LibertyReader::visitVariable3); - defineAttrVisitor("index_1", &LibertyReader::visitIndex1); - defineAttrVisitor("index_2", &LibertyReader::visitIndex2); - defineAttrVisitor("index_3", &LibertyReader::visitIndex3); - - defineGroupVisitor("technology", - &LibertyReader::beginTechnology, - &LibertyReader::endTechnology); - defineGroupVisitor("rise_transition_degradation", - &LibertyReader::beginRiseTransitionDegredation, - &LibertyReader::endRiseFallTransitionDegredation); - defineGroupVisitor("fall_transition_degradation", - &LibertyReader::beginFallTransitionDegredation, - &LibertyReader::endRiseFallTransitionDegredation); - - defineGroupVisitor("type", &LibertyReader::beginType, - &LibertyReader::endType); - defineAttrVisitor("bit_from", &LibertyReader::visitBitFrom); - defineAttrVisitor("bit_to", &LibertyReader::visitBitTo); - - defineGroupVisitor("scaling_factors", &LibertyReader::beginScalingFactors, - &LibertyReader::endScalingFactors); - defineScalingFactorVisitors(); - - defineGroupVisitor("operating_conditions", &LibertyReader::beginOpCond, - &LibertyReader::endOpCond); - defineAttrVisitor("process", &LibertyReader::visitProc); - defineAttrVisitor("voltage", &LibertyReader::visitVolt); - defineAttrVisitor("temperature", &LibertyReader::visitTemp); - defineAttrVisitor("tree_type", &LibertyReader::visitTreeType); - - defineGroupVisitor("wire_load", &LibertyReader::beginWireload, - &LibertyReader::endWireload); - defineAttrVisitor("resistance", &LibertyReader::visitResistance); - defineAttrVisitor("slope", &LibertyReader::visitSlope); - defineAttrVisitor("fanout_length", &LibertyReader::visitFanoutLength); - - defineGroupVisitor("wire_load_selection", - &LibertyReader::beginWireloadSelection, - &LibertyReader::endWireloadSelection); - defineAttrVisitor("wire_load_from_area", - &LibertyReader::visitWireloadFromArea); - - // Cells - defineGroupVisitor("cell", &LibertyReader::beginCell, - &LibertyReader::endCell); - defineGroupVisitor("scaled_cell", &LibertyReader::beginScaledCell, - &LibertyReader::endScaledCell); - defineAttrVisitor("clock_gating_integrated_cell", - &LibertyReader::visitClockGatingIntegratedCell); - defineAttrVisitor("area", &LibertyReader::visitArea); - defineAttrVisitor("dont_use", &LibertyReader::visitDontUse); - defineAttrVisitor("is_macro_cell", &LibertyReader::visitIsMacro); - defineAttrVisitor("is_memory", &LibertyReader::visitIsMemory); - defineAttrVisitor("pad_cell", &LibertyReader::visitIsPadCell); - defineAttrVisitor("is_pad", &LibertyReader::visitIsPad); - defineAttrVisitor("is_clock_cell", &LibertyReader::visitIsClockCell); - defineAttrVisitor("is_level_shifter", &LibertyReader::visitIsLevelShifter); - defineAttrVisitor("level_shifter_type", &LibertyReader::visitLevelShifterType); - defineAttrVisitor("is_isolation_cell", &LibertyReader::visitIsIsolationCell); - defineAttrVisitor("always_on", &LibertyReader::visitAlwaysOn); - defineAttrVisitor("switch_cell_type", &LibertyReader::visitSwitchCellType); - defineAttrVisitor("interface_timing", &LibertyReader::visitInterfaceTiming); - defineAttrVisitor("scaling_factors", &LibertyReader::visitScalingFactors); - defineAttrVisitor("cell_footprint", &LibertyReader::visitCellFootprint); - defineAttrVisitor("user_function_class", - &LibertyReader::visitCellUserFunctionClass); - - // Pins - defineGroupVisitor("pin", &LibertyReader::beginPin,&LibertyReader::endPin); - defineGroupVisitor("bus", &LibertyReader::beginBus,&LibertyReader::endBus); - defineGroupVisitor("bundle", &LibertyReader::beginBundle, - &LibertyReader::endBundle); - defineAttrVisitor("direction", &LibertyReader::visitDirection); - defineAttrVisitor("clock", &LibertyReader::visitClock); - defineAttrVisitor("bus_type", &LibertyReader::visitBusType); - defineAttrVisitor("members", &LibertyReader::visitMembers); - defineAttrVisitor("function", &LibertyReader::visitFunction); - defineAttrVisitor("three_state", &LibertyReader::visitThreeState); - defineAttrVisitor("capacitance", &LibertyReader::visitCapacitance); - defineAttrVisitor("rise_capacitance", &LibertyReader::visitRiseCap); - defineAttrVisitor("fall_capacitance", &LibertyReader::visitFallCap); - defineAttrVisitor("rise_capacitance_range", - &LibertyReader::visitRiseCapRange); - defineAttrVisitor("fall_capacitance_range", - &LibertyReader::visitFallCapRange); - defineAttrVisitor("fanout_load", &LibertyReader::visitFanoutLoad); - defineAttrVisitor("max_fanout", &LibertyReader::visitMaxFanout); - defineAttrVisitor("min_fanout", &LibertyReader::visitMinFanout); - defineAttrVisitor("max_transition", &LibertyReader::visitMaxTransition); - defineAttrVisitor("min_transition", &LibertyReader::visitMinTransition); - defineAttrVisitor("max_capacitance", &LibertyReader::visitMaxCapacitance); - defineAttrVisitor("min_capacitance", &LibertyReader::visitMinCapacitance); - defineAttrVisitor("min_period", &LibertyReader::visitMinPeriod); - defineAttrVisitor("min_pulse_width_low", - &LibertyReader::visitMinPulseWidthLow); - defineAttrVisitor("min_pulse_width_high", - &LibertyReader::visitMinPulseWidthHigh); - defineAttrVisitor("pulse_clock", - &LibertyReader::visitPulseClock); - defineAttrVisitor("clock_gate_clock_pin", - &LibertyReader::visitClockGateClockPin); - defineAttrVisitor("clock_gate_enable_pin", - &LibertyReader::visitClockGateEnablePin); - defineAttrVisitor("clock_gate_out_pin", - &LibertyReader::visitClockGateOutPin); - defineAttrVisitor("is_pll_feedback_pin", - &LibertyReader::visitIsPllFeedbackPin); - defineAttrVisitor("signal_type", &LibertyReader::visitSignalType); - - defineAttrVisitor("isolation_cell_data_pin", - &LibertyReader::visitIsolationCellDataPin); - defineAttrVisitor("isolation_cell_enable_pin", - &LibertyReader::visitIsolationCellEnablePin); - defineAttrVisitor("level_shifter_data_pin", - &LibertyReader::visitLevelShifterDataPin); - defineAttrVisitor("switch_pin", &LibertyReader::visitSwitchPin); - - // Memory - defineGroupVisitor("memory", &LibertyReader::beginMemory, - &LibertyReader::endMemory); - - // Register/latch - defineGroupVisitor("ff", &LibertyReader::beginFF, &LibertyReader::endFF); - defineGroupVisitor("ff_bank", &LibertyReader::beginFFBank, - &LibertyReader::endFFBank); - defineGroupVisitor("latch", &LibertyReader::beginLatch, - &LibertyReader::endLatch); - defineGroupVisitor("latch_bank", &LibertyReader::beginLatchBank, - &LibertyReader::endLatchBank); - defineAttrVisitor("clocked_on", &LibertyReader::visitClockedOn); - defineAttrVisitor("enable", &LibertyReader::visitClockedOn); - defineAttrVisitor("data_in", &LibertyReader::visitDataIn); - defineAttrVisitor("next_state", &LibertyReader::visitDataIn); - defineAttrVisitor("clear", &LibertyReader::visitClear); - defineAttrVisitor("preset", &LibertyReader::visitPreset); - defineAttrVisitor("clear_preset_var1", &LibertyReader::visitClrPresetVar1); - defineAttrVisitor("clear_preset_var2", &LibertyReader::visitClrPresetVar2); - - // Statetable - defineGroupVisitor("statetable", &LibertyReader::beginStatetable, - &LibertyReader::endStatetable); - defineAttrVisitor("table", &LibertyReader::visitTable); - - defineGroupVisitor("timing", &LibertyReader::beginTiming, - &LibertyReader::endTiming); - defineAttrVisitor("related_pin", &LibertyReader::visitRelatedPin); - defineAttrVisitor("related_bus_pins", &LibertyReader::visitRelatedBusPins); - defineAttrVisitor("related_output_pin", - &LibertyReader::visitRelatedOutputPin); - defineAttrVisitor("timing_type", &LibertyReader::visitTimingType); - defineAttrVisitor("timing_sense", &LibertyReader::visitTimingSense); - defineAttrVisitor("sdf_cond_start", &LibertyReader::visitSdfCondStart); - defineAttrVisitor("sdf_cond_end", &LibertyReader::visitSdfCondEnd); - defineAttrVisitor("mode", &LibertyReader::visitMode); - defineAttrVisitor("intrinsic_rise", &LibertyReader::visitIntrinsicRise); - defineAttrVisitor("intrinsic_fall", &LibertyReader::visitIntrinsicFall); - defineAttrVisitor("rise_resistance", &LibertyReader::visitRiseResistance); - defineAttrVisitor("fall_resistance", &LibertyReader::visitFallResistance); - defineGroupVisitor("cell_rise", &LibertyReader::beginCellRise, - &LibertyReader::endCellRiseFall); - defineGroupVisitor("cell_fall", &LibertyReader::beginCellFall, - &LibertyReader::endCellRiseFall); - defineGroupVisitor("rise_transition", &LibertyReader::beginRiseTransition, - &LibertyReader::endRiseFallTransition); - defineGroupVisitor("fall_transition", &LibertyReader::beginFallTransition, - &LibertyReader::endRiseFallTransition); - defineGroupVisitor("rise_constraint", &LibertyReader::beginRiseConstraint, - &LibertyReader::endRiseFallConstraint); - defineGroupVisitor("fall_constraint", &LibertyReader::beginFallConstraint, - &LibertyReader::endRiseFallConstraint); - defineAttrVisitor("value", &LibertyReader::visitValue); - defineAttrVisitor("values", &LibertyReader::visitValues); - - defineGroupVisitor("lut", &LibertyReader::beginLut,&LibertyReader::endLut); - - defineGroupVisitor("test_cell", &LibertyReader::beginTestCell, - &LibertyReader::endTestCell); - - defineGroupVisitor("mode_definition", &LibertyReader::beginModeDef, - &LibertyReader::endModeDef); - defineGroupVisitor("mode_value", &LibertyReader::beginModeValue, - &LibertyReader::endModeValue); - defineAttrVisitor("when", &LibertyReader::visitWhen); - defineAttrVisitor("sdf_cond", &LibertyReader::visitSdfCond); - - // Power attributes. - defineGroupVisitor("power_lut_template", - &LibertyReader::beginTableTemplatePower, - &LibertyReader::endTableTemplate); - defineGroupVisitor("leakage_power", &LibertyReader::beginLeakagePower, - &LibertyReader::endLeakagePower); - defineGroupVisitor("internal_power", &LibertyReader::beginInternalPower, - &LibertyReader::endInternalPower); - // power group for both rise/fall - defineGroupVisitor("power", &LibertyReader::beginRisePower, - &LibertyReader::endPower); - defineGroupVisitor("fall_power", &LibertyReader::beginFallPower, - &LibertyReader::endRiseFallPower); - defineGroupVisitor("rise_power", &LibertyReader::beginRisePower, - &LibertyReader::endRiseFallPower); - defineAttrVisitor("related_ground_pin",&LibertyReader::visitRelatedGroundPin); - defineAttrVisitor("related_power_pin", &LibertyReader::visitRelatedPowerPin); - defineAttrVisitor("related_pg_pin", &LibertyReader::visitRelatedPgPin); - - // AOCV attributes. - defineAttrVisitor("ocv_arc_depth", &LibertyReader::visitOcvArcDepth); - defineAttrVisitor("default_ocv_derate_group", - &LibertyReader::visitDefaultOcvDerateGroup); - defineAttrVisitor("ocv_derate_group", &LibertyReader::visitOcvDerateGroup); - defineGroupVisitor("ocv_table_template", - &LibertyReader::beginTableTemplateOcv, - &LibertyReader::endTableTemplate); - defineGroupVisitor("ocv_derate", - &LibertyReader::beginOcvDerate, - &LibertyReader::endOcvDerate); - defineGroupVisitor("ocv_derate_factors", - &LibertyReader::beginOcvDerateFactors, - &LibertyReader::endOcvDerateFactors); - defineAttrVisitor("rf_type", &LibertyReader::visitRfType); - defineAttrVisitor("derate_type", &LibertyReader::visitDerateType); - defineAttrVisitor("path_type", &LibertyReader::visitPathType); - - // POCV attributes. - defineGroupVisitor("ocv_sigma_cell_rise", &LibertyReader::beginOcvSigmaCellRise, - &LibertyReader::endOcvSigmaCell); - defineGroupVisitor("ocv_sigma_cell_fall", &LibertyReader::beginOcvSigmaCellFall, - &LibertyReader::endOcvSigmaCell); - defineGroupVisitor("ocv_sigma_rise_transition", - &LibertyReader::beginOcvSigmaRiseTransition, - &LibertyReader::endOcvSigmaTransition); - defineGroupVisitor("ocv_sigma_fall_transition", - &LibertyReader::beginOcvSigmaFallTransition, - &LibertyReader::endOcvSigmaTransition); - defineGroupVisitor("ocv_sigma_rise_constraint", - &LibertyReader::beginOcvSigmaRiseConstraint, - &LibertyReader::endOcvSigmaConstraint); - defineGroupVisitor("ocv_sigma_fall_constraint", - &LibertyReader::beginOcvSigmaFallConstraint, - &LibertyReader::endOcvSigmaConstraint); - defineAttrVisitor("sigma_type", &LibertyReader::visitSigmaType); - defineAttrVisitor("cell_leakage_power", &LibertyReader::visitCellLeakagePower); - - defineGroupVisitor("pg_pin", &LibertyReader::beginPgPin, - &LibertyReader::endPgPin); - defineAttrVisitor("pg_type", &LibertyReader::visitPgType); - defineAttrVisitor("voltage_name", &LibertyReader::visitVoltageName); - - // ccs receiver capacitance - defineGroupVisitor("receiver_capacitance", - &LibertyReader::beginReceiverCapacitance, - &LibertyReader::endReceiverCapacitance); - - defineGroupVisitor("receiver_capacitance_rise", - &LibertyReader::beginReceiverCapacitance1Rise, - &LibertyReader::endReceiverCapacitanceRiseFall); - defineGroupVisitor("receiver_capacitance_fall", - &LibertyReader::beginReceiverCapacitance1Fall, - &LibertyReader::endReceiverCapacitanceRiseFall); - defineAttrVisitor("segment", &LibertyReader::visitSegement); - - defineGroupVisitor("receiver_capacitance1_rise", - &LibertyReader::beginReceiverCapacitance1Rise, - &LibertyReader::endReceiverCapacitanceRiseFall); - defineGroupVisitor("receiver_capacitance1_fall", - &LibertyReader::beginReceiverCapacitance1Fall, - &LibertyReader::endReceiverCapacitanceRiseFall); - defineGroupVisitor("receiver_capacitance2_rise", - &LibertyReader::beginReceiverCapacitance2Rise, - &LibertyReader::endReceiverCapacitanceRiseFall); - defineGroupVisitor("receiver_capacitance2_fall", - &LibertyReader::beginReceiverCapacitance2Fall, - &LibertyReader::endReceiverCapacitanceRiseFall); - // ccs - defineGroupVisitor("output_current_rise", - &LibertyReader::beginOutputCurrentRise, - &LibertyReader::endOutputCurrentRiseFall); - defineGroupVisitor("output_current_fall", - &LibertyReader::beginOutputCurrentFall, - &LibertyReader::endOutputCurrentRiseFall); - defineGroupVisitor("vector", &LibertyReader::beginVector, &LibertyReader::endVector); - defineAttrVisitor("reference_time", &LibertyReader::visitReferenceTime); - defineGroupVisitor("normalized_driver_waveform", - &LibertyReader::beginNormalizedDriverWaveform, - &LibertyReader::endNormalizedDriverWaveform); - defineAttrVisitor("driver_waveform_name", &LibertyReader::visitDriverWaveformName); - defineAttrVisitor("driver_waveform_rise", &LibertyReader::visitDriverWaveformRise); - defineAttrVisitor("driver_waveform_fall", &LibertyReader::visitDriverWaveformFall); - - // ccsn (not implemented, this is needed to properly ignore ccsn groups) - defineGroupVisitor("ccsn_first_stage", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("ccsn_last_stage", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("output_voltage_rise", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("output_voltage_fall", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("propagated_noise_low", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("propagated_noise_high", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("input_ccb", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - defineGroupVisitor("output_ccb", &LibertyReader::beginCcsn, - &LibertyReader::endCcsn); - - defineGroupVisitor("ecsm_waveform", &LibertyReader::beginEcsmWaveform, - &LibertyReader::endEcsmWaveform); - defineGroupVisitor("ecsm_waveform_set", &LibertyReader::beginEcsmWaveform, - &LibertyReader::endEcsmWaveform); - defineGroupVisitor("ecsm_capacitance", &LibertyReader::beginEcsmWaveform, - &LibertyReader::endEcsmWaveform); + defineGroupVisitor("cell", nullptr, &LibertyReader::endCell); + defineGroupVisitor("scaled_cell", nullptr, &LibertyReader::endScaledCell); } void -LibertyReader::defineScalingFactorVisitors() +LibertyReader::visitAttr(const LibertySimpleAttr *) { - for (int type_index = 0; type_index < scale_factor_type_count; type_index++) { - ScaleFactorType type = static_cast(type_index); - const char *type_name = scaleFactorTypeName(type); - for (int pvt_index = 0; pvt_index < scale_factor_pvt_count; pvt_index++) { - ScaleFactorPvt pvt = static_cast(pvt_index); - const char *pvt_name = scaleFactorPvtName(pvt); - if (scaleFactorTypeRiseFallSuffix(type)) { - for (auto tr : RiseFall::range()) { - const char *tr_name = (tr == RiseFall::rise()) ? "rise":"fall"; - string attr_name; - stringPrint(attr_name, "k_%s_%s_%s", - pvt_name, - type_name, - tr_name); - defineAttrVisitor(attr_name.c_str() ,&LibertyReader::visitScaleFactorSuffix); - } - } - else if (scaleFactorTypeRiseFallPrefix(type)) { - for (auto tr : RiseFall::range()) { - const char *tr_name = (tr == RiseFall::rise()) ? "rise":"fall"; - string attr_name; - stringPrint(attr_name, "k_%s_%s_%s", - pvt_name, - tr_name, - type_name); - defineAttrVisitor(attr_name.c_str(),&LibertyReader::visitScaleFactorPrefix); - } - } - else if (scaleFactorTypeLowHighSuffix(type)) { - for (auto tr : RiseFall::range()) { - const char *tr_name = (tr == RiseFall::rise()) ? "high":"low"; - string attr_name; - stringPrint(attr_name, "k_%s_%s_%s", - pvt_name, - type_name, - tr_name); - defineAttrVisitor(attr_name.c_str(),&LibertyReader::visitScaleFactorHiLow); - } - } - else { - string attr_name; - stringPrint(attr_name, "k_%s_%s", - pvt_name, - type_name); - defineAttrVisitor(attr_name.c_str(),&LibertyReader::visitScaleFactor); - } - } - } } void -LibertyReader::visitAttr(LibertyAttr *attr) +LibertyReader::visitAttr(const LibertyComplexAttr *) { - LibraryAttrVisitor *visitor = findKeyValuePtr(attr_visitor_map_, attr->name()); - if (visitor) - (this->**visitor)(attr); } void -LibertyReader::begin(LibertyGroup *group) +LibertyReader::begin(const LibertyGroup *group, + LibertyGroup *parent_group) { LibraryGroupVisitor *visitor = findKeyValuePtr(group_begin_map_, group->type()); if (visitor) - (this->**visitor)(group); + (this->**visitor)(group, parent_group); } void -LibertyReader::end(LibertyGroup *group) +LibertyReader::end(const LibertyGroup *group, + LibertyGroup *parent_group) { LibraryGroupVisitor *visitor = findKeyValuePtr(group_end_map_, group->type()); if (visitor) - (this->**visitor)(group); + (this->**visitor)(group, parent_group); } void -LibertyReader::beginLibrary(LibertyGroup *group) +LibertyReader::beginLibrary(const LibertyGroup *library_group, + LibertyGroup *) { - const char *name = group->firstName(); + makeLibrary(library_group); +} + +void +LibertyReader::endLibrary(const LibertyGroup *group, + LibertyGroup *) +{ + // If a library hasno cells endCell is not called. + if (first_cell_) + readLibraryAttributes(group); + delete group; +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::endCell(const LibertyGroup *cell_group, + LibertyGroup *library_group) +{ + // Read library groups defined since the last cell was read. + // Normally they are all defined by the first cell, but there + // are libraries that define table templates and bus tyupes + // between cells. + if (first_cell_) + readLibraryAttributes(library_group); + else { + readTableTemplates(library_group); + readBusTypes(nullptr, library_group); + } + + const char *name = cell_group->firstName(); + if (name) { + debugPrint(debug_, "liberty", 1, "cell %s", name); + LibertyCell *cell = builder_.makeCell(library_, name, filename_); + readCell(cell, cell_group); + } + else + libWarn(1193, cell_group, "cell missing name."); + library_group->clear(); + first_cell_ = false; +} + +void +LibertyReader::endScaledCell(const LibertyGroup *scaled_cell_group, + LibertyGroup *library_group) +{ + readLibraryAttributes(library_group); + readScaledCell(scaled_cell_group); + library_group->deleteSubgroup(scaled_cell_group); +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::readLibraryAttributes(const LibertyGroup *library_group) +{ + readTechnology(library_group); + readLibraryUnits(library_group); + readThresholds(library_group); + readDelayModel(library_group); + readBusStyle(library_group); + readBusTypes(nullptr, library_group); + readTableTemplates(library_group); + readVoltateMaps(library_group); + readWireloads(library_group); + readWireloadSelection(library_group); + readDefaultWireLoad(library_group); + readDefaultWireLoadMode(library_group); + readDefaultWireLoadSelection(library_group); + readOperatingConds(library_group); + readScaleFactors(library_group); + readOcvDerateFactors(nullptr, library_group); + readDefaultOcvDerateGroup(library_group); + readGroupAttrFloat("ocv_arc_depth", library_group, + [this](float v) { library_->setOcvArcDepth(v); }); + readNormalizedDriverWaveform(library_group); + readSlewDegradations(library_group); + + readLibAttrFloat(library_group, "nom_temperature", + &LibertyLibrary::setNominalTemperature, 1.0F); + readLibAttrFloat(library_group, "nom_voltage", &LibertyLibrary::setNominalVoltage, + volt_scale_); + readLibAttrFloat(library_group, "nom_process", + &LibertyLibrary::setNominalProcess, 1.0F); + readLibAttrFloat(library_group, "default_inout_pin_cap", + &LibertyLibrary::setDefaultBidirectPinCap, cap_scale_); + readLibAttrFloat(library_group, "default_input_pin_cap", + &LibertyLibrary::setDefaultInputPinCap, cap_scale_); + readLibAttrFloat(library_group, "default_output_pin_cap", + &LibertyLibrary::setDefaultOutputPinCap, cap_scale_); + readLibAttrFloatWarnZero(library_group, "default_max_transition", + &LibertyLibrary::setDefaultMaxSlew, time_scale_); + readLibAttrFloatWarnZero(library_group, "default_max_fanout", + &LibertyLibrary::setDefaultMaxFanout, 1.0F); + readLibAttrFloat(library_group, "default_intrinsic_rise", + &LibertyLibrary::setDefaultIntrinsic, RiseFall::rise(), + time_scale_); + readLibAttrFloat(library_group, "default_intrinsic_fall", + &LibertyLibrary::setDefaultIntrinsic, RiseFall::fall(), + time_scale_); + readLibAttrFloat(library_group, "default_inout_pin_rise_res", + &LibertyLibrary::setDefaultBidirectPinRes, RiseFall::rise(), + res_scale_); + readLibAttrFloat(library_group, "default_inout_pin_fall_res", + &LibertyLibrary::setDefaultBidirectPinRes, RiseFall::fall(), + res_scale_); + readLibAttrFloat(library_group, "default_output_pin_rise_res", + &LibertyLibrary::setDefaultOutputPinRes, RiseFall::rise(), + res_scale_); + readLibAttrFloat(library_group, "default_output_pin_fall_res", + &LibertyLibrary::setDefaultOutputPinRes, RiseFall::fall(), + res_scale_); + readLibAttrFloatWarnZero(library_group, "default_fanout_load", + &LibertyLibrary::setDefaultFanoutLoad, 1.0F); + readLibAttrFloat(library_group, "slew_derate_from_library", + &LibertyLibrary::setSlewDerateFromLibrary, 1.0F); +} + +void +LibertyReader::makeLibrary(const LibertyGroup *libary_group) +{ + const char *name = libary_group->firstName(); if (name) { LibertyLibrary *library = network_->findLiberty(name); if (library) - libWarn(1140, group, "library %s already exists.", name); + libWarn(1140, libary_group, "library %s already exists.", name); // Make a new library even if a library with the same name exists. // Both libraries may be accessed by min/max analysis points. library_ = network_->makeLibertyLibrary(name, filename_); @@ -664,8 +286,6 @@ LibertyReader::beginLibrary(LibertyGroup *group) current_scale_ = 1E-3F; // Default is 1; power_scale_ = 1; - // Default is fJ. - setEnergyScale(); // Default is 1 micron. distance_scale_ = 1e-6; @@ -677,802 +297,326 @@ LibertyReader::beginLibrary(LibertyGroup *group) library_->units()->distanceUnit()->setScale(distance_scale_); library_->setDelayModelType(DelayModelType::cmos_linear); - scale_factors_ = new ScaleFactors(""); - library_->setScaleFactors(scale_factors_); } else - libError(1141, group, "library missing name."); + libError(1141, libary_group, "library missing name."); } -// Energy scale is derived. -void -LibertyReader::setEnergyScale() +// Energy scale is derived from other units. +float +LibertyReader::energyScale() { - energy_scale_ = volt_scale_ * volt_scale_ * cap_scale_; + return volt_scale_ * volt_scale_ * cap_scale_; } void -LibertyReader::endLibrary(LibertyGroup *group) +LibertyReader::readTechnology(const LibertyGroup *library_group) { - endLibraryAttrs(group); -} - -void -LibertyReader::endLibraryAttrs(LibertyGroup *group) -{ - // These attributes reference named groups in the library so - // wait until the end of the library to resolve them. - if (default_wireload_) { - const Wireload *wireload = library_->findWireload(default_wireload_); - if (wireload) - library_->setDefaultWireload(wireload); - else - libWarn(1142, group, "default_wire_load %s not found.", default_wireload_); - stringDelete(default_wireload_); - default_wireload_ = nullptr; - } - - if (default_wireload_selection_) { - const WireloadSelection *selection = - library_->findWireloadSelection(default_wireload_selection_); - if (selection) - library_->setDefaultWireloadSelection(selection); - else - libWarn(1143, group, "default_wire_selection %s not found.", - default_wireload_selection_); - stringDelete(default_wireload_selection_); - default_wireload_selection_ = nullptr; - } - - if (default_operating_condition_) { - OperatingConditions *op_cond = - library_->findOperatingConditions(default_operating_condition_); - if (op_cond) - library_->setDefaultOperatingConditions(op_cond); - else - libWarn(1144, group, "default_operating_condition %s not found.", - default_operating_condition_); - stringDelete(default_operating_condition_); - default_operating_condition_ = nullptr; - } - - bool missing_threshold = false; - for (auto rf : RiseFall::range()) { - int rf_index = rf->index(); - if (!have_input_threshold_[rf_index]) { - libWarn(1145, group, "input_threshold_pct_%s not found.", rf->name()); - missing_threshold = true; - } - if (!have_output_threshold_[rf_index]) { - libWarn(1146, group, "output_threshold_pct_%s not found.", rf->name()); - missing_threshold = true; - } - if (!have_slew_lower_threshold_[rf_index]) { - libWarn(1147, group, "slew_lower_threshold_pct_%s not found.", rf->name()); - missing_threshold = true; - } - if (!have_slew_upper_threshold_[rf_index]) { - libWarn(1148, group, "slew_upper_threshold_pct_%s not found.", rf->name()); - missing_threshold = true; + const LibertyComplexAttr *tech_attr = library_group->findComplexAttr("technology"); + if (tech_attr) { + const LibertyAttrValue *tech_value = tech_attr->firstValue(); + if (tech_value) { + const std::string &tech = tech_value->stringValue(); + if (tech == "fpga") + library_->setDelayModelType(DelayModelType::cmos_linear); } } - if (missing_threshold) - libError(1149, group, "Library %s is missing one or more thresholds.", - library_->name()); } void -LibertyReader::visitTimeUnit(LibertyAttr *attr) +LibertyReader::readLibraryUnits(const LibertyGroup *library_group) { - if (library_) - parseUnits(attr, "s", time_scale_, library_->units()->timeUnit()); -} + readUnit("time_unit", "s", time_scale_, library_->units()->timeUnit(), library_group); + readUnit("pulling_resistance_unit", "ohm", res_scale_, + library_->units()->resistanceUnit(), library_group); + readUnit("voltage_unit", "V", volt_scale_, library_->units()->voltageUnit(), + library_group); + readUnit("current_unit", "A", current_scale_, library_->units()->currentUnit(), + library_group); + readUnit("leakage_power_unit", "W", power_scale_, library_->units()->powerUnit(), + library_group); + readUnit("distance_unit", "m", distance_scale_, library_->units()->distanceUnit(), + library_group); -void -LibertyReader::visitPullingResistanceUnit(LibertyAttr *attr) -{ - if (library_) - parseUnits(attr, "ohm", res_scale_, - library_->units()->resistanceUnit()); -} - -void -LibertyReader::visitResistanceUnit(LibertyAttr *attr) -{ - if (library_) - parseUnits(attr, "ohm", res_scale_, library_->units()->resistanceUnit()); -} - -void -LibertyReader::visitCurrentUnit(LibertyAttr *attr) -{ - if (library_) - parseUnits(attr, "A", current_scale_, library_->units()->currentUnit()); -} - -void -LibertyReader::visitVoltageUnit(LibertyAttr *attr) -{ - if (library_) - parseUnits(attr, "V", volt_scale_, library_->units()->voltageUnit()); - setEnergyScale(); -} - -void -LibertyReader::visitPowerUnit(LibertyAttr *attr) -{ - if (library_) - parseUnits(attr, "W", power_scale_, library_->units()->powerUnit()); -} - -void -LibertyReader::visitDistanceUnit(LibertyAttr *attr) -{ - if (library_) - parseUnits(attr, "m", distance_scale_, library_->units()->distanceUnit()); -} - -void -LibertyReader::parseUnits(LibertyAttr *attr, - const char *unit_suffix, - float &scale_var, - Unit *unit) -{ - const char *units = getAttrString(attr); - if (units) { - // Unit format is . - // Find the multiplier digits. - string units1 = units; - size_t mult_end = units1.find_first_not_of("0123456789"); - float mult = 1.0F; - string scale_suffix; - if (mult_end != units1.npos) { - string unit_mult = units1.substr(0, mult_end); - scale_suffix = units1.substr(mult_end); - if (unit_mult == "1") - mult = 1.0F; - else if (unit_mult == "10") - mult = 10.0F; - else if (unit_mult == "100") - mult = 100.0F; - else - libWarn(1150, attr, "unknown unit multiplier %s.", unit_mult.c_str()); - } - else - scale_suffix = units; - - float scale_mult = 1.0F; - if (scale_suffix.size() == strlen(unit_suffix) + 1) { - string suffix = scale_suffix.substr(1); - if (stringEqual(suffix.c_str(), unit_suffix)) { - char scale_char = tolower(scale_suffix[0]); - if (scale_char == 'k') - scale_mult = 1E+3F; - else if (scale_char == 'm') - scale_mult = 1E-3F; - else if (scale_char == 'u') - scale_mult = 1E-6F; - else if (scale_char == 'n') - scale_mult = 1E-9F; - else if (scale_char == 'p') - scale_mult = 1E-12F; - else if (scale_char == 'f') - scale_mult = 1E-15F; - else - libWarn(1151, attr, "unknown unit scale %c.", scale_char); + const LibertyComplexAttr *cap_attr = + library_group->findComplexAttr("capacitive_load_unit"); + if (cap_attr) { + const LibertyAttrValueSeq &values = cap_attr->values(); + if (values.size() == 2) { + LibertyAttrValue *value = values[0]; + bool valid = false; + float scale; + if (value->isFloat()) { + scale = value->floatValue(); + valid = true; } - else - libWarn(1152, attr, "unknown unit suffix %s.", suffix.c_str()); - } - else if (!stringEqual(scale_suffix.c_str(), unit_suffix)) - libWarn(1153, attr, "unknown unit suffix %s.", scale_suffix.c_str()); - scale_var = scale_mult * mult; - unit->setScale(scale_var); - } -} - -void -LibertyReader::visitCapacitiveLoadUnit(LibertyAttr *attr) -{ - if (library_) { - if (attr->isComplexAttr()) { - LibertyAttrValueSeq *values = attr->values(); - if (values->size() == 2) { - LibertyAttrValue *value = (*values)[0]; - bool valid = false; - float scale; - if (value->isFloat()) { - scale = value->floatValue(); + else if (value->isString()) { + try { + scale = std::stof(value->stringValue()); valid = true; } - else if (value->isString()) { - try { - scale = std::stof(value->stringValue()); - valid = true; - } - catch (...) { - valid = false; - } + catch (...) { + valid = false; } + } - if (valid) { - value = (*values)[1]; - if (value->isString()) { - const std::string suffix = value->stringValue(); - if (stringEqual(suffix.c_str(), "ff")) - cap_scale_ = scale * 1E-15F; - else if (stringEqual(suffix.c_str(), "pf")) - cap_scale_ = scale * 1E-12F; - else - libWarn(1154, attr, "capacitive_load_units are not ff or pf."); - } - else - libWarn(1155, attr, "capacitive_load_units are not a string."); - } - else - libWarn(1157, attr, "capacitive_load_units scale is not a float."); - } - else if (values->size() == 1) - libWarn(1156, attr, "capacitive_load_units missing suffix."); - else - libWarn(1158, attr, "capacitive_load_units missing scale and suffix."); - } - else - libWarn(1159, attr, "capacitive_load_unit missing values suffix."); - library_->units()->capacitanceUnit()->setScale(cap_scale_); - setEnergyScale(); - } -} - -void -LibertyReader::visitDelayModel(LibertyAttr *attr) -{ - if (library_) { - const char *type_name = getAttrString(attr); - if (type_name) { - if (stringEq(type_name, "table_lookup")) - library_->setDelayModelType(DelayModelType::table); - else if (stringEq(type_name, "generic_cmos")) - library_->setDelayModelType(DelayModelType::cmos_linear); - else if (stringEq(type_name, "piecewise_cmos")) { - library_->setDelayModelType(DelayModelType::cmos_pwl); - libWarn(1160, attr, "delay_model %s not supported.", type_name); - } - else if (stringEq(type_name, "cmos2")) { - library_->setDelayModelType(DelayModelType::cmos2); - libWarn(1161, attr, "delay_model %s not supported.", type_name); - } - else if (stringEq(type_name, "polynomial")) { - library_->setDelayModelType(DelayModelType::polynomial); - libWarn(1162, attr, "delay_model %s not supported.", type_name); - } - // Evil IBM garbage. - else if (stringEq(type_name, "dcm")) { - library_->setDelayModelType(DelayModelType::dcm); - libWarn(1163, attr, "delay_model %s not supported..", type_name); - } - else - libWarn(1164, attr, "unknown delay_model %s.", type_name); - } - } -} - -void -LibertyReader::visitBusStyle(LibertyAttr *attr) -{ - if (library_) { - const char *bus_style = getAttrString(attr); - // Assume bus style is of the form "%s[%d]". - if (bus_style - && strlen(bus_style) == 6 - && bus_style[0] == '%' - && bus_style[1] == 's' - && bus_style[3] == '%' - && bus_style[4] == 'd') - library_->setBusBrkts(bus_style[2], bus_style[5]); - else - libWarn(1165, attr, "unknown bus_naming_style format."); - } -} - -void -LibertyReader::visitVoltageMap(LibertyAttr *attr) -{ - if (library_) { - if (attr->isComplexAttr()) { - LibertyAttrValueSeq *values = attr->values(); - if (values->size() >= 1) { - LibertyAttrValue *value = (*values)[0]; + if (valid) { + value = values[1]; if (value->isString()) { - const std::string &supply_name = value->stringValue(); - if (values->size() == 2) { - value = (*values)[1]; - bool valid = false; - float voltage; - if (value->isFloat()) { - voltage = value->floatValue(); - valid = true; - } - else if (value->isString()) { - try { - voltage = std::stof(value->stringValue()); - valid = true; - } - catch (...) { - valid = false; - } - } - - if (valid) - library_->addSupplyVoltage(supply_name.c_str(), voltage); - else - libWarn(1166, attr, "voltage_map voltage is not a float."); - } + const std::string suffix = value->stringValue(); + if (stringEqual(suffix.c_str(), "ff")) + cap_scale_ = scale * 1E-15F; + else if (stringEqual(suffix.c_str(), "pf")) + cap_scale_ = scale * 1E-12F; else - libWarn(1167, attr, "voltage_map missing voltage."); + libWarn(1154, cap_attr, "capacitive_load_units are not ff or pf."); } else - libWarn(1168, attr, "voltage_map supply name is not a string."); + libWarn(1155, cap_attr, "capacitive_load_units are not a string."); } else - libWarn(1169, attr, "voltage_map missing supply name and voltage."); + libWarn(1157, cap_attr, "capacitive_load_units scale is not a float."); + } + else if (values.size() == 1) + libWarn(1156, cap_attr, "capacitive_load_units missing suffix."); + else + libWarn(1158, cap_attr, "capacitive_load_units missing scale and suffix."); + library_->units()->capacitanceUnit()->setScale(cap_scale_); + } +} + +void +LibertyReader::readUnit(const char *unit_attr_name, + const char *unit_suffix, + float &scale_var, + Unit *unit, + const LibertyGroup *library_group) +{ + const LibertySimpleAttr *unit_attr = library_group->findSimpleAttr(unit_attr_name); + if (unit_attr) { + const std::string *units = unit_attr->stringValue(); + if (units) { + // Unit format is . + // Find the multiplier digits. + std::string units1 = *units; + size_t mult_end = units1.find_first_not_of("0123456789"); + float mult = 1.0F; + std::string scale_suffix; + if (mult_end != units1.npos) { + std::string unit_mult = units1.substr(0, mult_end); + scale_suffix = units1.substr(mult_end); + if (unit_mult == "1") + mult = 1.0F; + else if (unit_mult == "10") + mult = 10.0F; + else if (unit_mult == "100") + mult = 100.0F; + else + libWarn(1150, unit_attr, "unknown unit multiplier %s.", unit_mult.c_str()); + } + else + scale_suffix = *units; + + float scale_mult = 1.0F; + if (scale_suffix.size() == strlen(unit_suffix) + 1) { + std::string suffix = scale_suffix.substr(1); + if (stringEqual(suffix.c_str(), unit_suffix)) { + char scale_char = tolower(scale_suffix[0]); + if (scale_char == 'k') + scale_mult = 1E+3F; + else if (scale_char == 'm') + scale_mult = 1E-3F; + else if (scale_char == 'u') + scale_mult = 1E-6F; + else if (scale_char == 'n') + scale_mult = 1E-9F; + else if (scale_char == 'p') + scale_mult = 1E-12F; + else if (scale_char == 'f') + scale_mult = 1E-15F; + else + libWarn(1151, unit_attr, "unknown unit scale %c.", scale_char); + } + else + libWarn(1152, unit_attr, "unknown unit suffix %s.", suffix.c_str()); + } + else if (!stringEqual(scale_suffix.c_str(), unit_suffix)) + libWarn(1153, unit_attr, "unknown unit suffix %s.", scale_suffix.c_str()); + scale_var = scale_mult * mult; + unit->setScale(scale_var); + } + } +} + +void +LibertyReader::readDelayModel(const LibertyGroup *library_group) +{ + const std::string *type_name = library_group->findAttrString("delay_model"); + if (type_name) { + if (*type_name == "table_lookup") + library_->setDelayModelType(DelayModelType::table); + else if (*type_name == "generic_cmos") + library_->setDelayModelType(DelayModelType::cmos_linear); + else if (*type_name == "piecewise_cmos") { + library_->setDelayModelType(DelayModelType::cmos_pwl); + libWarn(1160, library_group, "delay_model %s not supported.", type_name->c_str()); + } + else if (*type_name == "cmos2") { + library_->setDelayModelType(DelayModelType::cmos2); + libWarn(1161, library_group, "delay_model %s not supported.", type_name->c_str()); + } + else if (*type_name == "polynomial") { + library_->setDelayModelType(DelayModelType::polynomial); + libWarn(1162, library_group, "delay_model %s not supported.", type_name->c_str()); + } + // Evil IBM garbage. + else if (*type_name == "dcm") { + library_->setDelayModelType(DelayModelType::dcm); + libWarn(1163, library_group, "delay_model %s not supported..", type_name->c_str()); } else - libWarn(1170, attr, "voltage_map missing values suffix."); + libWarn(1164, library_group, "unknown delay_model %s.", type_name->c_str()); } } void -LibertyReader::visitNomTemp(LibertyAttr *attr) +LibertyReader::readBusStyle(const LibertyGroup *library_group) { - if (library_) { - float value; - bool valid; - getAttrFloat(attr, value, valid); - if (valid) - library_->setNominalTemperature(value); + const std::string *bus_style = library_group->findAttrString("bus_naming_style"); + if (bus_style) { + // Assume bus style is of the form "%s[%d]". + if (bus_style->size() == 6 + && (*bus_style)[0] == '%' + && (*bus_style)[1] == 's' + && (*bus_style)[3] == '%' + && (*bus_style)[4] == 'd') + library_->setBusBrkts((*bus_style)[2], (*bus_style)[5]); + else + libWarn(1165, library_group, "unknown bus_naming_style format."); } } void -LibertyReader::visitNomProc(LibertyAttr *attr) +LibertyReader::readBusTypes(LibertyCell *cell, + const LibertyGroup *group) { - if (library_) { - float value; - bool valid; - getAttrFloat(attr, value, valid); - if (valid) - library_->setNominalProcess(value); - } -} - -void -LibertyReader::visitNomVolt(LibertyAttr *attr) -{ - if (library_) { - float value; - bool valid; - getAttrFloat(attr, value, valid); - if (valid) - library_->setNominalVoltage(value); - } -} - -void -LibertyReader::visitDefaultInoutPinCap(LibertyAttr *attr) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setDefaultBidirectPinCap(value * cap_scale_); - } -} - -void -LibertyReader::visitDefaultInputPinCap(LibertyAttr *attr) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setDefaultInputPinCap(value * cap_scale_); - } -} - -void -LibertyReader::visitDefaultOutputPinCap(LibertyAttr *attr) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setDefaultOutputPinCap(value * cap_scale_); - } -} - -void -LibertyReader::visitDefaultMaxTransition(LibertyAttr *attr) -{ - if (library_){ - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - if (value == 0.0) - libWarn(1171, attr, "default_max_transition is 0.0."); - library_->setDefaultMaxSlew(value * time_scale_); + for (const LibertyGroup *type_group : group->findSubgroups("type")) { + const char *name = type_group->firstName(); + if (name) { + int from, to; + bool from_exists, to_exists; + type_group->findAttrInt("bit_from", from, from_exists); + type_group->findAttrInt("bit_to", to, to_exists); + if (from_exists && to_exists) { + if (cell) + cell->makeBusDcl(name, from, to); + else + library_->makeBusDcl(name, from, to); + } + else if (!from_exists) + libWarn(1179, type_group, "bus type missing bit_from."); + else if (!to_exists) + libWarn(1180, type_group, "bus type missing bit_to."); } } } void -LibertyReader::visitDefaultMaxFanout(LibertyAttr *attr) +LibertyReader::readThresholds(const LibertyGroup *library_group) { - if (library_){ - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - if (value == 0.0) - libWarn(1172, attr, "default_max_fanout is 0.0."); - library_->setDefaultMaxFanout(value); - } + for (const RiseFall *rf : RiseFall::range()) { + std::string suffix = rf->to_string_long(); + readLibAttrFloat(library_group, ("input_threshold_pct_" + suffix).c_str(), + &LibertyLibrary::setInputThreshold, rf, 0.01F); + if (library_->inputThreshold(rf) == 0.0) + libWarn(1145, library_group, "input_threshold_pct_%s not found.", rf->name()); + + readLibAttrFloat(library_group, ("output_threshold_pct_" + suffix).c_str(), + &LibertyLibrary::setOutputThreshold, rf, 0.01F); + if (library_->outputThreshold(rf) == 0.0) + libWarn(1146, library_group, "output_threshold_pct_%s not found.", rf->name()); + + readLibAttrFloat(library_group, ("slew_lower_threshold_pct_" + suffix).c_str(), + &LibertyLibrary::setSlewLowerThreshold, rf, 0.01F); + if (library_->slewLowerThreshold(rf) == 0.0) + libWarn(1147, library_group, "slew_lower_threshold_pct_%s not found.", rf->name()); + + readLibAttrFloat(library_group, ("slew_upper_threshold_pct_" + suffix).c_str(), + &LibertyLibrary::setSlewUpperThreshold, rf, 0.01F); + if (library_->slewUpperThreshold(rf) == 0.0) + libWarn(1148, library_group, "slew_upper_threshold_pct_%s not found.", rf->name()); } } void -LibertyReader::visitDefaultIntrinsicRise(LibertyAttr *attr) +LibertyReader::readTableTemplates(const LibertyGroup *library_group) { - visitDefaultIntrinsic(attr, RiseFall::rise()); + readTableTemplates(library_group, "lu_table_template", TableTemplateType::delay); + readTableTemplates(library_group, "output_current_template", + TableTemplateType::output_current); + readTableTemplates(library_group, "power_lut_template", TableTemplateType::power); + readTableTemplates(library_group, "ocv_table_template", TableTemplateType::ocv); } void -LibertyReader::visitDefaultIntrinsicFall(LibertyAttr *attr) -{ - visitDefaultIntrinsic(attr, RiseFall::fall()); -} - -void -LibertyReader::visitDefaultIntrinsic(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setDefaultIntrinsic(rf, value * time_scale_); - } -} - -void -LibertyReader::visitDefaultInoutPinRiseRes(LibertyAttr *attr) -{ - visitDefaultInoutPinRes(attr, RiseFall::rise()); -} - -void -LibertyReader::visitDefaultInoutPinFallRes(LibertyAttr *attr) -{ - visitDefaultInoutPinRes(attr, RiseFall::fall()); -} - -void -LibertyReader::visitDefaultInoutPinRes(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setDefaultBidirectPinRes(rf, value * res_scale_); - } -} - -void -LibertyReader::visitDefaultOutputPinRiseRes(LibertyAttr *attr) -{ - visitDefaultOutputPinRes(attr, RiseFall::rise()); -} - -void -LibertyReader::visitDefaultOutputPinFallRes(LibertyAttr *attr) -{ - visitDefaultOutputPinRes(attr, RiseFall::fall()); -} - -void -LibertyReader::visitDefaultOutputPinRes(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setDefaultOutputPinRes(rf, value * res_scale_); - } -} - -void -LibertyReader::visitDefaultFanoutLoad(LibertyAttr *attr) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - if (value == 0.0) - libWarn(1173, attr, "default_fanout_load is 0.0."); - library_->setDefaultFanoutLoad(value); - } - } -} - -void -LibertyReader::visitDefaultWireLoad(LibertyAttr *attr) -{ - if (library_) { - const char *value = getAttrString(attr); - if (value) { - stringDelete(default_wireload_); - default_wireload_ = stringCopy(value); - } - } -} - -void -LibertyReader::visitDefaultWireLoadMode(LibertyAttr *attr) -{ - if (library_) { - const char *wire_load_mode = getAttrString(attr); - if (wire_load_mode) { - WireloadMode mode = stringWireloadMode(wire_load_mode); - if (mode != WireloadMode::unknown) - library_->setDefaultWireloadMode(mode); - else - libWarn(1174, attr, "default_wire_load_mode %s not found.", - wire_load_mode); - } - } -} - -void -LibertyReader::visitDefaultWireLoadSelection(LibertyAttr *attr) -{ - if (library_) { - const char *value = getAttrString(attr); - if (value) { - stringDelete(default_wireload_selection_); - default_wireload_selection_ = stringCopy(value); - } - } -} - -void -LibertyReader::visitDefaultOperatingConditions(LibertyAttr *attr) -{ - if (library_) { - const char *value = getAttrString(attr); - if (value) { - stringDelete(default_operating_condition_); - default_operating_condition_ = stringCopy(value); - } - } -} - -void -LibertyReader::visitInputThresholdPctFall(LibertyAttr *attr) -{ - visitInputThresholdPct(attr, RiseFall::fall()); -} - -void -LibertyReader::visitInputThresholdPctRise(LibertyAttr *attr) -{ - visitInputThresholdPct(attr, RiseFall::rise()); -} - -void -LibertyReader::visitInputThresholdPct(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setInputThreshold(rf, value / 100.0F); - } - have_input_threshold_[rf->index()] = true; -} - -void -LibertyReader::visitOutputThresholdPctFall(LibertyAttr *attr) -{ - visitOutputThresholdPct(attr, RiseFall::fall()); -} - -void -LibertyReader::visitOutputThresholdPctRise(LibertyAttr *attr) -{ - visitOutputThresholdPct(attr, RiseFall::rise()); -} - -void -LibertyReader::visitOutputThresholdPct(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setOutputThreshold(rf, value / 100.0F); - } - have_output_threshold_[rf->index()] = true; -} - -void -LibertyReader::visitSlewLowerThresholdPctFall(LibertyAttr *attr) -{ - visitSlewLowerThresholdPct(attr, RiseFall::fall()); -} - -void -LibertyReader::visitSlewLowerThresholdPctRise(LibertyAttr *attr) -{ - visitSlewLowerThresholdPct(attr, RiseFall::rise()); -} - -void -LibertyReader::visitSlewLowerThresholdPct(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setSlewLowerThreshold(rf, value / 100.0F); - } - have_slew_lower_threshold_[rf->index()] = true; -} - -void -LibertyReader::visitSlewUpperThresholdPctFall(LibertyAttr *attr) -{ - visitSlewUpperThresholdPct(attr, RiseFall::fall()); -} - -void -LibertyReader::visitSlewUpperThresholdPctRise(LibertyAttr *attr) -{ - visitSlewUpperThresholdPct(attr, RiseFall::rise()); -} - -void -LibertyReader::visitSlewUpperThresholdPct(LibertyAttr *attr, - const RiseFall *rf) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setSlewUpperThreshold(rf, value / 100.0F); - } - have_slew_upper_threshold_[rf->index()] = true; -} - -void -LibertyReader::visitSlewDerateFromLibrary(LibertyAttr *attr) -{ - if (library_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - library_->setSlewDerateFromLibrary(value); - } -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginTechnology(LibertyGroup *group) -{ - if (library_) { - const char *tech = group->firstName(); - if (stringEq(tech, "fpga")) - library_->setDelayModelType(DelayModelType::cmos_linear); - } -} - -void -LibertyReader::endTechnology(LibertyGroup *) -{ -} - -void -LibertyReader::beginTableTemplateDelay(LibertyGroup *group) -{ - beginTableTemplate(group, TableTemplateType::delay); -} - -void -LibertyReader::beginTableTemplateOutputCurrent(LibertyGroup *group) -{ - beginTableTemplate(group, TableTemplateType::output_current); -} - -void -LibertyReader::beginTableTemplate(LibertyGroup *group, +LibertyReader::readTableTemplates(const LibertyGroup *library_group, + const char *group_name, TableTemplateType type) { - if (library_) { - const char *name = group->firstName(); + for (const LibertyGroup *template_group : library_group->findSubgroups(group_name)) { + const char *name = template_group->firstName(); if (name) { - tbl_template_ = library_->makeTableTemplate(name, type); + TableTemplate *tbl_template = library_->makeTableTemplate(name, type); + TableAxisPtr axis1 = makeTableTemplateAxis(template_group, 1); + if (axis1) + tbl_template->setAxis1(axis1); + TableAxisPtr axis2 = makeTableTemplateAxis(template_group, 2); + if (axis2) + tbl_template->setAxis2(axis2); + TableAxisPtr axis3 = makeTableTemplateAxis(template_group, 3); + if (axis3) + tbl_template->setAxis3(axis3); } else - libWarn(1175, group, "table template missing name."); - axis_var_[0] = axis_var_[1] = axis_var_[2] = TableAxisVariable::unknown; - clearAxisValues(); - } -} - -void -LibertyReader::clearAxisValues() -{ - axis_values_[0].clear(); - axis_values_[1].clear(); - axis_values_[2].clear(); -} - -void -LibertyReader::endTableTemplate(LibertyGroup *group) -{ - if (tbl_template_) { - TableAxisPtr axis1 = makeAxis(0, group); - if (axis1) - tbl_template_->setAxis1(axis1); - TableAxisPtr axis2 = makeAxis(1, group); - if (axis2) - tbl_template_->setAxis2(axis2); - TableAxisPtr axis3 = makeAxis(2, group); - if (axis3) - tbl_template_->setAxis3(axis3); - tbl_template_ = nullptr; - axis_var_[0] = axis_var_[1] = axis_var_[2] = TableAxisVariable::unknown; + libWarn(1175, template_group, "table template missing name."); } } TableAxisPtr -LibertyReader::makeAxis(int index, - LibertyGroup *group) +LibertyReader::makeTableTemplateAxis(const LibertyGroup *template_group, + int axis_index) { - TableAxisVariable axis_var = axis_var_[index]; - if (axis_var != TableAxisVariable::unknown) { - FloatSeq values; - if (!axis_values_[index].empty()) { + std::string var_attr_name = "variable_" + std::to_string(axis_index); + const std::string *var_name = template_group->findAttrString(var_attr_name); + if (var_name) { + TableAxisVariable axis_var = stringTableAxisVariable(var_name->c_str()); + if (axis_var == TableAxisVariable::unknown) + libWarn(1297, template_group, "axis type %s not supported.", var_name->c_str()); + else { + std::string index_attr_name = "index_" + std::to_string(axis_index); + const LibertyComplexAttr *index_attr = + template_group->findComplexAttr(index_attr_name); + FloatSeq axis_values; + if (index_attr) { + axis_values = readFloatSeq(index_attr, 1.0F); + if (!axis_values.empty()) { + float prev = axis_values[0]; + for (size_t i = 1; i < axis_values.size(); i++) { + float value = axis_values[i]; + if (value <= prev) { + libWarn(1178, template_group, "non-increasing table index values."); + break; + } + prev = value; + } + } + } const Units *units = library_->units(); float scale = tableVariableUnit(axis_var, units)->scale(); - values = std::move(axis_values_[index]); - scaleFloats(values, scale); + scaleFloats(axis_values, scale); + return make_shared(axis_var, std::move(axis_values)); } - return make_shared(axis_var, std::move(values)); } - else if (!axis_values_[index].empty()) { - libWarn(1176, group, "missing variable_%d attribute.", index + 1); - axis_values_[index].clear(); - } - // No warning for missing index_xx attributes because they are not required. return nullptr; } @@ -1486,695 +630,2163 @@ scaleFloats(FloatSeq &floats, } void -LibertyReader::visitVariable1(LibertyAttr *attr) +LibertyReader::readVoltateMaps(const LibertyGroup *library_group) { - visitVariable(0, attr); -} - -void -LibertyReader::visitVariable2(LibertyAttr *attr) -{ - visitVariable(1, attr); -} - -void -LibertyReader::visitVariable3(LibertyAttr *attr) -{ - visitVariable(2, attr); -} - -void -LibertyReader::visitVariable(int index, - LibertyAttr *attr) -{ - if (tbl_template_) { - const char *type = getAttrString(attr); - TableAxisVariable var = stringTableAxisVariable(type); - if (var == TableAxisVariable::unknown) - libWarn(1297, attr, "axis type %s not supported.", type); - else - axis_var_[index] = var; + for (const LibertyComplexAttr *volt_attr : + library_group->findComplexAttrs("voltage_map")) { + const LibertyAttrValueSeq &values = volt_attr->values(); + if (values.size() == 2) { + const std::string &volt_name = values[0]->stringValue(); + float volt; + bool valid; + values[1]->floatValue(volt, valid); + if (valid) + library_->addSupplyVoltage(volt_name.c_str(), volt); + else + libWarn(1166, volt_attr, "voltage_map voltage is not a float."); + } } } void -LibertyReader::visitIndex1(LibertyAttr *attr) +LibertyReader::readOperatingConds(const LibertyGroup *library_group) { - visitIndex(0, attr); + for (const LibertyGroup *opcond_group : + library_group->findSubgroups("operating_conditions")) { + const char *name = opcond_group->firstName(); + if (name) { + OperatingConditions *op_cond = library_->makeOperatingConditions(name); + float value; + bool exists; + opcond_group->findAttrFloat("process", value, exists); + if (exists) + op_cond->setProcess(value); + opcond_group->findAttrFloat("temperature", value, exists); + if (exists) + op_cond->setTemperature(value); + opcond_group->findAttrFloat("voltage", value, exists); + if (exists) + op_cond->setVoltage(value); + const std::string *tree_type = opcond_group->findAttrString("tree_type"); + if (tree_type) { + WireloadTree wireload_tree = stringWireloadTree(tree_type->c_str()); + op_cond->setWireloadTree(wireload_tree); + } + } + } + + const std::string *default_op_cond = + library_group->findAttrString("default_operating_conditions"); + if (default_op_cond) { + OperatingConditions *op_cond = + library_->findOperatingConditions(default_op_cond->c_str()); + if (op_cond) + library_->setDefaultOperatingConditions(op_cond); + else + libWarn(1144, library_group, "default_operating_condition %s not found.", + default_op_cond->c_str()); + } } void -LibertyReader::visitIndex2(LibertyAttr *attr) +LibertyReader::readScaleFactors(const LibertyGroup *library_group) { - visitIndex(1, attr); + // Top level scale factors. + ScaleFactors *scale_factors = library_->makeScaleFactors(""); + library_->setScaleFactors(scale_factors); + readScaleFactors(library_group, scale_factors); + + // Named scale factors. + for (const LibertyGroup *scale_group : library_group->findSubgroups("scaling_factors")){ + const char *name = scale_group->firstName(); + if (name) { + ScaleFactors *scale_factors = library_->makeScaleFactors(name); + readScaleFactors(scale_group, scale_factors); + } + } } void -LibertyReader::visitIndex3(LibertyAttr *attr) +LibertyReader::readScaleFactors(const LibertyGroup *scale_group, + ScaleFactors *scale_factors) { - visitIndex(2, attr); + // Skip unknown type. + for (int type_index = 0; type_index < scale_factor_type_count - 1; type_index++) { + ScaleFactorType type = static_cast(type_index); + const char *type_name = scaleFactorTypeName(type); + // Skip unknown pvt. + for (int pvt_index = 0; pvt_index < scale_factor_pvt_count - 1; pvt_index++) { + ScaleFactorPvt pvt = static_cast(pvt_index); + const std::string pvt_name = scaleFactorPvtName(pvt); + std::string attr_name; + for (const RiseFall *rf : RiseFall::range()) { + if (scaleFactorTypeRiseFallSuffix(type)) { + const std::string rf_name = (rf == RiseFall::rise()) ? "rise" : "fall"; + attr_name = "k_" + pvt_name + "_" + type_name + "_" + rf_name; + } + else if (scaleFactorTypeRiseFallPrefix(type)) { + const char *rf_name = (rf == RiseFall::rise()) ? "rise" : "fall"; + attr_name = "k_" + pvt_name + "_" + rf_name + "_" + type_name; + } + else if (scaleFactorTypeLowHighSuffix(type)) { + const char *rf_name = (rf == RiseFall::rise()) ? "high":"low"; + attr_name = "k_" + pvt_name + "_" + type_name + "_" + rf_name; + } + else + attr_name = "k_" + pvt_name + "_" + type_name; + float value; + bool exists; + scale_group->findAttrFloat(attr_name, value, exists); + if (exists) + scale_factors->setScale(type, pvt, rf, value); + } + } + } } void -LibertyReader::visitIndex(int index, - LibertyAttr *attr) +LibertyReader::readWireloads(const LibertyGroup *library_group) { - if (tbl_template_ - // Ignore index_* in ecsm_waveform groups. - && !in_ecsm_waveform_) { - FloatSeq axis_values = readFloatSeq(attr, 1.0F); + for (const LibertyGroup *wl_group : library_group->findSubgroups("wire_load")) { + const char *name = wl_group->firstName(); + if (name) { + Wireload *wireload = library_->makeWireload(name); + float value; + bool exists; + wl_group->findAttrFloat("resistance", value, exists); + if (exists) + wireload->setResistance(value * res_scale_); + + wl_group->findAttrFloat("capacitance", value, exists); + if (exists) + wireload->setCapacitance(value * cap_scale_); + + wl_group->findAttrFloat("slope", value, exists); + if (exists) + wireload->setSlope(value); + + for (const LibertyComplexAttr *fanout_attr : + wl_group->findComplexAttrs("fanout_length")) { + float fanout, length; + bool exists; + getAttrFloat2(fanout_attr, fanout, length, exists); + if (exists) + wireload->addFanoutLength(fanout, length); + else + libWarn(1185, fanout_attr, "fanout_length is missing length and fanout."); + } + } + else + libWarn(1184, wl_group, "wire_load missing name."); + } +} + +void +LibertyReader::readWireloadSelection(const LibertyGroup *library_group) +{ + const LibertyGroup *sel_group = library_group->findSubgroup("wire_load_selection"); + if (sel_group) { + const char *name = sel_group->firstName(); + if (name == nullptr) + name = ""; + WireloadSelection *wireload_selection = library_->makeWireloadSelection(name); + for (const LibertyComplexAttr *area_attr : + sel_group->findComplexAttrs("wire_load_from_area")) { + const LibertyAttrValueSeq &values = area_attr->values(); + if (values.size() == 3) { + LibertyAttrValue *value = values[0]; + if (value->isFloat()) { + float min_area = value->floatValue(); + value = values[1]; + if (value->isFloat()) { + float max_area = value->floatValue(); + value = values[2]; + if (value->isString()) { + const std::string &wireload_name = value->stringValue(); + const Wireload *wireload = + library_->findWireload(wireload_name.c_str()); + if (wireload) + wireload_selection->addWireloadFromArea(min_area, max_area, + wireload); + else + libWarn(1187, area_attr, "wireload %s not found.", wireload_name.c_str()); + } + else + libWarn(1188, area_attr, + "wire_load_from_area wireload name not a string."); + } + else + libWarn(1189, area_attr, "wire_load_from_area min not a float."); + } + else + libWarn(1190, area_attr, "wire_load_from_area max not a float."); + } + else + libWarn(1191, area_attr, "wire_load_from_area missing parameters."); + } + } +} + +void +LibertyReader::readDefaultWireLoad(const LibertyGroup *library_group) +{ + const std::string *wireload_name = library_group->findAttrString("default_wire_load"); + if (wireload_name) { + const Wireload *wireload = library_->findWireload(wireload_name->c_str()); + if (wireload) + library_->setDefaultWireload(wireload); + else + libWarn(1142, library_group, "default_wire_load %s not found.", + wireload_name->c_str()); + } +} + +void +LibertyReader::readDefaultWireLoadMode(const LibertyGroup *library_group) +{ + const std::string *wire_load_mode = + library_group->findAttrString("default_wire_load_mode"); + if (wire_load_mode) { + WireloadMode mode = stringWireloadMode(wire_load_mode->c_str()); + if (mode != WireloadMode::unknown) + library_->setDefaultWireloadMode(mode); + else + libWarn(1174, library_group, "default_wire_load_mode %s not found.", + wire_load_mode->c_str()); + } +} + +void +LibertyReader::readDefaultWireLoadSelection(const LibertyGroup *library_group) +{ + const std::string *selection_name = + library_group->findAttrString("default_wire_load_selection"); + if (selection_name) { + const WireloadSelection *selection = + library_->findWireloadSelection(selection_name->c_str()); + if (selection) + library_->setDefaultWireloadSelection(selection); + else + libWarn(1143, library_group, "default_wire_selection %s not found.", + selection_name->c_str()); + } +} + +void +LibertyReader::readModeDefs(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + for (const LibertyGroup *mode_group : cell_group->findSubgroups("mode_definition")) { + const char *name = mode_group->firstName(); + if (name) { + ModeDef *mode_def = cell->makeModeDef(name); + for (const LibertyGroup *value_group : mode_group->findSubgroups("mode_value")) { + const char *value_name = value_group->firstName(); + if (value_name) { + ModeValueDef *mode_value = mode_def->defineValue(value_name, nullptr, nullptr); + const std::string *sdf_cond = value_group->findAttrString("sdf_cond"); + if (sdf_cond) + mode_value->setSdfCond(sdf_cond->c_str()); + const std::string *when = value_group->findAttrString("when"); + if (when) { + // line + FuncExpr *when_expr = parseFunc(when->c_str(), "when", cell, + value_group->line()); + mode_value->setCond(when_expr); + } + } + else + libWarn(1264, value_group, "mode value missing name."); + } + } + else + libWarn(1263, mode_group, "mode definition missing name."); + } +} + +void +LibertyReader::readSlewDegradations(const LibertyGroup *library_group) +{ + for (const RiseFall *rf : RiseFall::range()) { + const std::string group_name = rf->to_string_long() + "_transition_degradation"; + const LibertyGroup *degradation_group = + library_group->findSubgroup(group_name.c_str()); + if (degradation_group) { + TableModel *table_model = readTableModel(degradation_group, rf, + TableTemplateType::delay, + time_scale_, + ScaleFactorType::transition); + if (LibertyLibrary::checkSlewDegradationAxes(table_model)) + library_->setWireSlewDegradationTable(table_model, rf); + else + libWarn(1254, degradation_group, "unsupported model axis."); + } + } +} + +void +LibertyReader::readLibAttrFloat(const LibertyGroup *library_group, + const char *attr_name, + void (LibertyLibrary::*set_func)(float value), + float scale) +{ + float value; + bool exists; + library_group->findAttrFloat(attr_name, value, exists); + if (exists) + (library_->*set_func)(value * scale); +} + +void +LibertyReader::readLibAttrFloat(const LibertyGroup *library_group, + const char *attr_name, + void (LibertyLibrary::*set_func)(const RiseFall *rf, + float value), + const RiseFall *rf, + float scale) +{ + float value; + bool exists; + library_group->findAttrFloat(attr_name, value, exists); + if (exists) + (library_->*set_func)(rf, value * scale); +} + +void +LibertyReader::readLibAttrFloatWarnZero(const LibertyGroup *library_group, + const char *attr_name, + void (LibertyLibrary::*set_func)(float value), + float scale) +{ + float value; + bool exists; + library_group->findAttrFloat(attr_name, value, exists); + if (exists) { + if (value == 0.0F) { + const LibertySimpleAttr *attr = library_group->findSimpleAttr(attr_name); + if (attr) + libWarn(1171, attr, "%s is 0.0.", attr_name); + else + libWarn(1172, library_group, "%s is 0.0.", attr_name); + } + (library_->*set_func)(value * scale); + } +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::readCell(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + readBusTypes(cell, cell_group); + // Make ports first because they are referenced by functions, timing arcs, etc. + LibertyPortGroupMap port_group_map = makeCellPorts(cell, cell_group); + + // Make ff/latch output ports. + makeSequentials(cell, cell_group); + + readCellAttributes(cell, cell_group); + + // Set port directions before making timing arcs etc. + for (auto const &[port_group, ports] : port_group_map) + readPortDir(ports, port_group); + + for (auto const &[port_group, ports] : port_group_map) { + readPortAttributes(cell, ports, port_group); + makePortFuncs(cell, ports, port_group); + makeTimingArcs(cell, ports, port_group); + readInternalPowerGroups(cell, ports, port_group); + } + + readTestCell(cell, cell_group); + + cell->finish(infer_latches_, report_, debug_); +} + +void +LibertyReader::readScaledCell(const LibertyGroup *scaled_cell_group) +{ + const char *name = scaled_cell_group->firstName(); + if (name) { + LibertyCell *owner = library_->findLibertyCell(name); + if (owner) { + const char *op_cond_name = scaled_cell_group->secondName(); + if (op_cond_name) { + OperatingConditions *op_cond = library_->findOperatingConditions(op_cond_name); + if (op_cond) { + debugPrint(debug_, "liberty", 1, "scaled cell %s %s", + name, op_cond_name); + LibertyCell *scaled_cell = library_->makeScaledCell(name, filename_); + readCell(scaled_cell, scaled_cell_group); + checkScaledCell(scaled_cell, owner, scaled_cell_group, op_cond_name); + // Add scaled cell AFTER ports and timing arcs are defined. + owner->addScaledCell(op_cond, scaled_cell); + } + else + libWarn(1202, scaled_cell_group, "operating conditions %s not found.", + op_cond_name); + } + else + libWarn(1203, scaled_cell_group, "scaled_cell missing operating condition."); + } + else + libWarn(1204, scaled_cell_group, "scaled_cell cell %s has not been defined.", name); + } + else + libWarn(1205, scaled_cell_group, "scaled_cell missing name."); +} + +// Minimal check that is not very specific about where the discrepancies are. +void +LibertyReader::checkScaledCell(LibertyCell *scaled_cell, + LibertyCell *owner, + const LibertyGroup *scaled_cell_group, + const char *op_cond_name) +{ + if (equivCellPorts(scaled_cell, owner)) { + if (!equivCellPorts(scaled_cell, owner)) + libWarn(1206, scaled_cell_group, "scaled_cell %s, %s ports do not match cell ports", + scaled_cell->name(), + op_cond_name); + if (!equivCellFuncs(scaled_cell, owner)) + libWarn(1206, scaled_cell_group, + "scaled_cell %s, %s port functions do not match cell port functions.", + scaled_cell->name(), + op_cond_name); + } + else + libWarn(1207, scaled_cell_group, "scaled_cell ports do not match cell ports."); + if (!equivCellTimingArcSets(scaled_cell, owner)) + libWarn(1208, scaled_cell_group, + "scaled_cell %s, %s timing does not match cell timing.", + scaled_cell->name(), + op_cond_name); +} + +LibertyPortGroupMap +LibertyReader::makeCellPorts(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + LibertyPortGroupMap port_group_map; + for (const LibertyGroup *subgroup : cell_group->subgroups()) { + const std::string &type = subgroup->type(); + if (type == "pin") + makePinPort(cell, subgroup, port_group_map); + else if (type == "bus") + makeBusPort(cell, subgroup, port_group_map); + else if (type == "bundle") + makeBundlePort(cell, subgroup, port_group_map); + else if (type == "pg_pin") + makePgPinPort(cell, subgroup); + } + return port_group_map; +} + +void +LibertyReader::makePinPort(LibertyCell *cell, + const LibertyGroup *pin_group, + LibertyPortGroupMap &port_group_map) +{ + for (const LibertyAttrValue *port_value : pin_group->params()) { + const std::string &port_name = port_value->stringValue(); + LibertyPort *port = makePort(cell, port_name.c_str()); + port_group_map[pin_group].push_back(port); + } +} + +void +LibertyReader::makeBusPort(LibertyCell *cell, + const LibertyGroup *bus_group, + LibertyPortGroupMap &port_group_map) +{ + for (const LibertyAttrValue *port_value : bus_group->params()) { + const std::string &port_name = port_value->stringValue(); + const LibertySimpleAttr *bus_type_attr = bus_group->findSimpleAttr("bus_type"); + if (bus_type_attr) { + const std::string *bus_type = bus_type_attr->stringValue(); + if (bus_type) { + // Look for bus dcl local to cell first. + BusDcl *bus_dcl = cell->findBusDcl(bus_type->c_str()); + if (bus_dcl == nullptr) + bus_dcl = library_->findBusDcl(bus_type->c_str()); + if (bus_dcl) { + debugPrint(debug_, "liberty", 1, " bus %s", port_name.c_str()); + LibertyPort *bus_port = makeBusPort(cell, port_name.c_str(), + bus_dcl->from(), bus_dcl->to(), + bus_dcl); + port_group_map[bus_group].push_back(bus_port); + // Make ports for pin groups inside the bus group. + makeBusPinPorts(cell, bus_group, port_group_map); + } + else + libWarn(1235, bus_type_attr, "bus_type %s not found.", bus_type->c_str()); + } + } + else + libWarn(1236, bus_type_attr, "bus_type not found."); + } +} + +void +LibertyReader::makeBusPinPorts(LibertyCell *cell, + const LibertyGroup *bus_group, + LibertyPortGroupMap &port_group_map) +{ + for (const LibertyGroup *pin_group : bus_group->findSubgroups("pin")) { + for (const LibertyAttrValue *param : pin_group->params()) { + if (param->isString()) { + const std::string pin_name = param->stringValue(); + debugPrint(debug_, "liberty", 1, " bus pin port %s", pin_name.c_str()); + // Expand foo[3:0] port names. + PortNameBitIterator name_iter(cell, pin_name.c_str(), this, pin_group->line()); + while (name_iter.hasNext()) { + LibertyPort *pin_port = name_iter.next(); + if (pin_port) { + port_group_map[pin_group].push_back(pin_port); + } + else + libWarn(1232, pin_group, "pin %s not found.", pin_name.c_str()); + } + } + else + libWarn(1233, pin_group, "pin name is not a string."); + } + } +} + +void +LibertyReader::makeBundlePort(LibertyCell *cell, + const LibertyGroup *bundle_group, + LibertyPortGroupMap &port_group_map) +{ + const std::string &bundle_name = bundle_group->firstName(); + debugPrint(debug_, "liberty", 1, " bundle %s", bundle_name.c_str()); + + const LibertyComplexAttr *member_attr = bundle_group->findComplexAttr("members"); + ConcretePortSeq *members = new ConcretePortSeq; + for (const LibertyAttrValue *member_value : member_attr->values()) { + if (member_value->isString()) { + const char *member_name = member_value->stringValue().c_str(); + LibertyPort *member = cell->findLibertyPort(member_name); + if (member == nullptr) + member = makePort(cell, member_name); + members->push_back(member); + } + } + LibertyPort *bundle_port = builder_.makeBundlePort(cell, bundle_name.c_str(), + members); + port_group_map[bundle_group].push_back(bundle_port); + // Make ports for pin groups inside the bundle group. + makeBundlePinPorts(cell, bundle_group, port_group_map); +} + +void +LibertyReader::makeBundlePinPorts(LibertyCell *cell, + const LibertyGroup *bundle_group, + LibertyPortGroupMap &port_group_map) +{ + for (const LibertyGroup *pin_group : bundle_group->findSubgroups("pin")) { + for (LibertyAttrValue *param : pin_group->params()) { + if (param->isString()) { + const std::string pin_name = param->stringValue(); + debugPrint(debug_, "liberty", 1, " bundle pin port %s", pin_name.c_str()); + LibertyPort *pin_port = cell->findLibertyPort(pin_name.c_str()); + if (pin_port == nullptr) + pin_port = makePort(cell, pin_name.c_str()); + port_group_map[pin_group].push_back(pin_port); + } + else + libWarn(1234, pin_group, "pin name is not a string."); + } + } +} + +void +LibertyReader::makePgPinPort(LibertyCell *cell, + const LibertyGroup *pg_pin_group) +{ + const std::string &port_name = pg_pin_group->firstName(); + LibertyPort *pg_port = makePort(cell, port_name.c_str()); + + const std::string *type_name = pg_pin_group->findAttrString("pg_type"); + if (type_name) { + PwrGndType type = findPwrGndType(type_name->c_str()); + PortDirection *dir = PortDirection::unknown(); + switch (type) { + case PwrGndType::primary_ground: + case PwrGndType::backup_ground: + case PwrGndType::internal_ground: + dir = PortDirection::ground(); + break; + case PwrGndType::primary_power: + case PwrGndType::backup_power: + case PwrGndType::internal_power: + dir = PortDirection::power(); + break; + case PwrGndType::none: + libError(1291, pg_pin_group, "unknown pg_type."); + break; + default: + break; + } + pg_port->setPwrGndType(type); + pg_port->setDirection(dir); + } + + const std::string *voltate_name = pg_pin_group->findAttrString("voltage_name"); + if (voltate_name) + pg_port->setVoltageName(voltate_name->c_str()); +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::readPortAttributes(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + readCapacitance(ports, port_group); + readMinPulseWidth(cell, ports, port_group); + readPortAttrFloat("min_period", &LibertyPort::setMinPeriod, ports, + port_group, time_scale_); + readPortAttrBool("clock", &LibertyPort::setIsClock, ports, port_group); + readPortAttrFloat("fanout_load", &LibertyPort::setFanoutLoad, ports, + port_group, 1.0F); + readPortAttrFloatMinMax("max_fanout", &LibertyPort::setFanoutLimit, ports, + port_group, MinMax::max(), 1.0F); + readPortAttrFloatMinMax("min_fanout", &LibertyPort::setFanoutLimit, ports, + port_group, MinMax::min(), 1.0F); + readPulseClock(ports, port_group); + readPortAttrBool("clock_gate_clock_pin", &LibertyPort::setIsClockGateClock, + ports, port_group); + readPortAttrBool("clock_gate_enable_pin", &LibertyPort::setIsClockGateEnable, + ports, port_group); + readPortAttrBool("clock_gate_out_pin", &LibertyPort::setIsClockGateOut, + ports, port_group); + readPortAttrBool("is_pll_feedback_pin", &LibertyPort::setIsPllFeedback, + ports, port_group); + readSignalType(cell, ports, port_group); + readPortAttrBool("isolation_cell_data_pin", + &LibertyPort::setIsolationCellData, ports, port_group); + readPortAttrBool("isolation_cell_enable_pin", + &LibertyPort::setIsolationCellEnable, ports, port_group); + readPortAttrBool("level_shifter_data_pin", + &LibertyPort::setLevelShifterData, ports, port_group); + readPortAttrBool("switch_pin", &LibertyPort::setIsSwitch, ports, port_group); + readPortAttrString("related_ground_pin", &LibertyPort::setRelatedGroundPin, + ports, port_group); + readPortAttrString("related_power_pin", &LibertyPort::setRelatedPowerPin, + ports, port_group); + readDriverWaveform(ports, port_group); +} + +void +LibertyReader::readDriverWaveform(const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + for (const RiseFall *rf : RiseFall::range()) { + const char *attr_name = rf == RiseFall::rise() + ? "driver_waveform_rise" : "driver_waveform_fall"; + const std::string *name = port_group->findAttrString(attr_name); + if (name) { + DriverWaveform *waveform = library_->findDriverWaveform(name->c_str()); + if (waveform) { + for (LibertyPort *port : ports) + port->setDriverWaveform(waveform, rf); + } + } + } +} + +void +LibertyReader::readPortAttrString(const char *attr_name, + void (LibertyPort::*set_func)(const char *value), + const LibertyPortSeq &ports, + const LibertyGroup *group) +{ + const std::string *value = group->findAttrString(attr_name); + if (value) { + for (LibertyPort *port : ports) + (port->*set_func)(value->c_str()); + } +} + +void +LibertyReader::readPortAttrFloat(const char *attr_name, + void (LibertyPort::*set_func)(float value), + const LibertyPortSeq &ports, + const LibertyGroup *group, + float scale) +{ + float value; + bool exists; + group->findAttrFloat(attr_name, value, exists); + if (exists) { + for (LibertyPort *port : ports) + (port->*set_func)(value * scale); + } +} + +void +LibertyReader::readPortAttrBool(const char *attr_name, + void (LibertyPort::*set_func)(bool value), + const LibertyPortSeq &ports, + const LibertyGroup *group) +{ + const LibertySimpleAttr *attr = group->findSimpleAttr(attr_name); + if (attr) { + const LibertyAttrValue &attr_value = attr->value(); + if (attr_value.isString()) { + const std::string &value = attr_value.stringValue(); + if (stringEqual(value.c_str(), "true")) { + for (LibertyPort *port : ports) + (port->*set_func)(true); + } + else if (stringEqual(value.c_str(), "false")) { + for (LibertyPort *port : ports) + (port->*set_func)(false); + } + else + libWarn(1238, attr, "%s attribute is not boolean.", attr_name); + } + else + libWarn(1239, attr, "%s attribute is not boolean.", attr_name); + } +} + +void +LibertyReader::readPortAttrFloatMinMax(const char *attr_name, + void (LibertyPort::*set_func)(float value, + const MinMax *min_max), + const LibertyPortSeq &ports, + const LibertyGroup *group, + const MinMax *min_max, + float scale) +{ + float value; + bool exists; + group->findAttrFloat(attr_name, value, exists); + if (exists) { + for (LibertyPort *port : ports) + (port->*set_func)(value * scale, min_max); + } +} + +void +LibertyReader::readPulseClock(const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + const std::string *pulse_clk = port_group->findAttrString("pulse_clock"); + if (pulse_clk) { + const RiseFall *trigger = nullptr; + const RiseFall *sense = nullptr; + if (*pulse_clk == "rise_triggered_high_pulse") { + trigger = RiseFall::rise(); + sense = RiseFall::rise(); + } + else if (*pulse_clk == "rise_triggered_low_pulse") { + trigger = RiseFall::rise(); + sense = RiseFall::fall(); + } + else if (*pulse_clk == "fall_triggered_high_pulse") { + trigger = RiseFall::fall(); + sense = RiseFall::rise(); + } + else if (*pulse_clk == "fall_triggered_low_pulse") { + trigger = RiseFall::fall(); + sense = RiseFall::fall(); + } + else + libWarn(1242, port_group, "pulse_latch unknown pulse type."); + if (trigger) { + for (LibertyPort *port : ports) + port->setPulseClk(trigger, sense); + } + } +} + +void +LibertyReader::readSignalType(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + if (!dynamic_cast(cell)) + return; + const std::string *type = port_group->findAttrString("signal_type"); + if (!type) + return; + ScanSignalType signal_type = ScanSignalType::none; + if (*type == "test_scan_enable") + signal_type = ScanSignalType::enable; + else if (*type == "test_scan_enable_inverted") + signal_type = ScanSignalType::enable_inverted; + else if (*type == "test_scan_clock") + signal_type = ScanSignalType::clock; + else if (*type == "test_scan_clock_a") + signal_type = ScanSignalType::clock_a; + else if (*type == "test_scan_clock_b") + signal_type = ScanSignalType::clock_b; + else if (*type == "test_scan_in") + signal_type = ScanSignalType::input; + else if (*type == "test_scan_in_inverted") + signal_type = ScanSignalType::input_inverted; + else if (*type == "test_scan_out") + signal_type = ScanSignalType::output; + else if (*type == "test_scan_out_inverted") + signal_type = ScanSignalType::output_inverted; + else { + libWarn(1299, port_group, "unknown signal_type %s.", type->c_str()); + return; + } + for (LibertyPort *port : ports) + port->setScanSignalType(signal_type); +} + +void +LibertyReader::readPortDir(const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + const LibertySimpleAttr *dir_attr = port_group->findSimpleAttr("direction"); + // Note missing direction attribute is not an error because a bus group + // can have pin groups for the bus bits that have direcitons. + if (dir_attr) { + const std::string *dir = dir_attr->stringValue(); + if (dir) { + PortDirection *port_dir = PortDirection::unknown(); + if (*dir == "input") + port_dir = PortDirection::input(); + else if (*dir == "output") + port_dir = PortDirection::output(); + else if (*dir == "inout") + port_dir = PortDirection::bidirect(); + else if (*dir == "internal") + port_dir = PortDirection::internal(); + else + libWarn(1240, dir_attr, "unknown port direction."); + for (LibertyPort *port : ports) + port->setDirection(port_dir); + } + } +} + +void +LibertyReader::readCapacitance(const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + // capacitance + readPortAttrFloat("capacitance", &LibertyPort::setCapacitance, ports, + port_group, cap_scale_); + + for (LibertyPort *port : ports) { + // rise/fall_capacitance + for (const RiseFall *rf : RiseFall::range()) { + std::string attr_name = rf->to_string_long() + "_capacitance"; + float cap; + bool exists; + port_group->findAttrFloat(attr_name, cap, exists); + if (exists) { + for (const MinMax *min_max : MinMax::range()) + port->setCapacitance(rf, min_max, cap * cap_scale_); + } + + // rise/fall_capacitance_range(min_cap, max_cap); + attr_name = rf->to_string_long() + "_capacitance_range"; + const LibertyComplexAttrSeq &range_attrs = port_group->findComplexAttrs(attr_name); + if (!range_attrs.empty()) { + const LibertyComplexAttr *attr = range_attrs[0]; + const LibertyAttrValueSeq &values = attr->values(); + if (values.size() == 2) { + float cap_min = values[0]->floatValue(); + float cap_max = values[1]->floatValue(); + port->setCapacitance(rf, MinMax::min(), cap_min * cap_scale_); + port->setCapacitance(rf, MinMax::max(), cap_max * cap_scale_); + } + } + } + if (!(port->isBus() || port->isBundle())) + setPortCapDefault(port); + + for (const MinMax *min_max : MinMax::range()) { + // min/max_capacitance + std::string attr_name = min_max->to_string() + "_capacitance"; + float limit; + bool exists; + port_group->findAttrFloat(attr_name, limit, exists); + if (exists) + port->setCapacitanceLimit(limit * cap_scale_, min_max); + + // min/max_transition + attr_name = min_max->to_string() + "_transition"; + port_group->findAttrFloat(attr_name, limit, exists); + if (exists) + port->setSlewLimit(limit * time_scale_, min_max); + } + + // Default capacitance. + if (port->isBus() || port->isBundle()) { + // Do not clobber member port capacitances by setting the capacitance + // on a bus or bundle. + LibertyPortMemberIterator member_iter(port); + while (member_iter.hasNext()) { + LibertyPort *member = member_iter.next(); + setPortCapDefault(member); + } + } + else + setPortCapDefault(port); + } +} + +void +LibertyReader::setPortCapDefault(LibertyPort *port) +{ + for (const MinMax *min_max : MinMax::range()) { + for (const RiseFall *rf : RiseFall::range()) { + float cap; + bool exists; + port->capacitance(rf, min_max, cap, exists); + if (!exists) + port->setCapacitance(rf, min_max, defaultCap(port)); + } + } +} + +void +LibertyReader::readMinPulseWidth(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + for (LibertyPort *port : ports) { + TimingArcAttrsPtr timing_attrs = nullptr; + for (const RiseFall *rf : RiseFall::range()) { + const char *mpw_attr_name = rf == RiseFall::rise() + ? "min_pulse_width_high" + : "min_pulse_width_low"; + float mpw; + bool exists; + port_group->findAttrFloat(mpw_attr_name, mpw, exists); + if (exists) { + mpw *= time_scale_; + port->setMinPulseWidth(rf, mpw); + + // Make timing arcs for the port min_pulse_width_low/high attributes. + // This is redundant but makes sdf annotation consistent. + if (timing_attrs == nullptr) { + timing_attrs = std::make_shared(); + timing_attrs->setTimingType(TimingType::min_pulse_width); + } + TimingModel *check_model = + makeScalarCheckModel(cell, mpw, ScaleFactorType::min_pulse_width, rf); + timing_attrs->setModel(rf, check_model); + } + } + if (timing_attrs) + builder_.makeTimingArcs(cell, port, port, nullptr, timing_attrs, + port_group->line()); + } +} + +void +LibertyReader::makePortFuncs(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + const LibertySimpleAttr *func_attr = port_group->findSimpleAttr("function"); + if (func_attr) { + const std::string *func = func_attr->stringValue(); + if (func) { + FuncExpr *func_expr = parseFunc(func->c_str(), "function", cell, func_attr->line()); + for (LibertyPort *port : ports) { + port->setFunction(func_expr); + if (func_expr->checkSize(port)) { + libWarn(1195, func_attr->line(), + "port %s function size does not match port size.", + port->name()); + } + } + } + } + + const LibertySimpleAttr *tri_attr = port_group->findSimpleAttr("three_state"); + if (tri_attr) { + const std::string *tri_disable = tri_attr->stringValue(); + if (tri_disable) { + FuncExpr *tri_disable_expr = parseFunc(tri_disable->c_str(), + "three_state", cell, + tri_attr->line()); + FuncExpr *tri_enable_expr = tri_disable_expr->invert(); + for (LibertyPort *port : ports) { + port->setTristateEnable(tri_enable_expr); + if (port->direction() == PortDirection::output()) + port->setDirection(PortDirection::tristate()); + } + } + } +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::makeSequentials(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + makeSequentials(cell, cell_group, true, "ff", "clocked_on", "next_state"); + makeSequentials(cell, cell_group, true, "ff_bank", "clocked_on", "next_state"); + makeSequentials(cell, cell_group, false, "latch", "enable", "data_in"); + makeSequentials(cell, cell_group, false, "latch_bank", "enable", "data_in"); + + const LibertyGroup *lut_group = cell_group->findSubgroup("lut");; + if (lut_group) { + LibertyPort *out_port = nullptr; + LibertyPort *out_port_inv = nullptr; + size_t size; + makeSeqPorts(cell, lut_group, out_port, out_port_inv, size); + } +} + +void +LibertyReader::makeSequentials(LibertyCell *cell, + const LibertyGroup *cell_group, + bool is_register, + const char *seq_group_name, + const char *clk_attr_name, + const char *data_attr_name) +{ + for (const LibertyGroup *seq_group : cell_group->findSubgroups(seq_group_name)) { + LibertyPort *out_port = nullptr; + LibertyPort *out_port_inv = nullptr; + size_t size; + makeSeqPorts(cell, seq_group, out_port, out_port_inv, size); + FuncExpr *clk_expr = makeSeqFunc(cell, seq_group, clk_attr_name, size); + FuncExpr *data_expr = makeSeqFunc(cell, seq_group, data_attr_name, size); + FuncExpr *clr_expr = makeSeqFunc(cell, seq_group, "clear", size); + FuncExpr *preset_expr = makeSeqFunc(cell, seq_group, "preset", size); + + LogicValue clr_preset_var1 = LogicValue::unknown; + const LibertySimpleAttr *var1 = seq_group->findSimpleAttr("clear_preset_var1"); + if (var1) + clr_preset_var1 = getAttrLogicValue(var1); + + LogicValue clr_preset_var2 = LogicValue::unknown; + const LibertySimpleAttr *var2 = seq_group->findSimpleAttr("clear_preset_var2"); + if (var2) + clr_preset_var2 = getAttrLogicValue(var2); + + cell->makeSequential(size, is_register, clk_expr, data_expr, clr_expr, + preset_expr, clr_preset_var1, clr_preset_var2, + out_port, out_port_inv); + } +} + +FuncExpr * +LibertyReader::makeSeqFunc(LibertyCell *cell, + const LibertyGroup *seq_group, + const char *attr_name, + int size) +{ + FuncExpr *expr = nullptr; + const std::string *attr = seq_group->findAttrString(attr_name); + if (attr) { + expr = parseFunc(attr->c_str(), attr_name, cell, seq_group->line()); + if (expr && expr->checkSize(size)) { + libWarn(1196, seq_group, "%s %s bus width mismatch.", + seq_group->type().c_str(), attr_name); + delete expr; + expr = nullptr; + } + } + return expr; +} + +void +LibertyReader::makeSeqPorts(LibertyCell *cell, + const LibertyGroup *seq_group, + // Return values. + LibertyPort *&out_port, + LibertyPort *&out_port_inv, + size_t &size) +{ + const char *out_name, *out_inv_name; + bool has_size; + seqPortNames(seq_group, out_name, out_inv_name, has_size, size); + if (out_name) { + if (has_size) + out_port = makeBusPort(cell, out_name, size - 1, 0, nullptr); + else + out_port = makePort(cell, out_name); + out_port->setDirection(PortDirection::internal()); + } + if (out_inv_name) { + if (has_size) + out_port_inv = makeBusPort(cell, out_inv_name, size - 1, 0, nullptr); + else + out_port_inv = makePort(cell, out_inv_name); + out_port_inv->setDirection(PortDirection::internal()); + } +} + +void +LibertyReader::seqPortNames(const LibertyGroup *group, + const char *&out_name, + const char *&out_inv_name, + bool &has_size, + size_t &size) +{ + out_name = nullptr; + out_inv_name = nullptr; + if (group->params().size() == 1) { + // out_port + out_name = group->firstName(); + size = 1; + has_size = false; + } + if (group->params().size() == 2) { + // out_port, out_port_inv + out_name = group->firstName(); + out_inv_name = group->secondName(); + size = 1; + has_size = false; + } + else if (group->params().size() == 3) { + LibertyAttrValue *third_value = group->params()[2]; + if (third_value->isFloat()) { + // out_port, out_port_inv, bus_size + out_name = group->firstName(); + out_inv_name = group->secondName(); + size = static_cast(third_value->floatValue()); + has_size = true; + } + else { + // in_port (ignored), out_port, out_port_inv + out_name = group->secondName(); + out_inv_name = third_value->stringValue().c_str(); + has_size = true; + size = 1; + } + } +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::readCellAttributes(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + readCellAttrFloat("area", &LibertyCell::setArea, cell, cell_group, 1.0); + readCellAttrString("cell_footprint", &LibertyCell::setFootprint, cell, cell_group); + readCellAttrBool("dont_use", &LibertyCell::setDontUse, cell, cell_group); + readCellAttrBool("is_macro_cell", &LibertyCell::setIsMacro, cell, cell_group); + readCellAttrBool("is_pad", &LibertyCell::setIsPad, cell, cell_group); + readCellAttrBool("is_level_shifter", &LibertyCell::setIsLevelShifter, cell, cell_group); + readCellAttrBool("is_clock_cell", &LibertyCell::setIsClockCell, cell, cell_group); + readCellAttrBool("is_isolation_cell", &LibertyCell::setIsIsolationCell,cell,cell_group); + readCellAttrBool("always_on", &LibertyCell::setAlwaysOn,cell,cell_group); + readCellAttrBool("interface_timing", &LibertyCell::setInterfaceTiming,cell,cell_group); + readCellAttrFloat("cell_leakage_power", &LibertyCell::setLeakagePower, cell, + cell_group, power_scale_); + + readCellAttrBool("is_memory", &LibertyCell::setIsMemory, cell, cell_group); + if (cell_group->findSubgroup("memory")) + cell->setIsMemory(true); + + readCellAttrBool("pad_cell", &LibertyCell::setIsPad, cell, cell_group); + readLevelShifterType(cell, cell_group); + readSwitchCellType(cell, cell_group); + readCellAttrString("user_function_class", &LibertyCell::setUserFunctionClass, + cell, cell_group); + + readOcvDerateFactors(cell, cell_group); + readCellOcvDerateGroup(cell, cell_group); + readGroupAttrFloat("ocv_arc_depth", cell_group, + [cell](float v) { cell->setOcvArcDepth(v); }); + + const std::string *clock_gate_type = + cell_group->findAttrString("clock_gating_integrated_cell"); + if (clock_gate_type) { + if (stringBeginEqual(clock_gate_type->c_str(), "latch_posedge")) + cell->setClockGateType(ClockGateType::latch_posedge); + else if (stringBeginEqual(clock_gate_type->c_str(), "latch_negedge")) + cell->setClockGateType(ClockGateType::latch_negedge); + else + cell->setClockGateType(ClockGateType::other); + } + + readScaleFactors(cell, cell_group); + readLeagageGrouops(cell, cell_group); + readStatetable(cell, cell_group); + readModeDefs(cell, cell_group); +} + +void +LibertyReader::readScaleFactors(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + const std::string *scale_factors_name = cell_group->findAttrString("scaling_factors"); + if (scale_factors_name) { + ScaleFactors *scale_factors = library_->findScaleFactors(scale_factors_name->c_str()); + if (scale_factors) + cell->setScaleFactors(scale_factors); + else + libWarn(1230, cell_group, "scaling_factors %s not found.", + scale_factors_name->c_str()); + } +} + +void +LibertyReader::readCellAttrString(const char *attr_name, + void (LibertyCell::*set_func)(const char *value), + LibertyCell *cell, + const LibertyGroup *group) +{ + const std::string *value = group->findAttrString(attr_name); + if (value) + (cell->*set_func)(value->c_str()); +} + +void +LibertyReader::readCellAttrFloat(const char *attr_name, + void (LibertyCell::*set_func)(float value), + LibertyCell *cell, + const LibertyGroup *group, + float scale) +{ + float value; + bool exists; + group->findAttrFloat(attr_name, value, exists); + if (exists) + (cell->*set_func)(value * scale); +} + +void +LibertyReader::readCellAttrBool(const char *attr_name, + void (LibertyCell::*set_func)(bool value), + LibertyCell *cell, + const LibertyGroup *group) +{ + const LibertySimpleAttr *attr = group->findSimpleAttr(attr_name); + if (attr) { + const LibertyAttrValue &attr_value = attr->value(); + if (attr_value.isString()) { + const std::string &value = attr_value.stringValue(); + if (stringEqual(value.c_str(), "true")) + (cell->*set_func)(true); + else if (stringEqual(value.c_str(), "false")) + (cell->*set_func)(false); + else + libWarn(1279, attr, "%s attribute is not boolean.", attr_name); + } + else + libWarn(1280, attr, "%s attribute is not boolean.", attr_name); + } +} + +//////////////////////////////////////////////////////////////// + +void +LibertyReader::makeTimingArcs(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + for (const LibertyGroup *timing_group : port_group->findSubgroups("timing")) { + TimingArcAttrsPtr timing_attrs = std::make_shared(); + readTimingArcAttrs(cell, timing_group, timing_attrs); + makeTimingModels(cell, timing_group, timing_attrs); + + LibertyPort *related_output_port = findLibertyPort(cell, timing_group, + "related_output_pin"); + StdStringSeq related_port_names = findAttributStrings(timing_group, "related_pin"); + StdStringSeq related_bus_names=findAttributStrings(timing_group,"related_bus_pins"); + TimingType timing_type = timing_attrs->timingType(); + + for (LibertyPort *to_port : ports) { + if (timing_type == TimingType::combinational && + to_port->direction()->isInput()) + libWarn(1209, timing_group, "combinational timing to an input port."); + + if (related_port_names.size() || related_bus_names.size()) { + for (const std::string &from_port_name : related_port_names) { + debugPrint(debug_, "liberty", 2, " timing %s -> %s", + from_port_name.c_str(), to_port->name()); + makeTimingArcs(cell, from_port_name, to_port, related_output_port, true, + timing_attrs, timing_group->line()); + } + for (const std::string &from_port_name : related_bus_names) { + debugPrint(debug_, "liberty", 2, " timing %s -> %s", + from_port_name.c_str(), to_port->name()); + makeTimingArcs(cell, from_port_name, to_port, related_output_port, false, + timing_attrs, timing_group->line()); + } + } + else if (!(timing_type == TimingType::min_pulse_width + || timing_type == TimingType::minimum_period + || timing_type == TimingType::min_clock_tree_path + || timing_type == TimingType::max_clock_tree_path)) + libWarn(1243, timing_group, "timing group missing related_pin/related_bus_pin."); + else + makeTimingArcs(cell, to_port, related_output_port, + timing_attrs, timing_group->line()); + } + } +} + +void +LibertyReader::readTimingArcAttrs(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + readTimingSense(timing_group, timing_attrs); + readTimingType(timing_group, timing_attrs); + readTimingWhen(cell, timing_group, timing_attrs); + readTimingMode(timing_group, timing_attrs); + readGroupAttrFloat("ocv_arc_depth", timing_group, + [timing_attrs](float v) { timing_attrs->setOcvArcDepth(v); }); +} + +void +LibertyReader::readGroupAttrFloat(const char *attr_name, + const LibertyGroup *group, + const std::function &set_func, + float scale) +{ + float value; + bool exists; + group->findAttrFloat(attr_name, value, exists); + if (exists) + set_func(value * scale); +} + +void +LibertyReader::readTimingSense(const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + const LibertySimpleAttr *sense_attr = timing_group->findSimpleAttr("timing_sense"); + if (sense_attr) { + const std::string *sense_name = sense_attr->stringValue(); + if (sense_name) { + if (*sense_name == "non_unate") + timing_attrs->setTimingSense(TimingSense::non_unate); + else if (*sense_name == "positive_unate") + timing_attrs->setTimingSense(TimingSense::positive_unate); + else if (*sense_name == "negative_unate") + timing_attrs->setTimingSense(TimingSense::negative_unate); + else + libWarn(1245, timing_group, "unknown timing_sense %s.", sense_name->c_str()); + } + } +} + +void +LibertyReader::readTimingType(const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + TimingType type = TimingType::combinational; + const LibertySimpleAttr *type_attr = timing_group->findSimpleAttr("timing_type"); + if (type_attr) { + const std::string *type_name = type_attr->stringValue(); + if (type_name) { + type = findTimingType(type_name->c_str()); + if (type == TimingType::unknown) { + libWarn(1244, type_attr, "unknown timing_type %s.", type_name->c_str()); + type = TimingType::combinational; + } + } + } + timing_attrs->setTimingType(type); +} + +void +LibertyReader::readTimingWhen(const LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + const LibertySimpleAttr *when_attr = timing_group->findSimpleAttr("when"); + if (when_attr) { + const std::string *when = when_attr->stringValue(); + if (when) { + FuncExpr *when_expr = parseFunc(when->c_str(), "when", cell, when_attr->line()); + timing_attrs->setCond(when_expr); + } + } + + const LibertySimpleAttr *cond_attr = timing_group->findSimpleAttr("sdf_cond"); + if (cond_attr) { + const std::string *cond = cond_attr->stringValue(); + if (cond) + timing_attrs->setSdfCond(cond->c_str()); + } + cond_attr = timing_group->findSimpleAttr("sdf_cond_start"); + if (cond_attr) { + const std::string *cond = cond_attr->stringValue(); + if (cond) + timing_attrs->setSdfCondStart(cond->c_str()); + } + cond_attr = timing_group->findSimpleAttr("sdf_cond_end"); + if (cond_attr) { + const std::string *cond = cond_attr->stringValue(); + if (cond) + timing_attrs->setSdfCondEnd(cond->c_str()); + } +} + +void +LibertyReader::readTimingMode(const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + const LibertyComplexAttrSeq &mode_attrs = timing_group->findComplexAttrs("mode"); + if (!mode_attrs.empty()) { + const LibertyComplexAttr *mode_attr = mode_attrs[0]; + const LibertyAttrValueSeq &mode_values = mode_attr->values(); + if (mode_values.size() == 2) { + LibertyAttrValue *value = mode_values[0]; + if (value->isString()) + timing_attrs->setModeName(value->stringValue()); + else + libWarn(1248, mode_attr, "mode name is not a string."); + + value = mode_values[1]; + if (value->isString()) + timing_attrs->setModeValue(value->stringValue()); + else + libWarn(1246, mode_attr, "mode value is not a string."); + } + else + libWarn(1249, mode_attr, "mode requirees 2 values."); + } +} + +void +LibertyReader::makeTimingModels(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + switch (cell->libertyLibrary()->delayModelType()) { + case DelayModelType::cmos_linear: + makeLinearModels(cell, timing_group, timing_attrs); + break; + case DelayModelType::table: + makeTableModels(cell, timing_group, timing_attrs); + break; + case DelayModelType::cmos_pwl: + case DelayModelType::cmos2: + case DelayModelType::polynomial: + case DelayModelType::dcm: + break; + } +} + +void +LibertyReader::makeLinearModels(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + LibertyLibrary *library = cell->libertyLibrary(); + for (const RiseFall *rf : RiseFall::range()) { + std::string intr_attr_name = "intrinsic_" + rf->to_string_long(); + float intr = 0.0; + bool intr_exists; + timing_group->findAttrFloat(intr_attr_name, intr, intr_exists); + if (intr_exists) + intr *= time_scale_; + else + library->defaultIntrinsic(rf, intr, intr_exists); + TimingModel *model = nullptr; + if (intr_exists) { + if (timingTypeIsCheck(timing_attrs->timingType())) + model = new CheckLinearModel(cell, intr); + else { + std::string res_attr_name = rf->to_string_long() + "_resistance"; + float res = 0.0; + bool res_exists; + timing_group->findAttrFloat(res_attr_name, res, res_exists); + if (res_exists) + res *= res_scale_; + else + library->defaultPinResistance(rf, PortDirection::output(), + res, res_exists); + model = new GateLinearModel(cell, intr, res); + } + timing_attrs->setModel(rf, model); + } + } +} + +void +LibertyReader::makeTableModels(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs) +{ + for (const RiseFall *rf : RiseFall::range()) { + std::string delay_attr_name = "cell_" + rf->to_string_long(); + TableModel *delay = readGateTableModel(timing_group, delay_attr_name.c_str(), rf, + TableTemplateType::delay, time_scale_, + ScaleFactorType::cell); + std::string transition_attr_name = rf->to_string_long() + "_transition"; + TableModel *transition = readGateTableModel(timing_group, + transition_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, + ScaleFactorType::transition); + if (delay || transition) { + std::string delay_sigma_attr_name = "ocv_sigma_cell_" + rf->to_string_long(); + TableModelsEarlyLate delay_sigmas = + readEarlyLateTableModels(timing_group, + delay_sigma_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, + ScaleFactorType::unknown); + + std::string slew_sigma_attr_name = "ocv_sigma_" + rf->to_string_long() + + "_transition"; + TableModelsEarlyLate slew_sigmas = + readEarlyLateTableModels(timing_group, + slew_sigma_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, + ScaleFactorType::unknown); + + ReceiverModelPtr receiver_model = readReceiverCapacitance(timing_group, rf); + OutputWaveforms *output_waveforms = readOutputWaveforms(timing_group, rf); + + timing_attrs->setModel(rf, new GateTableModel(cell, delay, + std::move(delay_sigmas), + transition, + std::move(slew_sigmas), + receiver_model, + output_waveforms)); + TimingType timing_type = timing_attrs->timingType(); + if (isGateTimingType(timing_type)) { + if (transition == nullptr) + libWarn(1210, timing_group, "missing %s_transition.", rf->name()); + if (delay == nullptr) + libWarn(1211, timing_group, "missing cell_%s.", rf->name()); + } + } + + std::string constraint_attr_name = rf->to_string_long() + "_constraint"; + ScaleFactorType scale_factor_type = + timingTypeScaleFactorType(timing_attrs->timingType()); + TableModel *constraint = readCheckTableModel(timing_group, + constraint_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, scale_factor_type); + if (constraint) { + std::string constraint_sigma_attr_name = "ocv_sigma_" + rf->to_string_long() + + "_constraint"; + TableModelsEarlyLate constraint_sigmas = + readEarlyLateTableModels(timing_group, + constraint_sigma_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, + ScaleFactorType::unknown); + timing_attrs->setModel(rf, new CheckTableModel(cell, constraint, + std::move(constraint_sigmas))); + } + } +} + +bool +LibertyReader::isGateTimingType(TimingType timing_type) +{ + return timing_type == TimingType::clear + || timing_type == TimingType::combinational + || timing_type == TimingType::combinational_fall + || timing_type == TimingType::combinational_rise + || timing_type == TimingType::falling_edge + || timing_type == TimingType::preset + || timing_type == TimingType::rising_edge + || timing_type == TimingType::three_state_disable + || timing_type == TimingType::three_state_disable_rise + || timing_type == TimingType::three_state_disable_fall + || timing_type == TimingType::three_state_enable + || timing_type == TimingType::three_state_enable_fall + || timing_type == TimingType::three_state_enable_rise; +} + +TableModel * +LibertyReader::readGateTableModel(const LibertyGroup *timing_group, + const char *table_group_name, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type) +{ + const LibertyGroup *table_group = timing_group->findSubgroup(table_group_name); + if (table_group) { + TableModel *model = readTableModel(table_group, rf, template_type, scale, + scale_factor_type); + if (model && !GateTableModel::checkAxes(model)) + libWarn(1251, table_group, "unsupported model axis."); + return model; + } + return nullptr; +} + +TableModel * +LibertyReader::readCheckTableModel(const LibertyGroup *timing_group, + const char *table_group_name, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type) +{ + const LibertyGroup *table_group = timing_group->findSubgroup(table_group_name); + if (table_group) { + TableModel *model = readTableModel(table_group, rf, template_type, scale, + scale_factor_type); + if (model && !CheckTableModel::checkAxes(model)) + libWarn(1252, table_group, "unsupported model axis."); + return model; + } + return nullptr; +} + +TableModelsEarlyLate +LibertyReader::readEarlyLateTableModels(const LibertyGroup *timing_group, + const char *table_group_name, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type) +{ + TableModelsEarlyLate models{}; + for (const LibertyGroup *table_group : timing_group->findSubgroups(table_group_name)) { + TableModel *model = readTableModel(table_group, rf, template_type, scale, + scale_factor_type); + const std::string *early_late = table_group->findAttrString("sigma_type"); + if (early_late == nullptr + || *early_late == "early_and_late") { + models[EarlyLate::early()->index()] = model; + models[EarlyLate::late()->index()] = model; + } + else if (*early_late == "early") + models[EarlyLate::early()->index()] = model; + else if (*early_late == "late") + models[EarlyLate::late()->index()] = model; + + //if (model && !GateTableModel::checkAxes(model)) + // libWarn(1182, table_group, "unsupported model axis."); + } + return models; +} + +ReceiverModelPtr +LibertyReader::readReceiverCapacitance(const LibertyGroup *timing_group, + const RiseFall *rf) +{ + ReceiverModelPtr receiver_model = nullptr; + readReceiverCapacitance(timing_group, "receiver_capacitance", 0, rf, + receiver_model); + readReceiverCapacitance(timing_group, "receiver_capacitance1", 0, rf, + receiver_model); + readReceiverCapacitance(timing_group, "receiver_capacitance2", 1, rf, + receiver_model); + return receiver_model; +} + +void +LibertyReader::readReceiverCapacitance(const LibertyGroup *timing_group, + const char *cap_group_name, + int index, + const RiseFall *rf, + ReceiverModelPtr &receiver_model) +{ + std::string cap_group_name1 = cap_group_name; + cap_group_name1 += "_" + rf->to_string_long(); + const LibertyGroup *cap_group = timing_group->findSubgroup(cap_group_name1); + if (cap_group) { + const LibertySimpleAttr *segment_attr = cap_group->findSimpleAttr("segment"); + if (segment_attr) { + // For receiver_capacitance groups with mulitiple segments this + // overrides the index passed in beginReceiverCapacitance1Rise/Fall. + int segment; + bool exists; + getAttrInt(segment_attr, segment, exists); + if (exists) + index = segment; + } + TableModel *model = readTableModel(cap_group, rf, TableTemplateType::delay, + cap_scale_, ScaleFactorType::pin_cap); + if (ReceiverModel::checkAxes(model)) { + if (receiver_model == nullptr) + receiver_model = std::make_shared(); + receiver_model->setCapacitanceModel(std::move(*model), index, rf); + } + else + libWarn(1219, cap_group, "unsupported model axis."); + delete model; + } +} + +OutputWaveforms * +LibertyReader::readOutputWaveforms(const LibertyGroup *timing_group, + const RiseFall *rf) +{ + const std::string current_group_name = "output_current_" + rf->to_string_long(); + const LibertyGroup *current_group = timing_group->findSubgroup(current_group_name); + if (current_group) { + OutputWaveformSeq output_currents; + for (const LibertyGroup *vector_group : current_group->findSubgroups("vector")) { + float ref_time; + bool ref_time_exists; + vector_group->findAttrFloat("reference_time", ref_time, ref_time_exists); + if (ref_time_exists) { + ref_time *= time_scale_; + TableModel *table = readTableModel(vector_group, rf, + TableTemplateType::output_current, + current_scale_, ScaleFactorType::unknown); + if (table) { + TableTemplate *tbl_template = table->tblTemplate(); + const TableAxis *slew_axis, *cap_axis; + // Canonicalize axis order. + if (tbl_template->axis1()->variable()==TableAxisVariable::input_net_transition){ + slew_axis = table->axis1(); + cap_axis = table->axis2(); + } + else { + slew_axis = table->axis2(); + cap_axis = table->axis1(); + } + + if (slew_axis->size() == 1 && cap_axis->size() == 1) { + // Convert 1x1xN Table (order 3) to 1D Table. + float slew = slew_axis->axisValue(0); + float cap = cap_axis->axisValue(0); + TablePtr table_ptr = table->table(); + FloatTable *values3 = table_ptr->values3(); + FloatSeq row = std::move((*values3)[0]); + values3->erase(values3->begin()); + Table *table1 = new Table(std::move(row), table->table()->axis3ptr()); + output_currents.emplace_back(slew, cap, table1, ref_time); + } + else + libWarn(1223, vector_group, + "vector index_1 and index_2 must have exactly one value."); + } + delete table; + } + else + libWarn(1224, vector_group, "vector reference_time not found."); + } + if (!output_currents.empty()) + return makeOutputWaveforms(current_group, output_currents, rf); + } + return nullptr; +} + +OutputWaveforms * +LibertyReader::makeOutputWaveforms(const LibertyGroup *current_group, + OutputWaveformSeq &output_currents, + const RiseFall *rf) +{ + std::set slew_set, cap_set; + FloatSeq slew_values; + FloatSeq cap_values; + for (const OutputWaveform &waveform : output_currents) { + float slew = waveform.slew(); + // Filter duplilcate slews and capacitances. + if (!slew_set.contains(slew)) { + slew_set.insert(slew); + slew_values.push_back(slew); + } + float cap = waveform.cap(); + if (!cap_set.contains(cap)) { + cap_set.insert(cap); + cap_values.push_back(cap); + } + } + sort(slew_values, std::less()); + sort(cap_values, std::less()); + size_t slew_size = slew_values.size(); + size_t cap_size = cap_values.size(); + TableAxisPtr slew_axis = + make_shared(TableAxisVariable::input_net_transition, + std::move(slew_values)); + TableAxisPtr cap_axis = + make_shared(TableAxisVariable::total_output_net_capacitance, + std::move(cap_values)); + FloatSeq ref_times(slew_size); + Table1Seq current_waveforms(slew_size * cap_size); + for (OutputWaveform &waveform : output_currents) { + size_t slew_index, cap_index; + bool slew_exists, cap_exists; + slew_axis->findAxisIndex(waveform.slew(), slew_index, slew_exists); + cap_axis->findAxisIndex(waveform.cap(), cap_index, cap_exists); + if (slew_exists && cap_exists) { + size_t index = slew_index * cap_axis->size() + cap_index; + current_waveforms[index] = waveform.releaseCurrents(); + ref_times[slew_index] = waveform.referenceTime(); + } + else + libWarn(1221, current_group, "output current waveform %.2e %.2e not found.", + waveform.slew(), + waveform.cap()); + } + Table ref_time_tbl(std::move(ref_times), slew_axis); + OutputWaveforms *output_current = new OutputWaveforms(slew_axis, cap_axis, rf, + current_waveforms, + std::move(ref_time_tbl)); + return output_current; +} + +TableModel * +LibertyReader::readTableModel(const LibertyGroup *table_group, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type) +{ + const char *template_name = table_group->firstName(); + if (library_ && template_name) { + TableTemplate *tbl_template = library_->findTableTemplate(template_name, + template_type); + if (tbl_template) { + TablePtr table = readTableModel(table_group, tbl_template, scale); + if (table) { + TableModel *table_model = new TableModel(table, tbl_template, + scale_factor_type, rf); + return table_model; + } + } + else + libWarn(1253, table_group, "table template %s not found.", template_name); + } + return nullptr; +} + +TablePtr +LibertyReader::readTableModel(const LibertyGroup *table_group, + const TableTemplate *tbl_template, + float scale) +{ + const LibertyComplexAttr *values_attr = table_group->findComplexAttr("values"); + if (values_attr) { + TableAxisPtr axis1 = makeTableAxis(table_group, "index_1", tbl_template->axis1ptr()); + TableAxisPtr axis2 = makeTableAxis(table_group, "index_2", tbl_template->axis2ptr()); + TableAxisPtr axis3 = makeTableAxis(table_group, "index_3", tbl_template->axis3ptr()); + if (axis1 && axis2 && axis3) { + // 3D table + FloatTable float_table = makeFloatTable(values_attr, table_group, + axis1->size() * axis2->size(), + axis3->size(), scale); + return make_shared(std::move(float_table), axis1, axis2, axis3); + } + else if (axis1 && axis2) { + FloatTable float_table = makeFloatTable(values_attr, table_group, + axis1->size(), axis2->size(), scale); + return make_shared
(std::move(float_table), axis1, axis2); + } + else if (axis1) { + FloatTable table = makeFloatTable(values_attr, table_group, 1, + axis1->size(), scale); + return make_shared
(std::move(table[0]), axis1); + } + else if (axis1 == nullptr && axis2 == nullptr && axis3 == nullptr) { + FloatTable table = makeFloatTable(values_attr, table_group, 1, 1, scale); + float value = table[0][0]; + return std::make_shared
(value); + } + } + else + libWarn(1257, table_group, "%s is missing values.", table_group->type().c_str()); + return nullptr; +} + +TableAxisPtr +LibertyReader::makeTableAxis(const LibertyGroup *table_group, + const char *index_attr_name, + TableAxisPtr template_axis) +{ + const LibertyComplexAttr *index_attr = table_group->findComplexAttr(index_attr_name); + if (index_attr) { + FloatSeq axis_values = readFloatSeq(index_attr, 1.0F); if (axis_values.empty()) - libWarn(1177, attr, "missing table index values."); + libWarn(1177, index_attr, "missing table index values."); else { // Check monotonicity of the values. float prev = axis_values[0]; for (size_t i = 1; i < axis_values.size(); i++) { float value = axis_values[i]; if (value <= prev) - libWarn(1178, attr, "non-increasing table index values."); + libWarn(1173, index_attr, "non-increasing table index values."); prev = value; } - axis_values_[index] = std::move(axis_values); + + TableAxisVariable axis_var = template_axis->variable(); + const Units *units = library_->units(); + float scale = tableVariableUnit(axis_var, units)->scale(); + scaleFloats(axis_values, scale); + return make_shared(axis_var, std::move(axis_values)); } } + return template_axis; } //////////////////////////////////////////////////////////////// void -LibertyReader::beginType(LibertyGroup *) +LibertyReader::makeTimingArcs(LibertyCell *cell, + const std::string &from_port_name, + LibertyPort *to_port, + LibertyPort *related_out_port, + bool one_to_one, + TimingArcAttrsPtr timing_attrs, + int timing_line) { - type_bit_from_exists_ = false; - type_bit_to_exists_ = false; -} - -void -LibertyReader::endType(LibertyGroup *group) -{ - const char *name = group->firstName(); - if (name) { - if (type_bit_from_exists_ && type_bit_to_exists_) { - if (cell_) - cell_->makeBusDcl(name, type_bit_from_, type_bit_to_); - else if (library_) - library_->makeBusDcl(name, type_bit_from_, type_bit_to_); + PortNameBitIterator from_port_iter(cell, from_port_name.c_str(), this, timing_line); + if (from_port_iter.size() == 1 && !to_port->hasMembers()) { + // one -> one + if (from_port_iter.hasNext()) { + LibertyPort *from_port = from_port_iter.next(); + if (from_port->direction()->isOutput()) + libWarn(1212, timing_line, "timing group from output port."); + builder_.makeTimingArcs(cell, from_port, to_port, related_out_port, + timing_attrs, timing_line); + } + } + else if (from_port_iter.size() > 1 && !to_port->hasMembers()) { + // bus -> one + while (from_port_iter.hasNext()) { + LibertyPort *from_port = from_port_iter.next(); + if (from_port->direction()->isOutput()) + libWarn(1213, timing_line, "timing group from output port."); + builder_.makeTimingArcs(cell, from_port, to_port, related_out_port, + timing_attrs, timing_line); + } + } + else if (from_port_iter.size() == 1 && to_port->hasMembers()) { + // one -> bus + if (from_port_iter.hasNext()) { + LibertyPort *from_port = from_port_iter.next(); + if (from_port->direction()->isOutput()) + libWarn(1214, timing_line, "timing group from output port."); + LibertyPortMemberIterator bit_iter(to_port); + while (bit_iter.hasNext()) { + LibertyPort *to_port_bit = bit_iter.next(); + builder_.makeTimingArcs(cell, from_port, to_port_bit, related_out_port, + timing_attrs, timing_line); + } + } + } + else { + // bus -> bus + if (one_to_one) { + int from_size = from_port_iter.size(); + int to_size = to_port->size(); + LibertyPortMemberIterator to_port_iter(to_port); + // warn about different sizes + if (from_size != to_size) + libWarn(1216, timing_line, + "timing port %s and related port %s are different sizes.", + from_port_name.c_str(), + to_port->name()); + // align to/from iterators for one-to-one mapping + while (from_size > to_size) { + from_size--; + from_port_iter.next(); + } + while (to_size > from_size) { + to_size--; + to_port_iter.next(); + } + // make timing arcs + while (from_port_iter.hasNext() && to_port_iter.hasNext()) { + LibertyPort *from_port_bit = from_port_iter.next(); + LibertyPort *to_port_bit = to_port_iter.next(); + if (from_port_bit->direction()->isOutput()) + libWarn(1215, timing_line, "timing group from output port."); + builder_.makeTimingArcs(cell, from_port_bit, to_port_bit, + related_out_port, timing_attrs, + timing_line); + } } else { - if (!type_bit_from_exists_) - libWarn(1179, group, "bus type %s missing bit_from.", name); - if (!type_bit_to_exists_) - libWarn(1180, group, "bus type %s missing bit_to.", name); - } - } - else - libWarn(1181, group, "type missing name."); -} - -void -LibertyReader::visitBitFrom(LibertyAttr *attr) -{ - getAttrInt(attr, type_bit_from_, type_bit_from_exists_); -} - -void -LibertyReader::visitBitTo(LibertyAttr *attr) -{ - getAttrInt(attr, type_bit_to_, type_bit_to_exists_); -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginScalingFactors(LibertyGroup *group) -{ - const char *name = group->firstName(); - if (name) { - save_scale_factors_ = scale_factors_; - scale_factors_ = library_->makeScaleFactors(name); - } - else - libWarn(1182, group, "scaling_factors do not have a name."); -} - -void -LibertyReader::endScalingFactors(LibertyGroup *) -{ - scale_factors_ = save_scale_factors_; -} - -void -LibertyReader::visitScaleFactorSuffix(LibertyAttr *attr) -{ - if (scale_factors_) { - ScaleFactorPvt pvt = ScaleFactorPvt::unknown; - ScaleFactorType type = ScaleFactorType::unknown; - const RiseFall *rf = nullptr; - // Parse the attribute name. - TokenParser parser(attr->name().c_str(), "_"); - if (parser.hasNext()) - parser.next(); - if (parser.hasNext()) { - const char *pvt_name = parser.next(); - pvt = findScaleFactorPvt(pvt_name); - } - if (parser.hasNext()) { - const char *type_name = parser.next(); - type = findScaleFactorType(type_name); - } - if (parser.hasNext()) { - const char *tr_name = parser.next(); - if (stringEq(tr_name, "rise")) - rf = RiseFall::rise(); - else if (stringEq(tr_name, "fall")) - rf = RiseFall::fall(); - } - if (pvt != ScaleFactorPvt::unknown - && type != ScaleFactorType::unknown - && rf) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - scale_factors_->setScale(type, pvt, rf, value); - } - } -} - -void -LibertyReader::visitScaleFactorPrefix(LibertyAttr *attr) -{ - if (scale_factors_) { - ScaleFactorPvt pvt = ScaleFactorPvt::unknown; - ScaleFactorType type = ScaleFactorType::unknown; - const RiseFall *rf = nullptr; - // Parse the attribute name. - TokenParser parser(attr->name().c_str(), "_"); - if (parser.hasNext()) - parser.next(); - if (parser.hasNext()) { - const char *pvt_name = parser.next(); - pvt = findScaleFactorPvt(pvt_name); - } - if (parser.hasNext()) { - const char *tr_name = parser.next(); - if (stringEq(tr_name, "rise")) - rf = RiseFall::rise(); - else if (stringEq(tr_name, "fall")) - rf = RiseFall::fall(); - } - if (parser.hasNext()) { - const char *type_name = parser.next(); - type = findScaleFactorType(type_name); - } - if (pvt != ScaleFactorPvt::unknown - && type != ScaleFactorType::unknown - && rf) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - scale_factors_->setScale(type, pvt, rf, value); - } - } -} - -void -LibertyReader::visitScaleFactorHiLow(LibertyAttr *attr) -{ - if (scale_factors_) { - ScaleFactorPvt pvt = ScaleFactorPvt::unknown; - ScaleFactorType type = ScaleFactorType::unknown; - const RiseFall *rf = nullptr; - const char *pvt_name = nullptr; - const char *type_name = nullptr; - const char *tr_name = nullptr; - // Parse the attribute name. - TokenParser parser(attr->name().c_str(), "_"); - if (parser.hasNext()) - parser.next(); - if (parser.hasNext()) { - pvt_name = parser.next(); - pvt = findScaleFactorPvt(pvt_name); - } - if (parser.hasNext()) { - type_name = parser.next(); - type = findScaleFactorType(type_name); - } - if (parser.hasNext()) { - tr_name = parser.next(); - if (stringEq(tr_name, "high")) - rf = RiseFall::rise(); - else if (stringEq(tr_name, "low")) - rf = RiseFall::fall(); - } - if (pvt != ScaleFactorPvt::unknown - && type != ScaleFactorType::unknown - && rf) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - scale_factors_->setScale(type, pvt, rf, value); - } - } -} - -void -LibertyReader::visitScaleFactor(LibertyAttr *attr) -{ - if (scale_factors_) { - ScaleFactorPvt pvt = ScaleFactorPvt::unknown; - ScaleFactorType type = ScaleFactorType::unknown; - const char *pvt_name = nullptr; - const char *type_name = nullptr; - // Parse the attribute name. - TokenParser parser(attr->name().c_str(), " "); - if (parser.hasNext()) - parser.next(); - if (parser.hasNext()) { - pvt_name = parser.next(); - pvt = findScaleFactorPvt(pvt_name); - } - if (parser.hasNext()) { - type_name = parser.next(); - type = findScaleFactorType(type_name); - } - if (pvt != ScaleFactorPvt::unknown - && type != ScaleFactorType::unknown) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - scale_factors_->setScale(type, pvt, value); - } - } -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginOpCond(LibertyGroup *group) -{ - if (library_) { - const char *name = group->firstName(); - if (name) - op_cond_ = library_->makeOperatingConditions(name); - else - libWarn(1183, group, "operating_conditions missing name."); - } -} - -void -LibertyReader::visitProc(LibertyAttr *attr) -{ - if (op_cond_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - op_cond_->setProcess(value); - } -} - -void -LibertyReader::visitVolt(LibertyAttr *attr) -{ - if (op_cond_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - op_cond_->setVoltage(value * volt_scale_); - } -} - -void -LibertyReader::visitTemp(LibertyAttr *attr) -{ - if (op_cond_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - op_cond_->setTemperature(value); - } -} - -void -LibertyReader::visitTreeType(LibertyAttr *attr) -{ - if (op_cond_) { - const char *tree_type = getAttrString(attr); - if (tree_type) { - WireloadTree wire_load_tree = stringWireloadTree(tree_type); - op_cond_->setWireloadTree(wire_load_tree); - } - } -} - -void -LibertyReader::endOpCond(LibertyGroup *) -{ - op_cond_ = nullptr; -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginWireload(LibertyGroup *group) -{ - if (library_) { - const char *name = group->firstName(); - if (name) - wireload_ = library_->makeWireload(name); - } - else - libWarn(1184, group, "wire_load missing name."); -} - -void -LibertyReader::endWireload(LibertyGroup *) -{ - wireload_ = nullptr; -} - -void -LibertyReader::visitResistance(LibertyAttr *attr) -{ - if (wireload_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - wireload_->setResistance(value * res_scale_); - } -} - -void -LibertyReader::visitSlope(LibertyAttr *attr) -{ - if (wireload_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - wireload_->setSlope(value); - } -} - -void -LibertyReader::visitFanoutLength(LibertyAttr *attr) -{ - if (wireload_) { - float fanout, length; - bool exists; - getAttrFloat2(attr, fanout, length, exists); - if (exists) - wireload_->addFanoutLength(fanout, length); - else - libWarn(1185, attr, "fanout_length is missing length and fanout."); - } -} - -void -LibertyReader::beginWireloadSelection(LibertyGroup *group) -{ - if (library_) { - const char *name = group->firstName(); - if (name) - wireload_selection_ = library_->makeWireloadSelection(name); - } - else - libWarn(1186, group, "wire_load_selection missing name."); -} - -void -LibertyReader::endWireloadSelection(LibertyGroup *) -{ - wireload_selection_ = nullptr; -} - -void -LibertyReader::visitWireloadFromArea(LibertyAttr *attr) -{ - if (wireload_selection_) { - if (attr->isComplexAttr()) { - LibertyAttrValueSeq *values = attr->values(); - if (values->size() == 3) { - LibertyAttrValue *value = (*values)[0]; - if (value->isFloat()) { - float min_area = value->floatValue(); - value = (*values)[1]; - if (value->isFloat()) { - float max_area = value->floatValue(); - - value = (*values)[2]; - if (value->isString()) { - const std::string &wireload_name = value->stringValue(); - const Wireload *wireload = - library_->findWireload(wireload_name.c_str()); - if (wireload) - wireload_selection_->addWireloadFromArea(min_area, max_area, - wireload); - else - libWarn(1187, attr, "wireload %s not found.", wireload_name.c_str()); - } - else - libWarn(1188, attr, - "wire_load_from_area wireload name not a string."); - } - else - libWarn(1189, attr, "wire_load_from_area min not a float."); + // cross product + while (from_port_iter.hasNext()) { + LibertyPort *from_port_bit = from_port_iter.next(); + LibertyPortMemberIterator to_port_iter(to_port); + while (to_port_iter.hasNext()) { + LibertyPort *to_port_bit = to_port_iter.next(); + builder_.makeTimingArcs(cell, from_port_bit, to_port_bit, + related_out_port, timing_attrs, + timing_line); } - else - libWarn(1190, attr, "wire_load_from_area max not a float."); } - else - libWarn(1191, attr, "wire_load_from_area missing parameters."); } - else - libWarn(1192, attr, "wire_load_from_area missing parameters."); } } +void +LibertyReader::makeTimingArcs(LibertyCell *cell, + LibertyPort *to_port, + LibertyPort *related_out_port, + TimingArcAttrsPtr timing_attrs, + int timing_line) +{ + if (to_port->hasMembers()) { + LibertyPortMemberIterator bit_iter(to_port); + while (bit_iter.hasNext()) { + LibertyPort *to_port_bit = bit_iter.next(); + builder_.makeTimingArcs(cell, nullptr, to_port_bit, + related_out_port, timing_attrs, + timing_line); + } + } + else + builder_.makeTimingArcs(cell, nullptr, to_port, + related_out_port, timing_attrs, + timing_line); +} + //////////////////////////////////////////////////////////////// void -LibertyReader::beginCell(LibertyGroup *group) +LibertyReader::readLeagageGrouops(LibertyCell *cell, + const LibertyGroup *cell_group) { - const char *name = group->firstName(); - if (name) { - debugPrint(debug_, "liberty", 1, "cell %s", name); - if (library_) { - cell_ = builder_.makeCell(library_, name, filename_); - in_bus_ = false; - in_bundle_ = false; - } - } - else - libWarn(1193, group, "cell missing name."); -} - -void -LibertyReader::endCell(LibertyGroup *group) -{ - if (cell_) { - // Sequentials and leakage powers reference expressions outside of port definitions - // so they do not require LibertyFunc's. - makeCellSequentials(); - makeStatetable(); - // Parse functions defined inside of port groups that reference other ports - // and replace the references with the parsed expressions. - parseCellFuncs(); - makeLeakagePowers(); - finishPortGroups(); - - if (ocv_derate_name_) { - OcvDerate *derate = cell_->findOcvDerate(ocv_derate_name_); - if (derate == nullptr) - derate = library_->findOcvDerate(ocv_derate_name_); - if (derate) - cell_->setOcvDerate(derate); - else - libWarn(1194, group, "cell %s ocv_derate_group %s not found.", - cell_->name(), ocv_derate_name_); - stringDelete(ocv_derate_name_); - ocv_derate_name_ = nullptr; - } - cell_->finish(infer_latches_, report_, debug_); - cell_ = nullptr; - } -} - -void -LibertyReader::finishPortGroups() -{ - for (PortGroup *port_group : cell_port_groups_) { - int line = port_group->line(); - for (LibertyPort *port : *port_group->ports()) { - checkPort(port, line); - makeMinPulseWidthArcs(port, line); - } - makeTimingArcs(port_group); - makeInternalPowers(port_group); - delete port_group; - } - cell_port_groups_.clear(); -} - -void -LibertyReader::checkPort(LibertyPort *port, - int line) -{ - FuncExpr *func_expr = port->function(); - if (func_expr) { - if (func_expr->checkSize(port)) { - libWarn(1195, line, "port %s function size does not match port size.", - port->name()); - } - } - if (port->tristateEnable() - && port->direction() == PortDirection::output()) - port->setDirection(PortDirection::tristate()); -} - -// Make timing arcs for the port min_pulse_width_low/high attributes. -// This is redundant but makes sdf annotation consistent. -void -LibertyReader::makeMinPulseWidthArcs(LibertyPort *port, - int line) -{ - TimingArcAttrsPtr attrs = nullptr; - for (auto hi_low : RiseFall::range()) { - float min_width; + for (const LibertyGroup *leak_group : cell_group->findSubgroups("leakage_power")) { + FuncExpr *when = readFuncExpr(cell, leak_group, "when"); + float power; bool exists; - port->minPulseWidth(hi_low, min_width, exists); + leak_group->findAttrFloat("value", power, exists); if (exists) { - if (attrs == nullptr) { - attrs = make_shared(); - attrs->setTimingType(TimingType::min_pulse_width); + LibertyPort *related_pg_port = findLibertyPort(cell, leak_group, "related_pg_pin"); + cell->makeLeakagePower(related_pg_port, when, power * power_scale_); + } + else + libWarn(1307, leak_group, "leakage_power missing value."); + } +} + +void +LibertyReader::readInternalPowerGroups(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group) +{ + for (LibertyPort *port : ports) { + for (const LibertyGroup *ipwr_group : port_group->findSubgroups("internal_power")) { + LibertyPortSeq related_ports = findLibertyPorts(cell, ipwr_group, "related_pin"); + LibertyPort *related_pg_port = findLibertyPort(cell, ipwr_group, "related_pg_pin"); + std::shared_ptr when; + FuncExpr *when1 = readFuncExpr(cell, ipwr_group, "when"); + if (when1) + when = std::shared_ptr(when1); + InternalPowerModels models; + // rise/fall_power group + for (const RiseFall *rf : RiseFall::range()) { + std::string pwr_attr_name = rf->to_string_long() + "_power"; + const LibertyGroup *pwr_group = ipwr_group->findSubgroup(pwr_attr_name); + if (pwr_group) { + TableModel *model = readTableModel(pwr_group, rf, TableTemplateType::power, + energyScale(), + ScaleFactorType::internal_power); + models[rf->index()] = std::make_shared(model); + } + } + // power group (rise/fall power are the same) + const LibertyGroup *pwr_group = ipwr_group->findSubgroup("power"); + if (pwr_group) { + TableModel *model = readTableModel(pwr_group, RiseFall::rise(), + TableTemplateType::power, + energyScale(), + ScaleFactorType::internal_power); + auto pwr_model = std::make_shared(model); + for (const RiseFall *rf : RiseFall::range()) + models[rf->index()] = pwr_model; + } + if (related_ports.empty()) + cell->makeInternalPower(port, nullptr, related_pg_port, when, models); + else { + for (LibertyPort *related_port : related_ports) + cell->makeInternalPower(port, related_port, related_pg_port, when, models); } - // rise/fall_constraint model is on the leading edge of the pulse. - const RiseFall *model_rf = hi_low; - TimingModel *check_model = - makeScalarCheckModel(min_width, ScaleFactorType::min_pulse_width, model_rf); - attrs->setModel(model_rf, check_model); } } - if (attrs) - builder_.makeTimingArcs(cell_, port, port, nullptr, attrs, line); } +//////////////////////////////////////////////////////////////// + +FuncExpr * +LibertyReader::readFuncExpr(LibertyCell *cell, + const LibertyGroup *group, + const char *attr_name) +{ + const std::string *attr = group->findAttrString(attr_name); + if (attr) + return parseFunc(attr->c_str(), attr_name, cell, group->line()); + else + return nullptr; +} + +LibertyPort * +LibertyReader::findLibertyPort(LibertyCell *cell, + const LibertyGroup *group, + const char *port_name_attr) +{ + const LibertySimpleAttr *attr = group->findSimpleAttr(port_name_attr); + if (attr) { + const std::string *port_name = attr->stringValue(); + if (port_name) { + LibertyPort *port = cell->findLibertyPort(port_name->c_str()); + if (port) + return port; + else + libWarn(1290, attr, "port %s not found.", port_name->c_str()); + } + } + return nullptr; +} + +StdStringSeq +LibertyReader::findAttributStrings(const LibertyGroup *group, + const char *name_attr) +{ + const LibertySimpleAttr *attr = group->findSimpleAttr(name_attr); + if (attr) { + const std::string *strings = attr->stringValue(); + if (strings) { + return parseTokens(*strings, ' '); + } + } + return StdStringSeq(); +} + +LibertyPortSeq +LibertyReader::findLibertyPorts(LibertyCell *cell, + const LibertyGroup *group, + const char *port_name_attr) +{ + LibertyPortSeq ports; + StdStringSeq port_names = findAttributStrings(group, port_name_attr); + for (const std::string &port_name : port_names) { + LibertyPort *port = findPort(cell, port_name.c_str()); + if (port) + ports.push_back(port); + else + libWarn(1306, group, "port %s not found.", port_name.c_str()); + } + return ports; +} + +//////////////////////////////////////////////////////////////// + TimingModel * -LibertyReader::makeScalarCheckModel(float value, +LibertyReader::makeScalarCheckModel(LibertyCell *cell, + float value, ScaleFactorType scale_factor_type, const RiseFall *rf) { - TablePtr table = make_shared
(value); + TablePtr table = std::make_shared
(value); TableTemplate *tbl_template = library_->findTableTemplate("scalar", TableTemplateType::delay); TableModel *table_model = new TableModel(table, tbl_template, scale_factor_type, rf); - CheckTableModel *check_model = new CheckTableModel(cell_, table_model, nullptr); + TableModelsEarlyLate sigmas{}; + CheckTableModel *check_model = new CheckTableModel(cell, table_model, + std::move(sigmas)); return check_model; } -void -LibertyReader::makeTimingArcs(PortGroup *port_group) -{ - for (TimingGroup *timing : port_group->timingGroups()) { - timing->makeTimingModels(cell_, this); - - for (LibertyPort *port : *port_group->ports()) - makeTimingArcs(port, timing); - } -} - -void -LibertyReader::makeInternalPowers(PortGroup *port_group) -{ - for (InternalPowerGroup *power_group : port_group->internalPowerGroups()) { - for (LibertyPort *port : *port_group->ports()) - makeInternalPowers(port, power_group); - } -} - -void -LibertyReader::makeCellSequentials() -{ - for (SequentialGroup *seq : cell_sequentials_) { - makeCellSequential(seq); - delete seq; - } - cell_sequentials_.clear(); -} - -void -LibertyReader::makeCellSequential(SequentialGroup *seq) -{ - int line = seq->line(); - int size = seq->size(); - bool is_register = seq->isRegister(); - bool is_bank = seq->isBank(); - const char *type = is_register - ? (is_bank ? "ff_bank" : "ff") - : (is_bank ? "latch_bank" : "latch"); - const char *clk = seq->clock(); - FuncExpr *clk_expr = nullptr; - if (clk) { - const char *clk_attr = is_register ? "clocked_on" : "enable"; - clk_expr = parseFunc(clk, clk_attr, line); - if (clk_expr && clk_expr->checkSize(size)) { - libWarn(1196, line, "%s %s bus width mismatch.", type, clk_attr); - delete clk_expr; - clk_expr = nullptr; - } - } - const char *data = seq->data(); - FuncExpr *data_expr = nullptr; - if (data) { - const char *data_attr = is_register ? "next_state" : "data_in"; - data_expr = parseFunc(data, data_attr, line); - if (data_expr && data_expr->checkSize(size)) { - libWarn(1197, line, "%s %s bus width mismatch.", type, data_attr); - delete data_expr; - data_expr = nullptr; - } - } - const char *clr = seq->clear(); - FuncExpr *clr_expr = nullptr; - if (clr) { - clr_expr = parseFunc(clr, "clear", line); - if (clr_expr && clr_expr->checkSize(size)) { - libWarn(1198, line, "%s %s bus width mismatch.", type, "clear"); - delete clr_expr; - clr_expr = nullptr; - } - } - const char *preset = seq->preset(); - FuncExpr *preset_expr = nullptr; - if (preset) { - preset_expr = parseFunc(preset, "preset", line); - if (preset_expr && preset_expr->checkSize(size)) { - libWarn(1199, line, "%s %s bus width mismatch.", type, "preset"); - delete preset_expr; - preset_expr = nullptr; - } - } - cell_->makeSequential(size, is_register, clk_expr, data_expr, clr_expr, - preset_expr, seq->clrPresetVar1(), - seq->clrPresetVar2(), - seq->outPort(), seq->outInvPort()); - if (!is_register) - checkLatchEnableSense(clk_expr, line); - - // The expressions used in the sequentials are copied by bitSubExpr. - delete clk_expr; - delete data_expr; - delete clr_expr; - delete preset_expr; -} - void LibertyReader::checkLatchEnableSense(FuncExpr *enable_func, int line) @@ -2202,1029 +2814,194 @@ LibertyReader::checkLatchEnableSense(FuncExpr *enable_func, //////////////////////////////////////////////////////////////// void -LibertyReader::makeStatetable() +LibertyReader::readNormalizedDriverWaveform(const LibertyGroup *library_group) { - if (statetable_) { - LibertyPortSeq input_ports; - for (const string &input : statetable_->inputPorts()) { - LibertyPort *port = cell_->findLibertyPort(input.c_str()); - if (port) - input_ports.push_back(port); - else - libWarn(1298, statetable_->line(), "statetable input port %s not found.", - input.c_str()); + for (const LibertyGroup *waveform_group : + library_group->findSubgroups("normalized_driver_waveform")) { + const char *template_name = waveform_group->firstName(); + if (template_name) { + TableTemplate *tbl_template = library_->findTableTemplate(template_name, + TableTemplateType::delay); + if (!tbl_template) { + libWarn(1256, waveform_group, "table template %s not found.", template_name); + continue; + } + TablePtr table = readTableModel(waveform_group, tbl_template, time_scale_); + if (!table) + continue; + if (table->axis1()->variable() != TableAxisVariable::input_net_transition) { + libWarn(1265, waveform_group, + "normalized_driver_waveform variable_1 must be input_net_transition"); + continue; + } + if (table->axis2()->variable() != TableAxisVariable::normalized_voltage) { + libWarn(1225, waveform_group, + "normalized_driver_waveform variable_2 must be normalized_voltage"); + continue; + } + std::string driver_waveform_name; + const std::string *name_attr = waveform_group->findAttrString("driver_waveform_name"); + if (name_attr) + driver_waveform_name = *name_attr; + library_->makeDriverWaveform(driver_waveform_name, table); } - LibertyPortSeq internal_ports; - for (const string &internal : statetable_->internalPorts()) { - LibertyPort *port = cell_->findLibertyPort(internal.c_str()); - if (port == nullptr) - port = makePort(cell_, internal.c_str()); - internal_ports.push_back(port); - } - cell_->makeStatetable(input_ports, internal_ports, statetable_->table()); - delete statetable_; - statetable_ = nullptr; + else + libWarn(1227, waveform_group, "normalized_driver_waveform missing template."); } } //////////////////////////////////////////////////////////////// void -LibertyReader::makeLeakagePowers() +LibertyReader::readLevelShifterType(LibertyCell *cell, + const LibertyGroup *cell_group) { - for (LeakagePowerGroup *power_group : leakage_powers_) { - LibertyPort *related_pg_pin = - cell_->findLibertyPort(power_group->relatedPgPin().c_str()); - cell_->makeLeakagePower(related_pg_pin, power_group->when(), power_group->power()); - delete power_group; + const std::string *level_shifter_type = cell_group->findAttrString("level_shifter_type"); + if (level_shifter_type) { + if (*level_shifter_type == "HL") + cell->setLevelShifterType(LevelShifterType::HL); + else if (*level_shifter_type == "LH") + cell->setLevelShifterType(LevelShifterType::LH); + else if (*level_shifter_type == "HL_LH") + cell->setLevelShifterType(LevelShifterType::HL_LH); + else + libWarn(1228, cell_group, "level_shifter_type must be HL, LH, or HL_LH"); } - leakage_powers_.clear(); -} - -// Record a reference to a function that will be parsed at the end of -// the cell definition when all of the ports are defined. -void -LibertyReader::makeLibertyFunc(const char *expr, - LibertySetFunc set_func, - bool invert, - const char *attr_name, - LibertyStmt *stmt) -{ - LibertyFunc *func = new LibertyFunc(expr, set_func, - invert, attr_name, stmt->line()); - cell_funcs_.push_back(func); } void -LibertyReader::parseCellFuncs() +LibertyReader::readSwitchCellType(LibertyCell *cell, + const LibertyGroup *cell_group) { - for (LibertyFunc *func : cell_funcs_) { - FuncExpr *expr = parseFunc(func->expr(), func->attrName(), func->line()); - if (func->invert() && expr) - expr = expr->invert(); - if (expr) - func->setFunc()(expr); - delete func; + const std::string *switch_cell_type = cell_group->findAttrString("switch_cell_type"); + if (switch_cell_type) { + if (*switch_cell_type == "coarse_grain") + cell->setSwitchCellType(SwitchCellType::coarse_grain); + else if (*switch_cell_type == "fine_grain") + cell->setSwitchCellType(SwitchCellType::fine_grain); + else + libWarn(1229, cell_group, "switch_cell_type must be coarse_grain or fine_grain"); } - cell_funcs_.clear(); } void -LibertyReader::beginScaledCell(LibertyGroup *group) +LibertyReader::readCellOcvDerateGroup(LibertyCell *cell, + const LibertyGroup *cell_group) { - const char *name = group->firstName(); - if (name) { - scaled_cell_owner_ = library_->findLibertyCell(name); - if (scaled_cell_owner_) { - const char *op_cond_name = group->secondName(); - if (op_cond_name) { - op_cond_ = library_->findOperatingConditions(op_cond_name); - if (op_cond_) { - debugPrint(debug_, "liberty", 1, "scaled cell %s %s", - name, op_cond_name); - cell_ = library_->makeScaledCell(name, filename_); + const std::string *derate_name = cell_group->findAttrString("ocv_derate_group"); + if (derate_name) { + OcvDerate *derate = cell->findOcvDerate(derate_name->c_str()); + if (derate == nullptr) + derate = library_->findOcvDerate(derate_name->c_str()); + if (derate) + cell->setOcvDerate(derate); + else + libWarn(1237, cell_group, "OCV derate group named %s not found.", + derate_name->c_str()); + } +} + +void +LibertyReader::readStatetable(LibertyCell *cell, + const LibertyGroup *cell_group) +{ + for (const LibertyGroup *statetable_group : cell_group->findSubgroups("statetable")) { + const char *input_ports_arg = statetable_group->firstName(); + const char *internal_ports_arg = statetable_group->params().size() >= 2 + ? statetable_group->secondName() : nullptr; + StdStringSeq input_ports; + if (input_ports_arg) + input_ports = parseTokens(input_ports_arg, ' '); + StdStringSeq internal_ports; + if (internal_ports_arg) + internal_ports = parseTokens(internal_ports_arg, ' '); + + const LibertySimpleAttr *table_attr = statetable_group->findSimpleAttr("table"); + if (table_attr) { + const std::string *table_str = table_attr->stringValue(); + StdStringSeq table_rows = parseTokens(table_str->c_str(), ','); + size_t input_count = input_ports.size(); + size_t internal_count = internal_ports.size(); + StatetableRows table; + for (const std::string &row : table_rows) { + const StdStringSeq row_groups = parseTokens(row, ':'); + if (row_groups.size() != 3) { + libWarn(1300, table_attr, "table row must have 3 groups separated by ':'."); + break; } + StdStringSeq inputs = parseTokens(row_groups[0], ' '); + if (inputs.size() != input_count) { + libWarn(1301,table_attr,"table row has %zu input values but %zu are required.", + inputs.size(), input_count); + break; + } + StdStringSeq currents = parseTokens(row_groups[1], ' '); + if (currents.size() != internal_count) { + libWarn(1302,table_attr, + "table row has %zu current values but %zu are required.", + currents.size(), internal_count); + break; + } + StdStringSeq nexts = parseTokens(row_groups[2], ' '); + if (nexts.size() != internal_count) { + libWarn(1303, table_attr, "table row has %zu next values but %zu are required.", + nexts.size(), internal_count); + break; + } + + StateInputValues input_values = parseStateInputValues(inputs, table_attr); + StateInternalValues current_values=parseStateInternalValues(currents,table_attr); + StateInternalValues next_values = parseStateInternalValues(nexts, table_attr); + table.emplace_back(input_values, current_values, next_values); + } + + LibertyPortSeq input_port_ptrs; + for (const std::string &input : input_ports) { + LibertyPort *port = cell->findLibertyPort(input.c_str()); + if (port) + input_port_ptrs.push_back(port); else - libWarn(1202, group, "operating conditions %s not found.", op_cond_name); + libWarn(1298, statetable_group, "statetable input port %s not found.", + input.c_str()); } - else - libWarn(1203, group, "scaled_cell missing operating condition."); - } - else - libWarn(1204, group, "scaled_cell cell %s has not been defined.", name); - } - else - libWarn(1205, group, "scaled_cell missing name."); -} - -void -LibertyReader::endScaledCell(LibertyGroup *group) -{ - if (cell_) { - makeCellSequentials(); - parseCellFuncs(); - finishPortGroups(); - cell_->finish(infer_latches_, report_, debug_); - checkScaledCell(group); - // Add scaled cell AFTER ports and timing arcs are defined. - scaled_cell_owner_->addScaledCell(op_cond_, cell_); - cell_ = nullptr; - scaled_cell_owner_ = nullptr; - op_cond_ = nullptr; - } -} - -// Minimal check that is not very specific about where the discrepancies are. -void -LibertyReader::checkScaledCell(LibertyGroup *group) -{ - if (equivCellPorts(cell_, scaled_cell_owner_)) { - if (!equivCellPorts(cell_, scaled_cell_owner_)) - libWarn(1206, group, "scaled_cell %s, %s ports do not match cell ports", - cell_->name(), - op_cond_->name()); - if (!equivCellFuncs(cell_, scaled_cell_owner_)) - libWarn(1206, group, - "scaled_cell %s, %s port functions do not match cell port functions.", - cell_->name(), - op_cond_->name()); - } - else - libWarn(1207, group, "scaled_cell ports do not match cell ports."); - if (!equivCellTimingArcSets(cell_, scaled_cell_owner_)) - libWarn(1208, group, "scaled_cell %s, %s timing does not match cell timing.", - cell_->name(), - op_cond_->name()); -} - -void -LibertyReader::makeTimingArcs(LibertyPort *to_port, - TimingGroup *timing) -{ - LibertyPort *related_out_port = nullptr; - const char *related_out_port_name = timing->relatedOutputPortName(); - if (related_out_port_name) - related_out_port = findPort(related_out_port_name); - int line = timing->line(); - PortDirection *to_port_dir = to_port->direction(); - // Checks should be more comprehensive (timing checks on inputs, etc). - TimingType type = timing->attrs()->timingType(); - if (type == TimingType::combinational && - to_port_dir->isInput()) - libWarn(1209, line, "combinational timing to an input port."); - if (timing->relatedPortNames()) { - for (const char *from_port_name : *timing->relatedPortNames()) { - PortNameBitIterator from_port_iter(cell_, from_port_name, this, line); - if (from_port_iter.hasNext()) { - debugPrint(debug_, "liberty", 2, " timing %s -> %s", - from_port_name, to_port->name()); - makeTimingArcs(from_port_name, from_port_iter, to_port, - related_out_port, timing); + LibertyPortSeq internal_port_ptrs; + for (const std::string &internal : internal_ports) { + LibertyPort *port = cell->findLibertyPort(internal.c_str()); + if (port == nullptr) + port = makePort(cell, internal.c_str()); + internal_port_ptrs.push_back(port); } + cell->makeStatetable(input_port_ptrs, internal_port_ptrs, table); } } - else - makeTimingArcs(to_port, related_out_port, timing); -} - -void -TimingGroup::makeTimingModels(LibertyCell *cell, - LibertyReader *visitor) -{ - switch (cell->libertyLibrary()->delayModelType()) { - case DelayModelType::cmos_linear: - makeLinearModels(cell); - break; - case DelayModelType::table: - makeTableModels(cell, visitor); - break; - case DelayModelType::cmos_pwl: - case DelayModelType::cmos2: - case DelayModelType::polynomial: - case DelayModelType::dcm: - break; - } } void -TimingGroup::makeLinearModels(LibertyCell *cell) +LibertyReader::readTestCell(LibertyCell *cell, + const LibertyGroup *cell_group) { - LibertyLibrary *library = cell->libertyLibrary(); - for (auto rf : RiseFall::range()) { - int rf_index = rf->index(); - float intr = intrinsic_[rf_index]; - bool intr_exists = intrinsic_exists_[rf_index]; - if (!intr_exists) - library->defaultIntrinsic(rf, intr, intr_exists); - TimingModel *model = nullptr; - if (timingTypeIsCheck(attrs_->timingType())) { - if (intr_exists) - model = new CheckLinearModel(cell, intr); - } + const LibertyGroup *test_cell_group = cell_group->findSubgroup("test_cell"); + if (test_cell_group) { + if (cell->testCell()) + libWarn(1262, test_cell_group, "cell %s test_cell redefinition.", cell->name()); else { - float res = resistance_[rf_index]; - bool res_exists = resistance_exists_[rf_index]; - if (!res_exists) - library->defaultPinResistance(rf, PortDirection::output(), - res, res_exists); - if (!res_exists) - res = 0.0F; - if (intr_exists) - model = new GateLinearModel(cell, intr, res); - } - attrs_->setModel(rf, model); - } -} - -void -TimingGroup::makeTableModels(LibertyCell *cell, - LibertyReader *reader) -{ - for (const RiseFall *rf : RiseFall::range()) { - int rf_index = rf->index(); - TableModel *delay = cell_[rf_index]; - TableModel *transition = transition_[rf_index]; - TableModel *constraint = constraint_[rf_index]; - if (delay || transition) { - attrs_->setModel(rf, new GateTableModel(cell, delay, delay_sigma_[rf_index], - transition, - slew_sigma_[rf_index], - receiver_model_, - output_waveforms_[rf_index])); - TimingType timing_type = attrs_->timingType(); - if (timing_type == TimingType::clear - || timing_type == TimingType::combinational - || timing_type == TimingType::combinational_fall - || timing_type == TimingType::combinational_rise - || timing_type == TimingType::falling_edge - || timing_type == TimingType::preset - || timing_type == TimingType::rising_edge - || timing_type == TimingType::three_state_disable - || timing_type == TimingType::three_state_disable_rise - || timing_type == TimingType::three_state_disable_fall - || timing_type == TimingType::three_state_enable - || timing_type == TimingType::three_state_enable_fall - || timing_type == TimingType::three_state_enable_rise) { - if (transition == nullptr) - reader->libWarn(1210, line_, "missing %s_transition.", rf->name()); - if (delay == nullptr) - reader->libWarn(1211, line_, "missing cell_%s.", rf->name()); - } - } - else if (constraint) - attrs_->setModel(rf, new CheckTableModel(cell, constraint, - constraint_sigma_[rf_index])); - cell_[rf_index] = nullptr; - transition_[rf_index] = nullptr; - constraint_[rf_index] = nullptr; - } -} - -void -LibertyReader::makeTimingArcs(const char *from_port_name, - PortNameBitIterator &from_port_iter, - LibertyPort *to_port, - LibertyPort *related_out_port, - TimingGroup *timing) -{ - if (from_port_iter.size() == 1 && !to_port->hasMembers()) { - // one -> one - if (from_port_iter.hasNext()) { - LibertyPort *from_port = from_port_iter.next(); - if (from_port->direction()->isOutput()) - libWarn(1212, timing->line(), "timing group from output port."); - builder_.makeTimingArcs(cell_, from_port, to_port, related_out_port, - timing->attrs(), timing->line()); - } - } - else if (from_port_iter.size() > 1 && !to_port->hasMembers()) { - // bus -> one - while (from_port_iter.hasNext()) { - LibertyPort *from_port = from_port_iter.next(); - if (from_port->direction()->isOutput()) - libWarn(1213, timing->line(), "timing group from output port."); - builder_.makeTimingArcs(cell_, from_port, to_port, related_out_port, - timing->attrs(), timing->line()); - } - } - else if (from_port_iter.size() == 1 && to_port->hasMembers()) { - // one -> bus - if (from_port_iter.hasNext()) { - LibertyPort *from_port = from_port_iter.next(); - if (from_port->direction()->isOutput()) - libWarn(1214, timing->line(), "timing group from output port."); - LibertyPortMemberIterator bit_iter(to_port); - while (bit_iter.hasNext()) { - LibertyPort *to_port_bit = bit_iter.next(); - builder_.makeTimingArcs(cell_, from_port, to_port_bit, related_out_port, - timing->attrs(), timing->line()); - } - } - } - else { - // bus -> bus - if (timing->isOneToOne()) { - int from_size = from_port_iter.size(); - int to_size = to_port->size(); - LibertyPortMemberIterator to_port_iter(to_port); - // warn about different sizes - if (from_size != to_size) - libWarn(1216, timing->line(), - "timing port %s and related port %s are different sizes.", - from_port_name, - to_port->name()); - // align to/from iterators for one-to-one mapping - while (from_size > to_size) { - from_size--; - from_port_iter.next(); - } - while (to_size > from_size) { - to_size--; - to_port_iter.next(); - } - // make timing arcs - while (from_port_iter.hasNext() && to_port_iter.hasNext()) { - LibertyPort *from_port_bit = from_port_iter.next(); - LibertyPort *to_port_bit = to_port_iter.next(); - if (from_port_bit->direction()->isOutput()) - libWarn(1215, timing->line(), "timing group from output port."); - builder_.makeTimingArcs(cell_, from_port_bit, to_port_bit, - related_out_port, timing->attrs(), - timing->line()); - } - } - else { - while (from_port_iter.hasNext()) { - LibertyPort *from_port_bit = from_port_iter.next(); - if (from_port_bit->direction()->isOutput()) - libWarn(1217, timing->line(), "timing group from output port."); - LibertyPortMemberIterator to_iter(to_port); - while (to_iter.hasNext()) { - LibertyPort *to_port_bit = to_iter.next(); - builder_.makeTimingArcs(cell_, from_port_bit, to_port_bit, - related_out_port, timing->attrs(), - timing->line()); - } - } - } - } -} - -void -LibertyReader::makeTimingArcs(LibertyPort *to_port, - LibertyPort *related_out_port, - TimingGroup *timing) -{ - if (to_port->hasMembers()) { - LibertyPortMemberIterator bit_iter(to_port); - while (bit_iter.hasNext()) { - LibertyPort *to_port_bit = bit_iter.next(); - builder_.makeTimingArcs(cell_, nullptr, to_port_bit, - related_out_port, timing->attrs(), - timing->line()); - } - } - else - builder_.makeTimingArcs(cell_, nullptr, to_port, - related_out_port, timing->attrs(), - timing->line()); -} - -//////////////////////////////////////////////////////////////// - -// Group that encloses receiver_capacitance1/2 etc groups. -void -LibertyReader::beginReceiverCapacitance(LibertyGroup *) -{ - receiver_model_ = make_shared(); -} - -void -LibertyReader::endReceiverCapacitance(LibertyGroup *) -{ - if (ports_) { - for (LibertyPort *port : *ports_) - port->setReceiverModel(receiver_model_); - } - receiver_model_ = nullptr; -} - -// For receiver_capacitance groups with mulitiple segments this -// overrides the index passed in beginReceiverCapacitance1Rise/Fall. -void -LibertyReader::visitSegement(LibertyAttr *attr) -{ - if (receiver_model_) { - int segment; - bool exists; - getAttrInt(attr, segment, exists); - if (exists) - index_ = segment; - } -} - -void -LibertyReader::beginReceiverCapacitance1Rise(LibertyGroup *group) -{ - beginReceiverCapacitance(group, 0, RiseFall::rise()); -} - -void -LibertyReader::beginReceiverCapacitance1Fall(LibertyGroup *group) -{ - beginReceiverCapacitance(group, 0, RiseFall::fall()); -} - -void -LibertyReader::beginReceiverCapacitance2Rise(LibertyGroup *group) -{ - beginReceiverCapacitance(group, 1, RiseFall::rise()); -} - -void -LibertyReader::beginReceiverCapacitance2Fall(LibertyGroup *group) -{ - beginReceiverCapacitance(group, 1, RiseFall::fall()); -} - -void -LibertyReader::beginReceiverCapacitance(LibertyGroup *group, - int index, - const RiseFall *rf) -{ - if (timing_ || ports_) { - beginTableModel(group, TableTemplateType::delay, rf, 1.0, - ScaleFactorType::pin_cap); - index_ = index; - } - else - libWarn(1218, group, "receiver_capacitance group not in timing or pin group."); -} - -void -LibertyReader::endReceiverCapacitanceRiseFall(LibertyGroup *group) -{ - if (table_) { - if (ReceiverModel::checkAxes(table_)) { - if (receiver_model_ == nullptr) { - receiver_model_ = make_shared(); - if (timing_) - timing_->setReceiverModel(receiver_model_); - } - receiver_model_->setCapacitanceModel(TableModel(table_, tbl_template_, - scale_factor_type_, rf_), - index_, rf_); - } - else - libWarn(1219, group, "unsupported model axis."); - endTableModel(); - } -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginOutputCurrentRise(LibertyGroup *group) -{ - beginOutputCurrent(RiseFall::rise(), group); -} - -void -LibertyReader::beginOutputCurrentFall(LibertyGroup *group) -{ - beginOutputCurrent(RiseFall::fall(), group); -} - -void -LibertyReader::beginOutputCurrent(const RiseFall *rf, - LibertyGroup *group) -{ - if (timing_) { - rf_ = rf; - output_currents_.clear(); - } - else - libWarn(1220, group, "output_current_%s group not in timing group.", - rf->name()); -} - -void -LibertyReader::endOutputCurrentRiseFall(LibertyGroup *group) -{ - if (timing_) { - std::set slew_set, cap_set; - FloatSeq slew_values; - FloatSeq cap_values; - for (OutputWaveform *waveform : output_currents_) { - float slew = waveform->slew(); - if (!slew_set.contains(slew)) { - slew_set.insert(slew); - slew_values.push_back(slew); - } - float cap = waveform->cap(); - if (!cap_set.contains(cap)) { - cap_set.insert(cap); - cap_values.push_back(cap); - } - } - sort(slew_values, std::less()); - sort(cap_values, std::less()); - size_t slew_size = slew_values.size(); - size_t cap_size = cap_values.size(); - TableAxisPtr slew_axis=make_shared(TableAxisVariable::input_net_transition, - std::move(slew_values)); - TableAxisPtr cap_axis = - make_shared(TableAxisVariable::total_output_net_capacitance, - std::move(cap_values)); - FloatSeq ref_times(slew_size); - Table1Seq current_waveforms(slew_size * cap_size); - for (OutputWaveform *waveform : output_currents_) { - size_t slew_index, cap_index; - bool slew_exists, cap_exists; - slew_axis->findAxisIndex(waveform->slew(), slew_index, slew_exists); - cap_axis->findAxisIndex(waveform->cap(), cap_index, cap_exists); - if (slew_exists && cap_exists) { - size_t index = slew_index * cap_axis->size() + cap_index; - current_waveforms[index] = waveform->stealCurrents(); - ref_times[slew_index] = waveform->referenceTime(); - } - else - libWarn(1221, group, "output current waveform %.2e %.2e not found.", - waveform->slew(), - waveform->cap()); - } - Table ref_time_tbl(std::move(ref_times), slew_axis); - OutputWaveforms *output_current = new OutputWaveforms(slew_axis, cap_axis, rf_, - current_waveforms, - std::move(ref_time_tbl)); - timing_->setOutputWaveforms(rf_, output_current); - deleteContents(output_currents_); - } -} - -void -LibertyReader::beginVector(LibertyGroup *group) -{ - if (timing_ && !in_ccsn_) { - beginTable(group, TableTemplateType::output_current, current_scale_); - scale_factor_type_ = ScaleFactorType::unknown; - reference_time_exists_ = false; - if (tbl_template_ && !OutputWaveforms::checkAxes(tbl_template_)) - libWarn(1222, group, "unsupported model axis."); - } -} - -void -LibertyReader::visitReferenceTime(LibertyAttr *attr) -{ - getAttrFloat(attr, reference_time_, reference_time_exists_); - if (reference_time_exists_) - reference_time_ *= time_scale_; -} - -void -LibertyReader::endVector(LibertyGroup *group) -{ - if (timing_ && tbl_template_) { - TableAxisPtr slew_axis, cap_axis; - // Canonicalize axis order. - if (tbl_template_->axis1()->variable() == TableAxisVariable::input_net_transition) { - slew_axis = axis_[0]; - cap_axis = axis_[1]; - } - else { - slew_axis = axis_[1]; - cap_axis = axis_[0]; - } - - if (slew_axis->size() == 1 && cap_axis->size() == 1) { - // Convert 1x1xN Table (order 3) to 1D Table. - float slew = slew_axis->axisValue(0); - float cap = cap_axis->axisValue(0); - Table *table_ptr = table_.get(); - FloatTable *values3 = table_ptr->values3(); - FloatSeq row = std::move((*values3)[0]); - values3->erase(values3->begin()); - Table *table1 = new Table(std::move(row), axis_[2]); - OutputWaveform *waveform = new OutputWaveform(slew, cap, table1, reference_time_); - output_currents_.push_back(waveform); - } - else - libWarn(1223,group->line(), "vector index_1 and index_2 must have exactly one value."); - if (!reference_time_exists_) - libWarn(1224, group->line(), "vector reference_time not found."); - reference_time_exists_ = false; - tbl_template_ = nullptr; - } -} - -/////////////////////////////////////////////////////////////// - -void -LibertyReader::beginNormalizedDriverWaveform(LibertyGroup *group) -{ - beginTable(group, TableTemplateType::delay, time_scale_); - driver_waveform_name_.clear(); -} - -void -LibertyReader::visitDriverWaveformName(LibertyAttr *attr) -{ - driver_waveform_name_ = getAttrString(attr); -} - -void -LibertyReader::endNormalizedDriverWaveform(LibertyGroup *group) -{ - if (table_) { - if (table_->axis1()->variable() == TableAxisVariable::input_net_transition) { - if (table_->axis2()->variable() == TableAxisVariable::normalized_voltage) { - // Null driver_waveform_name_ means it is the default unnamed waveform. - library_->makeDriverWaveform(driver_waveform_name_, table_); - - } - else - libWarn(1225, group, "normalized_driver_waveform variable_2 must be normalized_voltage"); - } - else - libWarn(1226, group, "normalized_driver_waveform variable_1 must be input_net_transition"); - } - endTableModel(); -} - -void -LibertyReader::visitDriverWaveformRise(LibertyAttr *attr) -{ - visitDriverWaveformRiseFall(attr, RiseFall::rise()); -} - -void -LibertyReader::visitDriverWaveformFall(LibertyAttr *attr) -{ - visitDriverWaveformRiseFall(attr, RiseFall::fall()); -} - -void -LibertyReader::visitDriverWaveformRiseFall(LibertyAttr *attr, - const RiseFall *rf) -{ - if (ports_) { - const char *driver_waveform_name = getAttrString(attr); - DriverWaveform *driver_waveform = library_->findDriverWaveform(driver_waveform_name); - if (driver_waveform) { - for (LibertyPort *port : *ports_) - port->setDriverWaveform(driver_waveform, rf); - } - } -} - -/////////////////////////////////////////////////////////////// - -void -LibertyReader::makeInternalPowers(LibertyPort *port, - InternalPowerGroup *power_group) -{ - int line = power_group->line(); - const std::string &related_pg_pin_name = power_group->relatedPgPin(); - LibertyPort *related_pg_pin = cell_->findLibertyPort(related_pg_pin_name.c_str()); - - StringSeq *related_port_names = power_group->relatedPortNames(); - if (related_port_names) { - for (const char *related_port_name : *related_port_names) { - PortNameBitIterator related_port_iter(cell_, related_port_name, this, line); - if (related_port_iter.hasNext()) { - debugPrint(debug_, "liberty", 2, " power %s -> %s", - related_port_name, port->name()); - makeInternalPowers(port, related_port_name, related_port_iter, - related_pg_pin, power_group); - } - } - } - else { - if (port->hasMembers()) { - LibertyPortMemberIterator bit_iter(port); - while (bit_iter.hasNext()) { - LibertyPort *port_bit = bit_iter.next(); - cell_->makeInternalPower(port_bit, nullptr, related_pg_pin, - power_group->when(), power_group->models()); - } - } - else - cell_->makeInternalPower(port, nullptr, related_pg_pin, power_group->when(), - power_group->models()); - } -} - -void -LibertyReader::makeInternalPowers(LibertyPort *port, - const char *related_port_name, - PortNameBitIterator &related_port_iter, - LibertyPort *related_pg_pin, - InternalPowerGroup *power_group) -{ - const auto &when = power_group->when(); - InternalPowerModels &models = power_group->models(); - if (related_port_iter.size() == 1 && !port->hasMembers()) { - // one -> one - if (related_port_iter.hasNext()) { - LibertyPort *related_port = related_port_iter.next(); - cell_->makeInternalPower(port, related_port, related_pg_pin, when, models); - } - } - else if (related_port_iter.size() > 1 && !port->hasMembers()) { - // bus -> one - while (related_port_iter.hasNext()) { - LibertyPort *related_port = related_port_iter.next(); - cell_->makeInternalPower(port, related_port, related_pg_pin, when, models); - } - } - else if (related_port_iter.size() == 1 && port->hasMembers()) { - // one -> bus - if (related_port_iter.hasNext()) { - LibertyPort *related_port = related_port_iter.next(); - LibertyPortMemberIterator bit_iter(port); - while (bit_iter.hasNext()) { - LibertyPort *port_bit = bit_iter.next(); - cell_->makeInternalPower(port_bit, related_port, related_pg_pin, when, models); - } - } - } - else { - // bus -> bus - if (power_group->isOneToOne()) { - if (static_cast(related_port_iter.size()) == port->size()) { - LibertyPortMemberIterator to_iter(port); - while (related_port_iter.hasNext() && to_iter.hasNext()) { - LibertyPort *related_port_bit = related_port_iter.next(); - LibertyPort *port_bit = to_iter.next(); - cell_->makeInternalPower(port_bit, related_port_bit, related_pg_pin, - when, models); - } - } - else - libWarn(1227, power_group->line(), - "internal_power port %s and related port %s are different sizes.", - related_port_name, - port->name()); - } - else { - while (related_port_iter.hasNext()) { - LibertyPort *related_port_bit = related_port_iter.next(); - LibertyPortMemberIterator to_iter(port); - while (to_iter.hasNext()) { - LibertyPort *port_bit = to_iter.next(); - cell_->makeInternalPower(port_bit, related_port_bit, related_pg_pin, - when, models); - } - } + std::string test_cell_name = std::string(cell->name()) + "/test_cell"; + TestCell *test_cell = new TestCell(cell->libertyLibrary(), + std::move(test_cell_name), + cell->filename()); + cell->setTestCell(test_cell); + readCell(test_cell, test_cell_group); } } } //////////////////////////////////////////////////////////////// -void -LibertyReader::visitArea(LibertyAttr *attr) -{ - if (cell_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - cell_->setArea(value); - } - if (wireload_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - wireload_->setArea(value); - } -} - -void -LibertyReader::visitDontUse(LibertyAttr *attr) -{ - if (cell_) { - bool dont_use, exists; - getAttrBool(attr, dont_use, exists); - if (exists) - cell_->setDontUse(dont_use); - } -} - -void -LibertyReader::visitIsMacro(LibertyAttr *attr) -{ - if (cell_) { - bool is_macro, exists; - getAttrBool(attr, is_macro, exists); - if (exists) - cell_->setIsMacro(is_macro); - } -} - -void -LibertyReader::visitIsMemory(LibertyAttr *attr) -{ - if (cell_) { - bool is_memory, exists; - getAttrBool(attr, is_memory, exists); - if (exists) - cell_->setIsMemory(is_memory); - } -} - -void -LibertyReader::visitIsPadCell(LibertyAttr *attr) -{ - if (cell_) { - bool pad_cell, exists; - getAttrBool(attr, pad_cell, exists); - if (exists) - cell_->setIsPad(pad_cell); - } -} - -void -LibertyReader::visitIsClockCell(LibertyAttr *attr) -{ - if (cell_) { - bool is_clock_cell, exists; - getAttrBool(attr, is_clock_cell, exists); - if (exists) - cell_->setIsClockCell(is_clock_cell); - } -} - -void -LibertyReader::visitIsLevelShifter(LibertyAttr *attr) -{ - if (cell_) { - bool is_level_shifter, exists; - getAttrBool(attr, is_level_shifter, exists); - if (exists) - cell_->setIsLevelShifter(is_level_shifter); - } -} - -void -LibertyReader::visitLevelShifterType(LibertyAttr *attr) -{ - if (cell_) { - const char *level_shifter_type = getAttrString(attr); - if (stringEq(level_shifter_type, "HL")) - cell_->setLevelShifterType(LevelShifterType::HL); - else if (stringEq(level_shifter_type, "LH")) - cell_->setLevelShifterType(LevelShifterType::LH); - else if (stringEq(level_shifter_type, "HL_LH")) - cell_->setLevelShifterType(LevelShifterType::HL_LH); - else - libWarn(1228, attr, "level_shifter_type must be HL, LH, or HL_LH"); - } -} - -void -LibertyReader::visitIsIsolationCell(LibertyAttr *attr) -{ - if (cell_) { - bool is_isolation_cell, exists; - getAttrBool(attr, is_isolation_cell, exists); - if (exists) - cell_->setIsIsolationCell(is_isolation_cell); - } -} - -void -LibertyReader::visitAlwaysOn(LibertyAttr *attr) -{ - if (cell_) { - bool always_on, exists; - getAttrBool(attr, always_on, exists); - if (exists) - cell_->setAlwaysOn(always_on); - } -} - -void -LibertyReader::visitSwitchCellType(LibertyAttr *attr) -{ - if (cell_) { - const char *switch_cell_type = getAttrString(attr); - if (stringEq(switch_cell_type, "coarse_grain")) - cell_->setSwitchCellType(SwitchCellType::coarse_grain); - else if (stringEq(switch_cell_type, "fine_grain")) - cell_->setSwitchCellType(SwitchCellType::fine_grain); - else - libWarn(1229, attr, "switch_cell_type must be coarse_grain or fine_grain"); - } -} - -void -LibertyReader::visitInterfaceTiming(LibertyAttr *attr) -{ - if (cell_) { - bool value, exists; - getAttrBool(attr, value, exists); - if (exists) - cell_->setInterfaceTiming(value); - } -} - -void -LibertyReader::visitScalingFactors(LibertyAttr *attr) -{ - if (cell_) { - const char *scale_factors_name = getAttrString(attr); - ScaleFactors *scales = library_->findScaleFactors(scale_factors_name); - if (scales) - cell_->setScaleFactors(scales); - else - libWarn(1230, attr, "scaling_factors %s not found.", scale_factors_name); - } -} - -void -LibertyReader::visitClockGatingIntegratedCell(LibertyAttr *attr) -{ - if (cell_) { - const char *clock_gate_type = getAttrString(attr); - if (clock_gate_type) { - if (stringBeginEqual(clock_gate_type, "latch_posedge")) - cell_->setClockGateType(ClockGateType::latch_posedge); - else if (stringBeginEqual(clock_gate_type, "latch_negedge")) - cell_->setClockGateType(ClockGateType::latch_negedge); - else - cell_->setClockGateType(ClockGateType::other); - } - } -} - -void -LibertyReader::visitCellFootprint(LibertyAttr *attr) -{ - if (cell_) { - const char *footprint = getAttrString(attr); - if (footprint) - cell_->setFootprint(footprint); - } -} - -void -LibertyReader::visitCellUserFunctionClass(LibertyAttr *attr) -{ - if (cell_) { - const char *user_function_class = getAttrString(attr); - if (user_function_class) - cell_->setUserFunctionClass(user_function_class); - } -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginPin(LibertyGroup *group) -{ - if (cell_) { - if (in_bus_) { - saved_ports_ = ports_; - saved_port_group_ = port_group_; - ports_ = new LibertyPortSeq; - for (LibertyAttrValue *param : *group->params()) { - if (param->isString()) { - const std::string &port_name = param->stringValue(); - debugPrint(debug_, "liberty", 1, " port %s", port_name.c_str()); - PortNameBitIterator port_iter(cell_, port_name.c_str(), this, group->line()); - while (port_iter.hasNext()) { - LibertyPort *port = port_iter.next(); - ports_->push_back(port); - } - } - else - libWarn(1231, group, "pin name is not a string."); - } - } - else if (in_bundle_) { - saved_ports_ = ports_; - saved_port_group_ = port_group_; - ports_ = new LibertyPortSeq; - for (LibertyAttrValue *param : *group->params()) { - if (param->isString()) { - const char *name = param->stringValue().c_str(); - debugPrint(debug_, "liberty", 1, " port %s", name); - LibertyPort *port = findPort(name); - if (port == nullptr) - port = makePort(cell_, name); - ports_->push_back(port); - } - else - libWarn(1232, group, "pin name is not a string."); - } - } - else { - ports_ = new LibertyPortSeq; - // Multiple port names can share group def. - for (LibertyAttrValue *param : *group->params()) { - if (param->isString()) { - const char *name = param->stringValue().c_str(); - debugPrint(debug_, "liberty", 1, " port %s", name); - LibertyPort *port = makePort(cell_, name); - ports_->push_back(port); - } - else - libWarn(1233, group, "pin name is not a string."); - } - } - port_group_ = new PortGroup(ports_, group->line()); - cell_port_groups_.push_back(port_group_); - } -} - LibertyPort * LibertyReader::makePort(LibertyCell *cell, const char *port_name) { - string sta_name = portLibertyToSta(port_name); + std::string sta_name = portLibertyToSta(port_name); return builder_.makePort(cell, sta_name.c_str()); } @@ -3235,189 +3012,13 @@ LibertyReader::makeBusPort(LibertyCell *cell, int to_index, BusDcl *bus_dcl) { - string sta_name = portLibertyToSta(bus_name); + std::string sta_name = portLibertyToSta(bus_name); return builder_.makeBusPort(cell, bus_name, from_index, to_index, bus_dcl); } -void -LibertyReader::endPin(LibertyGroup *) -{ - if (cell_) { - endPorts(); - if (in_bus_ || in_bundle_) { - ports_ = saved_ports_; - port_group_ = saved_port_group_; - } - } -} - -void -LibertyReader::endPorts() -{ - // Capacitances default based on direction so wait until the end - // of the pin group to set them. - if (ports_) { - for (LibertyPort *port : *ports_) { - if (in_bus_ || in_bundle_) { - // Do not clobber member port capacitances by setting the capacitance - // on a bus or bundle. - LibertyPortMemberIterator member_iter(port); - while (member_iter.hasNext()) { - LibertyPort *member = member_iter.next(); - setPortCapDefault(member); - } - } - else - setPortCapDefault(port); - } - ports_ = nullptr; - port_group_ = nullptr; - } -} - -void -LibertyReader::setPortCapDefault(LibertyPort *port) -{ - for (auto min_max : MinMax::range()) { - for (auto tr : RiseFall::range()) { - float cap; - bool exists; - port->capacitance(tr, min_max, cap, exists); - if (!exists) - port->setCapacitance(tr, min_max, defaultCap(port)); - } - } -} - -void -LibertyReader::beginBus(LibertyGroup *group) -{ - if (cell_) { - beginBusOrBundle(group); - in_bus_ = true; - } -} - -void -LibertyReader::endBus(LibertyGroup *group) -{ - if (cell_) { - if (ports_->empty()) - libWarn(1234, group, "bus %s bus_type not found.", group->firstName()); - endBusOrBundle(); - in_bus_ = false; - } -} - -void -LibertyReader::beginBusOrBundle(LibertyGroup *group) -{ - // Multiple port names can share group def. - for (LibertyAttrValue *param : *group->params()) { - if (param->isString()) { - const string &name = param->stringValue(); - bus_names_.push_back(stringCopy(name.c_str())); - } - } - ports_ = new LibertyPortSeq; - port_group_ = new PortGroup(ports_, group->line()); - cell_port_groups_.push_back(port_group_); -} - -void -LibertyReader::endBusOrBundle() -{ - endPorts(); - deleteContents(&bus_names_); - bus_names_.clear(); - ports_ = nullptr; - port_group_ = nullptr; -} - -// Bus port are not made until the bus_type is specified. -void -LibertyReader::visitBusType(LibertyAttr *attr) -{ - if (cell_) { - const char *bus_type = getAttrString(attr); - if (bus_type) { - // Look for bus dcl local to cell first. - BusDcl *bus_dcl = cell_->findBusDcl(bus_type); - if (bus_dcl == nullptr) - bus_dcl = library_->findBusDcl(bus_type); - if (bus_dcl) { - for (const char *name : bus_names_) { - debugPrint(debug_, "liberty", 1, " bus %s", name); - LibertyPort *port = makeBusPort(cell_, name, bus_dcl->from(), - bus_dcl->to(), bus_dcl); - ports_->push_back(port); - } - } - else - libWarn(1235, attr, "bus_type %s not found.", bus_type); - } - else - libWarn(1236, attr, "bus_type is not a string."); - } -} - -void -LibertyReader::beginBundle(LibertyGroup *group) -{ - if (cell_) { - beginBusOrBundle(group); - in_bundle_ = true; - } -} - -void -LibertyReader::endBundle(LibertyGroup *group) -{ - if (cell_) { - if (ports_ && ports_->empty()) - libWarn(1237, group, "bundle %s member not found.", group->firstName()); - endBusOrBundle(); - in_bundle_ = false; - } -} - -void -LibertyReader::visitMembers(LibertyAttr *attr) -{ - if (cell_) { - if (attr->isComplexAttr()) { - for (const char *name : bus_names_) { - debugPrint(debug_, "liberty", 1, " bundle %s", name); - ConcretePortSeq *members = new ConcretePortSeq; - for (LibertyAttrValue *value : *attr->values()) { - if (value->isString()) { - const char *port_name = value->stringValue().c_str(); - LibertyPort *port = findPort(port_name); - if (port == nullptr) - port = makePort(cell_, port_name); - members->push_back(port); - } - else - libWarn(1238, attr, "member is not a string."); - } - LibertyPort *port = builder_.makeBundlePort(cell_, name, members); - ports_->push_back(port); - } - } - else - libWarn(1239, attr,"members attribute is missing values."); - } -} - -LibertyPort * -LibertyReader::findPort(const char *port_name) -{ - return findPort(cell_, port_name); -} - // Also used by LibExprParser::makeFuncExprPort. LibertyPort * -libertyReaderFindPort(LibertyCell *cell, +libertyReaderFindPort(const LibertyCell *cell, const char *port_name) { LibertyPort *port = cell->findLibertyPort(port_name); @@ -3427,7 +3028,7 @@ libertyReaderFindPort(LibertyCell *cell, char brkt_right = library->busBrktRight(); const char escape = '\\'; // Pins at top level with bus names have escaped brackets. - string escaped_port_name = escapeChars(port_name, brkt_left, brkt_right, escape); + std::string escaped_port_name = escapeChars(port_name, brkt_left, brkt_right, escape); port = cell->findLibertyPort(escaped_port_name.c_str()); } return port; @@ -3440,193 +3041,6 @@ LibertyReader::findPort(LibertyCell *cell, return libertyReaderFindPort(cell, port_name); } -void -LibertyReader::visitDirection(LibertyAttr *attr) -{ - if (ports_) { - const char *dir = getAttrString(attr); - if (dir) { - PortDirection *port_dir = PortDirection::unknown(); - if (stringEq(dir, "input")) - port_dir = PortDirection::input(); - else if (stringEq(dir, "output")) - port_dir = PortDirection::output(); - else if (stringEq(dir, "inout")) - port_dir = PortDirection::bidirect(); - else if (stringEq(dir, "internal")) - port_dir = PortDirection::internal(); - else - libWarn(1240, attr, "unknown port direction."); - - for (LibertyPort *port : *ports_) { - // Tristate enable function sets direction to tristate; don't - // clobber it. - if (!port->direction()->isTristate()) - port->setDirection(port_dir); - } - } - } -} - -void -LibertyReader::visitFunction(LibertyAttr *attr) -{ - if (ports_) { - const char *func = getAttrString(attr); - if (func) { - for (LibertyPort *port : *ports_) - makeLibertyFunc(func, - [port] (FuncExpr *expr) { port->setFunction(expr); }, - false, "function", attr); - } - } -} - -void -LibertyReader::visitThreeState(LibertyAttr *attr) -{ - if (ports_) { - const char *three_state = getAttrString(attr); - if (three_state) { - for (LibertyPort *port : *ports_) - makeLibertyFunc(three_state, - [port] (FuncExpr *expr) { port->setTristateEnable(expr); }, - true, "three_state", attr); - } - } -} - -void -LibertyReader::visitPorts(std::function func) -{ - for (LibertyPort *port : *ports_) { - func(port); - LibertyPortMemberIterator member_iter(port); - while (member_iter.hasNext()) { - LibertyPort *member = member_iter.next(); - func(member); - } - } -} - -void -LibertyReader::visitClock(LibertyAttr *attr) -{ - if (ports_) { - bool is_clk, exists; - getAttrBool(attr, is_clk, exists); - if (exists) { - for (LibertyPort *port : *ports_) - port->setIsClock(is_clk); - } - } -} - -void -LibertyReader::visitIsPad(LibertyAttr *attr) -{ - if (ports_) { - bool is_pad, exists; - getAttrBool(attr, is_pad, exists); - if (exists) { - for (LibertyPort *port : *ports_) - port->setIsPad(is_pad); - } - } -} - -void -LibertyReader::visitCapacitance(LibertyAttr *attr) -{ - if (ports_) { - float cap; - bool exists; - getAttrFloat(attr, cap, exists); - if (exists) { - cap *= cap_scale_; - for (LibertyPort *port : *ports_) - port->setCapacitance(cap); - } - } - if (wireload_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - wireload_->setCapacitance(value * cap_scale_); - } -} - -void -LibertyReader::visitRiseCap(LibertyAttr *attr) -{ - if (ports_) { - float cap; - bool exists; - getAttrFloat(attr, cap, exists); - if (exists) { - cap *= cap_scale_; - for (LibertyPort *port : *ports_) { - port->setCapacitance(RiseFall::rise(), MinMax::min(), cap); - port->setCapacitance(RiseFall::rise(), MinMax::max(), cap); - } - } - } -} - -void -LibertyReader::visitFallCap(LibertyAttr *attr) -{ - if (ports_) { - float cap; - bool exists; - getAttrFloat(attr, cap, exists); - if (exists) { - cap *= cap_scale_; - for (LibertyPort *port : *ports_) { - port->setCapacitance(RiseFall::fall(), MinMax::min(), cap); - port->setCapacitance(RiseFall::fall(), MinMax::max(), cap); - } - } - } -} - -void -LibertyReader::visitRiseCapRange(LibertyAttr *attr) -{ - if (ports_) { - bool exists; - float min, max; - getAttrFloat2(attr, min, max, exists); - if (exists) { - min *= cap_scale_; - max *= cap_scale_; - for (LibertyPort *port : *ports_) { - port->setCapacitance(RiseFall::rise(), MinMax::min(), min); - port->setCapacitance(RiseFall::rise(), MinMax::max(), max); - } - } - } -} - -void -LibertyReader::visitFallCapRange(LibertyAttr *attr) -{ - if (ports_) { - bool exists; - float min, max; - getAttrFloat2(attr, min, max, exists); - if (exists) { - min *= cap_scale_; - max *= cap_scale_; - for (LibertyPort *port : *ports_) { - port->setCapacitance(RiseFall::fall(), MinMax::min(), min); - port->setCapacitance(RiseFall::fall(), MinMax::max(), max); - } - } - } -} - float LibertyReader::defaultCap(LibertyPort *port) { @@ -3642,535 +3056,8 @@ LibertyReader::defaultCap(LibertyPort *port) return cap; } -void -LibertyReader::visitFanoutLoad(LibertyAttr *attr) -{ - if (ports_) { - float fanout; - bool exists; - getAttrFloat(attr, fanout, exists); - if (exists) { - visitPorts([&] (LibertyPort *port) { - port->setFanoutLoad(fanout); - }); - } - } -} - -void -LibertyReader::visitMaxFanout(LibertyAttr *attr) -{ - visitFanout(attr, MinMax::max()); -} - -void -LibertyReader::visitMinFanout(LibertyAttr *attr) -{ - visitFanout(attr, MinMax::min()); -} - -void -LibertyReader::visitFanout(LibertyAttr *attr, - const MinMax *min_max) -{ - if (ports_) { - float fanout; - bool exists; - getAttrFloat(attr, fanout, exists); - if (exists) { - visitPorts([&] (LibertyPort *port) { - port->setFanoutLimit(fanout, min_max); - }); - } - } -} - -void -LibertyReader::visitMaxTransition(LibertyAttr *attr) -{ - visitMinMaxTransition(attr, MinMax::max()); -} - -void -LibertyReader::visitMinTransition(LibertyAttr *attr) -{ - visitMinMaxTransition(attr, MinMax::min()); -} - -void -LibertyReader::visitMinMaxTransition(LibertyAttr *attr, - const MinMax *min_max) -{ - if (cell_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - if (min_max == MinMax::max() && value == 0.0) - libWarn(1241, attr, "max_transition is 0.0."); - value *= time_scale_; - visitPorts([&] (LibertyPort *port) { - port->setSlewLimit(value, min_max); - }); - } - } -} - -void -LibertyReader::visitMaxCapacitance(LibertyAttr *attr) -{ - visitMinMaxCapacitance(attr, MinMax::max()); -} - -void -LibertyReader::visitMinCapacitance(LibertyAttr *attr) -{ - visitMinMaxCapacitance(attr, MinMax::min()); -} - -void -LibertyReader::visitMinMaxCapacitance(LibertyAttr *attr, - const MinMax *min_max) -{ - if (cell_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - value *= cap_scale_; - visitPorts([&] (LibertyPort *port) { - port->setCapacitanceLimit(value, min_max); - }); - } - } -} - -void -LibertyReader::visitMinPeriod(LibertyAttr *attr) -{ - if (cell_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - for (LibertyPort *port : *ports_) - port->setMinPeriod(value * time_scale_); - } - } -} - -void -LibertyReader::visitMinPulseWidthLow(LibertyAttr *attr) -{ - visitMinPulseWidth(attr, RiseFall::fall()); -} - -void -LibertyReader::visitMinPulseWidthHigh(LibertyAttr *attr) -{ - visitMinPulseWidth(attr, RiseFall::rise()); -} - -void -LibertyReader::visitMinPulseWidth(LibertyAttr *attr, - const RiseFall *rf) -{ - if (cell_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - value *= time_scale_; - for (LibertyPort *port : *ports_) - port->setMinPulseWidth(rf, value); - } - } -} - -void -LibertyReader::visitPulseClock(LibertyAttr *attr) -{ - if (cell_) { - const char *pulse_clk = getAttrString(attr); - if (pulse_clk) { - const RiseFall *trigger = nullptr; - const RiseFall *sense = nullptr; - if (stringEq(pulse_clk, "rise_triggered_high_pulse")) { - trigger = RiseFall::rise(); - sense = RiseFall::rise(); - } - else if (stringEq(pulse_clk, "rise_triggered_low_pulse")) { - trigger = RiseFall::rise(); - sense = RiseFall::fall(); - } - else if (stringEq(pulse_clk, "fall_triggered_high_pulse")) { - trigger = RiseFall::fall(); - sense = RiseFall::rise(); - } - else if (stringEq(pulse_clk, "fall_triggered_low_pulse")) { - trigger = RiseFall::fall(); - sense = RiseFall::fall(); - } - else - libWarn(1242,attr, "pulse_latch unknown pulse type."); - if (trigger) { - for (LibertyPort *port : *ports_) - port->setPulseClk(trigger, sense); - } - } - } -} - -void -LibertyReader::visitClockGateClockPin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsClockGateClock); -} - -void -LibertyReader::visitClockGateEnablePin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsClockGateEnable); -} - -void -LibertyReader::visitClockGateOutPin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsClockGateOut); -} - -void -LibertyReader::visitIsPllFeedbackPin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsPllFeedback); -} - -void -LibertyReader::visitSignalType(LibertyAttr *attr) -{ - if (test_cell_ && ports_) { - const char *type = getAttrString(attr); - if (type) { - ScanSignalType signal_type = ScanSignalType::none; - if (stringEq(type, "test_scan_enable")) - signal_type = ScanSignalType::enable; - else if (stringEq(type, "test_scan_enable_inverted")) - signal_type = ScanSignalType::enable_inverted; - else if (stringEq(type, "test_scan_clock")) - signal_type = ScanSignalType::clock; - else if (stringEq(type, "test_scan_clock_a")) - signal_type = ScanSignalType::clock_a; - else if (stringEq(type, "test_scan_clock_b")) - signal_type = ScanSignalType::clock_b; - else if (stringEq(type, "test_scan_in")) - signal_type = ScanSignalType::input; - else if (stringEq(type, "test_scan_in_inverted")) - signal_type = ScanSignalType::input_inverted; - else if (stringEq(type, "test_scan_out")) - signal_type = ScanSignalType::output; - else if (stringEq(type, "test_scan_out_inverted")) - signal_type = ScanSignalType::output_inverted; - else { - libWarn(1299, attr, "unknown signal_type %s.", type); - return; - } - for (LibertyPort *port : *ports_) - port->setScanSignalType(signal_type); - } - } -} - -void -LibertyReader::visitIsolationCellDataPin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsolationCellData); -} - -void -LibertyReader::visitIsolationCellEnablePin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsolationCellEnable); -} - -void -LibertyReader::visitLevelShifterDataPin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setLevelShifterData); -} - -void -LibertyReader::visitSwitchPin(LibertyAttr *attr) -{ - visitPortBoolAttr(attr, &LibertyPort::setIsSwitch); -} - -void -LibertyReader::visitPortBoolAttr(LibertyAttr *attr, - LibertyPortBoolSetter setter) -{ - if (cell_) { - bool value, exists; - getAttrBool(attr, value, exists); - if (exists) { - for (LibertyPort *port : *ports_) - (port->*setter)(value); - } - } -} - //////////////////////////////////////////////////////////////// -void -LibertyReader::beginMemory(LibertyGroup *) -{ - if (cell_) { - cell_->setIsMemory(true); - } -} - -void -LibertyReader::endMemory(LibertyGroup *) -{ -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginFF(LibertyGroup *group) -{ - beginSequential(group, true, false); -} - -void -LibertyReader::endFF(LibertyGroup *) -{ - sequential_ = nullptr; -} - -void -LibertyReader::beginFFBank(LibertyGroup *group) -{ - beginSequential(group, true, true); -} - -void -LibertyReader::endFFBank(LibertyGroup *) -{ - sequential_ = nullptr; -} - -void -LibertyReader::beginLatch(LibertyGroup *group) -{ - beginSequential(group, false, false); -} - -void -LibertyReader::endLatch(LibertyGroup *) -{ - sequential_ = nullptr; -} - -void -LibertyReader::beginLatchBank(LibertyGroup *group) -{ - beginSequential(group, false, true); -} - -void -LibertyReader::endLatchBank(LibertyGroup *) -{ - sequential_ = nullptr; -} - -void -LibertyReader::beginSequential(LibertyGroup *group, - bool is_register, - bool is_bank) -{ - if (cell_) { - // Define ff/latch state variables as internal ports. - const char *out_name, *out_inv_name; - int size; - bool has_size; - seqPortNames(group, out_name, out_inv_name, has_size, size); - LibertyPort *out_port = nullptr; - LibertyPort *out_port_inv = nullptr; - if (out_name) { - if (has_size) - out_port = makeBusPort(cell_, out_name, size - 1, 0, nullptr); - else - out_port = makePort(cell_, out_name); - out_port->setDirection(PortDirection::internal()); - } - if (out_inv_name) { - if (has_size) - out_port_inv = makeBusPort(cell_, out_inv_name, size - 1, 0, nullptr); - else - out_port_inv = makePort(cell_, out_inv_name); - out_port_inv->setDirection(PortDirection::internal()); - } - sequential_ = new SequentialGroup(is_register, is_bank, - out_port, out_port_inv, size, - group->line()); - cell_sequentials_.push_back(sequential_); - } -} - -void -LibertyReader::seqPortNames(LibertyGroup *group, - const char *&out_name, - const char *&out_inv_name, - bool &has_size, - int &size) -{ - out_name = nullptr; - out_inv_name = nullptr; - size = 1; - has_size = false; - if (group->params()->size() == 2) { - // out_port, out_port_inv - out_name = group->firstName(); - out_inv_name = group->secondName(); - } - else if (group->params()->size() == 3) { - LibertyAttrValue *third_value = (*group->params())[2]; - if (third_value->isFloat()) { - // out_port, out_port_inv, bus_size - out_name = group->firstName(); - out_inv_name = group->secondName(); - size = static_cast(third_value->floatValue()); - has_size = true; - } - else { - // in_port (ignored), out_port, out_port_inv - out_name = group->secondName(); - out_inv_name = third_value->stringValue().c_str(); - } - } -} - -void -LibertyReader::visitClockedOn(LibertyAttr *attr) -{ - if (sequential_) { - const char *func = getAttrString(attr); - if (func) - sequential_->setClock(stringCopy(func)); - } -} - -void -LibertyReader::visitDataIn(LibertyAttr *attr) -{ - if (sequential_) { - const char *func = getAttrString(attr); - if (func) - sequential_->setData(stringCopy(func)); - } -} - -void -LibertyReader::visitClear(LibertyAttr *attr) -{ - if (sequential_) { - const char *func = getAttrString(attr); - if (func) - sequential_->setClear(stringCopy(func)); - } -} - -void -LibertyReader::visitPreset(LibertyAttr *attr) -{ - if (sequential_) { - const char *func = getAttrString(attr); - if (func) - sequential_->setPreset(stringCopy(func)); - } -} - -void -LibertyReader::visitClrPresetVar1(LibertyAttr *attr) -{ - if (sequential_) { - LogicValue var = getAttrLogicValue(attr); - sequential_->setClrPresetVar1(var); - } -} - -void -LibertyReader::visitClrPresetVar2(LibertyAttr *attr) -{ - if (sequential_) { - LogicValue var = getAttrLogicValue(attr); - sequential_->setClrPresetVar2(var); - } -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginStatetable(LibertyGroup *group) -{ - if (cell_) { - const char *input_ports_arg = group->firstName(); - StdStringSeq input_ports; - if (input_ports_arg) - input_ports = parseTokenList(input_ports_arg, ' '); - - const char *internal_ports_arg = group->secondName(); - StdStringSeq internal_ports; - if (internal_ports_arg) - internal_ports = parseTokenList(internal_ports_arg, ' '); - statetable_ = new StatetableGroup(input_ports, internal_ports, group->line()); - } -} - -void -LibertyReader::visitTable(LibertyAttr *attr) -{ - if (statetable_) { - const char *table_str = getAttrString(attr); - StdStringSeq table_rows = parseTokenList(table_str, ','); - size_t input_count = statetable_->inputPorts().size(); - size_t internal_count = statetable_->internalPorts().size(); - for (string row : table_rows) { - StdStringSeq row_groups = parseTokenList(row.c_str(), ':'); - if (row_groups.size() != 3) { - libWarn(1300, attr, "table row must have 3 groups separated by ':'."); - break; - } - StdStringSeq inputs = parseTokenList(row_groups[0].c_str(), ' '); - if (inputs.size() != input_count) { - libWarn(1301, attr, "table row has %zu input values but %zu are required.", - inputs.size(), - input_count); - break; - } - StdStringSeq currents = parseTokenList(row_groups[1].c_str(), ' '); - if (currents.size() != internal_count) { - libWarn(1302, attr, "table row has %zu current values but %zu are required.", - currents.size(), - internal_count); - break; - } - StdStringSeq nexts = parseTokenList(row_groups[2].c_str(), ' '); - if (nexts.size() != internal_count) { - libWarn(1303, attr, "table row has %zu next values but %zu are required.", - nexts.size(), - internal_count); - break; - } - - StateInputValues input_values = parseStateInputValues(inputs, attr); - StateInternalValues current_values=parseStateInternalValues(currents,attr); - StateInternalValues next_values = parseStateInternalValues(nexts, attr); - statetable_->addRow(input_values, current_values, next_values); - } - } -} - static EnumNameMap state_input_value_name_map = {{StateInputValue::low, "L"}, {StateInputValue::high, "H"}, @@ -4195,10 +3082,10 @@ static EnumNameMap state_internal_value_name_map = StateInputValues LibertyReader::parseStateInputValues(StdStringSeq &inputs, - LibertyAttr *attr) + const LibertySimpleAttr *attr) { StateInputValues input_values; - for (string input : inputs) { + for (std::string input : inputs) { bool exists; StateInputValue value; state_input_value_name_map.find(input.c_str(), value, exists); @@ -4214,10 +3101,10 @@ LibertyReader::parseStateInputValues(StdStringSeq &inputs, StateInternalValues LibertyReader::parseStateInternalValues(StdStringSeq &states, - LibertyAttr *attr) + const LibertySimpleAttr *attr) { StateInternalValues state_values; - for (string state : states) { + for (std::string state : states) { bool exists; StateInternalValue value; state_internal_value_name_map.find(state.c_str(), value, exists); @@ -4231,530 +3118,30 @@ LibertyReader::parseStateInternalValues(StdStringSeq &states, return state_values; } -void -LibertyReader::endStatetable(LibertyGroup *) -{ -} - //////////////////////////////////////////////////////////////// -void -LibertyReader::beginTiming(LibertyGroup *group) -{ - if (port_group_) { - timing_ = new TimingGroup(group->line()); - port_group_->addTimingGroup(timing_); - } -} - -void -LibertyReader::endTiming(LibertyGroup *group) -{ - if (timing_) { - // Set scale factor type in constraint tables. - for (auto rf : RiseFall::range()) { - TableModel *model = timing_->constraint(rf); - if (model) { - ScaleFactorType type=timingTypeScaleFactorType(timing_->attrs()->timingType()); - model->setScaleFactorType(type); - } - } - TimingType timing_type = timing_->attrs()->timingType(); - if (timing_->relatedPortNames() == nullptr - && !(timing_type == TimingType::min_pulse_width - || timing_type == TimingType::minimum_period - || timing_type == TimingType::min_clock_tree_path - || timing_type == TimingType::max_clock_tree_path)) - libWarn(1243, group, "timing group missing related_pin/related_bus_pin."); - } - timing_ = nullptr; - receiver_model_ = nullptr; -} - -void -LibertyReader::visitRelatedPin(LibertyAttr *attr) -{ - if (timing_) - visitRelatedPin(attr, timing_); - if (internal_power_) - visitRelatedPin(attr, internal_power_); -} - -void -LibertyReader::visitRelatedPin(LibertyAttr *attr, - RelatedPortGroup *group) -{ - const char *port_names = getAttrString(attr); - if (port_names) { - group->setRelatedPortNames(parseNameList(port_names)); - group->setIsOneToOne(true); - } -} - -StringSeq * -LibertyReader::parseNameList(const char *name_list) -{ - StringSeq *names = new StringSeq; - // Parse space separated list of names. - TokenParser parser(name_list, " "); - while (parser.hasNext()) { - char *token = parser.next(); - // Skip extra spaces. - if (token[0] != '\0') { - const char *name = token; - names->push_back(stringCopy(name)); - } - } - return names; -} - -StdStringSeq -LibertyReader::parseTokenList(const char *token_str, - const char separator) -{ - StdStringSeq tokens; - // Parse space separated list of names. - char separators[2] = {separator, '\0'}; - TokenParser parser(token_str, separators); - while (parser.hasNext()) { - char *token = parser.next(); - // Skip extra spaces. - if (token[0] != '\0') { - tokens.push_back(token); - } - } - return tokens; -} - -void -LibertyReader::visitRelatedBusPins(LibertyAttr *attr) -{ - if (timing_) - visitRelatedBusPins(attr, timing_); - if (internal_power_) - visitRelatedBusPins(attr, internal_power_); -} - -void -LibertyReader::visitRelatedBusPins(LibertyAttr *attr, - RelatedPortGroup *group) -{ - const char *port_names = getAttrString(attr); - if (port_names) { - group->setRelatedPortNames(parseNameList(port_names)); - group->setIsOneToOne(false); - } -} - -void -LibertyReader::visitRelatedOutputPin(LibertyAttr *attr) -{ - if (timing_) { - const char *pin_name = getAttrString(attr); - if (pin_name) - timing_->setRelatedOutputPortName(pin_name); - } -} - -void -LibertyReader::visitTimingType(LibertyAttr *attr) -{ - if (timing_) { - const char *type_name = getAttrString(attr); - if (type_name) { - TimingType type = findTimingType(type_name); - if (type == TimingType::unknown) - libWarn(1244, attr, "unknown timing_type %s.", type_name); - else - timing_->attrs()->setTimingType(type); - } - } -} - -void -LibertyReader::visitTimingSense(LibertyAttr *attr) -{ - if (timing_) { - const char *sense_name = getAttrString(attr); - if (sense_name) { - if (stringEq(sense_name, "non_unate")) - timing_->attrs()->setTimingSense(TimingSense::non_unate); - else if (stringEq(sense_name, "positive_unate")) - timing_->attrs()->setTimingSense(TimingSense::positive_unate); - else if (stringEq(sense_name, "negative_unate")) - timing_->attrs()->setTimingSense(TimingSense::negative_unate); - else - libWarn(1245, attr, "unknown timing_sense %s.", sense_name); - } - } -} - -void -LibertyReader::visitSdfCondStart(LibertyAttr *attr) -{ - if (timing_) { - const char *cond = getAttrString(attr); - if (cond) - timing_->attrs()->setSdfCondStart(cond); - } -} - -void -LibertyReader::visitSdfCondEnd(LibertyAttr *attr) -{ - if (timing_) { - const char *cond = getAttrString(attr); - if (cond) - timing_->attrs()->setSdfCondEnd(cond); - } -} - -void -LibertyReader::visitMode(LibertyAttr *attr) -{ - if (timing_) { - if (attr->isComplexAttr()) { - LibertyAttrValueSeq *values = attr->values(); - if (values->size() == 2) { - LibertyAttrValue *value = (*values)[0]; - if (value->isString()) - timing_->attrs()->setModeName(value->stringValue()); - else - libWarn(1248, attr, "mode name is not a string."); - - value = (*values)[1]; - if (value->isString()) - timing_->attrs()->setModeValue(value->stringValue()); - else - libWarn(1246, attr, "mode value is not a string."); - } - else - libWarn(1249, attr, "mode requirees 2 values."); - } - else - libWarn(1250, attr, "mode missing mode name and value."); - } -} - -void -LibertyReader::visitIntrinsicRise(LibertyAttr *attr) -{ - visitIntrinsic(attr, RiseFall::rise()); -} - -void -LibertyReader::visitIntrinsicFall(LibertyAttr *attr) -{ - visitIntrinsic(attr, RiseFall::fall()); -} - -void -LibertyReader::visitIntrinsic(LibertyAttr *attr, - const RiseFall *rf) -{ - if (timing_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - timing_->setIntrinsic(rf, value * time_scale_); - } -} - -void -LibertyReader::visitRiseResistance(LibertyAttr *attr) -{ - visitRiseFallResistance(attr, RiseFall::rise()); -} - -void -LibertyReader::visitFallResistance(LibertyAttr *attr) -{ - visitRiseFallResistance(attr, RiseFall::fall()); -} - -void -LibertyReader::visitRiseFallResistance(LibertyAttr *attr, - const RiseFall *rf) -{ - if (timing_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - timing_->setResistance(rf, value * res_scale_); - } -} - -void -LibertyReader::beginCellRise(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::rise(), ScaleFactorType::cell); -} - -void -LibertyReader::beginCellFall(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::fall(), ScaleFactorType::cell); -} - -void -LibertyReader::endCellRiseFall(LibertyGroup *group) -{ - if (table_) { - if (GateTableModel::checkAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - timing_->setCell(rf_, table_model); - } - else - libWarn(1251, group, "unsupported model axis."); - } - endTableModel(); -} - -void -LibertyReader::beginRiseTransition(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::rise(), ScaleFactorType::transition); -} - -void -LibertyReader::beginFallTransition(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::fall(), ScaleFactorType::transition); -} - -void -LibertyReader::endRiseFallTransition(LibertyGroup *group) -{ - if (table_) { - if (GateTableModel::checkAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - timing_->setTransition(rf_, table_model); - } - else - libWarn(1252, group, "unsupported model axis."); - } - endTableModel(); -} - -void -LibertyReader::beginRiseConstraint(LibertyGroup *group) -{ - // Scale factor depends on timing_type, which may follow this stmt. - beginTimingTableModel(group, RiseFall::rise(), ScaleFactorType::unknown); -} - -void -LibertyReader::beginFallConstraint(LibertyGroup *group) -{ - // Scale factor depends on timing_type, which may follow this stmt. - beginTimingTableModel(group, RiseFall::fall(), ScaleFactorType::unknown); -} - -void -LibertyReader::endRiseFallConstraint(LibertyGroup *group) -{ - if (table_) { - if (CheckTableModel::checkAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - timing_->setConstraint(rf_, table_model); - } - else - libWarn(1253, group, "unsupported model axis."); - } - endTableModel(); -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginRiseTransitionDegredation(LibertyGroup *group) -{ - if (library_) - beginTableModel(group, TableTemplateType::delay, - RiseFall::rise(), time_scale_, - ScaleFactorType::transition); -} - -void -LibertyReader::beginFallTransitionDegredation(LibertyGroup *group) -{ - if (library_) - beginTableModel(group, TableTemplateType::delay, - RiseFall::fall(), time_scale_, - ScaleFactorType::transition); -} - -void -LibertyReader::endRiseFallTransitionDegredation(LibertyGroup *group) -{ - if (table_) { - if (LibertyLibrary::checkSlewDegradationAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - library_->setWireSlewDegradationTable(table_model, rf_); - } - else - libWarn(1254, group, "unsupported model axis."); - } - endTableModel(); -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginTimingTableModel(LibertyGroup *group, - const RiseFall *rf, - ScaleFactorType scale_factor_type) -{ - if (timing_) - beginTableModel(group, TableTemplateType::delay, rf, - time_scale_, scale_factor_type); - else - libWarn(1255, group, "%s group not in timing group.", group->type().c_str()); -} - -void -LibertyReader::beginTableModel(LibertyGroup *group, - TableTemplateType type, - const RiseFall *rf, - float scale, - ScaleFactorType scale_factor_type) -{ - beginTable(group, type, scale); - rf_ = rf; - scale_factor_type_ = scale_factor_type; - sigma_type_ = EarlyLateAll::all(); -} - -void -LibertyReader::endTableModel() -{ - endTable(); - scale_factor_type_ = ScaleFactorType::unknown; - sigma_type_ = nullptr; - index_ = 0; -} - -void -LibertyReader::beginTable(LibertyGroup *group, - TableTemplateType type, - float scale) -{ - const char *template_name = group->firstName(); - if (library_ && template_name) { - tbl_template_ = library_->findTableTemplate(template_name, type); - if (tbl_template_) { - axis_[0] = tbl_template_->axis1ptr(); - axis_[1] = tbl_template_->axis2ptr(); - axis_[2] = tbl_template_->axis3ptr(); - } - else { - libWarn(1256, group, "table template %s not found.", template_name); - axis_[0] = nullptr; - axis_[1] = nullptr; - axis_[2] = nullptr; - } - clearAxisValues(); - table_ = nullptr; - table_model_scale_ = scale; - } -} - -void -LibertyReader::endTable() -{ - table_ = nullptr; - tbl_template_ = nullptr; - axis_[0] = nullptr; - axis_[1] = nullptr; - axis_[2] = nullptr; -} - -void -LibertyReader::visitValue(LibertyAttr *attr) -{ - if (leakage_power_) { - float value; - bool valid; - getAttrFloat(attr, value, valid); - if (valid) - leakage_power_->setPower(value * power_scale_); - } -} - -void -LibertyReader::visitValues(LibertyAttr *attr) -{ - if (tbl_template_ - // Ignore values in ecsm_waveform groups. - && !in_ecsm_waveform_) - makeTable(attr, table_model_scale_); -} - -void -LibertyReader::makeTable(LibertyAttr *attr, - float scale) -{ - if (attr->isComplexAttr()) { - makeTableAxis(0, attr); - makeTableAxis(1, attr); - makeTableAxis(2, attr); - if (axis_[0] && axis_[1] && axis_[2]) { - // 3D table - // Column index1*size(index2) + index2 - // Row index3 - table_ = make_shared
(makeFloatTable(attr, - axis_[0]->size() * axis_[1]->size(), - axis_[2]->size(), scale), - axis_[0], axis_[1], axis_[2]); - } - else if (axis_[0] && axis_[1]) { - // 2D table - // Row variable1/axis[0] - // Column variable2/axis[1] - table_ = make_shared
(makeFloatTable(attr, axis_[0]->size(), - axis_[1]->size(), scale), - axis_[0], axis_[1]); - } - else if (axis_[0]) { - // 1D table - FloatTable table = makeFloatTable(attr, 1, axis_[0]->size(), scale); - table_ = make_shared
(std::move(table[0]), axis_[0]); - } - else if (axis_[0] == nullptr && axis_[1] == nullptr && axis_[2] == nullptr) { - // scalar - FloatTable table = makeFloatTable(attr, 1, 1, scale); - float value = table[0][0]; - table_ = make_shared
(value); - } - } - else - libWarn(1257, attr, "%s is missing values.", attr->name().c_str()); -} - FloatTable -LibertyReader::makeFloatTable(LibertyAttr *attr, +LibertyReader::makeFloatTable(const LibertyComplexAttr *values_attr, + const LibertyGroup *table_group, size_t rows, size_t cols, float scale) { FloatTable table; table.reserve(rows); - for (LibertyAttrValue *value : *attr->values()) { + for (const LibertyAttrValue *value : values_attr->values()) { FloatSeq row; + row.reserve(cols); if (value->isString()) - row = parseStringFloatList(value->stringValue(), scale, attr); + row = parseStringFloatList(value->stringValue(), scale, values_attr); else if (value->isFloat()) row.push_back(value->floatValue() * scale); else - libWarn(1258, attr, "%s is not a list of floats.", attr->name().c_str()); + libWarn(1258, values_attr, "%s is not a list of floats.", + values_attr->name().c_str()); if (row.size() != cols) { - libWarn(1259, attr, "table row has %zu columns but axis has %zu.", + libWarn(1259, values_attr, "%s row has %zu columns but axis has %zu.", + table_group->type().c_str(), row.size(), cols); for (size_t c = row.size(); c < cols; c++) @@ -4763,9 +3150,14 @@ LibertyReader::makeFloatTable(LibertyAttr *attr, table.push_back(std::move(row)); } if (table.size() != rows) { - libWarn(1260, attr, "table has %zu rows but axis has %zu.", - table.size(), - rows); + if (rows == 0) + libWarn(1260, values_attr, "%s missing axis values.", + table_group->type().c_str()); + else + libWarn(1261, values_attr, "%s has %zu rows but axis has %zu.", + table_group->type().c_str(), + table.size(), + rows); for (size_t r = table.size(); r < rows; r++) { FloatSeq row(cols, 0.0); table.push_back(std::move(row)); @@ -4774,254 +3166,55 @@ LibertyReader::makeFloatTable(LibertyAttr *attr, return table; } -void -LibertyReader::makeTableAxis(int index, - LibertyAttr *attr) -{ - if (axis_[index] && !axis_values_[index].empty()) { - TableAxisVariable var = axis_[index]->variable(); - const Units *units = library_->units(); - float scale = tableVariableUnit(var, units)->scale(); - FloatSeq values = std::move(axis_values_[index]); - scaleFloats(values, scale); - axis_[index] = make_shared(var, std::move(values)); - } - else if (axis_[index] && axis_[index]->values().empty()) { - libWarn(1344, attr, "Table axis and template missing values."); - axis_[index] = nullptr; - axis_values_[index].clear(); - } -} - -//////////////////////////////////////////////////////////////// - -// Define lut output variables as internal ports. -// I can't find any documentation for this group. -void -LibertyReader::beginLut(LibertyGroup *group) -{ - if (cell_) { - for (LibertyAttrValue *param : *group->params()) { - if (param->isString()) { - const std::string &names = param->stringValue(); - // Parse space separated list of related port names. - TokenParser parser(names.c_str(), " "); - while (parser.hasNext()) { - char *name = parser.next(); - if (name[0] != '\0') { - LibertyPort *port = makePort(cell_, name); - port->setDirection(PortDirection::internal()); - } - } - } - else - libWarn(1261, group, "lut output is not a string."); - } - } -} - -void -LibertyReader::endLut(LibertyGroup *) -{ -} - //////////////////////////////////////////////////////////////// void -LibertyReader::beginTestCell(LibertyGroup *group) -{ - if (cell_ && cell_->testCell()) - libWarn(1262, group, "cell %s test_cell redefinition.", cell_->name()); - else { - string name = cell_->name(); - name += "/test_cell"; - test_cell_ = new TestCell(cell_->libertyLibrary(), std::move(name), - cell_->filename()); - cell_->setTestCell(test_cell_); - - // Do a recursive parse of cell into the test_cell because it has - // pins, buses, bundles, and sequentials just like a cell. - save_cell_ = cell_; - save_cell_port_groups_ = std::move(cell_port_groups_); - save_statetable_ = statetable_; - statetable_ = nullptr; - save_cell_sequentials_ = std::move(cell_sequentials_); - save_cell_funcs_ = std::move(cell_funcs_); - cell_ = test_cell_; - } -} - -void -LibertyReader::endTestCell(LibertyGroup *) -{ - makeCellSequentials(); - makeStatetable(); - parseCellFuncs(); - finishPortGroups(); - - // Restore reader state to enclosing cell. - cell_port_groups_ = std::move(save_cell_port_groups_); - statetable_ = save_statetable_; - cell_sequentials_ = std::move(save_cell_sequentials_); - cell_funcs_= std::move(save_cell_funcs_); - cell_ = save_cell_; - - test_cell_ = nullptr; - save_statetable_ = nullptr; -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginModeDef(LibertyGroup *group) -{ - const char *name = group->firstName(); - if (name) - mode_def_ = cell_->makeModeDef(name); - else - libWarn(1263, group, "mode definition missing name."); -} - -void -LibertyReader::endModeDef(LibertyGroup *) -{ - mode_def_ = nullptr; -} - -void -LibertyReader::beginModeValue(LibertyGroup *group) -{ - if (mode_def_) { - const char *name = group->firstName(); - if (name) - mode_value_ = mode_def_->defineValue(name, nullptr, nullptr); - else - libWarn(1264, group, "mode value missing name."); - } -} - -void - LibertyReader::endModeValue(LibertyGroup *) -{ - mode_value_ = nullptr; -} - -void -LibertyReader::visitWhen(LibertyAttr *attr) -{ - if (tbl_template_) - libWarn(1265, attr, "when attribute inside table model."); - if (mode_value_) { - const char *func = getAttrString(attr); - if (func) { - ModeValueDef *mode_value = mode_value_; - makeLibertyFunc(func, - [mode_value] (FuncExpr *expr) {mode_value->setCond(expr);}, - false, "when", attr); - } - } - if (timing_ && !in_ccsn_) { - const char *func = getAttrString(attr); - if (func) { - TimingArcAttrs *attrs = timing_->attrs().get(); - makeLibertyFunc(func, - [attrs] (FuncExpr *expr) { attrs->setCond(expr);}, - false, "when", attr); - } - } - if (internal_power_) { - const char *func = getAttrString(attr); - if (func) { - InternalPowerGroup *internal_pwr = internal_power_; - makeLibertyFunc(func, - [internal_pwr] (FuncExpr *expr) { - internal_pwr->setWhen(std::shared_ptr(expr)); - }, - false, "when", attr); - } - } - if (leakage_power_) { - const char *func = getAttrString(attr); - if (func) { - LeakagePowerGroup *leakage_pwr = leakage_power_; - makeLibertyFunc(func, - [leakage_pwr] (FuncExpr *expr) { leakage_pwr->setWhen(expr);}, - false, "when", attr); - } - } -} - -void -LibertyReader::visitSdfCond(LibertyAttr *attr) -{ - if (mode_value_) { - const char *cond = getAttrString(attr); - if (cond) - mode_value_->setSdfCond(cond); - } - else if (timing_) { - const char *cond = getAttrString(attr); - if (cond) - timing_->attrs()->setSdfCond(cond); - } - // sdf_cond can also appear inside minimum_period groups. -} - -//////////////////////////////////////////////////////////////// - -const char * -LibertyReader::getAttrString(LibertyAttr *attr) -{ - if (attr->isSimpleAttr()) { - LibertyAttrValue *value = attr->firstValue(); - if (value->isString()) - return value->stringValue().c_str(); - else - libWarn(1266, attr, "%s attribute is not a string.", attr->name().c_str()); - } - else - libWarn(1267, attr, "%s is not a simple attribute.", attr->name().c_str()); - return nullptr; -} - -void -LibertyReader::getAttrInt(LibertyAttr *attr, +LibertyReader::getAttrInt(const LibertySimpleAttr *attr, // Return values. int &value, bool &exists) { value = 0; exists = false; - if (attr->isSimpleAttr()) { - LibertyAttrValue *attr_value = attr->firstValue(); - if (attr_value->isFloat()) { - float float_val = attr_value->floatValue(); - value = static_cast(float_val); - exists = true; - } - else - libWarn(1268, attr, "%s attribute is not an integer.",attr->name().c_str()); + const LibertyAttrValue &attr_value = attr->value(); + if (attr_value.isFloat()) { + float float_val = attr_value.floatValue(); + value = static_cast(float_val); + exists = true; } else - libWarn(1269, attr, "%s is not a simple attribute.", attr->name().c_str()); + libWarn(1268, attr, "%s attribute is not an integer.",attr->name().c_str()); } +// Get two floats in a complex attribute. +// attr(float1, float2); void -LibertyReader::getAttrFloat(LibertyAttr *attr, - // Return values. - float &value, - bool &valid) +LibertyReader::getAttrFloat2(const LibertyComplexAttr *attr, + // Return values. + float &value1, + float &value2, + bool &exists) { - valid = false; - if (attr->isSimpleAttr()) - getAttrFloat(attr, attr->firstValue(), value, valid); + exists = false; + const LibertyAttrValueSeq &values = attr->values(); + if (values.size() == 2) { + LibertyAttrValue *value = values[0]; + getAttrFloat(attr, value, value1, exists); + if (!exists) + libWarn(1272, attr, "%s is not a float.", attr->name().c_str()); + + value = values[1]; + getAttrFloat(attr, value, value2, exists); + if (!exists) + libWarn(1273, attr, "%s is not a float.", attr->name().c_str()); + } else - libWarn(1270, attr, "%s is not a simple attribute.", attr->name().c_str()); + libWarn(1274, attr, "%s requires 2 valules.", attr->name().c_str()); } void -LibertyReader::getAttrFloat(LibertyAttr *attr, - LibertyAttrValue *attr_value, +LibertyReader::getAttrFloat(const LibertyComplexAttr *attr, + const LibertyAttrValue *attr_value, // Return values. float &value, bool &valid) @@ -5032,17 +3225,13 @@ LibertyReader::getAttrFloat(LibertyAttr *attr, } else if (attr_value->isString()) { const std::string &str = attr_value->stringValue(); - // See if attribute string is a variable. variableValue(str.c_str(), value, valid); if (!valid) { - // For some reason area attributes for pads are quoted floats. - // Check that the string is a valid double. char *end; value = strtof(str.c_str(), &end); if ((*end && !isspace(*end)) - // strtof support INF as a valid float. || str == "inf") - libWarn(1271, attr, "%s value %s is not a float.", + libWarn(1183, attr->line(), "%s value %s is not a float.", attr->name().c_str(), str.c_str()); valid = true; @@ -5050,48 +3239,56 @@ LibertyReader::getAttrFloat(LibertyAttr *attr, } } -// Get two floats in a complex attribute. -// attr(float1, float2); -void -LibertyReader::getAttrFloat2(LibertyAttr *attr, - // Return values. - float &value1, - float &value2, - bool &exists) -{ - exists = false; - if (attr->isComplexAttr()) { - LibertyAttrValueSeq *values = attr->values(); - if (values->size() == 2) { - LibertyAttrValue *value = (*values)[0]; - getAttrFloat(attr, value, value1, exists); - if (!exists) - libWarn(1272, attr, "%s is not a float.", attr->name().c_str()); - - value = (*values)[1]; - getAttrFloat(attr, value, value2, exists); - if (!exists) - libWarn(1273, attr, "%s is not a float.", attr->name().c_str()); - } - else - libWarn(1274, attr, "%s requires 2 valules.", attr->name().c_str()); - } - else - libWarn(1345, attr, "%s requires 2 valules.", attr->name().c_str()); -} - // Parse string of comma separated floats. // Note that some brain damaged vendors (that used to "Think") are not // consistent about including the delimiters. FloatSeq LibertyReader::parseStringFloatList(const std::string &float_list, float scale, - LibertyAttr *attr) + const LibertySimpleAttr *attr) { FloatSeq values; + values.reserve(std::max(10, float_list.size() / 5)); const char *token = float_list.c_str(); while (*token != '\0') { // Some (brain dead) libraries enclose floats in brackets. + if (*token == '{') + token++; + char *end; + float value = strtof(token, &end) * scale; + if (end == token + || !(*end == '\0' + || isspace(*end) + || *end == ',' + || *end == '}')) { + std::string token_end = token; + if (end != token) { + token_end.clear(); + for (const char *t = token; t <= end; t++) + token_end += *t; + } + libWarn(1310, attr, "%s is not a float.", token_end.c_str()); + token += token_end.size(); + } + else { + values.push_back(value); + token = end; + } + while (*token == ',' || *token == ' ' || *token == '}') + token++; + } + return values; +} + +FloatSeq +LibertyReader::parseStringFloatList(const std::string &float_list, + float scale, + const LibertyComplexAttr *attr) +{ + FloatSeq values; + values.reserve(std::max(10, float_list.size() / 5)); + const char *token = float_list.c_str(); + while (*token != '\0') { if (*token == '{') token++; char *end; @@ -5121,108 +3318,93 @@ LibertyReader::parseStringFloatList(const std::string &float_list, } FloatSeq -LibertyReader::readFloatSeq(LibertyAttr *attr, +LibertyReader::readFloatSeq(const LibertyComplexAttr *attr, float scale) { FloatSeq values; - if (attr->isComplexAttr()) { - LibertyAttrValueSeq *attr_values = attr->values(); - if (attr_values->size() == 1) { - LibertyAttrValue *value = (*attr_values)[0]; - if (value->isString()) { - values = parseStringFloatList(value->stringValue(), scale, attr); - } - else if (value->isFloat()) { - values.push_back(value->floatValue()); - } - else - libWarn(1276, attr, "%s is missing values.", attr->name().c_str()); - } - else - libWarn(1277, attr, "%s has more than one string.", attr->name().c_str()); - } - else { - LibertyAttrValue *value = attr->firstValue(); + const LibertyAttrValueSeq &attr_values = attr->values(); + if (attr_values.size() == 1) { + LibertyAttrValue *value = attr_values[0]; if (value->isString()) { values = parseStringFloatList(value->stringValue(), scale, attr); } + else if (value->isFloat()) { + values.push_back(value->floatValue() * scale); + } else - libWarn(1278, attr, "%s is missing values.", attr->name().c_str()); + libWarn(1276, attr, "%s is missing values.", attr->name().c_str()); } + else if (attr_values.size() > 1) { + for (LibertyAttrValue *val : attr_values) { + if (val->isFloat()) + values.push_back(val->floatValue() * scale); + else if (val->isString()) { + FloatSeq parsed = parseStringFloatList(val->stringValue(), scale, attr); + values.insert(values.end(), parsed.begin(), parsed.end()); + } + } + } + else + libWarn(1277, attr, "%s has no values.", attr->name().c_str()); return values; } +//////////////////////////////////////////////////////////////// + void -LibertyReader::getAttrBool(LibertyAttr *attr, +LibertyReader::getAttrBool(const LibertySimpleAttr *attr, // Return values. bool &value, bool &exists) { exists = false; - if (attr->isSimpleAttr()) { - LibertyAttrValue *val = attr->firstValue(); - if (val->isString()) { - const std::string &str = val->stringValue(); - if (stringEqual(str.c_str(), "true")) { - value = true; - exists = true; - } - else if (stringEqual(str.c_str(), "false")) { - value = false; - exists = true; - } - else - libWarn(1279, attr, "%s attribute is not boolean.", attr->name().c_str()); + const LibertyAttrValue &val = attr->value(); + if (val.isString()) { + const std::string &str = val.stringValue(); + if (stringEqual(str.c_str(), "true")) { + value = true; + exists = true; + } + else if (stringEqual(str.c_str(), "false")) { + value = false; + exists = true; } else - libWarn(1280, attr, "%s attribute is not boolean.", attr->name().c_str()); + libWarn(1288, attr, "%s attribute is not boolean.", attr->name().c_str()); } else - libWarn(1281, attr, "%s is not a simple attribute.", attr->name().c_str()); + libWarn(1289, attr, "%s attribute is not boolean.", attr->name().c_str()); } // Read L/H/X string attribute values as bool. LogicValue -LibertyReader::getAttrLogicValue(LibertyAttr *attr) +LibertyReader::getAttrLogicValue(const LibertySimpleAttr *attr) { - const char *str = getAttrString(attr); + const std::string *str = attr->stringValue(); if (str) { - if (stringEq(str, "L")) + if (*str == "L") return LogicValue::zero; - else if (stringEq(str, "H")) + else if (*str == "H") return LogicValue::one; - else if (stringEq(str, "X")) + else if (*str == "X") return LogicValue::unknown; else libWarn(1282, attr, "attribute %s value %s not recognized.", - attr->name().c_str(), str); + attr->name().c_str(), str->c_str()); // fall thru } return LogicValue::unknown; } -FuncExpr * -LibertyReader::parseFunc(const char *func, - const char *attr_name, - int line) -{ - string error_msg; - stringPrint(error_msg, "%s, line %d %s", - filename_, - line, - attr_name); - return parseFuncExpr(func, cell_, error_msg.c_str(), report_); -} - const EarlyLateAll * -LibertyReader::getAttrEarlyLate(LibertyAttr *attr) +LibertyReader::getAttrEarlyLate(const LibertySimpleAttr *attr) { - const char *value = getAttrString(attr); - if (stringEq(value, "early")) + const std::string *value = attr->stringValue(); + if (*value == "early") return EarlyLateAll::early(); - else if (stringEq(value, "late")) + else if (*value == "late") return EarlyLateAll::late(); - else if (stringEq(value, "early_and_late")) + else if (*value == "early_and_late") return EarlyLateAll::all(); else { libWarn(1283, attr, "unknown early/late value."); @@ -5232,16 +3414,30 @@ LibertyReader::getAttrEarlyLate(LibertyAttr *attr) //////////////////////////////////////////////////////////////// +FuncExpr * +LibertyReader::parseFunc(const char *func, + const char *attr_name, + const LibertyCell *cell, + int line) +{ + std::string error_msg; + stringPrint(error_msg, "%s, line %d %s", + filename_, + line, + attr_name); + return parseFuncExpr(func, cell, error_msg.c_str(), report_); +} + +//////////////////////////////////////////////////////////////// + void LibertyReader::visitVariable(LibertyVariable *var) { - if (var_map_ == nullptr) - var_map_ = new LibertyVariableMap; - const string &var_name = var->variable(); + const std::string &var_name = var->variable(); float value; bool exists; findKeyValue(var_map_, var_name, value, exists); - (*var_map_)[var_name] = var->value(); + var_map_[var_name] = var->value(); } void @@ -5249,23 +3445,44 @@ LibertyReader::variableValue(const char *var, float &value, bool &exists) { - if (var_map_) - findKeyValue(var_map_, var, value, exists); - else - exists = false; + findKeyValue(var_map_, var, value, exists); } //////////////////////////////////////////////////////////////// void LibertyReader::libWarn(int id, - LibertyStmt *stmt, + const LibertyGroup *obj, const char *fmt, ...) { va_list args; va_start(args, fmt); - report_->vfileWarn(id, filename_, stmt->line(), fmt, args); + report_->vfileWarn(id, filename_, obj->line(), fmt, args); + va_end(args); +} + +void +LibertyReader::libWarn(int id, + const LibertySimpleAttr *obj, + const char *fmt, + ...) +{ + va_list args; + va_start(args, fmt); + report_->vfileWarn(id, filename_, obj->line(), fmt, args); + va_end(args); +} + +void +LibertyReader::libWarn(int id, + const LibertyComplexAttr *obj, + const char *fmt, + ...) +{ + va_list args; + va_start(args, fmt); + report_->vfileWarn(id, filename_, obj->line(), fmt, args); va_end(args); } @@ -5283,821 +3500,138 @@ LibertyReader::libWarn(int id, void LibertyReader::libError(int id, - LibertyStmt *stmt, + const LibertyGroup *obj, const char *fmt, ...) { va_list args; va_start(args, fmt); - report_->vfileError(id, filename_, stmt->line(), fmt, args); + report_->vfileError(id, filename_, obj->line(), fmt, args); + va_end(args); +} + +void +LibertyReader::libError(int id, + const LibertySimpleAttr *obj, + const char *fmt, + ...) +{ + va_list args; + va_start(args, fmt); + report_->vfileError(id, filename_, obj->line(), fmt, args); + va_end(args); +} + +void +LibertyReader::libError(int id, + const LibertyComplexAttr *obj, + const char *fmt, + ...) +{ + va_list args; + va_start(args, fmt); + report_->vfileError(id, filename_, obj->line(), fmt, args); va_end(args); } //////////////////////////////////////////////////////////////// void -LibertyReader::beginTableTemplatePower(LibertyGroup *group) +LibertyReader::readDefaultOcvDerateGroup(const LibertyGroup *library_group) { - beginTableTemplate(group, TableTemplateType::power); -} - -void -LibertyReader::beginLeakagePower(LibertyGroup *group) -{ - if (cell_) { - leakage_power_ = new LeakagePowerGroup(group->line()); - leakage_powers_.push_back(leakage_power_); - } -} - -void -LibertyReader::endLeakagePower(LibertyGroup *) -{ - leakage_power_ = nullptr; -} - -void -LibertyReader::beginInternalPower(LibertyGroup *group) -{ - if (port_group_) { - internal_power_ = new InternalPowerGroup(group->line()); - port_group_->addInternalPowerGroup(internal_power_); - } -} - -void -LibertyReader::endInternalPower(LibertyGroup *) -{ - internal_power_ = nullptr; -} - -void -LibertyReader::beginFallPower(LibertyGroup *group) -{ - if (internal_power_) - beginTableModel(group, TableTemplateType::power, - RiseFall::fall(), energy_scale_, - ScaleFactorType::internal_power); -} - -void -LibertyReader::beginRisePower(LibertyGroup *group) -{ - if (internal_power_) - beginTableModel(group, TableTemplateType::power, - RiseFall::rise(), energy_scale_, - ScaleFactorType::internal_power); -} - -void -LibertyReader::endRiseFallPower(LibertyGroup *) -{ - if (table_) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - internal_power_->setModel(rf_, std::make_shared(table_model)); - } - endTableModel(); -} - -void -LibertyReader::endPower(LibertyGroup *) -{ - if (table_) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - // Share the model for rise/fall. - auto power_model = std::make_shared(table_model); - internal_power_->setModel(RiseFall::rise(), power_model); - internal_power_->setModel(RiseFall::fall(), power_model); - } - endTableModel(); -} - -void -LibertyReader::visitRelatedGroundPin(LibertyAttr *attr) -{ - if (ports_) { - const char *related_ground_pin = getAttrString(attr); - for (LibertyPort *port : *ports_) - port->setRelatedGroundPin(related_ground_pin); - } -} - -void -LibertyReader::visitRelatedPowerPin(LibertyAttr *attr) -{ - if (ports_) { - const char *related_power_pin = getAttrString(attr); - for (LibertyPort *port : *ports_) - port->setRelatedPowerPin(related_power_pin); - } -} - -void -LibertyReader::visitRelatedPgPin(LibertyAttr *attr) -{ - if (internal_power_) - internal_power_->setRelatedPgPin(getAttrString(attr)); - else if (leakage_power_) - leakage_power_->setRelatedPgPin(getAttrString(attr)); -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginTableTemplateOcv(LibertyGroup *group) -{ - beginTableTemplate(group, TableTemplateType::ocv); -} - -void -LibertyReader::visitOcvArcDepth(LibertyAttr *attr) -{ - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) { - if (timing_) - timing_->attrs()->setOcvArcDepth(value); - else if (cell_) - cell_->setOcvArcDepth(value); + const std::string *derate_name = + library_group->findAttrString("default_ocv_derate_group"); + if (derate_name) { + OcvDerate *derate = library_->findOcvDerate(derate_name->c_str()); + if (derate) + library_->setDefaultOcvDerate(derate); else - library_->setOcvArcDepth(value); + libWarn(1284, library_group, "OCV derate group named %s not found.", + derate_name->c_str()); } } +// Read cell or library level ocv_derate groups. void -LibertyReader::visitDefaultOcvDerateGroup(LibertyAttr *attr) +LibertyReader::readOcvDerateFactors(LibertyCell *cell, + const LibertyGroup *parent_group) { - const char *derate_name = getAttrString(attr); - OcvDerate *derate = library_->findOcvDerate(derate_name); - if (derate) - library_->setDefaultOcvDerate(derate); - else - libWarn(1284, attr, "OCV derate group named %s not found.", derate_name); -} - -void -LibertyReader::visitOcvDerateGroup(LibertyAttr *attr) -{ - ocv_derate_name_ = stringCopy(getAttrString(attr)); -} - -void -LibertyReader::beginOcvDerate(LibertyGroup *group) -{ - const char *name = group->firstName(); - if (name) - ocv_derate_ = library_->makeOcvDerate(name); - else - libWarn(1285, group, "ocv_derate missing name."); -} - -void -LibertyReader::endOcvDerate(LibertyGroup *) -{ - ocv_derate_ = nullptr; -} - -void -LibertyReader::beginOcvDerateFactors(LibertyGroup *group) -{ - if (ocv_derate_) { - rf_type_ = RiseFallBoth::riseFall(); - derate_type_ = EarlyLateAll::all(); - path_type_ = PathType::clk_and_data; - beginTable(group, TableTemplateType::ocv, 1.0); - } -} - -void -LibertyReader::endOcvDerateFactors(LibertyGroup *) -{ - if (ocv_derate_) { - for (auto early_late : derate_type_->range()) { - for (auto rf : rf_type_->range()) { - if (path_type_ == PathType::clk_and_data) { - ocv_derate_->setDerateTable(rf, early_late, PathType::clk, table_); - ocv_derate_->setDerateTable(rf, early_late, PathType::data, table_); + for (const LibertyGroup *ocv_derate_group : + parent_group->findSubgroups("ocv_derate")) { + const char *name = ocv_derate_group->firstName(); + if (name) { + OcvDerate *ocv_derate = cell + ? cell->makeOcvDerate(name) + : library_->makeOcvDerate(name); + for (const LibertyGroup *factors_group : + ocv_derate_group->findSubgroups("ocv_derate_factors")) { + const RiseFallBoth *rf_type = RiseFallBoth::riseFall(); + const std::string *rf_attr = factors_group->findAttrString("rf_type"); + if (rf_attr) { + if (*rf_attr == "rise") + rf_type = RiseFallBoth::rise(); + else if (*rf_attr == "fall") + rf_type = RiseFallBoth::fall(); + else if (*rf_attr == "rise_and_fall") + rf_type = RiseFallBoth::riseFall(); + else + libError(1286, factors_group, "unknown rise/fall."); + } + + const EarlyLateAll *derate_type = EarlyLateAll::all(); + const std::string *derate_attr = factors_group->findAttrString("derate_type"); + if (derate_attr) { + if (*derate_attr == "early") + derate_type = EarlyLateAll::early(); + else if (*derate_attr == "late") + derate_type = EarlyLateAll::late(); + else if (*derate_attr == "early_and_late") + derate_type = EarlyLateAll::all(); + else { + libWarn(1309, factors_group, "unknown early/late value."); + } + } + + PathType path_type = PathType::clk_and_data; + const std::string *path_attr = factors_group->findAttrString("path_type"); + if (path_attr) { + if (*path_attr == "clock") + path_type = PathType::clk; + else if (*path_attr == "data") + path_type = PathType::data; + else if (*path_attr == "clock_and_data") + path_type = PathType::clk_and_data; + else + libWarn(1287, factors_group, "unknown derate type."); + } + + const char *template_name = factors_group->firstName(); + if (template_name) { + TableTemplate *tbl_template = + library_->findTableTemplate(template_name, TableTemplateType::ocv); + if (tbl_template) { + TablePtr table = readTableModel(factors_group, tbl_template, 1.0F); + if (table) { + for (const EarlyLate *early_late : derate_type->range()) { + for (const RiseFall *rf : rf_type->range()) { + if (path_type == PathType::clk_and_data) { + ocv_derate->setDerateTable(rf, early_late, PathType::clk, table); + ocv_derate->setDerateTable(rf, early_late, PathType::data, table); + } + else + ocv_derate->setDerateTable(rf, early_late, path_type, table); + } + } + } + } + else + libWarn(1308, factors_group, "table template %s not found.", template_name); } - else - ocv_derate_->setDerateTable(rf, early_late, path_type_, table_); } } - } - endTable(); -} - -void -LibertyReader::visitRfType(LibertyAttr *attr) -{ - const char *rf_name = getAttrString(attr); - if (stringEq(rf_name, "rise")) - rf_type_ = RiseFallBoth::rise(); - else if (stringEq(rf_name, "fall")) - rf_type_ = RiseFallBoth::fall(); - else if (stringEq(rf_name, "rise_and_fall")) - rf_type_ = RiseFallBoth::riseFall(); - else - libError(1286, attr, "unknown rise/fall."); -} - -void -LibertyReader::visitDerateType(LibertyAttr *attr) -{ - derate_type_ = getAttrEarlyLate(attr); -} - -void -LibertyReader::visitPathType(LibertyAttr *attr) -{ - const char *path_type = getAttrString(attr); - if (stringEq(path_type, "clock")) - path_type_ = PathType::clk; - else if (stringEq(path_type, "data")) - path_type_ = PathType::data; - else if (stringEq(path_type, "clock_and_data")) - path_type_ = PathType::clk_and_data; - else - libWarn(1287, attr, "unknown derate type."); -} - -//////////////////////////////////////////////////////////////// - -void -LibertyReader::beginOcvSigmaCellRise(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::rise(), ScaleFactorType::unknown); -} - -void -LibertyReader::beginOcvSigmaCellFall(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::fall(), ScaleFactorType::unknown); -} - -void -LibertyReader::endOcvSigmaCell(LibertyGroup *group) -{ - if (table_) { - if (GateTableModel::checkAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - if (sigma_type_ == EarlyLateAll::all()) { - timing_->setDelaySigma(rf_, EarlyLate::min(), table_model); - timing_->setDelaySigma(rf_, EarlyLate::max(), table_model); - } - else - timing_->setDelaySigma(rf_, sigma_type_->asMinMax(), table_model); - } else - libWarn(1288, group, "unsupported model axis."); + libWarn(1285, ocv_derate_group, "ocv_derate missing name."); } - endTableModel(); -} - -void -LibertyReader::beginOcvSigmaRiseTransition(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::rise(), ScaleFactorType::unknown); -} - -void -LibertyReader::beginOcvSigmaFallTransition(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::fall(), ScaleFactorType::unknown); -} - -void -LibertyReader::endOcvSigmaTransition(LibertyGroup *group) -{ - if (table_) { - if (GateTableModel::checkAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - if (sigma_type_ == EarlyLateAll::all()) { - timing_->setSlewSigma(rf_, EarlyLate::min(), table_model); - timing_->setSlewSigma(rf_, EarlyLate::max(), table_model); - } - else - timing_->setSlewSigma(rf_, sigma_type_->asMinMax(), table_model); - } - else - libWarn(1289, group, "unsupported model axis."); - } - endTableModel(); -} - -void -LibertyReader::beginOcvSigmaRiseConstraint(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::rise(), ScaleFactorType::unknown); -} - -void -LibertyReader::beginOcvSigmaFallConstraint(LibertyGroup *group) -{ - beginTimingTableModel(group, RiseFall::fall(), ScaleFactorType::unknown); -} - -void -LibertyReader::endOcvSigmaConstraint(LibertyGroup *group) -{ - if (table_) { - if (CheckTableModel::checkAxes(table_)) { - TableModel *table_model = new TableModel(table_, tbl_template_, - scale_factor_type_, rf_); - if (sigma_type_ == EarlyLateAll::all()) { - timing_->setConstraintSigma(rf_, EarlyLate::min(), table_model); - timing_->setConstraintSigma(rf_, EarlyLate::max(), table_model); - } - else - timing_->setConstraintSigma(rf_, sigma_type_->asMinMax(), table_model); - } - else - libWarn(1290, group, "unsupported model axis."); - } - endTableModel(); -} - -void -LibertyReader::visitSigmaType(LibertyAttr *attr) -{ - sigma_type_ = getAttrEarlyLate(attr); -} - -void -LibertyReader::visitCellLeakagePower(LibertyAttr *attr) -{ - if (cell_) { - float value; - bool exists; - getAttrFloat(attr, value, exists); - if (exists) - cell_->setLeakagePower(value * power_scale_); - } -} - -void -LibertyReader::beginPgPin(LibertyGroup *group) -{ - if (cell_) { - const char *name = group->firstName(); - pg_port_ = builder_.makePort(cell_, name); - } -} - -void -LibertyReader::endPgPin(LibertyGroup *) -{ - pg_port_ = nullptr; -} - -void -LibertyReader::visitPgType(LibertyAttr *attr) -{ - if (pg_port_) { - const char *type_name = getAttrString(attr); - PwrGndType type = findPwrGndType(type_name); - PortDirection *dir = PortDirection::unknown(); - switch (type) { - case PwrGndType::primary_ground: - case PwrGndType::backup_ground: - case PwrGndType::internal_ground: - dir = PortDirection::ground(); - break; - case PwrGndType::primary_power: - case PwrGndType::backup_power: - case PwrGndType::internal_power: - dir = PortDirection::power(); - break; - case PwrGndType::none: - libError(1291, attr, "unknown pg_type."); - break; - default: - break; - } - pg_port_->setPwrGndType(type); - pg_port_->setDirection(dir); - } -} - -void -LibertyReader::visitVoltageName(LibertyAttr *attr) -{ - if (pg_port_) { - const char *voltage_name = getAttrString(attr); - pg_port_->setVoltageName(voltage_name); - } -} - -// Contents Ignored. -void -LibertyReader::beginCcsn(LibertyGroup *) -{ - in_ccsn_ = true; -} - -void -LibertyReader::endCcsn(LibertyGroup *) -{ - in_ccsn_ = false; -} - -// Contents Ignored. -void -LibertyReader::beginEcsmWaveform(LibertyGroup *) -{ - in_ecsm_waveform_ = true; -} - -void -LibertyReader::endEcsmWaveform(LibertyGroup *) -{ - in_ecsm_waveform_ = false; -} - -//////////////////////////////////////////////////////////////// - -LibertyFunc::LibertyFunc(const char *expr, - LibertySetFunc set_func, - bool invert, - const char *attr_name, - int line) : - expr_(stringCopy(expr)), - set_func_(set_func), - invert_(invert), - attr_name_(stringCopy(attr_name)), - line_(line) -{ -} - -LibertyFunc::~LibertyFunc() -{ - stringDelete(expr_); - stringDelete(attr_name_); -} - -//////////////////////////////////////////////////////////////// - -PortGroup::PortGroup(LibertyPortSeq *ports, - int line) : - ports_(ports), - line_(line) -{ -} - -PortGroup::~PortGroup() -{ - deleteContents(timings_); - delete ports_; - deleteContents(internal_power_groups_); -} - -void -PortGroup::addTimingGroup(TimingGroup *timing) -{ - timings_.push_back(timing); -} - -void -PortGroup::addInternalPowerGroup(InternalPowerGroup *internal_power) -{ - internal_power_groups_.push_back(internal_power); -} - -//////////////////////////////////////////////////////////////// - -SequentialGroup::SequentialGroup(bool is_register, - bool is_bank, - LibertyPort *out_port, - LibertyPort *out_inv_port, - int size, - int line) : - is_register_(is_register), - is_bank_(is_bank), - out_port_(out_port), - out_inv_port_(out_inv_port), - size_(size), - clk_(nullptr), - data_(nullptr), - preset_(nullptr), - clear_(nullptr), - clr_preset_var1_(LogicValue::unknown), - clr_preset_var2_(LogicValue::unknown), - line_(line) -{ -} - -SequentialGroup::~SequentialGroup() -{ - if (clk_) - stringDelete(clk_); - if (data_) - stringDelete(data_); - if (preset_) - stringDelete(preset_); - if (clear_) - stringDelete(clear_); -} - -void -SequentialGroup::setClock(const char *clk) -{ - clk_ = clk; -} - -void -SequentialGroup::setData(const char *data) -{ - data_ = data; -} - -void -SequentialGroup::setClear(const char *clr) -{ - clear_ = clr; -} - -void -SequentialGroup::setPreset(const char *preset) -{ - preset_ = preset; -} - -void -SequentialGroup::setClrPresetVar1(LogicValue var) -{ - clr_preset_var1_ = var; -} - -void -SequentialGroup::setClrPresetVar2(LogicValue var) -{ - clr_preset_var2_ = var; -} - -//////////////////////////////////////////////////////////////// - -StatetableGroup::StatetableGroup(StdStringSeq &input_ports, - StdStringSeq &internal_ports, - int line) : - input_ports_(input_ports), - internal_ports_(internal_ports), - line_(line) -{ -} - -void -StatetableGroup::addRow(StateInputValues &input_values, - StateInternalValues ¤t_values, - StateInternalValues &next_values) -{ - table_.emplace_back(input_values, current_values, next_values); -} - -//////////////////////////////////////////////////////////////// - -RelatedPortGroup::RelatedPortGroup(int line) : - related_port_names_(nullptr), - line_(line) -{ -} - -RelatedPortGroup::~RelatedPortGroup() -{ - if (related_port_names_) { - deleteContents(related_port_names_); - delete related_port_names_; - } -} - -void -RelatedPortGroup::setRelatedPortNames(StringSeq *names) -{ - related_port_names_ = names; -} - -void -RelatedPortGroup::setIsOneToOne(bool one) -{ - is_one_to_one_ = one; -} - -//////////////////////////////////////////////////////////////// - -TimingGroup::TimingGroup(int line) : - RelatedPortGroup(line), - attrs_(make_shared()), - related_output_port_name_(nullptr), - receiver_model_(nullptr) -{ - for (auto rf_index : RiseFall::rangeIndex()) { - cell_[rf_index] = nullptr; - constraint_[rf_index] = nullptr; - transition_[rf_index] = nullptr; - intrinsic_[rf_index] = 0.0F; - intrinsic_exists_[rf_index] = false; - resistance_[rf_index] = 0.0F; - resistance_exists_[rf_index] = false; - output_waveforms_[rf_index] = nullptr; - - for (auto el_index : EarlyLate::rangeIndex()) { - delay_sigma_[rf_index][el_index] = nullptr; - slew_sigma_[rf_index][el_index] = nullptr; - constraint_sigma_[rf_index][el_index] = nullptr; - } - } -} - -TimingGroup::~TimingGroup() -{ - if (related_output_port_name_) - stringDelete(related_output_port_name_); -} - -void -TimingGroup::setRelatedOutputPortName(const char *name) -{ - related_output_port_name_ = stringCopy(name); -} - -void -TimingGroup::setIntrinsic(const RiseFall *rf, - float value) -{ - int rf_index = rf->index(); - intrinsic_[rf_index] = value; - intrinsic_exists_[rf_index] = true; -} - -void -TimingGroup::intrinsic(const RiseFall *rf, - // Return values. - float &value, - bool &exists) -{ - int rf_index = rf->index(); - value = intrinsic_[rf_index]; - exists = intrinsic_exists_[rf_index]; -} - -void -TimingGroup::setResistance(const RiseFall *rf, - float value) -{ - int rf_index = rf->index(); - resistance_[rf_index] = value; - resistance_exists_[rf_index] = true; -} - -void -TimingGroup::resistance(const RiseFall *rf, - // Return values. - float &value, - bool &exists) -{ - int rf_index = rf->index(); - value = resistance_[rf_index]; - exists = resistance_exists_[rf_index]; -} - -TableModel * -TimingGroup::cell(const RiseFall *rf) -{ - return cell_[rf->index()]; -} - -void -TimingGroup::setCell(const RiseFall *rf, - TableModel *model) -{ - cell_[rf->index()] = model; -} - -TableModel * -TimingGroup::constraint(const RiseFall *rf) -{ - return constraint_[rf->index()]; -} - -void -TimingGroup::setConstraint(const RiseFall *rf, - TableModel *model) -{ - constraint_[rf->index()] = model; -} - -TableModel * -TimingGroup::transition(const RiseFall *rf) -{ - return transition_[rf->index()]; -} - -void -TimingGroup::setTransition(const RiseFall *rf, - TableModel *model) -{ - transition_[rf->index()] = model; -} - -void -TimingGroup::setDelaySigma(const RiseFall *rf, - const EarlyLate *early_late, - TableModel *model) -{ - delay_sigma_[rf->index()][early_late->index()] = model; -} - -void -TimingGroup::setSlewSigma(const RiseFall *rf, - const EarlyLate *early_late, - TableModel *model) -{ - slew_sigma_[rf->index()][early_late->index()] = model; -} - -void -TimingGroup::setConstraintSigma(const RiseFall *rf, - const EarlyLate *early_late, - TableModel *model) -{ - constraint_sigma_[rf->index()][early_late->index()] = model; -} - -void -TimingGroup::setReceiverModel(ReceiverModelPtr receiver_model) -{ - receiver_model_ = receiver_model; -} - -OutputWaveforms * -TimingGroup::outputWaveforms(const RiseFall *rf) -{ - return output_waveforms_[rf->index()]; -} - -void -TimingGroup::setOutputWaveforms(const RiseFall *rf, - OutputWaveforms *output_waveforms) -{ - output_waveforms_[rf->index()] = output_waveforms; -} - -//////////////////////////////////////////////////////////////// - -InternalPowerGroup::InternalPowerGroup(int line) : - RelatedPortGroup(line), - when_(), - models_{} -{ -} - -void -InternalPowerGroup::setWhen(std::shared_ptr when) -{ - when_ = std::move(when); -} - -void -InternalPowerGroup::setModel(const RiseFall *rf, - std::shared_ptr model) -{ - models_[rf->index()] = std::move(model); -} - -void -InternalPowerGroup::setRelatedPgPin(std::string related_pg_pin) -{ - related_pg_pin_ = std::move(related_pg_pin); -} - -//////////////////////////////////////////////////////////////// - -LeakagePowerGroup::LeakagePowerGroup(int line) : - when_(nullptr), - power_(0.0), - line_(line) -{ -} - -void -LeakagePowerGroup::setRelatedPgPin(std::string pin_name) -{ - related_pg_pin_ = std::move(pin_name); -} - -void -LeakagePowerGroup::setWhen(FuncExpr *when) -{ - when_ = when; -} - -void -LeakagePowerGroup::setPower(float power) -{ - power_ = power; } //////////////////////////////////////////////////////////////// @@ -6121,7 +3655,7 @@ PortNameBitIterator::PortNameBitIterator(LibertyCell *cell, void PortNameBitIterator::init(const char *port_name) { - LibertyPort *port = visitor_->findPort(port_name); + LibertyPort *port = visitor_->findPort(cell_, port_name); if (port) { if (port->isBus()) bit_iterator_ = new LibertyPortMemberIterator(port); @@ -6133,13 +3667,13 @@ PortNameBitIterator::init(const char *port_name) // Check for bus range. LibertyLibrary *library = visitor_->library(); bool is_bus, is_range, subscript_wild; - string bus_name; + std::string bus_name; int from, to; parseBusName(port_name, library->busBrktLeft(), library->busBrktRight(), '\\', is_bus, is_range, bus_name, from, to, subscript_wild); if (is_range) { - port = visitor_->findPort(port_name); + port = visitor_->findPort(cell_, port_name); if (port) { if (port->isBus()) { if (port->busIndexInRange(from) @@ -6224,13 +3758,9 @@ PortNameBitIterator::findRangeBusNameNext() ? range_bit_ >= range_to_ : range_bit_ <= range_to_) { LibertyLibrary *library = visitor_->library(); - string bus_bit_name; - stringPrint(bus_bit_name, "%s%c%d%c", - range_bus_name_.c_str(), - library->busBrktLeft(), - range_bit_, - library->busBrktRight()); - range_name_next_ = visitor_->findPort(bus_bit_name.c_str()); + std::string bus_bit_name = range_bus_name_ + library->busBrktLeft() + + std::to_string(range_bit_) + library->busBrktRight(); + range_name_next_ = visitor_->findPort(cell_, bus_bit_name.c_str()); if (range_name_next_) { if (range_from_ > range_to_) range_bit_--; @@ -6257,17 +3787,10 @@ OutputWaveform::OutputWaveform(float slew, { } -OutputWaveform::~OutputWaveform() -{ - delete currents_; -} - Table * -OutputWaveform::stealCurrents() +OutputWaveform::releaseCurrents() { - Table *currents = currents_; - currents_ = nullptr; - return currents; + return currents_.release(); } } // namespace diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index b4a8e604..91fdf260 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -26,6 +26,7 @@ #include #include +#include #include #include @@ -47,33 +48,17 @@ namespace sta { class LibertyBuilder; class LibertyReader; -class LibertyFunc; -class PortGroup; -class SequentialGroup; -class StatetableGroup; -class RelatedPortGroup; -class TimingGroup; -class InternalPowerGroup; -class LeakagePowerGroup; class PortNameBitIterator; class TimingArcBuilder; -class LibertyAttr; class OutputWaveform; -using LibraryAttrVisitor = void (LibertyReader::*)(LibertyAttr *attr); -using LibraryGroupVisitor = void (LibertyReader::*)(LibertyGroup *group); -using LibraryAttrMap = std::unordered_map; -using LibraryGroupMap = std::unordered_map; -using PortGroupSeq = std::vector; -using SequentialGroupSeq = std::vector; -using LibertyFuncSeq = std::vector; -using TimingGroupSeq = std::vector; -using InternalPowerGroupSeq = std::vector; -using LeakagePowerGroupSeq = std::vector; -using LibertyPortBoolSetter = void (LibertyPort::*)(bool value); -using OutputWaveformSeq = std::vector; +using LibraryGroupVisitor = void (LibertyReader::*)(const LibertyGroup *group, + LibertyGroup *parent_group); +using LibraryGroupVisitorMap = std::unordered_map; using StdStringSeq = std::vector; -using LibertySetFunc = std::function; +using LibertyPortGroupMap = std::map; +using OutputWaveformSeq = std::vector; class LibertyReader : public LibertyGroupVisitor { @@ -81,428 +66,124 @@ public: LibertyReader(const char *filename, bool infer_latches, Network *network); - virtual ~LibertyReader(); virtual LibertyLibrary *readLibertyFile(const char *filename); LibertyLibrary *library() { return library_; } const LibertyLibrary *library() const { return library_; } - virtual void init(const char *filename, - bool infer_latches, - Network *network); - virtual bool save(LibertyGroup *) { return false; } - virtual bool save(LibertyAttr *) { return false; } - virtual bool save(LibertyVariable *) { return false; } + virtual void beginLibrary(const LibertyGroup *group, + LibertyGroup *library_group); + virtual void endLibrary(const LibertyGroup *group, + LibertyGroup *null_group); + virtual void visitAttr(const LibertySimpleAttr *attr); + virtual void visitAttr(const LibertyComplexAttr *attr); + virtual void visitVariable(LibertyVariable *var); + // Extension points for custom attributes (e.g. LibertyExt). + virtual void visitAttr1(const LibertySimpleAttr *) {} + virtual void visitAttr2(const LibertySimpleAttr *) {} - virtual void beginLibrary(LibertyGroup *group); - virtual void endLibrary(LibertyGroup *group); - virtual void endLibraryAttrs(LibertyGroup *group); - virtual void visitAttr(LibertyAttr *attr); - virtual void visitTimeUnit(LibertyAttr *attr); - virtual void visitCapacitiveLoadUnit(LibertyAttr *attr); - virtual void visitResistanceUnit(LibertyAttr *attr); - virtual void visitPullingResistanceUnit(LibertyAttr *attr); - virtual void visitVoltageUnit(LibertyAttr *attr); - virtual void visitCurrentUnit(LibertyAttr *attr); - virtual void visitPowerUnit(LibertyAttr *attr); - virtual void visitDistanceUnit(LibertyAttr *attr); - virtual void parseUnits(LibertyAttr *attr, - const char *suffix, - float &scale_var, - Unit *unit_suffix); - virtual void visitDelayModel(LibertyAttr *attr); - virtual void visitVoltageMap(LibertyAttr *attr); - virtual void visitBusStyle(LibertyAttr *attr); - virtual void visitNomTemp(LibertyAttr *attr); - virtual void visitNomVolt(LibertyAttr *attr); - virtual void visitNomProc(LibertyAttr *attr); - virtual void visitDefaultInoutPinCap(LibertyAttr *attr); - virtual void visitDefaultInputPinCap(LibertyAttr *attr); - virtual void visitDefaultOutputPinCap(LibertyAttr *attr); - virtual void visitDefaultMaxTransition(LibertyAttr *attr); - virtual void visitDefaultMaxFanout(LibertyAttr *attr); - virtual void visitDefaultIntrinsicRise(LibertyAttr *attr); - virtual void visitDefaultIntrinsicFall(LibertyAttr *attr); - virtual void visitDefaultIntrinsic(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitDefaultInoutPinRiseRes(LibertyAttr *attr); - virtual void visitDefaultInoutPinFallRes(LibertyAttr *attr); - virtual void visitDefaultInoutPinRes(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitDefaultOutputPinRiseRes(LibertyAttr *attr); - virtual void visitDefaultOutputPinFallRes(LibertyAttr *attr); - virtual void visitDefaultOutputPinRes(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitDefaultFanoutLoad(LibertyAttr *attr); - virtual void visitDefaultWireLoad(LibertyAttr *attr); - virtual void visitDefaultWireLoadMode(LibertyAttr *attr); - virtual void visitDefaultWireLoadSelection(LibertyAttr *attr); - virtual void visitDefaultOperatingConditions(LibertyAttr *attr); - virtual void visitInputThresholdPctFall(LibertyAttr *attr); - virtual void visitInputThresholdPctRise(LibertyAttr *attr); - virtual void visitInputThresholdPct(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitOutputThresholdPctFall(LibertyAttr *attr); - virtual void visitOutputThresholdPctRise(LibertyAttr *attr); - virtual void visitOutputThresholdPct(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitSlewLowerThresholdPctFall(LibertyAttr *attr); - virtual void visitSlewLowerThresholdPctRise(LibertyAttr *attr); - virtual void visitSlewLowerThresholdPct(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitSlewUpperThresholdPctFall(LibertyAttr *attr); - virtual void visitSlewUpperThresholdPctRise(LibertyAttr *attr); - virtual void visitSlewUpperThresholdPct(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitSlewDerateFromLibrary(LibertyAttr *attr); + void endCell(const LibertyGroup *group, + LibertyGroup *library_group); + void endScaledCell(const LibertyGroup *group, + LibertyGroup *library_group); + void checkScaledCell(LibertyCell *scaled_cell, + LibertyCell *owner, + const LibertyGroup *scaled_cell_group, + const char *op_cond_name); - virtual void beginTechnology(LibertyGroup *group); - virtual void endTechnology(LibertyGroup *group); - virtual void beginTableTemplateDelay(LibertyGroup *group); - virtual void beginTableTemplateOutputCurrent(LibertyGroup *group); - virtual void beginTableTemplate(LibertyGroup *group, - TableTemplateType type); - virtual void endTableTemplate(LibertyGroup *group); - virtual void visitVariable1(LibertyAttr *attr); - virtual void visitVariable2(LibertyAttr *attr); - virtual void visitVariable3(LibertyAttr *attr); - virtual void visitIndex1(LibertyAttr *attr); - virtual void visitIndex2(LibertyAttr *attr); - virtual void visitIndex3(LibertyAttr *attr); + void setPortCapDefault(LibertyPort *port); + void checkLatchEnableSense(FuncExpr *enable_func, + int line); + FloatTable makeFloatTable(const LibertyComplexAttr *attr, + const LibertyGroup *table_group, + size_t rows, + size_t cols, + float scale); - virtual void beginType(LibertyGroup *group); - virtual void endType(LibertyGroup *group); - virtual void visitBitFrom(LibertyAttr *attr); - virtual void visitBitTo(LibertyAttr *attr); - - virtual void beginCell(LibertyGroup *group); - virtual void endCell(LibertyGroup *group); - virtual void beginScaledCell(LibertyGroup *group); - virtual void endScaledCell(LibertyGroup *group); - virtual void checkScaledCell(LibertyGroup *group); - virtual void finishPortGroups(); - virtual void checkPort(LibertyPort *port, - int line); - virtual void makeTimingArcs(PortGroup *port_group); - virtual void makeInternalPowers(PortGroup *port_group); - virtual void makeCellSequentials(); - virtual void makeCellSequential(SequentialGroup *seq); - virtual void makeStatetable(); - virtual void makeLeakagePowers(); - virtual void parseCellFuncs(); - virtual void makeLibertyFunc(const char *expr, - LibertySetFunc set_func, - bool invert, - const char *attr_name, - LibertyStmt *stmt); - virtual void makeTimingArcs(LibertyPort *to_port, - TimingGroup *timing); - virtual void makeTimingArcs(const char *from_port_name, - PortNameBitIterator &from_port_iter, - LibertyPort *to_port, - LibertyPort *related_out_port, - TimingGroup *timing); - virtual void makeTimingArcs(LibertyPort *to_port, - LibertyPort *related_out_port, - TimingGroup *timing); - - virtual void visitClockGatingIntegratedCell(LibertyAttr *attr); - virtual void visitArea(LibertyAttr *attr); - virtual void visitDontUse(LibertyAttr *attr); - virtual void visitIsMacro(LibertyAttr *attr); - virtual void visitIsMemory(LibertyAttr *attr); - virtual void visitIsPadCell(LibertyAttr *attr); - virtual void visitIsPad(LibertyAttr *attr); - virtual void visitIsClockCell(LibertyAttr *attr); - virtual void visitIsLevelShifter(LibertyAttr *attr); - virtual void visitLevelShifterType(LibertyAttr *attr); - virtual void visitIsIsolationCell(LibertyAttr *attr); - virtual void visitAlwaysOn(LibertyAttr *attr); - virtual void visitSwitchCellType(LibertyAttr *attr); - virtual void visitInterfaceTiming(LibertyAttr *attr); - virtual void visitScalingFactors(LibertyAttr *attr); - virtual void visitCellLeakagePower(LibertyAttr *attr); - virtual void visitCellFootprint(LibertyAttr *attr); - virtual void visitCellUserFunctionClass(LibertyAttr *attr); - - virtual void beginPin(LibertyGroup *group); - virtual void endPin(LibertyGroup *group); - virtual void beginBus(LibertyGroup *group); - virtual void endBus(LibertyGroup *group); - virtual void beginBundle(LibertyGroup *group); - virtual void endBundle(LibertyGroup *group); - virtual void beginBusOrBundle(LibertyGroup *group); - virtual void endBusOrBundle(); - virtual void endPorts(); - virtual void setPortCapDefault(LibertyPort *port); - virtual void visitMembers(LibertyAttr *attr); - virtual void visitDirection(LibertyAttr *attr); - virtual void visitFunction(LibertyAttr *attr); - virtual void visitThreeState(LibertyAttr *attr); - virtual void visitBusType(LibertyAttr *attr); - virtual void visitCapacitance(LibertyAttr *attr); - virtual void visitRiseCap(LibertyAttr *attr); - virtual void visitFallCap(LibertyAttr *attr); - virtual void visitRiseCapRange(LibertyAttr *attr); - virtual void visitFallCapRange(LibertyAttr *attr); - virtual void visitFanoutLoad(LibertyAttr *attr); - virtual void visitMaxFanout(LibertyAttr *attr); - virtual void visitMinFanout(LibertyAttr *attr); - virtual void visitFanout(LibertyAttr *attr, - const MinMax *min_max); - virtual void visitMaxTransition(LibertyAttr *attr); - virtual void visitMinTransition(LibertyAttr *attr); - virtual void visitMinMaxTransition(LibertyAttr *attr, - const MinMax *min_max); - virtual void visitMaxCapacitance(LibertyAttr *attr); - virtual void visitMinCapacitance(LibertyAttr *attr); - virtual void visitMinMaxCapacitance(LibertyAttr *attr, - const MinMax *min_max); - virtual void visitMinPeriod(LibertyAttr *attr); - virtual void visitMinPulseWidthLow(LibertyAttr *attr); - virtual void visitMinPulseWidthHigh(LibertyAttr *attr); - virtual void visitMinPulseWidth(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitPulseClock(LibertyAttr *attr); - virtual void visitClockGateClockPin(LibertyAttr *attr); - virtual void visitClockGateEnablePin(LibertyAttr *attr); - virtual void visitClockGateOutPin(LibertyAttr *attr); - void visitIsPllFeedbackPin(LibertyAttr *attr); - virtual void visitSignalType(LibertyAttr *attr); - const EarlyLateAll *getAttrEarlyLate(LibertyAttr *attr); - virtual void visitClock(LibertyAttr *attr); - virtual void visitIsolationCellDataPin(LibertyAttr *attr); - virtual void visitIsolationCellEnablePin(LibertyAttr *attr); - virtual void visitLevelShifterDataPin(LibertyAttr *attr); - virtual void visitSwitchPin(LibertyAttr *attr); - void visitPortBoolAttr(LibertyAttr *attr, - LibertyPortBoolSetter setter); - - virtual void beginScalingFactors(LibertyGroup *group); - virtual void endScalingFactors(LibertyGroup *group); - virtual void defineScalingFactorVisitors(); - virtual void visitScaleFactorSuffix(LibertyAttr *attr); - virtual void visitScaleFactorPrefix(LibertyAttr *attr); - virtual void visitScaleFactorHiLow(LibertyAttr *attr); - virtual void visitScaleFactor(LibertyAttr *attr); - - virtual void beginOpCond(LibertyGroup *group); - virtual void endOpCond(LibertyGroup *group); - virtual void visitProc(LibertyAttr *attr); - virtual void visitVolt(LibertyAttr *attr); - virtual void visitTemp(LibertyAttr *attr); - virtual void visitTreeType(LibertyAttr *attr); - - virtual void beginWireload(LibertyGroup *group); - virtual void endWireload(LibertyGroup *group); - virtual void visitResistance(LibertyAttr *attr); - virtual void visitSlope(LibertyAttr *attr); - virtual void visitFanoutLength(LibertyAttr *attr); - - virtual void beginWireloadSelection(LibertyGroup *group); - virtual void endWireloadSelection(LibertyGroup *group); - virtual void visitWireloadFromArea(LibertyAttr *attr); - - virtual void beginMemory(LibertyGroup *group); - virtual void endMemory(LibertyGroup *group); - - virtual void beginFF(LibertyGroup *group); - virtual void endFF(LibertyGroup *group); - virtual void beginFFBank(LibertyGroup *group); - virtual void endFFBank(LibertyGroup *group); - virtual void beginLatch(LibertyGroup *group); - virtual void endLatch(LibertyGroup *group); - virtual void beginLatchBank(LibertyGroup *group); - virtual void endLatchBank(LibertyGroup *group); - virtual void beginSequential(LibertyGroup *group, - bool is_register, - bool is_bank); - virtual void seqPortNames(LibertyGroup *group, - const char *&out_name, - const char *&out_inv_name, - bool &has_size, - int &size); - virtual void checkLatchEnableSense(FuncExpr *enable_func, - int line); - virtual void visitClockedOn(LibertyAttr *attr); - virtual void visitDataIn(LibertyAttr *attr); - virtual void visitClear(LibertyAttr *attr); - virtual void visitPreset(LibertyAttr *attr); - virtual void visitClrPresetVar1(LibertyAttr *attr); - virtual void visitClrPresetVar2(LibertyAttr *attr); - - virtual void beginStatetable(LibertyGroup *group); - virtual void endStatetable(LibertyGroup *group); - virtual void visitTable(LibertyAttr *attr); - - virtual void beginTiming(LibertyGroup *group); - virtual void endTiming(LibertyGroup *group); - virtual void visitRelatedPin(LibertyAttr *attr); - virtual void visitRelatedPin(LibertyAttr *attr, - RelatedPortGroup *group); - virtual void visitRelatedBusPins(LibertyAttr *attr); - virtual void visitRelatedBusPins(LibertyAttr *attr, - RelatedPortGroup *group); - virtual void visitRelatedOutputPin(LibertyAttr *attr); - virtual void visitTimingType(LibertyAttr *attr); - virtual void visitTimingSense(LibertyAttr *attr); - virtual void visitSdfCondStart(LibertyAttr *attr); - virtual void visitSdfCondEnd(LibertyAttr *attr); - virtual void visitMode(LibertyAttr *attr); - virtual void visitIntrinsicRise(LibertyAttr *attr); - virtual void visitIntrinsicFall(LibertyAttr *attr); - virtual void visitIntrinsic(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitRiseResistance(LibertyAttr *attr); - virtual void visitFallResistance(LibertyAttr *attr); - virtual void visitRiseFallResistance(LibertyAttr *attr, - const RiseFall *rf); - virtual void visitValue(LibertyAttr *attr); - virtual void visitValues(LibertyAttr *attr); - virtual void beginCellRise(LibertyGroup *group); - virtual void beginCellFall(LibertyGroup *group); - virtual void endCellRiseFall(LibertyGroup *group); - virtual void beginRiseTransition(LibertyGroup *group); - virtual void endRiseFallTransition(LibertyGroup *group); - virtual void beginFallTransition(LibertyGroup *group); - virtual void beginRiseConstraint(LibertyGroup *group); - virtual void endRiseFallConstraint(LibertyGroup *group); - virtual void beginFallConstraint(LibertyGroup *group); - - virtual void beginRiseTransitionDegredation(LibertyGroup *group); - virtual void beginFallTransitionDegredation(LibertyGroup *group); - virtual void endRiseFallTransitionDegredation(LibertyGroup *group); - - virtual void beginTableModel(LibertyGroup *group, - TableTemplateType type, - const RiseFall *rf, - float scale, - ScaleFactorType scale_factor_type); - virtual void endTableModel(); - virtual void beginTimingTableModel(LibertyGroup *group, - const RiseFall *rf, - ScaleFactorType scale_factor_type); - virtual void beginTable(LibertyGroup *group, - TableTemplateType type, - float scale); - virtual void endTable(); - virtual void makeTable(LibertyAttr *attr, - float scale); - virtual FloatTable makeFloatTable(LibertyAttr *attr, - size_t rows, - size_t cols, - float scale); - - virtual void beginLut(LibertyGroup *group); - virtual void endLut(LibertyGroup *group); - - virtual void beginTestCell(LibertyGroup *group); - virtual void endTestCell(LibertyGroup *group); - - virtual void beginModeDef(LibertyGroup *group); - virtual void endModeDef(LibertyGroup *group); - virtual void beginModeValue(LibertyGroup *group); - virtual void endModeValue(LibertyGroup *group); - virtual void visitWhen(LibertyAttr *attr); - virtual void visitSdfCond(LibertyAttr *attr); - - // Power attributes. - virtual void beginTableTemplatePower(LibertyGroup *group); - virtual void beginLeakagePower(LibertyGroup *group); - virtual void endLeakagePower(LibertyGroup *group); - virtual void beginInternalPower(LibertyGroup *group); - virtual void endInternalPower(LibertyGroup *group); - virtual void beginFallPower(LibertyGroup *group); - virtual void beginRisePower(LibertyGroup *group); - virtual void endRiseFallPower(LibertyGroup *group); - virtual void endPower(LibertyGroup *group); - virtual void visitRelatedGroundPin(LibertyAttr *attr); - virtual void visitRelatedPowerPin(LibertyAttr *attr); - virtual void visitRelatedPgPin(LibertyAttr *attr); - virtual void makeInternalPowers(LibertyPort *port, - InternalPowerGroup *power_group); - virtual void makeInternalPowers(LibertyPort *port, - const char *related_port_name, - PortNameBitIterator &related_port_iter, - LibertyPort *related_pg_pin, - InternalPowerGroup *power_group); - - // AOCV attributes. - virtual void beginTableTemplateOcv(LibertyGroup *group); - virtual void visitOcvArcDepth(LibertyAttr *attr); - virtual void visitDefaultOcvDerateGroup(LibertyAttr *attr); - virtual void visitOcvDerateGroup(LibertyAttr *attr); - virtual void beginOcvDerate(LibertyGroup *group); - virtual void endOcvDerate(LibertyGroup *group); - virtual void beginOcvDerateFactors(LibertyGroup *group); - virtual void endOcvDerateFactors(LibertyGroup *group); - virtual void visitRfType(LibertyAttr *attr); - virtual void visitDerateType(LibertyAttr *attr); - virtual void visitPathType(LibertyAttr *attr); - - // POCV attributes. - virtual void beginOcvSigmaCellRise(LibertyGroup *group); - virtual void beginOcvSigmaCellFall(LibertyGroup *group); - virtual void endOcvSigmaCell(LibertyGroup *group); - virtual void beginOcvSigmaRiseTransition(LibertyGroup *group); - virtual void beginOcvSigmaFallTransition(LibertyGroup *group); - virtual void endOcvSigmaTransition(LibertyGroup *group); - virtual void beginOcvSigmaRiseConstraint(LibertyGroup *group); - virtual void beginOcvSigmaFallConstraint(LibertyGroup *group); - virtual void endOcvSigmaConstraint(LibertyGroup *group); - virtual void visitSigmaType(LibertyAttr *attr); - - // PgPin group. - virtual void beginPgPin(LibertyGroup *group); - virtual void endPgPin(LibertyGroup *group); - virtual void visitPgType(LibertyAttr *attr); - virtual void visitVoltageName(LibertyAttr *attr); - - // ccs receiver capacitance - virtual void beginReceiverCapacitance(LibertyGroup *group); - virtual void endReceiverCapacitance(LibertyGroup *group); - - virtual void visitSegement(LibertyAttr *attr); - - virtual void beginReceiverCapacitance1Rise(LibertyGroup *group); - virtual void endReceiverCapacitanceRiseFall(LibertyGroup *group); - virtual void beginReceiverCapacitance1Fall(LibertyGroup *group); - virtual void beginReceiverCapacitance2Rise(LibertyGroup *group); - virtual void beginReceiverCapacitance2Fall(LibertyGroup *group); - void beginReceiverCapacitance(LibertyGroup *group, - int index, - const RiseFall *rf); - void endReceiverCapacitance(LibertyGroup *group, - int index, - const RiseFall *rf); - // ccs - void beginOutputCurrentRise(LibertyGroup *group); - void beginOutputCurrentFall(LibertyGroup *group); - void beginOutputCurrent(const RiseFall *rf, - LibertyGroup *group); - void endOutputCurrentRiseFall(LibertyGroup *group); - void beginVector(LibertyGroup *group); - void endVector(LibertyGroup *group); - void visitReferenceTime(LibertyAttr *attr); - - void beginNormalizedDriverWaveform(LibertyGroup *group); - void endNormalizedDriverWaveform(LibertyGroup *group); - void visitDriverWaveformName(LibertyAttr *attr); - - void visitDriverWaveformRise(LibertyAttr *attr); - void visitDriverWaveformFall(LibertyAttr *attr); - void visitDriverWaveformRiseFall(LibertyAttr *attr, - const RiseFall *rf); - - void beginCcsn(LibertyGroup *group); - void endCcsn(LibertyGroup *group); - void beginEcsmWaveform(LibertyGroup *group); - void endEcsmWaveform(LibertyGroup *group); LibertyPort *findPort(LibertyCell *cell, const char *port_name); - virtual void begin(LibertyGroup *group); - virtual void end(LibertyGroup *group); + StdStringSeq findAttributStrings(const LibertyGroup *group, + const char *name_attr); protected: + virtual void begin(const LibertyGroup *group, + LibertyGroup *library_group); + virtual void end(const LibertyGroup *group, + LibertyGroup *library_group); + + // Library gruops. + void makeLibrary(const LibertyGroup *libary_group); + void readLibraryAttributes(const LibertyGroup *library_group); + void readLibraryUnits(const LibertyGroup *library_group); + void readDelayModel(const LibertyGroup *library_group); + void readBusStyle(const LibertyGroup *library_group); + void readDefaultWireLoad(const LibertyGroup *library_group); + void readDefaultWireLoadMode(const LibertyGroup *library_group); + void readTechnology(const LibertyGroup *library_group); + void readDefaultWireLoadSelection(const LibertyGroup *library_group); + void readUnit(const char *unit_attr_name, + const char *unit_suffix, + float &scale_var, + Unit *unit, + const LibertyGroup *library_group); + void readBusTypes(LibertyCell *cell, + const LibertyGroup *type_group); + void readTableTemplates(const LibertyGroup *library_group); + void readTableTemplates(const LibertyGroup *library_group, + const char *group_name, + TableTemplateType type); + void readThresholds(const LibertyGroup *library_group); + TableAxisPtr makeTableTemplateAxis(const LibertyGroup *template_group, + int axis_index); + void readVoltateMaps(const LibertyGroup *library_group); + void readWireloads(const LibertyGroup *library_group); + void readWireloadSelection(const LibertyGroup *library_group); + void readOperatingConds(const LibertyGroup *library_group); + void readScaleFactors(const LibertyGroup *library_group); + void readScaleFactors(const LibertyGroup *scale_group, + ScaleFactors *scale_factors); + void readOcvDerateFactors(LibertyCell *cell, + const LibertyGroup *library_group); + void readDefaultOcvDerateGroup(const LibertyGroup *library_group); + void readNormalizedDriverWaveform(const LibertyGroup *library_group); + void readSlewDegradations(const LibertyGroup *library_group); + void readLibAttrFloat(const LibertyGroup *library_group, + const char *attr_name, + void (LibertyLibrary::*set_func)(float value), + float scale); + void readLibAttrFloat(const LibertyGroup *library_group, + const char *attr_name, + void (LibertyLibrary::*set_func)(const RiseFall *rf, + float value), + const RiseFall *rf, + float scale); + void readLibAttrFloatWarnZero(const LibertyGroup *library_group, + const char *attr_name, + void (LibertyLibrary::*set_func)(float value), + float scale); + + // Cell groups. + void readCell(LibertyCell *cell, + const LibertyGroup *cell_group); + void readScaledCell(const LibertyGroup *scaled_cell_group); + LibertyPortGroupMap makeCellPorts(LibertyCell *cell, + const LibertyGroup *cell_group); + void makePinPort(LibertyCell *cell, + const LibertyGroup *pin_group, + LibertyPortGroupMap &port_group_map); + void makeBusPort(LibertyCell *cell, + const LibertyGroup *bus_group, + LibertyPortGroupMap &port_group_map); + void makeBusPinPorts(LibertyCell *cell, + const LibertyGroup *bus_group, + LibertyPortGroupMap &port_group_map); + void makeBundlePort(LibertyCell *cell, + const LibertyGroup *bundle_group, + LibertyPortGroupMap &port_group_map); + void makeBundlePinPorts(LibertyCell *cell, + const LibertyGroup *bundle_group, + LibertyPortGroupMap &port_group_map); + void makePgPinPort(LibertyCell *cell, + const LibertyGroup *pg_pin_group); LibertyPort *makePort(LibertyCell *cell, const char *port_name); LibertyPort *makeBusPort(LibertyCell *cell, @@ -511,78 +192,270 @@ protected: int to_index, BusDcl *bus_dcl); - TimingModel *makeScalarCheckModel(float value, + void readPortAttributes(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readPortAttrString(const char *attr_name, + void (LibertyPort::*set_func)(const char *value), + const LibertyPortSeq &ports, + const LibertyGroup *group); + void readPortAttrFloat(const char *attr_name, + void (LibertyPort::*set_func)(float value), + const LibertyPortSeq &ports, + const LibertyGroup *group, + float scale); + void readPortAttrBool(const char *attr_name, + void (LibertyPort::*set_func)(bool value), + const LibertyPortSeq &ports, + const LibertyGroup *group); + void readDriverWaveform(const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readPortAttrFloatMinMax(const char *attr_name, + void (LibertyPort::*set_func)(float value, + const MinMax *min_max), + const LibertyPortSeq &ports, + const LibertyGroup *group, + const MinMax *min_max, + float scale); + void readPulseClock(const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readSignalType(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readMinPulseWidth(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readModeDefs(LibertyCell *cell, + const LibertyGroup *cell_group); + void makeTimingArcs(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group); + bool isGateTimingType(TimingType timing_type); + TableModel *readGateTableModel(const LibertyGroup *timing_group, + const char *table_group_name, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type); + TableModelsEarlyLate + readEarlyLateTableModels(const LibertyGroup *timing_group, + const char *table_group_name, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type); + TableModel *readCheckTableModel(const LibertyGroup *timing_group, + const char *table_group_name, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type); + ReceiverModelPtr readReceiverCapacitance(const LibertyGroup *timing_group, + const RiseFall *rf); + void readReceiverCapacitance(const LibertyGroup *timing_group, + const char *cap_group_name, + int index, + const RiseFall *rf, + ReceiverModelPtr &receiver_model); + OutputWaveforms *readOutputWaveforms(const LibertyGroup *timing_group, + const RiseFall *rf); + OutputWaveforms *makeOutputWaveforms(const LibertyGroup *current_group, + OutputWaveformSeq &output_currents, + const RiseFall *rf); + + TableModel *readTableModel(const LibertyGroup *table_group, + const RiseFall *rf, + TableTemplateType template_type, + float scale, + ScaleFactorType scale_factor_type); + TablePtr readTableModel(const LibertyGroup *table_group, + const TableTemplate *tbl_template, + float scale); + void makeTimingModels(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void makeLinearModels(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void makeTableModels(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + + TableAxisPtr makeTableAxis(const LibertyGroup *table_group, + const char *index_attr_name, + TableAxisPtr template_axis); + void readGroupAttrFloat(const char *attr_name, + const LibertyGroup *group, + const std::function &set_func, + float scale = 1.0F); + void readTimingArcAttrs(LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void readTimingSense(const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void readTimingType(const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void readTimingWhen(const LibertyCell *cell, + const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void readTimingMode(const LibertyGroup *timing_group, + TimingArcAttrsPtr timing_attrs); + void makePortFuncs(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group); + + void makeSequentials(LibertyCell *cell, + const LibertyGroup *cell_group); + void makeSequentials(LibertyCell *cell, + const LibertyGroup *cell_group, + bool is_register, + const char *seq_group_name, + const char *clk_attr_name, + const char *data_attr_name); + FuncExpr *makeSeqFunc(LibertyCell *cell, + const LibertyGroup *seq_group, + const char *attr_name, + int size); + void makeSeqPorts(LibertyCell *cell, + const LibertyGroup *seq_group, + // Return values. + LibertyPort *&out_port, + LibertyPort *&out_port_inv, + size_t &size); + void seqPortNames(const LibertyGroup *group, + const char *&out_name, + const char *&out_inv_name, + bool &has_size, + size_t &size); + TimingModel *makeScalarCheckModel(LibertyCell *cell, + float value, ScaleFactorType scale_factor_type, const RiseFall *rf); - void makeMinPulseWidthArcs(LibertyPort *port, - int line); - void setEnergyScale(); + void readPortDir(const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readCapacitance(const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void makeTimingArcs(LibertyCell *cell, + const std::string &from_port_name, + LibertyPort *to_port, + LibertyPort *related_out_port, + bool one_to_one, + TimingArcAttrsPtr timing_attrs, + int timing_line); + void makeTimingArcs(LibertyCell *cell, + LibertyPort *to_port, + LibertyPort *related_out_port, + TimingArcAttrsPtr timing_attrs, + int timing_line); + + void readInternalPowerGroups(LibertyCell *cell, + const LibertyPortSeq &ports, + const LibertyGroup *port_group); + void readLeagageGrouops(LibertyCell *cell, + const LibertyGroup *port_group); + + void readCellAttributes(LibertyCell *cell, + const LibertyGroup *cell_group); + void readScaleFactors(LibertyCell *cell, + const LibertyGroup *cell_group); + void readCellAttrString(const char *attr_name, + void (LibertyCell::*set_func)(const char *value), + LibertyCell *cell, + const LibertyGroup *group); + void readCellAttrFloat(const char *attr_name, + void (LibertyCell::*set_func)(float value), + LibertyCell *cell, + const LibertyGroup *group, + float scale); + void readCellAttrBool(const char *attr_name, + void (LibertyCell::*set_func)(bool value), + LibertyCell *cell, + const LibertyGroup *group); + void readLevelShifterType(LibertyCell *cell, + const LibertyGroup *cell_group); + void readSwitchCellType(LibertyCell *cell, + const LibertyGroup *cell_group); + void readCellOcvDerateGroup(LibertyCell *cell, + const LibertyGroup *cell_group); + void readStatetable(LibertyCell *cell, + const LibertyGroup *cell_group); + void readTestCell(LibertyCell *cell, + const LibertyGroup *cell_group); + + FuncExpr *readFuncExpr(LibertyCell *cell, + const LibertyGroup *group, + const char *attr_name); + LibertyPort *findLibertyPort(LibertyCell *cell, + const LibertyGroup *group, + const char *port_name_attr); + LibertyPortSeq findLibertyPorts(LibertyCell *cell, + const LibertyGroup *group, + const char *port_name_attr); + + float energyScale(); void defineVisitors(); + void defineGroupVisitor(const char *type, LibraryGroupVisitor begin_visitor, LibraryGroupVisitor end_visitor); - void defineAttrVisitor(const char *attr_name, - LibraryAttrVisitor visitor); - void parseNames(const char *name_str); - void clearAxisValues(); - void makeTableAxis(int index, - LibertyAttr *attr); - StringSeq *parseNameList(const char *name_list); - StdStringSeq parseTokenList(const char *token_str, - const char separator); - LibertyPort *findPort(const char *port_name); float defaultCap(LibertyPort *port); - virtual void visitVariable(LibertyVariable *var); void visitPorts(std::function func); StateInputValues parseStateInputValues(StdStringSeq &inputs, - LibertyAttr *attr); + const LibertySimpleAttr *attr); StateInternalValues parseStateInternalValues(StdStringSeq &states, - LibertyAttr *attr); + const LibertySimpleAttr *attr); - const char *getAttrString(LibertyAttr *attr); - void getAttrInt(LibertyAttr *attr, + void getAttrInt(const LibertySimpleAttr *attr, // Return values. int &value, bool &exists); - void getAttrFloat(LibertyAttr *attr, - // Return values. - float &value, - bool &valid); - void getAttrFloat(LibertyAttr *attr, - LibertyAttrValue *attr_value, - // Return values. - float &value, - bool &valid); - void getAttrFloat2(LibertyAttr *attr, + void getAttrFloat2(const LibertyComplexAttr *attr, // Return values. float &value1, float &value2, bool &exists); - FloatSeq parseStringFloatList(const std::string &float_list, - float scale, - LibertyAttr *attr); - LogicValue getAttrLogicValue(LibertyAttr *attr); - void getAttrBool(LibertyAttr *attr, + void getAttrFloat(const LibertyComplexAttr *attr, + const LibertyAttrValue *attr_value, + // Return values. + float &value, + bool &valid); + LogicValue getAttrLogicValue(const LibertySimpleAttr *attr); + void getAttrBool(const LibertySimpleAttr *attr, // Return values. bool &value, bool &exists); - void visitVariable(int index, - LibertyAttr *attr); - void visitIndex(int index, - LibertyAttr *attr); + const EarlyLateAll *getAttrEarlyLate(const LibertySimpleAttr *attr); + + FloatSeq parseStringFloatList(const std::string &float_list, + float scale, + const LibertySimpleAttr *attr); + FloatSeq parseStringFloatList(const std::string &float_list, + float scale, + const LibertyComplexAttr *attr); TableAxisPtr makeAxis(int index, - LibertyGroup *group); - FloatSeq readFloatSeq(LibertyAttr *attr, + const LibertyGroup *group); + FloatSeq readFloatSeq(const LibertyComplexAttr *attr, float scale); void variableValue(const char *var, float &value, bool &exists); FuncExpr *parseFunc(const char *func, const char *attr_name, + const LibertyCell *cell, int line); void libWarn(int id, - LibertyStmt *stmt, + const LibertyGroup *obj, + const char *fmt, + ...) + __attribute__((format (printf, 4, 5))); + void libWarn(int id, + const LibertySimpleAttr *obj, + const char *fmt, + ...) + __attribute__((format (printf, 4, 5))); + void libWarn(int id, + const LibertyComplexAttr *obj, const char *fmt, ...) __attribute__((format (printf, 4, 5))); @@ -592,7 +465,15 @@ protected: ...) __attribute__((format (printf, 4, 5))); void libError(int id, - LibertyStmt *stmt, + const LibertyGroup *obj, + const char *fmt, ...) + __attribute__((format (printf, 4, 5))); + void libError(int id, + const LibertySimpleAttr *obj, + const char *fmt, ...) + __attribute__((format (printf, 4, 5))); + void libError(int id, + const LibertyComplexAttr *obj, const char *fmt, ...) __attribute__((format (printf, 4, 5))); @@ -602,64 +483,12 @@ protected: Debug *debug_; Network *network_; LibertyBuilder builder_; - LibertyVariableMap *var_map_; + LibertyVariableMap var_map_; LibertyLibrary *library_; - LibraryGroupMap group_begin_map_; - LibraryGroupMap group_end_map_; - LibraryAttrMap attr_visitor_map_; - Wireload *wireload_; - WireloadSelection *wireload_selection_; - const char *default_wireload_; - const char *default_wireload_selection_; - ScaleFactors *scale_factors_; - ScaleFactors *save_scale_factors_; - bool have_input_threshold_[RiseFall::index_count]; - bool have_output_threshold_[RiseFall::index_count]; - bool have_slew_lower_threshold_[RiseFall::index_count]; - bool have_slew_upper_threshold_[RiseFall::index_count]; - TableTemplate *tbl_template_; - LibertyCell *cell_; - LibertyCell *scaled_cell_owner_; - const char *ocv_derate_name_; - PortGroupSeq cell_port_groups_; - OperatingConditions *op_cond_; - LibertyPortSeq *ports_; - PortGroup *port_group_; - LibertyPortSeq *saved_ports_; - PortGroup *saved_port_group_; - StringSeq bus_names_; - bool in_bus_; - bool in_bundle_; - bool in_ccsn_; - bool in_ecsm_waveform_; - TableAxisVariable axis_var_[3]; - FloatSeq axis_values_[3]; - int type_bit_from_; - bool type_bit_from_exists_; - int type_bit_to_; - bool type_bit_to_exists_; - SequentialGroup *sequential_; - SequentialGroupSeq cell_sequentials_; - StatetableGroup *statetable_; - TimingGroup *timing_; - InternalPowerGroup *internal_power_; - LeakagePowerGroup *leakage_power_; - LeakagePowerGroupSeq leakage_powers_; - const RiseFall *rf_; - int index_; - OcvDerate *ocv_derate_; - const RiseFallBoth *rf_type_; - const EarlyLateAll *derate_type_; - const EarlyLateAll *sigma_type_; - PathType path_type_; - LibertyPort *pg_port_; - ScaleFactorType scale_factor_type_; - TableAxisPtr axis_[3]; - TablePtr table_; - float table_model_scale_; - ModeDef *mode_def_; - ModeValueDef *mode_value_; - LibertyFuncSeq cell_funcs_; + bool first_cell_; + LibraryGroupVisitorMap group_begin_map_; + LibraryGroupVisitorMap group_end_map_; + float time_scale_; float cap_scale_; float res_scale_; @@ -668,263 +497,11 @@ protected: float power_scale_; float energy_scale_; float distance_scale_; - const char *default_operating_condition_; - ReceiverModelPtr receiver_model_; - OutputWaveformSeq output_currents_; - OutputWaveforms *output_waveforms_; - float reference_time_; - bool reference_time_exists_; - std::string driver_waveform_name_; - - TestCell *test_cell_; - // Saved state while parsing test_cell. - LibertyCell *save_cell_; - PortGroupSeq save_cell_port_groups_; - StatetableGroup *save_statetable_; - SequentialGroupSeq save_cell_sequentials_; - LibertyFuncSeq save_cell_funcs_; static constexpr char escape_ = '\\'; private: friend class PortNameBitIterator; - friend class TimingGroup; -}; - -// Reference to a function that will be parsed at the end of the cell -// definition when all of the ports are defined. -class LibertyFunc -{ -public: - LibertyFunc(const char *expr, - LibertySetFunc set_func, - bool invert, - const char *attr_name, - int line); - ~LibertyFunc(); - const char *expr() const { return expr_; } - LibertySetFunc setFunc() const { return set_func_; } - bool invert() const { return invert_; } - const char *attrName() const { return attr_name_; } - int line() const { return line_; } - -protected: - const char *expr_; - LibertySetFunc set_func_; - bool invert_; - const char *attr_name_; - int line_; -}; - -// Port attributes that refer to other ports cannot be parsed -// until all of the ports are defined. This class saves them -// so they can be parsed at the end of the cell. -class PortGroup -{ -public: - PortGroup(LibertyPortSeq *ports, - int line); - ~PortGroup(); - LibertyPortSeq *ports() const { return ports_; } - TimingGroupSeq &timingGroups() { return timings_; } - void addTimingGroup(TimingGroup *timing); - InternalPowerGroupSeq &internalPowerGroups() { return internal_power_groups_; } - void addInternalPowerGroup(InternalPowerGroup *internal_power); - ReceiverModel *receiverModel() const { return receiver_model_; } - void setReceiverModel(ReceiverModelPtr receiver_model); - int line() const { return line_; } - -private: - LibertyPortSeq *ports_; - TimingGroupSeq timings_; - InternalPowerGroupSeq internal_power_groups_; - ReceiverModel *receiver_model_; - int line_; -}; - -// Liberty group with related_pins group attribute. -class RelatedPortGroup -{ -public: - RelatedPortGroup(int line); - virtual ~RelatedPortGroup(); - int line() const { return line_; } - StringSeq *relatedPortNames() const { return related_port_names_; } - void setRelatedPortNames(StringSeq *names); - bool isOneToOne() const { return is_one_to_one_; } - void setIsOneToOne(bool one); - -protected: - StringSeq *related_port_names_; - bool is_one_to_one_; - int line_; -}; - -class SequentialGroup -{ -public: - SequentialGroup(bool is_register, - bool is_bank, - LibertyPort *out_port, - LibertyPort *out_inv_port, - int size, - int line); - ~SequentialGroup(); - LibertyPort *outPort() const { return out_port_; } - LibertyPort *outInvPort() const { return out_inv_port_; } - int size() const { return size_; } - bool isRegister() const { return is_register_; } - bool isBank() const { return is_bank_; } - const char *clock() const { return clk_; } - void setClock(const char *clk); - const char *data() const { return data_; } - void setData(const char *data); - const char *clear() const { return clear_; } - void setClear(const char *clr); - const char *preset() const { return preset_; } - void setPreset(const char *preset); - LogicValue clrPresetVar1() const { return clr_preset_var1_; } - void setClrPresetVar1(LogicValue var); - LogicValue clrPresetVar2() const { return clr_preset_var2_; } - void setClrPresetVar2(LogicValue var); - int line() const { return line_; } - -protected: - bool is_register_; - bool is_bank_; - LibertyPort *out_port_; - LibertyPort *out_inv_port_; - int size_; - const char *clk_; - const char *data_; - const char *preset_; - const char *clear_; - LogicValue clr_preset_var1_; - LogicValue clr_preset_var2_; - int line_; -}; - -class StatetableGroup -{ -public: - StatetableGroup(StdStringSeq &input_ports, - StdStringSeq &internal_ports, - int line); - const StdStringSeq &inputPorts() const { return input_ports_; } - const StdStringSeq &internalPorts() const { return internal_ports_; } - void addRow(StateInputValues &input_values, - StateInternalValues ¤t_values, - StateInternalValues &next_values); - StatetableRows &table() { return table_; } - int line() const { return line_; } - -private: - StdStringSeq input_ports_; - StdStringSeq internal_ports_; - StatetableRows table_; - int line_; -}; - -class TimingGroup : public RelatedPortGroup -{ -public: - TimingGroup(int line); - virtual ~TimingGroup(); - TimingArcAttrsPtr attrs() { return attrs_; } - const char *relatedOutputPortName()const {return related_output_port_name_;} - void setRelatedOutputPortName(const char *name); - void intrinsic(const RiseFall *rf, - // Return values. - float &value, - bool &exists); - void setIntrinsic(const RiseFall *rf, - float value); - void resistance(const RiseFall *rf, - // Return values. - float &value, - bool &exists); - void setResistance(const RiseFall *rf, - float value); - TableModel *cell(const RiseFall *rf); - void setCell(const RiseFall *rf, - TableModel *model); - TableModel *constraint(const RiseFall *rf); - void setConstraint(const RiseFall *rf, - TableModel *model); - TableModel *transition(const RiseFall *rf); - void setTransition(const RiseFall *rf, - TableModel *model); - void makeTimingModels(LibertyCell *cell, - LibertyReader *visitor); - void setDelaySigma(const RiseFall *rf, - const EarlyLate *early_late, - TableModel *model); - void setSlewSigma(const RiseFall *rf, - const EarlyLate *early_late, - TableModel *model); - void setConstraintSigma(const RiseFall *rf, - const EarlyLate *early_late, - TableModel *model); - void setReceiverModel(ReceiverModelPtr receiver_model); - OutputWaveforms *outputWaveforms(const RiseFall *rf); - void setOutputWaveforms(const RiseFall *rf, - OutputWaveforms *output_current); - -protected: - void makeLinearModels(LibertyCell *cell); - void makeTableModels(LibertyCell *cell, - LibertyReader *reader); - - TimingArcAttrsPtr attrs_; - const char *related_output_port_name_; - float intrinsic_[RiseFall::index_count]; - bool intrinsic_exists_[RiseFall::index_count]; - float resistance_[RiseFall::index_count]; - bool resistance_exists_[RiseFall::index_count]; - TableModel *cell_[RiseFall::index_count]; - TableModel *constraint_[RiseFall::index_count]; - TableModel *constraint_sigma_[RiseFall::index_count][EarlyLate::index_count]; - TableModel *transition_[RiseFall::index_count]; - TableModel *delay_sigma_[RiseFall::index_count][EarlyLate::index_count]; - TableModel *slew_sigma_[RiseFall::index_count][EarlyLate::index_count]; - OutputWaveforms *output_waveforms_[RiseFall::index_count]; - ReceiverModelPtr receiver_model_; -}; - -class InternalPowerGroup : public RelatedPortGroup -{ -public: - InternalPowerGroup(int line); - const std::string &relatedPgPin() const { return related_pg_pin_; } - void setRelatedPgPin(std::string related_pg_pin); - const std::shared_ptr &when() const { return when_; } - void setWhen(std::shared_ptr when); - void setModel(const RiseFall *rf, - std::shared_ptr model); - InternalPowerModels &models() { return models_; } - -private: - std::string related_pg_pin_; - std::shared_ptr when_; - InternalPowerModels models_; -}; - -class LeakagePowerGroup -{ -public: - LeakagePowerGroup(int line); - const std::string &relatedPgPin() const { return related_pg_pin_; } - void setRelatedPgPin(std::string pin_name); - FuncExpr *when() const { return when_; } - void setWhen(FuncExpr *when); - float power() const { return power_; } - void setPower(float power); - -protected: - std::string related_pg_pin_; - FuncExpr *when_; - float power_; - int line_; }; // Named port iterator. Port name can be: @@ -968,17 +545,16 @@ public: float axis_value2, Table *currents, float reference_time); - ~OutputWaveform(); float slew() const { return slew_; } float cap() const { return cap_; } - Table *currents() const { return currents_; } - Table *stealCurrents(); + Table *releaseCurrents(); + float referenceTime() { return reference_time_; } private: float slew_; float cap_; - Table *currents_; + std::unique_ptr
currents_; float reference_time_; }; diff --git a/liberty/TableModel.cc b/liberty/TableModel.cc index 27512dc5..977c9b08 100644 --- a/liberty/TableModel.cc +++ b/liberty/TableModel.cc @@ -45,9 +45,7 @@ size_t findValueIndex(float value, const FloatSeq *values); static void -sigmaModelsMvOwner(TableModel *models[EarlyLate::index_count], - std::array, - EarlyLate::index_count> &out); +sigmaModelsDelete(TableModelsEarlyLate &models); static string reportPvt(const LibertyCell *cell, const Pvt *pvt, @@ -63,40 +61,50 @@ TimingModel::TimingModel(LibertyCell *cell) : GateTableModel::GateTableModel(LibertyCell *cell, TableModel *delay_model, - TableModel *delay_sigma_models[EarlyLate::index_count], + TableModelsEarlyLate delay_sigma_models, TableModel *slew_model, - TableModel *slew_sigma_models[EarlyLate::index_count], + TableModelsEarlyLate slew_sigma_models, ReceiverModelPtr receiver_model, OutputWaveforms *output_waveforms) : GateTimingModel(cell), delay_model_(delay_model), + delay_sigma_models_(std::move(delay_sigma_models)), slew_model_(slew_model), + slew_sigma_models_(std::move(slew_sigma_models)), receiver_model_(receiver_model), output_waveforms_(output_waveforms) { - sigmaModelsMvOwner(delay_sigma_models, delay_sigma_models_); - sigmaModelsMvOwner(slew_sigma_models, slew_sigma_models_); } -GateTableModel::~GateTableModel() = default; +GateTableModel::GateTableModel(LibertyCell *cell, + TableModel *delay_model, + TableModel *slew_model) : + GateTimingModel(cell), + delay_model_(delay_model), + delay_sigma_models_{}, + slew_model_(slew_model), + slew_sigma_models_{}, + receiver_model_(nullptr), + output_waveforms_(nullptr) +{ +} + +GateTableModel::~GateTableModel() +{ + sigmaModelsDelete(slew_sigma_models_); + sigmaModelsDelete(delay_sigma_models_); +} static void -sigmaModelsMvOwner(TableModel *models[EarlyLate::index_count], - std::array, - EarlyLate::index_count> &out) +sigmaModelsDelete(TableModelsEarlyLate &models) { - TableModel *early_model = models ? models[EarlyLate::earlyIndex()] : nullptr; - TableModel *late_model = models ? models[EarlyLate::lateIndex()] : nullptr; - if (early_model) { - out[EarlyLate::earlyIndex()].reset(early_model); - if (late_model && late_model != early_model) { - out[EarlyLate::lateIndex()].reset(late_model); - } else if (late_model == early_model) { - out[EarlyLate::lateIndex()] = - std::make_unique(*out[EarlyLate::earlyIndex()]); - } - } else if (late_model) { - out[EarlyLate::lateIndex()].reset(late_model); + TableModel *early_model = models[EarlyLate::earlyIndex()]; + TableModel *late_model = models[EarlyLate::lateIndex()]; + if (early_model == late_model) + delete early_model; + else { + delete early_model; + delete late_model; } } @@ -122,19 +130,19 @@ GateTableModel::gateDelay(const Pvt *pvt, float sigma_early = 0.0; float sigma_late = 0.0; if (pocv_enabled && delay_sigma_models_[EarlyLate::earlyIndex()]) - sigma_early = findValue(pvt, delay_sigma_models_[EarlyLate::earlyIndex()].get(), + sigma_early = findValue(pvt, delay_sigma_models_[EarlyLate::earlyIndex()], in_slew, load_cap, 0.0); if (pocv_enabled && delay_sigma_models_[EarlyLate::lateIndex()]) - sigma_late = findValue(pvt, delay_sigma_models_[EarlyLate::lateIndex()].get(), + sigma_late = findValue(pvt, delay_sigma_models_[EarlyLate::lateIndex()], in_slew, load_cap, 0.0); gate_delay = makeDelay(delay, sigma_early, sigma_late); float slew = findValue(pvt, slew_model_.get(), in_slew, load_cap, 0.0); if (pocv_enabled && slew_sigma_models_[EarlyLate::earlyIndex()]) - sigma_early = findValue(pvt, slew_sigma_models_[EarlyLate::earlyIndex()].get(), + sigma_early = findValue(pvt, slew_sigma_models_[EarlyLate::earlyIndex()], in_slew, load_cap, 0.0); if (pocv_enabled && slew_sigma_models_[EarlyLate::lateIndex()]) - sigma_late = findValue(pvt, slew_sigma_models_[EarlyLate::lateIndex()].get(), + sigma_late = findValue(pvt, slew_sigma_models_[EarlyLate::lateIndex()], in_slew, load_cap, 0.0); // Clip negative slews to zero. if (slew < 0.0) @@ -166,22 +174,22 @@ GateTableModel::reportGateDelay(const Pvt *pvt, load_cap, 0.0, digits); if (pocv_enabled && delay_sigma_models_[EarlyLate::earlyIndex()]) result += reportTableLookup("Delay sigma(early)", pvt, - delay_sigma_models_[EarlyLate::earlyIndex()].get(), + delay_sigma_models_[EarlyLate::earlyIndex()], in_slew, load_cap, 0.0, digits); if (pocv_enabled && delay_sigma_models_[EarlyLate::lateIndex()]) result += reportTableLookup("Delay sigma(late)", pvt, - delay_sigma_models_[EarlyLate::lateIndex()].get(), + delay_sigma_models_[EarlyLate::lateIndex()], in_slew, load_cap, 0.0, digits); result += '\n'; result += reportTableLookup("Slew", pvt, slew_model_.get(), in_slew, load_cap, 9.0, digits); if (pocv_enabled && slew_sigma_models_[EarlyLate::earlyIndex()]) result += reportTableLookup("Slew sigma(early)", pvt, - slew_sigma_models_[EarlyLate::earlyIndex()].get(), + slew_sigma_models_[EarlyLate::earlyIndex()], in_slew, load_cap, 0.0, digits); if (pocv_enabled && slew_sigma_models_[EarlyLate::lateIndex()]) result += reportTableLookup("Slew sigma(late)", pvt, - slew_sigma_models_[EarlyLate::lateIndex()].get(), + slew_sigma_models_[EarlyLate::lateIndex()], in_slew, load_cap, 0.0, digits); float drvr_slew = findValue(pvt, slew_model_.get(), in_slew, load_cap, 0.0); if (drvr_slew < 0.0) @@ -285,13 +293,13 @@ GateTableModel::driveResistance(const Pvt *pvt) const const TableModel * GateTableModel::delaySigmaModel(const EarlyLate *el) const { - return delay_sigma_models_[el->index()].get(); + return delay_sigma_models_[el->index()]; } const TableModel * GateTableModel::slewSigmaModel(const EarlyLate *el) const { - return slew_sigma_models_[el->index()].get(); + return slew_sigma_models_[el->index()]; } void @@ -354,7 +362,7 @@ GateTableModel::axisValue(const TableAxis *axis, } bool -GateTableModel::checkAxes(const TablePtr &table) +GateTableModel::checkAxes(const TableModel *table) { const TableAxis *axis1 = table->axis1(); const TableAxis *axis2 = table->axis2(); @@ -395,7 +403,7 @@ ReceiverModel::setCapacitanceModel(TableModel table_model, } bool -ReceiverModel::checkAxes(TablePtr table) +ReceiverModel::checkAxes(const TableModel *table) { const TableAxis *axis1 = table->axis1(); const TableAxis *axis2 = table->axis2(); @@ -415,14 +423,25 @@ ReceiverModel::checkAxes(TablePtr table) CheckTableModel::CheckTableModel(LibertyCell *cell, TableModel *model, - TableModel *sigma_models[EarlyLate::index_count]) : + TableModelsEarlyLate sigma_models) : CheckTimingModel(cell), - model_(model) + model_(model), + sigma_models_(std::move(sigma_models)) { - sigmaModelsMvOwner(sigma_models, sigma_models_); } -CheckTableModel::~CheckTableModel() = default; +CheckTableModel::CheckTableModel(LibertyCell *cell, + TableModel *model) : + CheckTimingModel(cell), + model_(model), + sigma_models_{} +{ +} + +CheckTableModel::~CheckTableModel() +{ + sigmaModelsDelete(sigma_models_); +} void CheckTableModel::setIsScaled(bool is_scaled) @@ -434,7 +453,7 @@ CheckTableModel::setIsScaled(bool is_scaled) const TableModel * CheckTableModel::sigmaModel(const EarlyLate *el) const { - return sigma_models_[el->index()].get(); + return sigma_models_[el->index()]; } ArcDelay @@ -449,10 +468,10 @@ CheckTableModel::checkDelay(const Pvt *pvt, float sigma_early = 0.0; float sigma_late = 0.0; if (pocv_enabled && sigma_models_[EarlyLate::earlyIndex()]) - sigma_early = findValue(pvt, sigma_models_[EarlyLate::earlyIndex()].get(), + sigma_early = findValue(pvt, sigma_models_[EarlyLate::earlyIndex()], from_slew, to_slew, related_out_cap); if (pocv_enabled && sigma_models_[EarlyLate::lateIndex()]) - sigma_late = findValue(pvt, sigma_models_[EarlyLate::lateIndex()].get(), + sigma_late = findValue(pvt, sigma_models_[EarlyLate::lateIndex()], from_slew, to_slew, related_out_cap); return makeDelay(mean, sigma_early, sigma_late); } @@ -491,12 +510,12 @@ CheckTableModel::reportCheckDelay(const Pvt *pvt, related_out_cap, digits); if (pocv_enabled && sigma_models_[EarlyLate::earlyIndex()]) result += reportTableDelay("Check sigma early", pvt, - sigma_models_[EarlyLate::earlyIndex()].get(), + sigma_models_[EarlyLate::earlyIndex()], from_slew, from_slew_annotation, to_slew, related_out_cap, digits); if (pocv_enabled && sigma_models_[EarlyLate::lateIndex()]) result += reportTableDelay("Check sigma late", pvt, - sigma_models_[EarlyLate::lateIndex()].get(), + sigma_models_[EarlyLate::lateIndex()], from_slew, from_slew_annotation, to_slew, related_out_cap, digits); return result; @@ -587,7 +606,7 @@ CheckTableModel::axisValue(const TableAxis *axis, } bool -CheckTableModel::checkAxes(const TablePtr table) +CheckTableModel::checkAxes(const TableModel *table) { const TableAxis *axis1 = table->axis1(); const TableAxis *axis2 = table->axis2(); diff --git a/liberty/TimingArc.cc b/liberty/TimingArc.cc index 347c56fe..1f1ea2c1 100644 --- a/liberty/TimingArc.cc +++ b/liberty/TimingArc.cc @@ -204,6 +204,16 @@ TimingArcSet::TimingArcSet(const TimingRole *role, { } +std::string +TimingArcSet::to_string() +{ + std::string str = from_->name(); + str += " -> "; + str += to_->name(); + str += " " + role()->to_string(); + return str; +} + TimingArcSet::~TimingArcSet() { deleteContents(arcs_); @@ -622,7 +632,7 @@ TimingArc::equiv(const TimingArc *arc1, } void -TimingArc::setIndex(unsigned index) +TimingArc::setIndex(size_t index) { index_ = index; } diff --git a/power/Power.cc b/power/Power.cc index db3ef053..4319de04 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -292,7 +292,7 @@ Power::reportDesign(const Scene *scene, PowerResult total, sequential, combinational, clock, macro, pad; power(scene, total, sequential, combinational, clock, macro, pad); ReportPower report_power(this); - report_power.reportDesign(total, sequential, combinational, clock, macro, pad, digits); + report_power.reportDesign(total, sequential, combinational, clock, macro, pad, digits); } void diff --git a/search/MakeTimingModel.cc b/search/MakeTimingModel.cc index 7e3f89b8..1c605a26 100644 --- a/search/MakeTimingModel.cc +++ b/search/MakeTimingModel.cc @@ -79,7 +79,7 @@ MakeTimingModel::MakeTimingModel(const char *lib_name, scene_(scene), cell_(nullptr), min_max_(MinMax::max()), - lib_builder_(new LibertyBuilder), + lib_builder_(new LibertyBuilder(debug_, report_)), tbl_template_index_(1), sdc_(scene->sdc()), sdc_backup_(nullptr), @@ -611,7 +611,7 @@ MakeTimingModel::makeScalarCheckModel(float value, library_->findTableTemplate("scalar", TableTemplateType::delay); TableModel *table_model = new TableModel(table, tbl_template, scale_factor_type, rf); - CheckTableModel *check_model = new CheckTableModel(cell_, table_model, nullptr); + CheckTableModel *check_model = new CheckTableModel(cell_, table_model); return check_model; } @@ -628,9 +628,7 @@ MakeTimingModel::makeGateModelScalar(Delay delay, ScaleFactorType::cell, rf); TableModel *slew_model = new TableModel(slew_table, tbl_template, ScaleFactorType::cell, rf); - GateTableModel *gate_model = new GateTableModel(cell_, delay_model, nullptr, - slew_model, nullptr, - nullptr, nullptr); + GateTableModel *gate_model = new GateTableModel(cell_, delay_model, slew_model); return gate_model; } @@ -643,9 +641,7 @@ MakeTimingModel::makeGateModelScalar(Delay delay, library_->findTableTemplate("scalar", TableTemplateType::delay); TableModel *delay_model = new TableModel(delay_table, tbl_template, ScaleFactorType::cell, rf); - GateTableModel *gate_model = new GateTableModel(cell_, delay_model, nullptr, - nullptr, nullptr, - nullptr, nullptr); + GateTableModel *gate_model = new GateTableModel(cell_, delay_model, nullptr); return gate_model; } @@ -721,10 +717,8 @@ MakeTimingModel::makeGateModelTable(const Pin *output_pin, ScaleFactorType::cell, rf); TableModel *slew_model = new TableModel(slew_table, model_template, ScaleFactorType::cell, rf); - GateTableModel *gate_model = new GateTableModel(cell_, - delay_model, nullptr, - slew_model, nullptr, - nullptr, nullptr); + GateTableModel *gate_model = new GateTableModel(cell_, delay_model, + slew_model); return gate_model; } } diff --git a/search/PathEnd.cc b/search/PathEnd.cc index 2a7af024..7e72e6fb 100644 --- a/search/PathEnd.cc +++ b/search/PathEnd.cc @@ -1178,7 +1178,7 @@ PathEndLatchCheck::sourceClkOffset(const StaState *sta) const const TimingRole * PathEndLatchCheck::checkRole(const StaState *sta) const { - if (clk_path_->clkInfo(sta)->isPulseClk()) + if (clk_path_ && clk_path_->clkInfo(sta)->isPulseClk()) // Pulse latches use register cycle accounting. return TimingRole::setup(); else diff --git a/test/get_is_memory.tcl b/test/get_is_memory.tcl index 23080a99..61d9d461 100644 --- a/test/get_is_memory.tcl +++ b/test/get_is_memory.tcl @@ -1,4 +1,4 @@ -# Tests whether the is_memory attribute works for cells and libcells +# Tests whether the is_memory attribute works for instances and cells read_liberty gf180mcu_sram.lib.gz read_liberty asap7_small.lib.gz read_verilog get_is_memory.v diff --git a/test/gf180mcu_sram.lib.gz b/test/gf180mcu_sram.lib.gz index b4ab4b9fd42edea2bb0ab58aa96dee052d029a6f..84279e4699285d224a3d74decd2db47e3a0f682c 100644 GIT binary patch delta 19 acmaEEcGZkazMF%g-hX-~1M@~1Z)pHSYz656 delta 37 scmca=_S{THzMF$X_>O5h19N(sp@l(ia%p^VQDUxMPG%CrMlNq@0O!;T&;S4c diff --git a/test/liberty_arcs_one2one_1.ok b/test/liberty_arcs_one2one_1.ok index dc99d32b..eac1a900 100644 --- a/test/liberty_arcs_one2one_1.ok +++ b/test/liberty_arcs_one2one_1.ok @@ -1,3 +1,4 @@ +Warning 1195: liberty_arcs_one2one_1.lib line 45, port Y function size does not match port size. Warning 1216: liberty_arcs_one2one_1.lib line 48, timing port A and related port Y are different sizes. report_edges -from partial_wide_inv_cell/A[0] A[0] -> Y[0] combinational diff --git a/test/liberty_arcs_one2one_2.ok b/test/liberty_arcs_one2one_2.ok index 323145d3..0dbc0a3a 100644 --- a/test/liberty_arcs_one2one_2.ok +++ b/test/liberty_arcs_one2one_2.ok @@ -1,3 +1,4 @@ +Warning 1195: liberty_arcs_one2one_2.lib line 45, port Y function size does not match port size. Warning 1216: liberty_arcs_one2one_2.lib line 48, timing port A and related port Y are different sizes. report_edges -to partial_wide_inv_cell/Y[0] A[0] -> Y[0] combinational diff --git a/util/TokenParser.cc b/util/TokenParser.cc index e048cecf..d0a44859 100644 --- a/util/TokenParser.cc +++ b/util/TokenParser.cc @@ -87,4 +87,27 @@ TokenParser::next() return token_; } +//////////////////////////////////////////////////////////////// + +// Parse space separated tokens. +StdStringSeq +parseTokens(const std::string &s, + const char delimiter) +{ + StdStringSeq tokens; + size_t i = 0; + while (i < s.size()) { + while (i < s.size() && std::isspace(s[i])) + ++i; + size_t start = i; + while (i < s.size() && s[i] != delimiter) + ++i; + if (start < i) { + tokens.emplace_back(s, start, i - start); + ++i; + } + } + return tokens; +} + } // namespace From d31372ef9ac381db8e0105c91e461230e68e8d77 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 27 Feb 2026 17:54:32 -0800 Subject: [PATCH 06/59] regression sta_dir Signed-off-by: James Cherry --- test/regression | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/regression b/test/regression index a64ac704..2d6aa6ce 100755 --- a/test/regression +++ b/test/regression @@ -31,7 +31,7 @@ exec tclsh $0 ${1+"$@"} # Directory containing tests. set test_dir [file dirname [file normalize [info script]]] -set sta_dir [file normalize [file join $test_dir ".."]] +set sta_dir [file dirname $test_dir] source [file join $test_dir regression_vars.tcl] source [file join $test_dir regression.tcl] From adb933f5bdea6a249c522ec4b38b73eede0f9f38 Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Fri, 27 Feb 2026 21:20:00 -0800 Subject: [PATCH 07/59] Remove fork/upstream notice from README Removed introductory section saying this is a fork and to file upstream. Signed-off-by: Matt Liberty --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 84be85e5..6814119f 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,3 @@ -# Static Timing Analysis - -This is effectively a fork of [parallaxsw/OpenSTA](https://github.com/parallaxsw/OpenSTA). All issues and PRs should be filed there. - # Parallax Static Timing Analyzer OpenSTA is a gate level static timing verifier. As a stand-alone From a6425a3364b790a04f2cf8f85a1fc07fb6dab9f2 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 28 Feb 2026 14:51:09 -0800 Subject: [PATCH 08/59] FindMessages criticalError Signed-off-by: James Cherry --- dcalc/ArnoldiDelayCalc.cc | 3 ++- etc/FindMessages.tcl | 2 +- power/Power.cc | 2 +- search/Levelize.cc | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/dcalc/ArnoldiDelayCalc.cc b/dcalc/ArnoldiDelayCalc.cc index ac6705d8..162c4d3e 100644 --- a/dcalc/ArnoldiDelayCalc.cc +++ b/dcalc/ArnoldiDelayCalc.cc @@ -610,7 +610,8 @@ delay_work_get_residues(delay_work *D,int term_index) // calculate_poles_res // -void arnoldi1::calculate_poles_res(delay_work *D,double rdrive) +void arnoldi1::calculate_poles_res(delay_work *D, + double rdrive) { if (n > D->nmax) delay_work_alloc(D,n); double *p = D->poles; diff --git a/etc/FindMessages.tcl b/etc/FindMessages.tcl index bf60754b..c5fad936 100755 --- a/etc/FindMessages.tcl +++ b/etc/FindMessages.tcl @@ -61,7 +61,7 @@ foreach subdir $subdirs { set files [glob -nocomplain [file join $subdir "*.{cc,hh,yy,ll,i}"]] set files_c [concat $files_c $files] } -set warn_regexp_c {(?:(?:->critical|->warn|->fileWarn|->error|->fileError|libWarn|libError| warn)\(|tclArgError\(interp,\s*)([0-9]+),.*(".+")} +set warn_regexp_c {(?:(?:->critical|->warn|->fileWarn|->error|->fileError|criticalError|libWarn|libError)\(|tclArgError\(interp,\s*)([0-9]+),.*(".+")} set files_tcl {} foreach subdir $subdirs { diff --git a/power/Power.cc b/power/Power.cc index 4319de04..2faaef23 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -842,7 +842,7 @@ Power::evalBddDuty(DdNode *bdd, else if (bdd == Cudd_ReadLogicZero(bdd_.cuddMgr())) return 0.0; else - criticalError(1100, "unknown cudd constant"); + criticalError(2400, "unknown cudd constant"); } else { float duty0 = evalBddDuty(Cudd_E(bdd), inst); diff --git a/search/Levelize.cc b/search/Levelize.cc index 02ef86e5..df6c983d 100644 --- a/search/Levelize.cc +++ b/search/Levelize.cc @@ -678,7 +678,7 @@ Levelize::setLevelIncr(Vertex *vertex, } max_level_ = max(level, max_level_); if (level >= Graph::vertex_level_max) - criticalError(617, "maximum logic level exceeded"); + criticalError(618, "maximum logic level exceeded"); } void From cd21c43693fd1a83b5b58015a2ddc808b60588ea Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 28 Feb 2026 14:57:00 -0800 Subject: [PATCH 09/59] rm LibertyPort::clkTreeDelays, clockTreePathDelays Signed-off-by: James Cherry --- include/sta/Liberty.hh | 5 ----- liberty/Liberty.cc | 27 --------------------------- 2 files changed, 32 deletions(-) diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 02769b84..3f096a81 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -892,10 +892,6 @@ public: float clkTreeDelay(float in_slew, const RiseFall *from_rf, const MinMax *min_max) const; - // deprecated 2024-06-22 - RiseFallMinMax clkTreeDelays() const __attribute__ ((deprecated)); - // deprecated 2024-02-27 - RiseFallMinMax clockTreePathDelays() const __attribute__ ((deprecated)); static bool equiv(const LibertyPort *port1, const LibertyPort *port2); @@ -916,7 +912,6 @@ protected: void setMinPort(LibertyPort *min); void addScaledPort(OperatingConditions *op_cond, LibertyPort *scaled_port); - RiseFallMinMax clkTreeDelays1() const; void setMemberFlag(bool value, const std::function &setter); void setMemberFloat(float value, diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 5df31143..7510fdcb 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -2736,33 +2736,6 @@ LibertyPort::setDriverWaveform(DriverWaveform *driver_waveform, //////////////////////////////////////////////////////////////// -RiseFallMinMax -LibertyPort::clockTreePathDelays() const -{ - return clkTreeDelays1(); -} - -RiseFallMinMax -LibertyPort::clkTreeDelays() const -{ - return clkTreeDelays1(); -} - -RiseFallMinMax -LibertyPort::clkTreeDelays1() const -{ - RiseFallMinMax delays; - for (const RiseFall *from_rf : RiseFall::range()) { - for (const RiseFall *to_rf : RiseFall::range()) { - for (const MinMax *min_max : MinMax::range()) { - float delay = clkTreeDelay(0.0, from_rf, to_rf, min_max); - delays.setValue(from_rf, min_max, delay); - } - } - } - return delays; -} - float LibertyPort::clkTreeDelay(float in_slew, const RiseFall *rf, From e76f54a068ddcd5821ea554b2ff06ae6a3fc9e2e Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 28 Feb 2026 15:45:34 -0800 Subject: [PATCH 10/59] rm TokenParser Signed-off-by: James Cherry --- CMakeLists.txt | 1 - include/sta/StringUtil.hh | 13 ++--- include/sta/TokenParser.hh | 62 -------------------- liberty/LibertyReader.cc | 1 - spice/WriteSpice.cc | 16 +++--- spice/WriteSpice.hh | 6 +- util/StringUtil.cc | 29 ++++++++-- util/TokenParser.cc | 113 ------------------------------------- 8 files changed, 41 insertions(+), 200 deletions(-) delete mode 100644 include/sta/TokenParser.hh delete mode 100644 util/TokenParser.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 60932b82..973cfb0d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -237,7 +237,6 @@ set(STA_SOURCE util/StringSeq.cc util/StringSet.cc util/StringUtil.cc - util/TokenParser.cc util/Transition.cc verilog/VerilogReader.cc diff --git a/include/sta/StringUtil.hh b/include/sta/StringUtil.hh index c222d53b..cdb9b1b7 100644 --- a/include/sta/StringUtil.hh +++ b/include/sta/StringUtil.hh @@ -33,6 +33,8 @@ namespace sta { +using StdStringSeq = std::vector; + inline bool stringEq(const char *str1, const char *str2) @@ -201,12 +203,9 @@ deleteTmpStrings(); void trimRight(std::string &str); -using StringVector = std::vector; - -void -split(const std::string &text, - const std::string &delims, - // Return values. - StringVector &tokens); +// Spit text into delimiter separated tokens and skip whitepace. +StdStringSeq +parseTokens(const std::string &s, + const char delimiter); } // namespace diff --git a/include/sta/TokenParser.hh b/include/sta/TokenParser.hh deleted file mode 100644 index 27db37f9..00000000 --- a/include/sta/TokenParser.hh +++ /dev/null @@ -1,62 +0,0 @@ -// OpenSTA, Static Timing Analyzer -// Copyright (c) 2025, Parallax Software, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. -// -// Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// This notice may not be removed or altered from any source distribution. - -#pragma once - -#include -#include - -namespace sta { - -using StdStringSeq = std::vector; - -// Iterate over the tokens in str separated by character sep. -// Similar in functionality to strtok, but does not leave the string -// side-effected. This is preferable to using strtok because it leaves -// string terminators where the separators were. -// Using STL string functions to parse tokens is messy and extremely slow -// on the RogueWave/Solaris implementation, apparently because of mutexes -// on temporary strings. -class TokenParser -{ -public: - TokenParser(const char *str, - const char *delimiters); - bool hasNext(); - char *next(); - -private: - const char *delimiters_; - char *token_; - char *token_end_; - char token_delimiter_; - bool first_; -}; - -// Parse delimiter separated tokens and skipp spaces. -StdStringSeq -parseTokens(const std::string &s, - const char delimiter); - -} // namespace diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 974ab7ec..c070e3dd 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -33,7 +33,6 @@ #include "EnumNameMap.hh" #include "Report.hh" #include "Debug.hh" -#include "TokenParser.hh" #include "Units.hh" #include "Transition.hh" #include "FuncExpr.hh" diff --git a/spice/WriteSpice.cc b/spice/WriteSpice.cc index cce1989b..8d55d8c7 100644 --- a/spice/WriteSpice.cc +++ b/spice/WriteSpice.cc @@ -213,8 +213,7 @@ WriteSpice::writeSubckts(StdStringSet &cell_names) string line; while (getline(lib_subckts_stream, line)) { // .subckt [args..] - StringVector tokens; - split(line, " \t", tokens); + StdStringSeq tokens = parseTokens(line, ' '); if (tokens.size() >= 2 && stringEqual(tokens[0].c_str(), ".subckt")) { const char *cell_name = tokens[1].c_str(); @@ -261,11 +260,11 @@ WriteSpice::writeSubckts(StdStringSet &cell_names) void WriteSpice::recordSpicePortNames(const char *cell_name, - StringVector &tokens) + StdStringSeq &tokens) { LibertyCell *cell = network_->findLibertyCell(cell_name); if (cell) { - StringVector &spice_port_names = cell_spice_port_names_[cell_name]; + StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; for (size_t i = 2; i < tokens.size(); i++) { const char *port_name = tokens[i].c_str(); LibertyPort *port = cell->findLibertyPort(port_name); @@ -290,8 +289,7 @@ WriteSpice::findCellSubckts(StdStringSet &cell_names) string line; while (getline(lib_subckts_stream, line)) { // .subckt [args..] - StringVector tokens; - split(line, " \t", tokens); + StdStringSeq tokens = parseTokens(line, ' '); if (tokens.size() >= 2 && stringEqual(tokens[0].c_str(), ".subckt")) { const char *cell_name = tokens[1].c_str(); @@ -304,7 +302,7 @@ WriteSpice::findCellSubckts(StdStringSet &cell_names) else { // Process previous statement. if (tolower(stmt[0]) == 'x') { - split(stmt, " \t", tokens); + StdStringSeq tokens = parseTokens(line, ' '); string &subckt_cell = tokens[tokens.size() - 1]; cell_names.insert(subckt_cell); } @@ -329,7 +327,7 @@ WriteSpice::writeSubcktInst(const Instance *inst) const char *inst_name = network_->pathName(inst); LibertyCell *cell = network_->libertyCell(inst); const char *cell_name = cell->name(); - StringVector &spice_port_names = cell_spice_port_names_[cell_name]; + StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; streamPrint(spice_stream_, "x%s", inst_name); for (string subckt_port_name : spice_port_names) { const char *subckt_port_cname = subckt_port_name.c_str(); @@ -357,7 +355,7 @@ WriteSpice::writeSubcktInstVoltSrcs(const Instance *inst, { LibertyCell *cell = network_->libertyCell(inst); const char *cell_name = cell->name(); - StringVector &spice_port_names = cell_spice_port_names_[cell_name]; + StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; const char *inst_name = network_->pathName(inst); debugPrint(debug_, "write_spice", 2, "subckt %s", cell->name()); diff --git a/spice/WriteSpice.hh b/spice/WriteSpice.hh index 3e55e294..aee55dfe 100644 --- a/spice/WriteSpice.hh +++ b/spice/WriteSpice.hh @@ -40,9 +40,9 @@ namespace sta { using ParasiticNodeMap = std::map; -using CellSpicePortNames = std::map; -using LibertyPortLogicValues = std::map; using StdStringSeq = std::vector; +using CellSpicePortNames = std::map; +using LibertyPortLogicValues = std::map; // Utilities for writing a spice deck. class WriteSpice : public StaState @@ -69,7 +69,7 @@ protected: void writeSubckts(StdStringSet &cell_names); void findCellSubckts(StdStringSet &cell_names); void recordSpicePortNames(const char *cell_name, - StringVector &tokens); + StdStringSeq &tokens); void writeSubcktInst(const Instance *inst); void writeSubcktInstVoltSrcs(const Instance *inst, LibertyPortLogicValues &port_values, diff --git a/util/StringUtil.cc b/util/StringUtil.cc index a0b8c154..6a8680e4 100644 --- a/util/StringUtil.cc +++ b/util/StringUtil.cc @@ -269,12 +269,11 @@ trimRight(string &str) str.erase(str.find_last_not_of(" ") + 1); } -void +StdStringSeq split(const string &text, - const string &delims, - // Return values. - StringVector &tokens) + const string &delims) { + StdStringSeq tokens; auto start = text.find_first_not_of(delims); auto end = text.find_first_of(delims, start); while (end != string::npos) { @@ -284,6 +283,28 @@ split(const string &text, } if (start != string::npos) tokens.push_back(text.substr(start)); + return tokens; +} + +// Parse space separated tokens. +StdStringSeq +parseTokens(const std::string &s, + const char delimiter) +{ + StdStringSeq tokens; + size_t i = 0; + while (i < s.size()) { + while (i < s.size() && std::isspace(s[i])) + ++i; + size_t start = i; + while (i < s.size() && s[i] != delimiter) + ++i; + if (start < i) { + tokens.emplace_back(s, start, i - start); + ++i; + } + } + return tokens; } } // namespace diff --git a/util/TokenParser.cc b/util/TokenParser.cc deleted file mode 100644 index d0a44859..00000000 --- a/util/TokenParser.cc +++ /dev/null @@ -1,113 +0,0 @@ -// OpenSTA, Static Timing Analyzer -// Copyright (c) 2025, Parallax Software, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. -// -// Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// This notice may not be removed or altered from any source distribution. - -#include "TokenParser.hh" - -#include -#include - -namespace sta { - -TokenParser::TokenParser(const char *str, - const char *delimiters) : - delimiters_(delimiters), - token_(const_cast(str)), - token_delimiter_('\0'), - first_(true) -{ - // Skip leading spaces. - while (*token_ != '\0' && isspace(*token_)) - token_++; - token_end_ = strpbrk(token_, delimiters_); - if (token_end_) { - // Save the delimiter. - token_delimiter_ = *token_end_; - // Replace the separator with a terminator. - *token_end_ = '\0'; - } -} - -bool -TokenParser::hasNext() -{ - if (!first_) { - // Replace the previous separator. - if (token_end_) { - *token_end_ = token_delimiter_; - token_ = token_end_ + 1; - // Skip spaces. - while (*token_ != '\0' && isspace(*token_)) - token_++; - // Skip delimiters. - while (*token_ != '\0' && strchr(delimiters_,*token_) != nullptr) - token_++; - if (*token_ == '\0') - token_ = nullptr; - else { - token_end_ = strpbrk(token_, delimiters_); - if (token_end_) { - // Save the delimiter. - token_delimiter_ = *token_end_; - // Replace the separator with a terminator. - *token_end_ = '\0'; - } - } - } - else - token_ = nullptr; - } - return token_ != nullptr; -} - -char * -TokenParser::next() -{ - first_ = false; - return token_; -} - -//////////////////////////////////////////////////////////////// - -// Parse space separated tokens. -StdStringSeq -parseTokens(const std::string &s, - const char delimiter) -{ - StdStringSeq tokens; - size_t i = 0; - while (i < s.size()) { - while (i < s.size() && std::isspace(s[i])) - ++i; - size_t start = i; - while (i < s.size() && s[i] != delimiter) - ++i; - if (start < i) { - tokens.emplace_back(s, start, i - start); - ++i; - } - } - return tokens; -} - -} // namespace From 0f8d7cffd3f8190c269b83c20708e1423ac50429 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 28 Feb 2026 15:53:23 -0800 Subject: [PATCH 11/59] mv StdStringSeq defs to StringUtil.hh Signed-off-by: James Cherry --- include/sta/PathGroup.hh | 2 +- include/sta/Search.hh | 2 +- include/sta/Sta.hh | 2 +- include/sta/StringSeq.hh | 1 - include/sta/StringSet.hh | 1 - liberty/LibertyReaderPvt.hh | 2 +- spice/WriteSpice.hh | 2 +- spice/Xyce.hh | 2 +- verilog/VerilogReaderPvt.hh | 2 +- 9 files changed, 7 insertions(+), 9 deletions(-) diff --git a/include/sta/PathGroup.hh b/include/sta/PathGroup.hh index a3bd6ee3..836804f7 100644 --- a/include/sta/PathGroup.hh +++ b/include/sta/PathGroup.hh @@ -32,6 +32,7 @@ #include "SdcClass.hh" #include "StaState.hh" #include "SearchClass.hh" +#include "StringUtil.hh" namespace sta { @@ -42,7 +43,6 @@ using PathGroupIterator = PathEndSeq::iterator; using PathGroupClkMap = std::map; using PathGroupNamedMap = std::map; using PathGroupSeq = std::vector; -using StdStringSeq = std::vector; // A collection of PathEnds grouped and sorted for reporting. class PathGroup diff --git a/include/sta/Search.hh b/include/sta/Search.hh index 09bc1687..4c98845c 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -40,6 +40,7 @@ #include "SearchPred.hh" #include "VertexVisitor.hh" #include "Path.hh" +#include "StringUtil.hh" namespace sta { @@ -70,7 +71,6 @@ using VertexSlackMapSeq = std::vector; using WorstSlacksSeq = std::vector; using DelayDblSeq = std::vector; using ExceptionPathSeq = std::vector; -using StdStringSeq = std::vector; class Search : public StaState { diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 15df9a85..ddb2f7d7 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -30,6 +30,7 @@ #include #include "StringSeq.hh" +#include "StringUtil.hh" #include "LibertyClass.hh" #include "NetworkClass.hh" #include "SdcClass.hh" @@ -80,7 +81,6 @@ using SceneNameMap = std::map; using SlowDrvrIterator = Iterator; using CheckError = StringSeq; using CheckErrorSeq = std::vector; -using StdStringSeq = std::vector; enum class CmdNamespace { sta, sdc }; using ParasiticsNameMap = std::map; // Path::slack/arrival/required function. diff --git a/include/sta/StringSeq.hh b/include/sta/StringSeq.hh index ca7c304f..9821b7b2 100644 --- a/include/sta/StringSeq.hh +++ b/include/sta/StringSeq.hh @@ -31,7 +31,6 @@ namespace sta { using StringSeq = std::vector; -using StdStringSeq = std::vector; void deleteContents(StringSeq *strings); diff --git a/include/sta/StringSet.hh b/include/sta/StringSet.hh index 36fa7e67..fc3d0d2b 100644 --- a/include/sta/StringSet.hh +++ b/include/sta/StringSet.hh @@ -31,7 +31,6 @@ namespace sta { using StringSet = std::set; using StdStringSet = std::set; -using StdStringSeq = std::vector; void deleteContents(StringSet *strings); diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 91fdf260..c17cdeb8 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -31,6 +31,7 @@ #include #include "StringSeq.hh" +#include "StringUtil.hh" #include "MinMax.hh" #include "NetworkClass.hh" #include "Transition.hh" @@ -55,7 +56,6 @@ class OutputWaveform; using LibraryGroupVisitor = void (LibertyReader::*)(const LibertyGroup *group, LibertyGroup *parent_group); using LibraryGroupVisitorMap = std::unordered_map; -using StdStringSeq = std::vector; using LibertyPortGroupMap = std::map; using OutputWaveformSeq = std::vector; diff --git a/spice/WriteSpice.hh b/spice/WriteSpice.hh index aee55dfe..81bd15b7 100644 --- a/spice/WriteSpice.hh +++ b/spice/WriteSpice.hh @@ -31,6 +31,7 @@ #include "StaState.hh" #include "StringSet.hh" +#include "StringUtil.hh" #include "Liberty.hh" #include "GraphClass.hh" #include "Parasitics.hh" @@ -40,7 +41,6 @@ namespace sta { using ParasiticNodeMap = std::map; -using StdStringSeq = std::vector; using CellSpicePortNames = std::map; using LibertyPortLogicValues = std::map; diff --git a/spice/Xyce.hh b/spice/Xyce.hh index 1c27cb4e..ce8e5e6c 100644 --- a/spice/Xyce.hh +++ b/spice/Xyce.hh @@ -27,11 +27,11 @@ #include #include +#include "StringUtil.hh" #include "TableModel.hh" namespace sta { -using StdStringSeq = std::vector; using WaveformSeq = std::vector
; void diff --git a/verilog/VerilogReaderPvt.hh b/verilog/VerilogReaderPvt.hh index 60498c7d..6bbe8288 100644 --- a/verilog/VerilogReaderPvt.hh +++ b/verilog/VerilogReaderPvt.hh @@ -29,12 +29,12 @@ #include #include "StringSeq.hh" +#include "StringUtil.hh" namespace sta { using VerilogDclMap = std::map; using VerilogConstantValue = std::vector; -using StdStringSeq = std::vector; class VerilogStmt { From 94b8fd8f374e377c10d74b265c9f90d7526ccd60 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 1 Mar 2026 17:33:20 -0800 Subject: [PATCH 12/59] dcalc threshold adjustment Signed-off-by: James Cherry --- dcalc/LumpedCapDelayCalc.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dcalc/LumpedCapDelayCalc.cc b/dcalc/LumpedCapDelayCalc.cc index 948e277f..c3f6a5a0 100644 --- a/dcalc/LumpedCapDelayCalc.cc +++ b/dcalc/LumpedCapDelayCalc.cc @@ -170,9 +170,10 @@ LumpedCapDelayCalc::makeResult(const LibertyLibrary *drvr_library, for (const auto [load_pin, load_idx] : load_pin_index_map) { ArcDelay wire_delay = 0.0; + Slew load_slew = drvr_slew; thresholdAdjust(load_pin, drvr_library, rf, wire_delay, drvr_slew); dcalc_result.setWireDelay(load_idx, wire_delay); - dcalc_result.setLoadSlew(load_idx, drvr_slew); + dcalc_result.setLoadSlew(load_idx, load_slew); } return dcalc_result; } From 741bf4d561679a6ef36619cc514df29be89b8156 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 2 Mar 2026 12:13:13 -0800 Subject: [PATCH 13/59] rm using std:: Signed-off-by: James Cherry --- app/Main.cc | 3 +- dcalc/ArcDcalcWaveforms.cc | 6 +- dcalc/ArnoldiDelayCalc.cc | 46 +++--- dcalc/ArnoldiReduce.cc | 4 +- dcalc/CcsCeffDelayCalc.cc | 30 ++-- dcalc/DelayCalcBase.cc | 11 +- dcalc/DmpCeff.cc | 38 ++--- dcalc/FindRoot.cc | 8 +- dcalc/GraphDelayCalc.cc | 18 +-- dcalc/LumpedCapDelayCalc.cc | 7 +- dcalc/ParallelDelayCalc.cc | 6 +- dcalc/PrimaDelayCalc.cc | 15 +- dcalc/UnitDelayCalc.cc | 8 +- graph/Graph.cc | 12 +- liberty/EquivCells.cc | 2 - liberty/FuncExpr.cc | 14 +- liberty/Liberty.cc | 6 +- liberty/LibertyParser.cc | 8 +- liberty/LibertyWriter.cc | 6 +- liberty/LinearModel.cc | 10 +- liberty/TableModel.cc | 66 ++++---- liberty/TimingArc.cc | 11 +- liberty/Units.cc | 7 +- network/ConcreteLibrary.cc | 30 ++-- network/ConcreteNetwork.cc | 26 ++-- network/Network.cc | 8 +- network/ParseBus.cc | 14 +- network/SdcNetwork.cc | 89 ++++++----- network/VerilogNamespace.cc | 60 ++++---- parasitics/ConcreteParasitics.cc | 4 +- parasitics/ReduceParasitics.cc | 5 +- parasitics/SpefReader.cc | 4 +- power/Power.cc | 13 +- power/SaifReader.cc | 16 +- power/VcdParse.cc | 52 +++---- power/VcdReader.cc | 77 +++++----- sdc/ExceptionPath.cc | 10 +- sdc/Sdc.cc | 36 +++-- sdc/WriteSdc.cc | 5 +- sdf/SdfReader.cc | 100 ++++++------ sdf/SdfWriter.cc | 50 +++--- search/CheckTiming.cc | 10 +- search/ClkSkew.cc | 10 +- search/Crpr.cc | 20 +-- search/Genclks.cc | 6 +- search/Levelize.cc | 15 +- search/MakeTimingModel.cc | 22 ++- search/Property.cc | 30 ++-- search/ReportPath.cc | 163 ++++++++++---------- search/Search.cc | 7 +- search/Sta.cc | 46 +++--- search/WorstSlack.cc | 6 +- spice/WritePathSpice.cc | 23 ++- spice/WriteSpice.cc | 76 +++++---- spice/Xyce.cc | 34 ++--- util/Fuzzy.cc | 11 +- util/PatternMatch.cc | 8 +- util/Report.cc | 8 +- util/StringUtil.cc | 28 ++-- util/Transition.cc | 6 +- verilog/VerilogReader.cc | 255 +++++++++++++++---------------- verilog/VerilogWriter.cc | 27 ++-- 62 files changed, 794 insertions(+), 958 deletions(-) diff --git a/app/Main.cc b/app/Main.cc index baa1c0ea..aa28aed8 100644 --- a/app/Main.cc +++ b/app/Main.cc @@ -39,7 +39,6 @@ namespace sta { extern const char *tcl_inits[]; } -using std::string; using sta::stringEq; using sta::findCmdLineFlag; using sta::Sta; @@ -129,7 +128,7 @@ staTclAppInit(int argc, if (!findCmdLineFlag(argc, argv, "-no_init")) { const char *home = getenv("HOME"); if (home) { - string init_path = home; + std::string init_path = home; init_path += "/"; init_path += init_filename; if (std::filesystem::is_regular_file(init_path.c_str())) diff --git a/dcalc/ArcDcalcWaveforms.cc b/dcalc/ArcDcalcWaveforms.cc index b927bf1a..c718e8b9 100644 --- a/dcalc/ArcDcalcWaveforms.cc +++ b/dcalc/ArcDcalcWaveforms.cc @@ -35,8 +35,6 @@ namespace sta { -using std::make_shared; - Waveform ArcDcalcWaveforms::inputWaveform(ArcDcalcArg &dcalc_arg, const Scene *scene, @@ -68,8 +66,8 @@ ArcDcalcWaveforms::inputWaveform(ArcDcalcArg &dcalc_arg, FloatSeq time_values; for (float time : in_waveform.axis1()->values()) time_values.push_back(time + dcalc_arg.inputDelay()); - TableAxisPtr time_axis = make_shared(TableAxisVariable::time, - std::move(time_values)); + TableAxisPtr time_axis = std::make_shared(TableAxisVariable::time, + std::move(time_values)); // Scale the waveform from 0:vdd. FloatSeq *scaled_values = new FloatSeq; for (float value : *in_waveform.values()) { diff --git a/dcalc/ArnoldiDelayCalc.cc b/dcalc/ArnoldiDelayCalc.cc index 162c4d3e..bb1d1702 100644 --- a/dcalc/ArnoldiDelayCalc.cc +++ b/dcalc/ArnoldiDelayCalc.cc @@ -63,10 +63,6 @@ namespace sta { // ra_get_r // ra_get_s -using std::string; -using std::abs; -using std::vector; - struct delay_work; struct delay_c; @@ -151,15 +147,15 @@ public: const LoadPinIndexMap &load_pin_index_map, const Scene *scene, const MinMax *min_max) override; - string reportGateDelay(const Pin *drvr_pin, - const TimingArc *arc, - const Slew &in_slew, - float load_cap, - const Parasitic *parasitic, - const LoadPinIndexMap &load_pin_index_map, - const Scene *scene, - const MinMax *min_max, - int digits) override; + std::string reportGateDelay(const Pin *drvr_pin, + const TimingArc *arc, + const Slew &in_slew, + float load_cap, + const Parasitic *parasitic, + const LoadPinIndexMap &load_pin_index_map, + const Scene *scene, + const MinMax *min_max, + int digits) override; void finishDrvrPin() override; void delay_work_set_thresholds(delay_work *D, double lo, @@ -240,7 +236,7 @@ private: int pin_n_; ArnoldiReduce *reduce_; delay_work *delay_work_; - vector unsaved_parasitics_; + std::vector unsaved_parasitics_; bool pocv_enabled_; }; @@ -469,7 +465,7 @@ ArnoldiDelayCalc::gateDelaySlew(const LibertyCell *drvr_cell, return dcalc_result; } -string +std::string ArnoldiDelayCalc::reportGateDelay(const Pin *drvr_pin, const TimingArc *arc, const Slew &in_slew, @@ -690,7 +686,7 @@ tridiagEV(int n,double *din,double *ein,double *d,double **v) e[0] = 0.0; for (h=n-1;h>=1;h--) { iter = 0; - while (abs(e[h])>1e-18) { // 1e-6ps + while (std::abs(e[h])>1e-18) { // 1e-6ps m=0; if (m != h) { if (iter++ == 20) @@ -820,14 +816,14 @@ solve_t_bracketed(double s,int order,double *p,double *rr, if (0.0= 0.0) - || (abs(2.0*f) > abs(dxold*df))) { + || (std::abs(2.0*f) > std::abs(dxold*df))) { dxold = dx; dx = 0.5*(xh-xl); if (flast*f >0.0) { @@ -851,7 +847,7 @@ solve_t_bracketed(double s,int order,double *p,double *rr, return rts; } } - if (abs(dx) < xacc) { + if (std::abs(dx) < xacc) { return rts; } get_dv(rts,s,order,p,rr,&f,&df); f -= val; @@ -860,7 +856,7 @@ solve_t_bracketed(double s,int order,double *p,double *rr, else xh = rts; } - if (abs(f)<1e-6) // 1uV + if (std::abs(f)<1e-6) // 1uV return rts; return 0.5*(xl+xh); } @@ -1266,28 +1262,28 @@ ArnoldiDelayCalc::ra_solve_for_s(delay_work *D, f = (ptlo-pthi)/p - tlohi; df = dlo-dhi; s = s - f/df; - if (abs(f)<.001e-12) return; // .001ps + if (std::abs(f)<.001e-12) return; // .001ps ra_solve_for_pt(p*s,vlo,&ptlo,&dlo); ra_solve_for_pt(p*s,vhi,&pthi,&dhi); f = (ptlo-pthi)/p - tlohi; df = dlo-dhi; s = s - f/df; - if (abs(f)<.001e-12) return; // .001ps + if (std::abs(f)<.001e-12) return; // .001ps ra_solve_for_pt(p*s,vlo,&ptlo,&dlo); ra_solve_for_pt(p*s,vhi,&pthi,&dhi); f = (ptlo-pthi)/p - tlohi; df = dlo-dhi; s = s - f/df; - if (abs(f)<.001e-12) return; // .001ps + if (std::abs(f)<.001e-12) return; // .001ps ra_solve_for_pt(p*s,vlo,&ptlo,&dlo); ra_solve_for_pt(p*s,vhi,&pthi,&dhi); f = (ptlo-pthi)/p - tlohi; df = dlo-dhi; s = s - f/df; - if (abs(f)<.001e-12) return; // .001ps + if (std::abs(f)<.001e-12) return; // .001ps ra_solve_for_pt(p*s,vlo,&ptlo,&dlo); ra_solve_for_pt(p*s,vhi,&pthi,&dhi); @@ -1295,7 +1291,7 @@ ArnoldiDelayCalc::ra_solve_for_s(delay_work *D, df = dlo-dhi; s = s - f/df; - if (abs(f)>.5e-12) // .5ps + if (std::abs(f)>.5e-12) // .5ps debugPrint(debug_, "arnoldi", 1, "ra_solve_for_s p %g tlohi %s err %s", p, units_->timeUnit()->asString(tlohi), diff --git a/dcalc/ArnoldiReduce.cc b/dcalc/ArnoldiReduce.cc index f05f8abc..ac8095e2 100644 --- a/dcalc/ArnoldiReduce.cc +++ b/dcalc/ArnoldiReduce.cc @@ -38,8 +38,6 @@ namespace sta { -using std::string; - rcmodel::rcmodel() : pinV(nullptr) { @@ -621,7 +619,7 @@ ArnoldiReduce::makeRcmodelFromTs() report_->reportLine(" d[%d] %s", h, units_->timeUnit()->asString(d[h])); - string line = stdstrPrint("U[%d]",h); + std::string line = stdstrPrint("U[%d]",h); for (i=0;ireportLineString(line); diff --git a/dcalc/CcsCeffDelayCalc.cc b/dcalc/CcsCeffDelayCalc.cc index 14b3e639..3f460d08 100644 --- a/dcalc/CcsCeffDelayCalc.cc +++ b/dcalc/CcsCeffDelayCalc.cc @@ -24,6 +24,8 @@ #include "CcsCeffDelayCalc.hh" +#include + #include "Debug.hh" #include "Units.hh" #include "Liberty.hh" @@ -38,17 +40,11 @@ namespace sta { -using std::string; - // Implementaion based on: // "Gate Delay Estimation with Library Compatible Current Source Models // and Effective Capacitance", D. Garyfallou et al, // IEEE Transactions on Very Large Scale Integration (VLSI) Systems, March 2021 -using std::abs; -using std::exp; -using std::make_shared; - ArcDelayCalc * makeCcsCeffDelayCalc(StaState *sta) { @@ -144,7 +140,7 @@ CcsCeffDelayCalc::gateDelaySlew(const LibertyLibrary *drvr_library, findCsmWaveform(); ref_time_ = output_waveforms_->referenceTime(in_slew_); gate_delay = region_times_[region_vth_idx_] - ref_time_; - drvr_slew = abs(region_times_[region_vh_idx_] - region_times_[region_vl_idx_]); + drvr_slew = std::abs(region_times_[region_vh_idx_] - region_times_[region_vl_idx_]); debugPrint(debug_, "ccs_dcalc", 2, "gate_delay %s drvr_slew %s (initial)", delayAsString(gate_delay, this), @@ -184,12 +180,12 @@ CcsCeffDelayCalc::gateDelaySlew(const LibertyLibrary *drvr_library, } findCsmWaveform(); gate_delay = region_times_[region_vth_idx_] - ref_time_; - drvr_slew = abs(region_times_[region_vh_idx_] - region_times_[region_vl_idx_]); + drvr_slew = std::abs(region_times_[region_vh_idx_] - region_times_[region_vl_idx_]); debugPrint(debug_, "ccs_dcalc", 2, "gate_delay %s drvr_slew %s", delayAsString(gate_delay, this), delayAsString(drvr_slew, this)); - if (abs(delayAsFloat(drvr_slew) - prev_drvr_slew) < .01 * prev_drvr_slew) + if (std::abs(delayAsFloat(drvr_slew) - prev_drvr_slew) < .01 * prev_drvr_slew) break; prev_drvr_slew = delayAsFloat(drvr_slew); } @@ -529,8 +525,8 @@ CcsCeffDelayCalc::drvrWaveform() drvr_volts->push_back(v); } } - TableAxisPtr drvr_time_axis = make_shared(TableAxisVariable::time, - std::move(*drvr_times)); + TableAxisPtr drvr_time_axis = std::make_shared(TableAxisVariable::time, + std::move(*drvr_times)); delete drvr_times; Table drvr_table(drvr_volts, drvr_time_axis); return drvr_table; @@ -561,8 +557,8 @@ CcsCeffDelayCalc::loadWaveform(const Pin *load_pin) double v1 = (drvr_rf_ == RiseFall::rise()) ? v : vdd_ - v; load_volts->push_back(v1); } - TableAxisPtr load_time_axis = make_shared(TableAxisVariable::time, - std::move(*load_times)); + TableAxisPtr load_time_axis = std::make_shared(TableAxisVariable::time, + std::move(*load_times)); delete load_times; Table load_table(load_volts, load_time_axis); return load_table; @@ -606,8 +602,8 @@ CcsCeffDelayCalc::drvrRampWaveform(const Pin *in_pin, double v1 = (drvr_rf == RiseFall::rise()) ? v : vdd_ - v; load_volts->push_back(v1); } - TableAxisPtr load_time_axis = make_shared(TableAxisVariable::time, - std::move(*load_times)); + TableAxisPtr load_time_axis = std::make_shared(TableAxisVariable::time, + std::move(*load_times)); delete load_times; Table load_table(load_volts, load_time_axis); return load_table; @@ -663,7 +659,7 @@ CcsCeffDelayCalc::makeWaveformPreamble(const Pin *in_pin, //////////////////////////////////////////////////////////////// -string +std::string CcsCeffDelayCalc::reportGateDelay(const Pin *drvr_pin, const TimingArc *arc, const Slew &in_slew, @@ -680,7 +676,7 @@ CcsCeffDelayCalc::reportGateDelay(const Pin *drvr_pin, pi_elmore = parasitics_->reduceToPiElmore(parasitic, drvr_pin_, rf, scene, min_max); } - string report = table_dcalc_->reportGateDelay(drvr_pin, arc, in_slew, load_cap, + std::string report = table_dcalc_->reportGateDelay(drvr_pin, arc, in_slew, load_cap, pi_elmore, load_pin_index_map, scene, min_max, digits); parasitics_->deleteDrvrReducedParasitics(drvr_pin); diff --git a/dcalc/DelayCalcBase.cc b/dcalc/DelayCalcBase.cc index ecaa16d4..5d201987 100644 --- a/dcalc/DelayCalcBase.cc +++ b/dcalc/DelayCalcBase.cc @@ -38,9 +38,6 @@ namespace sta { -using std::string; -using std::log; - DelayCalcBase::DelayCalcBase(StaState *sta) : ArcDelayCalc(sta) { @@ -101,9 +98,9 @@ DelayCalcBase::dspfWireDelaySlew(const Pin *load_pin, vh = load_library->slewUpperThreshold(rf); slew_derate = load_library->slewDerateFromLibrary(); } - wire_delay = -elmore * log(1.0 - vth); - load_slew = drvr_slew + elmore * log((1.0 - vl) / (1.0 - vh)) / slew_derate; - load_slew = drvr_slew + elmore * log((1.0 - vl) / (1.0 - vh)) / slew_derate; + wire_delay = -elmore * std::log(1.0 - vth); + load_slew = drvr_slew + elmore * std::log((1.0 - vl) / (1.0 - vh)) / slew_derate; + load_slew = drvr_slew + elmore * std::log((1.0 - vl) / (1.0 - vh)) / slew_derate; } void @@ -173,7 +170,7 @@ DelayCalcBase::checkDelay(const Pin *check_pin, return delay_zero; } -string +std::string DelayCalcBase::reportCheckDelay(const Pin *check_pin, const TimingArc *arc, const Slew &from_slew, diff --git a/dcalc/DmpCeff.cc b/dcalc/DmpCeff.cc index d759fc40..dd9b6721 100644 --- a/dcalc/DmpCeff.cc +++ b/dcalc/DmpCeff.cc @@ -32,8 +32,9 @@ #include "DmpCeff.hh" -#include // abs, min -#include // sqrt, log +#include +#include +#include #include "Report.hh" #include "Debug.hh" @@ -50,15 +51,6 @@ namespace sta { -using std::string; -using std::abs; -using std::min; -using std::max; -using std::sqrt; -using std::log; -using std::isnan; -using std::function; - // Tolerance (as a scale of value) for driver parameters (Ceff, delta t, t0). static const double driver_param_tol = .01; // Waveform threshold crossing time tolerance (1.0 = 100%). @@ -107,7 +99,7 @@ newtonRaphson(const int max_iter, const int n, const double x_tol, // eval(state) is called to fill fvec and fjac. - function eval, + std::function eval, // Temporaries supplied by caller. double *fvec, double **fjac, @@ -337,7 +329,7 @@ DmpAlg::findDriverParams(double ceff) gateDelays(ceff, t_vth, t_vl, slew); // Scale slew to 0-100% double dt = slew / (vh_ - vl_); - double t0 = t_vth + log(1.0 - vth_) * rd_ * ceff - vth_ * dt; + double t0 = t_vth + std::log(1.0 - vth_) * rd_ * ceff - vth_ * dt; x_[DmpParam::dt] = dt; x_[DmpParam::t0] = t0; newtonRaphson(100, x_, nr_order_, driver_param_tol, @@ -461,7 +453,7 @@ DmpAlg::showFvec() void DmpAlg::showJacobian() { - string line = " "; + std::string line = " "; for (int j = 0; j < nr_order_; j++) line += stdstrPrint("%12s", dmp_param_index_strings[j]); report_->reportLineString(line); @@ -894,7 +886,7 @@ DmpPi::init(const LibertyLibrary *drvr_library, k0_ = 1.0 / (rd_ * c2_); double a = rpi_ * rd_ * c1_ * c2_; double b = rd_ * (c1_ + c2_) + rpi_ * c1_; - double sqrt_ = sqrt(b * b - 4 * a); + double sqrt_ = std::sqrt(b * b - 4 * a); p1_ = (b + sqrt_) / (2 * a); p2_ = (b - sqrt_) / (2 * a); @@ -1282,7 +1274,7 @@ newtonRaphson(const int max_iter, double x[], const int size, const double x_tol, - function eval, + std::function eval, // Temporaries supplied by caller. double *fvec, double **fjac, @@ -1300,7 +1292,7 @@ newtonRaphson(const int max_iter, bool all_under_x_tol = true; for (int i = 0; i < size; i++) { - if (abs(p[i]) > abs(x[i]) * x_tol) + if (std::abs(p[i]) > std::abs(x[i]) * x_tol) all_under_x_tol = false; x[i] += p[i]; } @@ -1334,7 +1326,7 @@ luDecomp(double **a, for (int i = 0; i < size; i++) { double big = 0.0; for (int j = 0; j < size; j++) { - double temp = abs(a[i][j]); + double temp = std::abs(a[i][j]); if (temp > big) big = temp; } @@ -1363,7 +1355,7 @@ luDecomp(double **a, for (int k = 0; k < j; k++) sum -= a[i][k] * a[k][j]; a[i][j] = sum; - double dum = scale[i] * abs(sum); + double dum = scale[i] * std::abs(sum); if (dum >= big) { big = dum; imax = i; @@ -1507,7 +1499,7 @@ DmpCeffDelayCalc::gateDelay(const Pin *drvr_pin, float in_slew1 = delayAsFloat(in_slew); float c2, rpi, c1; parasitics_->piModel(parasitic, c2, rpi, c1); - if (isnan(c2) || isnan(c1) || isnan(rpi)) + if (std::isnan(c2) || std::isnan(c1) || std::isnan(rpi)) report_->error(1040, "parasitic Pi model has NaNs."); setCeffAlgorithm(drvr_library, drvr_cell, pinPvt(drvr_pin, scene, min_max), table_model, rf, in_slew1, c2, rpi, c1); @@ -1583,7 +1575,7 @@ DmpCeffDelayCalc::setCeffAlgorithm(const LibertyLibrary *drvr_library, dmp_alg_->name()); } -string +std::string DmpCeffDelayCalc::reportGateDelay(const Pin *drvr_pin, const TimingArc *arc, const Slew &in_slew, @@ -1598,7 +1590,7 @@ DmpCeffDelayCalc::reportGateDelay(const Pin *drvr_pin, parasitic, load_pin_index_map, scene, min_max); GateTableModel *model = arc->gateTableModel(scene, min_max); float c_eff = 0.0; - string result; + std::string result; const LibertyCell *drvr_cell = arc->to()->libertyCell(); const LibertyLibrary *drvr_library = drvr_cell->libertyLibrary(); const Units *units = drvr_library->units(); @@ -1653,7 +1645,7 @@ gateModelRd(const LibertyCell *cell, gate_model->gateDelay(pvt, in_slew, cap1, pocv_enabled, d1, s1); gate_model->gateDelay(pvt, in_slew, cap2, pocv_enabled, d2, s2); double vth = cell->libertyLibrary()->outputThreshold(rf); - float rd = -log(vth) * abs(delayAsFloat(d1) - delayAsFloat(d2)) / (cap2 - cap1); + float rd = -std::log(vth) * std::abs(delayAsFloat(d1) - delayAsFloat(d2)) / (cap2 - cap1); return rd; } diff --git a/dcalc/FindRoot.cc b/dcalc/FindRoot.cc index b74d7d16..2b0e9665 100644 --- a/dcalc/FindRoot.cc +++ b/dcalc/FindRoot.cc @@ -28,8 +28,6 @@ namespace sta { -using std::abs; - double findRoot(FindRootFunc func, double x1, @@ -76,7 +74,7 @@ findRoot(FindRootFunc func, // Swap x1/x2 so func(x1) < 0. std::swap(x1, x2); double root = (x1 + x2) * 0.5; - double dx_prev = abs(x2 - x1); + double dx_prev = std::abs(x2 - x1); double dx = dx_prev; double y, dy; func(root, y, dy); @@ -84,7 +82,7 @@ findRoot(FindRootFunc func, // Newton/raphson out of range. if ((((root - x2) * dy - y) * ((root - x1) * dy - y) > 0.0) // Not decreasing fast enough. - || (abs(2.0 * y) > abs(dx_prev * dy))) { + || (std::abs(2.0 * y) > std::abs(dx_prev * dy))) { // Bisect x1/x2 interval. dx_prev = dx; dx = (x2 - x1) * 0.5; @@ -95,7 +93,7 @@ findRoot(FindRootFunc func, dx = y / dy; root -= dx; } - if (abs(dx) <= x_tol * abs(root)) { + if (std::abs(dx) <= x_tol * std::abs(root)) { // Converged. fail = false; return root; diff --git a/dcalc/GraphDelayCalc.cc b/dcalc/GraphDelayCalc.cc index e94b3c8b..5fdf9587 100644 --- a/dcalc/GraphDelayCalc.cc +++ b/dcalc/GraphDelayCalc.cc @@ -24,6 +24,8 @@ #include "GraphDelayCalc.hh" +#include +#include #include #include "ContainerHelpers.hh" @@ -53,10 +55,6 @@ namespace sta { -using std::string; -using std::abs; -using std::array; - static const Slew default_slew = 0.0; static bool @@ -941,7 +939,7 @@ GraphDelayCalc::findDriverDelays1(Vertex *drvr_vertex, initSlew(drvr_vertex); initWireDelays(drvr_vertex); bool delay_changed = false; - array delay_exists = {false, false}; + std::array delay_exists = {false, false}; VertexInEdgeIterator edge_iter(drvr_vertex, graph_); while (edge_iter.hasNext()) { Edge *edge = edge_iter.next(); @@ -983,7 +981,7 @@ GraphDelayCalc::findLatchEdgeDelays(Edge *edge) Instance *drvr_inst = network_->instance(drvr_pin); debugPrint(debug_, "delay_calc", 2, "find latch D->Q %s", sdc_network_->pathName(drvr_inst)); - array delay_exists = {false, false}; + std::array delay_exists = {false, false}; LoadPinIndexMap load_pin_index_map = makeLoadPinIndexMap(drvr_vertex); bool delay_changed = findDriverEdgeDelays(drvr_vertex, nullptr, edge, arc_delay_calc_, load_pin_index_map, @@ -999,7 +997,7 @@ GraphDelayCalc::findDriverEdgeDelays(Vertex *drvr_vertex, ArcDelayCalc *arc_delay_calc, LoadPinIndexMap &load_pin_index_map, // Return value. - array &delay_exists) + std::array &delay_exists) { Vertex *from_vertex = edge->from(graph_); const TimingArcSet *arc_set = edge->timingArcSet(); @@ -1231,7 +1229,7 @@ GraphDelayCalc::annotateDelaySlew(Edge *edge, float gate_delay1 = delayAsFloat(gate_delay); float prev_gate_delay1 = delayAsFloat(prev_gate_delay); if (prev_gate_delay1 == 0.0 - || (abs(gate_delay1 - prev_gate_delay1) / prev_gate_delay1 + || (std::abs(gate_delay1 - prev_gate_delay1) / prev_gate_delay1 > incremental_delay_tolerance_)) delay_changed = true; graph_->setArcDelay(edge, arc, ap_index, gate_delay); @@ -1660,7 +1658,7 @@ GraphDelayCalc::checkEdgeClkSlew(const Vertex *from_vertex, //////////////////////////////////////////////////////////////// -string +std::string GraphDelayCalc::reportDelayCalc(const Edge *edge, const TimingArc *arc, const Scene *scene, @@ -1673,7 +1671,7 @@ GraphDelayCalc::reportDelayCalc(const Edge *edge, const TimingRole *role = arc->role(); const Instance *inst = network_->instance(to_pin); const TimingArcSet *arc_set = edge->timingArcSet(); - string result; + std::string result; const RiseFall *from_rf = arc->fromEdge()->asRiseFall(); const RiseFall *to_rf = arc->toEdge()->asRiseFall(); if (from_rf && to_rf) { diff --git a/dcalc/LumpedCapDelayCalc.cc b/dcalc/LumpedCapDelayCalc.cc index c3f6a5a0..c9f2985c 100644 --- a/dcalc/LumpedCapDelayCalc.cc +++ b/dcalc/LumpedCapDelayCalc.cc @@ -40,9 +40,6 @@ namespace sta { -using std::string; -using std::isnan; - ArcDelayCalc * makeLumpedCapDelayCalc(StaState *sta) { @@ -146,7 +143,7 @@ LumpedCapDelayCalc::gateDelay(const Pin *drvr_pin, Slew drvr_slew; float in_slew1 = delayAsFloat(in_slew); // NaNs cause seg faults during table lookup. - if (isnan(load_cap) || isnan(delayAsFloat(in_slew))) + if (std::isnan(load_cap) || std::isnan(delayAsFloat(in_slew))) report_->error(1350, "gate delay input variable is NaN"); model->gateDelay(pinPvt(drvr_pin, scene, min_max), in_slew1, load_cap, variables_->pocvEnabled(), @@ -178,7 +175,7 @@ LumpedCapDelayCalc::makeResult(const LibertyLibrary *drvr_library, return dcalc_result; } -string +std::string LumpedCapDelayCalc::reportGateDelay(const Pin *check_pin, const TimingArc *arc, const Slew &in_slew, diff --git a/dcalc/ParallelDelayCalc.cc b/dcalc/ParallelDelayCalc.cc index f18c785d..d4ead20f 100644 --- a/dcalc/ParallelDelayCalc.cc +++ b/dcalc/ParallelDelayCalc.cc @@ -34,8 +34,6 @@ namespace sta { -using std::vector; - ParallelDelayCalc::ParallelDelayCalc(StaState *sta): DelayCalcBase(sta) { @@ -71,8 +69,8 @@ ParallelDelayCalc::gateDelaysParallel(ArcDcalcArgSeq &dcalc_args, ArcDcalcResultSeq dcalc_results(drvr_count); Slew slew_sum = 0.0; ArcDelay load_delay_sum = 0.0; - vector intrinsic_delays(dcalc_args.size()); - vector load_delays(dcalc_args.size()); + std::vector intrinsic_delays(dcalc_args.size()); + std::vector load_delays(dcalc_args.size()); for (size_t drvr_idx = 0; drvr_idx < drvr_count; drvr_idx++) { ArcDcalcArg &dcalc_arg = dcalc_args[drvr_idx]; ArcDcalcResult &dcalc_result = dcalc_results[drvr_idx]; diff --git a/dcalc/PrimaDelayCalc.cc b/dcalc/PrimaDelayCalc.cc index 835d02c6..85175777 100644 --- a/dcalc/PrimaDelayCalc.cc +++ b/dcalc/PrimaDelayCalc.cc @@ -44,9 +44,6 @@ namespace sta { -using std::string; -using std::abs; -using std::make_shared; using Eigen::SparseLU; using Eigen::HouseholderQR; using Eigen::ColPivHouseholderQR; @@ -726,7 +723,7 @@ PrimaDelayCalc::dcalcResults() ThresholdTimes &drvr_times = threshold_times_[drvr_node]; float ref_time = output_waveforms_[drvr_idx]->referenceTime(dcalc_arg.inSlewFlt()); ArcDelay gate_delay = drvr_times[threshold_vth] - ref_time; - Slew drvr_slew = abs(drvr_times[threshold_vh] - drvr_times[threshold_vl]); + Slew drvr_slew = std::abs(drvr_times[threshold_vh] - drvr_times[threshold_vl]); dcalc_result.setGateDelay(gate_delay); dcalc_result.setDrvrSlew(drvr_slew); debugPrint(debug_, "ccs_dcalc", 2, @@ -743,7 +740,7 @@ PrimaDelayCalc::dcalcResults() ThresholdTimes &wire_times = threshold_times_[load_node]; ThresholdTimes &drvr_times = threshold_times_[drvr_node]; ArcDelay wire_delay = wire_times[threshold_vth] - drvr_times[threshold_vth]; - Slew load_slew = abs(wire_times[threshold_vh] - wire_times[threshold_vl]); + Slew load_slew = std::abs(wire_times[threshold_vh] - wire_times[threshold_vl]); debugPrint(debug_, "ccs_dcalc", 2, "load %s %s delay %s slew %s", network_->pathName(load_pin), @@ -908,7 +905,7 @@ PrimaDelayCalc::recordWaveformStep(double time) //////////////////////////////////////////////////////////////// -string +std::string PrimaDelayCalc::reportGateDelay(const Pin *drvr_pin, const TimingArc *arc, const Slew &in_slew, @@ -959,8 +956,8 @@ Waveform PrimaDelayCalc::watchWaveform(const Pin *pin) { FloatSeq &voltages = watch_pin_values_[pin]; - TableAxisPtr time_axis = make_shared(TableAxisVariable::time, - FloatSeq(times_)); + TableAxisPtr time_axis = std::make_shared(TableAxisVariable::time, + FloatSeq(times_)); Table waveform(new FloatSeq(voltages), time_axis); return waveform; } @@ -1003,7 +1000,7 @@ void PrimaDelayCalc::reportMatrix(MatrixSd &matrix) { for (Eigen::Index i = 0; i < matrix.rows(); i++) { - string line = "| "; + std::string line = "| "; for (Eigen::Index j = 0; j < matrix.cols(); j++) { std::string entry = stdstrPrint("%10.3e", matrix.coeff(i, j)); line += entry; diff --git a/dcalc/UnitDelayCalc.cc b/dcalc/UnitDelayCalc.cc index c32197fb..cafcf426 100644 --- a/dcalc/UnitDelayCalc.cc +++ b/dcalc/UnitDelayCalc.cc @@ -28,8 +28,6 @@ namespace sta { -using std::string; - ArcDelayCalc * makeUnitDelayCalc(StaState *sta) { @@ -142,7 +140,7 @@ UnitDelayCalc::unitDelayResult(const LoadPinIndexMap &load_pin_index_map) return dcalc_result; } -string +std::string UnitDelayCalc::reportGateDelay(const Pin *, const TimingArc *, const Slew &, @@ -153,7 +151,7 @@ UnitDelayCalc::reportGateDelay(const Pin *, const MinMax *, int) { - string result("Delay = 1.0\n"); + std::string result("Delay = 1.0\n"); result += "Slew = 0.0\n"; return result; } @@ -170,7 +168,7 @@ UnitDelayCalc::checkDelay(const Pin *, return units_->timeUnit()->scale(); } -string +std::string UnitDelayCalc::reportCheckDelay(const Pin *, const TimingArc *, const Slew &, diff --git a/graph/Graph.cc b/graph/Graph.cc index 9e0b189d..f56a02a7 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -39,8 +39,6 @@ namespace sta { -using std::string; - //////////////////////////////////////////////////////////////// // // Graph @@ -985,12 +983,12 @@ Vertex::setObjectIdx(ObjectIdx idx) object_idx_ = idx; } -string +std::string Vertex::to_string(const StaState *sta) const { const Network *network = sta->sdcNetwork(); if (network->direction(pin_)->isBidirect()) { - string str = network->pathName(pin_); + std::string str = network->pathName(pin_); str += ' '; str += is_bidirect_drvr_ ? "driver" : "load"; return str; @@ -1002,7 +1000,7 @@ Vertex::to_string(const StaState *sta) const const char * Vertex::name(const Network *network) const { - string name = to_string(network); + std::string name = to_string(network); return makeTmpString(name); } @@ -1229,11 +1227,11 @@ Edge::setObjectIdx(ObjectIdx idx) object_idx_ = idx; } -string +std::string Edge::to_string(const StaState *sta) const { const Graph *graph = sta->graph(); - string str = from(graph)->to_string(sta); + std::string str = from(graph)->to_string(sta); str += " -> "; str += to(graph)->to_string(sta); str += " "; diff --git a/liberty/EquivCells.cc b/liberty/EquivCells.cc index f081435b..af81a35e 100644 --- a/liberty/EquivCells.cc +++ b/liberty/EquivCells.cc @@ -38,8 +38,6 @@ namespace sta { -using std::max; - static unsigned hashCell(const LibertyCell *cell); static unsigned diff --git a/liberty/FuncExpr.cc b/liberty/FuncExpr.cc index 38f3faea..0d422d1a 100644 --- a/liberty/FuncExpr.cc +++ b/liberty/FuncExpr.cc @@ -30,8 +30,6 @@ namespace sta { -using std::string; - FuncExpr * FuncExpr::makePort(LibertyPort *port) { @@ -199,20 +197,20 @@ FuncExpr::portTimingSense(const LibertyPort *port) const return TimingSense::unknown; } -string +std::string FuncExpr::to_string() const { return to_string(false); } -string +std::string FuncExpr::to_string(bool with_parens) const { switch (op_) { case Op::port: return port_->name(); case Op::not_: { - string result = "!"; + std::string result = "!"; result += left_ ? left_->to_string(true) : "?"; return result; } @@ -231,12 +229,12 @@ FuncExpr::to_string(bool with_parens) const } } -string +std::string FuncExpr::to_string(bool with_parens, char op) const { - string right = right_->to_string(true); - string result; + std::string right = right_->to_string(true); + std::string result; if (with_parens) result += '('; result += left_ ? left_->to_string(true) : "?"; diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 7510fdcb..130af802 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -50,8 +50,6 @@ namespace sta { -using std::string; - void initLiberty() { @@ -2704,13 +2702,13 @@ LibertyPort::setReceiverModel(ReceiverModelPtr receiver_model) receiver_model_ = receiver_model; } -string +std::string portLibertyToSta(const char *port_name) { constexpr char bus_brkt_left = '['; constexpr char bus_brkt_right = ']'; size_t name_length = strlen(port_name); - string sta_name; + std::string sta_name; for (size_t i = 0; i < name_length; i++) { char ch = port_name[i]; if (ch == bus_brkt_left diff --git a/liberty/LibertyParser.cc b/liberty/LibertyParser.cc index 4660aa42..d85911b7 100644 --- a/liberty/LibertyParser.cc +++ b/liberty/LibertyParser.cc @@ -37,8 +37,6 @@ namespace sta { -using std::string; - void parseLibertyFile(const char *filename, LibertyGroupVisitor *library_visitor, @@ -65,7 +63,7 @@ LibertyParser::LibertyParser(const char *filename, } void -LibertyParser::setFilename(const string &filename) +LibertyParser::setFilename(const std::string &filename) { filename_ = filename; } @@ -253,7 +251,7 @@ LibertyScanner::includeBegin() static const std::regex include_regexp("include_file *\\( *([^)]+) *\\) *;?"); std::cmatch matches; if (std::regex_match(yytext, matches, include_regexp)) { - string filename = matches[1].str(); + std::string filename = matches[1].str(); gzstream::igzstream *stream = new gzstream::igzstream(filename.c_str()); if (stream->is_open()) { yypush_buffer_state(yy_create_buffer(stream, 16384)); @@ -348,7 +346,7 @@ LibertyGroup::deleteSubgroup(const LibertyGroup *subgroup) void LibertyGroup::addDefine(LibertyDefine *define) { - const string &define_name = define->name(); + const std::string &define_name = define->name(); LibertyDefine *prev_define = findKey(define_map_, define_name); if (prev_define) { define_map_.erase(define_name); diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 6c4b757f..2622b1ba 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -25,7 +25,7 @@ #include "LibertyWriter.hh" #include -#include +#include #include "Units.hh" #include "FuncExpr.hh" @@ -39,8 +39,6 @@ namespace sta { -using std::abs; - class LibertyWriter { public: @@ -271,7 +269,7 @@ LibertyWriter::writeBusDcls() fprintf(stream_, " type (\"%s\") {\n", dcl->name().c_str()); fprintf(stream_, " base_type : array;\n"); fprintf(stream_, " data_type : bit;\n"); - fprintf(stream_, " bit_width : %d;\n", abs(dcl->from() - dcl->to() + 1)); + fprintf(stream_, " bit_width : %d;\n", std::abs(dcl->from() - dcl->to() + 1)); fprintf(stream_, " bit_from : %d;\n", dcl->from()); fprintf(stream_, " bit_to : %d;\n", dcl->to()); fprintf(stream_, " }\n"); diff --git a/liberty/LinearModel.cc b/liberty/LinearModel.cc index 1001e74b..552533e6 100644 --- a/liberty/LinearModel.cc +++ b/liberty/LinearModel.cc @@ -29,8 +29,6 @@ namespace sta { -using std::string; - GateLinearModel::GateLinearModel(LibertyCell *cell, float intrinsic, float resistance) : @@ -53,7 +51,7 @@ GateLinearModel::gateDelay(const Pvt *, drvr_slew = 0.0; } -string +std::string GateLinearModel::reportGateDelay(const Pvt *, float, float load_cap, @@ -65,7 +63,7 @@ GateLinearModel::reportGateDelay(const Pvt *, const Unit *time_unit = units->timeUnit(); const Unit *res_unit = units->resistanceUnit(); const Unit *cap_unit = units->capacitanceUnit(); - string result = "Delay = "; + std::string result = "Delay = "; result += time_unit->asString(intrinsic_, digits); result += " + "; result += res_unit->asString(resistance_, digits); @@ -105,7 +103,7 @@ CheckLinearModel::checkDelay(const Pvt *, return intrinsic_; } -string +std::string CheckLinearModel::reportCheckDelay(const Pvt *, float, const char *, @@ -117,7 +115,7 @@ CheckLinearModel::reportCheckDelay(const Pvt *, const LibertyLibrary *library = cell_->libertyLibrary(); const Units *units = library->units(); const Unit *time_unit = units->timeUnit(); - string result = "Check = "; + std::string result = "Check = "; result += time_unit->asString(intrinsic_, digits); return result; } diff --git a/liberty/TableModel.cc b/liberty/TableModel.cc index 977c9b08..b7677e16 100644 --- a/liberty/TableModel.cc +++ b/liberty/TableModel.cc @@ -35,23 +35,17 @@ namespace sta { -using std::string; -using std::min; -using std::max; -using std::abs; -using std::make_shared; - size_t findValueIndex(float value, const FloatSeq *values); static void sigmaModelsDelete(TableModelsEarlyLate &models); -static string +static std::string reportPvt(const LibertyCell *cell, const Pvt *pvt, int digits); static void -appendSpaces(string &result, +appendSpaces(std::string &result, int count); TimingModel::TimingModel(LibertyCell *cell) : @@ -162,14 +156,14 @@ GateTableModel::gateDelay(const Pvt *pvt, gateDelay(pvt, in_slew, load_cap, pocv_enabled, gate_delay, drvr_slew); } -string +std::string GateTableModel::reportGateDelay(const Pvt *pvt, float in_slew, float load_cap, bool pocv_enabled, int digits) const { - string result = reportPvt(cell_, pvt, digits); + std::string result = reportPvt(cell_, pvt, digits); result += reportTableLookup("Delay", pvt, delay_model_.get(), in_slew, load_cap, 0.0, digits); if (pocv_enabled && delay_sigma_models_[EarlyLate::earlyIndex()]) @@ -197,7 +191,7 @@ GateTableModel::reportGateDelay(const Pvt *pvt, return result; } -string +std::string GateTableModel::reportTableLookup(const char *result_name, const Pvt *pvt, const TableModel *model, @@ -496,7 +490,7 @@ CheckTableModel::findValue(const Pvt *pvt, return 0.0; } -string +std::string CheckTableModel::reportCheckDelay(const Pvt *pvt, float from_slew, const char *from_slew_annotation, @@ -505,7 +499,7 @@ CheckTableModel::reportCheckDelay(const Pvt *pvt, bool pocv_enabled, int digits) const { - string result = reportTableDelay("Check", pvt, model_.get(), + std::string result = reportTableDelay("Check", pvt, model_.get(), from_slew, from_slew_annotation, to_slew, related_out_cap, digits); if (pocv_enabled && sigma_models_[EarlyLate::earlyIndex()]) @@ -521,7 +515,7 @@ CheckTableModel::reportCheckDelay(const Pvt *pvt, return result; } -string +std::string CheckTableModel::reportTableDelay(const char *result_name, const Pvt *pvt, const TableModel *model, @@ -535,7 +529,7 @@ CheckTableModel::reportTableDelay(const char *result_name, float axis_value1, axis_value2, axis_value3; findAxisValues(from_slew, to_slew, related_out_cap, axis_value1, axis_value2, axis_value3); - string result = reportPvt(cell_, pvt, digits); + std::string result = reportPvt(cell_, pvt, digits); result += model_->reportValue(result_name, cell_, pvt, axis_value1, from_slew_annotation, axis_value2, axis_value3, @@ -735,7 +729,7 @@ TableModel::scaleFactor(const LibertyCell *cell, rf_index_, cell, pvt); } -string +std::string TableModel::reportValue(const char *result_name, const LibertyCell *cell, const Pvt *pvt, @@ -746,7 +740,7 @@ TableModel::reportValue(const char *result_name, const Unit *table_unit, int digits) const { - string result = table_->reportValue("Table value", cell, pvt, value1, + std::string result = table_->reportValue("Table value", cell, pvt, value1, comment1, value2, value3, table_unit, digits); result += reportPvtScaleFactor(cell, pvt, digits); @@ -758,7 +752,7 @@ TableModel::reportValue(const char *result_name, return result; } -static string +static std::string reportPvt(const LibertyCell *cell, const Pvt *pvt, int digits) @@ -767,7 +761,7 @@ reportPvt(const LibertyCell *cell, if (pvt == nullptr) pvt = library->defaultOperatingConditions(); if (pvt) { - string result; + std::string result; stringPrint(result, "P = %.*f V = %.*f T = %.*f\n", digits, pvt->process(), digits, pvt->voltage(), @@ -777,7 +771,7 @@ reportPvt(const LibertyCell *cell, return ""; } -string +std::string TableModel::reportPvtScaleFactor(const LibertyCell *cell, const Pvt *pvt, int digits) const @@ -785,7 +779,7 @@ TableModel::reportPvtScaleFactor(const LibertyCell *cell, if (pvt == nullptr) pvt = cell->libertyLibrary()->defaultOperatingConditions(); if (pvt) { - string result; + std::string result; stringPrint(result, "PVT scale factor = %.*f\n", digits, scaleFactor(cell, pvt)); @@ -1166,7 +1160,7 @@ Table::reportValueOrder0(const char *result_name, const Unit *table_unit, int digits) const { - string result = result_name; + std::string result = result_name; result += " constant = "; result += table_unit->asString(value_, digits); if (comment1) @@ -1187,7 +1181,7 @@ Table::reportValueOrder1(const char *result_name, { const Units *units = cell->libertyLibrary()->units(); const Unit *unit1 = axis1_->unit(units); - string result = "Table is indexed by\n "; + std::string result = "Table is indexed by\n "; result += axis1_->variableString(); result += " = "; result += unit1->asString(value1, digits); @@ -1228,7 +1222,7 @@ Table::reportValueOrder2(const char *result_name, const Units *units = cell->libertyLibrary()->units(); const Unit *unit1 = axis1_->unit(units); const Unit *unit2 = axis2_->unit(units); - string result = "------- "; + std::string result = "------- "; result += axis1_->variableString(); result += " = "; result += unit1->asString(value1, digits); @@ -1289,7 +1283,7 @@ Table::reportValueOrder3(const char *result_name, const Unit *unit1 = axis1_->unit(units); const Unit *unit2 = axis2_->unit(units); const Unit *unit3 = axis3_->unit(units); - string result = " --------- "; + std::string result = " --------- "; result += axis1_->variableString(); result += " = "; result += unit1->asString(value1, digits); @@ -1391,7 +1385,7 @@ Table::report(const Units *units, const Unit *unit1 = axis1_->unit(units); report->reportLine("%s", tableVariableString(axis1_->variable())); report->reportLine("------------------------------"); - string line; + std::string line; for (size_t index1 = 0; index1 < axis1_->size(); index1++) { line += unit1->asString(axis1_->axisValue(index1), digits); line += " "; @@ -1410,7 +1404,7 @@ Table::report(const Units *units, const Unit *unit2 = axis2_->unit(units); report->reportLine("%s", tableVariableString(axis2_->variable())); report->reportLine(" ------------------------------"); - string line = " "; + std::string line = " "; for (size_t index2 = 0; index2 < axis2_->size(); index2++) { line += unit2->asString(axis2_->axisValue(index2), digits); line += " "; @@ -1436,7 +1430,7 @@ Table::report(const Units *units, unit1->asString(axis1_->axisValue(axis_index1), digits)); report->reportLine("%s", tableVariableString(axis3_->variable())); report->reportLine(" ------------------------------"); - string line = " "; + std::string line = " "; for (size_t axis_index3 = 0; axis_index3 < axis3_->size(); axis_index3++) { line += unit3->asString(axis3_->axisValue(axis_index3), digits); line += " "; @@ -1455,7 +1449,7 @@ Table::report(const Units *units, } static void -appendSpaces(string &result, +appendSpaces(std::string &result, int count) { while (count--) @@ -1755,7 +1749,7 @@ OutputWaveforms::findVoltages(size_t wave_index, // Make voltage -> current table. FloatSeq axis_volts = volts; TableAxisPtr volt_axis = - make_shared(TableAxisVariable::input_voltage, std::move(axis_volts)); + std::make_shared(TableAxisVariable::input_voltage, std::move(axis_volts)); FloatSeq *currents1 = new FloatSeq(*currents->values()); Table *volt_currents = new Table(currents1, volt_axis); voltage_currents_[wave_index] = volt_currents; @@ -1774,7 +1768,7 @@ OutputWaveforms::currentWaveform(float slew, times->push_back(time); currents->push_back(current); } - TableAxisPtr time_axis = make_shared(TableAxisVariable::time, std::move(*times)); + TableAxisPtr time_axis = std::make_shared(TableAxisVariable::time, std::move(*times)); delete times; return Table(currents, time_axis); } @@ -1951,7 +1945,7 @@ OutputWaveforms::voltageWaveform(float slew, times.push_back(time); volts.push_back(volt); } - TableAxisPtr time_axis = make_shared(TableAxisVariable::time, + TableAxisPtr time_axis = std::make_shared(TableAxisVariable::time, std::move(times)); return Table(std::move(volts), time_axis); } @@ -2076,7 +2070,7 @@ OutputWaveforms::voltageCurrentWaveform(float slew, currents->push_back(current); } TableAxisPtr volt_axis = - make_shared(TableAxisVariable::input_voltage, std::move(*volts)); + std::make_shared(TableAxisVariable::input_voltage, std::move(*volts)); delete volts; return Table(currents, volt_axis); } @@ -2095,12 +2089,12 @@ OutputWaveforms::finalResistance() const FloatSeq &voltages = voltage_currents->axis1()->values(); FloatSeq *currents = voltage_currents->values(); size_t idx_last1 = voltages.size() - 2; - return (vdd_ - voltages[idx_last1]) / abs((*currents)[idx_last1]); + return (vdd_ - voltages[idx_last1]) / std::abs((*currents)[idx_last1]); } //////////////////////////////////////////////////////////////// -DriverWaveform::DriverWaveform(const string &name, +DriverWaveform::DriverWaveform(const std::string &name, TablePtr waveforms) : name_(name), waveforms_(waveforms) @@ -2118,7 +2112,7 @@ DriverWaveform::waveform(float slew) time_values->push_back(time); volt_values->push_back(volt); } - TableAxisPtr time_axis = make_shared(TableAxisVariable::time, + TableAxisPtr time_axis = std::make_shared(TableAxisVariable::time, std::move(*time_values)); delete time_values; Table waveform(volt_values, time_axis); diff --git a/liberty/TimingArc.cc b/liberty/TimingArc.cc index 1f1ea2c1..7bc324a6 100644 --- a/liberty/TimingArc.cc +++ b/liberty/TimingArc.cc @@ -35,9 +35,6 @@ namespace sta { -using std::string; -using std::make_shared; - static bool timingArcsEquiv(const TimingArcSet *set1, const TimingArcSet *set2); @@ -511,7 +508,7 @@ TimingArcSet::wireArcIndex(const RiseFall *rf) void TimingArcSet::init() { - wire_timing_arc_attrs_ = make_shared(TimingSense::positive_unate); + wire_timing_arc_attrs_ = std::make_shared(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); @@ -549,18 +546,18 @@ TimingArc::~TimingArc() delete scaled_models_; } -string +std::string TimingArc::to_string() const { if (set_->role()->isWire()) { - string str = "wire "; + std::string str = "wire "; str += from_rf_->to_string(); str += " -> "; str += to_rf_->to_string(); return str; } else { - string str = set_->from()->name(); + std::string str = set_->from()->name(); str += " "; str += from_rf_->to_string(); str += " -> "; diff --git a/liberty/Units.cc b/liberty/Units.cc index 97e33309..9cbb4631 100644 --- a/liberty/Units.cc +++ b/liberty/Units.cc @@ -32,9 +32,6 @@ namespace sta { -using std::abs; - - Unit::Unit(const char *suffix) : scale_(1.0), suffix_(suffix), @@ -175,12 +172,12 @@ Unit::asString(float value, int digits) const { // Special case INF because it blows up otherwise. - if (abs(value) >= INF * .1) + if (std::abs(value) >= INF * .1) return (value > 0.0) ? "INF" : "-INF"; else { float scaled_value = value / scale_; // prevent "-0.00" on slowaris - if (abs(scaled_value) < 1E-6) + if (std::abs(scaled_value) < 1E-6) scaled_value = 0.0; return stringPrintTmp("%.*f", digits, scaled_value); } diff --git a/network/ConcreteLibrary.cc b/network/ConcreteLibrary.cc index 0ecba436..a1fb2b50 100644 --- a/network/ConcreteLibrary.cc +++ b/network/ConcreteLibrary.cc @@ -24,6 +24,7 @@ #include "ConcreteLibrary.hh" +#include #include #include @@ -35,13 +36,6 @@ namespace sta { -using std::string; -using std::map; -using std::min; -using std::max; -using std::abs; -using std::swap; - static constexpr char escape_ = '\\'; ConcreteLibrary::ConcreteLibrary(const char *name, @@ -228,7 +222,7 @@ ConcreteCell::makeBusPortBit(ConcretePort *bus_port, const char *bus_name, int bit_index) { - string bit_name; + std::string bit_name; stringPrint(bit_name, "%s%c%d%c", bus_name, library_->busBrktLeft(), @@ -272,14 +266,14 @@ ConcreteCell::setIsLeaf(bool is_leaf) } void -ConcreteCell::setAttribute(const string &key, - const string &value) +ConcreteCell::setAttribute(const std::string &key, + const std::string &value) { attribute_map_[key] = value; } -string -ConcreteCell::getAttribute(const string &key) const +std::string +ConcreteCell::getAttribute(const std::string &key) const { const auto &itr = attribute_map_.find(key); if (itr != attribute_map_.end()) @@ -350,8 +344,8 @@ void BusPort::addBusBit(ConcretePort *port, int index) { - from_ = min(from_, index); - to_ = max(to_, index); + from_ = std::min(from_, index); + to_ = std::max(to_, index); members_.push_back(port); } @@ -362,7 +356,7 @@ ConcreteCell::groupBusPorts(const char bus_brkt_left, { const char bus_brkts_left[2]{bus_brkt_left, '\0'}; const char bus_brkts_right[2]{bus_brkt_right, '\0'}; - map bus_map; + std::map bus_map; // Find ungrouped bus ports. // Remove bus bit ports from the ports_ vector during the scan by // keeping an index to the next insertion index and skipping over @@ -372,7 +366,7 @@ ConcreteCell::groupBusPorts(const char bus_brkt_left, for (ConcretePort *port : ports) { const char *port_name = port->name(); bool is_bus; - string bus_name; + std::string bus_name; int index; parseBusName(port_name, bus_brkts_left, bus_brkts_right, escape_, is_bus, bus_name, index); @@ -402,7 +396,7 @@ ConcreteCell::groupBusPorts(const char bus_brkt_left, (*members)[member_index] = bus_bit; } if (msb_first) - swap(from, to); + std::swap(from, to); ConcretePort *port = makeBusPort(bus_name.c_str(), from, to, members); port->setDirection(bus_port.direction()); } @@ -505,7 +499,7 @@ int ConcretePort::size() const { if (is_bus_) - return abs(to_index_ - from_index_) + 1; + return std::abs(to_index_ - from_index_) + 1; else if (is_bundle_) return static_cast(member_ports_->size()); else diff --git a/network/ConcreteNetwork.cc b/network/ConcreteNetwork.cc index 57c419b9..22fd122d 100644 --- a/network/ConcreteNetwork.cc +++ b/network/ConcreteNetwork.cc @@ -35,8 +35,6 @@ namespace sta { -using std::string; - static void makeChildNetwork(Instance *proto, Instance *parent, @@ -581,8 +579,8 @@ ConcreteNetwork::setIsLeaf(Cell *cell, void ConcreteNetwork::setAttribute(Cell *cell, - const string &key, - const string &value) + const std::string &key, + const std::string &value) { ConcreteCell *ccell = reinterpret_cast(cell); ccell->setAttribute(key, value); @@ -628,9 +626,9 @@ ConcreteNetwork::filename(const Cell *cell) return ccell->filename(); } -string +std::string ConcreteNetwork::getAttribute(const Cell *cell, - const string &key) const + const std::string &key) const { const ConcreteCell *ccell = reinterpret_cast(cell); return ccell->getAttribute(key); @@ -967,9 +965,9 @@ ConcreteNetwork::id(const Instance *instance) const return inst->id(); } -string +std::string ConcreteNetwork::getAttribute(const Instance *inst, - const string &key) const + const std::string &key) const { const ConcreteInstance *cinst = reinterpret_cast(inst); return cinst->getAttribute(key); @@ -1389,8 +1387,8 @@ ConcreteNetwork::connect(Instance *inst, void ConcreteNetwork::setAttribute(Instance *inst, - const string &key, - const string &value) + const std::string &key, + const std::string &value) { ConcreteInstance *cinst = reinterpret_cast(inst); cinst->setAttribute(key, value); @@ -1718,14 +1716,14 @@ ConcreteInstance::childIterator() const } void -ConcreteInstance::setAttribute(const string &key, - const string &value) +ConcreteInstance::setAttribute(const std::string &key, + const std::string &value) { attribute_map_[key] = value; } -string -ConcreteInstance::getAttribute(const string &key) const +std::string +ConcreteInstance::getAttribute(const std::string &key) const { const auto &itr = attribute_map_.find(key); if (itr != attribute_map_.end()) diff --git a/network/Network.cc b/network/Network.cc index 3b6bad62..78e13b1e 100644 --- a/network/Network.cc +++ b/network/Network.cc @@ -37,8 +37,6 @@ namespace sta { -using std::string; - Network::Network() : default_liberty_(nullptr), divider_('/'), @@ -76,7 +74,7 @@ Network::findPortsMatching(const Cell *cell, { PortSeq matches; bool is_bus, is_range, subscript_wild; - string bus_name; + std::string bus_name; int from, to; parseBusName(pattern->pattern(), '[', ']', '\\', is_bus, is_range, bus_name, from, to, subscript_wild); @@ -1043,12 +1041,12 @@ Network::findInstPinsHierMatching(const Instance *instance, // Return value. PinSeq &matches) const { - string inst_name = name(instance); + std::string inst_name = name(instance); InstancePinIterator *pin_iter = pinIterator(instance); while (pin_iter->hasNext()) { const Pin *pin = pin_iter->next(); const char *port_name = name(port(pin)); - string pin_name = inst_name + divider_ + port_name; + std::string pin_name = inst_name + divider_ + port_name; if (pattern->match(pin_name.c_str())) matches.push_back(pin); } diff --git a/network/ParseBus.cc b/network/ParseBus.cc index 17108412..c3dae9e5 100644 --- a/network/ParseBus.cc +++ b/network/ParseBus.cc @@ -32,8 +32,6 @@ namespace sta { -using std::string; - bool isBusName(const char *name, const char brkt_left, @@ -60,7 +58,7 @@ parseBusName(const char *name, const char escape, // Return values. bool &is_bus, - string &bus_name, + std::string &bus_name, int &index) { const char brkts_left[2] = {brkt_left, '\0'}; @@ -76,7 +74,7 @@ parseBusName(const char *name, char escape, // Return values. bool &is_bus, - string &bus_name, + std::string &bus_name, int &index) { is_bus = false; @@ -110,7 +108,7 @@ parseBusName(const char *name, // Return values. bool &is_bus, bool &is_range, - string &bus_name, + std::string &bus_name, int &from, int &to, bool &subscript_wild) @@ -129,7 +127,7 @@ parseBusName(const char *name, // Return values. bool &is_bus, bool &is_range, - string &bus_name, + std::string &bus_name, int &from, int &to, bool &subscript_wild) @@ -173,13 +171,13 @@ parseBusName(const char *name, } } -string +std::string escapeChars(const char *token, const char ch1, const char ch2, const char escape) { - string escaped; + std::string escaped; for (const char *s = token; *s; s++) { char ch = *s; if (ch == escape) { diff --git a/network/SdcNetwork.cc b/network/SdcNetwork.cc index 29a0037e..0495f943 100644 --- a/network/SdcNetwork.cc +++ b/network/SdcNetwork.cc @@ -30,13 +30,10 @@ namespace sta { -using std::string; -using std::to_string; - -static string +static std::string escapeDividers(const char *token, const Network *network); -static string +static std::string escapeBrackets(const char *token, const Network *network); @@ -137,9 +134,9 @@ NetworkNameAdapter::id(const Cell *cell) const return network_->id(cell); } -string +std::string NetworkNameAdapter::getAttribute(const Cell *cell, - const string &key) const + const std::string &key) const { return network_->getAttribute(cell, key); } @@ -355,9 +352,9 @@ NetworkNameAdapter::cell(const Instance *instance) const return network_->cell(instance); } -string +std::string NetworkNameAdapter::getAttribute(const Instance *inst, - const string &key) const + const std::string &key) const { return network_->getAttribute(inst, key); } @@ -675,16 +672,16 @@ SdcNetwork::findPort(const Cell *cell, if (port == nullptr) { // Look for matches after escaping brackets. bool is_bus; - string bus_name; + std::string bus_name; int index; parseBusName(name, '[', ']', pathEscape(), is_bus, bus_name, index); if (is_bus) { - string escaped1 = escapeBrackets(name, this); + std::string escaped1 = escapeBrackets(name, this); port = network_->findPort(cell, escaped1.c_str()); if (port == nullptr) { // Try escaping base foo\[0\][1] - string escaped2; - string escaped_bus_name = escapeBrackets(bus_name.c_str(), this); + std::string escaped2; + std::string escaped_bus_name = escapeBrackets(bus_name.c_str(), this); stringPrint(escaped2, "%s[%d]", escaped_bus_name.c_str(), index); @@ -693,7 +690,7 @@ SdcNetwork::findPort(const Cell *cell, } else { // Try escaping brackets foo\[0\].bar - string escaped = escapeBrackets(name, this); + std::string escaped = escapeBrackets(name, this); port = network_->findPort(cell, escaped.c_str()); } } @@ -708,19 +705,19 @@ SdcNetwork::findPortsMatching(const Cell *cell, if (matches.empty()) { // Look for matches after escaping brackets. bool is_bus; - string bus_name; + std::string bus_name; int index; parseBusName(pattern->pattern(), '[', ']', pathEscape(), is_bus, bus_name, index); if (is_bus) { - string escaped1 = escapeBrackets(pattern->pattern(), this); + std::string escaped1 = escapeBrackets(pattern->pattern(), this); PatternMatch escaped_pattern1(escaped1.c_str(), pattern); matches = network_->findPortsMatching(cell, &escaped_pattern1); if (matches.empty()) { // Try escaping base foo\[0\][1] - string escaped_name = escapeBrackets(bus_name.c_str(), this); + std::string escaped_name = escapeBrackets(bus_name.c_str(), this); escaped_name += '['; - escaped_name += to_string(index); + escaped_name += std::to_string(index); escaped_name += ']'; PatternMatch escaped_pattern2(escaped_name.c_str(), pattern); matches = network_->findPortsMatching(cell, &escaped_pattern2); @@ -728,7 +725,7 @@ SdcNetwork::findPortsMatching(const Cell *cell, } else { // Try escaping brackets foo\[0\].bar - string escaped = escapeBrackets(pattern->pattern(), this); + std::string escaped = escapeBrackets(pattern->pattern(), this); PatternMatch escaped_pattern(escaped.c_str(), pattern); matches = network_->findPortsMatching(cell, &escaped_pattern); } @@ -796,7 +793,7 @@ SdcNetwork::findInstance(const char *path_name) const parent = network_->topInstance(); Instance *child = findChild(parent, child_name); if (child == nullptr) { - string escaped_name = escapeDividers(child_name, this); + std::string escaped_name = escapeDividers(child_name, this); child = findChild(parent, escaped_name.c_str()); } return child; @@ -808,10 +805,10 @@ SdcNetwork::findInstanceRelative(const Instance *inst, { Instance *inst1 = network_->findInstanceRelative(inst, path_name); if (inst1 == nullptr) { - string path_name1 = escapeBrackets(path_name, this); + std::string path_name1 = escapeBrackets(path_name, this); inst1 = network_->findInstanceRelative(inst, path_name1.c_str()); if (inst1 == nullptr) { - string path_name2 = escapeDividers(path_name1.c_str(), network_); + std::string path_name2 = escapeDividers(path_name1.c_str(), network_); inst1 = network_->findInstanceRelative(inst, path_name2.c_str()); } } @@ -848,7 +845,7 @@ SdcNetwork::findChild(const Instance *parent, { Instance *child = network_->findChild(parent, name); if (child == nullptr) { - string escaped = escapeBrackets(name, this); + std::string escaped = escapeBrackets(name, this); child = network_->findChild(parent, escaped.c_str()); } return child; @@ -873,8 +870,8 @@ SdcNetwork::findNet(const Instance *instance, { Net *net = network_->findNet(instance, net_name); if (net == nullptr) { - string net_name1 = escapeBrackets(net_name, this); - string net_name2 = escapeDividers(net_name1.c_str(), network_); + std::string net_name1 = escapeBrackets(net_name, this); + std::string net_name2 = escapeDividers(net_name1.c_str(), network_); net = network_->findNet(instance, net_name2.c_str()); } return net; @@ -886,15 +883,15 @@ SdcNetwork::findNetRelative(const Instance *inst, { Net *net = network_->findNetRelative(inst, path_name); if (net == nullptr) { - string path_name1 = escapeDividers(path_name, network_); + std::string path_name1 = escapeDividers(path_name, network_); net = network_->findNetRelative(inst, path_name1.c_str()); if (net == nullptr) { - string path_name2 = escapeBrackets(path_name, network_); + std::string path_name2 = escapeBrackets(path_name, network_); net = network_->findNetRelative(inst, path_name2.c_str()); if (net == nullptr) { - string path_name3 = escapeDividers(path_name2.c_str(), network_); + std::string path_name3 = escapeDividers(path_name2.c_str(), network_); net = network_->findNetRelative(inst, path_name3.c_str()); } } @@ -926,12 +923,12 @@ SdcNetwork::findInstNetsMatching(const Instance *instance, network_->findInstNetsMatching(instance, pattern, matches); if (matches.empty()) { // Look for matches after escaping path dividers. - string escaped_pattern = escapeDividers(pattern->pattern(), this); + std::string escaped_pattern = escapeDividers(pattern->pattern(), this); const PatternMatch escaped_dividers(escaped_pattern.c_str(), pattern); network_->findInstNetsMatching(instance, &escaped_dividers, matches); if (matches.empty()) { // Look for matches after escaping brackets. - string escaped_pattern2 = escapeBrackets(pattern->pattern(),this); + std::string escaped_pattern2 = escapeBrackets(pattern->pattern(),this); const PatternMatch escaped_brkts(escaped_pattern2.c_str(), pattern); network_->findInstNetsMatching(instance, &escaped_brkts, matches); } @@ -959,24 +956,24 @@ SdcNetwork::findPin(const Instance *instance, if (pin == nullptr) { // Look for match after escaping brackets. bool is_bus; - string bus_name; + std::string bus_name; int index; parseBusName(port_name, '[', ']', pathEscape(), is_bus, bus_name, index); if (is_bus) { - string escaped1 = escapeBrackets(port_name, this); + std::string escaped1 = escapeBrackets(port_name, this); pin = network_->findPin(instance, escaped1.c_str()); if (pin == nullptr) { // Try escaping base foo\[0\][1] - string escaped_bus_name = escapeBrackets(bus_name.c_str(), this); - string escaped2; + std::string escaped_bus_name = escapeBrackets(bus_name.c_str(), this); + std::string escaped2; stringPrint(escaped2, "%s[%d]", escaped_bus_name.c_str(), index); pin = network_->findPin(instance, escaped2.c_str()); } } else { // Try escaping port brackets foo\[0\].bar - string escaped = escapeBrackets(port_name, this); + std::string escaped = escapeBrackets(port_name, this); pin = network_->findPin(instance, escaped.c_str()); } } @@ -1028,7 +1025,7 @@ SdcNetwork::visitPinTail(const Instance *instance, if (network_->hasMembers(port)) { bool bus_matches = tail->match(port_name); if (!bus_matches) { - string escaped_name = escapeDividers(port_name, network_); + std::string escaped_name = escapeDividers(port_name, network_); bus_matches = tail->match(escaped_name); } PortMemberIterator *member_iter = network_->memberIterator(port); @@ -1044,7 +1041,7 @@ SdcNetwork::visitPinTail(const Instance *instance, const char *member_name = network_->name(member_port); bool member_matches = tail->match(member_name); if (!member_matches) { - string escaped_name = escapeDividers(member_name, network_); + std::string escaped_name = escapeDividers(member_name, network_); member_matches = tail->match(escaped_name); } if (member_matches) { @@ -1059,7 +1056,7 @@ SdcNetwork::visitPinTail(const Instance *instance, else { bool port_matches = tail->match(port_name); if (!port_matches) { - string escaped_name = escapeDividers(port_name, network_); + std::string escaped_name = escapeDividers(port_name, network_); port_matches = tail->match(escaped_name); } if (port_matches) { @@ -1081,7 +1078,7 @@ SdcNetwork::makeInstance(LibertyCell *cell, const char *name, Instance *parent) { - string escaped_name = escapeDividers(name, this); + std::string escaped_name = escapeDividers(name, this); return network_edit_->makeInstance(cell, escaped_name.c_str(), parent); } @@ -1089,7 +1086,7 @@ Net * SdcNetwork::makeNet(const char *name, Instance *parent) { - string escaped_name = escapeDividers(name, this); + std::string escaped_name = escapeDividers(name, this); return network_edit_->makeNet(escaped_name.c_str(), parent); } @@ -1188,7 +1185,7 @@ SdcNetwork::parsePath(const char *path, else *p++ = ch; if (p - inst_path + 1 > inst_path_length) - report_->critical(1500, "inst path string lenth estimate busted"); + report_->critical(1500, "inst path std::string lenth estimate busted"); } *p = '\0'; stringDelete(inst_path); @@ -1235,7 +1232,7 @@ SdcNetwork::visitMatches(const Instance *parent, network_->findChildrenMatching(parent, &matcher, matches); if (has_brkts && matches.empty()) { // Look for matches after escaping brackets. - string escaped_brkts = escapeBrackets(inst_path, this); + std::string escaped_brkts = escapeBrackets(inst_path, this); const PatternMatch escaped_pattern(escaped_brkts, pattern); network_->findChildrenMatching(parent, &escaped_pattern, matches); } @@ -1257,7 +1254,7 @@ SdcNetwork::visitMatches(const Instance *parent, *p++ = ch; } if (p - inst_path + 1 > inst_path_length) - report_->critical(1501, "inst path string lenth estimate exceeded"); + report_->critical(1501, "inst path std::string lenth estimate exceeded"); } *p = '\0'; if (!found_match) { @@ -1265,7 +1262,7 @@ SdcNetwork::visitMatches(const Instance *parent, found_match |= visit_tail(parent, &tail_pattern); if (!found_match && has_brkts) { // Look for matches after escaping brackets. - string escaped_path = escapeBrackets(inst_path, this); + std::string escaped_path = escapeBrackets(inst_path, this); const PatternMatch escaped_tail(escaped_path, pattern); found_match |= visit_tail(parent, &escaped_tail); } @@ -1276,7 +1273,7 @@ SdcNetwork::visitMatches(const Instance *parent, //////////////////////////////////////////////////////////////// -static string +static std::string escapeDividers(const char *token, const Network *network) { @@ -1284,7 +1281,7 @@ escapeDividers(const char *token, network->pathEscape()); } -static string +static std::string escapeBrackets(const char *token, const Network *network) { diff --git a/network/VerilogNamespace.cc b/network/VerilogNamespace.cc index 5a1dc8e0..5362d115 100644 --- a/network/VerilogNamespace.cc +++ b/network/VerilogNamespace.cc @@ -31,39 +31,37 @@ namespace sta { -using std::string; - constexpr char verilog_escape = '\\'; -static string +static std::string staToVerilog(const char *sta_name); -static string +static std::string staToVerilog2(const char *sta_name); -static string -verilogToSta(const string *verilog_name); +static std::string +verilogToSta(const std::string *verilog_name); -string +std::string cellVerilogName(const char *sta_name) { return staToVerilog(sta_name); } -string +std::string instanceVerilogName(const char *sta_name) { return staToVerilog(sta_name); } -string +std::string netVerilogName(const char *sta_name) { bool is_bus; - string bus_name; + std::string bus_name; int index; parseBusName(sta_name, '[', ']', verilog_escape, is_bus, bus_name, index); if (is_bus) { - string bus_vname = staToVerilog(bus_name.c_str()); - string vname; + std::string bus_vname = staToVerilog(bus_name.c_str()); + std::string vname; stringPrint(vname, "%s[%d]", bus_vname.c_str(), index); return vname; } @@ -71,19 +69,19 @@ netVerilogName(const char *sta_name) return staToVerilog2(sta_name); } -string +std::string portVerilogName(const char *sta_name) { return staToVerilog2(sta_name); } -static string +static std::string staToVerilog(const char *sta_name) { // Leave room for leading escape and trailing space if the name // needs to be escaped. // Assume the name has to be escaped and start copying while scanning. - string escaped_name = "\\"; + std::string escaped_name = "\\"; bool escaped = false; for (const char *s = sta_name; *s ; s++) { char ch = s[0]; @@ -110,17 +108,17 @@ staToVerilog(const char *sta_name) return escaped_name; } else - return string(sta_name); + return std::string(sta_name); } -static string +static std::string staToVerilog2(const char *sta_name) { constexpr char bus_brkt_left = '['; constexpr char bus_brkt_right = ']'; // Leave room for leading escape and trailing space if the name // needs to be escaped. - string escaped_name = "\\"; + std::string escaped_name = "\\"; // Assume the name has to be escaped and start copying while scanning. bool escaped = false; for (const char *s = sta_name; *s ; s++) { @@ -150,37 +148,37 @@ staToVerilog2(const char *sta_name) return escaped_name; } else - return string(sta_name); + return std::string(sta_name); } //////////////////////////////////////////////////////////////// -string -moduleVerilogToSta(const string *module_name) +std::string +moduleVerilogToSta(const std::string *module_name) { return verilogToSta(module_name); } -string -instanceVerilogToSta(const string *inst_name) +std::string +instanceVerilogToSta(const std::string *inst_name) { return verilogToSta(inst_name); } -string -netVerilogToSta(const string *net_name) +std::string +netVerilogToSta(const std::string *net_name) { return verilogToSta(net_name); } -string -portVerilogToSta(const string *port_name) +std::string +portVerilogToSta(const std::string *port_name) { return verilogToSta(port_name); } -static string -verilogToSta(const string *verilog_name) +static std::string +verilogToSta(const std::string *verilog_name) { if (verilog_name->front() == '\\') { constexpr char divider = '/'; @@ -190,7 +188,7 @@ verilogToSta(const string *verilog_name) size_t verilog_name_length = verilog_name->size(); if (isspace(verilog_name->back())) verilog_name_length--; - string sta_name; + std::string sta_name; // Ignore leading '\'. for (size_t i = 1; i < verilog_name_length; i++) { char ch = verilog_name->at(i); @@ -205,7 +203,7 @@ verilogToSta(const string *verilog_name) return sta_name; } else - return string(*verilog_name); + return std::string(*verilog_name); } } // namespace diff --git a/parasitics/ConcreteParasitics.cc b/parasitics/ConcreteParasitics.cc index dd866664..f6a156ff 100644 --- a/parasitics/ConcreteParasitics.cc +++ b/parasitics/ConcreteParasitics.cc @@ -45,8 +45,6 @@ namespace sta { -using std::max; - ConcreteParasitic::~ConcreteParasitic() { } @@ -620,7 +618,7 @@ ConcreteParasiticNetwork::ensureParasiticNode(const Net *net, node = new ConcreteParasiticNode(net, id, network->highestNetAbove(net1) != net_); sub_nodes_[net_id] = node; if (net == net_) - max_node_id_ = max((int) max_node_id_, id); + max_node_id_ = std::max((int) max_node_id_, id); } else node = id_node->second; diff --git a/parasitics/ReduceParasitics.cc b/parasitics/ReduceParasitics.cc index 1650f8e3..311ef35c 100644 --- a/parasitics/ReduceParasitics.cc +++ b/parasitics/ReduceParasitics.cc @@ -24,6 +24,7 @@ #include "ReduceParasitics.hh" +#include #include #include @@ -38,8 +39,6 @@ namespace sta { -using std::max; - typedef std::map ParasiticNodeValueMap; typedef std::map ResistorCurrentMap; typedef std::set ParasiticResistorSet; @@ -174,7 +173,7 @@ ReduceToPi::reducePiDfs(const Pin *drvr_pin, + pinCapacitance(node); y1 = dwn_cap; y2 = y3 = 0.0; - max_resistance = max(max_resistance, src_resistance); + max_resistance = std::max(max_resistance, src_resistance); visit(node); ParasiticResistorSeq &resistors = resistor_map_[node]; diff --git a/parasitics/SpefReader.cc b/parasitics/SpefReader.cc index b27efe6c..7d0751f8 100644 --- a/parasitics/SpefReader.cc +++ b/parasitics/SpefReader.cc @@ -43,8 +43,6 @@ namespace sta { -using std::string; - bool readSpefFile(const std::string &filename, Instance *instance, @@ -616,7 +614,7 @@ SpefTriple::value(int index) const //////////////////////////////////////////////////////////////// SpefScanner::SpefScanner(std::istream *stream, - const string &filename, + const std::string &filename, SpefReader *reader, Report *report) : yyFlexLexer(stream), diff --git a/power/Power.cc b/power/Power.cc index 2faaef23..f0b590fa 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -72,13 +72,6 @@ namespace sta { -using std::abs; -using std::max; -using std::min; -using std::isnormal; -using std::vector; -using std::map; - static bool isPositiveUnate(const LibertyCell *cell, const LibertyPort *from, @@ -734,7 +727,7 @@ percentChange(float value, return 1.0; } else - return abs(value - prev) / prev; + return std::abs(value - prev) / prev; } // Return true if the activity changed. @@ -1837,7 +1830,7 @@ Power::clockMinPeriod(const Sdc *sdc) if (!clks.empty()) { float min_period = INF; for (const Clock *clk : clks) - min_period = min(min_period, clk->period()); + min_period = std::min(min_period, clk->period()); return min_period; } else @@ -1963,7 +1956,7 @@ PwrActivity::check() // Densities can get very small from multiplying probabilities // through deep chains of logic. Clip them to prevent floating // point anomalies. - if (abs(density_) < min_density) + if (std::abs(density_) < min_density) density_ = 0.0; } diff --git a/power/SaifReader.cc b/power/SaifReader.cc index 3a758ba2..bd62602a 100644 --- a/power/SaifReader.cc +++ b/power/SaifReader.cc @@ -26,6 +26,7 @@ #include #include +#include #include "Error.hh" #include "Debug.hh" @@ -42,9 +43,6 @@ namespace sta { -using std::string; -using std::min; - bool readSaif(const char *filename, const char *scope, @@ -129,9 +127,9 @@ SaifReader::instancePush(const char *instance_name) // Check for a match to the annotation scope. saif_scope_.push_back(instance_name); - string saif_scope; + std::string saif_scope; bool first = true; - for (string &inst : saif_scope_) { + for (std::string &inst : saif_scope_) { if (!first) saif_scope += sdc_network_->pathDivider(); saif_scope += inst; @@ -167,7 +165,7 @@ SaifReader::setNetDurations(const char *net_name, if (in_scope_level_ > 0) { Instance *parent = path_.empty() ? sdc_network_->topInstance() : path_.back(); if (parent) { - string unescaped_name = unescaped(net_name); + std::string unescaped_name = unescaped(net_name); const Pin *pin = sdc_network_->findPin(parent, unescaped_name.c_str()); LibertyPort *liberty_port = pin ? sdc_network_->libertyPort(pin) : nullptr; if (pin @@ -194,10 +192,10 @@ SaifReader::setNetDurations(const char *net_name, stringDelete(net_name); } -string +std::string SaifReader::unescaped(const char *token) { - string unescaped; + std::string unescaped; for (const char *t = token; *t; t++) { char ch = *t; if (ch != escape_) @@ -211,7 +209,7 @@ SaifReader::unescaped(const char *token) //////////////////////////////////////////////////////////////// SaifScanner::SaifScanner(std::istream *stream, - const string &filename, + const std::string &filename, SaifReader *reader, Report *report) : yyFlexLexer(stream), diff --git a/power/VcdParse.cc b/power/VcdParse.cc index 93d6625c..83e171cf 100644 --- a/power/VcdParse.cc +++ b/power/VcdParse.cc @@ -35,10 +35,6 @@ namespace sta { -using std::vector; -using std::string; -using std::isspace; - // Very imprecise syntax definition // https://en.wikipedia.org/wiki/Value_change_dump#Structure.2FSyntax // Much better syntax definition @@ -125,7 +121,7 @@ VcdParse::VcdParse(Report *report, void VcdParse::parseTimescale() { - vector tokens = readStmtTokens(); + std::vector tokens = readStmtTokens(); if (tokens.size() == 1) { size_t last; double time_scale = std::stod(tokens[0], &last); @@ -140,7 +136,7 @@ VcdParse::parseTimescale() } void -VcdParse::setTimeUnit(const string &time_unit, +VcdParse::setTimeUnit(const std::string &time_unit, double time_scale) { double time_unit_scale = 1.0; @@ -177,19 +173,19 @@ static EnumNameMap vcd_var_type_map = void VcdParse::parseVar() { - vector tokens = readStmtTokens(); + std::vector tokens = readStmtTokens(); if (tokens.size() == 4 || tokens.size() == 5) { - string type_name = tokens[0]; + std::string type_name = tokens[0]; VcdVarType type = vcd_var_type_map.find(type_name, VcdVarType::unknown); if (type == VcdVarType::unknown) report_->fileWarn(1370, filename_, file_line_, "Unknown variable type %s.", type_name.c_str()); else { - size_t width = stoi(tokens[1]); - string &id = tokens[2]; - string name = tokens[3]; + size_t width = std::stoi(tokens[1]); + std::string &id = tokens[2]; + std::string name = tokens[3]; // iverilog separates bus base name from bit range. if (tokens.size() == 5) { // Preserve space after esacaped name. @@ -208,8 +204,8 @@ VcdParse::parseVar() void VcdParse::parseScope() { - vector tokens = readStmtTokens(); - string &scope = tokens[1]; + std::vector tokens = readStmtTokens(); + std::string &scope = tokens[1]; scope_.push_back(scope); } @@ -223,11 +219,11 @@ VcdParse::parseUpscope() void VcdParse::parseVarValues() { - string token = getToken(); + std::string token = getToken(); while (!token.empty()) { char char0 = toupper(token[0]); if (char0 == '#' && token.size() > 1) { - VcdTime time = stoll(token.substr(1)); + VcdTime time = std::stoll(token.substr(1)); prev_time_ = time_; time_ = time; if (time_ > prev_time_) @@ -238,15 +234,15 @@ VcdParse::parseVarValues() || char0 == 'X' || char0 == 'U' || char0 == 'Z') { - string id = token.substr(1); + std::string id = token.substr(1); if (!reader_->varIdValid(id)) report_->fileError(805, filename_, file_line_, "unknown variable %s", id.c_str()); reader_->varAppendValue(id, time_, char0); } else if (char0 == 'B') { - string bus_value = token.substr(1); - string id = getToken(); + std::string bus_value = token.substr(1); + std::string id = getToken(); if (!reader_->varIdValid(id)) report_->fileError(807, filename_, file_line_, "unknown variable %s", id.c_str()); @@ -261,12 +257,12 @@ VcdParse::parseVarValues() reader_->setTimeMax(time_); } -string +std::string VcdParse::readStmtString() { stmt_line_ = file_line_; - string line; - string token = getToken(); + std::string line; + std::string token = getToken(); while (!token.empty() && token != "$end") { if (!line.empty()) line += " "; @@ -276,12 +272,12 @@ VcdParse::readStmtString() return line; } -vector +std::vector VcdParse::readStmtTokens() { stmt_line_ = file_line_; - vector tokens; - string token = getToken(); + std::vector tokens; + std::string token = getToken(); while (!token.empty() && token != "$end") { tokens.push_back(token); token = getToken(); @@ -289,18 +285,18 @@ VcdParse::readStmtTokens() return tokens; } -string +std::string VcdParse::getToken() { - string token; + std::string token; int ch = gzgetc(stream_); // skip whitespace - while (ch != EOF && isspace(ch)) { + while (ch != EOF && std::isspace(ch)) { if (ch == '\n') file_line_++; ch = gzgetc(stream_); } - while (ch != EOF && !isspace(ch)) { + while (ch != EOF && !std::isspace(ch)) { token.push_back(ch); ch = gzgetc(stream_); } diff --git a/power/VcdReader.cc b/power/VcdReader.cc index 30b0078e..5e624273 100644 --- a/power/VcdReader.cc +++ b/power/VcdReader.cc @@ -24,8 +24,10 @@ #include "VcdReader.hh" +#include #include #include +#include #include "VcdParse.hh" #include "Debug.hh" @@ -41,13 +43,6 @@ namespace sta { -using std::string; -using std::abs; -using std::min; -using std::to_string; -using std::vector; -using std::unordered_map; - // Transition count and high time for duty cycle for a group of pins // for one bit of vcd ID. class VcdCount @@ -117,9 +112,9 @@ VcdCount::highTime(VcdTime time_max) const //////////////////////////////////////////////////////////////// // VcdCount[bit] -typedef vector VcdCounts; +using VcdCounts = std::vector; // ID -> VcdCount[bit] -typedef unordered_map VcdIdCountsMap; +using VcdIdCountsMap = std::unordered_map; class VcdCountReader : public VcdReader { @@ -134,31 +129,31 @@ public: double timeScale() const { return time_scale_; } // VcdParse callbacks. - void setDate(const string &) override {} - void setComment(const string &) override {} - void setVersion(const string &) override {} - void setTimeUnit(const string &time_unit, + void setDate(const std::string &) override {} + void setComment(const std::string &) override {} + void setVersion(const std::string &) override {} + void setTimeUnit(const std::string &time_unit, double time_unit_scale, double time_scale) override; void setTimeMin(VcdTime time) override; void setTimeMax(VcdTime time) override; void varMinDeltaTime(VcdTime) override {} - bool varIdValid(const string &id) override; + bool varIdValid(const std::string &id) override; void makeVar(const VcdScope &scope, - const string &name, + const std::string &name, VcdVarType type, size_t width, - const string &id) override; - void varAppendValue(const string &id, + const std::string &id) override; + void varAppendValue(const std::string &id, VcdTime time, char value) override; - void varAppendBusValue(const string &id, + void varAppendBusValue(const std::string &id, VcdTime time, - const string &bus_value) override; + const std::string &bus_value) override; private: - void addVarPin(const string &pin_name, - const string &id, + void addVarPin(const std::string &pin_name, + const std::string &id, size_t width, size_t bit_idx); @@ -189,7 +184,7 @@ VcdCountReader::VcdCountReader(const std::string &scope, } void -VcdCountReader::setTimeUnit(const string &, +VcdCountReader::setTimeUnit(const std::string &, double time_unit_scale, double time_scale) { @@ -209,23 +204,23 @@ VcdCountReader::setTimeMax(VcdTime time) } bool -VcdCountReader::varIdValid(const string &) +VcdCountReader::varIdValid(const std::string &) { return true; } void VcdCountReader::makeVar(const VcdScope &scope, - const string &name, + const std::string &name, VcdVarType type, size_t width, - const string &id) + const std::string &id) { if (type == VcdVarType::wire || type == VcdVarType::reg) { - string path_name; + std::string path_name; bool first = true; - for (const string &context : scope) { + for (const std::string &context : scope) { if (!first) path_name += '/'; path_name += context; @@ -238,25 +233,25 @@ VcdCountReader::makeVar(const VcdScope &scope, path_name += '/'; path_name += name; // Strip the scope from the name. - string var_scoped = path_name.substr(scope_length + 1); + std::string var_scoped = path_name.substr(scope_length + 1); if (width == 1) { - string pin_name = netVerilogToSta(&var_scoped); + std::string pin_name = netVerilogToSta(&var_scoped); addVarPin(pin_name, id, width, 0); } else { bool is_bus, is_range, subscript_wild; - string bus_name; + std::string bus_name; int from, to; parseBusName(var_scoped.c_str(), '[', ']', '\\', is_bus, is_range, bus_name, from, to, subscript_wild); if (is_bus) { - string sta_bus_name = netVerilogToSta(&bus_name); + std::string sta_bus_name = netVerilogToSta(&bus_name); int bit_idx = 0; if (to < from) { for (int bus_bit = to; bus_bit <= from; bus_bit++) { - string pin_name = sta_bus_name; + std::string pin_name = sta_bus_name; pin_name += '['; - pin_name += to_string(bus_bit); + pin_name += std::to_string(bus_bit); pin_name += ']'; addVarPin(pin_name, id, width, bit_idx); bit_idx++; @@ -264,9 +259,9 @@ VcdCountReader::makeVar(const VcdScope &scope, } else { for (int bus_bit = to; bus_bit >= from; bus_bit--) { - string pin_name = sta_bus_name; + std::string pin_name = sta_bus_name; pin_name += '['; - pin_name += to_string(bus_bit); + pin_name += std::to_string(bus_bit); pin_name += ']'; addVarPin(pin_name, id, width, bit_idx); bit_idx++; @@ -281,8 +276,8 @@ VcdCountReader::makeVar(const VcdScope &scope, } void -VcdCountReader::addVarPin(const string &pin_name, - const string &id, +VcdCountReader::addVarPin(const std::string &pin_name, + const std::string &id, size_t width, size_t bit_idx) { @@ -303,7 +298,7 @@ VcdCountReader::addVarPin(const string &pin_name, } void -VcdCountReader::varAppendValue(const string &id, +VcdCountReader::varAppendValue(const std::string &id, VcdTime time, char value) { @@ -329,9 +324,9 @@ VcdCountReader::varAppendValue(const string &id, } void -VcdCountReader::varAppendBusValue(const string &id, +VcdCountReader::varAppendBusValue(const std::string &id, VcdTime time, - const string &bus_value) + const std::string &bus_value) { const auto &itr = vcd_count_map_.find(id); if (itr != vcd_count_map_.end()) { @@ -476,7 +471,7 @@ ReadVcdActivities::checkClkPeriod(const Pin *pin, sdc_network_->pathName(pin)); else { double clk_period = clk->period(); - if (abs((clk_period - sim_period) / clk_period) > sim_clk_period_tolerance_) + if (std::abs((clk_period - sim_period) / clk_period) > sim_clk_period_tolerance_) // Warn if sim clock period differs from SDC by more than 10%. report_->warn(1452, "clock %s vcd period %s differs from SDC clock period %s", clk->name(), diff --git a/sdc/ExceptionPath.cc b/sdc/ExceptionPath.cc index 70d131c9..25ba0d78 100644 --- a/sdc/ExceptionPath.cc +++ b/sdc/ExceptionPath.cc @@ -38,8 +38,6 @@ namespace sta { -using std::string; - static bool thrusIntersectPts(ExceptionThruSeq *thrus1, ExceptionThruSeq *thrus2, @@ -326,7 +324,7 @@ ExceptionPath::intersectsPts(ExceptionPath *exception, const char * ExceptionPath::fromThruToString(const Network *network) const { - string str; + std::string str; if (min_max_ != MinMaxAll::all()) { str += " -"; str += min_max_->to_string(); @@ -1186,7 +1184,7 @@ ExceptionFromTo::deletePinBefore(const Pin *pin, const char * ExceptionFromTo::asString(const Network *network) const { - string str; + std::string str; str += " "; str += cmdKeyword(); str += " {"; @@ -1360,7 +1358,7 @@ ExceptionTo::clone(const Network *network) const char * ExceptionTo::asString(const Network *network) const { - string str; + std::string str; if (hasObjects()) str += ExceptionFromTo::asString(network); @@ -1679,7 +1677,7 @@ ExceptionThru::~ExceptionThru() const char * ExceptionThru::asString(const Network *network) const { - string str; + std::string str; bool first = true; int obj_count = 0; if (pins_) { diff --git a/sdc/Sdc.cc b/sdc/Sdc.cc index 85ee1950..001d7567 100644 --- a/sdc/Sdc.cc +++ b/sdc/Sdc.cc @@ -62,8 +62,6 @@ namespace sta { -using std::swap; - bool ClockPairLess::operator()(const ClockPair &pair1, const ClockPair &pair2) const @@ -693,10 +691,10 @@ void Sdc::swapDeratingFactors(Sdc *sdc1, Sdc *sdc2) { - swap(sdc1->derating_factors_, sdc2->derating_factors_); - swap(sdc1->net_derating_factors_, sdc2->net_derating_factors_); - swap(sdc1->inst_derating_factors_, sdc2->inst_derating_factors_); - swap(sdc1->cell_derating_factors_, sdc2->cell_derating_factors_); + std::swap(sdc1->derating_factors_, sdc2->derating_factors_); + std::swap(sdc1->net_derating_factors_, sdc2->net_derating_factors_); + std::swap(sdc1->inst_derating_factors_, sdc2->inst_derating_factors_); + std::swap(sdc1->cell_derating_factors_, sdc2->cell_derating_factors_); } void @@ -1818,7 +1816,7 @@ void Sdc::swapClockInsertions(Sdc *sdc1, Sdc *sdc2) { - swap(sdc1->clk_insertions_, sdc2->clk_insertions_); + std::swap(sdc1->clk_insertions_, sdc2->clk_insertions_); } void @@ -2825,17 +2823,17 @@ void Sdc::swapPortDelays(Sdc *sdc1, Sdc *sdc2) { - swap(sdc1->input_delays_, sdc2->input_delays_); - swap(sdc1->input_delay_pin_map_, sdc2->input_delay_pin_map_); - swap(sdc1->input_delay_ref_pin_map_, sdc2->input_delay_ref_pin_map_); - swap(sdc1->input_delay_leaf_pin_map_, sdc2->input_delay_leaf_pin_map_); - swap(sdc1->input_delay_internal_pin_map_, sdc2->input_delay_internal_pin_map_); - swap(sdc1->input_delay_index_, sdc2->input_delay_index_); + std::swap(sdc1->input_delays_, sdc2->input_delays_); + std::swap(sdc1->input_delay_pin_map_, sdc2->input_delay_pin_map_); + std::swap(sdc1->input_delay_ref_pin_map_, sdc2->input_delay_ref_pin_map_); + std::swap(sdc1->input_delay_leaf_pin_map_, sdc2->input_delay_leaf_pin_map_); + std::swap(sdc1->input_delay_internal_pin_map_, sdc2->input_delay_internal_pin_map_); + std::swap(sdc1->input_delay_index_, sdc2->input_delay_index_); - swap(sdc1->output_delays_, sdc2->output_delays_); - swap(sdc1->output_delay_pin_map_, sdc2->output_delay_pin_map_); - swap(sdc1->output_delay_ref_pin_map_, sdc2->output_delay_ref_pin_map_); - swap(sdc1->output_delay_leaf_pin_map_, sdc2->output_delay_leaf_pin_map_); + std::swap(sdc1->output_delays_, sdc2->output_delays_); + std::swap(sdc1->output_delay_pin_map_, sdc2->output_delay_pin_map_); + std::swap(sdc1->output_delay_ref_pin_map_, sdc2->output_delay_ref_pin_map_); + std::swap(sdc1->output_delay_leaf_pin_map_, sdc2->output_delay_leaf_pin_map_); } //////////////////////////////////////////////////////////////// @@ -3374,8 +3372,8 @@ void Sdc::swapPortExtCaps(Sdc *sdc1, Sdc *sdc2) { - swap(sdc1->port_ext_cap_map_, sdc2->port_ext_cap_map_); - swap(sdc1->net_wire_cap_map_, sdc2->net_wire_cap_map_); + std::swap(sdc1->port_ext_cap_map_, sdc2->port_ext_cap_map_); + std::swap(sdc1->net_wire_cap_map_, sdc2->net_wire_cap_map_); } //////////////////////////////////////////////////////////////// diff --git a/sdc/WriteSdc.cc b/sdc/WriteSdc.cc index e317a8a4..9ca25826 100644 --- a/sdc/WriteSdc.cc +++ b/sdc/WriteSdc.cc @@ -29,6 +29,7 @@ #include #include #include +#include #include "ContainerHelpers.hh" #include "Zlib.hh" @@ -63,8 +64,6 @@ namespace sta { -using std::string; - typedef std::set ClockSenseSet; typedef std::vector ClockSenseSeq; @@ -1167,7 +1166,7 @@ WriteSdc::writeDisabledEdgeSense(Edge *edge) const { gzprintf(stream_, "set_disable_timing "); const char *sense = to_string(edge->sense()); - string filter; + std::string filter; stringPrint(filter, "sense == %s", sense); writeGetTimingArcs(edge, filter.c_str()); gzprintf(stream_, "\n"); diff --git a/sdf/SdfReader.cc b/sdf/SdfReader.cc index 9e945130..59beb9f9 100644 --- a/sdf/SdfReader.cc +++ b/sdf/SdfReader.cc @@ -26,6 +26,7 @@ #include #include +#include #include "ContainerHelpers.hh" #include "Zlib.hh" @@ -45,9 +46,6 @@ namespace sta { -using std::string; -using std::to_string; - class SdfTriple { public: @@ -69,14 +67,14 @@ public: const std::string *port, const std::string *cond); ~SdfPortSpec(); - const string *port() const { return port_; } + const std::string *port() const { return port_; } const Transition *transition() const { return tr_; } - const string *cond() const { return cond_; } + const std::string *cond() const { return cond_; } private: const Transition *tr_; - const string *port_; - const string *cond_; // timing checks only + const std::string *port_; + const std::string *cond_; // timing checks only }; bool @@ -162,7 +160,7 @@ SdfReader::setDivider(char divider) void SdfReader::setTimescale(float multiplier, - const string *units) + const std::string *units) { if (multiplier == 1.0 || multiplier == 10.0 @@ -182,8 +180,8 @@ SdfReader::setTimescale(float multiplier, } void -SdfReader::interconnect(const string *from_pin_name, - const string *to_pin_name, +SdfReader::interconnect(const std::string *from_pin_name, + const std::string *to_pin_name, SdfTripleSeq *triples) { // Ignore non-incremental annotations in incremental only mode. @@ -225,7 +223,7 @@ SdfReader::interconnect(const string *from_pin_name, } void -SdfReader::port(const string *to_pin_name, +SdfReader::port(const std::string *to_pin_name, SdfTripleSeq *triples) { // Ignore non-incremental annotations in incremental only mode. @@ -296,13 +294,13 @@ SdfReader::setEdgeDelays(Edge *edge, } void -SdfReader::setCell(const string *cell_name) +SdfReader::setCell(const std::string *cell_name) { cell_name_ = cell_name; } void -SdfReader::setInstance(const string *instance_name) +SdfReader::setInstance(const std::string *instance_name) { if (instance_name) { if (*instance_name == "*") { @@ -344,13 +342,13 @@ SdfReader::cellFinish() void SdfReader::iopath(SdfPortSpec *from_edge, - const string *to_port_name, + const std::string *to_port_name, SdfTripleSeq *triples, - const string *cond, + const std::string *cond, bool condelse) { if (instance_) { - const string *from_port_name = from_edge->port(); + const std::string *from_port_name = from_edge->port(); Cell *cell = network_->cell(instance_); Port *from_port = findPort(cell, from_port_name); Port *to_port = findPort(cell, to_port_name); @@ -420,7 +418,7 @@ SdfReader::iopath(SdfPortSpec *from_edge, Port * SdfReader::findPort(const Cell *cell, - const string *port_name) + const std::string *port_name) { Port *port = network_->findPort(cell, port_name->c_str()); if (port == nullptr) @@ -437,8 +435,8 @@ SdfReader::timingCheck(const TimingRole *role, SdfTriple *triple) { if (instance_) { - const string *data_port_name = data_edge->port(); - const string *clk_port_name = clk_edge->port(); + const std::string *data_port_name = data_edge->port(); + const std::string *clk_port_name = clk_edge->port(); Cell *cell = network_->cell(instance_); Port *data_port = findPort(cell, data_port_name); Port *clk_port = findPort(cell, clk_port_name); @@ -515,8 +513,8 @@ SdfReader::annotateCheckEdges(Pin *data_pin, bool match_generic) { bool matched = false; - const string *cond_start = data_edge->cond(); - const string *cond_end = clk_edge->cond(); + const std::string *cond_start = data_edge->cond(); + const std::string *cond_end = clk_edge->cond(); // Timing check graph edges from clk to data. Vertex *to_vertex = graph_->pinLoadVertex(data_pin); // Fanin < fanout, so search for driver from load. @@ -557,7 +555,7 @@ SdfReader::timingCheckWidth(SdfPortSpec *edge, // Ignore non-incremental annotations in incremental only mode. if (!(is_incremental_only_ && !in_incremental_) && instance_) { - const string *port_name = edge->port(); + const std::string *port_name = edge->port(); Cell *cell = network_->cell(instance_); Port *port = findPort(cell, port_name); if (port) { @@ -604,8 +602,8 @@ SdfReader::timingCheckSetupHold1(SdfPortSpec *data_edge, const TimingRole *setup_role, const TimingRole *hold_role) { - const string *data_port_name = data_edge->port(); - const string *clk_port_name = clk_edge->port(); + const std::string *data_port_name = data_edge->port(); + const std::string *clk_port_name = clk_edge->port(); Cell *cell = network_->cell(instance_); Port *data_port = findPort(cell, data_port_name); Port *clk_port = findPort(cell, clk_port_name); @@ -626,7 +624,7 @@ SdfReader::timingCheckPeriod(SdfPortSpec *edge, // Ignore non-incremental annotations in incremental only mode. if (!(is_incremental_only_ && !in_incremental_) && instance_) { - const string *port_name = edge->port(); + const std::string *port_name = edge->port(); Cell *cell = network_->cell(instance_); Port *port = findPort(cell, port_name); if (port) { @@ -683,7 +681,7 @@ SdfReader::device(SdfTripleSeq *triples) } void -SdfReader::device(const string *to_port_name, +SdfReader::device(const std::string *to_port_name, SdfTripleSeq *triples) { // Ignore non-incremental annotations in incremental only mode. @@ -799,7 +797,7 @@ SdfReader::setEdgeArcDelaysCondUse(Edge *edge, } bool -SdfReader::condMatch(const string *sdf_cond, +SdfReader::condMatch(const std::string *sdf_cond, const std::string &lib_cond) { // If the sdf is not conditional it matches any library condition. @@ -828,24 +826,24 @@ SdfReader::condMatch(const string *sdf_cond, SdfPortSpec * SdfReader::makePortSpec(const Transition *tr, - const string *port, - const string *cond) + const std::string *port, + const std::string *cond) { return new SdfPortSpec(tr, port, cond); } SdfPortSpec * -SdfReader::makeCondPortSpec(const string *cond_port) +SdfReader::makeCondPortSpec(const std::string *cond_port) { // Search from end to find port name because condition may contain spaces. - string cond_port1(*cond_port); + std::string cond_port1(*cond_port); trimRight(cond_port1); auto port_idx = cond_port1.find_last_of(" "); if (port_idx != cond_port1.npos) { - string *port1 = new string(cond_port1.substr(port_idx + 1)); + std::string *port1 = new std::string(cond_port1.substr(port_idx + 1)); auto cond_end = cond_port1.find_last_not_of(" ", port_idx); if (cond_end != cond_port1.npos) { - string *cond1 = new string(cond_port1.substr(0, cond_end + 1)); + std::string *cond1 = new std::string(cond_port1.substr(0, cond_end + 1)); SdfPortSpec *port_spec = new SdfPortSpec(Transition::riseFall(), port1, cond1); @@ -913,13 +911,13 @@ SdfReader::setInIncremental(bool incr) in_incremental_ = incr; } -string * -SdfReader::unescaped(const string *token) +std::string * +SdfReader::unescaped(const std::string *token) { char path_escape = network_->pathEscape(); char path_divider = network_->pathDivider(); size_t token_length = token->size(); - string *unescaped = new string; + std::string *unescaped = new std::string; for (size_t i = 0; i < token_length; i++) { char ch = (*token)[i]; if (ch == escape_) { @@ -955,11 +953,11 @@ SdfReader::unescaped(const string *token) return unescaped; } -string * -SdfReader::makePath(const string *head, - const string *tail) +std::string * +SdfReader::makePath(const std::string *head, + const std::string *tail) { - string *path = new string(*head); + std::string *path = new std::string(*head); *path += network_->pathDivider(); *path += *tail; delete head; @@ -967,13 +965,13 @@ SdfReader::makePath(const string *head, return path; } -string * -SdfReader::makeBusName(string *base_name, +std::string * +SdfReader::makeBusName(std::string *base_name, int index) { - string *bus_name = unescaped(base_name); + std::string *bus_name = unescaped(base_name); *bus_name += '['; - *bus_name += to_string(index); + *bus_name += std::to_string(index); *bus_name += ']'; delete base_name; return bus_name; @@ -1006,10 +1004,10 @@ SdfReader::sdfError(int id, } Pin * -SdfReader::findPin(const string *name) +SdfReader::findPin(const std::string *name) { if (path_) { - string path_name(path_); + std::string path_name(path_); path_name += divider_; path_name += *name; Pin *pin = network_->findPin(path_name.c_str()); @@ -1020,9 +1018,9 @@ SdfReader::findPin(const string *name) } Instance * -SdfReader::findInstance(const string *name) +SdfReader::findInstance(const std::string *name) { - string inst_name; + std::string inst_name; if (path_) { inst_name = path_; inst_name += divider_; @@ -1039,8 +1037,8 @@ SdfReader::findInstance(const string *name) //////////////////////////////////////////////////////////////// SdfPortSpec::SdfPortSpec(const Transition *tr, - const string *port, - const string *cond) : + const std::string *port, + const std::string *cond) : tr_(tr), port_(port), cond_(cond) @@ -1084,7 +1082,7 @@ SdfTriple::hasValue() const //////////////////////////////////////////////////////////////// SdfScanner::SdfScanner(std::istream *stream, - const string &filename, + const std::string &filename, SdfReader *reader, Report *report) : yyFlexLexer(stream), diff --git a/sdf/SdfWriter.cc b/sdf/SdfWriter.cc index f0095017..f42d54a9 100644 --- a/sdf/SdfWriter.cc +++ b/sdf/SdfWriter.cc @@ -45,8 +45,6 @@ namespace sta { -using std::string; - class SdfWriter : public StaState { public: @@ -108,10 +106,10 @@ protected: void writeSdfTriple(float min, float max); void writeSdfDelay(double delay); - string sdfPortName(const Pin *pin); - string sdfPathName(const Pin *pin); - string sdfPathName(const Instance *inst); - string sdfName(const Instance *inst); + std::string sdfPortName(const Pin *pin); + std::string sdfPathName(const Pin *pin); + std::string sdfPathName(const Instance *inst); + std::string sdfName(const Instance *inst); private: char sdf_divider_; @@ -315,8 +313,8 @@ SdfWriter::writeInterconnectFromPin(Pin *drvr_pin) Edge *edge = edge_iter.next(); if (edge->isWire()) { Pin *load_pin = edge->to(graph_)->pin(); - string drvr_pin_name = sdfPathName(drvr_pin); - string load_pin_name = sdfPathName(load_pin); + std::string drvr_pin_name = sdfPathName(drvr_pin); + std::string load_pin_name = sdfPathName(load_pin); gzprintf(stream_, " (INTERCONNECT %s %s ", drvr_pin_name.c_str(), load_pin_name.c_str()); @@ -347,7 +345,7 @@ SdfWriter::writeInstHeader(const Instance *inst) { gzprintf(stream_, " (CELL\n"); gzprintf(stream_, " (CELLTYPE \"%s\")\n", network_->cellName(inst)); - string inst_name = sdfPathName(inst); + std::string inst_name = sdfPathName(inst); gzprintf(stream_, " (INSTANCE %s)\n", inst_name.c_str()); } @@ -392,8 +390,8 @@ SdfWriter::writeIopaths(const Instance *inst, gzprintf(stream_, " (COND %s\n", sdf_cond.c_str()); gzprintf(stream_, " "); } - string from_pin_name = sdfPortName(from_pin); - string to_pin_name = sdfPortName(to_pin); + std::string from_pin_name = sdfPortName(from_pin); + std::string to_pin_name = sdfPortName(to_pin); gzprintf(stream_, " (IOPATH %s %s ", from_pin_name.c_str(), to_pin_name.c_str()); @@ -661,7 +659,7 @@ SdfWriter::writeCheck(Edge *edge, if (!sdf_cond_start.empty()) gzprintf(stream_, "(COND %s ", sdf_cond_start.c_str()); - string to_pin_name = sdfPortName(to_pin); + std::string to_pin_name = sdfPortName(to_pin); if (use_data_edge) { gzprintf(stream_, "(%s %s)", sdfEdge(arc->toEdge()), @@ -678,7 +676,7 @@ SdfWriter::writeCheck(Edge *edge, if (!sdf_cond_end.empty()) gzprintf(stream_, "(COND %s ", sdf_cond_end.c_str()); - string from_pin_name = sdfPortName(from_pin); + std::string from_pin_name = sdfPortName(from_pin); if (use_clk_edge) gzprintf(stream_, "(%s %s)", sdfEdge(arc->fromEdge()), @@ -704,7 +702,7 @@ SdfWriter::writeWidthCheck(const Pin *pin, float min_width, float max_width) { - string pin_name = sdfPortName(pin); + std::string pin_name = sdfPortName(pin); gzprintf(stream_, " (WIDTH (%s %s) ", sdfEdge(hi_low->asTransition()), pin_name.c_str()); @@ -716,7 +714,7 @@ void SdfWriter::writePeriodCheck(const Pin *pin, float min_period) { - string pin_name = sdfPortName(pin); + std::string pin_name = sdfPortName(pin); gzprintf(stream_, " (PERIOD %s ", pin_name.c_str()); writeSdfTriple(min_period, min_period); gzprintf(stream_, ")\n"); @@ -734,16 +732,16 @@ SdfWriter::sdfEdge(const Transition *tr) //////////////////////////////////////////////////////////////// -string +std::string SdfWriter::sdfPathName(const Pin *pin) { Instance *inst = network_->instance(pin); if (network_->isTopInstance(inst)) return sdfPortName(pin); else { - string inst_path = sdfPathName(inst); - string port_name = sdfPortName(pin); - string sdf_name = inst_path; + std::string inst_path = sdfPathName(inst); + std::string port_name = sdfPortName(pin); + std::string sdf_name = inst_path; sdf_name += sdf_divider_; sdf_name += port_name; return sdf_name; @@ -751,15 +749,15 @@ SdfWriter::sdfPathName(const Pin *pin) } // Based on Network::pathName. -string +std::string SdfWriter::sdfPathName(const Instance *instance) { InstanceSeq inst_path; network_->path(instance, inst_path); - string path_name; + std::string path_name; while (!inst_path.empty()) { const Instance *inst = inst_path.back(); - string inst_name = sdfName(inst); + std::string inst_name = sdfName(inst); path_name += inst_name; inst_path.pop_back(); if (!inst_path.empty()) @@ -769,11 +767,11 @@ SdfWriter::sdfPathName(const Instance *instance) } // Escape for non-alpha numeric characters. -string +std::string SdfWriter::sdfName(const Instance *inst) { const char *name = network_->name(inst); - string sdf_name; + std::string sdf_name; const char *p = name; while (*p) { char ch = *p; @@ -789,12 +787,12 @@ SdfWriter::sdfName(const Instance *inst) return sdf_name; } -string +std::string SdfWriter::sdfPortName(const Pin *pin) { const char *name = network_->portName(pin); size_t name_length = strlen(name); - string sdf_name; + std::string sdf_name; constexpr char bus_brkt_left = '['; constexpr char bus_brkt_right = ']'; diff --git a/search/CheckTiming.cc b/search/CheckTiming.cc index 9c692fba..f05de24e 100644 --- a/search/CheckTiming.cc +++ b/search/CheckTiming.cc @@ -46,8 +46,6 @@ namespace sta { -using std::string; - CheckTiming::CheckTiming(StaState *sta) : StaState(sta), mode_(nullptr), @@ -202,7 +200,7 @@ CheckTiming::checkLoops() loop_count++; } if (loop_count > 0) { - string error_msg; + std::string error_msg; errorMsgSubst("Warning: There %is %d combinational loop%s in the design.", loop_count, error_msg); CheckError *error = new CheckError; @@ -362,7 +360,7 @@ CheckTiming::pushPinErrors(const char *msg, { if (!pins.empty()) { CheckError *error = new CheckError; - string error_msg; + std::string error_msg; errorMsgSubst(msg, pins.size(), error_msg); // Copy the error strings because the error deletes them when it // is deleted. @@ -384,7 +382,7 @@ CheckTiming::pushClkErrors(const char *msg, { if (!clks.empty()) { CheckError *error = new CheckError; - string error_msg; + std::string error_msg; errorMsgSubst(msg, clks.size(), error_msg); // Copy the error strings because the error deletes them when it // is deleted. @@ -404,7 +402,7 @@ CheckTiming::pushClkErrors(const char *msg, void CheckTiming::errorMsgSubst(const char *msg, int obj_count, - string &error_msg) + std::string &error_msg) { for (const char *s = msg; *s; s++) { char ch = *s; diff --git a/search/ClkSkew.cc b/search/ClkSkew.cc index 9a34fe5e..09cdf204 100644 --- a/search/ClkSkew.cc +++ b/search/ClkSkew.cc @@ -49,8 +49,6 @@ namespace sta { -using std::abs; - ClkSkews::ClkSkews(StaState *sta) : StaState(sta), include_internal_latency_(true), @@ -148,7 +146,7 @@ ClkSkews::findWorstClkSkew(const SceneSeq &scenes, float worst_skew = 0.0; for (const auto& [clk, clk_skews] : skews_) { float skew = clk_skews[setup_hold->index()].skew(); - if (abs(skew) > abs(worst_skew)) + if (std::abs(skew) > std::abs(worst_skew)) worst_skew = skew; } return worst_skew; @@ -210,8 +208,8 @@ ClkSkews::findClkSkew(ConstClockSeq &clks, ClkSkew &partial_skew_val = partial_skew[setup_hold_idx]; float partial_skew1 = partial_skew_val.skew(); float final_skew1 = final_skew.skew(); - if (abs(partial_skew1) > abs(final_skew1) - || (fuzzyEqual(abs(partial_skew1), abs(final_skew1)) + if (std::abs(partial_skew1) > std::abs(final_skew1) + || (fuzzyEqual(std::abs(partial_skew1), std::abs(final_skew1)) // Break ties based on source/target path names. && ClkSkew::srcTgtPathNameLess(partial_skew_val, final_skew, this))) final_skew = partial_skew_val; @@ -325,7 +323,7 @@ ClkSkews::findClkSkew(Vertex *src_vertex, delayAsString(probe.crpr(this), this), time_unit->asString(probe.skew())); if (clk_skew.srcPath() == nullptr - || abs(probe.skew()) > abs(clk_skew.skew())) + || std::abs(probe.skew()) > std::abs(clk_skew.skew())) clk_skew = probe; } } diff --git a/search/Crpr.cc b/search/Crpr.cc index c2226541..e782aef0 100644 --- a/search/Crpr.cc +++ b/search/Crpr.cc @@ -24,8 +24,8 @@ #include "Crpr.hh" +#include #include // abs -#include #include "Debug.hh" #include "Network.hh" @@ -44,9 +44,6 @@ namespace sta { -using std::min; -using std::abs; - CheckCrpr::CheckCrpr(StaState *sta) : StaState(sta) { @@ -60,11 +57,10 @@ CheckCrpr::maxCrpr(const ClkInfo *clk_info) const Path *crpr_clk_path = clk_info->crprClkPath(this); if (crpr_clk_path) { Arrival other_arrival = otherMinMaxArrival(crpr_clk_path); - float crpr_diff = abs(delayAsFloat(crpr_clk_path->arrival(), - EarlyLate::late(), - this) - - delayAsFloat(other_arrival, EarlyLate::early(), - this)); + float crpr_diff = std::abs(delayAsFloat(crpr_clk_path->arrival(), + EarlyLate::late(), this) + - delayAsFloat(other_arrival, EarlyLate::early(), + this)); return crpr_diff; } return 0.0F; @@ -284,7 +280,7 @@ CheckCrpr::findCrpr1(const Path *src_clk_path, Arrival tgt_arrival = tgt_clk_path->arrival(); float src_clk_time = src_clk_path->clkEdge(this)->time(); float tgt_clk_time = tgt_clk_path->clkEdge(this)->time(); - float crpr_mean = abs(delayAsFloat(src_arrival) - src_clk_time + float crpr_mean = std::abs(delayAsFloat(src_arrival) - src_clk_time - (delayAsFloat(tgt_arrival) - tgt_clk_time)); // Remove the sigma from both source and target path arrivals. float crpr_sigma2 = delaySigma2(src_arrival, src_el) @@ -300,7 +296,7 @@ CheckCrpr::findCrpr1(const Path *src_clk_path, delayAsString(src_delta, this)); debugPrint(debug_, "crpr", 2, " tgt delta %s", delayAsString(tgt_delta, this)); - float common_delay = min(src_delta, tgt_delta); + float common_delay = std::min(src_delta, tgt_delta); debugPrint(debug_, "crpr", 2, " %s delta %s", network_->pathName(src_clk_path->pin(this)), delayAsString(common_delay, this)); @@ -312,7 +308,7 @@ float CheckCrpr::crprArrivalDiff(const Path *path) { Arrival other_arrival = otherMinMaxArrival(path); - float crpr_diff = abs(delayAsFloat(path->arrival()) + float crpr_diff = std::abs(delayAsFloat(path->arrival()) - delayAsFloat(other_arrival)); return crpr_diff; } diff --git a/search/Genclks.cc b/search/Genclks.cc index 66b8cd14..bbb26621 100644 --- a/search/Genclks.cc +++ b/search/Genclks.cc @@ -24,6 +24,8 @@ #include "Genclks.hh" +#include + #include "ContainerHelpers.hh" #include "Stats.hh" #include "Debug.hh" @@ -47,8 +49,6 @@ namespace sta { -using std::max; - class GenclkInfo { public: @@ -151,7 +151,7 @@ Genclks::clkPinMaxLevel(const Clock *clk) const Level max_level = 0; for (const Pin *pin : clk->leafPins()) { Vertex *vertex = srcPath(pin); - max_level = max(max_level, vertex->level()); + max_level = std::max(max_level, vertex->level()); } return max_level; } diff --git a/search/Levelize.cc b/search/Levelize.cc index df6c983d..d04891bf 100644 --- a/search/Levelize.cc +++ b/search/Levelize.cc @@ -25,6 +25,7 @@ #include "Levelize.hh" #include +#include #include #include "ContainerHelpers.hh" @@ -43,8 +44,6 @@ namespace sta { -using std::max; - Levelize::Levelize(StaState *sta) : StaState(sta), levelized_(false), @@ -500,16 +499,16 @@ Levelize::assignLevels(VertexSeq &topo_sorted) Edge *edge = edge_iter.next(); Vertex *to_vertex = edge->to(graph_); if (searchThru(edge)) - setLevel(to_vertex, max(to_vertex->level(), - vertex->level() + level_space_)); + setLevel(to_vertex, std::max(to_vertex->level(), + vertex->level() + level_space_)); } // Levelize bidirect driver as if it was a fanout of the bidirect load. const Pin *pin = vertex->pin(); if (graph_delay_calc_->bidirectDrvrSlewFromLoad(pin) && !vertex->isBidirectDriver()) { Vertex *to_vertex = graph_->pinDrvrVertex(pin); - setLevel(to_vertex, max(to_vertex->level(), - vertex->level() + level_space_)); + setLevel(to_vertex, std::max(to_vertex->level(), + vertex->level() + level_space_)); } } } @@ -541,7 +540,7 @@ Levelize::setLevel(Vertex *vertex, vertex->to_string(this).c_str(), level); vertex->setLevel(level); - max_level_ = max(level, max_level_); + max_level_ = std::max(level, max_level_); if (level >= Graph::vertex_level_max) report_->critical(616, "maximum logic level exceeded"); } @@ -676,7 +675,7 @@ Levelize::setLevelIncr(Vertex *vertex, observer_->levelChangedBefore(vertex); vertex->setLevel(level); } - max_level_ = max(level, max_level_); + max_level_ = std::max(level, max_level_); if (level >= Graph::vertex_level_max) criticalError(618, "maximum logic level exceeded"); } diff --git a/search/MakeTimingModel.cc b/search/MakeTimingModel.cc index 1c605a26..d709f477 100644 --- a/search/MakeTimingModel.cc +++ b/search/MakeTimingModel.cc @@ -26,6 +26,7 @@ #include "MakeTimingModelPvt.hh" #include +#include #include #include "Debug.hh" @@ -51,11 +52,6 @@ namespace sta { -using std::string; -using std::min; -using std::max; -using std::make_shared; - LibertyLibrary * makeTimingModel(const char *lib_name, const char *cell_name, @@ -305,7 +301,7 @@ MakeEndTimingArcs::visit(PathEnd *path_end) margins.value(input_rf_, min_max, max_margin, max_exists); // Always max margin, even for min/hold checks. margins.setValue(input_rf_, min_max, - max_exists ? max(max_margin, delay1) : delay1); + max_exists ? std::max(max_margin, delay1) : delay1); } } @@ -606,7 +602,7 @@ MakeTimingModel::makeScalarCheckModel(float value, ScaleFactorType scale_factor_type, const RiseFall *rf) { - TablePtr table = make_shared
(value); + TablePtr table = std::make_shared
(value); TableTemplate *tbl_template = library_->findTableTemplate("scalar", TableTemplateType::delay); TableModel *table_model = new TableModel(table, tbl_template, @@ -620,8 +616,8 @@ MakeTimingModel::makeGateModelScalar(Delay delay, Slew slew, const RiseFall *rf) { - TablePtr delay_table = make_shared
(delayAsFloat(delay)); - TablePtr slew_table = make_shared
(delayAsFloat(slew)); + TablePtr delay_table = std::make_shared
(delayAsFloat(delay)); + TablePtr slew_table = std::make_shared
(delayAsFloat(slew)); TableTemplate *tbl_template = library_->findTableTemplate("scalar", TableTemplateType::delay); TableModel *delay_model = new TableModel(delay_table, tbl_template, @@ -636,7 +632,7 @@ TimingModel * MakeTimingModel::makeGateModelScalar(Delay delay, const RiseFall *rf) { - TablePtr delay_table = make_shared
(delayAsFloat(delay)); + TablePtr delay_table = std::make_shared
(delayAsFloat(delay)); TableTemplate *tbl_template = library_->findTableTemplate("scalar", TableTemplateType::delay); TableModel *delay_model = new TableModel(delay_table, tbl_template, @@ -708,8 +704,8 @@ MakeTimingModel::makeGateModelTable(const Pin *output_pin, std::make_shared(TableAxisVariable::total_output_net_capacitance, std::move(axis_values)); - TablePtr delay_table = make_shared
(load_values, load_axis); - TablePtr slew_table = make_shared
(slew_values, load_axis); + TablePtr delay_table = std::make_shared
(load_values, load_axis); + TablePtr slew_table = std::make_shared
(slew_values, load_axis); TableTemplate *model_template = ensureTableTemplate(drvr_template, load_axis); @@ -738,7 +734,7 @@ MakeTimingModel::ensureTableTemplate(const TableTemplate *drvr_template, { TableTemplate *model_template = findKey(template_map_, drvr_template); if (model_template == nullptr) { - string template_name = "template_"; + std::string template_name = "template_"; template_name += std::to_string(tbl_template_index_++); model_template = library_->makeTableTemplate(template_name, diff --git a/search/Property.cc b/search/Property.cc index 07eddc0a..ba12610a 100644 --- a/search/Property.cc +++ b/search/Property.cc @@ -24,6 +24,9 @@ #include "Property.hh" +#include +#include + #include "StringUtil.hh" #include "MinMax.hh" #include "Transition.hh" @@ -43,22 +46,19 @@ namespace sta { -using std::string; -using std::max; - class PropertyUnknown : public Exception { public: PropertyUnknown(const char *type, const char *property); PropertyUnknown(const char *type, - const string property); + const std::string property); virtual ~PropertyUnknown() {} virtual const char *what() const noexcept; private: const char *type_; - const string property_; + const std::string property_; }; PropertyUnknown::PropertyUnknown(const char *type, @@ -70,7 +70,7 @@ PropertyUnknown::PropertyUnknown(const char *type, } PropertyUnknown::PropertyUnknown(const char *type, - const string property) : + const std::string property) : Exception(), type_(type), property_(property) @@ -556,7 +556,7 @@ PropertyValue::operator=(PropertyValue &&value) noexcept return *this; } -string +std::string PropertyValue::to_string(const Network *network) const { switch (type_) { @@ -683,9 +683,9 @@ Properties::getProperty(const Cell *cell, return PropertyValue(network->name(cell)); else if (property == "full_name") { Library *lib = network->library(cell); - string lib_name = network->name(lib); - string cell_name = network->name(cell); - string full_name = lib_name + network->pathDivider() + cell_name; + std::string lib_name = network->name(lib); + std::string cell_name = network->name(cell); + std::string full_name = lib_name + network->pathDivider() + cell_name; return PropertyValue(full_name); } else if (property == "library") @@ -714,9 +714,9 @@ Properties::getProperty(const LibertyCell *cell, else if (property == "full_name") { Network *network = sta_->cmdNetwork(); LibertyLibrary *lib = cell->libertyLibrary(); - string lib_name = lib->name(); - string cell_name = cell->name(); - string full_name = lib_name + network->pathDivider() + cell_name; + std::string lib_name = lib->name(); + std::string cell_name = cell->name(); + std::string full_name = lib_name + network->pathDivider() + cell_name; return PropertyValue(full_name); } else if (property == "filename") @@ -1099,7 +1099,7 @@ Properties::getProperty(Edge *edge, const std::string &property) { if (property == "full_name") { - string full_name = edge->to_string(sta_); + std::string full_name = edge->to_string(sta_); return PropertyValue(full_name); } if (property == "delay_min_fall") @@ -1159,7 +1159,7 @@ Properties::getProperty(TimingArcSet *arc_set, const char *from = arc_set->from()->name(); const char *to = arc_set->to()->name(); const char *cell_name = arc_set->libertyCell()->name(); - string name; + std::string name; stringPrint(name, "%s %s -> %s", cell_name, from, to); return PropertyValue(name); } diff --git a/search/ReportPath.cc b/search/ReportPath.cc index 9122a805..ad9b9f11 100644 --- a/search/ReportPath.cc +++ b/search/ReportPath.cc @@ -23,6 +23,7 @@ // This notice may not be removed or altered from any source distribution. #include // reverse +#include #include "ReportPath.hh" @@ -63,8 +64,6 @@ namespace sta { -using std::string; - static void hierPinsAbove(const Net *net, const Network *network, @@ -373,7 +372,7 @@ ReportPath::reportPathEndHeader() const void ReportPath::reportPathEndFooter() const { - string header; + std::string header; switch (format_) { case ReportPathFormat::full: case ReportPathFormat::full_clock: @@ -474,7 +473,7 @@ ReportPath::reportFull(const PathEndCheck *end) const reportSlack(end); } -string +std::string ReportPath::checkRoleString(const PathEnd *end) const { return stdstrPrint("library %s time", @@ -486,7 +485,7 @@ ReportPath::reportEndpoint(const PathEndCheck *end) const { Instance *inst = network_->instance(end->vertex(this)->pin()); const char *inst_name = cmd_network_->pathName(inst); - string clk_name = tgtClkName(end); + std::string clk_name = tgtClkName(end); const char *rise_fall = asRisingFalling(end->targetClkEndTrans(this)); const TimingRole *check_role = end->checkRole(this); const TimingRole *check_generic_role = check_role->genericRole(); @@ -593,7 +592,7 @@ ReportPath::reportEndpoint(const PathEndLatchCheck *end) const { Instance *inst = network_->instance(end->vertex(this)->pin()); const char *inst_name = cmd_network_->pathName(inst); - string clk_name = tgtClkName(end); + std::string clk_name = tgtClkName(end); const char *reg_desc = latchDesc(end); auto reason = stdstrPrint("%s clocked by %s", reg_desc, clk_name.c_str()); reportEndpoint(inst_name, reason); @@ -625,7 +624,7 @@ ReportPath::reportBorrowing(const PathEndLatchCheck *end, if (borrow_limit_exists) reportLineTotal("user max time borrow", max_borrow, early_late); else { - string tgt_clk_name = tgtClkName(end); + std::string tgt_clk_name = tgtClkName(end); Arrival tgt_clk_width = end->targetClkWidth(this); const Path *tgt_clk_path = end->targetClkPath(); if (tgt_clk_path->clkInfo(search_)->isPropagated()) { @@ -691,7 +690,7 @@ ReportPath::reportEndpoint(const PathEndPathDelay *end) const else { Instance *inst = network_->instance(end->vertex(this)->pin()); const char *inst_name = cmd_network_->pathName(inst); - string clk_name = tgtClkName(end); + std::string clk_name = tgtClkName(end); const char *reg_desc = clkRegLatchDesc(end); auto reason = stdstrPrint("%s clocked by %s", reg_desc, clk_name.c_str()); reportEndpoint(inst_name, reason); @@ -723,7 +722,7 @@ ReportPath::reportFull(const PathEndPathDelay *end) const if (min_max == MinMax::max()) margin = -margin; - string delay_msg = min_max->to_string() + "_delay"; + std::string delay_msg = min_max->to_string() + "_delay"; float delay = path_delay->delay(); reportLine(delay_msg.c_str(), delay, delay, early_late); if (!path_delay->ignoreClkLatency()) { @@ -821,7 +820,7 @@ ReportPath::reportEndpointOutputDelay(const PathEndClkConstrained *end) const if (network_->isTopLevelPort(pin)) { // Pin direction is "output" even for bidirects. if (tgt_clk) { - string clk_name = tgtClkName(end); + std::string clk_name = tgtClkName(end); auto reason = stdstrPrint("output port clocked by %s", clk_name.c_str()); reportEndpoint(pin_name, reason); } @@ -830,7 +829,7 @@ ReportPath::reportEndpointOutputDelay(const PathEndClkConstrained *end) const } else { if (tgt_clk) { - string clk_name = tgtClkName(end); + std::string clk_name = tgtClkName(end); auto reason = stdstrPrint("internal path endpoint clocked by %s", clk_name.c_str()); @@ -875,7 +874,7 @@ ReportPath::reportEndpoint(const PathEndGatedClock *end) const { Instance *inst = network_->instance(end->vertex(this)->pin()); const char *inst_name = cmd_network_->pathName(inst); - string clk_name = tgtClkName(end); + std::string clk_name = tgtClkName(end); const RiseFall *clk_end_rf = end->targetClkEndTrans(this); const RiseFall *clk_rf = (end->minMax(this) == MinMax::max()) ? clk_end_rf : clk_end_rf->opposite(); @@ -955,7 +954,7 @@ ReportPath::reportEndpoint(const PathEndDataCheck *end) const void ReportPath::reportEndHeader() const { - string line; + std::string line; // Line one. reportDescription("", line); line += ' '; @@ -981,8 +980,8 @@ ReportPath::reportEndHeader() const void ReportPath::reportEndLine(const PathEnd *end) const { - string line; - string endpoint = pathEndpoint(end); + std::string line; + std::string endpoint = pathEndpoint(end); reportDescription(endpoint.c_str(), line); const EarlyLate *early_late = end->pathEarlyLate(this); reportSpaceFieldDelay(end->requiredTimeOffset(this), early_late, line); @@ -996,7 +995,7 @@ ReportPath::reportEndLine(const PathEnd *end) const void ReportPath::reportSummaryHeader() const { - string line; + std::string line; reportDescription("Startpoint", line); line += ' '; reportDescription("Endpoint", line); @@ -1010,7 +1009,7 @@ ReportPath::reportSummaryHeader() const void ReportPath::reportSummaryLine(const PathEnd *end) const { - string line; + std::string line; PathExpanded expanded(end->path(), this); const EarlyLate *early_late = end->pathEarlyLate(this); auto startpoint = pathStartpoint(end, expanded); @@ -1025,7 +1024,7 @@ ReportPath::reportSummaryLine(const PathEnd *end) const report_->reportLineString(line); } -string +std::string ReportPath::pathStartpoint(const PathEnd *end, const PathExpanded &expanded) const { @@ -1043,7 +1042,7 @@ ReportPath::pathStartpoint(const PathEnd *end, } } -string +std::string ReportPath::pathEndpoint(const PathEnd *end) const { Pin *pin = end->vertex(this)->pin(); @@ -1078,7 +1077,7 @@ void ReportPath::reportJson(const PathEnd *end, bool last) const { - string result; + std::string result; result += "{\n"; stringAppend(result, " \"type\": \"%s\",\n", end->typeName()); stringAppend(result, " \"path_group\": \"%s\",\n", @@ -1149,7 +1148,7 @@ ReportPath::reportJson(const PathEnd *end, void ReportPath::reportJson(const Path *path) const { - string result; + std::string result; result += "{\n"; reportJson(path, "path", 0, false, result); result += "}\n"; @@ -1161,7 +1160,7 @@ ReportPath::reportJson(const Path *path, const char *path_name, int indent, bool trailing_comma, - string &result) const + std::string &result) const { PathExpanded expanded(path, this); reportJson(expanded, path_name, indent, trailing_comma, result); @@ -1172,7 +1171,7 @@ ReportPath::reportJson(const PathExpanded &expanded, const char *path_name, int indent, bool trailing_comma, - string &result) const + std::string &result) const { stringAppend(result, "%*s\"%s\": [\n", indent, "", path_name); for (size_t i = expanded.startIndex(); i < expanded.size(); i++) { @@ -1256,7 +1255,7 @@ ReportPath::reportJson(const PathExpanded &expanded, void ReportPath::reportSlackOnlyHeader() const { - string line; + std::string line; reportDescription("Group", line); line += ' '; reportField("Slack", field_total_, line); @@ -1268,7 +1267,7 @@ ReportPath::reportSlackOnlyHeader() const void ReportPath::reportSlackOnly(const PathEnd *end) const { - string line; + std::string line; const EarlyLate *early_late = end->pathEarlyLate(this); reportDescription(end->pathGroup()->name(), line); if (end->isUnconstrained()) @@ -1318,7 +1317,7 @@ ReportPath::reportMpwChecks(const MinPulseWidthCheckSeq &checks, void ReportPath::reportMpwHeaderShort() const { - string line; + std::string line; reportDescription("", line); line += ' '; reportField("Required", field_total_, line); @@ -1342,7 +1341,7 @@ ReportPath::reportMpwHeaderShort() const void ReportPath::reportShort(const MinPulseWidthCheck &check) const { - string line; + std::string line; const char *pin_name = cmd_network_->pathName(check.pin(this)); const char *hi_low = mpwCheckHiLow(check); auto what = stdstrPrint("%s (%s)", pin_name, hi_low); @@ -1356,7 +1355,7 @@ ReportPath::reportShort(const MinPulseWidthCheck &check) const void ReportPath::reportVerbose(const MinPulseWidthCheck &check) const { - string line; + std::string line; const char *pin_name = cmd_network_->pathName(check.pin(this)); line += "Pin: "; line += pin_name; @@ -1462,7 +1461,7 @@ ReportPath::reportChecks(const MinPeriodCheckSeq &checks, void ReportPath::reportPeriodHeaderShort() const { - string line; + std::string line; reportDescription("", line); line += ' '; reportField("", field_total_, line); @@ -1488,7 +1487,7 @@ ReportPath::reportPeriodHeaderShort() const void ReportPath::reportShort(const MinPeriodCheck &check) const { - string line; + std::string line; const char *pin_name = cmd_network_->pathName(check.pin()); reportDescription(pin_name, line); reportSpaceFieldDelay(check.period(), EarlyLate::early(), line); @@ -1500,7 +1499,7 @@ ReportPath::reportShort(const MinPeriodCheck &check) const void ReportPath::reportVerbose(const MinPeriodCheck &check) const { - string line; + std::string line; const char *pin_name = cmd_network_->pathName(check.pin()); line += "Pin: "; line += pin_name; @@ -1536,7 +1535,7 @@ ReportPath::reportChecks(const MaxSkewCheckSeq &checks, void ReportPath::reportMaxSkewHeaderShort() const { - string line; + std::string line; reportDescription("", line); line += ' '; reportField("Required", field_total_, line); @@ -1562,7 +1561,7 @@ ReportPath::reportMaxSkewHeaderShort() const void ReportPath::reportShort(const MaxSkewCheck &check) const { - string line; + std::string line; Pin *clk_pin = check.clkPin(this); const char *clk_pin_name = network_->pathName(clk_pin); TimingArc *check_arc = check.checkArc(); @@ -1581,7 +1580,7 @@ ReportPath::reportShort(const MaxSkewCheck &check) const void ReportPath::reportVerbose(const MaxSkewCheck &check) const { - string line; + std::string line; const char *clk_pin_name = cmd_network_->pathName(check.clkPin(this)); line += "Constrained Pin: "; line += clk_pin_name; @@ -1617,7 +1616,7 @@ ReportPath::reportSkewClkPath(const char *arrival_msg, const EarlyLate *early_late = clk_path->minMax(this); const RiseFall *clk_rf = clk_edge->transition(); const RiseFall *clk_end_rf = clk_path->transition(this); - string clk_name = clkName(clk, clk_end_rf != clk_rf); + std::string clk_name = clkName(clk, clk_end_rf != clk_rf); float clk_time = clk_edge->time(); const Arrival &clk_arrival = search_->clkPathArrival(clk_path); Arrival clk_delay = clk_arrival - clk_time; @@ -1656,7 +1655,7 @@ ReportPath::reportSkewClkPath(const char *arrival_msg, void ReportPath::reportLimitShortHeader(const ReportField *field) const { - string line; + std::string line; reportDescription("Pin", line); line += ' '; reportField("Limit", field, line); @@ -1676,7 +1675,7 @@ ReportPath::reportLimitShort(const ReportField *field, float limit, float slack) const { - string line; + std::string line; const char *pin_name = cmd_network_->pathName(pin); reportDescription(pin_name, line); line += ' '; @@ -1701,7 +1700,7 @@ ReportPath::reportLimitVerbose(const ReportField *field, const Scene *scene, const MinMax *min_max) const { - string line; + std::string line; line += "Pin "; line += cmd_network_->pathName(pin); line += ' '; @@ -1781,7 +1780,7 @@ ReportPath::reportStartpoint(const PathEnd *end, const Path *clk_path = expanded.clkPath(); bool clk_inverted = clk_path && clk_rf != clk_path->transition(this); - string clk_name = clkName(clk, clk_inverted); + std::string clk_name = clkName(clk, clk_inverted); const char *reg_desc = edgeRegLatchDesc(prev_edge, prev_arc); auto reason = stdstrPrint("%s clocked by %s", reg_desc, clk_name.c_str()); reportStartpoint(inst_name, reason); @@ -1829,7 +1828,7 @@ ReportPath::pathFromClkPin(const Path *path, void ReportPath::reportStartpoint(const char *start, - const string reason) const + const std::string reason) const { reportStartEndPoint(start, reason, "Startpoint"); } @@ -1878,17 +1877,17 @@ ReportPath::reportUnclockedEndpoint(const PathEnd *end, void ReportPath::reportEndpoint(const char *end, - const string reason) const + const std::string reason) const { reportStartEndPoint(end, reason, "Endpoint"); } void ReportPath::reportStartEndPoint(const char *pt, - string reason, + std::string reason, const char *key) const { - string line; + std::string line; // Account for punctuation in the line. int line_len = strlen(key) + 2 + strlen(pt) + 2 + reason.size() + 1; if (!no_split_ @@ -1921,7 +1920,7 @@ ReportPath::reportStartEndPoint(const char *pt, void ReportPath::reportGroup(const PathEnd *end) const { - string line; + std::string line; line = "Path Group: "; PathGroup *group = end->pathGroup(); line += group ? group->name() : "(none)"; @@ -1946,13 +1945,13 @@ ReportPath::reportGroup(const PathEnd *end) const //////////////////////////////////////////////////////////////// -string +std::string ReportPath::checkRoleReason(const PathEnd *end) const { return stdstrPrint("%s time", end->checkRole(this)->to_string().c_str()); } -string +std::string ReportPath::tgtClkName(const PathEnd *end) const { const ClockEdge *tgt_clk_edge = end->targetClkEdge(this); @@ -1962,11 +1961,11 @@ ReportPath::tgtClkName(const PathEnd *end) const return clkName(tgt_clk, clk_end_rf != clk_rf); } -string +std::string ReportPath::clkName(const Clock *clk, bool inverted) const { - string name = clk->name(); + std::string name = clk->name(); if (inverted) name += '\''; return name; @@ -2088,7 +2087,7 @@ ReportPath::reportSrcClkAndPath(const Path *path, } } } - string clk_name = clkName(clk, clk_rf != clk_end_rf); + std::string clk_name = clkName(clk, clk_rf != clk_end_rf); bool clk_used_as_data = pathFromClkPin(expanded); bool is_prop = isPropagated(path); @@ -2185,7 +2184,7 @@ ReportPath::reportTgtClk(const PathEnd *end, Clock *clk = clk_edge->clock(); const RiseFall *clk_rf = clk_edge->transition(); const RiseFall *clk_end_rf = end->targetClkEndTrans(this); - string clk_name = clkName(clk, clk_end_rf != clk_rf); + std::string clk_name = clkName(clk, clk_end_rf != clk_rf); float clk_time = prev_time + end->targetClkTime(this) + end->targetClkMcpAdjustment(this) @@ -2439,7 +2438,7 @@ ReportPath::reportPathLine(const Path *path, { Vertex *vertex = path->vertex(this); Pin *pin = vertex->pin(); - const string what = descriptionField(vertex); + const std::string what = descriptionField(vertex); const RiseFall *rf = path->transition(this); bool is_driver = network_->isDriver(pin); const EarlyLate *early_late = path->minMax(this); @@ -2449,7 +2448,7 @@ ReportPath::reportPathLine(const Path *path, Slew slew = graph_->slew(vertex, rf, slew_index); float cap = field_blank_; Instance *inst = network_->instance(pin); - string src_attr = ""; + std::string src_attr = ""; if (inst) src_attr = network_->getAttribute(inst, "src"); // Don't show capacitance field for input pins. @@ -2462,7 +2461,7 @@ ReportPath::reportPathLine(const Path *path, void ReportPath::reportRequired(const PathEnd *end, - string margin_msg) const + std::string margin_msg) const { Required req_time = end->requiredTimeOffset(this); const EarlyLate *early_late = end->clkEarlyLate(this); @@ -2503,7 +2502,7 @@ ReportPath::reportSlack(Slack slack) const void ReportPath::reportSpaceSlack(const PathEnd *end, - string &result) const + std::string &result) const { Slack slack = end->slack(this); reportSpaceSlack(slack, result); @@ -2511,7 +2510,7 @@ ReportPath::reportSpaceSlack(const PathEnd *end, void ReportPath::reportSpaceSlack(Slack slack, - string &result) const + std::string &result) const { const EarlyLate *early_late = EarlyLate::early(); reportSpaceFieldDelay(slack, early_late, result); @@ -2718,7 +2717,7 @@ ReportPath::reportPath6(const Path *path, bool is_clk_start = path1->vertex(this) == clk_start; bool is_clk = path1->isClock(search_); Instance *inst = network_->instance(pin); - string src_attr = ""; + std::string src_attr = ""; if (inst) src_attr = network_->getAttribute(inst, "src"); // Always show the search start point (register clk pin). @@ -2804,13 +2803,13 @@ ReportPath::reportPath6(const Path *path, cap = graph_delay_calc_->loadCap(pin, rf, scene, min_max); if (field_fanout_->enabled()) fanout = drvrFanout(vertex, scene, min_max); - const string what = descriptionField(vertex); + const std::string what = descriptionField(vertex); reportLine(what.c_str(), cap, slew, fanout, incr, time, false, min_max, rf, src_attr, line_case); if (report_net_) { - const string what2 = descriptionNet(pin); + const std::string what2 = descriptionNet(pin); reportLine(what2.c_str(), field_blank_, field_blank_, field_blank_, field_blank_, field_blank_, false, min_max, nullptr, src_attr, ""); @@ -2823,7 +2822,7 @@ ReportPath::reportPath6(const Path *path, || (i == 0) || (i == path_last_index) || is_clk_start) { - const string what = descriptionField(vertex); + const std::string what = descriptionField(vertex); reportLine(what.c_str(), field_blank_, slew, field_blank_, incr, time, false, min_max, rf, src_attr, line_case); @@ -2843,7 +2842,7 @@ ReportPath::reportHierPinsThru(const Path *path) const const Edge *prev_edge = path->prevEdge(this); if (prev_edge && prev_edge->isWire()) { for (const Pin *hpin : hierPinsThruEdge(prev_edge, network_, graph_)) { - const string what = descriptionField(hpin); + const std::string what = descriptionField(hpin); reportLine(what.c_str(), field_blank_, field_blank_, field_blank_, field_blank_, field_blank_, false, path->minMax(this), nullptr, "", ""); @@ -2874,13 +2873,13 @@ ReportPath::nextArcAnnotated(const Path *next_path, return graph_->arcDelayAnnotated(edge, arc, ap_index); } -string +std::string ReportPath::descriptionField(const Vertex *vertex) const { return descriptionField(vertex->pin()); } -string +std::string ReportPath::descriptionField(const Pin *pin) const { const char *pin_name = cmd_network_->pathName(pin); @@ -2906,7 +2905,7 @@ ReportPath::descriptionField(const Pin *pin) const return stdstrPrint("%s (%s)", pin_name, name2); } -string +std::string ReportPath::descriptionNet(const Pin *pin) const { if (network_->isTopLevelPort(pin)) { @@ -3028,7 +3027,7 @@ ReportPath::pathInputDelayRefPath(const Path *path, void ReportPath::reportPathHeader() const { - string line; + std::string line; bool first_field = true; for (const ReportField *field : fields_) { if (field->enabled()) { @@ -3125,10 +3124,10 @@ ReportPath::reportLine(const char *what, bool total_with_minus, const EarlyLate *early_late, const RiseFall *rf, - string src_attr, + std::string src_attr, const char *line_case) const { - string line; + std::string line; size_t field_index = 0; bool first_field = true; for (const ReportField *field : fields_) { @@ -3180,7 +3179,7 @@ ReportPath::reportLine(const char *what, field_index++; } // Trim trailing spaces and report the line. - string line_stdstr = line; + std::string line_stdstr = line; trimRight(line_stdstr); report_->reportLineString(line_stdstr.c_str()); } @@ -3211,7 +3210,7 @@ ReportPath::reportLineTotal1(const char *what, bool incr_with_minus, const EarlyLate *early_late) const { - string line; + std::string line; reportDescription(what, line); line += ' '; if (incr_with_minus) @@ -3231,7 +3230,7 @@ ReportPath::reportDashLineTotal() const void ReportPath::reportDescription(const char *what, - string &line) const + std::string &line) const { reportDescription(what, false, false, line); } @@ -3240,7 +3239,7 @@ void ReportPath::reportDescription(const char *what, bool first_field, bool last_field, - string &line) const + std::string &line) const { line += what; int length = strlen(what); @@ -3260,7 +3259,7 @@ ReportPath::reportDescription(const char *what, void ReportPath::reportFieldTime(float value, ReportField *field, - string &line) const + std::string &line) const { if (delayAsFloat(value) == field_blank_) reportFieldBlank(field, line); @@ -3275,7 +3274,7 @@ ReportPath::reportFieldTime(float value, void ReportPath::reportSpaceFieldTime(float value, - string &line) const + std::string &line) const { line += ' '; reportFieldTime(value, field_total_, line); @@ -3284,7 +3283,7 @@ ReportPath::reportSpaceFieldTime(float value, void ReportPath::reportSpaceFieldDelay(Delay value, const EarlyLate *early_late, - string &line) const + std::string &line) const { line += ' '; reportTotalDelay(value, early_late, line); @@ -3293,7 +3292,7 @@ ReportPath::reportSpaceFieldDelay(Delay value, void ReportPath::reportTotalDelay(Delay value, const EarlyLate *early_late, - string &line) const + std::string &line) const { const char *str = delayAsString(value, early_late, this, digits_); if (stringEq(str, minus_zero_)) @@ -3307,7 +3306,7 @@ void ReportPath::reportFieldDelayMinus(Delay value, const EarlyLate *early_late, const ReportField *field, - string &line) const + std::string &line) const { if (delayAsFloat(value) == field_blank_) reportFieldBlank(field, line); @@ -3327,7 +3326,7 @@ void ReportPath::reportFieldDelay(Delay value, const EarlyLate *early_late, const ReportField *field, - string &line) const + std::string &line) const { if (delayAsFloat(value) == field_blank_) reportFieldBlank(field, line); @@ -3345,7 +3344,7 @@ ReportPath::reportFieldDelay(Delay value, void ReportPath::reportField(float value, const ReportField *field, - string &line) const + std::string &line) const { if (value == field_blank_) reportFieldBlank(field, line); @@ -3357,7 +3356,7 @@ ReportPath::reportField(float value, } else { // fanout - string value_str; + std::string value_str; stringPrint(value_str, "%.0f", value); reportField(value_str.c_str(), field, line); } @@ -3367,7 +3366,7 @@ ReportPath::reportField(float value, void ReportPath::reportField(const char *value, const ReportField *field, - string &line) const + std::string &line) const { if (field->leftJustify()) line += value; @@ -3379,7 +3378,7 @@ ReportPath::reportField(const char *value, void ReportPath::reportFieldBlank(const ReportField *field, - string &line) const + std::string &line) const { line += field->blank(); } @@ -3387,7 +3386,7 @@ ReportPath::reportFieldBlank(const ReportField *field, void ReportPath::reportDashLine() const { - string line; + std::string line; for (const ReportField *field : fields_) { if (field->enabled()) { for (int i = 0; i < field->width(); i++) @@ -3401,7 +3400,7 @@ ReportPath::reportDashLine() const void ReportPath::reportDashLine(int line_width) const { - string line; + std::string line; for (int i = 0; i < line_width; i++) line += '-'; report_->reportLineString(line); diff --git a/search/Search.cc b/search/Search.cc index 248477d4..25683114 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -24,8 +24,7 @@ #include "Search.hh" -#include -#include // abs +#include #include "ContainerHelpers.hh" #include "Mutex.hh" @@ -70,10 +69,6 @@ namespace sta { -using std::min; -using std::max; -using std::abs; - //////////////////////////////////////////////////////////////// EvalPred::EvalPred(const StaState *sta) : diff --git a/search/Sta.cc b/search/Sta.cc index baa4ab07..5c096867 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -24,7 +24,9 @@ #include "Sta.hh" +#include #include +#include #include "Machine.hh" #include "ContainerHelpers.hh" @@ -88,10 +90,6 @@ namespace sta { -using std::string; -using std::min; -using std::max; - static bool libertyPortCapsEqual(const LibertyPort *port1, const LibertyPort *port2); @@ -576,7 +574,7 @@ Sta::cmdSdc() const } void -Sta::setCmdMode(const string &mode_name) +Sta::setCmdMode(const std::string &mode_name) { if (!mode_name.empty()) { if (!mode_name_map_.contains(mode_name)) { @@ -3203,8 +3201,8 @@ class EndpointPathEndVisitor : public PathEndVisitor { public: EndpointPathEndVisitor(const std::string &path_group_name, - const MinMax *min_max, - const StaState *sta); + const MinMax *min_max, + const StaState *sta); PathEndVisitor *copy() const; void visit(PathEnd *path_end); Slack slack() const { return slack_; } @@ -3217,8 +3215,8 @@ private: }; EndpointPathEndVisitor::EndpointPathEndVisitor(const std::string &path_group_name, - const MinMax *min_max, - const StaState *sta) : + const MinMax *min_max, + const StaState *sta) : path_group_name_(path_group_name), min_max_(min_max), slack_(MinMax::min()->initValue()), @@ -3249,8 +3247,8 @@ EndpointPathEndVisitor::visit(PathEnd *path_end) Slack Sta::endpointSlack(const Pin *pin, - const std::string &path_group_name, - const MinMax *min_max) + const std::string &path_group_name, + const MinMax *min_max) { ensureGraph(); Vertex *vertex = graph_->pinLoadVertex(pin); @@ -3458,7 +3456,7 @@ MinPeriodEndVisitor::visit(PathEnd *path_end) || pathIsFromInputPort(path_end)))) { Slack slack = path_end->slack(sta_); float period = clk_->period() - delayAsFloat(slack); - min_period_ = max(min_period_, period); + min_period_ = std::max(min_period_, period); } } @@ -3551,12 +3549,12 @@ Sta::worstSlack(const Scene *scene, //////////////////////////////////////////////////////////////// -string +std::string Sta::reportDelayCalc(Edge *edge, - TimingArc *arc, + TimingArc *arc, const Scene *scene, - const MinMax *min_max, - int digits) + const MinMax *min_max, + int digits) { findDelays(); return graph_delay_calc_->reportDelayCalc(edge, arc, scene, min_max, digits); @@ -4097,13 +4095,13 @@ Sta::setResistance(const Net *net, bool Sta::readSpef(const std::string &name, const std::string &filename, - Instance *instance, + Instance *instance, Scene *scene, // -scene deprecated 11/20/2025 - const MinMaxAll *min_max, - bool pin_cap_included, - bool keep_coupling_caps, - float coupling_cap_factor, - bool reduce) + const MinMaxAll *min_max, + bool pin_cap_included, + bool keep_coupling_caps, + float coupling_cap_factor, + bool reduce) { ensureLibLinked(); Parasitics *parasitics = nullptr; @@ -4137,7 +4135,7 @@ Sta::readSpef(const std::string &name, } bool success = readSpefFile(filename.c_str(), instance, - pin_cap_included, keep_coupling_caps, + pin_cap_included, keep_coupling_caps, coupling_cap_factor, reduce, scene, min_max, parasitics, this); delaysInvalid(); @@ -4151,7 +4149,7 @@ Sta::findParasitics(const std::string &name) } void -Sta::reportParasiticAnnotation(const string &spef_name, +Sta::reportParasiticAnnotation(const std::string &spef_name, bool report_unannotated) { ensureLibLinked(); diff --git a/search/WorstSlack.cc b/search/WorstSlack.cc index cad69282..9eae159b 100644 --- a/search/WorstSlack.cc +++ b/search/WorstSlack.cc @@ -24,6 +24,8 @@ #include "WorstSlack.hh" +#include + #include "ContainerHelpers.hh" #include "Debug.hh" #include "Report.hh" @@ -34,8 +36,6 @@ namespace sta { -using std::min; - WorstSlacks::WorstSlacks(StaState *sta) : worst_slacks_(sta->scenePathCount(), sta), sta_(sta) @@ -195,7 +195,7 @@ WorstSlack::sortQueue(PathAPIndex path_ap_index) sort(vertices, slack_less); int vertex_count = vertices.size(); - int threshold_index = min(min_queue_size_, vertex_count - 1); + int threshold_index = std::min(min_queue_size_, vertex_count - 1); Vertex *threshold_vertex = vertices[threshold_index]; slack_threshold_ = search_->wnsSlack(threshold_vertex, path_ap_index); debugPrint(debug_, "wns", 3, "threshold %s", diff --git a/spice/WritePathSpice.cc b/spice/WritePathSpice.cc index 694ba7b3..1368cd51 100644 --- a/spice/WritePathSpice.cc +++ b/spice/WritePathSpice.cc @@ -24,8 +24,8 @@ #include "WritePathSpice.hh" -#include #include +#include #include "Debug.hh" #include "Error.hh" @@ -50,11 +50,6 @@ namespace sta { -using std::string; -using std::ofstream; -using std::ifstream; -using std::max; - typedef int Stage; //////////////////////////////////////////////////////////////// @@ -112,7 +107,7 @@ private: // Stage stageFirst(); Stage stageLast(); - string stageName(Stage stage); + std::string stageName(Stage stage); int stageGateInputPathIndex(Stage stage); int stageDrvrPathIndex(Stage stage); int stageLoadPathIndex(Stage stage); @@ -219,7 +214,7 @@ void WritePathSpice::writeHeader() { const Path *start_path = path_expanded_.startPath(); - string title = stdstrPrint("Path from %s %s to %s %s", + std::string title = stdstrPrint("Path from %s %s to %s %s", network_->pathName(start_path->pin(this)), start_path->transition(this)->to_string().c_str(), network_->pathName(path_->pin(this)), @@ -291,7 +286,7 @@ WritePathSpice::writeStageInstances() streamPrint(spice_stream_, "*****************\n\n"); for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { - string stage_name = stageName(stage); + std::string stage_name = stageName(stage); const char *stage_cname = stage_name.c_str(); if (stage == stageFirst()) streamPrint(spice_stream_, "x%s %s %s %s\n", @@ -450,7 +445,7 @@ WritePathSpice::writeMeasureSlewStmt(Stage stage, { const Pin *pin = path->pin(this); const RiseFall *rf = path->transition(this); - string prefix = stageName(stage); + std::string prefix = stageName(stage); writeMeasureSlewStmt(pin, rf, prefix); } @@ -480,7 +475,7 @@ WritePathSpice::writeInputStage(Stage stage) // External driver not handled. const char *drvr_pin_name = stageDrvrPinName(stage); const char *load_pin_name = stageLoadPinName(stage); - string prefix = stageName(stage); + std::string prefix = stageName(stage); streamPrint(spice_stream_, ".subckt %s %s %s\n", prefix.c_str(), drvr_pin_name, @@ -499,7 +494,7 @@ WritePathSpice::writeGateStage(Stage stage) const char *drvr_pin_name = stageDrvrPinName(stage); const Pin *load_pin = stageLoadPin(stage); const char *load_pin_name = stageLoadPinName(stage); - string subckt_name = "stage" + std::to_string(stage); + std::string subckt_name = "stage" + std::to_string(stage); const Instance *inst = stageInstance(stage); LibertyPort *input_port = stageGateInputPort(stage); @@ -614,10 +609,10 @@ WritePathSpice::stageLast() return (path_expanded_.size() + 1) / 2; } -string +std::string WritePathSpice::stageName(Stage stage) { - string name; + std::string name; stringPrint(name, "stage%d", stage); return name; } diff --git a/spice/WriteSpice.cc b/spice/WriteSpice.cc index 8d55d8c7..9b1bf2c3 100644 --- a/spice/WriteSpice.cc +++ b/spice/WriteSpice.cc @@ -26,6 +26,8 @@ #include // swap #include +#include +#include #include "cudd.h" @@ -50,12 +52,6 @@ namespace sta { -using std::string; -using std::ifstream; -using std::ofstream; -using std::swap; -using std::set; - Net * pinNet(const Pin *pin, const Network *network); @@ -68,7 +64,7 @@ public: const char *what() const noexcept; protected: - string what_; + std::string what_; }; SubcktEndsMissing::SubcktEndsMissing(const char *cell_name, @@ -137,7 +133,7 @@ WriteSpice::initPowerGnd() } void -WriteSpice::writeHeader(string &title, +WriteSpice::writeHeader(std::string &title, float max_time, float time_step) { @@ -159,21 +155,21 @@ WriteSpice::writePrintStmt(StdStringSeq &node_names) { streamPrint(spice_stream_, ".print tran"); if (ckt_sim_ == CircuitSim::xyce) { - string csv_filename = replaceFileExt(spice_filename_, "csv"); + std::string csv_filename = replaceFileExt(spice_filename_, "csv"); streamPrint(spice_stream_, " format=csv file=%s", csv_filename.c_str()); writeGnuplotFile(node_names); } - for (string &name : node_names) + for (std::string &name : node_names) streamPrint(spice_stream_, " v(%s)", name.c_str()); streamPrint(spice_stream_, "\n\n"); } -string -WriteSpice::replaceFileExt(string filename, +std::string +WriteSpice::replaceFileExt(std::string filename, const char *ext) { size_t dot = filename.rfind('.'); - string ext_filename = filename.substr(0, dot + 1); + std::string ext_filename = filename.substr(0, dot + 1); ext_filename += ext; return ext_filename; } @@ -184,7 +180,7 @@ WriteSpice::writeGnuplotFile(StdStringSeq &node_nanes) { std::string gnuplot_filename = replaceFileExt(spice_filename_, "gnuplot"); std::string csv_filename = replaceFileExt(spice_filename_, "csv"); - ofstream gnuplot_stream; + std::ofstream gnuplot_stream; gnuplot_stream.open(gnuplot_filename); if (gnuplot_stream.is_open()) { streamPrint(gnuplot_stream, "set datafile separator ','\n"); @@ -206,12 +202,12 @@ void WriteSpice::writeSubckts(StdStringSet &cell_names) { findCellSubckts(cell_names); - ifstream lib_subckts_stream(lib_subckt_filename_); + std::ifstream lib_subckts_stream(lib_subckt_filename_); if (lib_subckts_stream.is_open()) { - ofstream subckts_stream(subckt_filename_); + std::ofstream subckts_stream(subckt_filename_); if (subckts_stream.is_open()) { - string line; - while (getline(lib_subckts_stream, line)) { + std::string line; + while (std::getline(lib_subckts_stream, line)) { // .subckt [args..] StdStringSeq tokens = parseTokens(line, ' '); if (tokens.size() >= 2 @@ -220,7 +216,7 @@ WriteSpice::writeSubckts(StdStringSet &cell_names) if (cell_names.contains(cell_name)) { subckts_stream << line << "\n"; bool found_ends = false; - while (getline(lib_subckts_stream, line)) { + while (std::getline(lib_subckts_stream, line)) { subckts_stream << line << "\n"; if (stringBeginEqual(line.c_str(), ".ends")) { subckts_stream << "\n"; @@ -239,13 +235,13 @@ WriteSpice::writeSubckts(StdStringSet &cell_names) lib_subckts_stream.close(); if (!cell_names.empty()) { - string missing_cells; - for (const string &cell_name : cell_names) { - missing_cells += "\n"; - missing_cells += cell_name; + std::string missing_cells; + for (const std::string &cell_name : cell_names) { + missing_cells += "\n"; + missing_cells += cell_name; } - report_->error(1605, "The subkct file %s is missing definitions for %s", - lib_subckt_filename_, + report_->error(1605, "The subkct file %s is missing definitions for %s", + lib_subckt_filename_, missing_cells.c_str()); } } @@ -284,10 +280,10 @@ WriteSpice::recordSpicePortNames(const char *cell_name, void WriteSpice::findCellSubckts(StdStringSet &cell_names) { - ifstream lib_subckts_stream(lib_subckt_filename_); + std::ifstream lib_subckts_stream(lib_subckt_filename_); if (lib_subckts_stream.is_open()) { - string line; - while (getline(lib_subckts_stream, line)) { + std::string line; + while (std::getline(lib_subckts_stream, line)) { // .subckt [args..] StdStringSeq tokens = parseTokens(line, ' '); if (tokens.size() >= 2 @@ -295,15 +291,15 @@ WriteSpice::findCellSubckts(StdStringSet &cell_names) const char *cell_name = tokens[1].c_str(); if (cell_names.contains(cell_name)) { // Scan the subckt definition for subckt calls. - string stmt; - while (getline(lib_subckts_stream, line)) { + std::string stmt; + while (std::getline(lib_subckts_stream, line)) { if (line[0] == '+') stmt += line.substr(1); else { // Process previous statement. if (tolower(stmt[0]) == 'x') { StdStringSeq tokens = parseTokens(line, ' '); - string &subckt_cell = tokens[tokens.size() - 1]; + std::string &subckt_cell = tokens[tokens.size() - 1]; cell_names.insert(subckt_cell); } stmt = line; @@ -329,7 +325,7 @@ WriteSpice::writeSubcktInst(const Instance *inst) const char *cell_name = cell->name(); StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; streamPrint(spice_stream_, "x%s", inst_name); - for (string subckt_port_name : spice_port_names) { + for (std::string subckt_port_name : spice_port_names) { const char *subckt_port_cname = subckt_port_name.c_str(); Pin *pin = network_->findPin(inst, subckt_port_cname); LibertyPort *pg_port = cell->findLibertyPort(subckt_port_cname); @@ -359,7 +355,7 @@ WriteSpice::writeSubcktInstVoltSrcs(const Instance *inst, const char *inst_name = network_->pathName(inst); debugPrint(debug_, "write_spice", 2, "subckt %s", cell->name()); - for (string subckt_port_sname : spice_port_names) { + for (std::string subckt_port_sname : spice_port_names) { const char *subckt_port_name = subckt_port_sname.c_str(); LibertyPort *port = cell->findLibertyPort(subckt_port_name); const Pin *pin = port ? network_->findPin(inst, port) : nullptr; @@ -412,7 +408,7 @@ WriteSpice::writeVoltageSource(const char *inst_name, const char *port_name, float voltage) { - string node_name = inst_name; + std::string node_name = inst_name; node_name += '/'; node_name += port_name; writeVoltageSource(node_name.c_str(), voltage); @@ -536,7 +532,7 @@ WriteSpice::writeParasiticNetwork(const Pin *drvr_pin, const Parasitic *parasitic, const NetSet &coupling_nets) { - set reachable_pins; + std::set reachable_pins; // Sort resistors for consistent regression results. ParasiticResistorSeq resistors = parasitics_->resistors(parasitic); sort(resistors, [this] (const ParasiticResistor *r1, @@ -614,8 +610,8 @@ WriteSpice::writeParasiticNetwork(const Pin *drvr_pin, const Net *net1 = node1 ? parasitics_->net(node1, network_) : nullptr; const Net *net2 = node2 ? parasitics_->net(node2, network_) : nullptr; if (net2 == net) { - swap(net1, net2); - swap(node1, node2); + std::swap(net1, net2); + std::swap(node1, node2); } if (net2 && coupling_nets.contains(net2)) // Write half the capacitance because the coupled net will do the same. @@ -1036,7 +1032,7 @@ WriteSpice::writeMeasureDelayStmt(const Pin *from_pin, const RiseFall *from_rf, const Pin *to_pin, const RiseFall *to_rf, - string prefix) + std::string prefix) { const char *from_pin_name = network_->pathName(from_pin); float from_threshold = power_voltage_ * default_library_->inputThreshold(from_rf); @@ -1062,7 +1058,7 @@ WriteSpice::writeMeasureDelayStmt(const Pin *from_pin, void WriteSpice::writeMeasureSlewStmt(const Pin *pin, const RiseFall *rf, - string prefix) + std::string prefix) { const char *pin_name = network_->pathName(pin); const char *spice_rf = spiceTrans(rf); @@ -1108,7 +1104,7 @@ WriteSpice::spiceTrans(const RiseFall *rf) // fprintf for c++ streams. // Yes, I hate formatted output to ostream THAT much. void -streamPrint(ofstream &stream, +streamPrint(std::ofstream &stream, const char *fmt, ...) { diff --git a/spice/Xyce.cc b/spice/Xyce.cc index f198df70..a4a0f3b6 100644 --- a/spice/Xyce.cc +++ b/spice/Xyce.cc @@ -26,55 +26,49 @@ #include "Xyce.hh" #include -#include #include +#include +#include #include "Error.hh" namespace sta { -using std::string; -using std::ifstream; -using std::getline; -using std::stringstream; -using std::vector; -using std::make_shared; - void readXyceCsv(const char *csv_filename, // Return values. StdStringSeq &titles, WaveformSeq &waveforms) { - ifstream file(csv_filename); + std::ifstream file(csv_filename); if (file.is_open()) { - string line; + std::string line; // Read the header line. - getline(file, line); - stringstream ss(line); - string field; + std::getline(file, line); + std::stringstream ss(line); + std::string field; size_t col = 0; - while (getline(ss, field, ',')) { + while (std::getline(ss, field, ',')) { // Skip TIME title. if (col > 0) titles.push_back(field); col++; } - vector values(titles.size() + 1); - while (getline(file, line)) { - stringstream ss(line); + std::vector values(titles.size() + 1); + while (std::getline(file, line)) { + std::stringstream ss(line); size_t col = 0; - while (getline(ss, field, ',')) { + while (std::getline(ss, field, ',')) { float value = std::stof(field); values[col].push_back(value); col++; } } file.close(); - TableAxisPtr time_axis = make_shared(TableAxisVariable::time, - std::move(values[0])); + TableAxisPtr time_axis = std::make_shared(TableAxisVariable::time, + std::move(values[0])); for (size_t var = 1; var < values.size(); var++) waveforms.emplace_back(new FloatSeq(values[var]), time_axis); } diff --git a/util/Fuzzy.cc b/util/Fuzzy.cc index f7158366..bd055f1d 100644 --- a/util/Fuzzy.cc +++ b/util/Fuzzy.cc @@ -31,9 +31,6 @@ namespace sta { -using std::max; -using std::abs; - constexpr static float float_equal_tolerance = 1E-15F; bool @@ -43,18 +40,18 @@ fuzzyEqual(float v1, if (v1 == v2) return true; else if (v1 == 0.0) - return abs(v2) < float_equal_tolerance; + return std::abs(v2) < float_equal_tolerance; else if (v2 == 0.0) - return abs(v1) < float_equal_tolerance; + return std::abs(v1) < float_equal_tolerance; else - return abs(v1 - v2) < 1E-6F * max(abs(v1), abs(v2)); + return std::abs(v1 - v2) < 1E-6F * std::max(std::abs(v1), std::abs(v2)); } bool fuzzyZero(float v) { return v == 0.0 - || abs(v) < float_equal_tolerance; + || std::abs(v) < float_equal_tolerance; } bool diff --git a/util/PatternMatch.cc b/util/PatternMatch.cc index 8b1e49e8..7e814258 100644 --- a/util/PatternMatch.cc +++ b/util/PatternMatch.cc @@ -28,8 +28,6 @@ namespace sta { -using std::string; - PatternMatch::PatternMatch(const char *pattern, bool is_regexp, bool nocase, @@ -65,7 +63,7 @@ PatternMatch::PatternMatch(const char *pattern, compileRegexp(); } -PatternMatch::PatternMatch(const string &pattern, +PatternMatch::PatternMatch(const std::string &pattern, const PatternMatch *inherit_from) : pattern_(pattern.c_str()), is_regexp_(inherit_from->is_regexp_), @@ -83,7 +81,7 @@ PatternMatch::compileRegexp() int flags = TCL_REG_ADVANCED; if (nocase_) flags |= TCL_REG_NOCASE; - string anchored_pattern; + std::string anchored_pattern; anchored_pattern += '^'; anchored_pattern += pattern_; anchored_pattern += '$'; @@ -112,7 +110,7 @@ PatternMatch::hasWildcards() const } bool -PatternMatch::match(const string &str) const +PatternMatch::match(const std::string &str) const { return match(str.c_str()); } diff --git a/util/Report.cc b/util/Report.cc index 5f6b885b..6772484e 100644 --- a/util/Report.cc +++ b/util/Report.cc @@ -33,8 +33,6 @@ namespace sta { -using std::min; - Report *Report::default_ = nullptr; Report::Report() : @@ -78,11 +76,11 @@ Report::printString(const char *buffer, redirectStringPrint(buffer, length); else { if (redirect_stream_) - ret = min(ret, fwrite(buffer, sizeof(char), length, redirect_stream_)); + ret = std::min(ret, fwrite(buffer, sizeof(char), length, redirect_stream_)); else - ret = min(ret, printConsole(buffer, length)); + ret = std::min(ret, printConsole(buffer, length)); if (log_stream_) - ret = min(ret, fwrite(buffer, sizeof(char), length, log_stream_)); + ret = std::min(ret, fwrite(buffer, sizeof(char), length, log_stream_)); } return ret; } diff --git a/util/StringUtil.cc b/util/StringUtil.cc index 6a8680e4..991d25db 100644 --- a/util/StringUtil.cc +++ b/util/StringUtil.cc @@ -24,21 +24,17 @@ #include "StringUtil.hh" -#include +#include +#include #include #include #include // exit -#include -#include #include "Machine.hh" #include "Mutex.hh" namespace sta { -using std::max; -using std::string; - static void stringPrintTmp(const char *fmt, va_list args, @@ -76,7 +72,7 @@ isDigits(const char *str) // print for c++ strings. void -stringPrint(string &str, +stringPrint(std::string &str, const char *fmt, ...) { @@ -90,7 +86,7 @@ stringPrint(string &str, } void -stringAppend(string &str, +stringAppend(std::string &str, const char *fmt, ...) { @@ -103,7 +99,7 @@ stringAppend(string &str, str += tmp; } -string +std::string stdstrPrint(const char *fmt, ...) { @@ -223,7 +219,7 @@ makeTmpString(size_t length) if (tmp_length < length) { // String isn't long enough. Make a new one. delete [] tmp_str; - tmp_length = max(tmp_string_initial_length, length); + tmp_length = std::max(tmp_string_initial_length, length); tmp_str = new char[tmp_length]; tmp_strings[tmp_string_next] = tmp_str; tmp_string_lengths[tmp_string_next] = tmp_length; @@ -233,7 +229,7 @@ makeTmpString(size_t length) } char * -makeTmpString(string &str) +makeTmpString(std::string &str) { char *tmp = makeTmpString(str.length() + 1); strcpy(tmp, str.c_str()); @@ -264,24 +260,24 @@ isTmpString(const char *str) //////////////////////////////////////////////////////////////// void -trimRight(string &str) +trimRight(std::string &str) { str.erase(str.find_last_not_of(" ") + 1); } StdStringSeq -split(const string &text, - const string &delims) +split(const std::string &text, + const std::string &delims) { StdStringSeq tokens; auto start = text.find_first_not_of(delims); auto end = text.find_first_of(delims, start); - while (end != string::npos) { + while (end != std::string::npos) { tokens.push_back(text.substr(start, end - start)); start = text.find_first_not_of(delims, end); end = text.find_first_of(delims, start); } - if (start != string::npos) + if (start != std::string::npos) tokens.push_back(text.substr(start)); return tokens; } diff --git a/util/Transition.cc b/util/Transition.cc index a77a898b..0e09243c 100644 --- a/util/Transition.cc +++ b/util/Transition.cc @@ -24,12 +24,12 @@ #include "Transition.hh" +#include + #include "ContainerHelpers.hh" namespace sta { -using std::max; - const RiseFall RiseFall::rise_("rise", "^", 0); const RiseFall RiseFall::fall_("fall", "v", 1); const std::array RiseFall::range_{&rise_, &fall_}; @@ -195,7 +195,7 @@ Transition::Transition(const char *name, { transition_map_[name_] = this; transition_map_[init_final_] = this; - max_index_ = max(sdf_triple_index, max_index_); + max_index_ = std::max(sdf_triple_index, max_index_); } bool diff --git a/verilog/VerilogReader.cc b/verilog/VerilogReader.cc index e7ac21d3..e101d0f9 100644 --- a/verilog/VerilogReader.cc +++ b/verilog/VerilogReader.cc @@ -25,6 +25,7 @@ #include "VerilogReader.hh" #include +#include #include "ContainerHelpers.hh" #include "Zlib.hh" @@ -42,12 +43,10 @@ namespace sta { -using std::string; - using VerilogConstant10 = unsigned long long; -static string -verilogBusBitName(const string &bus_name, +static std::string +verilogBusBitName(const std::string &bus_name, int index); static int hierarchyLevel(Net *net, @@ -227,13 +226,13 @@ VerilogReader::module(Cell *cell) } void -VerilogReader::makeModule(const string *module_vname, +VerilogReader::makeModule(const std::string *module_vname, VerilogNetSeq *ports, VerilogStmtSeq *stmts, VerilogAttrStmtSeq *attr_stmts, int line) { - const string module_name = moduleVerilogToSta(module_vname); + const std::string module_name = moduleVerilogToSta(module_vname); Cell *cell = network_->findCell(library_, module_name.c_str()); if (cell) { VerilogModule *module = module_map_[cell]; @@ -258,7 +257,7 @@ VerilogReader::makeModule(const string *module_vname, } void -VerilogReader::makeModule(const string *module_name, +VerilogReader::makeModule(const std::string *module_name, VerilogStmtSeq *port_dcls, VerilogStmtSeq *stmts, VerilogAttrStmtSeq *attr_stmts, @@ -288,7 +287,7 @@ VerilogReader::makeCellPorts(Cell *cell, { StdStringSet port_names; for (VerilogNet *mod_port : *ports) { - const string &port_name = mod_port->name(); + const std::string &port_name = mod_port->name(); if (!port_names.contains(port_name)) { port_names.insert(port_name); if (mod_port->isNamed()) { @@ -310,7 +309,7 @@ VerilogReader::makeCellPorts(Cell *cell, Port * VerilogReader::makeCellPort(Cell *cell, VerilogModule *module, - const string &port_name) + const std::string &port_name) { VerilogDcl *dcl = module->declaration(port_name.c_str()); if (dcl) { @@ -341,7 +340,7 @@ VerilogReader::makeNamedPortRefCellPorts(Cell *cell, PortSeq *member_ports = new PortSeq; VerilogNetNameIterator *net_name_iter = mod_port->nameIterator(module,this); while (net_name_iter->hasNext()) { - const string &net_name = net_name_iter->next(); + const std::string &net_name = net_name_iter->next(); port_names.insert(net_name); Port *port = makeCellPort(cell, module, net_name); member_ports->push_back(port); @@ -354,7 +353,7 @@ VerilogReader::makeNamedPortRefCellPorts(Cell *cell, // Make sure each declaration appears in the module port list. void VerilogReader::checkModuleDcls(VerilogModule *module, - std::set &port_names) + std::set &port_names) { for (auto const & [port_name, dcl] : *module->declarationMap()) { PortDirection *dir = dcl->direction(); @@ -444,10 +443,10 @@ VerilogReader::makeDclBus(PortDirection *dir, } VerilogDclArg * -VerilogReader::makeDclArg(const string *net_vname) +VerilogReader::makeDclArg(const std::string *net_vname) { dcl_arg_count_++; - const string net_name = netVerilogToSta(net_vname); + const std::string net_name = netVerilogToSta(net_vname); VerilogDclArg *dcl =new VerilogDclArg(net_name); delete net_vname; return dcl; @@ -461,14 +460,14 @@ VerilogReader::makeDclArg(VerilogAssign *assign) } VerilogNetPartSelect * -VerilogReader::makeNetPartSelect(const string *net_vname, +VerilogReader::makeNetPartSelect(const std::string *net_vname, int from_index, int to_index) { net_part_select_count_++; if (report_stmt_stats_) net_bus_names_ += net_vname->size() + 1; - const string net_name = netVerilogToSta(net_vname); + const std::string net_name = netVerilogToSta(net_vname); VerilogNetPartSelect *select = new VerilogNetPartSelect(net_name, from_index, to_index); @@ -477,7 +476,7 @@ VerilogReader::makeNetPartSelect(const string *net_vname, } VerilogNetConstant * -VerilogReader::makeNetConstant(const string *constant, +VerilogReader::makeNetConstant(const std::string *constant, int line) { net_constant_count_++; @@ -485,25 +484,25 @@ VerilogReader::makeNetConstant(const string *constant, } VerilogNetScalar * -VerilogReader::makeNetScalar(const string *net_vname) +VerilogReader::makeNetScalar(const std::string *net_vname) { net_scalar_count_++; if (report_stmt_stats_) net_scalar_names_ += net_vname->size() + 1; - const string net_name = netVerilogToSta(net_vname); + const std::string net_name = netVerilogToSta(net_vname); VerilogNetScalar *scalar = new VerilogNetScalar(net_name); delete net_vname; return scalar; } VerilogNetBitSelect * -VerilogReader::makeNetBitSelect(const string *net_vname, +VerilogReader::makeNetBitSelect(const std::string *net_vname, int index) { net_bit_select_count_++; if (report_stmt_stats_) net_bus_names_ += net_vname->size() + 1; - const string net_name = netVerilogToSta(net_vname); + const std::string net_name = netVerilogToSta(net_vname); VerilogNetBitSelect *select = new VerilogNetBitSelect(net_name, index); delete net_vname; return select; @@ -519,14 +518,14 @@ VerilogReader::makeAssign(VerilogNet *lhs, } VerilogInst * -VerilogReader::makeModuleInst(const string *module_vname, - const string *inst_vname, +VerilogReader::makeModuleInst(const std::string *module_vname, + const std::string *inst_vname, VerilogNetSeq *pins, VerilogAttrStmtSeq *attr_stmts, const int line) { - const string module_name = moduleVerilogToSta(module_vname); - const string inst_name = instanceVerilogToSta(inst_vname); + const std::string module_name = moduleVerilogToSta(module_vname); + const std::string inst_name = instanceVerilogToSta(inst_vname); Cell *cell = network_->findAnyCell(module_name.c_str()); LibertyCell *liberty_cell = nullptr; if (cell) @@ -541,7 +540,7 @@ VerilogReader::makeModuleInst(const string *module_vname, VerilogNetPortRefScalarNet *vpin = dynamic_cast(vnet); const char *port_name = vpin->name().c_str(); - const string &net_name = vpin->netName(); + const std::string &net_name = vpin->netName(); Port *port = network_->findPort(cell, port_name); LibertyPort *lport = network_->libertyPort(port); if (lport->isBus()) { @@ -607,20 +606,20 @@ VerilogReader::hasScalarNamedPortRefs(LibertyCell *liberty_cell, } VerilogNetPortRef * -VerilogReader::makeNetNamedPortRefScalarNet(const string *port_vname) +VerilogReader::makeNetNamedPortRefScalarNet(const std::string *port_vname) { net_port_ref_scalar_net_count_++; if (report_stmt_stats_) port_names_ += port_vname->size() + 1; - const string port_name = portVerilogToSta(port_vname); + const std::string port_name = portVerilogToSta(port_vname); VerilogNetPortRef *ref = new VerilogNetPortRefScalarNet(port_name.c_str()); delete port_vname; return ref; } VerilogNetPortRef * -VerilogReader::makeNetNamedPortRefScalarNet(const string *port_vname, - const string *net_vname) +VerilogReader::makeNetNamedPortRefScalarNet(const std::string *port_vname, + const std::string *net_vname) { net_port_ref_scalar_net_count_++; if (report_stmt_stats_) { @@ -628,8 +627,8 @@ VerilogReader::makeNetNamedPortRefScalarNet(const string *port_vname, net_scalar_names_ += net_vname->size() + 1; port_names_ += port_vname->size() + 1; } - const string port_name = portVerilogToSta(port_vname); - const string net_name = netVerilogToSta(net_vname); + const std::string port_name = portVerilogToSta(port_vname); + const std::string net_name = netVerilogToSta(net_vname); VerilogNetPortRef *ref = new VerilogNetPortRefScalarNet(port_name.c_str(), net_name.c_str()); delete port_vname; @@ -638,18 +637,18 @@ VerilogReader::makeNetNamedPortRefScalarNet(const string *port_vname, } VerilogNetPortRef * -VerilogReader::makeNetNamedPortRefBitSelect(const string *port_vname, - const string *bus_vname, +VerilogReader::makeNetNamedPortRefBitSelect(const std::string *port_vname, + const std::string *bus_vname, int index) { net_port_ref_scalar_net_count_++; - const string bus_name = portVerilogToSta(bus_vname); - const string net_name = verilogBusBitName(bus_name, index); + const std::string bus_name = portVerilogToSta(bus_vname); + const std::string net_name = verilogBusBitName(bus_name, index); if (report_stmt_stats_) { net_scalar_names_ += net_name.length() + 1; port_names_ += port_vname->size() + 1; } - const string port_name = portVerilogToSta(port_vname); + const std::string port_name = portVerilogToSta(port_vname); VerilogNetPortRef *ref = new VerilogNetPortRefScalarNet(port_name.c_str(), net_name.c_str()); delete port_vname; @@ -658,25 +657,25 @@ VerilogReader::makeNetNamedPortRefBitSelect(const string *port_vname, } VerilogNetPortRef * -VerilogReader::makeNetNamedPortRefScalar(const string *port_vname, +VerilogReader::makeNetNamedPortRefScalar(const std::string *port_vname, VerilogNet *net) { net_port_ref_scalar_count_++; if (report_stmt_stats_) port_names_ += port_vname->size() + 1; - const string port_name = portVerilogToSta(port_vname); + const std::string port_name = portVerilogToSta(port_vname); VerilogNetPortRef *ref = new VerilogNetPortRefScalar(port_name.c_str(), net); delete port_vname; return ref; } VerilogNetPortRef * -VerilogReader::makeNetNamedPortRefBit(const string *port_vname, +VerilogReader::makeNetNamedPortRefBit(const std::string *port_vname, int index, VerilogNet *net) { net_port_ref_bit_count_++; - const string port_name = portVerilogToSta(port_vname); + const std::string port_name = portVerilogToSta(port_vname); VerilogNetPortRef *ref = new VerilogNetPortRefBit(port_name.c_str(), index, net); delete port_vname; @@ -684,13 +683,13 @@ VerilogReader::makeNetNamedPortRefBit(const string *port_vname, } VerilogNetPortRef * -VerilogReader::makeNetNamedPortRefPart(const string *port_vname, +VerilogReader::makeNetNamedPortRefPart(const std::string *port_vname, int from_index, int to_index, VerilogNet *net) { net_port_ref_part_count_++; - const string port_name = portVerilogToSta(port_vname); + const std::string port_name = portVerilogToSta(port_vname); VerilogNetPortRef *ref = new VerilogNetPortRefPart(port_name, from_index, to_index, net); @@ -776,11 +775,11 @@ VerilogReader::warn(int id, //////////////////////////////////////////////////////////////// -VerilogModule::VerilogModule(const string &name, +VerilogModule::VerilogModule(const std::string &name, VerilogNetSeq *ports, VerilogStmtSeq *stmts, VerilogAttrStmtSeq *attr_stmts, - const string &filename, + const std::string &filename, int line, VerilogReader *reader) : VerilogStmt(line), @@ -822,7 +821,7 @@ VerilogModule::parseDcl(VerilogDcl *dcl, { for (VerilogDclArg *arg : *dcl->args()) { if (arg->isNamed()) { - const string &net_name = arg->netName(); + const std::string &net_name = arg->netName(); VerilogDcl *existing_dcl = dcl_map_[net_name.c_str()]; if (existing_dcl) { PortDirection *existing_dir = existing_dcl->direction(); @@ -845,7 +844,7 @@ VerilogModule::parseDcl(VerilogDcl *dcl, // input/output/inout dcls. dcl_map_[net_name.c_str()] = dcl; else if (!dcl->direction()->isInternal()) { - string net_vname = netVerilogName(net_name.c_str()); + std::string net_vname = netVerilogName(net_name.c_str()); reader->warn(1395, filename_.c_str(), dcl->line(), "signal %s previously declared on line %d.", net_vname.c_str(), @@ -865,14 +864,14 @@ VerilogModule::checkInstanceName(VerilogInst *inst, StdStringSet &inst_names, VerilogReader *reader) { - string inst_name = inst->instanceName(); + std::string inst_name = inst->instanceName(); if (inst_names.contains(inst_name)) { int i = 1; - string replacement_name; + std::string replacement_name; do { replacement_name = stdstrPrint("%s_%d", inst_name.c_str(), i++); } while (inst_names.contains(replacement_name)); - string inst_vname = instanceVerilogName(inst_name.c_str()); + std::string inst_vname = instanceVerilogName(inst_name.c_str()); reader->warn(1396, filename_.c_str(), inst->line(), "instance name %s duplicated - renamed to %s.", inst_vname.c_str(), @@ -884,7 +883,7 @@ VerilogModule::checkInstanceName(VerilogInst *inst, } VerilogDcl * -VerilogModule::declaration(const string &net_name) +VerilogModule::declaration(const std::string &net_name) { return findKey(dcl_map_, net_name.c_str()); } @@ -896,7 +895,7 @@ VerilogStmt::VerilogStmt(int line) : { } -VerilogInst::VerilogInst(const string &inst_name, +VerilogInst::VerilogInst(const std::string &inst_name, VerilogAttrStmtSeq *attr_stmts, const int line) : VerilogStmt(line), @@ -912,13 +911,13 @@ VerilogInst::~VerilogInst() } void -VerilogInst::setInstanceName(const string &inst_name) +VerilogInst::setInstanceName(const std::string &inst_name) { inst_name_ = inst_name; } -VerilogModuleInst::VerilogModuleInst(const string &module_name, - const string &inst_name, +VerilogModuleInst::VerilogModuleInst(const std::string &module_name, + const std::string &inst_name, VerilogNetSeq *pins, VerilogAttrStmtSeq *attr_stmts, int line) : @@ -953,7 +952,7 @@ VerilogModuleInst::namedPins() } VerilogLibertyInst::VerilogLibertyInst(LibertyCell *cell, - const string &inst_name, + const std::string &inst_name, const StdStringSeq &net_names, VerilogAttrStmtSeq *attr_stmts, const int line) : @@ -1000,7 +999,7 @@ VerilogDcl::appendArg(VerilogDclArg *arg) args_->push_back(arg); } -const string & +const std::string & VerilogDcl::portName() { return (*args_)[0]->netName(); @@ -1036,7 +1035,7 @@ VerilogDclBus::size() const return abs(to_index_ - from_index_) + 1; } -VerilogDclArg::VerilogDclArg(const string &net_name) : +VerilogDclArg::VerilogDclArg(const std::string &net_name) : net_name_(net_name), assign_(nullptr) { @@ -1052,7 +1051,7 @@ VerilogDclArg::~VerilogDclArg() delete assign_; } -const string & +const std::string & VerilogDclArg::netName() { if (assign_) @@ -1082,29 +1081,29 @@ class VerilogNullNetNameIterator : public VerilogNetNameIterator { public: virtual bool hasNext() { return false; } - virtual const string &next(); + virtual const std::string &next(); }; -const string & +const std::string & VerilogNullNetNameIterator::next() { - static const string null; + static const std::string null; return null; } class VerilogOneNetNameIterator : public VerilogNetNameIterator { public: - VerilogOneNetNameIterator(const string &name); + VerilogOneNetNameIterator(const std::string &name); virtual bool hasNext(); - virtual const string &next(); + virtual const std::string &next(); protected: - string name_; + std::string name_; bool has_next_; }; -VerilogOneNetNameIterator::VerilogOneNetNameIterator(const string &name) : +VerilogOneNetNameIterator::VerilogOneNetNameIterator(const std::string &name) : name_(name), has_next_(true) { @@ -1116,7 +1115,7 @@ VerilogOneNetNameIterator::hasNext() return has_next_; } -const string & +const std::string & VerilogOneNetNameIterator::next() { has_next_ = false; @@ -1126,21 +1125,21 @@ VerilogOneNetNameIterator::next() class VerilogBusNetNameIterator : public VerilogNetNameIterator { public: - VerilogBusNetNameIterator(const string bus_name, + VerilogBusNetNameIterator(const std::string bus_name, int from_index, int to_index); virtual bool hasNext(); - virtual const string &next(); + virtual const std::string &next(); protected: - const string bus_name_; + const std::string bus_name_; int from_index_; int to_index_; int index_; - string bit_name_; + std::string bit_name_; }; -VerilogBusNetNameIterator::VerilogBusNetNameIterator(const string bus_name, +VerilogBusNetNameIterator::VerilogBusNetNameIterator(const std::string bus_name, int from_index, int to_index) : bus_name_(bus_name), @@ -1159,7 +1158,7 @@ VerilogBusNetNameIterator::hasNext() && index_ >= to_index_); } -const string & +const std::string & VerilogBusNetNameIterator::next() { bit_name_ = verilogBusBitName(bus_name_, index_); @@ -1170,8 +1169,8 @@ VerilogBusNetNameIterator::next() return bit_name_; } -static string -verilogBusBitName(const string &bus_name, +static std::string +verilogBusBitName(const std::string &bus_name, int index) { return stdstrPrint("%s[%d]", bus_name.c_str(), index); @@ -1181,22 +1180,22 @@ class VerilogConstantNetNameIterator : public VerilogNetNameIterator { public: VerilogConstantNetNameIterator(VerilogConstantValue *value, - const string &zero, - const string &one); + const std::string &zero, + const std::string &one); virtual bool hasNext(); - virtual const string &next(); + virtual const std::string &next(); private: VerilogConstantValue *value_; - const string &zero_; - const string &one_; + const std::string &zero_; + const std::string &one_; int bit_index_; }; VerilogConstantNetNameIterator:: VerilogConstantNetNameIterator(VerilogConstantValue *value, - const string &zero, - const string &one) : + const std::string &zero, + const std::string &one) : value_(value), zero_(zero), one_(one), @@ -1210,7 +1209,7 @@ VerilogConstantNetNameIterator::hasNext() return bit_index_ >= 0; } -const string & +const std::string & VerilogConstantNetNameIterator::next() { return (*value_)[bit_index_--] ? one_ : zero_; @@ -1224,7 +1223,7 @@ public: VerilogReader *reader); virtual ~VerilogNetConcatNameIterator(); virtual bool hasNext(); - virtual const string &next(); + virtual const std::string &next(); private: VerilogModule *module_; @@ -1262,7 +1261,7 @@ VerilogNetConcatNameIterator::hasNext() || net_iter_ != nets_->end(); } -const string & +const std::string & VerilogNetConcatNameIterator::next() { if (net_name_iter_ && net_name_iter_->hasNext()) @@ -1276,15 +1275,15 @@ VerilogNetConcatNameIterator::next() return net_name_iter_->next(); } } - static const string null; + static const std::string null; return null; } //////////////////////////////////////////////////////////////// -const string VerilogNetUnnamed::null_; +const std::string VerilogNetUnnamed::null_; -VerilogNetNamed::VerilogNetNamed(const string &name) : +VerilogNetNamed::VerilogNetNamed(const std::string &name) : VerilogNet(), name_(name) { @@ -1294,7 +1293,7 @@ VerilogNetNamed::~VerilogNetNamed() { } -VerilogNetScalar::VerilogNetScalar(const string &name) : +VerilogNetScalar::VerilogNetScalar(const std::string &name) : VerilogNetNamed(name) { } @@ -1318,7 +1317,7 @@ VerilogNetScalar::size(VerilogModule *module) } static VerilogNetNameIterator * -verilogNetScalarNameIterator(const string &name, +verilogNetScalarNameIterator(const std::string &name, VerilogModule *module) { if (!name.empty()) { @@ -1339,7 +1338,7 @@ VerilogNetScalar::nameIterator(VerilogModule *module, return verilogNetScalarNameIterator(name_.c_str(), module); } -VerilogNetBitSelect::VerilogNetBitSelect(const string &name, +VerilogNetBitSelect::VerilogNetBitSelect(const std::string &name, int index) : VerilogNetNamed(verilogBusBitName(name, index)), index_(index) @@ -1359,7 +1358,7 @@ VerilogNetBitSelect::nameIterator(VerilogModule *, return new VerilogOneNetNameIterator(name_); } -VerilogNetPartSelect::VerilogNetPartSelect(const string &name, +VerilogNetPartSelect::VerilogNetPartSelect(const std::string &name, int from_index, int to_index): VerilogNetNamed(name), @@ -1384,7 +1383,7 @@ VerilogNetPartSelect::nameIterator(VerilogModule *, return new VerilogBusNetNameIterator(name_.c_str(), from_index_, to_index_); } -VerilogNetConstant::VerilogNetConstant(const string *constant, +VerilogNetConstant::VerilogNetConstant(const std::string *constant, VerilogReader *reader, int line) { @@ -1392,13 +1391,13 @@ VerilogNetConstant::VerilogNetConstant(const string *constant, } void -VerilogNetConstant::parseConstant(const string *constant, +VerilogNetConstant::parseConstant(const std::string *constant, VerilogReader *reader, int line) { // Find constant size. size_t csize_end = constant->find('\''); - string csize = constant->substr(0, csize_end); + std::string csize = constant->substr(0, csize_end); // Read the constant size. size_t size = std::stol(csize); @@ -1434,7 +1433,7 @@ VerilogNetConstant::parseConstant(const string *constant, } void -VerilogNetConstant::parseConstant(const string *constant, +VerilogNetConstant::parseConstant(const std::string *constant, size_t base_idx, int base, int digit_bit_count) @@ -1463,13 +1462,13 @@ VerilogNetConstant::parseConstant(const string *constant, } void -VerilogNetConstant::parseConstant10(const string *constant, +VerilogNetConstant::parseConstant10(const std::string *constant, size_t base_idx, VerilogReader *reader, int line) { // Copy the constant skipping underscores. - string tmp; + std::string tmp; for (size_t i = base_idx + 1; i < constant->size(); i++) { char ch = constant->at(i); if (ch != '_') @@ -1478,7 +1477,7 @@ VerilogNetConstant::parseConstant10(const string *constant, size_t size = value_->size(); size_t length = tmp.size(); - const string &constant10_max = reader->constant10Max(); + const std::string &constant10_max = reader->constant10Max(); size_t max_length = constant10_max.size(); if (length > max_length || (length == max_length @@ -1546,18 +1545,18 @@ VerilogNetConcat::nameIterator(VerilogModule *module, return new VerilogNetConcatNameIterator(nets_, module, reader); } -VerilogNetPortRef::VerilogNetPortRef(const string &name) : +VerilogNetPortRef::VerilogNetPortRef(const std::string &name) : VerilogNetScalar(name) { } -VerilogNetPortRefScalarNet::VerilogNetPortRefScalarNet(const string &name) : +VerilogNetPortRefScalarNet::VerilogNetPortRefScalarNet(const std::string &name) : VerilogNetPortRef(name) { } -VerilogNetPortRefScalarNet::VerilogNetPortRefScalarNet(const string &name, - const string &net_name) : +VerilogNetPortRefScalarNet::VerilogNetPortRefScalarNet(const std::string &name, + const std::string &net_name) : VerilogNetPortRef(name), net_name_(net_name) { @@ -1584,7 +1583,7 @@ VerilogNetPortRefScalarNet::nameIterator(VerilogModule *module, return verilogNetScalarNameIterator(net_name_, module); } -VerilogNetPortRefScalar::VerilogNetPortRefScalar(const string &name, +VerilogNetPortRefScalar::VerilogNetPortRefScalar(const std::string &name, VerilogNet *net) : VerilogNetPortRef(name), net_(net) @@ -1615,7 +1614,7 @@ VerilogNetPortRefScalar::nameIterator(VerilogModule *module, return new VerilogNullNetNameIterator(); } -VerilogNetPortRefBit::VerilogNetPortRefBit(const string &name, +VerilogNetPortRefBit::VerilogNetPortRefBit(const std::string &name, int index, VerilogNet *net) : VerilogNetPortRefScalar(name, net), @@ -1623,7 +1622,7 @@ VerilogNetPortRefBit::VerilogNetPortRefBit(const string &name, { } -VerilogNetPortRefPart::VerilogNetPortRefPart(const string &name, +VerilogNetPortRefPart::VerilogNetPortRefPart(const std::string &name, int from_index, int to_index, VerilogNet *net) : @@ -1632,26 +1631,26 @@ VerilogNetPortRefPart::VerilogNetPortRefPart(const string &name, { } -const string & +const std::string & VerilogNetPortRefPart::name() const { return name_; } -VerilogAttrEntry::VerilogAttrEntry(const string &key, - const string &value) : +VerilogAttrEntry::VerilogAttrEntry(const std::string &key, + const std::string &value) : key_(key), value_(value) { } -string +std::string VerilogAttrEntry::key() { return key_; } -string +std::string VerilogAttrEntry::value() { return value_; @@ -1687,8 +1686,8 @@ using BindingMap = std::map; class VerilogBindingTbl { public: - VerilogBindingTbl(const string &zero_net_name_, - const string &one_net_name_); + VerilogBindingTbl(const std::string &zero_net_name_, + const std::string &one_net_name_); Net *ensureNetBinding(const char *net_name, Instance *inst, NetworkReader *network); @@ -1698,8 +1697,8 @@ public: Net *net); private: - const string &zero_net_name_; - const string &one_net_name_; + const std::string &zero_net_name_; + const std::string &one_net_name_; BindingMap map_; }; @@ -1719,7 +1718,7 @@ VerilogReader::linkNetwork(const char *top_cell_name, VerilogNetNameIterator *net_name_iter = mod_port->nameIterator(module, this); while (net_name_iter->hasNext()) { - const string &net_name = net_name_iter->next(); + const std::string &net_name = net_name_iter->next(); Port *port = network_->findPort(top_cell, net_name.c_str()); Net *net = bindings.ensureNetBinding(net_name.c_str(), top_instance, network_); // Guard against repeated port name. @@ -1795,10 +1794,10 @@ VerilogReader::makeModuleInstNetwork(VerilogModuleInst *mod_inst, VerilogBindingTbl *parent_bindings, bool make_black_boxes) { - const string &module_name = mod_inst->moduleName(); + const std::string &module_name = mod_inst->moduleName(); Cell *cell = network_->findAnyCell(module_name.c_str()); if (cell == nullptr) { - string inst_vname = instanceVerilogName(mod_inst->instanceName().c_str()); + std::string inst_vname = instanceVerilogName(mod_inst->instanceName().c_str()); if (make_black_boxes) { cell = makeBlackBox(mod_inst, parent_module); linkWarn(198, parent_module->filename(), mod_inst->line(), @@ -1861,7 +1860,7 @@ VerilogReader::makeNamedInstPins(Cell *cell, VerilogBindingTbl *parent_bindings, bool is_leaf) { - string inst_vname = instanceVerilogName(mod_inst->instanceName().c_str()); + std::string inst_vname = instanceVerilogName(mod_inst->instanceName().c_str()); for (auto mpin : *mod_inst->pins()) { VerilogNetPortRef *vpin = dynamic_cast(mpin); const char *port_name = vpin->name().c_str(); @@ -1921,7 +1920,7 @@ VerilogReader::makeOrderedInstPins(Cell *cell, VerilogNet *net = *pin_iter++; Port *port = port_iter->next(); if (network_->size(port) != net->size(parent_module)) { - string inst_vname = instanceVerilogName(mod_inst->instanceName().c_str()); + std::string inst_vname = instanceVerilogName(mod_inst->instanceName().c_str()); linkWarn(202, parent_module->filename(), mod_inst->line(), "instance %s port %s size %d does not match net size %d.", inst_vname.c_str(), @@ -1959,7 +1958,7 @@ VerilogReader::makeInstPin(Instance *inst, VerilogBindingTbl *parent_bindings, bool is_leaf) { - string net_name; + std::string net_name; if (net_name_iter->hasNext()) net_name = net_name_iter->next(); makeInstPin(inst, port, net_name, bindings, parent, parent_bindings, @@ -1969,7 +1968,7 @@ VerilogReader::makeInstPin(Instance *inst, void VerilogReader::makeInstPin(Instance *inst, Port *port, - const string &net_name, + const std::string &net_name, VerilogBindingTbl *bindings, Instance *parent, VerilogBindingTbl *parent_bindings, @@ -2013,7 +2012,7 @@ VerilogReader::makeLibertyInst(VerilogLibertyInst *lib_inst, LibertyCellPortBitIterator port_iter(lib_cell); while (port_iter.hasNext()) { LibertyPort *port = port_iter.next(); - const string &net_name = net_names[port->pinIndex()]; + const std::string &net_name = net_names[port->pinIndex()]; // net_name may be the name of a single bit bus. if (!net_name.empty()) { Net *net = nullptr; @@ -2023,7 +2022,7 @@ VerilogReader::makeLibertyInst(VerilogLibertyInst *lib_inst, if (dcl && dcl->isBus()) { VerilogDclBus *dcl_bus = dynamic_cast(dcl); // Bus is only 1 bit wide. - string bus_name = verilogBusBitName(net_name, dcl_bus->fromIndex()); + std::string bus_name = verilogBusBitName(net_name, dcl_bus->fromIndex()); net = parent_bindings->ensureNetBinding(bus_name.c_str(), parent, network_); } else @@ -2042,7 +2041,7 @@ Cell * VerilogReader::makeBlackBox(VerilogModuleInst *mod_inst, VerilogModule *parent_module) { - const string &module_name = mod_inst->moduleName(); + const std::string &module_name = mod_inst->moduleName(); Cell *cell = network_->makeCell(library_, module_name.c_str(), true, parent_module->filename()); if (mod_inst->namedPins()) @@ -2109,8 +2108,8 @@ VerilogReader::mergeAssignNet(VerilogAssign *assign, VerilogNetNameIterator *lhs_iter = lhs->nameIterator(module, this); VerilogNetNameIterator *rhs_iter = rhs->nameIterator(module, this); while (lhs_iter->hasNext() && rhs_iter->hasNext()) { - const string &lhs_name = lhs_iter->next(); - const string &rhs_name = rhs_iter->next(); + const std::string &lhs_name = lhs_iter->next(); + const std::string &rhs_name = rhs_iter->next(); Net *lhs_net = bindings->ensureNetBinding(lhs_name.c_str(), inst, network_); Net *rhs_net = bindings->ensureNetBinding(rhs_name.c_str(), inst, network_); // Merge lower level net into higher level net so that deleting @@ -2148,8 +2147,8 @@ hierarchyLevel(Net *net, //////////////////////////////////////////////////////////////// -VerilogBindingTbl::VerilogBindingTbl(const string &zero_net_name, - const string &one_net_name) : +VerilogBindingTbl::VerilogBindingTbl(const std::string &zero_net_name, + const std::string &one_net_name) : zero_net_name_(zero_net_name), one_net_name_(one_net_name) { diff --git a/verilog/VerilogWriter.cc b/verilog/VerilogWriter.cc index 3ba02ba9..a38e44b9 100644 --- a/verilog/VerilogWriter.cc +++ b/verilog/VerilogWriter.cc @@ -24,9 +24,10 @@ #include "VerilogWriter.hh" -#include #include +#include #include +#include #include "Error.hh" #include "Liberty.hh" @@ -38,10 +39,6 @@ namespace sta { -using std::min; -using std::max; -using std::string; - class VerilogWriter { public: @@ -284,8 +281,8 @@ VerilogWriter::writeWireDcls(const Instance *inst) int index; parseBusName(net_name, '[', ']', escape, is_bus, bus_name, index); BusIndexRange &range = bus_ranges[bus_name]; - range.first = max(range.first, index); - range.second = min(range.second, index); + range.first = std::max(range.first, index); + range.second = std::min(range.second, index); } else { std::string net_vname = netVerilogName(net_name); @@ -337,8 +334,8 @@ VerilogWriter::writeChild(const Instance *child) Cell *child_cell = network_->cell(child); if (!remove_cells_.contains(child_cell)) { const char *child_name = network_->name(child); - string child_vname = instanceVerilogName(child_name); - string child_cell_vname = cellVerilogName(network_->name(child_cell)); + std::string child_vname = instanceVerilogName(child_name); + std::string child_cell_vname = cellVerilogName(network_->name(child_cell)); fprintf(stream_, " %s %s (", child_cell_vname.c_str(), child_vname.c_str()); @@ -369,10 +366,10 @@ VerilogWriter::writeInstPin(const Instance *inst, Net *net = network_->net(pin); if (net) { const char *net_name = network_->name(net); - string net_vname = netVerilogName(net_name); + std::string net_vname = netVerilogName(net_name); if (!first_port) fprintf(stream_, ",\n "); - string port_vname = portVerilogName(network_->name(port)); + std::string port_vname = portVerilogName(network_->name(port)); fprintf(stream_, ".%s(%s)", port_vname.c_str(), net_vname.c_str()); @@ -422,13 +419,13 @@ VerilogWriter::writeInstBusPinBit(const Instance *inst, { Pin *pin = network_->findPin(inst, port); Net *net = pin ? network_->net(pin) : nullptr; - string net_name; + std::string net_name; if (net) net_name = network_->name(net); else // There is no verilog syntax to "skip" a bit in the concatentation. stringPrint(net_name, "_NC%d", unconnected_net_index_++); - string net_vname = netVerilogName(net_name.c_str()); + std::string net_vname = netVerilogName(net_name.c_str()); if (!first_member) fprintf(stream_, ",\n "); fprintf(stream_, "%s", net_vname.c_str()); @@ -455,8 +452,8 @@ VerilogWriter::writeAssigns(const Instance *inst) || (include_pwr_gnd_ && network_->direction(port)->isPowerGround())) && !stringEqual(network_->name(port), network_->name(net))) { // Port name is different from net name. - string port_vname = netVerilogName(network_->name(port)); - string net_vname = netVerilogName(network_->name(net)); + std::string port_vname = netVerilogName(network_->name(port)); + std::string net_vname = netVerilogName(network_->name(net)); fprintf(stream_, " assign %s = %s;\n", port_vname.c_str(), net_vname.c_str()); From e054499e4592cd07c0b5fed2e4d7c413d0b4906d Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 2 Mar 2026 13:22:13 -0800 Subject: [PATCH 14/59] report_arrival requires not needed Signed-off-by: James Cherry --- include/sta/Sta.hh | 2 ++ search/Sta.cc | 18 ++++++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index ddb2f7d7..ed1c6c47 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -1517,10 +1517,12 @@ protected: void reportDelaysWrtClks(const Pin *pin, const Scene *scene, int digits, + bool find_required, PathDelayFunc get_path_delay); void reportDelaysWrtClks(Vertex *vertex, const Scene *scene, int digits, + bool find_required, PathDelayFunc get_path_delay); void reportDelaysWrtClks(Vertex *vertex, const ClockEdge *clk_edge, diff --git a/search/Sta.cc b/search/Sta.cc index 5c096867..fa1c3bb4 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -3270,7 +3270,8 @@ Sta::reportArrivalWrtClks(const Pin *pin, const Scene *scene, int digits) { - reportDelaysWrtClks(pin, scene, digits, + searchPreamble(); + reportDelaysWrtClks(pin, scene, digits, false, [] (const Path *path) { return path->arrival(); }); @@ -3281,7 +3282,7 @@ Sta::reportRequiredWrtClks(const Pin *pin, const Scene *scene, int digits) { - reportDelaysWrtClks(pin, scene, digits, + reportDelaysWrtClks(pin, scene, digits, true, [] (const Path *path) { return path->required(); }); @@ -3292,7 +3293,7 @@ Sta::reportSlackWrtClks(const Pin *pin, const Scene *scene, int digits) { - reportDelaysWrtClks(pin, scene, digits, + reportDelaysWrtClks(pin, scene, digits, true, [this] (const Path *path) { return path->slack(this); }); @@ -3302,24 +3303,29 @@ void Sta::reportDelaysWrtClks(const Pin *pin, const Scene *scene, int digits, + bool find_required, PathDelayFunc get_path_delay) { ensureGraph(); Vertex *vertex, *bidir_vertex; graph_->pinVertices(pin, vertex, bidir_vertex); if (vertex) - reportDelaysWrtClks(vertex, scene, digits, get_path_delay); + reportDelaysWrtClks(vertex, scene, digits, find_required, get_path_delay); if (bidir_vertex) - reportDelaysWrtClks(vertex, scene, digits, get_path_delay); + reportDelaysWrtClks(vertex, scene, digits, find_required, get_path_delay); } void Sta::reportDelaysWrtClks(Vertex *vertex, const Scene *scene, int digits, + bool find_required, PathDelayFunc get_path_delay) { - findRequired(vertex); + if (find_required) + findRequired(vertex); + else + search_->findArrivals(vertex->level()); const Sdc *sdc = scene->sdc(); reportDelaysWrtClks(vertex, nullptr, scene, digits, get_path_delay); const ClockEdge *default_clk_edge = sdc->defaultArrivalClock()->edge(RiseFall::rise()); From f89fcbfa115e74add71487218ff3b76e30023288 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 2 Mar 2026 16:26:14 -0800 Subject: [PATCH 15/59] tcl sta::is_ideal_clock Signed-off-by: James Cherry --- include/sta/Sta.hh | 8 ++++---- search/Search.i | 9 +++++++++ search/Sta.cc | 13 +++++++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index ed1c6c47..718f97ae 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -1297,13 +1297,13 @@ public: void clkPinsInvalid(const Mode *mode); // The following functions assume ensureClkNetwork() has been called. bool isClock(const Pin *pin, - const Mode *mode) const; + const Mode *mode); bool isClock(const Net *net, - const Mode *mode) const; + const Mode *mode); bool isIdealClock(const Pin *pin, - const Mode *mode) const; + const Mode *mode); bool isPropagatedClock(const Pin *pin, - const Mode *mode) const; + const Mode *mode); const PinSet *pins(const Clock *clk, const Mode *mode); diff --git a/search/Search.i b/search/Search.i index 8978d530..67d84876 100644 --- a/search/Search.i +++ b/search/Search.i @@ -335,6 +335,15 @@ slow_drivers(int count) return Sta::sta()->slowDrivers(count); } +bool +is_ideal_clock(const Pin *pin) +{ + Sta *sta = Sta::sta(); + const Mode *mode = sta->cmdMode(); + sta->ensureClkNetwork(); + return sta->isIdealClock(pin, mode); +} + //////////////////////////////////////////////////////////////// PathEndSeq diff --git a/search/Sta.cc b/search/Sta.cc index fa1c3bb4..2d91a4f4 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -6054,28 +6054,31 @@ Sta::ensureClkNetwork(const Mode *mode) bool Sta::isClock(const Pin *pin, - const Mode *mode) const + const Mode *mode) { + ensureClkNetwork(mode); return mode->clkNetwork()->isClock(pin); } bool Sta::isClock(const Net *net, - const Mode *mode) const + const Mode *mode) { + ensureClkNetwork(mode); return mode->clkNetwork()->isClock(net); } bool Sta::isIdealClock(const Pin *pin, - const Mode *mode) const + const Mode *mode) { + ensureClkNetwork(mode); return mode->clkNetwork()->isIdealClock(pin); } bool Sta::isPropagatedClock(const Pin *pin, - const Mode *mode) const + const Mode *mode) { return mode->clkNetwork()->isPropagatedClock(pin); } @@ -6084,12 +6087,14 @@ const PinSet * Sta::pins(const Clock *clk, const Mode *mode) { + ensureClkNetwork(mode); return mode->clkNetwork()->pins(clk); } void Sta::clkPinsInvalid(const Mode *mode) { + ensureClkNetwork(mode); mode->clkNetwork()->clkPinsInvalid(); } From 6f4cdcfea8efa9bb277b6d09909a5fba8bbf5a49 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 2 Mar 2026 16:41:35 -0800 Subject: [PATCH 16/59] tcl sta::is_ideal_clock Signed-off-by: James Cherry --- search/Search.i | 1 - 1 file changed, 1 deletion(-) diff --git a/search/Search.i b/search/Search.i index 67d84876..550f1b00 100644 --- a/search/Search.i +++ b/search/Search.i @@ -340,7 +340,6 @@ is_ideal_clock(const Pin *pin) { Sta *sta = Sta::sta(); const Mode *mode = sta->cmdMode(); - sta->ensureClkNetwork(); return sta->isIdealClock(pin, mode); } From 73e1a392c5998e3e15b5942f5c1b8b22ec7abb08 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 2 Mar 2026 16:47:40 -0800 Subject: [PATCH 17/59] rm unused Sta::report functions Signed-off-by: James Cherry --- include/sta/Sta.hh | 10 ---------- search/Search.i | 20 -------------------- search/Sta.cc | 20 -------------------- 3 files changed, 50 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 718f97ae..5bc48f70 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -988,16 +988,6 @@ public: void setReportPathDigits(int digits); void setReportPathNoSplit(bool no_split); void setReportPathSigmas(bool report_sigmas); - // Header above reportPathEnd results. - void reportPathEndHeader(); - // Footer below reportPathEnd results. - void reportPathEndFooter(); - // Format report_path_endpoint only: - // Previous path end is used to detect path group changes - // so headers are reported by group. - void reportPathEnd(PathEnd *end, - PathEnd *prev_end, - bool last); void reportPathEnd(PathEnd *end); void reportPathEnds(PathEndSeq *ends); ReportPath *reportPath() { return report_path_; } diff --git a/search/Search.i b/search/Search.i index 550f1b00..8ffff0ff 100644 --- a/search/Search.i +++ b/search/Search.i @@ -382,32 +382,12 @@ find_path_ends(ExceptionFrom *from, //////////////////////////////////////////////////////////////// -void -report_path_end_header() -{ - Sta::sta()->reportPathEndHeader(); -} - -void -report_path_end_footer() -{ - Sta::sta()->reportPathEndFooter(); -} - void report_path_end(PathEnd *end) { Sta::sta()->reportPathEnd(end); } -void -report_path_end2(PathEnd *end, - PathEnd *prev_end, - bool last) -{ - Sta::sta()->reportPathEnd(end, prev_end, last); -} - void set_report_path_format(ReportPathFormat format) { diff --git a/search/Sta.cc b/search/Sta.cc index 2d91a4f4..7899a110 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2772,32 +2772,12 @@ Sta::setReportPathSigmas(bool report_sigmas) report_path_->setReportSigmas(report_sigmas); } -void -Sta::reportPathEndHeader() -{ - report_path_->reportPathEndHeader(); -} - -void -Sta::reportPathEndFooter() -{ - report_path_->reportPathEndFooter(); -} - void Sta::reportPathEnd(PathEnd *end) { report_path_->reportPathEnd(end); } -void -Sta::reportPathEnd(PathEnd *end, - PathEnd *prev_end, - bool last) -{ - report_path_->reportPathEnd(end, prev_end, last); -} - void Sta::reportPathEnds(PathEndSeq *ends) { From eb0446d4e20679fcacd85d941069fbe83b4d7d87 Mon Sep 17 00:00:00 2001 From: Deepashree Sengupta Date: Tue, 3 Mar 2026 00:48:15 +0000 Subject: [PATCH 18/59] Write verilog escape (#394) * Fir for write_verilog issue 3826 Signed-off-by: dsengupta0628 * staToVerilog2 remove escaped_name+=ch Signed-off-by: dsengupta0628 * updated regression to remove \ from module name Signed-off-by: dsengupta0628 * Using helpers.tcl function to redirect results Signed-off-by: dsengupta0628 * add std::string and remove trailing space, update regression name Signed-off-by: dsengupta0628 * update regression to reflect correct output verilog name Signed-off-by: dsengupta0628 --------- Signed-off-by: dsengupta0628 --- network/VerilogNamespace.cc | 10 ++-------- test/regression_vars.tcl | 1 + test/verilog_write_escape.ok | 18 ++++++++++++++++++ test/verilog_write_escape.tcl | 10 ++++++++++ test/verilog_write_escape.v | 13 +++++++++++++ verilog/VerilogWriter.cc | 3 ++- 6 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 test/verilog_write_escape.ok create mode 100644 test/verilog_write_escape.tcl create mode 100644 test/verilog_write_escape.v diff --git a/network/VerilogNamespace.cc b/network/VerilogNamespace.cc index 5362d115..1d0231d9 100644 --- a/network/VerilogNamespace.cc +++ b/network/VerilogNamespace.cc @@ -86,15 +86,12 @@ staToVerilog(const char *sta_name) for (const char *s = sta_name; *s ; s++) { char ch = s[0]; if (ch == verilog_escape) { + escaped = true; char next_ch = s[1]; if (next_ch == verilog_escape) { - escaped_name += ch; escaped_name += next_ch; s++; } - else - // Skip escape. - escaped = true; } else { if ((!(isalnum(ch) || ch == '_'))) @@ -124,15 +121,12 @@ staToVerilog2(const char *sta_name) for (const char *s = sta_name; *s ; s++) { char ch = s[0]; if (ch == verilog_escape) { + escaped = true; char next_ch = s[1]; if (next_ch == verilog_escape) { - escaped_name += ch; escaped_name += next_ch; s++; } - else - // Skip escape. - escaped = true; } else { bool is_brkt = (ch == bus_brkt_left || ch == bus_brkt_right); diff --git a/test/regression_vars.tcl b/test/regression_vars.tcl index c1ed29ea..ab1f6c62 100644 --- a/test/regression_vars.tcl +++ b/test/regression_vars.tcl @@ -165,6 +165,7 @@ record_public_tests { suppress_msg verilog_attribute verilog_specify + verilog_write_escape } define_test_group fast [group_tests all] diff --git a/test/verilog_write_escape.ok b/test/verilog_write_escape.ok new file mode 100644 index 00000000..4906a851 --- /dev/null +++ b/test/verilog_write_escape.ok @@ -0,0 +1,18 @@ +module multi_sink (clk); + input clk; + + wire \alu_adder_result_ex[0] ; + + hier_block \h1\x (.childclk(clk), + .\Y[2:1] ({\alu_adder_result_ex[0] , + \alu_adder_result_ex[0] })); +endmodule +module hier_block (childclk, + \Y[2:1] ); + input childclk; + output [1:0] \Y[2:1] ; + + + BUFx2_ASAP7_75t_R \abuf_$100 (.A(childclk)); + BUFx2_ASAP7_75t_R \ff0/name (.A(childclk)); +endmodule diff --git a/test/verilog_write_escape.tcl b/test/verilog_write_escape.tcl new file mode 100644 index 00000000..29e78590 --- /dev/null +++ b/test/verilog_write_escape.tcl @@ -0,0 +1,10 @@ +# Check if "h1\x" and \Y[2:1] are correctly processed from input to output of Verilog +source helpers.tcl +read_liberty gf180mcu_sram.lib.gz +read_liberty asap7_small.lib.gz +read_verilog verilog_write_escape.v +link_design multi_sink +set verilog_file [make_result_file "verilog_write_escape.v"] +write_verilog $verilog_file +report_file $verilog_file +read_verilog $verilog_file diff --git a/test/verilog_write_escape.v b/test/verilog_write_escape.v new file mode 100644 index 00000000..e0c43c3e --- /dev/null +++ b/test/verilog_write_escape.v @@ -0,0 +1,13 @@ +module multi_sink (clk); + input clk; + wire \alu_adder_result_ex[0] ; + \hier_block \h1\x (.childclk(clk), .\Y[2:1] ({ \alu_adder_result_ex[0] , \alu_adder_result_ex[0] }) ); +endmodule // multi_sink + +module hier_block (childclk, \Y[2:1] ); + input childclk; + output [1:0] \Y[2:1] ; + wire [1:0] \Y[2:1] ; + BUFx2_ASAP7_75t_R \abuf_$100 (.A(childclk)); + BUFx2_ASAP7_75t_R \ff0/name (.A(childclk)); +endmodule // hier_block1 diff --git a/verilog/VerilogWriter.cc b/verilog/VerilogWriter.cc index a38e44b9..3d6e274c 100644 --- a/verilog/VerilogWriter.cc +++ b/verilog/VerilogWriter.cc @@ -386,7 +386,8 @@ VerilogWriter::writeInstBusPin(const Instance *inst, if (!first_port) fprintf(stream_, ",\n "); - fprintf(stream_, ".%s({", network_->name(port)); + std::string port_vname = portVerilogName(network_->name(port)); + fprintf(stream_, ".%s({", port_vname.c_str()); first_port = false; bool first_member = true; From 16c2678e514c1a7c13a2f997ecf04ab40861154a Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Tue, 3 Mar 2026 15:20:25 +0000 Subject: [PATCH 19/59] handle MT issues in setVertexArrivals, fix non-determ crash Signed-off-by: dsengupta0628 --- graph/Graph.cc | 6 +++++ include/sta/Graph.hh | 3 +++ include/sta/Search.hh | 5 ++++ search/Search.cc | 56 +++++++++++++++++++++++++++++++++++++++---- 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/graph/Graph.cc b/graph/Graph.cc index 2fe4d934..96323427 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -1126,6 +1126,12 @@ Vertex::deletePaths() tag_group_index_ = tag_group_index_max; } +void +Vertex::setPathsDeferred(Path *paths) +{ + paths_ = paths; +} + bool Vertex::hasFanin() const { diff --git a/include/sta/Graph.hh b/include/sta/Graph.hh index 28625854..5adb8b63 100644 --- a/include/sta/Graph.hh +++ b/include/sta/Graph.hh @@ -264,6 +264,9 @@ public: Path *makePaths(uint32_t count); void setPaths(Path *paths); void deletePaths(); + // Set paths_ without deleting the old array. + // Caller is responsible for deferred deletion of the old array. + void setPathsDeferred(Path *paths); TagGroupIndex tagGroupIndex() const; void setTagGroupIndex(TagGroupIndex tag_index); // Slew is annotated by sdc set_annotated_transition cmd. diff --git a/include/sta/Search.hh b/include/sta/Search.hh index 09bc1687..de2ff958 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -414,6 +414,7 @@ protected: void initVars(); void deleteTags(); void deleteTagsPrev(); + void deletePendingPaths(); void deleteUnusedTagGroups(); void seedInvalidArrivals(); void seedArrivals(); @@ -600,6 +601,10 @@ protected: std::mutex invalid_arrivals_lock_; BfsFwdIterator *arrival_iter_; ArrivalVisitor *arrival_visitor_; + // Old vertex path arrays deferred for deletion until after the parallel + // BFS level completes, preventing use-after-free in concurrent CRPR readers. + std::vector paths_pending_delete_; + std::mutex paths_pending_delete_lock_; // Some requireds exist. bool requireds_exist_; diff --git a/search/Search.cc b/search/Search.cc index 248477d4..f8a9c51d 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -708,6 +708,20 @@ Search::deleteTagsPrev() for (TagGroup** tag_groups: tag_groups_prev_) delete [] tag_groups; tag_groups_prev_.clear(); + + deletePendingPaths(); +} + +// Free old vertex path arrays that were deferred during parallel BFS visits. +// Called after visitParallel completes so no thread can still hold a pointer +// into any of these arrays. +void +Search::deletePendingPaths() +{ + LockGuard lock(paths_pending_delete_lock_); + for (Path *paths : paths_pending_delete_) + delete [] paths; + paths_pending_delete_.clear(); } void @@ -2815,8 +2829,28 @@ void Search::setVertexArrivals(Vertex *vertex, TagGroupBldr *tag_bldr) { - if (tag_bldr->empty()) - deletePathsIncr(vertex); + if (tag_bldr->empty()) { + // Inline the deletePathsIncr logic using deferred deletion so that + // concurrent CRPR/latch readers that hold a pointer into the old path + // array are not left with a dangling pointer. + tnsNotifyBefore(vertex); + if (worst_slacks_) + worst_slacks_->worstSlackNotifyBefore(vertex); + TagGroup *tag_group = tagGroup(vertex); + if (tag_group) { + Path *old_paths = vertex->paths(); + // Clear the tag group index first so concurrent readers observe a + // null tag group (and return early from Path::vertexPath) before + // we touch paths_. + vertex->setTagGroupIndex(tag_group_index_max); + vertex->setPathsDeferred(nullptr); + tag_group->decrRefCount(); + if (old_paths) { + LockGuard lock(paths_pending_delete_lock_); + paths_pending_delete_.push_back(old_paths); + } + } + } else { TagGroup *prev_tag_group = tagGroup(vertex); Path *prev_paths = vertex->paths(); @@ -2827,13 +2861,25 @@ Search::setVertexArrivals(Vertex *vertex, } else { if (prev_tag_group) { - vertex->deletePaths(); + // Clear the tag group index before replacing paths so concurrent + // readers see a consistent null-tag-group state during the + // transition and do not mix the old tag group with the new array. + vertex->setTagGroupIndex(tag_group_index_max); prev_tag_group->decrRefCount(); requiredInvalid(vertex); } size_t path_count = tag_group->pathCount(); - Path *paths = vertex->makePaths(path_count); - tag_bldr->copyPaths(tag_group, paths); + // Allocate the new array and switch paths_ directly from old to new + // without creating a null window or freeing the old array immediately. + // This prevents concurrent CRPR/latch readers from observing either a + // null pointer or a freed (dangling) pointer. + Path *new_paths = new Path[path_count]; + vertex->setPathsDeferred(new_paths); + if (prev_paths) { + LockGuard lock(paths_pending_delete_lock_); + paths_pending_delete_.push_back(prev_paths); + } + tag_bldr->copyPaths(tag_group, new_paths); vertex->setTagGroupIndex(tag_group->index()); tag_group->incrRefCount(); } From 62cd210a8aff98cb8bf795e7b70c610faf5deebb Mon Sep 17 00:00:00 2001 From: James Cherry Date: Tue, 3 Mar 2026 07:59:09 -0800 Subject: [PATCH 20/59] back edge->to is a root resolves #395 Signed-off-by: James Cherry --- search/Levelize.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/search/Levelize.cc b/search/Levelize.cc index d04891bf..5a0127b0 100644 --- a/search/Levelize.cc +++ b/search/Levelize.cc @@ -323,7 +323,7 @@ Levelize::findCycleBackEdges() stack.emplace(vertex, new VertexOutEdgeIterator(vertex, graph_)); EdgeSet back_edges = findBackEdges(path, stack); for (Edge *back_edge : back_edges) - roots_.insert(back_edge->from(graph_)); + roots_.insert(back_edge->to(graph_)); back_edge_count += back_edges.size(); } } From fcd95e74bb954b8ae04612b76640e7ebf2135e6b Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Tue, 3 Mar 2026 18:49:43 +0000 Subject: [PATCH 21/59] Follow up from previous to be in sync with prlx osta Signed-off-by: dsengupta0628 --- test/helpers.tcl | 41 +++++++++++++++++++++++++++++++++++ test/verilog_write_escape.tcl | 14 +++++------- test/verilog_write_escape.v | 4 ++-- verilog/VerilogWriter.cc | 2 +- 4 files changed, 49 insertions(+), 12 deletions(-) create mode 100644 test/helpers.tcl diff --git a/test/helpers.tcl b/test/helpers.tcl new file mode 100644 index 00000000..d96fd224 --- /dev/null +++ b/test/helpers.tcl @@ -0,0 +1,41 @@ +# Helper functions common to multiple regressions. + +set test_dir [file dirname [file normalize [info script]]] +set result_dir [file join $test_dir "results"] + +# puts [exec cat $file] without forking. +proc report_file { file } { + set stream [open $file r] + if { [file extension $file] == ".gz" } { + zlib push gunzip $stream + } + gets $stream line + while { ![eof $stream] } { + puts $line + gets $stream line + } + close $stream +} + +proc report_file_filter { file filter } { + set stream [open $file r] + gets $stream line + while { ![eof $stream] } { + set index [string first $filter $line] + if { $index != -1 } { + set line [string replace $line $index [expr $index + [string length $filter] - 1]] + } + puts $line + gets $stream line + } + close $stream +} + +proc make_result_file { filename } { + variable result_dir + return [file join $result_dir $filename] +} + +proc sort_objects { objects } { + return [sta::sort_by_full_name $objects] +} \ No newline at end of file diff --git a/test/verilog_write_escape.tcl b/test/verilog_write_escape.tcl index 29ac26e8..5f68ea2b 100644 --- a/test/verilog_write_escape.tcl +++ b/test/verilog_write_escape.tcl @@ -1,14 +1,10 @@ # Check if "h1\x" and \Y[2:1] are correctly processed from input to output of Verilog +source helpers.tcl read_liberty gf180mcu_sram.lib.gz read_liberty asap7_small.lib.gz read_verilog verilog_write_escape.v link_design multi_sink -set output_file "verilog_write_escape_out.v" -write_verilog $output_file -set fp [open $output_file r] -while {[gets $fp line] >= 0} { - puts $line -} -close $fp -read_verilog $output_file -file delete $output_file +set verilog_file [make_result_file "verilog_write_escape.v"] +write_verilog $verilog_file +report_file $verilog_file +read_verilog $verilog_file \ No newline at end of file diff --git a/test/verilog_write_escape.v b/test/verilog_write_escape.v index aa7d99f3..e0c43c3e 100644 --- a/test/verilog_write_escape.v +++ b/test/verilog_write_escape.v @@ -1,10 +1,10 @@ -module \multi_sink (clk); +module multi_sink (clk); input clk; wire \alu_adder_result_ex[0] ; \hier_block \h1\x (.childclk(clk), .\Y[2:1] ({ \alu_adder_result_ex[0] , \alu_adder_result_ex[0] }) ); endmodule // multi_sink -module \hier_block (childclk, \Y[2:1] ); +module hier_block (childclk, \Y[2:1] ); input childclk; output [1:0] \Y[2:1] ; wire [1:0] \Y[2:1] ; diff --git a/verilog/VerilogWriter.cc b/verilog/VerilogWriter.cc index c18bdb0f..0dc0d51b 100644 --- a/verilog/VerilogWriter.cc +++ b/verilog/VerilogWriter.cc @@ -389,7 +389,7 @@ VerilogWriter::writeInstBusPin(const Instance *inst, if (!first_port) fprintf(stream_, ",\n "); - string port_vname = portVerilogName(network_->name(port)); + std::string port_vname = portVerilogName(network_->name(port)); fprintf(stream_, ".%s({", port_vname.c_str()); first_port = false; bool first_member = true; From d7e1b857a7e19ce618dbeea8ddf242fcc05190c3 Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Tue, 3 Mar 2026 19:37:48 +0000 Subject: [PATCH 22/59] remove my copy of helpers and add the commit from jjcherry Signed-off-by: dsengupta0628 --- test/helpers.tcl | 41 ----------------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 test/helpers.tcl diff --git a/test/helpers.tcl b/test/helpers.tcl deleted file mode 100644 index d96fd224..00000000 --- a/test/helpers.tcl +++ /dev/null @@ -1,41 +0,0 @@ -# Helper functions common to multiple regressions. - -set test_dir [file dirname [file normalize [info script]]] -set result_dir [file join $test_dir "results"] - -# puts [exec cat $file] without forking. -proc report_file { file } { - set stream [open $file r] - if { [file extension $file] == ".gz" } { - zlib push gunzip $stream - } - gets $stream line - while { ![eof $stream] } { - puts $line - gets $stream line - } - close $stream -} - -proc report_file_filter { file filter } { - set stream [open $file r] - gets $stream line - while { ![eof $stream] } { - set index [string first $filter $line] - if { $index != -1 } { - set line [string replace $line $index [expr $index + [string length $filter] - 1]] - } - puts $line - gets $stream line - } - close $stream -} - -proc make_result_file { filename } { - variable result_dir - return [file join $result_dir $filename] -} - -proc sort_objects { objects } { - return [sta::sort_by_full_name $objects] -} \ No newline at end of file From 1ba71c3ab27a12baf4f52aaf56c5eb5823d39b71 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 26 Feb 2026 09:32:20 -0800 Subject: [PATCH 23/59] test/helpers.tcl Signed-off-by: James Cherry --- test/helpers.tcl | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 test/helpers.tcl diff --git a/test/helpers.tcl b/test/helpers.tcl new file mode 100644 index 00000000..46eb84c9 --- /dev/null +++ b/test/helpers.tcl @@ -0,0 +1,41 @@ +# Helper functions common to multiple regressions. + +set test_dir [file dirname [file normalize [info script]]] +set result_dir [file join $test_dir "results"] + +# puts [exec cat $file] without forking. +proc report_file { file } { + set stream [open $file r] + if { [file extension $file] == ".gz" } { + zlib push gunzip $stream + } + gets $stream line + while { ![eof $stream] } { + puts $line + gets $stream line + } + close $stream +} + +proc report_file_filter { file filter } { + set stream [open $file r] + gets $stream line + while { ![eof $stream] } { + set index [string first $filter $line] + if { $index != -1 } { + set line [string replace $line $index [expr $index + [string length $filter] - 1]] + } + puts $line + gets $stream line + } + close $stream +} + +proc make_result_file { filename } { + variable result_dir + return [file join $result_dir $filename] +} + +proc sort_objects { objects } { + return [sta::sort_by_full_name $objects] +} From fa9d1b13c9bc104e363fb7df292a9b964a92d730 Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Wed, 4 Mar 2026 00:02:57 +0000 Subject: [PATCH 24/59] Fix more MT issues arising from pruneCrprArrival Signed-off-by: dsengupta0628 --- search/Search.cc | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/search/Search.cc b/search/Search.cc index f8a9c51d..6f56b625 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -1449,9 +1449,16 @@ ArrivalVisitor::pruneCrprArrivals() Arrival arrival = tag_bldr_->arrival(path_index); // Latch D->Q path uses enable min so crpr clk path min/max // does not match the path min/max. - if (delayGreater(max_arrival_max_crpr, arrival, min_max, this) - && clk_info_no_crpr->crprClkPath(this)->minMax(this) - == clk_info->crprClkPath(this)->minMax(this)) { + // Use crprClkPathRaw() rather than crprClkPath() to avoid going + // through Path::vertexPath(), which can transiently return nullptr + // during a concurrent setVertexArrivals() tag-group transition. + // The min/max is a property of the tag (tag_index_), which is + // stable for the lifetime of the ClkInfo object. + const Path *crpr_clk_path_no_crpr = clk_info_no_crpr->crprClkPathRaw(); + if (crpr_clk_path_no_crpr + && delayGreater(max_arrival_max_crpr, arrival, min_max, this) + && crpr_clk_path_no_crpr->minMax(this) + == clk_info->crprClkPathRaw()->minMax(this)) { debugPrint(debug_, "search", 3, " pruned %s", tag->to_string(this).c_str()); path_itr = path_index_map.erase(path_itr); From 0a8ccbd3c4f83c4a5e1e0493e3a51940cf68db96 Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Wed, 4 Mar 2026 21:08:23 +0000 Subject: [PATCH 25/59] Revert "Fix more MT issues arising from pruneCrprArrival" This reverts pruneCrprArrival changes commit fa9d1b13c9bc104e363fb7df292a9b964a92d730. --- search/Search.cc | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/search/Search.cc b/search/Search.cc index 6f56b625..f8a9c51d 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -1449,16 +1449,9 @@ ArrivalVisitor::pruneCrprArrivals() Arrival arrival = tag_bldr_->arrival(path_index); // Latch D->Q path uses enable min so crpr clk path min/max // does not match the path min/max. - // Use crprClkPathRaw() rather than crprClkPath() to avoid going - // through Path::vertexPath(), which can transiently return nullptr - // during a concurrent setVertexArrivals() tag-group transition. - // The min/max is a property of the tag (tag_index_), which is - // stable for the lifetime of the ClkInfo object. - const Path *crpr_clk_path_no_crpr = clk_info_no_crpr->crprClkPathRaw(); - if (crpr_clk_path_no_crpr - && delayGreater(max_arrival_max_crpr, arrival, min_max, this) - && crpr_clk_path_no_crpr->minMax(this) - == clk_info->crprClkPathRaw()->minMax(this)) { + if (delayGreater(max_arrival_max_crpr, arrival, min_max, this) + && clk_info_no_crpr->crprClkPath(this)->minMax(this) + == clk_info->crprClkPath(this)->minMax(this)) { debugPrint(debug_, "search", 3, " pruned %s", tag->to_string(this).c_str()); path_itr = path_index_map.erase(path_itr); From 3afeba72126d526c0973bddfaaa6e526ccce39e5 Mon Sep 17 00:00:00 2001 From: dsengupta0628 Date: Wed, 4 Mar 2026 21:09:02 +0000 Subject: [PATCH 26/59] Revert "handle MT issues in setVertexArrivals, fix non-determ crash" This reverts commit for serVertexArrivals MT safe change 16c2678e514c1a7c13a2f997ecf04ab40861154a. --- graph/Graph.cc | 6 ----- include/sta/Graph.hh | 3 --- include/sta/Search.hh | 5 ---- search/Search.cc | 56 ++++--------------------------------------- 4 files changed, 5 insertions(+), 65 deletions(-) diff --git a/graph/Graph.cc b/graph/Graph.cc index 96323427..2fe4d934 100644 --- a/graph/Graph.cc +++ b/graph/Graph.cc @@ -1126,12 +1126,6 @@ Vertex::deletePaths() tag_group_index_ = tag_group_index_max; } -void -Vertex::setPathsDeferred(Path *paths) -{ - paths_ = paths; -} - bool Vertex::hasFanin() const { diff --git a/include/sta/Graph.hh b/include/sta/Graph.hh index 5adb8b63..28625854 100644 --- a/include/sta/Graph.hh +++ b/include/sta/Graph.hh @@ -264,9 +264,6 @@ public: Path *makePaths(uint32_t count); void setPaths(Path *paths); void deletePaths(); - // Set paths_ without deleting the old array. - // Caller is responsible for deferred deletion of the old array. - void setPathsDeferred(Path *paths); TagGroupIndex tagGroupIndex() const; void setTagGroupIndex(TagGroupIndex tag_index); // Slew is annotated by sdc set_annotated_transition cmd. diff --git a/include/sta/Search.hh b/include/sta/Search.hh index de2ff958..09bc1687 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -414,7 +414,6 @@ protected: void initVars(); void deleteTags(); void deleteTagsPrev(); - void deletePendingPaths(); void deleteUnusedTagGroups(); void seedInvalidArrivals(); void seedArrivals(); @@ -601,10 +600,6 @@ protected: std::mutex invalid_arrivals_lock_; BfsFwdIterator *arrival_iter_; ArrivalVisitor *arrival_visitor_; - // Old vertex path arrays deferred for deletion until after the parallel - // BFS level completes, preventing use-after-free in concurrent CRPR readers. - std::vector paths_pending_delete_; - std::mutex paths_pending_delete_lock_; // Some requireds exist. bool requireds_exist_; diff --git a/search/Search.cc b/search/Search.cc index f8a9c51d..248477d4 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -708,20 +708,6 @@ Search::deleteTagsPrev() for (TagGroup** tag_groups: tag_groups_prev_) delete [] tag_groups; tag_groups_prev_.clear(); - - deletePendingPaths(); -} - -// Free old vertex path arrays that were deferred during parallel BFS visits. -// Called after visitParallel completes so no thread can still hold a pointer -// into any of these arrays. -void -Search::deletePendingPaths() -{ - LockGuard lock(paths_pending_delete_lock_); - for (Path *paths : paths_pending_delete_) - delete [] paths; - paths_pending_delete_.clear(); } void @@ -2829,28 +2815,8 @@ void Search::setVertexArrivals(Vertex *vertex, TagGroupBldr *tag_bldr) { - if (tag_bldr->empty()) { - // Inline the deletePathsIncr logic using deferred deletion so that - // concurrent CRPR/latch readers that hold a pointer into the old path - // array are not left with a dangling pointer. - tnsNotifyBefore(vertex); - if (worst_slacks_) - worst_slacks_->worstSlackNotifyBefore(vertex); - TagGroup *tag_group = tagGroup(vertex); - if (tag_group) { - Path *old_paths = vertex->paths(); - // Clear the tag group index first so concurrent readers observe a - // null tag group (and return early from Path::vertexPath) before - // we touch paths_. - vertex->setTagGroupIndex(tag_group_index_max); - vertex->setPathsDeferred(nullptr); - tag_group->decrRefCount(); - if (old_paths) { - LockGuard lock(paths_pending_delete_lock_); - paths_pending_delete_.push_back(old_paths); - } - } - } + if (tag_bldr->empty()) + deletePathsIncr(vertex); else { TagGroup *prev_tag_group = tagGroup(vertex); Path *prev_paths = vertex->paths(); @@ -2861,25 +2827,13 @@ Search::setVertexArrivals(Vertex *vertex, } else { if (prev_tag_group) { - // Clear the tag group index before replacing paths so concurrent - // readers see a consistent null-tag-group state during the - // transition and do not mix the old tag group with the new array. - vertex->setTagGroupIndex(tag_group_index_max); + vertex->deletePaths(); prev_tag_group->decrRefCount(); requiredInvalid(vertex); } size_t path_count = tag_group->pathCount(); - // Allocate the new array and switch paths_ directly from old to new - // without creating a null window or freeing the old array immediately. - // This prevents concurrent CRPR/latch readers from observing either a - // null pointer or a freed (dangling) pointer. - Path *new_paths = new Path[path_count]; - vertex->setPathsDeferred(new_paths); - if (prev_paths) { - LockGuard lock(paths_pending_delete_lock_); - paths_pending_delete_.push_back(prev_paths); - } - tag_bldr->copyPaths(tag_group, new_paths); + Path *paths = vertex->makePaths(path_count); + tag_bldr->copyPaths(tag_group, paths); vertex->setTagGroupIndex(tag_group->index()); tag_group->incrRefCount(); } From 8ed837d74b6c341f574284024de1343127014692 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 5 Mar 2026 13:33:58 -0800 Subject: [PATCH 27/59] relevelize latch EN->Q Signed-off-by: James Cherry --- Dockerfile.ubuntu22.04 | 2 ++ include/sta/TimingRole.hh | 1 + liberty/TimingRole.cc | 6 ++++++ search/Levelize.cc | 29 ++++++++++++++++++++++++----- search/Sta.cc | 28 ++++++++++++++++------------ 5 files changed, 49 insertions(+), 17 deletions(-) diff --git a/Dockerfile.ubuntu22.04 b/Dockerfile.ubuntu22.04 index 9a803c8f..e636fc21 100644 --- a/Dockerfile.ubuntu22.04 +++ b/Dockerfile.ubuntu22.04 @@ -6,9 +6,11 @@ LABEL maintainer="James Cherry " ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get install -y \ + git \ wget \ cmake \ gcc \ + gdb \ tcl-dev \ tcl-tclreadline \ libeigen3-dev \ diff --git a/include/sta/TimingRole.hh b/include/sta/TimingRole.hh index 3621f63c..d77a8454 100644 --- a/include/sta/TimingRole.hh +++ b/include/sta/TimingRole.hh @@ -78,6 +78,7 @@ public: [[nodiscard]] bool isNonSeqTimingCheck() const { return is_non_seq_check_; } [[nodiscard]] bool isDataCheck() const; [[nodiscard]] bool isLatchDtoQ() const; + [[nodiscard]] bool isLatchEnToQ() const; const TimingRole *genericRole() const; const TimingRole *sdfRole() const; // Timing check data path min/max. diff --git a/liberty/TimingRole.cc b/liberty/TimingRole.cc index 1839e52f..e772d1bc 100644 --- a/liberty/TimingRole.cc +++ b/liberty/TimingRole.cc @@ -163,6 +163,12 @@ TimingRole::isLatchDtoQ() const return this == &latch_d_q_; } +bool +TimingRole::isLatchEnToQ() const +{ + return this == &latch_en_q_; +} + bool TimingRole::isTimingCheckBetween() const { diff --git a/search/Levelize.cc b/search/Levelize.cc index 5a0127b0..a53f8f7e 100644 --- a/search/Levelize.cc +++ b/search/Levelize.cc @@ -526,8 +526,16 @@ Levelize::ensureLatchLevels() for (Edge *edge : latch_d_to_q_edges_) { Vertex *from = edge->from(graph_); Vertex *to = edge->to(graph_); - if (from->level() == to->level()) - setLevel(from, from->level() + level_space_); + if (from->level() == to->level()) { + Level adjusted_level = from->level() + level_space_; + debugPrint(debug_, "levelize", 2, "latch %s %d (adjusted %d) -> %s %d", + from->to_string(this).c_str(), + from->level(), + adjusted_level, + to->to_string(this).c_str(), + to->level()); + setLevel(from, adjusted_level); + } } latch_d_to_q_edges_.clear(); } @@ -536,7 +544,7 @@ void Levelize::setLevel(Vertex *vertex, Level level) { - debugPrint(debug_, "levelize", 2, "set level %s %d", + debugPrint(debug_, "levelize", 3, "set level %s %d", vertex->to_string(this).c_str(), level); vertex->setLevel(level); @@ -602,7 +610,7 @@ void Levelize::relevelize() { for (Vertex *vertex : relevelize_from_) { - debugPrint(debug_, "levelize", 1, "relevelize from %s", + debugPrint(debug_, "levelize", 2, "relevelize from %s", vertex->to_string(this).c_str()); if (isRoot(vertex)) roots_.insert(vertex); @@ -641,9 +649,20 @@ Levelize::visit(Vertex *vertex, visit(to_vertex, edge, level+level_space, level_space, path_vertices, path); } - if (edge->role() == TimingRole::latchDtoQ()) + + const TimingRole *role = edge->role(); + if (role->isLatchDtoQ()) latch_d_to_q_edges_.insert(edge); + if (role->isLatchEnToQ()) { + VertexInEdgeIterator edge_iter2(to_vertex, graph_); + while (edge_iter2.hasNext()) { + Edge *edge2 = edge_iter2.next(); + if (edge2->role()->isLatchDtoQ()) + latch_d_to_q_edges_.insert(edge2); + } + } } + // Levelize bidirect driver as if it was a fanout of the bidirect load. if (graph_delay_calc_->bidirectDrvrSlewFromLoad(from_pin) && !vertex->isBidirectDriver()) { diff --git a/search/Sta.cc b/search/Sta.cc index 7899a110..527e8ee1 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -4671,12 +4671,14 @@ Sta::connectLoadPinAfter(Vertex *vertex) VertexInEdgeIterator edge_iter(vertex, graph_); while (edge_iter.hasNext()) { Edge *edge = edge_iter.next(); - Vertex *from_vertex = edge->from(graph_); - graph_delay_calc_->delayInvalid(from_vertex); - search_->requiredInvalid(from_vertex); - for (Mode *mode : modes_) - mode->sdc()->clkHpinDisablesChanged(from_vertex->pin()); - levelize_->relevelizeFrom(from_vertex); + if (!edge->role()->isTimingCheck()) { + Vertex *from_vertex = edge->from(graph_); + graph_delay_calc_->delayInvalid(from_vertex); + search_->requiredInvalid(from_vertex); + levelize_->relevelizeFrom(from_vertex); + for (Mode *mode : modes_) + mode->sdc()->clkHpinDisablesChanged(from_vertex->pin()); + } } Pin *pin = vertex->pin(); for (Mode *mode : modes_) { @@ -4754,12 +4756,14 @@ Sta::deleteEdge(Edge *edge) edge->from(graph_)->name(sdc_network_), edge->to(graph_)->name(sdc_network_)); Vertex *to = edge->to(graph_); - search_->deleteEdgeBefore(edge); - graph_delay_calc_->delayInvalid(to); - levelize_->relevelizeFrom(to); - levelize_->deleteEdgeBefore(edge); - for (Mode *mode : modes_) - mode->sdc()->clkHpinDisablesChanged(edge->from(graph_)->pin()); + if (!edge->role()->isTimingCheck()) { + search_->deleteEdgeBefore(edge); + graph_delay_calc_->delayInvalid(to); + levelize_->relevelizeFrom(to); + levelize_->deleteEdgeBefore(edge); + for (Mode *mode : modes_) + mode->sdc()->clkHpinDisablesChanged(edge->from(graph_)->pin()); + } graph_->deleteEdge(edge); } From f1e5587fef8115ccdb32a57d0196d22be348e11c Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 5 Mar 2026 18:41:25 -0700 Subject: [PATCH 28/59] rapidus liberty latch D->Q/EN->Q matching Signed-off-by: James Cherry --- include/sta/TimingArc.hh | 1 + liberty/Liberty.cc | 88 +++++++++++++++++++++++----------------- liberty/Liberty.i | 10 +++++ liberty/Liberty.tcl | 10 ++++- liberty/LibertyReader.cc | 47 ++++++++++++--------- liberty/TimingArc.cc | 3 +- 6 files changed, 98 insertions(+), 61 deletions(-) diff --git a/include/sta/TimingArc.hh b/include/sta/TimingArc.hh index 63c04d49..257e446d 100644 --- a/include/sta/TimingArc.hh +++ b/include/sta/TimingArc.hh @@ -176,6 +176,7 @@ public: // other conditional timing arcs between the same pins. bool isCondDefault() const { return is_cond_default_; } void setIsCondDefault(bool is_default); + const FuncExpr *when() const { return attrs_->cond(); } // SDF IOPATHs match sdfCond. // sdfCond (IOPATH) reuses sdfCondStart (timing check) variable. const std::string &sdfCond() const { return attrs_->sdfCondStart(); } diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 130af802..181b0e42 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -1679,45 +1679,58 @@ LibertyCell::makeLatchEnables(Report *report, { if (hasSequentials() || hasInferedRegTimingArcs()) { - for (auto en_to_q : timing_arc_sets_) { - if (en_to_q->role() == TimingRole::latchEnToQ()) { - LibertyPort *en = en_to_q->from(); - LibertyPort *q = en_to_q->to(); - for (TimingArcSet *d_to_q : timingArcSetsTo(q)) { - if (d_to_q->role() == TimingRole::latchDtoQ() - && condMatch(en_to_q, d_to_q)) { - LibertyPort *d = d_to_q->from(); - const RiseFall *en_rf = en_to_q->isRisingFallingEdge(); - if (en_rf) { - TimingArcSet *setup_check = findLatchSetup(d, en, en_rf, q, d_to_q, - report); - LatchEnable *latch_enable = makeLatchEnable(d, en, en_rf, q, d_to_q, - en_to_q, - setup_check, - debug); - FuncExpr *en_func = latch_enable->enableFunc(); - if (en_func) { - TimingSense en_sense = en_func->portTimingSense(en); - if (en_sense == TimingSense::positive_unate - && en_rf != RiseFall::rise()) - report->warn(1114, "cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.", - library_->name(), - name(), - en->name(), - q->name(), - en_rf == RiseFall::rise()?"rising":"falling"); - else if (en_sense == TimingSense::negative_unate - && en_rf != RiseFall::fall()) - report->warn(1115, "cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.", - library_->name(), - name(), - en->name(), - q->name(), - en_rf == RiseFall::rise()?"rising":"falling"); - } + for (TimingArcSet *d_to_q : timing_arc_sets_) { + if (d_to_q->role() == TimingRole::latchDtoQ()) { + LibertyPort *d = d_to_q->from(); + LibertyPort *q = d_to_q->to(); + TimingArcSet *en_to_q = nullptr; + TimingArcSet *en_to_q_when = nullptr; + // Prefer en_to_q with matching when. + for (TimingArcSet *arc_to_q : timingArcSetsTo(q)) { + if (arc_to_q->role() == TimingRole::latchEnToQ()) { + if (condMatch(arc_to_q, d_to_q)) + en_to_q_when = arc_to_q; + else + en_to_q = arc_to_q; + } + } + if (en_to_q_when) + en_to_q = en_to_q_when; + if (en_to_q) { + LibertyPort *en = en_to_q->from(); + const RiseFall *en_rf = en_to_q->isRisingFallingEdge(); + if (en_rf) { + TimingArcSet *setup_check = findLatchSetup(d, en, en_rf, q, d_to_q, report); + LatchEnable *latch_enable = makeLatchEnable(d, en, en_rf, q, d_to_q, + en_to_q, setup_check, debug); + FuncExpr *en_func = latch_enable->enableFunc(); + if (en_func) { + TimingSense en_sense = en_func->portTimingSense(en); + if (en_sense == TimingSense::positive_unate + && en_rf != RiseFall::rise()) + report->warn(1114, "cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.", + library_->name(), + name(), + en->name(), + q->name(), + en_rf == RiseFall::rise()?"rising":"falling"); + else if (en_sense == TimingSense::negative_unate + && en_rf != RiseFall::fall()) + report->warn(1115, "cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.", + library_->name(), + name(), + en->name(), + q->name(), + en_rf == RiseFall::rise()?"rising":"falling"); } } } + else + report->warn(1121, "cell %s/%s no latch enable found for %s -> %s.", + library_->name(), + name(), + d->name(), + q->name()); } } } @@ -1810,8 +1823,7 @@ LibertyCell::makeLatchEnable(LibertyPort *d, Debug *debug) { FuncExpr *en_func = findLatchEnableFunc(d, en, en_rf); - latch_enables_.emplace_back(d, en, en_rf, en_func, q, d_to_q, en_to_q, - setup_check); + latch_enables_.emplace_back(d, en, en_rf, en_func, q, d_to_q, en_to_q, setup_check); size_t idx = latch_enables_.size() - 1; latch_d_to_q_map_[d_to_q] = idx; latch_check_map_[setup_check] = idx; diff --git a/liberty/Liberty.i b/liberty/Liberty.i index 2257b2eb..d2856e68 100644 --- a/liberty/Liberty.i +++ b/liberty/Liberty.i @@ -379,6 +379,16 @@ full_name() to); } +const std::string +when() +{ + const FuncExpr *when = self->when(); + if (when) + return when->to_string(); + else + return ""; +} + TimingArcSeq & timing_arcs() { return self->arcs(); } diff --git a/liberty/Liberty.tcl b/liberty/Liberty.tcl index fd75a8bf..6d93601d 100644 --- a/liberty/Liberty.tcl +++ b/liberty/Liberty.tcl @@ -126,7 +126,15 @@ proc report_timing_arcs { cell } { puts "" puts "Timing arcs" foreach timing_arc $timing_arcs { - puts [$timing_arc to_string] + puts " [$timing_arc to_string]" + puts " [$timing_arc role]" + set when [$timing_arc when] + if { $when != "" } { + puts " when $when" + } + foreach arc [$timing_arc timing_arcs] { + puts " [$arc from_edge] -> [$arc to_edge]" + } } } } diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index c070e3dd..6851b501 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -2059,7 +2059,7 @@ LibertyReader::makeTimingModels(LibertyCell *cell, const LibertyGroup *timing_group, TimingArcAttrsPtr timing_attrs) { - switch (cell->libertyLibrary()->delayModelType()) { + switch (cell->libertyLibrary()->delayModelType()) { case DelayModelType::cmos_linear: makeLinearModels(cell, timing_group, timing_attrs); break; @@ -2115,6 +2115,7 @@ LibertyReader::makeTableModels(LibertyCell *cell, const LibertyGroup *timing_group, TimingArcAttrsPtr timing_attrs) { + bool found_model = false; for (const RiseFall *rf : RiseFall::range()) { std::string delay_attr_name = "cell_" + rf->to_string_long(); TableModel *delay = readGateTableModel(timing_group, delay_attr_name.c_str(), rf, @@ -2160,30 +2161,36 @@ LibertyReader::makeTableModels(LibertyCell *cell, if (delay == nullptr) libWarn(1211, timing_group, "missing cell_%s.", rf->name()); } + found_model = true; } - - std::string constraint_attr_name = rf->to_string_long() + "_constraint"; - ScaleFactorType scale_factor_type = - timingTypeScaleFactorType(timing_attrs->timingType()); - TableModel *constraint = readCheckTableModel(timing_group, - constraint_attr_name.c_str(), - rf, TableTemplateType::delay, - time_scale_, scale_factor_type); - if (constraint) { - std::string constraint_sigma_attr_name = "ocv_sigma_" + rf->to_string_long() - + "_constraint"; - TableModelsEarlyLate constraint_sigmas = - readEarlyLateTableModels(timing_group, - constraint_sigma_attr_name.c_str(), - rf, TableTemplateType::delay, - time_scale_, - ScaleFactorType::unknown); - timing_attrs->setModel(rf, new CheckTableModel(cell, constraint, - std::move(constraint_sigmas))); + else { + std::string constraint_attr_name = rf->to_string_long() + "_constraint"; + ScaleFactorType scale_factor_type = + timingTypeScaleFactorType(timing_attrs->timingType()); + TableModel *constraint = readCheckTableModel(timing_group, + constraint_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, scale_factor_type); + if (constraint) { + std::string constraint_sigma_attr_name = "ocv_sigma_" + rf->to_string_long() + + "_constraint"; + TableModelsEarlyLate constraint_sigmas = + readEarlyLateTableModels(timing_group, + constraint_sigma_attr_name.c_str(), + rf, TableTemplateType::delay, + time_scale_, + ScaleFactorType::unknown); + timing_attrs->setModel(rf, new CheckTableModel(cell, constraint, + std::move(constraint_sigmas))); + found_model = true; + } } } + if (!found_model) + libWarn(1311, timing_group, "no table models found in timing group."); } + bool LibertyReader::isGateTimingType(TimingType timing_type) { diff --git a/liberty/TimingArc.cc b/liberty/TimingArc.cc index 7bc324a6..ba5f086b 100644 --- a/liberty/TimingArc.cc +++ b/liberty/TimingArc.cc @@ -207,7 +207,6 @@ TimingArcSet::to_string() std::string str = from_->name(); str += " -> "; str += to_->name(); - str += " " + role()->to_string(); return str; } @@ -333,7 +332,7 @@ TimingArcSet::isRisingFallingEdge() const if (from_rf1 == from_rf2) return from_rf1; } - if (arcs_.size() == 1) + if (arc_count == 1) return arcs_[0]->fromEdge()->asRiseFall(); else return nullptr; From d8c0e9285be75e4b93f4b08b0afccc01224b2f07 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 6 Mar 2026 12:02:05 -0700 Subject: [PATCH 29/59] RiseFall use shortName instead of to_string Signed-off-by: James Cherry --- dcalc/CcsCeffDelayCalc.cc | 2 +- dcalc/GraphDelayCalc.cc | 2 +- dcalc/PrimaDelayCalc.cc | 4 ++-- graph/Graph.i | 2 +- include/sta/Transition.hh | 5 ++--- liberty/LibertyReader.cc | 30 +++++++++++++++--------------- parasitics/ReduceParasitics.cc | 2 +- sdc/Clock.cc | 2 +- search/ClkSkew.cc | 8 ++++---- search/Genclks.cc | 2 +- search/Path.cc | 2 +- search/PathEnum.cc | 2 +- search/PathGroup.cc | 4 ++-- search/Search.cc | 10 +++++----- search/Tag.cc | 3 +-- spice/WritePathSpice.cc | 8 ++++---- tcl/StaTclTypes.i | 4 ++-- util/Transition.cc | 18 ++++++++++++++++++ 18 files changed, 63 insertions(+), 47 deletions(-) diff --git a/dcalc/CcsCeffDelayCalc.cc b/dcalc/CcsCeffDelayCalc.cc index 3f460d08..ae71f648 100644 --- a/dcalc/CcsCeffDelayCalc.cc +++ b/dcalc/CcsCeffDelayCalc.cc @@ -118,7 +118,7 @@ CcsCeffDelayCalc::gateDelay(const Pin *drvr_pin, ref_time_ = output_waveforms_->referenceTime(in_slew_); debugPrint(debug_, "ccs_dcalc", 1, "%s %s", drvr_cell->name(), - drvr_rf_->to_string().c_str()); + drvr_rf_->shortName()); ArcDelay gate_delay; Slew drvr_slew; gateDelaySlew(drvr_library, drvr_rf_, gate_delay, drvr_slew); diff --git a/dcalc/GraphDelayCalc.cc b/dcalc/GraphDelayCalc.cc index 5fdf9587..06962c78 100644 --- a/dcalc/GraphDelayCalc.cc +++ b/dcalc/GraphDelayCalc.cc @@ -604,7 +604,7 @@ GraphDelayCalc::findInputDriverDelay(const LibertyCell *drvr_cell, { debugPrint(debug_, "delay_calc", 2, " driver cell %s %s", drvr_cell->name(), - rf->to_string().c_str()); + rf->shortName()); for (TimingArcSet *arc_set : drvr_cell->timingArcSets(from_port, to_port)) { for (TimingArc *arc : arc_set->arcs()) { if (arc->toEdge()->asRiseFall() == rf) { diff --git a/dcalc/PrimaDelayCalc.cc b/dcalc/PrimaDelayCalc.cc index 85175777..118233ce 100644 --- a/dcalc/PrimaDelayCalc.cc +++ b/dcalc/PrimaDelayCalc.cc @@ -231,7 +231,7 @@ PrimaDelayCalc::gateDelays(ArcDcalcArgSeq &dcalc_args, output_waveforms_[drvr_idx] = output_waveforms; debugPrint(debug_, "ccs_dcalc", 1, "%s %s", dcalc_arg.drvrCell()->name(), - drvr_rf_->to_string().c_str()); + drvr_rf_->shortName()); LibertyCell *drvr_cell = dcalc_arg.drvrCell(); const LibertyLibrary *drvr_library = drvr_cell->libertyLibrary(); bool vdd_exists; @@ -744,7 +744,7 @@ PrimaDelayCalc::dcalcResults() debugPrint(debug_, "ccs_dcalc", 2, "load %s %s delay %s slew %s", network_->pathName(load_pin), - drvr_rf_->to_string().c_str(), + drvr_rf_->shortName(), delayAsString(wire_delay, this), delayAsString(load_slew, this)); diff --git a/graph/Graph.i b/graph/Graph.i index b6f3c3c5..289ca3ba 100644 --- a/graph/Graph.i +++ b/graph/Graph.i @@ -299,7 +299,7 @@ latch_d_to_q_en() if (enable_port) return stringPrintTmp("%s %s", enable_port->name(), - enable_rf->to_string().c_str()); + enable_rf->shortName()); } return ""; } diff --git a/include/sta/Transition.hh b/include/sta/Transition.hh index 3f3e03c6..ba671453 100644 --- a/include/sta/Transition.hh +++ b/include/sta/Transition.hh @@ -48,8 +48,7 @@ public: static const RiseFall *fall() { return &fall_; } static int riseIndex() { return rise_.sdf_triple_index_; } static int fallIndex() { return fall_.sdf_triple_index_; } - const std::string &to_string_long() const { return name_; } - const std::string &to_string() const { return short_name_; } + const std::string &to_string(bool use_short = false) const; const char *name() const { return name_.c_str(); } const char *shortName() const { return short_name_.c_str(); } int index() const { return sdf_triple_index_; } @@ -94,7 +93,7 @@ public: static const RiseFallBoth *rise() { return &rise_; } static const RiseFallBoth *fall() { return &fall_; } static const RiseFallBoth *riseFall() { return &rise_fall_; } - const std::string &to_string() const { return short_name_; } + const std::string &to_string(bool use_short = false) const; const char *name() const { return name_.c_str(); } const char *shortName() const { return short_name_.c_str(); } int index() const { return sdf_triple_index_; } diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 6851b501..7d77fa3c 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -524,7 +524,7 @@ void LibertyReader::readThresholds(const LibertyGroup *library_group) { for (const RiseFall *rf : RiseFall::range()) { - std::string suffix = rf->to_string_long(); + std::string suffix = rf->to_string(); readLibAttrFloat(library_group, ("input_threshold_pct_" + suffix).c_str(), &LibertyLibrary::setInputThreshold, rf, 0.01F); if (library_->inputThreshold(rf) == 0.0) @@ -907,7 +907,7 @@ void LibertyReader::readSlewDegradations(const LibertyGroup *library_group) { for (const RiseFall *rf : RiseFall::range()) { - const std::string group_name = rf->to_string_long() + "_transition_degradation"; + const std::string group_name = rf->to_string() + "_transition_degradation"; const LibertyGroup *degradation_group = library_group->findSubgroup(group_name.c_str()); if (degradation_group) { @@ -1480,7 +1480,7 @@ LibertyReader::readCapacitance(const LibertyPortSeq &ports, for (LibertyPort *port : ports) { // rise/fall_capacitance for (const RiseFall *rf : RiseFall::range()) { - std::string attr_name = rf->to_string_long() + "_capacitance"; + std::string attr_name = rf->to_string() + "_capacitance"; float cap; bool exists; port_group->findAttrFloat(attr_name, cap, exists); @@ -1490,7 +1490,7 @@ LibertyReader::readCapacitance(const LibertyPortSeq &ports, } // rise/fall_capacitance_range(min_cap, max_cap); - attr_name = rf->to_string_long() + "_capacitance_range"; + attr_name = rf->to_string() + "_capacitance_range"; const LibertyComplexAttrSeq &range_attrs = port_group->findComplexAttrs(attr_name); if (!range_attrs.empty()) { const LibertyComplexAttr *attr = range_attrs[0]; @@ -2081,7 +2081,7 @@ LibertyReader::makeLinearModels(LibertyCell *cell, { LibertyLibrary *library = cell->libertyLibrary(); for (const RiseFall *rf : RiseFall::range()) { - std::string intr_attr_name = "intrinsic_" + rf->to_string_long(); + std::string intr_attr_name = "intrinsic_" + rf->to_string(); float intr = 0.0; bool intr_exists; timing_group->findAttrFloat(intr_attr_name, intr, intr_exists); @@ -2094,7 +2094,7 @@ LibertyReader::makeLinearModels(LibertyCell *cell, if (timingTypeIsCheck(timing_attrs->timingType())) model = new CheckLinearModel(cell, intr); else { - std::string res_attr_name = rf->to_string_long() + "_resistance"; + std::string res_attr_name = rf->to_string() + "_resistance"; float res = 0.0; bool res_exists; timing_group->findAttrFloat(res_attr_name, res, res_exists); @@ -2117,18 +2117,18 @@ LibertyReader::makeTableModels(LibertyCell *cell, { bool found_model = false; for (const RiseFall *rf : RiseFall::range()) { - std::string delay_attr_name = "cell_" + rf->to_string_long(); + std::string delay_attr_name = "cell_" + rf->to_string(); TableModel *delay = readGateTableModel(timing_group, delay_attr_name.c_str(), rf, TableTemplateType::delay, time_scale_, ScaleFactorType::cell); - std::string transition_attr_name = rf->to_string_long() + "_transition"; + std::string transition_attr_name = rf->to_string() + "_transition"; TableModel *transition = readGateTableModel(timing_group, transition_attr_name.c_str(), rf, TableTemplateType::delay, time_scale_, ScaleFactorType::transition); if (delay || transition) { - std::string delay_sigma_attr_name = "ocv_sigma_cell_" + rf->to_string_long(); + std::string delay_sigma_attr_name = "ocv_sigma_cell_" + rf->to_string(); TableModelsEarlyLate delay_sigmas = readEarlyLateTableModels(timing_group, delay_sigma_attr_name.c_str(), @@ -2136,7 +2136,7 @@ LibertyReader::makeTableModels(LibertyCell *cell, time_scale_, ScaleFactorType::unknown); - std::string slew_sigma_attr_name = "ocv_sigma_" + rf->to_string_long() + std::string slew_sigma_attr_name = "ocv_sigma_" + rf->to_string() + "_transition"; TableModelsEarlyLate slew_sigmas = readEarlyLateTableModels(timing_group, @@ -2164,7 +2164,7 @@ LibertyReader::makeTableModels(LibertyCell *cell, found_model = true; } else { - std::string constraint_attr_name = rf->to_string_long() + "_constraint"; + std::string constraint_attr_name = rf->to_string() + "_constraint"; ScaleFactorType scale_factor_type = timingTypeScaleFactorType(timing_attrs->timingType()); TableModel *constraint = readCheckTableModel(timing_group, @@ -2172,7 +2172,7 @@ LibertyReader::makeTableModels(LibertyCell *cell, rf, TableTemplateType::delay, time_scale_, scale_factor_type); if (constraint) { - std::string constraint_sigma_attr_name = "ocv_sigma_" + rf->to_string_long() + std::string constraint_sigma_attr_name = "ocv_sigma_" + rf->to_string() + "_constraint"; TableModelsEarlyLate constraint_sigmas = readEarlyLateTableModels(timing_group, @@ -2298,7 +2298,7 @@ LibertyReader::readReceiverCapacitance(const LibertyGroup *timing_group, ReceiverModelPtr &receiver_model) { std::string cap_group_name1 = cap_group_name; - cap_group_name1 += "_" + rf->to_string_long(); + cap_group_name1 += "_" + rf->to_string(); const LibertyGroup *cap_group = timing_group->findSubgroup(cap_group_name1); if (cap_group) { const LibertySimpleAttr *segment_attr = cap_group->findSimpleAttr("segment"); @@ -2328,7 +2328,7 @@ OutputWaveforms * LibertyReader::readOutputWaveforms(const LibertyGroup *timing_group, const RiseFall *rf) { - const std::string current_group_name = "output_current_" + rf->to_string_long(); + const std::string current_group_name = "output_current_" + rf->to_string(); const LibertyGroup *current_group = timing_group->findSubgroup(current_group_name); if (current_group) { OutputWaveformSeq output_currents; @@ -2680,7 +2680,7 @@ LibertyReader::readInternalPowerGroups(LibertyCell *cell, InternalPowerModels models; // rise/fall_power group for (const RiseFall *rf : RiseFall::range()) { - std::string pwr_attr_name = rf->to_string_long() + "_power"; + std::string pwr_attr_name = rf->to_string() + "_power"; const LibertyGroup *pwr_group = ipwr_group->findSubgroup(pwr_attr_name); if (pwr_group) { TableModel *model = readTableModel(pwr_group, rf, TableTemplateType::power, diff --git a/parasitics/ReduceParasitics.cc b/parasitics/ReduceParasitics.cc index 311ef35c..f44b1a9f 100644 --- a/parasitics/ReduceParasitics.cc +++ b/parasitics/ReduceParasitics.cc @@ -311,7 +311,7 @@ reduceToPiElmore(const Parasitic *parasitic_network, if (drvr_node) { debugPrint(sta->debug(), "parasitic_reduce", 1, "Reduce driver %s %s %s", sta->network()->pathName(drvr_pin), - rf->to_string().c_str(), + rf->shortName(), min_max->to_string().c_str()); ReduceToPiElmore reducer(sta); return reducer.makePiElmore(parasitic_network, drvr_pin, drvr_node, diff --git a/sdc/Clock.cc b/sdc/Clock.cc index 3960f670..1b39e585 100644 --- a/sdc/Clock.cc +++ b/sdc/Clock.cc @@ -531,7 +531,7 @@ ClockEdge::ClockEdge(Clock *clock, const RiseFall *rf) : clock_(clock), rf_(rf), - name_(stringPrint("%s %s", clock_->name(), rf_->to_string().c_str())), + name_(stringPrint("%s %s", clock_->name(), rf_->shortName())), time_(0.0), index_(clock_->index() * RiseFall::index_count + rf_->index()) { diff --git a/search/ClkSkew.cc b/search/ClkSkew.cc index 09cdf204..9deb4c91 100644 --- a/search/ClkSkew.cc +++ b/search/ClkSkew.cc @@ -106,7 +106,7 @@ ClkSkews::reportClkSkew(ClkSkew &clk_skew, report_->reportLine("%7s source latency %s %s", time_unit->asString(src_latency, digits), sdc_network_->pathName(src_path->pin(this)), - src_path->transition(this)->to_string().c_str()); + src_path->transition(this)->shortName()); if (src_internal_clk_latency != 0.0) report_->reportLine("%7s source internal clock delay", time_unit->asString(src_internal_clk_latency, digits)); @@ -116,7 +116,7 @@ ClkSkews::reportClkSkew(ClkSkew &clk_skew, report_->reportLine("%7s target latency %s %s", time_unit->asString(-tgt_latency, digits), sdc_network_->pathName(tgt_path->pin(this)), - tgt_path->transition(this)->to_string().c_str()); + tgt_path->transition(this)->shortName()); if (tgt_internal_clk_latency != 0.0) report_->reportLine("%7s target internal clock delay", time_unit->asString(-tgt_internal_clk_latency, digits)); @@ -315,10 +315,10 @@ ClkSkews::findClkSkew(Vertex *src_vertex, debugPrint(debug_, "clk_skew", 2, "%s %s %s -> %s %s %s crpr = %s skew = %s", network_->pathName(src_path->pin(this)), - src_path->transition(this)->to_string().c_str(), + src_path->transition(this)->shortName(), time_unit->asString(probe.srcLatency(this)), network_->pathName(tgt_path->pin(this)), - tgt_path->transition(this)->to_string().c_str(), + tgt_path->transition(this)->shortName(), time_unit->asString(probe.tgtLatency(this)), delayAsString(probe.crpr(this), this), time_unit->asString(probe.skew())); diff --git a/search/Genclks.cc b/search/Genclks.cc index bbb26621..225dfcf0 100644 --- a/search/Genclks.cc +++ b/search/Genclks.cc @@ -878,7 +878,7 @@ Genclks::recordSrcPaths(Clock *gclk) debugPrint(debug_, "genclk", 2, " %s insertion %s %s %s", network_->pathName(gclk_pin), early_late->to_string().c_str(), - rf->to_string().c_str(), + rf->shortName(), delayAsString(path->arrival(), this)); src_path = *path; } diff --git a/search/Path.cc b/search/Path.cc index 40d96baf..5514d559 100644 --- a/search/Path.cc +++ b/search/Path.cc @@ -201,7 +201,7 @@ Path::to_string(const StaState *sta) const else return stringPrintTmp("%s %s %s/%s %d", vertex(sta)->to_string(sta).c_str(), - transition(sta)->to_string().c_str(), + transition(sta)->shortName(), scene(sta)->name().c_str(), minMax(sta)->to_string().c_str(), tagIndex(sta)); diff --git a/search/PathEnum.cc b/search/PathEnum.cc index e53b0889..8cc8c9c9 100644 --- a/search/PathEnum.cc +++ b/search/PathEnum.cc @@ -426,7 +426,7 @@ PathEnumFaninVisitor::visitFromToPath(const Pin *, debugPrint(debug_, "path_enum", 3, "visit fanin %s -> %s %s %s", from_path->to_string(this).c_str(), to_vertex->to_string(this).c_str(), - to_rf->to_string().c_str(), + to_rf->shortName(), delayAsString(search_->deratedDelay(from_vertex, arc, edge, false, from_path->minMax(this), from_path->dcalcAnalysisPtIndex(this), diff --git a/search/PathGroup.cc b/search/PathGroup.cc index ca842db5..b1ef7a0f 100644 --- a/search/PathGroup.cc +++ b/search/PathGroup.cc @@ -805,7 +805,7 @@ MakePathEndsAll::vertexEnd(Vertex *) debugPrint(debug, "path_group", 2, "insert %s %s %s %d", path_end->vertex(sta_)->to_string(sta_).c_str(), path_end->typeName(), - path_end->transition(sta_)->to_string().c_str(), + path_end->transition(sta_)->shortName(), path_end->path()->tag(sta_)->index()); // Give the group a copy of the path end because // it may delete it during pruning. @@ -820,7 +820,7 @@ MakePathEndsAll::vertexEnd(Vertex *) debugPrint(debug, "path_group", 3, "prune %s %s %s %d", path_end->vertex(sta_)->to_string(sta_).c_str(), path_end->typeName(), - path_end->transition(sta_)->to_string().c_str(), + path_end->transition(sta_)->shortName(), path_end->path()->tag(sta_)->index()); } // Clear ends for next vertex. diff --git a/search/Search.cc b/search/Search.cc index 25683114..32956145 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -1365,8 +1365,8 @@ ArrivalVisitor::visitFromToPath(const Pin * /* from_pin */, debugPrint(debug_, "search", 3, " %s", from_vertex->to_string(this).c_str()); debugPrint(debug_, "search", 3, " %s -> %s %s", - from_rf->to_string().c_str(), - to_rf->to_string().c_str(), + from_rf->shortName(), + to_rf->shortName(), min_max->to_string().c_str()); debugPrint(debug_, "search", 3, " from tag: %s", from_tag->to_string(this).c_str()); @@ -2919,7 +2919,7 @@ Search::reportArrivals(Vertex *vertex, prev_str += "NULL"; } report_->reportLine(" %s %s %s / %s %s%s", - rf->to_string().c_str(), + rf->shortName(), path->minMax(this)->to_string().c_str(), delayAsString(path->arrival(), this), req, @@ -3656,8 +3656,8 @@ RequiredVisitor::visitFromToPath(const Pin *, // Don't propagate required times through latch D->Q edges. if (edge->role() != TimingRole::latchDtoQ()) { debugPrint(debug_, "search", 3, " %s -> %s %s", - from_rf->to_string().c_str(), - to_rf->to_string().c_str(), + from_rf->shortName(), + to_rf->shortName(), min_max->to_string().c_str()); debugPrint(debug_, "search", 3, " from tag %2u: %s", from_tag->index(), diff --git a/search/Tag.cc b/search/Tag.cc index 5e368d80..ece8b14c 100644 --- a/search/Tag.cc +++ b/search/Tag.cc @@ -104,8 +104,7 @@ Tag::to_string(bool report_index, if (report_rf_min_max) { const RiseFall *rf = transition(); const MinMax *min_max = minMax(); - result += rf->to_string(); - result += " "; + result += rf->shortName(); result += min_max->to_string(); result += " "; } diff --git a/spice/WritePathSpice.cc b/spice/WritePathSpice.cc index 1368cd51..bb033724 100644 --- a/spice/WritePathSpice.cc +++ b/spice/WritePathSpice.cc @@ -215,10 +215,10 @@ WritePathSpice::writeHeader() { const Path *start_path = path_expanded_.startPath(); std::string title = stdstrPrint("Path from %s %s to %s %s", - network_->pathName(start_path->pin(this)), - start_path->transition(this)->to_string().c_str(), - network_->pathName(path_->pin(this)), - path_->transition(this)->to_string().c_str()); + network_->pathName(start_path->pin(this)), + start_path->transition(this)->shortName(), + network_->pathName(path_->pin(this)), + path_->transition(this)->shortName()); float max_time = maxTime(); float time_step = 1e-13; writeHeader(title, max_time, time_step); diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index a7a2d6eb..270aad83 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -497,7 +497,7 @@ using namespace sta; const RiseFall *rf = $1; const char *str = ""; if (rf) - str = rf->to_string().c_str(); + str = rf->shortName(); Tcl_SetResult(interp, const_cast(str), TCL_STATIC); } @@ -517,7 +517,7 @@ using namespace sta; RiseFallBoth *tr = $1; const char *str = ""; if (tr) - str = tr->asString(); + str = tr->shortName(); Tcl_SetResult(interp, const_cast(str), TCL_STATIC); } diff --git a/util/Transition.cc b/util/Transition.cc index 0e09243c..41b28643 100644 --- a/util/Transition.cc +++ b/util/Transition.cc @@ -44,6 +44,15 @@ RiseFall::RiseFall(const char *name, { } +const std::string & +RiseFall::to_string(bool use_short) const +{ + if (use_short) + return short_name_; + else + return name_; +} + const RiseFall * RiseFall::opposite() const { @@ -134,6 +143,15 @@ RiseFallBoth::RiseFallBoth(const char *name, { } +const std::string & +RiseFallBoth::to_string(bool use_short) const +{ + if (use_short) + return short_name_; + else + return name_; +} + const RiseFallBoth * RiseFallBoth::find(const char *tr_str) { From 12c811a492e2835a3e6680240ad69c59d33b67c1 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Fri, 6 Mar 2026 18:10:20 -0700 Subject: [PATCH 30/59] latch en=1 tags Signed-off-by: James Cherry --- search/Latches.cc | 147 ++++++++++++++++++++++++++++------------------ search/Search.cc | 2 +- 2 files changed, 90 insertions(+), 59 deletions(-) diff --git a/search/Latches.cc b/search/Latches.cc index 3c113c51..9dcd688a 100644 --- a/search/Latches.cc +++ b/search/Latches.cc @@ -323,6 +323,10 @@ Latches::latchOutArrival(const Path *data_path, ArcDelay &arc_delay, Arrival &q_arrival) { + q_tag = nullptr; + arc_delay = 0.0; + q_arrival = 0.0; + Scene *scene = data_path->scene(this); Sdc *sdc = scene->sdc(); const Mode *mode = scene->mode(); @@ -337,83 +341,110 @@ Latches::latchOutArrival(const Path *data_path, // Latch enable may be missing if library is malformed. switch (state) { case LatchEnableState::closed: - // Latch is disabled by constant enable. + // Latch is always closed because enable is constant. break; case LatchEnableState::open: { + // Latch is always open because enable is constant. ExceptionPath *excpt = exceptionTo(data_path, nullptr); if (!(excpt && excpt->isFalse())) { arc_delay = search_->deratedDelay(data_vertex, d_q_arc, d_q_edge, false, min_max, dcalc_ap, sdc); q_arrival = data_path->arrival() + arc_delay; - q_tag = data_path->tag(this); + // Copy the data tag but remove the drprClkPath. + // Levelization does not traverse latch D->Q edges, so in some cases + // level(Q) < level(D) + // Note that + // level(crprClkPath(data)) < level(D) + // The danger is that + // level(crprClkPath(data)) == level(Q) + // or some other downstream vertex. + // This can lead to data races when finding arrivals at the same level + // use multiple threads. + // Kill the crprClklPath to be safe. + const ClkInfo *data_clk_info = data_path->clkInfo(this); + const ClkInfo *q_clk_info = + search_->findClkInfo(scene, + data_clk_info->clkEdge(), + data_clk_info->clkSrc(), + data_clk_info->isPropagated(), + data_clk_info->genClkSrc(), + data_clk_info->isGenClkSrcPath(), + data_clk_info->pulseClkSense(), + data_clk_info->insertion(), + data_clk_info->latency(), + data_clk_info->uncertainties(), + min_max, nullptr); + q_tag = search_->findTag(scene, d_q_arc->toEdge()->asRiseFall(), + min_max, q_clk_info, false, + nullptr, false, data_path->tag(this)->states(), + false, nullptr); } - } break; + } case LatchEnableState::enabled: { const MinMax *tgt_min_max = data_path->tgtClkMinMax(this); VertexPathIterator enable_iter(enable_vertex, scene, tgt_min_max, enable_rf, this); while (enable_iter.hasNext()) { Path *enable_path = enable_iter.next(); - const ClkInfo *en_clk_info = enable_path->clkInfo(this); - const ClockEdge *en_clk_edge = en_clk_info->clkEdge(); - if (enable_path->isClock(this)) { - ExceptionPath *excpt = exceptionTo(data_path, en_clk_edge); - // D->Q is disabled when if there is a path delay -to D or EN clk. - if (!(excpt && (excpt->isFalse() - || excpt->isPathDelay()))) { - Path *disable_path = latchEnableOtherPath(enable_path); - Delay borrow, time_given_to_startpoint; - Arrival adjusted_data_arrival; - Required required; - latchRequired(data_path, enable_path, disable_path, - required, borrow, adjusted_data_arrival, - time_given_to_startpoint); - if (delayGreater(borrow, 0.0, this)) { - // Latch is transparent when data arrives. - arc_delay = search_->deratedDelay(data_vertex, d_q_arc, d_q_edge, - false, min_max, dcalc_ap, sdc); - q_arrival = adjusted_data_arrival + arc_delay; - // Tag switcheroo - data passing thru gets latch enable tag. - // States and path ap come from Q, everything else from enable. - Path *crpr_clk_path = crprActive(mode) ? enable_path : nullptr; - const ClkInfo *q_clk_info = - search_->findClkInfo(en_clk_info->scene(), - en_clk_edge, - en_clk_info->clkSrc(), - en_clk_info->isPropagated(), - en_clk_info->genClkSrc(), - en_clk_info->isGenClkSrcPath(), - en_clk_info->pulseClkSense(), - en_clk_info->insertion(), - en_clk_info->latency(), - en_clk_info->uncertainties(), - min_max, crpr_clk_path); - const RiseFall *q_rf = d_q_arc->toEdge()->asRiseFall(); - ExceptionStateSet *states = nullptr; - // Latch data pin is a valid exception -from pin. - if (sdc->exceptionFromStates(data_path->pin(this), - data_path->transition(this), - nullptr, nullptr, // clk below - MinMax::max(), states) - // -from enable non-filter exceptions apply. - && sdc->exceptionFromStates(enable_vertex->pin(), - enable_rf, - en_clk_edge->clock(), - en_clk_edge->transition(), - MinMax::max(), false, states)) - q_tag = search_->findTag(enable_path->tag(this)->scene(), - q_rf, MinMax::max(), q_clk_info, false, - nullptr, false, states, true, nullptr); - } - return; - } - } + const ClkInfo *en_clk_info = enable_path->clkInfo(this); + const ClockEdge *en_clk_edge = en_clk_info->clkEdge(); + if (enable_path->isClock(this)) { + ExceptionPath *excpt = exceptionTo(data_path, en_clk_edge); + // D->Q is disabled when if there is a path delay -to D or EN clk. + if (!(excpt && (excpt->isFalse() + || excpt->isPathDelay()))) { + Path *disable_path = latchEnableOtherPath(enable_path); + Delay borrow, time_given_to_startpoint; + Arrival adjusted_data_arrival; + Required required; + latchRequired(data_path, enable_path, disable_path, + required, borrow, adjusted_data_arrival, + time_given_to_startpoint); + if (delayGreater(borrow, 0.0, this)) { + // Latch is transparent when data arrives. + arc_delay = search_->deratedDelay(data_vertex, d_q_arc, d_q_edge, + false, min_max, dcalc_ap, sdc); + q_arrival = adjusted_data_arrival + arc_delay; + // Tag switcheroo - data passing thru gets latch enable tag. + // States and path ap come from Q, everything else from enable. + Path *crpr_clk_path = crprActive(mode) ? enable_path : nullptr; + const ClkInfo *q_clk_info = + search_->findClkInfo(scene, + en_clk_edge, + en_clk_info->clkSrc(), + en_clk_info->isPropagated(), + en_clk_info->genClkSrc(), + en_clk_info->isGenClkSrcPath(), + en_clk_info->pulseClkSense(), + en_clk_info->insertion(), + en_clk_info->latency(), + en_clk_info->uncertainties(), + min_max, crpr_clk_path); + ExceptionStateSet *states = nullptr; + // Latch data pin is a valid exception -from pin. + if (sdc->exceptionFromStates(data_path->pin(this), + data_path->transition(this), + nullptr, nullptr, // clk below + MinMax::max(), states) + // -from enable non-filter exceptions apply. + && sdc->exceptionFromStates(enable_vertex->pin(), + enable_rf, + en_clk_edge->clock(), + en_clk_edge->transition(), + MinMax::max(), false, states)) + q_tag = search_->findTag(scene, d_q_arc->toEdge()->asRiseFall(), + MinMax::max(), q_clk_info, false, + nullptr, false, states, true, nullptr); + } + return; + } + } } // No enable path found. - } break; } + } } ExceptionPath * diff --git a/search/Search.cc b/search/Search.cc index 32956145..aca08dfb 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -3654,7 +3654,7 @@ RequiredVisitor::visitFromToPath(const Pin *, const MinMax *min_max) { // Don't propagate required times through latch D->Q edges. - if (edge->role() != TimingRole::latchDtoQ()) { + if (!edge->role()->isLatchDtoQ()) { debugPrint(debug_, "search", 3, " %s -> %s %s", from_rf->shortName(), to_rf->shortName(), From ad1cb85580c70ada13a4c02bfe87af4d08317288 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 7 Mar 2026 09:24:58 -0700 Subject: [PATCH 31/59] doc Signed-off-by: James Cherry --- doc/ChangeLog.txt | 2 +- doc/OpenSTA.fodt | 381 +++++++++++++++++++++++----------------------- doc/OpenSTA.pdf | Bin 1402478 -> 1424985 bytes 3 files changed, 192 insertions(+), 191 deletions(-) diff --git a/doc/ChangeLog.txt b/doc/ChangeLog.txt index ee123999..13bdcc38 100644 --- a/doc/ChangeLog.txt +++ b/doc/ChangeLog.txt @@ -3,7 +3,7 @@ OpenSTA Timing Analyzer Release Notes This file summarizes user visible changes for each release. -2025/02/24 +2026/02/24 ---------- The define_scene -library argument now takes a the library name or a diff --git a/doc/OpenSTA.fodt b/doc/OpenSTA.fodt index 344e45a6..6195f2af 100644 --- a/doc/OpenSTA.fodt +++ b/doc/OpenSTA.fodt @@ -1,11 +1,11 @@ - Parallax STA documentationJames Cherry5142025-03-17T12:59:52.4638705382010-07-31T21:07:002026-02-25T07:28:47.891834000P123DT1H12M13SLibreOffice/25.8.1.1$MacOSX_AARCH64 LibreOffice_project/54047653041915e595ad4e45cccea684809c77b5PDF files: James CherryJames Cherry12.00000falsefalsefalsefalse + Parallax STA documentationJames Cherry5172025-03-17T12:59:52.4638705382010-07-31T21:07:002026-03-07T09:24:29.415873000P123DT1H20M36SLibreOffice/25.8.1.1$MacOSX_AARCH64 LibreOffice_project/54047653041915e595ad4e45cccea684809c77b5PDF files: James CherryJames Cherry12.00000falsefalsefalsefalse - 348148 - 534 + 109 + 2667 19290 17736 true @@ -13,12 +13,12 @@ view2 - 8324 - 356965 - 534 - 348148 - 19823 - 365882 + 3041 + 4163 + 2667 + 109 + 21955 + 17844 0 1 false @@ -89,7 +89,7 @@ false true false - 26480554 + 26653592 0 false @@ -198,7 +198,7 @@ - + @@ -5282,6 +5282,7 @@ + @@ -6352,7 +6353,7 @@ - + @@ -6479,7 +6480,7 @@ Example Command Scripts1 Timing Analysis using SDF2 Timing Analysis with Multiple Process Corners2 - Timing Analysis with Multiple Modes3 + Timing Analysis with Multiple Corners and Modes3 Power Analysis3 TCL Interpreter5 Debugging Timing6 @@ -6490,31 +6491,31 @@ Variables85 - Command Line Arguments + Command Line Arguments The command line arguments for sta are shown below. sta -help show help and exit -version show version and exit -no_init do not read ~/.sta -no_splash do not print the splash message -threads count|max use count threads -exit exit after reading cmd_file cmd_file source cmd_file When OpenSTA starts up, commands are first read from the user initialization file ~/.sta if it exists. If a TCL command file cmd_file is specified on the command line, commands are read from the file and executed before entering an interactive TCL command interpreter. If -exit is specified the application exits after reading cmd_file. Use the TCL exit command to exit the application. The –threads option specifies how many parallel threads to use. Use –threads max to use one thread per processor. - Example Command Scripts + Example Command Scripts To read a design into OpenSTA use the read_liberty command to read Liberty library files. Next, read hierarchical structural Verilog files with the read_verilog command. The link_design command links the Verilog to the Liberty timing cells. Any number of Liberty and Verilog files can be read before linking the design. Delays used for timing analysis are calculated using the Liberty timing models. If no parasitics are read only the pin capacitances of the timing models are used in delay calculation. Use the read_spef command to read parasitics from an extractor, or read_sdf to use delays calculated by an external delay calculator. Timing constraints can be entered as TCL commands or read using the read_sdc command. The units used by OpenSTA for all command arguments and reports are taken from the first Liberty file that is read. Use the set_cmd_units command to override the default units. Use the report_units command to see the ccmmand units. - Timing Analysis using SDF + Timing Analysis using SDF A sample command file that reads a library and a Verilog netlist and reports timing checks is shown below. read_liberty example1_slow.libread_verilog example1.vlink_design topread_sdf example1.sdfcreate_clock -name clk -period 10 {clk1 clk2 clk3}set_input_delay -clock clk 0 {in1 in2}report_checks This example can be found in examples/sdf_delays.tcl. - Timing Analysis with Multiple Process Corners + Timing Analysis with Multiple Process Corners An example command script using three process corners and +/-10% min/max derating is shown below. read_liberty nangate45_slow.lib.gzread_liberty nangate45_typ.lib.gzread_liberty nangate45_fast.lib.gzread_verilog example1.link_design topset_timing_derate -early 0.9set_timing_derate -late 1.1create_clock -name clk -period 10 {clk1 clk2 clk3}set_input_delay -clock clk 0 {in1 in2}define_scene ss -liberty nangate45_slowdefine_scene tt -liberty nangate45_typdefine_scene ff -liberty nangate45_fast# report all scenesreport_checks -path_delay min_max# report typical scenereport_checks -scene tt This example can be found in examples/multi_corner.tcl. Other examples can be found in the examples directory. - Timing Analysis with Multiple Corners and Modes + Timing Analysis with Multiple Corners and Modes OpenSTA supports multi-corner, multi-mode analysis. Each corner/mode combination is called a “scene”. The SDC constraints in each mode describe a different operating mode, such as mission mode or scan mode. Each corner has min/max Liberty libraries and SPEF parasitics. A mode named “default” is initially created for SDC commands. It is deleted when a mode is defined with set_mode or read_sdc -mode. Similartly, a named “default” is initially created that is deleted when define_scene is used to define a scene. An example command script using two process corners two modes is shown below. read_liberty asap7_small_ff.lib.gzread_liberty asap7_small_ss.lib.gzread_verilog reg1_asap7.vlink_design topread_sdc -mode mode1 mcmm2_mode1.sdcread_sdc -mode mode2 mcmm2_mode2.sdcread_spef -name reg1_ff reg1_asap7.spefread_spef -name reg1_ss reg1_asap7_ss.spefdefine_scene scene1 -mode mode1 -liberty asap7_small_ff -spef reg1_ffdefine_scene scene2 -mode mode2 -liberty asap7_small_ss -spef reg1_ssreport_checks -scenes scene1report_checks -scenes scene2report_checks -group_path_count 4 This example can be found in examples/mcmm3.tcl.In the example show above the SDC for the modes is in separate files. Alternatively, the SDC can be defined in the command file using the set_mode command between SDC command groups. set_mode mode1create_clock -name m1_clk -period 1000 {clk1 clk2 clk3}set_input_delay -clock m1_clk 100 {in1 in2}set_mode mode2create_clock -name m2_clk -period 500 {clk1 clk3}set_output_delay -clock m2_clk 100 out - Power Analysis + Power Analysis OpenSTA also supports static power analysis with the report_power command. Probabalistic switching activities are propagated from the input ports to determine switching activities for internal pins. read_liberty sky130hd_tt.libread_verilog gcd_sky130hd.vlink_design gcdread_sdc gcd_sky130hd.sdcread_spef gcd_sky130hd.spefset_power_activity -input -activity 0.1set_power_activity -input_port reset -activity 0report_power In this example the activity for all inputs is set to 0.1, and then the activity for the reset signal is set to zero because it does not switch during steady state operation. @@ -6526,14 +6527,14 @@ read_liberty sky130hd_tt.libread_verilog gcd_sky130hd.vlink_design gcdread_sdc gcd_sky130hd.sdcread_spef gcd_sky130hd.spefread_vcd -scope gcd_tb/gcd1 gcd_sky130hd.vcd.gzreport_power This example can be found in examples/power_vcd.tcl. Note that in this simple example design simulation based activities does not significantly change the results. - TCL Interpreter + TCL Interpreter Keyword arguments to commands may be abbreviated. For example, report_checks -unique is equivalent to the following command. report_checks -unique_paths_to_endpoint The help command lists matching commands and their arguments. > help report*report_annotated_check [-setup] [-hold] [-recovery] [-removal] [-nochange] [-width] [-period] [-max_skew] [-max_lines liness] [-list_annotated]group_path_count [-list_not_annotated] [-constant_arcs]report_annotated_delay [-cell] [-net] [-from_in_ports] [-to_out_ports] [-max_lines liness] [-list_annotated] [-list_not_annotated] [-constant_arcs]report_arrival pinreport_check_types [-violators] [-verbose] [-scene scene] [-format slack_only|end] [-max_delay] [-min_delay] [-recovery] [-removal] [-clock_gating_setup] [-clock_gating_hold] [-max_slew] [-min_slew] [-max_fanout] [-min_fanout] [-max_capacitance] [-min_capacitance [-min_pulse_width] [-min_period] [-max_skew] [-net net] [-digits digits [-no_line_splits] [> filename] [>> filename]report_checks [-from from_list|-rise_from from_list|-fall_from from_list] [-through through_list|-rise_through through_list|-fall_through through_list] [-to to_list|-rise_to to_list|-fall_to to_list] [-unconstrained] [-path_delay min|min_rise|min_fall|max|max_rise|max_fall|min_max] [-scene scene] [-group_path_count path_count] [-endpoint_path_count path_count] [-unique_paths_to_endpoint] [-slack_max slack_max] [-slack_min slack_min] [-sort_by_slack] [-path_group group_name] [-format full|full_clock|full_clock_expanded|short|end|summary]... - Many reporting commands support redirection of the output to a file much like a Unix shell. + Many reporting commands support redirection of the output to a file much like a Unix shell. report_checks -to out1 > path.logreport_checks -to out2 >> path.log Debugging Timing Here are some guidelines for debugging your design if static timing does not report any paths, or does not report the expected paths. @@ -6559,13 +6560,13 @@ Next, check the arrival times at the D and CP pins of the register with report_arrivals. % report_arrivals r1/D (clk1 ^) r 1.00:1.00 f 1.00:1.00% report_arrivals r1/CP (clk1 ^) r 0.00:0.00 f INF:-INF (clk1 v) r INF:-INF f 5.00:5.00 If there are no arrivals on an input port of the design, use the set_input_delay command to specify the arrival times on the port. - Commands + Commands - all_clocks + all_clocks @@ -6578,7 +6579,7 @@ - all_inputs + all_inputs [-no_clocks] @@ -6600,7 +6601,7 @@ - all_outputs + all_outputs @@ -6613,7 +6614,7 @@ - all_registers + all_registers [-clock clock_names][-cells | -data_pins | -clock_pins | -async_pins | ‑output_pins][-level_sensitive][-edge_triggered] @@ -6691,7 +6692,7 @@ - check_setup + check_setup [-verbose][-unconstrained_endpoints][-multiple_clock][-no_clock][-no_input_delay][-loops][-generated_clocks][> filename][>> filename] @@ -6760,7 +6761,7 @@ - connect_pin + connect_pin netport|pin @@ -6859,7 +6860,7 @@ - create_generated_clock + create_generated_clock [-name clock_name]-source master_pin[-master_clock master_clock][-divide_by divisor][-multiply_by multiplier][-duty_cycle duty_cycle][-invert][-edges edge_list][-edge_shift shift_list][-add]pin_list @@ -6975,7 +6976,7 @@ - create_voltage_area + create_voltage_area [-name name][-coordinate coordinates][-guard_band_x guard_x][-guard_band_y guard_y]cells @@ -6988,7 +6989,7 @@ - current_design + current_design [design] @@ -7001,7 +7002,7 @@ - current_instance + current_instance [instance] @@ -7022,7 +7023,7 @@ - define_scene + define_scene -mode mode_name -liberty liberty_files|-liberty_min liberty_min_files -liberty_max liberty_max_files-spef spef_file| -spef_min spef_min_file -spef_max spef_max_file @@ -7060,7 +7061,7 @@ - delete_clock + delete_clock [-all] clocks @@ -7081,7 +7082,7 @@ - delete_from_list + delete_from_list list objects @@ -7111,7 +7112,7 @@ - delete_generated_clock + delete_generated_clock [-all] clocks @@ -7132,7 +7133,7 @@ - delete_instance + delete_instance instance @@ -7153,7 +7154,7 @@ - delete_net + delete_net net @@ -7174,7 +7175,7 @@ - disconnect_pin + disconnect_pin netport | pin | -all @@ -7219,7 +7220,7 @@ - elapsed_run_time + elapsed_run_time @@ -7233,7 +7234,7 @@ - find_timing_paths + find_timing_paths [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-scene scene][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups] @@ -7448,7 +7449,7 @@ - get_cells + get_cells [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -7525,7 +7526,7 @@ - get_clocks + get_clocks [-regexp][-nocase][-filter expr][-quiet]patterns @@ -7579,7 +7580,7 @@ - get_fanin + get_fanin -to sink_list[-flat][-only_cells][-startpoints_only][-levels level_count][-pin_levels pin_count][-trace_arcs timing|enabled|all] @@ -7665,7 +7666,7 @@ - get_fanout + get_fanout -from source_list[-flat][-only_cells][-endpoints_only][-levels level_count][-pin_levels pin_count][-trace_arcs timing|enabled|all] @@ -7750,7 +7751,7 @@ - get_full_name + get_full_name object @@ -7841,7 +7842,7 @@ - get_lib_pins + get_lib_pins [-of_objects objects][-hsc separator][-filter expr][-regexp][-nocase][-quiet]patterns @@ -7911,7 +7912,7 @@ - get_libs + get_libs [-filter expr][-regexp][-nocase][-quiet]patterns @@ -7965,7 +7966,7 @@ - get_nets + get_nets [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8042,7 +8043,7 @@ - get_name + get_name object @@ -8064,7 +8065,7 @@ - get_pins + get_pins [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8135,7 +8136,7 @@ - get_ports + get_ports [-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8197,7 +8198,7 @@ - get_property + get_property [-object_type object_type]objectproperty @@ -8258,7 +8259,7 @@ - get_scenes + get_scenes [-mode mode_name]scene_name @@ -8287,7 +8288,7 @@ - get_timing_edges + get_timing_edges [-from from_pins][-to to_pins][-of_objects objects][-filter expr][patterns] @@ -8333,7 +8334,7 @@ - group_path + group_path -name group_name[-weight weight][-critical_range range][-from from_list |-rise_from from_list |-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-default] @@ -8450,7 +8451,7 @@ - include + include [-echo|-e][-verbose|-v]filename[> log_filename][>> log_filename] @@ -8504,7 +8505,7 @@ - link_design + link_design [-no_black_boxes][cell_name] @@ -8535,7 +8536,7 @@ - make_instance + make_instance inst_pathlib_cell @@ -8565,7 +8566,7 @@ - make_net + make_net net_name_list @@ -8586,7 +8587,7 @@ - read_liberty + read_liberty [-corner corner][-min][-max][-infer_latches]filename @@ -8635,7 +8636,7 @@ - read_saif + read_saif [-scope scope]filename @@ -8665,7 +8666,7 @@ - read_sdc + read_sdc [-mode mode_name][-echo]filename @@ -8705,7 +8706,7 @@ - read_sdf + read_sdf [-scene scene][-unescaped_dividers]filename @@ -8746,7 +8747,7 @@ - read_spef + read_spef [-name name][-keep_capacitive_coupling][-coupling_reduction_factor factor][-reduce][-path path]filename @@ -8793,7 +8794,7 @@ - The read_spef command reads a file of net parasitics in SPEF format. Use the report_parasitic_annotation command to check for nets that are not annotated. + The read_spef command reads a file of net parasitics in SPEF format. Use the report_parasitic_annotation command to check for nets that are not annotated. Files compressed with gzip are automatically uncompressed. Separate min/max parasitics can be annotated for each scene mode/corner. read_spef -name min spef1read_spef -name max spef2define_scene -mode mode1 -spef_min min -spef_max max @@ -8807,7 +8808,7 @@ - read_vcd + read_vcd [-scope scope][-mode mode_name]filename @@ -8844,7 +8845,7 @@ - read_verilog + read_verilog filename @@ -8859,7 +8860,7 @@ - The read_verilog command reads a gate level verilog netlist. After all verilog netlist and Liberty libraries are read the design must be linked with the link_design command. + The read_verilog command reads a gate level verilog netlist. After all verilog netlist and Liberty libraries are read the design must be linked with the link_design command. Verilog 2001 module port declaratations are supported. An example is shown below. module top (input in1, in2, clk1, clk2, clk3, output out); Files compressed with gzip are automatically uncompressed. @@ -8868,7 +8869,7 @@ - replace_cell + replace_cell instance_listreplacement_cell @@ -8898,7 +8899,7 @@ - replace_activity_annotation + replace_activity_annotation [-report_unannotated][-report_annotated] @@ -8927,7 +8928,7 @@ - report_annotated_check + report_annotated_check [-setup][-hold][-recovery][-removal][-nochange][-width][-period][-max_skew][-max_line lines][-report_annotated][-report_unannotated][-constant_arcs] @@ -9037,7 +9038,7 @@ - report_annotated_delay + report_annotated_delay [-cell][-net][-from_in_ports][-to_out_ports][-max_lines lines][-report_annotated][-report_unannotated][-constant_arcs] @@ -9115,7 +9116,7 @@ - report_checks + report_checks [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-unique_edges_to_endpoint][-scenes scenes][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups][-format end|full|short|summary |full_clock|full_clock_expanded |json][-fields fields][-digits digits][-no_line_split][> filename][>> filename] @@ -9420,7 +9421,7 @@ - report_check_types + report_check_types [-scenes scenes][-violators][-verbose][-format slack_only|end][-max_delay][-min_delay][-recovery][-removal][-clock_gating_setup][-clock_gating_hold][-max_slew][-min_slew][-min_pulse_width][-min_period][-digits digits][-no_split_lines][> filename][>> filename] @@ -9578,7 +9579,7 @@ - report_clock_latency + report_clock_latency [-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] @@ -9623,7 +9624,7 @@ - report_clock_min_period + report_clock_min_period [-clocks clocks][-scenes scenes][-include_port_paths] @@ -9653,7 +9654,7 @@ - report_clock_properties + report_clock_properties [clock_names] @@ -9674,7 +9675,7 @@ - report_clock_skew + report_clock_skew [-setup|-hold][-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] @@ -9735,7 +9736,7 @@ - report_dcalc + report_dcalc [-from from_pin][-to to_pin][-scene scene][-min][-max][-digits digits][> filename][>> filename] @@ -9797,7 +9798,7 @@ - report_disabled_edges + report_disabled_edges @@ -9811,7 +9812,7 @@ - report_edges + report_edges [-from from_pin][-to to_pin] @@ -9840,7 +9841,7 @@ - report_instance + report_instance instance_path[> filename][>> filename] @@ -9861,7 +9862,7 @@ - report_lib_cell + report_lib_cell cell_name[> filename][>> filename] @@ -9883,7 +9884,7 @@ - report_net + report_net [-digits digits]net_path[> filename][>> filename] @@ -9912,7 +9913,7 @@ - report_parasitic_annotation + report_parasitic_annotation [-report_unannotated][> filename][>> filename] @@ -9933,7 +9934,7 @@ - report_power + report_power [-instances instances][-highest_power_instances count][-digits digits][> filename][>> filename] @@ -9972,7 +9973,7 @@ - report_slews + report_slews [-scenes scenes]pin @@ -10001,7 +10002,7 @@ - report_tns + report_tns [-min][-max][-digits digits] @@ -10038,7 +10039,7 @@ - report_units + report_units @@ -10052,7 +10053,7 @@ - report_wns + report_wns [-min][-max][-digits digits] @@ -10089,7 +10090,7 @@ - report_worst_slack + report_worst_slack [-min][-max][-digits digits] @@ -10127,7 +10128,7 @@ - set_assigned_check + set_assigned_check -setup|-hold|-recovery|-removal[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins][-clock rise|fall][-cond sdf_cond][-worst]margin @@ -10245,7 +10246,7 @@ - set_assigned_delay + set_assigned_delay -cell|-net[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins]delay @@ -10338,7 +10339,7 @@ - set_assigned_transition + set_assigned_transition [-rise][-fall][-scene scene][-min][-max]slewpin_list @@ -10408,7 +10409,7 @@ - set_case_analysis + set_case_analysis 0|1|zero|one|rise|rising|fall|fallingport_or_pin_list @@ -10430,7 +10431,7 @@ - set_clock_gating_check + set_clock_gating_check [-setup setup_time][-hold hold_time][-rise][-fall][-high][-low][objects] @@ -10504,7 +10505,7 @@ - set_clock_groups + set_clock_groups [-name name][-logically_exclusive][-physically_exclusive][-asynchronous][-allow_paths]-group clocks @@ -10565,7 +10566,7 @@ - set_clock_latency + set_clock_latency [-source][-clock clock][-rise][-fall][-min][-max]delayobjects @@ -10642,7 +10643,7 @@ - set_clock_transition + set_clock_transition [-rise][-fall][-min][-max]transitionclocks @@ -10704,7 +10705,7 @@ - set_clock_uncertainty + set_clock_uncertainty [-from|-rise_from|-fall_from from_clock][-to|-rise_to|-fall_to to_clock][-rise][-fall][-setup][-hold]uncertainty[objects] @@ -10786,7 +10787,7 @@ - set_cmd_units + set_cmd_units [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] @@ -10859,7 +10860,7 @@ - set_data_check + set_data_check [-from|-rise_from|-fall_from from_pin][-to|-rise_to|-fall_to to_pin][-setup][-hold][-clock clock]margin @@ -10920,7 +10921,7 @@ - set_disable_inferred_clock_gating + set_disable_inferred_clock_gating objects @@ -10941,7 +10942,7 @@ - set_disable_timing + set_disable_timing [-from from_port][-to to_port]objects @@ -10986,7 +10987,7 @@ - set_drive + set_drive [-rise][-fall][-max][-min]resistanceports @@ -11047,7 +11048,7 @@ - set_driving_cell + set_driving_cell [-lib_cell cell_name][-library library][-rise][-fall][-min][-max][-pin pin][-from_pin from_pin][-input_transition_rise trans_rise][-input_transition_fall trans_fall]ports @@ -11149,7 +11150,7 @@ - set_false_path + set_false_path [-setup][-hold][-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-reset_path] @@ -11230,7 +11231,7 @@ - set_fanout_load + set_fanout_load fanoutport_list @@ -11243,7 +11244,7 @@ - set_hierarchy_separator + set_hierarchy_separator separator @@ -11264,7 +11265,7 @@ - set_ideal_latency + set_ideal_latency [-rise] [-fall] [-min] [-max] delay objects @@ -11277,7 +11278,7 @@ - set_ideal_network + set_ideal_network [-no_propagation] objects @@ -11290,7 +11291,7 @@ - set_ideal_transition + set_ideal_transition [-rise] [-fall] [-min] [-max] transition_time objects @@ -11303,7 +11304,7 @@ - set_input_delay + set_input_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall][-reference_pin ref_pin][-source_latency_included][-network_latency_included][-add_delay]delayport_pin_list @@ -11420,7 +11421,7 @@ - set_input_transition + set_input_transition [-rise][-fall][-max][-min]transitionport_list @@ -11481,7 +11482,7 @@ - set_level_shifter_strategy + set_level_shifter_strategy [-rule rule_type] @@ -11494,7 +11495,7 @@ - set_level_shifter_threshold + set_level_shifter_threshold [-voltage voltage] @@ -11507,7 +11508,7 @@ - set_load + set_load [-rise][-fall][-max][-min][-subtract_pin_load][-pin_load][-wire_load]capacitanceobjects @@ -11596,7 +11597,7 @@ - set_logic_dc + set_logic_dc port_list @@ -11617,7 +11618,7 @@ - set_logic_one + set_logic_one port_list @@ -11639,7 +11640,7 @@ - set_logic_zero + set_logic_zero port_list @@ -11660,7 +11661,7 @@ - set_max_area + set_max_area area @@ -11681,7 +11682,7 @@ - set_max_capacitance + set_max_capacitance capacitanceobjects @@ -11710,7 +11711,7 @@ - set_max_delay + set_max_delay [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay @@ -11797,7 +11798,7 @@ - set_max_dynamic_power + set_max_dynamic_power power [unit] @@ -11810,7 +11811,7 @@ - set_max_fanout + set_max_fanout fanoutobjects @@ -11839,7 +11840,7 @@ - set_max_leakage_power + set_max_leakage_power power [unit] @@ -11852,7 +11853,7 @@ - set_max_time_borrow + set_max_time_borrow delayobjects @@ -11882,7 +11883,7 @@ - set_max_transition + set_max_transition [-data_path][-clock_path][-rise][-fall]transitionobjects @@ -11945,7 +11946,7 @@ - set_min_capacitance + set_min_capacitance capacitanceobjects @@ -11975,7 +11976,7 @@ - set_min_delay + set_min_delay [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay @@ -12062,7 +12063,7 @@ - set_min_pulse_width + set_min_pulse_width [-high][-low]min_widthobjects @@ -12107,7 +12108,7 @@ - set_mode + set_mode mode_name @@ -12120,7 +12121,7 @@ - set_multicycle_path + set_multicycle_path [-setup][-hold][-rise][-fall][-start][-end][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-reset_path]path_multiplier @@ -12222,7 +12223,7 @@ - set_operating_conditions + set_operating_conditions [-analysis_type single|bc_wc|on_chip_variation][-library lib][condition][-min min_condition][-max max_condition][-min_library min_lib][-max_library max_lib] @@ -12308,7 +12309,7 @@ - set_output_delay + set_output_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall][-reference_pin ref_pin][-source_latency_included][-network_latency_included][-add_delay]delayport_pin_list @@ -12402,7 +12403,7 @@ - set_port_fanout_number + set_port_fanout_number [-min][-max]fanoutports @@ -12447,7 +12448,7 @@ - set_power_activity + set_power_activity [-global][-input][-input_ports ports][-pins pins][-activity activity | -density density][-duty duty][-clock clock] @@ -12527,7 +12528,7 @@ - set_propagated_clock + set_propagated_clock objects @@ -12548,7 +12549,7 @@ - set_pvt + set_pvt [-min][-max][-process process][-voltage voltage] @@ -12611,7 +12612,7 @@ - set_sense + set_sense [-type clock|data][-positive][-negative][-pulse pulse_type][-stop_propagation][-clock clocks]pins @@ -12689,7 +12690,7 @@ - set_timing_derate + set_timing_derate [-rise][-fall][-early][-late][-clock][-data][-net_delay][-cell_delay][-cell_check]derate[objects] @@ -12791,7 +12792,7 @@ - set_resistance + set_resistance [-max][-min]resistancenets @@ -12837,7 +12838,7 @@ - set_units + set_units [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] @@ -12902,7 +12903,7 @@ - set_wire_load_min_block_size + set_wire_load_min_block_size size @@ -12915,7 +12916,7 @@ - set_wire_load_mode + set_wire_load_mode top|enclosed|segmented @@ -12952,7 +12953,7 @@ - set_wire_load_model + set_wire_load_model -name model_name[-library library][-max][-min][objects] @@ -13005,7 +13006,7 @@ - set_wire_load_selection_group + set_wire_load_selection_group [-library library][-max][-min]group_name[objects] @@ -13059,7 +13060,7 @@ - suppress_msg + suppress_msg msg_ids @@ -13080,7 +13081,7 @@ - unset_case_analysis + unset_case_analysis port_or_pin_list @@ -13101,7 +13102,7 @@ - unset_clock_latency + unset_clock_latency [-source]objects @@ -13130,7 +13131,7 @@ - unset_clock_transition + unset_clock_transition clocks @@ -13152,7 +13153,7 @@ - unset_clock_uncertainty + unset_clock_uncertainty [-from|-rise_from|-fall_from from_clock][-to|-rise_to|-fall_to to_clock][-rise][-fall][-setup][-hold][objects] @@ -13229,7 +13230,7 @@ - unset_data_check + unset_data_check [-from|-rise_from|-fall_from from_object][-to|-rise_to|-fall_to to_object][-setup][-hold][-clock clock] @@ -13282,7 +13283,7 @@ - unset_disable_inferred_clock_gating + unset_disable_inferred_clock_gating objects @@ -13303,7 +13304,7 @@ - unset_disable_timing + unset_disable_timing [-from from_port][-to to_port]objects @@ -13340,7 +13341,7 @@ - unset_input_delay + unset_input_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall]port_pin_list @@ -13410,7 +13411,7 @@ - unset_output_delay + unset_output_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall]port_pin_list @@ -13479,7 +13480,7 @@ - unset_path_exceptions + unset_path_exceptions [-setup][-hold][-rise][-fall][-from|-rise_from|-fall_from from][-through|-rise_through|-fall_through through][-to|-rise_to|-fall_to to] @@ -13550,7 +13551,7 @@ - unset_power_activity + unset_power_activity [-global][-input][-input_ports ports][-pins pins] @@ -13603,7 +13604,7 @@ - unset_propagated_clock + unset_propagated_clock objects @@ -13624,7 +13625,7 @@ - unset_timing_derate + unset_timing_derate @@ -13638,7 +13639,7 @@ - unsuppress_msg + unsuppress_msg msg_ids @@ -13659,7 +13660,7 @@ - user_run_time + user_run_time @@ -13672,7 +13673,7 @@ - with_output_to_variable + with_output_to_variable var { commands } @@ -13701,7 +13702,7 @@ - write_path_spice + write_path_spice -path_args path_args-spice_directory spice_directory-lib_subckt_file lib_subckts_file-model_file model_file-power power-ground ground[-simulator hspice|ngspice|xyce] @@ -13775,7 +13776,7 @@ - write_sdc + write_sdc [-digits digits][-gzip][-no_timestamp]filename @@ -13820,7 +13821,7 @@ - write_sdf + write_sdf [-scene scene][-divider /|.][-include_typ][-digits digits][-gzip][-no_timestamp][-no_version]filename @@ -13898,7 +13899,7 @@ - write_timing_model + write_timing_model [-library_name lib_name][-cell_name cell_name] @@ -13951,7 +13952,7 @@ - write_verilog + write_verilog [-include_pwr_gnd][-remove_cells lib_cells]filename @@ -13983,7 +13984,7 @@ The write_verilog command writes a Verilog netlist to filename. Use -sort to sort the instances so the results are reproducible across operating systems. Use -remove_cells to remove instances of lib_cells from the netlist. - Filter Expressions + Filter Expressions The get_cells, get_pins, get_ports and get_timing_edges functions support filtering the returned objects by property values. Supported filter expressions are shown below. @@ -14046,13 +14047,13 @@ Where property is a property supported by the get_property command. Note that if there are spaces in the expression it must be enclosed in quotes so that it is a single argument. - Variables + Variables - hierarchy_separator + hierarchy_separator Any character. @@ -14065,7 +14066,7 @@ - sta_continue_on_error + sta_continue_on_error 0|1 @@ -14078,7 +14079,7 @@ - sta_crpr_mode + sta_crpr_mode same_pin|same_transition @@ -14091,7 +14092,7 @@ - sta_cond_default_arcs_enabled + sta_cond_default_arcs_enabled 0|1 @@ -14104,7 +14105,7 @@ - sta_crpr_enabled + sta_crpr_enabled 0|1 @@ -14117,7 +14118,7 @@ - sta_dynamic_loop_breaking + sta_dynamic_loop_breaking 0|1 @@ -14130,7 +14131,7 @@ - sta_gated_clock_checks_enabled + sta_gated_clock_checks_enabled 0|1 @@ -14143,7 +14144,7 @@ - sta_input_port_default_clock + sta_input_port_default_clock 0|1 @@ -14156,7 +14157,7 @@ - sta_internal_bidirect_instance_paths_enabled + sta_internal_bidirect_instance_paths_enabled 0|1 @@ -14169,7 +14170,7 @@ - sta_pocv_enabled + sta_pocv_enabled 0|1 @@ -14182,7 +14183,7 @@ - sta_propagate_all_clocks + sta_propagate_all_clocks 0|1 @@ -14197,7 +14198,7 @@ - sta_propagate_gated_clock_enable + sta_propagate_gated_clock_enable 0|1 @@ -14210,7 +14211,7 @@ - sta_recovery_removal_checks_enabled + sta_recovery_removal_checks_enabled 0|1 @@ -14223,7 +14224,7 @@ - sta_report_default_digits + sta_report_default_digits integer @@ -14237,7 +14238,7 @@ - sta_preset_clear_arcs_enabled + sta_preset_clear_arcs_enabled 0|1 @@ -14287,7 +14288,7 @@ define_scene13 delete_clock13 delete_from_list13 - delete_generated_clock13 + delete_generated_clock14 delete_instance14 delete_net14 disconnect_pin14 @@ -14421,7 +14422,7 @@ suppress_msg76 TCL Interpreter5 Timing Analysis using SDF2 - Timing Analysis with Multiple Modes3 + Timing Analysis with Multiple Corners and Modes3 Timing Analysis with Multiple Process Corners2 unset_case_analysis76 unset_clock_latency76 @@ -14449,7 +14450,7 @@ - Version 2.6.0, Sep 23, 2024Copyright (c) 2024, Parallax Software, Inc. + Version 3.0.0, Mar 7, 2026Copyright (c) 2026, Parallax Software, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index c084d80861e41deab524afab6145837c92811e4d..b450630c9554130765517b9634485e150dda314a 100644 GIT binary patch delta 365887 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

;X%1?JIbuMjXw(*19?_j6-a!Gn5{od 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

QG}eDmOSn**UT5_&~IAjlv9ehBbh~ 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 SM1z$FkG}P-?|$ENkN!XKlx=PR From bbe31b03de992abe45ea3d75517c130a6553cc6c Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 7 Mar 2026 10:58:09 -0700 Subject: [PATCH 32/59] comment Signed-off-by: James Cherry --- search/Sta.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/search/Sta.cc b/search/Sta.cc index 527e8ee1..0cf5b206 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2214,8 +2214,8 @@ Sta::checkTiming(const Mode *mode, bool generated_clks) { if (unconstrained_endpoints) { - // Only arrivals to find unconstrained_endpoints. - searchPreamble(); + // Only need non-clock arrivals to find unconstrained_endpoints. + searchPreamble(); search_->findAllArrivals(); } else { From 60f6e5963fc5a3fc7ed87f3c6927540fa3807415 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 7 Mar 2026 12:21:31 -0700 Subject: [PATCH 33/59] rm PwrActivityOrigin::defaulted Signed-off-by: James Cherry --- include/sta/PowerClass.hh | 1 - power/Power.cc | 1 - 2 files changed, 2 deletions(-) diff --git a/include/sta/PowerClass.hh b/include/sta/PowerClass.hh index 5b1d36be..bedb018b 100644 --- a/include/sta/PowerClass.hh +++ b/include/sta/PowerClass.hh @@ -41,7 +41,6 @@ enum class PwrActivityOrigin propagated, clock, constant, - defaulted, unknown }; diff --git a/power/Power.cc b/power/Power.cc index f0b590fa..38d1dea1 100644 --- a/power/Power.cc +++ b/power/Power.cc @@ -86,7 +86,6 @@ static EnumNameMap pwr_activity_origin_map = {PwrActivityOrigin::propagated, "propagated"}, {PwrActivityOrigin::clock, "clock"}, {PwrActivityOrigin::constant, "constant"}, - {PwrActivityOrigin::defaulted, "defaulted"}, {PwrActivityOrigin::unknown, "unknown"}}; Power::Power(StaState *sta) : From b5b0c66d12b4a8994740dbd61649712dc3259ce3 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 7 Mar 2026 12:37:42 -0700 Subject: [PATCH 34/59] power activity doc resolves #192 Signed-off-by: James Cherry --- doc/OpenSTA.fodt | 3362 +++++++++++++++++++++++----------------------- doc/OpenSTA.pdf | Bin 1424985 -> 1403976 bytes 2 files changed, 1692 insertions(+), 1670 deletions(-) diff --git a/doc/OpenSTA.fodt b/doc/OpenSTA.fodt index 6195f2af..5deadce7 100644 --- a/doc/OpenSTA.fodt +++ b/doc/OpenSTA.fodt @@ -1,11 +1,11 @@ - Parallax STA documentationJames Cherry5172025-03-17T12:59:52.4638705382010-07-31T21:07:002026-03-07T09:24:29.415873000P123DT1H20M36SLibreOffice/25.8.1.1$MacOSX_AARCH64 LibreOffice_project/54047653041915e595ad4e45cccea684809c77b5PDF files: James CherryJames Cherry12.00000falsefalsefalsefalse + Parallax STA documentationJames Cherry5182025-03-17T12:59:52.4638705382010-07-31T21:07:002026-03-07T12:37:15.449188000P123DT1H22M3SLibreOffice/25.8.1.1$MacOSX_AARCH64 LibreOffice_project/54047653041915e595ad4e45cccea684809c77b5PDF files: James CherryJames Cherry12.00000falsefalsefalsefalse - 109 - 2667 + 748993 + 0 19290 17736 true @@ -13,12 +13,12 @@ view2 - 3041 - 4163 - 2667 - 109 - 21955 - 17844 + 6375 + 755996 + 0 + 748993 + 19288 + 766727 0 1 false @@ -89,7 +89,7 @@ false true false - 26653592 + 26836501 0 false @@ -198,7 +198,7 @@ - + @@ -4399,13 +4399,15 @@ - + + - + + @@ -4414,873 +4416,889 @@ - + + - - + + - + - + - + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - + - + + - + + + + - - - - + - - + - - + + - - - + + - + + - - + + - - - + + + - - - + + - + - - + + + - + - - - - + - + + + + - + - - - + + - + + - + - - + + - + - + - - - - - + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - + - + - + + + + + + + + + + + + - - - - - - - - - - - - + - + - + - + - + - - + + + + + + + + + + + + + - - - - - - - - - - - + - - - + + - - - + + - + - + - - + + - - + + - + - + - + + + + + + + + + + + + + - + - - - - - - - - - - - - + - + + + + - - - - + + + + + + + + + + + + - + - + - + - + - + - + - - - - - - - - - - - - - + + - - + + - + - + - - + + - - - + + - - + + + - + - + - - - + + - - + + + - + + + + + + + + + - - - - - - - - - + - + - - - + + - + - - + + + - - + + - - - - - + + + + - + - - + + + - - + + - + - - - + + + + + + + + + + + + + + - + - + - + - + - - - - - - - - - - - - - + - + - + - + - + + - + + + + + + + + + + + + - - - - - - - - - - - - - + - + - - + + - - + + - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - + - - - + + + + + + + + + + + + + + - + - + - + - - - - - - - - - - - - - + - + - + - - + + + - - + + + - + - + + + + + + + - - - - - - - - + - + - - - - - + + + + - + - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - - - - - - - - - + + + + + + + + + + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -5576,786 +5594,789 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -6491,31 +6512,31 @@ Variables85 - Command Line Arguments + Command Line Arguments The command line arguments for sta are shown below. sta -help show help and exit -version show version and exit -no_init do not read ~/.sta -no_splash do not print the splash message -threads count|max use count threads -exit exit after reading cmd_file cmd_file source cmd_file When OpenSTA starts up, commands are first read from the user initialization file ~/.sta if it exists. If a TCL command file cmd_file is specified on the command line, commands are read from the file and executed before entering an interactive TCL command interpreter. If -exit is specified the application exits after reading cmd_file. Use the TCL exit command to exit the application. The –threads option specifies how many parallel threads to use. Use –threads max to use one thread per processor. - Example Command Scripts + Example Command Scripts To read a design into OpenSTA use the read_liberty command to read Liberty library files. Next, read hierarchical structural Verilog files with the read_verilog command. The link_design command links the Verilog to the Liberty timing cells. Any number of Liberty and Verilog files can be read before linking the design. Delays used for timing analysis are calculated using the Liberty timing models. If no parasitics are read only the pin capacitances of the timing models are used in delay calculation. Use the read_spef command to read parasitics from an extractor, or read_sdf to use delays calculated by an external delay calculator. Timing constraints can be entered as TCL commands or read using the read_sdc command. The units used by OpenSTA for all command arguments and reports are taken from the first Liberty file that is read. Use the set_cmd_units command to override the default units. Use the report_units command to see the ccmmand units. - Timing Analysis using SDF + Timing Analysis using SDF A sample command file that reads a library and a Verilog netlist and reports timing checks is shown below. read_liberty example1_slow.libread_verilog example1.vlink_design topread_sdf example1.sdfcreate_clock -name clk -period 10 {clk1 clk2 clk3}set_input_delay -clock clk 0 {in1 in2}report_checks This example can be found in examples/sdf_delays.tcl. - Timing Analysis with Multiple Process Corners + Timing Analysis with Multiple Process Corners An example command script using three process corners and +/-10% min/max derating is shown below. read_liberty nangate45_slow.lib.gzread_liberty nangate45_typ.lib.gzread_liberty nangate45_fast.lib.gzread_verilog example1.link_design topset_timing_derate -early 0.9set_timing_derate -late 1.1create_clock -name clk -period 10 {clk1 clk2 clk3}set_input_delay -clock clk 0 {in1 in2}define_scene ss -liberty nangate45_slowdefine_scene tt -liberty nangate45_typdefine_scene ff -liberty nangate45_fast# report all scenesreport_checks -path_delay min_max# report typical scenereport_checks -scene tt This example can be found in examples/multi_corner.tcl. Other examples can be found in the examples directory. - Timing Analysis with Multiple Corners and Modes + Timing Analysis with Multiple Corners and Modes OpenSTA supports multi-corner, multi-mode analysis. Each corner/mode combination is called a “scene”. The SDC constraints in each mode describe a different operating mode, such as mission mode or scan mode. Each corner has min/max Liberty libraries and SPEF parasitics. A mode named “default” is initially created for SDC commands. It is deleted when a mode is defined with set_mode or read_sdc -mode. Similartly, a named “default” is initially created that is deleted when define_scene is used to define a scene. An example command script using two process corners two modes is shown below. read_liberty asap7_small_ff.lib.gzread_liberty asap7_small_ss.lib.gzread_verilog reg1_asap7.vlink_design topread_sdc -mode mode1 mcmm2_mode1.sdcread_sdc -mode mode2 mcmm2_mode2.sdcread_spef -name reg1_ff reg1_asap7.spefread_spef -name reg1_ss reg1_asap7_ss.spefdefine_scene scene1 -mode mode1 -liberty asap7_small_ff -spef reg1_ffdefine_scene scene2 -mode mode2 -liberty asap7_small_ss -spef reg1_ssreport_checks -scenes scene1report_checks -scenes scene2report_checks -group_path_count 4 This example can be found in examples/mcmm3.tcl.In the example show above the SDC for the modes is in separate files. Alternatively, the SDC can be defined in the command file using the set_mode command between SDC command groups. set_mode mode1create_clock -name m1_clk -period 1000 {clk1 clk2 clk3}set_input_delay -clock m1_clk 100 {in1 in2}set_mode mode2create_clock -name m2_clk -period 500 {clk1 clk3}set_output_delay -clock m2_clk 100 out - Power Analysis + Power Analysis OpenSTA also supports static power analysis with the report_power command. Probabalistic switching activities are propagated from the input ports to determine switching activities for internal pins. read_liberty sky130hd_tt.libread_verilog gcd_sky130hd.vlink_design gcdread_sdc gcd_sky130hd.sdcread_spef gcd_sky130hd.spefset_power_activity -input -activity 0.1set_power_activity -input_port reset -activity 0report_power In this example the activity for all inputs is set to 0.1, and then the activity for the reset signal is set to zero because it does not switch during steady state operation. @@ -6527,14 +6548,14 @@ read_liberty sky130hd_tt.libread_verilog gcd_sky130hd.vlink_design gcdread_sdc gcd_sky130hd.sdcread_spef gcd_sky130hd.spefread_vcd -scope gcd_tb/gcd1 gcd_sky130hd.vcd.gzreport_power This example can be found in examples/power_vcd.tcl. Note that in this simple example design simulation based activities does not significantly change the results. - TCL Interpreter + TCL Interpreter Keyword arguments to commands may be abbreviated. For example, report_checks -unique is equivalent to the following command. report_checks -unique_paths_to_endpoint The help command lists matching commands and their arguments. > help report*report_annotated_check [-setup] [-hold] [-recovery] [-removal] [-nochange] [-width] [-period] [-max_skew] [-max_lines liness] [-list_annotated]group_path_count [-list_not_annotated] [-constant_arcs]report_annotated_delay [-cell] [-net] [-from_in_ports] [-to_out_ports] [-max_lines liness] [-list_annotated] [-list_not_annotated] [-constant_arcs]report_arrival pinreport_check_types [-violators] [-verbose] [-scene scene] [-format slack_only|end] [-max_delay] [-min_delay] [-recovery] [-removal] [-clock_gating_setup] [-clock_gating_hold] [-max_slew] [-min_slew] [-max_fanout] [-min_fanout] [-max_capacitance] [-min_capacitance [-min_pulse_width] [-min_period] [-max_skew] [-net net] [-digits digits [-no_line_splits] [> filename] [>> filename]report_checks [-from from_list|-rise_from from_list|-fall_from from_list] [-through through_list|-rise_through through_list|-fall_through through_list] [-to to_list|-rise_to to_list|-fall_to to_list] [-unconstrained] [-path_delay min|min_rise|min_fall|max|max_rise|max_fall|min_max] [-scene scene] [-group_path_count path_count] [-endpoint_path_count path_count] [-unique_paths_to_endpoint] [-slack_max slack_max] [-slack_min slack_min] [-sort_by_slack] [-path_group group_name] [-format full|full_clock|full_clock_expanded|short|end|summary]... - Many reporting commands support redirection of the output to a file much like a Unix shell. + Many reporting commands support redirection of the output to a file much like a Unix shell. report_checks -to out1 > path.logreport_checks -to out2 >> path.log Debugging Timing Here are some guidelines for debugging your design if static timing does not report any paths, or does not report the expected paths. @@ -6560,13 +6581,13 @@ Next, check the arrival times at the D and CP pins of the register with report_arrivals. % report_arrivals r1/D (clk1 ^) r 1.00:1.00 f 1.00:1.00% report_arrivals r1/CP (clk1 ^) r 0.00:0.00 f INF:-INF (clk1 v) r INF:-INF f 5.00:5.00 If there are no arrivals on an input port of the design, use the set_input_delay command to specify the arrival times on the port. - Commands + Commands - all_clocks + all_clocks @@ -6579,7 +6600,7 @@ - all_inputs + all_inputs [-no_clocks] @@ -6601,7 +6622,7 @@ - all_outputs + all_outputs @@ -6614,7 +6635,7 @@ - all_registers + all_registers [-clock clock_names][-cells | -data_pins | -clock_pins | -async_pins | ‑output_pins][-level_sensitive][-edge_triggered] @@ -6692,7 +6713,7 @@ - check_setup + check_setup [-verbose][-unconstrained_endpoints][-multiple_clock][-no_clock][-no_input_delay][-loops][-generated_clocks][> filename][>> filename] @@ -6761,7 +6782,7 @@ - connect_pin + connect_pin netport|pin @@ -6860,7 +6881,7 @@ - create_generated_clock + create_generated_clock [-name clock_name]-source master_pin[-master_clock master_clock][-divide_by divisor][-multiply_by multiplier][-duty_cycle duty_cycle][-invert][-edges edge_list][-edge_shift shift_list][-add]pin_list @@ -6976,7 +6997,7 @@ - create_voltage_area + create_voltage_area [-name name][-coordinate coordinates][-guard_band_x guard_x][-guard_band_y guard_y]cells @@ -6989,7 +7010,7 @@ - current_design + current_design [design] @@ -7002,7 +7023,7 @@ - current_instance + current_instance [instance] @@ -7023,7 +7044,7 @@ - define_scene + define_scene -mode mode_name -liberty liberty_files|-liberty_min liberty_min_files -liberty_max liberty_max_files-spef spef_file| -spef_min spef_min_file -spef_max spef_max_file @@ -7061,7 +7082,7 @@ - delete_clock + delete_clock [-all] clocks @@ -7082,7 +7103,7 @@ - delete_from_list + delete_from_list list objects @@ -7112,7 +7133,7 @@ - delete_generated_clock + delete_generated_clock [-all] clocks @@ -7133,7 +7154,7 @@ - delete_instance + delete_instance instance @@ -7154,7 +7175,7 @@ - delete_net + delete_net net @@ -7175,7 +7196,7 @@ - disconnect_pin + disconnect_pin netport | pin | -all @@ -7220,7 +7241,7 @@ - elapsed_run_time + elapsed_run_time @@ -7234,7 +7255,7 @@ - find_timing_paths + find_timing_paths [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-scene scene][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups] @@ -7449,7 +7470,7 @@ - get_cells + get_cells [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -7526,7 +7547,7 @@ - get_clocks + get_clocks [-regexp][-nocase][-filter expr][-quiet]patterns @@ -7580,7 +7601,7 @@ - get_fanin + get_fanin -to sink_list[-flat][-only_cells][-startpoints_only][-levels level_count][-pin_levels pin_count][-trace_arcs timing|enabled|all] @@ -7666,7 +7687,7 @@ - get_fanout + get_fanout -from source_list[-flat][-only_cells][-endpoints_only][-levels level_count][-pin_levels pin_count][-trace_arcs timing|enabled|all] @@ -7751,7 +7772,7 @@ - get_full_name + get_full_name object @@ -7842,7 +7863,7 @@ - get_lib_pins + get_lib_pins [-of_objects objects][-hsc separator][-filter expr][-regexp][-nocase][-quiet]patterns @@ -7912,7 +7933,7 @@ - get_libs + get_libs [-filter expr][-regexp][-nocase][-quiet]patterns @@ -7966,7 +7987,7 @@ - get_nets + get_nets [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8043,7 +8064,7 @@ - get_name + get_name object @@ -8065,7 +8086,7 @@ - get_pins + get_pins [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8136,7 +8157,7 @@ - get_ports + get_ports [-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8198,7 +8219,7 @@ - get_property + get_property [-object_type object_type]objectproperty @@ -8230,65 +8251,66 @@ The properties for different objects types are shown below. - cell (SDC lib_cell) + cell (SDC lib_cell) base_namefilenamefull_namelibraryname clock - full_nameis_generatedis_propagatedis_virtualnameperiodsources + full_nameis_generatedis_propagatedis_virtualnameperiodsources edge delay_max_falldelay_min_falldelay_max_risedelay_min_risefull_namefrom_pinsenseto_pin instance (SDC cell) cellfull_nameis_bufferis_clock_gateis_hierarchicalis_inverteris_macrois_memoryliberty_cellnameref_name liberty_cell (SDC lib_cell) - areabase_namedont_usefilenamefull_nameis_bufferis_inverteris_memorylibraryname - liberty_port (SDC lib_pin) - capacitancedirectiondrive_resistancedrive_resistance_max_falldrive_resistance_max_risedrive_resistance_min_falldrive_resistance_min_risefull_nameintrinsic_delayintrinsic_delay_max_fallintrinsic_delay_max_riseintrinsic_delay_min_fallintrinsic_delay_min_riseis_register_clocklib_cellname - library - filename (Liberty library only)namefull_name + areabase_namedont_usefilenamefull_nameis_bufferis_inverteris_memorylibraryname + liberty_port (SDC lib_pin) + capacitancedirectiondrive_resistancedrive_resistance_max_falldrive_resistance_max_risedrive_resistance_min_falldrive_resistance_min_risefull_nameintrinsic_delayintrinsic_delay_max_fallintrinsic_delay_max_riseintrinsic_delay_min_fallintrinsic_delay_min_riseis_register_clocklib_cellname + library + filename (Liberty library only)namefull_name net full_namename - path (PathEnd) + path (PathEnd) endpointendpoint_clockendpoint_clock_pinslackstartpointstartpoint_clockpoints pin - activity (activity in transitions per second, duty cycle, origin)slew_max_fallslew_max_riseslew_min_fallslew_min_riseclocksclock_domainsdirectionfull_nameis_hierarchicalis_portis_register_clocklib_pin_namenameslack_maxslack_max_fallslack_max_riseslack_minslack_min_fallslack_min_rise + activity (activity in transitions per second, duty cycle, origin)origin is one ofglobalset_power_activity -globalinputset_power_activity -inputuserset_power_activity -input_ports -pinsvcdread_vcdsaifread_saifpropagatedpropagated from upstream activitiesclockSDC create_clock or create_generated_clockconstantconstant pins propagated from verilog tie high/low, set_case_analysis, set_logic_one/zero/dc + slew_max_fallslew_max_riseslew_min_fallslew_min_riseclocksclock_domainsdirectionfull_nameis_hierarchicalis_portis_register_clocklib_pin_namenameslack_maxslack_max_fallslack_max_riseslack_minslack_min_fallslack_min_rise port - activityslew_max_fallslew_max_riseslew_min_fallslew_min_risedirectionfull_nameliberty_portnameslack_maxslack_max_fallslack_max_riseslack_minslack_min_fallslack_min_rise - point (PathRef) - arrivalpinrequiredslack + activityslew_max_fallslew_max_riseslew_min_fallslew_min_risedirectionfull_nameliberty_portnameslack_maxslack_max_fallslack_max_riseslack_minslack_min_fallslack_min_rise + point (PathRef) + arrivalpinrequiredslack - get_scenes + get_scenes - [-mode mode_name]scene_name + [-mode mode_name]scene_name - mode_name + mode_name - Get the scenes for mode_name. + Get the scenes for mode_name. - scene_name + scene_name - A scene name pattern. + A scene name pattern. - The get_scenes command is used to find the scenes matching a pattern or that use an SDC mode. + The get_scenes command is used to find the scenes matching a pattern or that use an SDC mode. - get_timing_edges + get_timing_edges [-from from_pins][-to to_pins][-of_objects objects][-filter expr][patterns] @@ -8296,53 +8318,53 @@ - -from from_pin + -from from_pin - A list of pins. + A list of pins. - -to to_pin + -to to_pin - A list of pins. + A list of pins. - -of_objects objects + -of_objects objects - A list of instances or library cells. The –from and -to options cannot be used with –of_objects. + A list of instances or library cells. The –from and -to options cannot be used with –of_objects. - -filter expr + -filter expr A filter expression of the form property==value”where property is a property supported by the get_property command. See the section “Filter Expressions” for additional forms. - The get_timing_edges command returns a list of timing edges (arcs) to, from or between pins. The result can be passed to get_property or set_disable_timing. + The get_timing_edges command returns a list of timing edges (arcs) to, from or between pins. The result can be passed to get_property or set_disable_timing. - group_path + group_path - -name group_name[-weight weight][-critical_range range][-from from_list |-rise_from from_list |-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-default] + -name group_name[-weight weight][-critical_range range][-from from_list |-rise_from from_list |-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-default] - -name group_name + -name group_name The name of the path group. @@ -8350,7 +8372,7 @@ - -weight weight + -weight weight Not supported. @@ -8358,7 +8380,7 @@ - -critical_range range + -critical_range range Not supported. @@ -8393,7 +8415,7 @@ -through through_list - Group paths through a list of instances, pins or nets. + Group paths through a list of instances, pins or nets. @@ -8401,7 +8423,7 @@ -rise_through through_list - Group rising paths through a list of instances, pins or nets. + Group rising paths through a list of instances, pins or nets. @@ -8409,7 +8431,7 @@ -fall_through through_list - Group falling paths through a list of instances, pins or nets. + Group falling paths through a list of instances, pins or nets. @@ -8417,7 +8439,7 @@ -to to_list - Group paths to a list of clocks, instances, ports or pins. + Group paths to a list of clocks, instances, ports or pins. @@ -8425,7 +8447,7 @@ -rise_to to_list - Group rising paths to a list of clocks, instances, ports or pins. + Group rising paths to a list of clocks, instances, ports or pins. @@ -8433,15 +8455,15 @@ -fall_to to_list - Group falling paths to a list of clocks, instances, port-s or pins. + Group falling paths to a list of clocks, instances, port-s or pins. - -default + -default - Restore the paths in the path group -from/-to/-through/-to to their default path group. + Restore the paths in the path group -from/-to/-through/-to to their default path group. @@ -8451,84 +8473,84 @@ - include + include - [-echo|-e][-verbose|-v]filename[> log_filename][>> log_filename] + [-echo|-e][-verbose|-v]filename[> log_filename][>> log_filename] - -echo|-e + -echo|-e - Print each command before evaluating it. + Print each command before evaluating it. - -verbose|-v + -verbose|-v - Print each command before evaluating it as well as the result it returns. + Print each command before evaluating it as well as the result it returns. - filename + filename - The name of the file containing commands to read. + The name of the file containing commands to read. - > log_filename + > log_filename - Redirect command output to log_filename. + Redirect command output to log_filename. - >> log_filename + >> log_filename - Redirect command output and append log_filename. + Redirect command output and append log_filename. - Read STA/SDC/Tcl commands from filename. - The include command stops and reports any errors encountered while reading a file unless sta_continue_on_error is 1. + Read STA/SDC/Tcl commands from filename. + The include command stops and reports any errors encountered while reading a file unless sta_continue_on_error is 1. - link_design + link_design - [-no_black_boxes][cell_name] + [-no_black_boxes][cell_name] - -no_black_boxes + -no_black_boxes - Do not make empty “black box” cells for instances that reference undefined cells. + Do not make empty “black box” cells for instances that reference undefined cells. - cell_name + cell_name - The top level module/cell name of the design hierarchy to link. + The top level module/cell name of the design hierarchy to link. - Link (elaborate, flatten) the the top level cell cell_name. The design must be linked after reading netlist and library files. The default value of cell_name is the current design. + Link (elaborate, flatten) the the top level cell cell_name. The design must be linked after reading netlist and library files. The default value of cell_name is the current design. The linker creates empty "block box" cells for instances the reference undefined cells when the variable link_create_black_boxes is true. When link_create_black_boxes is false an error is reported and the link fails. The link_design command returns 1 if the link succeeds and 0 if it fails. @@ -8536,7 +8558,7 @@ - make_instance + make_instance inst_pathlib_cell @@ -8566,7 +8588,7 @@ - make_net + make_net net_name_list @@ -8587,18 +8609,18 @@ - read_liberty + read_liberty - [-corner corner][-min][-max][-infer_latches]filename + [-corner corner][-min][-max][-infer_latches]filename - -corner corner + -corner corner - Use the library for process corner corner delay calculation. + Use the library for process corner corner delay calculation. @@ -8622,12 +8644,12 @@ filename - The liberty file name to read. + The liberty file name to read. The read_liberty command reads a Liberty format library file. The first library that is read sets the units used by SDC/TCL commands and reporting. The include_file attribute is supported. - Some Liberty libraries do not include latch groups for cells that are describe transparent latches. In that situation the -infer_latches command flag can be used to infer the latches. The timing arcs required for a latch to be inferred should look like the following: + Some Liberty libraries do not include latch groups for cells that are describe transparent latches. In that situation the -infer_latches command flag can be used to infer the latches. The timing arcs required for a latch to be inferred should look like the following: cell (infered_latch) { pin(D) { direction : input ; timing () { related_pin : "E" ; timing_type : setup_falling ; } timing () { related_pin : "E" ; timing_type : hold_falling ; } } pin(E) { direction : input; } pin(Q) { direction : output ; timing () { related_pin : "D" ; } timing () { related_pin : "E" ; timing_type : rising_edge ; } }} In this example a positive level-sensitive latch is inferred. Files compressed with gzip are automatically uncompressed. @@ -8636,48 +8658,48 @@ - read_saif + read_saif - [-scope scope]filename + [-scope scope]filename - scope + scope - The SAIF scope of the current design to extract simulation data. Typically the test bench name and design under test instance name. Scope levels are separated with ‘/’. + The SAIF scope of the current design to extract simulation data. Typically the test bench name and design under test instance name. Scope levels are separated with ‘/’. - filename + filename - The name of the SAIF file to read. + The name of the SAIF file to read. - The read_saif command reads a SAIF (Switching Activity Interchange Format) file from a Verilog simulation and extracts pin activities and duty cycles for use in power estimation. Files compressed with gzip are supported. Annotated activities are propagated to the fanout of the annotated pins. + The read_saif command reads a SAIF (Switching Activity Interchange Format) file from a Verilog simulation and extracts pin activities and duty cycles for use in power estimation. Files compressed with gzip are supported. Annotated activities are propagated to the fanout of the annotated pins. - read_sdc + read_sdc - [-mode mode_name][-echo]filename + [-mode mode_name][-echo]filename - mode_name + mode_name - Mode for the SDC commands in the file. + Mode for the SDC commands in the file. @@ -8697,8 +8719,8 @@ - Read SDC commands from filename. - If the mode does not exist it is created. Multiple SDC files can append commands to a mode by using the -mode_name argument for each one. If no -mode arguement is is used the commands are added to the current mode. + Read SDC commands from filename. + If the mode does not exist it is created. Multiple SDC files can append commands to a mode by using the -mode_name argument for each one. If no -mode arguement is is used the commands are added to the current mode. The read_sdc command stops and reports any errors encountered while reading a file unless sta_continue_on_error is 1. Files compressed with gzip are automatically uncompressed. @@ -8706,15 +8728,15 @@ - read_sdf + read_sdf - [-scene scene][-unescaped_dividers]filename + [-scene scene][-unescaped_dividers]filename - scene + scene Scene delays to annotate. @@ -8737,7 +8759,7 @@ - Read SDF delays from a file. The min and max values in the SDF tuples are used to annotate the delays for corner. The typical values in the SDF tuples are ignored. If multiple scenes are defined -scene must be specified. SDC annotation for mcmm analysis must follow the scene definitions. + Read SDF delays from a file. The min and max values in the SDF tuples are used to annotate the delays for corner. The typical values in the SDF tuples are ignored. If multiple scenes are defined -scene must be specified. SDC annotation for mcmm analysis must follow the scene definitions. Files compressed with gzip are automatically uncompressed. INCREMENT is supported as an alias for INCREMENTAL. The following SDF statements are not supported. @@ -8747,18 +8769,18 @@ - read_spef + read_spef - [-name name][-keep_capacitive_coupling][-coupling_reduction_factor factor][-reduce][-path path]filename + [-name name][-keep_capacitive_coupling][-coupling_reduction_factor factor][-reduce][-path path]filename - name + name - The name of the SPEF parasitics to use for defining scenes. The default is the base name of filename. + The name of the SPEF parasitics to use for defining scenes. The default is the base name of filename. @@ -8766,12 +8788,12 @@ path - Hierarchical block instance path to annotate with parasitics. + Hierarchical block instance path to annotate with parasitics. - ‑keep_capacitive_coupling + ‑keep_capacitive_coupling Keep coupling capacitors in parasitic networks rather than converting them to grounded capacitors. @@ -8779,10 +8801,10 @@ - ‑coupling_reduction_factorfactor + ‑coupling_reduction_factorfactor - Factor to multiply coupling capacitance by when reducing parasitic networks. The default value is 1.0. + Factor to multiply coupling capacitance by when reducing parasitic networks. The default value is 1.0. @@ -8794,58 +8816,58 @@ - The read_spef command reads a file of net parasitics in SPEF format. Use the report_parasitic_annotation command to check for nets that are not annotated. + The read_spef command reads a file of net parasitics in SPEF format. Use the report_parasitic_annotation command to check for nets that are not annotated. Files compressed with gzip are automatically uncompressed. - Separate min/max parasitics can be annotated for each scene mode/corner. - read_spef -name min spef1read_spef -name max spef2define_scene -mode mode1 -spef_min min -spef_max max - Coupling capacitors are multiplied by the –coupling_reduction_factor when a parasitic network is reduced. + Separate min/max parasitics can be annotated for each scene mode/corner. + read_spef -name min spef1read_spef -name max spef2define_scene -mode mode1 -spef_min min -spef_max max + Coupling capacitors are multiplied by the –coupling_reduction_factor when a parasitic network is reduced. The following SPEF constructs are ignored. *DESIGN_FLOW (all values are ignored)*S slews*D driving cell*I pin capacitances (library cell capacitances are used instead)*Q r_net load poles*K r_net load residues - If the SPEF file contains triplet values the first value is used. - Parasitic networks (DSPEF) can be annotated on hierarchical blocks using the -path argument to specify the instance path to the block. Parasitic networks in the higher level netlist are stitched together at the hierarchical pins of the blocks. + If the SPEF file contains triplet values the first value is used. + Parasitic networks (DSPEF) can be annotated on hierarchical blocks using the -path argument to specify the instance path to the block. Parasitic networks in the higher level netlist are stitched together at the hierarchical pins of the blocks. - read_vcd + read_vcd - [-scope scope][-mode mode_name]filename + [-scope scope][-mode mode_name]filename - scope + scope - The VCD scope of the current design to extract simulation data. Typically the test bench name and design under test instance name. Scope levels are separated with ‘/’. + The VCD scope of the current design to extract simulation data. Typically the test bench name and design under test instance name. Scope levels are separated with ‘/’. - mode_name + mode_name - Mode to annotate activities. + Mode to annotate activities. - filename + filename - The name of the VCD file to read. + The name of the VCD file to read. - The read_vcd command reads a VCD (Value Change Dump) file from a Verilog simulation and extracts pin activities and duty cycles for use in power estimation. Files compressed with gzip are supported. Annotated activities are propagated to the fanout of the annotated pins. + The read_vcd command reads a VCD (Value Change Dump) file from a Verilog simulation and extracts pin activities and duty cycles for use in power estimation. Files compressed with gzip are supported. Annotated activities are propagated to the fanout of the annotated pins. - read_verilog + read_verilog filename @@ -8860,8 +8882,8 @@ - The read_verilog command reads a gate level verilog netlist. After all verilog netlist and Liberty libraries are read the design must be linked with the link_design command. - Verilog 2001 module port declaratations are supported. An example is shown below. + The read_verilog command reads a gate level verilog netlist. After all verilog netlist and Liberty libraries are read the design must be linked with the link_design command. + Verilog 2001 module port declaratations are supported. An example is shown below. module top (input in1, in2, clk1, clk2, clk3, output out); Files compressed with gzip are automatically uncompressed. @@ -8869,7 +8891,7 @@ - replace_cell + replace_cell instance_listreplacement_cell @@ -8893,45 +8915,45 @@ - The replace_cell command changes the cell of an instance. The replacement cell must have the same port list (number, name, and order) as the instance's existing cell for the replacement to be successful. + The replace_cell command changes the cell of an instance. The replacement cell must have the same port list (number, name, and order) as the instance's existing cell for the replacement to be successful. - replace_activity_annotation + replace_activity_annotation - [-report_unannotated][-report_annotated] + [-report_unannotated][-report_annotated] - -report_unannotated + -report_unannotated - Report unannotated pins. + Report unannotated pins. - -report_unannotated + -report_unannotated - Report annotated pins. + Report annotated pins. - Report a summary of pins that are annotated by read_vcd, read_saif or set_power_activity. Sequential internal pins and hierarchical pins are ignored. + Report a summary of pins that are annotated by read_vcd, read_saif or set_power_activity. Sequential internal pins and hierarchical pins are ignored. - report_annotated_check + report_annotated_check - [-setup][-hold][-recovery][-removal][-nochange][-width][-period][-max_skew][-max_line lines][-report_annotated][-report_unannotated][-constant_arcs] + [-setup][-hold][-recovery][-removal][-nochange][-width][-period][-max_skew][-max_line lines][-report_annotated][-report_unannotated][-constant_arcs] @@ -9001,26 +9023,26 @@ - -max_line lines + -max_line lines - Maximum number of lines listed by the report_annotated and ‑report_unannotated options. + Maximum number of lines listed by the report_annotated and ‑report_unannotated options. - -report_annotated + -report_annotated - Report annotated timing arcs. + Report annotated timing arcs. - -report_unannotated + -report_unannotated - Report unannotated timing arcs. + Report unannotated timing arcs. @@ -9032,16 +9054,16 @@ - The report_annotated_check command reports a summary of SDF timing check annotation. The -report_annotated and report_annotated options can be used to list arcs that are annotated or not annotated. + The report_annotated_check command reports a summary of SDF timing check annotation. The -report_annotated and report_annotated options can be used to list arcs that are annotated or not annotated. - report_annotated_delay + report_annotated_delay - [-cell][-net][-from_in_ports][-to_out_ports][-max_lines lines][-report_annotated][-report_unannotated][-constant_arcs] + [-cell][-net][-from_in_ports][-to_out_ports][-max_lines lines][-report_annotated][-report_unannotated][-constant_arcs] @@ -9062,7 +9084,7 @@ - -from_in_ports + -from_in_ports Report annotated delays from input ports. @@ -9070,7 +9092,7 @@ - -to_out_ports + -to_out_ports Report annotated delays to output ports. @@ -9078,26 +9100,26 @@ - -max_lines lines + -max_lines lines - Maximum number of lines listed by the report_annotated and ‑report_unannotated options. + Maximum number of lines listed by the report_annotated and ‑report_unannotated options. - -report_annotated + -report_annotated - Report annotated timing arcs. + Report annotated timing arcs. - -report_unannotated + -report_unannotated - Report unannotated timing arcs. + Report unannotated timing arcs. @@ -9109,335 +9131,335 @@ - The report_annotated_delay command reports a summary of SDF delay annotation. Without the ‑from_in_ports and –to_out_ports options arcs to and from top level ports are not reported. The ‑report_annotated and report_unannotated options can be used to list arcs that are annotated or not annotated. + The report_annotated_delay command reports a summary of SDF delay annotation. Without the ‑from_in_ports and –to_out_ports options arcs to and from top level ports are not reported. The ‑report_annotated and report_unannotated options can be used to list arcs that are annotated or not annotated. - report_checks + report_checks - [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-unique_edges_to_endpoint][-scenes scenes][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups][-format end|full|short|summary |full_clock|full_clock_expanded |json][-fields fields][-digits digits][-no_line_split][> filename][>> filename] + [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-unique_edges_to_endpoint][-scenes scenes][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups][-format end|full|short|summary |full_clock|full_clock_expanded |json][-fields fields][-digits digits][-no_line_split][> filename][>> filename] - -from from_list + -from from_list - Report paths from a list of clocks, instances, ports, register clock pins, or latch data pins. + Report paths from a list of clocks, instances, ports, register clock pins, or latch data pins. - -rise_from from_list + -rise_from from_list - Report paths from the rising edge of clocks, instances, ports, register clock pins, or latch data pins. + Report paths from the rising edge of clocks, instances, ports, register clock pins, or latch data pins. - -fall_from from_list + -fall_from from_list - Report paths from the falling edge of clocks, instances, ports, register clock pins, or latch data pins. + Report paths from the falling edge of clocks, instances, ports, register clock pins, or latch data pins. - -through through_list + -through through_list - Report paths through a list of instances, pins or nets. + Report paths through a list of instances, pins or nets. - -rise_through through_list + -rise_through through_list - Report rising paths through a list of instances, pins or nets. + Report rising paths through a list of instances, pins or nets. - -fall_through through_list + -fall_through through_list - Report falling paths through a list of instances, pins or nets. + Report falling paths through a list of instances, pins or nets. - -to to_list + -to to_list - Report paths to a list of clocks, instances, ports or pins. + Report paths to a list of clocks, instances, ports or pins. - -rise_to to_list + -rise_to to_list - Report rising paths to a list of clocks, instances, ports or pins. + Report rising paths to a list of clocks, instances, ports or pins. - -fall_to to_list + -fall_to to_list - Report falling paths to a list of clocks, instances, ports or pins. + Report falling paths to a list of clocks, instances, ports or pins. - -unconstrained + -unconstrained - Report unconstrained paths also. The unconstrained path group is not reported without this option. + Report unconstrained paths also. The unconstrained path group is not reported without this option. - -path_delay min + -path_delay min - Report min path (hold) checks. + Report min path (hold) checks. - -path_delay min_rise + -path_delay min_rise - Report min path (hold) checks for rising endpoints. + Report min path (hold) checks for rising endpoints. - -path_delay min_fall + -path_delay min_fall - Report min path (hold) checks for falling endpoints. + Report min path (hold) checks for falling endpoints. - -path_delay max + -path_delay max - Report max path (setup) checks. + Report max path (setup) checks. - -path_delay max_rise + -path_delay max_rise - Report max path (setup) checks for rising endpoints. + Report max path (setup) checks for rising endpoints. - -path_delay max_fall + -path_delay max_fall - Report max path (setup) checks for falling endpoints. + Report max path (setup) checks for falling endpoints. - -path_delay min_max + -path_delay min_max - Report max and max path (setup and hold) checks. + Report max and max path (setup and hold) checks. - -group_path_count path_count + -group_path_count path_count - The number of paths to report in each path group. The default is 1. + The number of paths to report in each path group. The default is 1. - -endpoint_path_count endpoint_path_count + -endpoint_path_count endpoint_path_count - The number of paths to report for each endpoint. The default is 1. + The number of paths to report for each endpoint. The default is 1. - ‑unique_paths_to_endpoint + ‑unique_paths_to_endpoint - When multiple paths to an endpoint are specified with ‑endpoint_path_count, many of the paths may differ only in the rise/fall edges of the pins in the paths. With this option only the worst path through the set of pins is reported. + When multiple paths to an endpoint are specified with ‑endpoint_path_count, many of the paths may differ only in the rise/fall edges of the pins in the paths. With this option only the worst path through the set of pins is reported. - ‑unique_edges_to_endpoint + ‑unique_edges_to_endpoint - When multiple paths to an endpoint are specified with ‑endpoint_path_count, conditional timing arcs result in paths that through the same pins and rise/fall edges. With this option only the worst path through the set of pins and rise/fall edges is reported. + When multiple paths to an endpoint are specified with ‑endpoint_path_count, conditional timing arcs result in paths that through the same pins and rise/fall edges. With this option only the worst path through the set of pins and rise/fall edges is reported. - scenes + scenes - Report paths for one process corner. The default is to report paths for all process corners. + Report paths for one process corner. The default is to report paths for all process corners. - max_slack + max_slack - Only report paths with less slack than max_slack. + Only report paths with less slack than max_slack. - min_slack + min_slack - Only report paths with more slack than min_slack. + Only report paths with more slack than min_slack. - -sort_by_slack + -sort_by_slack - Sort paths by slack rather than slack grouped by path group. + Sort paths by slack rather than slack grouped by path group. - groups + groups - List of path groups to report. The default is to report all path groups. + List of path groups to report. The default is to report all path groups. - -format end + -format end - Report path ends in one line with delay, required time and slack. + Report path ends in one line with delay, required time and slack. - -format full + -format full - Report path start and end points and the path. This is the default path type. + Report path start and end points and the path. This is the default path type. - -format full_clock + -format full_clock - Report path start and end points, the path, and the source and and target clock paths. + Report path start and end points, the path, and the source and and target clock paths. - -format full_clock_expanded + -format full_clock_expanded - Report path start and end points, the path, and the source and and target clock paths. If the clock is generated and propagated, the path from the clock source pin is also reported. + Report path start and end points, the path, and the source and and target clock paths. If the clock is generated and propagated, the path from the clock source pin is also reported. - -format short + -format short - Report only path start and end points. + Report only path start and end points. - -format summary + -format summary - Report only path ends with delay. + Report only path ends with delay. - -format json + -format json - Report in json format. -fields is ignored. + Report in json format. -fields is ignored. - fields + fields - List of capacitance|slew|input_pins|hierarchical_pins|nets|fanout|src_attr + List of capacitance|slew|input_pins|hierarchical_pins|nets|fanout|src_attr - digits + digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. - -no_line_splits + -no_line_splits - Do not split long lines into multiple lines. + Do not split long lines into multiple lines. - The report_checks command reports paths in the design. Paths are reported in groups by capture clock, unclocked path delays, gated clocks and unconstrained. - See set_false_path for a description of allowed from_list, through_list and to_list objects. + The report_checks command reports paths in the design. Paths are reported in groups by capture clock, unclocked path delays, gated clocks and unconstrained. + See set_false_path for a description of allowed from_list, through_list and to_list objects. - report_check_types + report_check_types - [-scenes scenes][-violators][-verbose][-format slack_only|end][-max_delay][-min_delay][-recovery][-removal][-clock_gating_setup][-clock_gating_hold][-max_slew][-min_slew][-min_pulse_width][-min_period][-digits digits][-no_split_lines][> filename][>> filename] + [-scenes scenes][-violators][-verbose][-format slack_only|end][-max_delay][-min_delay][-recovery][-removal][-clock_gating_setup][-clock_gating_hold][-max_slew][-min_slew][-min_pulse_width][-min_period][-digits digits][-no_split_lines][> filename][>> filename] - scenes + scenes - Report checks for some scens. The default value is all scenes. + Report checks for some scens. The default value is all scenes. - -violators + -violators Report all violated timing and design rule constraints. @@ -9445,7 +9467,7 @@ - -verbose + -verbose Use a verbose output format. @@ -9453,18 +9475,18 @@ - -format slack_only + -format slack_only - Report the minimum slack for each timing check. + Report the minimum slack for each timing check. - -format end + -format end - Report the endpoint for each check. + Report the endpoint for each check. @@ -9558,10 +9580,10 @@ - -digits digits + -digits digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. @@ -9569,7 +9591,7 @@ -no_split_lines - Do not split long lines into multiple lines. + Do not split long lines into multiple lines. @@ -9579,60 +9601,60 @@ - report_clock_latency + report_clock_latency - [-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] + [-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] - clocks + clocks - The clocks to report. The default value is all c + The clocks to report. The default value is all c - scenes + scenes - Report clocks for scenes. The default value is all clocks in scenes modes. + Report clocks for scenes. The default value is all clocks in scenes modes. - -include_internal_latency + -include_internal_latency - Include internal clock latency from liberty min/max_clock_tree_path timing groups. + Include internal clock latency from liberty min/max_clock_tree_path timing groups. - digits + digits - The number of digits to report for delays. + The number of digits to report for delays. - Report the clock network latency. + Report the clock network latency. - report_clock_min_period + report_clock_min_period - [-clocks clocks][-scenes scenes][-include_port_paths] + [-clocks clocks][-scenes scenes][-include_port_paths] - clocks + clocks The clocks to report. @@ -9647,14 +9669,14 @@ - Report the minimum period and maximum frequency for clocks. If the -clocks argument is not specified all clocks are reported. The minimum period is determined by examining the smallest slack paths between registers the rising edges of the clock or between falling edges of the clock. Paths between different clocks, different clock edges of the same clock, level sensitive latches, or paths constrained by set_multicycle_path, set_max_path are not considered. + Report the minimum period and maximum frequency for clocks. If the -clocks argument is not specified all clocks are reported. The minimum period is determined by examining the smallest slack paths between registers the rising edges of the clock or between falling edges of the clock. Paths between different clocks, different clock edges of the same clock, level sensitive latches, or paths constrained by set_multicycle_path, set_max_path are not considered. - report_clock_properties + report_clock_properties [clock_names] @@ -9675,10 +9697,10 @@ - report_clock_skew + report_clock_skew - [-setup|-hold][-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] + [-setup|-hold][-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] @@ -9699,55 +9721,55 @@ - clocks + clocks - The clocks to report. The default value is all clocks in scenes modes. + The clocks to report. The default value is all clocks in scenes modes. - scenes + scenes - Report clocks for scenes. The default value is all scenes. + Report clocks for scenes. The default value is all scenes. - -include_internal_latency + -include_internal_latency - Include internal clock latency from liberty min/max_clock_tree_path timing groups. + Include internal clock latency from liberty min/max_clock_tree_path timing groups. - -digits digits + -digits digits The number of digits to report for delays. - Report the maximum difference in clock arrival between every source and target register that has a path between the source and target registers. + Report the maximum difference in clock arrival between every source and target register that has a path between the source and target registers. - report_dcalc + report_dcalc - [-from from_pin][-to to_pin][-scene scene][-min][-max][-digits digits][> filename][>> filename] + [-from from_pin][-to to_pin][-scene scene][-min][-max][-digits digits][> filename][>> filename] - from_pin + from_pin - Report delay calculations for timing arcs from instance input pin from_pin. + Report delay calculations for timing arcs from instance input pin from_pin. @@ -9755,40 +9777,40 @@ to_pin - Report delay calculations for timing arcs to instance output pin to_pin. + Report delay calculations for timing arcs to instance output pin to_pin. - scene + scene - Report paths for process scene. The -scene keyword is required if more than one process corner is defined. + Report paths for process scene. The -scene keyword is required if more than one process corner is defined. - -min + -min - Report delay calculation for min delays. + Report delay calculation for min delays. - -max + -max - Report delay calculation for max delays. + Report delay calculation for max delays. - -digits digits + -digits digits - The number of digits after the decimal point to report. The default is sta_report_default_digits. + The number of digits after the decimal point to report. The default is sta_report_default_digits. @@ -9798,7 +9820,7 @@ - report_disabled_edges + report_disabled_edges @@ -9806,42 +9828,42 @@ The report_disabled_edges command reports disabled timing arcs along with the reason they are disabled. Each disabled timing arc is reported as the instance name along with the from and to ports of the arc. The disable reason is shown next. Arcs that are disabled with set_disable_timing are reported with constraint as the reason. Arcs that are disabled by constants are reported with constant as the reason along with the constant instance pin and value. Arcs that are disabled to break combinational feedback loops are reported with loop as the reason. - > report_disabled_edgesu1 A B constant B=0 + > report_disabled_edgesu1 A B constant B=0 - report_edges + report_edges - [-from from_pin][-to to_pin] + [-from from_pin][-to to_pin] - -from from_pin + -from from_pin - Report edges/timing arcs from pin from_pin. + Report edges/timing arcs from pin from_pin. - -to to_pin + -to to_pin - Report edges/timing arcs to pin to_pin. + Report edges/timing arcs to pin to_pin. - Report the edges/timing arcs and their delays in the timing graph from/to/between pins. + Report the edges/timing arcs and their delays in the timing graph from/to/between pins. - report_instance + report_instance instance_path[> filename][>> filename] @@ -9862,7 +9884,7 @@ - report_lib_cell + report_lib_cell cell_name[> filename][>> filename] @@ -9884,7 +9906,7 @@ - report_net + report_net [-digits digits]net_path[> filename][>> filename] @@ -9892,10 +9914,10 @@ - -digits digits + -digits digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. @@ -9907,190 +9929,190 @@ - Report the connections and capacitance of a net. + Report the connections and capacitance of a net. - report_parasitic_annotation + report_parasitic_annotation - [-report_unannotated][> filename][>> filename] + [-report_unannotated][> filename][>> filename] - -report_unannotated + -report_unannotated - Report unannotated and partially annotated nets. + Report unannotated and partially annotated nets. - Report SPEF parasitic annotation completeness. + Report SPEF parasitic annotation completeness. - report_power + report_power - [-instances instances][-highest_power_instances count][-digits digits][> filename][>> filename] + [-instances instances][-highest_power_instances count][-digits digits][> filename][>> filename] - -instances instances + -instances instances - Report the power for each instance of instances. If the instance is hierarchical the total power for the instances inside the hierarchical instance is reported. + Report the power for each instance of instances. If the instance is hierarchical the total power for the instances inside the hierarchical instance is reported. - -highest_power_instances count + -highest_power_instances count - Report the power for the count highest power instances. + Report the power for the count highest power instances. - -digits digits + -digits digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. - The report_power command uses static power analysis based on propagated or annotated pin activities in the circuit using Liberty power models. The internal, switching, leakage and total power are reported. Design power is reported separately for combinational, sequential, macro and pad groups. Power values are reported in watts. - The read_vcd or read_saif commands can be used to read activities from a file based on simulation. If no simulation activities are available, the set_power_activity command should be used to set the activity of input ports or pins in the design. The default input activity and duty for inputs are 0.1 and 0.5 respectively. The activities are propagated from annotated input ports or pins through gates and used in the power calculations. + The report_power command uses static power analysis based on propagated or annotated pin activities in the circuit using Liberty power models. The internal, switching, leakage and total power are reported. Design power is reported separately for combinational, sequential, macro and pad groups. Power values are reported in watts. + The read_vcd or read_saif commands can be used to read activities from a file based on simulation. If no simulation activities are available, the set_power_activity command should be used to set the activity of input ports or pins in the design. The default input activity and duty for inputs are 0.1 and 0.5 respectively. The activities are propagated from annotated input ports or pins through gates and used in the power calculations. Group Internal Switching Leakage Total Power Power Power Power----------------------------------------------------------------Sequential 3.29e-06 3.41e-08 2.37e-07 3.56e-06 92.4%Combinational 1.86e-07 3.31e-08 7.51e-08 2.94e-07 7.6%Macro 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%Pad 0.00e+00 0.00e+00 0.00e+00 0.00e+00 0.0%---------------------------------------------------------------Total 3.48e-06 6.72e-08 3.12e-07 3.86e-06 100.0% 90.2% 1.7% 8.1% - report_slews + report_slews - [-scenes scenes]pin + [-scenes scenes]pin - scenes + scenes - Report slews for process for scenes process corners.. + Report slews for process for scenes process corners.. - pin + pin - + - Report the slews at pin + Report the slews at pin - report_tns + report_tns - [-min][-max][-digits digits] + [-min][-max][-digits digits] - -max + -max - Report the total max/setup slack. + Report the total max/setup slack. - -min + -min - Report the total min/hold slack. + Report the total min/hold slack. - -digits digits + -digits digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. - Report the total negative slack. + Report the total negative slack. - report_units + report_units - Report the units used for command arguments and reporting. + Report the units used for command arguments and reporting. report_units time 1ns capacitance 1pF resistance 1kohm voltage 1v current 1A power 1pW distance 1um - report_wns + report_wns - [-min][-max][-digits digits] + [-min][-max][-digits digits] - -max + -max - Report the worst max/setup slack. + Report the worst max/setup slack. - -min + -min - Report the worst min/hold slack. + Report the worst min/hold slack. - -digits digits + -digits digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. - Report the worst negative slack. If the worst slack is positive, zero is reported. + Report the worst negative slack. If the worst slack is positive, zero is reported. - report_worst_slack + report_worst_slack [-min][-max][-digits digits] @@ -10114,10 +10136,10 @@ - -digits digits + -digits digits - The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. + The number of digits after the decimal point to report. The default value is the variable sta_report_default_digits. @@ -10128,10 +10150,10 @@ - set_assigned_check + set_assigned_check - -setup|-hold|-recovery|-removal[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins][-clock rise|fall][-cond sdf_cond][-worst]margin + -setup|-hold|-recovery|-removal[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins][-clock rise|fall][-cond sdf_cond][-worst]margin @@ -10139,7 +10161,7 @@ -setup - Annotate setup timing checks. + Annotate setup timing checks. @@ -10147,7 +10169,7 @@ -hold - Annotate hold timing checks. + Annotate hold timing checks. @@ -10155,7 +10177,7 @@ -recovery - Annotate recovery timing checks. + Annotate recovery timing checks. @@ -10163,7 +10185,7 @@ -removal - Annotate removal timing checks. + Annotate removal timing checks. @@ -10184,10 +10206,10 @@ - scene + scene - The name of a scene. The -scene keyword is required if more than one scene is defined. + The name of a scene. The -scene keyword is required if more than one scene is defined. @@ -10224,10 +10246,10 @@ - -clock rise|fall + -clock rise|fall - The timing check clock pin transition. + The timing check clock pin transition. @@ -10235,7 +10257,7 @@ margin - The timing check margin. + The timing check margin. @@ -10246,10 +10268,10 @@ - set_assigned_delay + set_assigned_delay - -cell|-net[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins]delay + -cell|-net[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins]delay @@ -10286,10 +10308,10 @@ - scene + scene - The name of a scene. The -scene keyword is required if more than one scene is defined. + The name of a scene. The -scene keyword is required if more than one scene is defined. @@ -10339,10 +10361,10 @@ - set_assigned_transition + set_assigned_transition - [-rise][-fall][-scene scene][-min][-max]slewpin_list + [-rise][-fall][-scene scene][-min][-max]slewpin_list @@ -10364,10 +10386,10 @@ - scene + scene - Annotate delays for scene. + Annotate delays for scene. @@ -10409,7 +10431,7 @@ - set_case_analysis + set_case_analysis 0|1|zero|one|rise|rising|fall|fallingport_or_pin_list @@ -10425,13 +10447,13 @@ The set_case_analysis command sets the signal on a port or pin to a constant logic value. No paths are propagated from constant pins. Constant values set with the set_case_analysis command are propagated through downstream gates. - Conditional timing arcs with mode groups are controlled by logic values on the instance pins. + Conditional timing arcs with mode groups are controlled by logic values on the instance pins. - set_clock_gating_check + set_clock_gating_check [-setup setup_time][-hold hold_time][-rise][-fall][-high][-low][objects] @@ -10439,7 +10461,7 @@ - -setup setup_time + -setup setup_time Clock enable setup margin. @@ -10447,7 +10469,7 @@ - -hold hold_time + -hold hold_time Clock enable hold margin. @@ -10505,7 +10527,7 @@ - set_clock_groups + set_clock_groups [-name name][-logically_exclusive][-physically_exclusive][-asynchronous][-allow_paths]-group clocks @@ -10513,7 +10535,7 @@ - -name name + -name name The clock group name. @@ -10566,7 +10588,7 @@ - set_clock_latency + set_clock_latency [-source][-clock clock][-rise][-fall][-min][-max]delayobjects @@ -10574,7 +10596,7 @@ - -source + -source The latency is at the clock source. @@ -10582,7 +10604,7 @@ - -clock clock + -clock clock If multiple clocks are defined at a pin this use this option to specify the latency for a specific clock. @@ -10643,7 +10665,7 @@ - set_clock_transition + set_clock_transition [-rise][-fall][-min][-max]transitionclocks @@ -10654,7 +10676,7 @@ -rise - Set the transition time for the rising edge of the clock. + Set the transition time for the rising edge of the clock. @@ -10662,7 +10684,7 @@ -fall - Set the transition time for the falling edge of the clock. + Set the transition time for the falling edge of the clock. @@ -10671,7 +10693,7 @@ -min - Set the min transition time. + Set the min transition time. @@ -10679,7 +10701,7 @@ -max - Set the min transition time. + Set the min transition time. @@ -10705,7 +10727,7 @@ - set_clock_uncertainty + set_clock_uncertainty [-from|-rise_from|-fall_from from_clock][-to|-rise_to|-fall_to to_clock][-rise][-fall][-setup][-hold]uncertainty[objects] @@ -10713,18 +10735,18 @@ - -from from_clock + -from from_clock - Inter-clock uncertainty source clock. + Inter-clock uncertainty source clock. - -to to_clock + -to to_clock - Inter-clock uncertainty target clock. + Inter-clock uncertainty target clock. @@ -10732,7 +10754,7 @@ -rise - Inter-clock target clock rise edge, alternative to ‑rise_to.Inter-clock target clock rise edge, alternative to ‑rise_to. + Inter-clock target clock rise edge, alternative to ‑rise_to.Inter-clock target clock rise edge, alternative to ‑rise_to. @@ -10740,7 +10762,7 @@ -fall - Inter-clock target clock rise edge, alternative to ‑fall_to. + Inter-clock target clock rise edge, alternative to ‑fall_to. @@ -10748,7 +10770,7 @@ -setup - uncertainty is for setup checks. + uncertainty is for setup checks. @@ -10756,12 +10778,12 @@ -hold - uncertainty is for hold checks. + uncertainty is for hold checks. - uncertainty + uncertainty Clock uncertainty. @@ -10776,81 +10798,81 @@ - The set_clock_uncertainty command specifies the uncertainty or jitter in a clock. The uncertainty for a clock can be specified on its source pin or port, or the clock itself. - set_clock_uncertainty .1 [get_clock clk1] - Inter-clock uncertainty between the source and target clocks of timing checks is specified with the ‑from|‑rise_from|-fall_from andto|‑rise_to|-fall_to arguments . - set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] .1 - The following commands are equivalent. - set_clock_uncertainty -from [get_clock clk1] -rise_to [get_clocks clk2] .1set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] -rise .1 + The set_clock_uncertainty command specifies the uncertainty or jitter in a clock. The uncertainty for a clock can be specified on its source pin or port, or the clock itself. + set_clock_uncertainty .1 [get_clock clk1] + Inter-clock uncertainty between the source and target clocks of timing checks is specified with the ‑from|‑rise_from|-fall_from andto|‑rise_to|-fall_to arguments . + set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] .1 + The following commands are equivalent. + set_clock_uncertainty -from [get_clock clk1] -rise_to [get_clocks clk2] .1set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] -rise .1 - set_cmd_units + set_cmd_units - [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] + [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] - -capacitance cap_unit + -capacitance cap_unit - The capacitance scale factor followed by 'f'. + The capacitance scale factor followed by 'f'. - -resistance res_unit + -resistance res_unit - The resistance scale factor followed by 'ohm'. + The resistance scale factor followed by 'ohm'. - -time time_unit + -time time_unit - The time scale factor followed by 's'. + The time scale factor followed by 's'. - -voltage voltage_unit + -voltage voltage_unit - The voltage scale factor followed by 'v'. + The voltage scale factor followed by 'v'. - -current current_unit + -current current_unit - The current scale factor followed by 'A'. + The current scale factor followed by 'A'. - -power power_unit + -power power_unit - The power scale factor followed by 'w'. + The power scale factor followed by 'w'. - -distance distance_unit + -distance distance_unit - The distance scale factor followed by 'm'. + The distance scale factor followed by 'm'. - The set_cmd_units command is used to change the units used by the STA command interpreter when parsing commands and reporting results. The default units are the units specified in the first Liberty library file that is read. + The set_cmd_units command is used to change the units used by the STA command interpreter when parsing commands and reporting results. The default units are the units specified in the first Liberty library file that is read. Units are specified as a scale factor followed by a unit name. The scale factors are as follows. M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 An example of the set_units command is shown below. @@ -10860,15 +10882,15 @@ - set_data_check + set_data_check - [-from|-rise_from|-fall_from from_pin][-to|-rise_to|-fall_to to_pin][-setup][-hold][-clock clock]margin + [-from|-rise_from|-fall_from from_pin][-to|-rise_to|-fall_to to_pin][-setup][-hold][-clock clock]margin - -from from_pin + -from from_pin A pin used as the timing check reference. @@ -10876,7 +10898,7 @@ - -to to_pin + -to to_pin A pin that the setup/hold check is applied to. @@ -10900,7 +10922,7 @@ - -clock clock + -clock clock The setup/hold check clock. @@ -10921,7 +10943,7 @@ - set_disable_inferred_clock_gating + set_disable_inferred_clock_gating objects @@ -10936,13 +10958,13 @@ - The set_disable_inferred_clock_gating command disables clock gating checks on a clock gating instance, clock gating pin, or clock gating enable pin. + The set_disable_inferred_clock_gating command disables clock gating checks on a clock gating instance, clock gating pin, or clock gating enable pin. - set_disable_timing + set_disable_timing [-from from_port][-to to_port]objects @@ -10950,18 +10972,18 @@ - -from from_port + -from from_port - + - -to to_port + -to to_port - + @@ -10969,7 +10991,7 @@ objects - A list of instances, ports, pins, cells, cell/port, or library/cell/port. + A list of instances, ports, pins, cells, cell/port, or library/cell/port. @@ -10987,10 +11009,10 @@ - set_drive + set_drive - [-rise][-fall][-max][-min]resistanceports + [-rise][-fall][-max][-min]resistanceports @@ -10998,7 +11020,7 @@ -rise - Set the drive rise resistance. + Set the drive rise resistance. @@ -11006,7 +11028,7 @@ -fall - Set the drive fall resistance. + Set the drive fall resistance. @@ -11014,7 +11036,7 @@ -max - Set the maximum resistance. + Set the maximum resistance. @@ -11022,7 +11044,7 @@ -min - Set the minimum resistance. + Set the minimum resistance. @@ -11035,7 +11057,7 @@ - ports + ports A list of ports. @@ -11048,26 +11070,26 @@ - set_driving_cell + set_driving_cell - [-lib_cell cell_name][-library library][-rise][-fall][-min][-max][-pin pin][-from_pin from_pin][-input_transition_rise trans_rise][-input_transition_fall trans_fall]ports + [-lib_cell cell_name][-library library][-rise][-fall][-min][-max][-pin pin][-from_pin from_pin][-input_transition_rise trans_rise][-input_transition_fall trans_fall]ports - -lib_cell cell_name + -lib_cell cell_name - The driving cell. + The driving cell. - -library library + -library library - The driving cell library. + The driving cell library. @@ -11075,7 +11097,7 @@ -rise - Set the driving cell for a rising edge. + Set the driving cell for a rising edge. @@ -11083,7 +11105,7 @@ -fall - Set the driving cell for a falling edge. + Set the driving cell for a falling edge. @@ -11091,7 +11113,7 @@ -max - Set the driving cell for max delays. + Set the driving cell for max delays. @@ -11099,12 +11121,12 @@ -min - Set the driving cell for min delays. + Set the driving cell for min delays. - -pin pin + -pin pin The output port of the driving cell. @@ -11112,15 +11134,15 @@ - -from_pin from_pin + -from_pin from_pin - Use timing arcs from from_pin to the output pin. + Use timing arcs from from_pin to the output pin. - -input_transition_rise trans_rise + -input_transition_rise trans_rise The transition time for a rising input at from_pin. @@ -11128,7 +11150,7 @@ - -input_transition_fall trans_fall + -input_transition_fall trans_fall The transition time for a falling input at from_pin. @@ -11136,7 +11158,7 @@ - ports + ports A list of ports. @@ -11150,7 +11172,7 @@ - set_false_path + set_false_path [-setup][-hold][-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-reset_path] @@ -11161,7 +11183,7 @@ -setup - Apply to setup checks. + Apply to setup checks. @@ -11169,7 +11191,7 @@ -hold - Apply to hold checks. + Apply to hold checks. @@ -11177,7 +11199,7 @@ -rise - Apply to rising path edges. + Apply to rising path edges. @@ -11185,7 +11207,7 @@ -fall - Apply to falling path edges. + Apply to falling path edges. @@ -11198,7 +11220,7 @@ - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -11206,7 +11228,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -11214,7 +11236,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -11231,7 +11253,7 @@ - set_fanout_load + set_fanout_load fanoutport_list @@ -11244,7 +11266,7 @@ - set_hierarchy_separator + set_hierarchy_separator separator @@ -11265,7 +11287,7 @@ - set_ideal_latency + set_ideal_latency [-rise] [-fall] [-min] [-max] delay objects @@ -11278,7 +11300,7 @@ - set_ideal_network + set_ideal_network [-no_propagation] objects @@ -11291,7 +11313,7 @@ - set_ideal_transition + set_ideal_transition [-rise] [-fall] [-min] [-max] transition_time objects @@ -11304,7 +11326,7 @@ - set_input_delay + set_input_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall][-reference_pin ref_pin][-source_latency_included][-network_latency_included][-add_delay]delayport_pin_list @@ -11315,7 +11337,7 @@ -rise - Set the arrival time for the rising edge of the input. + Set the arrival time for the rising edge of the input. @@ -11323,7 +11345,7 @@ -fall - Set the arrival time for the falling edge of the input. + Set the arrival time for the falling edge of the input. @@ -11332,7 +11354,7 @@ -max - Set the maximum arrival time. + Set the maximum arrival time. @@ -11340,12 +11362,12 @@ -min - Set the minimum arrival time. + Set the minimum arrival time. - -clock clock + -clock clock The arrival time is from clock. @@ -11361,7 +11383,7 @@ - -reference_pin ref_pin + -reference_pin ref_pin The arrival time is with respect to the clock that arrives at ref_pin. @@ -11372,7 +11394,7 @@ -source_latency_included - D no add the clock source latency (insertion delay) to the delay value. + D no add the clock source latency (insertion delay) to the delay value. @@ -11380,7 +11402,7 @@ -network_latency_included - Do not add the clock latency to the delay value when the clock is ideal. + Do not add the clock latency to the delay value when the clock is ideal. @@ -11408,20 +11430,20 @@ - The set_input_delay command is used to specify the arrival time of an input signal. - The following command sets the min, max, rise and fall times on the in1 input port 1.0 time units after the rising edge of clk1. - set_input_delay -clock clk1 1.0 [get_ports in1] - Use multiple commands with the -add_delay option to specify separate arrival times for min, max, rise and fall times or multiple clocks. For example, the following specifies separate arrival times with respect to clocks clk1 and clk2. - set_input_delay -clock clk1 1.0 [get_ports in1]set_input_delay -add_delay -clock clk2 2.0 [get_ports in1] - The –reference_pin option is used to specify an arrival time with respect to the arrival on a pin in the clock network. For propagated clocks, the input arrival time is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, input arrival time is relative to the reference pin clock source latency. With the -clock_fall flag the arrival time is relative to the falling transition at the reference pin. If no clocks arrive at the reference pin the set_input_delay command is ignored. If no -clock is specified the arrival time is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. - Paths from inputs that do not have an arrival time defined by set_input_delay are not reported. Set the sta_input_port_default_clock variable to 1 to report paths from inputs without a set_input_delay. + The set_input_delay command is used to specify the arrival time of an input signal. + The following command sets the min, max, rise and fall times on the in1 input port 1.0 time units after the rising edge of clk1. + set_input_delay -clock clk1 1.0 [get_ports in1] + Use multiple commands with the -add_delay option to specify separate arrival times for min, max, rise and fall times or multiple clocks. For example, the following specifies separate arrival times with respect to clocks clk1 and clk2. + set_input_delay -clock clk1 1.0 [get_ports in1]set_input_delay -add_delay -clock clk2 2.0 [get_ports in1] + The –reference_pin option is used to specify an arrival time with respect to the arrival on a pin in the clock network. For propagated clocks, the input arrival time is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, input arrival time is relative to the reference pin clock source latency. With the -clock_fall flag the arrival time is relative to the falling transition at the reference pin. If no clocks arrive at the reference pin the set_input_delay command is ignored. If no -clock is specified the arrival time is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. + Paths from inputs that do not have an arrival time defined by set_input_delay are not reported. Set the sta_input_port_default_clock variable to 1 to report paths from inputs without a set_input_delay. - set_input_transition + set_input_transition [-rise][-fall][-max][-min]transitionport_list @@ -11432,7 +11454,7 @@ -rise - Set the rising edge transition. + Set the rising edge transition. @@ -11440,7 +11462,7 @@ -fall - Set the falling edge transition. + Set the falling edge transition. @@ -11448,7 +11470,7 @@ -max - Set the minimum transition time. + Set the minimum transition time. @@ -11456,7 +11478,7 @@ -min - Set the maximum transition time. + Set the maximum transition time. @@ -11482,7 +11504,7 @@ - set_level_shifter_strategy + set_level_shifter_strategy [-rule rule_type] @@ -11495,7 +11517,7 @@ - set_level_shifter_threshold + set_level_shifter_threshold [-voltage voltage] @@ -11508,7 +11530,7 @@ - set_load + set_load [-rise][-fall][-max][-min][-subtract_pin_load][-pin_load][-wire_load]capacitanceobjects @@ -11519,7 +11541,7 @@ -rise - Set the external port rising capacitance (ports only). + Set the external port rising capacitance (ports only). @@ -11527,7 +11549,7 @@ -fall - Set the external port falling capacitance (ports only). + Set the external port falling capacitance (ports only). @@ -11536,7 +11558,7 @@ -max - Set the max capacitance. + Set the max capacitance. @@ -11544,7 +11566,7 @@ -min - Set the min capacitance. + Set the min capacitance. @@ -11552,7 +11574,7 @@ -subtract_pin_load - Subtract the capacitance of all instance pins connected to the net from capacitance (nets only). If the resulting capacitance is negative, zero is used. Pin capacitances are ignored by delay calculation when this option is used. + Subtract the capacitance of all instance pins connected to the net from capacitance (nets only). If the resulting capacitance is negative, zero is used. Pin capacitances are ignored by delay calculation when this option is used. @@ -11588,16 +11610,16 @@ - The set_load command annotates wire capacitance on a net or external capacitance on a port. There are four different uses for the set_load commanc: - set_load -wire_load port external port wire capacitanceset_load -pin_load port external port pin capacitanceset_load port same as -pin_loadset_load net net wire capacitance - External port capacitance can be annotated separately with the -pin_load and ‑wire_load options. Without the -pin_load and -wire_load options pin capacitance is annotated. - When annotating net wire capacitance with the -subtract_pin_load option the capacitance of all instance pins connected to the net is subtracted from capacitance. Setting the capacitance on a net overrides SPEF parasitics for delay calculation. + The set_load command annotates wire capacitance on a net or external capacitance on a port. There are four different uses for the set_load commanc: + set_load -wire_load port external port wire capacitanceset_load -pin_load port external port pin capacitanceset_load port same as -pin_loadset_load net net wire capacitance + External port capacitance can be annotated separately with the -pin_load and ‑wire_load options. Without the -pin_load and -wire_load options pin capacitance is annotated. + When annotating net wire capacitance with the -subtract_pin_load option the capacitance of all instance pins connected to the net is subtracted from capacitance. Setting the capacitance on a net overrides SPEF parasitics for delay calculation. - set_logic_dc + set_logic_dc port_list @@ -11618,7 +11640,7 @@ - set_logic_one + set_logic_one port_list @@ -11633,14 +11655,14 @@ - Set a port or pin to a constant logic one value. No paths are propagated from constant pins. Constant values set with the set_logic_one command are not propagated through downstream gates. + Set a port or pin to a constant logic one value. No paths are propagated from constant pins. Constant values set with the set_logic_one command are not propagated through downstream gates. - set_logic_zero + set_logic_zero port_list @@ -11655,13 +11677,13 @@ - Set a port or pin to a constant logic zero value. No paths are propagated from constant pins. Constant values set with the set_logic_zero command are not propagated through downstream gates. + Set a port or pin to a constant logic zero value. No paths are propagated from constant pins. Constant values set with the set_logic_zero command are not propagated through downstream gates. - set_max_area + set_max_area area @@ -11682,7 +11704,7 @@ - set_max_capacitance + set_max_capacitance capacitanceobjects @@ -11711,10 +11733,10 @@ - set_max_delay + set_max_delay - [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay + [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay @@ -11722,7 +11744,7 @@ -rise - Set max delay for rising paths. + Set max delay for rising paths. @@ -11730,13 +11752,13 @@ -fall - Set max delay for falling paths. + Set max delay for falling paths. - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -11744,7 +11766,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -11752,7 +11774,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -11768,10 +11790,10 @@ - -probe + -probe - Do not break paths at internal pins (non startpoints). + Do not break paths at internal pins (non startpoints). @@ -11798,7 +11820,7 @@ - set_max_dynamic_power + set_max_dynamic_power power [unit] @@ -11811,7 +11833,7 @@ - set_max_fanout + set_max_fanout fanoutobjects @@ -11840,7 +11862,7 @@ - set_max_leakage_power + set_max_leakage_power power [unit] @@ -11853,7 +11875,7 @@ - set_max_time_borrow + set_max_time_borrow delayobjects @@ -11877,13 +11899,13 @@ - The set_max_time_borrow command specifies the maximum amount of time that latches can borrow. Time borrowing is the time that a data input to a transparent latch arrives after the latch opens. + The set_max_time_borrow command specifies the maximum amount of time that latches can borrow. Time borrowing is the time that a data input to a transparent latch arrives after the latch opens. - set_max_transition + set_max_transition [-data_path][-clock_path][-rise][-fall]transitionobjects @@ -11891,34 +11913,34 @@ - -data_path + -data_path - Set the max slew for data paths. + Set the max slew for data paths. - -clock_path + -clock_path - Set the max slew for clock paths. + Set the max slew for clock paths. - -rise + -rise - Set the max slew for rising paths. + Set the max slew for rising paths. - -fall + -fall - Set the max slew for falling paths. + Set the max slew for falling paths. @@ -11926,7 +11948,7 @@ transition - The maximum slew/transition time. + The maximum slew/transition time. @@ -11938,7 +11960,7 @@ - The set_max_transition command is specifies the maximum transition time (slew) design rule checked by the report_check_types –max_transition command. + The set_max_transition command is specifies the maximum transition time (slew) design rule checked by the report_check_types –max_transition command. If specified for a design, the default maximum transition is set for the design. If specified for a clock, the maximum transition is applied to all pins in the clock domain. The –clock_path option restricts the maximum transition to clocks in clock paths. The -data_path option restricts the maximum transition to clocks data paths. The –clock_path, -data_path, -rise and –fall options only apply to clock objects. @@ -11946,7 +11968,7 @@ - set_min_capacitance + set_min_capacitance capacitanceobjects @@ -11957,7 +11979,7 @@ capacitance - Minimum capacitance. + Minimum capacitance. @@ -11976,10 +11998,10 @@ - set_min_delay + set_min_delay - [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay + [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay @@ -11987,7 +12009,7 @@ -rise - Set min delay for rising paths. + Set min delay for rising paths. @@ -11995,12 +12017,12 @@ -fall - Set min delay for falling paths. + Set min delay for falling paths. - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -12008,7 +12030,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -12016,7 +12038,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -12032,10 +12054,10 @@ - -probe + -probe - Do not break paths at internal pins (non startpoints). + Do not break paths at internal pins (non startpoints). @@ -12051,7 +12073,7 @@ delay - The minimum delay. + The minimum delay. @@ -12063,7 +12085,7 @@ - set_min_pulse_width + set_min_pulse_width [-high][-low]min_widthobjects @@ -12108,20 +12130,20 @@ - set_mode + set_mode - mode_name + mode_name - The the mode for SDC c ommands in the TCL interpreter. If mode mode_name does not exist, it is created. When modes are created the default mode is deleted. + The the mode for SDC c ommands in the TCL interpreter. If mode mode_name does not exist, it is created. When modes are created the default mode is deleted. - set_multicycle_path + set_multicycle_path [-setup][-hold][-rise][-fall][-start][-end][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-reset_path]path_multiplier @@ -12132,7 +12154,7 @@ -setup - Set cycle count for setup checks. + Set cycle count for setup checks. @@ -12140,7 +12162,7 @@ -hold - Set cycle count for hold checks. + Set cycle count for hold checks. @@ -12148,7 +12170,7 @@ -rise - Set cycle count for rising path edges. + Set cycle count for rising path edges. @@ -12157,7 +12179,7 @@ -fall - Set cycle count for falling path edges. + Set cycle count for falling path edges. @@ -12178,7 +12200,7 @@ - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -12186,7 +12208,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -12194,7 +12216,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -12223,15 +12245,15 @@ - set_operating_conditions + set_operating_conditions - [-analysis_type single|bc_wc|on_chip_variation][-library lib][condition][-min min_condition][-max max_condition][-min_library min_lib][-max_library max_lib] + [-analysis_type single|bc_wc|on_chip_variation][-library lib][condition][-min min_condition][-max max_condition][-min_library min_lib][-max_library max_lib] - -analysis_type single + -analysis_type single Use one operating condition for min and max paths. @@ -12239,7 +12261,7 @@ - -analysis_type bc_wc + -analysis_type bc_wc Best case, worst case analysis. Setup checks use max_condition for clock and data paths. Hold checks use the min_condition for clock and data paths. @@ -12247,7 +12269,7 @@ - ‑analysis_type on_chip_variation + ‑analysis_type on_chip_variation The min and max operating conditions represent variations on the chip that can occur simultaneously. Setup checks use max_condition for data paths and min_condition for clock paths. Hold checks use min_condition for data paths and max_condition for clock paths. This is the default analysis type. @@ -12255,7 +12277,7 @@ - -library lib + -library lib The name of the library that contains condition. @@ -12271,7 +12293,7 @@ - -min min_condition + -min min_condition The operating condition to use for min paths and hold checks. @@ -12280,7 +12302,7 @@ - -max max_condition + -max max_condition The operating condition to use for max paths and setup checks. @@ -12288,7 +12310,7 @@ - -min_library min_lib + -min_library min_lib The name of the library that contains min_condition. @@ -12296,7 +12318,7 @@ - -max_library max_lib + -max_library max_lib The name of the library that contains max_condition. @@ -12309,7 +12331,7 @@ - set_output_delay + set_output_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall][-reference_pin ref_pin][-source_latency_included][-network_latency_included][-add_delay]delayport_pin_list @@ -12320,7 +12342,7 @@ -rise - Set the output delay for the rising edge of the input. + Set the output delay for the rising edge of the input. @@ -12328,7 +12350,7 @@ -fall - Set the output delay for the falling edge of the input. + Set the output delay for the falling edge of the input. @@ -12336,7 +12358,7 @@ -max - Set the maximum output delay. + Set the maximum output delay. @@ -12344,15 +12366,15 @@ -min - Set the minimum output delay. + Set the minimum output delay. - -clock clock + -clock clock - The external check is to clock. The default clock edge is rising. + The external check is to clock. The default clock edge is rising. @@ -12360,15 +12382,15 @@ -clock_fall - The external check is to the falling edge of clock. + The external check is to the falling edge of clock. - -reference_pin ref_pin + -reference_pin ref_pin - The external check is clocked by the clock that arrives at ref_pin. + The external check is clocked by the clock that arrives at ref_pin. @@ -12376,7 +12398,7 @@ -add_delay - Add this output delay to any existing output delays. + Add this output delay to any existing output delays. @@ -12384,7 +12406,7 @@ delay - The external delay to the check clocked by clock. + The external delay to the check clocked by clock. @@ -12396,17 +12418,17 @@ - The set_output_delay command is used to specify the external delay to a setup/hold check on an output port or internal pin that is clocked by clock. Unless the -add_delay option is specified any existing output delays are replaced. - The –reference_pin option is used to specify a timing check with respect to the arrival on a pin in the clock network. For propagated clocks, the timing check is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, the timing check is relative to the reference pin clock source latency. With the -clock_fall flag the timing check is relative to the falling edge of the reference pin. If no clocks arrive at the reference pin the set_output_delay command is ignored. If no -clock is specified the timing check is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. + The set_output_delay command is used to specify the external delay to a setup/hold check on an output port or internal pin that is clocked by clock. Unless the -add_delay option is specified any existing output delays are replaced. + The –reference_pin option is used to specify a timing check with respect to the arrival on a pin in the clock network. For propagated clocks, the timing check is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, the timing check is relative to the reference pin clock source latency. With the -clock_fall flag the timing check is relative to the falling edge of the reference pin. If no clocks arrive at the reference pin the set_output_delay command is ignored. If no -clock is specified the timing check is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. - set_port_fanout_number + set_port_fanout_number - [-min][-max]fanoutports + [-min][-max]fanoutports @@ -12414,7 +12436,7 @@ -min - Set the min fanout. + Set the min fanout. @@ -12422,7 +12444,7 @@ -max - Set the max fanout. + Set the max fanout. @@ -12442,21 +12464,21 @@ - Set the external fanout for ports. + Set the external fanout for ports. - set_power_activity + set_power_activity - [-global][-input][-input_ports ports][-pins pins][-activity activity | -density density][-duty duty][-clock clock] + [-global][-input][-input_ports ports][-pins pins][-activity activity | -density density][-duty duty][-clock clock] - -global + -global Set the activity/duty for all non-clock pins. @@ -12472,7 +12494,7 @@ - -input_ports input_ports + -input_ports input_ports Set the input port activity/duty. @@ -12480,7 +12502,7 @@ - -pins pins + -pins pins Set the pin activity/duty. @@ -12489,46 +12511,46 @@ - -activity activity + -activity activity - The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. + The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. - -density density + -density density - Transitions per library time unit. + Transitions per library time unit. - -duty duty + -duty duty - The duty, or probability the signal is high (0 <= duty <= 1.0). Defaults to 0.5. + The duty, or probability the signal is high (0 <= duty <= 1.0). Defaults to 0.5. - -clock clock + -clock clock - The clock to use for the period with -activity. This option is ignored if -density is used. + The clock to use for the period with -activity. This option is ignored if -density is used. - The set_power_activity command is used to set the activity and duty used for power analysis globally or for input ports or pins in the design. - The default input activity for inputs is 0.1 transitions per minimum clock period if a clock is defined or 0.0 if there are no clocks defined. The default input duty is 0.5. This is equivalent to the following command: - set_power_activity -input -activity 0.1 -duty 0.5 + The set_power_activity command is used to set the activity and duty used for power analysis globally or for input ports or pins in the design. + The default input activity for inputs is 0.1 transitions per minimum clock period if a clock is defined or 0.0 if there are no clocks defined. The default input duty is 0.5. This is equivalent to the following command: + set_power_activity -input -activity 0.1 -duty 0.5 - set_propagated_clock + set_propagated_clock objects @@ -12549,11 +12571,11 @@ - set_pvt + set_pvt - [-min][-max][-process process][-voltage voltage] - [-temperature temperature]instances + [-min][-max][-process process][-voltage voltage] + [-temperature temperature]instances @@ -12561,7 +12583,7 @@ -min - Set the PVT values for max delays. + Set the PVT values for max delays. @@ -12569,12 +12591,12 @@ -max - Set the PVT values for min delays. + Set the PVT values for min delays. - -process process + -process process A process value (float). @@ -12582,7 +12604,7 @@ - -voltage voltage + -voltage voltage A voltage value (float). @@ -12591,7 +12613,7 @@ - -temperature temperature + -temperature temperature A temperature value (float). @@ -12612,7 +12634,7 @@ - set_sense + set_sense [-type clock|data][-positive][-negative][-pulse pulse_type][-stop_propagation][-clock clocks]pins @@ -12620,18 +12642,18 @@ - -type clock + -type clock - Set the sense for clock paths. + Set the sense for clock paths. - -type data + -type data - Set the sense for data paths (not supported). + Set the sense for data paths (not supported). @@ -12639,7 +12661,7 @@ -positive - The clock sense is positive unate. + The clock sense is positive unate. @@ -12647,15 +12669,15 @@ -negative - The clock sense is negative unate. + The clock sense is negative unate. - -pulse pulse_type + -pulse pulse_type - rise_triggered_high_pulserise_triggered_low_pulsefall_triggered_high_pulsefall_triggered_low_pulseNot supported. + rise_triggered_high_pulserise_triggered_low_pulsefall_triggered_high_pulsefall_triggered_low_pulseNot supported. @@ -12690,7 +12712,7 @@ - set_timing_derate + set_timing_derate [-rise][-fall][-early][-late][-clock][-data][-net_delay][-cell_delay][-cell_check]derate[objects] @@ -12698,18 +12720,18 @@ - -rise + -rise - Set the derating for rising delays. + Set the derating for rising delays. - -fall + -fall - Set the derating for falling delays. + Set the derating for falling delays. @@ -12773,7 +12795,7 @@ derate - The derating factor to apply to delays. + The derating factor to apply to delays. @@ -12792,10 +12814,10 @@ - set_resistance + set_resistance - [-max][-min]resistancenets + [-max][-min]resistancenets @@ -12825,7 +12847,7 @@ - nets + nets A list of nets. @@ -12838,72 +12860,72 @@ - set_units + set_units - [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] + [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] - -capacitance cap_unit + -capacitance cap_unit - The capacitance scale factor followed by 'f'. + The capacitance scale factor followed by 'f'. - -resistance res_unit + -resistance res_unit - The resistance scale factor followed by 'ohm'. + The resistance scale factor followed by 'ohm'. - -time time_unit + -time time_unit - The time scale factor followed by 's'. + The time scale factor followed by 's'. - -voltage voltage_unit + -voltage voltage_unit - The voltage scale factor followed by 'v'. + The voltage scale factor followed by 'v'. - -current current_unit + -current current_unit - The current scale factor followed by 'A'. + The current scale factor followed by 'A'. - -power power_unit + -power power_unit - The power scale factor followed by 'w'. + The power scale factor followed by 'w'. - The set_units command is used to check the units used by the STA command interpreter when parsing commands and reporting results. If the current units differ from the set_unit value a warning is printed. Use the set_cmd_units command to change the command units. + The set_units command is used to check the units used by the STA command interpreter when parsing commands and reporting results. If the current units differ from the set_unit value a warning is printed. Use the set_cmd_units command to change the command units. Units are specified as a scale factor followed by a unit name. The scale factors are as follows. - M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 + M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 An example of the set_units command is shown below. - set_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm + set_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm - set_wire_load_min_block_size + set_wire_load_min_block_size size @@ -12916,7 +12938,7 @@ - set_wire_load_mode + set_wire_load_mode top|enclosed|segmented @@ -12953,7 +12975,7 @@ - set_wire_load_model + set_wire_load_model -name model_name[-library library][-max][-min][objects] @@ -12961,7 +12983,7 @@ - -name model_name + -name model_name The name of a wire load model. @@ -12969,7 +12991,7 @@ - -library library + -library library Library to look for model_name. @@ -13006,7 +13028,7 @@ - set_wire_load_selection_group + set_wire_load_selection_group [-library library][-max][-min]group_name[objects] @@ -13060,28 +13082,28 @@ - suppress_msg + suppress_msg - msg_ids + msg_ids - msg_ids + msg_ids - A list of error/warning message IDs to suppress. + A list of error/warning message IDs to suppress. - The suppress_msg command suppresses specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. + The suppress_msg command suppresses specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. - unset_case_analysis + unset_case_analysis port_or_pin_list @@ -13102,7 +13124,7 @@ - unset_clock_latency + unset_clock_latency [-source]objects @@ -13131,7 +13153,7 @@ - unset_clock_transition + unset_clock_transition clocks @@ -13153,7 +13175,7 @@ - unset_clock_uncertainty + unset_clock_uncertainty [-from|-rise_from|-fall_from from_clock][-to|-rise_to|-fall_to to_clock][-rise][-fall][-setup][-hold][objects] @@ -13161,7 +13183,7 @@ - -from from_clock + -from from_clock @@ -13169,7 +13191,7 @@ - -to to_clock + -to to_clock @@ -13209,7 +13231,7 @@ - uncertainty + uncertainty Clock uncertainty. @@ -13230,15 +13252,15 @@ - unset_data_check + unset_data_check - [-from|-rise_from|-fall_from from_object][-to|-rise_to|-fall_to to_object][-setup][-hold][-clock clock] + [-from|-rise_from|-fall_from from_object][-to|-rise_to|-fall_to to_object][-setup][-hold][-clock clock] - -from from_object + -from from_object A pin used as the timing check reference. @@ -13246,7 +13268,7 @@ - -to to_object + -to to_object A pin that the setup/hold check is applied to. @@ -13270,7 +13292,7 @@ - clock + clock The setup/hold check clock. @@ -13283,7 +13305,7 @@ - unset_disable_inferred_clock_gating + unset_disable_inferred_clock_gating objects @@ -13298,13 +13320,13 @@ - The unset_disable_inferred_clock_gating command removes a previous set_disable_inferred_clock_gating command. + The unset_disable_inferred_clock_gating command removes a previous set_disable_inferred_clock_gating command. - unset_disable_timing + unset_disable_timing [-from from_port][-to to_port]objects @@ -13315,7 +13337,7 @@ from_port - + @@ -13323,7 +13345,7 @@ to_port - + @@ -13341,7 +13363,7 @@ - unset_input_delay + unset_input_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall]port_pin_list @@ -13352,7 +13374,7 @@ -rise - Unset the arrival time for the rising edge of the input. + Unset the arrival time for the rising edge of the input. @@ -13360,7 +13382,7 @@ -fall - Unset the arrival time for the falling edge of the input. + Unset the arrival time for the falling edge of the input. @@ -13368,7 +13390,7 @@ -max - Unset the minimum arrival time. + Unset the minimum arrival time. @@ -13376,7 +13398,7 @@ -min - Unset the maximum arrival time. + Unset the maximum arrival time. @@ -13384,7 +13406,7 @@ clock - Unset the arrival time from clock. + Unset the arrival time from clock. @@ -13392,7 +13414,7 @@ -clock_fall - Unset the arrival time from the falling edge of clock + Unset the arrival time from the falling edge of clock @@ -13411,7 +13433,7 @@ - unset_output_delay + unset_output_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall]port_pin_list @@ -13480,10 +13502,10 @@ - unset_path_exceptions + unset_path_exceptions - [-setup][-hold][-rise][-fall][-from|-rise_from|-fall_from from][-through|-rise_through|-fall_through through][-to|-rise_to|-fall_to to] + [-setup][-hold][-rise][-fall][-from|-rise_from|-fall_from from][-through|-rise_through|-fall_through through][-to|-rise_to|-fall_to to] @@ -13491,7 +13513,7 @@ -setup - Unset path exceptions for setup checks. + Unset path exceptions for setup checks. @@ -13499,7 +13521,7 @@ -hold - Unset path exceptions for hold checks. + Unset path exceptions for hold checks. @@ -13507,7 +13529,7 @@ -rise - Unset path exceptions for rising path edges. + Unset path exceptions for rising path edges. @@ -13516,12 +13538,12 @@ -fall - Unset path exceptions for falling path edges. + Unset path exceptions for falling path edges. - -from from + -from from A list of clocks, instances, ports or pins. @@ -13529,7 +13551,7 @@ - -through through + -through through A list of instances, pins or nets. @@ -13537,7 +13559,7 @@ - -to to + -to to A list of clocks, instances, ports or pins. @@ -13545,66 +13567,66 @@ The unset_path_exceptions command removes any matching set_false_path, set_multicycle_path, set_max_delay, and set_min_delay exceptions. - + - unset_power_activity + unset_power_activity - [-global][-input][-input_ports ports][-pins pins] + [-global][-input][-input_ports ports][-pins pins] - -global + -global - Set the activity/duty for all non-clock pins. + Set the activity/duty for all non-clock pins. - -input + -input - Set the default input port activity/duty. + Set the default input port activity/duty. - -input_ports input_ports + -input_ports input_ports - Set the input port activity/duty. + Set the input port activity/duty. - -pins pins + -pins pins - Set the pin activity/duty. + Set the pin activity/duty. - -activity activity + -activity activity - The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. + The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. - The unset_power_activity_command is used to undo the effects of the set_power_activity command. + The unset_power_activity_command is used to undo the effects of the set_power_activity command. - unset_propagated_clock + unset_propagated_clock objects @@ -13625,42 +13647,42 @@ - unset_timing_derate + unset_timing_derate - Remove all derating factors set with the set_timing_derate command. + Remove all derating factors set with the set_timing_derate command. - unsuppress_msg + unsuppress_msg - msg_ids + msg_ids - msg_ids + msg_ids - A list of error/warning message IDs to unsuppress. + A list of error/warning message IDs to unsuppress. - The unsuppress_msg command removes suppressions for the specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. + The unsuppress_msg command removes suppressions for the specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. - user_run_time + user_run_time @@ -13673,7 +13695,7 @@ - with_output_to_variable + with_output_to_variable var { commands } @@ -13696,21 +13718,21 @@ - The with_output_to_variable command redirects the output of TCL commands to a variable. + The with_output_to_variable command redirects the output of TCL commands to a variable. - write_path_spice + write_path_spice - -path_args path_args-spice_directory spice_directory-lib_subckt_file lib_subckts_file-model_file model_file-power power-ground ground[-simulator hspice|ngspice|xyce] + -path_args path_args-spice_directory spice_directory-lib_subckt_file lib_subckts_file-model_file model_file-power power-ground ground[-simulator hspice|ngspice|xyce] - path_args + path_args -from|-through|-to arguments as in report_checks. @@ -13718,15 +13740,15 @@ - spice_directory + spice_directory - Directory for spice to write output files. + Directory for spice to write output files. - lib_subckts_file + lib_subckts_file Cell transistor level subckts. @@ -13734,7 +13756,7 @@ - model_file + model_file Transistor model definitions .included by spice_file. @@ -13742,7 +13764,7 @@ - power + power Voltage supply name in voltage_map of the default liberty library. @@ -13750,7 +13772,7 @@ - ground + ground Ground supply name in voltage_map of the default liberty library. @@ -13758,25 +13780,25 @@ - -simulator + -simulator - Simulator that will read the spice netlist. + Simulator that will read the spice netlist. The write_path_spice command writes a spice netlist for timing paths. Use path_args to specify -from/-through/-to as arguments to the find_timing_paths command. For each path, a spice netlist and the subckts referenced by the path are written in spice_directory. The spice netlist is written in path_<id>.sp and subckt file is path_<id>.subckt. The spice netlists used by the path are written to subckt_file, which spice_file .includes. The device models used by the spice subckt netlists in model_file are also .included in spice_file. Power and ground names are specified with the -power and -ground arguments. The spice netlist includes a piecewise linear voltage source at the input and .measure statement for each gate delay and pin slew. - Example command: - write_path_spice -path_args {-from "in0" -to "out1" -unconstrained} \ -spice_directory $result_dir \ -lib_subckt_file "write_spice1.subckt" \ -model_file "write_spice1.models" \ -power VDD -ground VSS - When the simulator is hspice, .measure statements will be added to the spice netlist. - When the simulator is Xyce, the .print statement selects the CSV format and writes the waveform data to a file name path_<id>.csv so the results can be used by gnuplot. + Example command: + write_path_spice -path_args {-from "in0" -to "out1" -unconstrained} \ -spice_directory $result_dir \ -lib_subckt_file "write_spice1.subckt" \ -model_file "write_spice1.models" \ -power VDD -ground VSS + When the simulator is hspice, .measure statements will be added to the spice netlist. + When the simulator is Xyce, the .print statement selects the CSV format and writes the waveform data to a file name path_<id>.csv so the results can be used by gnuplot. - write_sdc + write_sdc [-digits digits][-gzip][-no_timestamp]filename @@ -13795,7 +13817,7 @@ -gzip - Compress the SDC with gzip. + Compress the SDC with gzip. @@ -13821,18 +13843,18 @@ - write_sdf + write_sdf - [-scene scene][-divider /|.][-include_typ][-digits digits][-gzip][-no_timestamp][-no_version]filename + [-scene scene][-divider /|.][-include_typ][-digits digits][-gzip][-no_timestamp][-no_version]filename - scene + scene - Write delays for scene. + Write delays for scene. @@ -13854,7 +13876,7 @@ - -digits digits + -digits digits The number of digits after the decimal point to report. The default is 4. @@ -13865,7 +13887,7 @@ -gzip - Compress the SDF using gzip. + Compress the SDF using gzip. @@ -13889,78 +13911,78 @@ filename - The SDF filename to write. + The SDF filename to write. - Write the delay calculation delays for the design in SDF format to filename. If -corner is not specified the min/max delays are across all corners. With -corner the min/max delays for corner are written. The SDF TIMESCALE is same as the time_unit in the first liberty file read. + Write the delay calculation delays for the design in SDF format to filename. If -corner is not specified the min/max delays are across all corners. With -corner the min/max delays for corner are written. The SDF TIMESCALE is same as the time_unit in the first liberty file read. - write_timing_model + write_timing_model - [-library_name lib_name][-cell_name cell_name] - [-scene scene]filename + [-library_name lib_name][-cell_name cell_name] + [-scene scene]filename - lib_name + lib_name - The name to use for the liberty library. Defaults to cell_name. + The name to use for the liberty library. Defaults to cell_name. - cell_name + cell_name - The name to use for the liberty cell. Defaults to the top level module name. + The name to use for the liberty cell. Defaults to the top level module name. - scene + scene - The scene to use for extracting the model. + The scene to use for extracting the model. - filename + filename - Filename for the liberty timing model. + Filename for the liberty timing model. - The write_timing_model command constructs a liberty timing model for the current design and writes it to filename. cell_name defaults to the cell name of the top level block in the design. - The SDC used to extract the block should include the clock definitions. If the block contains a clock network set_propagated_clock should be used so the clock delays are included in the timing model. The following SDC commands are ignored when building the timing model. - set_input_delayset_output_delayset_loadset_timing_derate - Using set_input_transition with the slew from the block context will be used will improve the match between the timing model and the block netlist. Paths defined on clocks that are defined on internal pins are ignored because the model has no way to include the clock definition. + The write_timing_model command constructs a liberty timing model for the current design and writes it to filename. cell_name defaults to the cell name of the top level block in the design. + The SDC used to extract the block should include the clock definitions. If the block contains a clock network set_propagated_clock should be used so the clock delays are included in the timing model. The following SDC commands are ignored when building the timing model. + set_input_delayset_output_delayset_loadset_timing_derate + Using set_input_transition with the slew from the block context will be used will improve the match between the timing model and the block netlist. Paths defined on clocks that are defined on internal pins are ignored because the model has no way to include the clock definition. The resulting timing model can be used in a hierarchical timing flow as a replacement for the block to speed up timing analysis. This hierarchical timing methodology does not handle timing exceptions that originate or terminate inside the block. The timing model includes: - combinational paths between inputs and outputssetup and hold timing constraints on inputsclock to output timing paths - Resistance of long wires on inputs and outputs of the block cannot be modeled in Liberty. To reduce inaccuracies from wire resistance in technologies with resistive wires place buffers on inputs and ouputs. + combinational paths between inputs and outputssetup and hold timing constraints on inputsclock to output timing paths + Resistance of long wires on inputs and outputs of the block cannot be modeled in Liberty. To reduce inaccuracies from wire resistance in technologies with resistive wires place buffers on inputs and ouputs. The extracted timing model setup/hold checks are scalar (no input slew dependence). Delay timing arcs are load dependent but do not include input slew dependency. - write_verilog + write_verilog - [-include_pwr_gnd][-remove_cells lib_cells]filename + [-include_pwr_gnd][-remove_cells lib_cells]filename - -include_pwr_gnd + -include_pwr_gnd Include power and ground pins on instances. @@ -13968,24 +13990,24 @@ - -remove_cells lib_cells + -remove_cells lib_cells - Liberty cells to remove from the Verilog netlist. Use get_lib_cells, a list of cells names, or a cell name with wildcards. + Liberty cells to remove from the Verilog netlist. Use get_lib_cells, a list of cells names, or a cell name with wildcards. - filename + filename - Filename for the liberty library. + Filename for the liberty library. - The write_verilog command writes a Verilog netlist to filename. Use -sort to sort the instances so the results are reproducible across operating systems. Use -remove_cells to remove instances of lib_cells from the netlist. - Filter Expressions - The get_cells, get_pins, get_ports and get_timing_edges functions support filtering the returned objects by property values. Supported filter expressions are shown below. + The write_verilog command writes a Verilog netlist to filename. Use -sort to sort the instances so the results are reproducible across operating systems. Use -remove_cells to remove instances of lib_cells from the netlist. + Filter Expressions + The get_cells, get_pins, get_ports and get_timing_edges functions support filtering the returned objects by property values. Supported filter expressions are shown below. @@ -13994,7 +14016,7 @@ property - Return objects with property value equal to 1. + Return objects with property value equal to 1. @@ -14002,61 +14024,61 @@ property==value - Return objects with property value equal to value. + Return objects with property value equal to value. - property=~pattern + property=~pattern - Return objects with property value that matches pattern. + Return objects with property value that matches pattern. - property!=value + property!=value - Return objects with property value not equal to value. + Return objects with property value not equal to value. - property!~value + property!~value - Return objects with property value that does not match pattern. + Return objects with property value that does not match pattern. - expr1&&expr2 + expr1&&expr2 - Return objects with expr1 and expr2. expr1 and expr2 are one of the first three property value forms shown above. + Return objects with expr1 and expr2. expr1 and expr2 are one of the first three property value forms shown above. - expr1||expr2 + expr1||expr2 - Return objects with expr1 or expr2. expr1 and expr2 are one of the first three property value forms shown above. + Return objects with expr1 or expr2. expr1 and expr2 are one of the first three property value forms shown above. - Where property is a property supported by the get_property command. Note that if there are spaces in the expression it must be enclosed in quotes so that it is a single argument. - Variables + Where property is a property supported by the get_property command. Note that if there are spaces in the expression it must be enclosed in quotes so that it is a single argument. + Variables - hierarchy_separator + hierarchy_separator - Any character. + Any character. @@ -14066,33 +14088,33 @@ - sta_continue_on_error + sta_continue_on_error 0|1 - The include and read_sdc commands stop and report any errors encountered while reading a file unless sta_continue_on_error is 1. The default value is 0. + The include and read_sdc commands stop and report any errors encountered while reading a file unless sta_continue_on_error is 1. The default value is 0. - sta_crpr_mode + sta_crpr_mode same_pin|same_transition - When the data and clock paths of a timing check overlap (see sta_crpr_enabled), pessimism is removed independent of whether of the path rise/fall transitions. When sta_crpr_mode is same_transition, the pessimism is only removed if the path rise/fall transitions are the same. The default value is same_pin. + When the data and clock paths of a timing check overlap (see sta_crpr_enabled), pessimism is removed independent of whether of the path rise/fall transitions. When sta_crpr_mode is same_transition, the pessimism is only removed if the path rise/fall transitions are the same. The default value is same_pin. - sta_cond_default_arcs_enabled + sta_cond_default_arcs_enabled 0|1 @@ -14105,7 +14127,7 @@ - sta_crpr_enabled + sta_crpr_enabled 0|1 @@ -14118,7 +14140,7 @@ - sta_dynamic_loop_breaking + sta_dynamic_loop_breaking 0|1 @@ -14131,20 +14153,20 @@ - sta_gated_clock_checks_enabled + sta_gated_clock_checks_enabled 0|1 - When sta_gated_clock_checks_enabled is 1, clock gating setup and hold timing checks are checked. The default value is 1. + When sta_gated_clock_checks_enabled is 1, clock gating setup and hold timing checks are checked. The default value is 1. - sta_input_port_default_clock + sta_input_port_default_clock 0|1 @@ -14157,7 +14179,7 @@ - sta_internal_bidirect_instance_paths_enabled + sta_internal_bidirect_instance_paths_enabled 0|1 @@ -14170,7 +14192,7 @@ - sta_pocv_enabled + sta_pocv_enabled 0|1 @@ -14183,14 +14205,14 @@ - sta_propagate_all_clocks + sta_propagate_all_clocks 0|1 - All clocks defined after sta_propagate_all_clocks is set to 1 are propagated. If it is set before any clocks are defined it has the same effect as + All clocks defined after sta_propagate_all_clocks is set to 1 are propagated. If it is set before any clocks are defined it has the same effect as set_propagated_clock [all_clocks] After all clocks have been defined. The default value is 0. @@ -14198,33 +14220,33 @@ - sta_propagate_gated_clock_enable + sta_propagate_gated_clock_enable 0|1 - When set to 1, paths of gated clock enables are propagated through the clock gating instances. If the gated clock controls sequential elements setting sta_propagate_gated_clock_enable to 0 prevents spurious paths from the clock enable. The default value is 1. + When set to 1, paths of gated clock enables are propagated through the clock gating instances. If the gated clock controls sequential elements setting sta_propagate_gated_clock_enable to 0 prevents spurious paths from the clock enable. The default value is 1. - sta_recovery_removal_checks_enabled + sta_recovery_removal_checks_enabled 0|1 - When sta_recovery_removal_checks_enabled is 0, recovery and removal timing checks are disabled. The default value is 1. + When sta_recovery_removal_checks_enabled is 0, recovery and removal timing checks are disabled. The default value is 1. - sta_report_default_digits + sta_report_default_digits integer @@ -14238,7 +14260,7 @@ - sta_preset_clear_arcs_enabled + sta_preset_clear_arcs_enabled 0|1 @@ -14271,186 +14293,186 @@ - Alphabetical Index + Alphabetical Index - all_clocks7 - all_inputs7 - all_outputs8 - all_registers8 - check_setup9 - Command Line Arguments1 - Commands7 - connect_pin9 - create_generated_clock11 - create_voltage_area12 - current_design12 - current_instance13 - define_scene13 - delete_clock13 - delete_from_list13 - delete_generated_clock14 - delete_instance14 - delete_net14 - disconnect_pin14 - elapsed_run_time14 - Example Command Scripts1 - Filter Expressions84 - find_timing_paths15 - get_cells17 - get_clocks17 - get_fanin18 - get_fanout19 - get_full_name19 - get_lib_pins20 - get_libs21 - get_name22 - get_nets22 - get_pins23 - get_ports23 - get_property24 - get_scenes28 - get_timing_edges28 - group_path29 - hierarchy_separator85 - include30 - link_design30 - make_instance30 - make_net31 - Power Analysis3 - read_liberty31 - read_saif32 - read_sdc33 - read_sdf33 - read_spef34 - read_vcd35 - read_verilog35 - redirection5 - replace_activity_annotation36 - replace_cell35 - report_annotated_check36 - report_annotated_delay37 - report_check_types41 - report_checks38 - report_clock_latency42 - report_clock_min_period42 - report_clock_properties43 - report_clock_skew43 - report_dcalc43 - report_disabled_edges44 - report_edges44 - report_instance44 - report_lib_cell44 - report_net45 - report_parasitic_annotation45 - report_power45 - report_slews46 - report_tns46 - report_units46 - report_wns47 - report_worst_slack47 - set_assigned_check48 - set_assigned_delay49 - set_assigned_transition49 - set_case_analysis50 - set_clock_gating_check50 - set_clock_groups51 - set_clock_latency52 - set_clock_transition52 - set_clock_uncertainty53 - set_cmd_units54 - set_data_check55 - set_disable_inferred_clock_gating55 - set_disable_timing55 - set_drive56 - set_driving_cell57 - set_false_path58 - set_fanout_load59 - set_hierarchy_separator59 - set_ideal_latency59 - set_ideal_network59 - set_ideal_transition59 - set_input_delay59 - set_input_transition61 - set_level_shifter_strategy61 - set_level_shifter_threshold61 - set_load61 - set_logic_dc62 - set_logic_one62 - set_logic_zero63 - set_max_area63 - set_max_capacitance63 - set_max_delay63 - set_max_dynamic_power64 - set_max_fanout64 - set_max_leakage_power64 - set_max_time_borrow64 - set_max_transition65 - set_min_capacitance65 - set_min_delay66 - set_min_pulse_width67 - set_mode67 - set_multicycle_path67 - set_operating_conditions68 - set_output_delay69 - set_port_fanout_number70 - set_power_activity70 - set_propagated_clock71 - set_pvt71 - set_resistance73 - set_sense72 - set_timing_derate73 - set_units74 - set_wire_load_min_block_size75 - set_wire_load_mode75 - set_wire_load_model75 - set_wire_load_selection_group75 - SPEF34 - sta_cond_default_arcs_enabled85 - sta_continue_on_error85 - sta_crpr_enabled85 - sta_crpr_mode85 - sta_dynamic_loop_breaking85 - sta_gated_clock_checks_enabled85 - sta_input_port_default_clock86 - sta_internal_bidirect_instance_paths_enabled86 - sta_pocv_enabled86 - sta_preset_clear_arcs_enabled87 - sta_propagate_all_clocks86 - sta_propagate_gated_clock_enable86 - sta_recovery_removal_checks_enabled86 - sta_report_default_digits86 - suppress_msg76 - TCL Interpreter5 - Timing Analysis using SDF2 - Timing Analysis with Multiple Corners and Modes3 - Timing Analysis with Multiple Process Corners2 - unset_case_analysis76 - unset_clock_latency76 - unset_clock_transition76 - unset_clock_uncertainty77 - unset_data_check77 - unset_disable_inferred_clock_gating78 - unset_disable_timing78 - unset_input_delay78 - unset_output_delay79 - unset_path_exceptions79 - unset_power_activity80 - unset_propagated_clock80 - unset_timing_derate80 - unsuppress_msg81 - user_run_time81 - Variables85 - verilog netlist35 - with_output_to_variable81 - write_path_spice81 - write_sdc82 - write_sdf82 - write_timing_model83 - write_verilog84 + all_clocks7 + all_inputs7 + all_outputs8 + all_registers8 + check_setup9 + Command Line Arguments1 + Commands7 + connect_pin9 + create_generated_clock11 + create_voltage_area12 + current_design12 + current_instance13 + define_scene13 + delete_clock13 + delete_from_list13 + delete_generated_clock14 + delete_instance14 + delete_net14 + disconnect_pin14 + elapsed_run_time14 + Example Command Scripts1 + Filter Expressions84 + find_timing_paths15 + get_cells17 + get_clocks17 + get_fanin18 + get_fanout19 + get_full_name19 + get_lib_pins20 + get_libs21 + get_name22 + get_nets22 + get_pins23 + get_ports23 + get_property24 + get_scenes28 + get_timing_edges28 + group_path29 + hierarchy_separator85 + include30 + link_design30 + make_instance30 + make_net31 + Power Analysis3 + read_liberty31 + read_saif32 + read_sdc33 + read_sdf33 + read_spef34 + read_vcd35 + read_verilog35 + redirection5 + replace_activity_annotation36 + replace_cell35 + report_annotated_check36 + report_annotated_delay37 + report_check_types41 + report_checks38 + report_clock_latency42 + report_clock_min_period42 + report_clock_properties43 + report_clock_skew43 + report_dcalc43 + report_disabled_edges44 + report_edges44 + report_instance44 + report_lib_cell44 + report_net45 + report_parasitic_annotation45 + report_power45 + report_slews46 + report_tns46 + report_units46 + report_wns47 + report_worst_slack47 + set_assigned_check48 + set_assigned_delay49 + set_assigned_transition49 + set_case_analysis50 + set_clock_gating_check50 + set_clock_groups51 + set_clock_latency52 + set_clock_transition52 + set_clock_uncertainty53 + set_cmd_units54 + set_data_check55 + set_disable_inferred_clock_gating55 + set_disable_timing55 + set_drive56 + set_driving_cell57 + set_false_path58 + set_fanout_load59 + set_hierarchy_separator59 + set_ideal_latency59 + set_ideal_network59 + set_ideal_transition59 + set_input_delay59 + set_input_transition61 + set_level_shifter_strategy61 + set_level_shifter_threshold61 + set_load61 + set_logic_dc62 + set_logic_one62 + set_logic_zero63 + set_max_area63 + set_max_capacitance63 + set_max_delay63 + set_max_dynamic_power64 + set_max_fanout64 + set_max_leakage_power64 + set_max_time_borrow64 + set_max_transition65 + set_min_capacitance65 + set_min_delay66 + set_min_pulse_width67 + set_mode67 + set_multicycle_path67 + set_operating_conditions68 + set_output_delay69 + set_port_fanout_number70 + set_power_activity70 + set_propagated_clock71 + set_pvt71 + set_resistance73 + set_sense72 + set_timing_derate73 + set_units74 + set_wire_load_min_block_size75 + set_wire_load_mode75 + set_wire_load_model75 + set_wire_load_selection_group75 + SPEF34 + sta_cond_default_arcs_enabled85 + sta_continue_on_error85 + sta_crpr_enabled85 + sta_crpr_mode85 + sta_dynamic_loop_breaking85 + sta_gated_clock_checks_enabled85 + sta_input_port_default_clock86 + sta_internal_bidirect_instance_paths_enabled86 + sta_pocv_enabled86 + sta_preset_clear_arcs_enabled87 + sta_propagate_all_clocks86 + sta_propagate_gated_clock_enable86 + sta_recovery_removal_checks_enabled86 + sta_report_default_digits86 + suppress_msg76 + TCL Interpreter5 + Timing Analysis using SDF2 + Timing Analysis with Multiple Corners and Modes3 + Timing Analysis with Multiple Process Corners2 + unset_case_analysis76 + unset_clock_latency76 + unset_clock_transition76 + unset_clock_uncertainty77 + unset_data_check77 + unset_disable_inferred_clock_gating78 + unset_disable_timing78 + unset_input_delay78 + unset_output_delay79 + unset_path_exceptions79 + unset_power_activity80 + unset_propagated_clock80 + unset_timing_derate80 + unsuppress_msg81 + user_run_time81 + Variables85 + verilog netlist35 + with_output_to_variable81 + write_path_spice81 + write_sdc82 + write_sdf82 + write_timing_model83 + write_verilog84 - - Version 3.0.0, Mar 7, 2026Copyright (c) 2026, Parallax Software, Inc. + + Version 3.0.0, Mar 7, 2026Copyright (c) 2026, Parallax Software, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index b450630c9554130765517b9634485e150dda314a..77ebd937428ddf6b36c2e23426bf24752da895ab 100644 GIT binary patch literal 1403976 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�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

C6`wUHF$Ymi&HHp0zda%Gj*u_g_7Oo=`LS zpYIYV*+W(lkkv{c%jl)S-adw00xIlp(6f%FdpwR>%yM0pYg#Zs(`&xAQm z6tqFqplP)TT0hIO{}Ti!n>OlzgKNk@ zW%9TjKF7)A$$7g(BUS7NsOm`7)kao0^op1`w(m`mES#Hb^mIfi7|*uSyD?KRdvuIQ zZYm35kC8fAaS?7`bM?ZC{B~+8TJ2tNB^CS)VCB0dQEJ7R*IVz06N$&y`xjf~{qE&F zzC!w+TsGs3wJI3qh)LPJ$hJwzBMWTS3P6_3&EDC`!m>=L)=z_Y=UmUNTic~mwJwZ% z(kx}B1q|PDHw|j_D+rpQJX-QE66OMcQF(!<=lBp5z1$e@b;5<$E)H?nD0IR)COGPB zrq(S&214OMVZ8#Qd0GgHvSY$ND%l$)IP~73A}LvbNBPk@&q&eKQDqnexUTQ#_z9N0 ziZ56Ddh*60#abNiRPadrSpMQO%td9KkBL?%S6-e#f~W&| z?s|;83#FJLrtH)M-|%eTu>)m#vmPnTCSATW2FmG+`ja>Od~3@VSg*md(^RXlY^;1+ z4#Bd+6wO#(kWVJPGgyVE4i|;wO*uhlvKrTOL~>ufAK*R-&QkwDcKlmQ{G%_J7})*? zp~uL;_8$Pd3~c`mVfR`~+j{#4qQ~DSG~XVS`b#<}cyCJu3xcJ#5WWEU*Xc zMb%aND)itQipsj%7m-C`ObKZWOA6AWKEJ+hom;(PCrYw(CM0MzJqKxRDGFK8Jo{U_ zULTJ?VTt&5cy>E{TRwkr|ML5Myq&o+$bc7Dogk&Ou(n%us6I~R;drm#NG|C|@{+4O z+sKFgh4RDq>LM@C%g(;Zf}*<4udn!oE(~!o16*>Sz9!RYR)cO?6{ErRdM){?*6kN7 z?D>BFI4+}o986OsXAXxX8g{H!1+5B-772CFb;CaIr=k7BJzo|987XClN%s!JACv=N zjZ~uFW+$9Vv$6<-MZkZ*dgkJ=twzpTVU<{=XFgzRN?TQf{KjX<4j>q8s9;Gqyu`L{ z=*5}Z8u0{1;?~d!d@gffu$e2lz%qg=-%{Eg@}=uCKlwN6)|NuNko}48Dz(=>&%g_j zcRI|$s)%R55K|sPkNBkk*0LY&s`@&pOaM|ZgI(Hsre7Cqu}^f|OiDW-j(Y}#TG3s3 zLhJ4~Iz1UvDOo2r&=9wgOvPyQ9?^CGef^$Ca;^5I35($)Fp0OrAsKCg{OVK)#$O_0^5t3?za51LsDaA^-xek__Q zJEM&I36lN+=I-%+y*up?O}UE^GzEUP?-ky#9p9&@bnU$2i54!ioDd|AHesb{0}T5I zs>!X9*_PXk6V-|>^U+Vx;sPMz`>JL7>LCH0;*^Sw{VJw$%Dt?T#t3O zs*B(Bq2-D0BvfR|scX0%UpQ<7NL(@J7dz(%+$jL#1O*Fp=LGF0$&&?5|4fkh#@H$J z>N4(Ku0tUg7i1zN{Ov*p)dU&=%0tzGHFkbU1P2-R z)^`!KH6jjubni6gFz(LTW}$j2B#S1qUiBP!K+Q?~fo#PM8 zs?M0?U#3S@i2Qm0&`TdwB{?O~bBkqns?=UK?OKc=l%f3AC93k3ltjjydV_;Wu@Bc? z5<_7(W^2NkC>1@O%P9p<7{@8znAFm1vGI`6@?6;p3Gt0vF;YxpU`jB&^76OZF)dpf zq($B7nL4NK9Vx%tW%?+J&9%Xvvciv+#>p3hnr2S|wdpApnZ|_pn=p$9WH)9;1s&EO zL6xSX&1}Y+p3h9sDn(dva;dXZ)g@}y99GBn=MjDz zo|o5!ABY?_iDJ6K3N|vIC_m7|NYnh`u5%GCi{`KU8!gth@>Xlc>m)2h46JXi9&RVZLy%*|jT7oac&2On9Yb@LOhECrTWfouwb; zzp!ZV$Nt=IyYA%T?=6O{zW+3V&9WLF&dAZaR-)_(%Eak-?*#eU7)?@eJm9<{E1z;= z;jnveWVGZ@EHhC7Yng9LTPT;w^%*VHE->#0M_(-w?0UrO!^!ZZ`NUY#s3H$?i9yWALUP6zocEPGA9_KZ>K49u|Cp@n@h}jkTa*-C=I#PCeatZs#gj zRYlGb2Y62LA6k>$_;E7B7bZDf<`zyx6oHQISo+$ktQ4qDivqcbm{vD}@t27yss(k^ zsx-1r#3BdVYxhgYI5RapgN&I&r|fk$q*#eSQQ5bW=UCE&8w5Rk zb3Z{Ww2bvSKgpjY7Chy!K}2pSju4!1&*hqjt$7pKM4!BC`!amxa@Kk*e4xQyTuENl zO;!CxH5Kfp!2RiknY*8lyZ^^?<60k2jUTje#7Lnh%Wzd{BH1SZGn8 zs!UUoWzUkSYQ*%8D=oP;Pfn|QXq9R@*g2C;~^7uZyRPHbDpGL?W>W5UW6C)&}%z~*M? zQsM{)SUtnM_$CBEgPWj_TLyK^h}4?q6%>b7KK{K{1_S2p$=&%6h4_Ak9pdtFlOEn3 zAOCA~JfVGEVa2PMPEHLI)#S`r3G2Lr%pUjlMqZzfr>G5I?sRGM@%+*Lt@9Jba>f)$ zwOV$i8ddIkPFsz&!PIpKR-?;ohB4qv!*q{fS_voZgxOw!O zn>s%Jcwc$JKXkqR3ai`0wsq6>hFUE}mpnte@(Y)|r}@F{hK`+^HNK?thTS-?UA8at zZ?#yRc9h0zH~+A9{<^NqhQB%Ri*~_~qp8>Qz}}EuO`u<=uOlv=Q>B)wz+T`dGD&#r ziAMBJHkA&y`fIdlLvg!|&vnmcnCign$+4%LlQQD&>G{*3Zbaeh{2#l zDmx)RR?4bzMa-|&{F%!_Ns(n{@}MDQ`C&_}1!Gx2WV9+2ycyAJKu1v*5Kcy?B7u8p z*|zrk`Ow>IoPZEbwi48e9Hs6Z@ia}!j;~;MrE^HR)t>Z@80BITlXy(~O$MvrnoHyK zWSg3VFjmN(S_BeKPfrqTYRIrK$&kc1tkqMJRI1vOk~qpIAmO7bi%>wK)8q`-u5biU zL%skD!hu7hb~zRzG1$N~XX@#SG;5FH{ z$}8+J8zl69NUpFXujG!A$tK2c{#b4FknqxNlfOj*PxJ#gk$hyqxpPK{*hwH)!=}n` zJ9JBH`@(6<(fAHDpecGX98p;SX8;EwJLpF#2r6N*#gpOthzcj=kW+E0WveMzO1KAl zrbuIUvosMCoo5biH;S+@U}s00_o*lG;6`w+T<9^Sk9&lefG0SW+%7_nfX>0v#d~exNe|2kBLZ1vgshBRiq#+(u{l2yZtpWWXQ~V z?7=3tnD|KhQY1ns`N@_Es&~D;6|rbztfcYxc6+Lao8Jg^%?W9Q_*$2H{ntiyXPlyh z8Q0lzwE}z5Mix@i-ody#5#|-9KTO@@b++(`%i5j}>YPZiSHZ>g=0}*}#S3dZ9_TK{ zTZox>_)Gj}S*g7y8K3kHwU)9i1~MynDYb6T-&u_Lp1@&pdMJvW;_oOVE9G4tgZTIs z1|2^NKb(*o{$KCdUyk25f5aWeeU>ONY~F^kCFN7>vQp&H0G}m#@oiGd%*WNvl8y{S z&SFI1yhAPmuM6;`$zG)&Xe&5_Il{Yyik;$GjUf=tU}qOL%p*#z$Z$L6nxE}@+!pDq zcVFO!B8zYNwj*kwurFSFd#i|&OfU&j)>Ilh>patiJVg^#=n?lp zE(^J45tXPKfE-DdS5t`lsR-V*R0-8J2E)_Y4I4hiPJGN^FP<=KnIP{?pM`qXUq|m? z@zCdyZkji1be-yvjV8z9cHCxKmvC`u6M$NtCQcY1nR8}uL315nS75B80pQJL{yXc8 zahjlEpw(4 zxeLWdu?L`-0c315GWf{0-k9_yE?KKqyh(T&d|t5BcO+}Ju%V5z0OMkX6;5Mn#a^tL zm3jsMAH3LM1##{eeo1>(pfpl5F^*#}R|supFC8}UvP@A4T&gcD#?~LFSS!<#3@EP} zxds#mnlfNZH8|fUK`O#z5|q^{Gk0iEi~E185Adx7H$eZ>eE;{z{+E%$$@o7cLPnlk)TU-<+;*YiU~l1g(FHstL!n4UT%XgA5JmNHsOa$-;O-cwp`mb${=~9+Liy z_vcEr>g8fgZ~Y)cn~AKt8?N4uDwUG5mEGv-nIB$I_u=hN)cV@)-u$1a^>3A^#jcf> z#oEs=m+rUY%?n4zfbu%Gd_26kc=la}hp+4Vldr=sE7xbY*P&jb%V)RS^uYY`&yg3e zLQILpl1gn&-CY&++`4~u8)_xQ;7!Ci42ueoeV{tbZwr@~@XEWAWrv!E1=TTFUL3SuM7%QHV_*R|XZi23!@2so`-sz|HUm-Fwc(2hb7dB+U;;Kb+r!@k zAUUARt-OdAD6n$TaZReOZei(0Xred+-;7u>>?qfeR9KrGUvGT*OrTa(xJNH*g z#4xa0^&A`1Z4S#V$xm0&HtY2ofU|TXP<=B3d_IBPZLf(d-!~KME~6PPy=?Ia9r{jh z1Ue9&{aY3jW4fmeKg1gb$kjnT`#;FJsem^ho6p%nxeDVBZc4B|CvIHG{FG6cDJDQC zgQqZ;dmab1OVU@h!m&kM#q!nr+g|72EmAsKsiU82BQJIjsRrWKD&_u>HK)@Z_iQuj z4`{5bJK}rt)~ha&+gQCl_k4@c`!A7xk$W_Eg&(fDoBa=p;}fnu*c;Z%i40(YLJjk_ zGbCnDObt0~oWg{fOt}-$WaZ1bz8(dbK~ifpr5Ml~b-z9ZEX12}iV%GgymZ|eb84L< zY&l&p;r6O(&kfiKJt{f08##s+nUWFasNGI@$O*y=4Xz2oC$vrzoWTSQDOiN{Fza+r z$eEv%4m1hM1HJ_SRbc)A(C~<4!^#UL7qq(*$a8WuXcC1Gr?D#VIKnshDf;!E9xl)2 zV@#HBSp`Ad?K(e48MC8jrr>e(6Kg5N0mj9pQB%et4~5Cn_J-pFj+YebSfA~04c#Fr zqSV4Ycr|d;fVXXyYWUO*aKNb&rSr+BG9T?599i(VX{CSHsE3%1sW>;IfycU2onz#*4j$v<&_|6g7ySjbnW-g{xq(`7k5K6;fx9qy2DzD zr1ir9IF@z|CMpKePElFnP<4QpOS}^Kn^cx!V`&PVdcRTK)5v7}NSc5QJ9nrmZcGwV z=`3gylfl4s5U|zggfsO%s?eP)iB!jjaT+NgQ0T%e$C64x6x{$P^2SD%kpMZ(pWH%B zB=54b`jWKyY*0Q3byG>4q?Lw3%?nt-eOY$tW>bxN9-!|X}4jQ{{|Af`2e@IHMBT(?Z&VQdU;C?9X9QP=$18A*cAqA3i`#^Qm#xLqMadEEGR(|4{0#Ebfo$(W0KaL zLhvlQhbUx8;Q~n=1x4m*GMCq)29c$<1S<-fe$UxOXZtKVDv!;WPg&owt1I914St*l zg`K~Sq6C*;1@eC-5BKJY8--ypxp{2kTi$_=e{z_}-1OPN}zHSD^3LTHnR*7Vd;Jl(Y9O)6T8Zwrtt{6k|`4kUl)#1k#I1bGz9vG>2_Ss z%%g7qMXJAQl3}GY>)8#V>aP|P2RoFT2)6_?Odq;QpMFzT3IzGi(g!k@3qQ3f4YVfN z$o@nFYK6}N;Vc$Lv)2<&1!Gf6M2E4dSR4lP%6XWwRmEC2h}ys4d`vB-nz1PnqRU;UfVC|M=O|2B z+yo)RQlT{OK~XGijCJ{H9%WOpv;*FLj$BApN+0b35@==cw-ZJuPDb2%KAE#UQ;G(x zf^hkgK4EjQv0*)@!8|I?Si$owC$JU@^Bjkvki+Kl_jiTsnIJktiW=In_Cf&uKU zv?9)B1vj?&=Z*-#-;GIYJzJ1ak( zM%mKoDAX0DIuKypd(`S`QolNCjYeD2t(g-n5(@sF5VH_K<5KT{P3{}F1wChD&<|^J zw2LawrT7nU4{{ZipZ==sRujfX6Wyv|!z9VhOlwuiDukwTqK?_F*i;L&;BRXRGGn2{ zB-nD&+dKIt+R-eb^UuzydF3>wgb=XF+xKc`t}eT}WGJQ9t7^Wvpz>5qB~8k6*8?jC z5M7vJDR)A8Z4=3J)B-2Wb6euZ;gMR+^MK$vcd`Tq(v~yJ%X*~M_IAnYs#1-2l{lsP zI-w0~@7-Sm*TM~WvirS}O8vx$@=}S&F9AWQ7T|uZx)Km7XQ7VG81`Tb1PNa$v{{zc zfM;r15Wkt|!;@vMDCZtdC7vE)-BAj1ScBlotl@aD#;mQC$MVYKdz`!*E2t%_TaSc(CjtTB-9zWNwYz(eF-p*23?%-C%_-VG+?~_;^`5&ocy99ie33iVtgA?-d@~;l zO@AgNfgh%d)uPyfMurDV`Rm+2Hp^iROt;>Auzv3Bd_zXiDX! zVDxEfR129m^f#X|B1r%+nm=(hM{@(tVmEQGFF&j&3YSd9_3YV`6{sZqI9p_#$+xz92ummp^nm&+}aCIh?4p`%?gP4GMi z(nX;%Kc9Hc5lAtS`_L1n`Lp2`oWr$&5E?x{SGP}4t{`H8(RI^Q1`JEqdx=opS#eKb zsc@eQuJn;Q1I`)BC4^Qx*jEl%XrYh<{4Bo`qQD~MxlFeD=@JVe3Z%Xi8R5#W$}AMS zj6tOOR{uhbqFdSF2V$C9ZY4>9MCvPTG{~{)P71M)&O)|KvIEHn@=l){ImL|}72>Op zW*}P|ZaRQ!UJzv#INGYQpHgYv_eAzLawmjnVi6RO{%KF=vg;%yuWHrU_51NAq-=A& zj$6?4xa%c^jB~4<9HKmDL+$c@8%#WnAvmI|N3gIQuCSH~<8I`1r*Qr-91ACG45(QP z#Vab$_`KN*r8qb8X}s?>n43K~hf&cot4SWcjigpy?j>_1dPz& z(lamxH|mpp)|EVoiVejQR+S*IJwZ7y$>qij@RhoAoE6g6H6oaDNW4;qZ{ioI3-wIW ze_A{Id)WSK?ZCnEzt#>cY#cv4;(y-%*V=)Fjq|^N6qo)$iZ|I%{%Ip@Xa{uk@JI&1 z0JG7=QY+~10$m$w2se=ILX+JzrEL59#7#nyR19y)AqXJeT)+IP~`Vxn(vJI$KNl{10pH>fD)c}{bCr)phnn~OQi~wqKbg>A?R3@LR%!2W|3i$$U%e?d$bnV zqFd&ORkGKN($hW$Y#zg0Mj=^5@ik}K6q$t-*+MoOK;b=W1!LzL^T9TfCkzzR8JBx4 zK#a|N95^!**;lYUUSU29#OM#svyzil-b4m44j?kHT$3nsro_YuWFo%+`T3ci9Ek!n zZJ0^0444~LwJ=#Zf~V_jM)>sT1dl-JoE7tY=7gt|7gO*60t{^J7yf&4}P&-v&+StR-+0xh0b-VmrMZbKzeEV&_UEklx)uD8WL?xnXu(p|TEso!P z*9t0YjlrIYC#9SE18{&A8GK^dzdxyao%35x7Poh-uhJ)_7_Z(v@S`SX%GJE2Cn(MNE$=X$ zyA6l1=X^-4GNHXK@g1F}uL1+^K4-FnUL`x6chsGrQ(oz*>T`y<4JgA~kDq;X?vcQ# zNZXiVslh%c{0Zx>NUgYr6_0B1I(ag7K#`sKfJNt>{oHq(mF_a$oB^+j=!p!0-x$E; z4Gs?a6ZR4ri~%}5eiNQmoQ~G}JTYDy&ruHf0*QXa0rD;)byFCP!KlQsVTP*=r*!d= zt`nJ@NO(DRm|*q)B>W5@dT{qU@Pmz~<*dW_1V#|{Bb@nOPZGzR?3}vXMTD1`2g;5> zJR5IJ7LYVrth8L$F@0wZpvb9HhEQ+}FF?z5<_nyfvNA_mHG|xTaM}}j2HH4X}8}|iX=%m%fH>%Ov27LlL$q`52Klf6g5)X_EPYDNXuY2i{5;y3 zE#l_L@Jq*BDhwAmqKeTqhXX2GVKNnVSEEBv2*DGP%yX*bg-=3%-sA0x_0C*g^qbusyS<8PhDQAlPDjYB(x_3_6GU<7~ zYUtdOH3N;8{_#HUZ`Yq}vhGeM&WJp#!>zi4@cF)4+t$Ztqnsq zie?2#+eX2JC-esOYqK%h+*|ZF0rRr(=n#+AYFJdmoxa9~Ch+6%@$6oD98Z>}=4$HBT63myI?;P8nXQwb+y%MtHVF>8HqU%U z|0qc_SZ@t3FUkSPG)k>rIyZ}?qC;rWQ;j-1V9?PKxcb zi&OlVypwj0x0!6Hs(6dFs<7WrW%1ah&uX&v{HlF2BJuh+e}$WQeLOz6*J4HNPsvv7 zTsu=KMq9`j+hir^qs+|zmKVxI$q`Xy7y~N3q;}^X+wh|04V$k&c(Fwcy0mcILluhR z^pS#lt|zZNi)&`lp)BUvinHmYmzE@tTM=Zj?Ke1OEWXd?LEkxu{;`8$U^v5<_Sh)3 z)t1SJYYj?GT9l;U@E)+UY81 z!8;I9$xHU_ItXLF=fq(xDlzJcezH({GN=_%CjP|c zaW6SdI#CJMph?ptz>|GyjZI?6zPLi?V^E7XX{ITI!d&LB`8CY9DT~2r#(V*JdcRU} zB=P}-W=}aD;M&`&Z@{8)0>l5LZvHJ;{_o!5e}yJk+5b63`TwXJR`!3gqyK*u45eDz zKk5d-e@>s!z#jPE;f=PR!GLns4Zeof=6yJhU5J;Pi zw0lqYu5XeJ_zb@~eO$c$Zr`uZLu+TR72U6uhOldl_E@mBRxqrku-CEAYW+TYKHX=J z)#$&w-Qo23x38b*^0y zRwJq`hnbX!9R^*sMt=dSU5X~>z)*9F{?ZWmr86H!7+HjsmZrZNR%Y`=B)R5i9QIZe!bDmO*XSH4uFP8;0S*ey>_LcgW^i+a~uBm{2 zRv)pn6eLF>rs`g5(h-2SsO$@*n0BioXv;Y`*SWRz^Y6dhQ$yV?Z69uTk9E`gA3Wc2 zBA1*jO%Be+)rcB=ZQ`XvdAqsLFaB}~w_Y=*!78g)EI)CWdEL+ctsA!49qcft6YX%G zKLGDA{CV$&dyB$@uy}Ksh^3zB*OAygwWHrPww~bOWoHPR_UxEw2>4h0Se+5)%>$n< zx!eBhg13|)=X>;k`NnN5Y;)X)#93n6nt22+ zuL9@>2^{6{vXvm|I;P1$^&`82aqJaR3~kp{4iCB!6gjg>1m)UVMsr3}kxgvNgiUCuj9`ym zb=|xSD<>hb8=8n5xG68q5uUXWt}pkL0GS^cWTt+6V^%EOP%(Jc8zwqRZaNI+ei#jR z#Gn*)NL}hc6YFVNvdrWR9{HJ-#(0vflf$rR^o1iFpTI9mRF}7QpTrN?zmhP7U?@&! z?9s~6>Wfk144?^r8JhLe!}n^%kX`;HnP071{v&T9;9B`9?bBe&YRK~`XmA?@I!p2% z)hcfR++333d`{&V=rE^3&`5_m8z{=;fv8l0GR@(X7sr`u=Env(Rc?%R`fpUqHWrZ= zART-M*AbAXL&pgxjz|S>I4n`m9x6A?suMb;sB|5&b-HRcr9=`lDF~ou!`iVO@L3O8&wB-~7|W7bm>w0YALG+4yA^_g$r)o|vHO z5K?4>mNpYS`+?zfAZS+ImP)ykw>2-43@4Zbc>u;8>AVZ%J=kF|(&{V`}xD|v6EP%C*)qRCZ|D>Wxx@qXKRgm$F9AecEnS>Bee$rNMN z$#%nM!QG(^i7q~ItrEdXhCA$>9Hk2d5o18oq95oO-zsOyoi4c6$bM8VP0N-fe=w7j z%2wB)BVNI%O-QVVCCIH=jfJ&k#HEYX+xkw5a7ZhR{I-hBqFI`QIOUjO^LUiYy@(%u zi*y_Pe$C$@NV!o~AaIty{G~==<5g`4ICLWPN%B#IkY=KwuYt0CoMEKeSjzQ&M|b~A zSk4WaoJkR~q2;?t*mf4Ql7Y}oxH@mZ@)L0YeGf|y51z>8B!nd=x>10fRBroR{aPQ8 zL5^juR}3u0VZmFR7Uy^iOs(ytCK-78Fi!T^*~*PP{$xb$ug-ioI>}!BC#~~u`SNeA z!@>MN-V57*(mHJamDZ`%()=eN`hNo?ExOya&|m{NN)ZDHU*hZsSDrCo!k3(`h0o5?{#qW@YwxPYYa#aZ54r2bb&>e zGUuj-PF8QD;j;nrySV*)ytw>5er<05;`!@ArLl`I_cHb7?Agq@Wsep2$zDT!qmS-x ztO`JVgYRAw1dOdY#bFJQado?E8}>Ov?WAAu0y=vTYu)Y$P0JAAGPE>w`2P5Lddu;7 z?!(#FnZy4T=^u~J&%=$GlQd9BCmJfWp@hLW81Zg92IsqSqp@UvEXPpc-D_;zH?sSQ z=XSLQ?YpEG95P8`KTyYDP_qQ@;3~dr_lMPfCG14Y9@^Nx&r)p$n8$|dWA|3ShO0?~ z!)aSJbBHAQq2YH`5(=RS(O{=sXRND58XCX21)6aYk-Ht|uSZCK5^kd!)sD}G7mVkm zQmt_z;8*!Ss5xk%s8bJ@NsU!dK zSoU!c0aU#abxUwC)E4fsYPAndkQzqt2JqslkbXRtTua8aAl8g|Ko)h_ryVIkTpk%5 zA5=$&dONXJQ7-Py@ynp2I(e293>}-(dUE`}ow3m{Z z;4$K;g}_!VzZ+S`wa22$u9(K4*1gj;p)HNCTOH-BRLdQ08>pC1E`(^8-CLn${MyNe zW`;gGl|3{*hu&D@U^559sQ+r~e?4DJSX{3QDgaUSO`Q#`;c4X4F1TaowSIh5G=5Z3 zbfN*7aIz2r)Es$27;JAF0})Dp1Z|aF=EDXO%!C7=&+5qpw?aGOgQB&U+>5lZnPBj` zws^VxcEGw+YQG;44}#-VhXY|hxJ1BkbvQ!^Fnba?&>A41ZU>2cA@l(ntCx~)(wVA~ z3*{7;>-0dA_35>)(4yGn$r1s@b%WD*P*e74s@l*{Y9bT4*<);iaRj4Oc623h$8`&%jly88{Oy%-!(I~}+_JY%cU!H|uZ;NUR>f#7 z^Wi;;5JW^*lZcEx1gG=+Q)>S0fDbaQp)oqVB9~zok7rP{3q$}?#)Xq++$j1Op_&E} zJKR6URJ<_aBn=ya4=h*OHRdK#TjCFNEpwaQ(<8{5tc6RdCDms zm$^v{#ze$BRrsxYNZ#4k1jwo-M+>>bXp}&_L|?UPc>nP7`z|Hkp58y4I0>L8o(paL&1*Ja^%HRL^+wjRhS`$>g`?5#nabR#(0mN$Opp zmAK4?#C|VtOtX$APW2a`ins4l8esgTq@Vb&qG<(EN_51-oO{Yd+#nGD1wggywU>5N zh;v<}yV5fzNcKfw#$9`gQA5Kb$75p=q2SI?-#bZFx*o1Z;w(SQ6p}NxV0BWJMg;Un zqj}MVbm163n|9ShU(+~BiD~4TDUiewg{r_ftZSNRf(3b&W^>H+_F~4lEU^dDSbI<# z!J^FMflZy!D#pSb^Yo-fo5Mu5j)U=4T*o1Xl#~3I0=aBbyCTj5JQ~Ibuh9t3ttgPB zJP-ERtVtOg=G!&wSy`eWfJBMOdA~yJ=rEjQND?q{0>O-&3(bLt{hZ6c4?+S-ebzo& zizQ1Psx9jxAg)&PF|-wu+YxIm>@ZULmq<`mns%yFFvN8~+&SbrXaEedRi3N%9B^q2 z@~j^7xeyQ4g+>YOCb9c&IDD;F>p3xcd!J-6;zklT*Jq zO_6DB=4h8mBc&#{Ykc;lgX(GRBm!y<^>@U|JZHL7FR+JUli^`8QIcd<>BW_eroOZW zjXOKJRDo}!M#4B|R~HXO>-WMmeZa)Eo0O4JQ#nm)sT zvnD%_z>YRFWpZ*w)pWca2=<)*tKRT2qp9is)71a>Apd9TGjcNjtKs^e&rpo)|LG8x{l7Ydtxeyx zMixXE+r6#lxRV_>HG5$X3D%(l4CO-s;){SEDN$OeVl4RkI(t*vy0as}me!VT-PCzI z`+pdF$0%KcY)QCm+qP}nwr$(CZQHhuQ?5E?`;>jkRa4z}zPbI~>9wZ+y({16XJ*FE z*gGO--TAnoVORL8Uhf@xx_dqSYr3mdpK8Ofun6?EN60v8bTRbc-_K{J-ukp2Dm5aQ*+-y)us8PG?T*^Z(LA zygXm~wfFO1yTdn+RceCoX=>MFb5C!;H0v3_Lm_bBX#@&QJ#6^#s7IQRf@dm$W8d!4 z%_}y=HFm;*t=yrDmY9;t8k4H68^ljgMO*-(5?3e8sgMN252M+O>s_6^iacxuUB2_BG=hQP`07CI2)bQ+6FbfQv#_F+Pl*QKTDPT3kb zXOhfB#=484C}wS#_Ge;HaWEJ03@n+3IbLRNN-$BPz-B76@W#GFA*N1D#4Ma%qsY+E zZZjZZ7CLLBjVR8DAxxv=|M+`-`}y*6B*{>Mq-K%DK)1i<7#N970L=Pi!j;zay5tM{ zxxU-0ZMBWJ(Zv#{-9~<;r{sJWma0q1giTvtnWvBy{R|bq|bf?$T|eG z#E?oygH#!epjrCT5L1JvW+n%z5R>^@P*K8Rzo}tyt;s>b)J)RbtKr?^j)I=E)V0F= ziCX6#1&K1St6Z!{(?v;=-v&sfqy|Y4Q6<=Tc*Me>tHDXtarcO_4wU%1cwJS*^28jY zdU*1~*#buVh@*;I8{Y8Wt}ocZ(DCwrcM|{WaQ)--aWMQ#BbEK1(@g(Z{+C87JNrMn ztN%}`F>N<`N#N%oKB&{Ykg?>h5p`{s?t?~12y!73mgyBW{B+>OO>(avWwiWL zY5VYSH`P8Du8#EQ=Cy+#XD;0LM@#NzZv`l-xSX!=$mJ_jMRzB_0=`$#h{l>Cl0dNlt_LD|mogpK zR9OHjz8p0t`hZeAhVpALP+OIG*!lO%k+wjUdTd?^7#Y$SNp%bFOR%+Xc0t?b<4+8#k@F2!}g0HI-0yky&d_(osCD}q_E16U+CV-^b$K~Dfv(iXJQ9)I`?=Lmnwd%>`iU(BsU3E*<449 zu{9MCHyKiMlE~p|BHoswSZ)@fP33_jhStIS_p3>KQIKg?w0(Y@`uj4hL{nw7_!`-ia15YiBP;1!5 z(Sru>uPR^-2am16)L)s#u&a!KEY_?2`eg@=Ub2+0N0*QL{UC&X+_`c0)5CK9yC3V~ z*MmX=P*9=RMi9f^^}R{eNmQaUjoVm;5}lv^=RZB)dO=((xo- zGGJFThSM5wF8;R4zqi2+=dOxbzm7rMj5O(O>cNzzSyn_ag2b^hXE zfDIT92+bK#R~0p(D8NJ;@GbW znMH5{*=LgX9{D>cFln0842t04H7F0wQ0-t(a$ps)xU&=jC&@3`-H_yNVF$r+psMg~ zjq4PIlqdrsOVpTnTe$a5V4$}6za3s;4 zu`)__gmmZjx_sL^$x>yJv+>Ok8CraDD3w4jnjtSbn<1y_lZ7BQcb*E79}EYhi=>{@ zN6LaIvk3<&vIf^(;Y^g)a1$XXZe&bkwD1+}zQ>YJ_Bm>@DZ_ywqb??#6O!!qE2IfN zG0s0%^8M-vbNx${CX!1&(hBu8Z2YD9`1M8` ztd=#}tD*E}--L0KAffb!)h1U#S5cnf1&N7P8D|yrduX9=vSaC@W0P zMN5IGIv+*4FJZ_EW@2SP&>}hkcrlA^kjJzVYrRbK@a281!nT_m(bf)qSH8Q#WwE-h zTYs*|oUz4#MTh)IKelhtL&_FY$ zZ4xC)UW2&~KK86)?q+D@ag>Oy=dVr-U-5!acw5q1)gdwGN7+owi>h+7q((OpszEVI zYU5d2AMBVr)QR@P0=GmC!^<-*a~ho}^TS0CIT}dJ`msxHcW)rJxQFfs{9Y!6%D=_% ze_mDpxYigMng8`($?T9d@Wl)e*fo7m$xuM{^_S%JO6c?W?L8at}57lPsNvS z>IW{LxG1tGLKd)nR;}jp3PHvRC2$A|4vItuz_8eCXpXYP!-;f@WzjpeN5wsoJ^ej` zRp$keN6CW{&v12N4lDje&xr0(=p6b5&r~^2iljj-B@}Uhfh&-AYye2APU{6(GUy#r zuJ~|>io%rrNr?22rZDD!BNsUMs;pi}Z0u^ZP{e|kb&o(xj z@uz}%L~J-z=G{{lBaJL(@cVPMyAgzhdg!Pjg;;@S)9NlCEL&Rk_RN!w4TahYD!%_cv6h@>Nj6(o&zblxEEAz|{1HKNp5qDQWk@iwJNd9IUpXQLhJfo1h{E&GbC5Q}Z{CUl%@K7tO^Oe*Sl zGSC?noU&e#o+Dp5j7{HO+v(BbG4!vFU!2K7mN#Rb>VZz`f15K#CEtH*)g9Sd<8SA* z9rnILd+!c^{o9@Yf8t!&*#0{Hlt&b1?iTHpji1n)aJN*@AKjVPBb{PO4<8lKT25#QZ zhORx@pB%y9D4u_`OnI!_jNU<8JTu!u32jrhAwVYvdyT_Ebwo0w*)qWfXtaI}MV8=G zN<|gz#}zeLFK3O46p_1`c(ZgHBJD1}Sce@w=jZ(dgFRDtJ9|DKLzc$ppo~Ta>p`>b zp`s#)mkBh7;o`J+>aa|TuIEI@VLAQ=8isgUFErzUuV5k9cGc zzEA1rj!Gy%q8*ym26GWrJY0ZTi3qPXjP+(**}L0&2_-*Da#S+EO)iaz(%<_1hJzKp zCkO;lk%UCau}=VWmx{QO^-8@CbE4<^<38LN*BP$q?Ktx8v0yTn^Fa;I{vyUu;zYbi zd>0vbwZ$q-nKjblxO-RgB2aXzi`{oMVp)lgXHJtM_6ch68o>3KS6 zM8_>R+(3MFA7#q=Ky=7Gd%@Q(xTs5b1NMYbS4CM|IM|({)OQ0i9%Zo>*QdCWm1xm0 zix2j9VL(#T5-7_8aUkc$5Y-|Yg{|`p90`>(XHhkG{ED-!0C7{RXlDJILDggum<2Wq z2BHNx#{||LPGV?mluf6FW7lDo=`2%bxfq6<=oIJ+>cc#58b!79D35Y(s!CY`9YwjV z^meL3;nG4wj$c!#sKJO6qonFjJc?FElGg@QkW7ySC?y2-G%T3lDZwe{nFYXf5^okd zY|I#~DfDQB+^?0z6gYJorMzI02}R?hBBLz4%!oA-xHD2_0tdOJVr)d+gd3_3=&mz^ zHUfjVE8&Ci@bQQAc=|u(__OH`-BYg*_%C0Nm8bQS)52jg$F{R})iw3QNXzSPwK5iv zGUu8Mm4~ht_*UPE_oV(RHO|~Ar}&1w4w<{=C@_*YOfF){ROr$(ROL#V2A}ia^_r0~ zsU##I(8O-BX!QD;aU_s11g2y5a;#Z~-<6S7bJx|EyBArX!Mg9~*CBX3Y&)LnIG%gj zbwb#*M&VaGLQ8zBNegGvJ5z#WarnRUG(CNOB?o{A7>;UDE#5W6`<@w*C#+Ezj#zOB zJ=tK8=UT=}Or#8vYZ9g~@}XM`6P2nEnI~Hw8iA>>b1rWylpFbg@Vghs`|n#yK+8L@ z;yhGTI$BgP?9^!3%e#TWUaVu<%MpBx+jrlhh%L?Q#oEwx0 zC^Q1ckJKbLaGVFSN}BpK5Cvtu3JsXlyKE@?rwJNJ7<>n9?Sth2>xCDv_cB7hWFY>>9uI zleoB{)wLmpuzO@Zg?S*qk2`+O4&>S21WR|uO5IE9;IE8pu$@$^=pn{ZhrQFCgs64z zxZGi>K1bj~k@`#Qd`Nhg)U9%Bq$`28&h)%S2*yoUz66c*$=5rfM#aKz;`Nf1oCzvJ zyEp_H6O+C^XTqYX;N?0LdipmhIg_VZ;&REXMEpI}AxsPR40y15814r-Gn^TVrp&-b z5Zx4}8S1b;lZXE`b0yzYv#8=b6CVZp_(Y8i?bcqrXI*W3o8P zK#y`UFO~Q)l8t$=T$tXByVy)XeR#ldrLlESp^Nhe&pm`ge-u^Em)60 z>KHQAQix!+MBp-}Fk&1GQ_~E+<`kl6=7g$atqfJ48lT{EBI$tt4!HjdjQ?4(aK06p`xAE)YfVUZtLanVaU!DMVZDc=LAc_4Ipv_#OK)C0TkyJ zX%s+etT6<_Ix(@)a0z1^#bC`a4#|k~4~J0F1ZP3+w9r7}>}?&8_-zy!!j>POA9zBF zmHm8&9D;(hCa`1%>pa0Ay5x8|6Nv)@706&v+GxiLLaWv#heGzoyWC0?ZJBEDs1dsz z+H#I0qAdeGsZyYsmXQl7l?*Hjfss-h=UTj!4h|3;LZTCE8$E!byjHf8P}%KU$m0-~ zDD*&XNHUClQM~Mu&Xvl%3W%(NzBe&fc`{ZqM&k~Mi+c~ zwT>mw6-5f!98#LhCECK0(Sk*-8!93Ihm`3K0l~8I&&cY;s*FxkO6ZDWL;5jI9zv7C z50^zm5Z()Rs4^-i6cHd(rX*WeVE}JdBOJl5Ty^r=0z;V4i!0Pv|9}A0xk(7}k3Wy9 z#3f2M)*Y>tg@8|Jq%Z$kScGOq0#2{cnK4!-J09EL;|Y|xc_Da1EbP)n@{eoJD&t~Y z_%QlG-E=VBIVgRgm{A%k-=SM2m}&kpz+F<53Wl&_Av3u&eBM7hd-<}x1#nu51Hnno zn!8>bcN1hY+OCF&ox53kc7Gn1kEh>7cpScaeYy4dcnSC0_Vf5g@-f4#9w%AmES){0 zXV>c6VC`FAE%u*yLS2Anq0f93TvZ>AkMOI!$bWgR^{c$;FS=9hV4vT3u6>u#?{81P zUiqCV)PB<2tM_c#kEd5^aSm#ihtJ2mEgB7SJWLitsdmU>n8`?b2&RH0+mM)lKf*+8 z-%!@k!zgOaHjCZpkp$2*s-7+vQXw1MYh?alkyN^5!bCtYGCmEQIx#ryNsF8@hY^fX zA*oT3*u03LB9?W00(c1J>sx|Z;Rt6*Bx_(?a{6=+qrz4$(74}O`vK#!e^w}*9-$Sp zP|6*g8eE$U0{^Ea!{YHOTrR38JJ(=6gb})bCbhxRT4&=8$BPx3Q*}G_ z3-SP?X072;KV`Xp5SHtn8tYfk+Y30Gd+)&YO#GPc0W<|lO7PGKdMG-u30ioK@I}B# z5Uvdf1s6x{WZST%Mj^9O?xt17&Tf*5Hl0YN3q5f~mna5KbV}w9a0O6S$uTf*@Ns@s zVl;FTc{?OVx(TJHkpm$VqW;%*oK0P^HCJypxP703@GqUuuJ_B)p-)GTW>-X3gu|q` zwSCHLG+QI%+L}6R zg11~rYQjIqNH^0#OskvV&f%sjZNHZU&-mX0A2EB>~(JDAXQQBNB zw3{8hE+IDP858{>6t=XwiXre>5ZvuS?S!h4x`Erp74_wmbb1C~*eI2+3*&`gFaZ0U zSd7iA=QKlcm=kcLW4nhB^^GO&HTn5e6L9?et;uh2c&frF9v#9dZ9+!g2jjW|K$BaA zausUi@m?d7FQL(->?cO>x25`~WX`E_HX(Dlhr=>&qq+=^b*Yd_4Y{S$%?zR3r&~*S>@8_~lpkf~KZu0x z>w@l+!2PmV7uzTn!Pb?FE~UcnXHLYff3uw5Q|0jVV?}hKY24LZj*4D%@^xkWq-_2u z`$Ufw4+8LSk@TP7_)jGL>7M@Mi+}w7>8t)b2OiG<(1GV7`e+RCyU#zAU>Asab=iK9 zp}>>k$6+ry)Cc0VVe%^1*6!wVCX?gaw+jEvry#J@~^WA=wd@rZ3*L(i1;Qe9<0H z*VTfu-Mj4f?Pl!lr$7GY`^U}t(Z+~7dzl)0%8sYklo*RjJiPLQz3#(&L5sNpo7ke- z5E+6~FfaMQ;-pq)149#gZMh_)(o|{>U8@QJdQRUBcS7*m+sduH`Hj69Q?ogja_7ii zWv=Sa9+hRiDs!GQrl)M&Y3>0A#+khG@<~9#qM)m1&C#6p0~aD9$L!mzi>IWD^VigV zW4rrZ4jf9k6c@K|U*+ki@sc{ikyEsr7fL$3m1>2;PZbi8R4bQ3(EXJP(p_~4&Tx{2 zJ}^yos0HMc(rw_PQVc7N- z$W1I=Mf#9OxQoyvpRLbU*iLv}>?-%V{(fGs`@_ygQf5r}zcvPT#3{7?p3aA&Avk=tFbd*F~VKdV1x-nKU6ErE96v9mQqCf$3*7hFe_pVvi6z~Md ziYFAKMi|4(ryeSrk-3X!FS|Hg{(v9!kdGjmKc3V|lMm+=Kg?E^ml}5h1(x+mgK)iQ zDu=iNJ2MRxiwPuRIdTmy!>u9R)pqTh7&y~X^XZ$Y$%(ZB>>wS4$!*+K)vQlNY2hk4 zZ=|2P%k%rb#8AC1EnO_Vua@KYjouuV3$aoQ*3`JsN~qEiplnwbge`KG$q~1y_gQVs zJG^pbZK4XgQWug&%W4-OMma1T!*)t^*9W1uuDcf~pK`R82fmOZ#-r}G2f1$4%*H==0;FYGlZ|%uLf)&a3#5 z?(~{1SIz&ZWWuC4Ose2_h&8PKv>#`~`U#(Y?XhR1y<;bz+cm{a1B>1%ZzG;A)ObiW z7!(=qn}o`Hy)9sFU8LySWLQgWis#qZQbZG4@Xk*rp~;NCY4PW05+hb4w?67wdOCQc)L^GVN~jM{FFda1WNN&R*8GW4C8IjL?60Yo$*GAC$R-Oc|!Xt`h*{xYSG>#|#H@3P@!-jfbq`lKh9 zj^EW^GviUT%`QRsx6Brqv%VLwaWHH%1DHF~0Oinx+jAW-Khpi3c-E?J;DURaopd2# zP56XHZ=H`7y310~(3SGOO-sD01u%0UCs0CS3oOZG5Jt`D#H?3mj@3l)%zA?=7{a_I zEi_N}{BJG@^kfl`-z@Q}A9_`^UShOWgshs#1rUf_t-;8$hh5ef624py5*|0nW!)|B zx9b51N!-$T{d(xQaam%NA0jVa0kqhKGajbWy=EI!tzU@%sxzS!{|V_aR%k6z_c3V_ z&EgKQX#GO7bx11nzT@#=c&u~Q&S8y5Y`)#212>5FyqTAFLA&z`D#Wt*O$RBOCNw8Q zIv3<1$7aKxSz-2)4QT)rLh=<1ZHufaGoaCyuo2cW{N*|GYQ%;H_P(ie%rIcx5u@GX@F@g40q{CV8V)}xq~FEkAIG4Fti0K4OUGQW>@3=dND^ie_N%A5 zsrrp~m!N78LzINcsJhb}ynKH*-ZlPtTI6;!?<=+VkF_GNoVdOVW}STqUtINy!WiHh*XWWF`At}vPh{1A2x`(&S---=0XDozBUP~n z4|z%4x3GBH$pM#T5-75bJ5y{qzvC_KrH`qys>}95r&8dil2M^@M*9^zvGRL$E+0=A z>(*`>?iR>Kl0N};>*2GfD!CcPbv~fQrFG*UIN>8YSHX=?WFwTps6*aV%b*Os(szec z3d^Rjl|!voY3d9#n`{G{Uwn`@(xt;jAAhgkiXNu5?GoRohYN9{@S}NO3-Yh_AWCc1 zOu$I@XXgWJJaFGAD)+O-@@R*nil&>@Ocwn<`f=p26;(6duOhdsp)3#ho2(OBb63e4 zE17oxh!MHU#IJs9Te-4G4`xLMFKSRjTn^cY`b0=mTj7MMkb6*>!Bn+Q@O0yBog`%k z@1WBJQfo?DZV>n7Cr9jj z?K%!)bAUv+w3EcqfTZjK!*b`r%jA)h63Qob{d+qldvHoo;#bs8EEh^L^%{yBCL~pM zyIELXtF7hROtt`NsU=08F(_YRv&GtZ3fi(6t=J39BW>2S5qQw)0iG=yG>*!{x7B;u zrUoO^+Ujt~Q*#G4VGTd}kv{!Btw zQAdT-tUNs(LKIbbn?@+z7MhOgCw^8a%?Z*Q=O#T1wB`r{en(g?0#$y!wkCrna!H+K z8@y~Ovl!#8`Rx`>b;)BJPbMTO6vqwI#_LAQsmGtuofT^G_)ox0NkV6;2^T!4Afr1phFD5%4+%8g+(7=?4mk5HvFywJ#30%8 zBv!X^^cb2*GVbn&>gprg2ZU_mxu>8WL#(YTW9B}&o?IKR=9?Ss7h96axX`S^d) zF~?rZ-su+*>`ne%)%jnA;iKV$p8`9HqSv<(|| zeU+fY13D!L!Gvx<%+x)@NO#=K^+slmUouNx!ex{I(y#wo7&Aw)P z_;dJf>Tt?E<->&scQ-#S|9jx@Zs{S~9h6iZ#bgSEOPRL$I>Yt(0?P}7y@5>obHUc` z57tpwon$?H<-Gbcb{mawKO+P@zMOw3#k|!(sY)%8Tq2YbGLC9$0^8Z+uOM8rTNQ9 zfQ8D&=RSWsiLqM+0wZk_B5=bDLoDHGy4F2=7Q4+w;YQe9ORKW%^^Hae? zz^f(d*gY)0V7j>E>*%nlm&o=_f+d~M_&k@9z2@;i1 z!+?|AMHIzW)NwCauuy4E0#L%DaXEYfM$xw+41AGyvyn=mrc25NgoWhI(To}WJJIO; zp_2)?RMDh`-}Lg+WXDV)GLMR%2}jb#()Kc9AF|E$`*UXN`ug`LA*ie&wP3%rGJ$`A z%(BD>W;EdC@AJHsAs`15-xCDCQVl8#t)El}8>iu5MJDOg?G-5$ zV(4;4idp0qd&*WgOmziO&SDUE{%Iwown80KIiXaxgTxxgz*dj+N*6|eZA2r>81+|M zigXef&TaZD#%@zc$853N>N{Jad&_!(VFiqSJGqWHKr{&XE&@-|D>3qLq$(cOxes50wB;$eyie{?p*p#zniN+nZS zuR*K^6z_&P7SWi!)`*RALX-r3v{;mBmf|6QmkKcx;?t_>z&^~)PdZ6q3w6u`MwTcu z#59fY9G#I7+3niBNwadCg|t!HpOE!*SVqA>><>$UebzSsdFA0hvm^hWPt#s9=NuvJqtnwTBo$DPPxLVEyDRq`BICOFH@k4=)$S+}ViKhuy-wg@brdqnquudu!&IIHmcGFjds@@-Bo%TFMw{m5N z_(pdpPb6Jfr=9h^s#iXQVI8&EoW@WYI&{P1KXk7)4OWTrQSBy52 zbn7FLo7|Kt<`{{|FAFV-sWp-=9l{QUzMz|53c}{rMilB3SuM+J?KP&m`Nc% zyd;y82_U92NJRmX$xu*J6GROnZuYSBX$xWkl`T8Kca1SJBJ1_RK1@#I1N_QiY&KMT z#+c(C+7ttpp7g~i_B&BZ8e)`m$wgA2_4xGP4^B-8zYCIvUx%a)#1`$Pp|I#OFAXQN z{N&QPyTWz(Po-BXrOj5=TR1%y0Gp}7hDnFoA_GIP06`K}W>mG0GRrf_$ zd(x-IRru}uO$f<$eDn7AcYvvqx#1Yr>Y1hx^d0J^|o*+a>;BSxs>)OE(V3}X$({YGd6gql6jd6uue(F zLDr2}oC&aPd}N$$ikho!ZK$Ym&~|HZvndb|5Q-cCa7D?TnTtAm{QZ4+nAFt4wdd7M z-h7_=*FBg}@19f1FI-_h2FWU|1DjZrQ>p{auK}%+sPjGK(!`*Zyjr3uw6)xd+rGL5vp3Iosg02yVa1Ag0f~G97Tt zX~q>2&GG`;oGCnBj=(Og_893x(KSA-$><~Ho*}dNWV>1iXj$eO+R0lnn?fIMxQV2% zI4(kUKsmP9R!~rFsgux2FVi^!WDZ+SKnc+a`HJsHEeh1+kRCVIqP_MQYUT~A(HPid z0FyPJ!7H(D^-a~q>4W;HKNflk0|H7HtxiSgtl&hn@O}$)wb8q3kVVI@34VU zLibrIfnt_;aUuD%a@OJ>GOQyanMKwU6Yv4Hredm{3;-J&0FM|upZV%v%(}}D3M+rS z;2uU9m}7{FYBnF0!sR-87XU&M+v{zS_3{=(+Nha9XP5gW4Nag4ES)`mA9G~g7u%=H ztlZ5m@oY?4V6@nzm%cDmtfz%J^%V6_ig1cY8z{OBmz*cOAk(mSofvr6={$OzfkA3=Z_oOi8*bKlitO=d%7cPs0BVWdB4xHje)u z#$#gqH&T+H#s5S~@{d&IqYl`<)p~{m?SOlUln)>*ur1X(0%)29S*!`diNZur6Z9qK z>{*(mk9P%mrKTe%dM6mL3d(d_DH8r9{7ST1n=ecE&3TCh9$y~>^+qVlQU#*{d0zfc7p;6bevXCodV2af{T=XyCK4=@ z-6|2cQ`4U*xO;7}3e?49V-^IzgF^Lq&@_3OWzgYbkZoGbth4-F98eF1t{_ zMN#SkTk*iO3W+b+h~uXvdV2gmALwWo?&ugJ>jb#bV!H6@1$D$l_jxz_7FV!-L-Ru! zua;S)TSEL%BZLTQ3{{qzE@k8|zJnXy1Bv}}b;G=l{q`4}KKJ2m*rrWYuNrFDuGICm z3De5?i}3ilexI)}xcA|Qi-+>n)BNwaU3>jW$ECQh0<9}_CA-3Yo`9U=;ErkYj~ugs z)R`w+zQff)9r_1NUW1njaL!-Zotzoj9o!7)R%$21J$8AH_0NBCAGp@6se#3a;Vx^V zJ*^{$F4aNpQg^ahK zkhMxNk4%O>kAFW2W7G4q`$Gxg_xF9npMTtqulgq~j)t7uY`NOzSJr&y1uKQ%vxF&* zXalqDaf3rxy-T%(p6y6GA`)#zpus#O(9IGKN~ak0aO5*3`2b_dfIphznrTp6e>5mVMq;`tFH#2E2j z-G5+3PYcx}iSgJBqB4#$im_6!Ks)3?$|W6H#RO*1I^A;7sJKKmu`VlGU!^uE?D_%S zJsP=YXe|0@#LWQxU2CgvZnEnSL#6yZbgd32 zlH^EMBRgngbCrA zRTkYC6Vj#bQOFEvhV{ot9d=<0P9drSiK`RVQmOJsN0pyIEzulM%zh&^Wtc@@|Grgq z&MzP6_8_kIMXz6n-$}+3!YqXkY+4v~G*D3uE)2%&t6FPBa+3n~N(T=6pln}VNR&UJ zR?0pyG3Oc{T&PGvi69xWFoKB+Ivqq#o3SRj+`lEmz}APZk031H1}DK($U)AyCO<@q z@_@(WZR1q5$~CA9R@b?B&xmbz74Y&>)F__cl>3HqJCy{RsM4V9i5XFBLo`R%#xT5 zO*TqX8@Pm$dan3ICu}ksfF?8Kp+e?QUKHjwg&Ity7uQEsZoNY>FO8|g&5sFmyhfTq zwS+5htWI0h>@b=$cq`RsuF9T>r?QHOXemX5+GVS>aug58o;%S;(P)=HgKD-JI$95tK6Q^ z%I^KP0%@TqMbo3d?ebFq!W{{Y{$3W0+$r>#pH$nU8Fg;|k&N>_`cBPxr-!P

7)F*VBk*Ak3v31WF@hU&uZ4BAV9nxtwI7)TCm_efzA$Wa(84zjRCb@Eb{hKmwF;GhcQ)6k;1(izdB~= zQESJazPG!$k#p`Z|E~A2GrKQ!Yf-KXn`%oUgzg@h zi4(wjrYIT@+_`4Ezvf_@U`fb{9#@Kt$MEIgE8PCkNUhXMMkFH=1M!)1^bVVh`iV4D zoJY_qagu%(U(kR>E*Sr|tolEUIujG;zmN$`EdRIFF%uKZf5f!^{|s`*b$umhF~C@` zWFrO>j0xch;icWK);v~c&194O^UvQilEjQ5*syX{mtFl-du@Jb_H6axhpG2=_x^sC zaQ4HKxiD6nsSZ1>0NY)`rKjuXSHp*?_L(KKp>{o7zU}Ys&0a5NKYyDwKYxxl`n%nS z?wNhJB}bASz}={mzkQyrNU#k*vWI%^Kl?4=xY*N$o4dETt3RGLIQ50Bs~#<@>_$KI z#?_2qrnQ@k{=RgsuOCBsaWQaA?lgV!Non${MFW0h@9hT;;sb>K_2Sgw7g;1q=A8uj ze11&AUqZaW{(Zi`AGbBFbB5oWR~Iub-LDIlHgBibcMs#?_W#sUUgPKK;avwq1u7ZN zDTLOhZLU-*aH3v=OejhY{%yx!Sv-As8&=m41jJsTLs%V{YtW+|X@CR7eNDRyTC zg5?6E?HLds>!=?SCVQ{0A|DiHL&{5zD%c^@0BlPJK`^D}oGjK!E0`_fI|C$M{fuQJ^tJBBQkMfqTMMEip#I=Yksg_z z`cpBJXu4pQ?jB_sG1d+`pcxWJ9=`WT8|4lyO~}@|X|XbrP1PpvTo1{UVs~kJ>{)KL zOG%g`uc%_i`oCg4k*-3-C@S#rcXoVVUxI%7cX;=CKl?nt!t?O^O6hQ9%Jr-#z}6=u zhd_kk)M3KbNxp!#2&?siQg84%YWy0cK}Adh*4Cm3ce@0i=A$D>=`Ch1IT45tS3h|} z!RP!KUTT%`pcW*>%Gcy!Ul(_C1-12?-2|jNJGw%4?{_e8-lMk4lWAY+LyA|0GO=2K z=FC)F7?dG#mhH`W2O>P6};rZ5TS`!qp-^IW>lMIE%TAxg_0vaOgcv zBi>|JYTht~>Y$p((7lO2Wb8Y@Iwa)ZPrS9A(87-)e;5){;hHd4chrB~o^m&3fq3c& zLS2%bF0ogt#`E!Xeeu3srZ7^FXwo1b2R*HhP(niY_zL8%kJlPXWSVc}A5#FR?-y(n zo-=UOlo3QJm?eEyOHL-0QlVoDswryJz+qONiZQGupgD1apo`2n2w@%f) z@4CL#-7oq@@3r^Zdwm*GrA8u}q*&)yntpIHe}wdvq-NsTb|lOjNZyU@LpNk6^-`Ws z(})H_RaAv}Tqo=)aPhDnRxR1R6!@u(?b3YE%y>56OFhM_s6(+l6;5qnxA%t=R~f}x zwapsQE*T2{<_MHGM^-v?wTDJkv`w-#&m5PCI4+1*DIA0MCJ|+1r3Wl~pJ5hM<1}R> z(NHFm^{_PmC{+I=VrK?|XS8n}=>H5xzMKFbz0n_?ol+fdSQ772jHQRojD87abGAEM zWXCPDA%RtcQbt$usNpELb+8WH6V-CzIiE@$^;#3AO&JUXjB%_!1>q=-nvY>sO9Q&E z!z~#l?)KI1tpa8L0J-{@MffS5!lZyYz+; z)31Fk1WPj`ti{IZTc=byv2)-b1!&;&Zi`CkIM32k!h`13uhnEVZx`c$eT-Dnd@xBV zhm5uDh$i#NJjwD0*&nTmjVxs&mPWG zpJshEQ-9NX>TWfUrgVU3*8JkoS@BO0hIDyY(h4vhcgw(h!qb1EFDc;g+sLw1mRrR* zjTSq=(qj&(z?lTvp`OZdFb%`ozU~XU3EeqQS7`$9K_V$Ezv>3CG#{BUA{t(gw@hn! zD)~)eF%^}20(6nuYpxRjzn33`OtWnceiexSPV2-Mo6$|#{97?A4>xo7);$A$5U(Ly z@T_)8qs^gGS>-UeCE_B3kW`oF*W1T!iQmWL=hYx$ zZpB0E;9gp!N|k9rCC;?f!hHqXU%=DZ?Tw!@Ll|_9C(Fm(?fXMmDFaxL-;EwYt}Z_x zA3>a54}K2;jVpJy1PA(icMnh24Pq#8b87neXT2xOMP%do=aoXNbfw%+L$n|iZAvOr zHpwylKGKU_d56#+w(1j{Nb7cr^6Fv?n|Pw+Jnlr%QjkIvVH{>#0V}DagmT4(C&Ge zmc0dxIx&N79*p9Z<;W-0%h-9aI5>4ENr;OJ7Xs5E$hX|m;#~DU?_8$H+Dw!jN$0}H zA8P}(V~kSiw@4(C+RHC@4W)W!wrG1aEo(JNk?9-NHEB56f4;m3$k$OJTZ5wu@IG}Bv$>C|him)HV&rtXp^Z7P8Zw>sqUC8Ejgcjjn1ti`<=t<{X{_cZ~A!Nl= z;$&t0)45xmfP^dO_DItuCBW|78fSOVxGO>Z$?36eUc!?RsSa_?OEH>}jf*+d9I?sz zCnVRY0qpbyVubghP5I=iWZK2dGW#Oypr{Cgrl+Clr!s8)JeR8T?gEb4zzJ9cPu8J= zi^b^udO(srQ*Ms~f zSIH>*KsP-~Twl7!i744ap0S*ns6&xOtB<;Lk@=A`30SQI31m<-C+Ty%^Ojco?HpH~ zSs01*gnJztl!$Qucp%~1t?=|pi;T+#{Zfq%^*QlN=Y0#1ZsJpU&<)up?O}VBxEz$*y$(JsG#6!VG>vDfb{Q! zL3;K-zY^OVq;tt&SL;{FezJ<$#I1oaFkPLRT%Qm=vCACYq>0<_)kQ@y*KpD-wyjS(#Y@Dv;=DC=3?yyjc`FK zeMtvl5Z${*DIglLAtrD=a8d(8RbUdY+2CeH{c(9y`NP{u+-S9x}Cn9h!svT%%EtHD+-Sh87&$Q3Ey*Z^P)59CiX}g*vutcc_}eU>pIh0Qav4 z+BY3cSx9EdvW2BtNL7Z0lSPuQFRMF>9Rm`Xu7vdpsCRU{P@YPQel05kSJT|aOOK3@ zV@^nNxF>WfO8{3=m^5b>jjCbiIBxX*Yl!l&EPafa-|vOpS zwc;6QXD#b*<7P@)ufstzZ0V!4zhO{q2;zJ%V{~qNR85ZfmKHe5ZFOi9QLQZMle`N! z%8EC}I#L^j!C=5?m}ECjXAQh4v8wR%jc72s!0>%7*-w>U{t8 zK~oJTm}0ln`-$Vyu7fffx^&(^5@m%c>HYM0`|^3Db1Id((T|Ocznppn?Be=g6Kfoa`%Gw(}Mmi!5%L^p@^spJ;yjt znC64WVPb9aYd1wnQlUQRO+tl4~jXkdzbVkU@MtXmgCLU%BV zq$znT5X^*y;N3!Xeir! zs7Wky6+@di!MP=jj@FLBXh0-ecr<)xVmfD>xu<pSnp(WC@qDD z3!ph`w`MLj&;l??b7Fpe<(u>{bh>PKHqq+ro2XGxN`BfFjj+Z1T>k1=DT%?9$p&_< zrE7^UYaik+(YSTgP0K-rcPa_xYwN+#%Hb{59R4 zR40FBKb6eZelGMVeHhpxR6ECDOd!av2&v3C&TjJv-TOytCYkVD z`O=z;b7ACZ1c#+aXfNm%CvT#}6phZy#hh{q4}|!NFlLAoDeZ<-0SYoJ`ty&5>o0`q zNF-rP4GxnT2M-C6ajs4*F3d)!ReTv&8p*0(!?j16sdQr)BB*YL7}*i4VYkDfnfN-H zNf*-VX+9%j^03SIX2yWos20XdD*Gp!O+ zTNYdOv#ny9X=}b zb1Vmw;ykbB^PUOXtyrN7Cue`{j(wJzD1rsaGKn8S(Tt?D6S`b?yNp~IVmlk8zq8%8 zz{4tXvG3D+_%<0i@PpVdUs83*Zp<45Iv2VZ^xQ*mZ*aCL{lRzk3~hxl`e0U@$3WqL zPGoe3fu2FYZezIQB6)G7hz$PT`!O9c^IC~n07%Dh;Jqk_9qN17K1Q1D7QU~b_U2f1 zBuY141qoPol8Mm8s5n_kriq1*lRPGMGgxC-6Q{`6lWRPh^8w{WR;$;gyxl5^0_cs= zB4;1l!Y`~gXb&q8-R=!^JUmw$s(5Qv;61&9(w+7i-wMq8*r^E2GJ$&bN`XwJ)%oMw znqU)=prLwzFZmPga?gI}gVfsHPMa{NdHyY#CWcaM8 zA$?OU7kIoVh>+q%D{Q_gmX>*lVuZo#a;Sgg&O6Kj&)MA%4Wwce=x{P5?dxlNPF!XZ zMZxn}CI_;}g565!tB18pLlvw_IH7 z#?{lsAfl|$x#!Lc!@&O}=!d_uxD9YUD&8%~70cG!dG$Qsx+r#q1@G zZf!-_E~29L1;bdjwP*m7$ow^O9q=M;wW_EyV#N|1{ubFD;NI^L+*>$?z;GMDj2Pw<)>FGspX&@s`cNW;jr5&`$o*Rv2NqdeGkI z!c}iu3g8=tJKTM1LBvJX{(DDyS;BlD(7A907;)ucfLtr1pI>MZyErSzT%t<1$GJ3nEN>oMcw;;CXg@Uz?_V zz232!A$?{>5Q#*g?|s=Dn@fW$Zx*U4y@zCJaBf>BOSk1)e5DGJ(qj9!-`ow}6pSC% zo=ZJ^M{cC6+ipehs#(XY?AJtpRY_2~YB3J@gDAeSEPkH(0gO(?)q6wm>U`ltq7&8) zs1z!Bw|-<#GqGD;KY8KcC7adN78WvlOHGNiS=n6tU!*IKo4aKUAHss=+|41?TOAnI z=raeQGr%^osM!Y}<}=9-;wl#clv6P`=7S9;F?WeGmZJ2nU;&nMTsoB^GE%ObO;zw9 z&g!R==ga#Yy=Zh!ES9iNTUp;0yu}#88fZM1=D;NYIDP1L47jLUX)m{qH%R_gX^BA- z6r-|1bikrK>Gc=7hD>m6G>>x|on8T~zB% zy3KDRAbt-O!8_o7(Ifc@X*5J!VlvwiJzrYij2{G})OZ&-u@q4EWOeQ}){Qtr-r%kt ze0wHtX++}IlK^i*^6qo=bzSd~rIH81Wxf{8jbge7cHl^Nn zquDW8;igod8F`L9Q_{8fhaU@g3tq=hN==*4(nB)w7&BJdP#0=+8WQNd`yueD!pwy= zQKL`EK-WmH;NmM5xgHh5cFCiy`Ta>O$HaAMcyO!cO{Rm-?pf924+jou86rOpHB;g< zyO~c5L$(Ui*0ft=sT7W#TZKy4c!Aw#NdaW29x)fPlKkflkJjcJiOT9&rZ$JTdKm~d ze_Tr&;N|%i(+52o*CzB??X&?P7*4O_V1tH_&2e1T^l{i>tKKi;BV6oh8*t!UGrx!C z4Xmm*O19`zk!AJARv#_W^Tqgi{fj_4I|jKkuZW~w`kf#g++y!$AxZw$IhR&~XG9z+ z;pKj|`yX-J;yvlTfVrR%mt%mysF*zr}=2y83NbF=Br z{9&DdLQoP8ixyZGsZ_`|0x?3S54Xh2@MVoyU=5Wv51ER{s=;X3@JCQ@Zgr^oV5E*Nws*jc_iVJf<4SGDq9 zK*6sGqum`l!D#vX1Gl8n-Saw|w5F4w3u(s1!xpa5;v9A>yJLpfh|llR z{OauI=ia74Tcd01yKZXTu5I^`c6ajP+R~F_5qr-@(|D12X<5sxzxK2R@;AB>9!r&R z3Qdb;&~?wUv+I*_LuW=;MYE;VEv%QH-*;qfChTDE>hAUxU-w3Uk9RpTKygy&NSM7s ztoUszu(4RZ&JY@wQoTLv0UY)3v@I9rr($O(3SobzzTLDz|JD}`z{==rr1X~9ws$C| z+j$4XgkeJ5{{y6MJIvk6?#tmmS;^*zi>&URX0?;zS*TX`)AfUdS#|_Ct09Qdq~-_D z=sGwq5UaPs4^S)k3W+0Z5Wh&*|x(64h?I6T?*eCAvi(DgA}J+@4%sCcZPE{cAb z-)(({L~_bh8~Y)@sdeY~C$yi2dh3Nqy`7Z-Co0C!7k`B~XcXm%tFwc0c1^W`I-bU+ zmyE3gY^km|(>O9WI5hfc(l)Aqu(r#kRMCo+Yu0&8?&pDZ5Qd@>JvfSBRm@o1z7zfP zUC*+@;#=KJY(mBfmQKW+&MrV`g{hz*oXMyw7&nf~Nt7uV4~|2ehg1jjr{UM1nH|7I zhP0rw-9#=}f85~w!0ew_$hpFm|7EfoMV+>Z`E@>@$-~Pww`uHCGdVTB`8a7aTZao# z1!ICa59E$Xj+;(9)tsQfk!55YT$j>~7?Vz;Pa7DbhOad?Oy|6sHqj>RzR0?it@Fb` zuiTALZ5OvXUOL1Qo<7&|r5RD#zOpRZir4{slh;`5Y~^TDzw5rDWGJ6(aCj4Dea<0p zBNRv`wE-a=NF)35Vt5BhP;6fqY~8t4A=)-MRGG-o=X!fYS7ZrJ29SI zdQL+lT)tjJ;`!d@3+57qP#q3807=4aP+8X6^kig5n9<=S(`%4%I!Lt80Q40} zg5qrp$`rALs8R*=fs3p^va@1Z2S{7|25O{+LJ{EM>&uI&f$JDC%EcB|S<7sZHYmarCbe=Z#*l6U(IX1Vg^2!i}9WHK?X=)_U-zdW-<@wwMn z{k1P*0R4{1^9|UnSkLm;?!krWl3LmYue{?|Es8S!bg z%lIqs)+M|#`!U?|)KvibTw#j)Ij2OYTeMajPkzD|g-9+Wlqz6@GCyC(^!lDs6~A4m zcyce}$$AuZj#En6m<{6kY7OBUDeUX=bYMe2Vp4b`oI-E{*;yQCK?_`VP9^d&FY7x7rga{cj_^b@eh>haK-QROK;}a6K zHSiB5k7H7i9)o~$5-ICyd1g^Ilgafk?I?=k^zZJmLoNY*hC(l#X{=td*<#UsX><2+ zFuD1|u6XlD^`+u4`$XDvR~QOZt*%Ktxe_fWdH~wTeG(_vY=P4utzM#>zyzgSNnClm zK3M5Dpdbs6@)EBf@N@WsZF-+nqm9OkMUL@YDa>IJP8dGR0!a1zL2|D3ZX;>fuBZ?~ z5TSnXEI(9Gd17{vQrO$f#rKo5_AcA47}gmAUp8!y`~Fv{`K*@o1jV0a{wOv z@QtLAT`bUUO~LW4EXHOFInG}v%>Y&6Fp~cVDs8hEYIEENm6qg;DTLt9wR0f3pKHg> z?IUI`m1-ZH5qJBD-+n1|m7O>H;St(^Vl|^MI$cpp>dOa^Krc zbBlKabNYw`_4};1^sdPbT-W3acxf2nKLuER>x%z}bYx~^`>*I$W;U+>_x!&ZFl_(I zbN%1+#+2qx)B!t^@611XgIG7lR}%>&0yT{Q?{PhZKbfEQYP)&ld*Q{};_E$@RL1qP zKDli|AysyNH3!>=Wrw4XwCX#>a%$_FW&PZW*vqRnvT}7i^N$15Rn97C1Ft+BdQv(v z6{n|`%Wl?ne*Hc(I5I;>;MUo>a@ATIdG$P^{~kC=g(eT!t2fR_|M&n*z4|_cI)fymPOHG555$~rg|jHxgXu%g{xp?! znr~uPTHvk`%>O1QiQ6z>%VZjB73 ztKJW%vQ>9_qIR}L|G`0{W+3@6PFpQ}IK{^GtBE`c#b}8D29|!G7cbR$b`p=2liPln zjuHvsqEZkzvCjcJ5|ie!gbaAhxZmLXs<%3V+@+VCX(h^{d%J}^@xVbgFg{+zs({LN zXg&jG306byp`H2Z$cr*xDDih?`W7&J(QOJ=JX|c(U;#pm)l>YlU{XiAhvZzYT|};_ zbGY7GyD^eWdR*>;wXG?E>d=hEUzmC{zkCRf*wTu0tGJts)aF@z{FdKJvF+$>ffxq@ zDP2dN_4AKt0jp585O{O_9{$jM0pJ=@{Cl$k56T9EJU-L+$O&1o$W)fxd0$<6{nKZ! z%mug8D#%C5LQ;_i>ER$K+kR9WO_qi z(4NEWA4+^|%%T>pOM*sK(ydOE$27rqLWRjuY&K%Y8zD7e5mKC{8jf1TTc6hOL;$BC zl%h29hi08iicI#`L;_h2xo3wcR?p%XUM~7pq@b=lKh4)EZ8LWZ`5%qKN**3Vmt%;# z-|FNA&|7LjBYKw9nVysF_4|Y+^&GU(r`@~;DudIe4XGR|B(&oPB*RiWMMPE(4#cKx zFFcn?3M;g!C0Z#YkZ$~-UZjR8GftntEP-6f-Ao?X16vJ(OqSkmzzYdE^PYWL#Fo(@ zYG1c&AMsU0MEjTyL2skBs0qE6uF3P4Os$MorOWd82B^;85(A%;%8^Tm4o@vWPKI5x z1lKyWmTon>k8lyn*j_N;SjOsQB^uJ!V0PMGVu|)%IDcL`ZF(Z0-OfzG4EzGT6=M~< zxJ<4Khbqf)1Z%z}BQy_8EtMMTDKr@d_b|5zc=HCYx#-BC)hRZq_BkGclR9b=AA)!} zJcsyn8+Ap4RU`1BB(564DucgET!53B^ZoxnlqWHUY0R=bo9ya}$5PX08S7eEmN-=2 zTRY_wm6(%GWcgH71&eQvgOiJIZ?So*rg}7Iod2|Ayh68DlNcQ96t6|8s+vLGSv&7f z5aUU3ILW`SwWMtc%^Bz0%{yr3i7u;i6rr^r&To$|fA?w;XY?HYZhaHWI!nW5diO4_ zdYitxK21AGyg$gbaJoesWiL$KIEP@?Fl+5 zmQm%7`H6q&MO-rn@1U|vvN`;+g)Rcd?+giSnH}{-GAh!hLK}h!4C1!K4n6|;IJ`ae zc>+*tEoP+%*Ix6G7V-CK5FXW$23@#5vS&7>B=Z1c>?2*b@JTwycK^{9WjCIw)muDY zlp1JGPOlp;)J_!+TXsYZ5fkN*oKBC{Ab`z@H2y~|`jjR#t`^}5>%tYbTocg6wNv_g zzAr5Pe&O&q$2DTVrse<;)dX90BkaSq5aE`TQJUY@w6;Jm_H&M&gb~&bJn3i6(jJ0& z&bs6US7j?`^-xG3xO&G&O4G)@3zPQxI?c8pFJ-px;2 z5Lfy&%xmqzr3AJ!2s66mgV{yhEKez}VV$F+veuBr`yQ|-$6Psog@?;ey>bZz^#ITL zMMLrK%pNRu<66iXieo!~?n~t3VT%xvOSN8(_dyQ3rRRxy65sP=j*`-0Dg}FdmgZo_ z*rSt%WjT7K;IXphQ6jO~?_bP#BRs6v29Q6sk+$td5%B-+J8s+kk?(%NM?C+L zBJXnlqpY>9i}7hdp@)VL{6mMo0@uIM8@8Mqc&{R!efI7sK*Ek`m$Xa^v;Y7%X;rZ?R?i(W8x;}X;5 z=jcmOw>@H@a5xm|T$y!!3%GbZ9w<1tmnHlDdH8w|;l7-~J7|I(+=8QZLmKbEdy0bH zkpfD;&SY#rulI-bAZSEjX^M6l$kdrq+4!GLn-zxJOVLc&)d3a$CD`?%`4&k7RANcu zw;nfhq&Hyp(sO9?%LM|$3&VqB&rIMHx?!mM8~IXZO7?*yN;tf)%X$#{2Da`wYCVQjYV+GIwcxF$1sS3;>82QiET{yb@(d? zj6Kh$m$E5qQO8K`@~2fyH9={8O4E{pTBxM73GisVEA#61kXa1@--RlEq+CE$Jz*X+ z-MSxZ3D$?_3PO0vtC5i1*$DutsoM^()Ai357Ll5JO_@s7NwB6AUum^1FNK+%{snK^ z^wZ%|j+#&2dB5YdmC?$gA;8eX*a!ODt~ymr1HMM*iSTS zJY-H{YU3Vt+{P6#1#b0=#1I%lWQlfi5>FkG>=ck+35DK5JADZE<5GuB6#T1PRTugk z7T;k)bD`kM@zd}NAT1phEeTp3;*ae=LH(G1TmV9!-VM)X!=wJF$OVvZGj*O0V87;> zqfHhGT+9a}aH@5nezFdjxT}V zJ9N7X4xzD(Ej3);LxpRR$}#Cs_V&cb3>GJts(Joo2ZvjUsN{>GPmcoGEpSo9gb99T z@o8s$YbFKV+oF&Ptv#2)eV^~D`Nb3-s8_`r1ms(+bU_m0JZPQJKnvAE3Ul@*pGcYi z&GyETynSrfR4wvlZc=mgElk2u=x|;(5KGaC>}MM@bI^%Jii8Pi)x`uLWA-@dCS%u3 zIuEtFUIj0@VMATdD`wTr3SEN|MJ~z#b!6)a5?6!35c4W=_cb~vw~I=9U<15a$|B5M zVl>dXwthj0L&0Kcq|=2@Xr9Bdx3DId1$Kb6OCeTYBTFiL2&zqt^8olL2`x5VedRnL z;K|SI?2r~OsDD3$zb?X>gl6af!A=ys7HFc$!tTHX83nzVg`MVK!+}OAq!H{0o%fbckWdm!<7P-3qgcjmk zdyLt4vbsqrC>T3mKx&pLj7*Wu$EMPNgIP}Lp#MI*yyu|1Z}WFzM$i+LJ-!v|0T&hFHk4a*$2FWR9h#q5@6FH?_!Cz_`i$Fsy+I~91Mf2qdAu})#m!N;I)vngczX!e?OWJHiJlN7;n6UGIcow z3(gv&f8Md$kdiHB)+#P`HtHg3j>cw*RzFW;YTwVZJ5bkYPJ`o6PjEducDWzz|A0CgSQgZx@uDm4gE?p~dl_8F8V zt!=-ja-%xL8|tqX7^dJWurL<{ui@bIg8_*wb>(p{SHfo1m(dr2M91O_*dk6maiYic*^1uXpNJ4;Jz)PyRQy{f{39xu8CjVB%M{@F z*R{p}Fa!dw31U~{{SlB1Mo z_w3`2TFXdnVft1(d$1r?5eEZ}#=Oy40&i8olV0V;*1iBJFuk#?orWJ5-YxI6|_hjkUc+NR~ z^IK!5OH(g*5oh)7*msbV$KRBWry&*}t8VM>@w19wqvshJ;mx(3K#$K`Xd|I5p`D(< zw(kr47k{_kGg>lmakSH#|IhPawdaMAa0^TK3G0 zJ$V*k-akw|r>h~{5E9t#bPLO066pDPx5;epCUXQM$0X+tz6L6;wCLp9+J8diq3Pw9 zWQ)ekS1A-0)3khX$fU8fjiLE!95U_|IeBHH`N#oL;RvpaKQ{i!|3OUZQG6?mbY_8+ zFL`Y;R_AVk3D?JI&nb+ESIdT)Hx~dq#pq<8I6Dd>H)}J|x84RH;6jXBhq8+_58(#& zxatJeh9lA!Q0sz(HM{GN>c9n?Y+;PQV7S!*2=`#n0$+3t`&&2KpW(=6MrxQW)2C_> zdWKTiX6_8Fh=gSXisIw0t*v`}9<>CnqMzQ9iiMd&3;NR4_vD@YQ8|J}ohzHDr;fpU z(};A>4U66XU}#k|sCAJ=W=){%Mb~>3 z^FCkGgBPduA0$G|Dr-BhXZTKbTX&W248HS)LQeqsr17g^>lGttmL+QwEy3wojMA!CRys+_W5VuP9&;aX1d_|@N$YsC2$81zRqXb)#V$4fiJrb%sPy4f_0K`jM zrh;6_7T8}FV;XkUWN$tuUsN=x78hNZb;BAO`t!gRMi1mAO6j}ME23-vMtzd8M98Gs zfcC5)R7b>j%v|0e7of2mkS5WU#g7>^V7eTsNlT;D&1&)Y&$Qc|;xq4z z-e%7~3+35?+TBKcEM=Fw8F52o88b|s7!g9UYhOD&dJEfoq!+MzOQI4j_BX-dPJ3_6 z*???HKTrLR;+KXtvdYF5%hTfm8q0A}uEkpJyCb}mk@-B*I5WI2$5S|)a=EN&gMr3Y zY>l~%7U@C(MgNI#DKe(17*NwA+O0dMqAry!EEE=?I4wRKA(Ddf8H2&tZfkS2AV+$s z2Mgg17*y`Pv15qe_o(qhJy}1RRh_ml^^*C*I+;Cf+%P=oE0?9%#(yNO#a@ys?qsnE zQwW%HVFp`}tb$}+F#^L;dWAf{4F&uz^rx#kamkp05>=?2FAFp$g5K8Uh&SWo=Q~B! zoCI{Txn720VCM9+1B|!cCje@G5@b#yeEBAYIbz7-d>$J%N=&k?bHl53Jjmb0ZkjNo zbY3Z#IIu_y1lrg_VvossFTolgJL@TlC_VXCL%KaGlLT`)&@yOMlvDn1f=8&eSn(AU zr(E$LLyp&!$JA0KR%^=kR71$d*C%p5E#Z=dY#El9?zl!1bPmJ4+?#8=n{^|-a*`$R zi8is1>uofBo#TeUQNdI4>$+T09quRoC~Y5B^)x3i5$0>7k==#wJgw5&ojR!Yt&Okg zgTPGLCE$N*e(Z}df)8N#;t@JYVQ+Do;*^j}`rMj}Pn|WB zS7KPRa3T(AFWv{&^3s+*%I3kHHz{6Lr_G zpm!D5MAbkHiaX68+Rn$&qHbyQ5f@iZr;L225hjI)o`nKF8JiF2gMhRlw{;KiGCLLw z*q!q-Mn0_vaK!nMrzJEmg+*mDrI#t5(9UZ$7-nd?R2@$H{E0a5)7>8%_zFu&=8D?xYFW1+S}QKdbdLNJ5YC zXEu6l=dNQnOKD&~A!x}&lKIs_Z?x4Uj+Z0r9tE2Ny(6$|DK^AFDO2I^XX2JZ4@sN% zNe>4MVsu0keKiD7iV^;%Ig`V451m}3Jf)I|MRouX@eG^Lu!)6#(XZ(g{qQk2Oc(8B zs8P?T2%uIIa()_*Y#HEGZ%ePE(ORBfJ}#@RcbNr)z1b6~Glq+w@iG64dH?bmB)oj7llr8u$`Rk`OOwM((7 zMX`naWJ)hZLmKwLEMF!?{WXoDKhU#xiwi2e2;^Jn*`sL#>DZ$~+2KSQ|KK&;uA%;5 zF+zAgM4z%aIDuT^X40+s0{*MqNb;Z5#lHo^ztsine;ZkF{-*;^&i~VaXSIfw z)qyzL_s9b2v0C3`dJ}wD|3a~&Zq^3ghth{}i}WhdxRqQ6@Ze=Cjx%WbU%^ z>E-)*@7%kw)m`gn4b!kgnE7e?-p*?qTN+bvs)wwjTEOW;d(Eu^L?wsFGasLd7v49M z!8j1G%S3_FyFzp)EwlLfXtD6kO%Jq33M?ctb1xV%qB8_GFF=wB+xgm!$I(=a)d&vx+VZ2vCt&dtImw_A!q+1C{>fXA6zvq!6iQ5K=-i*8Fu0Qp7Zo zJ1H4NIE+!DZ1ODtd4^50U=o;IGbAqo?arTk%I0E1oMH|gELaI-WygTpIoLD>d;q>* zdSbCV4MQ2SPftW~-JuSa(+0YRM;268nYWe%M9WAA3+AVN0^GYTfA#M1F3Qu43#EZZ z_QI{b4GX{1SvtmOLj$v}5s}NfM_VXcOf^U2hiLb=V?wTa0u7}`Nx@Qj0R^R2xLl8J z1_h;>jZer`TCC1vKNtKdhyOhBZWC55WAK?V2Nec;`7{qj=3G*@wQC>|3yM|IMo0w= zwik`$h7p2mlWya9z>MaqSc>8fv>J|Y{`X^h7Z>P_e`_M3|XTRk0 z{oUL5^#y-gDs7~8=9!_^mp(@RCQH9(QV7K9kWJa?%l`B2G4hu{Hp9ut#Op-vOE-Ww z;HNTgWkuriZ|iWlG_Q^yVSJbNdUZdXdrf#0Z|>wFgMYz=!75n3SJ~O z{@WG7;PQ^`S~EqbR~=V05p}mZABo?W$<3ZFmCp33ffLldHaDstkX8HESXH{L)7tVosOPsJ%ic7}!6S@fjL9)A@&cx4!}{<#R;q<1 zXhMS!?06C^&gS@o?Cj;i!9F9IxI~cj*9;?m4Pa(>w?&}}YTU6Sh}r6_L~}b*d6&zR zX${(-NHf_JeXXU}T4P50BHE|szCQigbFXpPanwuo2#JO^F26e64aF!aqbYaV%Td_z zcHQ1ZOBMgLuBo*gG){&eotyNPqn0c+G@61m7p7V99?(^s(-M(P0m4pfO~2K8C}Efy z?Lx=`N|fd3(^&A(R-mLAg68u#!_46i%6FQt9jnh+ym&l0Qxie$^x|`~?v_rEd?>}m zR>~kJnRRI~GrP=2*L~M883Cc02#Vj6trb%xG*>C7ZEf;{omn$OOpeAijU`>R12TjQ zKz!fE?hzv?8_A?GGNs_s6!lu{ul<&>J>vXK_JKL8f{jxpu5~{sf>H{Py?M3X=sM+} zW^7JG3#Y%}C;M2WO*roesov_iKZm%;33wF5zn>)RLy~k3g5rnV< zt}eK*9D%D?#7N?aj2B*UZ8`o2_Fvuf$x?MfvbS$*a;#b zq2Jg0J!Jpq`^)>w+3Q`aU*E~a3Il@!vz#n>n?obK*V##uZ%^+QjT6$dHTSJo%^oCb z7>~z{9OR1w-)6sB_s92P|1OV-1eH6;3|G>6uPaxZf@@Vh%BIM$`17H4E@!{*pE2l; zRbq>MBKzHy$2TH2NFW41zZU|Vo4g$WQlZ78;TR?!tUi*4Ko=G6B;0zJJ$x|K+0x61lPA(}54KfAq^2E-nq`bt( zH}dSV7P+R?s1`XvTs(gHx-ML{d`#B-SKZ!b@{;$!5uMdi@{Jb^hIq97+Ix@%aqZEM zS<$Q@#4eJqM_BVg?|1k)Q>bjM!stH)53(-^vffW+&lSU%1!F1C{`F$&DW|H564K1( zC1^GU=3{VSU+nr@S*W9Mhs`At%{MgFcT9z7MDRl4kS5UCJ-hkN-DD&V$9&x`vex|MP95P^T-1kD?BsP_qL5aHXdd5e4lFidgLCHqc+c)+Og*Fav?*WBxnl?`@e~rraN9eoS9d5@FRySlBzGGfW+aw+}WKk6s#(DHuMWS=QpA_6?@ChafZ7PHKF#i_2 zKUjJG0`KGhynnBaR_D>Pr2i|TL$91~zcxE|$hq9$(m-v!gER`K&Ur||2-VNfLRtYI zxQUdW2WC`_A2L5(IV+MIR62r+&O#65E|v(KkS`cnF~l5H8E^BUPKcF|$3KE9z`R^5 zb&E#g5zE!6>@>wr>@*8Qo>8>Nhr-lZk$`C~!~9147U=hpA!GUdjoI2#L}PW*e3n0+ z3ro-}LaJ~fHH_S?%x)W7Vn)x%_3Vi8iIb41cuXbegrL&-m@tx9LoYZ}uKt)w=IVfS z3mxT;vI!elzvH6KHPp1dS$XsoJwSa%BKd7?Wh5H9(eV&+M;%<>A! zmJxkfyjXNXu$O23j=_t}9Ev78brdwWLNTAmsyGDyJqYAs*)ZL%xdy|10Lnl=l$mvB zLwe}+rUpxn+Il$UqL((55WzE`j|C1|ge{Y$-Ju&4Fg*<%O1o{mq^ar}{6)hUFGV{b zSmgx{k+BGlm7G3UM;kjWnaJ@6xFj_(&_l?^&D9253julsrH-Ay4P|WI&2HpwV%>MN z4DPD{E}mUED1Tzl@_oQaCmrcl$8&?6-x;;9J9&tSYYJNZ|1H>m74wv4#; z@l;*u5gy6duY<)OUig{$9FRCt5E*&!q?|YjsvH-Yv3%R@vvBR+Hi-|K0F2=>Ut~7r z1O+wtc>YJNpqf#}s*ti{YA)qG+4hf(ynL6aE+1QB6@i>GbdWGA0e<$hFF)ZkQuUGyA zDjEHw|DOC}MBRrRL8l2?qc0!pFYFnw;3Ue$bF3JINOVNKXQ8PnM|d3upk{1Q2C*lvuVz8yRxe1Q4X3$2jUq3LJfc)n4GCA*tO+iJ|%Q!1v{&r;5D> z-Zty5JDG9ZE+BRsi6Ni{w463!YwR3K#Q}pD#CU#CKZP5~bXEYysV+Iw5ej{DXIu#F z(RAxxHS*syhb>N5X)f_`g6}#y6W5+{{A@>`x*I7QqX!uq+9HGw*s z0}F;iKN66&q*TXhPqW4&xzmn}Rc#$S^78&nB`rF)9NJNj+V?1|8IP54=&#bx5Hn6* z=d!hPtvg?1SFsK6BfNydB1aKucc@JS$(Ye)n6!5WTnK-MrtOy}AH3!}En#IVmoZ*E zh=|(ESYSJ+OpHfSg6O5%hy8zyy<>2t@4D?B+qP}Y*tV^XZCf4NwrxA<*tR?Auw(mV z{nuM(@3;1~R9$e`mi@pDZ=-U*+I)jv|Pyt5S(vyAi2CF={vd!4G@6 zMU{T$OyI5kq33tYpb6y*%@V!A~opWa+2givrjdFZ9{PqP4qCZey|0LL;_ro+Np8)WLSrw=1so*z1)%;MuBV<)y-~)^1jiEBA1e?qDn%A3@r4gFja>65Y72no&9)F+z zduRfo{PAMe-Ra`hwfoo2ps_0TD6qyxbI$5`&rBXi@#X?NvrcP4@cky+W`NLsf2(z` z;r5DeSW|P+L|)l7N7^S{!lRubqEA=o!OW-ZuQ*?nL(|JU@=JbN+H99h>g`Xbx9+uz zfaf99Jcq$@)f_9o_nFIuPN?_W?t*EafY$jXO|p zLO}dPkLDsfKt|TNM8=P?_uJ#lm&)oDR1fOiuy}1K?Oj-F`1X!lp(2G}3{jkDr83oz z8=gBzj!)nT!y}D={n~S0bY43l<3B2fZ#Niqb3BHG+cAlC@D{KXb92QD_ttXO;N z`@tL${_u85j znJ^r(0$4crM9ud!K{0<`F4ylf{~DmkpTg9~ZRJ#{bed~-(P?wn|C{R<(#RH(OH~PmS)t#zkas@8n}~jMTC(!T!Ylx#MJ*_WA0DDx z8nqiG_rrNl^uBN##*vy+=}_Re=s;MZb33iHKETu%)5n(2g#@HT&W->>*@{FjJ}UC> zD~wh6bCpE>>1lSR3xA4ee_{1y;xl`2&`|Y3e;7=?aNSZ_?>ws95e7<>fGOzdY=kXd zm5IatD?YWi{^(nwC*x(CwV~_c1*k*({^l;;nFlgSc1g&I@GOsJ$;s`4Q@uOnlZwTI zSTzF(hihrhc%-Z-M)#0D+u?M`>0I)u-01Xo*XNDUL7IUmEdfm~GqzY)rWi|C8_OA> zqDT{(n1(iTS0TLj&?6xm6(xMf^5Ff3hdLcuAjC{oK^eQllkMAMDMunG+vJp%rSRr0C1CL- z$&Al)J@G;*^$|rV6|oFTy11aOk5re8P{H_s>Mh=$^Q(=G&vSNqhgd6idnukD@1C7; zz#-!!&QEZShI9qVq-ZF-Z3doxxV<>owvI?Dn(2sz_!-ln{PMWNbSQs zv0Zhpd6l)*QS2BSfH~{+=79_D_mWGJ-&+F7c8>?tdfY_o#Plr-vbDHgphKJYekr0N zXr6U7qRfECZZVF|UIIwUNeq5n@@|vgYxmJg$6>-NQWh}BlLMCrMD#dG06k`T&IMmOphlAj_`$G4C z9%F{g;X2y!D4J^tXpk(W;e+K9jdPbwo=Byuro*iEE)1t-)8m?!IF3lN|LbA-cHc}I zkDMvxBxbQ>ar9f!$MHppUQR(SarC6ERW!Vg=w?q$%2KS@_>Yq~ue00USn8ofbt zjZ5g7m?%SCRZU%ZQ045_L+BtP{;gs>EjYr+fsk>Z%Dhx`jy*=t@tda((JCd}AKkMp zK%Es}qV<^X%F0w_+(|nPGxlKI5_r5KnnjXTfH~)@$dow{IlkO4KZwbQ1~vQafzZ05 zZw$xdzE<~|@A$z++O)uuicQ~t@Jj!m{rSf$eeY2GmsetD{-42Btjx^+o8YQ%et7KW zH$VJI1L`}}z}piO91G$wDiQ)}ZW6?o>eax-eGzP3u5&y8V%J?V5>ts(+D$oMjJ=gy zhV}4zDq}EVJXGDk)^6iCtqt*5U%&F>eDLfkQq@Exy%wz`tF%;YyZ!0-ZCOEIL!k;) z*VXy;{QddnU+B3mjz=b*JsQf8sTGrk zZC`XPpSnHtG`V;CbNYLI-J+B3=H$)V=gt!P2hDDWm0@1}G-AL~TM657I1b@q6tEB3 zXrQ-rcab6QMrzf$qxT3&vug{jv%2ePG`~=L^fKgcxyIKOYT;4+7@+R3vYqZ99oaA% z334^QGVwZAAaJwxPjxuh+Md&oiUo?blz}ek(znwmC!P?Vp%AGBtW%Ml;FUTU&b_$I zscqY2eo4*MNX_Rd9VN1Jo^H=V>dHduHo{MW%EuNLu@U7U!|+1{&eF+Dv6z}zXnQVZ zQ^9-<+}|ubsD?ZwyO1_L6vJQmG{2s#2V|)QjtM7c!0o=3H~DRE|0H9!pSqc6DEhD< z7K-Q^t_Im^cs%ZryOe9My4xQbUYaS#SNln9jX!76-N*#PV}&SXz8y4*-!)z=iNFd- z15w}VQ5A}xQv2v%;SJa#?BayN$@PQW;hbxMmqj}v}cXnJB9;BB@))M%3Wu8 zQ{wwb6h5&QdKfE41iKLLgl{hof=vGjud(G~6!$^i8SpV@k-UI(T0o$Yf)c3sD_ume zpWjlIb)xlXcIaF1-QTucVW>{^@)0MbU|;E&MY(XAU-+$fWOOh@Pbd^WJe+qe(_%EQJK;On9nA zqh?*=L)U=lhc?3C0sS6CQzPXhqGPIFuV+#PRnGMm`jseRlb!;)WZptU5Of7U#t;xP6c{xD<~|c;`L>enO8YyikB~~>Y$m8O#}p&8VH0QCLA?2 zhzUMGl4!QrL#{+?B9kdi#=R4xtG!1e3gOBTUS~7dTFn1M&giByvb^AZOn0%G4e~Tw zJj>1E2V@jD#eiAYfPcvTQ!C`aDP3P&yuoKBq}Ft$=uAu;x3Ug~YsZ@JJpRQyeOB~L z!x(vCE+<$dGqHYFIN)*kd9SfE;LL(Xc9jd;iYhM@LEC{v0koW?kc|-MbD;!iJ9Kbu z@9JW4`(ts^H=COVAE!wSqnltRi!i+1txAgkY$v`c$bk3Ycc_qZL@HE;0Vg(VR@3hx zhvR*z!DhI<7^bt5xrp>LoRM>GXu|EgFQ?=iytmC-!LGd)tR_I3yp*WS9nec2t$t0->P7J$)oA?X$S<% zK5y5@t6PDy2{}q!Co2&sg)IDHiS1AO2Wz8k&#DzsJEDo zDOwuy^65~@%vhR{Isg%^7Y5xOg0+0i%rD6*2@R`dBZJsFprymT+ZioBCn`+)wLxSV zK^${Z(5Sm2BQSy#(N2Hz{uF4v>VnHb$Ga}K-qd|X7>w-VD1!Y&!OS+IfMD(~!Tf=g zA=N?+%Lm`Bs^bX#p8SXZ(6z{LjL%6riyTQWc$u!+|8^0VROW_a#?xJVp3We!;f$%edLH=z`NTAily0e`>$g} z<-?GNxtYL6F=VSq@1hrV_mPx7h99(WmRWNkI>4rHlUO3yXf1>+7V&94pJaqWW=B>! z*O{y*KYMpXucTK8P#9%xg`(2p33X~mVmH3kTA%?JiEQ~kw*gydsp8jmJP z<%(|bo1k*lzz4ceEzp;0dEg!Vz6j<%DYKgfR4ved?j}`55gjTVB~ad<9|#;mI_3vv z00?*i=_S8@gVI2ZULO93;Z*EZl|K-{kDL7eRw&&dU7H^5_4*_4j@F zFQVB0s|xhJ!D3A+f#kPZhc%`n=%l~62ro_)1CYYNXpHz*-Zu$<j8$H(Ar$ z%L>5~6NDIR6UVZ&wzl%>+$sUS=2KViB3FNBC(qBf;<0XX`3k*aER;!2N}8jyK&@!| z>$vOR#)fpub=l9uhnH{LZ+PtTWqJ2BDJHb{7f@Lj^Wqq%eZ+JCfn_})&vBb=vY#}TG}C}qgm zz%{NW0D;jt58Z)SbX%z$*;>?sjf8^pS?3CiPM%ro!F}+=7Y=*FBecSJo|;byW;1cU zY>E7#(#1c++{VA4t74A$&ZYS_C6|l|f%nDD=jY>(=@ND0@y(^~KBF+X2*ewYUApcg z&$ei{dh^r?uNzGQr0ILVyjz&MHxuJ8frTI`NTrqEhoUVQPdk!OzyJI@SiA+11dAA} zwJj&Dg34?#JvYJU5*iC7O*DdUGM{Y2N1WwE*4v#EK`oYrbx??eJzYbbKj(1Gt`0Mr zm1<=CC@+y(xc#d`-#VsKfDot~51cyq2L@2{PP(!&#w-|64Wmx4s|ZJTyqmhCQgbI2 zX~^}*?(Qvb%P`fU2*6?`HEZb}dX4%=p&k|7B-vr1AFsu6? zL`jgyRLz_N81Tuc6QpLGKJ^QRz%l9=HTCN5pU#xqgAILlq^c_3jI=~iujUoOL>XP3 zAke1WZjML{b`BRvRZ%03saf81cz~k~tbOK_qM4s)=@v<@^kLL{HO{mJq%sZXmvTD~ zN+{JAzkP*E`eQ^!kmcNmNYHMuu|=>~2BeU+1kPS(H7{{614>Mu zU{M65AA>_#GnQ?#=V76Btr86`fl3grt@m0&^ntIG@^f%5E%sA9>mb}q9isO=5P~6C zcv*>$^Owq(Ow7~SO;vS_wV&649h{zR#|$Adv19Ll)L4XCnP)%`t^-W$^$*3Sf(smG zp|P9XM||<-d)~5*FJ~cvM#Htyg&ARiHvHhv2^&1PfqZu7S(KS012If6g^y^TxH)NKZPE za$ky`15Tn+SQCL?ut;-_Q7bKA1j!=|xtXPhTfV+oupf=+fs0x4vqaCv$ao~9Uxeg> zVA18r=A^8~cWYmI|A9!Cl|HYCKCdfe7H;gQGIJ&0ZiKOU9acF~4~v3%poELuBR$oA z7<^~+BA*u1|1n=CAAd})Q?bkZSAYsVE<`CgN~qQtW)Yy0@s?x^6LmR!gXe&sKhEVc zNO9`p1!xc5VpOT)`w|&|O2ZQ?OrHzg|BR5j%xkyb*~(Mt6`{t-xlE)7Jl(Kv6#!|^rL}D&;wD4t$vbM z@a7o=&fv3NIHLmVE({~J>A48rwHMps3b`7XAfy(x#1R0jBf7GA`J0pv|D_1tA}+8r zAav~Qg;+9zw7`a|p&??oW>jhm+?sj7083+#h!a6K7OE@ROfN4$;n)%@;_=SKOc7@^ zw@3>I60Zk*?!)j%RcrY92cW&vX8WyZxSeC-wVxpxQTye)ykOH>_wJ{!h9b3 z$q@gDMHVihrWl6TFUxiRk7ikUAif$g*)|!4$!|iTJ+IgwQfCWq$u#R(2jC3^(+_M) zRSl7+>s|Wrenh-{G3 zOTy8Fz?K&X#oEo-sMbLG<~EeNkh)+39{xtL%PVROL{+QE~A58DOqH=jGM$C;J%9DC3C4fYuq>0 zN0NjcSKfafA(uS#>{`>Q$oh{y>K|+L?+Ove ze~nPFvatV82(^Pf)kl;M_UQ0_YMxXuDywO+M?q;%J;riG|EETlE$q zznRRU(}RjxQQ-)IFux@MCp;=~7-byC8dFxI4=JO#u`ILFh|JB|P2YxQYZ3j9_5w#P zthIDm z{9tjkNe$w3OQ@%rx2~5{mn#vgftE4Do|q*Qo3X}?2~~wm4LE_>T&*RD3Wu|kVHT8! zhGH&``h^E%bmGBzK z^mb8^Dvj`GSuPCXeqQOkR$CWL!4dZ5BcM2S$W^!4GturxKvwv}3apJiwqGL*mW4`j z$s`!eBd~zz@KT}BcR&QgF4tepQ?=!0jqzxWb)0E02W-#}*%A;eIuW}Ke}%X_fgNIw z=d1nG$IH_{Gsnh>HAS>@bkG@OW9~d&Lqy#1Fsx+ypK}ng={(GFzd3>yqFd6nTq)>< zem^Bp33M%*vYcKE&}0{B8*9T&hc?GgX#M^}>p@CTMtZXXmEwoxIQ;8XiGFA4y=iFj z60zE&883>mcV<-6{%nWqx9PbVEy2F=v5gRO;7mpIrt8cfitHp*A?)QQaB^9(qC{Z< znm47;qU;qn)u^z(L7xx>2~`WzBN?~cDl-{l+P~$hzHP>uMJQ4@_##y07*9xrHe__A zQWW@Ephqu~YuZtV;w|-{Y^tghst)`r<}g_`Q!(|0c!LN$CoH-mvoveOqD^7zxywi1 z59JMiBVWFs*oM??0?JO03NPR?+F{?tSrNaeX&JkS1vT5@cX2vkU*>c*c{fip`LTlRK)I%(3~B^t-0Lfpsbg}xw{GD8kw z#7kFIr&s&-=<@UaX%zGRB2Qtq>}j@a)_?Ena&a+Ap9XfC?+HqS#CGf!W-C8$KTjQuvX9_d2$8Dy@`1Qy$Dhkv|rp()fi(cSEoqwpBQ3pGl&=-f@Zdlcx67gE1jC>nP72w7!9 zRn&NoA^2Thyhd!!Xw2~a_;ma|kp6mJB<)|_*(6i>dL-H4zjEs@C69sd&TXgQ+Wqyw z98w|0LHC$F5sje+f-~f9cmtZ~c(s9MZ+r4X>ABIxm~AHGOVCeY5SknY znEchaAlT|>J;CxqVJeqS))t3vItT{Lk%DMCYI-vzo(KEq;!GwUiS^u<jbVkjs9f??3ETG*ObABR7ai;YIZp3lMr0`f$WL(C=PkB_Jx1|x> zyGZ!Dt@Ot4TziG6)tK|a=uy0!$ME#GH6lPwSA;$Xyv`voLsm57`tnGxKgX94RP=DB zw`LAD1%H+jm6)x1q)Nhk;T0}3Gfk4_PB?=ZAw?nqTS|HUe z6oD3mxm;iJr_XoSSSg^*BUiX5uFCG7D({FBdF$N&$zc53GyG#Pm;nE9;Q#d*hV|P_ z{Er#!@5BF%!MM=ejQoxo`Bw|-w$(sRO{1y=g7lir#E`g)`H=W<;I9XJ)078$tVm*? z!h={Meahjo84DTl)NrS3&e@qtnJXMMMW3AA(dgpG_T>k)R=1YCpFB|@nrZ^p(9%)* zA-fO3Q____dDwVnUZ>VqulM_X{g*WG*AAiGQ`q9C8+(^$)4N%UpcaEVGujuPfGoyl z1i1L*0LA9!p;;0+)cB)aD3lNU(R+nrK?u2xAaLqtT+)Nv?IY`4J?8YZ$HpnKYCeTfHxWKj#RH_e}VofP>`BI$KEkb1#1q;a!qu&rm26NH<%OCC7 zt`30*mB*v#NP;`rNC7m{gX1_q3#P4V&jMW*gBz__2 z8<1CLUT8JI6vQJr4MS-aEYQhQ)(NWDADx=Kcih985);DNmt4ch(fYALYm1E3v;>md zLL3y9BQn=hzk;Av*MVb{5JAi|W38d*TJMWN-aB|G0jna^T$j>tI?mn@Lh8dqVq|4Y zJpS=5fit>-_(2uBUg}AAX*#w1Y4>zK7~%PGaoPUnu;u$25yznrrUFmeYFphpp^WcH zwfD}nSgOjJp2m4lzzM1*ZwWD(_+>jmy*sh(>mQE$6yTlA*m>8|wG3x4P!amx?#stu zs|1{^R*|>};e>6K)>;}5AG{4%Jfc$!?DpMRQRJTx6y9g) znY$-a)0S*xqot<8F6dWbcT5>~@>S+11g5`&8!Xx-FDug5l8vBceF@I;MYhj=SY^g7 zd3K(!fZ1YOldT%KSi}7l%)|}eKnq_FNvU_$e|3$c9#svlF@3pzZs!5G3GPU+9HhI) z{%}w9?=entHuP-oa?-taJ^zva;kj*Fq$9k=1#nS5ONxZ0gc^Vb(F%FjHcNEZ?;4w7 zz0FyLrXbW}Pn=3rDIAqDldY^;3_I+iIr)A1h$w%5`S~o9blRUAoUwWG!=etV=P>U_ zO2g`JU)+ZK3bWNTr z=3*YTW|d{gzSzErg}lK?BfF#O3e6AtK9JXw(qaj}(M5j8W>=AZUUA@JJqiE}$Y!p^ zanW$Dk(1AJ+gCrJ$010D*ocPl8(tFIUm(1lFnpVNh#iaIFGVL_rQt=V5zvTbH}x%j z3OIKic{&rnFNixrmV%T43y)7S`X`e2@w@@j(|z0V z7V9|m#0jNOvVNjbBp4r(m`^z9&E?v;Fp(v#9}l}&LQ91X;2cgEZ(LL11Rkiaif8_e zw}ek5UIwE|-7*_}^N|*w$585raPNPz!!g{WPDDHZcwmqUuXJ7s(~zPl;F8|5zo2@@ z390|5x97iKi2r(HGPC@*tw&Z?&i@(I^nLih32GYF`ftOI^&4EyNnj&Hn@-=;j>Z3) zc4V5i%Z!&(b{E<7-(_XZj4CeDqDDyW7f(HWIr2Ha&EYa5NAtJ0+nikN3cI^f82hN^Pp!@pzq{nq!!adBU#ZCl{@JNNLiZF4g%j4%#-^Wt&zbMpD> z)~%^;Qx$KuPE(J)vfW!{E4LCv)A6a^6#aZH5E{ZGgs~pgS`#wBos7wcB4cN}XV=9& zO9SEZ`t;`J{bt%dyCtnnpWsS>-_s;Np6dj;`F3vNr;~-Ii14#3S4S;Q*5PUhhQ>;@ zm~re8PE19<8GWV-ups88rME)8S4E)Fj^Os#xVWf!p!|reqc#i)D-m0f(BlYilXk2@b6hy7vRc!JQ=BT9AS(ov8y!XY3{r4{gqKiJ72+gu zCR}iOs4F6|W*Z*Jn9-c^bw>EM@ldC{!S&O2jIwsJWZo?0Q2sF?R;NNM(UFggTsxhc#ybxi5LJ zn{NjQ_bk2}Us7y%^zvCa3-b$U$7B`X6 z^PoEiNRi)YTe_-2t=)AaTUtuTkgCPO2Lhu|NZ6%!Ob;5*KH~-KXgipA;fujapf;5Y z>R-Pu?*!ubYR*)_bpvHN=)XL1%lD=*@ivvpKje1DdqPsJ-z2*vw)!^y(z$cY>C<%W zsU0Se&nA>*HD<eEBhF#4_7*Q8*UY-|-TX_ClftRBi=W4olCm~a zXU3wk2aoc_F3awlQ~YcCk2h`x+j%~gfJ|cgDw2|nut;}r9l4YVn&{GRFK{9EO^IBP zQBZ7|+!{rC%qBKQEaB4%gJ6|qt5%ku2_)dH`4Ok{xRx=ksvRsTyet_f&y_zveuT+I zAQbDw_V=n>2$Dv3IKm8sx`zeRGsP^y6RT2NqAa5W5)+AOundRuS;xteo4UkeZf&@r zB~6yii#{Bnz+}vJPUtwMuM@r+H4t3_4%nciK$1BpgS(5iAUISE5qbUWj`^_g0473~ zrht%q!#8wM^BF{tVe5@OEC@Q^ARjb3W{FK*2+Y!#ZnBoCKjcuAm<^*Z%j#zGa1h6@ z2*pn=_IL|>k{hkXPba#5QGUR*bp_R~MUiu5zTurJHuy=;O3W~}BBzDpcwXHoZ-VH4 zBECt*OONX?(pDu8Xm#kzhiesM+6v=SHo--;db?XDyrz6ai?O9qY95Camr-K6L&9at zTo?iDk7>zivYqw46k?3q#lu@35pq4r8JdZm7kH)N)Vr()dEm80l)q+N!zEo+DqD5O ziC$YbS_iBhtFQj0Aqn$Od|8VgJS2(@Hyes#1V&z z&uwAAZ$7W?@_gn=0i%P;2Hz_IKPtb+s7ryK7fg=V>&sh>t<(2Fc(7#dJh64h7!qp_ zR&8zq@Qag_O+w=a-hj7;3k%5A4Y&~lfFi|oflLRrP%&SSe1Av)7RA}KB8v9yjOoqu zo>OFnZphtZzCBLzmEkTx=cSLKv1g=w4QE}wA}aj`FS%J+&q_pj)yMxr!PR#Fh82VB zl~=KAF&=)GZSeg@Ci9l>AN!|(!CBpjvIbH4k_-R1N{JO9r9fh zo8Cb2l|*3qi=T=~^MIx*CJ-xkHB$-91qOIC7sJcE?z+)Y>^uS^q$TH5Ox$?t)-`+Q0IE;r@}uh11Y~@dq#`TYai;$ZQCtC5^m`or|xw`0*QXD*H4z zHt!a*!WOR-mM{PKJ(v&EsI%J9z$_txyxY2&#rexp|2pD#ZjACLZg zzKIO8XKfS9j|d#ER&8%r?o;&{mbO-QdaG^YWx;5=J~>R{tTghW!d*i{){{0>gByT+ zwMMf7^>lc5S$%I7e6RT;#>JIA)%EV%c>8^v-h6(jlwng%zCsGZ)NY|>&Cq`e>71|gz3XlaR8n&dh06h40!00Fvm)hZ~ zL9H-o0GotM;QNdiyPq^|(i&wTm<_YykB<@4(3!zOM_U4(3>z3&mcS1?Yuh-Ijc`xu z2k~vvMnUER>7C)BDbw`pB*J5DjE^20@QAt7`GhA>2L39e9Kl*dj^mCYJ*r7ss#Hl) zpDa9Sp6!3`-=A)y*1m-;zTCh1ygozn6AHks=tEhSWNnDbkyyMwq+YP^Nh>@d?pA|q zn-1E~pX}wXJh!{X#rV4j49v$x>faQ}UqKmU!{`92@&uP+Z@O|`z*^cL z04f~`3rpkOM+4~BaI|nk6kG6YZR3qlrTTEh8+jukSoC^mxxbKT{(AGsIuNtC-V)=^ z;e^&?k!9e{d)fSbF0;Gk?lisEWF*qG$p6N@F;$xxVqERE-C@W=;1uOII|(WDJG@~F zVtVuqb&gXCj^d^L0SrKF-WW#ijF#D@4ws}0Jjfi*gYDjqW?H*b!$|lGST1jWs65vQXRO{L8>jN9I@q5BjdN6LqD>`$1l?f z{>l>NOT|OM>=$ZN0KwBux<8;D6jCQgglsdr$#4cn3#sN^QZ+($5e1tld1b=QhHRDk zNkT1LAR}4oIKaz8UhwjJFTq3_vvOQ5mipKA3HIdcZ@Gnw+>uTeF}vHSUqXr48ct)& zuET`*p2bE>Nlz?RBf)?2o9CAmcDcrDz2o}6#lb5oR+r5nXG?+%8>d3u$5-QH3wqnv z7{rurA6zD7NmGx3LSKlXNem;cqzwTSYA*SENf}b5=cX$fGgS( zk%WXuiLm!3IR{QBTXDKF2b0`=#g4i5;be<|AoH#T7ebO>_;shp&!A_2Yvgpn;TW-X z5&>L_-4P^p%|vPA)Q60p{~1iwnVzVcJD#}dciFZsLac~|u2x7EKE z;@pQxYM*oWrbUQV>$vMIfZEsPh%YI36+%kXv=`CB5RNQ;DASFn2>V{q4?DD!XGRof zzF@(;nP+Y}7q6BdkmJ7nB3 zhFXUoz_u1Hdo5P)hU77k4e4hogSFv!I;=qo0jb^N~`8Z+JVC3F=X~Pa~`S-Vytu z%O3_`3o3_%RbN0;%Y;V%Nz(qUQvXOAJK(>NI;?CQ|6x>{jpKhes%>kH$AR?e_fL9W z+lr)i4MuEG&t})Rs9C~)D83E=+%l0UE6(R0cir!6m!&(q)~J(_y!9m(Sc{G`GT1B& zUaVc&_<4JKx?V0C)_b<W9yH@8jnNBj}()w|Bs6z2UDLXTcuon8Op5KTX9hq~00MoW^ktzM~zoqy*` zICg&j#QWzBuC!mfXS?T}!`-PnFTdaW^$A4a77-?z%jx$bV5upA=pS(3I75xD9yp|p9%2| zx6)xTDUJCc{f6a+`H=IK{FvtSA{{&yWSEFoS($)4groE!KJ*25!UOLmIpkLE*lxu! zfqn9Nd=$&#_hV$K4)P6r`aJmfm=0SFAA7z&y8Eyd6vHUE3a$MEfwrHY7mrOwo+d1i zTyO=k^9X&;=jb z{~@dDOjEj=D)%)3s^x1SyhIcFK>m=bGUj*Xxi_DpJ=0G zFi!W8y&$g>O2|BRFW*TE!pZ5v$@PK4l*JZ)@AA_^Db*gwVxZGJx^{zM1*Uq=eae{= z+ox|wWjL#I)$F*}l1~8OVl78}<;`!fWvMwgZv_S)oG9lBQOIJUL{lbgdOrG!bHWK% z1kXkiOqAAT2FSjHf{Aach6-QAM8EN^x+)%prNY!a;2JOPlx=B?Og(}@QjBoI`{Vi$ zQpvRiMcm3`h1dD|HgxIqM_G?QpSJ28X-v8Tk%y)_dt+lSgGL7&esB2JOjV*dMdlnJ zPn(9Zm7%R}CMuWphK{WKk|MAeSGg$}T)=<}R+;slcuW_qrYW&5J-^tSJ1dJxexo+Z z(0@fP2VHl@lH~}~tZ{N}aYwsp><`kT1GV-{%tm!&R(VRV5>hJ4yK!mxstePdqL9P= zdK$FmS)xWBrbNWfN!g6B8Ba*b`k{1RT20*0AxydFY?|0d}_d=KURBIyDGLERQ zoBCKfJ~c0DK;NFj%ozqN7@@-=gkgp`16R%35PQ0}C4H8FN=j~KaE*@fhL3X>!flt5 zTuxTj(NC7oRdiXt8Nd7}Z{C0sg#Hg(KL-mYAh`n9X;`;B6C=57GuJXkt>Ow5v(d?H zupY{67?6{Q;9vQfExq%YK2$*#b82#ve`$iMB4ERQ$}D9BsExvP>z{{{K;T5E+ni}D z1JB!x)z(W75DvRLY6l6VO>%wH5;IN4Jjzv=?`e?^N)H?(DR4^|^33ZeriDU#nwx5b z@^%&sUhkkX!OjGxpLzp>Nhu6R&J-C~HZP;o&`wmHs5aGE&8eTF4M7+dX1L;7Zb13h z7lEpW?vM*W>p6`&>#oV>Mm2WyeX~?KI(Kh2{goDBcdC9_XQ_8`Ts=X~ch#81-CIs?G~&P8s~ zKwW+ey_SWR+b4Xj>5eTt^8ay*iJ8$LN(d8sW(_#`b0{NMae?~^&u+Iu?9l({s<$_H z$K9frIvTT!?YjFn_wyJ_FZUY^pf#cUg;|H2NB^}$s^JkrVic(Z4Y=DjS$C-4(VyME zqEY(&2B5ahcJbFD2&8LFj~~?i`{~1NwWW~$cAhK^MCS$5!KV&H?N(7 z`H&;!U0c;5r7^v3zqC)Abzs8HI9!>Mwf=R+g4j@4hBeKj`dJFVpDt?)3F|9noZ)N+ z+z($=oJN@wq=78rKGpL>)8A`M_i;Gq^Zh4J@Nb#_#}ja||F`umc8-5-wg2n>U4_A?NSmoT#k{ru$7jrD4&+bfmr zWp_1evshmQ$SkdvrL(h6e>M7*+arOl)y2EXGQ_7Z4@(65xGsOTYD0Qdks>bp(Oiy? zaQ{3)H~%-0yXGvzmGhUrr#O89fvufhKkxU&3d6UL{lg!j{!VsT!`TM$2{?0zlJ`v_!^?jn&rZFlo=7N<; zLe5!_ zC(x`?dfhnp0J|X+oXw^u+M;EnKhIqGSc?rQ9Y|g>2$?5#SML|Hiii*GA=F{p+*D6d zcBDwX255_mJsy?ZhbY%&ti_2hoOT~x8o75W5AILCeFZA=`*?l2$4hHy2##*Z+inU} znDsRmrV>n+1c5rQunvGrf|vj&>h5)#CkA4yCpEWG zg!c)F>_pfVlJ6OahsY0SlVeH#-r*#kxxLcLnN=U9={Br^0?>RM4p*&%2SsZ;*jfGv z_lvz5&oWme(5BpxfMuwGNmBsP!8Ag4KF|B<(1`^$GcmjXlbTc|X}KI5xsc%bRlV`n z$rjacp`p!a><-sv+TVH^9NXtcqu^JbWL}v-1rdOS)T+=T^qFcVvWwIxQI zVbp7AA(1pmJz`)wEIt{m-XLYUsz(QH9<(C<%M8_Dh?bjtKFTderTI_1-CvkXvtI_M zKiyJc1h^sApfBtOVdv#t`D_lhRG9uQ^{DfQsM1d|rGqXi$#Btx+wB!&N6$ztGBf=q z;Jq{O^Xu!_UYd5S&Md;|YGuq30_Tx@B#a@2hZox+g|lR3bwF8jq}C}|=n-=mm76$L zg@Uq9l#D%hn&v%3rLy!sCNtO%V%d+}c>#99I&6-~(TJDoFl%rQ9MMlNg9`sio~t|( zhL!E?;Xy$ZTz?7je;9kG=t|plTQs&RNyRoQwr$(CZB=aBwr$(CIVv_P-1+A`=d5-1 zo~`Y5HAZ{C?`GVL-rwix7)UQNW}4?D*bW=hBr|5fMp^Oce_Gq*Jx79|Gn!7KO!QADdn? zR6WDopg&bQ-GoZdZYr$oGUfYeqc;3v(mkTxmW9%n4J9^&(?~mI8rn@QPBto~Rix9x!eK-%l3UoI;P1N{xTJc??URlwZEXO9SJ`&+oVDB zAGZ@*WJH&&W+9hrVL8g}b^?EC@=nL`T`D*7TZ$DR9EFNjI&8}G9a3?E;2l!Pz!I1k zZOiW^`0#7uMdDHtttOcXqBipQb%47tcmmSyq)Ea8Ckgy@M$3;w9oQDDU|teJSdJ;w zVB2whmG$&V+jW%bI_Z_i&(wq8+Ot2S($q|IuaO<@*HSvi>cOD}Ij*Y_N4nqBTxIek z4TDR}FQFjel0Nj$9ab1#K^~sD~r5UD$&5 zFwEC<_zLVLB)BbPNbduI5vbt=k)Xrs|1eToS%11{n|W#gv`Ua>J=7W!wcHDKP{f z1nx1Yr$;f$t8YZTdCUZ+5G$gQ5Dy-lMWI}rijYI;4@;hd5Owr947)K8)@D893!EY> zqCb^9der#_E?Bp+9xL;_X6`9qoEPKaIl^t&xc&GyY_j687~d~6UeK%umMj~s%?UdI z`EN&c!@~V1ij9x98GlBRwC@$Kx_0$w8l#~|UI~TssDo7TFoObwu6^E67wDF*Zm1g- zO(S%wj+WY~KKRA2JwgHx9UMJZa68o`Mo%&N@~-2PwxiwQz?i6T`M?651m8r11Vz7L7f4%VtnNZLelmvAPQ45h~E)1}c(= z?sY|Z)VHA2Qok1T4QN-teZ(7G879c?64P2W;yH~&t}HCbLF2m3Rf3lrH|PypobSgP z>ueek_XW$8J4aACi1HCZzO4Mfkmq*I6{N$>KP2Xt^H{WYP;xK4`TqQ(sk2wLJ_j-F z^Tkz^T9N3P?-%ucH3)I4s9MMAX^3#3bgJ01JX_U2wPe}_YSN|_Bos=LV!r89KG@$c zD_AI!EBG5L*I(glI(FP4N_@UHt*Erz%X4V0?K7cC!%QbXFREi3F`#!UwbIbp4XnrZ zt65p;DY@;q)I>TafSTve37sFacE zQGMqd%cg+5dvtB$)UeTjlF`Ij8oPXybYOXiNVxdCEyg@KZ!O|tF3EL%{e4|N@$UAp z`Gfx*f~kkM!@ht@yj@yUOxR7F)D)y3%C!*h@9G?6r4F^qa|*q!*BhyBAZCEUx8c&> z*!Q`Pu*Tqm*0cMnmyaj@xR_>SyB_mk$xzQ`=8nK7)L^>QJH@Skww!{k;a~`bU~ns; zgU2HD5nMtEzrTWFnBBvyRUGXn%SHP!pwPYS`6HvSBeumxJ#!k~zjDs_!fARBhj(5M zUdAU$0EIQTZS=D)rI+j1T&g2v1(Q^nXXJ%;<3`72@ko$G8X!73E~E5yIYXfom~cTf zGC`Jv-dzNekigU534GYS8G>cfo-eg)RZQYe)h>M6qGSXskn@5p4ekIh@G8WIJ;igE ztOF;YTFg7vi>=9^mwF;sDCxxj7na2O8l9WG zQ6#Dq&|u+kHX=e^cvRC(Q9p7(t!k1J*M?=Gk*>Iw->ZR~5}zjPJDJss%<8HPR*_0x zSeFgM-kdQkfRFAOe|MMt$|lE4=zL~mc?J9~C2Kt1o(PH<*%!Ob6lo{+ri&cpiFICn zplUFUVS{8V>*Oz{yZN*d4DIq=y?8gBJUWde4+)99RyeDO6D4S82D05j)N18)>Ue=i z(j%otFQ5U8B7>|NihWdsf4t1KQy43HHih}pVF9uZA?^m*f|)>lLHM8ud+pI7oE{4f z&S3rUNi=s2@FId{nuGkiuEAC*y|<=G)|R@TSj6t4YvQ}JaaO$ z711pR`YdSUkTkVfJb!Ztw3J(xtuRLh(Ox!uk{rrRkO7CZ-CAgh<$xNZc6)vdb;ZtkTN71ymU! zQ40pK@Wt2J<*WW6ol)b_H|<2ua~YRuLdcD*K<`HdLXNB?m(sQf9tH!^vU1sYzAv(Lxd71(N>{?eyT33Y{upQ$j;jm)+A8$3iv;PCJznAYrz0uvm5(7IS4 zME589RM_O4vI^?>iSl!eBUM2=23(bo?vyMS0^ClyIqqyEAl>Y|Bn||eMEfuP`G~k` zS{fi-WY|ko0%cWp6LT@^y!*Ue^5CyF)ff&gmwMWy^x)xk>04$VR!pH?Ayxz42n{yy zsDHaS2dPQ!~P!iVcv&($>6pKb_Ij=V`h`vIj&90=BmAz zSDRq7Jy`R*K0_&*0GpNUEu_0|>=opDV4wo0Q6^s){}z}63cSftSa+6r{7^fqvRneT z(^YBmge<7WLZS=me~Y%x&}`d$UPdh5NgpGJTB(1{m1Y+;aG z)q(mFC&U(5x5#Zb@&iX`U!$;RhdGmHk93~=$bb-#h5BMB}JH2 zOj%IG-W&%ZF^_7L=H7RB!AFWUo#Z!K1s!{rV3PtoV>2MES{Tht#VP~?CM5p~?_ z&-iNtXJFgeEB=h4uQ$wiT8^*pJ7hm9t0X49j_7VXR!d{buB-;lQ;tkw}J#lyg%Qkk4b&DLV~1>WhGCway__CBs7L&KIrAo3+7O2xRh@i!mz%n zAE&=`HTPg0bVpMhzHe&gWkvK;^%?r8DDiausAzG37J2U-$=6z&J;=Re{uokG+E5fd z^8+Ks3XW_MSc+>1p{!HG9t92&7bJvL@8+EXzErpmh-lH27dqXsV3E!yhg-}m*S+RC ziAEWm2vG-4Yq@mJI?1<(m=xwvSBX#?b3(S{4?26xgax}+V|dQ^|yLg}Nd zB>MEj1`Z|4Y1!8?uDnLtn8FCa=wU@{xmY4T+;i%1%({tK$_rcwU(QKe38`6NP`V3VJ4{f8O}# zJIuFk@IT0|*_r-Fvg_}L$F1*%$M4b6n3n!g4KFDMScVWGgiy@);E4OzZH>`kbM|xw z$rtZ(b)i5az-a}tw|5k4*z zf>EjE3;)`c&nLTkQ|G4KEVb7bpSP=<3n!7{oAq&Pu-ZA zy51;i($|pr2C9^&F(|t{ow_&0!9vc1mk@C()^Ap2p&fyJ1`LB#w|NI z-Ec?0PA=^%#U9tqKZIEhJa~LT{KTn!!{JarD-*}v?dRU+^Njqr5?{~9yX~I)%tO9? zED}mt-~8%DtMOiyUIs*38`_XQHkk^iwqbB-;CI?%#zy5&x{6Pn2q>Q+a?yjA&*R;; z#<$g2KR7LFQwI6qF_&Lv6k;m^MB9n9lnW-(n!zuQd-8Pw%VV;jIJ3Y${m|DeaD*Zk z#H*6^U`2zX3r^A;!GkW@Ff9{gBd*g;t$N${u~6vQpmlfq72O86X4MF-&<%D1MXS z7$&_U!mii-_Pj?pmk-DwI9FCToH-!?QWGoh36-NE170Mma!)#2&p`T%fC{=a;bpZK ztHFaGI&nkiW@f11IobAf#ED_(GGHV6%R6wx;Gj1@rfVSJS@5(Lg%*Ve;cD?5=*-JL zsSK00z%l!T$45Hnc%k{T1$v6zIxSv}yAmR%?bnOSkbQgg)6gp*(0Ikjuzk{OV0?I zq!UGdU6a!DXv&A(!yN}iO%xQ9I_)(Y9K%^HJaBD+;z%ev`N&Qxo`qjTiDP}i<5uw zu#l&#cIppcW#5@NkjRdoQ+bFcsz&CmXlG zBbG_-?fneAq9HXE;@A#LDcilUmoIcnuz2-)=Az3A^C3W`rffN7N@6;;+MUA&1q}T7 zL_vUP5|CEt>eE4FZWoA)v8L-&Y3s7;WaE`L!*c%weR6;?Hf>JTp)S@Bu7&0H8#1tw zTxT~4aeg3ZWerZ_*NbV@rN)~m-MW9Qi7@A!s%VBBb$1W_?yr1dO*`}eIwHaiL@nsQ zG&ZSmD8Tqryygvhgt>pAf1oqc_N*|otM(;epg9ndk*>WTT{1Rx`6QEyQtHlq*lL&d zFnUh{$xO?|vM-)*Qc}wkW*ddVC@m@j?xW@c);6#>@zE;_6{Os@O~x#>hmb2+U+Mc9 zl9|XP5hT$$-}bR5D?WmNueoOlyaMYA#tC|(44$&GVb#G2J&^Zu;}@8Gc!wcjGUWb z#`RH`UxF4^9rmlJ(x4{hcB37ol>1em1q$OXhfT$a06d~|so`wbZ;VEITa9zqCLT+r z08m1G5HJ*6(nZs)rqtrjfn{}W==zYwHTQ|L;5lf&a)&aaDp6##d%R&=4sn1HH#$UH zA+li;z%wj#W*0sqj@6dY%AS~Ok1SOUn=LVq-AGZpZ|HiDhbz(Y=GHVACCzSYKcYSC z@nrW(&GF}x-0QlB7vAiQ#eRb-H0@x)2LgyyY_B|2%QA}t1QX)HI`c;J8$mA?6yMOP z`gWv&>CUn0;8b_%O7B{(^i*wQPk!)WFCEllD`w-05i`ZL`s)Nt4)PbF?Ro+hOYWV) zvhjk7wKcynl^JS?tz0D=KA*1KB8d{MKC=RMX6~Z-YVTncJrMPL~$ww>Wru-xjLa~0$xHHIx;?!aJRy?32_2A$P&e5iD z-HkH47;%3RR>-3;s>LWp=ZrdEz-sZf3S)QPEW+=7o)G;bDHQ(`)%Z7i_&3#H`EO!O zj(_z=|8xG|1{fSn|C2!G>Ft`03&gZCUQMhtD26v^T_M&h1%lt07`^XY*CT7E@$bJS%9fORcKsC|`b{LzPn@@RfBC z0`E+hTXW^`I~M6zkyRJMP`AvO3aj4^kGK09V~yerDAv$SS)DXWO1Qfre2rk9akwTJ z7enMd`(c;u?i95`5;6kk;sT}<9hSCG^a2ga%ev>ehZK>qlqYks7=6m=yaUT`#q>tx z8X@94sRnpTtraIL3aLr}O+i&L%>g$ScjpRT%95c;3F!tX%hE-|0v>;fJK^6gWVE69 z^yWtKYVpWCT+OI_Qfi>|>b44|d1y2m+MGg4RjdGMRFIdgDfFTEAM2O{K=AM(&;_n_ zH{-_rIL^!&+5&>XL+s47UjFKKsGO)iZE=vJ8O!l;W?DlkR-zooVqVDqU6XAq#eUmB2_U% zkQXZ6X!mOx#VM>|1}P{-xWijvD;-;(_PHSvF_ zyA114(wkzdy0YNpwe3nwbxymxx_ZCc$`{eIe4L)$pU-Zu2I<^)d;Ff09+F}H@ay?U z99D1xKUJ;nF8gC1T5~75Mrj3KL)z89lN8&$x^rMXo$RGpxi)zRThYWr|WRrlIUKdvaQ~u2#{gMF)B60 zG%c(Bov}A#wCdDu3(vQ4^y&wc1{KVp-{R9L4l*LKSg&x@yx}Jx&xqTv(lb)eiCiZM**Jfaf0^a34|_Pw6_^S5K!U(-@Fu6O|Y@Re!`JO6(Oj zwGFof`Ac+?#1;iBPfXk5;z-iZxFbY(inr8S;1i_XfQN-{SDWD{DN=%Qlk;~NKP)`w zTvXr>b_!>;zcyb(?={WN4LYqJrbakXAIM;xthwJW2Rr8Az&ceH- zARVMT?4qkq*=|zgl8&G3SiJ0;ra0Fjv zO_`)n2(DSTIH4AgK@fv!6nE7vS#9!qX?Iex{F#r|sdG#fXgp%*YDG zq2{?N@01DwlL+s6%?3o&sFfeTlTv4D2KebJX6vENGS2@|GZbJWT82p1 zy34nQ2ZKWg5+&0?5__Xi&+gm*LkF3ySK{2|KNp1!Jr%zPnP1!2J|0bkQsafUv`#_c zl1)v|%tJj>kD=t2beMCg-@s5?$-H%)ZxG20zX|MqA`pAcabF~ftXpjqyx(1*KSDs_ z+_HUUa}aMZ1_VA@MxwZ${AclA%V0}-9vzhKIL=>46uO3doAGu}!ov|o5+$9SNSlhJ z_b?nPoxgYCV<(k?o4iN5CowS>=Y2G&ZjCDHgkOjyO0m0KgxM#8ZH{(FKj0&_h^E^G z85xrB7i4?z+E2U>k|98l;p6H(-)J9JZZ;ZD`cO>^8hL#7IzSNM_x1bQjK>{2*ii#b zQjvfTRYIIh88Tm*2D*4W7TwaBY)LdO(z* zPD~WdiI&WZ-;6MBha`&^%!C#FlWtB2?w&Ovtfo}q&=_5sa{|F~W7b>i16~B=t?xhK z`oE$2AN*$Ep#N{`6Aq4l#Har|u58^Mq&>I2%*Lkwlm&b#NEsY{zq zw~-u3A$k3bv#evF^a$SwEEol2Q*emnb?`9gg2H6K5~QosTR!Rb{`KKKAof{-b6g@- zDq&`$xg30|@OL|Vo-Aqvh;C*X-O?Cvx?H0I4mNblC^?lN?oAulQ3E)vmY*}HdQ6K= z?Nyu~VT9>V8wS$glOp+kG#W~4Zkk({9nhdULpF&``=(~95m|K^#YU7@#)M_`iT2Ag zs%jFR`H83)M^!P=XLfR2m9l)&S4uMH*=%!7K3hS)GAC6&VA3pmrY8U4oQ$?5ZijP& z{4C<>009{+FnmaJjwU1E<*4J|(IyryvF?nxltcSpm&_Wxt~$9Ff|J15K?2|-3<4BC zCV`f!0)esp@g|~%=`W0`HK4HiMu@@+#N070lb#Vr>G1V>;}1p;PhZ?QeLrz)E9K~F z!|}2Gn**$SR#^Cw7j|upV1i6@bEY6{gEqxc18eMm&>^}@gh#4goJh`d(w^7hJSjim zQ*AWZ>{OZO-ltj?9u$-7l;|8~-ttf+mG5pZ!fF|k!x9~iU$Lph2i|TDBEUu2B41+r z2gmAbAFurFYlDqLP)BlT5p%*jJ+Yx8CkS>Azqi?FKwoFrg6wQ4iF&HViY2h5vSXFf zY!c3QNEm4`F4o`rgS_L`g+I@PA_0NiuVk5e{+g(5=rAs5Qpdg$|4j;muFbSUA!qb) zh1n<7$?+;(Sb0j%zmSz0&kPkdDy7gJdCHiTMmV)JP+nxRj@BnE-*%FvI}3;*XVvi7 z&IkwqzYb|@%c)&LDn?L(SqC3{MIlnWD}c6%c~bq+)eVRw%nMgUc45|_qCf(k=P?FS zfkB#echnuHpj^~~0BbpTz1+L4GmJ5pni~ebxHM2`Wi|!2OAByL=Z4M8wlqR9N=!Y| z{ruGD5N504s;AAljD7sA*}hsqzFHLIz~?BL-Cr>?QrR559*F`^z~6c{ZgM|wT?3gP zcD$y1A_<*xZeMwKcsa6uWS5kzksd;nM@;4I<7gVUJdUAt7Nc;iZ)@jNyCFuKu{CjC zy%%kuUSMcvgsm5tma7P=@S+y!BM$`87l{+)w&Tmw8~(b9oTGj9uB;mhUYT+v<-UnB z0*_w=<$B3v)gJ#Ws-8Mxq>zIr4(lvt#GhS0kQ;HrID%9U$EDM~EvW>A5P>Q_5qbbF zVJMK!$%;6Aa@05B`4-^1YQ7=`%%}>|Y(;V_z7#(R zj71o%ScpyNmQRWPJ|(1?mvL!M?TNnPE>x9A;#yxC+T>L1nCa~k^=?6A9XK;gYw4f? zMR7@xe;XO0oJ2PrOaybry3%n%UM|ImLxW%lkSf))W4ITHUv?9aHUm-^e^ojdf}mp+kb?*f1%gEppKP|{{NenGt;yG zpVRX1!~e;&y!ro^f~Mf^o(T3&P=3fyiaJ-|C;E$i^@JLcL|2Unn=ju`w+JGW$?-YC z7UR>y{dVtngrAB+kI&zFOV3YtzxR*!jh^l5&nj^dOTkS^kR=^ZmBsYg(#~bNUA5Rs z&>ffV568D_x1=pU@7HsW?jGOHHwV4=Y17VDsF&;0K})YjOA3Sqf+W=CX&V=wIv8;m zr>}D?P7KyMvTjc1%w5}^Dg?GlHweGyyWT8GSj; zg*^^ZQ1PyoKvSoCN-SD7+zjkQWW@}`8ULDmQswDTo0|9dN?1YMqV%($I*GE|(ih{v zwTBY9TTFk5SPB&14X`6$$v}*YV0_wqN8iHhG7p@{_apaoSI%sfum^zF+l-J~p+$B}? zg1kKumW&!eCYn^7pJe*!ETd&Yh1dNvUSOb89lPqv@pfbVrE$;QWqYTf6x|SIly)5d zWKm2;ovb`BhpGN7F|%ni7`obx0-i0IhTgS8tes;uu<6M(5sH7SjB2bJFZ%EM<4d9Q z_zGJ{x!-pW!T!~}SOkD*SX1$yU3nqdGnBbu_zvRN`NwGi8i%v&DaJNgfaEH4fl$J5 zR04eMa1d_GM0ADXE&U8I$}bcLY_{WpZdledC#|`qm8i;biZIR|Nc@MgJYocxheJs( zj9vfRi$q9rkv~q-C_iF~QOJl2;=t|28>|g@nb*C6RNaWhax;+-TBZkJ;`>h4x512W zNRsJ~NfFd;17wDxqbfsRtPPuf_y|r8QRX};XBJ8W(rdET5|%HA80f@{8@@ebDEyrn z;qkcDt)S9A<{MeSGm_AIRV4-V{dHw7DWL6z;#!lw`%mYaYrhBiMnh|JujxB)zeY#3 zq^~>kY#Ia$l{keMH3q>CLhS!gP?Pf|r3yhuSm@;~HN0<=&iOKev;Y-}@ufshJF?Ct zG{?JRRA=0qnw{dXkCGBvv2}Fj)^kj15}abt)~9D2Z#hY!KL}6JsH;GC%GYDwJ1NL3 zlD|Ft&d2b%wEVHMZU7-9?g7Ce6&KRqSka`f)=<)(p4Q&dKSPjg9%q2EZvFcaw7hkS zAJV8MSIgcSi4(~g!I!e~2=io|mZRg3@anQm2C}oYq^?!0Xe(?&>PU!Bd}2zSLdqu# zc6f-cph*4*G{7e&!xX+?J-H8qWMdLeaX511=6K`?TfqiSj^lvndI}pIfHGZ!O_rM{ zg3I(HuVA@-$i{!8!zCHzk-}LsjiBoc$_lTLY%rjp`9Z{o4}Bw~jLk6_qdX(7C#E&f z{id#di9$Y~mknZHCI<|Tfu^L!q*d&J@AzVO2PJ4mA%u@ux1psvVgI|K8WSmM~H#Yt_J!uYp=gCk{g^u)NRoeQW|qk z$##uCHtX0SG747-!9xn8qlzautJo=0+8s@U=x!g?Hl+`qc367s(6CHy@9tN;)|M!z zc57+OrwxOvV(ChZ_5A83w{J?%ubv_lZ{?u4^;$WFNq9OF?}gQuCXB$V>#NvZUOuD# z4`**q-*1-u0oseGSHLE(kx{q8q$;Ot%y#%ulo;R(aC@);wef>n730$Vjy8J}Y;IfB z)iiluYREFw78lO8Eq!^{yBPQ-q>g^Tk5c|ANy~hfJlY*9hHc|I<38UNp6+JU{sZ`; zt~7J2V-20lA*2?ll6jj!`(Wq>4Oi{=pN~Vr`S;q>rn^t_8`?w0ql{tNOhW0s%OjC5 z!&H%MEA*O}E;JQub6521nOF3ced><`r7qe`&`LO-cUX*HPr+i4@3xsTOk_-WZf~L0CJC3c>nNNeQWi zHoyfZ)Y9nw5`eGx^o8~FP!f2AE)7VCFK1gtq$VV7h~xRt{;(F#ex41 zZvXo}%lO|wo`Ly4fII{9{{-ZxzlC<+WjOytoqpeER~$n^Df;O5q(nf$%oRcZX~SXe z+ywI~x`MFz@(D$CiKS>?7eR|mw$XTJe?Qrqnj;E6x*lFWd4IS)d3aN5@afcgPY)9= z0OnVej`e>_ONP7EFP&*|9U^?iBfLS@6B_2a2lRkL&ByF#hgwR;Bk|D0)! zymW{slu7uJG(UbTD;BzxP~CEkdiRvUVc4?B=1wdnmAzGK*V3BUA=-|0qR0dd^Vf?3DWR zX7=>+e%qxOjl)uDWCB&H*f@EI$pMLr5ZaaQ*XeGAHmV?u$a6f}Vtv4lbVMd}zjJAY zv@~82*$c?iZ((oIYZ@9JR)16Sy6)z*kq}&K(FQvUnWhwqw*9_hoW!260Fxh7(s=nG zIM4QJ1Op8>8i+g0k}RlH{1;H1ksyFy(E4IWF^NFd?6AMgr|b6$q9b{f#;loP$6(Zt zXfzno*H9U;hd~%ke>D)MyD7C*VMA!^X9wCBvrF%bX2}A&iaBC;WYjTkdP?dewbC($ z6^UCMgjf3MQHT>{tGEsfHtt%QNzXTa=a;cY0`H7_H(5-}bEP+KXB9+c41!;qDMpFo z13-vDZa`4hDPEOMCs9ddy!?zl-@X`!cnfejWD+!b= zYgRgv$26w+VkX@yFs9qZ1E`Mye*!3cktx$ehFMh zj)syQn|!d>38M&d8vqiyo{<^*eUhzTrI_C0k$h%{Ou znROmGFvplD85_u{BU0938@R`6%)%xiF}bK}C@Z1$CfPl_Df2AD4V>DcysLnv;fVv7 zipv_-#}qXa@LsH&9ki>C#fKD7dyR8js#YB4Q7ybLN6UMucBmfd>MOoF&PFSstW_NI z@vN6qema-Ybf&1Fdz9qN&N3bMAI>Wp$W~l1;jRfUIPN+#HH&o{&79c)uNgc96b`8$}s5`uY|ycjAlNa5cJMpY|Kpvx@VoN3#zq zwrnmQZ*Git@OC5kqi)-zajOs$XWB`^gl-#Ow$ zcb}&nLkNgvkh5W?|JYS9E*#clF6Tu*M@^IP=wjtXxo*GcF2J1-^6*=?4=GpC##Ca3(A}3O# zpIxDEw4JEGxTn73aLKbBYH(q^cjSU%uo3}$F6MVZ#L!Q6(e~knRGlgrq@_HxOww{214NjG-c`Ncc&mks;U+QEymp zPACcXq7V;SzFEz1n$^J2dA=YG4jwbA^?+l-bZf4FJA%rY69y^5lnBe(5)AE-45th? zn}Ffa_#@w)%2S+?R4y27dK3t{B^27BnWV_wGq8F>U|!Mc77WLo_DoSA;83{wCPi|B zX62q=U@-xfsU;HH!5q(1-k57Zn$jtyKah-)yto3;A81OsYHH1g(hM;@0Thc_xSA#! zxo2QL0^trf&?@I2nvaRS*Z;&sSfj{Lj8%RQXL$>T>Ru9|XblNoHz5slgX5AEtjSG? zK$n0A#39(|@hUCo4=APm$qf#}jbD!0=p%@ui_e22Bl^Alw*EwXF=$12=4LmCc+FNx_%o-OMnSw z5H#J9F`!cPbHcS_reI|updV`F?`vBPD6xxgA^d%!BEdKNjM(h~9ro{rRcnhL`?Uk2 z1Mhzc+VpjEWAFP#wH`6cDeq6vBOeCBPPpdH_v1G*WSQ4(4@eK2{UcZkE@hC(Ut|20 zg&LS!C!VUPY)yH4FcC;~?19sIJJh&I-rjSVW)`_l;9IbuE^_DkQH2xq1k@E*Ok<^B zl)PkWDe#>@rTVCbo>-GKnNSnA6J{Fuh>{`H0D$Zw(_V!=3uMhmMF%tOPvHZ^6Nkq6 z8kA%AhVaKto^c$dHp5}rQ`^yf3CUDLvIVK9005bo)r`fC3CSXEO{k&$uoov;Hka&E z7EG0!I^&^4(mth9@QVr4PE(=DF>{y@{2*5Ha7+w6S1d=Xuo~xRs3n)ZiCEH1B!i-N z@hWblEABxPI_bpwOyrb!(Plb>uXs|vmdaQblh2gBda!FXYgOcHt%>RNDgxwS2GR~A zj8lhY&)YOzN%t*bJ(QY^s~aB=}sHaqoj1&Jt(>JL`F!=ZrsV zyl=Ikw0VKbScRN*X;Lk;Z^~?rU<+I%$r`>J&2zX_WJmJ^eAaLzyM@VHq4Y<6d2x-z zV^I}`TGz@t^+)4X!MM;)Q2pD-kENlVQSEaelKoISOeVJIiPwtz$4d8tPXt4qoJTeE z>7uFZa&GzTB!bsRI+n*?Qyo$Uea*QQiuBochmj!jKV;#5EH9y4?k~_M;Gg3X@@F;9+#xDfiX+wdO3&}(u9h??v##Gr>gxpv9dj3DCB$-c>-f+`i&;$o z{!Dk2a~avJ@v>uStKo|nh5Sb)bBoZyEkX>Nr_gzaQmdvo$#E%Crx&Hz+)D+Sd{{p; zKg%QlkDuuQ!)I1BgeFj#B`j_(Y~&30$Ml79w^*l|lTgP}1bM~noQ)dR z7vB5se4tfR5A60+7mK2_Ycf0kd6IDlGPnoa)V?p%=W0a~G*lbbqnb6F`EWq%YXBcg z&usM+g7x5R<+=mHxf%V;J&)jwG~Ne~YROfX@rqq$FHmy1^#3C_m&WdQG98ldZtuWc>%d>rhe@Rze&smcq$S5>1LerL#I zU4G`;s`Yy7@l+u&pTFMB-hM8IZa%)g9)FJ31WcQ*!s9RQo?cqIHCkef+vQa^SK00; zulgtvDzmv+nePF4?TrBo1O{be0vB=#Z*6ty;o7R!W)*ylzP%j|W-9zRL1j=5Cu6Zp zAn}02B7JCd)X=C|IFP0V85jN|FsF;^T>cO)(VvdmW=f$_S+UB8Au{sva3T`C?A4&M zoX6^UrKVV}88wKwJX<)oJ<9gwJGytZeOf!}u-#?uPHI9EV&c?#p|@IAzq^O^5R%Tr zoJsw<3&J$}ax$U&7i;JwqGo|x<-`ym!`lG*XG)4IdY$g+?mK~d&hXBObqLb3^t>%;S`vc_mGk#!4Nf%A|rY30}5OYoQ z7}7~Yt2})xSj^6=7j_QY$Rp%EGLc#5s4e4tUcHieiE{&wcvXgYL*_+2#~8d)wW;+e zCPIs=|Ae$#T9Pj)!lWuwR{qUboRUL>CINt6o4`!VwPVR8)3I?K&I%6>1@5c`7qjBy zJ5FJY*GaX1L$(2dY0Eg??M``EM7Bjwva}Mhp?I@*o9G-xx=1v-AXzK%!7AZNr4bsN z+2{%syC5+-BA|SJeG@wIcZap;NzR?M`QuK*zMD2eBlRE+e2M)GpymOZNZKhhg93l7n*5whQGK^Ex9keQ}spbJ@Vq#OD~l zF(RAY+km#$H=s|ENQp^t^;@JpFa1GQ1Jv|VXXca6HVse0pO@iVDmODL0p{qL(DecZKkm z8?^CLrbO4xu$?G>;z-t8w=I`nXh>d8GjXcfown`JDMgqBUh$W2`SvJC*5CQ3w06-t z3y>vkY!X+MxY2C43WM_Owx)6PiE{Ru@*1tDUEXOlk;t{};5oUGg~S<(WbXRcxlQFf z^wJY@^vi+?A`FrWnkEL^SM9O*p%FIvtCu#IL647xKyZ(U3PpAOP6^J_-dbjpl+wMD zbwq8Zoll5sbE%e)lBZ%^JYZBwx|U^>VbLz4lpFCF|NB{#2p5-pVZlSkp@*b3UZtWj zE+n3oni(A&sNLYBTLaI1?|2V9JDzN#N~__os1j)=@GChxTD!`kq(Nm$SZ4LIYsvaz zZw^(ptM1FX3FC?G4&(k!%$1VrF2CPm-=iy@McmWqGgCA3s?3uKubbN?Ot6}))Y1nX z&n5&FRR;CKl#Qfe>8OIz+I)xGFeHZT*>uWCUr+-Wa!~r4U8Z3tHkaARU#C3G#-lYH zWvp1w>h;5Q*H16RJ-E!pm&~ZL;iL+NrR8(79z?}_>T}bv$T^a$WE)L=EgZ_Lz7CTw zE7D@bH8%Z%_1G(q_GLgph>N+NHD?^{rpR=#VLZ90BHj$8)n5v4a(#7m*46nl zf|(hrYYoV>RQT$U;x(;VY^f_G_?hTvbX!{CDE3pJ2(TLGlY1tY9{oFz&tIwkwfcqW z%u93MIh{4Kv#voN*3|)@#nHNn-F3$Xo{ufcm*x6$iSG6=R)XKg+1Osl&3H_@w4(er z@sc2mR`+{0TEvc{@SkAo-$?W?*kWa1|E~oo)4xJx{|_1>crn~?>FeF_t&OSUcoLs)Nkz8hB*{ltn7a-aj8tw)7>8M3ZJV(dElzusQGpIiBC zb+1I-&jw$1N9p*!9=dk@UalSh_aV3l&w$g(8^Ggt0q&pn+)XK;-8-o#3&SxR)?(Uoa~*wnL*GkB#0f#E^YTBgi-r`?Jdf38V%v8x z;d0d(HB}WZTxw^7rn>1Y0{rj1wJr%3?Ua)d^w`jHq>MQ^$Oh~6^yxcYt3Hz%UL>AR z;aZaIVw(V+<50i~gC4$Ku0Yno-!i>kUa=T%NfN37$Jf@Je zx%uFUYhQbf+h6;-#FE^d9==oFKkdGIz^(SHhT;V?3@4w4bQ+g$6`j1yOO!TT&1PT& z>&i;eL10sG2|D!rWozAeOBkK7u2H71$SWXMf`Y>vN4?N5gXmELI~RcP*E0Jup#U-% z13LxXj6Z1#m1Z_`OoCz~vIW}6r1B3pc&d^SBUg-bAU)?8<|H7|Be8Xw%^~(>FcGB8uNS8OgNq#A`oN;9wX9Fb&-tl$>gVC zwhagR^>(`?pM_r*zrqA<3#9WGt!&HPoGMR5_{^egaVobg4>%%`Nl(@2C6#GC6;N}R zU9l+QXSG{C{!f%UwC7@ zF3U>Vm%_PH%$!N`Fjh&h?1xrXunc<3WByVX#p|wHGpZfx zqzxz`&WH_~1(!Tncm9zY(wC=~n-A#$zoE*y#AGG2bkV7z451?7xXSol$?K_{FHa49!+5SdK|+EnC@`&YB-UQ|{fk&}`4!s;DrRr3plAQVimjKo%5SYrR@< zL&D!XoJY}+W7j08R`8SEm{?YSg%Zr&S6YPNXa-isibwQt#BSDInwG$<>UW%C7dMyk zW|?5W1NXT~uXu7&*gP@NUmH$YJ%VS3kNk6 z6-~m;daOUofA@6|_}PijRZ7}vlR%27(zyy!xCjGWJR$!kEJd;tYuJ&4EwiZ-TfxOS zj!qtGimGWjG#+ENS5?lvX8dVvFlYqb)jpBxjX{OxH9YHt3Oi_?4< z7HtN7aZm!-Nj9AH%1M`CvXL74Ir9WQ$Q`FlfTd>h&mUB}-|ikS_&UU~!U;j&b)bf< z93Tu|O0OND1HB_$93e{d@zV{!n!^L9*^R+LP3V>gnnJWip`_9Pn%Mpr(2n~;#Bmic zL>=!K(jQV{f95)*^A2aIUekp93CE$Kbd)lPLlysJC|gWI9j?NnP(#{dE<1mul}$&2 z!;^HbP*6?@_aT>jjvQ5nX(u-8;B2jtQQS1g=8~Urgru5aU#$E>(v7Dn!*jUf?6-zJ ze}bXI(+|2&M9D-7O{n+M*R;tc#FEwIp6pO3Q&6ng_Z+e@TxdcVS`gY1a`61Tg7XfN z+jdWpLoXU5`3ZwMBhQB8tZb3U8HucXcp9cbi&av%e`l}sHacqsTITooE+JE2}l^(X9%D>5uSBPBNYu^FM zgg~03uodYR7#YW`x55a9Qz_1zNf9%DF_thgfRGXuBlpx78r+V{0MmQ|Eq^n0 zFvD5CbP?zr-urYl+e`?jOuIqjR?&3it!Z%09G2nGJ>*M1(zVQ!^Znl891p5+OX}uv zT~=*TU9w=WY{}wr&xGbfkuZG+UT&E$qPJ~CyvFSpcVkWj#6#pmuX(KiHpYR>z43=4 z?WDEv{$!c%N|{MagYG$eK>Yp|p?CMOyodGiRcxvF$i*n^;lo)bIVhABMSB~S> z1k6M@sKQ8utvl#jerAZ&yxZEkzSj) z|G7e{RH4r;*5=Rd-F9ysn(RYO{EIGS=u@JnjUe;jqw`%bx0npi%X$pJTZt4QJYWL` zIV9v(sq3}zUT3;MDwT}kAh^nN#UUJHGX%*?_0Z_5R&9RH#3!^-i$>HA!$ zYeap=oc*(0a7d>wqqYM#N~oncJ}AikopN>_w8qsqg^OdB`j6i}OtW#((u?;lK8$f! z;cxk$&&oelLCNy(E$x-?vw3z;dAU(DZx{Pz z5;-neUxSTP6RIUN8-*ukpgMR-)F!z)=+<)MX_y_sVjNA(R?v~Q3;C=JOQf2Q$!YXV z4_WvU5P~tygkp7x6{LKhESIUs;uWI>&bAKJ&3&A@zFfcF@yLE&AiQ-Aeg3_2-{R-v zck^^UMjcM(rZm)@x1*7_QcsxtZ2n6&Vy_OchqCc5-YmMvtYJhvC*ke(k*iK~uX?PL ze{0l{>Z%nZXtSdDrY5!b&|Hs2L?C>S#UL1bI6T?nE3ibB&pq>qum+DvA%&3Uxr>K{ zCiVdk3K@Xf5M045O?)gI^w0dNDO_ zT9-XbMINB%{VZK=Uit?@Zdmp$cIERV3>UQeNmzqFreeAYe`Wu0B)3q{aRzS8(0_65 zT^Sg&q=5@BLPgLq+A)Ib<@n|Bc7I*(*FBn~64qshz!3zPp`fF8k=8sh9cI~`HfEq- zV)ZH*33m0jm&^ZcW>1m>;nwd_=wfA$$<505XM1D2Gz1p_pDe|_7XW#&s;iCa@!-El|)jkWNvTZ&hN?Vlk^pDx|QiadW2ld3Bscw~JNh`pqC1 z?;+hwueovLHs;5M!2gPO$_A==M2cB3)9|<%k4|&QC$pZ?!+n|w@4>UGw^_tP+T&?b zciB4Nh{3Zyt~r|x#t+7^+i%Jgv{@<--4y~P6wVS(#Vvpa*#dCgE`BFtUI51FCBq!uyG6YhshhI^?{HLYet^&Oy$HQ}bFCZv0v*3dR>7s-%};y1$_V}^q+ zv6j6)v%r;d)J2q*R%FDU6}W(r#DN?49c=&=3I9ef`AAxn{sc;5zm!rbuJ~OwXF+0w zVBsa<(u$mmMHO&9L-*FXNe-$N#Iunvh>7x7UBr|WE>K2Aza#EQ7H_wjho`X)6oEP24zuUkMt@SX-MW}_MD1^%l5M0?eAlO- zfpC0l#0^k%v<;5UN5MMoQ{?wFTX*#r^nKKiThchLHv`c$J9f?^EX5&xwyz(5U*PM% z2$}pYxI4Ea6+-Y`13u10<;0i(c(B;3zSKC#XVF*;RIcTT?2BCXXBJ zAv*Ui^I`jXj}pR1|LJo7Usv#d^-Ea)yG40{S%KBsE!keq zm*mTLmp`-A-cIEDdcV6CN^V~l26uI_F4bm(uAz6nxb7U$dtY~1Ge3JT`M-bQ8nv=7 ze*TZo&l%UZKN~|kad;aSmvMl&y{nh4<4*$?NK8L{qo?amFPCLJv#p^GI>095glt#X z4trVH%#%U)K~`IwU-#F2ivA8C|Ic18-}es;ci+$FJ*DhGB_&APcih%A19U9Ymy=Wk zo?a8LC;RQK2s#{BL(j?Cv!Ve%Qa8t`#Yn!(06L@d!C&x*mKU&>`}ERwhZ&LMMWNz0o9UW5O6uPu2PBE*Oebwd3YailBkrPjmrgUve_fNQ*G~QP_+bPen1Ce6JHyPTcpRB;Ufio@9TyGO zzSOhi9>l<@+I*1Km}xN5u&){clftl25?JPJ3ZjFT>NbLkrZ)f_xwY)HAgiM6B%1c4 z71!YX?l#@ow?f2-0QwW$)ev|YE&;e2Tb76v$;+K=cdePC6i5&1stb7;i$4KTMIFf3 zfvz|$lhI_KTDr>l7`QOenL;q!aa1K-lAA@bv;oEiNvW?a3o)g6>?T~&ih-n)m%BoH zGu-js<&^DkkX5xh)34Us5*NjQB71-ImRnpQBOYf_DxqkJgfLA^ZXgfloqku;5(Kfh zVVm6+x}ClH=ag&)z;L~wM!A*1Od&JcRu457O@v_lLP__P3~At=1{DP|Mq3+Cb8BP} ze^Tf-lb7%V-IYQVE#lJLylRY^P5k(0+W!Li2+Brn7e*O~y z-W69&`mNXf{%A}}*lgJW;QR~z+69?}z%x{>gBv?ToSIZgWurP{ zt)3s6zhWF8i`?o%Nu0CE{>-m92ABV2r>0yv787CfF1b$N@(%PzEfx^?ty8aS!d=@C z3|1$*ZeKeUrPI8!udUQIQF&N_`T=z}()J83hLvgG%u% z18PWY&VD~n4aBCDC(l=&tEs8oZM-jCY``Zrc;NK#CY_aQ1`CrLSyx^)=$80IVOfjx z<&e8LB>Jq}D~k1HzK?uZ$>?n{E;B(Gw3a? zDBnex2-E^oduo3?dGJm>JAFK2^RsU`mx&9yHim5r!Ow}u{t0+5$&P#b1AN!TF#b2A z9F7g_@E^d`(^j0+kto3S*R{e!cCW08TJMRA|a)uJG zjAD^G1E?rvDeH>>K~llRVkdgLgr{T}ZV8i6hw|ZR!uaTKB#!}7fp{O}g<>PF)uqeo z+sTKPM#Xq56nARm3bm47q0uG4R=h9tlJT?YvQg9qr*BA~^@SR?i-Z7MWqXUhWT1?Y zE>PUt($1uJwFLtH{@12YX$FQfxec?pR)>tc*;@Xn#=w0OXBpFy<>I3g%0UVO4Xbcp zT`8;bH~*!U`Tk}>E98vCWzd?c!I7%w(V1}tL}!a)bnQDDYtp0jAIW&f8v5OJq9-eq z>AFeqWi4|i*abRoxHX}b({}+mM4Tb!>r3qnZs>42%?6E`f63t9Qnn0*#*9E{YziEI z2rOnw!SS$C!*p`M;PiaB=bsbgBq+U7)p})7E;3>MG8Q|nxJ{m)@7HecyZS^hrxVfm zPwMKw1k*q2ikX?~zn$l-?5zKH>h1U8|0ebJLSw^{lmqdbC}TdZ)o+wyOE)mbn06T- z5@KyQE;K$A-@?(gx*c;6e|V*o*twKOC6T*Eh6p*z0%)UNQpi!FX44XSIQirGcK`l) z`8?&+;?<+~q1q5xgT;{ouD*d?xgL5|wy_ka_wC3-zv{I8;^z16?A!X@l)UQWQ?9mf z4f`~B_wsC8->SBZeY7%NR#oA!tNL48>#xG$hNIe)dXb@@O|{H4M2ez+vl&ovd^}Xy zqtOFp`$#~59~)-}!6DGGmyhA=d?<<<08v#KcL?1C;O6|q^eXNN6J0LUzoPC;oGp4|*mJ>J_2R{uqzQZ09ypwRe zeb7vM1p!PyObKUF_j?|%t8(RP$nn=QO0~25SS!-F^Ub-?3eK9CIG>k7J`$} z9uZ!SL1RbLjRHBjc&0ryFv>^Oi*!N;1_h+(X;dn&_U>FK_THbOyfWq#7wR0BK!Z#A z#8@~i42pJ_pF+5~7F)yt@5-?4vtv#2#4>PT?V3_-c+uGRsPdki_R0%%i`5_?*+!-T zQu6SLZ$Xp`5;}!iRAi!Nt3TmP>r;+phWz!gIl+!-i$JYJF~38 zBCTQ*Z|)wcgi}A%BsFbSG?RQ-oRF7U!%te$uh%F#gRZf3P%N;>N>gTn^VS@B9TG$X zX{-&KhjyT*d^~yuG7f2m0Z4fO#U!m1N<-S431=`1SQ49OgzxcM)B}#f;h^Azwk}|r zPMbVmv*Cp!hyPSP$k&2Did5|%*8WQCz~OOnzwye;^yEk=Ex} zX3{HBx1(4t?a&-QvL7$picN8&N`zny0U^}Gwd@)4iJ5mt1E&b=AOcLAh0U6s*wER1W zS-?6i*urIWLmCc3E|SIB>Bp5bJ~`vBF_l}4KYXa=6_!t7U`xkm*d*sC=Ij(x0XbN* zRP2JJ@!G(BJlf}w(ljfas1I35E`cmEqIZ3sUu}z7WjyEwD#}I4o(IJFBgVkdW~t&* z48}2##7r(MhqdMzw{OJhLxodWzfnO7{Mmbk?m4EDrOhJ!5nTqGt%*N5gUk(d5Faxqt5ROuDfB8e?^jWnC=}aii@A2CYBjerWdI& z2?YAs(O>AoLrMI`PmD;CA|ldQ6A~PeXG}97ZeyKrs9qN`7>H>H5-Tms;|{lX-i_9h zC&XQ500}WJjVDJF+0G`-SPe2nzD2EYLg!61uF#iK%L9ue)u6UaiY(KoZ?cpIVfuHQy7FZzZENFP$t|LxSE(>45~wEYfWpN5Yt% zcVPx1L}unGk%NL3xogtpZU_2)M3S~V2Xk`vft9}=#`nz2Naeppx&%K%&*CX%*kj0v4d7%wFr=90r!1@OWoB)T*xKbstD`rQ10$^zNE-$p)6#auR#Qr@Rtz{AEUL%O+ zk+rMz1M0U+`cJ_;|4+^N*X=(W*MEogeRl=^@36k_!~e}H|Bs)8yeGg0z4->aJc-Z@nIueWQ{UO=rNGl!4ITbAt_ zAL5gslH~RD7?nx#`k@Zw8dI!)*Bq!j{T^N)@7~7jIN$aj_a0}4F3NVUpKcDq#`0s7 z);Z0~YP4YL@2x|vFFLRGpzJvl<@o|#-ij(hRE~^%juAf(R)qs3 zC9vgnN2I8tXkw(3=ht1hf_uL?=rZsa*g>Mhkl60C6yfqSYF(I=!w=^9xc*(ie4tR6 zt`YuF0mk4}cN9-6b<)5TTIA1KS=A??b7Y`;95^2S*!q`U&QblFRmM8EaLVX{QzMzq z6wY_&cXCiW*rDyI=9P?IYnq<8!|5wmi5=p8fmEKbdS**HIYf5)jmP#_s89xcyPum| z{F@>jEFm%(wlj;uw^K37>`3Y-4M(V+e+8xck*=^#xHErzqSvnC-|#t;d!P8baX-cO zgxNt}8slE$gF{Q!`@wDB?D)s15HTSi&nPkoNw!f;57sVyP6dQ5>7MT!J7B}1D~m#; z(T8#7hrrnVHE(}7^w!vhl%=T#jGs!fGnT3JzbR^^A79^m;t#~Ykp0a7BBhCB{B4fD z%9F3H3rU{X12XY*MgN*>efSt6jVqF)44e)_BsFK=Q&M@kSmD)Qb1uuqH_)Jy_%HJd zAc}~LChgR?w_I6z9f)c?{g28t3pv@ndi_nTK0QY8svfLcE(?<@USy13|q$pJx)JYfl6s zBr1*Ncf*pVg29PHOUbnMC)uE0p&N5_2@6UlN_D^3vl673s5r@d zVJ{91m?QiZp=uUZ$4^0jfOX>|&&;!ckIY=+Z+rLprL=4~vm9skS@)ehJ{3z$D3S(e zSBh)96uX$&1=La_ljtOPaaP5Uxe21fKy}Y4C)Y1}=tje9u#slUDz~cIJ(j~kF|SOi zV%$c-apgJVBvy#JX$awVFSXzqIZH1P7WW=#YlU+&rC~4Eyb3DKJpdaM<>gagwHjCx zPJIfGX6KoxGaUyc+UkG zN?fGLf{3LNd#(%u1oct0`}puu|H#@zX}cmZc}&2nT1nRowQga0oT{b3VN~oHYrjc8 zH7cM#&eSNZRQaP^&ay#f)p_$UIQ(n*&1(LPvDZ#$-h55p%yX3h_!#7efAZ3<-C3!3 z;6;4mhTH2)5Pl->%Z*SeTRcT`>|V5sdU>cv$Gx%=T319vBVi2fzP3w>3U#ZPr(1TK zL>yArIy8($5{m|f!Av?MF3+GW$4?)#qji9m_ic5+F&=P)!rXf3u5U@R?v(vYuLslE zPcn_Q9xZXau^~C^F7Za}3`JL;bKq@=797#nvzu+%tTc-jQUH}>-g+-R_K>txq6X&y zrqqGA^YTf+;B9BfDe83V*fIk`(}4yT3;gtbaVt*Cxy_WOrx%ghOg0P@x$Ggfb5T!L zBJMYwL9(_@uUmzpEY^%6U7Aprwo}aQ({q;7trQT&60736aPI2RI&zDwkT^OOi`!)# zdm;|!K>ko%J=E1Q*%;fWJ~O(2H33-ULhK~EG)mKSO^g$=>f6{5vrvpWlNP&G zj%_SpKOXNyGCL$#|YX%o(>Z^NG(XqLhqT5Fb=dH+JlSdOwt zDg^XVyE>8EEI2Q?HAiS3aWzW-f*Y!8u4(4TPo-tEMyEnROaDHA2tS!LOC&uECO1|! zSKuI=H{{2KA({cmb-3OyE#F?_ERt%Q)JTP;nxXvMo^cM4eUz9sWUFq&TZT=Ky?Frb z&h}c8HT5bqOXX6lfFxl5rtZMFG%6rp>(3t<^1%%M=|23wl*_;F!eQyA5E=U>q@F2|P*&5g|%4DwJBf~5F}2sDYwsxq2_h}TzKP6Tmr zJ=?4$HO*@+V@{^MPG6(NrAs?iRTl?z4=Y35<-f{O-xtLUr zQ*$uE`|a>VF%^dSCD>s7trlXL)zVq}GCq2)&d1hu^KsVQ6s;*Qe0zLT43zVKlPjoY zE>`yUfC;$z^O1=;wxfFS$MjgPchc2UtXt0jL3X*BYu=xmW?ZTR$?}|@=dz_G*IPSV z^4P3$4$bt{Pj!7yZ$@n*Erh`;Lb5rSlr;$V zH#Pt>8(|#3!iR&KOAxW{MF+Gn!Kw$GJSQP3!M~kvM*^*=p9yqpa1RkSG6mSAmX>w{ z<{5V}F7MIQ-`gBO1 zk~!*HjBaJC5^X%Wz50i+TZk4Yk1ipCx8}(8k^(ec2asb+WHmemV2zq~ETK`iSw$A6 z*)43V9|-Bp`A`xAPHD5@Xtj%Xk5wD-MvGrI1EyLg6X#zQX^o7c&c3*|{Ji~eqDACz zU<`gMW+ED4FC_8p?FJ>=68-*$812i#tgv~n2oHurAeD{_Ur2jG4hjk!@JYJ?5y65o zBO3Nn`DUXD%tH@J#B0Wp`3DJxGV0T(F)8VfixM(RQ-js-d$QJ6wl7^ zBqf(n0=|$`yC`@BbO$QY^c%DC@Mc1MU4N%yU>tRuzc#s2K_RF}P5XvdXlrxqSIk}n z*DKrrr&wIiF<(X#8zebK$r%z6Xtr&as#`e)k6NOw&NIT42%Jr&yHAnP7N=AF%KeR6 zn7~H!Yqa~wFn!+tKp#D(Tx01^W+WYA2$&@b>zJI>^=HJs#T^t}@(iwzLrW{1 zGzHE>67Flh>8$HrltbeY4oKh24Pz7Y$&=29E2D-TP_m4QdZJdJQ%? z%w>0_`2)Ov4Qfa?ebrlvGPGdG*GuoKMQx8EKqHBT9lnL6s+e>btQCp7rFvU7B$n#a zaf(LkhS6p%5<+F)r^9YaiG*h@ZMJizzQmytO(SR@e`4K^-8%Jz+sXH|{cdAUh^y~n zD$pV;f}51Gv3hYVJp+?>LvLhE2CE(q*u2a1G*Fav0Cx&S#=P_Iesb(M-Vl@k(AJ=y z(2coaIG$Pv)A|N@H1e;fi1&bmQa+Y~AMd%=24!Xy1fgwaG1RIqR8JteouaSu)==J= zM5dZc-oiT9$uH-I;>%zssnS7g)5(-rUHOF^pm9+NVL3C$H+!^XC+w+A3Q`_5N1rUs zSJ}k{+eIud^tNWki^)uKoJ#hp$*eKlIrMXw#x2Yde&i{o-Nt2mi6)lUII;H=?f6rQ zF9IBSiX?|fs}l(~LS#AUJR=!&U0h$uv(3%=qY&L1t?tp*)QRr4s~JsE^2oy9=w3Vz z3;Jx6o}!rik(N0Sl!$rzxQBxJOoiYmfE-4xbTj!8MgZN7#lazJ!Nyp$u~eZ!QW0O{ zAutNh-%q1&!t0m05A1xETVVWF6aAhB-*wYNtmv+Y1m&5S^?=izBCxq=Q&=8pBGos!{xRJRyAJ>6Ermen_gt zduWqht7$-~CwvduSXwkdCn%&aBcN?0IRwTm%+~T3CbGFN<2@2I+bV=4G2C*DDEsM! zCGL($f!Qk6RQi(;Mj{5%=ngnX9F>rMiM#eQE7X8Gi|N3P;sAa_W=c5ugV}o9TajY} zXCg971N3>`xcEyQuHIf_Q?6a|K z-g|Mq+YSC2NdP{`5ZZo*e%~L=EYeISyRSu!MpSL8_=`s88lijauE_Mr-LPh(lx(Be zoGf2=ux8|CH1=DeL8Vc;=@BeN0j+qyqr1sKLhUM0Z3RQ2WXN5RlU@?6S=ZsQNw=(+ z$9>U}$<+1Ko!7C%I%fb{*0Zn1U@ulUL%s}deCJ2-$9ff*jbP)0*$A(u1#xebTFbw@ z45sI^W9D)?M2b4@exz|+W(jv>pPNJpZ#-0R&RQ;=i@DerFi>K%HzMp z#J`jWBRkhW@A&6AG%MGCYOrwq?;0!`Qg%2Th`oQ+Xy>$k)VydW!e9a$*C?}ovuBy+ zgyw?eH!K1O7k57&p9jaMgSq&bW7BJfp`Ej> ze^3dS<7&cfJ}aBsY-$io@(Y{%+9)EA#$udk!b$j_N}OiFiX9yv_3Jyex&@MyrNIgr z7H8e)y%c!j{D_jMKb6Uv8jaUrv~S_|>OJ{LGSo<|6yss5wiP9WRT>4z+_;ly#irrV z`SNLjd?dgX_1wZFPLflWb<)UbD8)5ea7|!t+b3+Yf1$gcO#Uj^_HhM5^{+bDhsLnL>YICW?!ljE}D=S!;x;1CD^* zfR7((ym8V$G#CDGt^byRq*jrp6KAFaWWoaiHbkOwXh?z@uYwNjKUOZIaT;khyhpb1 zBOk_s9WGCU^7>i1Bk)8ZV2os`q-8dIsH!MP5WQUqo4QGUx8eJ{%?1F+@j-yKK4OW6 zu82U0gpn|RsXwz`=Q|T1j!;NIghT$yJYKOS`)joh`O0aEnjw71McRoWzR>X_Q3|g?53*+U> zcmhE~pjkJ=(8fR=UidOZv_4=vi}WyYU?@z(rsJ$b^JyeJ<7IEf$4^Js{&*q$st@Yr zJ=0-7)d8f(I>zOlVTl%a)kuyc=3h!ekQ&26)X4pqO~SH!il zOuwi#o-5>;JfN+77mMr)=~i?CLA6Zy82Jbv-@98lcnSol69Xg&xAo2pFKooijK38X6a_ifO9Qhg49X+@f!lF(DoX zHqh```+pOh7-^AdA2zPy$+-4oMS2F?KUem|1VN4xTAAIkKN)!smKGFzX>Ou&; zW;zS}eFJMHh_#JX#5sI`Sm{{Fur^s=knz{1s8<8W?P!g)47h+kfmE*M`S|Sl?9#mx zCXgltp4qC3B5+4H>h~eY0bgnF!oaPGEQ0+^lSzL5AU;(1ea;QJyQx`3vd5@)5Cvxw zv#UMaH=tn_ZfE<|tsF}2I>Qz`)ltE)a|jbc@QT6Zu69ASSTiUKCQG`y1FwYT5*$bv zLmGMfw9|Wt0#}WvEk?xP&`QbQHIIN`V9=oEnHFJPw!EBD7#~;8XA5xvgbdt@&P{It z{}P0mTxk_Ik&i2cO;62)avYV8K`Jnij}mx{eIoL*EQCCYd;ikv@+%ZT$fN~w@ z^``w#vGs`iYl8<1bkB?T6NkX{_2<3VaQ^0qK(3_*UVtU5Bx}@DhWYSGm2QlUV4(%x zq^|)+?*g}+3%X+;5fj;nowu!Efa~{U>77zlYDI)RA89Fwr-`AsUkeHR|Ti_oBj@8lz^yOOYGYvdIcWTsVSENW>PT%xHx(i%G=o#STZ zQ%s>?jLABd)DY1eVRqFhQ?4B`r_MDgV#_TFS4CS-U^#&>2oZx8^gx|bh;jm(0vBpQ z{+CdKYuKK6!B^n>oX*5 zP$h;WzhMM9LbghQn+~WWGSOctLPhh&_c}+iYW~a^yd)lxF*j#FgMmj5<2n_XrHN9N zv{nS?Hfa4#PV62uMCOYi$nOOFUJAO zs7B2codiWN6mE6x^T@=wbH|<+G^R!T@L1?}Kr&+X?Co(c$z`Q-c_*~{o1R(->dwL> zkCuJdr@F)}X^M7NDK5N%U-_@KekN&!Vn^%}cL05$h1h{cjpx!kh?wE-cTBpiv6Hi- ziGj_(tC0VffX~dt$o6mNoc}=Z|4}OcMsnif`o{tAKlMd=H2yvD<}aE{6DTe0^oY_w z>O?0WL4*KYhFvCJX5j+e=Bqc^cnTYiZpNA(vi`=zn-VWEjC@AZ{8K}xjsSmW8_(Cz zntisd>L<=}eX0Y%+<)11&YAuF>)P{S>gk{1PhThgC*S7x@aOd#j{ovFrZe>F+k`_f z>W5&bnzf-ahSX6#)oO|}`l0gU83q}4xkhfDPJMN^GvH#aHoO{Lrz*rkMRZL1j_LIB;hT~F6u0B> z2-w@ZKHj@NL*U)^d%xyfn-9SYuVpJDLW2G91kpj@u)g>_f1`>0wRCrb_;{mwVi%#i zoBC1UsCMD)Vt-QDm+6a>+X8PDCg$!*2F(5}2H_U_yWc4_-G6`&$=*df2?FHQugj-Z z+P+Piu^wF(>T%wcs;5+dp{eFw^`83})2$g6>CuYG3L`@WeEsr{89tRwj%q#&pH&d4$l`_7p1Dtd8-`_}5{kgvi*WJ1id$ zuP3>&gw0-YHAtJR`B_O)r!0L=vZFlLW49~8FUQz?VXgPr=LT2<+86zYz99i;18UKk zIfc4DfAyG!Aqw?0>>u?}Yr8Cz)fB?sK-yu|85qdydwB9 zxyV%MJ);ATbcv#(Bc$60sG`U6%Tt12k^^PoATbqGI7pTq56yt81 zOYx^ngeBMhbla~d#b*tf@^!HcW5q%7>|mFih%0o^jQ`HVd7_Y{drQM&Ni_GWrfB|3>rEpWoxn7UNRQp^S01Hpr*)SI;bOAx&5 z89C~mbYy+>RN_yA7;LT_XBv_R9vW~{4zIkx>GEgMmCSdc0<$ef7n{L$IQUQN(fMFrc@Bm4-RX!AbM8c zLKafi_B3;CFStxvGZNNFFsPmzK?BRV5KHn!iw*Y1nfa0DHgH+hY$R>k_Qs*|3I{sz zE!+UE3(?ix$Q63bsX6DcLTPY3vNf)GVj^U<+J-qbRaxj{px)+NXl(=Rpi2gDylW?_ z0+xmJ>2W10A}2-h-sUi9Z6bsYI*O^6zdyu{yQ^c;w1t3e=b{yNDF2q*Ex6Vs>*v=@cIYMAkkGEsnR?zDL!(+d5LirJ#D zX+=Gc(+}lc=#<1NvWT38Q)bWcXuLCp;6wfhd}bpt&+>m>bV-8IbWccjiGk);GJ)q& z3aE6%{}K6no={^klEywn0{;YtIjdAI23q9AEDgsU8qJwMP(#xTtoC|zGGhKoqEfjc z->G2=jyD9F`w19rasB&494hruh3hd4*9ARCWjn2oEFtG0PL-IeNH#f^?V_NYG{^Wy z5gviCt^y)TQ%WfE`^M`@--#uDT-4o5+*;?=b~yU_7h%f{voLC7roQ1em+#|)`Jp9F z@kFu^6f{l{U5psB>5IjNpyVBq1lY0UExk9L>0^Q>5Ykskaj<$BV?Nm#!Tj13Btag= zF60qYAMHyN1TJP1J?TS%r3FNvHdMF>V+{(-ZyPhpl?N44+}pVjj9px&eba8ZP&rCj zoDpzk2FOxAj}11r^J6*FLK_$}UjyyV<^Qo}{i_W9Q=6FBnf|+Gu`#m$<3;=b*R1cu ze{2l@Q_VWk(ug7*`zAc-&F^vyEFSA<%(33z6VW27-})0o6M$cwOB$N0Vb|4vT;X}> zCAdVZRsRadbHT$ydKtmXkOA*}Tbao^m@3QL=6k=kaC^EqJ6^$CO9)`>QA&mfh`Sve zetzfY-nG@a64=sTFK12l5#;)Lcy3bv1o4zdzl69$$W%8VmT50xmx< zE@xCODc838Hc%w4ASp6WhdyRG(%!PJa7XSAzWoci{2vhseZ1Yg-F_a=M`F+3AK#t@ zeL*JjXzD2ugw311*x8*YXWltJuFRh+Lv$NSH~o*w0Frm5$55Z+OJvvfBQHlLH{%zy z(hD)u%Ut-j=60Ih+9GhjJx^x8;u4qG#jO^5Q~8jk*lI=WLwAN^mQHQ>GI|inu~Jb>~zf=)v4E`;7>>f^6GN5m?PV0idDH z%rcH{@#~s#C4K2&VG~(o( z7`-m|ut9p*h$2d!xm{~&Tmr5j0s=;Q{?xTV6dd}mND!Gxc_HqTS5fG*Fv-!dt8SGE zvneOdgarTL*G^LwiO2g-PVrLv%w7zxjWYB(o>CqMjypc}#B7sb$Y&nyQaJf-YauJM zzZ@l5nll*go2N{^z`T`YS#j1o@GB8!Q#NCp?F8p-YC@V{G-D=bFJFsgK>pm86#+wx zCIY2u)h6vyWkv%x9vO_#_A$8D7bbgkb$CY#9HONObC0OPTy!6W@)r{5sL;U%Y^x-F z1QWWgd-W;E3?Lf9B~awbQzl7ilRA@!2;*F`B;Y6XEyqAp==q1@ILNfic&@D~HRfg; zYLWU_mm!y+2(vGSCTa~8s>(%7&M&O)z;Ehj8gs>3R9gJuMw7X*!;l#zq`LG;e0+kj zcAu;aNu}Z8!FAq>iV@_+IrPS&`)GwDOs@3F4&}AA*WDq(Ax+frJ(>|lrva;ib7T5_ z2qZL)H?dB0C8khSQ{0|)^Y80}jcQgxea|2ioFY9o znw*kxUSe%`M+u_6&t85!rCiyLo?##)Aq+|d{z0bwx| zJ8QC}$JGn`pGdqQwy_D)tZD~VgGE$23Z+okBij_vH@vaMq+rYd1!0AsfsVD)X#W6O zx|??iG?l-mAkN8#8rD1c83jV~81_;f3Yej&PECg?V_q3k-Z|w_&=E3zg833aiN!@J zw92-&Aua|{r~&CX>U!6`REHX0NDm~r5!6yRh?t}(A(@on@;9y5q=VQ^d>-oCLe9l% zV56B{(_0N=S7nhGs*;N_Zd;8fm|Psa-X@(!YFTt0ogys=n5OHWQ=q(^qfC5e7nicI zYl0}V1W_;w?wM;0abP*u?KS}eAur0t6jI_+V7=+;KM~$S?hodD4lUP~LyD>e#z7^M zW2h|Yo@=sMfluuN#Vft`|IH?B$7U80FP6Gra;y|tKMGf#w5&|7KBeR^53VNQTA^}c z{?ocD^gI1Y!_ufwlvaM$@pK^W_6&w#7bHL*$bNEBE^wPdJJaj7?byfD+mlgVll*^-}0#4-J2!3Lu^@;0*=e03m@kG~I?rdV*oS)3eYFA~||9{S%OOf zC|3U)UU8MASbhF$Q2Ier`CC9f;rMOL6#n!F)6z!IJp1}nbfgy^cu7%C;3JUfZVcpz z88dG3RZLX=gw_`id3N0W{X=7=$9Q)Ve&MO|x-1k0;e8c<`7IY}z@Ya+@X)%D<<~+FDKX8ptW#pR({A{Y7$AB|fivE!u1nv|EJHfQl^gXw`&vDt8<-X8jZ^w-uSLMd2d zteIm;i&_{^dH~8+D`T>8X;^#2Y~(!3YG6E7(hQij_)RI6qcIXED+Dct z$XwM=OFm~aOlI&KIi?W(`V|n3Q$`~IG~=i>1(+(Y6lP=%7}j68`QT$HrYimWRdb`y zOMg^XNlazK8r){q?Dqzjc{Azovsis}+;OV{iqXkKd;df2bwVcODs=SU1-@bT3G=#y zE$>Z>>N*qo^%$z=BTIhS`07G#jQ8D1{|1fNYikRhMG#ur5H9!~bLbTs13V6lzM z`m&Q~8~ib#Ib`T4Q(*DKe(R?z2i6TCll5~IGt3D~7FhUs4bhWg;#|)a;8*IBji-9_ z*4_l2K)z_x3Kr?A2AWFrpY*du!O?9Pgq-Cw<1AY6)2PBHM41agr(YQiS5q<*Y$x+8 zy&Rb@`PddDq6Y(M$9FXdKz39ixWWVjsgkWk+fj;!{XCI#%fV5PM#ofVzu`Rv7P>$VaJ+^)wzgQISylp-oRDfGc6IDTGdHV%EIO6t|E%>*fc_;! zRB{V-bDm|_%-w3KPXd{$c6Ugat~SoDja;#HCQw{fK9d&KQT`+2UbW3C5&+;C$S#CRgz_w`c3nb4XS8lP)CjZo~;-s>ZvgN7tSY&9j^w>__)wl`woDjty>4H4PjM0 z9^dB$4Q$4sMM%-nz^uA~Ss77ISBQAVvG!XV8A??FyWTG&pYIpFs0KFXXkiNRt+Wte zX4Y{!;SApuXt1#8w!5u{$n)S_GXj>iDlaoC-%7?6YrrR0&95Qrd>*Y8>2A)GoLN#o zqcKFUjpmQXCA09t>JMv}ve%*#P%r#oxoF9vpUI7y7^q1*!M!myuJ(6~XiKuv&$ao7 z7>?g`{YMMeHP_f8pMMAQ3?b+?pkK=OzPGM>2JiI7{tsRI|D@_a`jwHD?LTxa1MB~u zQDI?V{coraN18TKKa|3+YdwO~mOvM-cT&jcUNfzt0R9EsN1-$Dh0P+!HsUT_^Ymo+vKkbrl(ka(DNtqa7rEoFK##UQ9gb8JClzo#Y;A!n$+YeeXp~K-8!5vfEp?d+H_^mkShde7P};(BQ?qO z0j_4)W{!PmOy~YsG4llE!r@G7OmVUU(E|cVxhE3mAWJ0+htG!-Gb1d_R*EEy=aDO> z2qnBgqWjsD062BKGNteg0^^Hwhz{V|D5ab8Pozuh0*bv~tp(uRHME&->(z5`EB^0pNl+B_63#)n^ ziG%hSB|R%C1BTWP$N^m3z*C*?^%sh9kA?&zwDe{)wsdS%?5g&+pfKrT5kitZb1&d`{rxmw45$%=gZ4y25H z#pdYTP%WGq_88oyfI^EA9~dcnWE;s;#-C}en=v$&jR=e71XDL?EX+br%d?k$G>+i3 z69d7A`W*KKv$dsd;)mRqV%GC7qHSksF2m(+maTip&uGj5qs`f8q89IsOmUnWi@B-? zB?tmziZhBq%M#Pb5QJi)Pv;U+CUI!Hm5^*fE!C#Jw*h0tqTCVVEha~)nim@t8coIN znV&4Ol9O1gD{>|h@VCFtg`LZ>h}@a>EDT4H{O4FByzyBSsR9&ZoB9uZr*yW|_uz)57Z19>l=B&N2Q-liR78$NIUCfqt5X8p0=B(4nP7ELr6L0z=>{14> zJ(Ks*3Ho%ioYWJDBh8Igvbq$D#r^)W+WiPbdD>^khfXubj6q4iJTu4}r6e2@pW9q? z^#zZl#(^`>Lj1U5daRF}JjfH1q&qXAtJN+pi}>v$puEwDWR`5K+}iYqcXY-v2*MA5 zvyBZCRFz<2%_XdpxK+!{5n+SR*#d^VzF0yhHRdn)ri3aksCD60{{Sn?PB;HR3AfvN zSL**5Tf;yD)ri``|s7x0giAD$yyXj6=wZpZAg!-r%#u4^Pl1$%kURZ%xR44Djk zU;TDDDDs^GOopT5ie>x0e;S7m&-uD(d~XHyko|z84n}{%f&SN<$Nwvx|MHL6IR2x~ zGP3^vZz2El=E1_q`rpuir!=*qHpl<*j|fJ!^pCow0uA(OGZ2CZWKr)CrUx9oBVtxu zSy{*4UP}JzTB=wvH@HF!8%g~+E3ckV(^H9R>U^6y9{M`l2y=t)@wI}hiOuw5sWhPZ z@`ktD3=lif;bl2TGqbBEHSR*Jx(0C2}NM+z(;Qb`joD@)2#nm zI~nJfMTnyGIU+!>1BX=VRUvrHSw4bM?q1l?6#7 zQ9|o{ucMQs?6X}rcv@?e^s-)Nn0R(faHT=M;DhQSe_WkvLVU>qzRzk@(wjyl~ST8NvyG=zQ4pw~(~rsFm@GQ(`z$eg5$T zl`gW-UIHc9Q3N{$vJ5+ku~zq0HOHA}Vavap=`F-aEoNQ_PJKjQe+!A9C{6~Y()zBQ zH2SAySYb6`pKA*KJ~u<5uV;rlT4y+XO%O7?1O8}&bPc9)M(_pZ8sIg{PYsSYNpvf2 z4$=y$)@>wZAsi`w>F+eB_}D-W=yu-Mmo6$6)5x&|D>V8`BPdHoFd|U~3v^fCJlBLg zlnu>lM#c}D++RgR6Glk_`CMweSj1Htrx}{PLX@5aG8|T)V#5a=984haH;r+}M%@x* z_(NT_3xQ{vlCUUm=e3O7kib+i`Zq~5lY%?g9EdSKq4K4YawV}RL(~BPW?3aZ4^AS~ z<+qAL;wN*0CxNS?ORh~-bdOZ?*xfY~Y*M!m%w%|YQeGBFJ~wEAlC1;5@p<7mIpMLn zRDcy@pOd9rvdkcISkjIXrA?YMncdOmODGnDPtpc4-%5=5u6uYDK7k=Rl-q5x_WgKP ziO#0g8qkMu*aTu@*hhB-nY%mZ(h;LAo#`ElfiR;yo~UATfiSIdz43UZ=hmy9A>cmo zF4jCtcn&`PRFNH^lB%gBNxYj*OVeh*3uH-jLDF9j;HG2ZiBzE-*HyoCt)Th5W)}oB zes^N+Curob!fU8e8L_airtMdv=fmf?9p<|G^cI8%ak4V zH%ff5!|*SPUgRi_eQZI~&8zx$L$!$n<3Y`%smKECx3`cdLe!ME##v5>obvOlKQ+YR zm%goM&=P!x$4A=UlJ37N=qa;R09-p@cUgUQ2_C6*C76#r+!fL*QzjJ#I zBSP`D=;q3rYph|ymJ6If*6bs;18|OTf?ZwYAQC&J@*`EESZx{62|4LBFc`n+k+Wh* zhdbq~2@%(iZ7^PRH2Ojiza?T+4RKv|QJ}4V*J0eM?g1MJjP=mrPjHU&_PuE(kN}ae zX^9(M+%LTno(AOZ{p|KAnxhZXwA$mEA^}hVFx!guiM8@}Sct&)8VQ^QLX5-JO4xFYF|mp-`w~d5t;859x;{aeGZ_wjv_TK( zVVgZJhKetsaLdKJKq8f}pbTs?&LJ5qC@P{U8fRtRooOEU;oDDnvd?)F%_JtkT$ zn#=a$+jIC6186gFRB~)5b>dV$ol?Y?*Tn-_riOrOSTi}p_^cQ#EBd=)AcC3-J0ATx zyv4JuHeR(*uJz6OF4yORNBh1U5W{m*TMeIj-nlYABC zUTB*&tVCu4;%uuVIaln~oD_1T#6N}HwgZXQ3NJ>9Pmav6qXKXjsYmR~&{LqyDEf0t zj1t%&aGIl?*$5V%m-teU7HSt)A`2pRbPVM4y46gr&=}-n7gs`NFTGYB z>UMY;#9;4_4Y-?YV(W8QTpNOu*=H$g6}=@f9X29m1Yw z{`BijOS;7yE03N{#_djv^`;9;+l*3cbTAQSmxqksP;?mW3NUk7MZ|OxQZ)IrH9EP+ z90X9|I+ZOmhRs$;ArI=0P|$O4+hc;$MQTf^#It4^mA~zSV$PFwAXto=E>?=Pntj`C zJtrVk)~r10HOkKgM==z-Lm4T#q2a`I%=w#MYEu4Upjz6Hl{_3ly7JZy-<%sKp1qbf z;t;uL^6_PmoO<@vN_Pnz2GO3-rx9vjMB73pzBa6Sao&$CdP_GC4%j%`v-y#+x$%^} z3)dfbd3x-gapyGF819ZTuB}hYP0-x@YE;-8tm-u+U}V(grBnksPRsyD#*TLx>T9B|ou> z8~cptW(Tk;@Qi`xj%Idf`|*1FMB4&2zNqMCBiD+8zCF-0qJ={#K_gU5^16VrsyVSf z+A+vsi5u~xlN+!OLBTVs`deVAK#x9A`W7No%@oS>QDL{gES&cSpKE8x&E2g&2P1N2 z+3Us!piNv#v zQI=pWc6|m;rgWbYjcfZ{vg>F(r%D^+<$y7JNVb3GH<}k$gOWB3v4Z(d&Y#91e=j#3 zwW&4DJJp){XHd4Bi88jM%bdwI?Gw-bXVgkFvPF@@%d?(1x*l#mkG_EvXypDCN|Cq% zw%S{>LQx!6q~hbg$1g94S6hyb`%+%*0$Y5mSrz?CF@XaaMh zNrCPz*1ln**H+^+VMWXU6J7WOKS&1ivq-ozHYxtsc8>*8=Z9fO8{CMf^pewod*lHR z%J2rgnw9SG1AB4w@E09IaH7TVUrAfyh={w$j@dz=7G?}>5#SI;kU1pw1}2;q+S@4< z0U)*=3yXR2e8^m|b?s)ML{n^obP?nLjB1WCU??0&qr^SIR)nrZ+C-DZ#Ir{%xDGr) z_q6rBNGs;eiurIDb7hICn=wV8;va}zc{*y#q#Mg51maLz=aDXRRz&8&BDK#|v&Ujb3pfEjx-jMr=TA99>ekm&Ea!%DD$s>>ga6WNhuG2k@{&qz zbGMsKTWx`c2~InN*Qz*^p#)MshryXA9+>fprp!7uGSj&q@W{y^0is=4q+}i; z(N_U@doA>cJi@tx&_XiP+Jjn!&9~7S#UDi+j7e1xy1@?`PIa-AOlWD*%trn8By%xC zLS@e7^yIaxG8-)0(rVL%q$t*EN}Z<}BzE_RjHZm(Xq8L`*Ir}253&JCt(^8MGRIO0 zF(Z9KgCqgU(R`b^Bs`)C-ZgV`JF^c#1=?zocSzl6B0Z1lMADQCz*)xBAb~o~BYFnE zpB5P#?|Qnd>FiN>K2-eMrSAkW!F~Qag>*N(mFd2^#5VD2RXzn6alG3QMPq^Nj3NGb z!-&Z$E$iyAjI+B_;P{0kQ!*rhBQ5XydARWU0MfhYE>!#(8s*aCHV90u9$5Gl=GM zU}S6xB=B~6tuI1p)`3n0+_n{1V!7jN+h2Lj{l9y`D3uBw9cIMh#pfvyCJ!b;LKYku zQSEI)b99Mf%u;qSCLeCXIE-aO0=l=fVAN?R`eOcFMxC*`lV*w8@eFQ)!-Ks7XS!@V zekRAp)AP4uE3nLb2ZmT>c_`%`ecaV^)e}cf4{=q6H0ROM&IkpM#fpTZq-|63jIwISc2a~z6q>}Qivqh^Ww z1Og?!0BSLf!CjMeF^FryB}9<)qW~rr?=qxOQjwoPGC0oc>QE>^#tW-Tq!38(+VYmo zmQJM1Vkr=5$npUc&k`&PbW=n)m0H-AvnoM!k*MY5!56(==egKuQwd26iF6@zQGton z23u3cofq#f5*?(tOmB&e)auTKAL_uxC3?+O8JA9Y_Fi5oiNY$o+^u9}N_PYj z*2$45_br@sjMrx6+M8Q zkWDeA%Ix7K4Gp0h0WB18nUf2s$S!4>hkZpF^%qp;l7Hz@Wxyx?AU2S37WbM1mkjvJ z0&SOHs8IF}VVOdCKu#0LQ>3eqWncQ{Hk;n`n8c4hmZnh2WY#f_;xS}x+(q1`@FTB< zetyu0A3EtmstC~KBf_5E+bK}`Hj^o>qQZ;rm?Xj}4hF$U72VT^EFWqX0GXDoBPnyZ zJ=mYOi0t@oZ5`Wu)At*ZiTtByXIa2jac)V?X^2ycD~YN*r=d9)5Z%<*5wV-5XF5Os zFscNK~IH4wxI%GzZI|@VAqMH1$-Qmv?bTZ5myxb(#D=9v=_P9pQq9q+gQhR zuSc{O$06Ct8YrOL?KgkApr?)cWHB3-D^?-E7h$C z8Fq@01w5&BcsrysuUg}g6M3yM_@-p+bLR5x4CQKG+ukD%zSm)$Wur_-!NYFe-uB!R z7+vWDm)JiS*k-36Xxb7#0!xh|b24}Oufi+t=DNX0)h4I;cLa)sPa`dzX7zmX!WwS5 zb;{8mXpD^yLU>jF&E9*=CS*@Z6=5(vz}^PsM3Gem!azs<&x(l`A{YG*%Qv|7ALfDo zOWplju>DKjF*E*$_r}chzvE_Dn3?{YxS6JZyf;?lAMefJRLh{VeIl@ro-Gv&NTy>p zY(6Z1P3BjstjON*SaTrN~bkR@Hcy8|Rj(*Hgo5Jxzap{Bd)%xA5Mvb$xtvH=-o6{%jA$7uqwz zmN{@G$`oG{QD&>B#+F@4US@maCX6J?tTNc^C&_NG*jqwc(B;#@v16;7k4at}AemSp z-xV3ljGqz@27)IcM&ixdu#Z8S!=OmT;VN($k>&{0=s0V2$zt{hkaBtTqAky11(*wy zZ`m8&FC+qY2;z&o_sg58B>(aU26XiB{;!ptdv}iq_qRtfZ8tnV?x*v?=mE)0&eqAU z{vFrD*>O`b=MEIEa?NHUu&;m?oeq<04|ic>sRbuMwlB!RJ|6*#_xG!)$>o8OmG1zD z7dyP~*yXV^eF#Np4Rr9nn@Yk8KxvF|K3{M5R&V#MDAhD`rO4PdOR{7IQJB`jP=R5X z74r;71``hT32W=LrmU8YS3a;<@|(qFkqwX45UlqN`=k!Ln=QIHStKms+*;rM)mWzQ zB1gIQ<*AjF8~jYLd3mFc*DkCXEnAiKi7vHCF9q904vnP3K-ayd4#dwmub$1M?E~qm zj!BT=EZ~YNm=~iXoLVGhEbP2@gv{cV3%lt#2*jX^B1STK(XGlmxj(kqf~uxCDcDoa zs!U233aY>OV!ZeQmWgF|4QrRZep~3P} z-%U+-jitXyzeYj>6FreTgQ*OuvVeOp_`JXe7T zhZGKBZ444-*AOSoa*IOw^E5)0A`?W;>i>?6fT_Py{0ODuPIF)0$ghl(4`FdKr>SB- z2U(8X*BLmzj8LdOL*6G9gVdJTUAvYAzDFic*o$Qo^=c?$zO*Zyw@nR?q{$!{A1oLM zf)AZ!r@fT-9C_>OyL;U#$f7A5Xc=4RC3%nX5Y(@jma7{vevwbGT(MvXO3rLAC{Kq9 z9yX;92vRUfC6|s0Ew<7T#59+tnZgVRn$eUMJyq#F$LzvXj=+g}uDnEsE>Kz+kWF$J zR?v*2#zL<*bkevt&-cW_yC_jIxRi@nk_maqJcAOs>`YqAV_5@71;@`@3H2vw231u~ zn$eUPYCMHJeBp33{z$SUCCu`1O^Fxt?M zA@S$V*UT_%te$v@JP z$L19hVu&l%iQI*iM>MS|lfk>Hu(`oU%$gwik7omS3xV zT89I^kxMYeBy3zfX+OQ9=}1Djg2p9Q$F(XXL*3-i#Dvq*Qg+#PUw>5BJu4tH;R#^5 zHGfDx+fg(IQ#E96qD!z;@rOyMiU}A>c6O*4Ao&xF3t30auAwH_P9oZX_V?X_bPZG# z8r+uXdSV)ecXlaVIIQd{2aPjqhk9G?#3vHDrz3%7P+Q2uE9jLhGJBh4sHMAbMNx%r z9{cHodfob{9UF}y*m)%_t0gV%+1mQjC6<;*fSV67Ex3Pek%~Wo zy!%tYG2!)SH>ZNBe3A+Imy3WaL;|MMD4eA|`GIs9#PgZS) z*}&)3p?$H(wPowm0NHzuVf(Q>(QtgvzOq2x(I9exSP9hg13T??>76-Xo}i3+&$)5_ z%$jgl!n9We05>k(s{-ls=)3Cs$KIfGSG4!e5A7DXLtW;L)YH-niF3U!H#Zv~_?T6N ze(%{Lb(*1=lYl*qARjwx)!pGl7^MC*T7ju}!@j?0(RG6-=WeTjIAa?j!0PDQbA&?^ z?0^Et_mZlwUR!hW@7gwiCro(mUq)T?-th3~%E$HfWOK+8!G2%#halXOm%UOl^Q+PSm5mfa7XHi6bu@g%r+(>dvcs#uglrUeW8gScb1nvRJ0A{c%M2O>e0iRkyxzuH49M z9~CR5f_wDNsmI&`JIHBn@FF6B!pLqjq{!QF0yqMQvi2-T5D~EPwc8AEKQAib)T9?~ zo}=t!%x?P~+4ww9JAB|HhhX4Ho5Suh%|-fu<5YlPP+3n^X@3cWosmU_(&$Y)afK{WCzq*%XQdf z*URe2Cd;HWzF9eR@pk!ovwuCWTW{N;`7sv~NcB7aA=k-BVXeCJlY5EE?Xl5C^=du$ z{C>H6n^^dqntFP_dg%zQRL#_BLI29eMa$d}nE>b^@w6~@@>f)04Kak+9@+=acnCnKwW)Qd%Fz~kZ|>320;%t;AS5m&Z8vW$cp zd=b7B2fx%)SzLREAG@!Q=VxdFUTn$153Tm-C*9`t;~o=Mg;CkDVKJNJn{Xal8- z!0O#WU59~uh-%rVD9pXwr9_!~ySjQ;sZeFOI`P@PrF|ba#KJAI2o!F^uL+twfKSb0 zZxuo1dKI(4N)q4Kx64N@AESyO#}q2pD5JxWC-YcR0&s_B=v&t5rQ(*jzLyvb0j9sM zqfz?h`QhQ=?g(yFJr}o!cgHL^?`ejCj#;mn=r}2D>bP4Gq>6@d-`9vO{)}F42kt#1cg2%PUTLF=LbZ0A~ z5W>vl#aPNYn>sB2er5z`jMCT<(q$tz1M?bVH4PmXd}@_50Basn@M#yGD^6x;4U@ar zI(i3cj5pQiFtkCsF0s%-K1SkAdZ>YVOW%)aMiV^R{&Y838{Pn;j1<_8Fw__GQkNkxhzBbqI{*G zEnUSEk>M~6OKYFTzopMF6^3=>mqgROj2%IOVb)~!X*gP~`oMQsiC~(ZdVA`+V~l-i zFj$QY@tZtkLO@}*?*R<{zf6`)g@;**LJbUJhx=vn)?wQCdap;cRGkG6mERCbkrhc( zu(trW_LHdFftBA&u?=6`@RxnzJG?8$o%y0JsT-uRo9kcY2*SkDYdR|Vrd(GyNf+%i zeo;U!?ke(8zLXsH1<&im-W1{A-)V&Le5XX<%Y&lMVhJsTd37^K{OJ~BQER+H_~Hwt zqonU|H7f~u6*%BPeqn#ZUXKpE%&19RiOg>i1Cp5L07bXPl3 zPcE&MH-t4cHB!eym)p)8NqFTSb>F!R;hDCNALTw#(?Fkgybg^U1P2~1z3Ka-Ji;Jy zBJ+q<^Xx1M7cw(5y`V8_&hU%Jkphxu$-mM1QdCU)?`gcDs-Vi$}|W z`dYf}dHy^L_`ms&19Sf|C7Nihks?CX1yp=BvdCTypj_n#K>^Y$;+^mCjYFW;t*`?_t7 z9&QhxiggQDmgmpg$lcVjeFFow3dXW3TTR79L-|j#_={FCe*+WOwe7Y|d*&1s-Ct)n zzxTJ#Uy)yX&v(yL2R{j|cYi+|lmUN3!L6T}TkbVM)EuSKG}>?XrCeR%HFWH2DN|g2 zCa(e+UBzysHoOb3(@}f?%RBtRyqwV7o< zHgxfIc)cSoT+dSicU{Q%cc}%aihl?6oE6xul~h)41L0DKZPl>R5eh#{?`xQyg)U{- zr}F=zbxs}akjiYf{nm5i*yKm*#_R^4PVK6w&Z-F{@vNQnB0i{CRq2zov+uytF@e>% zp-O*A-e-9sKi^gZs5BrezT*Q!=c4cIS+pzPWdm)}e9nY=@x6<^77J?|i1#?>w2Pf? ztaZ23^^cwYGa#}hJtx48Ie6quL0Ie$VHp5|=(<`qY(VgymuIor!T`()od5p* z{EvgtS4!I9Sma#g$(C+#7V07n5rEJL(T~_9%P$_>@`f@pABIf8DUAdxX_pQF%`kF7 zq>JHfD*+#GB1E4;4uuPXJdp+x0^LWbh$@Q;Ly);ii8`2|(Eu*uh>6S(0RR~A6hG_H zkQ|Xge5fWUX!?u5!xk2LAF568E;JY_G4Pw}XhTNF@Iq#pFVxoEABCO7qB5K!jia{xK0D>cb zQX+19ktzqX>V~0o!ND++152Qm0~Jau=VvLFnpiIuC`yPL_97yC5gD#>mVtzZOJ=EC z5{0#Q_JX%L_+%v_^hgs#%ZfGh0d$m=O1uz-Tu3J1czBM>E>X9~+L2ITIn?3&%iQ38$wShu#f>sAOU=ltmavq!=dxQaDLQ;>FJDC)VGs+O+Fb1Y(44PDr3d;SmqIMuz??en>_3a3kVf8iD!a}ABttzIV zs&=2L%t28zDu5zfA)%BYwF%$}QBEQetMum}Qk+RRn_&`c!%jO+un^j)va(lWZ=8)A zN9#ycJkv&3VzaFOD21vUvQK@}!5}!cX}i)Tjd>HCO*+GDoetMq zd8*NuG#HM0O6f?ob+*=H3Z0_MMeANa$3KHZ3!`Du_!>oS(=(17e`yPJD42;MO<|Nm z-r5M9jL^jnQN7GU{kx%V7C}&5Cv)KWXiFM_oGw6?@Ec=Bjxf^JWG-sTcugUIeKMVa zBi1p{a#(mm;7nAF&(~~dBZ%tbPy}>|%UGhQv98l=mAuM|W3#))7c&@_xBCk`+xh$X zZe~vE4acS0V@=2ed(?Pc7No-AH)Aw#7;2_rhh9eGR^eWHw|Y{_d&Yu0(kn3hHyd+d zLP=Q4(vGul60d=fbU8BQymot43PL6o@T@8#c9;D`&^VzLWh zibIYzzj1WjZ7&D*xyMJ0RQ1&~x*N6ruMZL42&n+-yCYN3kGJj|D%A^(ZfGgA#qrNa<6<*GqoT;T_zy9oGp>^G?9vi-Z_X2(=m%T& z-vZ+y)ahnW8iQdrVWr`z7)1l`&F@ZT0)3f6<8W2^enf^c!|f(<7M@XPze;jisZ&c* z8h(>P*Wlo>$UwEA_Z^fklhjd&-FEcC!H>HG@ZEW3EQE%q<8F!>9L&RmtU#~j%2$iA z`jt+LaJ{?q$I})d8ic^r&$Gs4PZE(Zov`Gsoz)xu8KZ<$H!Eq+(XcD1V*SnvGu-UK zDlQrO)$q9f$aoJq6eh`5oa73V{f1E?LWm!~bH2YSTHFMRG4Qa5%i!9W^JHP&bMeBE z;FdoMvT;OB_cfBO?;x7C%71X)QzYsaX)p^32)2$YA`Y~>#&jPpyV@aBKe7v9$i}wm z#+CR>BDLgRG%?dxMP( z%&6KvFkKT#TJ>AER&n5lFmTf~z5^hb;_^HIxxq$U+A^rmMuVQ`muFw#0SH4f7R)h> zR#1U4>|cMBdDV8&&L>0n3cncJl*WgpA2o8qPA6~}T9%2Uu1G+8{8^E?s>4U>puyLJiXd721Ls&F%YewqgySNqD~ED&_X+$?5=$v_66 zSch}$q(bEn9vtbn>z8cbU+3?qyXUhuBvFZe@;^#jDZ?uBm%SAG>qXml+`=df^h&*n1bH1uWmJU*gBJyG2 zbwa>7TzdLRD&NR1IEv6bMG3Fo3vEoo7;p83@fE>R_2)oC7N*-UG<@o%1>z-0~&1L;|KU*tklW=E6_gv#iXJ0B>85FUh3piPpNf zVALjoQs`-CHPr%hy5CB>S>049UD{;l9}XU^Q;vB&dCtgw)>s-78t;F{1)1kE4n*DS ztt~d+^YP}4`C*62CcP_nfdR-13+|Ng`~qA??q{mU5fN4bFv9F2+tpkvEd24`}B|ncb6`OOF7kn~odQ?t#D7rW3I0WdoFU*pM#c-%gOiW8*CF zSH2^xL!Wyvu#-DA8RC%gqRug91^Xo~xF`G}hOB_Asg&sNrJ0*EVRLHeyd)#CQ^t{o~v z32@HoBrKF$_WVPTUW5crSS>2_N+W}rqNkge+sEHq=}KSDoY8W0yWEl@R%`Se}o-m znlOMKpaY~M(1XUC)+Ph$9(Wgjl`1t@uBUmcu)@>{tg`Y*w;q{xmNi@MqEh4J*<3Q- zA8Qk{%wIyX&NHTXtcltoTxklk+K@;&h|4_Pd3qBrpMnR;LO!BNQUCd2@bz`^W#-mQ zG`53QGRc?|bui>%A*mQE054gpMuAZYwwQIq{NxEQ!KPMH0rau-w{6SC88zLrr-4r( zdDJ-_l2Wsad5F(U3h($kWwiCN1#^A1Sz;^uRFz^EhF%7tiGa)G`Kt#O)MT|6Ql#xM zv~@+}I!)GJFeESKy{O_@>N3`4!Yov#uTG3C4{pPM-_4+%4m9$4Jwtj$em$UVWvOBW zkKH@B5U`l33K6A}A8_4w4gnYpW)$R4oVh#%VNei}TQPMEFgyB9s*Wo(&KE5NB}_m% z*{`98MTLSB$#qZmodAlnCNKTDHNM|*oIj760*+xX@XI@`~A`>0N&lszW>LN9XrE+vjVZC zv0?kuMEdO1Ap8`A6pl`4b%@ode`Qj#%!U=fM-9vV8kA`NDF!!OolZ@MmMgAG$Y9F_ z!mwi;OeZiD^MVg2`<_jH?rtsbPx%@>o7BE`;zF8&E<}LqvI2iNU;KXT%Cn8*1H)e3 zl>xnu_Zd9f)QOAK%$pY2v-hXvo@l@KmZ+yGL50Q|@s-U^i)yhs01Mme6k&hjXqeBb z_aXZR_oGW2yBk+MUT$xpG5C(p>nq=vH?~e(J|AxgA$|*paV~6umdTjDO>{oG{Ghrp z5{-1cCA~Qk7#^L(Y3)Rr88}>thwx`L_teY|MjpcE+>1I!9{wZ-je_Em@U6RQpApv5 zYoRz9Ka`HzZFt~KtU5O^uFfuJBCQHn&ObJB7RVSWp%08URyLp@dEZCJBF9URl8upx zi-pOcS)y5gL)hyuWffg)Uib#ax@`2AYj$N84Crl+-$_d+J15gXODBUbH_PR1c(-KYHq^FqgAru*GLYBH>ZV90EE_wzhsZ{hi%9 zJ%?Ks{?)6zrh9I#;=&vY@=Ht!h3B;MAUk#WCMzEF9=)Nj{e2YjLeB1Mm}0AI;~Vj$ zuwnu&qsbBKn>Zj!7OuD>@yyne^Bx{Sgj_y)AJIs2FPW4|IhIB@-3;@_BKijL#@0Wu zUzh5X-V#oqoCYb3VpW`RSC>!iKbv48+_y84oMp?s+@^3E%q&nU(uI>NF z*gFLY)~#EcY1_7K+qP}ns;sna+qNrh+pM&0b?$F>^!dBbj_7^2V#c~$F~?Xh#*<-T z2O%K5yboY!y*W4-g(aYS5O7-@ETBYoG(}sfcGS6fp|ra)P;8+ z^v*b4tK4if3>nyqJ<%S?gV)(UF7flO~wpK*jz7PjpMrRZ_=Q zQbYU)EuFctg9)C&g_7H4k>?rfz}jz8U~z?h6cBn8dNh(Ksk=xE&9`!AxdJwn--*X0IMr8#gp{G40I>`dA2LWG8TO&w4PpNluzjFG+nkl%`ww)&vZBrcfo9`r;%S%r4zo78#RqE=|Yq#RG}TJ zLM&@S(e>Nz5m+=HY+8%z&QlD|6ysPRxSUxLtEFskQb%!W052I&HIgX?V?=lhF0`q~44?g;ES>?c;bg zg@c&57KzuZ8~*%kM6mTka$p*oh?g)7N2OBE4tH8*P$)Vxe5sEtCIpG{sE@fE8GYOU zV{we#d@+1^DZG3QILgy2-!*vr0^DE7bG;3y6GLatLNnT8ifSl{-O@P1)htnRz~EVo zf&N#ML|oEnL?m717<>Ez?w`z73|@q;k375{co&fB+opKj1Q)OKQwji8 z7ROf;VuT=CZb^s6oN@(=_%_a~RZGZ&gk$ubV4TxD_$h9lSIL@G6} z<%HN51j&U}C+$S$+({HP)~eUf(vDV5&zhB5d%6U;O4KL;4_oyfq8Lj5#@zdRxIO4 zmIx-z$^k7bP=UmeO=jSd-t+u)2Af{Ox#wveyzj6vWB^~wPuk?ZG}JqGk6Tb)teEq3J0@SnCHc_4_@c>*TGEhf=;jn|=#pzl6O$*_ zR3u;9e4-gs+AL#!w}H{;J5rWQDo?pvAOBLWc)V?Z%pEIia6jefP+X?Fv;H4rOq@*r z>K6Wg^plf`^}mRq`uUlPJP?EV_mH{)PjSb^PjVK0C=HECVh9h7rv;O^Te|T=I_X$X z?AaY<>g5_NBrsm*dWys0uK1 zG=Xvhuz|*E@qn)qk_Ek)K7+HR)Lg4#N^c5KR)ZMuQafq;UAeN`UAz?SUPer*uW(m< zHc{)YNm@MSm}^N4nM+zssf2aRYw36$*CM+xKaRLD8@fRk^C%UauPb>*Bk^FOZyvpk z=$gK^noQzWb)B2OnhxSdTDZ^qVkX2C$B83i&6^;#J*HfMtXY9dF3NrF#4srXNuEd# zfzAR-ux2xNHIQV%bRA&P&7tfk$CFEy1;GLg#;d~wy-P@&F)c(pLX*A9kscB=lRVdc zW}crhmMBny#q>-5rZOC9)aE|KdXb4?GhrZU&SV;MD^YW!D+uSsV^5|3U}$!ZFuhX= z{wJ+q2A+P$;c4L2sk3%`Fnj$_x4H-HkXyw5-I$zz^Ao^*)cvZ*ofY-b7 z2B=tn+rH*Ts~x{smjU}~=O%J=;7hs_Zj%3IzI!n9`ja~O7pX-Tl3Vf!djHDspW`BY ztimk94n3P+HmZ3{?+M;dWREHW;q|_#+aXGMf$Tk5+aw6Yr^Cb{u!#gp1I`CVgGdL3 zeur=0VH!8BsL{TM=ewI?6Zw7Q1m?N$yq$@&L#;S2(s9J6D}>||hKN?Fc|)snE*Eu; z9Uil)Vi&8^cF-4cz208uJhVb+5a)bXJH4Wv-fJ6|FqJ1qP{8H3%DD2|k96lcBvF5R zKLVq{qd1ySlfLH+RXERE0gK9eUHXjqF+h$=D3%iu5+8?zt4I`Ejfm?o3>v0E{E|l} zzQGJSxSIf4ZM5L(ypQ-wX}!4m&-d`ak(OxibzC=z%edA0 z{$f!gu_`$wPxu4(DQ6KAVn6fsX1=&t&(Rl%chUBEwBF=vKh4C(9+zUXxOlgJe|T&# zxpl!oDlcXaWa&ADm?JfhT4B4uV_a3Z>=6eB3JI12mA7i-z`yXcAt4uA`KmHPXcMAQ ztF&^or*h)}+3c=O&j!BcgCmCkKe=$d-*R`VbK~{tZ=1yZ5?L_=#n2|hQ-_)nX5!;B z;TO&CJkIQyb9Kk3`_0mgP0uZa+AgQ=$b@4xXOhmyI~RXh7k4QvxsQ>Ik(!d-ht|f+ zhn|vFr&l@>^-8Sc>8MzQr1~gOth4=J%PKnMAhb#jtd8Tu05YYx!G7Z~PFn%-RBN!PTLR z6gttc4I+_Bm;F$1UVp*4l$CM67i#j zd8VamIHZ{LN)OLK63NIrq1gn~UyE%jT1!|GWGU8`8A!`;JZ%O+Pur^|hjC?+TS(H* z3~ylnH9ewm!46Ew=GvbZ#FA4(9_Ba4GG$p3VNF>Z4B^c5phkod!H0O3!%Vl}Pb5h6y#$@)w8wB&5Ca!Wd4R|~+ zk#>1ktd4w8FEm-hBV!6DzJZ^l$i&IJN&sBHCZkzZg0hwWaveCBc6`mPAH6qSx?Ju3%UK$wf)REs2r_YBMhAUc$n6` zb-U$a*Y%yr(7T#&yLl7QZ}U0hdnUdB=Yyh!{*xg6TVwtaBvuZF|EIdg#=!KyyMjN5 z|4mnLNz>MTN4ycIp+_D4r^NU5^z!c9@~cz(Grd0QFe)`2Y_t-np}^_; zClap5CzH1t3&*wo)8X@)J!@+__sgrhtIMPF-7vR)%B<6#c6aC0uKCZ8G-ab$NL5~( zadmQp!DzU-zMqq-IIQ-PR!$YKez-lFE$LKmbG~=N$HtD7TH9k$EU4OOaV}V-Ut-h+ zIPNMmBrGZP19I>IBR_Ql@4wWVbxtk4=V)7LX5CG-%Tz9@2{nT?eakRpooF>>F8mpZW-r@nx*+MoW%e*b1_dpm86Tv3!!_~VWS$P%lAeO% zeqPf}OkyrZp0haOvsNnJ&#dpl8ghpK6cqJaLuFtXE@S=1!RP1O^r+=JRYfN{p0?ae ztv5w2ST=})j(SA821F@XAqXL@6xiLu`^L(IMCwuWSn~KS(B*Ch6FF<^jyP8)@1Bci zp94eynvR*45@u)bv@T!MpR`i|o#^{sEI0n}Ry;XzNcY6vIwB80bMkj&|J1{s%l8BL z8XliZeQD9FNb-eZp%q(oeKO8AL=`);kdC*r=-@EKJ>6WqqsgT_H1<6j7CuoF+I2>#9vPVIH>RRDTIZN)0|P_hQP z3@Sn$donPL@D)R5on8QDJ$?fvN()^kBXk6L+!8))k=nPYrHZSJW@o(W59?F9?l3G- zXaA|W%qhO8nI4=?QnkxqfHFJsk;0XzB7jAma_CMeTTo3xlz@^e;@3P02$$2@9y+XY zov1sjh0b=7Wr9~574d?<4@yS0!xvIvY5#kAdZJ4p6FKX>rE^wIE*wO@B!NTCBMd|q zjh4=^888HRkO3w@mfEsudd6)OXG4DzfCFF7X^>i&Y$>yj8dGX6Is^|b4e31eJ5105 zB&8^#)zx_!IbVD@QmZpboIX)5n95a=l6GNLmJ{rh01)L0NU+y+N6Kwn_nv={6Wi2B zR>zGCk~P850D^VYvxHcPc3H5ec6k0Rt2>>D)x3|+FMT4NB(OvXu{MDuAGG} z=mb8UxYTv_jANJQeKlgL86sI~A=UgFWv?-+LM(pA^>V=v0O(N^Ob9KM^|wuTb_FSe z*7CG`J;6H}Yb~nvhvk}rEN0$5Dj@*d^(=E1=MYQRV;JFhrYJ-%^E5s&hmiC+v)~2YabKh=NkLuE?d8*ooDY_)11T{A_AU!gn>YYoPAAV&1i$}hgfyb1|QsVGI zJVXpzvBkP9muxf~Ubc2f6{ou3SUAjKniw%?FlZ4s!Wk|M{7Hd3&&0b_(I2du{x|y0 zg~Tg|m2jdt#zbxqx=%%U4jZ|Sb03VGG2!YMjOV!tTI;E*vc@xuYDkXBCH?f2kyW2# zpRRgaot!`Q$f7XX?>e8?Y%N=8oJqq6l1A@pze5Svbt$a6pCmP>vW>Pjg=d zginIO)A0W8tQ|3`vJi91uuep(4=ffCy<^U~5Ov8`&z@%IYBhQ!=$zi5OhEnuEI_td zdwx(w$=9{;?-whQGv3FKLXlh%8a(#_6_M;lB}H$WSI2ILdfG^1|_h&LdqDC)!E1^0URvkh-B}as_^&#(4<~ zNauLyQE867>J7!vL*s-GycBk4d!T!Vf03RD{SWf@e=FKQ^2f&cf5;yr$=+?8j<0tLKF;h^prj-@$mz;a#qoE=Mld9hY+{#b1 zk_p7xo?9>g*mB;<24O!Q3d&+b@GsAord3?D>w@~rsmt4mPiD;bABM|zc1-T?()Ukg za}>@(AlW)AXUxlSi{}BT<>D4mOjcfH{_pV} zrRxHitrREFOr@O1d;XGPQr%}jtoo0~o08+jx6?QLyT4ESr!&j2jAPl1Y^`3qU|gHt z+{ryCz#m>ASQcY~orFzxX2X48ac05ogLZ*)s^oQGaO)l$EzZxaP#p zO!DaTlI$oX68}Si~P9)c#@~{ooS^j^8uEYSQ!qp+dLFyQ2ZZdr849xxF zQQNREK_hJ-JlR7tXBjRpKA3dnxzUG z#tE}BFm9v1Z8(;{&_9r@KgDn7Rr|yYZACK)k+))2F8n{H*_)VfvohQ+oHZ?pNnz8& zdI^uf=|jl;D&DA0+Vkuq-0fq!Zf#zlcth9+^@IQ9Jmy(!86kFU&$sqeI&3}OVLQvi zKMFX6^40a>Stw2)nu*BpmP#6l5KWJi?F40bX;?Y|u~Nx~Nmzt8cnwPAo|2F+Kt{}q z(us+H?@0^aAt8lw4QCl~O68lUBoHxAy=4VfJ&1sV+7?Fzny|s9&*FnI?-3}zKEgF{ zq2hwHDb#^dOE*U{q-dl?MxAigoZ6yhp~6z~TIM(=Ej90!(F{W;D}J!}5cOc}>7U#{ zlMr%>jZvjFm>Xwho}CKGHxMCXsx{1|tt@*9<0Gv}&qxh4RY0tOv58V=(n$b^n8VC` zZ5)>blDeot2-5@!aw&-#%RYU9^F!$~Eo8D|n&pnJO4R4uK)1^@1 zXt`$bUMVS;WK3boC!_LZobWuA3t0qc%jQfuw9t$nU>2eM^l<`;LOw2N5Am&zvhoeJ z_#43W`+9c1A3cU}db}k&`c_6qNfV;dc|{fN(YT5x?P?hxkv)4rSUsp~;tTX0Q-kb3 zUGM+CvH!W=Ss0l9=kJD*^M9Ay*cdtgn{wNhmaR3mIKo$rzT>Pt=ot6AuK`Gdi#is> z!_X{zF}{p(DWqdU2iy-q&3xzi$xS}tQiu}p(4`}DE!+Ib)67klZT7RhW0jYuyR-B4 zvA)ymkN)R&e2fjmQZ~ry0~FU%=QqBcI{&Y&UplZai$ganQ=iB1t*NQ#wa+_vTn$@# zxE~WQ*L#;|XI{k=>*__GG@%KY=1o^jpJCwu{|vVnj3`I+Jg{#A1efRx)GYtf&< zgMqv(fD!r1XSblS?8e|hxp40$0b=kz@mNXY@h<=T%#ObkBr!*Zqm&q(1q>wM#?cQ+ z5G{`_^qAQ#f#KAQx(=4ZJxQY#=9I#Y zW;V!n6z?Xll!=f588wRWTh>9Gdb1dQdya464qb=pMMW!c20Y>Q>G{`oTGFV`Kb8M#YL#vN@qQr=E}ohcx=#<<>&G^3X>){egljKz#4WCvMf@N=8xAN*H*csK z0^j0oX~wr6EeQ2ODVh);gd5~F{X1BukLNo{dBy#EBx7n(z0Xw>r3Y;e?b7hc0Q z*ku&KTt$aMxfHu*97#>?g0KoHT?DL=HC}0G*`Kraq~R}@gHr4oI=5oz0mH%9zuc`S z`O=ly()D|$rV){DN-$h0(_Hg1ukF-2NRQ)Q&H<0s4!$Q^^b#SL28!cdy|V|;hLP->H9VuDPiLr#54ZH6^6^F8*T3#Q`Cxu zzD5yp%ird|gpM-b-HcsGZ`TX)#7!0C^G3$ugYo%e1?TK&IFP8d{fxo~q3NrnDhVX^ z$lS0;CDO!(G411D952?0_KDIbjt#!?L6e$0p-aX}a)H<5(&p`quf@?rQcVv*W-G9E z1({<`m<6cc?|%cvv_RB%Kxmo_cCiSXq*?ZjT6n4J*bSVD0#rsI)Xl5w*n@q?OYB0d zhXL}UHx+j7`8T8AJ6vHMHKGCw+)|p6&EAN*f@n4r_SMOy$80V5Ow+u7J zL%p+l>ZE=WrzM4NU~0&S>e6)%gL+gJ4A&1YxOxC)7UJ={n*(bngKwwi%;UvGC_-oI zV3+Po?IhLSOBT($U?pUQI&h_r5jorVPA=gH@>#xRM%G*B*1S7$l z>HzM#=8G#cmA_R-ayF42xh*#VFVf~UNo&|>;%dTk4wO#9YnRR;W%F@q4|TVJTWWGK zj;C?go{cXqLSm>+0K*w@4MR!M2PrfwAV(ejv`sX^mf;3jdpb!p_=6c5nMMWd)Aj(pG${1=l z#V$~mwGYy3@a@GlIV$aw0X6iG(fg|1&x_N`6WUW1^-adHhj94t3T+q2Zs#p#?Hdtt z@Y9aXNHyeX)Hlc=Nf}{zBVy+d@q-{dPRq)Lu$!YgpG2Mq`S(8x++G1v(5W^umP}-~ zT4|hZ)}AX$lFMPZE#pExZwdDHBAr9)0G^NqZw`=;$(fSZ6#KrFQLk=6=45Z1~l z?)KnKR6a@mvFv|O{ghj?o`d? z!DZz69aw@|C_{sB`s9e|dbopYMIW zFHG^n|0ReKY5|9KaDm0aLjUUF+4?wq4y9*D_c_}-3Dbc z!Ti?a+ur2gWI-CS7x8vE`k@Qn*jd04z`^5R4gPT`=rfM}ZSL52FGexzf%8NBv!{b+ z=Lcadt(}>P)!+V>i}*U+ubq+C*Gm-HC6TH_j%N!``U@jvVHk{b{72}ZK&u5++&MVv zej#*3pTFm4o|M0v$JfX6;}GA2&xf{Qu|cTCafA&@S#VWp|*F0u>UFuY|4%Loln-uuRYd$OW<40XUh)FBDR z#`-|)Zvx|l$bI@9+}#^yx~+Ub@#$M1<0{@Wm)F-DWvqv<^Y`z+^FA*RcePz?UTg48 zy^6!sz;GesaQmF%=F-I2b|&nYYa-yl3Ep>z8H3|gaPCqy1L!&k$UhMbDCtDv+W zPJ-AeQl91z;@N02s|^vR#R2-W+EOLW(8iAE-q@E1x?wmRqs&X*Cp~MX{m?`4Vj)j@ zXkbsmEq#v35b!FE*`b0Rdho!Q<|+LGWSJ(YF0Y)Mk^Z~5UGQ%d^nY_?fEa&zQGe%& z74fl5&Nw$S*d}5qw-jZZhp%|*>027H6s4Oy9AgUHKb105U;ZX%y(u=`I_)xOc9=4k z_Ji;?2+1u#?SmKfxoi==Weq_lvgJrpgDo1c|8ys+65NPdWcwm?8gi6EEr~7tAWwXJYk@+L&mE|!UH6f7Nj%&|lD@(li zVdw@aZ-t_}u=T-gmB2N~h(#%hv+im5(LnHGt7~IC#33`$awX(q9B3g8yhX_aDB$S0 zHP)b}D9sQJVR;=u##?>A(9BEGlI@d=Bso2g{yhI-agL(vZA*A@7n)Gax?Bke)*>xw zXh1W29-V;Pf#5a%)AzB$q_~T0rEwrNj=9^(83kgL6gL>2v)Cb68D|kgE z1sxy7a40##p*%^3eoHQ%gQ*`X@w~_}*O?SsChEX=gJG?OTS;OdlSH2~4@-CRLad+(i}Bi58;S8J^SDr-~=S zz-Tf9M>9_x0$vK0U(!`()b9`5Zs)RapK$RVOb_}EGlN?2B@0Db$Vyrv0{r(73^tC2 z4+LKENj4cN;$?qf|6N|6&y0{pqAeUjxoqB#&jRtzi{Q753&`CBUL<)FFwml(c)$Rz zY0`neNH{3&j*fWsYabVX2VYO|n{ZG72=Hhzz&I%``}w4enCY(qldmM%GZHQ{*L0|8 z*e_yD1=t$W49!@`S9sbJNJkyQXaCV)ES?c6(}+XF6Y!2kpp(y8J zE`vN6fFw+XE!iavoQMikN6kjCX2-H6Oc+8WuT8(FMGn}=o@VTRHH?-DffkBTK0#d- zoL8u1kDRR*WJ*=*M4ZjoE@gN=SuoxzPARg0G7(FIpB0Bp$e%QFVfFa^B7yVX;W}!@ z+Ng1t!Ui7MmS^4eXbTmex=>1Wy-1g65eFVy*W3JT`9-L?dKLNXLO|7xU)SP>e@ipB-y4CjU|sCNU;T0s+#cvK#r!prP<0@N!cQ6(=VdB5(lN)1vTtg1gnimtKg6w@@!`9p3j4-nWHS%$v`m$F za?~Q4dYZm?R#r2Vh^wYEwvs$rv3jE7E$-iCQ{IHF*4k%kxNnLGG|}9y9c!rb1Q9Yn zo^xq7nDYC|*%+w47+4ETM%2F+_4M&8f-T5wPmD8CCs;e0Yp=_d^<_FVJxqmi$KJ1A zQw$#RhhCdP;Oo6^1}Z@%xE6jecHJ@FW+A*y&h;*OUO9Y2dhIM|X)sik{$||XR&l4> zJk`|fIf|@I8E&iI$UY>a@~IF$k1zqgUgoBr83l?Gyy-~eI`0@^+Y>!31=sjeHXWTD zS0ptaOTF8n$WD6Dp3n4n(N3i+MsS{Sl);v!2?lR*8MQ`()Q(%C2N)rx($d5wyDn&I zK5!J^(+!W^q5SD~{zTj99AX~=PJVb%{5e7>yqU7F$PeP!e5m0NCO4jb^}QfzZkZ_i z(Z^cN!KO3EUk<`{cPCZvzdyNVlBlS7_@|}J)~4C1SK585bM*wWX?+dVsV=n+7s?xNZg?&gHi~#fd+efA zMM25#R(Yn~`B!0K@8|hwK~oA=I>uy+C3}Uv8bD+~hov=OWT%{QzA#67-Jvk{SN!TX1>-)`n{)B@^e#$RaZohemHryk`SQsqKT z=U218l3Aa6ke=X%PN-)Sk0rmN2D-f6tD!bEa=##CuH_WQ|^tJtzrrVs&YxQ;) z?&Er(nLwk(@wYBsC}MUZ5MXa}$Ghx*KIl7*QI#4&iDR|Ix3EU~ucIuJMa~IQ!`u^u z0ZA(BV!MH2ttWfiqr(z1Df4cmJq5W|k6t7Gnb<5i=&B8rgE72hYFYmrTg|DB09Dxi z>PBJVZda-@ORdVZTT*9&{W9UO!_}7i8*WB5Sre7*g(a?c4_QOLy&`^`FL2JKQ?~zP zJOAw@|7AOwSlRz)LYj^FKb4%A|ErSIpa0jI?S{pJ8D>iGuiKQLs4DM&)tq9E=wwGp zPg(Q-)lz79Jc_?Ol%o7|;bj}mlHr+SE@q}}@wMK?!Sl=W+2MI3_2}iS>9x=hc7w?d z3%2f3%VK@{``xAI_4Q{)x@4qN4~PHH>oN8;-Zt;&t7)tE?b*X;yW#uiEl-r+H}9V< zoS)1XabjAyVpZq&5>H1&*t(yvh*Vq`hqZwi+>2bd-vjQw0&DbJc>LHOdt$5lFENzA z3qO79`K`P=dt&!cpR0NrN4Rerd(_|aUt_4>apAu3z6C5d*W#Y!?>gVd^m#9b=+coN zuE^b+o$=`nZTPDqfZK9kZZ2wD>DfOok6gDB1w0cn?Wmd6t**y$xdQ`Y0J-a+6J;2u zw9KAbuhAzR#-kJ}7?9nfI!!(7AK&Lh?QRW_e#<@~y3MZ+L5FaU1g@mw5|&{~5w=v1 zmz06Y`w78k&6WuM&YFX+y8xA3XRx&-2BY&}_Z!A&*>iKm_QnW=9kBbL^EeAql~#MC zF|whKXlF3okKO1iR6RCHMPRoS6OahQPDR{BHj0{Y!n8xTAFR>vpJC-L!|#V+1^J9C zH$=!4vl}2!=PJ2QBbo4>Gm*2XXQg_S8HIe{L7p^#(TPW-O-JlvLE5@r=II@f4I#fe zYePO)-ic$Lb=ojxE(81U^o+;FyfJ`69wOo$E^j~SB>~UfCk8XBh>Gv)+p-g0@*e>x zhT}(0QuR#x>lI+HoAf*;Te;UXEwkQciVhv4LeO6m146vtR62QR$Fi+%l;G^UrJL@E zDyLOXmqCtUq}Ec$sKEfwbr41@tf38uOmONS*@BTR1(rO29T6PIF{9ebnj8#3=a0*9 zByUZGClNIwK|5S~{Kz?|7X^V&23#^E0X_kxX8RF(Rw5%6EtqvJiXoSq7MXMr_3ZLm9!Bx8cB_f zv+!Q(;V-x%N-rzBJI_GJA;hM^)_)=l3S(i&=_9GtaGEa}3kQ(Rb&rIo4sxPIcmO7A zP#`1g@XAn-kL*ckHS^_!L3HZ`BY|6f!vK75Y?g$Q$ROFHK7ThB@kzkBIFkE!BRmV) z%_DvHPv%saim(+1{%^kT&mAAi1oXu7?{4ppk3GK0ND@7MdOF02d4@h+9wQeWg^{M+ zW*BoUen8*u-ZJaIu7Ch#?&$|Od$%XMip=E~800a6$5+Q;-%lCAa_)s&f|h{I&P;#( z{Gecr(MN`ktMYauBsGr&>sj~)>UtxJ^LI9N`lTG6%s+zK4YH%0flnM$z`cjeAS*cV zuIin~m`bvsBqQvoDi)Hu~&vLh)yTMX@B`w?|_aiZ;{*okFu_$wYTn~l6kD&I~q z<>cX?Z+8c?HMz@QKmu74iC$Oar7|OC0+M>mG0Kaalx02E^p1J2O99X?61pxfrRq%+ zfgZZhHM5nHR)25|S*E}x9FynH0$988TY!f1B;iRoA=iMc~b$+HZ2Pb7eZ z7pcX5wIE=wqf&lm(vXaWfI1`L3?UsIQ`$gv5Z!hj+r>ksVru>++TmY1-1@VY4)aHl zo1{V;9OL0f@RJ6^vJRwcoG2Bse(W!q8U##3{adr5_@cxver>&0Trcq$T+@vstP#CTeT%$?mosR zpVbrsuAMJwSn_twee@a z%>7a`??8ybnQ*(k`6aGfanKV>7I(pYHwTD3#=JmDv>I(otNC&@)I*`SR9yA~LZnLk zb_Z60M?DNTt+g7omH@?%(MILR?n3NWi6?-8z@E!leJjzWg=DAs>u`99Mx-9HS~zV8 z*Ug;AYNylLP-PNn zD~0PwUdOKSLT%k)fofM9F~1s)UZl#hDtZ-5i(WXARf2O*{?)Gi3 zC165{*0kn>#h1I(dIAb^UQJ<~Gi)!4{y~;acg%HD`S*0${H$hdEK3+yo%w81*ruER zR1jY+pUT>|(+|Kd{O^kZf|u#!(D1Y%HZkErzcM^5v2@`>2+%1*#!S}s z+h!6dTPYj5t=1;+2~Ayx;|s)BnF#NnIQYlPGAy5EBj6B+I>y=h@r_yDGrz z)nKXK3}*a=jVKcHcDbfo@M+XD^Iz2`Hf4OmK{1!PcBg?Iyj@_qnOVzjz`$ph%#T1^U9 zXPAg^QnF9JXo2Qv$}7XYk0QFNd1jjGrwl3Wow*ofR}4X?9a(rNtJf{`gdx7e?L5fht@SOT=RK&EGJ*Bc zZ=h9$8iQt>Sy@+OzA0-Ct<|$eZY{hEaAb-T z*E19w3)_E~l4SV@C;k6Njvo4dk)t1ubX6Hx9u#f03F?Xf`7wB5a@HOrcn@x&Homvx z#YM%;L`~J}p~aLcy}77~n5XH98iw?)zJ5I)y}TWMZj|=?Ud#67*!grOcQc|_>2X%N z3YEL+ApH7%JiMyix#Zi5t~;B0$t{iT`Q_p1;qe2*n@P>)z>!ORVEDLyySjStSfR|@ z2{(Lx>GF1N=B9M}q2>jlsyn9qIXNVtD@c^0;EdS2c{$&D@pv{a`t9lY{_q}3|6AcN zy?m|wwO+38J9t-*@7IH=5hZ7e6xX=2c+PKcg||GvdqKWYy^aB1AB?>~hp)pE{f--P z}x;RsWk&_DI}3+r?_({9=`rJ8KN#=zhqGS%Re*Rec6;1Hk!oIja1{tuo`9c~RwCtm2$?M?B{EZ@Wg;ERPzaPST_tW? zO?D%s#G7%&B@Pm?XUaQlB(7my7?pp^=)*c>4 zDO19FkK_Zqh+Z35Z3iJE7)1$E7LNH-lcm6*VEpg1Vv7%eLnw*c>fIkX`&yP=4{kql zh7;MJbWRi`=d<$tID`#RQ|}rmcSFmIOq*N|FD@AZoMp4pNIRm1#(Dp^j|yv4U|ioA zCk92k6Mkra^=zJc>=X_f?E)rmRqcWc75L!>Uhl>*LQQG2Bwd*Tgg~@{gD?_N=1v*Q zsUBW()+okalWg6FpkK3#NQt`2MhT)s>kkHZQImc;6Z)jk^Z`H@2G5@~C|N^u!W0k? zaxMg*q%2(8TI2wGB*BkGUJf=}5a z{b1h(%Ks_{&@tp&562w%U@7Mf4SG(zA2<=!)oftvy>CAhKl@n=0BXlhm4p?&PCk4W zc=DB!OwE8Ac`s-ein%hH7qUSIME}w%kJxBk{LRI1aqvT^e2%5}WVdQBY49qWZ$aID z^>zdbR4{5htQ2E3b>#=I4hgJP_R4}Wo^wjubbb5y(B~N6c&_~( zH`j#AGdp?yQ!OnV_LzNao}FG!am5bQfs|0L|IAr9h;38)ySn8Z|hnJLS$UjC;pxMUfV(;CX=FN4w| zO@pEIU~;}`90lGCCutU_(Q`y&U3wpfZX$i5vZiOLgl>vs z90!60c#-#YHhV?~^;Q#018VnZNy{DMq1A&~Y|77r1|C7_DS;2GN*c&Mp)LJjZCzMD0esGcJIHE8^c zZhs?*7a~wyWswY7f3W$4eDYoZKtJ3AXQWT8R|~dd%(8GouG+kQ(39T5 z(|lSD%a{>;>r}=bYL`SsDli4yHm_QS3bgw!s8)plU@6s50~*f;hO*8SX4=J0YU*4V z)dUf`qxggylmZZ5)hlMzRLuhJ*rz=sl2FNs`0C zN<5_o&KM4SwmsqC5;;wca=cN=6{jT-x^h-EYR2JS>XpVu8zQ9|jIM_Oo5Q+K8KT}k z$^?LC^jm>h!|05<-DK6g`14AGt-$2D(k6PF{9L26g^pZMT6~9McG2K zE?9+@+s&J7XF&^~GGu2}2s3W?j)gZ<^NkXfpXzL5VI6w-Y6{dimFv0r5$L&-$B#BvI97BTE;&Uo3vY1Zu3vCT^g`Jj zZ`umh>*+D#S3)$|w9oak0FuD19k|TZjf{nH)clMh52gg{nT-(bYfPO@&gr7y@?{+Y zjl4ZW%icQTQ2T2^e9Zl7oZI+X-SSPdPwDzPnk!W1s@*VpNsSAa(Rk5o;cx>HGWDb! zzvE7!e0?g#VY>gwa7<$zSu21R}p#?_qd@v3X0eC(%@xO;vECUTo2JJBunJ zbB)P*loCZLU4ldqD6Dfy67W!Ehv-N^%{;Cv0XLIgb_7^XC#>eaiok$hGyyzz#P6HI->8V-Qr@}2AU1zk6L@Xdv@!_?h zEtiWfqCwKQ#ChbJA(y>cMGR%0HT;^b5;)$pVAByg;q043ltOsb0K2QJF_fIhhAIwO zbASa3?eVPa7ulr%1H=%u$n_rrZLp*NpeasWsZN`%=a7JV+q!Y@ayRxc@M=4g8jH5h?=&M3i-SRvZ$B5QCK@^HV!4U0C5>QR8tG%8b z#VuqH%*dFI7Nyr#>ZjPN`vdLmJm=;BhIJV*uGKqu-B@7V#r2rYh@%KxA*hDj@DaF& z(GqV!>F!P#b&R5)m5X+Z&p4Bs9}N9%ADuWg)kDA~)Y4mT(xgDQ%rs1QQ~VCn_Z!7X zKc0ottdFB>%Tn>eQpj(%a#lF7B4^AEk*|{g4Fj+u;mKIe>zAA+TK1YW?Ft~=(N#bd zo(4TdJ*I{iV#MAJn&lpon4ky}DdN!~Qvo1~kYy6;wI&6#k?PRh)g)z0&^;*JeWEE`+%7|((h*x_p`MWhpgAg5JM8R-DdTqDv4Zd!bHD< zHU@+vVooI9xBlA-GtQeaT%%0*KDoXZCK3C}rN4Q^DzKtz@b*}Hp?mp5&NN3bGJ~v< zjwU9FYm#=v-_QDtajm_RXPrw1VCy+K zB;erfS%mN-ylGYLjU&D~IQWuZ?@2`|DoUwd9k#+UtEM~))oRIS_v)mq+&5c2HQTU1 z?w4=#`_j_={_}E)-_2$OPG&WG?_<{8XXSD4XApTw|98*37i)i+JNwS|_wn1?)^qD` zuFKV159f@Wpx?3hwRTrET!4x0IyeVcSD#l~npYefTfbgTGoC+u4pwX&@V6Z4Yt}9m zJ9fN1r!cYixY)(pe4g07pH(~i$k~DLDDB7gbJ)d#wfl8h{fmhAj-P_sO~-Xt!cp_7 zmwDJ}bQoXnMCcTiPSrGYuEk$VKmI1+pLIJ$ipjtLNPE|tnp)jd{x$ZMll@z{3YhV3 zDXL?xlv4oF{HQOgF`Q$JW=#r}{XoV;t!C9l6i+(nk>W(V%E*9)_IAJJ zuD-vu1n-=)}ZtPz~o8=P~(XLvw87}6;Bp;0C{;` z`r7dH%w*vj__RfgTv{-TF+XH-Y*!}G5f(BKdQ%5!{Or^aF=pc8#UKHV>CB*q%Zf^d z*TQA&z{jeID_*ipF6L@tp`VdXb%~^1^!p{r1ncqGH#fH6=CD6zqlGl1#q=%3mQZ(v zNT7>YZ~m9Po_9Qv3YH_>5y~S9j?yv2kt>W`%47nzc?yr`5jD8 z*Vp^kL~Sm;pW; zFcGKWS(Gwv1d6bByceUg>5ooaTg3A4*7Y2C=O{0V%gd&-8h01@TEJ3KU#+tKtVD%j z#$+v_#w)s=2t`h22mcpi?-(3Pw|o!Bwr$(Cot)UVot)UVZ96BntrOd}tvAoTUw&2p zr|P}mrlz`PX3zBQ>9u$FT9ZXydJ;Tw_|me?zz)mJ_-rk?R0jcs>jG3n46*KxmN9P- zXwI1?B*=65mn9(8No`_}2cjtgY~U}F=*VO;Ya$Wws@nBBe?nlwdglQ<^GFCl_n?j> zEk~%K*s;S91rHf9m=EyG=5WmV!)W5fRoRB;QRcCbyl4TyUFQ*b(VRL%O>LO}$TH9A zfaju5Ak!nEJ|y4bKmeP#D4ntfOmS_N{BkO#iOZ|yL<$=#Q#Vbb{DWh zf>DpYfg;<_VjkrykrTtDaR~J}Bq@uwo^}fy!HfBAMdCMZb8u1}b`0Q~$V+y6Zg44c zF@eFKR!Un@EW~1CbhbWh3}G}*DX9|gDv3q;GqcrAUexQ_x``5jmNH;4!Iz5-~-zTl~>n*F~7$Ln|CdOYuJuVnwD-Vo8OJ2hC?|pc{o? z(hDXaUd*2ki99t4W&^9rcMKrP-}%_m;3t5zLyefp;70lqh;Va8V;KHU1H5o&-7PLRQdXl}_!4(rdUi zsALp14pWRdeN|5jGj2ZdRrK7J40q(}@N|te@!|+OIrEnf_13ZKGYs@cJo(XDG*h`U z2*2fsN?41q1j+b43Wop5mMpHoGv$VNOC%cyd#1XB6=0?bbyDTpXVDloTW@HETJdPy z_OjFR;waj+qVdl0c;ic~%LvoHaou4?$I%qhdDXLLf)xfiFv9hF#-P}=h5HnXGABC5 zbGa+(xiJqyd#$-LBW-A5*jS31&~pe4xN&DIQX?UB4*|$4x7CuU7~HB0>X4((e2$4F zS}`nwmk%+%P=t7!vs`_d?wDx3@k=B6c*^iYH}}w9VeYK^XQ6KnJX1UqPb9S zb(cfGXgNfp=8vm%a8@m>nX>Qmix?@JIPBDNEHPs>rxK+Xf#xpV>1cqZ>F$~m(a!yU zosT!Ri*#sDod??h865gI#WJ&4BLSjVbFS9T(OFyiC3PVxa`islyxg|X!-u&rIZ2Sg zd-uInhDU6<`en_{7u*$$s^$c#*z^ej%*CFh#MY6gBUBBlm>RXluta z%{GfMOu85IOm( z_4Y5-U;>lPNjaX*89uz{ouX3?*mwYcbp6j!+E2?HONRnvLV<^d+{7^f_(Ev^v05ZZ zn(l-&q0SLjxS+X3H_5FAlawW$mE%u$T63f%oy{g6U`};INIO^!c`>x)Qksf$ zLFK+8FR_jc*zz=U$!8_vMKW}oMmzKn2{_Gt$U66@5M#JTPto{<(Ag=I;!+Y@^8k8^ z*a)?bl}R&8{cj8BqCc{qBebiF()le0o;|a7dyh$pBMk!#M^7ZOjgPKsYK)?6j&QGh@xwAaVChnLwmb z6p_NS9;xq#C!L~hT~@{&^ZFyRq4@E7dU!f8F+an(zMb>sycNEG zyUWuO`cvGz!OOGdf+Xv@Qpegc($c|>-UM9l>Gjhi<=K%mn0ESR7@=gC27vGo2 zbZLY_!%0l_XpX>vGpjY&qv65d^B4pL}YG!Zgh`A;i#dUjxPiF z&aC7*l6D?ObM8+^_=+y$WkyQa+|E)-a?6D6I zypm^kbqcTTN|g+=D7nd1jX%F34h*hqolbH(RA+trN#-#^4hO#w_dwQ;K-T0gA9?&e zz`1%$`LLo(hA3e~qyf1^2*Sok2aa35qfOhJF$Br$Lt>xb9XHyhICo{KNTC_GTe)Bal0|D`Gjcl@al7+3WKjwNkoTvA%KjVBS6 zNDzWWin_eKdgpI-)!`bl>t5}LNT`Qj(+jA~sCT4JRzh^E+)8 z!VvCbAT4h5O(09l`ufz7tcxh}*k(qaROMx-w2LSnI*qDFL==hXtH0QDP8Ytclp^ zqls8h#a@La>R=&-+qL9|Y*}J4Jon4>{CM|EtNduXbNA{7b@Lzk0O)K4pOr+?Pug29 z%s*|i;x5?rY6}UmPJ!4`g!=x1VlYPTS76Pqy9szL9T74Ru(N}}9P8(x*gWAZ2Ls|; zg%ytT>N281BbdbKHE2OHi`_GGzI>y=8m*QFW}m;7nWjs>Ob`0Ybt^dj$pj3GR{@<< z)4!m8e&EQ2uEuN_N%{?=Cr|oIOW{ph&EQvJSdX}m7AoQaZMNQ&$dgRE5l$5nv}Sq- zN>4`Hi)LIS;kran4cDnre#og#ds2`+vG+~~kX*afP0|FaixyJP!L9oV_4*Xh>szn7 zatgsymqDm%A;!81S`O(-`)m}as8q1f;LSk&DORF>#FYtBmXm(QPB?+a0X%kRe?Rvf ztBhimQu8EnWIt4U#gyt-=GXnh$Nh*~IVak0Z;>-W!p26X9ZcbysJ`$v1Y!HNj9Zk* zA;NvcKx0q}8XN6Fc)mArM{$q6b1vswE8yip>LRgUC1UlYtW;AF;^_S9yvxx2{rXi^7Ich_3CP9+D09x<@Tdc+_1I zZNj}=l(^6&#ntw0xmKpZmftZA&H_+UIYN_T7Lb|Wa_9b-5Bb1-JA-mXnit#(4kwKFs8kW^PqXjb|*TX zOQ&LyL}`cER`t)(Q(Z}G<2EsS8>^U`s@$~jD-w%>(p$;XRgw5z%YV@4=3Y{7_v=a)@zrz<$b zCKozLo7wMO#iLqeWEn=MDdRRwBX+fqRyiLQxpn3w8wFqHDMxKwm6py{5th`rQdA-r zsKxu|it%j)ZU_yv*-*X1KEhl~HTq23hQHQ9fzpwv#CVpV0CW~%BqhXE7kgW)B$mzE{du;_x zmRAqRRcR% zq$&ajnMx^argctaxR$0=WM{2SNqUsXtdfjETzyAWuO8?aL#p#D#;~>=Q-#%mFe?hj zR)cmL=`oV-hEX{yNXtQxYjWwB^;fGOHF_lmd0!bUWLaA6XkVc$;8KlH(I%Gu@ea$A zzVJo**gfgI*RYBbDCyyxan8sfR-hJf5~O3dAb!KBI2zCH)+OlQmDWr|BVFF9zm$8# zyW+aURmW_z=k83zRXrrK(3a#|v@8k)fc?~jtKEqsD;Ykvb+Vz=g##1%t0JMYTDr+0 zW4U^j7kO@qQ-~5J`3gcT-lNjxr+r5Er zZYh5$6r|AWFRG~;$aE7nM!~_47?xSmAoZ1&mc%=NWI1XsK;d|+Z( zXkPBNcc_x5Ju#v~a#8iUWCH*!ErV<7$J`v>+9w+x=G7T;7+nJNzugO^P9+0t)dr3G zJ0CPrhpsx*JEqY~9@hEntTvO{p2%$MZBkekcZOf^+!0SEJo>l$z3rw?GVbkqgCpyH zRve_n8OQ=7p;4OW=N;~|Qsop)bH>_-q0ahSFM+)eY`A}#ywUcf{-HXpPiZDd!mxJW zD^*Tt-XU8J@75vKM%dgl|E>nVwCV5xtxV-tpjauRkgvOYNQS0Ka89G`H6a;MuOi|s z9^7qTGJG}CSKK!&E@UxIQfvhlDZ~)y=gi^>jO3S_B~-Qe0J%zP=kq)`;|+kt8>o68 zhJGM!MUK6KbX)FXZ{hTfEp!guQsdetJJClAIh<@z0Sxvoyy7S)AEjwqv0CzZ^{0D^Y{Pm zRDMNoYg6;90#T?g0UX?c$6_B70dDwCw2F(^|KVIV#7txS}7E6^RI?id-u<~*ZqMR zy^MXg(y1P-pVq%P9V0+jZ)n-|P+z@VHvW&c->We0OQG|2Ge10*v2Jeo-Q1s#8)2Vc z?s)XW-@5!ZG0&N*1)pfu>hl}?Z1{8~fU_IEok~*bvk{4Z-{1Av20oA8`%iLAqoA#n|xo5+Ho$YUPZ@;b@0OGcgLCrpJXS7e_4|o!E zE`M=*fQ-yt-L{N;=g-dbc(AnC2$4EPmSC?lsABT1oY){J90G^v}(8bqJ*9Eu+ww9 z1ZGB%wd(_e9%__X)B0lMOYf_eIYa*Z>z%epE1<)OXM!~BeRzAh?Yt28+VyT3w|}$w z;o^1`ZVcBC!QU}I?eE$v6Ov(RMXylqHHX;Tu+i$P(e)_;QC+gp%}2S^8@{kH*!3Bq z7+hh!PNEjARtlQyutKQaXmw1>iYl544K)QV+_$&;*Kw`8-0F}j~WKsZ90faER?=~>)B9IQ5z-BP|$ZpXBH3Zg>j zWiN`n?0EYlsLTXbB<6%#zFy>E?_Drb;(PL=U;T|VP8t74b|F8LtGaicM8j3&v;Nv; znRZ#W3l*F?)qMLv!0{fH0i$a|F|m!ai6iOq`0rtc8voY*CUVA|jA!CO>{-Gxx0flu z3lFRr$m8disT~c>!7))-e)ub?PAMY(0ZqCTnr8}XDYxzH2vNx)!;lDmAD>U&_i-lW zu&P__KQU1)g<&B;2lRrmp%Fb9feFRTahq~zF*FDIuhulV{&UH)&FKuJ1@B0>jJ`DE z09i)W;!N>h?R;wWxVHggQ?m zZG>&cV%C%rBhx`~RXqSxx=iyKHzFVoC7aS`(P9jaX6~h8lTtzP`oG#~)`fOMcD0%^ z=c5i~199f=EQTvfn5NWqnG{vn?4+4hfs&q0UMZ7m(82%~bvnGW8yN$)s4WQ1EL+p4 ziqpc3I<&}D+rp~2D43SX4aZxP!c69MTV_H2bP_YdJ7IBM4~Jyb-K$oYm}yA#Rv?;I zSf=NY%Fm?fCD1+4j+VK5q{i=(UdxyM+7o^Jla=!#-u!Jz#Yu6ecm zu_W-g*Fr~bS-4_5-7BlxQ-Nk(pt9bEaE1Xh`*B4L7hzb%i+<0)YrrQGW^yosWr>EJ z@xvFuJuHU@5v7%T*>QlihjLg z**v?esqudrAeU*PLzIE)8`$GsUm)`c9)t#KN!_OIObFcemOPz06252+51wxA z{nsBqp!vi1ptkH3*ya*RtQ~A{P-_acnI{xj#ZkIAC{4Kv<8N^v7oX>qx`RYg!#U~4 z)P3UR5OZP3L!2#MPN6t&??9&YDT5PE!FFZ zWMi9TfE&dMr!V*N-(6E!D-B2k*%W>&hc5{w>yly&PyyOZ$zeUEFSA62*a;y{QWY*j z(V6T!()HFusI1Y7#dNSLltAC?=uvML8%k*{=Ey5mdx!(5+YkF#{;j1rqBap2BY zVR8)abJ$A=?t;PjD&%9R%8k}MTV)%$PwcGURR6Z4%A_WZNVm%=MoHAMlPnB!`weF0 z+Dp~Eiw&_YfWfWr6~f@^eqJ|QcY&V-^?21)9HHzpua!i#zZ;-je-9FX!G3zQ)z~*Y zZJkMD%ecx6X=_$w@6?6{5ORxs-t)`ID#=y8W`ow^m9tJIi`;G_-a_L;MSNjRo= zpCdMnly@%fgr!5WiN?%QTdaK&i&x&myO@dB5@_q|=6Ej?PrA!VG|6rJU#WI0DyFag zhAXaPK?Xv|&O~$5gxCQ@LOvV$!;XU&w$eSs2La!?OR>dTx`9Oa>Sq!_0xh6pkkdrh{hFb2GsZIh9C?XKYjD&g%l0;^SujjiFLf zp$|s}IMGI#H*lj$u87zZYa)1~lF7%WgvfCJ^^$C}YWbV*>_HBdI{i$UcA_oixJXx- z&Ft*q{pkDZoGtv{62t%IdjClbSvdaBDlo^t6`*tcPX*|~%CeE`38N55a3W7GpTH-^G`n}`6WrbNC$p_6G_)!dC7TDw@ zwo6`xiM*~gXAV5!f-m!aS-XYq_kth4*c;J7jO8GRJL8n>AglRl1I9ZgjZ-|G3Io7@ zy(VIZT&zx*VBPy|k|~z6VE3cD^83~3w)paFekwih4<>)la~I24hLsbP=t1df{MuQg z69Jqy1Z1LFqjUEcNN+my4r%7mU3#)|a5d;wC&-tc6SexkDxSR= zE^TM+N~Ko#4W?p#9_G!^)o6G}dDn_cD6J*g=@5Xe<;lX4DEQM%VI&V#z$ac6fJY+z z3pFivD~dpbZ*U{(GBCC1K&F1@Htvo!c~%|v57FlLbXry>MEa@n_$uK*OQ_70kdy=9 zs=S87EqI%eFJJ;OVbH%h)_;BFAID;4_&@xY9PIxBI5^n<7r=3;BO6J=j`RaKC|1^m zj*TVCKm3aF-i*}gU-Zpy`d;*1hlf2eR{He6KV-d?O;E~PX6DRT5W>=I#+FtlVg_PIL1KHtN>pJ`dl6w)v zZZ;H5k?TmW9ZU3u41KY92_x61{jM7|9ULhBbOc`x5P;jl%(JAC3On}0W|>* zU=jCWEfWqm45OIAMvGoR$m!NA>nFp|+coB3@kp<*7)f$4y%3gV^G80^`UX-;^Q#jk2GG#U%f{sL1A(;cblA=ai*@NAWTO< zpnz=;PbdZ70mt&gpdy4|H4C%I9Hi05r%2|RQZJ=niW|See(gP1KkX)eJUQ?^cc|$L)&pb2 zEb^u~@E|PU2Tph4066gw9RuU-f+H5W5xg&zf~kk{rTI$Wx_e=?8SJeee2A>e>}JQM z@!?hf5OW}i(JMeB^PQeV8nqdfFT6^PZ^&kSn1Y3req zCf#hiV0}LmH3Gwu-KQ0VwEzg{FVqXlKqmugDgaCsj|t%qfD2KjXQdx0KXr#N) zkNc@VC?Qz$B!NPI-D~X%y<3;asJw*LT`eyJM_ynD)-TdfF-jzmJRT2%5$V3Zcy^#d z(Nq?#w@r)as_m{tLLiT52PhMTa+W~aII2}*)!+$d2E!-w#I(zM7-@UZvy#>`kC(!` z6a-`or4^#YS&}CJshqGz+BHqhELFU<>xk^d^kUuYQr~5|?a{?a+X*Js$vp$2qi3$I zzqLueNZ#pG^z`}05N(=UYD#ECaPQ`9&r&tigSQb^IXgFli*=n>>nZ$PzXyapEa0em zMr))$Xvv4_LP|SFKXCa^=NhX`veI2-iOlqJ_=8r+&f6XsR{bWz=YZonY)7l=Tz*Kb zXYO+A9mYBd1wzXDFxGG$K4~VSxnytvuY%22Zq_a`hRg*&y@$iTUxrN~v0(Nb1`Xf( z6~lJ#>P-VLbl1v}SWIcTO8EVHz8mEO*>Fb$%Tkmk5DU=S z&Pq>&JR3MR+7U;~=wu{}3w%i;*zafazr#cNGHJa%|G5<1AIW%TOG>6x`S){ZWFm4) z$_S<5LM>ZJj}VU|x-~SHJ6B%UsW2BKI$Ft|7IZfW!15%~OLE9U>Y5~r1)qRvw-#7h zDjLdx;9HPC(rH$K&v`8HKX(VzHdn&J#M5MJeH_*0sEM~&NKNR+)Oh&&q^c#39f;*h z4gt{#z9T1-zrf7%W?gpQwEx!XQ8Fux#|ZXYWe+Mxu!t(jPk_i?P&VAuy@<0}zf%0s zVOFLPoM(8|(39CtcKX%r@37Q13ZVbEKeU|`=YSDiJp0~wx)^m}{(aJCf7bo{@uX6T z>EL<*)*SzTtQ@4!hk$3mIQ7m7$(?7N!FQXvj=RoQk170ZJpx-GSQY*guY=jkqYHLZ zMzMp~GOqA9Z0vrW|EMfF;f=*}Z^Xx%gG+5w0Q&Fsf;l}Hn2gN2 zjC-xrHZP!m4{R$08L1qLCQ`Y79LN5VfSRpf^$71ku$dKi7PRBXpcE_b7S%%BKIA`d zS0*uo3`>u#;&<&a!ZHi0C3u4i+{fI=X{#mt`l%%zZBtAM#XGtZsgV}Q9*q8U~G zoBtVl9_1rabggnpSY;}di{07%Ecx1n{O6ae8HstzEv8N9!;kocyV6cTDiYl+gp^5e zt9`kGooNuNt~*Nr?*+O|>BA=iLK#x4dx?lN%N)+H8?7NRp~gWk&GDz@juO0<#QBYg z5qp-+jjdp+g&L9e%3yo08QwptTuqOzg*tv%WFbG{8(y1X->`(5F(xSC5Tc!KSRyQ~ zZ1Zj_*QTzyTh3#pKib@?_&UN*psP2St=!OX_lPraQ<@8ritMbfh-1J9_SKp&84DD|(GS{E zadWU=wip+MAMuRLa^hfxh`zYw?&S~ML#q)lZq=prWo?SPb2e~CV|537a@ zZBzZAgZR&|%Stvf&5Oz#2e?aHZy?J&nWfM*`&zwHIWYyXDZQCNK+ZtP3Q}cq_ae&F z65TxLAqBH&{yJuYXk09dx|TMz6S1dK{iw4u?bxJtO9KH7`NNt^9f=H3rBm&3k>}Y? zMN@f*qfVE!ai{;@u;X!~iFfH<>o&a!*|E%67XP_qS2T9p))EO*$7# zX(SRCGs!e02KKwLJu8VwjZB2OQOam7t%Kv0^LYiU@pLZeC!YYX6O^?yEjwmsZ6g(7 zUZXuZ-P0ad;is-jdN|?KF@NZG7Ai|)ILjKDWmwHAz@_uH0tIp3=|_ol!zH}$H>6Db~$~gCWwQu?oAL?uJTwYZS zD_6Rb_xf_ETuGop$w3@lD-)TZMs7BS&O^Zly5=02tkW&sCd5#OQ^TY-6YvuEXW8{9 z&H=6X6(^A|R2}BfUmPL&wcdziHvLH_zzJ?gn}7^>I*d_$c5++9`Ry4rOn{pst>mRc zf8}3D@f*15l_Z7R%zne_+Btkb;@v|7e`CakBhN#S$mW|5CAZsiPBl!G`3Wt2bL` z2fe(UK+XX@2&o1uu3vFV*e`?~8}`jKSTW-FJh_`}<;wAudc`}(?T=ga%~ zW`D~6_}Zc8`}P{!bE2I+lk4mLb#<8JwmCmx|NDD8)t8^Ai+7>jSE$-qHEYX<%iD)m zj*7qQ^X}Q{YXkN8qh86(q+R|~db7vbuG=;Dq0RcDTukK&o})aYzt!!&zm=MPlYgt* zx3!b^<7B+?6HiGniLwEVHeB&Z^~XhEw8e+W6j9O2htno8ScD#we6_0E)-Cw~54a%- zYA;^N=r74V=>C4WG~GKjKt+XnfJk@s&biJudUX2$qCqA@|o$%vEF*F zudFrnKsqji-N^FUlYxft!Vf}MML7ixU98Z46RDfLx}I2v!x*KkN9-=Rcw-Vbf~Ug? z1SAQBzL^9S0-9kIozO*37?|wIjoFK3I|^7@g|rkavQY;zOe{xig)^2EV=;^v(Lug3 zot;r@Un&EF+$358bEh&bPOWHx6Gc}dVE|)+pI;rLFdX65#0C4gD$RaYJu^Fwap#rX zPaq<&L$Fhjo-`ci4rKx53)W}w3O6IOQ!Tp99gVMzB0vkDXs9YGwHeZFjkiEb!{JZ6w)^E#31X^DT8%F1SW z>sN47h#@FPdj<%|8~|ONWd5WT`aa|UeNuXtPrc7aePwLEiYnGay|`M8pMX&B5DTfD z;qGB;fywoGD*Ke~{&p|wJf;1UwKA;2S|*Vg;dPHqB-;7OI5I*jqrHPPWV(7-(4D{D zC`(!sotqQ7>(&IOa|k9&n(%z!?eZ^BFMFosO0l2Taq&BW;sz+n>DLp=iX?c`HyI@l zbk+MB-s;cvbyP&3t_gkJs?AFah74h=KSvC1I#Irj;|={g#ZvwVKUp`lcAX*=8XATG zkg4qE`uiIyO(16NQ=*?ze{P3-gPL&m$b>GraCxR@tfSe2OA2;pE9F9!9{{{|mSO

J}ymghjJsi$%Y@r*qR1uTwZz9bE6jLft5L+1S&ICi`qv8fc z^{PY|>uc#S*|b#HUBKm*o^k6rH*hf|^*4H1b{e%DI`7McnqAXPbt5v(eiSODe{dd) zBrhcMFlY!*KDohCV_6*dCZ_Qbv=@tqYlU?K7`-@D7b~EDEC8LcBqc&ax8Qf?jG>T( ze;O=p6ck#6RetyOOYCgK$~kOTr81Tn;S*9kj!;VEh8L|6&R*B z&=l6vj(0TCNsaU`0W{SFxY&B4ei;jG?8iBR8jGU`=OEUPvlxS$hm|jV3Ffz>z(6IbCrBqJx>&5kp)RKDWH5|DG z>|j`V5shV<{AMAsT#V$YHqtzHV0)<8FVEBfb=aIAYdGgobV_(}AZT1rsU0)Bnyz`@ z0NFIxF~)lJI4*pTeCBIau31>Yvck=`ndWb%8@OQex3Ohh2m4&D3~w2g1^b&&EPw+9 z)B;TBOeqKg9j_oo01{6C9#a@}OgRpXo1Cd)@d9L6kBATkO4ls;!*;#2n;MTLbOhyi zPLNf9AwR7%JKJQ(TAP+t6L*VAD-ESgPhbzeQ;>$z?lp|(lb=QyR6}4S&o8%_=(21h zY{*|PIbmL_z=)|6iA666rA$X)ul8e|)a9j%@3X2WI;tzEo12b%Hzaf~U0Q>dA@9@( ztR~`uN3eO;%yL|)QdoPe|4<#V(Bid)=))-~dZJ~pg_tJp-%XLF@gll&$S_}k7a9dh zSN-x*=VsJcarfAo7wSNnmEJPi zS)bl$ed$VUp08N;gA;zd%ZIWY3OYqW_eNSpG>$lOH~7%d2_sh5gyZZT$iX7Y`VFa3 zn^HO7uQ%F1Qdg>=e~%;y^#e%-@o30U-M~2$U9AIcYtRNxRlhNbQn}2pSJp35Un-}+ zfH)4*vWG_{sO?WlI87;(Hd*;vYScKB_yT~?x)-y#g<=^8pg%VN`bbiL*pM6r{|o9c z(WKzWO`vb~+GDrTZAaK6ZzvYMG1Ma^fj#mLP#O|J{mI|v)R|g?TF9T((Zt1rd{FRg zERqpM);k8q*`9r}UR^caD+i%H%L4~mRZVC&W%)uzwrf(&4-`vH0RTWc1<7JW<{?ld zfP9va;<|P~K$r<(y^h}wptQ3)PIroW-1yoKap zCQOOgDo`%u`U$Yu_eqXLtCN6$d7r0ZyQDQZtfQyF{PpaL0;LHN z%FPv0frQwAZoMf65u@=Fvgo5{IAahdmV-WH%vBRbCm;}5>oq;0@0DaA(dOcfAvIi* zR97d^7`sV{+QKlnUozso49?a7cB8Ql~u8VM{hZ3``4mTql7b>ZH@q#B>7m^N< z=I+ww$s+D4s-v}DQaJwU?OPAV1dGX&S#KG^Q84mc|J>iz%ywS`>1Nw0NLYySLTm9e zCub=nh{T?g*ES1pR)gWEQ+l>fFW)F8=@}%MAIndqIO6cP18Wr^eI(A+i6-~sEBJ&# zI8eK1>Z^Ou$q=d;7g<IcUfU4(icURy5#zuDj{UP{!KlwN-?iG&4t3ETaeX?*PIc zNfHPPjwgn2&4fsPM-@Uf;MaPF59!2&l7{z9cd}C1G~~5bX3uAkc%2rX=sd-X0;qPB zO6=DRu+qPf1EzY8RHW)31u2|hWKTS<295E+YXNs`V{=pRnb^o_l zo2(Io!>K8<*P~@|=t@11rlQ1~(_vM4$Ohw@Onf$>RDcKwh)^ z2pW=krK-6;U7R!0#%8NFIw_71gH{pBNec)FAIusikt=M5V(1t~CE~AOzhYqZC4y4- zUjzAP3pwLa3LlO52^li|p~Zs%Ms4P;~L3up^oCTN*=p6BOruv%kv2tNk{hmZ`kF(aO6MOg^`u>AB%sEq1YK1{$JAgpOgO!Y5b** zbmYDmLidjz*a2EyGrlEnF9Z)W8%dn7K0#=l@Mz=#!YGo2k57?h7mbRVizlyYysx$L?D3>>*We`$oiiPc_iz5M zyPM6_4t{(&n@V`S&)0kUZy$psJ{&%;`-jDQIo7FtCtr{E>wP=;SbF$ki|zacvWAY- zTsQn_*V4tS!{uvu&2pnc__K{PVO>_wb6;hb2D@1{*OytB>KrX|ttNg{T%7z*rDcj- zIbJsYPOndUkKZp#&-S0?!?qTs4I6~G+~%Asg}+~oo>*&P1dT#=vLr#l;^7_e+^TIMbfe|ATNdKK0c@qi7oo-txKOz!hW zD9$iq^W~#Yvxk%#LLEx+L!1GP5>MBTebg=2-w`btUHj;x1J6-qeG_V`?$H&y%NHpJ zQh%AK?%)f#p`#+WbL*?0KsXwaU5sTrrPB5v)aa&ffc1y-Aw|RENANJiU2md!HTw0E z0|+lC+yOz55_JinJ^>wSc>tQ{?m$IM?(%K~2>%2oIE?0{BxHdVgi{b_bq}ftwR@mX z6E6k$h@_e$EVL|UQ-HJIb5%R^pTfkn{T=f=OUPUzcOzGjABk)KPxm4vtq8mFW} zeKTmI(1ET2IM5Q92n^f6(uTl6gW${)S7Ear!vQ)&CsE@@)hG71Uj4$A!m>Pg_JJ>hC^v=ZDGZk_3mV5LQQbi8%9rCmLF-<1NI z;cI#y76ouml|ruDKT%H1Rs*il+-G{@6BX|m5}%6n;9SnnLy~zy(H}r1`SII$dq&c5 zDbCk3Ed&)9v-w3&yk%#`3(LOl5QsUp?K3F;DtYXrVrK7V5#pTCu{OUHrT5IaoUi#y(!WYk+7f-yG&CmoRoHL6^@odEpkf*~^OO!xw_z_B0pE9qy42|? zSrq%4u_LwB|2JQXO2PG0-0;l*g7!lElnmNWs9D$4_P z4dKm|3Rv9POJ0@L)+HyN=_GLaSlm$FxwY?!X%&IL`EmChY?}pkpAh^d9EqAPS4fu+ zXjhef06;jK4z~mI-X>?@pOdq^G#&@)4#To1HS+TrljSKuU&bgPh~64YTazsaOHSp5 zp5XSl9u<=z+ABIWdqFK(DlSpjJX2dX-FLu8cStNr6}AoAk7_QhZr#5l0~>I)DQ}xw zzr>;pYL5G%Bx90Atf$eUyEhQb%ka;bjvN0UlD2AHg2D0~3Kw6Rn zgPe#INnC>9i+O_(;om^twYt*=9QDUekxWhV6t3q4_OD_%KQg>JpcDjCd ze|HIU#cQIA={feB3H$&<63bmu-Q`$&rJ>2snCUAP02)B-^sHZv1WD#bm6=TRbkWk2 zGanxz*3io?MgmfcR2+S>ftS#`Kw*ELX1JFzh3dQ49qAkrf)O}f{D`-YAlrZ%#jC+W z{}xoj9uxm;k}Rw(V9^Bd!llCkBeNyf;ZqX+84qLYOdl*SV6q@E7;Hk_zhch9|dowx3{UaeJCnGqG0Ss6Q{ zVrTyLf1_B(uYPEzZBm)#xY&ws`xM)$U(U#Etp|dGdjZ--6)TuW!Pe#AWl3lnndIC9 z&yO-#efqgYTorAx`*nX8$b(DP`E0&jL4beD*j*F@|BNE7)4`|mQ!6_2yNCQpR2{ZP z2dvhgRPy}LCT$0e^~6Yf7SldkArx7(J}Jo zmeys5CZBB0K~c!qS3=W@8i2DBPo}#slffNmcd(_!!?Tm!36mbfN6URzoOcg}PZ5Mx z`Qu=*1XUQy{h#Nrl%7B&sIS z&@aWyf(2u#0$O1QAWBzw`K?sL!nI$me2wv5h?Mx8o$6-VY`6XW{|Uo(r+|PmoF-N( z7fMVOxY%qb!~Zh!iw4ArL2!yOuxAzJD$=i)#GjCb*h1gx53C{keq*~#0GZa<}`4mE-R^>DvlVoLk_$_+8GP;Y`;P??|Ch89D;>+omp0Jzx}6W{?guog2UCI_2lZd%~QjPRQT!nRbNT5c7Uwf0Me9Q0^dunP>w&Q zKcoRCIC2^?rx@Cl`7FOn8EPXT`3Gu$ug1NIt+zFD%^i+z9A>Mc_w)0&P!n#c>$=u~ zK1~;ErdH6wN^!8HM1(@SAd7?lPD*dx38xA73H!;w%^rtx3K{wu(XPs4YaPB40Ie$d}|k2oHxF$gJ|pl1wQF!e6(&OO%B zt3m>a)uLMdGIIck%J~UMH&b%sMUi8zQ+s6F$X$}bQ<9O4`Aa_a2e?}F!M374c{aYH zz1U4&aaltC3P#CQJ5m&&+qX!0FyJuqny{n{Cv^2I3sB5q29z-c4T0u<<)z9=mu(hn8*8I}A~`M5&2YAg)u_QMIHmaSL!Y4n?*S+d zP_-z(lp~FPSi5h{7vF2u_FS#igz;6M_wj<+tXOEZ6Rak$w~6r^++=xn;|yDtkD&1B z%>7K>>doiVKQF)=cf+CAGkcTYkR!7m94HWlh-CKi^8^CGm`leL+B5UEdT1@e6**s< zRPigz-YEl=YNEbTw#8|v;x)>Aa2a5s0G<;iIh>qLG1nkgAlDlDo+(n5SNIDZ^Ogr1 z&HV5nw0y56>T7%M$73~2mkWGWd2PqIBm>PptS8Z}MUQaqtSt~Gq-qg=XTWI=b?9JA z$qMP($Kh7+hto^|HNlZ;NdP$_sk0(M1O&sn6ns1HJvM;sPsUlZO*Jv80G8owm>8`t z@t0u?UO!GFxk@7m+?Y9din8LkFMqHn&Ca`9hfLrRY((08RL9%1^A&ds-N&kmS!Nj- zrH0$RW&fiE3)iNuxc7o4Uyj*QrJ3#RZue>tac|t8Au#2y+{lssj(f~uVyCF9eAGRm zt#&psNco@)^KfTWw5^h~)0yBiZb)ta@Pm*JTw1x4xZuxDg+?StO4!jIEwM&NB`EMn z4g%XzJnvEbqb5#xUOJlOSn{{Fakc!7~G20aZ%t2fgfvx@L=xw&sTF2FLlUM(*=p zt=HE_qI|~Oo9u745Mv+jK2L9-KG!g;dCe4Ju`2i|LoDtGDe+!Ku=w|A0&H8mS8C(- zxZ0pT5coV3<)e?Ez8?gD_`6u6D_OPnudma?rLRj5}0U(X0 zYO!d;PQIRo;sS1NLSp!_=l16IuKZ}D*qo#dJZq%)W?9AdJebuFy6tt+Mr;K{l7i&~ z^gF9oRP>lj>O+L=fl)yItT=&^4wE9QS>Fl=qYQJY=xuZ(V#nf~tetIgvzBtzlwOW0 z;y&SC3&_y`9e4cbrq$Fm$r~PVdNa3y$eKx$kY$dU+O?mo-0yj&Y zNuTSWWoOvEIg>l!N=P_PmrMgnQ%TKg9)YShL28ucfB`3w%4(>RnsIEKkicu;2PQd6-F2jFdz=OY1f)XA(f97~GzFCQu`6 zhL6isAU{7TElGh610h=czA8I-Yeme`>S;${E;CBb6G!6V0t2hP5bebY2SWn)>``!LELFrYQDUS`P7i~dEilp{djd^E3F*kS zHg=6%R@3-`jDkI^4pVgX%0skP`y9(q^;}>mMs)JgsUQ3$d-*`Q@#d5?KcjZ_3C7gZ z3i=sJdNYjr3F$~#=s4yHBbRIj_AN{|oadObCV1%__IrjbKWqJ}94y2sys;={zPm{~=vIBo---44KPVI#YIV7PZJR4)7@d)n=tH zynY}4$I6glPa%bitKu+^k(7|T%}cmUl-*AI_|L@brk!%4!+OLXB;#0|ne8YUVFMb6 zQk+PJA@p^hCl?B|eK?W)9QTFQ^sI1w=7zI*=cp*-1D1)fw~hRMs@r+fwWb5%J+#Sr zx>#+T!twT?NJPpbt50KHj3f^CCl=%J1UEYTgN~n52b;bz>oyi7oibYk)8GCgVL%sm?uniC;25*z5M*SGcOz{b6 ziWiaNL6(ElR{AQ)8pr@@3atdlpXtXe4ZT8J;V4_N38NE3($__$4QLzatf_P5D>?+fi@A227V&;STPu*4Aq$@NsAd& zB~6i~!yJwV+Q4^E4Q5;+CWT+ojFTWuJj#)@+nQ6wrLD#aN;$Qujpt277g-6IZ?KJ< zFok4R*NIsSu?tq7@(8C3gI6hgD#agt@m$HOhMYs|w8{e)?Ue@9Kim+8)}hZur@NYbwka*Ey` zqv~rC{M?Qt;zq_w!Z+y?MK@7!i>pU3hAg^Id~(F zBoh=pav_@Jd0u2zG?5SbExH=y)DAmtf>i7YPSA_h)|E5=k;EWU=Ml`XAi6D)F0A~D zoW!0~z$=h0dix4T4psZbZVXQy9#(nN*xo0;~35o`^#=zCzN5}Fb=5dC#KQKt$T4_lcLHYNi86IZ;L8ykdcvj zgrtpvHh^j((_*Q|J95P4q04qNHmvw9SdmH%0YB1H3q^uAA=jc+P$2_TPVG9Km~^*_ z@?*dAXYs08TzCp;7_ScN$1A)WPE1`v4{yt9$1iwJ-JRiPEi%) zYoLgVv2r(ld2AX2+v0j5?d`P#C&W5C?@qyjgrjdcx8-rdj;62-aUq|TN4P9lum*@T z{_)uZrx&vZCH5Vls!TvRfgI2nxu3EX%gO+&V7*OHSTI66bCB@WK;aD__5N+d&NrJ% zVB-E-*pSW@WWTfn_-iR`dPM!{%@ex@RPs@{M)hXAH9sMd^w?MIM}G)$=P^<0d?n!% z$7P5c3%u>hEmb5SfI}bD@TufgHG3>oOhq(0jnq!bVH(qh<6(uY}nGEui&H=Fo^hJnO zxhNpeYC#Mbsq@!kjpo0n5K-DlJB-f|8JF8Lww-+%CNPN#Th?B$V^l(0*BXj>A}dRp z(_tPieZJacY(2eoo}S&Msb;KoxsJD!URRane$3)XAdi|VkCSdK{d3|@$_~?W zB{&VF3h+c=lbr~JOh{K~ASGYHqw!b6Sw5xqTZhhC!*e>K(L?2{(^L1BsSH=e=iT7M z8RlY5&gyDf8xww$CT%P{`NnI*(j3Om?o%l6&3teQ*m0ZMWllVhcxXwp)$kTU>zEDCAd? z59@SGI2>*t-;eBT-#OP?wd1;d?^0Ul&&QL$5gk4rZGSfBQDb1NC%(uoZ>YQ+PS1vZ zPt$&UNF4L_bU(NJuAzlkQ^ui#f3)RE3^$%p)#Y? z3mIQ2qO$-DS2X8ZZxiecG}>tPc*Z|arS1se9{+_Bd1$u;Gr}L~V_n=E|7;s*%PIC- zfMIkj1DjSYqjI%ryO}n4I?2Lb`o|`h+F>9zf-(8j#xLPa*`7b$L%%OsY?7y5Qp~h8 zco?R}@~Z@siQUC}DYBXd#(_kUnFn&rTzB2Vl5 z__vPFKYW?L4h|y&-G6g@{!7@GlDnNTt%$9SlaR5ap@X@dldZ!)R%P_9jcEn=|2`06l_^4pkN8ROAG((*eR8rwMitz(3w{kyThYu|0YzeiBtPR!Wc)a?J%DmocktKhMH zH~PB;5pyeJ20T`}f2!U=e!E`(x?#)qH&*SxyKoH5EVSQEzN7R1?x>Tokg=hyk@0_Z z*tFw1YzFau3VU`Nj7!%6dR{sksz

j|t;MB*OL5xx^Xpp`m`h-K-EPK+d2~bpg4a z6#Jeu-Q6#u)8~bXo1fY-XCi_V{+38A04@*eQ9eb1Y6$|puC2jI)sZc+hVX{!TI|4v zeVU7M6FrGcJW0ygy|G6Z;I>-w*$r3&BGd*$D5X0NUpMW>ldd+T71VtBK%?>vc-kaL zDyO+q4T^8opqa7fCNxJs&+F3R4AA&IXI`b3*-PxmqY6lzc8Cl-<@KNwz$$|=>gH=pI6EJ_*ZeV6(k|MC8JnT3S~kCl}bPy3(U{VzNG+vk5RRRNM#$yV9M z{BJ-0E&E4&;{UJ%mVfR4KmGK-AN+ea|KDAV{7+Y&o`Hpl?!TJGriZ(ilJJt*VpmIQ zWmi#0gHuAcbm9*aSyOzgHlkA!dH{|fK30GPnRY>pM5pyl0R0(Y_`cdOKQfv^pDXY+ zeRp8vMEhYFQB$;@YxV&yG-oW+!9Mg^cUiGxPUR;OP+s0Ix1Oiv4)H~9W#_XjMbipL zh+Vy0)S*IvL4y3k5$xxwIw)KGpx=Z+P1u(GUIQ7!41TnPgF+lY6&^V3-R~Fz8#F;k zqN>g{=UlIwx?7@T-JtkW$J#nArDWpCfpR7^Gi2uh;U}Z$>`~lwIU9?J-2-G_AyF;; zZt^WX1KCR^c74wT=ufTJ;8sRo7tLG;__SGRXdFfM4EKO;Q3cHn|h_j|zwTD*jp zfcR~9EYp4Q1=uZu4xsd42jJZI0Fn~v2OJpM1ke#NQFG(U6f7IXIlA!KiJ7O;a^lVR zrV^eqM;s=GmOY3d-Uh<(jcJ06#EH*Rwd`X4OWU>j9pig4Y3^pl<}I2n4A%h+KWISIjU zw6>~w7iQ_rGD;$Rn+3XI#P#7CC9D?iD1Z}GTd9S)jPQv}m}O*G4?`G={nUQEiLT+l z^W3p|lLOx@FYBw|uXvlGKr$GYV|>MWxedLCUXT%UCUm^dopeqbMVGU>2UL^xSV1Ym zNeA9?8aYv&Z8l2``V(sZ!s4JUHqs@@eI?L{`}-N}CQ{Y^?XABv#hAwQ&t8debWAYR z5$nRXhAQW@O+|Ti2Bp&PbZ*O|sEE@;<6_}pkQeth#Zn_v>1HX0Oa&*5CJK6d8WxfA zxCyqDKC;x<9Tv@?sXbg?PYR{vd%qTu+w3beQorS}DdxW|QZal$lRvcn} z{;SZOWlBOCTPSrkrx=Y*{!wmZG|g)Ym(f!b!h&`7KZXI2(k&pMcgr2=K+?*a(FLIu zNPafkDP*oA+B0!jGmA8=CZ}qmiZ?FI5GzTGiySP%gAk9sg`JpT@+Nt@*uB+aG_@QK zdQ#y$IhY1H4{Y%-v9Prg7mS5VH7p2~RDCgl$XrDqXjoXqV+l0*%(CUaUaRkgQAt|w zg7xs*VNIl}+T_?vGTu==u!i};mv982vQHh*ukkMj2D(7m;#y%k!NtNhYPvNU+mZ43 z(CGm=6NVy+LC1EtPodS>x(Y8?YrBO=a4>aooG!5V}%$y*Na9Ob8hzRhUzM9lC&^0r3cTE8{ zSJ^tiinLa8#14UCY#+ryHwL;^k%ZKh5r%JLOr`Kwh18JQ$!p;h{rdC#97cti1l&Pl z^P>k}6Lirj?z!subq*Z5o>`;2AJ7OKJ9B7>iJbP70L? zCIyur_7w|VT1^NBqkcO6J0T;;QK&OT-394Q0+Nq zW*R3%&ai0CC?m5Uq*Gppjenme;Ozn8j~K7|@D1-VMHux05ROw3UmHbLLj7E%>stq? zRhkOmDHv4{Pz>xprLy1nrQV5%Ig7>;2A@8>-pP!BgT5`KB(hQ7?h=)e1??~6Ts3>a z5Gkue12oY&h~`2Tu3$Nmf+yVi5d>(Ph*h__TljH=*hzUTm4J8l=I<~7yjbnZu7XGEn>j%Vmhe& zgTcY47=%+GM0wP4p6<*+OfV;X`22W%8_a<}>lWNWsil9bBVpc+We-0DrJ^kEzYZz8 zx5cgf3ZZhd+>i5XVWD=+krSM1ajyGA7npw5OtCy;q~@5j1CMY*C1^56gnnbhM@Ajs zpRk813vTB=ryL_QV?RPC;v~b)5-LAJNBFy3SY$OR-VaS}cMw@0Ix~>Hn2nY1_=GVi zY&=LUJrBts$c@CG9#)^h8O=l|7=szKknolb05eo?nSg^k3M|9`xG;?V2U-Bx?$Xh< zIxDRsPPk}o^kZ*X1lJA?xwf8FtBO@;DBC!w>at#DBrqm}pZN}|Xst19+86^EaQuj< z0rl1|v8>{VN!5fG340xxBjlZe6+ivAA1hn%eS<(6Stj7(JeSt{d9RWN96&3bvYSg+3_2^pD>=z&uIfvfC^RF z;97nd6J+KIYcw@WW6r>uOpV zsT|}bjbp*ommnQ9R%^*Cg+;=62%C#H8z*GVoLy}HO)Q1eYgAQxMt;kQ?=>K_YS`!*5)j@hPKh@X(#Qzv|q0IeQ!8_Z9_N& z`H{1O1I8XXqr{(DJzt#1U`S2DM4B8PK&B=+ zht<6BtAB}oMZ;<|Zp#B(9bL2^j0Lk~O97pw#{E`ZSRm`JuL!Ngz`Ls_UU(yy4_uHeCbMw_`_mw#Ap9{R#nyA;zWw)Ss)?E-fQG^>;;}N`N=cm z6?WO8!VD6V@XYDGMUtPvs#@d#a)rq}HqDYBg|M)Nys)r@v9Y|q3PFhk<#I+O%-GT$ z5hbOnnqHQ0@^=Od(*9KC`pcE}+-u3(ed_Z^BZk*v(VksnFvWrlf0A z3rp|M?>lCS%|#!uURNG-@me&cU#H#cJ~8Ll8mKm0Xdjr1wlc z`pfW2%jD#3R4!!qKDkc~G&9X2zaW~!`rQ-YY0V6n?I6im4=V?XQ!D7u1R4Rcz&5^B z>SCQ$Oc@~b2H#25i9n( zlGg#^_l-Za8wuVe5uxl4-k*eGlAt;q7p6u%5744VTl{wTV`Eb)rK{C6m-ZXoRfje< za%xg6`Z_Y^=jy;uQ<rNKh<0P%96dguc?Vk09XIu05_LY-1c$5y8^H#U)XAy+YS zzt#l2nNlyRvV#pZId%7FnPB?X+BU6dQ<4pL&*OYeoJL{M9Cp{O+k=sgn@tazwVsy+ zqmqi=2T@QYg~x=OfzyYhN$yrRqfGZ{cwHW7t~pqJyiYkseqAzJovAxc=PyZaWmlM- z__%xMW6BJd57gL%`#g6nPL{gbxDmacSIuHd(;8B}E|Jvs+1K)8Wl#|f8BEea@@HyP z$dM^C*hwKAB_|_;u&a;{(+ANt*RNm%uA0x*;A+?*{Sl32aHNgW8j`$OzLf8|c!yz4 z{7H@G9ya6p<3rQDTM`xFfs7e>gA`dotWqe$;#>bWRHhnFJdl(iyD|S+I8z-~BGfj4k@jH2-`!u91n% zoGgRD0TOfjy~iq%vy_bhO=~cJ2!?jOJue9`^?S+GoP536fE}% zLTQ@TY1ZjnMas20)Zga&XYx4X$O(p|`3FXb&vEdU>W1|g z{5n{?ugIp!)FD{b@QrK0p^}zzC3NJlsZqOZBEb|@AQ=$mRU42H=m}62c)Mh)fOEhx ztT?S7F%DStBG@1GA;VK(a|EQzEMYG15XB)XzaG*cAzw@rQ3Ki5rP$<`KfAq%Ep1t(E~@=ql|fgH-v(M_(0k zB{tlT+4PUdRap%^^#G|wk16e5SJc=I?SkHKsplbvsiKO;7b>OI+Xt4>A{uX^Tl&?m zV40x>U#6?=H->J+O~>S6nLan`MhVFGlLVDh6#v zHiy<*q&?Xi_D+@*ZwXp76;PK}+LtCz#2BWVc2;~Xe8V1=QR11NUKClx=E7Gbc z^>%k{V#3JT?Q;Pz!fnd3)y)~LES1ugl=Px>MfUo3S&_1NnANt&G7?i=U*>3MXyHwm z<9@{&%UcIP>$QFCXlfm)-uP#@hUbOxxZCnL;J84y`Q9Ui>jA!Lej=}@rWKtGhZrZ) zPzlljSCdk_1o(jnU8=Pc+JSNYbGO))WoXdBe0BbI-`0^)Bq+nqyu2`x9gL}&?_vvv zNs34mLjis&9yFQ<#U>bn9ihQ66@E~FprR!y$vZbX;ikt{#_DQ?DXZ=?Esf{_viWo{ zV>9sAWv`8Vm2=(4iJ{cVFn$KfK8q|=CHT{{M(?}GBrcKcavyhGM3ewvsg(E(rSm<7 zz~Fb*COZH>@FEHf$ItMlED*5oi?GIZizBQCj{T2@`w*HgJncTOuwr9`$d37Pn6k@7 zpKXx#&$4VS0Lf4gYih^}<;tBA()&sSg{dIc0VOI!BZJGooajA>2v?<|Br2Fg7rKSU z#1l)B5Tlh0tfa>WJqj$d!aBYq0!dJ*-di{f?>idS_v;NLZ);>@oov1ooy<2-UNWME zwfaW2g-aJeNh`ipi+pjw)Vuxv|D4vD|6yowo#NYnpAQ2%nL{9H5cFn=jat zspN|$c26^cBrgmNF#$bffOMi;Ro142tAi3tQ{CWCXi*v_rC&_cLoc$5qDt>wePW=N zCW#h$YOY^<usyj1pKWQj(H2&ZY)5pr8hGE&pO{WIaeDaRcw5g;3&`%j zEL>d^kVWBrB8$-u5~vI}w;LJS$5!rx6bDqjyx$+oYm%rYjCHwrlRxbl#?ESa(6lFY z!I~-wevYEtYe*+bMj{yON+=T#qs4gztPYQ-6Cn&1;LcOT2F@sZHQwA}?SJr|f6J*D zEtndeeHl93Yi>Y*7&@6}n7kE9yVmw>xPSCkpdO6mIRSUeY1v^bT>&Q%435xORkyMg zM;*qcWK;$aQ87v~psY~A0}b*JM|HaH!lb;NSln;Dw_84cfO@Ik+q~MlR2q9Ogw%vH z3!-th6<;8~YO9ha+1CqJ2WR2V-G0QOwpCyuPCEoF{aD22IG`AW-3S3nbL3 zhprSVH<z&zY6xQ@SY=qiwNdXr}*|h>3ndTIqPbMYh&~`uq{7J@$d(B=&q7g!ar} zfNLAi?@xmAC>%_`BITQgnim<)67#O%)j*lP6~9>ouPHG59XFZ?@gw`$5UuO1zckLx zJp;LQZV)Ns227Smy!*cI$mHh1C<&jamO{CcKYwm`#L%HltqOxO`~i?YSXy2WYK%oq zK0L8fe5}Bb$8PIaRfNw&^{pL6p{i8+$Lu*sIKx0Euh5NeXM^>DZJce+uV;g~1b}w| zr_)e#nACKYGfQGU#y!jM9dhwXE*X5dHlzqPcdo#+I4B8#^1FHzG4yH3Z3H>jR8(0S z(iUHF4xUdF^ZNl$#z+0ckG39t*H@s6(f*mO4$f*;F1({U@?OIVD|Dp~_5l9k{&2hQ zqN3+GN^yTi`6D5gJyWKSh-LwD);2F#MwQ>m(j`qU1ciCJvWf|&o&ND>FJPAapE;-v zF)8|+=L5%3o^U#?$EW3!!S~(9H83Mpn{~5Gjb4`;Q+>KuTRI)i%Q@QAoD{B!J;TJp zsSKoL-iEP$%J?{=$|ZFcX+_5clE~g)o|$BC)OemhE)amW-7VM&4f8M*^o5}}Lg`<_ z6%hUD!zHX#HVllc2|q-d@h^uVj=cB1tsa}-Y~Fn^^GPwg2ox2&!$*Ev>XnJcH>N|Y zD-5^6>iUY4cD!TDdYMA8ee!1sdV}qXYKo!7g9BRbQ!{p_`8yWi_NyMBkR3D*)xX5e zM$B3%;isutnoyWhNykha8;KNZl;kX(C^#Oa*QZC*2vMBXQOHmcGL0dx8I|88+1xms zj0<@i2IHrDS(1-p!ztrXBIl1es(q)QB|t&Mdz)|vQjG2LIXNj`X8iQB(2G4k0Gj|j zN40k5G1TE`GSJW%i+O2Y)Kt{HheY4Dv4nVfs;*wc(Pez=4sGU%Ii#M-*@fzREU`Yv zQhmgIAv%tf9j`p22K}u{W3^^y>AiTrs?3_>b!;(|er3FsZuo`LUv%aBiS>zF^-Fyl zFY(#6s|71`IqJjO)JfT?d=fgtBn~0tS?`XuJpKdm^X%}YPnUrH31=-3@CS&9YM-hP zix+&TekX*@KF0zS_-!Gf9E3_4z@->g zU=g#il^#6)ngI9|m$7)&0QIs;7lu}dUT$I zadz|M-oncr`O^CU6Vw^h-Gd1kRkHVy_c?tc116LmOskzn-P`nHJ9%{T+~`|(^F5vd zyyd^9&?UQo=`X5Dwf${7evExp+rm28;mQ5JcN-1G$?1))!?C&x6SC=d0q5#JQ}Gti z9XGPf-x_>3GR?qGEv?-NSmv&eV3`L>yw$!3C0S_gEMeTF15xL8Q0+{U{&pwWDSo6;wm}Dz5`*0kr*(b5NNEAEsCDW~S*m)GLtAPnXlqkZX8;F8N}7-zN;) zFoP$LuAHCr;b1XqFqwY#E!)1B>25u|X-g^WUrO*ysxL^e)$$UTnsAu=R4h^0aOgEq9#(YK#)_^5^C^ zfAGvmUM!17OTo@6E%(ww`}thpVbS6r+!@MfB{a}6t+?DegUCzFStENyhv*lwR z4OQWX64ZnXp8z5b25Zy504)Q0!I!TQ$&49cyqpE~`ihYWAH(hSr4fho1n@g=OesxRX0mZuf_uu+de> z3oH|AaNbjYXXxG^GPpI_>#tMgPm)(jG95Fl3bZ210F~FmZ&k*FO`-jfmlr<@S!di5 zN}*32H?UoTU4YU*q|AdrIjL)mz?3>1cXGdiTp0D3ZQh zv{_r?BmQ^`s@u(vj?;2?3hG(0W4NN7@}-Rh(1J}*J!UC;&azx5MF?@EN52@M>Pv;J zs$%(dW*?t=$%Ruuw;E>If|PD`)&ekRi7m-igm!+9l56G+(JG_26dLMKmQv+<*H&%D! z+yNreK#t6k6{0t+G36zekD5|nwX)3K#(K!{eC&lZC@JmBqn6aetO?G#@UwN-|=n=cbp2jl=C}#Acq6{jLi9U?#| zI?#uO3H0<-O~#{AV2BNVAt+B(a6cc!ZcqN|cBGMnpzW$oC^~yvw>5XQN7m9~CC6HU zH)w435q<7-)@Bt991cTN`d3%Y1$RR#@}mjTYH$~5?fI5lvUXFcp6p@HC%5X;s8Y?I z+rh{!;Pk~-ytPN3`GS)qu8hlW z%o6q|w$-jn<(kc!PHi@Fb4B9C86z7ka14;-Fuuz@RSaj=dMFS-FMU&7}OJjafnr2{b8>)@0S#SFzN@+nBlbt*8xc@I0*&W#u+Ma&tC;(LYI z6-Vjo+(Gga1SZf@tme`Ir+PgA>S`?&OAQ-ZhNfOm^iF5B^(>`I>lA-ZhoM2@WPt+v z6!D=w@9JZ%s2&KoeWrXsGFk^TX;n;7O!WLZr*>_#$qWnMZGTjjNe1d40)O(+G3qhL zG1P>CJ|zcwFw#6cA=rq2Bdpz4^|r&p%0XGQ}@A;i#osD!>HasJ38a zrh~&-C~{%s86kblce*un#YBKUI;_pL^XgkCg)={Dj--Jm)R2I z0apD?79T9^C^8gN+)E6Y@dccqTXg>SFwpA_W(8EW5yMz-G}%t>3)p7t zebwb`m>d zC28NiP%Grk7nRv^lZdDwaLD$ z-}vCF$){P$m%oM72r4&JTm%<#i9;r*8pGFFe^wP!inC{*PmjM;t=UQ^7;CtZ>|(Pa z>-eGiHy~t*dqLnHpS<8!K{78WV5_wwVO};B2;^a`4o=qfw&#x&7%EOw@Z6p*1Og1)s6Ixz_55$ zEC7n+^*6r@#SHh2&_eh^a*cn+Tu3DG-4NcBEh7!*%?}~^9u{)GhF>|EtmbjC<^}nfs_6hL;bgq663ew{wJlx@|RBf ze|tjyKeqcn+xuVJ|65Ax9||S^gOd7t7W|JhgZ-}xAvZsm7af?)XQmZ%heE zDXz~^$TmQl3=mRIPF6d6`z5LmE1x;E-!_h7@+c>*5-XsZtX@Ks$ zmh7%mnbBqZFR+92(ggiO=PMXMy$X?TFO4>GXVfR?*msYEp&*8;j2N#TlouSogiysX zDVGmLR%(EiX?bsosuF>xUR|I{;iY>#9q`YYLL_mjZoonIK{}2+TbAJ;kFVP)`vO_Jt7T|G z#-)zJ)p_W+1s2r_K(IC6lVK6yYP)i|@g~KabVEeYlpeAKI-h!1bANIAa3clse*Lbe z;*I;FuJO`3fC_!_nP>74{A?=LOeFyEgwoitydnP4=DO`hw}Xp`js6I8+2vxVC+n+Q zvphe)=^VY$=BYZe$mwde-RwM3!jd{a+kX2CM*6&%5;OSq3^KE+v$CjlRKbjf?iR~m zMV=5pc9=CBSx5LzOd_{X`F>%<1FH&W40BFMc;Uum4e#NBKEBAzKx~0!M_Qd2)|^2@ zgtjipS<-zdVPz2ZB#)d({_PD%T#IOb0H7%LL5yGCGjn#CVXe`h-guOWr2tG&cs2rO ziW76fT_7x;DhbI|a?_%&5E&&xGLDL0Vx6oQWpsEm2!2Ck`ZowHl`#`_^+KT#)3#mj zyrHcXG>67plS6rEd0uAl!sMm~J{0*dxf2@&O(Rckhv_URVt&e87?QjVxLIdFH~UuN z#AdN_quG=~?2^|+#Y3xuvSqRdmj+Zc2VH%F>5hOz0W#An5&aX*jzdw)cDq^u8iHfu zrFLG?u(PER(To^e2dZWEggfzUCe&fl(ECOZ(OS`lfVnx%VV^@Ftsg$hpJ|*X%Pr4< z3~D4o&cNZhEDGyxZ#l+eV|kb9#t;AZTU3pn1^amsz-B-F1xZC7nVf}{_LV!$rvw2%;)f;&)L#BRSUO=Du;!NEpe{z^6V$jAne2vxS%Bp zw?(YJ=u2b(%8dQlm1c}d3DxlFRRb$1=EK13c)kV`LSbkyN|UX6a4fl!njKHaTUyvs zeGY6FTAUI&*^rR*Bgn~`nY&tYv_WkKW*0_Bn5Hrn6(UoCM|%FyLMQd(;?SZ8dQbnO zcEOddN+f$E6J17OA2A^w-klH33HZeNcP1`%KGw#dX`R^+%?#_4jR30oDXewzK(UYb zEGCQ-y`^WawkaQ|DP;&CBfZLr*@)QYYLM^^?oPbK4$%=HQ>$kkwU88O09wY08}C}_HG7mGyC%Psy#qI!xkaDQYLO~Yw8ORW%t zT^ao;hWqMT5JMzQrXhn1)eq`)EiF9F1A?|B%KZzdpa_}#1NC=IU7?**1qG1{s1xS? z!AK*Ue6i+p6h|}sbMWg&U9n4CI4^Lzq+cC2(Gh@um%*@Qp%*+%sGjq($%#1QK z`}vl*F9^A2Xd8ommBht zvLxfj_YX%8^(OwV_MGxL4HXpwRZtmq!xFWo#!e?P6>Gq*<*Ue)lDZlrGF1h6JzvpR zNb?4eamndvZ8Zu=TVNvvi?;Go^LX*HNU*&;`%cnzu&JHA!z5m&n~!7Lvle1#>p-j@?%lE8&c{N25pNg;7}0YeneaUmHhi zt(ADXo6S}s-?xpG@%rW8fYYvl_ z0kDRx`qQ@a*XFv3rQQmqNYCSS;U>P$)HgsCg9$9508HB8QwqHa(%d#nv=rJF_e(i% zdJbw9{SjX?SQmuj3dsDPnLo9k9lgO+KauZ?Op&+_;GrY&;~Q&>Ho60b#kM(gD>mjM zS4cq05!#sYV+b!2yd<;#!SA^_qbW`cCP(yoh>XH|UbJ8S#{r*DJ%3xyi`H`?QH50x z#*F&9^gCRqB9-At@4V=M61w$UqxuHRkz8|5@%r!4EtzRsf9l|I!LEx?>4CZ{^|=sq z+1fC4sX{BMK~jBHTm5EL3+vT6l6#W)c=^($Oo^g6Q(`P>l8pZK`Gj@K%vkA!w0GdTgC_jtp zKE~u0sSZpx2&Y7yVFu->s$$x7IeS^yBE@ofnkY$Y0`vi&f&P^M{VWAe zRDUnsRdpN!p&1Ex>aYF2@tuBd0y7j1ae~;4{+K#5%AKgfc?qhl6l8{S*4Cz!NOINI zBU7gIsNlqslJpwyS@PSoKS4jEjP+Ao)W$>H=X-ZV?9@a#kLPl9EOS-V=(sb*NR2Us zgh?`#=D(516O0Ia8iw?n&=FSz)aa=+y0G?A_yxkti}h@$ijvAx5Oj1pU;5#L%$22z zN{#ConPtk%gO7()8_$zF^z_LO??pOrO&ehP3f0mLQtV9|5QJBX%7zNqY^zilxEQ6~ zLyTr-vj@jRk|eI^s%!d3UU@C}a3G-+YJzoC`i! zl(Wud1B8N`Ly!|?4<)}RCIER2+SCYzzXTjhb|vD$$;4mMC2T5ONpwy+rwe>tq-Z)^ z3k8)00>XxmZq~!2-YH)Q8rgHK4W-2E7EV8a_cs04*-0}&1idJBcFP;|9rBEB^LKg| z#c6_`TLRY0SAB%{6s>l$K}U%!)f#i*i1f=fyJc3iTvqBZyQd7>2+CR#6w(U0Btvo9vYJr??4AhOAZ1NM45ON3 zwc8=le0`w~xNc~5>+gV)&FdBVl&9YHme;umdWSly!v+bdC+Jy6{A{{~f<=pn9Fg3F zg&kUg99R7aB^55hv2-czp396suE;#h(I$@+LfVK_gXO+)&-IvhQMKkl`;t1avD@ld z8S^cIN~D2`nisc>W_4rCVf%Xk?w z35Y_cBqm#w()SgI8SPf|HzrdDPBxx@a%8cx&7H+emIPgUs$vZiw55Szq+3JDd_t_K z_7$?b+D_!R|L%V72=XD-hPjAkad;)yx-B$cKubwyUteeaoNohDk z(yZeg^I^56zsY^vn$%4_QQ7h5OKtSN?SuaGyYnT4vk}a`KSSgWJbY6Ld^ukxUUM&3 zW%aU1{xUc;-$Q2yN74d}GTNp&KY~9vZ@z%Faw_Ea!H668;2WxLog2DWsEd)P2M^tl z28SVb`oMJV=$aaT83(^l&-Ybe05{L#K0@6Sl=C!uQ`G8vt)H0@y09xD5ZRdGRb>^~ z&DrXHgHd*|K0*of+_mg+v96PmqFrlcL9A&2$nnDWIs2aN2K{=#JD_em6vaub*n&@;>`Xc(mrE4|5aGa_P-U@iv2s6E^laO zYV_}9I_tlZ=}e3af05~*>RNhM=KsK^v(fzvn@&&1{J&(=|G^LbJ7@Se3R^~||HP)t zNJ@VyY&&i!Su2BK>f7eU`Sq02Z?}ZY-@ic4is|{vxE*yl`zRv8#XJ}tjJI<-9pk#0 z6S%`j!N4CIl*3lH0?2+7jt#_>7OoV#7(OY7-v;D3EiHnJTazv}26X6JN9q;@yPpX) zF9knoFxARahHKd8`jR2@&58YS1F$)2!WHo2zQZ%S2U zrFu^a{P518^Y=BT8iC)wmVMl%<)V|`k%LMpu?|0-iQ-j4og;D^dMpxoP~Qy(q|5Of zt}gcb#;2499)Vh5ph=~V)lR{Cu= zYUH1SmoVo}(<#>gP*cAFhAWo0Uw2k1mKi)a8##e?&v~jc2wvDaKr!7tjlSU@31gJ`0|SAv$SAwBD-~!Dj$mr8lzl!)^5aamhKAXQ;Gen z^*rrPeSsVAKJz;*?iU-_a&t?oCzF?Sqc58%OM?-P|lY2`1tK3Iuui7 ziyr*a4LiE^RnMQw=8s*9ut369@7W&5wB+=x4aOR1v~V`@YOb{2i{>T0hcD(UFOdu+ zl&lw9eUIt3C%6#qSHS5P(6J!mzOUn#Sg%h|CpI)|KX~w2gu4F7o>jxVPzH+?N4zt- z!Cr4U*+x6aJwUI)Od?1+NY=y9;~_nl@I0p zxOX0m`zrw5G>=x9J&JJLA7u(QJqI@{AR7s*Bw0$#IBzq|>kFnxfW}-2j8r^gtq(Uo zW}bcS#UDjlkg6Sz<;h}~#AfYQ3OR%~t6NtQKjY9WY+|0ouzZd|>riggH#)a`xWYU^ z)E(Bc?bS>9M~qj}SG0A^bx7qua@bGAaZ<=T{NW!#B(v$q<2~uLFvhDPEB8HG;M-x? zzK2`rD+kWB-!G6jM2T;P&Fom7Xw32fw~pH!J^0&z*bp88cXxa&%Q;Z#Ke}s^Roy^= zo_8owu9hT+m>uw8^x@|9CZa+~ zTB8!4I169HdXn8!o;J?w;@hOt|KKhb4Bzn6y84D4%u@5vwEb`?e898xVNo0Bfh2rP z!ZGZ*C%i{|O?izlf%qs*k||kcI|sWG=(HkqQSh*RRJA(^@eKRM^~UfPjt7z21Ff5P znF5a(6o}N5El_rZR1`YfFSsK{7e*;hq)81(gcXq%ofJ1_+D}83EIQzKP4_6fPu_Li z^$z)Eph<*`!M8b|OSd{&xOHeU?ad!KxFxR{Ezkl?-B1oS^35?_C;GL zuRRXBS=DmQVkU!Zx8N*LO`qXNs9DHbXdB4f@Z87~TcvFM&^5~KydElRG&qRf#G2%m zf3gP)c4vxjDUUN8r1+W0(-Ljj!$2{=~P47V|7e_}D%l5_a0I)sLIvi)%Kv&%^X) zRq)G@V?I_Ef$-$CVXqeHK7CZ3d!v^ z8H&0{f>Fr#fvJRcJGAR3x zC|@X&asBtfMLixzlS4(a4mjmcxed6v8m-x3ced?@5qlXhBbg@hbo5lJyR$0bUW$G6lfp=Ae&dNZvSd zXqjqh+2b1_1}`H*_1?Z@X_eSuEQhG6*x>BO2%z$c8bF*}k|6ZKyZW17(OO2H!!rvn z^wMkvHL^t3(i7874A#l9ZC+5Ul|&^GH``)5OM*S zh?n;rh?bEoA(X;XL5OJ^2Gm#c13V=0rw==J!aS7jne_#4^1}*a{1h9| zMgtN^s0%fyN^+G@De)&-9WK+ z1>cbDap8O;W2$tV7Ykt|XUbWT1U{RmmDaTJ`g>J6Ta|HpQ$U}<3}MDVv2|qn_pt@r z1hJbN!N^Ue$&|>1HMNo?oK_fN1_Yd@9VE%T?F6NrC`6N{@GuD+R9;oW`ZiG*T-hU} zj0QuP9t0V1N6ZWufwm=fm*l-Q!Kv#y#&0g|SekaW;uA6cSVo8N!fs;UYu`=)@*!|E zjax3!wJ<3jRoOO>moII0@k2yXTcxa>=(^H|c;Y1)Ei&IN?o2i1ApnyoSTQ>QOYj6u z+cA*o5b25*UKJadO0y0Xh%>Hb?ZD?M%bo(!W4P`(K$eYI7(3!m{{+keZ&m+Aq*9T) z@9AZ;-_NGH3`S*YONq4C;&>dV(%>0Re=j2%M-&cA0H2sAY;6bT0c_T)J&e~A{K4Sl z=E!sT-Qo6W!?g>kQ(Z$dQz{DL1zi5%uMcgAkg6vF7y~?!0EgR>TDN=ruQ@Tu zGtUzr#x?AS<_qJH2!lK(R*?;hfV%~N*7EPUTb6!H^`_HYxpL2gr$$yZv5Zx`{25kZ zd9aNzDc3t!T_qFRpgxON>E6s%Vxr&j*O0k$LFJOleb>J?cAwf(bX7SZ7_qrVWim8; z`Wv9fueCL@JY}B<&LZAGPAH#E)@u{r-k!r(%;>({JuJE;OV0NB!3sy8O2N!;;Pi=>6V^?sk}JTt4Nvs@Q!KYQ81{ysXghNxGX;?6*r%8J zb$hg{RfENTN=?i#N?~OYr-yp$`6R!IMu7iL?g#fZs1OR1*(SU4g{3K`wt1?^PK-{b zsrORr)M>}2h-u2|wQ$QJ?T(L$#OUV#$RLQwk|%zIM7B-nAh;T*jM`ci38J1?|4oSu zRp6#sR4LsgOllq?P)FxB`g@)&lYB=hRHTfD$4ZEsj?%1}CnSn~X=0vMK0+eJ6_G3Akb5lH&d=Duof~bB zt9k5GC#_rl_U?)9bWeok;>vjWdQ-VpLPM_;6w{kpZ(~myUKYX@<|nMqhT+A>#+P%^ zP8LJ$5s?#0@~T2iCQSJ_{`k|OX$etC66?a%WA1T=v}C4%UEih(My@gww;l!gq?2sa zAvp$nI&mpD2ZPMfT-Ao--f7u}DGLaVBq_Z0G#s%H^VXCs?nGq&um)6{JhM?QGc~?I zVaW!)12G7fAk#^PTnonIA_5QaRn~qZDOo)VvEtJ87`pYM%-m5Xu=Rlsp%dn~;#hRW zIzk-@Rb)J05{*a>ChoyL(ANfsvn>&@{1LnKs1WcHJO zfxJb{@g&|lZ)|)>jJDO%0UZw?fRw#-P9wqy;g_)ar6sE2C#I5C)@!i9a`+hvRebkwObZ z%Rl=CRhaSu>V@8{+r1o`r9{S~JPfKwdQf;wUb|~hHd_u0D1jU&NwL-wk7Q-_InN_$ zdS$-vwkw1WV9s1v7@cp8l(S;-4Gj(3nUojB;-gA4sEcD!?Yfk9`w5d;vU`-{W`gk- zzpR_#Jm>tZPcEW-0MCK!>oQ7dZmtv!6;tI?RW{`|V6)uGOvF1Dv!{J=bC@*~3dt(* zZrQKZQr3*S{m^nY2t9EY#^$jmv?{+YZcXIb8AO5{AyGV%bm;||;-rpxui|DY_3k%R zI=9ALp0ZKZSiBmypl{X~9{r8{A|vx{t^CbY%2dm=fhs^V@pw%CsUwk4~gF&e&INy2R5RWS$)Lz(Wr<|T(YX+Xi2zBy+DAn6n zjes1&Se_X|f$dGS3(I*hWT2;-85g<~Bwy^9EMoN;VwiaaE}lA(ja z={P(C6;6d&?YH{jhfZB(b4jwtm$+;a3m zrvvvqellJCk>4?Z&Up+N>5v^}!@0??J}`~+g$_%@A|@h5*}dV3S&%%mPx2N&n6J0T zDb$9?zBAQ*0!%2EBC!4DmbTY-yEvIKzC)o~W`gZb1v?L7B{FJ|?p>YEq$7UqcqXZ5 zV%u?6PulCl)s>L9afZG^4CO$}aYah|0HCslrk2!DoS!g``@#9S%|C?)o%iOntk zIRDCz$lg}%*-g=l6EDlxU(dg8a)w*AU!b1F$Dvk|Bju``k`I(BV*WVgY-||-4bTkT zQ!{1~R#L^}$8kiYOhYQ5)RUHide2ZdEwF5xj#obaL!1A!q>il~7s5mWWnQz0F&G?A z+8=GyUNRGZ9>jfs3{=$OVZ};lSMja*qb&ZD? z`$@=~rPuU4T#?Pbr=maBbAhXlZKrM6?%Vj|l&wtxP0-#54$G|?`jw_(o?&^)C-auc z^>(?Z4kYZE@+Mg^fZ>*z-WmVaYzP{Re8^gG!gEB*7y37WzSea)r!F z583c@OQ;l}lIjovR86sH<(Hss4W`+oDm1F>6y-mpf7-;zB?wJL*+A)QhOAm-P%qgX zUSv+j#dm{u1YcZUy$hrCto1H$C^=Ul$;uM0XtRIm#gwC+L=S9X zSFZP=9|9|HM!SUJYmB?c3#oTaL4;P*4@WsIK&v;@^b(F|{0{YJYN3F|IdVv{zOrn+ zRKqN5Shc-9A{&S(BAXS&vp&;2ryWFxS}o?*AP8B&7Pd`L1|L$KZ2R=@o8WkGj)-8q z&~+LQ8O;ToVuTqo*JJaE>$@7Ynh;( z4U;dzNvuVl@D+#y`RcCpctGxt$lBbp!q+(~vadVrgEqrtZ;^%80(KrZOo^IhPpMpz z*q6C}&~Oq%Y{c!voqlucEygDW7c<+czM7U??4i(9rh4(X zdY+Es3OMC>Led$jO(R_&-JBGY@b1nZup(t_1Y5u@aUs_ z80zdi3I-6RMU6t6h{P9;3ch6y8jjEz85z0lmrFRBHC?&AB;`xWyWKdEtfxJQ%)Ge< z)5Ez+dhSslo>d0lc%`7FmD;*tmkwgt6q}y=tnzO3#weEG%^7bdO4cbVyWw#JYHBHx zZZMq`#r2fr>rkYoZIjm{n$ulfW?D=u_Bl0n5;)CHZ7)dOYx9gL?PBAoz7}FWh1oxLWAI8Y~i&JprtE}F(BC0Mbd8=a!I8q3SH<;t#XG&?B$h01n=89qx zRs=Bgao&@4?2{z(2O>*8vs&N!Wvp<^%+&Q;&X$I=q14#VPKn#@3RvDx9v!o+{L67lmcA&&SR9#CHf}nB60f zRcnXOj?=v5+Pj8@O@GGOpUCHuGjcygp1Mu)Q1vib8Prr#Dn(!rE}%zbf@59HE)7-T zt4?Q^u=`i^#D!z5Z146K(&w$K3@laGKm%^4f9FJKGlB11jY*CjaDc!mw14EyZZG>; z`>CuMuy_~o8*JXyz{rcpS)7?OCm5~99|&f3o*X!Dcpp}*4IM(1VX{LeGU7g&R&UQr zZ{U!Ey%Uex&q5{;x$~`Opuj!gcGy4MvME{xvk;P7p1ro7J+veA?D}e1zX^a`1o3;>tjSRy`k}AE+!nWwOfZPjpm81F%F{5ChgP z9`PVk-7p21ISNbx9dgSF1->rB;+Z?-7K>oE5t-JzF%f%4Wx?o*h{7G!mEf5OtkbfU zrZLec3dH&>guv;d7mk;9OFq)1K8O4YGEFMA2a4c#rk9+9kAol(J3w|O$HQ!DAcadq z4aD>GqL{B8VQPoaZ1YG49D*6sqF(_upI}YXyay#|&QlKb1O`}^qtLV?EK~SfzpUzb zm;(8}N7!R%~`QLE(vznhG*sTy58Yeb?ID`NRIXG|dpU8Dl_AoYM) zspy?aad1O}SN(MUF71^_`>rUsi*(+sx%l;!ku`94y z6ob65e}O_S@$$#Da&A0vaDpHf;sUWqz?6WyA3(NRUT^zH8y@i1%{^}8tIpI*J-b&m zP((r4!TUnzN84nq!@GbqfpNUZOh4%}anw!9U_``$NbjwZURon6H8>M)uvnB2aI%y=O-F7B(}y_Z;{Y(WGX(zHXsA=%OTOyk@>NLT#23n87|&o z!z*2`-b$C0<#?*g5hPl9p%TYS;mC^sRZfY%p_ZzH@Xo4@ZWOhsB6Bb|WBONIM_Yel z6Dalt)fEfNsB{hWINW?VOzp zm3m3u9I-_bv$~VWDxfV6Zt0#w$RhYBJA=1o;dgY;0VBASaLIBKHo`w8#P~Ywd;;xF zcg2n0K#R#BDMom&aQKE0_-qCrio@hd%2A_-K#=q$YJ^QnPiwSq+jWx_KZ=ZBPg_@9 zMsV9I2n^90B2AzW+p?}Nl#LQ0uST#2#I%-T@NmF)wI>R&?`^1h3`aP zV~uV_+Hz%$p0th0JlHk7oOiJ5m$vmJavk$peGZjb$&g3mKY<7`pepLS_r%v=>m}!S z-OHYt`2(FFvWpVafZ_S)QKtMD2`(HJDpdYjf9Lqs7HC(F#|%IH{ZFYe;6z3jRNc@_ zp=mm{DrZ()bB^U>h@P(DO!B9@%U;RXOw_T{4^VzfM-(&|=_TW+Iq_wG(j?4u$<5J4A3$%;7q`I^{lwMQc z8DxWh94_OhQ~Idi?#aZ(Pt!3Cr@-UoYN7ht<$`4@!B_8JCcOSqz>81>M3wt&<*{=V zu#4)`_N7l^g6k`iGGlq*Z4XnJ5`7NeR7e?rF-@@oHxF|ZQSfhcj5Vz?9V1HlrX(2- zQ@-NFeD4T*Ly4dkNwZVIoyw6I-T{n5+k%R=mx1SCrqdrR@ZRkU#n=UJ`|)*D@9==Z zP4I9V37Qbhi$!lSV;~Z%4SX~V0w*dIXAG=cq*3UcWRvxoJ{8wBF?6G$y5H3%vEY?v#Q^XzezW_bmBoGhFa^AVy&)Mn+3_ywx4q67 z;!APgPQKHA*>{ZlUe@OwT%yM^#^36n)ZHe7Yl2axCf!K^WE-lw zSE&p%e8Kman=v&vK;#VpYrW8fd9_yFc*G6CQhiHCa_V}0-45r9n0mh}U;(Rva;F`f z`pj$snDW-Z(&t*=b+3?N{PrrGA^c*_6MnN)WTpEFfh5noFTm%|$7w&v{8cCawbV=f z6JqJvPuI1i!w$M;v>gjhU{!AzJ@bE_L$5>9jZk6wGWMY?Zk_*)(ShkfJ1Y%e8k^CN z`~AxCc7h3go&(1WX#-|P>*yO3{+qLmCI-*3&G4Jz=qJ+&Qr(XASGx=}Ub?}B(eC}O zh#NBNX*=%JVRial&JlGZ8}7u45<|g^L8b;qTkgzb{bl6O7aEPsaJGNq*yW6mUSV-2~tv*^0(pPvwTZDlfz6cyhDu2hRFo&-Wzc>nUmOwJwji{4a zV?K8Q7Mg5BO_$^#fLFr4#464(JMO>JlhtAyb8kt;)E_tB9CHL1MwIZKxE4G;6IA03 z5^m(`bigi(IJgTzh?msyC4{NbUQGO%mR5YvepaKtq}dH?y=&pl+T1Tn^X*B`SS<^3 zHC(we>7Q&fn{?x_;GOvatD_>{CRd~HRwmpdwv+TrV8qAtAgKf^Q~0|QPi@BJ<;DtJb%L7FIv1wH>R-?SEH(r$ zI_hln06Csq)F;%%y3?pD<)znz&eoD@>=-Ue;-fo#S3P=8%3N`gC~LX7C+~06`rwh= z937Bt3!{LU9_NKcKsP*)Ejj#JK87AnvzxbQKNAs`cDZb!sQ3+6~OPy@@ zzi9Q|gBVAva5MKP^6>1UExZ4%K_g6W$&&eSpu!_z$0hbkh?{oLUr=0a6I5%VSyuZy zuOrV`+_;RsDX*+9udJo0BF{5T?sH_IHvcTmk!yV^6s3z8Bi%LF{|<* zX#r+jbCLX~`A4Ofn0niczvbxas+*d6LIKw}R|UA0HTltz9D8+vxa#cm>c;H+!V1^f zg`-`k6~<_3TN+DKgLWR3T3e%~WLaDl)v-!s9+ic9U8TOK{ewb5Cq|q4>_Rz}<+-JG zcMI9o$D%$cMS+7;gYG`2g{k1mT7^TS zlcfnzx3p@bhqM-F(85?#2NakWzUbuSSbtl2tXsF<4vUh?2r|=n&jfT=x6w?1AZA}# zw3fA7EhMYJQqtdy&tLu6KGJ9p9Pcb^NFR?&J?!~HXFm9nHg24-8kBciZ>7_CYSt^O z&d%Iabzx%FvIIU}Q?hH9p`9GHku|Y_Q&8ZD#K168ZmzlMS`%2Pi*42abM&5)Ly#of z0Iliv7Y$vGaCWE20pFQgXF6$9znK|Z=V5M=OJ=n^D@i*U_MnH2-HYJeN2}{A@ZhQ{ zeXz?4=dWUxCHe-T{p@1kUS%{u4mOG0F z%wIWMF5$QKv+Y>eRSd}ht3Jn_jZ(W7Y86+!r9btVov4IL2&WEPqL~37 zsgDH2ojoLXJh()Ccp$ZI4@J)oft7o*xo76w_Br?7C(0lEt8dXS>6al(50UWWzMDP7 z-2S7_6p}r&Ht4>y(PoE2Ok zm3Zltcu=$^O0zNL%EDOzSwHi@X4zoO^~Y;FhBQscfwf3fpMU`W>+2zoWQ8 zZuBDe6M_E-80>AZI^Bji9g;Ie%lhJ{#{IQQKTHo%=7rRTTKW&^6(&N%^Lxz1P|ydr zZ~^3|Z~~Y;Wg)l354w&hQ9szR2ffe5G49x_I6o*jsX0*_TPqUXw%w~ykWg^GLg{)h zFi>zZ8tgZ^x(vms`~beM>WYI5dQxhjhtTmWDa&%HZM)&|l}*8F*+8)nj{j=? zZpuD0&j*##oOKe@uQnIFtN7a`Febou1)u;4%UQ6_*AN3zqEXIb5fwR$H8D=vgE5Js zq0vW>g6E?^IkZjCbe-|rZubIv1|!9bqjw=cSHH*7585f=grB@<)lOn+cjV+rA_?YL zLeQNevWGt7fSxfN%aO=r-)TeE9i5|80^Tfu(MD(0k&m4SzXFAxb)AMYNPPw1;XIUl zfa59EoSb*Ao4IpouUE-rJY+zPSuqD;U(H0c77ArUit8~MV{L?>@Eo8))+aDMpdPzA zlG%yd;-%5xrBU+NMWGb811>;wsTRr*G63th{1UV~?U`U!i=rGl40}&%`C2XlzN$@* zZuw*mImALC^zoPkgYr_+P`?JhkiBd_T@Kb;JJyRrU>1H+S@A9#ezdgVNepG;SN7hc z%E52O7N+n=I^uQ`BK-Wcz4=fW+eFUAGm(Y|LsodVhqvDt5Iy7H(*P_l%9R=K1X7=L zg?IS$5g8Z4D)KFi&>+R^(aX{@#k2cTICjD0G}@)uS>eT$ZXuXwdekqlnRpc|UUt8F z^yAp-L&XQ$pE!Jet=^;-cGbf(Xg%+Kth*CY3=?y#`u50*Mze><()ciKkANAfe4c{5 zn9y5RIkXws70@aI&!D6&K(8cR|8e*&nZ4~Z6<36_1j|pz^i;^4>an5j>Y!NMV0@)g z8XMdKo^Q}ONHBgTtk6WnztMB!@ z#Ac5JVPU$9BwV4EL^@rX13@klLT1R(UWk;yKQZ?7u<%8HAG~CU37-HGK^ki=1j0YD zFs)}g{B$3}T}ZL802jdtTQ1IjVc|K#zc6+V0iR$%7iGa%E9B~4e0r+5Fo?W6%0T@P!dpK>j?v= zBq$H5whKtClBOXELg(*8Cm4XI8$i$x`6p)8gZ>NWrT+*-O8m5$`o<@PxA!eLBo>j2LTFQ`UaH_!yTRt%2}J@1TrA9eAbb2;$>Q2svz5@ocGIxFGF zc!j$u1`{1o$6OM!YPm*XsIIZ?%G_kQ$p!w`DH4D*!L*Jv|Fm7qgKdl#wnSb9t|BL z%mgVwMj?eMon{&IM3gU~F@_Z? zOo$vF2VTo`@{UJ1yCTcOlE9G!!hD7Op#^UVq2?HnHq@DuEb-?(mnI`Vy!o()El?z= zmn}So6Kg{Cta2{4H>TH0a1TSHr6>jmx=mX5CR%UrxcY^S=ts}_m$(6&2}UC2Kzl8F z<+LF?n{en>Dyih1b_`8Kr>b8y{kjjxMDI3H(V~ajzm}KS0~!C2=P%nTC|M9$FL7as z8ZBuKM5Y}1#)BH!w|^AoHLxeuj3NFPMWAVL^mbsA`AnUdkq3h zopHxMa3GaidlTJAq7Qp@GJ-w{kPaI6s(JoYwPDv=SB~R&ic#?!RyLx(ezCCBA7?=!RvQR+ngDKPD`Gy_q572 z3myFxt@dk%BeF)?DHy;e#t*W(FUb8u*oXK`XqcLyj%A5c#^N2l0$nbKBG*c>F%_^UNs56+&%mJlqd1w8E^4Ah?Ri>} zp-kR#nCZ;kZ%Ith@nmJKfW)^|ATLPMdMrCg0MVwCFfBOsU?Jq^UZNDAs^uMVZK2C~ z*QKqb(JVjQ9KaHsD-{PCg^nZ*ryOd%=iTrgyg^1@@(!Gd0nq{-fup3r2%-#)qs*Vo zDJ(pPC0!QU4xN|I5`|0xdRG($sh25i_z6DB4o65v${GYW`Q}(sLyAbk>M~zWo~xKl zg9K}fD48u4Cf;C5A6}j7=*E`3iVrgd+4Pb^qlUblun9}>dR^n&X1CQwZ2Dz49~hcI z?JfcFp`h5K3P=myZq)FSJ*mNI3)$|6wwGGjtAUBz#W+p1_vyx7g=zmB@=AwkCgog{ zn(TM$^T-cM7wy>-CLp?{70jKRdKo{9ds$-lF^xv<6W9Xhx;hs)%^a0Ex(Bai1+27k z(V|OwnLj_uK1?E7WCQS31!h0_s64}Q;m<&6al3#$v3aGAzG7_+#j*;D85nL^VdRsi zXYX&+Qa}5usA+t&sXREA0yjTJSo1^dgDJu~uF7=z=#XEqKHa#`7#)iENF)mh+Ns*Z zX*St4Bn&S+n0@IQER*;7IQTzyB$djgE|t0iOno8d1I17m13AT&nQ4_FO2(75>a6a! z$Ek}=%LYEG*LsoOC6WTp#l769?~c#T&Wu#6y0CszCp6VlGwRcs5sb1b$UDLV3nk|u zK&r6jj?IGd@|KQ-iACVBqHMi--lwxm2bGg0elUX48%hUevxy%2P z0rrn^^uNRybabqYY=6z+|5ZSKI-C4&osIbasm9>7Gu5^DN5+|?!hahYeWsKBPs$lH zJyzcU>bWk;|BZE!bU14@W7B_?_5DFJ>xN@6t)X@5QSE**9`9GPj$-GCvT;Vc} zo+INf7*6hEKh|YON7(#l7H4w{+XEQrlIl<~S%5F~n5)^kJ;yJJQb$X^mh5E5m{+ED z8dw3o8a+xkM%or7f9o@pT#XUFJw-(Uo$)R;0#&=?TVo)98Dxc=)hvMxUk3RejJ;n5 zee#g{0l-cuLuBvgA>|&IeUJy96w8qCM0PB0sI!CBuml(BIVqg+#O!NW!^TlH>^q;NpKgL6UMWZn>|05dhFX_f#_^HiP@>)3zSpT{Bpef?j@|IRGvAK!|9mwx;^p-qdy(aEL%!%F zi~WwHNJ`PMs4j0*%I$$%X>1OV38 znW4#^D7SZZ^lrS*9B?ni6_UnT`9*B+;3lN@jQWuchY4Z97tcn6Lox>h1O*BU%zR`| z(k=fA-bX%3$|Dn}=fAE@KdMjXIc%F~mj2z@f2VzZMKJxv)(!%R+$F>h%O_2vP9xIX^E+2-qwVr$_xA`v&O-Tp84l(C4 zaxu<3&Sge^6Ho*@!2I+*nAMA471-5XmwE9gQSuLQP@=E zdfn5lQf`o(Id~sCwTxHO!gMT58M%Q!KkTpvxsdBF)=D*|TIw=y8|7#>E7FhfQwPeK zQdFAG2?2|7$$l1f&F~yy86iUJ6+LFK4!mtz{Y=zN@E~$hi!ujPMxxK+kyE8>c8@Gm zII%E(WEDW%1d8bf+H}|mr4UmiDu;EUC5w8_e0NPRm+!QPX_ao?big7{s?3E|i=5^X zCp}hw&JrlBMo$_Vs3UMDa;Tzvv5%!{fp8rY5DhFg?)#YF4!jfL3(13C_rIa>@(T9buOCo2(ww zKcfiM{8-d-Ib-Dt7TH=XLhkJ>>;eVLheYkSTb9tMTe4XAleX-63SUWB3i#+1!NdOr zju62YA%i~$0pM%8Bq39iKq?A{>hEaQg5N}(+=(loCFe_{NEE{=7F>w}%9^58yJ})m zN+%c(E03&SySe&n&}7AJ#wk-`C35d$?eioek3&nQ8~GRFHvZ%%dh{j|({U$HRx8O0 zQ~lW%T&V+Bt+wEQq$UB>(dQ7)F?%qxElmNO3R$d&n5;(?t4fFW{W$vhV0C3F04WEv z^G-(*r)OG*EzTm(oI7N{ZOxGJ{w@4BDJ@+V{}5t9+kt#Sg5cFPf>>igVL>4gDKUwP zaKHMPZ4KSDETQDUP{?KV6nrmu2Q}@lGFbyrWOTy>m7+NnY*8lI|A(`846~$N^1ZvN zx@=orwr$()vTfT|mu-xn%f^3-G z@+UEkx;cLFJ>ncIC7cvnXJoH@9&>H_=1fo`G>@6-ZCxF7qXEe1_tal0x@0v!v8qti zsiYfhq=}w5!YY(d1{cYB6!yLIZV0*t2X}!bLQ6`Pc668$5eDP;rMQTg`ej*kfWG^t zpmWwPi4G!j9EGhYNfC3pgd>Q=*EjXi&HOB12n{8w569lOCzlAz+ube0^Ea^~dKnrs zIdGaef9YT7Z{)C4ROxMA5lVomX&Awuv(dyqhRLg6(rw$epM@2|Rr%drHG@wmT~hxj z3Gls9<`&7^rNjwH+z=V17}=_#)S+6vUDyUQ3CVq|UR|Q8*eJ9gUWe*8^F3t=Koeu* zZ<-MlCA|u&N;_Fs!%fju(fVI0bUHt|xN-7uhtkv8Qg{Xj)0EvawbyoHI&CG38aO`S zGY##70d(3(%*oCiR8Qum%V`^aZJq_rDQJfnJt@*b)uKOWY{S7Z=;aDXQ&u=Ss636C zkUyZQ)aEzQ=old33P{NzuPol74dh_fv8YmUZNh7qyuXy)64h&k#+p1uv5sPMVNn!6 zUXLp2xHuD=BR*ckOm6I=Q%gk8LP?ewXe^zNQ;vd<{q20MwoX@~A7N zUa-|%?7e84$LMbb+E_P2UcYWFOMN0)#7OpgStHGh(X~XKW0^Sk$~;_@or?O=WZu?B)W1(f|$5FSAj~FvRTd zV-PUqGEwrd4YP~qnfRfJm)9)HGc4UL9~H|vW4AH%z_qU=(z%Q4YVC!2k(sZ~+k3Ze zb?3142sk35M2Apf*lXTSonl=oUCgp-N%rH@`Ep<3>LRhQj9Bw-YrsvM@- zwvlE%Tl@{QDIFEmTW9c{$RC1Nfe(^5G8;L&KD#1&kQbDXgqNU{?y9jX9RPej*yMYl zLVTDc662u#IDLCK!*UiMFY!;V>=a(IZ2l=mS)yWa2QCwA6HF7-A#gVUMn3}7lF+$6 ziWt{s;Adc0AIWLb1v!3I(*1qmF!J~?;TOl;vGT)?Q1dl6k=^g79ao9h_nqV^uRR=r zz+bQ*d$1A~gUxMHs!FZD-ab*<`zq(K^tLE!ld*+!psSoU38MVy=VD`OPAjC$)iHhi6((&r0rCPo3?c99=s++liGVEIYYn)`C}>E%CcFWC%Yen7 z^R@_BB+pnR01)6&aa*ka&FpTLiQ1%pALL`XJNCpc6bU(o*K-R<#`$;dW8j}$Fn;Em zt`4YgA+T;0Xe#eCO9CgWUgAFL-r;^w7$9uyUcSLJxfc?)85`pgJvBGE#azz3H=3J) zwT77KY$RwVRr1F}%Q;0+VS)1lr0sh612px9*Q}q2H;qSA4Wpso>0~ATqW_}?197Fp z5s*xjfHZuftGz}k&jf;q+|8)k1}#8&X6Hnb| zJ7!yEYvKi9`Oyr-F|{E=UdQyu#>PS1AkLkc-xEVArl}Er59=er8C?`QJo~wZiIUD! zYIr^#_<#n92>QX!uv({%8Rux-JCeNxzHq$AHb`C9*F53%G~Pa4?xFkO2dt7nC^$eI zAx`mr-%!LtZPCK%d_uVzUl*fWqlQl8yy<$g{>rxD{nbyRG+qb-S=)}P1+Upi3MZYz_+WvAw};JiH5~cnIW_h)Wy|$fJOSCYMHj7{mK*K%i;$OB z8nYK(+AC4%IFh@^?w`|X&$44){@CNddG8<`L68Gag%!@(0lo+z;%KD0*+aD1!c!1a zKc|$Z^zkx1rG46fh@j%~DY&zqiRlnYBL=UM;8fd3}^-3J~(NAMdOomyn_ zpD+P&8GPJ)$go+T0h8WujQIq=Y9PshmgE7lQ@DLM_mK&)@2PRBaF9k2GB+_$3@vz@ zaW@qkWK`rllsP`DwXxC$z-MDj_tAuXL=6Y^tB|Dx0+qV2mIuFluA(q6NF~BI68a@! zv8_z1*K)s;oQ&txpr?q<({O7^no>r+#+i9S_o89FF$w<+8ud5 zta0FJFF!$Q(Yx^pS^00v_-C?QSc;`qHxmj32PM-iGBgfxP%M3As|b@2W)X}p=PGfW zv&>^@oX>^zlk~aBw&6nVzsTJasF=K?vFTqhH-N0 z*^fgg)KIIj-x$aN+?H8PwDxc?iKAVLRd?Dv6`;9NwYJYnjN3C76RB}nz^&Ke?$YT@ z7;n{VKC&7m2-))+(q@0+N<;5Qy@BA@x(;juq(s&!`6dCZN)F}v3#n-0A#EVGE_f!TFq zhVB|9IE<4VD-EB|Z&=Dt+mRF-Uf27Z86L->JfZ5lBLPd7BvvI=1}U4~!zeBfG}sr; z1#vT!OcI?((Y2^`;rpJ7U*kmi{e4NytBe7+Q+Qp7;WEJk{+;Xjx14T>HRKRoZ$}kx zw#!!kBuLJVsf6U$Tb-7)cr{Pm=aC3-Ws#=$>(*1U?b!&8)~BLq`{7CJf^Pdpw4=x&+wjL87D_X3n~nS@TqJ-7+*VpnSc^0kAPl$k>Hbq2 zr2fFSj&gN$eQ&S$giNOb`sXo)%0V7|Z3(r?dW!;12d5)0r=&6^QN_hU>c_zu@+XEc znAg=~u4*mDxL?CttD`AUnYVSR*n|e4!%5iGcNCK_9_w?@Z-xGw4p(U~UbEfS>`zjl zoyS`&*#9Y*^(QZ#A*Z1YN7=npu@P}0w&&_0ad54hKi8zvVRw&Mp&+7$x-swNeX&8m zn9|JxVn-Jh8nD1RMPc$^Ets z>Fa$V5VLQKd-MHx&7OCNeHTJ^f#LFTa+3g;dvR2{X(j07>(^4H%xqU{Ei-?1X>#zb zk4<5{2X*V}s=H*mNIGkPW4coQ*s!ngIO{BwI(cTJeH~VW2OITB5x^9hbJEQd6KWHr zx3T-mlGfwjxM#P2a^+UYlDz%Fp?Q%w6m=asAQ zq9AvuE!&K>t>h1xllnCDSnc?cr6`M6M%@NL-fR5i(D05zK(!g_fYb(C__L64uRLnPovw9I~lpSvEGqjTtjvuL87x zO{bUpV#BisWbkKQB{s=|wt^6>`4 zBKXnuS$2r${;COhs!=PmyAYp-2CppY>gGpatqBc{F8I*R4ZR6HrEaWfTYK;zpbxTc z!^mi98~=XIJl{dFk}I?em$|ZQ1^K1?^SAnU@&pktk&|Z4{rl24fCSub=Msym5zrF1 zOgUHol>?;&*zL`l-;aviiu0e%Bf%x-oyyNPN|QW_+?n~|b^04NiAt;6MMAp!=&YaZA^kdW?QHFA?5jSlnGKckmI0!}kJxJhDDR6Z^ps%}heQ%&>{GtgHYA zsLG_O!rID`^3ufI`gBX6Ow;UIkt%I@VWk0T{%C?CXIW81qNcSus-<|L!~PX_B5tX~ zud)E<1#8mHLX+c&!3@bcM5Lc!2a(52O}L))`iA~Quo+Qh@!4`Ode3=}W#4)Dhc|vF z?1e5%d_*I=w?Sml zUA@Snjb=L%g`vc5{`HLDv7Lq?*id-;A;oxCJL0ZcLB9d)Z(!i>k>D7}`8fzi!fEEF z#2475T#*KBpI-w}5K7=YBl%BGs|Vz#MC|4R)Tkh=H;z-V>2m=ZIu~)*j8KQ;KqHEAfCCC$z4}U6aSo?0CTGzi zMUrwD7|oal=y<@AE_vKJ`Br&6%f}omJT+)xun7i{j5Ty&+!+`>eg^;H9jOYau=Ma= zA~DWX?3TX5w~i;*&hX%(tx@?5HkvIMx}8B7)(bxMCL~?>e2Z1o^)fa|%t6GN87eT0 zV!@5#p7m^Ek@pN%yr@vmF+aTN%IQ?%YM&lwdC9Ped}>gMb$PqY_-NiMMN?^Y*oE4BhgIa_|s1B1j=6T zB!17}N~I%PEw5ReK`pLKY%$*?mhn2(M5>8d(R>QT^nQi6Lb=TLH^~ceN&??Pcrk75 z#`{kp3XbJCIB|cAX!13CSqf8ND%0MKi|ChUcI*p-_IHp8U$*Sx^c@5D2X{et3!_l` z*q^#^PnuVhSAeq+j2T#GFh%^0!qiy?sYvW}250d*SuOMF&N83J(V_k97i49{4rfsn zc6)XM*y>CguA!)0SrgQ2XF|uvhW08K+8Z7DeD9r<=Aqb%yG@?1al_M^#x-Z^GZ*hg zwfU(nFT@|^^&Be|4|;r89C6x#Bj%`(D8!AkfWfRIp5B-B`Ga7Pr<%rX!WTw=$ ztn%bo1@?yEiAe+N~6HOxiq zKai)Wp@oy7gQ>nQm5iQ+sjZ{o-?=CAf9gHQ#z2op#mM@_JegSN@aX6m*#7+}7dECZ zqV-SoN&f{x{{?;0F?@aTU(Ry*58(8l(I*}4fA2oWKu`a_qR+{%SuRimmz+XT>p6b; zRGLHqb2C3|mvAG`0ZjB-LK%oUw!{FT<0wtP}NK*33P9Imic*IY9% zG9T2`uKo%Pgf{s*pEAXdJN+vJ1oqWb_kKr2qnIDU5u5T&aINwuH>rJ1g7D1yL=HL2`hFy<;IDVw|Ib!- z|HB6RYYzG~0O%ha^bfoIbNqv8esRygo&Q5ez%la2Q z^gkY%|I9=GW83}Lt@szM@aSm&_f~jxEX@CTdWx&Nhr(dOXNr3jp@f&{Z>_!@ zw;tvoUZ{>Id`Vi>0ajIB-rqz7zLsQ(7I;MFafQ&1csWx12%`M6QtJEyzwn`9hypBH zOjm+98(NPWOu@%F#(`#j4OaEdWTISm&G<-5zLYiN{Mc)DjDp0jPbt;xpH3yXGCO!Q72sb3xF6`VK#7DnxaehKZlA=+cR>-a^5yz%+blwoF-} zI{i_LqKJX}guyhr=&XB$o)9@7@8#vRFoyN_Mr}|we2sM{7o);^1&VKJs^iw6qT@J* zF+$)7+QRZ+;VC$Mrg`w*WL<)mhST;4SS2fok=L{;qYb)F*P=!Z`#%$(z=%8rA9UVv znuC8oQ9<=mC-+rM($=G3#AB{w(KfXUctecC3{gZZ|BlZhT$a`o{9PC9)}am9M_PH$doAn* zA#^^S9N=r*YS`6P!wz4+)UU!Ps-uoEDUTjazzQ7@r8nm*Mb2Mylg@l6P0ZJ(dgeR) zZ?%1=oRgjsL&|Tewu;wKwbsGaz>+<^Q+juK?m}23-Jy<7{tDuEWxg9cTcSDtQ*bZ)C zvmP*6&YB_-k2`Dd9kvF0iOC(T%6ldu$m>@|D3xot6t;|v17Rg|h7=_Cl&|7Mp=37> zFt&RNUHh!uZ(DXzDhH&u4q1Ri`Wl`QsLYi5yb&dvJlGCq_xqY}=Q8Ym2PmFFS0uF`Z{LNFim>}M)!=P$!_ zmEH@`V32$|+0 z)aIvXq2R6(o>9VrZ_3sdO^A8sh>j5gsH0C~X3h}?C;iX+R?Ny@e~MrH^dw`V@wUrL z5NWNB;^DE)4LlM(JWPaupI;d)0F^#4^z08 z+d4S0O2`x0jHxygU@@?t5VuQ=n?W@=R+HV-CD(9+WKz2-m$${7Q`Fe@&HiHa z9kHu(;sj6%wa>E`Jgp&52D$)YU($${OWb6g**=Y0=2XVLXtk>8HH#Lrx~pED-gcg? z76=HNP*byMQY$Y%QC&DtU1%xXC13t!0E$eq$E1ZnFs&;U*8MG_V6PwqJ3Ya9mlvB} zkOU#B1*2TQv<-=p{d>Bt>DI!02(}BYWP~t-o{(N%Cm)W;Y7)58lufC1>aW6lsd$A= zgZkFcG~;|(*)-x7S}9!-hyi0yM148RT9c`8Y?#j8bFdJ);d#DA;cZ>g zQ61VbL+y%|awcHP0PwRVuIX%@f%N``lC6Qn>IZ|`vK#;|7gYugpc@=p614U6k?cbg3v!`n7V5Lt0Wg;y94d}j`(P@UCHB!1eH~FGf}D(KNqHJ0`Oq=U z#rX+KqPn{kGNRvl%T;us7A`Odx?IQ*IRQ2GHDZe-$VZIB2)C+5L?1*E^MLmX2wi(4 z2D$Ti@#7dF$b{r2Of}ezv5Ddxk=RJCXq6CI6N5mj9g&PH49@82IZG4Ehv9o!`Ne-W z)xJ~ApPREs6#z)Z9S1RTfc}Ut2QwiP@vz4eAWA`9tv+MFAOKKTuY#@|1+jbIJ|FizK~wM~Aq!5?!mf_2R8lyJyIu zQ=culv#!Qq;7*DQ-Ik8R4v=nEHQ=Qn@>YxkgAy`wA(SQfq`8!bl3};%P95P1loT+z zSQ?-FGn7)0IPA-ua-&v~5{MynBbZTf1?7T(lCotDH{!wMBstAy^+yZVI=Te{B!i#V zG(vyG+X}y1G=4Pi893 zYb}mncR+`g+bW5uiHsmxa zSohYq2B44zz?8@r)L~Yz9e-mJE|6s$&9vI4YNl=+6t7cGOPIYaP<)KNM^2v(RmL1rJ$=OhlyOi6aY;M~MBiV2{@AaFM z!VCs=R|e&N89uqK;(q_Q`;2SoSUptla5~y-q{L@>#9j4N*{~}SPOY6%+-T8%|LAqM z9xYMVP*UKgVKCOZMLC${V|$qY1p`T_&JMr_)W#o^BQ;-FAr**}Fq)AI4B*(}8i!@3 z&8BKCcCp9V8hU|9>54Yx0duX@B4|~R7U1W0GDmhXS7NN?L3iA%E=$r+2RT9%&P^l) zt#(p=hSjcvpxh$W;!u&=T$xCgw!`L-!i~=DCXTdZA6jAtUxH8z?md5V?~A#6N$L_i zU>@)sZGlg1b$gK}VvWu-%u)f9faYbfiWB8Npl&FX2GiU9~sYo+>DC4++lYdpG5x^MGfkT!?-Ryqqm?2PJ(B+^nsn+#KDrO2}1-PXV)O6|+0 zne+NHwa;a9E9Tv91e{k>0b(-{I+F{R-VTFt;87xYSnURns5E+$^a*^qBsRRCfiJ*r zm;FO!0u=kn@0K-&OZz;N5(*|K=yn=dQs)B*s2gJuze`K_YiKj2e2~z?r*0Kj(r-=c z^COZnCvVebkBTyxz8p_p_v?vx40%btKUi-vlS02+Fm=8o4TpAmn!V*k1;U(yhqqiu zUD9%7_AjMGKM#Tl#nK6sD3(MJ+Y1{J2ZJ5S*Na1?Q!GT677au!_q-Xx9|U_oVn=tH zj}xz?VC39PP4Kc@(tBJvykT4nAE35aovfiR0Id>m_i=@=OVL8F6wI8}F>=rTic2-y zdOmJWNg*GSHg`0ywOme*nw$Vh7+DkF6{a9D{sqgQm}7VnW+@YQhh>IxB;|Ba>IzZN zwVPr>L!j}QbRF&FaaVTZc{ir=_O?cu89%9+Xhc{W)VMr)M_+CR3wA&f+$+jOQ zVs=W|dbuxR{l2iUT715`OA)}-L!S&_IQ0V=f>S&Gcxc9?PqN12fw6*YbAN*V_&Xou z3PKWxlsTYM8Rp{fSY>R55TLpO0Z%B!fICk3ZJ+@TG?{eOXnu34*~FTwli*tMUQxa~ zwareIa%_cW=MwH#)9D7!!x?0eKWsedRcx*t@tAHE%~EYnD@%vo=Hpp-TBrBxe2g|c z`F$dv$4D% zK&i<~HUz9kLCFEtKIijfgZn>vRJQO{JU0*YX@*P#F4kCjG&>?G!%Z5It(@Wz1SO>) z=z@Q(Ckbv!TMcY0bh2_gr5D2WjRv`JMX(71CBz2$$Pbq=aSocw&&CVp9oPaP*436a zl!j%-A~MeaAy!cS=(D0#M}haxP#Ms_#v^l6b5F3_W{ZtZ*#%9QG;B|PbH)Z}Qv=Tk z>)gpL%f|x37mt!)P-ko+VRY#uy<(&zts?{}aM0)=9G)8If9k1PA}sRyTww;x^LqY-^x_KGmA@?ni=iZPLs-=X$y z;X!F>YT}AtlVF%MGPPnOxA4tw?5U!MdNcVN)Rs{L)Er1`hhr*0k4 zZbzYQqeNsKstcsejL(~pvya>2kW%jgTeS~^FZO1#>8~&5#H;Wem+2<2r zN!MY!fw2dL%0$5cE?&m2c0^~FUPPN;+K#*g)VcFo~O#vBF{`TWs+2ABbmjxuq@y&RM;+!e>7x=UMRt)&wxpr6QIuku%EkR`pyE9*Nyqc zJ$)GI)?X>>qV8>@k4KK;gdCbsOJNi)!JiY!p4Tm_ol^KQqMNWIjx@a& znHVDR+A@;rpYgG$YU^4|qlkKPO%>(v{Oa-HRioIJ`xsUzDx!UQ87(Vps3xR#uL5M^ zO?I9|Pl5*Du2;8tdi&`1$`YP)F)9WB`i|)zQ{0K0(#>7dUS1*T;F|Z*QG9fM8(Kz8 z(%|3>+WHo;ynh+(W@|%=!RyZgeFsX=p@TY)LYAg6h{U^+`@z@Qw1ye^LXgwJZvEXc z$M8PKSG0Ok`-c_y_g26i6l=k|XM*lX&!zQdsWy+qkajH%DQ#^NxImblIxlbMP96lX z2TLS^jgAns>qpR5LwG≪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%0A}XOS%&v_Ofc`K7{2BC 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 z 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%0AHw)BGH7 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 WI_*7hIAr&ExW>6Pz+M?Y2TxZMNDL2M@c% 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℘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

hrMP6FC6~ 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

-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%0Ajs** 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≈h%s1<-h+OcNl3F2JdJV0pxd+5tSC$|qOe9Wh4b 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 i-+cJ5zx?6PfBBz3|M8zc+-A6oeE2_;@=+52 From 6653d6c253e13452229016474658b7071584127e Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sat, 7 Mar 2026 21:49:34 +0000 Subject: [PATCH 35/59] skip ci in the private org Signed-off-by: Matt Liberty --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 74255543..e8eda3c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -6,6 +6,7 @@ on: jobs: build: + if: github.repository_owner != 'The-OpenROAD-Project-private' runs-on: ubuntu-latest steps: - name: Checkout From 2b9035c573c195e3240695a42ff2af450c301b6c Mon Sep 17 00:00:00 2001 From: Matt Liberty Date: Sat, 7 Mar 2026 21:52:35 +0000 Subject: [PATCH 36/59] remove CODEOWNERS, not relevant here Signed-off-by: Matt Liberty --- CODEOWNERS | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 CODEOWNERS diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index c6c2b793..00000000 --- a/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -# For CI/CD issues -/.github/ @kazutoiris From ef924bb0b5194a498e0d8c77e54e321a517f6e2c Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 7 Mar 2026 16:41:25 -0700 Subject: [PATCH 37/59] fmt Signed-off-by: James Cherry --- network/Network.i | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/network/Network.i b/network/Network.i index 349e9405..4334f648 100644 --- a/network/Network.i +++ b/network/Network.i @@ -638,13 +638,16 @@ InstancePinIterator * pin_iterator() { return Sta::sta()->ensureLinked()->pinIterator(self); } InstanceNetIterator * net_iterator() { return Sta::sta()->ensureLinked()->netIterator(self); } + Pin * find_pin(const char *name) { return Sta::sta()->ensureLinked()->findPin(self, name); } + std::string -get_attribute(const char *key) { +get_attribute(const char *key) +{ return Sta::sta()->ensureLinked()->getAttribute(self, key); } From 3b61817f908a366796c883c6fc3c206d525e9994 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sat, 7 Mar 2026 17:19:23 -0700 Subject: [PATCH 38/59] sdc:isConstrained for clk latency pin Signed-off-by: James Cherry --- doc/OpenSTA.fodt | 2054 ++++++++++++++++++++++---------------------- include/sta/Sdc.hh | 3 +- sdc/Sdc.cc | 7 +- sdc/Sdc.i | 8 + 4 files changed, 1045 insertions(+), 1027 deletions(-) diff --git a/doc/OpenSTA.fodt b/doc/OpenSTA.fodt index 5deadce7..fb9ea3b6 100644 --- a/doc/OpenSTA.fodt +++ b/doc/OpenSTA.fodt @@ -1,11 +1,11 @@ - Parallax STA documentationJames Cherry5182025-03-17T12:59:52.4638705382010-07-31T21:07:002026-03-07T12:37:15.449188000P123DT1H22M3SLibreOffice/25.8.1.1$MacOSX_AARCH64 LibreOffice_project/54047653041915e595ad4e45cccea684809c77b5PDF files: James CherryJames Cherry12.00000falsefalsefalsefalse + Parallax STA documentationJames Cherry5192025-03-17T12:59:52.4638705382010-07-31T21:07:002026-03-07T17:12:46.349252000P123DT1H24M11SLibreOffice/25.8.1.1$MacOSX_AARCH64 LibreOffice_project/54047653041915e595ad4e45cccea684809c77b5PDF files: James CherryJames Cherry12.00000falsefalsefalsefalse - 748993 - 0 + 1488348 + 1956 19290 17736 true @@ -13,12 +13,12 @@ view2 - 6375 - 755996 - 0 - 748993 - 19288 - 766727 + 17619 + 1497110 + 1956 + 1488348 + 21244 + 1506082 0 1 false @@ -89,7 +89,7 @@ false true false - 26836501 + 26953533 0 false @@ -198,7 +198,7 @@ - + @@ -4874,431 +4874,434 @@ - + + + + - + - + - + - + - + - + - + - - - - - - - - - + - + + + + + - + - + + + + + - + - - - - - + - + - - + + - + + + + + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - - + - + + + + + - + - + - + - - - - - + - + - + - + + + + + - + - + - - - - - + + + + + - + - - - - - + + + + + - - - - + + + + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - - - - + + + + - + - + - + - + - + - + - + - + @@ -5978,405 +5981,408 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + + + + @@ -6512,31 +6518,31 @@ Variables85 - Command Line Arguments + Command Line Arguments The command line arguments for sta are shown below. sta -help show help and exit -version show version and exit -no_init do not read ~/.sta -no_splash do not print the splash message -threads count|max use count threads -exit exit after reading cmd_file cmd_file source cmd_file When OpenSTA starts up, commands are first read from the user initialization file ~/.sta if it exists. If a TCL command file cmd_file is specified on the command line, commands are read from the file and executed before entering an interactive TCL command interpreter. If -exit is specified the application exits after reading cmd_file. Use the TCL exit command to exit the application. The –threads option specifies how many parallel threads to use. Use –threads max to use one thread per processor. - Example Command Scripts + Example Command Scripts To read a design into OpenSTA use the read_liberty command to read Liberty library files. Next, read hierarchical structural Verilog files with the read_verilog command. The link_design command links the Verilog to the Liberty timing cells. Any number of Liberty and Verilog files can be read before linking the design. Delays used for timing analysis are calculated using the Liberty timing models. If no parasitics are read only the pin capacitances of the timing models are used in delay calculation. Use the read_spef command to read parasitics from an extractor, or read_sdf to use delays calculated by an external delay calculator. Timing constraints can be entered as TCL commands or read using the read_sdc command. The units used by OpenSTA for all command arguments and reports are taken from the first Liberty file that is read. Use the set_cmd_units command to override the default units. Use the report_units command to see the ccmmand units. - Timing Analysis using SDF + Timing Analysis using SDF A sample command file that reads a library and a Verilog netlist and reports timing checks is shown below. read_liberty example1_slow.libread_verilog example1.vlink_design topread_sdf example1.sdfcreate_clock -name clk -period 10 {clk1 clk2 clk3}set_input_delay -clock clk 0 {in1 in2}report_checks This example can be found in examples/sdf_delays.tcl. - Timing Analysis with Multiple Process Corners + Timing Analysis with Multiple Process Corners An example command script using three process corners and +/-10% min/max derating is shown below. read_liberty nangate45_slow.lib.gzread_liberty nangate45_typ.lib.gzread_liberty nangate45_fast.lib.gzread_verilog example1.link_design topset_timing_derate -early 0.9set_timing_derate -late 1.1create_clock -name clk -period 10 {clk1 clk2 clk3}set_input_delay -clock clk 0 {in1 in2}define_scene ss -liberty nangate45_slowdefine_scene tt -liberty nangate45_typdefine_scene ff -liberty nangate45_fast# report all scenesreport_checks -path_delay min_max# report typical scenereport_checks -scene tt This example can be found in examples/multi_corner.tcl. Other examples can be found in the examples directory. - Timing Analysis with Multiple Corners and Modes + Timing Analysis with Multiple Corners and Modes OpenSTA supports multi-corner, multi-mode analysis. Each corner/mode combination is called a “scene”. The SDC constraints in each mode describe a different operating mode, such as mission mode or scan mode. Each corner has min/max Liberty libraries and SPEF parasitics. A mode named “default” is initially created for SDC commands. It is deleted when a mode is defined with set_mode or read_sdc -mode. Similartly, a named “default” is initially created that is deleted when define_scene is used to define a scene. An example command script using two process corners two modes is shown below. read_liberty asap7_small_ff.lib.gzread_liberty asap7_small_ss.lib.gzread_verilog reg1_asap7.vlink_design topread_sdc -mode mode1 mcmm2_mode1.sdcread_sdc -mode mode2 mcmm2_mode2.sdcread_spef -name reg1_ff reg1_asap7.spefread_spef -name reg1_ss reg1_asap7_ss.spefdefine_scene scene1 -mode mode1 -liberty asap7_small_ff -spef reg1_ffdefine_scene scene2 -mode mode2 -liberty asap7_small_ss -spef reg1_ssreport_checks -scenes scene1report_checks -scenes scene2report_checks -group_path_count 4 This example can be found in examples/mcmm3.tcl.In the example show above the SDC for the modes is in separate files. Alternatively, the SDC can be defined in the command file using the set_mode command between SDC command groups. set_mode mode1create_clock -name m1_clk -period 1000 {clk1 clk2 clk3}set_input_delay -clock m1_clk 100 {in1 in2}set_mode mode2create_clock -name m2_clk -period 500 {clk1 clk3}set_output_delay -clock m2_clk 100 out - Power Analysis + Power Analysis OpenSTA also supports static power analysis with the report_power command. Probabalistic switching activities are propagated from the input ports to determine switching activities for internal pins. read_liberty sky130hd_tt.libread_verilog gcd_sky130hd.vlink_design gcdread_sdc gcd_sky130hd.sdcread_spef gcd_sky130hd.spefset_power_activity -input -activity 0.1set_power_activity -input_port reset -activity 0report_power In this example the activity for all inputs is set to 0.1, and then the activity for the reset signal is set to zero because it does not switch during steady state operation. @@ -6548,14 +6554,14 @@ read_liberty sky130hd_tt.libread_verilog gcd_sky130hd.vlink_design gcdread_sdc gcd_sky130hd.sdcread_spef gcd_sky130hd.spefread_vcd -scope gcd_tb/gcd1 gcd_sky130hd.vcd.gzreport_power This example can be found in examples/power_vcd.tcl. Note that in this simple example design simulation based activities does not significantly change the results. - TCL Interpreter + TCL Interpreter Keyword arguments to commands may be abbreviated. For example, report_checks -unique is equivalent to the following command. report_checks -unique_paths_to_endpoint The help command lists matching commands and their arguments. > help report*report_annotated_check [-setup] [-hold] [-recovery] [-removal] [-nochange] [-width] [-period] [-max_skew] [-max_lines liness] [-list_annotated]group_path_count [-list_not_annotated] [-constant_arcs]report_annotated_delay [-cell] [-net] [-from_in_ports] [-to_out_ports] [-max_lines liness] [-list_annotated] [-list_not_annotated] [-constant_arcs]report_arrival pinreport_check_types [-violators] [-verbose] [-scene scene] [-format slack_only|end] [-max_delay] [-min_delay] [-recovery] [-removal] [-clock_gating_setup] [-clock_gating_hold] [-max_slew] [-min_slew] [-max_fanout] [-min_fanout] [-max_capacitance] [-min_capacitance [-min_pulse_width] [-min_period] [-max_skew] [-net net] [-digits digits [-no_line_splits] [> filename] [>> filename]report_checks [-from from_list|-rise_from from_list|-fall_from from_list] [-through through_list|-rise_through through_list|-fall_through through_list] [-to to_list|-rise_to to_list|-fall_to to_list] [-unconstrained] [-path_delay min|min_rise|min_fall|max|max_rise|max_fall|min_max] [-scene scene] [-group_path_count path_count] [-endpoint_path_count path_count] [-unique_paths_to_endpoint] [-slack_max slack_max] [-slack_min slack_min] [-sort_by_slack] [-path_group group_name] [-format full|full_clock|full_clock_expanded|short|end|summary]... - Many reporting commands support redirection of the output to a file much like a Unix shell. + Many reporting commands support redirection of the output to a file much like a Unix shell. report_checks -to out1 > path.logreport_checks -to out2 >> path.log Debugging Timing Here are some guidelines for debugging your design if static timing does not report any paths, or does not report the expected paths. @@ -6581,13 +6587,13 @@ Next, check the arrival times at the D and CP pins of the register with report_arrivals. % report_arrivals r1/D (clk1 ^) r 1.00:1.00 f 1.00:1.00% report_arrivals r1/CP (clk1 ^) r 0.00:0.00 f INF:-INF (clk1 v) r INF:-INF f 5.00:5.00 If there are no arrivals on an input port of the design, use the set_input_delay command to specify the arrival times on the port. - Commands + Commands - all_clocks + all_clocks @@ -6600,7 +6606,7 @@ - all_inputs + all_inputs [-no_clocks] @@ -6622,7 +6628,7 @@ - all_outputs + all_outputs @@ -6635,7 +6641,7 @@ - all_registers + all_registers [-clock clock_names][-cells | -data_pins | -clock_pins | -async_pins | ‑output_pins][-level_sensitive][-edge_triggered] @@ -6713,7 +6719,7 @@ - check_setup + check_setup [-verbose][-unconstrained_endpoints][-multiple_clock][-no_clock][-no_input_delay][-loops][-generated_clocks][> filename][>> filename] @@ -6782,7 +6788,7 @@ - connect_pin + connect_pin netport|pin @@ -6881,7 +6887,7 @@ - create_generated_clock + create_generated_clock [-name clock_name]-source master_pin[-master_clock master_clock][-divide_by divisor][-multiply_by multiplier][-duty_cycle duty_cycle][-invert][-edges edge_list][-edge_shift shift_list][-add]pin_list @@ -6997,7 +7003,7 @@ - create_voltage_area + create_voltage_area [-name name][-coordinate coordinates][-guard_band_x guard_x][-guard_band_y guard_y]cells @@ -7010,7 +7016,7 @@ - current_design + current_design [design] @@ -7023,7 +7029,7 @@ - current_instance + current_instance [instance] @@ -7044,7 +7050,7 @@ - define_scene + define_scene -mode mode_name -liberty liberty_files|-liberty_min liberty_min_files -liberty_max liberty_max_files-spef spef_file| -spef_min spef_min_file -spef_max spef_max_file @@ -7082,7 +7088,7 @@ - delete_clock + delete_clock [-all] clocks @@ -7103,7 +7109,7 @@ - delete_from_list + delete_from_list list objects @@ -7133,7 +7139,7 @@ - delete_generated_clock + delete_generated_clock [-all] clocks @@ -7154,7 +7160,7 @@ - delete_instance + delete_instance instance @@ -7175,7 +7181,7 @@ - delete_net + delete_net net @@ -7196,7 +7202,7 @@ - disconnect_pin + disconnect_pin netport | pin | -all @@ -7241,7 +7247,7 @@ - elapsed_run_time + elapsed_run_time @@ -7255,7 +7261,7 @@ - find_timing_paths + find_timing_paths [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-scene scene][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups] @@ -7470,7 +7476,7 @@ - get_cells + get_cells [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -7547,7 +7553,7 @@ - get_clocks + get_clocks [-regexp][-nocase][-filter expr][-quiet]patterns @@ -7601,7 +7607,7 @@ - get_fanin + get_fanin -to sink_list[-flat][-only_cells][-startpoints_only][-levels level_count][-pin_levels pin_count][-trace_arcs timing|enabled|all] @@ -7687,7 +7693,7 @@ - get_fanout + get_fanout -from source_list[-flat][-only_cells][-endpoints_only][-levels level_count][-pin_levels pin_count][-trace_arcs timing|enabled|all] @@ -7772,7 +7778,7 @@ - get_full_name + get_full_name object @@ -7863,7 +7869,7 @@ - get_lib_pins + get_lib_pins [-of_objects objects][-hsc separator][-filter expr][-regexp][-nocase][-quiet]patterns @@ -7933,7 +7939,7 @@ - get_libs + get_libs [-filter expr][-regexp][-nocase][-quiet]patterns @@ -7987,7 +7993,7 @@ - get_nets + get_nets [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8064,7 +8070,7 @@ - get_name + get_name object @@ -8086,7 +8092,7 @@ - get_pins + get_pins [-hierarchical][-hsc separator][-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8157,7 +8163,7 @@ - get_ports + get_ports [-filter expr][-regexp][-nocase][-quiet][-of_objects objects][patterns] @@ -8219,7 +8225,7 @@ - get_property + get_property [-object_type object_type]objectproperty @@ -8281,7 +8287,7 @@ - get_scenes + get_scenes [-mode mode_name]scene_name @@ -8310,7 +8316,7 @@ - get_timing_edges + get_timing_edges [-from from_pins][-to to_pins][-of_objects objects][-filter expr][patterns] @@ -8356,7 +8362,7 @@ - group_path + group_path -name group_name[-weight weight][-critical_range range][-from from_list |-rise_from from_list |-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-default] @@ -8473,7 +8479,7 @@ - include + include [-echo|-e][-verbose|-v]filename[> log_filename][>> log_filename] @@ -8527,7 +8533,7 @@ - link_design + link_design [-no_black_boxes][cell_name] @@ -8558,7 +8564,7 @@ - make_instance + make_instance inst_pathlib_cell @@ -8588,7 +8594,7 @@ - make_net + make_net net_name_list @@ -8609,7 +8615,7 @@ - read_liberty + read_liberty [-corner corner][-min][-max][-infer_latches]filename @@ -8658,7 +8664,7 @@ - read_saif + read_saif [-scope scope]filename @@ -8688,7 +8694,7 @@ - read_sdc + read_sdc [-mode mode_name][-echo]filename @@ -8728,7 +8734,7 @@ - read_sdf + read_sdf [-scene scene][-unescaped_dividers]filename @@ -8769,7 +8775,7 @@ - read_spef + read_spef [-name name][-keep_capacitive_coupling][-coupling_reduction_factor factor][-reduce][-path path]filename @@ -8816,7 +8822,7 @@ - The read_spef command reads a file of net parasitics in SPEF format. Use the report_parasitic_annotation command to check for nets that are not annotated. + The read_spef command reads a file of net parasitics in SPEF format. Use the report_parasitic_annotation command to check for nets that are not annotated. Files compressed with gzip are automatically uncompressed. Separate min/max parasitics can be annotated for each scene mode/corner. read_spef -name min spef1read_spef -name max spef2define_scene -mode mode1 -spef_min min -spef_max max @@ -8830,7 +8836,7 @@ - read_vcd + read_vcd [-scope scope][-mode mode_name]filename @@ -8867,7 +8873,7 @@ - read_verilog + read_verilog filename @@ -8882,7 +8888,7 @@ - The read_verilog command reads a gate level verilog netlist. After all verilog netlist and Liberty libraries are read the design must be linked with the link_design command. + The read_verilog command reads a gate level verilog netlist. After all verilog netlist and Liberty libraries are read the design must be linked with the link_design command. Verilog 2001 module port declaratations are supported. An example is shown below. module top (input in1, in2, clk1, clk2, clk3, output out); Files compressed with gzip are automatically uncompressed. @@ -8891,7 +8897,7 @@ - replace_cell + replace_cell instance_listreplacement_cell @@ -8921,7 +8927,7 @@ - replace_activity_annotation + replace_activity_annotation [-report_unannotated][-report_annotated] @@ -8950,7 +8956,7 @@ - report_annotated_check + report_annotated_check [-setup][-hold][-recovery][-removal][-nochange][-width][-period][-max_skew][-max_line lines][-report_annotated][-report_unannotated][-constant_arcs] @@ -9060,7 +9066,7 @@ - report_annotated_delay + report_annotated_delay [-cell][-net][-from_in_ports][-to_out_ports][-max_lines lines][-report_annotated][-report_unannotated][-constant_arcs] @@ -9138,7 +9144,7 @@ - report_checks + report_checks [-from from_list |-rise_from from_list |-fall_from from_list][-through through_list |-rise_through through_list |-fall_through through_list][-to to_list |-rise_to to_list |-fall_to to_list][-unconstrained][-path_delay min|min_rise|min_fall |max|max_rise|max_fall |min_max][-group_path_count path_count][-endpoint_path_count endpoint_path_count][-unique_paths_to_endpoint][-unique_edges_to_endpoint][-scenes scenes][-slack_max max_slack][-slack_min min_slack][-sort_by_slack][-path_group groups][-format end|full|short|summary |full_clock|full_clock_expanded |json][-fields fields][-digits digits][-no_line_split][> filename][>> filename] @@ -9443,7 +9449,7 @@ - report_check_types + report_check_types [-scenes scenes][-violators][-verbose][-format slack_only|end][-max_delay][-min_delay][-recovery][-removal][-clock_gating_setup][-clock_gating_hold][-max_slew][-min_slew][-min_pulse_width][-min_period][-digits digits][-no_split_lines][> filename][>> filename] @@ -9601,7 +9607,7 @@ - report_clock_latency + report_clock_latency [-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] @@ -9646,7 +9652,7 @@ - report_clock_min_period + report_clock_min_period [-clocks clocks][-scenes scenes][-include_port_paths] @@ -9676,7 +9682,7 @@ - report_clock_properties + report_clock_properties [clock_names] @@ -9697,7 +9703,7 @@ - report_clock_skew + report_clock_skew [-setup|-hold][-clocks clocks][-scenes scenes][-include_internal_latency][-digits digits] @@ -9758,7 +9764,7 @@ - report_dcalc + report_dcalc [-from from_pin][-to to_pin][-scene scene][-min][-max][-digits digits][> filename][>> filename] @@ -9820,7 +9826,7 @@ - report_disabled_edges + report_disabled_edges @@ -9834,7 +9840,7 @@ - report_edges + report_edges [-from from_pin][-to to_pin] @@ -9863,7 +9869,7 @@ - report_instance + report_instance instance_path[> filename][>> filename] @@ -9884,7 +9890,7 @@ - report_lib_cell + report_lib_cell cell_name[> filename][>> filename] @@ -9906,7 +9912,7 @@ - report_net + report_net [-digits digits]net_path[> filename][>> filename] @@ -9935,7 +9941,7 @@ - report_parasitic_annotation + report_parasitic_annotation [-report_unannotated][> filename][>> filename] @@ -9956,7 +9962,7 @@ - report_power + report_power [-instances instances][-highest_power_instances count][-digits digits][> filename][>> filename] @@ -9995,7 +10001,7 @@ - report_slews + report_slews [-scenes scenes]pin @@ -10024,7 +10030,7 @@ - report_tns + report_tns [-min][-max][-digits digits] @@ -10061,7 +10067,7 @@ - report_units + report_units @@ -10075,7 +10081,7 @@ - report_wns + report_wns [-min][-max][-digits digits] @@ -10112,7 +10118,7 @@ - report_worst_slack + report_worst_slack [-min][-max][-digits digits] @@ -10150,7 +10156,7 @@ - set_assigned_check + set_assigned_check -setup|-hold|-recovery|-removal[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins][-clock rise|fall][-cond sdf_cond][-worst]margin @@ -10268,7 +10274,7 @@ - set_assigned_delay + set_assigned_delay -cell|-net[-rise][-fall][-scene scene][-min][-max][-from from_pins][-to to_pins]delay @@ -10361,7 +10367,7 @@ - set_assigned_transition + set_assigned_transition [-rise][-fall][-scene scene][-min][-max]slewpin_list @@ -10431,7 +10437,7 @@ - set_case_analysis + set_case_analysis 0|1|zero|one|rise|rising|fall|fallingport_or_pin_list @@ -10453,7 +10459,7 @@ - set_clock_gating_check + set_clock_gating_check [-setup setup_time][-hold hold_time][-rise][-fall][-high][-low][objects] @@ -10527,7 +10533,7 @@ - set_clock_groups + set_clock_groups [-name name][-logically_exclusive][-physically_exclusive][-asynchronous][-allow_paths]-group clocks @@ -10588,7 +10594,7 @@ - set_clock_latency + set_clock_latency [-source][-clock clock][-rise][-fall][-min][-max]delayobjects @@ -10659,13 +10665,13 @@ - The set_clock_latency command describes expected delays of the clock tree when analyzing a design using ideal clocks. Use the -source option to specify latency at the clock source, also known as insertion delay. Source latency is delay in the clock tree that is external to the design or a clock tree internal to an instance that implements a complex logic function. + The set_clock_latency command describes expected delays of the clock tree when anxsalyzing a design using ideal clocks. Use the -source option to specify latency at the clock source, also known as insertion delay. Source latency is delay in the clock tree that is external to the design or a clock tree internal to an instance that implements a complex logic function.set_clock_latency removes propagated clock properties for the clocks and pins objects. - set_clock_transition + set_clock_transition [-rise][-fall][-min][-max]transitionclocks @@ -10676,24 +10682,24 @@ -rise - Set the transition time for the rising edge of the clock. - - - - - -fall - - - Set the transition time for the falling edge of the clock. + Set the transition time for the rising edge of the clock. + + + -fall + + + Set the transition time for the falling edge of the clock. + + -min - Set the min transition time. + Set the min transition time. @@ -10701,7 +10707,7 @@ -max - Set the min transition time. + Set the min transition time. @@ -10727,7 +10733,7 @@ - set_clock_uncertainty + set_clock_uncertainty [-from|-rise_from|-fall_from from_clock][-to|-rise_to|-fall_to to_clock][-rise][-fall][-setup][-hold]uncertainty[objects] @@ -10735,18 +10741,18 @@ - -from from_clock + -from from_clock - Inter-clock uncertainty source clock. + Inter-clock uncertainty source clock. - -to to_clock + -to to_clock - Inter-clock uncertainty target clock. + Inter-clock uncertainty target clock. @@ -10754,7 +10760,7 @@ -rise - Inter-clock target clock rise edge, alternative to ‑rise_to.Inter-clock target clock rise edge, alternative to ‑rise_to. + Inter-clock target clock rise edge, alternative to ‑rise_to.Inter-clock target clock rise edge, alternative to ‑rise_to. @@ -10762,7 +10768,7 @@ -fall - Inter-clock target clock rise edge, alternative to ‑fall_to. + Inter-clock target clock rise edge, alternative to ‑fall_to. @@ -10770,7 +10776,7 @@ -setup - uncertainty is for setup checks. + uncertainty is for setup checks. @@ -10778,12 +10784,12 @@ -hold - uncertainty is for hold checks. + uncertainty is for hold checks. - uncertainty + uncertainty Clock uncertainty. @@ -10798,99 +10804,99 @@ - The set_clock_uncertainty command specifies the uncertainty or jitter in a clock. The uncertainty for a clock can be specified on its source pin or port, or the clock itself. - set_clock_uncertainty .1 [get_clock clk1] - Inter-clock uncertainty between the source and target clocks of timing checks is specified with the ‑from|‑rise_from|-fall_from andto|‑rise_to|-fall_to arguments . - set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] .1 - The following commands are equivalent. - set_clock_uncertainty -from [get_clock clk1] -rise_to [get_clocks clk2] .1set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] -rise .1 + The set_clock_uncertainty command specifies the uncertainty or jitter in a clock. The uncertainty for a clock can be specified on its source pin or port, or the clock itself. + set_clock_uncertainty .1 [get_clock clk1] + Inter-clock uncertainty between the source and target clocks of timing checks is specified with the ‑from|‑rise_from|-fall_from andto|‑rise_to|-fall_to arguments . + set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] .1 + The following commands are equivalent. + set_clock_uncertainty -from [get_clock clk1] -rise_to [get_clocks clk2] .1set_clock_uncertainty -from [get_clock clk1] -to [get_clocks clk2] -rise .1 - set_cmd_units + set_cmd_units - [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] + [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] - -capacitance cap_unit + -capacitance cap_unit - The capacitance scale factor followed by 'f'. + The capacitance scale factor followed by 'f'. - -resistance res_unit + -resistance res_unit - The resistance scale factor followed by 'ohm'. + The resistance scale factor followed by 'ohm'. - -time time_unit + -time time_unit - The time scale factor followed by 's'. + The time scale factor followed by 's'. - -voltage voltage_unit + -voltage voltage_unit - The voltage scale factor followed by 'v'. + The voltage scale factor followed by 'v'. - -current current_unit + -current current_unit - The current scale factor followed by 'A'. + The current scale factor followed by 'A'. - -power power_unit + -power power_unit - The power scale factor followed by 'w'. + The power scale factor followed by 'w'. - -distance distance_unit + -distance distance_unit - The distance scale factor followed by 'm'. + The distance scale factor followed by 'm'. - The set_cmd_units command is used to change the units used by the STA command interpreter when parsing commands and reporting results. The default units are the units specified in the first Liberty library file that is read. + The set_cmd_units command is used to change the units used by the STA command interpreter when parsing commands and reporting results. The default units are the units specified in the first Liberty library file that is read. Units are specified as a scale factor followed by a unit name. The scale factors are as follows. - M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 + M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 An example of the set_units command is shown below. - set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um + set_cmd_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm -distance um - set_data_check + set_data_check - [-from|-rise_from|-fall_from from_pin][-to|-rise_to|-fall_to to_pin][-setup][-hold][-clock clock]margin + [-from|-rise_from|-fall_from from_pin][-to|-rise_to|-fall_to to_pin][-setup][-hold][-clock clock]margin - -from from_pin + -from from_pin A pin used as the timing check reference. @@ -10898,7 +10904,7 @@ - -to to_pin + -to to_pin A pin that the setup/hold check is applied to. @@ -10922,7 +10928,7 @@ - -clock clock + -clock clock The setup/hold check clock. @@ -10943,7 +10949,7 @@ - set_disable_inferred_clock_gating + set_disable_inferred_clock_gating objects @@ -10962,9 +10968,10 @@ + - set_disable_timing + set_disable_timing [-from from_port][-to to_port]objects @@ -10972,18 +10979,18 @@ - -from from_port + -from from_port - + - -to to_port + -to to_port - + @@ -10991,11 +10998,11 @@ objects - A list of instances, ports, pins, cells, cell/port, or library/cell/port. + A list of instances, ports, pins, cells, cell/port, or library/cell/port. - The set_disable_timing command is used to disable paths though pins in the design. There are many different forms of the command depending on the objects specified in objects. + The set_disable_timing command is used to disable paths though pins in the design. There are many different forms of the command depending on the objects specified in objects. All timing paths though an instance are disabled when objects contains an instance. Timing checks in the instance are not disabled. set_disable_timing u2 The -from and -to options can be used to restrict the disabled path to those from, to or between specific pins on the instance. @@ -11009,18 +11016,19 @@ - set_drive + set_drive - [-rise][-fall][-max][-min]resistanceports + [-rise][-fall][-max][-min]resistanceports + -rise - Set the drive rise resistance. + Set the drive rise resistance. @@ -11028,7 +11036,7 @@ -fall - Set the drive fall resistance. + Set the drive fall resistance. @@ -11036,7 +11044,7 @@ -max - Set the maximum resistance. + Set the maximum resistance. @@ -11044,7 +11052,7 @@ -min - Set the minimum resistance. + Set the minimum resistance. @@ -11057,39 +11065,39 @@ - ports + ports A list of ports. - The set_drive command describes the resistance of an input port external driver. + The set_drive command describes the resistance of an input port external driver. - set_driving_cell + set_driving_cell - [-lib_cell cell_name][-library library][-rise][-fall][-min][-max][-pin pin][-from_pin from_pin][-input_transition_rise trans_rise][-input_transition_fall trans_fall]ports + [-lib_cell cell_name][-library library][-rise][-fall][-min][-max][-pin pin][-from_pin from_pin][-input_transition_rise trans_rise][-input_transition_fall trans_fall]ports - -lib_cell cell_name + -lib_cell cell_name - The driving cell. + The driving cell. - -library library + -library library - The driving cell library. + The driving cell library. @@ -11097,7 +11105,7 @@ -rise - Set the driving cell for a rising edge. + Set the driving cell for a rising edge. @@ -11105,7 +11113,7 @@ -fall - Set the driving cell for a falling edge. + Set the driving cell for a falling edge. @@ -11113,7 +11121,7 @@ -max - Set the driving cell for max delays. + Set the driving cell for max delays. @@ -11121,12 +11129,12 @@ -min - Set the driving cell for min delays. + Set the driving cell for min delays. - -pin pin + -pin pin The output port of the driving cell. @@ -11134,15 +11142,16 @@ - -from_pin from_pin + -from_pin from_pin - Use timing arcs from from_pin to the output pin. + Use timing arcs from from_pin to the output pin. + - -input_transition_rise trans_rise + -input_transition_rise trans_rise The transition time for a rising input at from_pin. @@ -11150,7 +11159,7 @@ - -input_transition_fall trans_fall + -input_transition_fall trans_fall The transition time for a falling input at from_pin. @@ -11158,7 +11167,7 @@ - ports + ports A list of ports. @@ -11169,10 +11178,9 @@ - - set_false_path + set_false_path [-setup][-hold][-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-reset_path] @@ -11183,7 +11191,7 @@ -setup - Apply to setup checks. + Apply to setup checks. @@ -11191,7 +11199,7 @@ -hold - Apply to hold checks. + Apply to hold checks. @@ -11199,7 +11207,7 @@ -rise - Apply to rising path edges. + Apply to rising path edges. @@ -11207,7 +11215,7 @@ -fall - Apply to falling path edges. + Apply to falling path edges. @@ -11220,7 +11228,7 @@ - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -11228,7 +11236,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -11236,7 +11244,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -11244,16 +11252,15 @@ The set_false_path command disables timing along a path from, through and to a group of design objects. - Objects in from_list can be clocks, register/latch instances, or register/latch clock pins. The -rise_from and -fall_from keywords restrict the false paths to a specific clock edge. + Objects in from_list can be clocks, register/latch instances, or register/latch clock pins. The -rise_from and -fall_from keywords restrict the false paths to a specific clock edge. Objects in through_list can be nets, instances, instance pins, or hierarchical pins,. The -rise_through and -fall_through keywords restrict the false paths to a specific path edge that traverses through the object. Objects in to_list can be clocks, register/latch instances, or register/latch clock pins. The -rise_to and -fall_to keywords restrict the false paths to a specific transition at the path end. - - set_fanout_load + set_fanout_load fanoutport_list @@ -11266,7 +11273,7 @@ - set_hierarchy_separator + set_hierarchy_separator separator @@ -11287,7 +11294,7 @@ - set_ideal_latency + set_ideal_latency [-rise] [-fall] [-min] [-max] delay objects @@ -11300,7 +11307,7 @@ - set_ideal_network + set_ideal_network [-no_propagation] objects @@ -11313,7 +11320,7 @@ - set_ideal_transition + set_ideal_transition [-rise] [-fall] [-min] [-max] transition_time objects @@ -11324,9 +11331,10 @@ + - set_input_delay + set_input_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall][-reference_pin ref_pin][-source_latency_included][-network_latency_included][-add_delay]delayport_pin_list @@ -11337,7 +11345,7 @@ -rise - Set the arrival time for the rising edge of the input. + Set the arrival time for the rising edge of the input. @@ -11345,16 +11353,15 @@ -fall - Set the arrival time for the falling edge of the input. + Set the arrival time for the falling edge of the input. - -max - Set the maximum arrival time. + Set the maximum arrival time. @@ -11362,12 +11369,12 @@ -min - Set the minimum arrival time. + Set the minimum arrival time. - -clock clock + -clock clock The arrival time is from clock. @@ -11383,7 +11390,7 @@ - -reference_pin ref_pin + -reference_pin ref_pin The arrival time is with respect to the clock that arrives at ref_pin. @@ -11394,7 +11401,7 @@ -source_latency_included - D no add the clock source latency (insertion delay) to the delay value. + D no add the clock source latency (insertion delay) to the delay value. @@ -11402,7 +11409,7 @@ -network_latency_included - Do not add the clock latency to the delay value when the clock is ideal. + Do not add the clock latency to the delay value when the clock is ideal. @@ -11430,20 +11437,19 @@ - The set_input_delay command is used to specify the arrival time of an input signal. - The following command sets the min, max, rise and fall times on the in1 input port 1.0 time units after the rising edge of clk1. - set_input_delay -clock clk1 1.0 [get_ports in1] - Use multiple commands with the -add_delay option to specify separate arrival times for min, max, rise and fall times or multiple clocks. For example, the following specifies separate arrival times with respect to clocks clk1 and clk2. - set_input_delay -clock clk1 1.0 [get_ports in1]set_input_delay -add_delay -clock clk2 2.0 [get_ports in1] - The –reference_pin option is used to specify an arrival time with respect to the arrival on a pin in the clock network. For propagated clocks, the input arrival time is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, input arrival time is relative to the reference pin clock source latency. With the -clock_fall flag the arrival time is relative to the falling transition at the reference pin. If no clocks arrive at the reference pin the set_input_delay command is ignored. If no -clock is specified the arrival time is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. - Paths from inputs that do not have an arrival time defined by set_input_delay are not reported. Set the sta_input_port_default_clock variable to 1 to report paths from inputs without a set_input_delay. + The set_input_delay command is used to specify the arrival time of an input signal. + The following command sets the min, max, rise and fall times on the in1 input port 1.0 time units after the rising edge of clk1. + set_input_delay -clock clk1 1.0 [get_ports in1] + Use multiple commands with the -add_delay option to specify separate arrival times for min, max, rise and fall times or multiple clocks. For example, the following specifies separate arrival times with respect to clocks clk1 and clk2. + set_input_delay -clock clk1 1.0 [get_ports in1]set_input_delay -add_delay -clock clk2 2.0 [get_ports in1] + The –reference_pin option is used to specify an arrival time with respect to the arrival on a pin in the clock network. For propagated clocks, the input arrival time is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, input arrival time is relative to the reference pin clock source latency. With the -clock_fall flag the arrival time is relative to the falling transition at the reference pin. If no clocks arrive at the reference pin the set_input_delay command is ignored. If no -clock is specified the arrival time is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. + Paths from inputs that do not have an arrival time defined by set_input_delay are not reported. Set the sta_input_port_default_clock variable to 1 to report paths from inputs without a set_input_delay. - - set_input_transition + set_input_transition [-rise][-fall][-max][-min]transitionport_list @@ -11454,7 +11460,7 @@ -rise - Set the rising edge transition. + Set the rising edge transition. @@ -11462,7 +11468,7 @@ -fall - Set the falling edge transition. + Set the falling edge transition. @@ -11470,7 +11476,7 @@ -max - Set the minimum transition time. + Set the minimum transition time. @@ -11478,7 +11484,7 @@ -min - Set the maximum transition time. + Set the maximum transition time. @@ -11504,7 +11510,7 @@ - set_level_shifter_strategy + set_level_shifter_strategy [-rule rule_type] @@ -11515,9 +11521,10 @@ + - set_level_shifter_threshold + set_level_shifter_threshold [-voltage voltage] @@ -11530,7 +11537,7 @@ - set_load + set_load [-rise][-fall][-max][-min][-subtract_pin_load][-pin_load][-wire_load]capacitanceobjects @@ -11541,7 +11548,7 @@ -rise - Set the external port rising capacitance (ports only). + Set the external port rising capacitance (ports only). @@ -11549,16 +11556,15 @@ -fall - Set the external port falling capacitance (ports only). + Set the external port falling capacitance (ports only). - -max - Set the max capacitance. + Set the max capacitance. @@ -11566,7 +11572,7 @@ -min - Set the min capacitance. + Set the min capacitance. @@ -11574,7 +11580,7 @@ -subtract_pin_load - Subtract the capacitance of all instance pins connected to the net from capacitance (nets only). If the resulting capacitance is negative, zero is used. Pin capacitances are ignored by delay calculation when this option is used. + Subtract the capacitance of all instance pins connected to the net from capacitance (nets only). If the resulting capacitance is negative, zero is used. Pin capacitances are ignored by delay calculation when this option is used. @@ -11610,16 +11616,16 @@ - The set_load command annotates wire capacitance on a net or external capacitance on a port. There are four different uses for the set_load commanc: - set_load -wire_load port external port wire capacitanceset_load -pin_load port external port pin capacitanceset_load port same as -pin_loadset_load net net wire capacitance - External port capacitance can be annotated separately with the -pin_load and ‑wire_load options. Without the -pin_load and -wire_load options pin capacitance is annotated. - When annotating net wire capacitance with the -subtract_pin_load option the capacitance of all instance pins connected to the net is subtracted from capacitance. Setting the capacitance on a net overrides SPEF parasitics for delay calculation. + The set_load command annotates wire capacitance on a net or external capacitance on a port. There are four different uses for the set_load commanc: + set_load -wire_load port external port wire capacitanceset_load -pin_load port external port pin capacitanceset_load port same as -pin_loadset_load net net wire capacitance + External port capacitance can be annotated separately with the -pin_load and ‑wire_load options. Without the -pin_load and -wire_load options pin capacitance is annotated. + When annotating net wire capacitance with the -subtract_pin_load option the capacitance of all instance pins connected to the net is subtracted from capacitance. Setting the capacitance on a net overrides SPEF parasitics for delay calculation. - set_logic_dc + set_logic_dc port_list @@ -11640,7 +11646,7 @@ - set_logic_one + set_logic_one port_list @@ -11655,14 +11661,13 @@ - Set a port or pin to a constant logic one value. No paths are propagated from constant pins. Constant values set with the set_logic_one command are not propagated through downstream gates. + Set a port or pin to a constant logic one value. No paths are propagated from constant pins. Constant values set with the set_logic_one command are not propagated through downstream gates. - - set_logic_zero + set_logic_zero port_list @@ -11677,13 +11682,13 @@ - Set a port or pin to a constant logic zero value. No paths are propagated from constant pins. Constant values set with the set_logic_zero command are not propagated through downstream gates. + Set a port or pin to a constant logic zero value. No paths are propagated from constant pins. Constant values set with the set_logic_zero command are not propagated through downstream gates. - set_max_area + set_max_area area @@ -11704,7 +11709,7 @@ - set_max_capacitance + set_max_capacitance capacitanceobjects @@ -11718,6 +11723,7 @@ + objects @@ -11733,10 +11739,10 @@ - set_max_delay + set_max_delay - [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay + [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay @@ -11744,7 +11750,7 @@ -rise - Set max delay for rising paths. + Set max delay for rising paths. @@ -11752,13 +11758,12 @@ -fall - Set max delay for falling paths. + Set max delay for falling paths. - - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -11766,7 +11771,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -11774,7 +11779,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -11793,7 +11798,7 @@ -probe - Do not break paths at internal pins (non startpoints). + Do not break paths at internal pins (non startpoints). @@ -11814,13 +11819,13 @@ The set_max_delay command constrains the maximum delay through combinational logic paths. See set_false_path for a description of allowed from_list, through_list and to_list objects. If the to_list ends at a timing check the setup/hold time is included in the path delay. - When the -ignore_clock_latency option is used clock latency at the source and destination of the path delay is ignored. The constraint is reported in the default path group (**default**) rather than the clock path group when the path ends at a timing check. + When the -ignore_clock_latency option is used clock latency at the source and destination of the path delay is ignored. The constraint is reported in the default path group (**default**) rather than the clock path group when the path ends at a timing check. - set_max_dynamic_power + set_max_dynamic_power power [unit] @@ -11833,7 +11838,7 @@ - set_max_fanout + set_max_fanout fanoutobjects @@ -11862,7 +11867,7 @@ - set_max_leakage_power + set_max_leakage_power power [unit] @@ -11875,13 +11880,12 @@ - set_max_time_borrow + set_max_time_borrow delayobjects - delay @@ -11905,7 +11909,7 @@ - set_max_transition + set_max_transition [-data_path][-clock_path][-rise][-fall]transitionobjects @@ -11913,34 +11917,35 @@ - -data_path + -data_path - Set the max slew for data paths. + Set the max slew for data paths. - -clock_path + -clock_path - Set the max slew for clock paths. + Set the max slew for clock paths. + + + + + + -rise + + + Set the max slew for rising paths. - -rise + -fall - Set the max slew for rising paths. - - - - - -fall - - - Set the max slew for falling paths. + Set the max slew for falling paths. @@ -11948,7 +11953,7 @@ transition - The maximum slew/transition time. + The maximum slew/transition time. @@ -11960,7 +11965,7 @@ - The set_max_transition command is specifies the maximum transition time (slew) design rule checked by the report_check_types –max_transition command. + The set_max_transition command is specifies the maximum transition time (slew) design rule checked by the report_check_types –max_transition command. If specified for a design, the default maximum transition is set for the design. If specified for a clock, the maximum transition is applied to all pins in the clock domain. The –clock_path option restricts the maximum transition to clocks in clock paths. The -data_path option restricts the maximum transition to clocks data paths. The –clock_path, -data_path, -rise and –fall options only apply to clock objects. @@ -11968,7 +11973,7 @@ - set_min_capacitance + set_min_capacitance capacitanceobjects @@ -11979,7 +11984,7 @@ capacitance - Minimum capacitance. + Minimum capacitance. @@ -11995,13 +12000,12 @@ - - set_min_delay + set_min_delay - [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay + [-rise][-fall][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-ignore_clock_latency][-probe][-reset_path]delay @@ -12009,20 +12013,21 @@ -rise - Set min delay for rising paths. + Set min delay for rising paths. + -fall - Set min delay for falling paths. + Set min delay for falling paths. - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -12030,7 +12035,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -12038,7 +12043,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -12057,7 +12062,7 @@ -probe - Do not break paths at internal pins (non startpoints). + Do not break paths at internal pins (non startpoints). @@ -12073,7 +12078,7 @@ delay - The minimum delay. + The minimum delay. @@ -12082,10 +12087,9 @@ - - set_min_pulse_width + set_min_pulse_width [-high][-low]min_widthobjects @@ -12130,20 +12134,21 @@ - set_mode + set_mode mode_name - The the mode for SDC c ommands in the TCL interpreter. If mode mode_name does not exist, it is created. When modes are created the default mode is deleted. + The the mode for SDC c ommands in the TCL interpreter. If mode mode_name does not exist, it is created. When modes are created the default mode is deleted. + - set_multicycle_path + set_multicycle_path [-setup][-hold][-rise][-fall][-start][-end][-from from_list][-rise_from from_list][-fall_from from_list][-through through_list][-rise_through through_list][-fall_through through_list][-to to_list][-rise_to to_list][-fall_to to_list][-reset_path]path_multiplier @@ -12154,7 +12159,7 @@ -setup - Set cycle count for setup checks. + Set cycle count for setup checks. @@ -12162,7 +12167,7 @@ -hold - Set cycle count for hold checks. + Set cycle count for hold checks. @@ -12170,16 +12175,15 @@ -rise - Set cycle count for rising path edges. + Set cycle count for rising path edges. - -fall - Set cycle count for falling path edges. + Set cycle count for falling path edges. @@ -12200,7 +12204,7 @@ - -from from_list + -from from_list A list of clocks, instances, ports or pins. @@ -12208,7 +12212,7 @@ - -through through_list + -through through_list A list of instances, pins or nets. @@ -12216,7 +12220,7 @@ - -to to_list + -to to_list A list of clocks, instances, ports or pins. @@ -12243,17 +12247,18 @@ + - set_operating_conditions + set_operating_conditions - [-analysis_type single|bc_wc|on_chip_variation][-library lib][condition][-min min_condition][-max max_condition][-min_library min_lib][-max_library max_lib] + [-analysis_type single|bc_wc|on_chip_variation][-library lib][condition][-min min_condition][-max max_condition][-min_library min_lib][-max_library max_lib] - -analysis_type single + -analysis_type single Use one operating condition for min and max paths. @@ -12261,7 +12266,7 @@ - -analysis_type bc_wc + -analysis_type bc_wc Best case, worst case analysis. Setup checks use max_condition for clock and data paths. Hold checks use the min_condition for clock and data paths. @@ -12269,7 +12274,7 @@ - ‑analysis_type on_chip_variation + ‑analysis_type on_chip_variation The min and max operating conditions represent variations on the chip that can occur simultaneously. Setup checks use max_condition for data paths and min_condition for clock paths. Hold checks use min_condition for data paths and max_condition for clock paths. This is the default analysis type. @@ -12277,7 +12282,7 @@ - -library lib + -library lib The name of the library that contains condition. @@ -12293,16 +12298,15 @@ - -min min_condition + -min min_condition The operating condition to use for min paths and hold checks. - - -max max_condition + -max max_condition The operating condition to use for max paths and setup checks. @@ -12310,7 +12314,7 @@ - -min_library min_lib + -min_library min_lib The name of the library that contains min_condition. @@ -12318,7 +12322,7 @@ - -max_library max_lib + -max_library max_lib The name of the library that contains max_condition. @@ -12331,18 +12335,19 @@ - set_output_delay + set_output_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall][-reference_pin ref_pin][-source_latency_included][-network_latency_included][-add_delay]delayport_pin_list + -rise - Set the output delay for the rising edge of the input. + Set the output delay for the rising edge of the input. @@ -12350,7 +12355,7 @@ -fall - Set the output delay for the falling edge of the input. + Set the output delay for the falling edge of the input. @@ -12358,7 +12363,7 @@ -max - Set the maximum output delay. + Set the maximum output delay. @@ -12366,15 +12371,15 @@ -min - Set the minimum output delay. + Set the minimum output delay. - -clock clock + -clock clock - The external check is to clock. The default clock edge is rising. + The external check is to clock. The default clock edge is rising. @@ -12382,15 +12387,15 @@ -clock_fall - The external check is to the falling edge of clock. + The external check is to the falling edge of clock. - -reference_pin ref_pin + -reference_pin ref_pin - The external check is clocked by the clock that arrives at ref_pin. + The external check is clocked by the clock that arrives at ref_pin. @@ -12398,7 +12403,7 @@ -add_delay - Add this output delay to any existing output delays. + Add this output delay to any existing output delays. @@ -12406,7 +12411,7 @@ delay - The external delay to the check clocked by clock. + The external delay to the check clocked by clock. @@ -12418,17 +12423,17 @@ - The set_output_delay command is used to specify the external delay to a setup/hold check on an output port or internal pin that is clocked by clock. Unless the -add_delay option is specified any existing output delays are replaced. - The –reference_pin option is used to specify a timing check with respect to the arrival on a pin in the clock network. For propagated clocks, the timing check is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, the timing check is relative to the reference pin clock source latency. With the -clock_fall flag the timing check is relative to the falling edge of the reference pin. If no clocks arrive at the reference pin the set_output_delay command is ignored. If no -clock is specified the timing check is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. + The set_output_delay command is used to specify the external delay to a setup/hold check on an output port or internal pin that is clocked by clock. Unless the -add_delay option is specified any existing output delays are replaced. + The –reference_pin option is used to specify a timing check with respect to the arrival on a pin in the clock network. For propagated clocks, the timing check is relative to the clock arrival time at the reference pin (the clock source latency and network latency from the clock source to the reference pin). For ideal clocks, the timing check is relative to the reference pin clock source latency. With the -clock_fall flag the timing check is relative to the falling edge of the reference pin. If no clocks arrive at the reference pin the set_output_delay command is ignored. If no -clock is specified the timing check is with respect to all clocks that arrive at the reference pin. The -source_latency_included and -network_latency_included options cannot be used with -reference_pin. - set_port_fanout_number + set_port_fanout_number - [-min][-max]fanoutports + [-min][-max]fanoutports @@ -12436,7 +12441,7 @@ -min - Set the min fanout. + Set the min fanout. @@ -12444,7 +12449,7 @@ -max - Set the max fanout. + Set the max fanout. @@ -12464,21 +12469,21 @@ - Set the external fanout for ports. + Set the external fanout for ports. - set_power_activity + set_power_activity - [-global][-input][-input_ports ports][-pins pins][-activity activity | -density density][-duty duty][-clock clock] + [-global][-input][-input_ports ports][-pins pins][-activity activity | -density density][-duty duty][-clock clock] - -global + -global Set the activity/duty for all non-clock pins. @@ -12494,7 +12499,7 @@ - -input_ports input_ports + -input_ports input_ports Set the input port activity/duty. @@ -12502,55 +12507,54 @@ - -pins pins + -pins pins Set the pin activity/duty. - - -activity activity + -activity activity - The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. + The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. - -density density + -density density - Transitions per library time unit. + Transitions per library time unit. - -duty duty + -duty duty - The duty, or probability the signal is high (0 <= duty <= 1.0). Defaults to 0.5. + The duty, or probability the signal is high (0 <= duty <= 1.0). Defaults to 0.5. - -clock clock + -clock clock - The clock to use for the period with -activity. This option is ignored if -density is used. + The clock to use for the period with -activity. This option is ignored if -density is used. - The set_power_activity command is used to set the activity and duty used for power analysis globally or for input ports or pins in the design. - The default input activity for inputs is 0.1 transitions per minimum clock period if a clock is defined or 0.0 if there are no clocks defined. The default input duty is 0.5. This is equivalent to the following command: - set_power_activity -input -activity 0.1 -duty 0.5 + The set_power_activity command is used to set the activity and duty used for power analysis globally or for input ports or pins in the design. + The default input activity for inputs is 0.1 transitions per minimum clock period if a clock is defined or 0.0 if there are no clocks defined. The default input duty is 0.5. This is equivalent to the following command: + set_power_activity -input -activity 0.1 -duty 0.5 - set_propagated_clock + set_propagated_clock objects @@ -12569,13 +12573,14 @@ + - set_pvt + set_pvt - [-min][-max][-process process][-voltage voltage] - [-temperature temperature]instances + [-min][-max][-process process][-voltage voltage] + [-temperature temperature]instances @@ -12583,7 +12588,7 @@ -min - Set the PVT values for max delays. + Set the PVT values for max delays. @@ -12591,12 +12596,12 @@ -max - Set the PVT values for min delays. + Set the PVT values for min delays. - -process process + -process process A process value (float). @@ -12604,16 +12609,15 @@ - -voltage voltage + -voltage voltage A voltage value (float). - - -temperature temperature + -temperature temperature A temperature value (float). @@ -12634,7 +12638,7 @@ - set_sense + set_sense [-type clock|data][-positive][-negative][-pulse pulse_type][-stop_propagation][-clock clocks]pins @@ -12642,18 +12646,18 @@ - -type clock + -type clock - Set the sense for clock paths. + Set the sense for clock paths. - -type data + -type data - Set the sense for data paths (not supported). + Set the sense for data paths (not supported). @@ -12661,7 +12665,7 @@ -positive - The clock sense is positive unate. + The clock sense is positive unate. @@ -12669,15 +12673,16 @@ -negative - The clock sense is negative unate. + The clock sense is negative unate. + - -pulse pulse_type + -pulse pulse_type - rise_triggered_high_pulserise_triggered_low_pulsefall_triggered_high_pulsefall_triggered_low_pulseNot supported. + rise_triggered_high_pulserise_triggered_low_pulsefall_triggered_high_pulsefall_triggered_low_pulseNot supported. @@ -12709,10 +12714,9 @@ - - set_timing_derate + set_timing_derate [-rise][-fall][-early][-late][-clock][-data][-net_delay][-cell_delay][-cell_check]derate[objects] @@ -12720,18 +12724,18 @@ - -rise + -rise - Set the derating for rising delays. + Set the derating for rising delays. - -fall + -fall - Set the derating for falling delays. + Set the derating for falling delays. @@ -12774,6 +12778,7 @@ Derate net (interconnect) delays. + -cell_delay @@ -12795,7 +12800,7 @@ derate - The derating factor to apply to delays. + The derating factor to apply to delays. @@ -12814,13 +12819,12 @@ - set_resistance + set_resistance - [-max][-min]resistancenets + [-max][-min]resistancenets - -min @@ -12847,7 +12851,7 @@ - nets + nets A list of nets. @@ -12860,72 +12864,73 @@ - set_units + set_units - [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] + [-capacitance cap_unit][-resistance res_unit][-time time_unit][-voltage voltage_unit][-current current_unit][-power power_unit][-distance distance_unit] - -capacitance cap_unit + -capacitance cap_unit - The capacitance scale factor followed by 'f'. + The capacitance scale factor followed by 'f'. - -resistance res_unit + -resistance res_unit - The resistance scale factor followed by 'ohm'. + The resistance scale factor followed by 'ohm'. - -time time_unit + -time time_unit - The time scale factor followed by 's'. + The time scale factor followed by 's'. + + + + + + -voltage voltage_unit + + + The voltage scale factor followed by 'v'. - -voltage voltage_unit + -current current_unit - The voltage scale factor followed by 'v'. + The current scale factor followed by 'A'. - -current current_unit + -power power_unit - The current scale factor followed by 'A'. - - - - - -power power_unit - - - The power scale factor followed by 'w'. + The power scale factor followed by 'w'. - The set_units command is used to check the units used by the STA command interpreter when parsing commands and reporting results. If the current units differ from the set_unit value a warning is printed. Use the set_cmd_units command to change the command units. + The set_units command is used to check the units used by the STA command interpreter when parsing commands and reporting results. If the current units differ from the set_unit value a warning is printed. Use the set_cmd_units command to change the command units. Units are specified as a scale factor followed by a unit name. The scale factors are as follows. - M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 + M 1E+6k 1E+3m 1E-3u 1E-6n 1E-9p 1E-12f 1E-15 An example of the set_units command is shown below. - set_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm + set_units -time ns -capacitance pF -current mA -voltage V -resistance kOhm - set_wire_load_min_block_size + set_wire_load_min_block_size size @@ -12938,7 +12943,7 @@ - set_wire_load_mode + set_wire_load_mode top|enclosed|segmented @@ -12975,15 +12980,16 @@ - set_wire_load_model + set_wire_load_model -name model_name[-library library][-max][-min][objects] + - -name model_name + -name model_name The name of a wire load model. @@ -12991,7 +12997,7 @@ - -library library + -library library Library to look for model_name. @@ -13028,7 +13034,7 @@ - set_wire_load_selection_group + set_wire_load_selection_group [-library library][-max][-min]group_name[objects] @@ -13042,7 +13048,6 @@ Library to look for group_name. - -max @@ -13082,28 +13087,28 @@ - suppress_msg + suppress_msg - msg_ids + msg_ids - msg_ids + msg_ids - A list of error/warning message IDs to suppress. + A list of error/warning message IDs to suppress. - The suppress_msg command suppresses specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. + The suppress_msg command suppresses specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. - unset_case_analysis + unset_case_analysis port_or_pin_list @@ -13118,13 +13123,13 @@ - The unset_case_analysis command removes the constant values defined by the set_case_analysis command. + The unset_case_analysis command removes the constant values defined by the set_case_analysis command. - unset_clock_latency + unset_clock_latency [-source]objects @@ -13153,7 +13158,7 @@ - unset_clock_transition + unset_clock_transition clocks @@ -13172,10 +13177,9 @@ - - unset_clock_uncertainty + unset_clock_uncertainty [-from|-rise_from|-fall_from from_clock][-to|-rise_to|-fall_to to_clock][-rise][-fall][-setup][-hold][objects] @@ -13183,7 +13187,7 @@ - -from from_clock + -from from_clock @@ -13191,7 +13195,7 @@ - -to to_clock + -to to_clock @@ -13231,7 +13235,7 @@ - uncertainty + uncertainty Clock uncertainty. @@ -13246,21 +13250,21 @@ - The unset_clock_uncertainty command removes clock uncertainty defined with the set_clock_uncertainty command. + The unset_clock_uncertainty command removes clock uncertainty defined with the set_clock_uncertainty command. - unset_data_check + unset_data_check - [-from|-rise_from|-fall_from from_object][-to|-rise_to|-fall_to to_object][-setup][-hold][-clock clock] + [-from|-rise_from|-fall_from from_object][-to|-rise_to|-fall_to to_object][-setup][-hold][-clock clock] - -from from_object + -from from_object A pin used as the timing check reference. @@ -13268,7 +13272,7 @@ - -to to_object + -to to_object A pin that the setup/hold check is applied to. @@ -13292,20 +13296,20 @@ - clock + clock The setup/hold check clock. - The unset_clock_transition command removes a setup or hold check defined by the set_data_check command. + The unset_clock_transition command removes a setup or hold check defined by the set_data_check command. - unset_disable_inferred_clock_gating + unset_disable_inferred_clock_gating objects @@ -13326,7 +13330,7 @@ - unset_disable_timing + unset_disable_timing [-from from_port][-to to_port]objects @@ -13337,7 +13341,7 @@ from_port - + @@ -13345,7 +13349,7 @@ to_port - + @@ -13361,9 +13365,10 @@ + - unset_input_delay + unset_input_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall]port_pin_list @@ -13374,7 +13379,7 @@ -rise - Unset the arrival time for the rising edge of the input. + Unset the arrival time for the rising edge of the input. @@ -13382,7 +13387,7 @@ -fall - Unset the arrival time for the falling edge of the input. + Unset the arrival time for the falling edge of the input. @@ -13390,7 +13395,7 @@ -max - Unset the minimum arrival time. + Unset the minimum arrival time. @@ -13398,7 +13403,7 @@ -min - Unset the maximum arrival time. + Unset the maximum arrival time. @@ -13406,7 +13411,7 @@ clock - Unset the arrival time from clock. + Unset the arrival time from clock. @@ -13414,10 +13419,9 @@ -clock_fall - Unset the arrival time from the falling edge of clock + Unset the arrival time from the falling edge of clock - pin_port_list @@ -13433,7 +13437,7 @@ - unset_output_delay + unset_output_delay [-rise][-fall][-max][-min][-clock clock][-clock_fall]port_pin_list @@ -13479,6 +13483,7 @@ The arrival time is from this clock. + -clock_fall @@ -13502,10 +13507,10 @@ - unset_path_exceptions + unset_path_exceptions - [-setup][-hold][-rise][-fall][-from|-rise_from|-fall_from from][-through|-rise_through|-fall_through through][-to|-rise_to|-fall_to to] + [-setup][-hold][-rise][-fall][-from|-rise_from|-fall_from from][-through|-rise_through|-fall_through through][-to|-rise_to|-fall_to to] @@ -13513,7 +13518,7 @@ -setup - Unset path exceptions for setup checks. + Unset path exceptions for setup checks. @@ -13521,7 +13526,7 @@ -hold - Unset path exceptions for hold checks. + Unset path exceptions for hold checks. @@ -13529,21 +13534,20 @@ -rise - Unset path exceptions for rising path edges. + Unset path exceptions for rising path edges. - -fall - Unset path exceptions for falling path edges. + Unset path exceptions for falling path edges. - -from from + -from from A list of clocks, instances, ports or pins. @@ -13551,7 +13555,7 @@ - -through through + -through through A list of instances, pins or nets. @@ -13559,7 +13563,7 @@ - -to to + -to to A list of clocks, instances, ports or pins. @@ -13567,66 +13571,67 @@ The unset_path_exceptions command removes any matching set_false_path, set_multicycle_path, set_max_delay, and set_min_delay exceptions. - + - unset_power_activity + unset_power_activity - [-global][-input][-input_ports ports][-pins pins] + [-global][-input][-input_ports ports][-pins pins] - -global + -global - Set the activity/duty for all non-clock pins. + Set the activity/duty for all non-clock pins. - -input + -input - Set the default input port activity/duty. + Set the default input port activity/duty. - -input_ports input_ports + -input_ports input_ports - Set the input port activity/duty. + Set the input port activity/duty. + + + + + + -pins pins + + + Set the pin activity/duty. - -pins pins + -activity activity - Set the pin activity/duty. - - - - - -activity activity - - - The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. + The activity, or number of transitions per clock cycle. If clock is not specified the clock with the minimum period is used. If no clocks are defined an error is reported. - The unset_power_activity_command is used to undo the effects of the set_power_activity command. + The unset_power_activity_command is used to undo the effects of the set_power_activity command. - unset_propagated_clock + unset_propagated_clock objects @@ -13647,42 +13652,41 @@ - unset_timing_derate + unset_timing_derate - Remove all derating factors set with the set_timing_derate command. + Remove all derating factors set with the set_timing_derate command. - - unsuppress_msg + unsuppress_msg - msg_ids + msg_ids - msg_ids + msg_ids - A list of error/warning message IDs to unsuppress. + A list of error/warning message IDs to unsuppress. - The unsuppress_msg command removes suppressions for the specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. + The unsuppress_msg command removes suppressions for the specified error/warning messages by ID. The list of message IDs can be found in doc/messages.txt. - user_run_time + user_run_time @@ -13695,7 +13699,7 @@ - with_output_to_variable + with_output_to_variable var { commands } @@ -13722,17 +13726,18 @@ + - write_path_spice + write_path_spice - -path_args path_args-spice_directory spice_directory-lib_subckt_file lib_subckts_file-model_file model_file-power power-ground ground[-simulator hspice|ngspice|xyce] + -path_args path_args-spice_directory spice_directory-lib_subckt_file lib_subckts_file-model_file model_file-power power-ground ground[-simulator hspice|ngspice|xyce] - path_args + path_args -from|-through|-to arguments as in report_checks. @@ -13740,15 +13745,15 @@ - spice_directory + spice_directory - Directory for spice to write output files. + Directory for spice to write output files. - lib_subckts_file + lib_subckts_file Cell transistor level subckts. @@ -13756,7 +13761,7 @@ - model_file + model_file Transistor model definitions .included by spice_file. @@ -13764,7 +13769,7 @@ - power + power Voltage supply name in voltage_map of the default liberty library. @@ -13772,7 +13777,7 @@ - ground + ground Ground supply name in voltage_map of the default liberty library. @@ -13780,30 +13785,31 @@ - -simulator + -simulator - Simulator that will read the spice netlist. + Simulator that will read the spice netlist. The write_path_spice command writes a spice netlist for timing paths. Use path_args to specify -from/-through/-to as arguments to the find_timing_paths command. For each path, a spice netlist and the subckts referenced by the path are written in spice_directory. The spice netlist is written in path_<id>.sp and subckt file is path_<id>.subckt. - The spice netlists used by the path are written to subckt_file, which spice_file .includes. The device models used by the spice subckt netlists in model_file are also .included in spice_file. Power and ground names are specified with the -power and -ground arguments. The spice netlist includes a piecewise linear voltage source at the input and .measure statement for each gate delay and pin slew. - Example command: - write_path_spice -path_args {-from "in0" -to "out1" -unconstrained} \ -spice_directory $result_dir \ -lib_subckt_file "write_spice1.subckt" \ -model_file "write_spice1.models" \ -power VDD -ground VSS - When the simulator is hspice, .measure statements will be added to the spice netlist. - When the simulator is Xyce, the .print statement selects the CSV format and writes the waveform data to a file name path_<id>.csv so the results can be used by gnuplot. + The spice netlists used by the path are written to subckt_file, which spice_file .includes. The device models used by the spice subckt netlists in model_file are also .included in spice_file. Power and ground names are specified with the -power and -ground arguments. The spice netlist includes a piecewise linear voltage source at the input and .measure statement for each gate delay and pin slew. + Example command: + write_path_spice -path_args {-from "in0" -to "out1" -unconstrained} \ -spice_directory $result_dir \ -lib_subckt_file "write_spice1.subckt" \ -model_file "write_spice1.models" \ -power VDD -ground VSS + When the simulator is hspice, .measure statements will be added to the spice netlist. + When the simulator is Xyce, the .print statement selects the CSV format and writes the waveform data to a file name path_<id>.csv so the results can be used by gnuplot. - write_sdc + write_sdc [-digits digits][-gzip][-no_timestamp]filename + digits @@ -13817,7 +13823,7 @@ -gzip - Compress the SDC with gzip. + Compress the SDC with gzip. @@ -13843,7 +13849,7 @@ - write_sdf + write_sdf [-scene scene][-divider /|.][-include_typ][-digits digits][-gzip][-no_timestamp][-no_version]filename @@ -13854,7 +13860,7 @@ scene - Write delays for scene. + Write delays for scene. @@ -13865,7 +13871,6 @@ Divider to use between hierarchy levels in pin and instance names. - -include_typ @@ -13876,7 +13881,7 @@ - -digits digits + -digits digits The number of digits after the decimal point to report. The default is 4. @@ -13887,7 +13892,7 @@ -gzip - Compress the SDF using gzip. + Compress the SDF using gzip. @@ -13911,78 +13916,79 @@ filename - The SDF filename to write. + The SDF filename to write. - Write the delay calculation delays for the design in SDF format to filename. If -corner is not specified the min/max delays are across all corners. With -corner the min/max delays for corner are written. The SDF TIMESCALE is same as the time_unit in the first liberty file read. + Write the delay calculation delays for the design in SDF format to filename. If -corner is not specified the min/max delays are across all corners. With -corner the min/max delays for corner are written. The SDF TIMESCALE is same as the time_unit in the first liberty file read. - write_timing_model + write_timing_model - [-library_name lib_name][-cell_name cell_name] - [-scene scene]filename + [-library_name lib_name][-cell_name cell_name] + [-scene scene]filename + + + + + + lib_name + + + The name to use for the liberty library. Defaults to cell_name. - lib_name + cell_name - The name to use for the liberty library. Defaults to cell_name. + The name to use for the liberty cell. Defaults to the top level module name. - cell_name + scene - The name to use for the liberty cell. Defaults to the top level module name. + The scene to use for extracting the model. - scene + filename - The scene to use for extracting the model. - - - - - filename - - - Filename for the liberty timing model. + Filename for the liberty timing model. - The write_timing_model command constructs a liberty timing model for the current design and writes it to filename. cell_name defaults to the cell name of the top level block in the design. - The SDC used to extract the block should include the clock definitions. If the block contains a clock network set_propagated_clock should be used so the clock delays are included in the timing model. The following SDC commands are ignored when building the timing model. - set_input_delayset_output_delayset_loadset_timing_derate - Using set_input_transition with the slew from the block context will be used will improve the match between the timing model and the block netlist. Paths defined on clocks that are defined on internal pins are ignored because the model has no way to include the clock definition. - The resulting timing model can be used in a hierarchical timing flow as a replacement for the block to speed up timing analysis. This hierarchical timing methodology does not handle timing exceptions that originate or terminate inside the block. The timing model includes: - combinational paths between inputs and outputssetup and hold timing constraints on inputsclock to output timing paths - Resistance of long wires on inputs and outputs of the block cannot be modeled in Liberty. To reduce inaccuracies from wire resistance in technologies with resistive wires place buffers on inputs and ouputs. + The write_timing_model command constructs a liberty timing model for the current design and writes it to filename. cell_name defaults to the cell name of the top level block in the design. + The SDC used to extract the block should include the clock definitions. If the block contains a clock network set_propagated_clock should be used so the clock delays are included in the timing model. The following SDC commands are ignored when building the timing model. + set_input_delayset_output_delayset_loadset_timing_derate + Using set_input_transition with the slew from the block context will be used will improve the match between the timing model and the block netlist. Paths defined on clocks that are defined on internal pins are ignored because the model has no way to include the clock definition. + The resulting timing model can be used in a hierarchical timing flow as a replacement for the block to speed up timing analysis. This hierarchical timing methodology does not handle timing exceptions that originate or terminate inside the block. The timing model includes: + combinational paths between inputs and outputssetup and hold timing constraints on inputsclock to output timing paths + Resistance of long wires on inputs and outputs of the block cannot be modeled in Liberty. To reduce inaccuracies from wire resistance in technologies with resistive wires place buffers on inputs and ouputs. The extracted timing model setup/hold checks are scalar (no input slew dependence). Delay timing arcs are load dependent but do not include input slew dependency. - write_verilog + write_verilog - [-include_pwr_gnd][-remove_cells lib_cells]filename + [-include_pwr_gnd][-remove_cells lib_cells]filename - -include_pwr_gnd + -include_pwr_gnd Include power and ground pins on instances. @@ -13990,24 +13996,24 @@ - -remove_cells lib_cells + -remove_cells lib_cells - Liberty cells to remove from the Verilog netlist. Use get_lib_cells, a list of cells names, or a cell name with wildcards. + Liberty cells to remove from the Verilog netlist. Use get_lib_cells, a list of cells names, or a cell name with wildcards. - filename + filename - Filename for the liberty library. + Filename for the liberty library. - The write_verilog command writes a Verilog netlist to filename. Use -sort to sort the instances so the results are reproducible across operating systems. Use -remove_cells to remove instances of lib_cells from the netlist. - Filter Expressions - The get_cells, get_pins, get_ports and get_timing_edges functions support filtering the returned objects by property values. Supported filter expressions are shown below. + The write_verilog command writes a Verilog netlist to filename. Use -sort to sort the instances so the results are reproducible across operating systems. Use -remove_cells to remove instances of lib_cells from the netlist. + Filter Expressions + The get_cells, get_pins, get_ports and get_timing_edges functions support filtering the returned objects by property values. Supported filter expressions are shown below. @@ -14016,7 +14022,7 @@ property - Return objects with property value equal to 1. + Return objects with property value equal to 1. @@ -14024,61 +14030,61 @@ property==value - Return objects with property value equal to value. + Return objects with property value equal to value. - property=~pattern + property=~pattern - Return objects with property value that matches pattern. + Return objects with property value that matches pattern. - property!=value + property!=value - Return objects with property value not equal to value. + Return objects with property value not equal to value. - property!~value + property!~value - Return objects with property value that does not match pattern. + Return objects with property value that does not match pattern. - expr1&&expr2 + expr1&&expr2 - Return objects with expr1 and expr2. expr1 and expr2 are one of the first three property value forms shown above. + Return objects with expr1 and expr2. expr1 and expr2 are one of the first three property value forms shown above. - expr1||expr2 + expr1||expr2 - Return objects with expr1 or expr2. expr1 and expr2 are one of the first three property value forms shown above. + Return objects with expr1 or expr2. expr1 and expr2 are one of the first three property value forms shown above. - Where property is a property supported by the get_property command. Note that if there are spaces in the expression it must be enclosed in quotes so that it is a single argument. - Variables + Where property is a property supported by the get_property command. Note that if there are spaces in the expression it must be enclosed in quotes so that it is a single argument. + Variables - hierarchy_separator + hierarchy_separator - Any character. + Any character. @@ -14088,33 +14094,34 @@ - sta_continue_on_error + sta_continue_on_error 0|1 - The include and read_sdc commands stop and report any errors encountered while reading a file unless sta_continue_on_error is 1. The default value is 0. + The include and read_sdc commands stop and report any errors encountered while reading a file unless sta_continue_on_error is 1. The default value is 0. - sta_crpr_mode + sta_crpr_mode same_pin|same_transition - When the data and clock paths of a timing check overlap (see sta_crpr_enabled), pessimism is removed independent of whether of the path rise/fall transitions. When sta_crpr_mode is same_transition, the pessimism is only removed if the path rise/fall transitions are the same. The default value is same_pin. + When the data and clock paths of a timing check overlap (see sta_crpr_enabled), pessimism is removed independent of whether of the path rise/fall transitions. When sta_crpr_mode is same_transition, the pessimism is only removed if the path rise/fall transitions are the same. The default value is same_pin. + - sta_cond_default_arcs_enabled + sta_cond_default_arcs_enabled 0|1 @@ -14127,7 +14134,7 @@ - sta_crpr_enabled + sta_crpr_enabled 0|1 @@ -14140,7 +14147,7 @@ - sta_dynamic_loop_breaking + sta_dynamic_loop_breaking 0|1 @@ -14153,20 +14160,20 @@ - sta_gated_clock_checks_enabled + sta_gated_clock_checks_enabled 0|1 - When sta_gated_clock_checks_enabled is 1, clock gating setup and hold timing checks are checked. The default value is 1. + When sta_gated_clock_checks_enabled is 1, clock gating setup and hold timing checks are checked. The default value is 1. - sta_input_port_default_clock + sta_input_port_default_clock 0|1 @@ -14179,7 +14186,7 @@ - sta_internal_bidirect_instance_paths_enabled + sta_internal_bidirect_instance_paths_enabled 0|1 @@ -14192,7 +14199,7 @@ - sta_pocv_enabled + sta_pocv_enabled 0|1 @@ -14205,14 +14212,14 @@ - sta_propagate_all_clocks + sta_propagate_all_clocks 0|1 - All clocks defined after sta_propagate_all_clocks is set to 1 are propagated. If it is set before any clocks are defined it has the same effect as + All clocks defined after sta_propagate_all_clocks is set to 1 are propagated. If it is set before any clocks are defined it has the same effect as set_propagated_clock [all_clocks] After all clocks have been defined. The default value is 0. @@ -14220,7 +14227,7 @@ - sta_propagate_gated_clock_enable + sta_propagate_gated_clock_enable 0|1 @@ -14233,7 +14240,7 @@ - sta_recovery_removal_checks_enabled + sta_recovery_removal_checks_enabled 0|1 @@ -14246,7 +14253,7 @@ - sta_report_default_digits + sta_report_default_digits integer @@ -14257,10 +14264,9 @@ - - sta_preset_clear_arcs_enabled + sta_preset_clear_arcs_enabled 0|1 @@ -14293,186 +14299,186 @@ - Alphabetical Index + Alphabetical Index - all_clocks7 - all_inputs7 - all_outputs8 - all_registers8 - check_setup9 - Command Line Arguments1 - Commands7 - connect_pin9 - create_generated_clock11 - create_voltage_area12 - current_design12 - current_instance13 - define_scene13 - delete_clock13 - delete_from_list13 - delete_generated_clock14 - delete_instance14 - delete_net14 - disconnect_pin14 - elapsed_run_time14 - Example Command Scripts1 - Filter Expressions84 - find_timing_paths15 - get_cells17 - get_clocks17 - get_fanin18 - get_fanout19 - get_full_name19 - get_lib_pins20 - get_libs21 - get_name22 - get_nets22 - get_pins23 - get_ports23 - get_property24 - get_scenes28 - get_timing_edges28 - group_path29 - hierarchy_separator85 - include30 - link_design30 - make_instance30 - make_net31 - Power Analysis3 - read_liberty31 - read_saif32 - read_sdc33 - read_sdf33 - read_spef34 - read_vcd35 - read_verilog35 - redirection5 - replace_activity_annotation36 - replace_cell35 - report_annotated_check36 - report_annotated_delay37 - report_check_types41 - report_checks38 - report_clock_latency42 - report_clock_min_period42 - report_clock_properties43 - report_clock_skew43 - report_dcalc43 - report_disabled_edges44 - report_edges44 - report_instance44 - report_lib_cell44 - report_net45 - report_parasitic_annotation45 - report_power45 - report_slews46 - report_tns46 - report_units46 - report_wns47 - report_worst_slack47 - set_assigned_check48 - set_assigned_delay49 - set_assigned_transition49 - set_case_analysis50 - set_clock_gating_check50 - set_clock_groups51 - set_clock_latency52 - set_clock_transition52 - set_clock_uncertainty53 - set_cmd_units54 - set_data_check55 - set_disable_inferred_clock_gating55 - set_disable_timing55 - set_drive56 - set_driving_cell57 - set_false_path58 - set_fanout_load59 - set_hierarchy_separator59 - set_ideal_latency59 - set_ideal_network59 - set_ideal_transition59 - set_input_delay59 - set_input_transition61 - set_level_shifter_strategy61 - set_level_shifter_threshold61 - set_load61 - set_logic_dc62 - set_logic_one62 - set_logic_zero63 - set_max_area63 - set_max_capacitance63 - set_max_delay63 - set_max_dynamic_power64 - set_max_fanout64 - set_max_leakage_power64 - set_max_time_borrow64 - set_max_transition65 - set_min_capacitance65 - set_min_delay66 - set_min_pulse_width67 - set_mode67 - set_multicycle_path67 - set_operating_conditions68 - set_output_delay69 - set_port_fanout_number70 - set_power_activity70 - set_propagated_clock71 - set_pvt71 - set_resistance73 - set_sense72 - set_timing_derate73 - set_units74 - set_wire_load_min_block_size75 - set_wire_load_mode75 - set_wire_load_model75 - set_wire_load_selection_group75 - SPEF34 - sta_cond_default_arcs_enabled85 - sta_continue_on_error85 - sta_crpr_enabled85 - sta_crpr_mode85 - sta_dynamic_loop_breaking85 - sta_gated_clock_checks_enabled85 - sta_input_port_default_clock86 - sta_internal_bidirect_instance_paths_enabled86 - sta_pocv_enabled86 - sta_preset_clear_arcs_enabled87 - sta_propagate_all_clocks86 - sta_propagate_gated_clock_enable86 - sta_recovery_removal_checks_enabled86 - sta_report_default_digits86 - suppress_msg76 - TCL Interpreter5 - Timing Analysis using SDF2 - Timing Analysis with Multiple Corners and Modes3 - Timing Analysis with Multiple Process Corners2 - unset_case_analysis76 - unset_clock_latency76 - unset_clock_transition76 - unset_clock_uncertainty77 - unset_data_check77 - unset_disable_inferred_clock_gating78 - unset_disable_timing78 - unset_input_delay78 - unset_output_delay79 - unset_path_exceptions79 - unset_power_activity80 - unset_propagated_clock80 - unset_timing_derate80 - unsuppress_msg81 - user_run_time81 - Variables85 - verilog netlist35 - with_output_to_variable81 - write_path_spice81 - write_sdc82 - write_sdf82 - write_timing_model83 - write_verilog84 + all_clocks7 + all_inputs7 + all_outputs8 + all_registers8 + check_setup9 + Command Line Arguments1 + Commands7 + connect_pin9 + create_generated_clock11 + create_voltage_area12 + current_design12 + current_instance13 + define_scene13 + delete_clock13 + delete_from_list13 + delete_generated_clock14 + delete_instance14 + delete_net14 + disconnect_pin14 + elapsed_run_time14 + Example Command Scripts1 + Filter Expressions84 + find_timing_paths15 + get_cells17 + get_clocks17 + get_fanin18 + get_fanout19 + get_full_name19 + get_lib_pins20 + get_libs21 + get_name22 + get_nets22 + get_pins23 + get_ports23 + get_property24 + get_scenes28 + get_timing_edges28 + group_path29 + hierarchy_separator85 + include30 + link_design30 + make_instance30 + make_net31 + Power Analysis3 + read_liberty31 + read_saif32 + read_sdc33 + read_sdf33 + read_spef34 + read_vcd35 + read_verilog35 + redirection5 + replace_activity_annotation36 + replace_cell35 + report_annotated_check36 + report_annotated_delay37 + report_check_types41 + report_checks38 + report_clock_latency42 + report_clock_min_period42 + report_clock_properties43 + report_clock_skew43 + report_dcalc43 + report_disabled_edges44 + report_edges44 + report_instance44 + report_lib_cell44 + report_net45 + report_parasitic_annotation45 + report_power45 + report_slews46 + report_tns46 + report_units46 + report_wns47 + report_worst_slack47 + set_assigned_check48 + set_assigned_delay49 + set_assigned_transition49 + set_case_analysis50 + set_clock_gating_check50 + set_clock_groups51 + set_clock_latency52 + set_clock_transition52 + set_clock_uncertainty53 + set_cmd_units54 + set_data_check55 + set_disable_inferred_clock_gating55 + set_disable_timing55 + set_drive56 + set_driving_cell57 + set_false_path58 + set_fanout_load59 + set_hierarchy_separator59 + set_ideal_latency59 + set_ideal_network59 + set_ideal_transition59 + set_input_delay59 + set_input_transition61 + set_level_shifter_strategy61 + set_level_shifter_threshold61 + set_load61 + set_logic_dc62 + set_logic_one62 + set_logic_zero63 + set_max_area63 + set_max_capacitance63 + set_max_delay63 + set_max_dynamic_power64 + set_max_fanout64 + set_max_leakage_power64 + set_max_time_borrow64 + set_max_transition65 + set_min_capacitance65 + set_min_delay66 + set_min_pulse_width67 + set_mode67 + set_multicycle_path67 + set_operating_conditions68 + set_output_delay69 + set_port_fanout_number70 + set_power_activity70 + set_propagated_clock71 + set_pvt71 + set_resistance73 + set_sense72 + set_timing_derate73 + set_units74 + set_wire_load_min_block_size75 + set_wire_load_mode75 + set_wire_load_model75 + set_wire_load_selection_group75 + SPEF34 + sta_cond_default_arcs_enabled85 + sta_continue_on_error85 + sta_crpr_enabled85 + sta_crpr_mode85 + sta_dynamic_loop_breaking85 + sta_gated_clock_checks_enabled85 + sta_input_port_default_clock86 + sta_internal_bidirect_instance_paths_enabled86 + sta_pocv_enabled86 + sta_preset_clear_arcs_enabled87 + sta_propagate_all_clocks86 + sta_propagate_gated_clock_enable86 + sta_recovery_removal_checks_enabled86 + sta_report_default_digits86 + suppress_msg76 + TCL Interpreter5 + Timing Analysis using SDF2 + Timing Analysis with Multiple Corners and Modes3 + Timing Analysis with Multiple Process Corners2 + unset_case_analysis76 + unset_clock_latency76 + unset_clock_transition76 + unset_clock_uncertainty77 + unset_data_check77 + unset_disable_inferred_clock_gating78 + unset_disable_timing78 + unset_input_delay78 + unset_output_delay79 + unset_path_exceptions79 + unset_power_activity80 + unset_propagated_clock80 + unset_timing_derate80 + unsuppress_msg81 + user_run_time81 + Variables85 + verilog netlist35 + with_output_to_variable81 + write_path_spice81 + write_sdc82 + write_sdf82 + write_timing_model83 + write_verilog84 - - Version 3.0.0, Mar 7, 2026Copyright (c) 2026, Parallax Software, Inc. + + Version 3.0.0, Mar 7, 2026Copyright (c) 2026, Parallax Software, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. diff --git a/include/sta/Sdc.hh b/include/sta/Sdc.hh index 31b363bd..dfd9aced 100644 --- a/include/sta/Sdc.hh +++ b/include/sta/Sdc.hh @@ -149,7 +149,7 @@ using ExceptionPathPtHash = std::map; using ClockLatencies = std::set; using EdgeClockLatencyMap = std::map; using PinClockUncertaintyMap = std::map; -using InterClockUncertaintySet = std::set; +using InterClockUncertaintySet=std::set; using ClockGatingCheckMap = std::map; using InstanceClockGatingCheckMap = std::map; using PinClockGatingCheckMap = std::map; @@ -1306,6 +1306,7 @@ protected: bool clk_hpin_disables_valid_; PinSet propagated_clk_pins_; ClockLatencies clk_latencies_; + PinSet clk_latency_pins_; EdgeClockLatencyMap edge_clk_latency_map_; ClockInsertions clk_insertions_; PinClockUncertaintyMap pin_clk_uncertainty_map_; diff --git a/sdc/Sdc.cc b/sdc/Sdc.cc index 001d7567..12bcd471 100644 --- a/sdc/Sdc.cc +++ b/sdc/Sdc.cc @@ -101,6 +101,7 @@ Sdc::Sdc(Mode *mode, clk_hpin_disables_(network_), propagated_clk_pins_(network_), clk_latencies_(network_), + clk_latency_pins_(network_), edge_clk_latency_map_(network_), clk_insertions_(network_), clk_sense_map_(network_), @@ -169,6 +170,7 @@ Sdc::clear() clock_pin_map_.clear(); clock_leaf_pin_map_.clear(); clk_latencies_.clear(); + clk_latency_pins_.clear(); edge_clk_latency_map_.clear(); clk_insertions_.clear(); @@ -1508,6 +1510,8 @@ Sdc::setClockLatency(Clock *clk, } } latency->setDelay(rf, min_max, delay); + if (pin) + clk_latency_pins_.insert(pin); // set_clock_latency removes set_propagated_clock on the same object. if (clk && pin == nullptr) @@ -1580,8 +1584,7 @@ Sdc::deleteClockLatenciesReferencing(Clock *clk) bool Sdc::hasClockLatency(const Pin *pin) const { - ClockLatency probe(nullptr, pin); - return clk_latencies_.contains(&probe); + return clk_latency_pins_.contains(pin); } void diff --git a/sdc/Sdc.i b/sdc/Sdc.i index e6b95667..2bca70b0 100644 --- a/sdc/Sdc.i +++ b/sdc/Sdc.i @@ -1654,6 +1654,14 @@ set_propagate_all_clocks(bool prop) Sta::sta()->setPropagateAllClocks(prop); } +bool +pin_is_constrained(const Pin *pin) +{ + Sta *sta = Sta::sta(); + Sdc *sdc = sta->cmdSdc(); + return sdc->isConstrained(pin); +} + %} // inline //////////////////////////////////////////////////////////////// From 274637ce4638a839859c9a3bbae635aa074f4b3e Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 10:21:55 -0700 Subject: [PATCH 39/59] liberty attributes after cells resolves #400 Signed-off-by: James Cherry --- liberty/LibertyReader.cc | 84 ++++++++++++++++++------------------- liberty/LibertyReaderPvt.hh | 29 ++++++------- 2 files changed, 57 insertions(+), 56 deletions(-) diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 7d77fa3c..872b135b 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -78,8 +78,7 @@ LibertyReader::LibertyReader(const char *filename, debug_(network->debug()), network_(network), builder_(debug_, report_), - library_(nullptr), - first_cell_(true) + library_(nullptr) { defineVisitors(); } @@ -148,13 +147,13 @@ LibertyReader::beginLibrary(const LibertyGroup *library_group, } void -LibertyReader::endLibrary(const LibertyGroup *group, +LibertyReader::endLibrary(const LibertyGroup *library_group, LibertyGroup *) { - // If a library hasno cells endCell is not called. - if (first_cell_) - readLibraryAttributes(group); - delete group; + // If a library has no cells endCell is not called. + readLibraryAttributes(library_group); + checkThresholds(library_group); + delete library_group; } //////////////////////////////////////////////////////////////// @@ -167,12 +166,7 @@ LibertyReader::endCell(const LibertyGroup *cell_group, // Normally they are all defined by the first cell, but there // are libraries that define table templates and bus tyupes // between cells. - if (first_cell_) - readLibraryAttributes(library_group); - else { - readTableTemplates(library_group); - readBusTypes(nullptr, library_group); - } + readLibraryAttributes(library_group); const char *name = cell_group->firstName(); if (name) { @@ -182,8 +176,10 @@ LibertyReader::endCell(const LibertyGroup *cell_group, } else libWarn(1193, cell_group, "cell missing name."); + + // Delete the cell group and preceding library attributes + // and groups so they are not revisited and reduce memory peak. library_group->clear(); - first_cell_ = false; } void @@ -527,21 +523,25 @@ LibertyReader::readThresholds(const LibertyGroup *library_group) std::string suffix = rf->to_string(); readLibAttrFloat(library_group, ("input_threshold_pct_" + suffix).c_str(), &LibertyLibrary::setInputThreshold, rf, 0.01F); - if (library_->inputThreshold(rf) == 0.0) - libWarn(1145, library_group, "input_threshold_pct_%s not found.", rf->name()); - readLibAttrFloat(library_group, ("output_threshold_pct_" + suffix).c_str(), &LibertyLibrary::setOutputThreshold, rf, 0.01F); - if (library_->outputThreshold(rf) == 0.0) - libWarn(1146, library_group, "output_threshold_pct_%s not found.", rf->name()); - readLibAttrFloat(library_group, ("slew_lower_threshold_pct_" + suffix).c_str(), &LibertyLibrary::setSlewLowerThreshold, rf, 0.01F); - if (library_->slewLowerThreshold(rf) == 0.0) - libWarn(1147, library_group, "slew_lower_threshold_pct_%s not found.", rf->name()); - readLibAttrFloat(library_group, ("slew_upper_threshold_pct_" + suffix).c_str(), &LibertyLibrary::setSlewUpperThreshold, rf, 0.01F); + } +} + +void +LibertyReader::checkThresholds(const LibertyGroup *library_group) const +{ + for (const RiseFall *rf : RiseFall::range()) { + if (library_->inputThreshold(rf) == 0.0) + libWarn(1145, library_group, "input_threshold_pct_%s not found.", rf->name()); + if (library_->outputThreshold(rf) == 0.0) + libWarn(1146, library_group, "output_threshold_pct_%s not found.", rf->name()); + if (library_->slewLowerThreshold(rf) == 0.0) + libWarn(1147, library_group, "slew_lower_threshold_pct_%s not found.", rf->name()); if (library_->slewUpperThreshold(rf) == 0.0) libWarn(1148, library_group, "slew_upper_threshold_pct_%s not found.", rf->name()); } @@ -3458,37 +3458,37 @@ LibertyReader::variableValue(const char *var, void LibertyReader::libWarn(int id, - const LibertyGroup *obj, + const LibertyGroup *group, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); - report_->vfileWarn(id, filename_, obj->line(), fmt, args); + report_->vfileWarn(id, filename_, group->line(), fmt, args); va_end(args); } void LibertyReader::libWarn(int id, - const LibertySimpleAttr *obj, + const LibertySimpleAttr *attr, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); - report_->vfileWarn(id, filename_, obj->line(), fmt, args); + report_->vfileWarn(id, filename_, attr->line(), fmt, args); va_end(args); } void LibertyReader::libWarn(int id, - const LibertyComplexAttr *obj, + const LibertyComplexAttr *attr, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); - report_->vfileWarn(id, filename_, obj->line(), fmt, args); + report_->vfileWarn(id, filename_, attr->line(), fmt, args); va_end(args); } @@ -3496,7 +3496,7 @@ void LibertyReader::libWarn(int id, int line, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); @@ -3506,37 +3506,37 @@ LibertyReader::libWarn(int id, void LibertyReader::libError(int id, - const LibertyGroup *obj, + const LibertyGroup *group, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); - report_->vfileError(id, filename_, obj->line(), fmt, args); + report_->vfileError(id, filename_, group->line(), fmt, args); va_end(args); } void LibertyReader::libError(int id, - const LibertySimpleAttr *obj, + const LibertySimpleAttr *attr, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); - report_->vfileError(id, filename_, obj->line(), fmt, args); + report_->vfileError(id, filename_, attr->line(), fmt, args); va_end(args); } void LibertyReader::libError(int id, - const LibertyComplexAttr *obj, + const LibertyComplexAttr *attr, const char *fmt, - ...) + ...) const { va_list args; va_start(args, fmt); - report_->vfileError(id, filename_, obj->line(), fmt, args); + report_->vfileError(id, filename_, attr->line(), fmt, args); va_end(args); } diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index c17cdeb8..18c5bc5f 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -24,6 +24,7 @@ #pragma once +#include #include #include #include @@ -132,6 +133,7 @@ protected: const char *group_name, TableTemplateType type); void readThresholds(const LibertyGroup *library_group); + void checkThresholds(const LibertyGroup *library_group) const; TableAxisPtr makeTableTemplateAxis(const LibertyGroup *template_group, int axis_index); void readVoltateMaps(const LibertyGroup *library_group); @@ -445,36 +447,36 @@ protected: const LibertyCell *cell, int line); void libWarn(int id, - const LibertyGroup *obj, + const LibertyGroup *group, const char *fmt, - ...) + ...) const __attribute__((format (printf, 4, 5))); void libWarn(int id, - const LibertySimpleAttr *obj, + const LibertySimpleAttr *attr, const char *fmt, - ...) + ...) const __attribute__((format (printf, 4, 5))); void libWarn(int id, - const LibertyComplexAttr *obj, + const LibertyComplexAttr *attr, const char *fmt, - ...) + ...) const __attribute__((format (printf, 4, 5))); void libWarn(int id, int line, const char *fmt, - ...) + ...) const __attribute__((format (printf, 4, 5))); void libError(int id, - const LibertyGroup *obj, - const char *fmt, ...) + const LibertyGroup *group, + const char *fmt, ...) const __attribute__((format (printf, 4, 5))); void libError(int id, - const LibertySimpleAttr *obj, - const char *fmt, ...) + const LibertySimpleAttr *attr, + const char *fmt, ...) const __attribute__((format (printf, 4, 5))); void libError(int id, - const LibertyComplexAttr *obj, - const char *fmt, ...) + const LibertyComplexAttr *attr, + const char *fmt, ...) const __attribute__((format (printf, 4, 5))); const char *filename_; @@ -485,7 +487,6 @@ protected: LibertyBuilder builder_; LibertyVariableMap var_map_; LibertyLibrary *library_; - bool first_cell_; LibraryGroupVisitorMap group_begin_map_; LibraryGroupVisitorMap group_end_map_; From a419f0a721ec170328e39acb8764ac3cd85e7c9c Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 13:36:54 -0700 Subject: [PATCH 40/59] LibertyPortPair calls Signed-off-by: James Cherry --- liberty/Liberty.cc | 16 ++++++---------- sdc/DisabledPorts.cc | 12 ++++-------- 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 181b0e42..23774ac1 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -1367,17 +1367,14 @@ LibertyCell::makeTimingArcPortMaps() LibertyPort *from = arc_set->from(); LibertyPort *to = arc_set->to(); if (from && to) { - LibertyPortPair from_to_pair(from, to); - TimingArcSetSeq &sets = port_timing_arc_set_map_[from_to_pair]; + TimingArcSetSeq &sets = port_timing_arc_set_map_[{from, to}]; sets.push_back(arc_set); } - LibertyPortPair from_pair(from, nullptr); - TimingArcSetSeq &from_sets = port_timing_arc_set_map_[from_pair]; + TimingArcSetSeq &from_sets = port_timing_arc_set_map_[{from, nullptr}]; from_sets.push_back(arc_set); - LibertyPortPair to_pair(nullptr, to); - TimingArcSetSeq &to_sets = port_timing_arc_set_map_[to_pair]; + TimingArcSetSeq &to_sets = port_timing_arc_set_map_[{nullptr, to}]; to_sets.push_back(arc_set); const TimingRole *role = arc_set->role(); @@ -1411,8 +1408,7 @@ LibertyCell::timingArcSets(const LibertyPort *from, const LibertyPort *to) const { static const TimingArcSetSeq null_set; - const LibertyPortPair port_pair(from, to); - auto itr = port_timing_arc_set_map_.find(port_pair); + auto itr = port_timing_arc_set_map_.find({from, to}); return (itr == port_timing_arc_set_map_.end()) ? null_set : itr->second; } @@ -1437,8 +1433,8 @@ LibertyCell::timingArcSetCount() const bool LibertyCell::hasTimingArcs(LibertyPort *port) const { - return port_timing_arc_set_map_.contains(LibertyPortPair(port, nullptr)) - || port_timing_arc_set_map_.contains(LibertyPortPair(nullptr, port)); + return port_timing_arc_set_map_.contains({port, nullptr}) + || port_timing_arc_set_map_.contains({nullptr, port}); } void diff --git a/sdc/DisabledPorts.cc b/sdc/DisabledPorts.cc index 99c99350..0e736b9d 100644 --- a/sdc/DisabledPorts.cc +++ b/sdc/DisabledPorts.cc @@ -96,18 +96,15 @@ DisabledPorts::setDisabledFromTo(LibertyPort *from, { if (from_to_ == nullptr) from_to_ = new LibertyPortPairSet; - LibertyPortPair pair(from, to); - from_to_->insert(pair); + from_to_->insert({from, to}); } void DisabledPorts::removeDisabledFromTo(LibertyPort *from, LibertyPort *to) { - if (from_to_) { - LibertyPortPair from_to(from, to); - from_to_->erase(from_to); - } + if (from_to_) + from_to_->erase({from, to}); } bool @@ -115,12 +112,11 @@ DisabledPorts::isDisabled(LibertyPort *from, LibertyPort *to, const TimingRole *role) { - LibertyPortPair from_to(from, to); // set_disable_timing instance does not disable timing checks. return (all_ && !role->isTimingCheck()) || (from_ && from_->contains(from)) || (to_ && to_->contains(to)) - || (from_to_ && from_to_->contains(from_to)); + || (from_to_ && from_to_->contains({from, to})); } //////////////////////////////////////////////////////////////// From fe0e3d0673a7c3af1de7d9e2cdd09619e04e37a6 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 13:50:22 -0700 Subject: [PATCH 41/59] const Signed-off-by: James Cherry --- include/sta/Sta.hh | 2 +- search/Sta.cc | 2 +- spice/WritePathSpice.cc | 66 ++++++++++++++++++++--------------------- spice/WritePathSpice.hh | 2 +- spice/WriteSpice.i | 2 +- 5 files changed, 37 insertions(+), 37 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 5bc48f70..cb23b74e 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -1383,7 +1383,7 @@ public: LibertyLibrarySeq *map_libs); LibertyCellSeq *equivCells(LibertyCell *cell); - void writePathSpice(Path *path, + void writePathSpice(const Path *path, const char *spice_filename, const char *subckt_filename, const char *lib_subckt_filename, diff --git a/search/Sta.cc b/search/Sta.cc index 0cf5b206..574a445f 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -6012,7 +6012,7 @@ Sta::activity(const Pin *pin, //////////////////////////////////////////////////////////////// void -Sta::writePathSpice(Path *path, +Sta::writePathSpice(const Path *path, const char *spice_filename, const char *subckt_filename, const char *lib_subckt_filename, diff --git a/spice/WritePathSpice.cc b/spice/WritePathSpice.cc index bb033724..28b702f9 100644 --- a/spice/WritePathSpice.cc +++ b/spice/WritePathSpice.cc @@ -57,7 +57,7 @@ typedef int Stage; class WritePathSpice : public WriteSpice { public: - WritePathSpice(Path *path, + WritePathSpice(const Path *path, const char *spice_filename, const char *subckt_filename, const char *lib_subckt_filename, @@ -116,24 +116,24 @@ private: const Path *stageLoadPath(Stage stage); const TimingArc *stageGateArc(Stage stage); const TimingArc *stageWireArc(Stage stage); - Edge *stageGateEdge(Stage stage); - Edge *stageWireEdge(Stage stage); - Pin *stageGateInputPin(Stage stage); - Pin *stageDrvrPin(Stage stage); - LibertyPort *stageGateInputPort(Stage stage); - LibertyPort *stageDrvrPort(Stage stage); - Pin *stageLoadPin(Stage stage); + const Edge *stageGateEdge(Stage stage); + const Edge *stageWireEdge(Stage stage); + const Pin *stageGateInputPin(Stage stage); + const Pin *stageDrvrPin(Stage stage); + const LibertyPort *stageGateInputPort(Stage stage); + const LibertyPort *stageDrvrPort(Stage stage); + const Pin *stageLoadPin(Stage stage); const char *stageGateInputPinName(Stage stage); const char *stageDrvrPinName(Stage stage); const char *stageLoadPinName(Stage stage); - LibertyCell *stageLibertyCell(Stage stage); - Instance *stageInstance(Stage stage); + const LibertyCell *stageLibertyCell(Stage stage); + const Instance *stageInstance(Stage stage); float findSlew(const Path *path); float findSlew(const Path *path, const RiseFall *rf, const TimingArc *next_arc); - Path *path_; + const Path *path_; PathExpanded path_expanded_; // Input clock waveform cycles. int clk_cycle_count_; @@ -152,7 +152,7 @@ private: //////////////////////////////////////////////////////////////// void -writePathSpice(Path *path, +writePathSpice(const Path *path, const char *spice_filename, const char *subckt_filename, const char *lib_subckt_filename, @@ -168,7 +168,7 @@ writePathSpice(Path *path, writer.writeSpice(); } -WritePathSpice::WritePathSpice(Path *path, +WritePathSpice::WritePathSpice(const Path *path, const char *spice_filename, const char *subckt_filename, const char *lib_subckt_filename, @@ -497,8 +497,8 @@ WritePathSpice::writeGateStage(Stage stage) std::string subckt_name = "stage" + std::to_string(stage); const Instance *inst = stageInstance(stage); - LibertyPort *input_port = stageGateInputPort(stage); - LibertyPort *drvr_port = stageDrvrPort(stage); + const LibertyPort *input_port = stageGateInputPort(stage); + const LibertyPort *drvr_port = stageDrvrPort(stage); streamPrint(spice_stream_, ".subckt %s %s %s %s\n", subckt_name.c_str(), @@ -515,7 +515,7 @@ WritePathSpice::writeGateStage(Stage stage) const Path *drvr_path = stageDrvrPath(stage); const RiseFall *drvr_rf = drvr_path->transition(this); - Edge *gate_edge = stageGateEdge(stage); + const Edge *gate_edge = stageGateEdge(stage); LibertyPortLogicValues port_values; bool is_clked; @@ -579,7 +579,7 @@ WritePathSpice::findPathCellNames() path_cell_names.insert(cell->name()); } // Include side receivers. - Pin *drvr_pin = stageDrvrPin(stage); + const Pin *drvr_pin = stageDrvrPin(stage); auto pin_iter = network_->connectedPinIterator(drvr_pin); while (pin_iter->hasNext()) { const Pin *pin = pin_iter->next(); @@ -673,49 +673,49 @@ WritePathSpice::stageWireArc(Stage stage) return path_expanded_.path(path_index)->prevArc(this); } -Edge * +const Edge * WritePathSpice::stageGateEdge(Stage stage) { const Path *path = stageDrvrPath(stage); return path->prevEdge(this); } -Edge * +const Edge * WritePathSpice::stageWireEdge(Stage stage) { const Path *path = stageLoadPath(stage); return path->prevEdge(this); } -Pin * +const Pin * WritePathSpice::stageGateInputPin(Stage stage) { const Path *path = stageGateInputPath(stage); return path->pin(this); } -LibertyPort * +const LibertyPort * WritePathSpice::stageGateInputPort(Stage stage) { - Pin *pin = stageGateInputPin(stage); + const Pin *pin = stageGateInputPin(stage); return network_->libertyPort(pin); } -Pin * +const Pin * WritePathSpice::stageDrvrPin(Stage stage) { const Path *path = stageDrvrPath(stage); return path->pin(this); } -LibertyPort * +const LibertyPort * WritePathSpice::stageDrvrPort(Stage stage) { - Pin *pin = stageDrvrPin(stage); + const Pin *pin = stageDrvrPin(stage); return network_->libertyPort(pin); } -Pin * +const Pin * WritePathSpice::stageLoadPin(Stage stage) { const Path *path = stageLoadPath(stage); @@ -725,35 +725,35 @@ WritePathSpice::stageLoadPin(Stage stage) const char * WritePathSpice::stageGateInputPinName(Stage stage) { - Pin *pin = stageGateInputPin(stage); + const Pin *pin = stageGateInputPin(stage); return network_->pathName(pin); } const char * WritePathSpice::stageDrvrPinName(Stage stage) { - Pin *pin = stageDrvrPin(stage); + const Pin *pin = stageDrvrPin(stage); return network_->pathName(pin); } const char * WritePathSpice::stageLoadPinName(Stage stage) { - Pin *pin = stageLoadPin(stage); + const Pin *pin = stageLoadPin(stage); return network_->pathName(pin); } -Instance * +const Instance * WritePathSpice::stageInstance(Stage stage) { - Pin *pin = stageDrvrPin(stage); + const Pin *pin = stageDrvrPin(stage); return network_->instance(pin); } -LibertyCell * +const LibertyCell * WritePathSpice::stageLibertyCell(Stage stage) { - Pin *pin = stageDrvrPin(stage); + const Pin *pin = stageDrvrPin(stage); return network_->libertyPort(pin)->libertyCell(); } diff --git a/spice/WritePathSpice.hh b/spice/WritePathSpice.hh index a6d014d1..647ef542 100644 --- a/spice/WritePathSpice.hh +++ b/spice/WritePathSpice.hh @@ -35,7 +35,7 @@ class StaState; // Write a spice deck for path. // Throws FileNotReadable, FileNotWritable, SubcktEndsMissing void -writePathSpice(Path *path, +writePathSpice(const Path *path, // Spice file written for path. const char *spice_filename, // Subckts used by path included in spice file. diff --git a/spice/WriteSpice.i b/spice/WriteSpice.i index e7adadbe..30bf14e4 100644 --- a/spice/WriteSpice.i +++ b/spice/WriteSpice.i @@ -33,7 +33,7 @@ %inline %{ void -write_path_spice_cmd(Path *path, +write_path_spice_cmd(const Path *path, const char *spice_filename, const char *subckt_filename, const char *lib_subckt_filename, From c7ba405a1469f23629b0f8a89da0b3a0d281ce14 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 13:59:22 -0700 Subject: [PATCH 42/59] comment Signed-off-by: James Cherry --- dcalc/DmpCeff.cc | 2 +- spice/WriteSpice.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dcalc/DmpCeff.cc b/dcalc/DmpCeff.cc index dd9b6721..85b9b93a 100644 --- a/dcalc/DmpCeff.cc +++ b/dcalc/DmpCeff.cc @@ -156,7 +156,7 @@ public: // Return values. double &vo, double &dol_dt); - // Load responce to driver waveform. + // Load response to driver waveform. void Vl(double t, // Return values. double &vl, diff --git a/spice/WriteSpice.cc b/spice/WriteSpice.cc index 9b1bf2c3..ba477444 100644 --- a/spice/WriteSpice.cc +++ b/spice/WriteSpice.cc @@ -825,7 +825,7 @@ WriteSpice::railToRailSlew(float slew, //////////////////////////////////////////////////////////////// -// Find the logic values for expression inputs to enable paths from input_port. +// Find the logic values for expression inputs to sensitize the path from input_port. void WriteSpice::gatePortValues(const Pin *input_pin, const Pin *drvr_pin, From c2c40f76b120c5b7e2ccab0728da9d0c86f822b3 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 14:03:53 -0700 Subject: [PATCH 43/59] DmpAlg Signed-off-by: James Cherry --- dcalc/DmpCeff.cc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/dcalc/DmpCeff.cc b/dcalc/DmpCeff.cc index 85b9b93a..c32362f2 100644 --- a/dcalc/DmpCeff.cc +++ b/dcalc/DmpCeff.cc @@ -125,7 +125,7 @@ class DmpAlg : public StaState { public: DmpAlg(int nr_order, StaState *sta); - virtual ~DmpAlg(); + ~DmpAlg() override = default; virtual const char *name() = 0; // Set driver model and pi model parameters for delay calculation. virtual void init(const LibertyLibrary *library, @@ -288,8 +288,6 @@ DmpAlg::DmpAlg(int nr_order, fjac_[i] = fjac_storage_ + i * max_nr_order_; } -DmpAlg::~DmpAlg() = default; - void DmpAlg::init(const LibertyLibrary *drvr_library, const LibertyCell *drvr_cell, @@ -1645,7 +1643,8 @@ gateModelRd(const LibertyCell *cell, gate_model->gateDelay(pvt, in_slew, cap1, pocv_enabled, d1, s1); gate_model->gateDelay(pvt, in_slew, cap2, pocv_enabled, d2, s2); double vth = cell->libertyLibrary()->outputThreshold(rf); - float rd = -std::log(vth) * std::abs(delayAsFloat(d1) - delayAsFloat(d2)) / (cap2 - cap1); + float rd = -std::log(vth) * std::abs(delayAsFloat(d1) - delayAsFloat(d2)) + / (cap2 - cap1); return rd; } From 48511e09b1ec1ea366dd1c5683b210a7982459e3 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 14:07:40 -0700 Subject: [PATCH 44/59] override Signed-off-by: James Cherry --- include/sta/Bfs.hh | 44 +++++++++++++++++----------------- include/sta/ConcreteLibrary.hh | 4 ++-- include/sta/Graph.hh | 16 ++++++------- include/sta/Iterator.hh | 12 +++++----- include/sta/Liberty.hh | 16 ++++++------- include/sta/Path.hh | 4 ++-- liberty/LibertyReaderPvt.hh | 4 ++-- network/ConcreteNetwork.cc | 40 +++++++++++++++---------------- network/Network.cc | 8 +++---- search/PathEnum.hh | 4 ++-- verilog/VerilogReader.cc | 20 ++++++++-------- 11 files changed, 86 insertions(+), 86 deletions(-) diff --git a/include/sta/Bfs.hh b/include/sta/Bfs.hh index 9b639624..5fa335c0 100644 --- a/include/sta/Bfs.hh +++ b/include/sta/Bfs.hh @@ -77,9 +77,9 @@ public: void remove(Vertex *vertex); void reportEntries() const; - virtual bool hasNext(); + bool hasNext() override; bool hasNext(Level to_level); - virtual Vertex *next(); + Vertex *next() override; // Apply visitor to all vertices in the queue in level order. // Returns the number of vertices that are visited. @@ -131,19 +131,19 @@ public: SearchPred *search_pred, StaState *sta); virtual ~BfsFwdIterator(); - virtual void enqueueAdjacentVertices(Vertex *vertex, - SearchPred *search_pred); - virtual void enqueueAdjacentVertices(Vertex *vertex, - SearchPred *search_pred, - const Mode *mode); + void enqueueAdjacentVertices(Vertex *vertex, + SearchPred *search_pred) override; + void enqueueAdjacentVertices(Vertex *vertex, + SearchPred *search_pred, + const Mode *mode) override; using BfsIterator::enqueueAdjacentVertices; protected: - virtual bool levelLessOrEqual(Level level1, - Level level2) const; - virtual bool levelLess(Level level1, - Level level2) const; - virtual void incrLevel(Level &level) const; + bool levelLessOrEqual(Level level1, + Level level2) const override; + bool levelLess(Level level1, + Level level2) const override; + void incrLevel(Level &level) const override; }; class BfsBkwdIterator : public BfsIterator @@ -153,19 +153,19 @@ public: SearchPred *search_pred, StaState *sta); virtual ~BfsBkwdIterator(); - virtual void enqueueAdjacentVertices(Vertex *vertex, - SearchPred *search_pred); - virtual void enqueueAdjacentVertices(Vertex *vertex, - SearchPred *search_pred, - const Mode *mode); + void enqueueAdjacentVertices(Vertex *vertex, + SearchPred *search_pred) override; + void enqueueAdjacentVertices(Vertex *vertex, + SearchPred *search_pred, + const Mode *mode) override; using BfsIterator::enqueueAdjacentVertices; protected: - virtual bool levelLessOrEqual(Level level1, - Level level2) const; - virtual bool levelLess(Level level1, - Level level2) const; - virtual void incrLevel(Level &level) const; + bool levelLessOrEqual(Level level1, + Level level2) const override; + bool levelLess(Level level1, + Level level2) const override; + void incrLevel(Level &level) const override; }; } // namespace diff --git a/include/sta/ConcreteLibrary.hh b/include/sta/ConcreteLibrary.hh index 48c4db06..69e60dce 100644 --- a/include/sta/ConcreteLibrary.hh +++ b/include/sta/ConcreteLibrary.hh @@ -264,8 +264,8 @@ class ConcreteCellPortBitIterator : public Iterator { public: ConcreteCellPortBitIterator(const ConcreteCell *cell); - virtual bool hasNext(); - virtual ConcretePort *next(); + bool hasNext() override; + ConcretePort *next() override; private: void findNext(); diff --git a/include/sta/Graph.hh b/include/sta/Graph.hh index 28625854..7d9557b4 100644 --- a/include/sta/Graph.hh +++ b/include/sta/Graph.hh @@ -427,8 +427,8 @@ class VertexIterator : public Iterator { public: VertexIterator(Graph *graph); - virtual bool hasNext() { return vertex_ || bidir_vertex_; } - virtual Vertex *next(); + bool hasNext() override { return vertex_ || bidir_vertex_; } + Vertex *next() override; private: bool findNextPin(); @@ -450,8 +450,8 @@ public: const Graph *graph); VertexInEdgeIterator(VertexId vertex_id, const Graph *graph); - bool hasNext() { return (next_ != nullptr); } - Edge *next(); + bool hasNext() override { return (next_ != nullptr); } + Edge *next() override; private: Edge *next_; @@ -463,8 +463,8 @@ class VertexOutEdgeIterator : public VertexEdgeIterator public: VertexOutEdgeIterator(Vertex *vertex, const Graph *graph); - bool hasNext() { return (next_ != nullptr); } - Edge *next(); + bool hasNext() override { return (next_ != nullptr); } + Edge *next() override; private: Edge *next_; @@ -478,8 +478,8 @@ public: EdgesThruHierPinIterator(const Pin *hpin, Network *network, Graph *graph); - virtual bool hasNext(); - virtual Edge *next(); + bool hasNext() override; + Edge *next() override; private: EdgeSet edges_; diff --git a/include/sta/Iterator.hh b/include/sta/Iterator.hh index eade8d31..06416b23 100644 --- a/include/sta/Iterator.hh +++ b/include/sta/Iterator.hh @@ -56,8 +56,8 @@ public: { } - bool hasNext() { return seq_ && itr_ != seq_->end(); } - OBJ_TYPE next() { return *itr_++; } + bool hasNext() override { return seq_ && itr_ != seq_->end(); } + OBJ_TYPE next() override { return *itr_++; } protected: const VECTOR_TYPE *seq_; @@ -80,8 +80,8 @@ public: { } - bool hasNext() { return map_ && itr_ != map_->end(); } - OBJ_TYPE next() { + bool hasNext() override { return map_ && itr_ != map_->end(); } + OBJ_TYPE next() override { OBJ_TYPE next = itr_->second; itr_++; return next; @@ -108,8 +108,8 @@ public: { } - bool hasNext() { return set_ && itr_ != set_->end(); } - OBJ_TYPE next() { return *itr_++; } + bool hasNext() override { return set_ && itr_ != set_->end(); } + OBJ_TYPE next() override { return *itr_++; } protected: const SET_TYPE *set_; diff --git a/include/sta/Liberty.hh b/include/sta/Liberty.hh index 3f096a81..981b2a26 100644 --- a/include/sta/Liberty.hh +++ b/include/sta/Liberty.hh @@ -458,8 +458,8 @@ class LibertyCellIterator : public Iterator { public: LibertyCellIterator(const LibertyLibrary *library); - bool hasNext(); - LibertyCell *next(); + bool hasNext() override; + LibertyCell *next() override; private: ConcreteLibraryCellIterator iter_; @@ -715,8 +715,8 @@ class LibertyCellPortIterator : public Iterator { public: LibertyCellPortIterator(const LibertyCell *cell); - bool hasNext(); - LibertyPort *next(); + bool hasNext() override; + LibertyPort *next() override; private: ConcreteCellPortIterator iter_; @@ -727,8 +727,8 @@ class LibertyCellPortBitIterator : public Iterator public: LibertyCellPortBitIterator(const LibertyCell *cell); virtual ~LibertyCellPortBitIterator(); - bool hasNext(); - LibertyPort *next(); + bool hasNext() override; + LibertyPort *next() override; private: ConcreteCellPortBitIterator *iter_; @@ -980,8 +980,8 @@ class LibertyPortMemberIterator : public Iterator public: LibertyPortMemberIterator(const LibertyPort *port); virtual ~LibertyPortMemberIterator(); - virtual bool hasNext(); - virtual LibertyPort *next(); + bool hasNext() override; + LibertyPort *next() override; private: ConcretePortMemberIterator *iter_; diff --git a/include/sta/Path.hh b/include/sta/Path.hh index bf938249..c7fcd081 100644 --- a/include/sta/Path.hh +++ b/include/sta/Path.hh @@ -204,8 +204,8 @@ public: const MinMax *min_max, const StaState *sta); virtual ~VertexPathIterator(); - virtual bool hasNext(); - virtual Path *next(); + bool hasNext() override; + Path *next() override; private: void findNext(); diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index 18c5bc5f..bbfabaf8 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -517,8 +517,8 @@ public: LibertyReader *visitor, int line); ~PortNameBitIterator(); - virtual bool hasNext(); - virtual LibertyPort *next(); + bool hasNext() override; + LibertyPort *next() override; unsigned size() const { return size_; } protected: diff --git a/network/ConcreteNetwork.cc b/network/ConcreteNetwork.cc index 22fd122d..a6a0f65d 100644 --- a/network/ConcreteNetwork.cc +++ b/network/ConcreteNetwork.cc @@ -62,8 +62,8 @@ class ConcreteInstanceChildIterator : public InstanceChildIterator { public: ConcreteInstanceChildIterator(ConcreteInstanceChildMap *map); - bool hasNext(); - Instance *next(); + bool hasNext() override; + Instance *next() override; private: ConcreteInstanceChildMap *map_; @@ -96,8 +96,8 @@ class ConcreteInstanceNetIterator : public InstanceNetIterator { public: ConcreteInstanceNetIterator(ConcreteInstanceNetMap *nets); - bool hasNext(); - Net *next(); + bool hasNext() override; + Net *next() override; private: void findNext(); @@ -152,8 +152,8 @@ class ConcreteInstancePinIterator : public InstancePinIterator public: ConcreteInstancePinIterator(const ConcreteInstance *inst, int pin_count); - bool hasNext(); - Pin *next(); + bool hasNext() override; + Pin *next() override; private: void findNext(); @@ -206,8 +206,8 @@ class ConcreteNetPinIterator : public NetPinIterator { public: ConcreteNetPinIterator(const ConcreteNet *net); - bool hasNext(); - Pin *next(); + bool hasNext() override; + Pin *next() override; private: ConcretePin *next_; @@ -238,8 +238,8 @@ class ConcreteNetTermIterator : public NetTermIterator { public: ConcreteNetTermIterator(const ConcreteNet *net); - bool hasNext(); - Term *next(); + bool hasNext() override; + Term *next() override; private: ConcreteTerm *next_; @@ -322,8 +322,8 @@ class ConcreteLibraryIterator1 : public Iterator { public: ConcreteLibraryIterator1(const ConcreteLibrarySeq &libs); - virtual bool hasNext(); - virtual Library *next(); + bool hasNext() override; + Library *next() override; private: const ConcreteLibrarySeq &libs_; @@ -361,8 +361,8 @@ class ConcreteLibertyLibraryIterator : public Iterator public: ConcreteLibertyLibraryIterator(const ConcreteNetwork *network); virtual ~ConcreteLibertyLibraryIterator(); - virtual bool hasNext(); - virtual LibertyLibrary *next(); + bool hasNext() override; + LibertyLibrary *next() override; private: void findNext(); @@ -719,8 +719,8 @@ class ConcreteCellPortIterator1 : public CellPortIterator public: ConcreteCellPortIterator1(const ConcreteCell *cell); ~ConcreteCellPortIterator1(); - virtual bool hasNext() { return iter_->hasNext(); } - virtual Port *next(); + bool hasNext() override { return iter_->hasNext(); } + Port *next() override; private: ConcreteCellPortIterator *iter_; @@ -756,8 +756,8 @@ class ConcreteCellPortBitIterator1 : public CellPortIterator public: ConcreteCellPortBitIterator1(const ConcreteCell *cell); ~ConcreteCellPortBitIterator1(); - virtual bool hasNext() { return iter_->hasNext(); } - virtual Port *next(); + bool hasNext() override { return iter_->hasNext(); } + Port *next() override; private: ConcreteCellPortBitIterator *iter_; @@ -903,8 +903,8 @@ class ConcretePortMemberIterator1 : public PortMemberIterator public: ConcretePortMemberIterator1(const ConcretePort *port); ~ConcretePortMemberIterator1(); - virtual bool hasNext(); - virtual Port *next(); + bool hasNext() override; + Port *next() override; private: ConcretePortMemberIterator *iter_; diff --git a/network/Network.cc b/network/Network.cc index 78e13b1e..ec77fa7a 100644 --- a/network/Network.cc +++ b/network/Network.cc @@ -1221,8 +1221,8 @@ class LeafInstanceIterator1 : public LeafInstanceIterator public: LeafInstanceIterator1(const Instance *inst, const Network *network); - bool hasNext() { return next_; } - Instance *next(); + bool hasNext() override { return next_; } + Instance *next() override; private: void nextInst(); @@ -1366,8 +1366,8 @@ class ConnectedPinIterator1 : public ConnectedPinIterator public: ConnectedPinIterator1(PinSet *pins); virtual ~ConnectedPinIterator1(); - virtual bool hasNext(); - virtual const Pin *next(); + bool hasNext() override; + const Pin *next() override; protected: PinSet *pins_; diff --git a/search/PathEnum.hh b/search/PathEnum.hh index f2f68cd8..72b2ddb8 100644 --- a/search/PathEnum.hh +++ b/search/PathEnum.hh @@ -68,8 +68,8 @@ public: // Insert path ends that are enumerated in slack/arrival order. void insert(PathEnd *path_end); virtual ~PathEnum(); - virtual bool hasNext(); - virtual PathEnd *next(); + bool hasNext() override; + PathEnd *next() override; private: void makeDiversions(PathEnd *path_end, diff --git a/verilog/VerilogReader.cc b/verilog/VerilogReader.cc index e101d0f9..72a49a4b 100644 --- a/verilog/VerilogReader.cc +++ b/verilog/VerilogReader.cc @@ -1080,8 +1080,8 @@ VerilogAssign::~VerilogAssign() class VerilogNullNetNameIterator : public VerilogNetNameIterator { public: - virtual bool hasNext() { return false; } - virtual const std::string &next(); + bool hasNext() override { return false; } + const std::string &next() override; }; const std::string & @@ -1095,8 +1095,8 @@ class VerilogOneNetNameIterator : public VerilogNetNameIterator { public: VerilogOneNetNameIterator(const std::string &name); - virtual bool hasNext(); - virtual const std::string &next(); + bool hasNext() override; + const std::string &next() override; protected: std::string name_; @@ -1128,8 +1128,8 @@ public: VerilogBusNetNameIterator(const std::string bus_name, int from_index, int to_index); - virtual bool hasNext(); - virtual const std::string &next(); + bool hasNext() override; + const std::string &next() override; protected: const std::string bus_name_; @@ -1182,8 +1182,8 @@ public: VerilogConstantNetNameIterator(VerilogConstantValue *value, const std::string &zero, const std::string &one); - virtual bool hasNext(); - virtual const std::string &next(); + bool hasNext() override; + const std::string &next() override; private: VerilogConstantValue *value_; @@ -1222,8 +1222,8 @@ public: VerilogModule *module, VerilogReader *reader); virtual ~VerilogNetConcatNameIterator(); - virtual bool hasNext(); - virtual const std::string &next(); + bool hasNext() override; + const std::string &next() override; private: VerilogModule *module_; From c7d48679c99bc812b36c22498703a17ca09484c1 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 14:27:49 -0700 Subject: [PATCH 45/59] include/sta/WriteSdc.hh -> sdc/WriteSdc.hh Signed-off-by: James Cherry --- {include/sta => sdc}/WriteSdc.hh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {include/sta => sdc}/WriteSdc.hh (100%) diff --git a/include/sta/WriteSdc.hh b/sdc/WriteSdc.hh similarity index 100% rename from include/sta/WriteSdc.hh rename to sdc/WriteSdc.hh From bf8a61fe080e3599a38d6960ba800f780483acf7 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 14:27:56 -0700 Subject: [PATCH 46/59] PinPair Signed-off-by: James Cherry --- sdc/ExceptionPath.cc | 6 ++---- sdc/Sdc.cc | 21 +++++++-------------- search/Sta.cc | 2 +- 3 files changed, 10 insertions(+), 19 deletions(-) diff --git a/sdc/ExceptionPath.cc b/sdc/ExceptionPath.cc index 25ba0d78..8849d9c5 100644 --- a/sdc/ExceptionPath.cc +++ b/sdc/ExceptionPath.cc @@ -2427,8 +2427,7 @@ void InsertPinPairsThru::visit(const Pin *drvr, const Pin *load) { - PinPair pair(drvr, load); - pairs_->insert(pair); + pairs_->insert({drvr, load}); } static void @@ -2475,8 +2474,7 @@ void DeletePinPairsThru::visit(const Pin *drvr, const Pin *load) { - PinPair pair(drvr, load); - pairs_->erase(pair); + pairs_->erase({drvr, load}); } static void diff --git a/sdc/Sdc.cc b/sdc/Sdc.cc index 12bcd471..7517020d 100644 --- a/sdc/Sdc.cc +++ b/sdc/Sdc.cc @@ -1346,8 +1346,7 @@ bool FindClkHpinDisables::drvrLoadExists(const Pin *drvr, const Pin *load) { - PinPair probe(drvr, load); - return drvr_loads_.contains(probe); + return drvr_loads_.contains({drvr, load}); } void @@ -3506,24 +3505,21 @@ void Sdc::disableWire(const Pin *from, const Pin *to) { - PinPair pair(from, to); - disabled_wire_edges_.insert(pair); + disabled_wire_edges_.insert({from, to}); } void Sdc::removeDisableWire(Pin *from, Pin *to) { - PinPair probe(from, to); - disabled_wire_edges_.erase(probe); + disabled_wire_edges_.erase({from, to}); } bool Sdc::isDisabledWire(const Pin *from, const Pin *to) const { - PinPair pair(from, to); - return disabled_wire_edges_.contains(pair); + return disabled_wire_edges_.contains({from, to}); } void @@ -3583,8 +3579,7 @@ void DisableEdgesThruHierPin::visit(const Pin *drvr, const Pin *load) { - PinPair pair(drvr, load); - pairs_->insert(pair); + pairs_->insert({drvr, load}); } void @@ -3625,8 +3620,7 @@ void RemoveDisableEdgesThruHierPin::visit(const Pin *drvr, const Pin *load) { - PinPair pair(drvr, load); - pairs_->erase(pair); + pairs_->erase({drvr, load}); } void @@ -3659,8 +3653,7 @@ Sdc::isDisabled(const Instance *inst, { if (role == TimingRole::wire()) { // Hierarchical thru pin disables. - PinPair pair(from_pin, to_pin); - return disabled_wire_edges_.contains(pair); + return disabled_wire_edges_.contains({from_pin, to_pin}); } else { LibertyCell *cell = network_->libertyCell(inst); diff --git a/search/Sta.cc b/search/Sta.cc index 574a445f..98fdbbf3 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -52,7 +52,7 @@ #include "Sdc.hh" #include "Mode.hh" #include "Variables.hh" -#include "WriteSdc.hh" +#include "sdc/WriteSdc.hh" #include "ExceptionPath.hh" #include "Parasitics.hh" #include "parasitics/SpefReader.hh" From d7905a38861ea0583395c0908244ef75eb4f20c4 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 14:41:22 -0700 Subject: [PATCH 47/59] delay_calcs use std::string Signed-off-by: James Cherry --- dcalc/DelayCalc.cc | 28 +++++++++++++--------------- dcalc/DelayCalc.i | 2 +- include/sta/DelayCalc.hh | 12 +++++++----- 3 files changed, 21 insertions(+), 21 deletions(-) diff --git a/dcalc/DelayCalc.cc b/dcalc/DelayCalc.cc index bde9248c..1e27b20e 100644 --- a/dcalc/DelayCalc.cc +++ b/dcalc/DelayCalc.cc @@ -25,6 +25,7 @@ #include "DelayCalc.hh" #include +#include #include "ContainerHelpers.hh" #include "StringUtil.hh" @@ -37,9 +38,9 @@ namespace sta { -typedef std::map DelayCalcMap; +typedef std::map DelayCalcMap; -static DelayCalcMap *delay_calcs = nullptr; +static DelayCalcMap delay_calcs; void registerDelayCalcs() @@ -54,26 +55,23 @@ registerDelayCalcs() } void -registerDelayCalc(const char *name, +registerDelayCalc(const std::string &name, MakeArcDelayCalc maker) { - if (delay_calcs == nullptr) - delay_calcs = new DelayCalcMap; - (*delay_calcs)[name] = maker; + delay_calcs[name] = maker; } void deleteDelayCalcs() { - delete delay_calcs; - delay_calcs = nullptr; + delay_calcs.clear(); } ArcDelayCalc * -makeDelayCalc(const char *name, +makeDelayCalc(const std::string &name, StaState *sta) { - MakeArcDelayCalc maker = findKey(delay_calcs, name); + MakeArcDelayCalc maker = findKey(&delay_calcs, name); if (maker) return maker(sta); else @@ -81,16 +79,16 @@ makeDelayCalc(const char *name, } bool -isDelayCalcName(const char *name) +isDelayCalcName(const std::string &name) { - return delay_calcs->contains(name); + return delay_calcs.contains(name); } -StringSeq +StdStringSeq delayCalcNames() { - StringSeq names; - for (const auto [name, make_dcalc] : *delay_calcs) + StdStringSeq names; + for (const auto &[name, make_dcalc] : delay_calcs) names.push_back(name); return names; } diff --git a/dcalc/DelayCalc.i b/dcalc/DelayCalc.i index a0bbaea6..62e4c24f 100644 --- a/dcalc/DelayCalc.i +++ b/dcalc/DelayCalc.i @@ -36,7 +36,7 @@ %inline %{ -StringSeq +StdStringSeq delay_calc_names() { return sta::delayCalcNames(); diff --git a/include/sta/DelayCalc.hh b/include/sta/DelayCalc.hh index dbadf0b6..091b8799 100644 --- a/include/sta/DelayCalc.hh +++ b/include/sta/DelayCalc.hh @@ -24,7 +24,9 @@ #pragma once -#include "StringSeq.hh" +#include + +#include "StringUtil.hh" namespace sta { @@ -38,18 +40,18 @@ void registerDelayCalcs(); // Register a delay calculator for the set_delay_calc command. void -registerDelayCalc(const char *name, +registerDelayCalc(const std::string &name, MakeArcDelayCalc maker); bool -isDelayCalcName(const char *name); -StringSeq +isDelayCalcName(const std::string &name); +StdStringSeq delayCalcNames(); void deleteDelayCalcs(); // Make a registered delay calculator by name. ArcDelayCalc * -makeDelayCalc(const char *name, +makeDelayCalc(const std::string &name, StaState *sta); } // namespace From ab9951235171998362bb1d085b94a1405263aab4 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 14:48:48 -0700 Subject: [PATCH 48/59] spef reader use std::string Signed-off-by: James Cherry --- parasitics/SpefParse.yy | 13 ++++++++----- parasitics/SpefReader.cc | 11 +++-------- parasitics/SpefReaderPvt.hh | 6 +++--- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/parasitics/SpefParse.yy b/parasitics/SpefParse.yy index 39ad246f..260a212c 100755 --- a/parasitics/SpefParse.yy +++ b/parasitics/SpefParse.yy @@ -27,7 +27,7 @@ #include "Report.hh" #include "StringUtil.hh" -#include "StringSeq.hh" +#include "StringUtil.hh" #include "parasitics/SpefReaderPvt.hh" #include "parasitics/SpefScanner.hh" @@ -62,7 +62,7 @@ sta::SpefParse::error(const location_type &loc, char *string; int integer; float number; - sta::StringSeq *string_seq; + sta::StdStringSeq *std_string_seq; sta::PortDirection *port_dir; sta::SpefRspfPi *pi; sta::SpefTriple *triple; @@ -105,7 +105,7 @@ sta::SpefParse::error(const location_type &loc, %type hchar suffix_bus_delim prefix_bus_delim -%type qstrings +%type qstrings %type direction %type par_value total_cap @@ -220,11 +220,14 @@ design_flow: qstrings: QSTRING - { $$ = new sta::StringSeq; + { $$ = new sta::StdStringSeq; $$->push_back($1); + sta::stringDelete($1); } | qstrings QSTRING - { $$->push_back($2); } + { $$->push_back($2); + sta::stringDelete($2); + } ; hierarchy_div_def: diff --git a/parasitics/SpefReader.cc b/parasitics/SpefReader.cc index 7d0751f8..16f7a6dc 100644 --- a/parasitics/SpefReader.cc +++ b/parasitics/SpefReader.cc @@ -92,7 +92,6 @@ SpefReader::SpefReader(const std::string &filename, cap_scale_(1.0), res_scale_(1.0), induct_scale_(1.0), - design_flow_(nullptr), parasitics_(parasitics), parasitic_(nullptr) { @@ -101,11 +100,6 @@ SpefReader::SpefReader(const std::string &filename, SpefReader::~SpefReader() { - if (design_flow_) { - deleteContents(design_flow_); - delete design_flow_; - design_flow_ = nullptr; - } } bool @@ -297,9 +291,10 @@ SpefReader::portDirection(char *spef_dir) } void -SpefReader::setDesignFlow(StringSeq *flow) +SpefReader::setDesignFlow(StdStringSeq *flow) { - design_flow_ = flow; + design_flow_ = std::move(*flow); + delete flow; } Pin * diff --git a/parasitics/SpefReaderPvt.hh b/parasitics/SpefReaderPvt.hh index f96480c4..de0b8043 100644 --- a/parasitics/SpefReaderPvt.hh +++ b/parasitics/SpefReaderPvt.hh @@ -27,7 +27,7 @@ #include #include "Zlib.hh" -#include "StringSeq.hh" +#include "StringUtil.hh" #include "NetworkClass.hh" #include "ParasiticsClass.hh" #include "StaState.hh" @@ -82,7 +82,7 @@ public: void makeNameMapEntry(const char *index, const char *name); const char *nameMapLookup(const char *index); - void setDesignFlow(StringSeq *flow_keys); + void setDesignFlow(StdStringSeq *flow_keys); Pin *findPin(char *name); Net *findNet(const char *name); void rspfBegin(Net *net, @@ -139,7 +139,7 @@ private: float res_scale_; float induct_scale_; SpefNameMap name_map_; - StringSeq *design_flow_; + StdStringSeq design_flow_; Parasitics *parasitics_; Parasitic *parasitic_; }; From 8bd938d840bcaa3012307a28342358ece5a9f276 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:02:14 -0700 Subject: [PATCH 49/59] CheckError use std::string Signed-off-by: James Cherry --- include/sta/Sta.hh | 2 +- liberty/LibertyReaderPvt.hh | 1 - search/CheckTiming.cc | 28 +++++++++------------------- search/CheckTiming.hh | 4 ++-- tcl/StaTclTypes.i | 7 +++---- 5 files changed, 15 insertions(+), 27 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index cb23b74e..483b3a00 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -79,7 +79,7 @@ class GraphLoop; using ModeNameMap = std::map; using SceneNameMap = std::map; using SlowDrvrIterator = Iterator; -using CheckError = StringSeq; +using CheckError = StdStringSeq; using CheckErrorSeq = std::vector; enum class CmdNamespace { sta, sdc }; using ParasiticsNameMap = std::map; diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index bbfabaf8..ec8facff 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -31,7 +31,6 @@ #include #include -#include "StringSeq.hh" #include "StringUtil.hh" #include "MinMax.hh" #include "NetworkClass.hh" diff --git a/search/CheckTiming.cc b/search/CheckTiming.cc index f05de24e..965a8d15 100644 --- a/search/CheckTiming.cc +++ b/search/CheckTiming.cc @@ -24,7 +24,6 @@ #include "CheckTiming.hh" -#include "ContainerHelpers.hh" #include "Error.hh" #include "TimingRole.hh" #include "Network.hh" @@ -64,7 +63,6 @@ void CheckTiming::deleteErrors() { for (CheckError *error : errors_) { - deleteContents(error); delete error; } } @@ -204,25 +202,23 @@ CheckTiming::checkLoops() errorMsgSubst("Warning: There %is %d combinational loop%s in the design.", loop_count, error_msg); CheckError *error = new CheckError; - error->push_back(stringCopy(error_msg.c_str())); + error->push_back(error_msg); for (GraphLoop *loop : loops) { if (loop->isCombinational()) { Edge *last_edge = nullptr; for (Edge *edge : *loop->edges()) { Pin *pin = edge->from(graph_)->pin(); - const char *pin_name = stringCopy(sdc_network_->pathName(pin)); - error->push_back(pin_name); + error->push_back(sdc_network_->pathName(pin)); last_edge = edge; } if (last_edge) { - error->push_back(stringCopy("| loop cut point")); + error->push_back("| loop cut point"); const Pin *pin = last_edge->to(graph_)->pin(); - const char *pin_name = stringCopy(sdc_network_->pathName(pin)); - error->push_back(pin_name); + error->push_back(sdc_network_->pathName(pin)); // Separator between loops. - error->push_back(stringCopy("--------------------------------")); + error->push_back("--------------------------------"); } } } @@ -362,15 +358,12 @@ CheckTiming::pushPinErrors(const char *msg, CheckError *error = new CheckError; std::string error_msg; errorMsgSubst(msg, pins.size(), error_msg); - // Copy the error strings because the error deletes them when it - // is deleted. - error->push_back(stringCopy(error_msg.c_str())); + error->push_back(error_msg); // Sort the error pins so the output is independent of the order // the the errors are discovered. PinSeq pins1 = sortByPathName(&pins, network_); for (const Pin *pin : pins1) { - const char *pin_name = stringCopy(sdc_network_->pathName(pin)); - error->push_back(pin_name); + error->push_back(sdc_network_->pathName(pin)); } errors_.push_back(error); } @@ -384,15 +377,12 @@ CheckTiming::pushClkErrors(const char *msg, CheckError *error = new CheckError; std::string error_msg; errorMsgSubst(msg, clks.size(), error_msg); - // Copy the error strings because the error deletes them when it - // is deleted. - error->push_back(stringCopy(error_msg.c_str())); + error->push_back(error_msg); // Sort the error clks so the output is independent of the order // the the errors are discovered. ClockSeq clks1 = sortByName(&clks); for (const Clock *clk : clks1) { - const char *clk_name = stringCopy(clk->name()); - error->push_back(clk_name); + error->push_back(clk->name()); } errors_.push_back(error); } diff --git a/search/CheckTiming.hh b/search/CheckTiming.hh index 26edc150..f2c821c7 100644 --- a/search/CheckTiming.hh +++ b/search/CheckTiming.hh @@ -26,7 +26,7 @@ #include -#include "StringSeq.hh" +#include "StringUtil.hh" #include "NetworkClass.hh" #include "GraphClass.hh" #include "SdcClass.hh" @@ -36,7 +36,7 @@ namespace sta { class ClkNetwork; -using CheckError = StringSeq; +using CheckError = StdStringSeq; using CheckErrorSeq = std::vector; class CheckTiming : public StaState diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index 270aad83..b1c7b288 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -1137,10 +1137,9 @@ using namespace sta; CheckErrorSeq *check_errors = $1; for (CheckError *error : *check_errors) { Tcl_Obj *string_list = Tcl_NewListObj(0, nullptr); - for (const char *str : *error) { - size_t str_len = strlen(str); - Tcl_Obj *obj = Tcl_NewStringObj(const_cast(str), - static_cast(str_len)); + for (const std::string &str : *error) { + Tcl_Obj *obj = Tcl_NewStringObj(str.c_str(), + static_cast(str.size())); Tcl_ListObjAppendElement(interp, string_list, obj); } Tcl_ListObjAppendElement(interp, error_list, string_list); From 0c36caa1827252865d8af4d839530cb5e54a736f Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:16:00 -0700 Subject: [PATCH 50/59] rm StdString Signed-off-by: James Cherry --- CMakeLists.txt | 1 - graph/Graph.i | 4 ++-- include/sta/Scene.hh | 1 - include/sta/Sta.hh | 5 ++--- include/sta/StringSeq.hh | 38 ----------------------------------- include/sta/TclTypeHelpers.hh | 6 ------ sdc/Sdc.i | 4 ++-- search/ReportPath.cc | 6 +++--- search/ReportPath.hh | 4 ++-- search/Search.i | 4 ++-- search/Sta.cc | 8 ++++---- tcl/StaTclTypes.i | 3 +-- tcl/TclTypeHelpers.cc | 20 ------------------ util/StringSeq.cc | 36 --------------------------------- verilog/VerilogReaderPvt.hh | 1 - 15 files changed, 18 insertions(+), 123 deletions(-) delete mode 100644 include/sta/StringSeq.hh delete mode 100644 util/StringSeq.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 973cfb0d..4e548733 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,7 +234,6 @@ set(STA_SOURCE util/RiseFallMinMaxDelay.cc util/RiseFallValues.cc util/Stats.cc - util/StringSeq.cc util/StringSet.cc util/StringUtil.cc util/Transition.cc diff --git a/graph/Graph.i b/graph/Graph.i index 289ca3ba..4eab5270 100644 --- a/graph/Graph.i +++ b/graph/Graph.i @@ -229,12 +229,12 @@ arc_delays(TimingArc *arc) return delays; } -StringSeq +StdStringSeq arc_delay_strings(TimingArc *arc, int digits) { Sta *sta = Sta::sta(); - StringSeq delays; + StdStringSeq delays; DcalcAPIndex ap_count = sta->dcalcAnalysisPtCount(); for (DcalcAPIndex ap_index = 0; ap_index < ap_count; ap_index++) delays.push_back(delayAsString(sta->arcDelay(self, arc, ap_index), diff --git a/include/sta/Scene.hh b/include/sta/Scene.hh index 9b2e61a0..28986377 100644 --- a/include/sta/Scene.hh +++ b/include/sta/Scene.hh @@ -28,7 +28,6 @@ #include #include -#include "StringSeq.hh" #include "GraphClass.hh" #include "SearchClass.hh" diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index 483b3a00..f8fe4a95 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -29,7 +29,6 @@ #include #include -#include "StringSeq.hh" #include "StringUtil.hh" #include "LibertyClass.hh" #include "NetworkClass.hh" @@ -126,7 +125,7 @@ public: void setThreadCount(int thread_count); // define_corners compatibility. - void makeScenes(StringSeq *scene_names); + void makeScenes(StdStringSeq *scene_names); void makeScene(const std::string &name, const std::string &mode_name, const StdStringSeq &liberty_min_files, @@ -976,7 +975,7 @@ public: bool clk_gating_setup, bool clk_gating_hold); void setReportPathFormat(ReportPathFormat format); - void setReportPathFieldOrder(StringSeq *field_names); + void setReportPathFieldOrder(StdStringSeq *field_names); void setReportPathFields(bool report_input_pin, bool report_hier_pins, bool report_net, diff --git a/include/sta/StringSeq.hh b/include/sta/StringSeq.hh deleted file mode 100644 index 9821b7b2..00000000 --- a/include/sta/StringSeq.hh +++ /dev/null @@ -1,38 +0,0 @@ -// OpenSTA, Static Timing Analyzer -// Copyright (c) 2025, Parallax Software, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. -// -// Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// This notice may not be removed or altered from any source distribution. - -#pragma once - -#include - -#include "StringUtil.hh" - -namespace sta { - -using StringSeq = std::vector; - -void -deleteContents(StringSeq *strings); - -} // namespace diff --git a/include/sta/TclTypeHelpers.hh b/include/sta/TclTypeHelpers.hh index e521c4a9..33d837d3 100644 --- a/include/sta/TclTypeHelpers.hh +++ b/include/sta/TclTypeHelpers.hh @@ -24,7 +24,6 @@ #include "ArcDelayCalc.hh" #include "StringSet.hh" -#include "StringSeq.hh" #include @@ -37,11 +36,6 @@ namespace sta { StringSet * tclListSetConstChar(Tcl_Obj *const source, Tcl_Interp *interp); - -StringSeq * -tclListSeqConstChar(Tcl_Obj *const source, - Tcl_Interp *interp); - StdStringSeq tclListSeqStdString(Tcl_Obj *const source, Tcl_Interp *interp); diff --git a/sdc/Sdc.i b/sdc/Sdc.i index 2bca70b0..328abb32 100644 --- a/sdc/Sdc.i +++ b/sdc/Sdc.i @@ -1580,12 +1580,12 @@ filter_timing_arcs(const char *property, //////////////////////////////////////////////////////////////// -StringSeq +StdStringSeq group_path_names() { Sta *sta = Sta::sta(); Sdc *sdc = sta->cmdSdc(); - StringSeq pg_names; + StdStringSeq pg_names; for (auto const& [name, group] : sdc->groupPaths()) pg_names.push_back(name); return pg_names; diff --git a/search/ReportPath.cc b/search/ReportPath.cc index ad9b9f11..4029d09d 100644 --- a/search/ReportPath.cc +++ b/search/ReportPath.cc @@ -211,15 +211,15 @@ ReportPath::findField(const char *name) const } void -ReportPath::setReportFieldOrder(StringSeq *field_names) +ReportPath::setReportFieldOrder(StdStringSeq *field_names) { // Disable all fields. for (ReportField *field : fields_) field->setEnabled(false); ReportFieldSeq next_fields; - for (const char *field_name : *field_names) { - ReportField *field = findField(field_name); + for (const std::string &field_name : *field_names) { + ReportField *field = findField(field_name.c_str()); if (field) { next_fields.push_back(field); field->setEnabled(true); diff --git a/search/ReportPath.hh b/search/ReportPath.hh index 39c8b1a5..8c61e356 100644 --- a/search/ReportPath.hh +++ b/search/ReportPath.hh @@ -27,7 +27,7 @@ #include #include -#include "StringSeq.hh" +#include "StringUtil.hh" #include "SearchClass.hh" #include "PathEnd.hh" #include "CheckMinPulseWidths.hh" @@ -49,7 +49,7 @@ public: virtual ~ReportPath(); ReportPathFormat pathFormat() const { return format_; } void setPathFormat(ReportPathFormat format); - void setReportFieldOrder(StringSeq *field_names); + void setReportFieldOrder(StdStringSeq *field_names); void setReportFields(bool report_input_pin, bool report_hier_pins, bool report_net, diff --git a/search/Search.i b/search/Search.i index 8ffff0ff..f6ec25b4 100644 --- a/search/Search.i +++ b/search/Search.i @@ -395,7 +395,7 @@ set_report_path_format(ReportPathFormat format) } void -set_report_path_field_order(StringSeq *field_names) +set_report_path_field_order(StdStringSeq *field_names) { Sta::sta()->setReportPathFieldOrder(field_names); delete field_names; @@ -753,7 +753,7 @@ define_scene_cmd(const char *name, } void -define_scenes_cmd(StringSeq *scene_names) +define_scenes_cmd(StdStringSeq *scene_names) { Sta *sta = Sta::sta(); sta->makeScenes(scene_names); diff --git a/search/Sta.cc b/search/Sta.cc index 98fdbbf3..9bde46bc 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2450,7 +2450,7 @@ void Sta::makeDefaultScene() { const char *name = "default"; - StringSeq scene_names; + StdStringSeq scene_names; scene_names.push_back(name); Parasitics *parasitics = makeConcreteParasitics(name, ""); @@ -2468,7 +2468,7 @@ Sta::makeDefaultScene() // define_corners (before read_liberty). void -Sta::makeScenes(StringSeq *scene_names) +Sta::makeScenes(StdStringSeq *scene_names) { if (scene_names->size() > scene_count_max) report_->error(1553, "maximum scene count exceeded"); @@ -2478,7 +2478,7 @@ Sta::makeScenes(StringSeq *scene_names) mode->clear(); deleteScenes(); - for (const char *name : *scene_names) + for (const std::string &name : *scene_names) makeScene(name, mode, parasitics); cmd_scene_ = scenes_[0]; @@ -2729,7 +2729,7 @@ Sta::setReportPathFormat(ReportPathFormat format) } void -Sta::setReportPathFieldOrder(StringSeq *field_names) +Sta::setReportPathFieldOrder(StdStringSeq *field_names) { report_path_->setReportFieldOrder(field_names); } diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index b1c7b288..7d47632d 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -28,7 +28,6 @@ #include "Machine.hh" #include "StringUtil.hh" #include "StringSet.hh" -#include "StringSeq.hh" #include "PatternMatch.hh" #include "Network.hh" #include "Liberty.hh" @@ -306,7 +305,7 @@ using namespace sta; } %typemap(in) StdStringSeq* { - $1 = tclListSeqStdString($input, interp); + $1 = tclListSeqStdStringPtr($input, interp); } %typemap(out) StringSeq* { diff --git a/tcl/TclTypeHelpers.cc b/tcl/TclTypeHelpers.cc index c5cc219d..adf21f62 100644 --- a/tcl/TclTypeHelpers.cc +++ b/tcl/TclTypeHelpers.cc @@ -50,26 +50,6 @@ tclListSetConstChar(Tcl_Obj *const source, return nullptr; } -StringSeq * -tclListSeqConstChar(Tcl_Obj *const source, - Tcl_Interp *interp) -{ - Tcl_Size argc; - Tcl_Obj **argv; - - if (Tcl_ListObjGetElements(interp, source, &argc, &argv) == TCL_OK) { - StringSeq *seq = new StringSeq; - for (int i = 0; i < argc; i++) { - int length; - const char *str = Tcl_GetStringFromObj(argv[i], &length); - seq->push_back(str); - } - return seq; - } - else - return nullptr; -} - StdStringSeq tclListSeqStdString(Tcl_Obj *const source, Tcl_Interp *interp) diff --git a/util/StringSeq.cc b/util/StringSeq.cc deleted file mode 100644 index f5615d6c..00000000 --- a/util/StringSeq.cc +++ /dev/null @@ -1,36 +0,0 @@ -// OpenSTA, Static Timing Analyzer -// Copyright (c) 2025, Parallax Software, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. -// -// Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// This notice may not be removed or altered from any source distribution. - -#include "StringSeq.hh" - -namespace sta { - -void -deleteContents(StringSeq *strings) -{ - for (const char *string : *strings) - stringDelete(string); -} - -} // namespace diff --git a/verilog/VerilogReaderPvt.hh b/verilog/VerilogReaderPvt.hh index 6bbe8288..9f1fdffe 100644 --- a/verilog/VerilogReaderPvt.hh +++ b/verilog/VerilogReaderPvt.hh @@ -28,7 +28,6 @@ #include #include -#include "StringSeq.hh" #include "StringUtil.hh" namespace sta { From a1797918da0b478178e5611adc8495ee72b24993 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:19:27 -0700 Subject: [PATCH 51/59] Use & for StdStringSeq args Signed-off-by: James Cherry --- include/sta/Sta.hh | 4 ++-- search/ReportPath.cc | 4 ++-- search/ReportPath.hh | 2 +- search/Search.i | 6 ++---- search/Sta.cc | 8 ++++---- tcl/StaTclTypes.i | 6 +++++- 6 files changed, 16 insertions(+), 14 deletions(-) diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index f8fe4a95..b8212de8 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -125,7 +125,7 @@ public: void setThreadCount(int thread_count); // define_corners compatibility. - void makeScenes(StdStringSeq *scene_names); + void makeScenes(const StdStringSeq &scene_names); void makeScene(const std::string &name, const std::string &mode_name, const StdStringSeq &liberty_min_files, @@ -975,7 +975,7 @@ public: bool clk_gating_setup, bool clk_gating_hold); void setReportPathFormat(ReportPathFormat format); - void setReportPathFieldOrder(StdStringSeq *field_names); + void setReportPathFieldOrder(const StdStringSeq &field_names); void setReportPathFields(bool report_input_pin, bool report_hier_pins, bool report_net, diff --git a/search/ReportPath.cc b/search/ReportPath.cc index 4029d09d..8c3d7b32 100644 --- a/search/ReportPath.cc +++ b/search/ReportPath.cc @@ -211,14 +211,14 @@ ReportPath::findField(const char *name) const } void -ReportPath::setReportFieldOrder(StdStringSeq *field_names) +ReportPath::setReportFieldOrder(const StdStringSeq &field_names) { // Disable all fields. for (ReportField *field : fields_) field->setEnabled(false); ReportFieldSeq next_fields; - for (const std::string &field_name : *field_names) { + for (const std::string &field_name : field_names) { ReportField *field = findField(field_name.c_str()); if (field) { next_fields.push_back(field); diff --git a/search/ReportPath.hh b/search/ReportPath.hh index 8c61e356..2d5da89c 100644 --- a/search/ReportPath.hh +++ b/search/ReportPath.hh @@ -49,7 +49,7 @@ public: virtual ~ReportPath(); ReportPathFormat pathFormat() const { return format_; } void setPathFormat(ReportPathFormat format); - void setReportFieldOrder(StdStringSeq *field_names); + void setReportFieldOrder(const StdStringSeq &field_names); void setReportFields(bool report_input_pin, bool report_hier_pins, bool report_net, diff --git a/search/Search.i b/search/Search.i index f6ec25b4..b2310c88 100644 --- a/search/Search.i +++ b/search/Search.i @@ -395,10 +395,9 @@ set_report_path_format(ReportPathFormat format) } void -set_report_path_field_order(StdStringSeq *field_names) +set_report_path_field_order(const StdStringSeq &field_names) { Sta::sta()->setReportPathFieldOrder(field_names); - delete field_names; } void @@ -753,11 +752,10 @@ define_scene_cmd(const char *name, } void -define_scenes_cmd(StdStringSeq *scene_names) +define_scenes_cmd(const StdStringSeq &scene_names) { Sta *sta = Sta::sta(); sta->makeScenes(scene_names); - delete scene_names; } Scene * diff --git a/search/Sta.cc b/search/Sta.cc index 9bde46bc..5353178e 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2468,9 +2468,9 @@ Sta::makeDefaultScene() // define_corners (before read_liberty). void -Sta::makeScenes(StdStringSeq *scene_names) +Sta::makeScenes(const StdStringSeq &scene_names) { - if (scene_names->size() > scene_count_max) + if (scene_names.size() > scene_count_max) report_->error(1553, "maximum scene count exceeded"); Parasitics *parasitics = findParasitics("default"); Mode *mode = modes_[0]; @@ -2478,7 +2478,7 @@ Sta::makeScenes(StdStringSeq *scene_names) mode->clear(); deleteScenes(); - for (const std::string &name : *scene_names) + for (const std::string &name : scene_names) makeScene(name, mode, parasitics); cmd_scene_ = scenes_[0]; @@ -2729,7 +2729,7 @@ Sta::setReportPathFormat(ReportPathFormat format) } void -Sta::setReportPathFieldOrder(StdStringSeq *field_names) +Sta::setReportPathFieldOrder(const StdStringSeq &field_names) { report_path_->setReportFieldOrder(field_names); } diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index 7d47632d..2bcb3fa0 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -52,7 +52,6 @@ namespace sta { typedef MinMaxAll MinMaxAllNull; -typedef std::vector StdStringSeq; #if TCL_MAJOR_VERSION < 9 typedef int Tcl_Size; @@ -304,6 +303,11 @@ using namespace sta; $1 = tclListSeqStdString($input, interp); } +%typemap(in) const StdStringSeq & (StdStringSeq seq) { + seq = tclListSeqStdString($input, interp); + $1 = &seq; +} + %typemap(in) StdStringSeq* { $1 = tclListSeqStdStringPtr($input, interp); } From 7e7ab963292c39a04f51f6eda6954860130c5594 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:25:02 -0700 Subject: [PATCH 52/59] rm StdString Signed-off-by: James Cherry --- tcl/StaTclTypes.i | 24 ------------------------ 1 file changed, 24 deletions(-) diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index 2bcb3fa0..7de25386 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -291,10 +291,6 @@ using namespace sta; Tcl_SetResult(interp, nullptr, TCL_STATIC); } -%typemap(in) StringSeq* { - $1 = tclListSeqConstChar($input, interp); -} - %typemap(in) StdStringSet* { $1 = tclListSetStdString($input, interp); } @@ -312,26 +308,6 @@ using namespace sta; $1 = tclListSeqStdStringPtr($input, interp); } -%typemap(out) StringSeq* { - StringSeq *strs = $1; - Tcl_Obj *list = Tcl_NewListObj(0, nullptr); - for (const char *str : *strs) { - Tcl_Obj *obj = Tcl_NewStringObj(str, strlen(str)); - Tcl_ListObjAppendElement(interp, list, obj); - } - Tcl_SetObjResult(interp, list); -} - -%typemap(out) StringSeq { - StringSeq &strs = $1; - Tcl_Obj *list = Tcl_NewListObj(0, nullptr); - for (const char *str : strs) { - Tcl_Obj *obj = Tcl_NewStringObj(str, strlen(str)); - Tcl_ListObjAppendElement(interp, list, obj); - } - Tcl_SetObjResult(interp, list); -} - %typemap(in) StdStringSet* { $1 = tclListSetStdString($input, interp); } From 4f540792a098f704dd45bd7dacdd4b77ac826b9d Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:39:41 -0700 Subject: [PATCH 53/59] rm StringSet Signed-off-by: James Cherry --- CMakeLists.txt | 1 - include/sta/Sdc.hh | 1 - include/sta/SearchClass.hh | 1 - include/sta/StringSet.hh | 38 ----------------------------------- include/sta/StringUtil.hh | 2 ++ include/sta/TclTypeHelpers.hh | 9 +++------ include/sta/VerilogReader.hh | 2 +- liberty/Liberty.cc | 1 - spice/WritePathSpice.hh | 1 - spice/WriteSpice.hh | 1 - tcl/StaTclTypes.i | 5 ----- tcl/TclTypeHelpers.cc | 20 ------------------ util/StringSet.cc | 36 --------------------------------- 13 files changed, 6 insertions(+), 112 deletions(-) delete mode 100644 include/sta/StringSet.hh delete mode 100644 util/StringSet.cc diff --git a/CMakeLists.txt b/CMakeLists.txt index 4e548733..99a94864 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -234,7 +234,6 @@ set(STA_SOURCE util/RiseFallMinMaxDelay.cc util/RiseFallValues.cc util/Stats.cc - util/StringSet.cc util/StringUtil.cc util/Transition.cc diff --git a/include/sta/Sdc.hh b/include/sta/Sdc.hh index dfd9aced..add84e7f 100644 --- a/include/sta/Sdc.hh +++ b/include/sta/Sdc.hh @@ -30,7 +30,6 @@ #include #include "StringUtil.hh" -#include "StringSet.hh" #include "MinMax.hh" #include "StaState.hh" #include "NetworkClass.hh" diff --git a/include/sta/SearchClass.hh b/include/sta/SearchClass.hh index 65683966..c8f45627 100644 --- a/include/sta/SearchClass.hh +++ b/include/sta/SearchClass.hh @@ -29,7 +29,6 @@ #include #include "VectorMap.hh" -#include "StringSet.hh" #include "MinMaxValues.hh" #include "Delay.hh" #include "NetworkClass.hh" diff --git a/include/sta/StringSet.hh b/include/sta/StringSet.hh deleted file mode 100644 index fc3d0d2b..00000000 --- a/include/sta/StringSet.hh +++ /dev/null @@ -1,38 +0,0 @@ -// OpenSTA, Static Timing Analyzer -// Copyright (c) 2025, Parallax Software, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. -// -// Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// This notice may not be removed or altered from any source distribution. -#pragma once - -#include - -#include "StringUtil.hh" - -namespace sta { - -using StringSet = std::set; -using StdStringSet = std::set; - -void -deleteContents(StringSet *strings); - -} // namespace diff --git a/include/sta/StringUtil.hh b/include/sta/StringUtil.hh index cdb9b1b7..9b67ca4c 100644 --- a/include/sta/StringUtil.hh +++ b/include/sta/StringUtil.hh @@ -28,12 +28,14 @@ #include #include #include +#include #include "Machine.hh" // __attribute__ namespace sta { using StdStringSeq = std::vector; +using StdStringSet = std::set; inline bool stringEq(const char *str1, diff --git a/include/sta/TclTypeHelpers.hh b/include/sta/TclTypeHelpers.hh index 33d837d3..657aa018 100644 --- a/include/sta/TclTypeHelpers.hh +++ b/include/sta/TclTypeHelpers.hh @@ -22,20 +22,17 @@ // // This notice may not be removed or altered from any source distribution. -#include "ArcDelayCalc.hh" -#include "StringSet.hh" - #include +#include "ArcDelayCalc.hh" +#include "StringUtil.hh" + namespace sta { #if TCL_MAJOR_VERSION < 9 typedef int Tcl_Size; #endif -StringSet * -tclListSetConstChar(Tcl_Obj *const source, - Tcl_Interp *interp); StdStringSeq tclListSeqStdString(Tcl_Obj *const source, Tcl_Interp *interp); diff --git a/include/sta/VerilogReader.hh b/include/sta/VerilogReader.hh index 2b244d0c..cf1dab95 100644 --- a/include/sta/VerilogReader.hh +++ b/include/sta/VerilogReader.hh @@ -28,7 +28,7 @@ #include #include -#include "StringSet.hh" +#include "StringUtil.hh" #include "NetworkClass.hh" namespace sta { diff --git a/liberty/Liberty.cc b/liberty/Liberty.cc index 23774ac1..825502f6 100644 --- a/liberty/Liberty.cc +++ b/liberty/Liberty.cc @@ -31,7 +31,6 @@ #include "Debug.hh" #include "Error.hh" #include "StringUtil.hh" -#include "StringSet.hh" #include "PatternMatch.hh" #include "Units.hh" #include "Transition.hh" diff --git a/spice/WritePathSpice.hh b/spice/WritePathSpice.hh index 647ef542..c8823aeb 100644 --- a/spice/WritePathSpice.hh +++ b/spice/WritePathSpice.hh @@ -24,7 +24,6 @@ #pragma once -#include "StringSet.hh" #include "CircuitSim.hh" namespace sta { diff --git a/spice/WriteSpice.hh b/spice/WriteSpice.hh index 81bd15b7..eb10fcfe 100644 --- a/spice/WriteSpice.hh +++ b/spice/WriteSpice.hh @@ -30,7 +30,6 @@ #include #include "StaState.hh" -#include "StringSet.hh" #include "StringUtil.hh" #include "Liberty.hh" #include "GraphClass.hh" diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index 7de25386..2c63941e 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -27,7 +27,6 @@ #include "Machine.hh" #include "StringUtil.hh" -#include "StringSet.hh" #include "PatternMatch.hh" #include "Network.hh" #include "Liberty.hh" @@ -1227,10 +1226,6 @@ using namespace sta; Tcl_SetObjResult(interp,Tcl_NewDoubleObj(delayAsFloat($1))); } -%typemap(in) StringSet* { - $1 = tclListSetConstChar($input, interp); -} - %typemap(out) Mode* { const Mode *mode = $1; if (mode) diff --git a/tcl/TclTypeHelpers.cc b/tcl/TclTypeHelpers.cc index adf21f62..36e606fa 100644 --- a/tcl/TclTypeHelpers.cc +++ b/tcl/TclTypeHelpers.cc @@ -30,26 +30,6 @@ namespace sta { -StringSet * -tclListSetConstChar(Tcl_Obj *const source, - Tcl_Interp *interp) -{ - Tcl_Size argc; - Tcl_Obj **argv; - - if (Tcl_ListObjGetElements(interp, source, &argc, &argv) == TCL_OK) { - StringSet *set = new StringSet; - for (int i = 0; i < argc; i++) { - int length; - const char *str = Tcl_GetStringFromObj(argv[i], &length); - set->insert(str); - } - return set; - } - else - return nullptr; -} - StdStringSeq tclListSeqStdString(Tcl_Obj *const source, Tcl_Interp *interp) diff --git a/util/StringSet.cc b/util/StringSet.cc deleted file mode 100644 index 79863547..00000000 --- a/util/StringSet.cc +++ /dev/null @@ -1,36 +0,0 @@ -// OpenSTA, Static Timing Analyzer -// Copyright (c) 2025, Parallax Software, Inc. -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see . -// -// The origin of this software must not be misrepresented; you must not -// claim that you wrote the original software. -// -// Altered source versions must be plainly marked as such, and must not be -// misrepresented as being the original software. -// -// This notice may not be removed or altered from any source distribution. - -#include "StringSet.hh" - -namespace sta { - -void -deleteContents(StringSet *strings) -{ - for (const char *string : *strings) - stringDelete(string); -} - -} // namespace From 859982bdc75a200faceda1fb39635c3b3478d462 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:51:50 -0700 Subject: [PATCH 54/59] StdStringSeq -> StringSeq Signed-off-by: James Cherry --- dcalc/DelayCalc.cc | 4 ++-- dcalc/DelayCalc.i | 2 +- doc/ApiChanges.txt | 2 +- doc/ChangeLog.txt | 2 +- graph/Graph.i | 4 ++-- include/sta/DelayCalc.hh | 2 +- include/sta/Mode.hh | 2 +- include/sta/PathGroup.hh | 6 +++--- include/sta/Search.hh | 2 +- include/sta/Sta.hh | 18 +++++++++--------- include/sta/StringUtil.hh | 4 ++-- include/sta/TclTypeHelpers.hh | 4 ++-- liberty/LibertyReader.cc | 28 ++++++++++++++-------------- liberty/LibertyReaderPvt.hh | 6 +++--- parasitics/SpefParse.yy | 4 ++-- parasitics/SpefReader.cc | 2 +- parasitics/SpefReaderPvt.hh | 4 ++-- sdc/Sdc.i | 4 ++-- search/CheckTiming.hh | 2 +- search/Mode.cc | 2 +- search/PathGroup.cc | 10 +++++----- search/ReportPath.cc | 2 +- search/ReportPath.hh | 2 +- search/Search.cc | 2 +- search/Search.i | 12 ++++++------ search/Sta.cc | 24 ++++++++++++------------ spice/WritePathSpice.cc | 2 +- spice/WriteSpice.cc | 18 +++++++++--------- spice/WriteSpice.hh | 8 ++++---- spice/Xyce.cc | 2 +- spice/Xyce.hh | 2 +- tcl/StaTclTypes.i | 12 ++++++------ tcl/TclTypeHelpers.cc | 8 ++++---- util/StringUtil.cc | 8 ++++---- verilog/VerilogReader.cc | 6 +++--- verilog/VerilogReaderPvt.hh | 6 +++--- 36 files changed, 114 insertions(+), 114 deletions(-) diff --git a/dcalc/DelayCalc.cc b/dcalc/DelayCalc.cc index 1e27b20e..98a3e7b1 100644 --- a/dcalc/DelayCalc.cc +++ b/dcalc/DelayCalc.cc @@ -84,10 +84,10 @@ isDelayCalcName(const std::string &name) return delay_calcs.contains(name); } -StdStringSeq +StringSeq delayCalcNames() { - StdStringSeq names; + StringSeq names; for (const auto &[name, make_dcalc] : delay_calcs) names.push_back(name); return names; diff --git a/dcalc/DelayCalc.i b/dcalc/DelayCalc.i index 62e4c24f..a0bbaea6 100644 --- a/dcalc/DelayCalc.i +++ b/dcalc/DelayCalc.i @@ -36,7 +36,7 @@ %inline %{ -StdStringSeq +StringSeq delay_calc_names() { return sta::delayCalcNames(); diff --git a/doc/ApiChanges.txt b/doc/ApiChanges.txt index 34136d76..23c9e11f 100644 --- a/doc/ApiChanges.txt +++ b/doc/ApiChanges.txt @@ -40,7 +40,7 @@ StaState::clk_network__ moved to Mode StaState::parasitics_ moved to Scene Sta::findPathEnds group_paths arg has been changed from PathGroupNameSet* -to StdStringSeq&. +to StringSeq&. Sta::isClock has been removed. Use mode->clkNetwork()->isClock instead. diff --git a/doc/ChangeLog.txt b/doc/ChangeLog.txt index 13bdcc38..8d695f63 100644 --- a/doc/ChangeLog.txt +++ b/doc/ChangeLog.txt @@ -201,7 +201,7 @@ to remove paths through identical pins and rise/fall edges. Instances now have pins for verilog netlist power/ground connections, Sta::findPathEnds group_paths arg has been changed from PathGroupNameSet* -to StdStringSeq&. +to StringSeq&. Release 2.6.1 2025/03/30 ------------------------- diff --git a/graph/Graph.i b/graph/Graph.i index 4eab5270..289ca3ba 100644 --- a/graph/Graph.i +++ b/graph/Graph.i @@ -229,12 +229,12 @@ arc_delays(TimingArc *arc) return delays; } -StdStringSeq +StringSeq arc_delay_strings(TimingArc *arc, int digits) { Sta *sta = Sta::sta(); - StdStringSeq delays; + StringSeq delays; DcalcAPIndex ap_count = sta->dcalcAnalysisPtCount(); for (DcalcAPIndex ap_index = 0; ap_index < ap_count; ap_index++) delays.push_back(delayAsString(sta->arcDelay(self, arc, ap_index), diff --git a/include/sta/DelayCalc.hh b/include/sta/DelayCalc.hh index 091b8799..cea48177 100644 --- a/include/sta/DelayCalc.hh +++ b/include/sta/DelayCalc.hh @@ -44,7 +44,7 @@ registerDelayCalc(const std::string &name, MakeArcDelayCalc maker); bool isDelayCalcName(const std::string &name); -StdStringSeq +StringSeq delayCalcNames(); void deleteDelayCalcs(); diff --git a/include/sta/Mode.hh b/include/sta/Mode.hh index 0c0827e1..b47adc00 100644 --- a/include/sta/Mode.hh +++ b/include/sta/Mode.hh @@ -71,7 +71,7 @@ public: bool unique_edges, float min_slack, float max_slack, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, diff --git a/include/sta/PathGroup.hh b/include/sta/PathGroup.hh index 836804f7..df0c5ca7 100644 --- a/include/sta/PathGroup.hh +++ b/include/sta/PathGroup.hh @@ -120,7 +120,7 @@ public: bool unique_edges, float slack_min, float slack_max, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, @@ -144,7 +144,7 @@ public: PathGroup *findPathGroup(const Clock *clock, const MinMax *min_max) const; PathGroupSeq pathGroups(const PathEnd *path_end) const; - static StdStringSeq pathGroupNames(const PathEnd *path_end, + static StringSeq pathGroupNames(const PathEnd *path_end, const StaState *sta); static const char *asyncPathGroupName() { return async_group_name_; } static const char *pathDelayGroupName() { return path_delay_group_name_; } @@ -194,7 +194,7 @@ protected: StdStringSet &group_names) const; static GroupPath *groupPathTo(const PathEnd *path_end, const StaState *sta); - StdStringSeq pathGroupNames(); + StringSeq pathGroupNames(); const Mode *mode_; int group_path_count_; diff --git a/include/sta/Search.hh b/include/sta/Search.hh index 4c98845c..bc516502 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -107,7 +107,7 @@ public: float slack_min, float slack_max, bool sort_by_slack, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, diff --git a/include/sta/Sta.hh b/include/sta/Sta.hh index b8212de8..fee94bd1 100644 --- a/include/sta/Sta.hh +++ b/include/sta/Sta.hh @@ -78,7 +78,7 @@ class GraphLoop; using ModeNameMap = std::map; using SceneNameMap = std::map; using SlowDrvrIterator = Iterator; -using CheckError = StdStringSeq; +using CheckError = StringSeq; using CheckErrorSeq = std::vector; enum class CmdNamespace { sta, sdc }; using ParasiticsNameMap = std::map; @@ -125,11 +125,11 @@ public: void setThreadCount(int thread_count); // define_corners compatibility. - void makeScenes(const StdStringSeq &scene_names); + void makeScenes(const StringSeq &scene_names); void makeScene(const std::string &name, const std::string &mode_name, - const StdStringSeq &liberty_min_files, - const StdStringSeq &liberty_max_files, + const StringSeq &liberty_min_files, + const StringSeq &liberty_max_files, const std::string &spef_min_file, const std::string &spef_max_file); Scene *findScene(const std::string &name) const; @@ -652,7 +652,7 @@ public: const Sdc *sdc) __attribute__ ((deprecated)); bool isPathGroupName(const char *group_name, const Sdc *sdc) const; - StdStringSeq pathGroupNames(const Sdc *sdc) const; + StringSeq pathGroupNames(const Sdc *sdc) const; void resetPath(ExceptionFrom *from, ExceptionThruSeq *thrus, ExceptionTo *to, @@ -965,7 +965,7 @@ public: bool sort_by_slack, // Path groups to report. // Empty list reports all groups. - StdStringSeq &group_names, + StringSeq &group_names, // Predicates to filter the type of path // ends returned. bool setup, @@ -975,7 +975,7 @@ public: bool clk_gating_setup, bool clk_gating_hold); void setReportPathFormat(ReportPathFormat format); - void setReportPathFieldOrder(const StdStringSeq &field_names); + void setReportPathFieldOrder(const StringSeq &field_names); void setReportPathFields(bool report_input_pin, bool report_hier_pins, bool report_net, @@ -1582,8 +1582,8 @@ protected: void setThreadCount1(int thread_count); void updateLibertyScenes(); void updateSceneLiberty(Scene *scene, - const StdStringSeq &liberty_min_files, - const StdStringSeq &liberty_max_files); + const StringSeq &liberty_min_files, + const StringSeq &liberty_max_files); Scene *makeScene(const std::string &name, Mode *mode, diff --git a/include/sta/StringUtil.hh b/include/sta/StringUtil.hh index 9b67ca4c..d237e9c3 100644 --- a/include/sta/StringUtil.hh +++ b/include/sta/StringUtil.hh @@ -34,7 +34,7 @@ namespace sta { -using StdStringSeq = std::vector; +using StringSeq = std::vector; using StdStringSet = std::set; inline bool @@ -206,7 +206,7 @@ void trimRight(std::string &str); // Spit text into delimiter separated tokens and skip whitepace. -StdStringSeq +StringSeq parseTokens(const std::string &s, const char delimiter); diff --git a/include/sta/TclTypeHelpers.hh b/include/sta/TclTypeHelpers.hh index 657aa018..08aa291b 100644 --- a/include/sta/TclTypeHelpers.hh +++ b/include/sta/TclTypeHelpers.hh @@ -33,10 +33,10 @@ namespace sta { typedef int Tcl_Size; #endif -StdStringSeq +StringSeq tclListSeqStdString(Tcl_Obj *const source, Tcl_Interp *interp); -StdStringSeq * +StringSeq * tclListSeqStdStringPtr(Tcl_Obj *const source, Tcl_Interp *interp); StdStringSet * diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 872b135b..5d99d1f1 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -1894,8 +1894,8 @@ LibertyReader::makeTimingArcs(LibertyCell *cell, LibertyPort *related_output_port = findLibertyPort(cell, timing_group, "related_output_pin"); - StdStringSeq related_port_names = findAttributStrings(timing_group, "related_pin"); - StdStringSeq related_bus_names=findAttributStrings(timing_group,"related_bus_pins"); + StringSeq related_port_names = findAttributStrings(timing_group, "related_pin"); + StringSeq related_bus_names=findAttributStrings(timing_group,"related_bus_pins"); TimingType timing_type = timing_attrs->timingType(); for (LibertyPort *to_port : ports) { @@ -2743,7 +2743,7 @@ LibertyReader::findLibertyPort(LibertyCell *cell, return nullptr; } -StdStringSeq +StringSeq LibertyReader::findAttributStrings(const LibertyGroup *group, const char *name_attr) { @@ -2754,7 +2754,7 @@ LibertyReader::findAttributStrings(const LibertyGroup *group, return parseTokens(*strings, ' '); } } - return StdStringSeq(); + return StringSeq(); } LibertyPortSeq @@ -2763,7 +2763,7 @@ LibertyReader::findLibertyPorts(LibertyCell *cell, const char *port_name_attr) { LibertyPortSeq ports; - StdStringSeq port_names = findAttributStrings(group, port_name_attr); + StringSeq port_names = findAttributStrings(group, port_name_attr); for (const std::string &port_name : port_names) { LibertyPort *port = findPort(cell, port_name.c_str()); if (port) @@ -2915,40 +2915,40 @@ LibertyReader::readStatetable(LibertyCell *cell, const char *input_ports_arg = statetable_group->firstName(); const char *internal_ports_arg = statetable_group->params().size() >= 2 ? statetable_group->secondName() : nullptr; - StdStringSeq input_ports; + StringSeq input_ports; if (input_ports_arg) input_ports = parseTokens(input_ports_arg, ' '); - StdStringSeq internal_ports; + StringSeq internal_ports; if (internal_ports_arg) internal_ports = parseTokens(internal_ports_arg, ' '); const LibertySimpleAttr *table_attr = statetable_group->findSimpleAttr("table"); if (table_attr) { const std::string *table_str = table_attr->stringValue(); - StdStringSeq table_rows = parseTokens(table_str->c_str(), ','); + StringSeq table_rows = parseTokens(table_str->c_str(), ','); size_t input_count = input_ports.size(); size_t internal_count = internal_ports.size(); StatetableRows table; for (const std::string &row : table_rows) { - const StdStringSeq row_groups = parseTokens(row, ':'); + const StringSeq row_groups = parseTokens(row, ':'); if (row_groups.size() != 3) { libWarn(1300, table_attr, "table row must have 3 groups separated by ':'."); break; } - StdStringSeq inputs = parseTokens(row_groups[0], ' '); + StringSeq inputs = parseTokens(row_groups[0], ' '); if (inputs.size() != input_count) { libWarn(1301,table_attr,"table row has %zu input values but %zu are required.", inputs.size(), input_count); break; } - StdStringSeq currents = parseTokens(row_groups[1], ' '); + StringSeq currents = parseTokens(row_groups[1], ' '); if (currents.size() != internal_count) { libWarn(1302,table_attr, "table row has %zu current values but %zu are required.", currents.size(), internal_count); break; } - StdStringSeq nexts = parseTokens(row_groups[2], ' '); + StringSeq nexts = parseTokens(row_groups[2], ' '); if (nexts.size() != internal_count) { libWarn(1303, table_attr, "table row has %zu next values but %zu are required.", nexts.size(), internal_count); @@ -3087,7 +3087,7 @@ static EnumNameMap state_internal_value_name_map = }; StateInputValues -LibertyReader::parseStateInputValues(StdStringSeq &inputs, +LibertyReader::parseStateInputValues(StringSeq &inputs, const LibertySimpleAttr *attr) { StateInputValues input_values; @@ -3106,7 +3106,7 @@ LibertyReader::parseStateInputValues(StdStringSeq &inputs, } StateInternalValues -LibertyReader::parseStateInternalValues(StdStringSeq &states, +LibertyReader::parseStateInternalValues(StringSeq &states, const LibertySimpleAttr *attr) { StateInternalValues state_values; diff --git a/liberty/LibertyReaderPvt.hh b/liberty/LibertyReaderPvt.hh index ec8facff..9cfca58b 100644 --- a/liberty/LibertyReaderPvt.hh +++ b/liberty/LibertyReaderPvt.hh @@ -101,7 +101,7 @@ public: LibertyPort *findPort(LibertyCell *cell, const char *port_name); - StdStringSeq findAttributStrings(const LibertyGroup *group, + StringSeq findAttributStrings(const LibertyGroup *group, const char *name_attr); protected: @@ -402,9 +402,9 @@ protected: float defaultCap(LibertyPort *port); void visitPorts(std::function func); - StateInputValues parseStateInputValues(StdStringSeq &inputs, + StateInputValues parseStateInputValues(StringSeq &inputs, const LibertySimpleAttr *attr); - StateInternalValues parseStateInternalValues(StdStringSeq &states, + StateInternalValues parseStateInternalValues(StringSeq &states, const LibertySimpleAttr *attr); void getAttrInt(const LibertySimpleAttr *attr, diff --git a/parasitics/SpefParse.yy b/parasitics/SpefParse.yy index 260a212c..921db703 100755 --- a/parasitics/SpefParse.yy +++ b/parasitics/SpefParse.yy @@ -62,7 +62,7 @@ sta::SpefParse::error(const location_type &loc, char *string; int integer; float number; - sta::StdStringSeq *std_string_seq; + sta::StringSeq *std_string_seq; sta::PortDirection *port_dir; sta::SpefRspfPi *pi; sta::SpefTriple *triple; @@ -220,7 +220,7 @@ design_flow: qstrings: QSTRING - { $$ = new sta::StdStringSeq; + { $$ = new sta::StringSeq; $$->push_back($1); sta::stringDelete($1); } diff --git a/parasitics/SpefReader.cc b/parasitics/SpefReader.cc index 16f7a6dc..77dea552 100644 --- a/parasitics/SpefReader.cc +++ b/parasitics/SpefReader.cc @@ -291,7 +291,7 @@ SpefReader::portDirection(char *spef_dir) } void -SpefReader::setDesignFlow(StdStringSeq *flow) +SpefReader::setDesignFlow(StringSeq *flow) { design_flow_ = std::move(*flow); delete flow; diff --git a/parasitics/SpefReaderPvt.hh b/parasitics/SpefReaderPvt.hh index de0b8043..2ddb52ad 100644 --- a/parasitics/SpefReaderPvt.hh +++ b/parasitics/SpefReaderPvt.hh @@ -82,7 +82,7 @@ public: void makeNameMapEntry(const char *index, const char *name); const char *nameMapLookup(const char *index); - void setDesignFlow(StdStringSeq *flow_keys); + void setDesignFlow(StringSeq *flow_keys); Pin *findPin(char *name); Net *findNet(const char *name); void rspfBegin(Net *net, @@ -139,7 +139,7 @@ private: float res_scale_; float induct_scale_; SpefNameMap name_map_; - StdStringSeq design_flow_; + StringSeq design_flow_; Parasitics *parasitics_; Parasitic *parasitic_; }; diff --git a/sdc/Sdc.i b/sdc/Sdc.i index 328abb32..2bca70b0 100644 --- a/sdc/Sdc.i +++ b/sdc/Sdc.i @@ -1580,12 +1580,12 @@ filter_timing_arcs(const char *property, //////////////////////////////////////////////////////////////// -StdStringSeq +StringSeq group_path_names() { Sta *sta = Sta::sta(); Sdc *sdc = sta->cmdSdc(); - StdStringSeq pg_names; + StringSeq pg_names; for (auto const& [name, group] : sdc->groupPaths()) pg_names.push_back(name); return pg_names; diff --git a/search/CheckTiming.hh b/search/CheckTiming.hh index f2c821c7..75bd63ac 100644 --- a/search/CheckTiming.hh +++ b/search/CheckTiming.hh @@ -36,7 +36,7 @@ namespace sta { class ClkNetwork; -using CheckError = StdStringSeq; +using CheckError = StringSeq; using CheckErrorSeq = std::vector; class CheckTiming : public StaState diff --git a/search/Mode.cc b/search/Mode.cc index 80e5b5fd..1c44a73f 100644 --- a/search/Mode.cc +++ b/search/Mode.cc @@ -105,7 +105,7 @@ Mode::makePathGroups(int group_path_count, bool unique_edges, float slack_min, float slack_max, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, diff --git a/search/PathGroup.cc b/search/PathGroup.cc index b1ef7a0f..5f4ce29a 100644 --- a/search/PathGroup.cc +++ b/search/PathGroup.cc @@ -258,7 +258,7 @@ PathGroups::PathGroups(int group_path_count, bool unique_edges, float slack_min, float slack_max, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, @@ -479,11 +479,11 @@ PathGroups::pathGroups(const PathEnd *path_end) const } // Mirrors PathGroups::pathGroup. -StdStringSeq +StringSeq PathGroups::pathGroupNames(const PathEnd *path_end, const StaState *sta) { - StdStringSeq group_names; + StringSeq group_names; const char *group_name = nullptr; const Search *search = sta->search(); ExceptionPathSeq group_paths = search->groupPathsTo(path_end); @@ -576,14 +576,14 @@ PathGroups::pushEnds(PathEndSeq &path_ends) } } -StdStringSeq +StringSeq PathGroups::pathGroupNames() { std::set group_names1; const Sdc *sdc = mode_->sdc(); for (const auto& [name, group] : sdc->groupPaths()) group_names1.insert(name); - StdStringSeq group_names2; + StringSeq group_names2; for (const std::string &name : group_names1) group_names2.push_back(name); sort(group_names2); diff --git a/search/ReportPath.cc b/search/ReportPath.cc index 8c3d7b32..33fb3689 100644 --- a/search/ReportPath.cc +++ b/search/ReportPath.cc @@ -211,7 +211,7 @@ ReportPath::findField(const char *name) const } void -ReportPath::setReportFieldOrder(const StdStringSeq &field_names) +ReportPath::setReportFieldOrder(const StringSeq &field_names) { // Disable all fields. for (ReportField *field : fields_) diff --git a/search/ReportPath.hh b/search/ReportPath.hh index 2d5da89c..b934bc9e 100644 --- a/search/ReportPath.hh +++ b/search/ReportPath.hh @@ -49,7 +49,7 @@ public: virtual ~ReportPath(); ReportPathFormat pathFormat() const { return format_; } void setPathFormat(ReportPathFormat format); - void setReportFieldOrder(const StdStringSeq &field_names); + void setReportFieldOrder(const StringSeq &field_names); void setReportFields(bool report_input_pin, bool report_hier_pins, bool report_net, diff --git a/search/Search.cc b/search/Search.cc index aca08dfb..c7cc2a58 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -504,7 +504,7 @@ Search::findPathEnds(ExceptionFrom *from, float slack_min, float slack_max, bool sort_by_slack, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, diff --git a/search/Search.i b/search/Search.i index b2310c88..410cfdc2 100644 --- a/search/Search.i +++ b/search/Search.i @@ -242,7 +242,7 @@ endpoint_slack(const Pin *pin, } } -StdStringSeq +StringSeq path_group_names() { Sta *sta = Sta::sta(); @@ -359,7 +359,7 @@ find_path_ends(ExceptionFrom *from, float slack_min, float slack_max, bool sort_by_slack, - StdStringSeq path_groups, + StringSeq path_groups, bool setup, bool hold, bool recovery, @@ -395,7 +395,7 @@ set_report_path_format(ReportPathFormat format) } void -set_report_path_field_order(const StdStringSeq &field_names) +set_report_path_field_order(const StringSeq &field_names) { Sta::sta()->setReportPathFieldOrder(field_names); } @@ -740,8 +740,8 @@ write_timing_model_cmd(const char *lib_name, void define_scene_cmd(const char *name, const char *mode_name, - const StdStringSeq liberty_min_files, - const StdStringSeq liberty_max_files, + const StringSeq liberty_min_files, + const StringSeq liberty_max_files, const char *spef_min_file, const char *spef_max_file) { @@ -752,7 +752,7 @@ define_scene_cmd(const char *name, } void -define_scenes_cmd(const StdStringSeq &scene_names) +define_scenes_cmd(const StringSeq &scene_names) { Sta *sta = Sta::sta(); sta->makeScenes(scene_names); diff --git a/search/Sta.cc b/search/Sta.cc index 5353178e..f9134175 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2075,10 +2075,10 @@ Sta::isPathGroupName(const char *group_name, || stringEq(group_name, PathGroups::unconstrainedGroupName()); } -StdStringSeq +StringSeq Sta::pathGroupNames(const Sdc *sdc) const { - StdStringSeq names; + StringSeq names; for (const Clock *clk : sdc->clocks()) names.push_back(clk->name()); @@ -2450,7 +2450,7 @@ void Sta::makeDefaultScene() { const char *name = "default"; - StdStringSeq scene_names; + StringSeq scene_names; scene_names.push_back(name); Parasitics *parasitics = makeConcreteParasitics(name, ""); @@ -2468,7 +2468,7 @@ Sta::makeDefaultScene() // define_corners (before read_liberty). void -Sta::makeScenes(const StdStringSeq &scene_names) +Sta::makeScenes(const StringSeq &scene_names) { if (scene_names.size() > scene_count_max) report_->error(1553, "maximum scene count exceeded"); @@ -2490,8 +2490,8 @@ Sta::makeScenes(const StdStringSeq &scene_names) void Sta::makeScene(const std::string &name, const std::string &mode_name, - const StdStringSeq &liberty_min_files, - const StdStringSeq &liberty_max_files, + const StringSeq &liberty_min_files, + const StringSeq &liberty_max_files, const std::string &spef_min_file, const std::string &spef_max_file) { @@ -2598,12 +2598,12 @@ Sta::findScenes(const std::string &name, void Sta::updateSceneLiberty(Scene *scene, - const StdStringSeq &liberty_min_files, - const StdStringSeq &liberty_max_files) + const StringSeq &liberty_min_files, + const StringSeq &liberty_max_files) { StdStringSet warned_files; for (const MinMax *min_max : MinMax::range()) { - const StdStringSeq &liberty_files = min_max == MinMax::min() + const StringSeq &liberty_files = min_max == MinMax::min() ? liberty_min_files : liberty_max_files; for (const std::string &lib_file : liberty_files) { @@ -2678,7 +2678,7 @@ Sta::findPathEnds(ExceptionFrom *from, float slack_min, float slack_max, bool sort_by_slack, - StdStringSeq &group_names, + StringSeq &group_names, bool setup, bool hold, bool recovery, @@ -2729,7 +2729,7 @@ Sta::setReportPathFormat(ReportPathFormat format) } void -Sta::setReportPathFieldOrder(const StdStringSeq &field_names) +Sta::setReportPathFieldOrder(const StringSeq &field_names) { report_path_->setReportFieldOrder(field_names); } @@ -3214,7 +3214,7 @@ void EndpointPathEndVisitor::visit(PathEnd *path_end) { if (path_end->minMax(sta_) == min_max_) { - StdStringSeq group_names = PathGroups::pathGroupNames(path_end, sta_); + StringSeq group_names = PathGroups::pathGroupNames(path_end, sta_); for (std::string &group_name : group_names) { if (group_name == path_group_name_) { Slack end_slack = path_end->slack(sta_); diff --git a/spice/WritePathSpice.cc b/spice/WritePathSpice.cc index 28b702f9..77a11723 100644 --- a/spice/WritePathSpice.cc +++ b/spice/WritePathSpice.cc @@ -227,7 +227,7 @@ WritePathSpice::writeHeader() void WritePathSpice::writePrintStmt() { - StdStringSeq node_names; + StringSeq node_names; for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { node_names.push_back(stageDrvrPinName(stage)); node_names.push_back(stageLoadPinName(stage)); diff --git a/spice/WriteSpice.cc b/spice/WriteSpice.cc index ba477444..7d8c7ab8 100644 --- a/spice/WriteSpice.cc +++ b/spice/WriteSpice.cc @@ -151,7 +151,7 @@ WriteSpice::writeHeader(std::string &title, } void -WriteSpice::writePrintStmt(StdStringSeq &node_names) +WriteSpice::writePrintStmt(StringSeq &node_names) { streamPrint(spice_stream_, ".print tran"); if (ckt_sim_ == CircuitSim::xyce) { @@ -176,7 +176,7 @@ WriteSpice::replaceFileExt(std::string filename, // Write gnuplot command file for use with xyce csv file. void -WriteSpice::writeGnuplotFile(StdStringSeq &node_nanes) +WriteSpice::writeGnuplotFile(StringSeq &node_nanes) { std::string gnuplot_filename = replaceFileExt(spice_filename_, "gnuplot"); std::string csv_filename = replaceFileExt(spice_filename_, "csv"); @@ -209,7 +209,7 @@ WriteSpice::writeSubckts(StdStringSet &cell_names) std::string line; while (std::getline(lib_subckts_stream, line)) { // .subckt [args..] - StdStringSeq tokens = parseTokens(line, ' '); + StringSeq tokens = parseTokens(line, ' '); if (tokens.size() >= 2 && stringEqual(tokens[0].c_str(), ".subckt")) { const char *cell_name = tokens[1].c_str(); @@ -256,11 +256,11 @@ WriteSpice::writeSubckts(StdStringSet &cell_names) void WriteSpice::recordSpicePortNames(const char *cell_name, - StdStringSeq &tokens) + StringSeq &tokens) { LibertyCell *cell = network_->findLibertyCell(cell_name); if (cell) { - StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; + StringSeq &spice_port_names = cell_spice_port_names_[cell_name]; for (size_t i = 2; i < tokens.size(); i++) { const char *port_name = tokens[i].c_str(); LibertyPort *port = cell->findLibertyPort(port_name); @@ -285,7 +285,7 @@ WriteSpice::findCellSubckts(StdStringSet &cell_names) std::string line; while (std::getline(lib_subckts_stream, line)) { // .subckt [args..] - StdStringSeq tokens = parseTokens(line, ' '); + StringSeq tokens = parseTokens(line, ' '); if (tokens.size() >= 2 && stringEqual(tokens[0].c_str(), ".subckt")) { const char *cell_name = tokens[1].c_str(); @@ -298,7 +298,7 @@ WriteSpice::findCellSubckts(StdStringSet &cell_names) else { // Process previous statement. if (tolower(stmt[0]) == 'x') { - StdStringSeq tokens = parseTokens(line, ' '); + StringSeq tokens = parseTokens(line, ' '); std::string &subckt_cell = tokens[tokens.size() - 1]; cell_names.insert(subckt_cell); } @@ -323,7 +323,7 @@ WriteSpice::writeSubcktInst(const Instance *inst) const char *inst_name = network_->pathName(inst); LibertyCell *cell = network_->libertyCell(inst); const char *cell_name = cell->name(); - StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; + StringSeq &spice_port_names = cell_spice_port_names_[cell_name]; streamPrint(spice_stream_, "x%s", inst_name); for (std::string subckt_port_name : spice_port_names) { const char *subckt_port_cname = subckt_port_name.c_str(); @@ -351,7 +351,7 @@ WriteSpice::writeSubcktInstVoltSrcs(const Instance *inst, { LibertyCell *cell = network_->libertyCell(inst); const char *cell_name = cell->name(); - StdStringSeq &spice_port_names = cell_spice_port_names_[cell_name]; + StringSeq &spice_port_names = cell_spice_port_names_[cell_name]; const char *inst_name = network_->pathName(inst); debugPrint(debug_, "write_spice", 2, "subckt %s", cell->name()); diff --git a/spice/WriteSpice.hh b/spice/WriteSpice.hh index eb10fcfe..f28513a8 100644 --- a/spice/WriteSpice.hh +++ b/spice/WriteSpice.hh @@ -40,7 +40,7 @@ namespace sta { using ParasiticNodeMap = std::map; -using CellSpicePortNames = std::map; +using CellSpicePortNames = std::map; using LibertyPortLogicValues = std::map; // Utilities for writing a spice deck. @@ -63,12 +63,12 @@ protected: void writeHeader(std::string &title, float max_time, float time_step); - void writePrintStmt(StdStringSeq &node_names); - void writeGnuplotFile(StdStringSeq &node_nanes); + void writePrintStmt(StringSeq &node_names); + void writeGnuplotFile(StringSeq &node_nanes); void writeSubckts(StdStringSet &cell_names); void findCellSubckts(StdStringSet &cell_names); void recordSpicePortNames(const char *cell_name, - StdStringSeq &tokens); + StringSeq &tokens); void writeSubcktInst(const Instance *inst); void writeSubcktInstVoltSrcs(const Instance *inst, LibertyPortLogicValues &port_values, diff --git a/spice/Xyce.cc b/spice/Xyce.cc index a4a0f3b6..500a677b 100644 --- a/spice/Xyce.cc +++ b/spice/Xyce.cc @@ -37,7 +37,7 @@ namespace sta { void readXyceCsv(const char *csv_filename, // Return values. - StdStringSeq &titles, + StringSeq &titles, WaveformSeq &waveforms) { std::ifstream file(csv_filename); diff --git a/spice/Xyce.hh b/spice/Xyce.hh index ce8e5e6c..79db5821 100644 --- a/spice/Xyce.hh +++ b/spice/Xyce.hh @@ -37,7 +37,7 @@ using WaveformSeq = std::vector

; void readXyceCsv(const char *csv_filename, // Return values. - StdStringSeq &titles, + StringSeq &titles, WaveformSeq &waveforms); } // namespace diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index 2c63941e..ec6ed2d5 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -294,16 +294,16 @@ using namespace sta; $1 = tclListSetStdString($input, interp); } -%typemap(in) StdStringSeq { +%typemap(in) StringSeq { $1 = tclListSeqStdString($input, interp); } -%typemap(in) const StdStringSeq & (StdStringSeq seq) { +%typemap(in) const StringSeq & (StringSeq seq) { seq = tclListSeqStdString($input, interp); $1 = &seq; } -%typemap(in) StdStringSeq* { +%typemap(in) StringSeq* { $1 = tclListSeqStdStringPtr($input, interp); } @@ -311,12 +311,12 @@ using namespace sta; $1 = tclListSetStdString($input, interp); } -%typemap(in) StdStringSeq { +%typemap(in) StringSeq { $1 = tclListSeqStdString($input, interp); } -%typemap(out) StdStringSeq { - StdStringSeq &strs = $1; +%typemap(out) StringSeq { + StringSeq &strs = $1; Tcl_Obj *list = Tcl_NewListObj(0, nullptr); for (const std::string &str : strs) { Tcl_Obj *obj = Tcl_NewStringObj(str.c_str(), str.size()); diff --git a/tcl/TclTypeHelpers.cc b/tcl/TclTypeHelpers.cc index 36e606fa..733b0b41 100644 --- a/tcl/TclTypeHelpers.cc +++ b/tcl/TclTypeHelpers.cc @@ -30,14 +30,14 @@ namespace sta { -StdStringSeq +StringSeq tclListSeqStdString(Tcl_Obj *const source, Tcl_Interp *interp) { Tcl_Size argc; Tcl_Obj **argv; - StdStringSeq seq; + StringSeq seq; if (Tcl_ListObjGetElements(interp, source, &argc, &argv) == TCL_OK) { for (int i = 0; i < argc; i++) { int length; @@ -48,7 +48,7 @@ tclListSeqStdString(Tcl_Obj *const source, return seq; } -StdStringSeq * +StringSeq * tclListSeqStdStringPtr(Tcl_Obj *const source, Tcl_Interp *interp) { @@ -56,7 +56,7 @@ tclListSeqStdStringPtr(Tcl_Obj *const source, Tcl_Obj **argv; if (Tcl_ListObjGetElements(interp, source, &argc, &argv) == TCL_OK) { - StdStringSeq *seq = new StdStringSeq; + StringSeq *seq = new StringSeq; for (int i = 0; i < argc; i++) { int length; const char *str = Tcl_GetStringFromObj(argv[i], &length); diff --git a/util/StringUtil.cc b/util/StringUtil.cc index 991d25db..2b93704c 100644 --- a/util/StringUtil.cc +++ b/util/StringUtil.cc @@ -265,11 +265,11 @@ trimRight(std::string &str) str.erase(str.find_last_not_of(" ") + 1); } -StdStringSeq +StringSeq split(const std::string &text, const std::string &delims) { - StdStringSeq tokens; + StringSeq tokens; auto start = text.find_first_not_of(delims); auto end = text.find_first_of(delims, start); while (end != std::string::npos) { @@ -283,11 +283,11 @@ split(const std::string &text, } // Parse space separated tokens. -StdStringSeq +StringSeq parseTokens(const std::string &s, const char delimiter) { - StdStringSeq tokens; + StringSeq tokens; size_t i = 0; while (i < s.size()) { while (i < s.size() && std::isspace(s[i])) diff --git a/verilog/VerilogReader.cc b/verilog/VerilogReader.cc index 72a49a4b..334633da 100644 --- a/verilog/VerilogReader.cc +++ b/verilog/VerilogReader.cc @@ -535,7 +535,7 @@ VerilogReader::makeModuleInst(const std::string *module_vname, if (liberty_cell && hasScalarNamedPortRefs(liberty_cell, pins)) { const int port_count = liberty_cell->portBitCount(); - StdStringSeq net_names(port_count); + StringSeq net_names(port_count); for (VerilogNet *vnet : *pins) { VerilogNetPortRefScalarNet *vpin = dynamic_cast(vnet); @@ -953,7 +953,7 @@ VerilogModuleInst::namedPins() VerilogLibertyInst::VerilogLibertyInst(LibertyCell *cell, const std::string &inst_name, - const StdStringSeq &net_names, + const StringSeq &net_names, VerilogAttrStmtSeq *attr_stmts, const int line) : VerilogInst(inst_name, attr_stmts, line), @@ -2008,7 +2008,7 @@ VerilogReader::makeLibertyInst(VerilogLibertyInst *lib_inst, network_->setAttribute(inst, entry->key(), entry->value()); } } - const StdStringSeq &net_names = lib_inst->netNames(); + const StringSeq &net_names = lib_inst->netNames(); LibertyCellPortBitIterator port_iter(lib_cell); while (port_iter.hasNext()) { LibertyPort *port = port_iter.next(); diff --git a/verilog/VerilogReaderPvt.hh b/verilog/VerilogReaderPvt.hh index 9f1fdffe..59c242e6 100644 --- a/verilog/VerilogReaderPvt.hh +++ b/verilog/VerilogReaderPvt.hh @@ -216,16 +216,16 @@ class VerilogLibertyInst : public VerilogInst public: VerilogLibertyInst(LibertyCell *cell, const std::string &inst_name, - const StdStringSeq &net_names, + const StringSeq &net_names, VerilogAttrStmtSeq *attr_stmts, const int line); virtual bool isLibertyInst() const { return true; } LibertyCell *cell() const { return cell_; } - const StdStringSeq &netNames() const { return net_names_; } + const StringSeq &netNames() const { return net_names_; } private: LibertyCell *cell_; - StdStringSeq net_names_; + StringSeq net_names_; }; // Abstract base class for nets. From 28d94b83faf9bf77826d3c7e85e36f80561a5640 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 15:55:12 -0700 Subject: [PATCH 55/59] StdStringSet -> StringSet Signed-off-by: James Cherry --- include/sta/PathGroup.hh | 4 ++-- include/sta/StringUtil.hh | 2 +- include/sta/TclTypeHelpers.hh | 2 +- include/sta/VerilogReader.hh | 2 +- search/PathGroup.cc | 6 +++--- search/Sta.cc | 2 +- spice/WritePathSpice.cc | 10 +++++----- spice/WriteSpice.cc | 4 ++-- spice/WriteSpice.hh | 4 ++-- tcl/StaTclTypes.i | 4 ++-- tcl/TclTypeHelpers.cc | 4 ++-- verilog/VerilogReader.cc | 8 ++++---- verilog/VerilogReaderPvt.hh | 2 +- 13 files changed, 27 insertions(+), 27 deletions(-) diff --git a/include/sta/PathGroup.hh b/include/sta/PathGroup.hh index df0c5ca7..4d6d90dd 100644 --- a/include/sta/PathGroup.hh +++ b/include/sta/PathGroup.hh @@ -184,14 +184,14 @@ protected: bool unique_edges, float slack_min, float slack_max, - StdStringSet &group_names, + StringSet &group_names, bool setup_hold, bool async, bool gated_clk, bool unconstrained, const MinMax *min_max); bool reportGroup(const char *group_name, - StdStringSet &group_names) const; + StringSet &group_names) const; static GroupPath *groupPathTo(const PathEnd *path_end, const StaState *sta); StringSeq pathGroupNames(); diff --git a/include/sta/StringUtil.hh b/include/sta/StringUtil.hh index d237e9c3..b12ae00d 100644 --- a/include/sta/StringUtil.hh +++ b/include/sta/StringUtil.hh @@ -35,7 +35,7 @@ namespace sta { using StringSeq = std::vector; -using StdStringSet = std::set; +using StringSet = std::set; inline bool stringEq(const char *str1, diff --git a/include/sta/TclTypeHelpers.hh b/include/sta/TclTypeHelpers.hh index 08aa291b..a551c584 100644 --- a/include/sta/TclTypeHelpers.hh +++ b/include/sta/TclTypeHelpers.hh @@ -39,7 +39,7 @@ tclListSeqStdString(Tcl_Obj *const source, StringSeq * tclListSeqStdStringPtr(Tcl_Obj *const source, Tcl_Interp *interp); -StdStringSet * +StringSet * tclListSetStdString(Tcl_Obj *const source, Tcl_Interp *interp); diff --git a/include/sta/VerilogReader.hh b/include/sta/VerilogReader.hh index cf1dab95..e3aa94fa 100644 --- a/include/sta/VerilogReader.hh +++ b/include/sta/VerilogReader.hh @@ -173,7 +173,7 @@ protected: void makeNamedPortRefCellPorts(Cell *cell, VerilogModule *module, VerilogNet *mod_port, - StdStringSet &port_names); + StringSet &port_names); void checkModuleDcls(VerilogModule *module, std::set &port_names); void makeModuleInstBody(VerilogModule *module, diff --git a/search/PathGroup.cc b/search/PathGroup.cc index 5f4ce29a..794d2c6e 100644 --- a/search/PathGroup.cc +++ b/search/PathGroup.cc @@ -276,7 +276,7 @@ PathGroups::PathGroups(int group_path_count, slack_min_(slack_min), slack_max_(slack_max) { - StdStringSet groups; + StringSet groups; for (std::string &group_name : group_names) groups.insert(group_name); @@ -297,7 +297,7 @@ PathGroups::makeGroups(int group_path_count, bool unique_edges, float slack_min, float slack_max, - StdStringSet &group_names, + StringSet &group_names, bool setup_hold, bool async, bool gated_clk, @@ -417,7 +417,7 @@ PathGroups::findPathGroup(const Clock *clock, bool PathGroups::reportGroup(const char *group_name, - StdStringSet &group_names) const + StringSet &group_names) const { return group_names.empty() || group_names.contains(group_name); diff --git a/search/Sta.cc b/search/Sta.cc index f9134175..a6c43071 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -2601,7 +2601,7 @@ Sta::updateSceneLiberty(Scene *scene, const StringSeq &liberty_min_files, const StringSeq &liberty_max_files) { - StdStringSet warned_files; + StringSet warned_files; for (const MinMax *min_max : MinMax::range()) { const StringSeq &liberty_files = min_max == MinMax::min() ? liberty_min_files diff --git a/spice/WritePathSpice.cc b/spice/WritePathSpice.cc index 77a11723..6c7034be 100644 --- a/spice/WritePathSpice.cc +++ b/spice/WritePathSpice.cc @@ -80,8 +80,8 @@ private: void writeGateStage(Stage stage); void writeStageParasitics(Stage stage); void writeSubckts(); - StdStringSet findPathCellNames(); - void findPathCellSubckts(StdStringSet &path_cell_names); + StringSet findPathCellNames(); + void findPathCellSubckts(StringSet &path_cell_names); float maxTime(); float pathMaxTime(); void writeMeasureDelayStmt(Stage stage, @@ -562,14 +562,14 @@ WritePathSpice::writeStageParasitics(Stage stage) void WritePathSpice::writeSubckts() { - StdStringSet cell_names = findPathCellNames(); + StringSet cell_names = findPathCellNames(); writeSubckts(cell_names); } -StdStringSet +StringSet WritePathSpice::findPathCellNames() { - StdStringSet path_cell_names; + StringSet path_cell_names; for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { const TimingArc *arc = stageGateArc(stage); if (arc) { diff --git a/spice/WriteSpice.cc b/spice/WriteSpice.cc index 7d8c7ab8..1e5cfb12 100644 --- a/spice/WriteSpice.cc +++ b/spice/WriteSpice.cc @@ -199,7 +199,7 @@ WriteSpice::writeGnuplotFile(StringSeq &node_nanes) } void -WriteSpice::writeSubckts(StdStringSet &cell_names) +WriteSpice::writeSubckts(StringSet &cell_names) { findCellSubckts(cell_names); std::ifstream lib_subckts_stream(lib_subckt_filename_); @@ -278,7 +278,7 @@ WriteSpice::recordSpicePortNames(const char *cell_name, // Subckts can call subckts (asap7). void -WriteSpice::findCellSubckts(StdStringSet &cell_names) +WriteSpice::findCellSubckts(StringSet &cell_names) { std::ifstream lib_subckts_stream(lib_subckt_filename_); if (lib_subckts_stream.is_open()) { diff --git a/spice/WriteSpice.hh b/spice/WriteSpice.hh index f28513a8..b728d154 100644 --- a/spice/WriteSpice.hh +++ b/spice/WriteSpice.hh @@ -65,8 +65,8 @@ protected: float time_step); void writePrintStmt(StringSeq &node_names); void writeGnuplotFile(StringSeq &node_nanes); - void writeSubckts(StdStringSet &cell_names); - void findCellSubckts(StdStringSet &cell_names); + void writeSubckts(StringSet &cell_names); + void findCellSubckts(StringSet &cell_names); void recordSpicePortNames(const char *cell_name, StringSeq &tokens); void writeSubcktInst(const Instance *inst); diff --git a/tcl/StaTclTypes.i b/tcl/StaTclTypes.i index ec6ed2d5..f8de82fd 100644 --- a/tcl/StaTclTypes.i +++ b/tcl/StaTclTypes.i @@ -290,7 +290,7 @@ using namespace sta; Tcl_SetResult(interp, nullptr, TCL_STATIC); } -%typemap(in) StdStringSet* { +%typemap(in) StringSet* { $1 = tclListSetStdString($input, interp); } @@ -307,7 +307,7 @@ using namespace sta; $1 = tclListSeqStdStringPtr($input, interp); } -%typemap(in) StdStringSet* { +%typemap(in) StringSet* { $1 = tclListSetStdString($input, interp); } diff --git a/tcl/TclTypeHelpers.cc b/tcl/TclTypeHelpers.cc index 733b0b41..48104690 100644 --- a/tcl/TclTypeHelpers.cc +++ b/tcl/TclTypeHelpers.cc @@ -68,7 +68,7 @@ tclListSeqStdStringPtr(Tcl_Obj *const source, return nullptr; } -StdStringSet * +StringSet * tclListSetStdString(Tcl_Obj *const source, Tcl_Interp *interp) { @@ -76,7 +76,7 @@ tclListSetStdString(Tcl_Obj *const source, Tcl_Obj **argv; if (Tcl_ListObjGetElements(interp, source, &argc, &argv) == TCL_OK) { - StdStringSet *set = new StdStringSet; + StringSet *set = new StringSet; for (int i = 0; i < argc; i++) { int length; const char *str = Tcl_GetStringFromObj(argv[i], &length); diff --git a/verilog/VerilogReader.cc b/verilog/VerilogReader.cc index 334633da..de6099a5 100644 --- a/verilog/VerilogReader.cc +++ b/verilog/VerilogReader.cc @@ -285,7 +285,7 @@ VerilogReader::makeCellPorts(Cell *cell, VerilogModule *module, VerilogNetSeq *ports) { - StdStringSet port_names; + StringSet port_names; for (VerilogNet *mod_port : *ports) { const std::string &port_name = mod_port->name(); if (!port_names.contains(port_name)) { @@ -335,7 +335,7 @@ void VerilogReader::makeNamedPortRefCellPorts(Cell *cell, VerilogModule *module, VerilogNet *mod_port, - StdStringSet &port_names) + StringSet &port_names) { PortSeq *member_ports = new PortSeq; VerilogNetNameIterator *net_name_iter = mod_port->nameIterator(module,this); @@ -805,7 +805,7 @@ VerilogModule::~VerilogModule() void VerilogModule::parseStmts(VerilogReader *reader) { - StdStringSet inst_names; + StringSet inst_names; for (VerilogStmt *stmt : *stmts_) { if (stmt->isDeclaration()) parseDcl(dynamic_cast(stmt), reader); @@ -861,7 +861,7 @@ VerilogModule::parseDcl(VerilogDcl *dcl, // expansion so errors are only reported once. void VerilogModule::checkInstanceName(VerilogInst *inst, - StdStringSet &inst_names, + StringSet &inst_names, VerilogReader *reader) { std::string inst_name = inst->instanceName(); diff --git a/verilog/VerilogReaderPvt.hh b/verilog/VerilogReaderPvt.hh index 59c242e6..23f24305 100644 --- a/verilog/VerilogReaderPvt.hh +++ b/verilog/VerilogReaderPvt.hh @@ -75,7 +75,7 @@ public: private: void parseStmts(VerilogReader *reader); void checkInstanceName(VerilogInst *inst, - StdStringSet &inst_names, + StringSet &inst_names, VerilogReader *reader); std::string name_; From d99cdd11dee1c6d5158585cab1af68d89c68a51c Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 16:10:24 -0700 Subject: [PATCH 56/59] Sta::makeCheckTiming Signed-off-by: James Cherry --- search/Sta.cc | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/search/Sta.cc b/search/Sta.cc index a6c43071..a83835b1 100644 --- a/search/Sta.cc +++ b/search/Sta.cc @@ -299,6 +299,7 @@ Sta::makeComponents() makeReportPath(); makePower(); makeClkSkews(); + makeCheckTiming(); setCmdNamespace1(CmdNamespace::sdc); setThreadCount1(defaultThreadCount()); @@ -355,8 +356,7 @@ Sta::updateComponentsState() latches_->copyState(this); graph_delay_calc_->copyState(this); report_path_->copyState(this); - if (check_timing_) - check_timing_->copyState(this); + check_timing_->copyState(this); clk_skews_->copyState(this); if (power_) @@ -2224,8 +2224,6 @@ Sta::checkTiming(const Mode *mode, mode->sim()->ensureConstantsPropagated(); mode->clkNetwork()->ensureClkNetwork(); } - if (check_timing_ == nullptr) - makeCheckTiming(); return check_timing_->check(mode, no_input_delay, no_output_delay, reg_multiple_clks, reg_no_clks, unconstrained_endpoints, From 28b9401e31ee8d56678dc19383850976d95c8f36 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 16:15:24 -0700 Subject: [PATCH 57/59] const Signed-off-by: James Cherry --- dcalc/GraphDelayCalc.cc | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/dcalc/GraphDelayCalc.cc b/dcalc/GraphDelayCalc.cc index 06962c78..8bc0765e 100644 --- a/dcalc/GraphDelayCalc.cc +++ b/dcalc/GraphDelayCalc.cc @@ -1114,8 +1114,7 @@ GraphDelayCalc::makeArcDcalcArgs(Vertex *drvr_vertex, const Pin *from_pin = from_vertex->pin(); const RiseFall *from_rf = arc1->fromEdge()->asRiseFall(); const RiseFall *drvr_rf = arc1->toEdge()->asRiseFall(); - Slew in_slew = edgeFromSlew(from_vertex, from_rf, edge1, scene, min_max); - in_slew = edgeFromSlew(from_vertex, from_rf, edge1, scene, min_max); + const Slew in_slew = edgeFromSlew(from_vertex, from_rf, edge1, scene, min_max); const Pin *drvr_pin1 = drvr_vertex1->pin(); float load_cap; @@ -1694,7 +1693,7 @@ GraphDelayCalc::reportDelayCalc(const Edge *edge, related_out_cap, scene, min_max, digits); } else { - const Slew &from_slew = edgeFromSlew(from_vertex, from_rf, edge, scene, min_max); + const Slew from_slew = edgeFromSlew(from_vertex, from_rf, edge, scene, min_max); const Parasitic *to_parasitic; float load_cap; parasiticLoad(to_pin, to_rf, scene, min_max, nullptr, arc_delay_calc_, From 9b2bdf85e10e5f4b807fcd4951f4efc098f6311f Mon Sep 17 00:00:00 2001 From: James Cherry Date: Sun, 8 Mar 2026 16:39:48 -0700 Subject: [PATCH 58/59] PathGroup::name std::string Signed-off-by: James Cherry --- include/sta/PathGroup.hh | 2 +- search/ReportPath.cc | 20 +++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/include/sta/PathGroup.hh b/include/sta/PathGroup.hh index 4d6d90dd..58bb84d9 100644 --- a/include/sta/PathGroup.hh +++ b/include/sta/PathGroup.hh @@ -66,7 +66,7 @@ public: float min_slack, float max_slack, const StaState *sta); - const char *name() const { return name_.c_str(); } + const std::string &name() const { return name_; } const MinMax *minMax() const { return min_max_;} const PathEndSeq &pathEnds() const { return path_ends_; } void insert(PathEnd *path_end); diff --git a/search/ReportPath.cc b/search/ReportPath.cc index 33fb3689..bf6d83fe 100644 --- a/search/ReportPath.cc +++ b/search/ReportPath.cc @@ -406,7 +406,7 @@ ReportPath::reportEndpointHeader(const PathEnd *end, : "max_delay/setup"; report_->reportLine("%s group %s", setup_hold, - group->name()); + group->name().c_str()); reportBlankLine(); reportEndHeader(); } @@ -1079,11 +1079,17 @@ ReportPath::reportJson(const PathEnd *end, { std::string result; result += "{\n"; - stringAppend(result, " \"type\": \"%s\",\n", end->typeName()); - stringAppend(result, " \"path_group\": \"%s\",\n", - end->pathGroup()->name()); - stringAppend(result, " \"path_type\": \"%s\",\n", - end->minMax(this)->to_string().c_str()); + result += " \"type\": \""; + result += end->typeName(); + result += "\",\n"; + + result += " \"path_group\": \""; + result += end->pathGroup()->name(); + result += "\",\n"; + + result += " \"path_type\": \""; + result += end->minMax(this)->to_string(); + result += "\",\n"; PathExpanded expanded(end->path(), this); const Pin *startpoint = expanded.startPath()->vertex(this)->pin(); @@ -1269,7 +1275,7 @@ ReportPath::reportSlackOnly(const PathEnd *end) const { std::string line; const EarlyLate *early_late = end->pathEarlyLate(this); - reportDescription(end->pathGroup()->name(), line); + reportDescription(end->pathGroup()->name().c_str(), line); if (end->isUnconstrained()) reportSpaceFieldDelay(end->dataArrivalTimeOffset(this), early_late, line); else From f1b33edd98f4f89c418e839d8bc5ee097b82d385 Mon Sep 17 00:00:00 2001 From: James Cherry Date: Mon, 9 Mar 2026 10:15:53 -0700 Subject: [PATCH 59/59] PathGroup use BoundedHeap Signed-off-by: James Cherry --- include/sta/BoundedHeap.hh | 15 ++--- include/sta/PathEnd.hh | 12 +++- include/sta/PathGroup.hh | 24 +++---- include/sta/Search.hh | 4 +- search/PathEnd.cc | 38 ++++++----- search/PathEnum.cc | 2 +- search/PathGroup.cc | 125 +++++++++++-------------------------- search/Search.cc | 4 +- 8 files changed, 91 insertions(+), 133 deletions(-) diff --git a/include/sta/BoundedHeap.hh b/include/sta/BoundedHeap.hh index 45bfdeed..af934e0c 100644 --- a/include/sta/BoundedHeap.hh +++ b/include/sta/BoundedHeap.hh @@ -60,7 +60,6 @@ public: comp_(comp), min_heap_comp_(comp) { - heap_.reserve(max_size); } // Copy constructor @@ -107,7 +106,12 @@ public: setMaxSize(size_t max_size) { max_size_ = max_size; - heap_.reserve(max_size); + } + + void + reserve(size_t size) + { + heap_.reserve(size); } // Insert an element into the heap. @@ -172,8 +176,6 @@ public: { // Convert heap to sorted vector (best to worst) std::sort_heap(heap_.begin(), heap_.end(), min_heap_comp_); - // Reverse to get best first (according to user's comparison) - std::reverse(heap_.begin(), heap_.end()); std::vector result = std::move(heap_); heap_.clear(); return result; @@ -181,11 +183,10 @@ public: // Extract all elements sorted from best to worst (const version). // Creates a copy since we can't modify the heap. - std::vector extract() const + std::vector contents() const { std::vector temp_heap = heap_; std::sort_heap(temp_heap.begin(), temp_heap.end(), min_heap_comp_); - std::reverse(temp_heap.begin(), temp_heap.end()); return temp_heap; } @@ -245,7 +246,7 @@ private: Compare comp_; explicit MinHeapCompare(const Compare& c) : comp_(c) {} bool operator()(const T& a, const T& b) const { - return comp_(b, a); // Inverted: worst is at root + return comp_(a, b); // comp = less puts largest at root (worst) } }; diff --git a/include/sta/PathEnd.hh b/include/sta/PathEnd.hh index 4f974f3f..ee8deb39 100644 --- a/include/sta/PathEnd.hh +++ b/include/sta/PathEnd.hh @@ -153,9 +153,13 @@ public: static bool less(const PathEnd *path_end1, const PathEnd *path_end2, + // Compare slack (if constrained), or arrival when false. + bool cmp_slack, const StaState *sta); static int cmp(const PathEnd *path_end1, const PathEnd *path_end2, + // Compare slack (if constrained), or arrival when false. + bool cmp_slack, const StaState *sta); static int cmpSlack(const PathEnd *path_end1, const PathEnd *path_end2, @@ -611,11 +615,13 @@ protected: class PathEndLess { public: - PathEndLess(const StaState *sta); + PathEndLess(bool cmp_slack, + const StaState *sta); bool operator()(const PathEnd *path_end1, const PathEnd *path_end2) const; protected: + bool cmp_slack_; const StaState *sta_; }; @@ -623,11 +629,13 @@ protected: class PathEndSlackLess { public: - PathEndSlackLess(const StaState *sta); + PathEndSlackLess(bool cmp_slack, + const StaState *sta); bool operator()(const PathEnd *path_end1, const PathEnd *path_end2) const; protected: + bool cmp_slack_; const StaState *sta_; }; diff --git a/include/sta/PathGroup.hh b/include/sta/PathGroup.hh index 58bb84d9..03bcb0c5 100644 --- a/include/sta/PathGroup.hh +++ b/include/sta/PathGroup.hh @@ -29,10 +29,12 @@ #include #include +#include "BoundedHeap.hh" #include "SdcClass.hh" #include "StaState.hh" #include "SearchClass.hh" #include "StringUtil.hh" +#include "PathEnd.hh" namespace sta { @@ -48,7 +50,6 @@ using PathGroupSeq = std::vector; class PathGroup { public: - ~PathGroup(); // Path group that compares compare slacks. static PathGroup *makePathGroupArrival(const char *name, int group_path_count, @@ -68,7 +69,7 @@ public: const StaState *sta); const std::string &name() const { return name_; } const MinMax *minMax() const { return min_max_;} - const PathEndSeq &pathEnds() const { return path_ends_; } + PathEndSeq pathEnds() const; void insert(PathEnd *path_end); // Push group_path_count into path_ends. void pushEnds(PathEndSeq &path_ends); @@ -76,15 +77,14 @@ public: bool saveable(PathEnd *path_end); bool enumMinSlackUnderMin(PathEnd *path_end); int maxPaths() const { return group_path_count_; } - PathEndSeq &pathEnds() { return path_ends_; } // This does NOT delete the path ends. void clear(); - static size_t group_path_count_max; + static int group_path_count_max; protected: PathGroup(const char *name, - size_t group_path_count, - size_t endpoint_path_count, + int group_path_count, + int endpoint_path_count, bool unique_pins, bool unique_edges, float min_slack, @@ -92,21 +92,17 @@ protected: bool cmp_slack, const MinMax *min_max, const StaState *sta); - void ensureSortedMaxPaths(); - void prune(); - void sort(); std::string name_; - size_t group_path_count_; - size_t endpoint_path_count_; + int group_path_count_; + int endpoint_path_count_; bool unique_pins_; bool unique_edges_; float slack_min_; float slack_max_; - PathEndSeq path_ends_; const MinMax *min_max_; - bool compare_slack_; - float threshold_; + bool cmp_slack_; + BoundedHeap heap_; std::mutex lock_; const StaState *sta_; }; diff --git a/include/sta/Search.hh b/include/sta/Search.hh index bc516502..ba4f8d0d 100644 --- a/include/sta/Search.hh +++ b/include/sta/Search.hh @@ -100,8 +100,8 @@ public: bool unconstrained, const SceneSeq &scenes, const MinMaxAll *min_max, - size_t group_path_count, - size_t endpoint_path_count, + int group_path_count, + int endpoint_path_count, bool unique_pins, bool unique_edges, float slack_min, diff --git a/search/PathEnd.cc b/search/PathEnd.cc index 7e72e6fb..33b6e1cd 100644 --- a/search/PathEnd.cc +++ b/search/PathEnd.cc @@ -2030,32 +2030,22 @@ PathEndPathDelay::exceptPathCmp(const PathEnd *path_end, //////////////////////////////////////////////////////////////// -PathEndLess::PathEndLess(const StaState *sta) : - sta_(sta) -{ -} - -bool -PathEndLess::operator()(const PathEnd *path_end1, - const PathEnd *path_end2) const -{ - return PathEnd::less(path_end1, path_end2, sta_); -} - bool PathEnd::less(const PathEnd *path_end1, const PathEnd *path_end2, + bool cmp_slack, const StaState *sta) { - return cmp(path_end1, path_end2, sta) < 0; + return cmp(path_end1, path_end2, cmp_slack, sta) < 0; } int PathEnd::cmp(const PathEnd *path_end1, const PathEnd *path_end2, + bool cmp_slack, const StaState *sta) { - int cmp = path_end1->isUnconstrained() + int cmp = !cmp_slack || path_end1->isUnconstrained() ? -cmpArrival(path_end1, path_end2, sta) : cmpSlack(path_end1, path_end2, sta); if (cmp == 0) { @@ -2139,7 +2129,25 @@ PathEnd::cmpNoCrpr(const PathEnd *path_end1, //////////////////////////////////////////////////////////////// -PathEndSlackLess::PathEndSlackLess(const StaState *sta) : +PathEndLess::PathEndLess(bool cmp_slack, + const StaState *sta) : + cmp_slack_(cmp_slack), + sta_(sta) +{ +} + +bool +PathEndLess::operator()(const PathEnd *path_end1, + const PathEnd *path_end2) const +{ + return PathEnd::less(path_end1, path_end2, cmp_slack_, sta_); +} + +//////////////////////////////////////////////////////////////// + +PathEndSlackLess::PathEndSlackLess(bool cmp_slack, + const StaState *sta) : + cmp_slack_(cmp_slack), sta_(sta) { } diff --git a/search/PathEnum.cc b/search/PathEnum.cc index 8cc8c9c9..67465a1b 100644 --- a/search/PathEnum.cc +++ b/search/PathEnum.cc @@ -91,7 +91,7 @@ DiversionGreater::operator()(Diversion *div1, { PathEnd *path_end1 = div1->pathEnd(); PathEnd *path_end2 = div2->pathEnd(); - return PathEnd::cmp(path_end1, path_end2, sta_) > 0; + return PathEnd::cmp(path_end1, path_end2, true, sta_) > 0; } static void diff --git a/search/PathGroup.cc b/search/PathGroup.cc index 794d2c6e..8f3738c6 100644 --- a/search/PathGroup.cc +++ b/search/PathGroup.cc @@ -50,7 +50,7 @@ namespace sta { -size_t PathGroup::group_path_count_max = std::numeric_limits::max(); +int PathGroup::group_path_count_max = std::numeric_limits::max(); PathGroup * PathGroup::makePathGroupSlack(const char *name, @@ -82,8 +82,8 @@ PathGroup::makePathGroupArrival(const char *name, } PathGroup::PathGroup(const char *name, - size_t group_path_count, - size_t endpoint_path_count, + int group_path_count, + int endpoint_path_count, bool unique_pins, bool unique_edges, float slack_min, @@ -99,43 +99,36 @@ PathGroup::PathGroup(const char *name, slack_min_(slack_min), slack_max_(slack_max), min_max_(min_max), - compare_slack_(cmp_slack), - threshold_(min_max->initValue()), + cmp_slack_(cmp_slack), + heap_(group_path_count, PathEndLess(cmp_slack, sta)), sta_(sta) { } -PathGroup::~PathGroup() +PathEndSeq +PathGroup::pathEnds() const { - deleteContents(path_ends_); + return heap_.contents(); } bool PathGroup::saveable(PathEnd *path_end) { - float threshold; - { - LockGuard lock(lock_); - threshold = threshold_; - } - if (compare_slack_) { + if (cmp_slack_) { // Crpr increases the slack, so check the slack // without crpr first because it is expensive to find. Slack slack = path_end->slackNoCrpr(sta_); if (!delayIsInitValue(slack, min_max_) - && delayLessEqual(slack, threshold, sta_) && delayLessEqual(slack, slack_max_, sta_)) { // Now check with crpr. slack = path_end->slack(sta_); - return delayLessEqual(slack, threshold, sta_) - && delayLessEqual(slack, slack_max_, sta_) + return delayLessEqual(slack, slack_max_, sta_) && delayGreaterEqual(slack, slack_min_, sta_); } } else { const Arrival &arrival = path_end->dataArrivalTime(sta_); - return !delayIsInitValue(arrival, min_max_) - && delayGreaterEqual(arrival, threshold, min_max_, sta_); + return !delayIsInitValue(arrival, min_max_); } return false; } @@ -148,7 +141,7 @@ PathGroup::saveable(PathEnd *path_end) bool PathGroup::enumMinSlackUnderMin(PathEnd *path_end) { - if (compare_slack_ + if (cmp_slack_ && endpoint_path_count_ > 1 && slack_min_ > -INF) { const Path *path = path_end->path(); @@ -177,72 +170,28 @@ void PathGroup::insert(PathEnd *path_end) { LockGuard lock(lock_); - path_ends_.push_back(path_end); + heap_.insert(path_end); path_end->setPathGroup(this); - if (group_path_count_ != group_path_count_max - && path_ends_.size() > group_path_count_ * 2) - prune(); -} - -void -PathGroup::prune() -{ - sort(); - VertexPathCountMap path_counts; - size_t end_count = 0; - for (unsigned i = 0; i < path_ends_.size(); i++) { - PathEnd *path_end = path_ends_[i]; - Vertex *vertex = path_end->vertex(sta_); - // Squish up to endpoint_path_count path ends per vertex - // up to the front of path_ends_. - if (end_count < group_path_count_ - && path_counts[vertex] < endpoint_path_count_) { - path_ends_[end_count++] = path_end; - path_counts[vertex]++; - } - else - delete path_end; - } - path_ends_.resize(end_count); - - // Set a threshold to the bottom of the sorted list that future - // inserts need to beat. - PathEnd *last_end = path_ends_[end_count - 1]; - if (compare_slack_) - threshold_ = delayAsFloat(last_end->slack(sta_)); - else - threshold_ = delayAsFloat(last_end->dataArrivalTime(sta_)); } void PathGroup::pushEnds(PathEndSeq &path_ends) { - ensureSortedMaxPaths(); - for (PathEnd *path_end : path_ends_) - path_ends.push_back(path_end); -} - -void -PathGroup::ensureSortedMaxPaths() -{ - if (path_ends_.size() > group_path_count_) - prune(); - else - sort(); -} - -void -PathGroup::sort() -{ - sta::sort(path_ends_, PathEndLess(sta_)); + if (!heap_.empty()) { + PathEndSeq ends = heap_.extract(); + path_ends.reserve(path_ends.size() + ends.size()); + // Append heap path ends to path_ends. + path_ends.insert(path_ends.end(), + std::make_move_iterator(ends.begin()), + std::make_move_iterator(ends.end())); + } } void PathGroup::clear() { LockGuard lock(lock_); - threshold_ = min_max_->initValue(); - path_ends_.clear(); + heap_.clear(); } //////////////////////////////////////////////////////////////// @@ -632,9 +581,8 @@ PathGroups::makePathEnds(ExceptionTo *to, unique_pins_, unique_edges_, scenes, min_max); pushEnds(path_ends); - if (sort_by_slack) { - sort(path_ends, PathEndLess(this)); - } + if (sort_by_slack) + sort(path_ends, PathEndLess(true, this)); if (unconstrained_paths && path_ends.empty()) @@ -663,12 +611,12 @@ private: PathGroups *path_groups_; PathGroupEndMap ends_; - PathEndLess cmp_; + PathEndLess less_; }; MakePathEnds1::MakePathEnds1(PathGroups *path_groups) : path_groups_(path_groups), - cmp_(path_groups) + less_(true, path_groups) { } @@ -693,7 +641,7 @@ MakePathEnds1::visitPathEnd(PathEnd *path_end, // Only keep the path end with the smallest slack/latest arrival. PathEnd *worst_end = findKey(ends_, group); if (worst_end) { - if (cmp_(path_end, worst_end)) { + if (less_(path_end, worst_end)) { ends_[group] = path_end->copy(); delete worst_end; } @@ -741,8 +689,8 @@ private: PathGroups *path_groups_; const StaState *sta_; PathGroupEndsMap ends_; - PathEndSlackLess slack_cmp_; - PathEndNoCrprLess path_no_crpr_cmp_; + PathEndSlackLess less_; + PathEndNoCrprLess path_no_crpr_less_; }; MakePathEndsAll::MakePathEndsAll(int endpoint_path_count, @@ -750,8 +698,8 @@ MakePathEndsAll::MakePathEndsAll(int endpoint_path_count, endpoint_path_count_(endpoint_path_count), path_groups_(path_groups), sta_(path_groups), - slack_cmp_(path_groups), - path_no_crpr_cmp_(path_groups) + less_(true, path_groups), + path_no_crpr_less_(path_groups) { } @@ -792,8 +740,8 @@ MakePathEndsAll::vertexEnd(Vertex *) Debug *debug = sta_->debug(); for (auto [group, ends] : ends_) { if (ends) { - sort(ends, slack_cmp_); - PathEndNoCrprSet unique_ends(path_no_crpr_cmp_); + sort(ends, less_); + PathEndNoCrprSet unique_ends(path_no_crpr_less_); auto end_iter = ends->begin(); int n = 0; while (end_iter != ends->end() @@ -898,11 +846,8 @@ PathGroups::enumPathEnds(PathGroup *group, // enumerator. PathEnum path_enum(group_path_count, endpoint_path_count, unique_pins, unique_edges, cmp_slack, this); - for (PathEnd *end : group->pathEnds()) { - if (group->saveable(end) - || group->enumMinSlackUnderMin(end)) - path_enum.insert(end); - } + for (PathEnd *end : group->pathEnds()) + path_enum.insert(end); group->clear(); // Parallel path enumeratation to find the endpoint_path_count/max path ends. diff --git a/search/Search.cc b/search/Search.cc index c7cc2a58..871b0e0d 100644 --- a/search/Search.cc +++ b/search/Search.cc @@ -497,8 +497,8 @@ Search::findPathEnds(ExceptionFrom *from, bool unconstrained, const SceneSeq &scenes, const MinMaxAll *min_max, - size_t group_path_count, - size_t endpoint_path_count, + int group_path_count, + int endpoint_path_count, bool unique_pins, bool unique_edges, float slack_min,