• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Digital Implementation
  3. write_sdf vs delay_cal in Encounter

Stats

  • Locked Locked
  • Replies 0
  • Subscribers 92
  • Views 13803
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

write_sdf vs delay_cal in Encounter

siddhu8856
siddhu8856 over 10 years ago

Hello

I am facing an issue with the encounter system for generating SDF. I have a fully placed and routed design which is LVS clean using the tool Virtuoso Layout Editor. It is a custom design with few gates (<2k) and with a couple of 'analog' delay blocks(not included in the standard digital library) to control the overall timing.  The goal is to generate an SDF and verify timing in an AMS simulation
I have also generated the verilog , liberty and .lef for the analog delay blocks to treat them as digital black boxes.

Coming to the actual question, I imported the full layout into Encounter and performed RC extraction. I used the write_sdf - -edges check_edge command to get the post layout sdf. I don't see any information of the combinational cells and the IOPATH delays associated in the SDF generated.  A smaller test case was used for generating the sdf's given below .

Below is the write_sdf command's output:

(DELAYFILE
  (SDFVERSION "3.0")
  (DESIGN "test_cell_sid_copy")
  (DATE "Mon Aug 17 17:06:46 2015")
  (VENDOR "Cadence Design Systems, Inc.")
  (PROGRAM "Encounter")
  (VERSION "v14.25-s034_1 ((64bit) 05/28/2015 13:06 (Linux 2.6.18-194.el5))")
  (DIVIDER /)
  (VOLTAGE 5.000000::5.000000)
  (PROCESS "1.000000::1.000000")
  (TEMPERATURE 25.000000::25.000000)
  (TIMESCALE 1.0 ns)

  (CELL
    (CELLTYPE  "test_cell_sid_copy")
    (INSTANCE)
      (DELAY
    (ABSOLUTE
    (INTERCONNECT pbias \|I16/pbiasv  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT clk \|I16/i  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I0/Q \|I2/CK  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I0/Q \|I14/A  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I0/Q clock_by_4  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|q1_dff/Q \|I0/CK  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|q1_dff/Q \|I13/A  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|q1_dff/Q clock_by_2  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I2/Q \|I6/C  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I2/Q clock_by_8  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT reset \|I12/A  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|q1_dff/QN \|q1_dff/D  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I12/Q \|q1_dff/RN  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I12/Q \|I0/RN  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I12/Q \|I2/RN  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I0/QN \|I0/D  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I2/QN \|I2/D  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I13/Q \|I6/A  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I6/Q \|I12/B  (0.000::0.000) (0.000::0.000))
    (INTERCONNECT \|I14/Q \|I6/B  (0.000::0.000) (0.000::0.000))
    )
      )
  )

  (CELL
    (CELLTYPE  "dffprx1_b")
    (INSTANCE  \|q1_dff)
      (TIMINGCHECK
    (WIDTH (negedge RN) (0.501::0.501))
    (WIDTH (COND ENABLE0_RN===1'b1 (posedge CK)) (0.248::0.248))
    (WIDTH (COND ENABLE0_RN===1'b1 (negedge CK)) (0.312::0.312))
    (SETUPHOLD (posedge D) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.116::0.116) (-0.093::-0.093))
    (SETUPHOLD (negedge D) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.144::0.144) (-0.020::-0.020))
    (RECREM (posedge RN) (COND ENABLE2_D===1'b1 (posedge CK)) (0.006::0.006) (0.093::0.093))
      )
  )

  (CELL
    (CELLTYPE  "dffprx1_b")
    (INSTANCE  \|I0)
      (TIMINGCHECK
    (WIDTH (negedge RN) (0.501::0.501))
    (WIDTH (COND ENABLE0_RN===1'b1 (posedge CK)) (0.248::0.248))
    (WIDTH (COND ENABLE0_RN===1'b1 (negedge CK)) (0.313::0.313))
    (SETUPHOLD (posedge D) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.115::0.115) (-0.092::-0.092))
    (SETUPHOLD (negedge D) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.143::0.143) (-0.019::-0.019))
    (RECREM (posedge RN) (COND ENABLE2_D===1'b1 (posedge CK)) (0.005::0.005) (0.094::0.094))
      )
  )

  (CELL
    (CELLTYPE  "dffprx1_b")
    (INSTANCE  \|I2)
      (TIMINGCHECK
    (WIDTH (negedge RN) (0.501::0.501))
    (WIDTH (COND ENABLE0_RN===1'b1 (posedge CK)) (0.248::0.248))
    (WIDTH (COND ENABLE0_RN===1'b1 (negedge CK)) (0.313::0.313))
    (SETUPHOLD (posedge D) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.115::0.115) (-0.092::-0.092))
    (SETUPHOLD (negedge D) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.143::0.143) (-0.019::-0.019))
    (RECREM (posedge RN) (COND ENABLE2_D===1'b1 (posedge CK)) (0.005::0.005) (0.094::0.094))
      )
  )
)

When I used a command delayCal which is outdated according to encounter 14.2, I get the SDF file as

(DELAYFILE
  (SDFVERSION  "OVI 3.0")
  (DESIGN      "test_cell_sid_copy")
  (DATE        "Mon Aug 10 16:16:02 2015")
  (VENDOR      "Silicon Perspective, A Cadence Company")
  (PROGRAM     "First Encounter Delay Calculator")
  (VERSION     "V1.0")
  (DIVIDER      /)
  (VOLTAGE      5:5:5)
  (TIMESCALE    1ns)

(CELL
  (CELLTYPE "test_cell_sid_copy")
  (INSTANCE )
  (DELAY
    (ABSOLUTE
      (INTERCONNECT pbias I16/pbiasv (0:0:0) (0:0:0))
      (INTERCONNECT clk I16/i (0:0:0) (0:0:0))
      (INTERCONNECT reset I12/A (0:0:0) (0:0:0))
      (INTERCONNECT I16/o \q1_dff/CK () ())
      (INTERCONNECT I14/Q I6/B (0:0:0) (0:0:0))
      (INTERCONNECT I2/QN I2/D (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT I2/Q I6/C (0:0:0) (0:0:0))
      (INTERCONNECT I2/Q clock_by_8 (0:0:0) (0:0:0))
      (INTERCONNECT \q1_dff/QN \q1_dff/D (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT \q1_dff/Q I0/CK (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT \q1_dff/Q I13/A (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT \q1_dff/Q clock_by_2 (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT I13/Q I6/A (0:0:0) (0:0:0))
      (INTERCONNECT I6/Q I12/B (0:0:0) (0:0:0))
      (INTERCONNECT I12/Q \q1_dff/RN (0.0002:0.0002:0.0002) (0.0002:0.0002:0.0002))
      (INTERCONNECT I12/Q I0/RN (0.0002:0.0002:0.0002) (0.0002:0.0002:0.0002))
      (INTERCONNECT I12/Q I2/RN (0.0002:0.0002:0.0002) (0.0002:0.0002:0.0002))
      (INTERCONNECT I0/QN I0/D (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT I0/Q I2/CK (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT I0/Q I14/A (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
      (INTERCONNECT I0/Q clock_by_4 (0.0001:0.0001:0.0001) (0.0001:0.0001:0.0001))
    )
  )
)
(CELL
  (CELLTYPE "delay_002u")
  (INSTANCE I16)
  (DELAY
    (ABSOLUTE
      (IOPATH i o (0.2588:0.2588:0.2588) (0.2115:0.2115:0.2115))
      (IOPATH pbiasv o (0.249:0.249:0.249) (0.1985:0.1985:0.1985))
    )
  )
)
(CELL
  (CELLTYPE "invx1_b")
  (INSTANCE I14)
  (DELAY
    (ABSOLUTE
      (IOPATH A Q (0.1273:0.1273:0.1273) (0.0843:0.0843:0.0843))
    )
  )
)
(CELL
  (CELLTYPE "dffprx1_b")
  (INSTANCE I2)
  (TIMINGCHECK
    (WIDTH (negedge RN) (0.50644:0.50644:0.50644))
    (RECOVERY (COND ENABLE2_D===1'b1 (posedge RN)) (COND ENABLE2_D===1'b1 (posedge CK)) (0.0641:0.0641:0.0641))
    (REMOVAL (COND ENABLE2_D===1'b1 (posedge RN)) (COND ENABLE2_D===1'b1 (posedge CK)) (0.0334:0.0334:0.0334))
    (SETUP (COND ENABLE1_RN===1'b1 (posedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.0917:0.0917:0.0917))
    (SETUP (COND ENABLE1_RN===1'b1 (negedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.1118:0.1118:0.1118))
    (HOLD (COND ENABLE1_RN===1'b1 (posedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0:0:0))
    (HOLD (COND ENABLE1_RN===1'b1 (negedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.0172:0.0172:0.0172))
    (WIDTH (COND ENABLE0_RN===1'b1 (posedge CK)) (0.24681:0.24681:0.24681))
    (WIDTH (COND ENABLE0_RN===1'b1 (negedge CK)) (0.31412:0.31412:0.31412))
  )
  (DELAY
    (ABSOLUTE
      (IOPATH (posedge CK) Q (0.5231:0.5231:0.5231) (0.4919:0.4919:0.4919))
      (IOPATH (posedge CK) QN (0.7082:0.7082:0.7082) (0.7393:0.7393:0.7393))
      (COND CK===1'b1 (IOPATH RN Q () (0.5682:0.5682:0.5682)))
      (COND CK===1'b0 (IOPATH RN Q () (0.4623:0.4623:0.4623)))
      (COND CK===1'b1 (IOPATH RN QN (0.7646:0.7646:0.7646) ()))
      (COND CK===1'b0 (IOPATH RN QN (0.6931:0.6931:0.6931) ()))
    )
  )
)
(CELL
  (CELLTYPE "dffprx1_b")
  (INSTANCE \q1_dff)
  (TIMINGCHECK
    (WIDTH (negedge RN) (0.50644:0.50644:0.50644))
    (RECOVERY (COND ENABLE2_D===1'b1 (posedge RN)) (COND ENABLE2_D===1'b1 (posedge CK)) (0.1417:0.1417:0.1417))
    (REMOVAL (COND ENABLE2_D===1'b1 (posedge RN)) (COND ENABLE2_D===1'b1 (posedge CK)) (0:0:0))
    (SETUP (COND ENABLE1_RN===1'b1 (posedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.1463:0.1463:0.1463))
    (SETUP (COND ENABLE1_RN===1'b1 (negedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.1866:0.1866:0.1866))
    (HOLD (COND ENABLE1_RN===1'b1 (posedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0:0:0))
    (HOLD (COND ENABLE1_RN===1'b1 (negedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0:0:0))
    (WIDTH (COND ENABLE0_RN===1'b1 (posedge CK)) (0.24681:0.24681:0.24681))
    (WIDTH (COND ENABLE0_RN===1'b1 (negedge CK)) (0.31412:0.31412:0.31412))
  )
  (DELAY
    (ABSOLUTE
      (IOPATH (posedge CK) Q (0.5109:0.5109:0.5109) (0.4859:0.4859:0.4859))
      (IOPATH (posedge CK) QN (0.6377:0.6377:0.6377) (0.6668:0.6668:0.6668))
      (COND CK===1'b1 (IOPATH RN Q () (0.6176:0.6176:0.6176)))
      (COND CK===1'b0 (IOPATH RN Q () (0.5276:0.5276:0.5276)))
      (COND CK===1'b1 (IOPATH RN QN (0.758:0.758:0.758) ()))
      (COND CK===1'b0 (IOPATH RN QN (0.6865:0.6865:0.6865) ()))
    )
  )
)
(CELL
  (CELLTYPE "invx1_b")
  (INSTANCE I13)
  (DELAY
    (ABSOLUTE
      (IOPATH A Q (0.1368:0.1368:0.1368) (0.0902:0.0902:0.0902))
    )
  )
)
(CELL
  (CELLTYPE "and3x1_b")
  (INSTANCE I6)
  (DELAY
    (ABSOLUTE
      (IOPATH A Q (0.3279:0.3279:0.3279) (0.23:0.23:0.23))
      (IOPATH B Q (0.3286:0.3286:0.3286) (0.2377:0.2377:0.2377))
      (IOPATH C Q (0.3415:0.3415:0.3415) (0.2813:0.2813:0.2813))
    )
  )
)
(CELL
  (CELLTYPE "nor2x1_b")
  (INSTANCE I12)
  (DELAY
    (ABSOLUTE
      (IOPATH A Q (0.2715:0.2715:0.2715) (0.1074:0.1074:0.1074))
      (IOPATH B Q (0.3189:0.3189:0.3189) (0.1595:0.1595:0.1595))
    )
  )
)
(CELL
  (CELLTYPE "dffprx1_b")
  (INSTANCE I0)
  (TIMINGCHECK
    (WIDTH (negedge RN) (0.50644:0.50644:0.50644))
    (RECOVERY (COND ENABLE2_D===1'b1 (posedge RN)) (COND ENABLE2_D===1'b1 (posedge CK)) (0.0549:0.0549:0.0549))
    (REMOVAL (COND ENABLE2_D===1'b1 (posedge RN)) (COND ENABLE2_D===1'b1 (posedge CK)) (0.0419:0.0419:0.0419))
    (SETUP (COND ENABLE1_RN===1'b1 (posedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.0838:0.0838:0.0838))
    (SETUP (COND ENABLE1_RN===1'b1 (negedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.1008:0.1008:0.1008))
    (HOLD (COND ENABLE1_RN===1'b1 (posedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0:0:0))
    (HOLD (COND ENABLE1_RN===1'b1 (negedge D)) (COND ENABLE1_RN===1'b1 (posedge CK)) (0.0276:0.0276:0.0276))
    (WIDTH (COND ENABLE0_RN===1'b1 (posedge CK)) (0.24681:0.24681:0.24681))
    (WIDTH (COND ENABLE0_RN===1'b1 (negedge CK)) (0.31412:0.31412:0.31412))
  )
  (DELAY
    (ABSOLUTE
      (IOPATH (posedge CK) Q (0.5703:0.5703:0.5703) (0.5426:0.5426:0.5426))
      (IOPATH (posedge CK) QN (0.7108:0.7108:0.7108) (0.7422:0.7422:0.7422))
      (COND CK===1'b1 (IOPATH RN Q () (0.6041:0.6041:0.6041)))
      (COND CK===1'b0 (IOPATH RN Q () (0.5102:0.5102:0.5102)))
      (COND CK===1'b1 (IOPATH RN QN (0.7589:0.7589:0.7589) ()))
      (COND CK===1'b0 (IOPATH RN QN (0.6874:0.6874:0.6874) ()))
    )
  )
)
)

I see that delayCal is more complete than write_sdf in encounter as it provides the IOPATH delays of combinational cells also. I don't want to use delay_cal as the main command and go ahead with the production flow as it might be inaccurate and also might not be supported in the next versions. Please tell me if there is a way to get the total information from write_sdf only.


Thanks in advance

Siddhartha

  • Cancel

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information