use reda_lib_macro::model;
use crate::lib_enum;
use super::LibExpr;
#[model]
#[derive(Debug, Clone, Default)]
pub struct LibPin {
pub name: String,
pub alive_during_power_up: Option<bool>,
pub always_on: Option<bool>,
pub antenna_diode_type: Option<LibAntennaDiodeType>,
pub antenna_diode_related_ground_pins: Option<String>,
pub antenna_diode_related_power_pins: Option<String>,
pub bit_width: Option<usize>,
pub capacitance: Option<f64>,
pub fall_capacitance: Option<f64>,
pub fanout_load: Option<f64>,
pub drive_current: Option<f64>,
pub fall_current_slope_after_threshold: Option<f64>,
pub fall_current_slope_before_threshold: Option<f64>,
pub fall_time_after_threshold: Option<f64>,
pub fall_time_before_threshold: Option<f64>,
pub max_capacitance: Option<f64>,
pub min_capacitance: Option<f64>,
pub max_fanout: Option<f64>,
pub min_fanout: Option<f64>,
pub max_transition: Option<f64>,
pub min_transition: Option<f64>,
pub min_period: Option<f64>,
pub min_pulse_width_high: Option<f64>,
pub min_pulse_width_low: Option<f64>,
pub max_input_delta_overdrive_high: Option<f64>,
pub max_input_delta_underdrive_high: Option<f64>,
pub clamp_0_function: Option<String>,
pub clamp_1_function: Option<String>,
pub clamp_latch_function: Option<String>,
pub clamp_z_function: Option<String>,
pub function: Option<LibExpr>,
pub illegal_clamp_condition: Option<String>,
pub complementary_pin: Option<String>,
pub nextstate_type: Option<LibNextStateType>,
pub clock: Option<bool>,
pub clock_gate_clock_pin: Option<bool>,
pub clock_gate_enable_pin: Option<bool>,
pub clock_gate_test_pin: Option<bool>,
pub clock_gate_obs_pin: Option<bool>,
pub clock_gate_out_pin: Option<bool>,
pub clock_isolation_cell_clock_pin: Option<bool>,
pub direction: LibPinDirection,
pub driver_type: Option<LibDriverType>,
pub output_signal_level: Option<String>,
pub output_signal_level_high: Option<f64>,
pub output_signal_level_low: Option<f64>,
pub output_voltage: Option<String>,
pub input_signal_level: Option<String>,
pub input_voltage: Option<String>,
pub has_builtin_pad: Option<bool>,
pub hysteresis: Option<bool>,
pub is_pad: Option<bool>,
pub is_unconnected: Option<bool>,
pub multicell_pad_pin: Option<bool>,
pub inverted_output: Option<bool>,
pub connection_class: Option<String>,
pub fault_model: Option<String>,
pub dont_fault: Option<LibDontFault>,
pub internal_node: Option<String>,
pub input_map: Option<String>,
pub pin_func_type: Option<LibPinFuncType>,
pub primary_output: Option<bool>,
pub pulling_current: Option<f64>,
pub pulling_resistance: Option<f64>,
pub restore_action: Option<LibAction>,
pub restore_edge_type: Option<LibRestoreEdgeType>,
pub rise_capacitance: Option<f64>,
pub rise_current_slope_after_threshold: Option<f64>,
pub rise_current_slope_before_threshold: Option<f64>,
pub rise_time_after_threshold: Option<f64>,
pub rise_time_before_threshold: Option<f64>,
pub save_action: Option<LibAction>,
pub signal_type: Option<LibSignalType>,
pub slew_control: Option<LibSlewControl>,
pub state_function: Option<LibExpr>,
pub test_output_only: Option<bool>,
pub three_state: Option<LibExpr>,
pub x_function: Option<LibExpr>,
pub fall_capacitance_range: Option<[f64; 2]>,
pub rise_capacitance_range: Option<[f64; 2]>,
}
#[model]
#[derive(Debug, Clone)]
pub struct LibTiming {
pub related_pin: String,
pub timing_sense: String,
pub cell_fall: LibLutTable,
pub cell_rise: LibLutTable,
pub fall_transition: LibLutTable,
pub rise_transition: LibLutTable,
}
#[model]
#[derive(Debug, Clone)]
pub struct LibInternalPower {
pub related_pin: String,
pub fall_power: LibLutTable,
pub rise_power: LibLutTable,
}
#[model]
#[derive(Debug, Clone)]
pub struct LibLutTable {
pub name: String,
pub index_1: Vec<f64>,
pub index_2: Vec<f64>,
pub values: Vec<Vec<f64>>,
}
lib_enum!(LibPinDirection, input, output, inout, internal);
lib_enum!(LibAntennaDiodeType, power, ground, power_and_ground);
lib_enum!(LibDriverType,
pull_up,
pull_down,
open_drain,
open_source,
bus_hold,
resistive,
resistive0,
resistive1,
);
lib_enum!(LibDontFault, sa0, sa1, sao1);
lib_enum!(LibNextStateType,
data,
preset,
clear,
load,
scan_in,
scan_enable,
);
lib_enum!(LibAction, l, h, r, f);
lib_enum!(LibRestoreEdgeType, edge_trigger, leading, trailing);
lib_enum!(LibSlewControl, low, medium, high, none);
lib_enum!(LibSignalType,
test_scan_in,
test_scan_in_inverted,
test_scan_out,
test_scan_out_inverted,
test_scan_enable,
test_scan_enable_inverted,
test_scan_clock,
test_scan_clock_a,
test_scan_clock_b,
test_clock,
);
lib_enum!(LibPinFuncType,
clock_enable,
active_high,
active_low,
active_rising,
active_falling,
);
impl LibPin {
pub fn new<S: Into<String>>(name: S) -> Self {
Self {
name: name.into(),
..Default::default()
}
}
}