The Bridge Between Silicon and Simulation

You've learned that Liberty files describe standard cells, and you understand why we need multiple process corners. Now it's time to dive into the actual electrical data that makes timing analysis possible: cell characterization data.

Think of cell characterization as the laboratory measurement process that translates physical silicon into numbers that EDA tools can use. Engineers fabricate test structures, apply thousands of different input conditions, measure the results with picosecond precision, and encode all that data into lookup tables. Every timing number in your static timing analysis report traces back to these measurements.

This module explores what gets measured, how it's represented in Liberty files, and why each piece of data matters for your design.

Understanding Timing Arcs

What Is a Timing Arc?

A timing arc represents the relationship between an input signal change and an output signal response. It's the fundamental building block of timing analysis.

Basic Definition
A timing arc specifies:

  • Which input pin affects which output pin
  • How the output responds (rising, falling, or both)
  • The delay and transition time under various conditions

Arc Representation in Liberty

timing () {
    related_pin : "A";           // Input pin causing the change
    timing_sense : negative_unate;  // Output inverts input
    timing_type : combinational; // Type of arc
    
    /* Delay and transition tables follow */
}

Combinational Timing Arcs

Combinational logic has straightforward input-to-output timing relationships.

Inverter Example

cell (INV_X1) {
    pin (A) {
        direction : input;
        capacitance : 0.0015;
    }
    
    pin (Y) {
        direction : output;
        function : "!A";
        
        timing () {
            related_pin : "A";
            timing_sense : negative_unate;
            timing_type : combinational;
            
            /* When input A rises, output Y falls */
            cell_fall (delay_template_5x5) {
                index_1 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Input transition
                index_2 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Output load
                values ( \
                    "0.045, 0.053, 0.068, 0.098, 0.158", \
                    "0.048, 0.056, 0.071, 0.101, 0.161", \
                    "0.054, 0.062, 0.077, 0.107, 0.167", \
                    "0.066, 0.074, 0.089, 0.119, 0.179", \
                    "0.090, 0.098, 0.113, 0.143, 0.203" \
                );
            }
            
            /* When input A falls, output Y rises */
            cell_rise (delay_template_5x5) {
                index_1 ("0.01, 0.05, 0.1, 0.2, 0.4");
                index_2 ("0.01, 0.05, 0.1, 0.2, 0.4");
                values ( \
                    "0.052, 0.061, 0.078, 0.112, 0.180", \
                    "0.055, 0.064, 0.081, 0.115, 0.183", \
                    "0.061, 0.070, 0.087, 0.121, 0.189", \
                    "0.073, 0.082, 0.099, 0.133, 0.201", \
                    "0.097, 0.106, 0.123, 0.157, 0.225" \
                );
            }
            
            /* Output transition times also included */
            rise_transition (delay_template_5x5) { /* ... */ }
            fall_transition (delay_template_5x5) { /* ... */ }
        }
    }
}

Key Observations

  • Separate tables for rising and falling outputs
  • Delays increase with larger input transitions (slower input)
  • Delays increase with larger output loads (more capacitance to drive)
  • This is real measured data, not theoretical calculations

Multi-Input Gate Complexity

For a 2-input NAND gate, each input has its own timing arc:

cell (NAND2_X1) {
    pin (A) { direction : input; capacitance : 0.0018; }
    pin (B) { direction : input; capacitance : 0.0018; }
    
    pin (Y) {
        direction : output;
        function : "!(A & B)";
        
        /* Timing arc for A -> Y */
        timing () {
            related_pin : "A";
            timing_sense : negative_unate;
            when : "B";  // This arc is active when B is high
            /* Delay tables... */
        }
        
        /* Timing arc for B -> Y */
        timing () {
            related_pin : "B";
            timing_sense : negative_unate;
            when : "A";  // This arc is active when A is high
            /* Delay tables... */
        }
    }
}

Why Multiple Arcs Matter
The A→Y arc might have different delays than B→Y if the transistor stacks are asymmetric. The timing analyzer needs both arcs to accurately compute delays for all possible input transitions.

Timing Sense Classifications

The timing_sense attribute describes how the output relates to the input:

Positive Unate

  • Output changes in the same direction as input
  • Example: Buffer (input rises → output rises)
  • Attribute: timing_sense : positive_unate;

Negative Unate

  • Output changes in the opposite direction as input
  • Example: Inverter (input rises → output falls)
  • Attribute: timing_sense : negative_unate;

