Timing Library (.lib)
- The timing library (.lib) is an ASCII representation of the Timing, Power and Area associated with the standard cells.
- Characterization of cells under different PVT conditions results in the timing library (.lib).
- The delay calculation happens based on input transition (Slew) and the output capacitance (Load).
- Nowadays, CCS and ECSM models are used to characterize the library, where the calculations are based on current models which is more accurate. (In earlier days, it was NLDM model which was based on voltage calculation.)
- There are basically three major parts in the .lib file:
- Global definition
- Cell definition
- Pin definition
Lets dig more into the .lib file by looking into its contents. Below are the contents of .lib file. We will go through each and every point of this .lib.
library(“<timing_library_file_name>”) { ==> library and the name
technology (cmos) ; ==> Which technology this is, like this one is CMOS technology.
delay_model : table_lookup ; ==> This explains about the delay model
library_features ( report_delay_calculation ) ;
date : “<>” ; ==> Which date this .lib is generated.
revision : “<>” ; ==> This is a tag of revised lib, if the .lib is revised.
nom_process : 1.000 ; ==> Nominal Process
nom_voltage : 0.500 ; ==> Nominal Voltage
nom_temperature : 0.000 ; ==> Nominal Temperature
operating_conditions( “TC_0C_0.500v” ) { ==> Now with the help of PVT defined above we define operating condition
process : 1.0000 ;
process : 1.0000 ;
voltage : 0.5000 ;
temperature : 0.0000 ;
} /*
voltage_unit : “1V” ; ==> Voltage Unit
time_unit : “1ns” ; ==> Time Unit
capacitive_load_unit (1.000000, pf); ==> Capacitance unit
slew_derate_from_library : 1.0000 ; ==> Slew derate definition
slew_lower_threshold_pct_rise : 25.0000 ; ==> Lower Threshold value of the rise percentage, which is 25% here
slew_lower_threshold_pct_fall : 25.0000 ; ==> Lower Threshold value of the fall percentage, which is 25% here
slew_upper_threshold_pct_rise : 75.0000 ; ==> Upper Threshold value of the rise percentage, which is 75% here
slew_upper_threshold_pct_fall : 75.0000 ; ==> Upper Threshold value of the rise percentage, which is 75% here
input_threshold_pct_rise : 50.0000 ; ==> Input threshold percentage of rise signal, which is 50% input_threshold_pct_fall : 50.0000 ; ==> Input threshold percentage of fall signal, which is 50%
output_threshold_pct_rise : 50.0000 ; ==> Outputs threshold percentage of rise signal, which is 50%
output_threshold_pct_fall : 50.0000 ; ==> Outputs threshold percentage of rise signal, which is 50%
k_temp_rise_transition : 0.000000;
k_temp_fall_transition : 0.000000;
default_fanout_load : 1.000000;
default_inout_pin_cap : 1.000000;
default_input_pin_cap : 1.000000;
default_output_pin_cap : 0.000000;
cell(ivlsi_inv) { ==> Cell definition as cell and its name is ivlsi_inv
sensitization_master : sensitization_2pins ; ==> Says about the inputs and output where sensitivity present.
pin_name_map(a, nz);
area : 0.058320 ; ==> Although Area is non-characterization element but still present wrt physical information.
cell_footprint : invbfx__0_27000x0_21600 ; ==> Cell footprint is something depends on physical presence of cell defined.
dont_touch : true ; ==> Don’t touch means this cell can be used as dont touch while implementation.
dont_use : true ; ==> Similar to don’t touch we can have it as don’t use.
user_function_class : invbfx ; ==> User function defined
bias_cell_type : type0 ;
leakage_power() { ==> This defines the leakage power of the cell
related_pg_pin : “vddx” ; ==> vddx is the power pin, related to this pin we gets Leakage power
when : “!a” ; ==> Condition at which leakage power defines
value : “10.3396” ; ==> Value of the leakage power when condition is “!a”.
}
leakage_power() {
related_pg_pin : “vddx” ;
when : “a” ;
value : “27.3392” ; ==> Same as above value of the Leakage power when condition is “a”.
}
leakage_power() {
related_pg_pin : “vddx” ;
value : “18.8394” ; ==> Value of the Leakage power without any condition.
}
Below are the definitions of the pins of the inverter cell like vdd_sub, vddx, vssx, a and nz.
pg_pin(vdd_sub) {
voltage_name : vdd_sub ;
pg_type : nwell ;
physical_connection : device_layer ;
}
pg_pin(vddx) {
voltage_name : vddx ;
pg_type : primary_power ;
related_bias_pin : “vdd_sub” ;
} ´
pg_pin(vssx) {
voltage_name : vssx ;
pg_type : primary_ground ;
}
pin(a) {
capacitance : 0.00160233 ;
direction : input ;
driver_waveform_rise : “driver_waveform_default_rise” ;
driver_waveform_fall : “driver_waveform_default_fall” ;
fall_capacitance : 0.00160673 ;
input_voltage : default ;
max_transition : 1.25 ;
min_transition : 0.0026 ;
related_ground_pin : vssx ;
related_power_pin : vddx ;
rise_capacitance : 0.00159793 ;
}
pin(nz) {
direction : output ;
function : “(!a)” ;
max_capacitance : 0.189116 ;
min_capacitance : 0.0001753 ;
output_voltage : default ;
related_ground_pin : vssx ;
related_power_pin : vddx ;
power_down_function : “!vddx+vssx+!vdd_sub” ;
internal_power() {
related_pin : “a” ;
fall_power(pwr_tin_oload_8x8) {
index_1(“0.0026, 0.0091, 0.0208, 0.0477, 0.1092, 0.2501, 0.5728, 1.3117”); ==> Index 1 is Inputs transition.
index_2(“0.0001753, 0.001753, 0.005259, 0.014024, 0.028048, 0.056096, 0.112192, 0.224384”); ==> Index 2 is output transition.
The below values defined under values are the calculations between index_1 and index_2.
values(“-0.000147999, -0.000116204, -9.9388e-05, -9.15477e-05, -8.89641e-05, -8.86109e-05”,\
“-0.000147329, -0.000133719, -0.000114725, -9.90501e-05, -9.2389e-05, -8.74372e-05, -8.76292e-05”,\
“-9.62226e-05, -0.000109586, -0.000108212, -9.87576e-05, -9.17245e-05, -8.51122e-05”,\
“5.85213e-05, 1.06494e-05, -3.07649e-05, -5.67322e-05, -6.60965e-05, -7.55423e-05”,\
“0.000448619, 0.000358893, 0.000251914, 0.000138144, 6.99835e-05, -3.59452e-05”,\
“0.00138605, 0.0012478, 0.00105279, 0.000788589, 0.000579694, 0.000238867, 0.000131103”,\
“0.00358914, 0.00339593, 0.0030936, 0.00261539, 0.00216088, 0.00118175, 0.000788172”,\
“0.00866063, 0.00841249, 0.0079894, 0.00724807, 0.00644864, 0.00542011, 0.004257, 0.00311623”);
}
rise_power(pwr_tin_oload_8x8) {
index_1(“0.0026, 0.0091, 0.0208, 0.0477, 0.1092, 0.2501, 0.5728, 1.3117”);
index_2(“0.0001753, 0.001753, 0.005259, 0.014024, 0.028048, 0.056096, 0.112192, 0.224384”);
values(“0.000568497, 0.000599019, 0.000616371, 0.000623806, 0.000620044, 0.000606421”,\
“0.00057026, 0.000579005, 0.000601697, 0.000616349, 0.000613066, 0.000606767”,\
“0.000624926, 0.000609997, 0.000606642, 0.000614282, 0.000609817, 0.000602518”,\
“0.000779716, 0.000735585, 0.000693294, 0.000636192, 0.000617264, 0.000604443”,\
“0.00116515, 0.00108679, 0.000988542, 0.000750226, 0.00069269, 0.000640554”,\
“0.00208005, 0.00196292, 0.00179229, 0.00114358, 0.000990842, 0.000850647”,\
“0.00421199, 0.00405349, 0.00379951, 0.00248531, 0.00199356, 0.00158282”,\
“0.00912789, 0.0089296, 0.00858221, 0.00795848, 0.00522903, 0.00407016”);
} }
timing() {
related_pin : “a” ;
timing_sense : negative_unate ;
timing_type : combinational ;
cell_fall(tmg_ntin_oload_8x8) {
index_1(“0.0026, 0.0091, 0.0208, 0.0477, 0.1092, 0.2501, 0.5728, 1.3117”);
index_2(“0.0001753, 0.001753, 0.005259, 0.014024, 0.028048, 0.056096, 0.112192, 0.224384”);
values(“0.00393813, 0.00625971, 0.010441, 0.0205487, 0.133222, 0.262049”,\
“0.00582735, 0.00929867, 0.0147726, 0.0257469, 0.0741512, 0.138551, 0.267403”,\
“0.00777565, 0.0126066, 0.0199625, 0.0333371, 0.0511158, 0.14803, 0.276876”,\
“0.0106062, 0.0174052, 0.0277462, 0.0456719, 0.067481, 0.104167, 0.169837, 0.298695”,\
“0.0146357, 0.0242567, 0.0389171, 0.0641249, 0.0935581, 0.139434, 0.215086, 0.348664”,\
“0.0205777, 0.0340551, 0.054797, 0.0906361, 0.132208, 0.19485, 0.291265, 0.447761”,\
“0.0297283, 0.0484552, 0.0777388, 0.128609, 0.187845, 0.276577, 0.40946, 0.612261”,\
“0.045054, 0.0702475, 0.111051, 0.182581, 0.266549, 0.392714, 0.581635, 0.863379”);
} wave_fall(1, 2);