Data import and export
QR code to pdverse.netexplore more at pdverse.net
Innovus PNR Mentor Guide

Design Data Import, Sanity Checks and Export: a judged first database

By the end of this chapter you will be able to judge whether a delivered design package is fit to import. You will import it with a configuration you can explain line by line, and judge the result from evidence. Then you will hand it on as a saved checkpoint, with a precise statement of what is still unproven.

Why this chapter matters in a real project

The previous chapter gave you a session that starts as intended. A session is not a design. Before anyone starts the floorplan, somebody must say, with evidence, which design was loaded. They must also say from which files, under which timing assumptions, and how far that claim can be trusted.

A project hands you a package. A netlist comes from the synthesis team and libraries from the technology provider. Constraint files come from the block owner, and an email says "the usual corners". You are asked to bring it into Innovus and confirm that it is ready for floorplanning.

Every later stage inherits the database that the import creates. Suppose the import loaded the wrong top module, an incomplete library or the wrong timing views. The floorplan will still look plausible. The cost appears much later, when it is expensive to undo.

So the question is not "how do I run init_design". It is this: what must be true about the inputs, the configuration and the imported database before floorplanning can begin? And how do we find out? The command is one line. The judgment around it is the skill.

Prerequisites

Learning objectives

  1. Explain what each input of an import contributes, what it leaves undescribed, and who owns it.
  2. Review a design handoff before launch and decide, with a reason, whether to proceed or stop.
  3. Reconcile the netlist, the physical library and the timing library for the same cell.
  4. Read a small constraint set and a multi-mode multi-corner (MMMC) configuration, and trace each analysis view back to its source files.
  5. Explain every line of an init_design configuration and tell the alternative initialization routes apart.
  6. Interpret representative post-import evidence, choose an action, and state what a clean report still leaves unproven.
  7. Tell a native checkpoint from exported files, and say what each one can and cannot hand to the next person.

Figure 1 shows the whole chapter on one page. Come back to it whenever you lose your place.

Two short names appear in it and in the table that follows. LEF (Library Exchange Format) holds the physical cell data. RC (resistance and capacitance) data lets the tool estimate wire delay.

Data import on one page
Where the chapter sits, and its six learning stages
Data import on one page
Figure 1 The chapter takes a known session to a checked, saved first database, in six stages ordered by dependency.

What to notice: Each stage ends with a sentence you should be able to say before moving on. Judging the evidence (stage 5) only means something against what stages 1 to 4 said the inputs should be.

1  What this chapter is for, and how it is organized

The chapter stops before floorplanning. Later stages appear only as context, never as products of a first import. The top row of Figure 1 shows this position: a known session comes in, and a checked, saved first database goes out.

1.1  The learning roadmap

The six stages are ordered by dependency. Each one needs the understanding built by the one before it. The table below, Table 1, lists what each stage teaches and the milestone sentence that closes it.

Table 1 The six learning stages and their milestones
StageWhat you learnWhy it comes hereYou can continue when you can say
1. Recognize the handoffWhich inputs exist, what each contributes, who owns itNothing later can be judged without knowing what was supposed to arrive"This is the input I expect, this is who supplies it, and this is what it does not tell me."
2. Reconcile logical, physical and timing dataHow the netlist, LEF and Liberty describe the same cell, and how they disagreeMost import failures are disagreements between these three"For this cell I can name the line in each file, and I know what a matching name does not prove."
3. Understand constraints and MMMCWhat constraints assert, and how modes, corners and views connect to filesThe configuration in stage 4 refers to these objects by name"For this view I can trace the libraries, the RC data and the constraint files it uses."
4. Follow the import flowWhat each setting does, and what init_design consumes and producesOnly now can a configuration be read line by line"I can explain every line of this configuration and the route it belongs to."
5. Interpret post-import evidenceWhat each check asks, how to read it, and what to do when it is wrongEvidence is meaningful only against the intended configuration"This report is clean, and this is what it still does not show."
6. Save, restore and exportWhat a checkpoint preserves, and what each exported file is forA handoff is a claim; the claim must match what the file can carry"This checkpoint was verified in this way, and this export is only for that purpose."

The roadmap gives the learning order. The lab follows the operational order. Stages 1 to 3 need no tool. Performing stages 4 and 5 on real data needs a licensed tool and approved inputs.

1.2  Two ways to read this chapter

The chapter has two parts. Part I is the teaching, from this section up to "Saving, restoring and exporting". Part II is a short lab, a set of evidence-reading exercises and a troubleshooting table.

Real execution needs a licensed Innovus in the Legacy UI, the original Innovus command set. Understanding the Innovus Environment and Session teaches it. You also need an approved design, library and technology package. This chapter does not provide either.

1.3  How examples are labeled

Each code block says in its header which kind of material it holds.

One invented design runs through all examples: demo_top. It has two registers and three instances of a small module alu_slice; the third instance is a bypass path. It also has its own libraries, files, modes and corners.

Takeaway The command is one line; the chapter teaches the judgment around it, in dependency order.

2  Reading a design handoff

A handoff is a set of promises made by different people. Before you launch anything, you read the promises and decide which ones you can check. If you cannot say who delivered an input and what it describes, you cannot tell which one to suspect later.

2.1  A realistic arrival

The synthesis engineer sends demo_top.v. The library team points to a release directory. It holds a technology LEF, a standard-cell LEF, a memory-macro LEF and Liberty libraries at two corners. The block owner sends func.sdc and test.sdc.

One email lists the supplies as VDD and VSS. Another says the scan chains are not stitched yet. Someone mentions that the memory vendor "re-released" the macro last week.

Each fact matters and none is verified. The first job is not to launch. It is to record, for each item, what it is meant to be and who owns it. Also record how you will inspect it. The dependencies between these deliveries appear in Figure 2.

A design handoff and what depends on what
Separate deliveries, joined by the MMMC view file and the import configuration
A design handoff and what depends on what
Figure 2 Six deliveries from five owners reach the import, three of them only through file names in the MMMC view file.

What to notice: Some inputs name other files. Access to the top-level file does not guarantee access to the files it refers to.

2.2  What must be established before launch

Before the first command, answer these questions from the package and from the people who delivered it.

  1. Which design revision, and which top module? A netlist directory may hold several versions and several candidate tops. The revision and the top name come from the design owner, not from a guess.
  2. Which technology and library release? Use the combination your project has approved as compatible. A LEF from one release and Liberty files from another can each be valid and still disagree.
  3. Which modes does the design need? A functional mode and a test mode, or one mode? The answer decides how many constraint files you should see.
  4. Which corners are approved for analysis? The project, not the tool, picks the corners. "The usual corners" is not an answer you can check.
  5. Which macros are present, and does each have both a physical and a timing model? A macro with a LEF abstract and no timing model is a classic gap.
  6. What are the power and ground net names, and how do they map? The tool needs the global supply names at import. Unmapped names make power connectivity fail later, in a way that looks unrelated.
  7. Which conditional inputs apply? An I/O assignment file, scan information, power intent, or none. A missing conditional input is not a defect unless the project requires it.
  8. Who owns each input, and who do you ask when it looks wrong? The owner of a netlist is not the owner of a library or of constraints.
  9. Are there nested dependencies, and can you read them? An MMMC file lists Liberty and SDC paths. An SDC file may source another. Permission to read the top file says nothing about those.

For question 6, the names must agree across the netlist, the LEF power pins and your configuration. None of these questions needs a licensed tool. Asking them first moves the discovery of a mistake from "after a ninety-minute import" to "before the launch".

2.3  The inputs at a glance

Table 2 lists each input, its owner, what Innovus takes from it, and the section that teaches it.

Table 2 The inputs of an import
InputProvided byWhat Innovus takes from itTaught in
Gate-level Verilog netlistSynthesis or design teamModules, cell instances, nets, connectivity, the top moduleThe gate-level netlist
Technology LEFTechnology or library teamLayers, vias, sites, routing rulesPhysical library data
Standard-cell LEFLibrary teamSize, site, pin shapes and obstructions of each cellPhysical library data
Macro LEFMacro providerThe same, for a large blockPhysical library data
Liberty timing librariesLibrary teamFunction, pin capacitance and timing arcs, for one condition eachTiming libraries, RC data, supply names
RC technology informationTechnology teamHow wire resistance and capacitance are estimatedTiming libraries, RC data, supply names
Power and ground namesDesign or power teamWhich nets are global suppliesTiming libraries, RC data, supply names
SDC constraintsBlock ownerClocks, I/O timing, exceptions, per modeConstraints
MMMC configurationPhysical-design engineer, with the projectLibraries, RC data and constraints combined into viewsMMMC, command by command
I/O file, scan, power intent, OpenAccess (OA)Project, when requiredPin positions, scan chains, power domains, OA flowConditional inputs

2.4  Six meanings of "OK"

"The inputs are fine" can mean six different things, and they are not equivalent. Table 3 separates them.

Table 3 Six meanings of "the inputs are fine"
The statementWhat it establishesWhat it leaves open
The file is presentA name resolves to something on diskThat you can read it, or that it is the right file
The file is readableYour account may open it and it has contentThat the content is valid
The files are mutually consistentNames, cells and units line up across filesThat this is the design you intended
The intended design was loadedThe top and the views are the ones you asked forThat its data is complete
The checks passedThe questions you asked had acceptable answersThat you asked every question that matters
The design is goodPlacement, timing and routing are soundSettled in later stages, not here

Successful initialization establishes that the tool built a database. By itself, it does not establish the intended top, revision or views. Nor does it establish model completeness, constraint correctness or readiness. It is the start of the evidence, not the end. The ladder in Figure 3 makes the point: each rung needs its own evidence.

From a started session to a verified handoff
Six rungs, each with its own evidence
From a started session to a verified handoff
Figure 3 The previous chapter provides rung 1; this chapter provides rungs 2 to 6.

What to notice: Each rung needs its own evidence. Quality, closure and signoff sit above the ladder, in later chapters.

Exercise

A colleague writes in a status note: "init_design completed with no errors, so the design is ready for floorplanning." Which of the six meanings does that sentence establish, and which does it leave open?

Answer. It shows that the tool built a database. It does not show that the files agree, or that the intended top and revision loaded. Nor does it show the intended views, constraints that describe the design, or that anyone read a check. Each needs its own evidence, taught in the sections that follow.

Takeaway Record what each input is, who owns it and how you will inspect it, before you launch anything.

3  The gate-level netlist

The netlist decides what "the design" is. Two mistakes cost the most time. One is loading the wrong top module. The other is discovering late that modules are shared when they must be independent.

3.1  What a netlist is, and who provides it

A gate-level Verilog netlist describes how standard cells and larger blocks are connected. A synthesis tool normally produces it, and the synthesis or design team owns it.

3.2  Reading a netlist: module, instance, cell master

The excerpt below is a teaching fragment, not a complete netlist.

FILE - demo_top.v (TEACHING EXCERPT, NOT A RUNNABLE NETLIST)
// A sub-module: two standard cells connected in series.
module alu_slice (a, b, y);
  input a, b;
  output y;
  wire n1;
  NAND2_X1 u_nand (.A(a), .B(b), .Y(n1));
  INV_X1   u_inv  (.A(n1), .Y(y));
endmodule
FILE - demo_top.v, CONTINUED (TEACHING EXCERPT)
// The top module: a register, three copies of alu_slice, a register.
module demo_top (clk, din, sel, dout, ybyp);
  input clk, din, sel;
  output dout, ybyp;
  wire q0, y0, y1;
  DFF_X1    u_reg0 (.D(din), .CK(clk), .Q(q0));
  alu_slice u_alu0 (.a(q0),  .b(sel), .y(y0));
  alu_slice u_alu1 (.a(y0),  .b(sel), .y(y1));
  alu_slice u_alu2 (.a(din), .b(sel), .y(ybyp));
  DFF_X1    u_reg1 (.D(y1), .CK(clk), .Q(dout));
endmodule

Three terms are easy to blur.

Named connections such as .A(a) connect the cell pin A to the net a. The pin name must match the library definition. A netlist that says .A1 where the library says A disagrees about the interface, however similar the names look. The hierarchy of the excerpt is drawn in Figure 4.

The hierarchy of the teaching netlist
demo_top instantiates five things; the leaf cells of alu_slice drawn as schematic symbols
The hierarchy of the teaching netlist
Figure 4 demo_top instantiates two flip-flops and three copies of alu_slice, which is one NAND2 followed by an inverter.

What to notice: alu_slice is defined once and used three times. Whether the three copies stay shared is the question of uniquification, below.

3.3  One file or many

A larger design usually has many files, one per module or block, and the importer takes a list. Check three things about the list:

3.4  Choosing the top

The top module is the root of the hierarchy that Innovus builds. Two settings control how it is chosen.

Automatic discovery suits a set with one obvious root. It is a poor choice when the set contains test benches, alternate versions or several blocks. In that case the tool may pick a module you did not mean. For a first import, name the top. A wrong name then fails visibly instead of loading something else quietly.

3.5  What can be wrong with a netlist

Each problem below has a recognizable consequence.

A module or cell with no definition. If u_alu0 refers to alu_slice and no file defines it, the reference is unresolved.

A port mismatch. The module declares ports (a, b, y) and an instance connects .a, .b and .z.

Constants, unconnected pins and multiple drivers. Each means something different, and the post-import checks show the reports that list them.

A netlist can be syntactically valid and still contain connections that a reviewer must look at.

3.6  Why a text search is not proof

Searching the files for a line that starts with module demo_top shows that some file defines a module of that name. It is a heuristic, for three reasons.

A text hit is a reason to expect the import to succeed. The decisive evidence is what the tool reports after loading. Likewise, readable files prove only that they can be opened. They do not prove that they elaborate into the design you meant.

3.7  Uniquification: why identical modules may need to become different

Return to the three copies of alu_slice. The netlist has one definition and three instances, so a change to the definition would change every instance. That is efficient, and it is how hierarchy is normally written.

Implementation does not stay uniform. One copy may need a bigger cell on its critical path, and another a different buffer. A clock tree may add buffers in some instances only. If all three share one definition, any such change applies to all three, which is wrong.

To change instances independently, the tool needs a unique representation. Each instance gets its own module definition, usually with a derived name. This process is uniquification. Figure 5 compares the two states.

Shared modules and uniquified modules
Before: one definition serves three instances. After: each instance has its own
Shared modules and uniquified modules
Figure 5 Uniquification gives each instance of alu_slice its own definition.

