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