Files
OpenSTA/search/ReportPath.hh
T

562 lines
23 KiB
C++
Raw Normal View History

2018-09-28 08:54:21 -07:00
// OpenSTA, Static Timing Analyzer
2026-03-10 13:21:17 -07:00
// Copyright (c) 2026, Parallax Software, Inc.
2018-09-28 08:54:21 -07:00
//
// 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
2022-01-04 10:17:08 -07:00
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2018-09-28 08:54:21 -07:00
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
2022-01-04 10:17:08 -07:00
// along with this program. If not, see <https://www.gnu.org/licenses/>.
2025-01-21 18:54:33 -07:00
//
// 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.
2018-09-28 08:54:21 -07:00
2020-02-15 17:13:16 -07:00
#pragma once
2018-09-28 08:54:21 -07:00
2026-04-13 14:58:16 -07:00
#include <cstddef>
2026-05-12 11:24:24 -07:00
#include <map>
2018-09-28 08:54:21 -07:00
#include <string>
2026-03-28 19:13:35 -07:00
#include <string_view>
2026-01-03 16:59:35 -08:00
#include <vector>
2020-04-05 11:35:51 -07:00
2026-01-03 16:59:35 -08:00
#include "CheckMaxSkews.hh"
2026-04-13 14:58:16 -07:00
#include "CheckMinPeriods.hh"
#include "CheckMinPulseWidths.hh"
#include "Clock.hh"
#include "Delay.hh"
#include "GraphClass.hh"
#include "LibertyClass.hh"
#include "MinMax.hh"
#include "Mode.hh"
#include "NetworkClass.hh"
#include "Path.hh"
#include "PathEnd.hh"
#include "Sdc.hh"
#include "SearchClass.hh"
#include "StringUtil.hh"
2018-09-28 08:54:21 -07:00
namespace sta {
2026-01-03 16:59:35 -08:00
class Scene;
2018-09-28 08:54:21 -07:00
class PathExpanded;
2026-05-12 11:24:24 -07:00
using ReportFieldGetValue = std::function<std::string (const Path *path,
const StaState *sta)>;
class ReportField
{
public:
ReportField(std::string_view name,
std::string_view name_abrev,
std::string_view title,
size_t width,
bool left_justify,
Unit *unit,
ReportFieldGetValue get_value);
void setProperties(std::string_view title,
size_t width,
bool left_justify);
const std::string &name() const { return name_; }
const std::string &nameAbrev() const { return name_abrev_; }
const std::string &title() const { return title_; }
size_t width() const { return width_; }
void setWidth(size_t width);
bool leftJustify() const { return left_justify_; }
Unit *unit() const { return unit_; }
const std::string &blank() const { return blank_; }
void setEnabled(bool enabled);
bool enabled() const { return enabled_; }
std::string value(const Path *path,
const StaState *sta) const;
const ReportFieldGetValue &getValue() const { return get_value_; }
protected:
std::string name_;
std::string name_abrev_;
std::string title_;
size_t width_;
bool left_justify_;
Unit *unit_;
bool enabled_{false};
ReportFieldGetValue get_value_;
std::string blank_;
};
2018-09-28 08:54:21 -07:00
2026-01-03 16:59:35 -08:00
using ReportFieldSeq = std::vector<ReportField*>;
2026-05-12 11:24:24 -07:00
using ReportFieldMap = std::map<std::string, ReportField*, std::less<>>;
2018-09-28 08:54:21 -07:00
class ReportPath : public StaState
{
public:
2025-02-01 14:53:28 -08:00
ReportPath(StaState *sta);
2026-04-13 14:58:16 -07:00
~ReportPath() override;
ReportPathFormat pathFormat() const { return format_; }
2018-09-28 08:54:21 -07:00
void setPathFormat(ReportPathFormat format);
2026-03-08 15:51:50 -07:00
void setReportFieldOrder(const StringSeq &field_names);
2026-05-12 11:24:24 -07:00
void setReportFields(const StringSeq &fields);
2019-02-16 12:07:59 -08:00
int digits() const { return digits_; }
2018-09-28 08:54:21 -07:00
void setDigits(int digits);
void setNoSplit(bool no_split);
2026-05-12 11:24:24 -07:00
ReportField *findField(std::string_view name);
ReportField *findFieldAbrev(std::string_view name);
2018-09-28 08:54:21 -07:00
2018-12-20 22:41:54 -08:00
// Header above reportPathEnd results.
2025-02-01 14:53:28 -08:00
void reportPathEndHeader() const;
2018-12-20 22:41:54 -08:00
// Footer below reportPathEnd results.
2025-02-01 14:53:28 -08:00
void reportPathEndFooter() const;
void reportPathEnd(const PathEnd *end) const;
2018-12-20 22:41:54 -08:00
// Format report_path_endpoint only:
// Previous path end is used to detect path group changes
// so headers are reported by group.
2025-02-01 14:53:28 -08:00
void reportPathEnd(const PathEnd *end,
2026-01-03 16:59:35 -08:00
const PathEnd *prev_end,
2025-02-01 14:53:28 -08:00
bool last) const;
void reportPathEnds(const PathEndSeq *ends) const;
void reportPath(const Path *path) const;
2018-09-28 08:54:21 -07:00
2025-02-01 14:53:28 -08:00
void reportShort(const PathEndUnconstrained *end) const;
void reportShort(const PathEndCheck *end) const;
void reportShort(const PathEndLatchCheck *end) const;
void reportShort(const PathEndPathDelay *end) const;
void reportShort(const PathEndOutputDelay *end) const;
void reportShort(const PathEndGatedClock *end) const;
void reportShort(const PathEndDataCheck *end) const;
2018-09-28 08:54:21 -07:00
2025-02-01 14:53:28 -08:00
void reportFull(const PathEndUnconstrained *end) const;
void reportFull(const PathEndCheck *end) const;
void reportFull(const PathEndLatchCheck *end) const;
void reportFull(const PathEndPathDelay *end) const;
void reportFull(const PathEndOutputDelay *end) const;
void reportFull(const PathEndGatedClock *end) const;
void reportFull(const PathEndDataCheck *end) const;
2018-09-28 08:54:21 -07:00
2025-02-01 14:53:28 -08:00
void reportJsonHeader() const;
void reportJsonFooter() const;
2024-09-16 17:04:31 -07:00
void reportJson(const PathEnd *end,
2025-02-01 14:53:28 -08:00
bool last) const;
void reportJson(const Path *path) const;
2024-09-16 17:04:31 -07:00
void reportJson(const Path *path,
2026-03-28 19:13:35 -07:00
std::string_view path_name,
2024-09-16 17:04:31 -07:00
int indent,
bool trailing_comma,
2025-04-11 16:59:48 -07:00
std::string &result) const;
2024-09-16 17:04:31 -07:00
void reportJson(const PathExpanded &expanded,
2026-03-28 19:13:35 -07:00
std::string_view path_name,
2024-09-16 17:04:31 -07:00
int indent,
bool trailing_comma,
2025-04-11 16:59:48 -07:00
std::string &result) const;
2024-09-16 17:04:31 -07:00
2025-02-01 14:53:28 -08:00
void reportEndHeader() const;
void reportEndLine(const PathEnd *end) const;
2018-09-28 08:54:21 -07:00
2025-02-01 14:53:28 -08:00
void reportSummaryHeader() const;
void reportSummaryLine(const PathEnd *end) const;
2018-09-28 08:54:21 -07:00
2025-02-01 14:53:28 -08:00
void reportSlackOnlyHeader() const;
void reportSlackOnly(const PathEnd *end) const;
2018-09-28 08:54:21 -07:00
2026-01-03 16:59:35 -08:00
void reportMpwCheck(const MinPulseWidthCheck &check,
bool verbose) const;
void reportMpwChecks(const MinPulseWidthCheckSeq &checks,
bool verbose) const;
2025-02-01 14:53:28 -08:00
void reportMpwHeaderShort() const;
2026-01-03 16:59:35 -08:00
void reportShort(const MinPulseWidthCheck &check) const;
void reportVerbose(const MinPulseWidthCheck &check) const;
2018-09-28 08:54:21 -07:00
2026-01-03 16:59:35 -08:00
void reportCheck(const MinPeriodCheck &check,
bool verbose) const;
void reportChecks(const MinPeriodCheckSeq &checks,
bool verbose) const;
2025-02-01 14:53:28 -08:00
void reportPeriodHeaderShort() const;
2026-01-03 16:59:35 -08:00
void reportShort(const MinPeriodCheck &check) const;
void reportVerbose(const MinPeriodCheck &check) const;
2018-09-28 08:54:21 -07:00
2026-01-03 16:59:35 -08:00
void reportChecks(const MaxSkewCheckSeq &checks,
bool verbose) const;
2025-02-01 14:53:28 -08:00
void reportMaxSkewHeaderShort() const;
2026-01-03 16:59:35 -08:00
void reportShort(const MaxSkewCheck &check) const;
void reportVerbose(const MaxSkewCheck &check) const;
2018-09-28 08:54:21 -07:00
2025-02-01 14:53:28 -08:00
void reportLimitShortHeader(const ReportField *field) const;
2020-06-02 15:19:09 -07:00
void reportLimitShort(const ReportField *field,
2026-01-03 16:59:35 -08:00
const Pin *pin,
float value,
float limit,
float slack) const;
2020-06-02 15:19:09 -07:00
void reportLimitVerbose(const ReportField *field,
2026-01-03 16:59:35 -08:00
const Pin *pin,
const RiseFall *rf,
float value,
float limit,
float slack,
const Scene *scene,
const MinMax *min_max) const;
2026-05-12 11:24:24 -07:00
ReportField *makeField(std::string_view name,
std::string_view name_abrev,
std::string_view title,
size_t width,
bool left_justify,
// nullptr for string fields.
Unit *unit,
ReportFieldGetValue get_value);
2020-06-02 15:19:09 -07:00
ReportField *fieldSlew() const { return field_slew_; }
ReportField *fieldFanout() const { return field_fanout_; }
ReportField *fieldCapacitance() const { return field_capacitance_; }
2024-10-15 17:28:52 -07:00
ReportField *fieldSrcAttr() const { return field_src_attr_; }
2018-09-28 08:54:21 -07:00
protected:
void makeFields();
2026-03-28 19:13:35 -07:00
ReportField *makeField(std::string_view name,
2026-05-12 11:24:24 -07:00
std::string_view name_abrev,
2026-03-28 19:13:35 -07:00
std::string_view title,
2026-05-12 11:24:24 -07:00
size_t width,
2026-01-03 16:59:35 -08:00
bool left_justify,
2026-05-12 11:24:24 -07:00
Unit *unit);
2025-02-01 14:53:28 -08:00
void reportEndpointHeader(const PathEnd *end,
2026-01-03 16:59:35 -08:00
const PathEnd *prev_end) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndUnconstrained *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndCheck *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndLatchCheck *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndPathDelay *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndOutputDelay *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndGatedClock *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportShort(const PathEndDataCheck *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2025-02-01 14:53:28 -08:00
void reportEndpoint(const PathEndOutputDelay *end) const;
void reportEndpointOutputDelay(const PathEndClkConstrained *end) const;
void reportEndpoint(const PathEndPathDelay *end) const;
void reportEndpoint(const PathEndGatedClock *end) const;
2025-04-11 16:59:48 -07:00
std::string pathEndpoint(const PathEnd *end) const;
std::string pathStartpoint(const PathEnd *end,
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportBorrowing(const PathEndLatchCheck *end,
2026-01-03 16:59:35 -08:00
Arrival &borrow,
Arrival &time_given_to_startpoint) const;
2025-02-01 14:53:28 -08:00
void reportEndpoint(const PathEndDataCheck *end) const;
2026-04-13 14:58:16 -07:00
std::string_view clkNetworkDelayIdealProp(bool is_prop) const;
2018-09-28 08:54:21 -07:00
2025-04-11 16:59:48 -07:00
std::string checkRoleReason(const PathEnd *end) const;
std::string checkRoleString(const PathEnd *end) const;
2025-02-01 14:53:28 -08:00
virtual void reportGroup(const PathEnd *end) const;
2018-09-28 08:54:21 -07:00
void reportStartpoint(const PathEnd *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
void reportUnclockedEndpoint(const PathEnd *end,
2026-03-28 19:13:35 -07:00
std::string_view default_reason) const;
2025-02-01 14:53:28 -08:00
void reportEndpoint(const PathEndCheck *end) const;
void reportEndpoint(const PathEndLatchCheck *end) const;
2026-03-28 19:13:35 -07:00
std::string_view latchDesc(const PathEndLatchCheck *end) const;
void reportStartpoint(std::string_view start,
const std::string &reason) const;
void reportEndpoint(std::string_view end,
const std::string &reason) const;
void reportStartEndPoint(std::string_view pt,
const std::string &reason,
std::string_view key) const;
2025-04-11 16:59:48 -07:00
std::string tgtClkName(const PathEnd *end) const;
2026-03-28 19:13:35 -07:00
std::string_view clkRegLatchDesc(const PathEnd *end) const;
2018-09-28 08:54:21 -07:00
void reportSrcPath(const PathEnd *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2025-02-01 14:53:28 -08:00
void reportTgtClk(const PathEnd *end) const;
2018-09-28 08:54:21 -07:00
void reportTgtClk(const PathEnd *end,
2026-01-03 16:59:35 -08:00
float prev_time) const;
2018-09-28 08:54:21 -07:00
void reportTgtClk(const PathEnd *end,
2026-01-03 16:59:35 -08:00
float prev_time,
bool is_prop) const;
void reportTgtClk(const PathEnd *end,
float prev_time,
float src_offset,
2025-02-01 14:53:28 -08:00
bool is_prop) const;
2018-09-28 08:54:21 -07:00
bool pathFromGenPropClk(const Path *clk_path,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late) const;
2018-09-28 08:54:21 -07:00
bool isGenPropClk(const Clock *clk,
2026-01-03 16:59:35 -08:00
const RiseFall *clk_rf,
const MinMax *min_max,
const EarlyLate *early_late,
const Sdc *sdc) const;
2018-09-28 08:54:21 -07:00
void reportSrcClkAndPath(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
float time_offset,
Arrival clk_insertion,
Arrival clk_latency,
bool is_path_delay) const;
2023-01-19 11:23:45 -07:00
bool reportGenClkSrcPath(const Path *clk_path,
const Clock *clk,
2026-01-03 16:59:35 -08:00
const RiseFall *clk_rf,
const MinMax *min_max,
const EarlyLate *early_late,
const Sdc *sdc) const;
2019-11-11 15:30:19 -07:00
void reportGenClkSrcAndPath(const Path *path,
2026-01-03 16:59:35 -08:00
const Clock *clk,
const RiseFall *clk_rf,
const EarlyLate *early_late,
float time_offset,
float path_time_offset,
bool clk_used_as_data,
const Mode *mode) const;
2023-01-19 11:23:45 -07:00
bool reportGenClkSrcPath1(const Clock *clk,
2026-01-03 16:59:35 -08:00
const Pin *clk_pin,
const RiseFall *clk_rf,
const EarlyLate *early_late,
float gclk_time,
float time_offset,
bool clk_used_as_data,
const Mode *mode) const;
2018-09-28 08:54:21 -07:00
void reportClkSrcLatency(Arrival insertion,
2026-01-03 16:59:35 -08:00
float clk_time,
const EarlyLate *early_late) const;
2018-09-28 08:54:21 -07:00
void reportPathLine(const Path *path,
2026-03-13 14:06:35 -07:00
const Delay &incr,
const Arrival &time,
2026-03-28 19:13:35 -07:00
std::string_view line_case) const;
2018-09-28 08:54:21 -07:00
void reportCommonClkPessimism(const PathEnd *end,
2026-01-03 16:59:35 -08:00
Arrival &clk_arrival) const ;
2018-09-28 08:54:21 -07:00
void reportClkUncertainty(const PathEnd *end,
2026-01-03 16:59:35 -08:00
Arrival &clk_arrival) const ;
2018-09-28 08:54:21 -07:00
void reportClkLine(const Clock *clk,
2026-03-28 19:13:35 -07:00
std::string_view clk_name,
2026-01-03 16:59:35 -08:00
const RiseFall *clk_rf,
Arrival clk_time,
const MinMax *min_max) const ;
2018-09-28 08:54:21 -07:00
void reportClkLine(const Clock *clk,
2026-03-28 19:13:35 -07:00
std::string_view clk_name,
2026-01-03 16:59:35 -08:00
const RiseFall *clk_rf,
Arrival prev_time,
Arrival clk_time,
const MinMax *min_max) const ;
2018-09-28 08:54:21 -07:00
void reportRequired(const PathEnd *end,
2026-04-13 14:58:16 -07:00
const std::string& margin_msg) const ;
2025-02-01 14:53:28 -08:00
void reportSlack(const PathEnd *end) const ;
void reportSlack(Slack slack) const ;
void reportSpaceSlack(const PathEnd *end,
2026-04-13 14:58:16 -07:00
std::string &result) const ;
2019-10-09 18:02:54 -10:00
void reportSpaceSlack(Slack slack,
2026-04-13 14:58:16 -07:00
std::string &result) const ;
2018-09-28 08:54:21 -07:00
void reportSrcPathArrival(const PathEnd *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const ;
2018-09-28 08:54:21 -07:00
void reportPath(const PathEnd *end,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded) const;
2025-02-01 14:53:28 -08:00
void reportPathFull(const Path *path) const;
void reportPathHeader() const;
2018-09-28 08:54:21 -07:00
void reportPath1(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
bool clk_used_as_data,
float time_offset) const;
2018-09-28 08:54:21 -07:00
void reportPath2(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
bool skip_first_path,
bool clk_used_as_data,
float time_offset) const;
2018-09-28 08:54:21 -07:00
void reportPath3(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
bool report_clk_path,
float time_offset) const;
2018-09-28 08:54:21 -07:00
void reportPath4(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
bool skip_first_path,
bool propagated_clk,
bool report_clk_path,
float time_offset) const;
2018-09-28 08:54:21 -07:00
void reportPath5(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
bool skip_first_path,
bool propagated_clk,
bool report_clk_path,
float time_offset) const;
2025-08-18 13:27:30 -07:00
void reportPath6(const Path *path,
2026-01-03 16:59:35 -08:00
const PathExpanded &expanded,
size_t path_first_index,
bool propagated_clk,
bool report_clk_path,
Arrival prev_time,
float time_offset) const;
2026-03-13 14:06:35 -07:00
void reportVariation(const Path *path) const;
2025-03-26 18:21:03 -07:00
void reportHierPinsThru(const Path *path) const;
2018-09-28 08:54:21 -07:00
void reportInputExternalDelay(const Path *path,
2026-01-03 16:59:35 -08:00
float time_offset) const;
2026-03-28 19:13:35 -07:00
void reportLine(std::string_view what,
2026-01-03 16:59:35 -08:00
Delay total,
const EarlyLate *early_late) const;
2026-03-28 19:13:35 -07:00
void reportLineNegative(std::string_view what,
2026-01-03 16:59:35 -08:00
Delay total,
const EarlyLate *early_late) const;
2026-03-28 19:13:35 -07:00
void reportLine(std::string_view what,
2026-01-03 16:59:35 -08:00
Delay total,
const EarlyLate *early_late,
const RiseFall *rf) const;
2026-03-28 19:13:35 -07:00
void reportLine(std::string_view what,
2026-03-13 14:06:35 -07:00
const Delay &incr,
const Delay &total,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late) const;
2026-03-28 19:13:35 -07:00
void reportLine(std::string_view what,
2026-03-13 14:06:35 -07:00
const Delay &incr,
const Delay &total,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late,
const RiseFall *rf) const;
2026-03-28 19:13:35 -07:00
void reportLine(std::string_view what,
2026-03-13 14:06:35 -07:00
const Slew &slew,
const Delay &incr,
const Delay &total,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late) const;
2026-03-28 19:13:35 -07:00
void reportLine(std::string_view what,
2026-05-12 11:24:24 -07:00
const Path *path,
2026-01-03 16:59:35 -08:00
float cap,
2026-03-13 14:06:35 -07:00
const Slew &slew,
2026-01-03 16:59:35 -08:00
float fanout,
2026-03-13 14:06:35 -07:00
const Delay &incr,
float variation,
const Delay &total,
2026-01-03 16:59:35 -08:00
bool total_with_minus,
const EarlyLate *early_late,
const RiseFall *rf,
2026-03-29 09:58:06 -07:00
std::string_view src_attr,
2026-03-28 19:13:35 -07:00
std::string_view line_case) const;
void reportLineTotal(std::string_view what,
2026-03-13 14:06:35 -07:00
const Delay &incr,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late) const;
2026-03-28 19:13:35 -07:00
void reportLineTotalMinus(std::string_view what,
2026-03-13 14:06:35 -07:00
const Delay &decr,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late) const;
2026-03-28 19:13:35 -07:00
void reportLineTotal1(std::string_view what,
2026-03-13 14:06:35 -07:00
const Delay &incr,
2026-01-03 16:59:35 -08:00
bool incr_with_minus,
const EarlyLate *early_late) const;
2025-02-01 14:53:28 -08:00
void reportDashLineTotal() const;
2026-03-28 19:13:35 -07:00
void reportDescription(std::string_view what,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2026-03-28 19:13:35 -07:00
void reportDescription(std::string_view what,
2026-01-03 16:59:35 -08:00
bool first_field,
bool last_field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2018-11-26 09:15:52 -08:00
void reportFieldTime(float value,
2026-01-03 16:59:35 -08:00
ReportField *field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2018-11-26 09:15:52 -08:00
void reportSpaceFieldTime(float value,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2026-03-13 14:06:35 -07:00
void reportSpaceFieldDelay(const Delay &value,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2026-03-13 14:06:35 -07:00
void reportFieldDelayMinus(const Delay &value,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late,
const ReportField *field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2026-03-13 14:06:35 -07:00
void reportTotalDelay(const Delay &value,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2026-03-13 14:06:35 -07:00
void reportFieldDelay(const Delay &value,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late,
const ReportField *field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2018-09-28 08:54:21 -07:00
void reportField(float value,
2026-01-03 16:59:35 -08:00
const ReportField *field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2026-03-28 19:13:35 -07:00
void reportField(std::string_view value,
2026-01-03 16:59:35 -08:00
const ReportField *field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2020-06-02 15:19:09 -07:00
void reportFieldBlank(const ReportField *field,
2026-04-13 14:58:16 -07:00
std::string &line) const;
2025-02-01 14:53:28 -08:00
void reportDashLine() const;
void reportDashLine(int line_width) const;
void reportBlankLine() const;
2025-04-11 16:59:48 -07:00
std::string descriptionField(const Vertex *vertex) const;
std::string descriptionField(const Pin *pin) const;
std::string descriptionNet(const Pin *pin) const;
2018-09-28 08:54:21 -07:00
bool reportClkPath() const;
2025-04-11 16:59:48 -07:00
std::string clkName(const Clock *clk,
bool inverted) const;
2018-09-28 08:54:21 -07:00
bool hasExtInputDriver(const Pin *pin,
2026-01-03 16:59:35 -08:00
const RiseFall *rf,
const MinMax *min_max,
const Sdc *sdc) const;
2018-09-28 08:54:21 -07:00
float drvrFanout(Vertex *drvr,
2026-01-03 16:59:35 -08:00
const Scene *scene,
const MinMax *min_max) const;
2026-03-28 19:13:35 -07:00
std::string_view mpwCheckHiLow(const MinPulseWidthCheck &check) const;
void reportSkewClkPath(std::string_view arrival_msg,
2026-01-03 16:59:35 -08:00
const Path *clk_path) const;
2026-03-28 19:13:35 -07:00
std::string_view edgeRegLatchDesc(const Edge *edge,
const TimingArc *arc) const;
std::string_view checkRegLatchDesc(const TimingRole *role,
const RiseFall *clk_rf) const;
std::string_view regDesc(const RiseFall *clk_rf) const;
std::string_view latchDesc(const RiseFall *clk_rf) const;
2018-09-28 08:54:21 -07:00
void pathClkPath(const Path *path,
2026-01-03 16:59:35 -08:00
const Path &clk_path) const;
2025-02-01 14:53:28 -08:00
bool isPropagated(const Path *clk_path) const;
2018-09-28 08:54:21 -07:00
bool isPropagated(const Path *clk_path,
2026-01-03 16:59:35 -08:00
const Clock *clk) const;
2025-02-01 14:53:28 -08:00
bool pathFromClkPin(const PathExpanded &expanded) const;
2018-09-28 08:54:21 -07:00
bool pathFromClkPin(const Path *path,
2026-01-03 16:59:35 -08:00
const Pin *start_pin) const;
2018-09-28 08:54:21 -07:00
void latchPaths(const Path *path,
2025-02-01 14:53:28 -08:00
// Return values.
2025-03-26 18:21:03 -07:00
Path &d_path,
2026-01-03 16:59:35 -08:00
Path &q_path,
Edge *&d_q_edge) const;
2025-03-26 18:21:03 -07:00
bool nextArcAnnotated(const Path *next_path,
2026-01-03 16:59:35 -08:00
size_t next_index,
const PathExpanded &expanded,
DcalcAPIndex ap_index) const;
2018-09-28 08:54:21 -07:00
float tgtClkInsertionOffet(const Path *clk_path,
2026-01-03 16:59:35 -08:00
const EarlyLate *early_late) const;
2018-09-28 08:54:21 -07:00
// InputDelay used to seed path root.
InputDelay *pathInputDelay(const Path *path) const;
void pathInputDelayRefPath(const Path *path,
2026-01-03 16:59:35 -08:00
const InputDelay *input_delay,
// Return value.
Path &ref_path) const;
2026-03-28 19:13:35 -07:00
std::string_view asRisingFalling(const RiseFall *rf) const;
std::string_view asRiseFall(const RiseFall *rf) const;
2026-03-13 14:06:35 -07:00
Delay delayIncr(const Delay &time,
const Delay &prev,
2026-01-03 16:59:35 -08:00
const MinMax *min_max) const;
2018-09-28 08:54:21 -07:00
// Path options.
2026-04-13 14:58:16 -07:00
ReportPathFormat format_{ReportPathFormat::full};
2018-09-28 08:54:21 -07:00
bool report_input_pin_;
bool report_hier_pins_;
2018-09-28 08:54:21 -07:00
bool report_net_;
2026-04-13 14:58:16 -07:00
bool no_split_{false};
2018-09-28 08:54:21 -07:00
int digits_;
2026-05-12 11:24:24 -07:00
ReportFieldMap field_map_;
ReportFieldSeq fields_;
2018-09-28 08:54:21 -07:00
ReportField *field_description_;
ReportField *field_total_;
ReportField *field_incr_;
ReportField *field_capacitance_;
ReportField *field_slew_;
ReportField *field_fanout_;
2026-03-13 14:06:35 -07:00
ReportField *field_variation_;
2024-10-15 17:28:52 -07:00
ReportField *field_src_attr_;
2018-09-28 08:54:21 -07:00
ReportField *field_edge_;
ReportField *field_case_;
2026-03-15 14:35:24 -07:00
std::string plus_zero_;
std::string minus_zero_;
2026-04-13 14:58:16 -07:00
int field_width_extra_{5};
2026-05-12 11:24:24 -07:00
size_t start_end_pt_width_{80};
2026-03-15 14:35:24 -07:00
static constexpr float field_blank_ = -1;
static const float field_skip_;
2018-09-28 08:54:21 -07:00
};
2026-04-13 14:58:16 -07:00
} // namespace sta