Skip to content
DenseChip
Learn
PracticeCode labInterview

DenseChip

Navigate

Menu

LearnPracticeCode labInterview

Tools

All toolsSV editorCode repoResume
DenseChip

Practice, courses, and chip-design tools in one focused workspace.

LearnPracticeCode labInterviewToolsLearning paths

© 2026 DenseChip

AboutRoadmapCareersInternshipsFAQContactPrivacyTerms
Skip to lesson

Course contents

  • How to Use This Course
  • Reading Paths
  • Glossary
  • Metrics Reference
  • Formal Cheat Sheet
  • Formal Foundations19
    • Formal versus Simulation
    • Transition Systems, Invariants and the Three Property Roles
    • Reset, Initial State and the First Cycle
    • Cone of Influence
      • What the Cone Is
      • COI Reduction Is Exact
      • Reading Cone Size per Property
      • Cone and Runtime Numbers
    • The Formal Tool Flow, Vendor-Neutral
  • Properties and SVA16
  • Property Development and Constraints19
  • Proof Engines and Convergence23
  • Formal Applications20
  • Equivalence Checking14
  • Formal Coverage and Signoff15
  • Methodology and Debug13
  • Interview Prep15
  • Capstone: A Chip-Block Verification Lab24
Loading lesson

←Cone of Influence
  1. Topics
  2. Formal Verification
  3. Formal Foundations
  4. Cone of Influence
  5. What the Cone Is
