Mban
Mban
Physical Implementation
Application Note
Version J-2014.09-SP2, December 2014
Copyright Notice and Proprietary Information
 2014 Synopsys, Inc. All rights reserved. This software and documentation contain confidential and proprietary information that is
the property of Synopsys, Inc. The software and documentation are furnished under a license agreement and may be used or
copied only in accordance with the terms of the license agreement. No part of the software and documentation may be reproduced,
transmitted, or translated, in any form or by any means, electronic, mechanical, manual, optical, or otherwise, without prior written
permission of Synopsys, Inc., or as expressly provided by the license agreement.
Destination Control Statement
All technical data contained in this publication is subject to the export control laws of the United States of America.
Disclosure to nationals of other countries contrary to United States law is prohibited. It is the reader's responsibility to
determine the applicable regulations and to comply with them.
Disclaimer
SYNOPSYS, INC., AND ITS LICENSORS MAKE NO WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, WITH
REGARD TO THIS MATERIAL, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
Trademarks
Synopsys and certain Synopsys product names are trademarks of Synopsys, as set forth at
http://www.synopsys.com/Company/Pages/Trademarks.aspx.
All other product or company names may be trademarks of their respective owners.
Third-Party Links
Any links to third-party websites included in this document are for your convenience only. Synopsys does not endorse
and is not responsible for such websites and their practices, including privacy practices, availability, and content.
Synopsys, Inc.
700 E. Middlefield Road
Mountain View, CA 94043
www.synopsys.com
Multibit Register Synthesis and Physical Implementation Application Note, version J-2014.09-SP2                                     ii
Contents
                                                                                                                              iii
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note                                           Version J-2014.09-SP2
                                                                                                                           J-2014.09-SP2
Contents                                                                                                                              iv
1
Multibit Register Synthesis and Physical
Implementation                                                                                     1
  The Design Compiler and IC Compiler tools can replace single-bit register cells with multibit
  register cells if such cells are available in the logic library and physical library. Using multibit
  register cells in place of single-bit cells can reduce area, clock tree net length, and power.
  The following sections describe the synthesis and physical implementation flows using
  multibit registers:
     Multibit Register Overview
     Library Requirements
     RTL Bus Inference Flow
     Placement-Based Multibit Register Banking
     Multibit Registers in Galaxy Flows
     Reporting Multibit Registers in the Design
                                                                                                   1-1
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note                  Version J-2014.09-SP2
                                                                                                  J-2014.09-SP2
      These benefits must be balanced against the lower flexibility in placing the registers and
      routing the connections to them.
      Figure 1-1 shows how multiple single-bit registers can be replaced with a multibit register.
Figure 1-1     Replacing Multiple Single-Bit Register Cells With a Multibit Register Cell
                                                                              2              2
             D     Q           D        Q                                          D     Q
             SI                SI                                                  SI
             SE                SE                                                  SE
Replace with
      The area of the 2-bit cell is less than that of two 1-bit cells due to transistor-level optimization
      of the cell layout, which might include shared logic, shared power supply connections, and a
      shared substrate well. The scan bits in the multibit register can be connected together in a
      chain as in this example, or each bit can have its own scan input and scan output.
      The Galaxy Implementation Platform offers two different methods for replacing single-bit
      register cells with multibit register cells:
         RTL bus inference flow in the Design Compiler tool (in wireload and topographical
          modes). In this flow, the tool groups the register bits belonging to each bus (as defined in
          the RTL) into multibit components. You can also group bits manually by using the
          create_multibit command. The bits in each multibit component are targeted for
          implementation using multibit registers. The actual replacement of register bits occurs
          during execution of the compile_ultra command.
         Placement-based register banking flow in the Design Compiler Graphical and IC
          Compiler tools. In this flow, the tool groups single-bit register cells that are physically near
          each other into a register bank and replaces each register bank using one or more
          multibit register cells. This method works with both logically bused signals and unrelated
          register bits that meet the banking requirements. The register bits assigned to a bank
          must use the same clock signal and the same control signals, such as preset and clear
          signals.
      Both types of flows support scan chain generation and design-for-test protocols. A design
      modified by mapping single-bit registers to multibit registers can be formally verified with the
      Formality tool.
      To support multibit register flows, the logic library and physical library must contain both
      single-bit and multibit library cells, and the multibit cells must meet certain requirements so
      that the tools can recognize them as functionally equivalent to a group of single-bit cells.
Library Requirements
      To perform mapping from single-bit to multibit registers, the tool checks for matching pin
      functions and naming conventions in the multibit register pins, as shown in Figure 1-2.
Figure 1-2 Mapping of Single-Bit to Multibit Cells With the Same I/O Pins
              1-bit register
                                                                           2-bit register
1-bit register
2-bit register
      For example, if a single-bit register has Q and QN outputs, the tool can replace this register
      only with a multibit register that also has Q and QN outputs for each output register bit.
      In the RTL inference flow, the Design Compiler tool matches the single-bit cells with the
      multibit cell using the functionality of the cell in the library. The tool can match single-bit
      registers and multibit cells with different pin names.
      In the placement-based flow, the Design Compiler Graphical and IC Compiler tools do not
      look at the functionality of the cells. The tools use the pin names of the cell to match the
      single-bit cells and the multibit cell. The pin names for the matched single-bit and multibit
      cells are the same, except that the multibit pin name has a numeral appended to represent
      the bit number. For example, Q1 and QN1 or Q[1] and QN[1].
      For scan cells, you can use a multibit register cell with single scan input and single scan
      output for the whole cell, with the scan bits daisy-chained inside the cell; or with one scan
      input and one scan output for each register bit. Both types of multibit scan register
      configurations are supported. Dedicated scan output signals are also supported.
      Figure 1-3 shows how two single-bit scan cells can be mapped into either of two different
      compatible multibit scan cells, which have different scan configurations.
Figure 1-3 Single-Bit Scan Cell and Compatible Multibit Scan Cells
      The ff_bank or latch_bank group describes a cell that is a collection of parallel, single-bit
      sequential parts. Each part shares control signals with the other parts and performs an
      identical function. Both groups are typically used in cell and test_cell groups to
      represent multibit register.
      In the Liberty-format description of a multibit register cell, the ff_bank or latch_bank group
      keyword defines the multibit characteristic. For details, see the Library Compiler
      Methodology and Function Modeling User Guide, available on SolvNet:
         For the single-bit and multibit flip-flop definition syntax, see Describing a Flip-Flop and
          Describing a Multibit Flip-Flop in the chapter Defining Sequential Cells.
         For the single-bit and multibit latch definition syntax, see Describing a Latch and
          Describing a Multibit Latch, also in the chapter Defining Sequential Cells.
      For examples of Liberty-format descriptions of multibit cells, see Appendix A, Multibit Cell
      Modeling.
      When the Library Compiler tool compiles the .lib definition of a multibit register, it sets the
      multibit_width design attribute of the library cell to the number of register bits in the cell.
      The Design Compiler tool uses this attribute to determine the register bit width of the cell.
      You can check this attribute in the Design Compiler tool by using the get_attribute or
      report_attribute command:
      dc_shell> get_attribute [get_lib_cells my_lib/DFFx4] multibit_width
      4
      Note:
         Multibit UPF retention registers are not supported.
      You can use the report_multibit command to generate reports on the multibit
      components in the design, both before and after using the compile_ultra command:
         Before a compile operation, the report_multibit command reports the groupings of
          single-bit register cells resulting from inference from the RTL and by usage of the
          create_multibit command.
         After a compile operation, the report_multibit command reports the same multibit
          components, each component now replaced by one or more multibit cells, or still
          consisting of single-bit cells if multibit mapping was not successful.
      Commands used in the RTL bus inference flow do not work in the placement-aware multibit
      flow.
         default_none  The tool infers multibit registers only where enabled by directives
          embedded in the RTL. This is the default.
         default_all  The tool infers multibit registers from all bused registers, except where
          disabled by directives embedded in the RTL.
      The infer_multibit and dont_infer_multibit directives in the RTL enable and disable
      multibit register inference. For example, the following block of code defines a single Verilog
      multibit flip-flop register q0 with the default setting of default_none:
      module test (d0, d1, d2, rst, clk, q0, q1, q2);
        parameter d_width = 8;
