1use reda_lib_macro::model;
2use crate::lib_enum;
3
4use super::LibExpr;
5
6#[model]
7#[derive(Debug, Clone, Default)]
8pub struct LibPin {
9 pub name: String,
10
11 pub alive_during_power_up: Option<bool>,
13 pub always_on: Option<bool>,
14
15 pub antenna_diode_type: Option<LibAntennaDiodeType>,
16 pub antenna_diode_related_ground_pins: Option<String>,
17 pub antenna_diode_related_power_pins: Option<String>,
18
19 pub bit_width: Option<usize>,
20
21 pub capacitance: Option<f64>,
22 pub fall_capacitance: Option<f64>,
23 pub fanout_load: Option<f64>,
24 pub drive_current: Option<f64>,
25 pub fall_current_slope_after_threshold: Option<f64>,
26 pub fall_current_slope_before_threshold: Option<f64>,
27 pub fall_time_after_threshold: Option<f64>,
28 pub fall_time_before_threshold: Option<f64>,
29
30 pub max_capacitance: Option<f64>,
31 pub min_capacitance: Option<f64>,
32 pub max_fanout: Option<f64>,
33 pub min_fanout: Option<f64>,
34 pub max_transition: Option<f64>,
35 pub min_transition: Option<f64>,
36 pub min_period: Option<f64>,
37 pub min_pulse_width_high: Option<f64>,
38 pub min_pulse_width_low: Option<f64>,
39 pub max_input_delta_overdrive_high: Option<f64>,
40 pub max_input_delta_underdrive_high: Option<f64>,
41
42 pub clamp_0_function: Option<String>,
43 pub clamp_1_function: Option<String>,
44 pub clamp_latch_function: Option<String>,
45 pub clamp_z_function: Option<String>,
46 pub function: Option<LibExpr>,
47 pub illegal_clamp_condition: Option<String>,
48 pub complementary_pin: Option<String>,
49 pub nextstate_type: Option<LibNextStateType>,
50
51 pub clock: Option<bool>,
52 pub clock_gate_clock_pin: Option<bool>,
53 pub clock_gate_enable_pin: Option<bool>,
54 pub clock_gate_test_pin: Option<bool>,
55 pub clock_gate_obs_pin: Option<bool>,
56 pub clock_gate_out_pin: Option<bool>,
57 pub clock_isolation_cell_clock_pin: Option<bool>,
58
59 pub direction: LibPinDirection,
60 pub driver_type: Option<LibDriverType>,
61 pub output_signal_level: Option<String>,
62 pub output_signal_level_high: Option<f64>,
63 pub output_signal_level_low: Option<f64>,
64 pub output_voltage: Option<String>,
65 pub input_signal_level: Option<String>,
66 pub input_voltage: Option<String>,
67
68 pub has_builtin_pad: Option<bool>,
69 pub hysteresis: Option<bool>,
70 pub is_pad: Option<bool>,
71 pub is_unconnected: Option<bool>,
72 pub multicell_pad_pin: Option<bool>,
73 pub inverted_output: Option<bool>,
74
75 pub connection_class: Option<String>,
76 pub fault_model: Option<String>,
77 pub dont_fault: Option<LibDontFault>,
78 pub internal_node: Option<String>,
79 pub input_map: Option<String>,
80
81 pub pin_func_type: Option<LibPinFuncType>,
82 pub primary_output: Option<bool>,
83 pub pulling_current: Option<f64>,
84 pub pulling_resistance: Option<f64>,
85 pub restore_action: Option<LibAction>,
86 pub restore_edge_type: Option<LibRestoreEdgeType>,
87 pub rise_capacitance: Option<f64>,
88 pub rise_current_slope_after_threshold: Option<f64>,
89 pub rise_current_slope_before_threshold: Option<f64>,
90 pub rise_time_after_threshold: Option<f64>,
91 pub rise_time_before_threshold: Option<f64>,
92 pub save_action: Option<LibAction>,
93 pub signal_type: Option<LibSignalType>,
94 pub slew_control: Option<LibSlewControl>,
95 pub state_function: Option<LibExpr>,
96 pub test_output_only: Option<bool>,
97 pub three_state: Option<LibExpr>,
98 pub x_function: Option<LibExpr>,
99
100 pub fall_capacitance_range: Option<[f64; 2]>,
102 pub rise_capacitance_range: Option<[f64; 2]>,
103}
104
105#[model]
106#[derive(Debug, Clone)]
107pub struct LibTiming {
108 pub related_pin: String,
109 pub timing_sense: String,
110 pub cell_fall: LibLutTable,
111 pub cell_rise: LibLutTable,
112 pub fall_transition: LibLutTable,
113 pub rise_transition: LibLutTable,
114}
115
116#[model]
117#[derive(Debug, Clone)]
118pub struct LibInternalPower {
119 pub related_pin: String,
120 pub fall_power: LibLutTable,
121 pub rise_power: LibLutTable,
122}
123
124#[model]
125#[derive(Debug, Clone)]
126pub struct LibLutTable {
127 pub name: String,
128 pub index_1: Vec<f64>,
129 pub index_2: Vec<f64>,
130 pub values: Vec<Vec<f64>>,
131}
132
133lib_enum!(LibPinDirection, input, output, inout, internal);
134
135lib_enum!(LibAntennaDiodeType, power, ground, power_and_ground);
136
137lib_enum!(LibDriverType,
138 pull_up,
139 pull_down,
140 open_drain,
141 open_source,
142 bus_hold,
143 resistive,
144 resistive0,
145 resistive1,
146);
147
148lib_enum!(LibDontFault, sa0, sa1, sao1);
149
150lib_enum!(LibNextStateType,
151 data,
152 preset,
153 clear,
154 load,
155 scan_in,
156 scan_enable,
157);
158
159lib_enum!(LibAction, l, h, r, f);
160
161lib_enum!(LibRestoreEdgeType, edge_trigger, leading, trailing);
162
163lib_enum!(LibSlewControl, low, medium, high, none);
164
165lib_enum!(LibSignalType,
166 test_scan_in,
167 test_scan_in_inverted,
168 test_scan_out,
169 test_scan_out_inverted,
170 test_scan_enable,
171 test_scan_enable_inverted,
172 test_scan_clock,
173 test_scan_clock_a,
174 test_scan_clock_b,
175 test_clock,
176);
177
178lib_enum!(LibPinFuncType,
179 clock_enable,
180 active_high,
181 active_low,
182 active_rising,
183 active_falling,
184);
185
186impl LibPin {
187 pub fn new<S: Into<String>>(name: S) -> Self {
188 Self {
189 name: name.into(),
190 ..Default::default()
191 }
192 }
193}