On this page

    Part 1 of 10, lesson 12 of 19Part 1 of 10/Formal Foundations/Lesson 12 of 19All levels

    What the Cone Is

    The transitive fan-in through next-state functions, computed per property on a small netlist.

    Why it matters

    A property on one channel of a four-channel block took as long as a property on the whole block. The engineer assumed the tool looked only at the channel, but the channels shared twenty flops of control (illustrative numbers) and the proof correctly included them. Until the team could compute the cone by hand on a small example, every runtime argument was guesswork. This lesson is that hand computation.

    Job of this lesson: define the cone as the transitive fan-in through next-state functions, computed per property, and scale it to the four-channel example.

    The core idea

    Start from the flops the property reads. Add every flop and input that can affect them through the next-state functions, and every gate on the way. Repeat until nothing new is added. That fixpoint is the cone of influence of that property: different properties on the same design have different cones, and only the cone matters to the run. Shared logic belongs to every cone that touches it, which is why the channel property paid for the shared control.

    A property reads the flop q0. The cone adds q0's next-state inputs d0 and c0, then their inputs a, sel, req and gnt, then their drivers x0 and mode. The flop q1 and the nets d1, b and x1 feed only q1, so they lie outside the cone.
    The cone of a property that reads only q0 on the small netlist of the script below: it follows fan-in from q0, and q1 with its inputs lies outside.

    Worked example: a dozen nets by hand

    Each net maps to the nets its next state or its logic reads. Five nets are flops (q0, q1, c0, x0, x1), three are inputs, five are gates. The property reads two flops; the fixpoint adds their drivers and stops. The check is applied to the netlist and then to a copy with one edge dropped, a no longer reads x0: x0 is reached only through that edge, so the cone shrinks and the check catches it. The same cone function then counts flops for the four-channel block (illustrative sizes: four channels of 100 flops and 20 shared flops).

    example.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    inputs = {"req", "gnt", "mode"}
    flops = {"q0", "q1", "c0", "x0", "x1"}
    fanin = {
        "q0": ["d0", "c0"], "q1": ["d1", "c0"], "c0": ["req", "gnt"],
        "d0": ["a", "sel"], "d1": ["b", "sel"],
        "a": ["x0"], "b": ["x1"], "sel": ["mode"],
        "x0": ["mode"], "x1": ["mode"],
        "req": [], "gnt": [], "mode": [],
    }
    
    def cone(netlist, reads):
        seen, frontier = set(), list(reads)
        while frontier:
            n = frontier.pop()
            if n not in seen:
                seen.add(n)
                frontier.extend(netlist[n])
        return seen
    
    def check(netlist):
        both = cone(netlist, ["q0", "q1"])
        assert len(both) == 13 and len(both & flops) == 5 and len(both & inputs) == 3
        narrow = cone(netlist, ["q0"])
        assert narrow == {"q0", "d0", "c0", "a", "sel", "req", "gnt", "x0", "mode"}
        assert len(narrow & flops) == 3 and narrow < both
    
    check(fanin)
    mutant = dict(fanin)
    mutant["a"] = []
    assert cone(fanin, ["q0", "q1"]) - cone(mutant, ["q0", "q1"]) == {"x0"}
    caught = False
    try:
        check(mutant)
    except AssertionError:
        caught = True
    assert caught
    
    def channel_cone(touched, per_channel=100, shared=20):
        return touched * per_channel + shared
    
    assert channel_cone(4) == 420 and channel_cone(1) == 120 and channel_cone(0) == 20
    assert 2 ** channel_cone(4) // 2 ** channel_cone(1) == 2 ** 300
    print("PASS: cones of 13 and 9 nets (5 and 3 flops); a dropped edge loses x0 and is caught; one channel faces 120 of 420 flops")

    Property (illustrative block)

    Flops in its cone

    States it faces

    On channel 0 only

    100 own + 20 shared = 120

    2 to the 120

    Across channels 0 and 1

    200 own + 20 shared = 220

    2 to the 220

    On the shared control only

    20

    2 to the 20

    Whole block

    4 x 100 + 20 = 420

    2 to the 420

    The cone of one channel faces 2 to the 120 against 2 to the 420 for the whole block, a ratio of 2 to the 300. On the running FIFO the range check reads only count, a cone of 3 flops, while the tracked-data check also reads the memory and the pointers. Report the cone size per property: it should match the expected logic.

    What the review looks for

    • The cone is defined as transitive fan-in through next-state functions, per property, and shared logic is counted in every cone that touches it.

    • Cone sizes are quoted per property and match the expected logic.

    • No claim is made that the tool looks at anything outside the cone.

    Verify and debug

    Recompute the cone by hand on the schematic for any property whose runtime surprises you: the usual surprise is shared control you forgot. When a property passes instantly, read its cone before celebrating; an empty cone means a disconnected assertion, covered in the third lesson of this topic.

    A hand-computed cone that misses an edge. Symptom: a property predicted to be cheap that is as slow as the whole block. Cause: a fan-in the schematic reading skipped, such as a shared enable or a clock-gate input. Fix: compute the cone with a script on the netlist and compare with the tool's report. Found by the mismatch between the predicted and reported cone, as the dropped edge above shows.

    “How big is the cone of this property?” Answer by construction: the flops it reads plus their transitive next-state fan-in, counted per property, with shared logic belonging to every cone that touches it. Quote the channel numbers: 120 of 420 flops (illustrative), a 2-to-the-300 ratio. Then say what you would do if the cone mismatched the expected logic.

    Check yourself Two properties on the same design have very different runtimes. What is the first number you compare?

    Their cone sizes: different properties see different slices, and shared logic belongs to both. The slower one often has the wider cone, though cone size alone does not predict time.

    Check yourself The hand computation drops one fan-in edge and the cone shrinks. Why is that check in the lesson?

    It shows the computation can fail: a missed edge under-counts the cone, so the fixpoint must be checked against the schematic, not trusted blindly.

    Related topics

    • Next: COI Reduction Is Exact

    • Later: Abstraction Techniques

    Previous

    17 / 183

    Next: COI Reduction Is Exact

    Up next

    Up nextCOI Reduction Is Exact

    Sign in to save progress

    Practice this lessonPrevious lessonReport an error

    See also

    • Reading Cone Size per Property
    • Cone and Runtime Numbers