endmodule
      This command groups the single-bit registers xreg[0] and xreg[1] into a new multibit
      component called my_mult1.
      You can use wildcard characters in the object list:
      dc_shell> create_multibit {y_reg*}
      In this example, the create_multibit command assigns all registers named y_reg* to a
      new multibit component. Design Compiler creates the name of the multibit component
      based on the name of the registers. To create a specific multibit component name, use the
      -name option.
      By default, the command organizes the register bits in reverse alphanumeric order, which
      affects their order of mapping during synthesis with the compile_ultra command. To sort
      them in forward order instead, use the -sort option of the create_multibit command.
      You can create multibit components in subdesigns as shown in the following example:
      dc_shell> create_multibit {U1/xrg[0] U1/xrg[1] U1/xrg[2]}
      All specified register cells must be in the same level of the hierarchy.
      Attributes:
          b - black box (unknown)
          h - hierarchical
          n - noncombinational
          r - removable
          u - contains unmapped logic
      The multibit component y_reg contains three register bits. The notation **SEQGEN** in the
      Reference column means generic sequential element, a technology-independent model
      of a register bit. The u in the Attributes column indicates a cell that contains unmapped
      logic. The three unmapped cells are targeted for mapping to a multibit library cell.
      After you use the compile_ultra command, the same report_multibit command
      reports the library cells used to implement the generic sequential registers:
      dc_shell> compile_ultra
       ...
      dc_shell> report_multibit y_reg
       ...
      Attributes:
          b - black box (unknown)
          h - hierarchical
          n - noncombinational
          r - removable
          u - contains unmapped logic
      In this example, the compile_ultra command mapped the three generic sequential
      register bits into one 2-bit library cell and one 1-bit library cell.
      The Design Compiler tool uses a colon character to identify multibit component registers
      with consecutive bits (for example, [2:1] in this report). If the colon conflicts with your back-
      end tools naming requirements, change the colon to another delimiter using the
      bus_range_separator_style variable.
      The tool uses a comma to separate nonconsecutive bits. For example, if you use bits 0
      through 5 and bit 7 in the multibit component, the report lists them as [0:5,7]. The
      bus_multiple_separator_style variable controls this delimiter.
      To report multibit components in a subdesign, specify the hierarchical instance name of the
      subdesign as in the following example:
      dc_shell> report_multibit U1/*
      The following example generates a report of multibit components in all of the subdesigns:
      dc_shell> report_multibit -hierarchical
      This command removes the multibit component named y_reg, causing its register bits to be
      no longer grouped for multibit synthesis. It does not remove the register bits themselves.
      This commands works on the specified multibit components, whether created by RTL
      inference or by usage of the create_multibit command.
      You can specify a multibit component name directly, which removes the whole component.
      Alternatively, you can specify the names of cells or cell instances, which are individually
      removed from existing multibit components without affecting the remaining register cells.
      If the design has already been compiled, the remove_multibit command removes the
      multibit component grouping but does not separate the multibit register into single-bit
      registers. To do that, you need run an incremental compile operation after the
      remove_multibit command, as shown in the following example.
      dc_shell> compile_ultra # Replaces single-bit cells with multibit cells
       ...
      dc_shell> report_timing # Reports timing results after synthesis
      Note:
         An incremental compile operation recognizes the remove_multibit command, but not
         the create_multibit command. It can decompose multibit cells, but not create new
         ones. Also, an incremental compile operation does not reconnect scan chains broken by
         decomposing multibit cells into single-bit cells.
      For either the Design Compiler Graphical or IC Compiler tool, you need to create a map file
      to specify the mapping of single-bit registers to multibit registers. The map file contains lines
      of text similar to the following:
      4 {1 MREG4}
      6 {1 MREG2}{1 MREG4}
      ...
      In this example, the first line says that any four compatible single-bit registers can be
      mapped into one MREG4 type multibit register. The second line says that any six compatible
      single-bit registers can be mapped into one MREG2 type register and one MREG4 type register.
      After you create the map file, you can use it to guide the Design Compiler Graphical tool or
      IC Compiler tool in mapping single-bit to multibit registers.
      Figure 1-4 summarizes the flow in the Design Compiler Graphical tool.
Figure 1-4 Multibit Banking Flow in the Design Compiler Graphical Tool
                                       compile_ultra
                                                                           Design Compiler Graphical
   Input map file                                                          multibit banking flow
Script file
compile_ultra -incremental
create_placement ...
Script file
place_opt -skip_initial_placement
      Both types of files are plain ASCII text files that you create in preparation for the multibit
      banking flow.
      For example,
      2   {1
           dff_2bit}   ;map 2 single bits to 1 dff_2bit register
      3   {1
           dff_2bit}   ;map 3 single bits to 1 dff_2bit register and 1 single
      4   {1
           dff_4bit}   ;map 4 single bits to 1 dff_4bit register
      5   {1
           dff_4bit}   ;map 5 single bits to 1 dff_4bit register and 1 single
      6   {1
           dff_4bit} {1 dff_2bit} ;map 6 single bits to 1 dff_4bit register
                                  ;and 1 dff_2bit register
      7 (1 dff_4bit} {1 dff_2bit} ;map 7 single bits to 1 dff_4bit register
                                  ;and 1 dff_2bit register and 1 single
      8 {2 dff_4bit}              ;map 8 single bits to 2 dff_4bit registers
      ...
      The list should continue up to the maximum number of single register bits that you want the
      tool to group into multibit registers, typically 32.
      By default, all single-bit registers can be mapped to any of the specified multibit registers. If
      you want the tool to group together single-bit registers of the same type, and to replace such
      groups only with multibit cells of the same type, you need to create a register group file as
      described in the next section, Register Group File.
      If the library has different types of multibit registers that differ only in their physical size and
      drive strength, the input map file should list only the smallest-area library cells. In that case,
      the Design Compiler Graphical tool or IC Compiler tool always replaces single-bit cells with
      the smallest-area multibit cells. During subsequent optimization, the tool might resize these
      multibit cells to larger, stronger-drive cells where needed to meet the timing constraints.
      Specifying only the smallest-area multibit register of each bit width is recommended. If you
      want to use different multibit registers of the same bit-width, you need to repeat each line for
      each available library cell. For example,
      2 {1    dff_2bitA}       ;map 2 single bits to 1 dff_2bitA register, or
      2 {1    dff_2bitB}       ;map 2 single bits to 1 dff_2bitB register
      3 {1    dff_2bitA}       ;map 3 single bits to 1 dff_2bitA register + single, or
      3 {1    dff_2bitB}       ;map 3 single bits to 1 dff_2bitB register + single
      4 {1    dff_4bitA}        ;map 4 single bits to 1 dff_4bitA register, or
      4 {1    dff_4bitB}        ;map 4 single bits to 1 dff_4bitB register
      ...
      When you specify multiple combinations for the same number of bits, the tool uses the first
      definition and ignores the subsequent definitions. In the following example, the tool uses
      1 dff_4bitA for 4-bit registers from the first line, ignoring the definition in the second line.
      4 {1 dff_4bitA} ;map 4 single bits to 1 dff_4bitA register
      4 {2 dff_2bitA} ;map 4 single bits to 2 dff_2bitA register
      where number is the number of single-bit library cells listed in the following braces.
      For example,
      reg_group_plain                  3   {dff_A dff_B dff_C}             {dff_2bit dff_4bit}
      reg_group_scan                   3   {sdff_A sdff_B sdff_C}          {sdff_2bit sdff_4bit}
      reg_group_Reset                  2   {Rdff_A Rdff_B}                 {Rdff_2bit Rdff_4bit}
      reg_group_Reset_scan             2   {Rsdff_A Rsdff_B}               {Rsdff_2bit Rsdff_4bit}
      The first line says that instances of the dff_A, dff_B, and dff_C single-bit library cells can
      be grouped together in any combination (but not with other types of single-bit cells), and
      these groups can be replaced only by instances of the dff_2bit and dff_4bit multibit
      library cells. The other three lines each define a register group for scan cells, for cells with
      reset inputs, and for scan cells with reset inputs, respectively.
      This register group file, together with the following input map file, fully describe the allowed
      grouping and mapping of single-bit registers to multibit registers.
      ;   input map file
      2   {1 dff_2bit}
      2   {1 sdff_2bit}
      2   {1 Rdff_2bit}
      2   {1 Rsdff_2bit}
      3 {1 dff_2bit}
      3 {1 sdff_2bit}
      3 {1 Rdff_2bit}
      3 {1 Rsdff_2bit}
      ...
      6 {1 dff_2bit 1 dff_4bit}
      6 {1 sdff_2bit 1 sdff_4bit}
      6 {1 Rdff_2bit 1 Rdff_4bit}
      6 {1 Rsdff_2bit 1 Rsdff_4bit}
      ...
      32 {8 dff_4bit}
      32 {8 sdff_4bit}
      32 {8 Rdff_4bit}
      32 {8 Rsdff_4bit}
      During grouping, Design Compiler and IC Compiler generate the following message:
           MB8SDFF_1                         :   584
           MB4SDFF_1                         :   149
           MB2SDFF_1                         :   169
           Excluded flops                    :   80
           Total flops banked                :   5606
           Total flops in design             :   6064
           Banking ratio                     :   92.45%
      Note:
         The banking ratio is determined by the total number of flops banked divided by the total
         number of flops in the design. The total number of flops banked is equivalent to the total
         bit number of the multibit register.
          This banking ratio is reported during grouping. Some of the banking commands could be
          rejected when executing the create_register_bank command. The banking ratio after
          executing the banking commands could be different from this report.
          Use the tcl script in the Reporting Multibit Registers in the Design section to get the
          banking ratio after sourcing the command file generated by register grouping.
         [-exclude_instances exclude_cells]
         [-wns_threshold percentage]
         [-wns_threshold_file file_name]
         [-common_net_pins names]
         [-name_prefix prefix]
         [-exclude_library_cells library_cells]
         [-exclude_size_only_flops true | false]
         [-exclude_start_stop_scan_flops true | false]
      You must specify the input map file name and the name of the script file to be written out by
      the command. A register group file is necessary to get optimum banking ratios.
      You can optionally restrict grouping by specifying that certain pins of the single-bit registers
      need to be connected to a shared net, such as the clock pin or reset pin. To do so, use the
      -common_net_pins option.
      You can optionally exclude certain single-bit registers from consideration for multibit register
      banking by specifying their library cell names or instance names, or by specifying exclusion
      criteria such as a timing slack threshold or the size-only attribute. For details, see the man
      page for the identify_register_banks command.
      You must specify at least the input map file name and the name of the script file to be written
      out by the placement command. A register group file is necessary to get optimum banking
      ratios.
      You can optionally restrict grouping by specifying that certain pins of the single-bit registers
      need to be connected to a shared net, such as the clock pin or reset pin. To do so, use the
      -common_net_pins option.
      You can optionally exclude certain single-bit registers from consideration for multibit register
      banking by specifying their library cell names or instance names, or by specifying exclusion
      criteria such as a timing slack threshold or the scan chain start/stop attribute. For details,
      see the man page for the set_banking_guidance_strategy command.
      To view the current register banking settings, use the following command:
      icc_shell> report_banking_guidance_strategy
      ...
          input_map_file           : my_map_file.map
          output_file              : my_banking.tcl
          maximum_flop_count       : 16
          minimum_flop_count       : 2
          register_group_file      : my_group_file.grp
          exclude_instances        : U_179 U_259 U_334 U_227 U_238
          wns_threshold            : 50.000000
          common_net_pins          : CP RN
          name_prefix              : groupA
          wns_threshold_file       :
          exclude_library_cells    :
      To remove the current register banking settings, use the following command:
      icc_shell> remove_banking_guidance_strategy
The register banking settings you specify apply only to the current tool session.
      create_register_bank Command
      To prepare for replacing single-bit registers with multibit registers, the tool writes out a script
      containing create_register_bank commands. This script is written by the
      identify_register_banks command in the Design Compiler Graphical tool or by the
      create_placement command in the IC Compiler tool.
      You need to execute the script to carry out the actual replacement of single-bit cells with
      multibit cells. You can insert, delete, and edit the create_register_bank commands in the
      script file to modify the banking behavior of the script.
      You can also execute the create_register_bank command by itself to perform a specific
      banking task.
      This is the syntax of the command:
      create_register_bank
        single_bit_register_object_list
        [-name bank_name]
        -lib_cell library_name/multibit_lib_cell_name
      Specifying the library name in the -lib_cell argument is mandatory in the Design
      Compiler tool and optional in the IC Compiler tool.
      For example, in the Design Compiler Graphical tool, the following command replaces the
      single-bit register instances reg_u1 through reg_u4 with an instance of the my_mbit_lib/
      mreg_4bit library cell:
      dc_shell-topo> create_register_bank -name my_mregA \
                      {reg_u1 reg_u2 reg_u3 reg_u4} \
                      -lib_cell my_mbit_lib/mreg_4bit
      ...
      ************ CREATE BANK ************
      Creating cell 'my_mregA' in design 'test'
            Cell:                         my_mregA
            Reference:                    sdff_2bit
            Hierarchy:                    test
            Library:                      class
      Any timing exceptions that were set on the single-bit cells are transferred to the replacement
      multibit cell.
      The following example shows how the IC Compiler tool replaces four single-bit registers that
      are physically close together with a single 4-bit register.
      icc_shell> create_register_bank name group_0 \
                  {i_REG0 i_REG1 i_REG2 i_REG3} \
                  lib_cell MREG4
      ...
      ************ BANKING SUMMARY ************
      The following 4 register instances:
          i_REG0
          i_REG1
          i_REG2
          i_REG3
      have been merged into 4-bit register 'group_0'
      (lib_cell : MREG4)
      If the single-bit registers do not meet these conditions, they are not replaced with multibit
      registers and a PSYN message is generated. For example,
      dc_shell> create_register_bank -name group0_1 \
                 { data_a_reg data_b_reg} -lib_cell mb_lib/MB2FF
      split_register_bank Command
      You can split a multibit register previously created by the create_register_bank command
      into smaller register cells (having fewer bits), including single-bit registers, by using the
      split_register_bank command:
      split_register_bank bank_name
        bank_name
        -lib_cells {library_name/cell_name}
      Specifying the library name in the -lib_cell argument is mandatory in the Design
      Compiler tool and optional in the IC Compiler tool.
      For example, in the Design Compiler Graphical tool, the following command splits a 4-bit
      register into a 2-bit register and two single-bit registers:
      dc_shell-topo> split_register_bank my_regA \
                      -lib_cells {mylib/mreg_2bit mylib/mreg_1bit mreg_1bit}
      The command preserves the order of the bits according to the order of the specified list of
      library cells. In this example, it replaces the first two bits of the 4-bit register with an instance
      of the mreg_2bit library cell, and replaces the remaining two bits with two instances of the
      mreg_1bit library cell. It breaks the connections to the removed 4-bit cell and appropriately
      reconnects the new 2-bit and single-bit cells.
      The following example shows how the IC Compiler tool splits a single 10-bit register into two
      4-bit registers and one 2-bit register.
      icc_shell> split_register_bank {group_1} \
                  lib_cells {MREG4 MREG4 MREG2}
      ...
      In Design Compiler, single-bit registers must be replaced with scan cells before performing
      multibit mapping. This is done by using the -scan option with the compile_ultra command
      during the initial compile. Multibit mapping must be performed before scan insertion. Both
      banking and debanking on a scan stitched design are not supported in Design Compiler. To
      perform multibit mapping after scan insertion, use IC Compiler.
      When you use DFT commands on a design with multibit registers, ensure the following
      variables and commands are set appropriately:
         set compile_seqmap_identify_shift_registers_with_synchronous_logic
          false
          (default: false starting from version I-2013.12-SP2)
          Leaving this variable set to false helps preserve multibit registers during DFT scan
          insertion.
         set_scan_configuration -preserve_multibit_segment false
          (default: false starting from version I-2013.12)
          You must have the value set to false for optimal scan chain balancing.
      After scan insertion, run the check_scan_def command to ensure there are no failures in
      the scan chain structural checks.
      In IC Compiler, you can perform banking or debanking after scan insertion. After registers in
      the scan chain are replaced, the tool automatically reconnects the scan chain. You must run
      the check_scan_chain command after banking or debanking to update the SCANDEF.
      For more information regarding placement-aware clock-gating, see the Power Compiler
      User Guide.
      #Improve annotation
      set hdlin_enable_upf_naming_style true
      #Initial compile
      compile_ultra -scan -gate_clock
      #Incremental compile
      compile_ultra -incremental -gate_clock
      For more information on power optimization and analysis flow using SAIF, see the Power
      Compiler User Guide.
      Splitting of a multibit register to single-bit registers generates content for the .svf file similar
      to the following:
      guide_multibit \
        -design { test } \
        -type { svfMultibitTypeSplit } \
        -groups \
        { { MBIT1_0 MBIT1_0_bank[1] MBIT1_0_bank[0] } }
      In both Design Compiler and IC Compiler, when you enable multibit optimization (in either
      the RTL inference and placement-aware multibit flows), you must generate the verification
      guidance file using the set_svf command. In Design Compiler, generate the verification
      guidance file with the set_svf command before reading the RTL. In IC Compiler, use the
      set_svf command before using the banking or debanking command. When you verify the
      design, use the .svf file generated from Design Compiler or IC Compiler.
      In the multibit register banking flow in the Design Compiler Graphical tool, if any retimed
      registers are replaced with multibit registers, you need to verify the RTL synthesis using two
      separate steps. This is because the Formality tool cannot verify both register retiming and
      multibit register banking in a single step. Figure 1-8 summarizes the flow.
Figure 1-8     Two-Pass Synthesis Verification in Formality
RTL
      set_svf compile1.svf
      compile_ultra -scan -gate_clock -retime
                                                                               Formality  verify
                                          compile1.svf                        RTL vs. design1.ddc
                        design1.ddc
      set_svf compile2.svf
      identify_register_banks ...
      source my_reg_file.tcl
insert_dft ...
compile_ultra -incremental
                                                                                Formality  verify
                                          compile2.svf
                                                                           design1.ddc vs. design2.ddc
                        design2.ddc
      For this two-pass verification process, you need to generate two .svf verification guidance
      files: one for the initial synthesis with register retiming and the other for the multibit banking
      and optimization process after retiming. Use the set_svf command as shown in the
      diagram to create the two separate .svf files.
      Using two passes for verification is required only when register retiming is performed, by any
      of the following methods:
         Using the compile_ultra command with the -retime option
         Using the compile_ultra command followed by the optimize_registers command
      In the Synopsys Physical Guidance flow, perform the following steps in Design Compiler
      Graphical:
      1. Create the input map file and the register group file as described in the section Input
         Map File and Register Group File. These files specify the manner of mapping from
         single-bit to multibit cells.
      2. Enable bus-based multibit optimization:
          dc_shell -topo> set hdlin_infer_multibit default_all
          Scan replacement is not supported after registers are mapped to multibit registers. You
          must use the -gate_clock and -scan options with the compile_ultra command before
          multibit register banking. Using the -gate_clock option during the initial compile is
          recommended to get the optimal clock-gating and multibit replacement ratios.
      6. Use the identify_register_banks command to assign the single-bit registers into
         groups according to the input map file and register group file:
          dc_shell-topo> identify_register_banks \
                          -input_map_file my_map_file.map \
                          -register_group_file my_group_file.grp \
                          -output_reg_file my_reg_file.tcl \
                          ...
          The command has options to restrict the number of registers allowed in each group and
          to exclude some cell instances from banking by name, timing slack, or register cell
          characteristics.
          The command generates a script file containing create_register_bank commands
          that perform the actual mapping of single-bit to multibit registers. You can view and
          optionally modify this script file before you execute it.
      7. Execute the script file created in the previous step:
          dc_shell-topo> source my_reg_file.tcl
          This replaces the groups of single-bit registers with multibit registers in the netlist.
          A this point, you can optionally break up multibit registers into smaller multibit registers
          or single-bit registers by using the split_register_bank command.
          After multibit register banking, you should run an incremental compile to adjust the
          register locations and sizing. This incremental compile can be done before or after you
          perform DFT scan insertion in Step 8.
          In Design Compiler, you must run scan insertion after completing all multibit
          replacement. Running scan insertion before multibit mapping is not supported.
      9. Perform an incremental compile operation:
          dc_shell-topo> compile_ultra -incremental -scan -gate_clock -spg
          This performs logic and timing optimization on the modified, now containing multibit
          registers in place of single-bit registers.
      The following script example demonstrates the Design Compiler Graphical tool in the flow.
      # Set Formality guidance file for initial compile operation
      set_svf svf1.svf
      # Initial compile
      compile_ultra scan gate_clock -spg
      write_file hierarchy format ddc output initial_compile.ddc
      # Incremental compile
      compile_ultra scan incremental gate_clock -spg
      write_scan_def output mapped.scandef
      check_scan_def
      write_file hierarchy format ddc output mapped.ddc
      The following script example demonstrates the IC Compiler tool in the flow.
      # Open Milkway design
      open_mw_cel my_design library my_mw_lib.mw
      # Continue flow
      ...
      clock_opt ...
      ...
      route_opt ...
      ...
      mapping of single-bit to multibit registers. After you execute the script, you optimize the
      modified design by running an incremental place_opt command.
      The multibit banking flow in the IC Compiler tool is shown in Figure 1-10.
Figure 1-10     Multibit Banking Flow in IC Compiler Tool
Open design
            my_mapping.map
              Input map file                             Apply logical and physical constraints
       defines mapping from 1-bit
           to multibit registers
            my_group_file.grp                  set_banking_guidance_strategy \
            Register group file                 -input_map_file my_mapping.map \
         defines grouping of 1-bit              -register_group_file my_group_file.grp \
           to multibit registers                -output_reg_file my_banking.tcl ...
              my_banking.tcl
                                                               create_placement
          Script file containing
       create_register_bank
               commands
                                                               set_svf banking.svf
                                                              source my_banking.tcl
                                                                check_scan_chain
place_opt -skip_initial_placement
                                                               split_register_bank
                                                                check_scan_chain
          The command has options to restrict the number of registers allowed in each group and
          to exclude some cell instances from banking by name, timing slack, or register cell
          characteristics.
      5. Execute the create_placement command, which not only performs placement, but also
         generates a script file containing create_register_bank commands that perform the
         mapping of single-bit to multibit registers. You can view and optionally modify this script
         file before you execute it.
      6. Enable the Formality setup guidance file:
          icc_shell> set_svf banking.svf
          This replaces the groups of single-bit registers with multibit registers in the netlist.
          A this point, you can optionally break up multibit registers into smaller multibit registers
          or single-bit registers by using the split_register_bank command.
      8. Run the check_scan_chain command to update scan chains:
          icc_shell> check_scan_chain
      10.Check the QoR. If the multibit register creates timing or congestion issues, debank
         registers, then update the scan chains:
          icc_shell> split_register_bank
          icc_shell> check_scan_chain
      Script Example
      The following script example demonstrates the placement-based multibit banking flow in the
      IC Compiler tool.
      # Open Milkway design
      open_mw_cel my_design library my_mw_lib.mw
      # Continue flow
      ...
      clock_opt ...
      ...
      route_opt ...
      ...
      set num_of_mb_bit 0
      set num_of_mb_cell 0
      foreach mb_size [lsort -unique $bit_width] {
        puts "    $mb_size-bit registers"
        set cell_name [get_attribut [get_lib_cells -f \
        "multibit_width == $mb_size && is_sequential == true" */*] name]
        foreach cell_name_unique \
        [lsort -unique [lsearch -all -inline -not $cell_name GTECH*]] {
           set num_of_mb_temp \
           [sizeof [get_flat_cells -f "ref_name == $cell_name_unique"]]
           if {$num_of_mb_temp != 0} {
               puts "      $cell_name_unique x$num_of_mb_temp"
               set num_of_mb_bit \
               [expr ($num_of_mb_temp * $mb_size) + $num_of_mb_bit]
               set num_of_mb_cell [expr ($num_of_mb_temp + $num_of_mb_cell)]
           }
        }
      }
      set num_of_ff [sizeof [all_registers -edge]]
      set num_of_sb [expr $num_of_ff - $num_of_mb_cell]
      puts " "
      puts " Total Number of registers: $num_of_ff"
      puts "      Single bit registers: $num_of_sb"
      puts "      Multibit registers: $num_of_mb_cell"
      puts " "
      Banking Ratio: 68 %
         Total bits of all registers: 7647
         Total bits of multibit registers: 5206
      The banking ratio is determined by the total bits of multibit registers divided by the total bits
      of all registers.
                                                                                                A-1
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note           Version J-2014.09-SP2
                                                                                           J-2014.09-SP2
