/*
 * Copyright 2022 GlobalFoundries PDK Authors
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

library(gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50) { 
  delay_model : table_lookup ; 
  library_features(report_delay_calculation, report_power_calculation);
  time_unit : 1ns ; 
  voltage_unit : 1V ; 
  current_unit : 1mA ; 
  capacitive_load_unit(1, pf);
  pulling_resistance_unit : 1ohm ; 
  leakage_power_unit : 1uW ; 
  input_threshold_pct_fall : 50 ; 
  input_threshold_pct_rise : 50 ; 
  output_threshold_pct_fall : 50 ; 
  output_threshold_pct_rise : 50 ; 
  slew_derate_from_library : 0.5 ; 
  slew_lower_threshold_pct_fall : 30 ; 
  slew_lower_threshold_pct_rise : 30 ; 
  slew_upper_threshold_pct_fall : 70 ; 
  slew_upper_threshold_pct_rise : 70 ; 
  nom_process : 1 ; 
  nom_temperature : 125 ; 
  nom_voltage : 4.5 ; 
  voltage_map(VNW, 4.5);
  voltage_map(VDD, 4.5);
  voltage_map(VSS, 0);
  voltage_map(VPW, 0);

  operating_conditions(gf180mcu_fd_sc_mcu7t5v0__ss_125C_4v50) { 
    process : 1 ; 
    temperature : 125 ; 
    voltage : 4.5 ; 
  }

  input_voltage(default) { 
    vil : 0 ; 
    vih : 4.5 ; 
    vimin : 0 ; 
    vimax : 4.5 ; 
  }

  output_voltage(default) { 
    vol : 0 ; 
    voh : 4.5 ; 
    vomin : 0 ; 
    vomax : 4.5 ; 
  }

  lu_table_template(cnst_ctin_rtin_10x10) { 
    variable_1 : constrained_pin_transition ; 
    variable_2 : related_pin_transition ; 
    index_1("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
    index_2("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
  }

  lu_table_template(ndw_ntin_nvolt_10x13) { 
    variable_1 : input_net_transition ; 
    variable_2 : normalized_voltage ; 
    index_1("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
    index_2("1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13");
  }

  lu_table_template(tmg_ntin_10) { 
    variable_1 : input_net_transition ; 
    index_1("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
  }

  lu_table_template(tmg_ntin_oload_10x10) { 
    variable_1 : input_net_transition ; 
    variable_2 : total_output_net_capacitance ; 
    index_1("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
    index_2("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
  }

  power_lut_template(pwr_tin_10) { 
    variable_1 : input_transition_time ; 
    index_1("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
  }

  power_lut_template(pwr_tin_oload_10x10) { 
    variable_1 : input_transition_time ; 
    variable_2 : total_output_net_capacitance ; 
    index_1("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
    index_2("1, 2, 3, 4, 5, 6, 7, 8, 9, 10");
  }

  normalized_driver_waveform(ndw_ntin_nvolt_10x13) { 
    driver_waveform_name : "driver_waveform_default_fall" ; 
    index_1("0.02, 0.06818, 0.2373, 0.5602, 1.063, 1.769, 2.698, 3.869, 5.297, 7");
    index_2("0, 0.05, 0.1674, 0.3, 0.4168, 0.5209, 0.6146, 0.7, 0.7786, 0.8518, 0.9205, 0.9857, 1");
    values("0, 0.0025, 0.005, 0.0075, 0.01, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03",\
           "0, 0.008522, 0.01704, 0.02557, 0.03409, 0.04261, 0.05113, 0.05965, 0.06818, 0.0767, 0.08522, 0.09374, 0.1023",\
           "0, 0.02966, 0.05932, 0.08898, 0.1186, 0.1483, 0.178, 0.2076, 0.2373, 0.2669, 0.2966, 0.3263, 0.3559",\
           "0, 0.07003, 0.1401, 0.2101, 0.2801, 0.3501, 0.4202, 0.4902, 0.5602, 0.6303, 0.7003, 0.7703, 0.8403",\
           "0, 0.1329, 0.2658, 0.3988, 0.5317, 0.6646, 0.7975, 0.9304, 1.063, 1.196, 1.329, 1.462, 1.595",\
           "0, 0.2212, 0.4423, 0.6635, 0.8847, 1.106, 1.327, 1.548, 1.769, 1.99, 2.212, 2.433, 2.654",\
           "0, 0.3373, 0.6746, 1.012, 1.349, 1.686, 2.024, 2.361, 2.698, 3.036, 3.373, 3.71, 4.047",\
           "0, 0.4836, 0.9671, 1.451, 1.934, 2.418, 2.901, 3.385, 3.869, 4.352, 4.836, 5.319, 5.803",\
           "0, 0.6621, 1.324, 1.986, 2.649, 3.311, 3.973, 4.635, 5.297, 5.959, 6.621, 7.284, 7.946",\
           "0, 0.875, 1.75, 2.625, 3.5, 4.375, 5.25, 6.125, 7, 7.875, 8.75, 9.625, 10.5");
  }

  normalized_driver_waveform(ndw_ntin_nvolt_10x13) { 
    driver_waveform_name : "driver_waveform_default_rise" ; 
    index_1("0.02, 0.06818, 0.2373, 0.5602, 1.063, 1.769, 2.698, 3.869, 5.297, 7");
    index_2("0, 0.05, 0.1674, 0.3, 0.4168, 0.5209, 0.6146, 0.7, 0.7786, 0.8518, 0.9205, 0.9857, 1");
    values("0, 0.0025, 0.005, 0.0075, 0.01, 0.0125, 0.015, 0.0175, 0.02, 0.0225, 0.025, 0.0275, 0.03",\
           "0, 0.008522, 0.01704, 0.02557, 0.03409, 0.04261, 0.05113, 0.05965, 0.06818, 0.0767, 0.08522, 0.09374, 0.1023",\
           "0, 0.02966, 0.05932, 0.08898, 0.1186, 0.1483, 0.178, 0.2076, 0.2373, 0.2669, 0.2966, 0.3263, 0.3559",\
           "0, 0.07003, 0.1401, 0.2101, 0.2801, 0.3501, 0.4202, 0.4902, 0.5602, 0.6303, 0.7003, 0.7703, 0.8403",\
           "0, 0.1329, 0.2658, 0.3988, 0.5317, 0.6646, 0.7975, 0.9304, 1.063, 1.196, 1.329, 1.462, 1.595",\
           "0, 0.2212, 0.4423, 0.6635, 0.8847, 1.106, 1.327, 1.548, 1.769, 1.99, 2.212, 2.433, 2.654",\
           "0, 0.3373, 0.6746, 1.012, 1.349, 1.686, 2.024, 2.361, 2.698, 3.036, 3.373, 3.71, 4.047",\
           "0, 0.4836, 0.9671, 1.451, 1.934, 2.418, 2.901, 3.385, 3.869, 4.352, 4.836, 5.319, 5.803",\
           "0, 0.6621, 1.324, 1.986, 2.649, 3.311, 3.973, 4.635, 5.297, 5.959, 6.621, 7.284, 7.946",\
           "0, 0.875, 1.75, 2.625, 3.5, 4.375, 5.25, 6.125, 7, 7.875, 8.75, 9.625, 10.5");
  }
}