What to notice: The purpose is independent definitions. The new names are a by-product.

The global init_design_uniquify controls whether the design is uniquified while it is read and flattened.

The effective value is whatever the session holds when init_design runs. A startup script may have changed it, and omitting it from your configuration does not reset it. The general rule for defaults and effective settings is in "The init_design import flow".

Common beginner mistake

Accepting any text hit for the top name, or leaving init_design_uniquify out and assuming its value from memory. Compare whole names, confirm the loaded top after import, and print the globals you depend on.

3.8  Before you import: inspecting the netlist

Table 4 turns the section into a short checklist you can work through with a terminal and an editor.

Table 4 Inspecting the netlist before import
QuestionHow you can lookWhat a surprise means
Are all listed files readable?List them with a long listing; open the first linesA path is wrong, or a permission is missing
Is the top defined somewhere in the set?Search whole-word for the module nameThe top name is wrong, or a file is missing from the list
Does the set define every module the top uses?Compare instantiated module names with defined module names, by eye or scriptAn unresolved reference exists; decide black box or missing file
Is the revision the intended one?Compare the file header, date or tag with the handoff notesYou are looking at an old or different netlist
Does this flow need unique modules?Read the project's flow notes, then decide init_design_uniquifyThe value will be chosen by accident

Let us consider a representative failure. The library team re-releases INV_X1 with the pin renamed from A to I. The earlier netlist still says .A(n1).

Takeaway Name the top yourself, decide uniquification for your flow, and compare pin names, not only cell names.

4  Physical library data: technology LEF, cell LEF and macro LEF

The tool must know what a cell looks like before it can place it. It must know what a layer allows before it can route over it. The physical library answers both, in a format called LEF.

4.1  What LEF is

LEF is a text format for the physical abstract of building blocks and for the technology they sit on.

4.2  Technology LEF

FILE - tech.lef (TEACHING EXAMPLE, NOT A RUNNABLE TECHNOLOGY FILE)
UNITS
  DATABASE MICRONS 1000 ;
END UNITS
LAYER M1
  TYPE ROUTING ;
  DIRECTION HORIZONTAL ;
  PITCH 0.20 ;
  WIDTH 0.10 ;
  SPACING 0.10 ;
END M1
FILE - tech.lef, CONTINUED (TEACHING EXAMPLE)
LAYER M2
  TYPE ROUTING ;
  DIRECTION VERTICAL ;
  PITCH 0.20 ;
  WIDTH 0.10 ;
  SPACING 0.10 ;
END M2
SITE core_site
  CLASS CORE ;
  SIZE 0.20 BY 1.60 ;
END core_site

Reading the excerpt:

Put the technology LEF first in init_lef_file. The cell LEF files refer to layer and site names that must already be known. Follow your project's own instructions on order.

4.3  Standard-cell LEF

A standard-cell LEF has one MACRO block per cell. In LEF, MACRO means "a library cell definition", so a two-input NAND gate is a MACRO. Project vocabulary also uses "macro" for large blocks such as memories, and the two uses collide.

FILE - stdcells.lef (TEACHING EXAMPLE, NOT A RUNNABLE CELL LIBRARY)
MACRO NAND2_X1
  CLASS CORE ;
  ORIGIN 0 0 ;
  SIZE 0.60 BY 1.60 ;
  SYMMETRY X Y ;
  SITE core_site ;
FILE - stdcells.lef, CONTINUED (TEACHING EXAMPLE, PIN A)
  PIN A
    DIRECTION INPUT ;
    USE SIGNAL ;
    PORT
      LAYER M1 ;
        RECT 0.10 0.50 0.20 0.90 ;
    END
  END A
FILE - stdcells.lef, CONTINUED (TEACHING EXAMPLE, PIN Y AND OBS)
  PIN Y
    DIRECTION OUTPUT ;
    USE SIGNAL ;
    PORT
      LAYER M1 ;
        RECT 0.40 0.40 0.50 1.00 ;
    END
  END Y
  OBS
    LAYER M1 ;
      RECT 0.00 0.00 0.60 0.20 ;
  END
END NAND2_X1

The excerpt leaves out pin B and the power pins; a real cell has them. Each part answers a question for the tool. Figure 6 draws the cell on its site with the numbers from both excerpts.

The NAND2_X1 abstract on its site
The LEF numbers drawn to scale on one core row
The NAND2_X1 abstract on its site
Figure 6 NAND2_X1 occupies three 0.20 µm sites of a 1.60 µm row; pins A and Y are M1 rectangles and the bottom strip is an M1 obstruction.

What to notice: The pin rectangles sit exactly at the RECT coordinates of the excerpt. The track pitch equals the site width here, which is a property of this teaching example. With no OFFSET in the excerpt, the tracks sit at half a pitch (0.10, 0.30 ... µm), not on the site edges.

4.4  Macro LEF

A memory or analog block is also a MACRO in LEF, usually with CLASS BLOCK. The structure matches a standard cell, but the abstract is larger and the pins sit on its edges. A different team or vendor usually provides it, often with its own timing library. So it is the cell most likely to arrive with one model and not the other. Table 5 lists the three cases.

Table 5 Which models a macro arrived with, and the consequence
Models presentConsequence
LEF abstract and Liberty modelPlaceable and analyzable, if the model is sound
LEF abstract onlyPlaceable; timing that depends on the macro is incomplete
Liberty model onlyCannot be placed

Large blocks are delivered late and in pieces, so gaps appear there. Let us consider a representative failure with the SRAM (static RAM) macro SRAM_64X8. It has a LEF in the release, but the vendor's Liberty file was never added to the library set. The import may complete. The post-import checks are how you see that the macro has no timing entry.

In the baseline demo_top no instance uses a macro. Treat SRAM_64X8 throughout this chapter as an extension scenario, used to practice the missing-model case.

4.5  Abstract versus layout

A physical abstract is not the layout. Pin rectangles may be simplified, and internal wiring becomes obstructions. The real geometry lives in the layout database of the foundry flow. Finding a cell in the LEF means it can be treated as a placed object. It does not mean the size or the timing is right.

Note

The LEF examples come from general knowledge of the format, not from a real technology. The LEF/DEF (Library and Design Exchange Format) language reference is the authority for LEF syntax. Innovus also parses some syntax that it then ignores or rejects. Check the syntax reference before assuming a LEF file is wrong.

Takeaway Technology LEF first, then cell and macro LEF. A cell found in the LEF is placeable, not proven correct.

5  Timing libraries, RC technology data, and power and ground names

Liberty libraries provide cell behavior, RC data provides the cost of wires, and supply names tell the tool which nets are global. Each is easy to deliver, and each can quietly disagree with the others.

5.1  Liberty timing libraries

A Liberty library, usually a .lib file, describes what each cell does and how fast it is, for one operating condition.

FILE - stdcells_slow.lib (TEACHING EXCERPT, VALUES INVENTED)
library (stdcells_slow) {
  time_unit : "1ns";
  capacitive_load_unit (1, pf);
  cell (NAND2_X1) {
    area : 0.96;
    pin (A) { direction : input; capacitance : 0.0021; }
    pin (B) { direction : input; capacitance : 0.0021; }
FILE - stdcells_slow.lib, CONTINUED (TEACHING EXCERPT, VALUES INVENTED)
    pin (Y) {
      direction : output;
      function : "!(A & B)";
      timing () {
        related_pin : "A";
        timing_sense : negative_unate;
        cell_rise (delay_template_3x3) {
          index_1 ("0.01, 0.05, 0.20");   /* input transition */
          index_2 ("0.001, 0.005, 0.02"); /* output load */
          values ("0.04, 0.05, 0.09", \
                  "0.05, 0.06, 0.10", \
                  "0.08, 0.09, 0.13");
        }
      }
    }
  }
}

Let us read the excerpt from the outside in.

Three quantities are different. The rows of the table are indexed by the transition time at the input A. The columns are indexed by the load on Y. The transition of Y itself has its own table.

Three consequences matter at import.

What to check, and what goes wrong:

5.2  RC technology information

Wires add resistance and capacitance, and so delay. Before routing, the tool estimates wire delay from RC data that the technology team provides. In the Legacy UI that data attaches to an RC corner.

5.3  Power and ground names

init_pwr_net and init_gnd_net name the global supply nets.

5.4  One cell across three files

Figure 7, below, puts the three descriptions of u_nand side by side.

For u_nand, the netlist names NAND2_X1 with pins A, B and Y on named nets. The LEF needs MACRO NAND2_X1 with those pins and a whole number of sites. The Liberty file needs cell (NAND2_X1) with the same pins, a function, and an arc from each input to Y.

One cell, three descriptions
The netlist drawn as a NAND2 symbol; the LEF and Liberty entries for the same name
One cell, three descriptions
Figure 7 The netlist gives connections, the LEF gives size and pins, and the Liberty file gives function and timing for NAND2_X1.

What to notice: A shared name is a binding, not proof that pins, function, arcs or geometry agree.

Table 6 What each file says about NAND2_X1
FileWhat it says about NAND2_X1What it does not say
NetlistIt exists, with pins A, B, Y connected to these netsHow big, how fast, where
LEFIt is 0.60 by 1.60, on core_site, with pins at these shapesWhat it computes, or how long it takes
LibertyIt computes !(A & B) with these arcs at this cornerWhere it sits, or what it looks like
Exercise

A report lists RAM_A as bound in the physical library but with no entry in the timing library. Which of the three descriptions is missing, and which stages would it affect?

Answer. The timing model is missing.

  • Effect: the macro can be placed. It has no characterized timing model for the analysis. Paths and checks that depend on that model are incomplete, unmodeled, or not meaningfully analyzed, depending on the tool's treatment.
  • This is not a claim that the physical macro has zero delay.
  • Likely cause: a Liberty file missing from the library set for that corner.
  • Owner to ask: the macro or library provider.

Takeaway Liberty gives function and timing for one corner, RC data gives wire estimates, and supply names must map to LEF pins.

6  Constraints: telling the tool what "correct timing" means

A timing tool measures what it has been told to measure. The netlist and libraries say what the circuit is. The constraints say what it must achieve: how fast the clock runs, and when input data arrives and output data is needed. A constraint file that loads without a message is not the same claim as a constraint file that is right.

Constraints are written in SDC, a Tcl-based format. This section covers enough SDC to judge whether a constraint set is ready for import. It is not a full treatment of static timing analysis.

6.1  Where constraints come from, and what they assume

An SDC file expresses design intent that the netlist cannot provide.

6.2  The four classes of path

Every timing path starts at a startpoint and ends at an endpoint. The constraints that matter depend on both ends. Four classes cover most designs, and Figure 8 marks each one in demo_top.

Four classes of timing path in demo_top
Registers drawn as D flip-flops, each alu_slice as a NAND2 and an inverter
Four classes of timing path in demo_top
Figure 8 The four path classes of demo_top: input to register (1), register to register (2), register to output (3) and input to output (4).

What to notice: A clock constrains the register-based classes. Input and output delays describe the world outside the block.

Table 7 The four classes of timing path in demo_top
ClassPath in demo_topWhat provides the missing information
1. Input to registerdin to u_reg0/DAn input delay and a clock reference, because the tool cannot know when data leaves the outside world
2. Register to registeru_reg0 through u_alu0, u_alu1 to u_reg1/DThe clock definition, since both ends belong to clocks
3. Register to outputu_reg1/Q to doutAn output delay, because the tool cannot know how much time the outside world needs
4. Input to outputdin through u_alu2 to ybypBoth delays, each relative to a clock that tells the tool which reference to use

6.3  A small constraint file, read line by line

The excerpt is a teaching excerpt for the functional mode of demo_top. Each command is explained after it.

FILE - func.sdc (TEACHING EXCERPT)
# Primary clock: 10 ns period, rising edge at 0, falling edge at 5.
create_clock -name clk -period 10 -waveform {0 5} [get_ports clk]
# Data arrives 2 ns after the clock edge at these inputs.
set_input_delay 2.0 -clock clk [get_ports {din sel}]
# Outside logic needs 3 ns before the next clock edge at these outputs.
set_output_delay 3.0 -clock clk [get_ports {dout ybyp}]
# Assumed input slew and output load at the block boundary.
set_input_transition 0.2 [get_ports {din sel}]
set_load 0.05 [get_ports {dout ybyp}]

create_clock creates a clock object.

get_ports selects ports from the design. {din sel} is a Tcl list of two names, so one command constrains both. get_pins selects instance pins such as u_reg0/CK.

set_input_delay states when data arrives at an input, relative to a clock edge.

set_output_delay states the time the outside world needs after data leaves the block.

set_input_transition gives the slew (how quickly the signal changes) at an input.

set_load gives the capacitance on an output port or net, in the library capacitance unit.

6.4  Clocks derived from clocks

A cell that changes the frequency or waveform of a clock, such as a divider, produces a new clock. You declare it with create_generated_clock. A simple gating cell that passes the clock with the same waveform does not automatically need one. Whether a gated clock needs its own definition depends on the cell and your flow's rules. Follow the project's constraint guidelines.

FILE - DIVIDER EXAMPLE (TEACHING EXCERPT, NOT PART OF demo_top)
create_generated_clock -name clk_div2 -source [get_ports clk] \
    -divide_by 2 [get_pins u_div/Q]

6.5  Constants and exceptions

set_case_analysis fixes a pin or port to a constant for timing only.

FILE - CASE ANALYSIS EXAMPLE (TEACHING EXCERPT, NOT PART OF demo_top)
set_case_analysis 0 [get_ports test_mode]

Exceptions change what the tool checks on selected paths.

FILE - MULTICYCLE EXAMPLE (TEACHING EXCERPT, NOT PART OF demo_top)
# Claim: this path has two cycles for setup.
set_multicycle_path 2 -setup -from [get_pins u_reg0/CK] \
    -to [get_pins u_reg1/D]

The claim needs the design to hold u_reg0's data stable for two cycles, and u_reg1 to capture only every second cycle. Nothing in the file proves that. A setup multicycle is usually paired with a hold assertion, because moving the setup relationship also moves the hold check. Check your project's convention.

6.6  The arithmetic of setup and hold

These are teaching assumptions, not project values. The period is 10 ns, the launch edge is at 0 ns and the capture edge at 10 ns. Figure 9 draws all three calculations on one time axis.

