1 #ifndef OT_LIBERTY_CELLPIN_HPP_
2 #define OT_LIBERTY_CELLPIN_HPP_
3 
4 #include <ot/liberty/timing.hpp>
5 #include <ot/liberty/power.hpp>
6 
7 namespace ot {
8 
9 // Struct: CellpinDirection
10 enum class CellpinDirection {
11   INPUT,
12   OUTPUT,
13   INOUT,
14   INTERNAL
15 };
16 
17 inline const std::unordered_map<std::string_view, CellpinDirection> cellpin_directions {
18   {"input",    CellpinDirection::INPUT},
19   {"output",   CellpinDirection::OUTPUT},
20   {"inout",    CellpinDirection::INOUT},
21   {"internal", CellpinDirection::INTERNAL}
22 };
23 
24 // Class: Cellpin
25 struct Cellpin {
26 
27   std::string name;
28   std::string original_pin;
29 
30   std::optional<CellpinDirection> direction;
31   std::optional<float> capacitance;      // Pin capacitance
32   std::optional<float> max_capacitance;  // Max pin capacitance (output pin).
33   std::optional<float> min_capacitance;  // Min pin capacitance (output pin).
34   std::optional<float> max_transition;   // Max transition.
35   std::optional<float> min_transition;   // Min transition.
36   std::optional<float> fall_capacitance;
37   std::optional<float> rise_capacitance;
38   std::optional<float> fanout_load;
39   std::optional<float> max_fanout;
40   std::optional<float> min_fanout;
41   std::optional<bool> is_clock;          // Is clock pin.
42 
43   std::vector<Timing> timings;
44 
45   const Timing* isomorphic_timing(const Timing&) const;
46 
47   void scale_time(float);
48   void scale_capacitance(float);
49 };
50 
51 std::ostream& operator << (std::ostream&, const Cellpin&);
52 
53 // ------------------------------------------------------------------------------------------------
54 
55 using CellpinView = std::array<const Cellpin*, MAX_SPLIT>;
56 
57 };  // end of namespace ot ------------------------------------------------------------------------
58 
59 
60 #endif
61