File: Crpr.hh

package info (click to toggle)
opensta 0~20191111gitc018cb2%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, sid
  • size: 5,116 kB
  • sloc: cpp: 99,117; tcl: 8,530; yacc: 1,435; lex: 894; makefile: 541; sh: 107
file content (97 lines) | stat: -rw-r--r-- 2,905 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// OpenSTA, Static Timing Analyzer
// Copyright (c) 2019, 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/>.

#ifndef STA_CRPR_H
#define STA_CRPR_H

#include "DisallowCopyAssign.hh"
#include "SdcClass.hh"
#include "SearchClass.hh"

namespace sta {

class CrprPaths;

// Clock Reconvergence Pessimism Removal.
class CheckCrpr : public StaState
{
public:
  explicit CheckCrpr(StaState *sta);

  // Find the maximum possible crpr (clock min/max delta delay) for path.
  Arrival maxCrpr(ClkInfo *clk_info);
  // Timing check CRPR.
  Crpr checkCrpr(const Path *src_clk_path,
		 const PathVertex *tgt_clk_path);
  void checkCrpr(const Path *src_path,
		 const PathVertex *tgt_clk_path,
		 // Return values.
		 Crpr &crpr,
		 Pin *&crpr_pin);
  // Output delay CRPR.
  Crpr outputDelayCrpr(const Path *src_clk_path,
		       const ClockEdge *tgt_clk_edge);
  void outputDelayCrpr(const Path *src_clk_path,
		       const ClockEdge *tgt_clk_edge,
		       // Return values.
		       Crpr &crpr,
		       Pin *&crpr_pin);

  // Previous clk path when crpr is enabled.
  PathVertex *clkPathPrev(const PathVertex *path,
			  PathVertex &tmp);
  // For Search::reportArrivals.
  PathVertex *clkPathPrev(Vertex *vertex,
		   int arrival_index,
		   PathVertex &tmp);

private:
  Arrival otherMinMaxArrival(const PathVertex *path);
  void checkCrpr1(const Path *src_path,
		  const PathVertex *tgt_clk_path,
		  bool same_pin,
		  // Return values.
		  Crpr &crpr,
		  Pin *&crpr_pin);
  void outputDelayCrpr1(const Path *src_path,
			const ClockEdge *tgt_clk_edge,
			const PathAnalysisPt *tgt_path_ap,
			bool same_pin,
			// Return values.
			Crpr &crpr,
			Pin *&crpr_pin);
  bool crprPossible(Clock *clk1,
		    Clock *clk2);
  void genClkSrcPaths(const PathVertex *path,
		      PathVertexSeq &gclk_paths);
  void findCrpr(const PathVertex *src_clk_path,
		const PathVertex *tgt_clk_path,
		bool same_pin,
		// Return values.
		Crpr &crpr,
		Pin *&common_pin);
  void portClkPath(const ClockEdge *clk_edge,
		   const Pin *clk_src_pin,
		   const PathAnalysisPt *path_ap,
		   // Return value.
		   PathVertex &port_clk_path);
  Crpr findCrpr1(const PathVertex *src_clk_path,
		 const PathVertex *tgt_clk_path);
  float crprArrivalDiff(const PathVertex *path);
};

} // namespace
#endif