Setup (register to register). Setup asks whether the latest data arrives early enough.

  1. The latest data reaches the capture register's data pin 6.0 ns after launch.
  2. The register needs the data 0.2 ns before the capture edge, so it is required by 10 − 0.2 = 9.8 ns.
  3. Setup slack = 9.8 − 6.0 = 3.8 ns.

Hold (register to register). Hold asks whether the earliest new data arrives late enough. The capture register, clocked by the same edge, must still see its old data for the hold time.

  1. The earliest data arrives 0.8 ns after launch.
  2. The register needs the data stable for 0.1 ns after that edge.
  3. Hold slack = 0.8 − 0.1 = 0.7 ns.

Setup (bypass, input to output).

  1. Data reaches ybyp at 2.0 (input delay) + 2.0 (path through u_alu2) = 4.0 ns.
  2. The output delay of 3.0 ns makes the data required at 10 − 3.0 = 7.0 ns.
  3. Slack = 7.0 − 4.0 = 3.0 ns. The two boundary delays consume 5.0 ns of the period before any gate is counted. That is what a boundary constraint is for.

This is a sketch. It assumes zero skew, no uncertainty margin, no on-chip-variation derating, no common-path correction and a single-cycle clock relationship. A real report includes all of those. Use the arithmetic to understand the report, and use the report to decide.

Setup and hold arithmetic on one time axis
Period 10 ns; three teaching calculations
Setup and hold arithmetic on one time axis
Figure 9 Setup slack 3.8 ns and hold slack 0.7 ns for the register-to-register path, and 3.0 ns setup slack for the bypass path (illustrative values).

What to notice: On the bypass row the two amber boundary delays take 5.0 ns of the 10 ns period before the gate delay of u_alu2 is counted.

6.7  What goes wrong: three cases

Each case below can pass without stopping the import. Depending on the statements and the release, you may get a warning, an error, an ignored constraint or an unintended virtual clock. So the log and the clock report must be read. For each case, we state what the tool does, what you would see and what you conclude.

A missing or unattached clock. Three situations look alike and are different.

Effect, by situation:

A valid virtual clock is a different thing. It has a name and no source in the design. It can legitimately describe boundary timing for input and output delays. It does not by itself provide a clock to internal registers.

A wrong period. The file says -⁠period 100 where the specification says 10 ns. The value is ten times too large. It is a wrong value, not a unit mismatch (ns versus ps would be a factor of 1000).

An inappropriate exception. Someone adds set_false_path -⁠from [get_clocks clk] -⁠to [get_clocks clk] to silence a violation.

6.8  What early slack does and does not tell you

Early slack is informative, and a path with large negative slack deserves attention. But early slack is not closure, because nothing is placed or routed and wires are estimates. It is not proof of coverage either. Slack is reported only for constrained paths, and an unconstrained path looks the same as one with no problem.

A constraint review therefore asks three questions.

  1. Are the intended clocks all there, with the right period and waveform?
  2. Are the boundaries constrained?
  3. Are the untested checks untested for reasons we can defend?

Favorable slack answers none of them.

Exercise

func.sdc contains set_output_delay 3.0 [get_ports dout] and no -⁠clock. The tool reports no error. What happens to the register-to-output path to dout?

Answer. Such a constraint is accepted and ignored in analysis.

  • Effect: the path to dout behaves as if it had no output delay.
  • Evidence: a report of unconstrained endpoints, or a coverage report listing the output as untested.
  • Action: the constraint owner adds -⁠clock clk.

Takeaway A constraint that loads is not a constraint that is right; check clocks, boundaries and the reasons behind untested checks.

7  MMMC, command by command

An MMMC configuration looks like a list of commands. Read it as a small graph in which every object is created from objects made earlier. Once you can trace one view down to its files, missing objects, wrong pairings and dropped views become easy to see.

The objects and what points at what are drawn in Figure 10. The terms are defined just below it.

MMMC objects and what points at what
Files feed objects; objects feed views; activation picks views
MMMC objects and what points at what
Figure 10 A library set and an RC corner feed a delay corner; a constraint mode and a delay corner feed an analysis view; set_analysis_view selects views for setup and hold.

What to notice: Every arrow is a name reference, and a name that was never created is the commonest MMMC error.

MMMC stands for multi-mode multi-corner.

The Legacy UI builds the description from five kinds of object and one activation step. Each object is made by one command, in dependency order.

7.1  A consistent example

Two modes (func, test) and two corners (slow, fast) give three defined views in Table 8. The choice of corners is illustrative, since the real choice depends on the project and technology.

Table 8 The three views of the example
ViewConstraint modeDelay cornerLibrary setRC cornerConstraint file
func_slowfuncslowlibs_slowrc_slowfunc.sdc
func_fastfuncfastlibs_fastrc_fastfunc.sdc
test_slowtestslowlibs_slowrc_slowtest.sdc

func_slow and test_slow share a delay corner, and func_slow and func_fast share a constraint mode. That sharing is the point: define each corner and mode once, then combine them.

The memory libraries appear in each library set so that the trace has two libraries per corner. The baseline demo_top does not instantiate the memory, so the macro scenario is an extension.

7.2  Step 1: create_library_set

STEP 1 - A NAMED GROUP OF TIMING LIBRARIES
innovus> create_library_set -name libs_slow \
    -timing [list data/stdcells_slow.lib data/sram_slow.lib] ;# slow-corner libs

A library set is a named group of timing libraries.

7.3  Step 2: create_rc_corner

STEP 2 - THE RC CORNER FOR THE SLOW DELAY CORNER
innovus> create_rc_corner -name rc_slow -cap_table data/rc_slow.captbl ;# wire RC data

An RC corner holds the information for estimating wire resistance and capacitance.

7.4  Step 3: create_delay_corner

STEP 3 - PAIR A LIBRARY SET WITH AN RC CORNER
innovus> create_delay_corner -name slow -library_set libs_slow \
    -rc_corner rc_slow ;# delay corner slow

A delay corner pairs one library set with one RC corner. Together they define what the tool needs to compute delay at one condition.

7.5  Step 4: create_constraint_mode

STEP 4 - ONE CONSTRAINT MODE PER MODE
innovus> create_constraint_mode -name func -sdc_files [list data/func.sdc] ;# func mode
innovus> create_constraint_mode -name test -sdc_files [list data/test.sdc] ;# test mode

A constraint mode groups SDC files into one named mode.

7.6  Step 5: create_analysis_view

STEP 5 - PAIR A MODE WITH A CORNER FOR EACH VIEW
# The fast corner objects follow the pattern of the slow ones;
# the complete file below shows them.
innovus> create_analysis_view -name func_slow -constraint_mode func \
    -delay_corner slow ;# functional mode, slow corner
innovus> create_analysis_view -name func_fast -constraint_mode func \
    -delay_corner fast ;# functional mode, fast corner
innovus> create_analysis_view -name test_slow -constraint_mode test \
    -delay_corner slow ;# test mode, slow corner

An analysis view pairs one constraint mode with one delay corner.

Figure 11 traces one view, func_slow, down to the files it uses.

Tracing func_slow:

  1. Constraint branch: func_slow uses constraint mode func, which uses data/func.sdc.
  2. Corner branch: func_slow uses delay corner slow, which uses library set libs_slow and RC corner rc_slow.
  3. The library set uses data/stdcells_slow.lib and data/sram_slow.lib. The RC corner uses data/rc_slow.captbl.

Four kinds of file support one view, and checking each of them is the review. Diagnose a missing or wrong view by walking this trace. Find the first name that does not resolve, or the first file that is not the intended one.

Tracing func_slow to its source files
A view reaches its files through a constraint branch and a corner branch
Tracing func_slow to its source files
Figure 11 func_slow reaches func.sdc through mode func, and two Liberty files and one capacitance table through corner slow.

What to notice: Every gray leaf is a file you can open, and the review of a view ends there.

7.7  Step 6: set_analysis_view

STEP 6 - ACTIVATE VIEWS FOR SETUP AND HOLD
innovus> set_analysis_view -setup {func_slow test_slow} \
    -hold {func_fast} ;# the first view in each list is the default

Defining a view does not use it. set_analysis_view chooses the active views, separately for setup and hold.

Three terms are easy to blur. The tables in Figure 12 show all three, before and after a narrower second call.

set_analysis_view is not incremental
The same three views before and after a narrower second call
set_analysis_view is not incremental
Figure 12 A second set_analysis_view with only func_slow for setup drops test_slow from the setup list, although it stays defined.

What to notice: The defaults (the first name in each list) did not change, so a check of the defaults alone would miss the dropped view.

set_default_view can change the default among already active views without a timing reset, but it is rarely needed. A sorted membership comparison cannot show which view is the default. There is no query for the default itself. Establish it from the activation statement (the first name in each list) and from the absence of a later set_default_view. Then compare it with the project's intent.

Setup and hold are separate lists. Setup is often checked at the slow corner and hold at the fast one. That is where each check tends to fail. That is a tendency, not a rule. The project chooses from the technology and signoff plan. A hold list that repeats the setup views is not wrong, but it is a decision to confirm.

Our hold list has no test view. Hold in test mode is therefore not checked, because no active hold view uses the test mode. Whether that is acceptable is the project's call, and the review must make sure someone made it.

The call is not incremental. Each call must carry the full specification of every active view, and it causes a full timing reset. The right-hand table of Figure 12 shows the effect.

7.8  The complete example file

The file below is complete for its scope: two corners, two modes, three views, activated. It assumes the named files exist.

FILE - viewDefinition.tcl (TEACHING EXAMPLE, FILE NAMES ARE EXAMPLES)
# Library sets: one per corner, each holding every library that corner needs.
create_library_set -name libs_slow \
    -timing [list data/stdcells_slow.lib data/sram_slow.lib]
create_library_set -name libs_fast \
    -timing [list data/stdcells_fast.lib data/sram_fast.lib]
# RC corners: wire estimates for each corner.
create_rc_corner -name rc_slow -cap_table data/rc_slow.captbl
create_rc_corner -name rc_fast -cap_table data/rc_fast.captbl
# Delay corners: one library set plus one RC corner.
create_delay_corner -name slow -library_set libs_slow -rc_corner rc_slow
create_delay_corner -name fast -library_set libs_fast -rc_corner rc_fast
# Constraint modes: one per mode, each naming its SDC file.
create_constraint_mode -name func -sdc_files [list data/func.sdc]
create_constraint_mode -name test -sdc_files [list data/test.sdc]
# Analysis views: one mode seen at one corner.
create_analysis_view -name func_slow -constraint_mode func -delay_corner slow
create_analysis_view -name func_fast -constraint_mode func -delay_corner fast
create_analysis_view -name test_slow -constraint_mode test -delay_corner slow
# Activation: setup views first, then hold views.
set_analysis_view -setup {func_slow test_slow} -hold {func_fast}

Relative names such as data/func.sdc resolve from the session's working directory. Use absolute paths when in doubt, and record the launch directory, as the previous chapter taught.

7.9  Verifying the relationships: report_analysis_views

CHECKING WHAT THE CONFIGURATION SAYS
innovus> report_analysis_views -type active ;# active views and the objects they use

report_analysis_views is a hierarchical report of the MMMC configuration.

all_analysis_views -⁠type setup and -⁠type hold return the same lists as Tcl lists for scripting. Comparing them after sorting proves the memberships match. It does not prove the intended default views, because the sort discards order. The post-import checks return to this report as the most direct evidence that the configuration says what you meant.

Exercise

A script defines four analysis views and ends. The report of active views is empty. What is missing?

Answer. Activation is missing. Defining views creates objects. set_analysis_view chooses the active ones. The inline route is Path B, taught in "The init_design import flow". There the -⁠setup and -⁠hold options of init_design do that job instead.

Takeaway Read MMMC as a graph of name references, trace each view to its files, and re-check the lists after every activation.

8  Conditional inputs, alternatives, and reviewing a package

Not every design uses every input. Recognizing the alternatives avoids two mistakes: demanding an input that does not apply, and missing one that does.

8.1  Conditional inputs

I/O assignment file. A rule-based file that organizes pads, pins and bumps by position, spacing and ordering. It is passed through init_io_file.

Scan information. A separate input for later steps. At import you only need to know whether the chains are stitched. That changes what the constraints should say about the test mode.

Power intent. A design with several power domains describes them in a separate format. One route derives the MMMC configuration from a Common Power Format (CPF) file through init_cpf_file. Use it only if your project requires it.

OpenAccess. A project may store libraries and design in OpenAccess instead of LEF and Verilog. The import then uses OA-specific settings, including init_design_netlisttype set to OA. This chapter does not develop that route.

A missing conditional input is not a defect. A conditional input the project requires and nobody delivered is.

8.2  Reviewing an input package: a worked example

The invented package in Table 9 is reviewed as you would before launching, with a decision for each item. Read the findings as the notes you would write.

Table 9 Reviewing the demo_top input package
ItemWhat was foundDecisionReason and owner
Netlist demo_top.vReadable. module demo_top appears once. alu_slice is defined. All instantiated cell names appear in the library lists.ProceedThe top and the sub-module are defined. The cells are checked against libraries below.
Technology LEFReadable. Layers M1 and M2 declared. Units 1000 per micron.ProceedListed first in the LEF order.
Cell LEFDefines NAND2_X1, INV_X1, DFF_X1.ProceedEvery standard cell used by the netlist is present.
Macro LEFPresent for SRAM_64X8.HoldThe netlist does not instantiate SRAM_64X8, but the handoff mail says it will in the next release. Ask the design owner whether the macro belongs to this import.
Liberty, slow cornerDefines the three standard cells. No cell named SRAM_64X8.ProceedSufficient for the baseline demo_top. In the macro extension, this library set would be incomplete.
Liberty, fast cornerDefines the three standard cells. No cell named SRAM_64X8.ProceedSame reasoning as the slow corner. The two corners are treated alike.
func.sdcOne clock clk, period 10. Input delays on din and sel.ProceedMatches the specification of the clock.
test.sdccreate_clock -⁠name tclk -⁠period 10 [get_ports tclk] (10 is an illustrative value).StopThe name tclk is valid. The source selection matches nothing, because the design has no port tclk. A virtual clock would be written without a source. Ask the constraint owner which is intended.
Power and ground namesVDD, VSS in the email. The LEF pins use VDD, VSS.ProceedNames agree.
CornersThe email says "the usual corners".StopThere is no list to check against. Ask the project for the approved corners, then write them down.