Introduction
      For multibit optimization flow to work smoothly, the library must include the single-bit version
      of each multibit cell. For example, if you need to have the tool infer a nonscan multibit cell,
      the corresponding single-bit nonscan cell must also exist in the target libraries.
      In the Liberty-format description of a multibit register cell, the ff_bank or latch_bank group
      describes a cell that is a collection of parallel, single-bit sequential parts. Each part shares
      control signals with the other parts and performs the same function as the other parts. The
      ff_bank or latch_bank group is typically used to represent multibit registers. It can be used
      in cell and test_cell groups.
      Note:
         The only supported types of syntax inside a test_cell group are ff, latch, ff_bank,
         and latch_bank groups. It is not possible to model the functionality of a sequential
         element using the statetable Liberty syntax inside a test_cell group.
      For more information about library modeling of register cells, see the Library Compiler
      Methodology and Function Modeling User Guide, available on SolvNet:
         For the single-bit and multibit flip-flop definition syntax, see Describing a Flip-Flop and
          Describing a Multibit Flip-Flop in the chapter Defining Sequential Cells.
         For the single-bit and multibit latch definition syntax, see Describing a Latch and
          Describing a Multibit Latch, also in the chapter Defining Sequential Cells.
         For DFT scan cell syntax, see Describing a Scan Cell and Describing a Multibit Scan
          Cell, in the chapter Defining Test Cells.
          cell (cell_name) {
            ...
            ff(variable1, variable2) {
              clocked_on : "Boolean_expression" ;
              next_state : "Boolean_expression" ;
              clear : "Boolean_expression" ;
              preset : "Boolean_expression" ;
              clear_preset_var1 : value ;
              clear_preset_var2 : value ;
              clocked_on_also :"Boolean_expression";
              power_down_function : "Boolean_expression" ;
            }
          }
      }
      variable1 is the state of the noninverting output of the flip-flop. It is considered the 1-bit
      storage value of the flip-flop.
      variable2 is the state of the inverting output.
      You can name variable1 and variable2 anything except the name of a pin in the cell
      being described. Both variables are required, even if one of them is not connected to a
      primary output pin.
      In an ff group, the clocked_on and next_state attributes are required; all other attributes
      are optional.
      The syntax for a latch is similar to that of the flip-flop. For details, see Describing a Latch
      under the heading Defining Sequential Cells the Library Compiler Methodology and
      Function Modeling User Guide, available on SolvNet.
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Nonscan Register Cell Models                                                                         A-3
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note            Version J-2014.09-SP2
                                                                                            J-2014.09-SP2
      Note that either bus or bundle Liberty syntax can be used to model these multibit signal pins
      in the library.
      The syntax for a multibit latch is similar to that of the multibit flip-flop. For details, see
      Describing a Multibit Latch under the heading Defining Sequential Cells the Library
      Compiler Methodology and Function Modeling User Guide, available on SolvNet.
      To model the functionality of a multibit scan cell with parallel scan bits, use the ff_bank or
      latch_bank syntax.
      To model the functionality of a multibit scan cell with an internal serial scan chain, use the
      statetable group syntax.
      This is the general Liberty syntax for a multibit parallel scan cell:
      library(library_name) {
        
        cell (cell_name) {
          single_bit_degenerate : single_bit_scan_seq_cell_name;
          ...
          pin (pin_name) {
            ...
             }
             bus (bus_name) {
               direction : input;
               ...
             }
             bus (bus_name) {
               direction : output;
               pin(bus_name[0]) {
               input_map : "input_node_names";
               
             }
             
         }
             statetable( "input node names", "internal node names" ) {
      table : "input node values : current int. values : next int. values, \
               input node values : current int. values : next int. values" ;
             power_down_function : "Boolean expression" ;
           }
        }
      }
      Note:
         The single_bit_degenerate attribute is needed only for complex serial scan cells that
         may also have a dedicated scan output pin, and in some complex parallel multibit
         sequential cell models for automatic inference in optimization tools. For details, see the
         Library Compiler Methodology and Function Modeling User Guide.
      The following detailed examples demonstrate the multibit scan cell syntax.
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                               A-5
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note             Version J-2014.09-SP2
                                                                                             J-2014.09-SP2
      In the normal operating mode, the cell uses the input and output buses, D0-D1 and Q0-Q1,
      respectively.
      In the scan mode, the cell functions as a parallel-in, parallel-out register using the scan input
      bus, SI0-SI1 for the input scan data. For the output scan data, the cell either reuses the data
      output bus, Q0-Q1, as shown in Figure A-1, or uses a separate dedicated scan output bus,
      SO0-SO1. The scan enable signal can be a bus, SE0-SE1, where each bit of the bus
      enables a corresponding sequential element of the cell, or it can be a single-bit pin that
      enables all sequential elements of the cell, as shown in Figure A-1.
      This is the general Liberty syntax for modeling a parallel scan multibit register:
      library(library_name) {
      ...
      cell(cell_name) {
        ff_bank (variable1, variable2, bits) {
           clocked_on : "Boolean_expression" ;
           next_state : "Boolean_expression" ;
           clear : "Boolean_expression" ;
           preset : "Boolean_expression" ;
           clear_preset_var1 : value ;
           clear_preset_var2 : value ;
           clocked_on_also : "Boolean_expression" ;
        }
          bus(scan_in_pin_name) {
      /* cell scan in signal bus that has the signal_type as */
      /* "test_scan_in" inside the test_cell group           */
           ...
        }
        bus(scan_out_pin_name) {
      /* cell scan out signal bus with signal_type as */
      /* "test_scan_out" inside the test_cell group   */
           ...
        }
        bus | bundle (bus_bundle_name) {
      The following example shows the Liberty syntax for modeling a 4-bit scan cell with parallel
      scan bits and the single-bit equivalent cell. Figure A-2 shows the logic diagram for the 1-bit
      and 4-bit cells. During design optimization, the tool can map four single-bit cells to a single
      4-bit cell.
Figure A-2     4-bit Register Cell With Parallel Scan Bits
                                                           D0
                                                                           D   Q   Q0
                              4-bit scan register with    SI0
                                 parallel scan bits
                                                         SE0
                                                           D1
                                                                           D   Q   Q1
                                                          SI1
SE1
          D                                                D2
                          D     Q                                          D   Q   Q2
         SI                                               SI2
                                                         SE2
        SE
                                                           D3
        CK
                                                                           D   Q   Q3
                                                          SI3
          Single-bit scan flip-flop
                                                         SE3
CK
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                                  A-7
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note           Version J-2014.09-SP2
                                                                                           J-2014.09-SP2
      The 4-bit cell is defined by the ff_bank group and the function attribute on the bus.
      In the normal operating mode, the cell is a parallel shift register that uses the data input bus,
      D0 through D3, and the data output bus, Q0 through Q3.
      In the scan mode, the cell functions as a 1-bit shift register with parallel scan input and scan
      enable signals, and parallel reused output signals. To define the cell behavior in the scan
      mode, set the signal_type attribute to test_scan_out on the bus Q in the test_cell
      group.
         slew_lower_threshold_pct_rise                :   30.00;
         slew_upper_threshold_pct_rise                :   70.00;
         slew_lower_threshold_pct_fall                :   30.00;
         slew_upper_threshold_pct_fall                :   70.00;
         input_threshold_pct_rise                     :   50.00;
         output_threshold_pct_rise                    :   50.00;
         input_threshold_pct_fall                     :   50.00;
         output_threshold_pct_fall                    :   50.00;
         voltage_map(VDD, 1.0);
         voltage_map(VSS, 0.0);
      /* operation conditions */
        nom_process     : 1;
        nom_temperature : 25;
        nom_voltage     : 1.0;
        operating_conditions(myoc) {
             process           :   1;
             temperature       :   25;
             voltage           :   1.0;
             tree_type         :   balanced_tree
         }
         default_operating_conditions : myoc;
      cell (4-bit_parallel_scan_cell) {
        area : 4.0;
        pg_pin(VDD) {
          voltage_name : VDD;
          pg_type : primary_power;
        }
        pg_pin(VSS) {
          voltage_name : VSS;
          pg_type : primary_ground;
        }
         ff_bank (IQ,IQN,4) {
           next_state : "(D * !SE + SI * SE)";
           clocked_on : "CK";
         }
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                          A-9
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note   Version J-2014.09-SP2
                                                                                   J-2014.09-SP2
        }
        /* scan input bus pins */
        bundle(SI) {
          members (SI0, SI1, SI2, SI3);
          direction : input;
          related_power_pin : VDD;
          related_ground_pin : VSS;
          capacitance : 1.0;
          nextstate_type : scan_in;
        }
        /* data input bundle pins */
        bundle(D) {
          members (D0, D1, D2, D3);
          direction : input;
          related_power_pin : VDD;
          related_ground_pin : VSS;
          capacitance : 1.0;
          nextstate_type : data;
        }
        test_cell () {
          pin(CK){
            direction : input;
          }
          bundle(D) {
          members (D0, D1, D2, D3);
            direction : input;
          }
          bundle(SI) {
            members (SI0, SI1, SI2, SI3);
            direction : input;
            signal_type : "test_scan_in";
          }
          bundle(SE) {
            members (SE0, SE1, SE2, SE3);
            direction : input;
            signal_type : "test_scan_enable";
          }
          ff_bank (IQ,IQN,4) {
            next_state : "D";
            clocked_on : "CK";
          }
          bundle(Q) {
            members (Q0, Q1, Q2, Q3);
            direction : output;
            function : "IQ";
            signal_type : "test_scan_out";
          }
        } /* end test_cell group */
       }/* end cell group */
      }/* end library group */
Example A-2       Liberty Model of 4-Bit Parallel Scan Cell Using bus Syntax
      library (mylib_using_bus) {
        delay_model                                   : table_lookup;
        time_unit                                     : "1ns";
        current_unit                                  : "1mA";
        voltage_unit                                  : "1V";
        capacitive_load_unit                           (1,pf);
        pulling_resistance_unit                       : "1kohm";
        default_fanout_load                           : 1.0;
        default_output_pin_cap                        : 0.00;
        default_inout_pin_cap                         : 0.00;
        default_input_pin_cap                         : 0.01;
        leakage_power_unit                            : "1nW";
        default_cell_leakage_power                    : 0.00;
        default_leakage_power_density                 : 0.00;
         slew_lower_threshold_pct_rise                :   30.00;
         slew_upper_threshold_pct_rise                :   70.00;
         slew_lower_threshold_pct_fall                :   30.00;
         slew_upper_threshold_pct_fall                :   70.00;
         input_threshold_pct_rise                     :   50.00;
         output_threshold_pct_rise                    :   50.00;
         input_threshold_pct_fall                     :   50.00;
         output_threshold_pct_fall                    :   50.00;
         voltage_map(VDD, 1.0);
         voltage_map(VSS, 0.0);
      /* operation conditions */
        nom_process     : 1;
        nom_temperature : 25;
        nom_voltage     : 1.0;
        operating_conditions(myoc) {
          process     : 1;
          temperature : 25;
          voltage     : 1.0;
          tree_type   : balanced_tree
        }
        default_operating_conditions : myoc;
         type(bus4){
           base_type : array;
           bit_from : 0;
           bit_to : 3;
           bit_width : 4;
           data_type : bit;
           downto : false;
         }
      cell (4-bit_parallel_scan_cell) {
        area : 4.0;
        pg_pin(VDD) {
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                               A-11
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note   Version J-2014.09-SP2
                                                                                   J-2014.09-SP2
            voltage_name : VDD;
            pg_type : primary_power;
         }
         pg_pin(VSS) {
           voltage_name : VSS;
           pg_type : primary_ground;
         }
         ff_bank (IQ,IQN,4) {
           next_state : "(D * !SE + SI * SE)";
           clocked_on : "CK";
         }
         /* functional output bus pins */
         bus(Q) {
           bus_type : bus4;
           direction : output;
           function : IQ;
           related_power_pin : VDD;
           related_ground_pin : VSS;
           timing() {
             related_pin : "CK" ;
             timing_type : rising_edge ;
             cell_fall (scalar) { values("0.0000"); }
             cell_rise (scalar) { values("0.0000"); }
             fall_transition (scalar) { values("0.0000"); }
             rise_transition (scalar) { values("0.0000"); }
           }
         }
         pin(CK) {
           direction : input;
           related_power_pin : VDD;
           related_ground_pin : VSS;
           capacitance : 1.0;
         }
         /* scan enable bus pins */
         bus(SE) {
           bus_type : bus4;
           direction : input;
           related_power_pin : VDD;
           related_ground_pin : VSS;
           capacitance : 1.0;
           nextstate_type : scan_enable;
         }
         /* scan input bus pins */
         bus(SI) {
           bus_type : bus4;
           direction : input;
           related_power_pin : VDD;
           related_ground_pin : VSS;
           capacitance : 1.0;
           nextstate_type : scan_in;
         }
         /* data input bus pins */
        bus(D) {
          bus_type : bus4;
          direction : input;
          related_power_pin : VDD;
          related_ground_pin : VSS;
          capacitance : 1.0;
          nextstate_type : data;
        }
        test_cell () {
          pin(CK){
            direction : input;
          }
          bus(D) {
            bus_type : bus4;
            direction : input;
          }
          bus(SI) {
            bus_type : bus4;
            direction : input;
            signal_type : "test_scan_in";
          }
          bus(SE) {
            bus_type : bus4;
            direction : input;
            signal_type : "test_scan_enable";
          }
          ff_bank (IQ,IQN,4) {
            next_state : "D";
            clocked_on : "CK";
          }
          bus(Q) {
            bus_type : bus4 ;
            direction : output;
            function : "IQ";
            signal_type : "test_scan_out";
          }
        } /* end test_cell group */
       }/* end cell group */
      }/* end library group */
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                              A-13
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note           Version J-2014.09-SP2
                                                                                           J-2014.09-SP2
      In the normal operating mode, the cell uses the input and output buses, D0-D1 and Q0-Q1,
      respectively. In the scan mode, the cell functions as a serial shift register from the scan input
      (SI) pin to the scan output pin, which can reuse the last Q (Q1) output as in this example, or
      can use a dedicated scan output pin. The scan chain is stitched using the data output Q of
      each sequential element of the cell.
      This is the general Liberty syntax for a multibit flip-flop with an internal serial scan chain:
      library(library_name) {
        ...
        cell(cell_name) {
            single_bit_degenerate: cell_name;
            pin(scan_in_pin_name) {
            /* cell scan in with signal_type "test_scan_in" from test_cell */
                    ...
          }
          pin(scan_out_pin_name) {
        /* cell scan out with signal_type "test_scan_out" from test_cell */
                  ...
          }
          bus | bundle (bus_bundle_name) {
             direction : inout | output;
             scan_start_pin : pin_name;
             scan_pin_inverted : true | false;
        }
        test_cell() {
                 pin(scan_in_pin_name) {
                 signal_type : test_scan_in;
                 ...
               }
                  pin(scan_out_pin_name) {
                     signal_type : test_scan_out | test_scan_out_inverted;
                     ...
                  }
               ...
        }
      }
      The single_bit_degenerate attribute associates a black-box multibit cell with the name of
      the corresponding single-bit cell. For a multibit scan cell that has an internal scan chain and
      a dedicated scan output pin, the single_bit_degenerate attribute must be specified with
      the scan_start_pin attribute.
      scan_start_pin
      The scan_start_pin attribute specifies where the internal scan chain begins. This attribute
      is necessary when the multibit scan cell has a single dedicated scan output pin.
      The tool supports only the following types of scan chains: from the least significant bit (LSB)
      to the most significant bit (MSB) of the output bus or bundle group; or from the MSB to the
      LSB of the output bus or bundle group. Therefore, for a multibit scan cell with an internal
      scan chain, the value of the scan_start_pin attribute can either be the LSB or MSB output
      pin.
      Specify the scan_start_pin attribute in the bus or bundle group. You cannot specify this
      attribute in the pin group, even for pin definitions of the bus or bundle group.
      scan_pin_inverted
      The optional scan_pin_inverted attribute specifies that the scan signal is inverted after the
      first sequential element of the multibit scan cell. The valid values are true and false. The
      default is false. If you specify true, the signal_type attribute must be set to
      test_scan_out_inverted.
      If you specify the scan_pin_inverted attribute, you must specify the scan_start_pin
      attribute in the same bus or bundle group. You cannot specify this attribute in the pin group,
      even for pin definitions in the bus or bundle group.
      For the cell in Figure A-3, the Library Compiler tool identifies the pins in the internal scan
      chain based on the values of the scan_start_pin and scan_pin_inverted attributes and
      performs the scan only in forward or reverse sequential order, such a 0-1-2-3 or 3-2-1-0. A
      random shift order such as 2-0-3-1 is not supported. The scan data can shift out through
      either the inverting or noninverting output pin.
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                               A-15
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note             Version J-2014.09-SP2
                                                                                             J-2014.09-SP2
                                                             SI
                                                                            D   Q        Q0
                                      4-bit register with    D0
                                     internal scan chain
                                                                       SE
                                                                            D   Q        Q1
                                                             D1
                                                                       SE
          D
                         D     Q           Q                                D   Q        Q2
         SI                                                  D2
        CK                                                             SE
        SE                                SO                                D   Q        Q3
                                                             D3
      Degenerate single-bit scan flip-flop
          with dedicated scan output                        CK
                                                            SE                           SO
      The 4-bit cell has the output bus Q0-Q3 and a single scan output pin with combinational
      logic. The cell is defined using the statetable group and the state_function attribute on
      the serial output pin, SO.
      In the normal operating mode, the cell is a shift register that uses the output bus Q[0:3].
      In scan mode, the cell functions as a shift register with the single-bit output pin SO. To define
      the scan mode for the cell, set the signal_type attribute as test_scan_out on the pin SO
      in the test_cell group. Do not define the function attribute of this pin.
      When the multibit cell has a dedicated single-pin scan output, the corresponding single-bit
      cell definition must exist in the same .lib library file because the single-bit cell is specified as
      the single_bit_degenerate cell of the multibit cell, and the Library Compiler tool requires
      this cell to be in the same library.
      Example A-3 and Example A-4 show the Liberty description of a 4-bit cell with an internal
      scan chain and a single dedicated scan output, using the bus and bundle syntax,
      respectively. These cell description examples are complete and working; they can be copied
      into a .lib file and compiled by the Library Compiler tool without modification.
Example A-3       Liberty Model of 4-Bit Internal Serial Scan Cell Using bus Syntax
      library (test_bus) {
        delay_model                                   : table_lookup;
        time_unit                                     : "1ns";
        current_unit                                  : "1mA";
        voltage_unit                                  : "1V";
        capacitive_load_unit                           (1,pf);
        pulling_resistance_unit                       : "1kohm";
        default_fanout_load                           : 1.0;
        default_output_pin_cap                        : 0.00;
        default_inout_pin_cap                         : 0.00;
        default_input_pin_cap                         : 0.01;
        slew_lower_threshold_pct_rise                 : 30.00;
        slew_upper_threshold_pct_rise                 : 70.00;
        slew_lower_threshold_pct_fall                 : 30.00;
        slew_upper_threshold_pct_fall                 : 70.00;
        input_threshold_pct_rise                      : 50.00;
        output_threshold_pct_rise                     : 50.00;
        input_threshold_pct_fall                      : 50.00;
        output_threshold_pct_fall                     : 50.00;
        leakage_power_unit                            : "1nW";
        default_cell_leakage_power                    : 0.00;
        default_leakage_power_density                 : 0.00;
         voltage_map(VDD, 1.0);
         voltage_map(VSS, 0.0);
      /* operation conditions */
        nom_process       : 1;
        nom_temperature : 25;
        nom_voltage       : 1.0;
        operating_conditions(typical) {
           process      : 1;
           temperature : 25;
           voltage      : 1.0;
           tree_type    : balanced_tree
        }
        default_operating_conditions : typical;
        type(bus4){
          base_type : array;
          bit_from : 0;
          bit_to : 3;
          bit_width : 4;
          data_type : bit;
          downto : false;
        }
      /* Single-bit Scan DFF with gated_scanout */
        cell(SDFF_SO) {
           area : 1.0;
           pg_pin(VDD) {
             voltage_name : VDD;
             pg_type : primary_power;
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                              A-17
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note       Version J-2014.09-SP2
                                                                                       J-2014.09-SP2
            }
            pg_pin(VSS) {
              voltage_name : VSS;
              pg_type : primary_ground;
            }
            ff("IQ", "IQN") {
              next_state : "D * !SE + SI * SE" ;
              clocked_on : "CK" ;
            }
            pin(Q) {
              direction : output ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              function : "IQ" ;
              timing() {
                related_pin : "CK" ;
                timing_type : rising_edge ;
                cell_fall (scalar) { values("0.0000"); }
                cell_rise (scalar) { values("0.0000"); }
                fall_transition (scalar) { values("0.0000");               }
                rise_transition (scalar) { values("0.0000");               }
              }
            }
            pin(SO) {
              direction : output ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              function : "SE * IQ" ;
              timing() {
                related_pin : "CK" ;
                timing_type : rising_edge ;
                cell_fall (scalar) { values("0.0000"); }
                cell_rise (scalar) { values("0.0000"); }
                fall_transition (scalar) { values("0.0000");               }
                rise_transition (scalar) { values("0.0000");               }
              }
            }
            pin(D) {
              direction : input ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              capacitance : 0.1;
              nextstate_type : data;
              timing(){
                timing_type : setup_rising;
                fall_constraint (scalar) { values("0.0000");               }
                rise_constraint (scalar) { values("0.0000");               }
                related_pin : "CK" ;
              }
              timing(){
                timing_type : hold_rising;
                fall_constraint (scalar) { values("0.0000");               }
                rise_constraint (scalar) { values("0.0000");               }
                    related_pin : "CK" ;
                }
             }
             pin(SI) {
               direction : input ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               capacitance : 0.1;
               nextstate_type : scan_in;
               timing(){
                 timing_type : setup_rising;
                 fall_constraint (scalar) { values("0.0000");              }
                 rise_constraint (scalar) { values("0.0000");              }
                 related_pin : "CK" ;
               }
               timing(){
                 timing_type : hold_rising;
                 fall_constraint (scalar) { values("0.0000");              }
                 rise_constraint (scalar) { values("0.0000");              }
                 related_pin : "CK" ;
               }
             }
             pin(SE) {
               direction : input ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               capacitance : 0.1;
               nextstate_type : scan_enable;
               timing(){
                 timing_type : setup_rising;
                 fall_constraint (scalar) { values("0.0000");              }
                 rise_constraint (scalar) { values("0.0000");              }
                 related_pin : "CK" ;
               }
               timing(){
                 timing_type : hold_rising;
                 fall_constraint (scalar) { values("0.0000");              }
                 rise_constraint (scalar) { values("0.0000");              }
                 related_pin : "CK" ;
               }
             }
             pin(CK) {
               direction : input ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               capacitance : 0.1;
             }
             test_cell() {
               pin(CK){
                 direction : input;
               }
               pin(D) {
                 direction : input;
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                             A-19
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note   Version J-2014.09-SP2
                                                                                   J-2014.09-SP2
                 }
                 pin(SI) {
                   direction : input;
                   signal_type : "test_scan_in";
                 }
                 pin(SE) {
                   direction : input;
                   signal_type : "test_scan_enable";
                 }
                 ff(IQ,IQN) {
                   next_state : "D";
                   clocked_on : "CK";
                 }
                 pin(Q) {
                   direction : output;
                   function : "IQ";
                 }
                 pin(SO) {
                   direction : output;
                   signal_type : "test_scan_out";
                   test_output_only : "true";
                 }
             }
         }
      /* 4-bit Scan DFF and gated_scanout */
        cell(SDFF4_SO) {
          area   : 4.0;
      /* The single_bit_degenerate attribute will help in inferring */
      /* a multibit flip-flop for a single-bit flop */
          single_bit_degenerate : SDFF_SO;
             pg_pin(VDD) {
               voltage_name : VDD;
               pg_type : primary_power;
             }
             pg_pin(VSS) {
               voltage_name : VSS;
               pg_type : primary_ground;
             }
             pin(CK) {
               clock               : true;
               direction           : input;
               capacitance         : 1.0    ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
             }
             bus(D) {
               bus_type : bus4;
               direction           : input;
               capacitance         : 1.0 ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               pin(D[0]) {
                   timing() {
                     related_pin        : "CK";
                     timing_type        : "hold_rising";
                     fall_constraint(scalar) { values("0.0");              }
                     rise_constraint(scalar) { values("0.0");              }
                   }
                   timing() {
                     related_pin        : "CK";
                     timing_type        : "setup_rising";
                     fall_constraint(scalar) { values("0.0");              }
                     rise_constraint(scalar) { values("0.0");              }
                   }
                }
                pin(D[1]) {
                  timing() {
                  related_pin        : "CK";
                  timing_type        : "hold_rising";
                  fall_constraint(scalar) { values("0.1"); }
                  rise_constraint(scalar) { values("0.1"); }
                }
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "setup_rising";
                    fall_constraint(scalar) { values("0.1");               }
                    rise_constraint(scalar) { values("0.1");               }
                  }
                }
                pin(D[2]) {
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "hold_rising";
                    fall_constraint(scalar) { values("0.0");               }
                    rise_constraint(scalar) { values("0.0");               }
                  }
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "setup_rising";
                    fall_constraint(scalar) { values("0.0");               }
                    rise_constraint(scalar) { values("0.0");               }
                  }
                }
                pin(D[3]) {
                  timing() {
                  related_pin        : "CK";
                  timing_type        : "hold_rising";
                  fall_constraint(scalar) { values("0.1"); }
                  rise_constraint(scalar) { values("0.1"); }
                }
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "setup_rising";
                    fall_constraint(scalar) { values("0.1");               }
                    rise_constraint(scalar) { values("0.1");               }
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                             A-21
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note   Version J-2014.09-SP2
                                                                                   J-2014.09-SP2
                   }
               }
            }
            pin(SE) {
              direction           : input;
              capacitance         : 1.0 ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              timing() {
                related_pin         : "CK";
                timing_type         : "hold_rising";
                fall_constraint(scalar) { values("0.0"); }
                rise_constraint(scalar) { values("0.0"); }
              }
              timing() {
                related_pin         : "CK";
                timing_type         : "setup_rising";
                fall_constraint(scalar) { values("0.0"); }
                rise_constraint(scalar) { values("0.0"); }
              }
            }
            pin(SI) {
              direction           : input;
              capacitance         : 1.0 ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              timing() {
                related_pin         : "CK";
                timing_type         : "hold_rising";
                fall_constraint(scalar) { values("0.0"); }
                rise_constraint(scalar) { values("0.0"); }
              }
              timing() {
                related_pin         : "CK";
                timing_type         : "setup_rising";
                fall_constraint(scalar) { values("0.0"); }
               rise_constraint(scalar) { values("0.0"); }
              }
            }
            statetable ( " D CK SE SI " ,        "Q" ) {
              table :     " - ~R    -    - : - : N,    \
                           H/L R    L    - : - : H/L, \
                            -   R   H H/L : - : H/L" ;
            }
            bus(Q) {
              bus_type : bus4;
              direction        : output;
              inverted_output     : false;
              internal_node : "Q" ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              scan_start_pin : Q[0];
              pin (Q[0]) {
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                             A-23
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note          Version J-2014.09-SP2
                                                                                          J-2014.09-SP2
                    cell_fall(scalar) { values("0.0"); }
                    fall_transition(scalar) { values("0.0"); }
                    cell_rise(scalar) { values("0.0"); }
                    rise_transition(scalar) { values("0.0"); }
                }
            }
          test_cell() {
            pin(CK){
              direction : input;
            }
            bus(D) {
              bus_type : bus4;
              direction : input;
            }
            pin(SI) {
              direction : input;
              signal_type : "test_scan_in";
            }
            pin(SE) {
              direction : input;
              signal_type : "test_scan_enable";
            }
            ff_bank (IQ,IQN,4) {
              next_state : "D";
              clocked_on : "CK";
            }
            bus(Q) {
              bus_type : bus4;
              direction : output;
              function : "IQ";
            }
            pin(SO) {
              direction : output;
              signal_type : "test_scan_out";
              test_output_only : "true";
            }
          }
        } /* end cell group */
      } /* end library group */
