Games / Command flash cards / Liberty timing libraries / Delay tables and models

Delay tables and models

Each card shows a command to explain. A missed card returns later in the round and starts the schedule over. A card answered correctly moves up the schedule and next appears after 1, 3, 7, then 21 days. Keys 1 to 4 choose an option, h shows a hint, and Enter moves on. A hint keeps the card where it is on the schedule. An ordering card is answered by clicking its items in order, and one wrong click ends it. Time values are in nanoseconds. Progress is stored in this browser.

SourceLiberty is the format that carries a cell library's timing and power. These cards are checked against the Nangate45 library that OpenROAD-flow-scripts ships, and the excerpts are quoted from it. Liberty is a Synopsys format whose specification is licensed; the behaviour described here is what the open timer OpenSTA implements, and answers link to its command reference. Reference: the OpenSTA command reference (Liberty on GitHub).
All 7 cards in this section, with answers
  • cell_rise (Timing_7_7) { index_1 ("0.00117378, 0.00472397, ..."); /* input transition */ index_2 ("0.365616, 1.893040, ..."); /* output load */ values ("0.0189, 0.0247, ...", ...);
    Delay against input transition and output load.

    Hint: Two indexes, one grid of values. Ask what each axis is.

    The grid is characterized, so a real value is interpolated on it. These are the two things a cell's delay depends on most. A real value between grid points is interpolated, and outside the grid it is extrapolated, which is why the limits exist. The template name says the grid's size, here seven by seven. Liberty reference

  • cell_rise (...) cell_fall (...) rise_transition (...) fall_transition (...)
    Delay and output slew, each for a rising and a falling output.

    Hint: Two are delays. Ask what the other two are for.

    A stage's output slew is the next stage's input transition, so the transition tables are what let delay propagate along a path. Rise and fall are characterized separately because the pull-up and pull-down networks are not identical. Liberty reference

  • lu_table_template (Timing_7_7) { variable_1 : input_net_transition; variable_2 : total_output_net_capacitance; index_1 (...); index_2 (...); }
    Names a reusable grid, so each table lists only its values.

    Hint: Ask why a library would name a grid instead of repeating it.

    Hundreds of cells share the same axes, so the axes are declared once and referenced by name. variable_1 and variable_2 say what the axes mean, which is how a reader knows whether index 1 is transition or load. Liberty reference

  • output_current_rise () { vector (...) { ... } }
    The driver's current over time, not a single delay value.

    Hint: Ask what this gives a delay calculator that a single delay number cannot.

    The receiving waveform is computed from that current. CCS (Composite Current Source) models the driver as a current source rather than a single delay, which matters when the load is resistive enough that the received waveform is not a simple ramp. The library is much larger, and the older NLDM (Non-Linear Delay Model) tables usually remain alongside. Liberty reference

  • index_1 ("0.00117378,...,0.198535"); index_2 ("0.365616,...,23.4"); /* a load of 40 is asked for */
    The tool extrapolates, which is far less trustworthy than interpolating.

    Hint: The value asked for is past the end of the axis.

    Inside the grid the tool interpolates between characterized points, which is accurate. Outside it, the straight-line continuation can be badly wrong, which is why a driver loaded far past its max_capacitance gives delays nobody should trust, and why the limit exists. Liberty reference

  • cell_rise (Timing_7_7) { index_1 ("0.0012, ... , 0.1985"); /* input transition */ index_2 ("0.3656, ... , 23.40"); /* output load */ values ("0.0189,0.0243,...", \ "0.0221,0.0276,..."); }
    One string per input transition, each holding the values across the loads.

    Hint: There is one string per value of one axis. Ask which axis.

    Rows follow index_1 and columns follow index_2, so reading a table by hand means counting into the right string. Getting the order backwards is a classic error when a library is written by a script rather than a characterization tool. Liberty reference

  • ocv_sigma_cell_rise (Timing_7_7) { sigma_type : early; values ( ... ); }
    How much this delay varies, per cell rather than by a flat derate.

    Hint: The ordinary table holds one delay. Ask what this one adds.

    A single derate factor over-margins long paths and under-margins short ones. LVF (Liberty Variation Format) stores a standard deviation beside every delay and constraint, so a timer can combine variation along the path statistically. It multiplies the library's size, which is why not every library ships it. Liberty reference