Several of these items could have been waved through. Each stop or hold would have become a confusing problem after the import. You reached all of them without a tool, by reading files, comparing names and asking questions.

Common beginner mistake

Do not write a stand-in Liberty file for SRAM_64X8 to silence the missing-model message. Models come from your project or training environment. A hand-made model that only makes a message disappear hides a problem instead of fixing it.

Takeaway A missing conditional input is fine; a required one that nobody delivered is a stop, found before launch.

9  The init_design import flow

init_design is one command, but everything it needs is set beforehand through global settings and a view definition. If you can say what each setting selects, you can read any import script. You will also know which setting to suspect when the result is wrong.

9.1  Before, during and after

After the Legacy UI starts, the tool is running and no design is loaded: no netlist, no library, no timing views. The import configuration describes what to load.

Figure 13 compares the session before and after the command.

Afterwards there is a design in memory. It has a top module, instances linked to library cells, loaded physical and timing libraries, active views and a default floorplan. Nearly everything that matters is still unverified: the loaded top, the model binding of every cell, the clocks and the active views.

The session before and after init_design
What the command builds, and what it leaves for you
The session before and after init_design
Figure 13 init_design turns the configured globals and view definition into a database in memory, with a default box, rows and tracks.

What to notice: The amber card is everything the command does not verify. The post-import checks exist for that list.

9.2  The Tcl you need to read the configuration

The configuration is Tcl. The rules below decide what the lines mean. You can try them in a plain Tcl shell (tclsh), whose prompt is %.

PLAIN TCL SHELL - THE RULES BEHIND EVERY CONFIGURATION LINE
% set top_name demo_top ;# assign a value: the text after the name
% puts "the top is $top_name" ;# $top_name is replaced by its value
% set lef_files [list data/tech.lef data/stdcells.lef] ;# brackets run list
% set files [list {data/my file.v} data/b.v] ;# braces group a path with a space
% puts [llength $files] ;# prints 2: two elements
% set literal {$top_name stays as typed} ;# braces: no substitution
% puts $literal ;# prints the dollar sign as typed
% puts [llength $lef_files] ;# llength counts list elements
% set long_list [list data/a.lib \
    data/b.lib] ;# a trailing backslash continues the command
% if {[info exists never_set]} { puts "set" } else { puts "not set" } ;# test

A multiline list needs the backslash. Without it, the second line is read as a new command.

EXAMPLE - WORKS, THEN FAILS (DO NOT RUN THE SECOND FORM)
# Works: the backslash joins the two physical lines.
set long_list [list data/a.lib \
    data/b.lib]
# Fails: the newline ends the command inside the brackets, and
# the second line is read as a command named data/b.lib.
set long_list [list data/a.lib
    data/b.lib]

9.3  Defaults, effective settings and optional globals

Three principles apply to every setting below. They are stated once here.

9.4  The settings, one at a time

Each entry gives the meaning first. Observe every setting by printing it, as the script in this section does. They are collected in Table 10.

Table 10 The init_* globals of a Verilog and LEF import
GlobalMeaning and valueImportant note
init_design_netlisttypeSelects the netlist source, Verilog or OpenAccess. One word; Verilog is the default. Always set it explicitly, because that records the choice.A value that does not match your data means the netlist is not read as intended.
init_verilogLists the gate-level netlist files to read. A Tcl list, one element per file; use list and brace any path with a space. The default is empty.A wrong path stops the import. A readable but wrong file list is worse: a missing file leaves unresolved modules, and an extra one may bring a conflicting definition. An encrypted netlist with the suffix .vp is allowed.
init_design_settopChooses who selects the top: 1 if you name it, 0 if the tool determines it. The default is 1.With 1, init_top_cell must be set. With 0, compare the chosen top with your intent.
init_top_cellNames the top module, spelled exactly as in the Verilog. It comes from the design owner.Used only when reading Verilog. A missing name is an error. A name that exists but is the wrong block loads quietly, so check the loaded top after import.
init_lef_fileLists the LEF files: technology LEF first, then standard-cell and macro LEF files.It cannot be used with init_oa_ref_lib, the OpenAccess route. A missing LEF leaves cells unplaceable, and a wrong order leaves later files unable to resolve layer or site names.
init_pwr_net, init_gnd_netName the global power and ground nets, for example VDD and VSS.The flow must map them to the LEF power pins and the netlist's power connections. A mismatch rarely errors at import and appears later, so record the values.
init_design_uniquifyUniquifies the design during read and flatten when set to 1. The default is 0.See the netlist section for when to use each value. Print the effective value.
init_io_fileAn optional I/O assignment file for pin or pad positions; one file path.Use it when the project provides one. If not required, confirm that no unintended file is active, and record the effective setting before import.
init_mmmc_fileNames a Tcl script that creates the MMMC objects and activates the views (Path A, the view-file route described below). One file name.It must include set_analysis_view and initialize the setup view, with timing library information at a minimum. A missing path, or a file naming missing files, is an error. A file that activates the wrong views is not, so read the active-view report.

9.5  The configuration in small readable blocks

We build the configuration for demo_top one concern at a time, then assemble it. These lines run on the Innovus terminal in the Legacy UI. A script is used because a script is a record.

WHAT TO READ - NETLIST, TOP AND LEF FILES
innovus> set init_design_netlisttype Verilog ;# state the netlist source explicitly
innovus> set init_verilog [list data/demo_top.v] ;# one netlist file, one element
innovus> set init_design_settop 1 ;# 1: we name the top ourselves
innovus> set init_top_cell demo_top ;# spelled exactly as in the Verilog
innovus> set init_lef_file [list data/tech.lef data/stdcells.lef \
    data/sram.lef] ;# technology LEF first, then cell, then macro
SUPPLIES AND UNIQUENESS
innovus> set init_pwr_net VDD ;# global power name; must agree with LEF and netlist
innovus> set init_gnd_net VSS ;# global ground name
# 1: uniquify while reading. Chosen because this flow will run clock tree synthesis and
# optimization on one design. A master-and-clone flow would use 0.
innovus> set init_design_uniquify 1 ;# uniquify during read
TIMING CONFIGURATION (PATH A)
innovus> set init_mmmc_file data/viewDefinition.tcl ;# the view definition file

9.6  The complete configuration for Path A

The blocks above plus an evidence loop make one script, the Path A configuration. It prints each setting it depends on. So the log records the effective configuration, not only the intended one.

FILE - import_a.tcl (TEACHING EXAMPLE, PATH A)
# Record the release the session is running (the command returns a value).
puts "release: [getVersion]"
# What to read.
set init_design_netlisttype Verilog
set init_verilog [list data/demo_top.v]
set init_design_settop 1
set init_top_cell demo_top
set init_lef_file [list data/tech.lef data/stdcells.lef data/sram.lef]
# Supplies and uniqueness.
set init_pwr_net VDD
set init_gnd_net VSS
set init_design_uniquify 1
# Timing configuration: the view definition file.
set init_mmmc_file data/viewDefinition.tcl
FILE - import_a.tcl, CONTINUED (EVIDENCE LOOP AND IMPORT)
# Record the effective configuration before importing.
foreach g {init_design_netlisttype init_verilog init_design_settop \
           init_top_cell init_lef_file init_pwr_net init_gnd_net \
           init_design_uniquify init_mmmc_file init_io_file} {
    if {[info exists $g]} {
        puts "$g = [set $g]"
    } else {
        puts "$g is not set"
    }
}
# Build the database.
init_design

The evidence loop works as follows.

Block by block, the script records the release, sets the configuration, prints the effective settings, then imports.

9.7  Path B: creating the MMMC objects inline

Path B creates the MMMC objects in the import script, with no view file. That creates a circular dependency. set_analysis_view cannot be issued until the design is initialized, and init_design needs the active views. The way out is to pass the lists to init_design with -⁠setup and -⁠hold, and not to call set_analysis_view first.

On Path B, leaving init_mmmc_file out of the script is not proof that no inherited view file is active. Print init_mmmc_file with the same loop and confirm the required effective state. Do not blindly unset an approved project setting. Select one initialization route per session. On Path A, init_design sources the view file. So its set_analysis_view runs as part of the import, not before it. Figure 14 compares the routes.

The timing-enabled routes and the physical-only route
Where the views are activated in each route
The timing-enabled routes and the physical-only route
Figure 14 On Path A, init_design sources the view file and its set_analysis_view runs inside the import; Path B passes the view lists to init_design; the physical-only route has no timing system at all.

What to notice: No route calls set_analysis_view before init_design. On Path A it runs inside the import, and on Path B the view lists travel with the command itself.

FILE - import_b.tcl (TEACHING EXAMPLE, PATH B)
# Same data settings as Path A, except no init_mmmc_file.
set init_design_netlisttype Verilog
set init_verilog [list data/demo_top.v]
set init_design_settop 1
set init_top_cell demo_top
set init_lef_file [list data/tech.lef data/stdcells.lef data/sram.lef]
set init_pwr_net VDD
set init_gnd_net VSS
set init_design_uniquify 1
FILE - import_b.tcl, CONTINUED (MMMC OBJECTS AND ACTIVATION)
# The MMMC objects, created inline in dependency order.
create_library_set -name libs_slow \
    -timing [list data/stdcells_slow.lib data/sram_slow.lib]
create_library_set -name libs_fast \
    -timing [list data/stdcells_fast.lib data/sram_fast.lib]
create_rc_corner -name rc_slow -cap_table data/rc_slow.captbl
create_rc_corner -name rc_fast -cap_table data/rc_fast.captbl
create_delay_corner -name slow -library_set libs_slow -rc_corner rc_slow
create_delay_corner -name fast -library_set libs_fast -rc_corner rc_fast
create_constraint_mode -name func -sdc_files [list data/func.sdc]
create_constraint_mode -name test -sdc_files [list data/test.sdc]
create_analysis_view -name func_slow -constraint_mode func -delay_corner slow
create_analysis_view -name func_fast -constraint_mode func -delay_corner fast
create_analysis_view -name test_slow -constraint_mode test -delay_corner slow
# Activation happens here, through init_design.
init_design -setup {func_slow test_slow} -hold {func_fast}

The tool's behavior when views are named in two places:

Table 11 Path A and Path B side by side
Path A: MMMC filePath B: inline
Where the objects are createdIn the file named by init_mmmc_fileIn your script, before init_design
How views become activeset_analysis_view at the end of the file-⁠setup and -⁠hold of init_design
What you keep as the recordThe view file, which can be reviewed on its ownThe script
The mistake to avoidA file that creates objects and forgets to activateCalling set_analysis_view before init_design

Two more routes exist and are not developed here. A CPF-based route derives the MMMC configuration through init_cpf_file, for designs with power intent. You can also source a saved globals file and then call init_design, provided that file is configured for MMMC.

9.8  Start clean, and do not repair by calling it again

init_design can be called only when design and library information is not already loaded.

init_design also does not repair inputs. A missing cell is reported or stops the import, and no model is substituted.

9.9  Timing-enabled versus physical-only

With no MMMC configuration at all, the Legacy UI initializes into physical-only mode. This mode gives no access to the timing part of the system, and reinitializing requires exiting the software. You cannot add timing to the same session.

A physical-only import still has uses. You can inspect geometry, check how a netlist binds to the LEF files, or work on a floorplan without timing libraries. Its inputs are typically the netlist, the top, the LEF files and the supply names. Table 12 compares the two imports.

Table 12 Timing-enabled and physical-only imports
Timing-enabled importPhysical-only import
PurposeBegin a flow that must be timedInspect or edit geometry without timing
Typical inputsNetlist, top, LEF, MMMC configuration with libraries and constraintsNetlist, top, LEF; no timing data
What you can observeIdentity, views, constraints, coverage, timing modelsIdentity, binding to LEF, floorplan data
Checks that do not applyNone of the timing onescheck_timing, the report_analysis_* commands, timing-library checks
What it can establishThat the database and the timing setup are consistentThat the geometry data loaded
What it cannot establishQuality, closure, signoffAnything about timing

In a physical-only import, call the timing checks "not applicable to this branch", not "skipped". Skipped means a possible check was not done. And never describe a physical-only import as timing-ready.

9.10  The default geometry is not a floorplan

After a successful import, init_design also creates:

These make the database complete. They are not an approved floorplan. Die size, aspect ratio, macro positions and pin placement belong to the next stage. A die and rows after import say nothing about your project's target.

9.11  What happens during the import, as concepts

The log order and wording vary with the release and the data. So the phases below are concepts, not a fixed trace.

  1. Settings are read. The tool takes the init_ settings. For Path A, it sources the view definition file, which creates the MMMC objects and activates the views.
  2. Physical libraries load. The LEF files are read in the order given. Layers, sites and cell abstracts are created.
  3. Timing libraries load. The libraries referenced by the active views are loaded.
  4. The netlist is read and linked. Modules are built, instances are bound to library cells, and the top is set. If requested, the design is uniquified.
  5. Constraints are read. The SDC files of the constraint modes are processed. Messages appear for any command the tool could not apply.
  6. Default geometry is created. The bounding box, rows and tracks appear.

Use these phases as headings when you read the log. A warning in the netlist phase and one in the constraints phase have different owners.

Common beginner mistake

Fixing a failed import by editing a global and running init_design again in the same session. The session already holds partial state. Exit, correct the configuration, and start a new run in a new folder.

Exercise

Your script creates the MMMC objects inline and then calls set_analysis_view -⁠setup {func_slow} -⁠hold {func_fast} before init_design. Is this order allowed, and what is the alternative?

Answer. No. set_analysis_view cannot be issued before the design is initialized, and init_design needs the active views. Leave set_analysis_view out and pass the lists to init_design: init_design -⁠setup {func_slow} -⁠hold {func_fast}.

Takeaway Set and print every init_ global and pick one route per session. A failed import calls for a new session.

10  Judging the imported database: post-import sanity checks

An import ends and the tool is quiet. You must now decide whether to trust what is in memory. The skill is reading reports against what you intended. You judge whether the evidence is enough, and you know what to do when it is not.

10.1  A way to think about every check

Every check follows one investigation, drawn in Figure 15.

  1. Concern: something that could be wrong.
  2. Command: a command that can show evidence about it.
  3. Evidence compared with intent: the configuration and manifest you wrote before launch.
  4. Decision: accept, investigate or stop. Investigation ends in accept or stop.

