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