Non-Unate

  • Output response depends on other input states
  • Example: XOR gate (A→Y response depends on B's value)
  • Attribute: timing_sense : non_unate;
  • Requires more timing arcs to cover all cases

Sequential Cell Timing

Sequential elements (flip-flops and latches) have significantly more complex timing requirements than combinational gates.

Setup Time: The "Data Must Arrive Early" Constraint

Physical Explanation
Before a flip-flop can reliably capture data on a clock edge, the data must be stable for a minimum time called the setup time. This allows the internal master latch to fully resolve the data state.

Setup Time Definition
The minimum time data must be stable BEFORE the active clock edge.

Liberty Representation

ff ("IQ", "IQN") {
    next_state : "D";
    clocked_on : "CP";  // Clock pin
    
    /* Setup constraint for D with respect to CP */
    timing () {
        related_pin : "D";
        timing_type : setup_rising;  // Setup for rising clock edge
        
        rise_constraint (setup_template_5x5) {
            index_1 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Data transition
            index_2 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Clock transition
            values ( \
                "0.085, 0.090, 0.098, 0.114, 0.146", \
                "0.083, 0.088, 0.096, 0.112, 0.144", \
                "0.079, 0.084, 0.092, 0.108, 0.140", \
                "0.071, 0.076, 0.084, 0.100, 0.132", \
                "0.055, 0.060, 0.068, 0.084, 0.116" \
            );
        }
        
        fall_constraint (setup_template_5x5) {
            /* Setup time for falling data edge */
        }
    }
}

Reading the Table

  • Row index: Data transition time (how fast data changes)
  • Column index: Clock transition time (how fast clock edge rises)
  • Values: Required setup time in nanoseconds

Key Insight
Faster input transitions (smaller index values) generally require MORE setup time because the flip-flop's internal nodes switch more rapidly and need more time to settle.

Hold Time: The "Data Must Stay Stable" Constraint

Physical Explanation
After the clock edge captures data, the data must remain stable for a minimum time called the hold time. This ensures the internal master latch has completely captured the data before it can change.

Hold Time Definition
The minimum time data must remain stable AFTER the active clock edge.

Liberty Representation

/* Hold constraint for D with respect to CP */
timing () {
    related_pin : "D";
    timing_type : hold_rising;  // Hold for rising clock edge
    
    rise_constraint (hold_template_5x5) {
        index_1 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Data transition
        index_2 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Clock transition
        values ( \
            "0.042, 0.038, 0.031, 0.017, -0.015", \
            "0.044, 0.040, 0.033, 0.019, -0.013", \
            "0.048, 0.044, 0.037, 0.023, -0.009", \
            "0.056, 0.052, 0.045, 0.031, -0.001", \
            "0.072, 0.068, 0.061, 0.047, 0.015" \
        );
    }
    
    fall_constraint (hold_template_5x5) {
        /* Hold time for falling data edge */
    }
}

Negative Hold Times?
Notice some values are negative. This means data can change slightly before the clock edge and still be captured correctly. This happens in well-designed flip-flops where the master latch closes very quickly.

Critical Design Implication
Hold violations are catastrophic:

  • Cannot be fixed by slowing down the clock
  • Require physical changes (adding delay buffers)
  • Must be verified at FF (fast-fast) corner where delays are minimum

Clock-to-Q Delay: The "Output Response Time"

Physical Explanation
After the clock edge triggers the flip-flop, there's a delay before the output Q reflects the captured data. This delay depends on the flip-flop's internal propagation and the load it's driving.

Liberty Representation

/* Clock-to-output timing arc */
timing () {
    related_pin : "CP";
    timing_type : rising_edge;  // Triggered by rising clock
    timing_sense : non_unate;   // Output depends on data, not clock direction
    
    cell_rise (delay_template_5x5) {
        index_1 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Clock transition
        index_2 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Output load
        values ( \
            "0.156, 0.168, 0.192, 0.240, 0.336", \
            "0.160, 0.172, 0.196, 0.244, 0.340", \
            "0.168, 0.180, 0.204, 0.252, 0.348", \
            "0.184, 0.196, 0.220, 0.268, 0.364", \
            "0.216, 0.228, 0.252, 0.300, 0.396" \
        );
    }
    
    cell_fall (delay_template_5x5) {
        /* Clock-to-Q delay for falling output */
    }
    
    rise_transition (delay_template_5x5) {
        /* Output transition time for rising edge */
    }
    
    fall_transition (delay_template_5x5) {
        /* Output transition time for falling edge */
    }
}

The Complete Timing Picture

For a path from one flip-flop to another:

Launch Flop   Combinational   Capture Flop
    CP        →    Logic    →      CP
    |              |               |
    |--Tclk2q------|               |
                   |----Tlogic-----|
                                   |--Tsetup--
    
Total path delay = Tclk2q + Tlogic
Clock period must be ≥ Tclk2q + Tlogic + Tsetup

This is the fundamental setup timing equation that drives all digital design.

Propagation Delays in Detail

The Two-Dimensional Lookup Model

Every combinational cell delay is characterized as a 2D function:

Delay = f(input_transition, output_load)

Why These Two Variables?

Input Transition Time
Slower input transitions mean:

  • Input spends more time in the linear region
  • Internal nodes take longer to switch
  • Overall delay increases

Fast input (0.01ns) vs. slow input (0.4ns) might show 2-3× delay difference.

Output Load Capacitance
Larger loads mean:

  • More charge must be transferred
  • Output voltage changes more slowly
  • Overall delay increases

Light load (0.01pF) vs. heavy load (0.4pF) might show 3-5× delay difference.

Non-Linear Behavior
These relationships are NOT linear:

  • Doubling load doesn't double delay
  • The delay surface is curved, not flat
  • This is why we need lookup tables, not simple equations

Cell Rise vs. Cell Fall

Most cells have asymmetric behavior:

NMOS vs. PMOS Strength

  • NMOS transistors (pull-down) are naturally stronger
  • PMOS transistors (pull-up) are naturally weaker (≈2-3× larger for same drive)
  • This creates different rise and fall delays

Example: Inverter Delays

Input rising → Output falling: 45ps (fast, NMOS pulling down)
Input falling → Output rising: 52ps (slow, PMOS pulling up)

Design Impact
Clock trees must account for this asymmetry:

  • Different delays for positive vs. negative edge paths
  • Duty cycle distortion accumulates through many stages
  • May require duty cycle correction circuits

Transition Times (Slew Rates)

What Is Transition Time?

Transition time (also called slew or slew rate) measures how fast a signal changes between logic levels.

Standard Definition
Time for the signal to transition between 20% and 80% of the supply voltage range.

  • For 1.8V supply: transition from 0.36V to 1.44V
  • Some libraries use 10%-90% or 30%-70%

Why It Matters

Downstream Delay Calculation
The output transition time of one gate becomes the input transition time for the next gate:

Gate A output transition → Gate B input transition → Gate B delay calculation

If you ignore transition time propagation, your timing analysis is wrong.

Signal Integrity
Very slow transitions (large slew):

  • Increased susceptibility to noise
  • More time spent in the undefined region between logic 0 and 1
  • Can cause multiple switching events in downstream gates

Very fast transitions (small slew):

  • Ground bounce and power supply noise
  • Electromagnetic interference (EMI)
  • Signal integrity issues on long wires

Transition Time Tables

Liberty Representation

rise_transition (delay_template_5x5) {
    index_1 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Input transition
    index_2 ("0.01, 0.05, 0.1, 0.2, 0.4");  // Output load
    values ( \
        "0.025, 0.034, 0.052, 0.088, 0.160", \
        "0.027, 0.036, 0.054, 0.090, 0.162", \
        "0.031, 0.040, 0.058, 0.094, 0.166", \
        "0.039, 0.048, 0.066, 0.102, 0.174", \
        "0.055, 0.064, 0.082, 0.118, 0.190" \
    );
}

Reading the Data

  • Diagonal terms (0.025, 0.036, 0.058, 0.102, 0.190) show that matching input/output conditions produce varied transitions
  • Larger loads produce slower transitions
  • Slower input transitions tend to produce slower output transitions

Design Constraints
Most libraries specify maximum transition time limits:

max_transition : 0.5;  // nanoseconds

If your design exceeds this limit:

  • Characterization data becomes invalid (extrapolation is unreliable)
  • You need to upsize the driving cell or add buffers

Capacitance Values

Input Capacitance

Physical Source
Input capacitance comes from:

  • Gate oxide capacitance of input transistors
  • Diffusion capacitance of internal nodes
  • Interconnect capacitance within the cell

Liberty Representation

pin (A) {
    direction : input;
    capacitance : 0.0018;  // In library capacitance units (pF)
    
    /* May also specify rise/fall separately */
    rise_capacitance : 0.0019;
    fall_capacitance : 0.0017;
}

Why It Varies

  • Larger drive strength cells have larger input transistors → more capacitance
  • INV_X1: 0.0015 pF
  • INV_X2: 0.0030 pF (2× the transistor width)
  • INV_X4: 0.0060 pF (4× the transistor width)

Design Impact
Input capacitance of the load directly affects the driving cell's delay:

Driver output load = Wire capacitance + Sum of all input capacitances

Output Capacitance and Pin Capacitance

Output Pin Capacitance
The intrinsic capacitance of the output pin itself:

pin (Y) {
    direction : output;
    capacitance : 0.0008;  // Much smaller than input cap
}

This is the parasitic capacitance even with no external load.

Max Capacitance Constraint
Cells have maximum load limits:

pin (Y) {
    direction : output;
    max_capacitance : 0.5;  // Maximum safe load
}

Exceeding this limit:

  • Invalidates the characterization data
  • May cause functional failures (output doesn't reach valid logic levels)
  • Requires buffer insertion

Capacitance in Timing Calculation

Complete Load Calculation

Total_output_load = Output_pin_cap 
                  + Wire_capacitance 
                  + Sum(Input_capacitances_of_fanout_cells)

Example Calculation

Driver: INV_X2
  Output pin capacitance: 0.0008 pF
  
Wire: 500μm metal-2
  Parasitic capacitance: 0.020 pF
  
Loads: 4× INV_X1 inputs
  Each input: 0.0015 pF
  Total: 4 × 0.0015 = 0.006 pF

Total load = 0.0008 + 0.020 + 0.006 = 0.0268 pF

This total load is used to index into the delay tables.

Practical Application Example

Let's trace through a complete timing calculation:

Circuit Path

FF1/Q → INV1/A → INV1/Y → NAND2/A → NAND2/Y → FF2/D

Step 1: Clock-to-Q Delay (FF1)

  • Clock transition: 0.05ns
  • Output load (to INV1): 0.025pF
  • Look up in FF1 clock-to-Q table: 0.168ns
  • Output transition: 0.040ns (from transition table)

Step 2: Inverter Delay (INV1)

  • Input transition: 0.040ns (from FF1 output)
  • Output load (to NAND2): 0.030pF
  • Look up in INV1 delay table: 0.058ns
  • Output transition: 0.045ns

Step 3: NAND Gate Delay (NAND2)

  • Input transition: 0.045ns
  • Output load (to FF2): 0.020pF
  • Look up in NAND2 delay table: 0.063ns
  • Output transition: 0.038ns

Step 4: Setup Time Check (FF2)

  • Data transition: 0.038ns
  • Clock transition: 0.05ns
  • Look up in FF2 setup table: 0.090ns

Total Path Delay

Tclk2q + Tinv + Tnand = 0.168 + 0.058 + 0.063 = 0.289ns

Required Clock Period

Tperiod ≥ Tpath + Tsetup = 0.289 + 0.090 = 0.379ns
Maximum frequency ≈ 2.64 GHz

This is exactly how timing analyzers work—millions of these calculations for every path in your design.

Common Characterization Pitfalls

Pitfall 1: Extrapolation Beyond Table Range
Problem: Your design has a 0.8ns input transition, but the table only goes to 0.4ns
Impact: Tool extrapolates linearly (wrong! nonlinear behavior)
Solution: Upsize drivers or insert buffers to keep transitions within characterized range

Pitfall 2: Ignoring Transition Times
Problem: Only looking at delays, not checking transition constraints
Impact: Invalid timing analysis, potential functional failures
Solution: Always verify max_transition constraints are met

Pitfall 3: Misunderstanding Setup/Hold
Problem: Confusing which corner to use (SS for setup, FF for hold)
Impact: Missing timing violations in actual silicon
Solution: Remember—setup needs maximum delays (SS), hold needs minimum delays (FF)

Pitfall 4: Wrong Capacitance Units
Problem: Liberty uses pF, parasitic extraction uses fF
Impact: 1000× error in load calculation
Solution: Always check and convert units carefully

Integration with Design Flow

During Synthesis

  • Tool selects cells based on area, delay, and power from Liberty data
  • Input capacitances affect fanout decisions
  • Max capacitance constraints limit fanout

During Place and Route

  • Physical locations determine wire capacitances
  • Actual loads computed from wire caps + input caps
  • Timing recalculated with accurate load values

During Sign-Off STA

  • Full multi-corner analysis using complete Liberty suites
  • Both rise and fall paths checked
  • Setup at SS corner, hold at FF corner
  • All transition time constraints verified

Summary

Cell characterization data is the foundation of timing analysis:

  • Timing arcs define input-to-output relationships for combinational and sequential cells
  • Setup time specifies minimum data stability before clock edge
  • Hold time specifies minimum data stability after clock edge
  • Clock-to-Q delay defines sequential cell output response time
  • Propagation delays are 2D functions of input transition and output load
  • Transition times propagate through the design and affect downstream delays
  • Capacitance values determine loading effects and drive requirements

Every number in your timing reports comes from this characterized data. Understanding how cells are measured, how data is represented, and how tools use this information is essential for effective timing closure. The Liberty file transforms silicon physics into numbers that computers can work with—and understanding this transformation makes you a more effective digital designer.

In the next module, we'll explore the mathematical models behind these lookup tables and dive into advanced characterization topics like composite current source models and statistical timing.

Did you find what you were looking for?

Quiz

No quiz questions available for this article.