If the decision is not accept, name the likely cause, the owner and the fix. The fix goes into the inputs or configuration for a new run, never into the database under judgment.

The investigation behind every check
Concern, command, evidence against intent, decision
The investigation behind every check
Figure 15 Four steps, as in the list: concern, command, evidence compared with intent, and a decision of accept, investigate or stop.

What to notice: The comparison with a written intent turns a report into a judgment. Fixes go back to the inputs and start a new run.

Two limits apply to every check. A passed check says only what that command can see. And evidence has a scope and a date. A report from an earlier run, for a different view, or cut short is not evidence about this database (check I).

10.2  The checking commands are not aliases

Similar names ask different questions.

setCheckMode / getCheckMode

checkDesign

checkNetlist

check_design

check_timing

Table 13 compares the five.

Table 13 The checking commands and the question each answers
CommandQuestion it answersWhenWhat it does not tell you
setCheckMode, getCheckModeWhat will the tool check on its own?Before the import; query to recordWhether any check found anything
checkDesignIs library and design data missing or inconsistent?After the import, for the data classes you ask forWhether timing arcs are correct
checkNetlistIs the netlist well formed, and what is in it?After the importWhether the logic does what you intend
check_design -⁠typeAre the preconditions of this flow step met?Before the step that the category guardsAnything outside the chosen categories
check_timingAre the constraints consistent and complete?Before timing analysisWhether the constraints are right

10.3  Which check_design categories fit this stage

check_design has many -⁠type categories, each guarding a later operation. Three fit the end of a first import.

Do not use -⁠type all to feel thorough. Categories for placement, optimization, clock tree synthesis, routing and signoff check preconditions for stages that have not started. A freshly imported design fails them for reasons that are not problems yet.

The checks below are labeled A to I, from "what is this database" to "can I trust the evidence". The evidence blocks are illustrative imitations for practicing reading, not tool transcripts.

10.4  A. Is the loaded design the one I meant, and is its content plausible?

Concern. The import may have loaded the wrong top, or a hierarchy much smaller or larger than intended.

Command. Ask the database for its top name and compare it with the name you declared.

CHECK A - IDENTITY
innovus> puts [dbGet top.name] ;# print the top module the database holds

dbGet top.name returns the top design's name, and puts prints it, since a script does not print a returned value on its own.

Inspect. The name equals init_top_cell and the manifest. The size is plausible against the synthesis report. The netlist report's design statistics give counts to compare.

Faulty evidence.

ILLUSTRATIVE OUTPUT - CASE A1 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
declared top : demo_top
loaded top   : demo_top_v2

A different module was loaded, or the evidence does not come from the session you think it does.

Cause. Investigate in this order.

  1. Read the effective init_top_cell and init_design_settop values your script printed, and any startup configuration that could have changed them.
  2. Read the initialization log for the top it reports.
  3. Confirm that the evidence came from the intended session and database. Look for a later database or configuration action.

If settop was 0, the tool chose the top itself. An older netlist in the list that defines both demo_top and demo_top_v2 can explain wrong contents or a wrong revision. It does not by itself explain why an explicit top selection was ignored. The owners are you (configuration) and the design owner.

Decision. A name mismatch is a stop: fix the configuration and start a new run. A matching name with an implausible size is an investigation, since black boxes shrink a design and extra test-bench files enlarge it.

Limit. A matching name is not a matching netlist revision, a plausible hierarchy, or a correct design. Each is a separate question.

10.5  B. Is every cell bound to a physical and a timing model?

Concern. An instance may refer to a cell with no LEF abstract, no timing model, or neither.

CHECK B - LIBRARY BINDING
innovus> checkDesign -physicalLibrary -timingLibrary -noHtml \
    -outfile checkdesign.rpt ;# physical and timing binding, one text report
innovus> check_design -type library \
    -out_file check_design_library.tcl ;# binding as a prerequisite, as Tcl data

Inspect. No cell used by the design is undefined in either library, and every reported difference can be explained.

Faulty evidence.

ILLUSTRATIVE OUTPUT - CASE B1 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
checkDesign -timingLibrary
  cell SRAM_64X8 used by 1 instance: not defined in any timing library
check_design -type library
  libcell SRAM_64X8: LEF view present, no .lib view

This is the macro extension scenario, since the baseline demo_top does not instantiate SRAM_64X8. Both commands report one finding: a physical model and no timing model. The likely cause is a Liberty file missing from a library set. The owner is the library or macro provider. The fix is to provide the file and rebuild the configuration.

Physical-only cells. Fillers, tap cells and decoupling cells have physical views and often no timing model.

Limit. A passed binding check says names were found. It does not show that every arc exists, that the function is right, or that the characterization is correct.

10.6  C. Is the netlist well formed?

Concern. The netlist may contain connections that deserve review: floating ports, unconnected pins, multiple drivers, constants, empty modules.

CHECK C - NETLIST STRUCTURE
innovus> checkNetlist -outfile checknetlist.rpt ;# summary, statistics, rule checks
innovus> checkNetlist -includeSubModule \
    -outfile checknetlist_sub.rpt ;# also check submodule port definitions
CHECK C - RECORD THE UNIQUENESS RESULT
innovus> set uniq [checkUnique -verbose] ;# capture the return value
innovus> set fp [open checkunique_return.txt w] ;# open a record file
innovus> puts $fp "checkUnique returned $uniq" ;# write the return value
innovus> close $fp ;# close the record file
innovus> redirect checkunique_verbose.txt {checkUnique -verbose} ;# shared-module list

Markers. An asterisk marks an error condition, and a question mark marks a warning or possible error. The mark sits inside the line, after the label and before the colon. So a search for lines that start with a marker finds nothing.

ILLUSTRATIVE OUTPUT - CASE C1 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
Number of Floating Ports *: 1
Number of undefined Floating Pins ?: 2
Number of Ports Connect to Core Cells *: 0

Investigate. The first line says one port floats. Find its name in the report body. Ask whether it is an input nothing uses, an output nothing drives, or a port the netlist forgot to connect. A floating input of a spare function is expected. A floating output that should carry ybyp is a netlist bug.

Decision. The netlist owner answers. An unexplained marked statistic is a stop. An explained one is an accept with a note.

Limit. The report shows structural properties. It does not show that the logic is correct, and it is not an equivalence check.

10.7  D. Are the MMMC relationships and the active roles what I intended?

Concern. A view may point to the wrong library, RC corner or constraint file. A view you meant to activate may be inactive or in the wrong role.

CHECK D - VIEWS AND ROLES, REPORTS
innovus> redirect views_setup.rpt {report_analysis_views -type setup} ;# setup views
innovus> redirect views_hold.rpt {report_analysis_views -type hold} ;# hold views
innovus> redirect views_all.rpt {report_analysis_views -type all} ;# every defined view
CHECK D - VIEWS AND ROLES, NAMES
innovus> puts "setup: [lsort [all_analysis_views -type setup]]" ;# setup names
innovus> puts "hold: [lsort [all_analysis_views -type hold]]" ;# hold names

Inspect. For each view, follow the tree traced in the MMMC section. Check the name and the constraint mode with its SDC files. Then check the library set and the RC corner, each with its files.

ILLUSTRATIVE OUTPUT - CASE D1 (STRUCTURE ONLY, NOT A TOOL TRANSCRIPT)
SETUP views
  view func_slow
    delay corner slow
      rc corner rc_slow : data/rc_slow.captbl
      library set libs_slow
        data/stdcells_slow.lib
        data/sram_slow.lib
    constraint mode func : data/func.sdc
ILLUSTRATIVE OUTPUT - CASE D1, CONTINUED (HOLD VIEWS)
HOLD views
  view func_fast
    delay corner fast
      rc corner rc_fast : data/rc_fast.captbl
      library set libs_fast
        data/stdcells_fast.lib
        data/sram_fast.lib
    constraint mode func : data/func.sdc

Reading it. Each listed view traces to the right files, and the setup list holds one view. The manifest requires test_slow for setup as well, and it is missing.

Defaults. Review the defaults separately, because there is no query for the default itself. Read the activation statement that ran: the first view in each list is the default. Confirm that no later set_default_view call changed it. Compare the result with the project's intent.

Decision. The role lists must have the manifest's membership. Here they do not, so this is a stop. Find the second activation, usually a script sourced after the view file. Correct it and run again.

Limit. The report shows that the configuration says what you meant, not that the corners are right for the technology.

10.8  E. Are the clocks the ones I intended?

Concern. A clock may be missing, have the wrong period or waveform, or be defined in the wrong mode.

CHECK E - CLOCKS PER VIEW
innovus> report_clocks -view func_slow > clocks_func_slow.rpt ;# clocks of one view
innovus> report_clocks -view test_slow > clocks_test_slow.rpt ;# clocks of the test view

report_clocks lists clocks created by create_clock and create_generated_clock, with waveforms, arrival points and uncertainties. -⁠view limits it to one view. Generated clocks are reported by default.

Inspect. For each clock: the name, the period, the waveform and the source. For a generated clock, also the master and the relationship to it.

ILLUSTRATIVE OUTPUT - CASE E1 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
view func_slow
  clock clk   period 100   waveform {0 50}   source port clk

The period is 100 where the specification says 10. This is the wrong-period case from the constraints section, a factor-of-ten error in the value. It need not stop the import, and the evidence is a number you compare with the specification.

Scope. A clock exists within a constraint mode. A clock in func.sdc appears in the functional views. It does not appear in the test mode unless test.sdc defines it too. So "the clock is listed" must be followed by "in which views?" The per-view reports answer that.

Generated clocks. A listed clk_div2 shows only that the clock exists. Compare its period and waveform with what the divider should produce. A wrong master, ratio or source pin gives a plausible name and a wrong waveform.

Decision. A missing, misattached or wrongly timed intended clock is a stop, owned by the constraint owner. An unexpected extra clock is an investigation.

Limit. The report lists defined clocks. It does not prove that a clock reaches every register it should.

10.9  F. Are the constraints consistent with each other and with the netlist?

Concern. A constraint file may load and still leave inputs unconstrained or clocks missing where registers need them. It may also refer to objects that do not exist.

CHECK F - CONSTRAINT CONSISTENCY
innovus> check_timing -verbose -view func_slow \
    > check_timing_func_slow.rpt ;# one view, output to a file

-⁠verbose gives the detail behind each warning, and -⁠view scopes it to one view. Warnings are grouped by type, and by default only violations are reported.

A worked investigation. Suppose the report holds two warnings.

ILLUSTRATIVE OUTPUT - CASE F1 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
warning no_input_delay  : port sel has no input delay
warning uncons_endpoint : port dout has no constraint

We read the two warnings independently, because the example does not establish that one causes the other.

Warning 1: no_input_delay on sel.

  1. In this faulty variant of func.sdc, the input delay names only din, not sel.
  2. An input without an input delay is assumed to have zero. So the paths from sel are still timed, with an assumed arrival of zero.
  3. That can be optimistic for the latest-arrival (setup) analysis when the real maximum external delay is positive.
  4. For the earliest-arrival (hold) analysis, a zero minimum delay can be optimistic or pessimistic, depending on the interface.
  5. Ask whether that is intended. A static configuration input is better described with set_case_analysis or a recorded exception. If sel really switches, the constraint owner left out the delay.

Warning 2: uncons_endpoint on dout.

  1. This is a different kind of finding: the check at that endpoint is not performed.
  2. Compare the SDC. One cause is the exercise case: an output delay without -⁠clock is accepted and ignored.

Decision. Neither warning is accepted until the constraint owner explains it. The early and late values come from the interface specification. Fixes go into func.sdc, then a new run. After each fix, run check_timing again in the new run.

The distinction to keep: an optimistic assumption still produces a number, and an unperformed check produces none.

Limit. A clean check_timing means the checks it performs found nothing, not that the constraints are right. Warnings do not stop the script, so no stop is not a pass.

10.10  G. How much of the design is actually analyzed?

Concern. With clocks and delays defined, some timing checks may still not be performed. They are reported as untested, and untested checks are where hidden problems live.

CHECK G - ANALYSIS COVERAGE
innovus> report_analysis_coverage -view func_slow \
    > coverage_func_slow.rpt ;# met, violated or untested, per check type
innovus> report_analysis_coverage -view func_slow -verbose untested \
    -sort reason > untested_func_slow.rpt ;# untested checks grouped by reason

Reading the reasons. Each reason is a question to ask the design.

A reason is a prompt for a question, not a justification. false_path says a path was excluded, not that excluding it was correct. For each group of untested checks, find the SDC line or netlist feature behind it. Then ask the owner whether the design needs that.

ILLUSTRATIVE OUTPUT - CASE G1 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
view test_slow   (active for setup in this case; counts illustrative)
check type   met   violated   untested
setup        0     0          2
untested checks (signal pin, reference pin, check, reason):
  u_reg0/D   u_reg0/CK   setup   no_endpoint_clock
  u_reg1/D   u_reg1/CK   setup   no_endpoint_clock

The setup checks in this view are untested, for a missing-clock reason. This matches the package review: test.sdc creates tclk with a source selection that matches no port. So the clock is not attached, and the registers carry no clock in the test mode. The checks that depend on one are not performed.

The illustration shows a setup row only. In the baseline configuration, test_slow is not an active hold view. So this report is no evidence about test-mode hold. How a coverage report treats a view that is not active in a role is not defined. So this chapter does not show one.

10.11  H. What did the import log say?

Concern. The log holds warnings and errors that no report repeats, such as unreadable constraint lines, ignored syntax and library problems.

Method. Read the log from the top, using the import phases as headings. For each warning or error, ask which phase produced it, what it affects and who owns the cause.

Decision. Classify each distinct warning and record the classification with the log.

A warning is a question, and the record shows it was answered. A good import is not required to have none.

Limit. The log contains what was logged. A condition that raised no message does not appear.

10.12  I. Is the evidence fresh and in scope?

Concern. A report may be old, describe a different view, or be cut so short that it hides the problem.

  1. Freshness. Write every report into the current run's folder, after the import, from the session being judged. A file with the right name from an earlier run proves nothing about this one.
  2. The danger is greatest when the earlier run was clean. Compare each report's modification time with the log. Never write into a shared folder where old reports sit under the same names.
  3. Scope. Each report should name its view, through -⁠view or its header. An unscoped report covers whatever the current context covers, so read the header or rerun with an explicit view.
  4. Completeness. A keyword search or truncated output is for navigation, not acceptance. Finding no line with "error" does not show there is no error, since markers and words differ between reports.
  5. Read the report to the end, or use a filter whose behavior you understand.