Example A-4         Liberty Model of 4-Bit Internal Serial Scan Cell Using bundle Syntax
      library (test_bundle) {
        delay_model                                   : table_lookup;
        time_unit                                     : "1ns";
        current_unit                                  : "1mA";
        voltage_unit                                  : "1V";
        capacitive_load_unit                           (1,pf);
        pulling_resistance_unit                       : "1kohm";
        default_fanout_load                           : 1.0;
         default_output_pin_cap                       :   0.00;
         default_inout_pin_cap                        :   0.00;
         default_input_pin_cap                        :   0.01;
         slew_lower_threshold_pct_rise                :   30.00;
         slew_upper_threshold_pct_rise                :   70.00;
         slew_lower_threshold_pct_fall                :   30.00;
         slew_upper_threshold_pct_fall                :   70.00;
         input_threshold_pct_rise                     :   50.00;
         output_threshold_pct_rise                    :   50.00;
         input_threshold_pct_fall                     :   50.00;
         output_threshold_pct_fall                    :   50.00;
         leakage_power_unit                           :   "1nW";
         default_cell_leakage_power                   :   0.00;
         default_leakage_power_density                :   0.00;
         voltage_map(VDD, 1.0);
         voltage_map(VSS, 0.0);
      /* operation conditions */
        nom_process     : 1;
        nom_temperature : 25;
        nom_voltage     : 1.0;
        operating_conditions(typical) {
          process     : 1;
          temperature : 25;
          voltage     : 1.0;
          tree_type   : balanced_tree
        }
        default_operating_conditions : typical;
             pg_pin(VDD) {
               voltage_name : VDD;
               pg_type : primary_power;
             }
             pg_pin(VSS) {
               voltage_name : VSS;
               pg_type : primary_ground;
             }
             ff("IQ", "IQN") {
               next_state : "D * !SE + SI * SE" ;
               clocked_on : "CK" ;
             }
             pin(Q) {
               direction : output ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               function : "IQ" ;
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                         A-25
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note       Version J-2014.09-SP2
                                                                                       J-2014.09-SP2
               timing() {
                 related_pin : "CK" ;
                 timing_type : rising_edge ;
                 cell_fall (scalar) { values("0.0000"); }
                 cell_rise (scalar) { values("0.0000"); }
                 fall_transition (scalar) { values("0.0000"); }
                 rise_transition (scalar) { values("0.0000"); }
               }
            }
            pin(SO) {
              direction : output ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              function : "SE * IQ" ;
              timing() {
                related_pin : "CK" ;
                timing_type : rising_edge ;
                cell_fall (scalar) { values("0.0000"); }
                cell_rise (scalar) { values("0.0000"); }
                fall_transition (scalar) { values("0.0000");               }
                rise_transition (scalar) { values("0.0000");               }
              }
            }
            pin(D) {
              direction : input ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              capacitance : 0.1;
              nextstate_type : data;
              timing(){
                timing_type : setup_rising;
                fall_constraint (scalar) { values("0.0000");               }
                rise_constraint (scalar) { values("0.0000");               }
                related_pin : "CK" ;
              }
              timing(){
                timing_type : hold_rising;
                fall_constraint (scalar) { values("0.0000");               }
                rise_constraint (scalar) { values("0.0000");               }
                related_pin : "CK" ;
              }
            }
            pin(SI) {
              direction : input ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              capacitance : 0.1;
              nextstate_type : scan_in;
              timing(){
                timing_type : setup_rising;
                fall_constraint (scalar) { values("0.0000");               }
                rise_constraint (scalar) { values("0.0000");               }
                related_pin : "CK" ;
                }
                timing(){
                  timing_type : hold_rising;
                  fall_constraint (scalar) { values("0.0000"); }
                  rise_constraint (scalar) { values("0.0000"); }
                  related_pin : "CK" ;
                }
             }
             pin(SE) {
               direction : input ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               capacitance : 0.1;
               nextstate_type : scan_enable;
               timing(){
                 timing_type : setup_rising;
                 fall_constraint (scalar) { values("0.0000");              }
                 rise_constraint (scalar) { values("0.0000");              }
                 related_pin : "CK" ;
               }
               timing(){
                 timing_type : hold_rising;
                 fall_constraint (scalar) { values("0.0000");              }
                 rise_constraint (scalar) { values("0.0000");              }
                 related_pin : "CK" ;
               }
             }
             pin(CK) {
               direction : input ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               capacitance : 0.1;
             }
             test_cell() {
               pin(CK){
                 direction : input;
               }
               pin(D) {
                 direction : input;
               }
               pin(SI) {
                 direction : input;
                 signal_type : "test_scan_in";
               }
               pin(SE) {
                 direction : input;
                 signal_type : "test_scan_enable";
               }
               ff(IQ,IQN) {
                 next_state : "D";
                 clocked_on : "CK";
               }
               pin(Q) {
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                             A-27
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note       Version J-2014.09-SP2
                                                                                       J-2014.09-SP2
                  direction : output;
                  function : "IQ";
                 }
                 pin(SO) {
                   direction : output;
                   signal_type : "test_scan_out";
                   test_output_only : "true";
                 }
             }
         }
      /* 4-bit Scan DFF and gated_scanout */
        cell(SDFF4_SO) {
          area   : 2.0;
      /* The single_bit_degenerate attribute will help in inferring */
      /* a multibit flip-flop for a single-bit flop */
          single_bit_degenerate : SDFF_SO;
             pg_pin(VDD) {
               voltage_name : VDD;
               pg_type : primary_power;
             }
             pg_pin(VSS) {
               voltage_name : VSS;
               pg_type : primary_ground;
             }
             pin(CK) {
               clock                       :   true;
               direction                   :   input;
               capacitance                 :    1.0   ;
               related_power_pin           :   VDD;
               related_ground_pin          :   VSS;
             }
             bundle(D) {
               members(D0, D1, D2, D3);
               direction          : input;
               capacitance        : 1.0 ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               pin(D0) {
                 timing() {
                   related_pin        : "CK";
                   timing_type        : "hold_rising";
                   fall_constraint(scalar) { values("0.0");                }
                   rise_constraint(scalar) { values("0.0");                }
                 }
                 timing() {
                   related_pin        : "CK";
                   timing_type        : "setup_rising";
                   fall_constraint(scalar) { values("0.0");                }
                   rise_constraint(scalar) { values("0.0");                }
                 }
                 }
                 pin(D1) {
                   timing() {
                   related_pin        : "CK";
                   timing_type        : "hold_rising";
                   fall_constraint(scalar) { values("0.1"); }
                   rise_constraint(scalar) { values("0.1"); }
                 }
                   timing() {
                     related_pin        : "CK";
                     timing_type        : "setup_rising";
                     fall_constraint(scalar) { values("0.1");              }
                     rise_constraint(scalar) { values("0.1");              }
                   }
                 }
                 pin(D2) {
                   timing() {
                     related_pin        : "CK";
                     timing_type        : "hold_rising";
                     fall_constraint(scalar) { values("0.0");              }
                     rise_constraint(scalar) { values("0.0");              }
                   }
                   timing() {
                     related_pin        : "CK";
                     timing_type        : "setup_rising";
                     fall_constraint(scalar) { values("0.0");              }
                     rise_constraint(scalar) { values("0.0");              }
                   }
                 }
                 pin(D3) {
                   timing() {
                   related_pin        : "CK";
                   timing_type        : "hold_rising";
                   fall_constraint(scalar) { values("0.1"); }
                   rise_constraint(scalar) { values("0.1"); }
                 }
                   timing() {
                     related_pin        : "CK";
                     timing_type        : "setup_rising";
                     fall_constraint(scalar) { values("0.1");              }
                     rise_constraint(scalar) { values("0.1");              }
                   }
                 }
             }
             pin(SE) {
               direction                   : input;
               capacitance                 : 1.0 ;
               related_power_pin           : VDD;
               related_ground_pin          : VSS;
               timing() {
                 related_pin                  : "CK";
                 timing_type                  : "hold_rising";
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                             A-29
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note   Version J-2014.09-SP2
                                                                                   J-2014.09-SP2
                  fall_constraint(scalar) { values("0.0"); }
                  rise_constraint(scalar) { values("0.0"); }
                }
                timing() {
                  related_pin        : "CK";
                  timing_type        : "setup_rising";
                  fall_constraint(scalar) { values("0.0"); }
                  rise_constraint(scalar) { values("0.0"); }
                }
            }
            pin(SI) {
              direction          : input;
              capacitance        : 1.0 ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
              timing() {
                related_pin        : "CK";
                timing_type        : "hold_rising";
                fall_constraint(scalar) { values("0.0"); }
                rise_constraint(scalar) { values("0.0"); }
              }
              timing() {
                related_pin        : "CK";
                timing_type        : "setup_rising";
                fall_constraint(scalar) { values("0.0"); }
               rise_constraint(scalar) { values("0.0"); }
              }
            }
            statetable ( " D CK SE SI " ,       "Q" ) {
              table :     " - ~R   -    - : - : N,    \
                           H/L R   L    - : - : H/L, \
                            -  R   H H/L : - : H/L" ;
            }
            bundle(Q) {
              members(Q0, Q1, Q2, Q3)
              direction       : output;
              inverted_output    : false;
              internal_node : "Q" ;
              related_power_pin : VDD;
              related_ground_pin : VSS;
scan_start_pin : Q0;
                pin (Q0) {
                  input_map : " D0 CK SE SI";
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "rising_edge";
                    cell_fall(scalar) { values("0.0"); }
                    fall_transition(scalar) { values("0.0"); }
                    cell_rise(scalar) { values("0.0"); }
                       rise_transition(scalar) { values("0.0"); }
                   }
                }
                pin (Q1) {
                  input_map : " D1 CK SE Q0";
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "rising_edge";
                    cell_fall(scalar) { values("0.0"); }
                    fall_transition(scalar) { values("0.0");               }
                    cell_rise(scalar) { values("0.0"); }
                    rise_transition(scalar) { values("0.0");               }
                  }
                }
                pin (Q2) {
                  input_map : " D2 CK SE Q1";
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "rising_edge";
                    cell_fall(scalar) { values("0.0"); }
                    fall_transition(scalar) { values("0.0");               }
                    cell_rise(scalar) { values("0.0"); }
                    rise_transition(scalar) { values("0.0");               }
                  }
                }
                pin (Q3) {
                  input_map : " D3 CK SE Q2";
                  timing() {
                    related_pin        : "CK";
                    timing_type        : "rising_edge";
                    cell_fall(scalar) { values("0.0"); }
                    fall_transition(scalar) { values("0.0");               }
                    cell_rise(scalar) { values("0.0"); }
                    rise_transition(scalar) { values("0.0");               }
                  }
                }
             }
             pin(SO) {
               direction       : output;
               state_function : "SE * Q1" ;
               related_power_pin : VDD;
               related_ground_pin : VSS;
               test_output_only : true;
               timing() {
                 related_pin        : "CK";
                 timing_type        : "rising_edge";
                 cell_fall(scalar) { values("0.0"); }
                 fall_transition(scalar) { values("0.0"); }
                 cell_rise(scalar) { values("0.0"); }
                 rise_transition(scalar) { values("0.0"); }
               }
             }
AppendixA:A:Multibit
Chapter      MultibitCell
                      CellModeling
                           Modeling
Multibit Scan Register Cell Models                                                             A-31
Multibit
Multibit Register
         Register Synthesis
                  Synthesis and
                            and Physical
                                Physical Implementation Application Note
                                         Implementation Application Note   Version J-2014.09-SP2
                                                                                   J-2014.09-SP2
          test_cell() {
            pin(CK){
              direction : input;
            }
            bundle(D) {
              members(D0, D1, D2, D3);
              direction : input;
            }
            pin(SI) {
              direction : input;
              signal_type : "test_scan_in";
            }
            pin(SE) {
              direction : input;
              signal_type : "test_scan_enable";
            }
            ff_bank (IQ,IQN,4) {
              next_state : "D";
              clocked_on : "CK";
            }
            bundle(Q) {
              members(Q0, Q1, Q2, Q3);
              direction : output;
              function : "IQ";
            }
            pin(SO) {
              direction : output;
              signal_type : "test_scan_out";
              test_output_only : "true";
            }
          }
        } /* end cell group */
      } /* end library group */