Limit. Freshness and scope are properties of how you ran the checks, so your process answers them.

10.13  A worked review: clean-looking, but not acceptable

After a Path A import of demo_top, the reviewer reads each report.

The comparison with the manifest at check D already exposes the failure. The other reports look clean because they never looked at the missing view.

Trace.

  1. Compare views_all.rpt with views_setup.rpt and views_hold.rpt: test_slow is defined and not active.
  2. Search the scripts that ran after the view file for a second activation.
  3. A site setup script sourced after init_design calls set_analysis_view -⁠setup {func_slow} -⁠hold {func_fast}, and the call is not incremental.
  4. After the activation is corrected and test_slow is active for setup, run the three reports for it.
  5. Read its coverage report: it shows the picture of Case G1.
  6. These reports are not run before the fix, because their behavior for an inactive view is not defined.
  7. A second, independent fault appears: test.sdc creates tclk with a source selection that matches no port.

10.14  The acceptance decision

For each concern, record the evidence, the intent it was compared with, and a result. The result is one of: accepted, accepted with a recorded explanation, investigate, or stop.

Table 14 is the acceptance table for the nine checks.

Table 14 The nine checks and their acceptance evidence
CheckEvidence needed to acceptTypical stop
A. IdentityLoaded top equals the declared top; counts plausibleName mismatch
B. BindingNo unexplained unbound cell in either libraryA macro without a timing model
C. NetlistEvery marked statistic explained; the recorded checkUnique value agrees with the uniquify choiceAn unexplained floating port or multiple driver
D. MMMCSetup list and hold list each have the manifest's membership; the default views match intent; every file path as intendedA missing or dropped view, or an unintended default
E. ClocksEvery intended clock, with the specified period and waveform, in every required viewA missing or wrongly timed clock
F. ConstraintsEvery check_timing warning explainedAn unexplained unconstrained input
G. CoverageUntested reasons defended against intent, per required viewno_*_clock or unknown untested checks
H. LogEvery warning classifiedAn unexplained blocking message
I. EvidenceReports fresh, scoped and completeReports from a different run or view
Common beginner mistake

Running every check, seeing that none stopped the script, and calling the import verified. check_timing warnings do not stop anything, and checkDesign writes a report nobody has to open. No stop is not a pass.

Exercise

Your coverage report for func_slow lists 12 untested checks, all with the reason false_path. What do you do before accepting?

Answer.

  • Find: the set_false_path statements in the func mode's SDC files, and what they exclude.
  • Ask: the constraint owner, for each group, whether the paths are truly never needed. They may, for example, cross asynchronous domains handled elsewhere.
  • Reject: a broad exception such as clock to the same clock. It is unjustified for this intended active functional demo, unless specific design intent proves otherwise.
  • Do not suppress required functional timing with an unexplained broad exception.
  • Record: the owner's answer next to each group.

Takeaway Compare every report with a written intent, per required view, from this run; a quiet tool is not a verdict.

11  Saving, restoring and exporting

The imported database lives in memory and disappears with the session. Saving, restoring and exporting are different acts for different readers. Mixing them up is how a team hands over a netlist and believes it handed over a design.

11.1  Five things that are easy to confuse

Figure 16 shows the database in memory and the four things you can write from it.

For every artifact, ask the same questions. What does it contain and omit? Who reads it? What does it depend on? How is the write verified? What can still not be inferred from it?

The native checkpoint is the intended way to continue work in Innovus. It is not the only artifact Innovus can read, and the exports below have their own readers.

Import, checkpoint, restore and exports
A checkpoint is read back by Innovus; exports go to other readers
Import, checkpoint, restore and exports
Figure 16 saveDesign writes the native checkpoint that restoreDesign reads in a fresh session; saveNetlist, defOut and writeTimingCon write exports for other readers.

What to notice: Only the checkpoint is meant to continue the work in Innovus. A layout stream is a later-stage product.

11.2  Saving a checkpoint: saveDesign

saveDesign writes the database in the native format under a name you choose.

SAVE THE ACCEPTED DATABASE
innovus> saveDesign accepted.enc ;# native format, under a deliberate name

The name becomes a small file containing a restoreDesign command. The .dat extension is appended to name a directory with the database files.

EXAMPLE - THE TWO SAVED ITEMS
accepted.enc         small file containing a restoreDesign command
accepted.enc.dat/    directory with the saved database files

A directory listing shows that something was written. It does not show that the save completed, that every dependency is reachable, or that a restore will work. The saved contents should not be edited by hand. Saving to the location you restored from overwrites the data there.

Debug saves and accepted saves. Save a failing state when someone else needs to see it. Give the two kinds different names, such as debug_before_fix.enc and accepted.enc. The name is a policy, not a property of the format. It stops a debug state being mistaken for an approved handoff. It also stops a later save from silently replacing the accepted one.

Three facts, not one. Keep these apart.

  1. The save was attempted: you ran the command.
  2. The save completed: the command returned without error in a live session, and the files are present with content.
  3. The handoff was verified: a restore in a fresh session reproduced the identity and the views.

Only the third supports "this checkpoint is ready for the next stage". A saved checkpoint does not establish a successful restore.

11.3  Restoring: restoreDesign

restoreDesign loads a database written by saveDesign.

RESTORE IN A FRESH SESSION
innovus> restoreDesign accepted.enc.dat demo_top ;# saved directory, then the top cell

What decides whether a restore means what you want:

Three different things. Keep these apart.

By default, B holds absolute references, so C matters little for them. The original spelling in A is not necessarily what B retains. A source path that is relative to the import folder need not be re-resolved as written from the restore folder.

Preserved relative paths are a separate case. With -⁠user_path, references are stored as entered, relative paths included. Then run restoreDesign in the same directory as the save, or in one with the same directory structure.

Reproducibility is a separate claim. Re-running the original import needs the original source inputs at their approved revisions. Restoring the checkpoint needs the checkpoint directory and its retained references. Each is a claim of its own.

Inspecting the dependencies. Do not edit anything inside the saved directory. A read-only look at the .globals file in it shows which file references the checkpoint retained. Its layout is release-specific. The restore log is the evidence of which dependencies actually resolved, so read it after every restore, together with the comparison below.

Verifying a restore. The comparison is between facts from two sessions.

  1. In the saving session, after the checks and before the save, write the baseline to files. Record the top name from dbGet top.name.
  2. Also record the setup views from report_analysis_views -⁠type setup and the hold views from report_analysis_views -⁠type hold.
  3. In a fresh session and a fresh folder, restore and write the same three outputs.
  4. Read the restore log, then compare the top, the setup list and the hold list separately.

Setup and hold lists are compared separately. One combined active list cannot show that a view moved from one role to the other. Write each attempt's evidence into a new folder. A file left by an earlier attempt can look like a match. A stale match after a failed restore is more dangerous than no evidence.

A restore without an error is necessary, not sufficient. A matching top and matching view lists are stronger. They still do not prove that every library, constraint file and database detail came back as before.

11.4  Exporting a logical netlist: saveNetlist

saveNetlist writes the logical netlist of the database as Verilog.

EXPORT THE LOGICAL NETLIST
innovus> saveNetlist demo_top_export.v ;# logical netlist as Verilog

Limit. Text can differ from the input netlist with no logical difference: module order, formatting, escaped names, uniquified module names and constants. A textual match does not prove equivalence either.

11.5  Exporting floorplan data: defOut

DEF is a text description of the physical design: die area, rows, tracks, component instances and, later, routing. defOut writes the parts you select.

EXPORT FLOORPLAN DATA AS DEF
innovus> defOut -floorplan -netlist -unplaced \
    demo_top_import.def ;# floorplan and the still unplaced netlist

Bringing a DEF back. The two readers are different workflows.

11.6  Exporting constraints: writeTimingCon

writeTimingCon writes the constraints of the database in Design Compiler format.

EXPORT THE CONSTRAINTS OF ONE VIEW
innovus> writeTimingCon func_slow_out.sdc -view func_slow ;# one view to an SDC file

11.7  Later-stage outputs, as context

Layout streams belong to later stages, for example GDSII (Graphic Design System) and OASIS (Open Artwork System Interchange Standard). So do parasitic files and signoff artifacts. A first import has no layout, routing or extraction to write, so none of them is run here.

11.8  Summary of the artifacts

Neither an exported netlist nor a DEF file is "the design". The checkpoint is the intended handoff, and the exports are views of it. Table 15 summarizes them.

Table 15 The artifacts of a first import
ArtifactContainsOmitsRead byHow to verify
Native checkpointThe database and references to libraries and constraintsOptional analysis data not selected for saving; external dependencies may remain externalInnovus, in a fresh sessionRestore; compare setup and hold views
Logical netlistConnectivity, hierarchy, cell mastersPositions, constraints, timingEquivalence, simulation, reviewQuick inspection; formal equivalence for logic
DEF, early importDefault die, rows, unplaced components, netsTiming, libraries, constraintsReview; geometry toolsQuick inspection of header and rows
Constraint fileConstraints of one viewOriginal text and commentsAnother tool; reviewCompare meaning with that view's own source SDC
Exercise

A teammate sends you accepted.enc.dat and says "it saved fine". What facts are missing, and how do you get them?

Answer.

  • Conclusion. The save was attempted and probably completed. It is unverified.
  • Reason. A directory listing does not show that a restore works.
  • Evidence needed. Restore in a fresh folder with the saving release, with the checkpoint directory and the files it refers to reachable. Read the restore log.
  • Then compare the top, the setup views and the hold views with the saving session's baseline.

Takeaway Save only an accepted database, verify the save by a fresh restore, and treat every export as a view for one reader.

12  Lab: one controlled import, judged, saved, restored and exported

Part II - a short lab

Part I taught the reasoning. This lab applies it to real inputs, which can disagree with you. It teaches nothing new. It is deliberately short, and every step refers back to a section you have already read.

Goal. Review an approved input package and import it once through one timing-enabled route. Judge the result with the nine checks. Save an accepted checkpoint only if the judgment allows it. Restore it in a fresh session, compare it with the saving run, and try the three small exports.

What you need. A Linux host with Bash and an editor, and a licensed Innovus (Legacy UI). You also need an approved set of inputs from your project or training environment:

12.1  Where each thing runs

Four places appear in the lab, and mixing them up is the commonest early mistake. They are listed in Table 16. The step-by-step use of each place is drawn in Figure 17.

Table 16 The four places of the lab
PlaceWhat it isHow long it lives
Launch terminalA Linux terminal with Bash. You start Innovus here, and its prompt appears here.Until you type exit
Innovus promptThe Tcl prompt of the running session, in the launch terminal. Commands typed here go to the tool.Until Innovus exits
Source filesText files you create in an editor: here import.tcl and restore.tcl. They are content, not typed commands.They stay on disk
Reading terminalA second Linux terminal in the same run folder, for reading reports while the session is open.As long as you keep it
Before you start the lab

This chapter provides teaching material and an example configuration. It does not provide a licensed Innovus installation, a process design kit (PDK), proprietary libraries, or a complete runnable design. Obtain an approved input set from your project or training environment. If you have no tool or inputs, skip the lab and work the evidence-reading exercises.

The lab in eight steps
Which place each step uses, and where a failed check sends you
The lab in eight steps
Figure 17 Steps 1 to 4 prepare and launch one import; step 5 judges it; steps 6 to 8 save, restore, compare and export.

What to notice: A check left at investigate or stop sends you back to Step 2, in a new folder, not forward to the save.

The restore is a separate, fresh session, started later in a new folder. When Innovus runs interactively, the exit status of the process is not available until the process ends. While the session is open, its status is pending, which is not a failure. The launch commands below capture it automatically when the process returns.

Path policy for this lab. Use approved absolute, resolved input paths throughout. That includes the file references used by the view configuration and any sourced constraint files. The exception is a project that provides an explicit working-directory convention.

Steps 1 to 4 run in one Bash session, the launch terminal, so the variables set in Step 1 stay available. The reading terminal is a separate shell and needs none of them.

12.2  Step 1. Review the inputs

This is the package review from "Conditional inputs, alternatives, and reviewing a package", applied to your package. The paths below are examples. Replace them with your own absolute paths, then run the block in the launch terminal. A path that contains spaces needs quotes in Bash and braces in Tcl.

STEP 1 - NAME THE INPUTS (EXAMPLE PATHS)
$ TOP="demo_top"   # example top name; use yours
$ NETLIST="/proj/demo/inputs/demo_top.v"   # example absolute netlist path
$ VIEWFILE="/proj/demo/inputs/viewDefinition.tcl"   # the view definition file
$ LEFS=("/proj/demo/inputs/tech.lef" "/proj/demo/inputs/stdcells.lef")   # tech first
$ D=/proj/demo/inputs   # the example input folder
$ NESTED=("$D/stdcells_slow.lib" "$D/stdcells_fast.lib")   # Liberty files
$ NESTED+=("$D/sram_slow.lib" "$D/sram_fast.lib")   # macro Liberty files
$ NESTED+=("$D/rc_slow.captbl" "$D/rc_fast.captbl")   # RC data
$ NESTED+=("$D/func.sdc" "$D/test.sdc")   # constraint files
STEP 1 - CHECK EACH INPUT (INSPECTION ONLY)
$ unusable=0   # count of inputs that fail the check
$ for f in "$NETLIST" "${LEFS[@]}" "$VIEWFILE" "${NESTED[@]}"; do   # check each input
    if [ -f "$f" ] && [ -r "$f" ] && [ -s "$f" ]; then
      echo "ok       $f"
    else
      echo "UNUSABLE $f"; unusable=$((unusable+1))
    fi
  done
$ echo "unusable inputs: $unusable"   # must print 0
$ for f in "$NETLIST" "$VIEWFILE"; do echo "== $f"; head -n 3 "$f"; done   # first lines
$ grep -n -w "module $TOP" "$NETLIST"   # hint only: possible top definitions
$ grep -n -E "sdc_files|timing|cap_table|qx_tech_file" "$VIEWFILE"   # hint: references

What the file check proves: each path resolves to a regular file, the account can read it, and it is nonempty. It does not prove correct syntax, the correct revision, a correct model, mutual consistency, or that Innovus parses it. A directory or an empty file fails the check, which a plain -⁠r or -⁠s test alone would not catch.

The two grep commands are navigation aids, not dependency extractors. A Tcl reference can span lines or be built from a variable or list. It can also come from a file that the view file sources.

12.3  Step 2. Make a fresh run folder

Every attempt gets its own folder, and a failed attempt keeps its folder. The block refuses to reuse a name. If it prints STOP, do not continue to the next step.

STEP 2 - CREATE ONE NEW RUN FOLDER
$ RUN="$HOME/import_run_$(date +%Y%m%d_%H%M%S)"   # a new name from date and time
$ if [ -e "$RUN" ]; then   # refuse to reuse an existing folder
    echo "STOP: $RUN exists; wait a second and run this block again"
  elif mkdir "$RUN" && cd "$RUN"; then
    echo "working in $(pwd)"
  else
    echo "STOP: could not create $RUN"
  fi

12.4  Step 3. Write the import script

Create import.tcl in the run folder with your editor. The configuration is Path A from "The init_design import flow". Only the lines between the EDIT markers change. The values must be the same absolute paths that Step 1 checked. The paths and view names below are examples.

If you start from a project template, its values are written as REPLACE_NETLIST_PATH and similar. The guard and the grep below catch any you forgot to edit. With the example values shown here, both find nothing.

The script has seven blocks, shown in seven parts. Read it once as a reviewer, block by block.

FILE - import.tcl (EDIT THE MARKED LINES)
# ---- EDIT: values from your approved handoff, absolute paths ----
set init_design_netlisttype Verilog
set init_verilog [list /proj/demo/inputs/demo_top.v]
set init_design_settop 1
set init_top_cell demo_top
set init_lef_file [list /proj/demo/inputs/tech.lef /proj/demo/inputs/stdcells.lef]
set init_pwr_net VDD
set init_gnd_net VSS
set init_design_uniquify 1
set init_mmmc_file /proj/demo/inputs/viewDefinition.tcl
# If your project has an I/O file, add: set init_io_file /proj/demo/inputs/demo.io
# The views the manifest says must be active, by role.
set want_setup [list func_slow test_slow]
set want_hold [list func_fast]
# ---- END EDIT ----
FILE - import.tcl, CONTINUED (GUARDS)
# Refuse to run with a template marker left in any setting.
foreach g {init_verilog init_top_cell init_lef_file init_pwr_net \
           init_gnd_net init_mmmc_file init_io_file \
           want_setup want_hold} {
    if {[info exists $g] && [string match {*[R]EPLACE_*} [set $g]]} {
        error "placeholder left in $g"
    }
}
# Policy check: every input path, including an I/O file, must be absolute.
set path_list [concat $init_verilog $init_lef_file [list $init_mmmc_file]]
# An optional I/O file, set here or inherited, gets the same check.
if {[info exists init_io_file] && $init_io_file ne ""} {
    lappend path_list $init_io_file
}
foreach f $path_list {
    if {[file pathtype $f] ne "absolute"} {
        error "relative input path: $f"
    }
}
FILE - import.tcl, CONTINUED (EFFECTIVE CONFIGURATION AND IMPORT)
# Record the release and the effective configuration.
puts "release: [getVersion]"
foreach g {init_design_netlisttype init_verilog init_design_settop \
           init_top_cell init_lef_file init_pwr_net init_gnd_net \
           init_design_uniquify init_mmmc_file init_io_file} {
    if {[info exists $g]} {
        puts "$g = [set $g]"
    } else {
        puts "$g is not set"
    }
}
# Record the check settings the import runs with.
getCheckMode -netlist -library
# Build the database.
init_design
FILE - import.tcl, CONTINUED (BASELINE)
# Baseline: the identity and views this run actually holds.
set fp [open baseline_top.txt w]
puts $fp [dbGet top.name]
close $fp
redirect views_setup.rpt {report_analysis_views -type setup}
redirect views_hold.rpt {report_analysis_views -type hold}
redirect views_all.rpt {report_analysis_views -type all}
# Compare setup and hold membership separately with the manifest.
set got_s [lsort [all_analysis_views -type setup]]
set got_h [lsort [all_analysis_views -type hold]]
set fp [open views_match.txt w]
foreach {role got want} [list setup $got_s $want_setup \
                             hold $got_h $want_hold] {
    if {$got eq [lsort $want]} {
        puts $fp "MATCH-MEMBERS $role $got"
    } else {
        puts $fp "MISMATCH $role active=$got wanted=[lsort $want]"
    }
}
close $fp
FILE - import.tcl, CONTINUED (EVIDENCE FOR CHECKS B TO G)
# Library, netlist and uniqueness evidence.
checkDesign -physicalLibrary -timingLibrary -noHtml \
    -outfile checkdesign.rpt
checkNetlist -outfile checknetlist.rpt
set uniq [checkUnique -verbose]
set fp [open checkunique_return.txt w]
puts $fp "checkUnique returned $uniq"
close $fp
redirect checkunique_verbose.txt {checkUnique -verbose}
FILE - import.tcl, CONTINUED (PER-VIEW EVIDENCE)
# Per-view clock, constraint and coverage evidence.
set active_all [concat $got_s $got_h]
foreach v [lsort -unique [concat $want_setup $want_hold]] {
    if {$v ni $active_all} {
        puts "SKIPPED $v: not active, see views_match.txt"
        continue
    }
    redirect clocks_$v.rpt "report_clocks -view $v"
    redirect timing_$v.rpt "check_timing -verbose -view $v"
    redirect coverage_$v.rpt "report_analysis_coverage -view $v"
    redirect untested_$v.rpt \
        "report_analysis_coverage -view $v -verbose untested -sort reason"
}
FILE - import.tcl, CONTINUED (THE LAST CHECK)
# Prerequisite checks last: errors found here stop the script.
check_design -type {library netlist timing} -out_file check_design.tcl
puts "evidence written to [pwd]"

Confirm in the Linux terminal that no template marker is left.

STEP 3 - CONFIRM NO TEMPLATE MARKER IS LEFT
$ grep -n REPLACE_ import.tcl   # prints any line still holding a marker; expect none

If lines print, edit them. If a wanted view is not created by your view definition, views_match.txt will say so.

12.5  Step 4. Launch Innovus

STEP 4 - START THE TOOL AND CAPTURE ITS EXIT STATUS
$ if command -v innovus; then   # launch only if the executable is found
    # Record the launch context for the run.
    echo "cwd=$(pwd)" > launch_record.txt
    echo "date=$(date)" >> launch_record.txt
    echo "tmpdir=${TMPDIR:-unset}" >> launch_record.txt
    # Start the Legacy UI without the GUI; capture the exit status.
    innovus -legacy_ui -no_gui -abort_on_error -log import \
      -files import.tcl; rc=$?; printf '%s\n' "$rc" > import_exit_status.txt
  else
    echo "STOP: innovus not found; nothing was launched"
  fi

There are two paths from here.

The tool creates a temporary directory per session. When TMPDIR is set, the directory goes inside it. Otherwise it goes in the current directory if writable, else in /tmp. The launch record above notes TMPDIR. Other tools may use a different order, so do not carry this rule over.

12.6  Step 5. Read the evidence

Open the reading terminal and change to the run folder; the launch terminal's pwd shows its path. Do not type into the Innovus prompt yet. Work through the nine checks with the files the script wrote, listed in Table 17.

STEP 5 - LIST AND READ THE EVIDENCE (INSPECTION ONLY)
$ ls -l --time-style=full-iso   # every file should be from this run
$ cat baseline_top.txt views_match.txt checkunique_return.txt   # baseline facts
Table 17 Where the evidence for each check lives
CheckFiles to read
A. Identitybaseline_top.txt, the configuration lines in import.log
B. Library bindingcheckdesign.rpt, check_design.tcl
C. Netlistchecknetlist.rpt, checkunique_return.txt, checkunique_verbose.txt
D. Viewsviews_match.txt, views_setup.rpt, views_hold.rpt, views_all.rpt, and the activation statements for the defaults
E. Clocksclocks_func_slow.rpt and the other clocks_ files, one per view
F. Constraintstiming_func_slow.rpt and the other timing_ files
G. Coveragecoverage_ and untested_ files, one of each per view
H. Logimport.log
I. FreshnessModification times of the files above, compared with the log

For each check, write the evidence, your intent and a decision, as in Table 14. For check D, also compare the first view of each activation list with the defaults your project intends. A keyword search through import.log helps you find where to read. It does not replace reading.

If a check is at investigate or stop, do not save an accepted checkpoint. A deliberately named debug checkpoint is a separate, project-approved action. It is not always possible after an aborting error. Exit, fix the cause at its owner, and begin again from Step 2 in a new folder.

12.7  Step 6. Save the checkpoint, only if the checks allow it

At the Innovus prompt, in the launch terminal:

STEP 6 - SAVE, THEN END THE SESSION
innovus> saveDesign accepted.enc ;# save the accepted database under a deliberate name
innovus> exit ;# end the session; the launch command then records the status

When exit returns you to the Bash prompt, the launch command has already written the status. Read it, and look at the checkpoint items.

STEP 6 - READ THE STATUS AND LOOK AT THE SAVED ITEMS
$ cat import_exit_status.txt   # the status of the Innovus process
$ ls -l accepted.enc   # the small restore file; not proof the save worked
$ ls accepted.enc.dat | head   # the saved directory, first entries

A zero status is necessary and is not proof of an accepted import. A nonzero status needs an explanation before you rely on any evidence. The listing shows that something was written. The checkpoint is attempted, and it is not yet verified.

12.8  Step 7. Restore in a fresh session and compare

Make a new attempt folder inside the run folder. Earlier evidence stays untouched.

STEP 7 - CREATE THE RESTORE FOLDER
$ if mkdir restore_try1 && cd restore_try1; then   # a new, empty folder
    echo "restoring from $(pwd)"
  else
    echo "STOP: could not create restore_try1"
  fi

Where the saved references point. Under the path policy, the default saveDesign stored absolute external references. So the restore folder's location does not matter for them. The checkpoint's real dependencies are what the save retained, not the strings typed in Step 1. Look at them read-only, without editing anything.

STEP 7 - READ-ONLY LOOK AT THE SAVED REFERENCES
$ ls ../accepted.enc.dat   # list the saved directory; edit nothing inside it
$ grep -n -i -E "lef|lib|sdc" ../accepted.enc.dat/*.globals | head -n 20   # references

The .globals layout is release-specific, so this look is a hint. The restore log is the evidence of which dependencies resolved.

Your project may instead keep relative paths under a working-directory convention. That is a different, separately defined procedure. Save with -⁠user_path and restore from a directory with the same structure. Or use setImportMode -⁠syncRelativePath true, which synchronizes the relative paths in the saved .globals file to the current directory. It copies nothing and repairs nothing, so read the restore log afterwards. This lab does not use that branch.

Create restore.tcl in this folder. It reads the top from the saving run's baseline, not from today's configuration. It writes evidence from this attempt only.

FILE - restore.tcl
# The saving run is the folder above this one.
set saved_run [file dirname [pwd]]
# The baseline recorded by the saving run is the source of intent.
set fp [open $saved_run/baseline_top.txt r]
set top [string trim [read $fp]]
close $fp
puts "restoring $saved_run/accepted.enc.dat as $top"
restoreDesign $saved_run/accepted.enc.dat $top
# Evidence from this attempt only.
set fp [open restored_top.txt w]
puts $fp [dbGet top.name]
close $fp
redirect restored_setup.rpt {report_analysis_views -type setup}
redirect restored_hold.rpt {report_analysis_views -type hold}
puts "restore evidence written to [pwd]"
STEP 7 - START A FRESH SESSION FOR THE RESTORE
$ innovus -legacy_ui -no_gui -abort_on_error -log restore \
    -files restore.tcl; rc=$?; printf '%s\n' "$rc" > restore_exit_status.txt   # status

The same two paths apply. On success the session stays open at its prompt, and Step 8 uses it. On failure the process has ended, so keep the folder and read restore.log first. Do not compare leftover files.

With the session open, read the log and then compare, in the reading terminal, from the restore folder.

STEP 7 - READ THE RESTORE LOG (INSPECTION ONLY)
$ head -n 40 restore.log   # read the log from the top
$ grep -n -i -E "error|warn" restore.log | head -n 20   # helps you find where to read

Setup and hold are compared as separate pairs, as drawn in Figure 18. The command diff ends with 0 if the files are the same and 1 if they differ. It ends with 2 or more if it could not do its job.

STEP 7 - COMPARE TOP, SETUP AND HOLD WITH THE SAVING RUN
$ for pair in "baseline_top.txt restored_top.txt" \
    "views_setup.rpt restored_setup.rpt" \
    "views_hold.rpt restored_hold.rpt"; do   # three separate pairs
    set -- $pair
    if [ -s "../$1" ] && [ -s "$2" ]; then
      diff "../$1" "$2" > "diff_${2%.*}.txt"
      rc=$?
      echo "$1 vs $2: diff status $rc (0 same, 1 differs, 2+ error)"
    else
      echo "UNKNOWN: $1 or $2 is missing or empty"
    fi
  done

Read the three results.

Comparing a restore with its saving run
Three file pairs, compared one by one
Comparing a restore with its saving run
Figure 18 The restore folder's top, setup and hold files are each compared with the saving run's baseline by diff.

What to notice: A status of 2 or a missing file means no comparison happened, which is not a match.

12.9  Step 8. Try the three exports

Still in the restored session, at the Innovus prompt, write one of each into the restore folder. The view name func_slow is an example; use one of your own view names.

STEP 8 - THE THREE EXPORTS
innovus> saveNetlist export_netlist.v ;# logical netlist, as Verilog
innovus> defOut -floorplan -netlist -unplaced \
    export_early.def ;# floorplan and unplaced netlist
innovus> writeTimingCon export_func_slow.sdc -view func_slow ;# constraints of one view
innovus> exit ;# end the session; the launch command then records the status

When the process returns, restore_exit_status.txt holds its status. A zero is necessary and not proof that the restore was verified. Then take a quick look at each file, as the export sections describe. This is inspection, not validation.

STEP 8 - QUICK LOOK AT EACH EXPORT (INSPECTION ONLY)
$ cat restore_exit_status.txt   # the status of the restore session
$ head -n 5 export_netlist.v   # netlist: not empty
$ tail -n 3 export_netlist.v   # netlist: not cut off
$ grep -n -w "module" export_netlist.v | head   # module statements appear somewhere
$ grep -n -E "^DESIGN|^ROW|^UNITS" export_early.def | head   # DEF: design and rows
$ tail -n 3 export_early.def   # DEF: the end text
$ grep -n -E "create_clock|set_input_delay|set_output_delay" \
    export_*.sdc   # constraints: clocks and boundary delays

For each file, ask what the look lets you conclude and what it cannot. A header or a closing statement is useful and is not proof.

12.10  What the lab does not establish

The lab does not show timing closure, routability, power connectivity or signoff readiness. It does not show that the constraints, corners or libraries are right. It does not run floorplanning, placement, clock tree synthesis, routing, extraction or signoff.

When you report the result, say which claim you earned. The claims are: inputs reviewed; import observed and judged; checkpoint saved; checkpoint restored and compared. Each is a different claim.

Takeaway One run per folder, evidence before the save, and a fresh restore compared file by file before anyone says "verified".

13  Evidence-reading exercises, with answers

These exercises need no tool. Each gives a short piece of illustrative evidence, like the ones in the post-import checks, and asks for a judgment. Cover the answer and decide first. The answers give a conclusion, a reason and the action or evidence needed.

13.1  Exercise 1: a package review

The handoff for demo_top has these notes.

Proceed or stop?

Answer

13.2  Exercise 2: reading a configuration

What is wrong with each of these lines, and what would you check?

FILE - A CONFIGURATION WITH FAULTS (TEACHING EXAMPLE WITH FAULTS)
set init_verilog [list data/demo_top.v]
set init_design_settop 0
set init_top_cell demo_top
set init_lef_file [list data/stdcells.lef data/tech.lef]
create_library_set -name libs_slow -timing [list data/stdcells_slow.lib]
create_delay_corner -name slow -library_set libs_slow \
    -rc_corner rc_slow
create_analysis_view -name func_slow \
    -constraint_mode func -delay_corner slow
set_analysis_view -setup {func_slow} -hold {func_slow}
init_design
Answer

There are four faults, plus one decision to confirm.

  • settop is 0. The tool chooses the top, and init_top_cell is not used as the author thinks. Set init_design_settop 1 to name the top.
  • LEF order. The cell LEF comes before the technology LEF, so layers and sites may be unknown when it is read.
  • Missing objects. create_delay_corner refers to rc_slow, and create_analysis_view refers to the constraint mode func. Neither object was created.
  • The delay corner owns the RC reference, and the analysis view owns the constraint-mode reference.
  • Activation before import. set_analysis_view runs before init_design, which is not allowed. The inline route passes the lists to init_design -⁠setup ... -⁠hold ....
  • To confirm. The same view is listed for setup and hold. Ask whether that is intended.

13.3  Exercise 3: identity and views

ILLUSTRATIVE OUTPUT - EXERCISE 3 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
declared top   : demo_top
loaded top     : demo_top
manifest setup : func_slow test_slow
manifest hold  : func_fast
active setup   : func_slow
active hold    : func_fast
defined views  : func_slow func_fast test_slow

Can you accept this database for the functional mode? For the test mode?

Answer

13.4  Exercise 4: a coverage report

ILLUSTRATIVE OUTPUT - EXERCISE 4 (AN IMITATION TO READ, NOT A TOOL TRANSCRIPT)
view func_slow   (rows illustrative)
signal pin   reference pin   check   reason
u_reg1/D     u_reg1/CK       setup   const
u_reg0/D     u_reg0/CK       hold    false_path
u_reg0/D     u_reg0/CK       setup   no_startpoint_clock

Each row is one untested timing check. It gives the data pin, the clock pin it is checked against, the check type and the reason. For each reason, say what you would ask and of whom.

Answer
Answer, continued

13.5  Exercise 5: a restore comparison

After a restore attempt, diff of the top names ends with status 0. The diff of a view report prints "No such file" and ends with status 2. A colleague says "the restore matched". Is that right?

Answer

13.6  Exercise 6: choosing an artifact

Match each request to the artifact.

Answer

14  Troubleshooting and common mistakes

Look first, then change one thing at a time, and ask the right owner. The first-observation column of Table 18 only inspects. The fix column changes something, and it belongs after you have written the first observation down. A failed run keeps its folder.

Table 18 Troubleshooting a first import
SymptomLikely causesFirst observationFixOwner
An input is unusableWrong path, file not delivered, no permissionStep 1 outputObtain the file or access; start a new runProject
init_design refuses to startDesign or library already loaded in the sessionThe error text; whether this is a fresh sessionExit; start a new sessionYou
The wrong top loadedWrong init_top_cell, or settop 0 chose anotherbaseline_top.txt against the declared topCorrect the setting; new runYou
Unresolved cellsMissing LEF or timing entry, name or release mismatchcheckdesign.rpt, check_design.tclProvide the library; new runLibrary owner
A macro is placed but not timedIts Liberty file is not in the library setThe timing-library checkAdd the model to the right library setMacro owner
A required view is missingDefined but not activated, or a later activation dropped itviews_match.txt (setup and hold lines), views_all.rptCorrect the activation; new runYou
No clock, or poor coverageClock missing, its source selection matches nothing, or it is defined in a different modeclocks_ and untested_ files for that viewCorrect the constraintsConstraint owner
Modules not unique after importinit_design_uniquify not set as intendedcheckunique_return.txt, checkunique_verbose.txtSet it deliberately; new runYou
Process ended before the prompt, or nonzero status-⁠abort_on_error ended the process on an applicable error, a crash, or a signalimport_exit_status.txt, the last lines of import.logKeep the folder; explain it; new runYou
Save did not completeNo space, no permission, session endedThe save log lines; a listing is only a first hintFree space; save in a live session; verify by restoreYou
Restore fails or differsDifferent release, unresolved relative paths, moved inputs, a changed file in the saved folderrestore.log and the references it reports, the diff_*.txt filesRestore with the saving release; never edit the saved folderYou
What was and was not tested

Nothing in this chapter was run on a licensed Innovus. The Bash blocks and the Tcl script logic were exercised only with stand-in programs and fixture files. Example output is illustrative. Exact message text, report layouts, and whether getCheckMode answers before init_design remain release-dependent. So do the treatment of a missing timing model and the reports for an inactive view. Where your release differs, your release is right.

Takeaway Inspect first, change one thing per run, and send each fix to the owner of the input that caused it.

15  Interview preparation

Beginner
Q1. init_design finished with no errors. Is the design ready for floorplanning?

No: a clean init_design shows only that the tool built a database.

What is being tested: whether you separate "the tool built a database" from "the inputs and configuration are right".
Beginner
Q2. A netlist names NAND2_X1. What must the LEF and the Liberty file provide for it?

The LEF needs a matching MACRO NAND2_X1, and the Liberty file needs cell (NAND2_X1) with the same pins, a function and arcs.

What is being tested: whether you know the three descriptions of one cell and the limits of name binding.
Beginner
Q3. Why is the technology LEF listed first in init_lef_file?

Because cell LEF files refer to layer and site names that the technology LEF defines.

What is being tested: whether you know the dependency between technology and cell LEF.
Intermediate
Q4. When would you set init_design_uniquify to 1, and when to 0?

Set 1 when the flow will run clock tree synthesis, scan reorder or timing optimization; keep 0 for a master-and-clone flow.

What is being tested: whether you understand why independent definitions are needed and how to confirm the setting.
Intermediate
Q5. Name the MMMC objects in dependency order, and say what an analysis view pairs.

Library set and RC corner, then delay corner, then constraint mode, then analysis view, then activation with set_analysis_view.

What is being tested: whether you can trace a view to its files through the object graph.
Intermediate
Q6. What is the difference between a defined, an active and a default view?

Defined means the object exists; active means the tool analyzes it in a role; default is the first name in each list.

What is being tested: whether you can tell the three states apart and know how to establish the default.
Advanced
Q7. A site script runs set_analysis_view -⁠setup {func_slow} -⁠hold {func_fast} after the view file. What happens?

test_slow is silently dropped from the setup list, because the call is not incremental.

What is being tested: whether you know that activation replaces the lists, and how to catch a dropped view.
Intermediate
Q8. How do Path A and Path B differ in activating views?

Path A activates them with set_analysis_view at the end of the view file; Path B passes them to init_design -⁠setup ... -⁠hold ....

What is being tested: whether you can read an import script and name its route.
Beginner
Q9. Your first import failed. Can you fix a global and call init_design again?

No: start a new session in a new run folder with the corrected configuration.

What is being tested: whether you treat a failed import as a reason for a clean restart.
Advanced
Q10. func.sdc has set_output_delay 3.0 [get_ports dout] with no -⁠clock, and nothing complains. What is the effect?

The constraint is accepted and ignored, so the path to dout behaves as if it had no output delay.

What is being tested: whether you know that "loads cleanly" is not "constrains correctly".
Advanced
Q11. A coverage report shows 12 untested checks with reason false_path. Do you accept them?

Not yet: a reason is a prompt for a question, not a justification.

What is being tested: whether you defend untested checks against design intent instead of accepting the reason.
Intermediate
Q12. What does checkUnique return, and why record the value in its own file?

It returns 1 if every non-leaf module is instantiated only once, otherwise 0.

What is being tested: whether you know the difference between a command's return value and its printed output.
Intermediate
Q13. A teammate says "saveDesign worked, the folder is there". What do you still need?

A restore in a fresh session, a read restore log, and a comparison with the saving run's baseline.

What is being tested: whether you know what makes a checkpoint a verified handoff.
Beginner
Q14. Why is an exported DEF or netlist not "the design"?

Each export is a view of the database for one reader, and omits most of it.

What is being tested: whether you can match each artifact to its reader and its limits.

16  Chapter close

Compact glossary

Table 19 Compact glossary
TermMeaning
HandoffThe delivered set of inputs, each a promise from a different owner
Gate-level netlistVerilog that lists modules, cell instances and the nets connecting them
ModuleA definition with ports, declared once, such as alu_slice
InstanceOne use of a module or cell inside another module, such as u_alu0
Cell masterThe library definition a leaf instance refers to, such as NAND2_X1
UniquificationGiving each instance its own module definition, so it can change alone
LEFText format for cell abstracts and technology rules
AbstractA cell outline with size, pin shapes and obstructions; not the layout
SiteThe smallest placement grid unit; here 0.20 by 1.60 µm
LibertyText format for cell function and timing at one corner
Timing arcOne input-to-output timing relationship in a Liberty cell
CornerOne process, voltage and temperature condition
RC cornerThe wire resistance and capacitance data for one corner
SDCThe constraint format that declares clocks, boundary delays and exceptions
Virtual clockA clock with a name and no source in the design, used for boundary delays
ExceptionA constraint that removes or changes a check on selected paths
MMMCMulti-mode multi-corner: modes and corners combined into analysis views
Delay cornerA library set paired with an RC corner
Constraint modeA named group of SDC files for one operating mode
Analysis viewOne constraint mode paired with one delay corner
Active viewA view the tool analyzes for setup, hold or both
Physical-only modeAn import with no MMMC data and no timing system
Untested checkA timing check that is not performed, reported with a reason
Native checkpointThe database saved by saveDesign and read back by restoreDesign

One-page summary

Figure 1 at the start of the chapter is the whole chapter on one page. The summary below puts it in words.

Purpose. This chapter takes a delivered design package to a first checkpoint you can defend. It teaches what each input contributes and how the netlist, LEF and Liberty descriptions of a cell must agree. It shows how constraints and MMMC views are built and traced, and how the import is configured and followed. It closes with judging the database, and with what a checkpoint and each export can carry.

Workflow map.

  1. Handoff reviewed → three descriptions reconciled → constraints and MMMC understood.
  2. Import configured (Path A or Path B) → import followed → nine checks read against intent → decision.
  3. Checkpoint saved → restored in a fresh session and compared with the saving run's baseline.
  4. Exports made for specific readers.

Key concepts.

Common mistakes.

Readiness questions.

One-page command cheat sheet

Legacy UI only. One initialization route per session. Each block below is a separate act. The file names are short examples.

PATHS A AND B (ABBREVIATED)
innovus> set init_verilog [list a.v b.v] ;# netlist files
innovus> set init_design_settop 1 ;# we name the top
innovus> set init_top_cell demo_top ;# the top module
innovus> set init_lef_file [list tech.lef cells.lef] ;# technology LEF first
innovus> set init_pwr_net VDD ;# global power net
innovus> set init_gnd_net VSS ;# global ground net
innovus> set init_design_uniquify 1 ;# uniquify while reading
innovus> set init_mmmc_file view.tcl ;# Path A: the view file activates views
innovus> init_design ;# build the database
# Path B instead (abbreviated): objects created first, then
# init_design -setup {func_slow} -hold {func_fast}
EVIDENCE, THEN SAVE IN THE SAME SESSION
innovus> puts [dbGet top.name] ;# identity
innovus> report_analysis_views -type setup ;# setup views
innovus> report_analysis_views -type hold ;# hold views
innovus> checkDesign -physicalLibrary -timingLibrary -noHtml \
    -outfile a.rpt ;# library binding
innovus> checkNetlist -outfile b.rpt ;# netlist structure
innovus> redirect c.rpt {check_timing -verbose -view func_slow} ;# per-view check
innovus> saveDesign accepted.enc ;# only after the evidence is read
FRESH SESSION - RESTORE, COMPARE, THEN EXPORT
innovus> restoreDesign accepted.enc.dat demo_top ;# then compare top, setup, hold
innovus> saveNetlist n.v ;# logical netlist
innovus> defOut -floorplan -netlist -unplaced e.def ;# default geometry
innovus> writeTimingCon c.sdc -view func_slow ;# constraints of one view

Rules. Use a new session for every retry. Print the globals you depend on. Read each report for its view and run. Save only after the checks are read. Call the save verified only after a fresh restore matches.

Where the next chapter goes, and why

You now hold a checked, saved first database and a precise list of what it does not prove. Its die, rows and tracks are only defaults from init_design. Floorplanning replaces them with deliberate choices: die and core size, aspect ratio, macro positions and pin placement. Those choices only make sense on a database whose identity, models, views and constraints you have already judged. That is why this chapter comes first.