For the special case where synthesis netlists preserve hierarchy and OpenROAD flattens them, the resulting naming convention in the netlist and that of the SPEF file do not appear to align. This results in SPEF parasitic annotation failures.
As an example, we use a particular hierarchical name from an open source design implemented with hierarchy preserved during synthesis. The netlist name for a particular instance is:
The corresponding instance name mapping in the SPEF file is:
*27610 soc/gpio/gen_filter\[14\]\.filter/_14_
For the example above, the expected behavior is that the slight differences in name syntax used between the two files are resolved internally to OpenROAD and that annotation succeeds without causing warnings. Instead, the following warning is generated:
[WARNING STA-0172] ./asic_core.minimum.spef line 263475, instance soc/gpio/gen_filter\[14\].filter/_14_ not found.
Note that thousands of similar examples are present in the open source design used, and that they result in delay modeling errors posted in Issue #3211.
To investigate, the above example was modified in the netlist AND SPEF file with matching names that lack special characters that are treated as corner cases by many EDA software products when managing ASIC netlist names (notably '\', '[', ']', and '.'). The diff of the netlists is as follows:
The expected outcome of this experiment is elimination of the warning noted above. The intended outcome is obtained, along with some additional side effects, yielding the following overall diff in warning messages from readback of the netlist and SPEF:
36a37
> [WARNING STA-0172] ./asic_core.minimum.spef line 263475, instance soc/gpio/gen_filter\[14\].filter/_14_ not found.
39a41
> [WARNING STA-0174] ./asic_core.minimum.spef line 263482, net soc/gpio/gen_filter\[14\].filter/_14_ not found.
59a62
> [WARNING STA-0174] ./asic_core.minimum.spef line 263537, net soc/gpio/gen_filter\[14\].filter/_14_ not found.
1142,1143d1144
< [WARNING STA-0174] ./asic_core.minimum.spef line 266209, net soc/gpio/u_reg/direct_out_we not found.
< [WARNING STA-0174] ./asic_core.minimum.spef line 266210, net soc/gpio/u_reg/_014_ not found.
2037d2037
< [WARNING STA-0172] ./asic_core.minimum.spef line 298393, instance soc/u_rv_core_ibex/u_core/genblk1.genblk1.gen_regfile_latch.register_file_i/wdata_a_q_$_DFFE_PN0P__Q_23 not found.
Right facing diffs (">") indicate warnings present in the unmodified netlist and not in the modified netlist. Left facing diffs ("<") indicate warnings in the modified netlist that didn't line up with warnings found in the unmodified netlist. Inspection via tkdiff suggests that these new warnings in the modified netlist arise because the warning count limit is being reached, and eliminating the three warnings via modification allows previously unprinted warnings to appear in the log file.
Environment
[WARNING] Your current OpenROAD version is outdated.
It is recommened to pull the latest changes.
If problem persists, file a github issue with the re-producible test case.
kernel: Linux 5.14.0-1059-oem
os: Ubuntu 20.04.5 LTS (Focal Fossa)
cmake version 3.24.2
-- The CXX compiler identification is GNU 9.4.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- OpenROAD version: v2.0-7537-g47991be87
-- System name: Linux
-- Compiler: GNU 9.4.0
-- Build type: RELEASE
-- Install prefix: /usr/local
-- C++ Standard: 17
-- C++ Standard Required: ON
-- C++ Extensions: OFF
-- Could NOT find GTest (missing: GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
-- The C compiler identification is GNU 9.4.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Found Python: /usr/bin/python3.9 (found version "3.9.5") found components: Interpreter
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD
-- Performing Test CMAKE_HAVE_LIBC_PTHREAD - Failed
-- Looking for pthread_create in pthreads
-- Looking for pthread_create in pthreads - not found
-- Looking for pthread_create in pthread
-- Looking for pthread_create in pthread - found
-- Found Threads: TRUE
-- Performing Test C_COMPILER_SUPPORTS__-Wall
-- Performing Test C_COMPILER_SUPPORTS__-Wall - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wall
-- Performing Test CXX_COMPILER_SUPPORTS__-Wall - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-array-bounds
-- Performing Test C_COMPILER_SUPPORTS__-Wno-array-bounds - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-array-bounds
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-array-bounds - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-nonnull
-- Performing Test C_COMPILER_SUPPORTS__-Wno-nonnull - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-nonnull
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-nonnull - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-maybe-uninitialized
-- Performing Test C_COMPILER_SUPPORTS__-Wno-maybe-uninitialized - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-maybe-uninitialized
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-maybe-uninitialized - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-format-overflow
-- Performing Test C_COMPILER_SUPPORTS__-Wno-format-overflow - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-format-overflow
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-format-overflow - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-unused-variable
-- Performing Test C_COMPILER_SUPPORTS__-Wno-unused-variable - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-unused-variable
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-unused-variable - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-unused-function
-- Performing Test C_COMPILER_SUPPORTS__-Wno-unused-function - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-unused-function
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-unused-function - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-write-strings
-- Performing Test C_COMPILER_SUPPORTS__-Wno-write-strings - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-write-strings
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-write-strings - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-sign-compare
-- Performing Test C_COMPILER_SUPPORTS__-Wno-sign-compare - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-sign-compare
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-sign-compare - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-deprecated
-- Performing Test C_COMPILER_SUPPORTS__-Wno-deprecated - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-deprecated
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-deprecated - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-c++11-narrowing
-- Performing Test C_COMPILER_SUPPORTS__-Wno-c++11-narrowing - Failed
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-c++11-narrowing
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-c++11-narrowing - Failed
-- Performing Test C_COMPILER_SUPPORTS__-Wno-register
-- Performing Test C_COMPILER_SUPPORTS__-Wno-register - Failed
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-register
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-register - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-format
-- Performing Test C_COMPILER_SUPPORTS__-Wno-format - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-format
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-format - Success
-- Performing Test C_COMPILER_SUPPORTS__-Wno-reserved-user-defined-literal
-- Performing Test C_COMPILER_SUPPORTS__-Wno-reserved-user-defined-literal - Failed
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-reserved-user-defined-literal
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-reserved-user-defined-literal - Failed
-- Performing Test C_COMPILER_SUPPORTS__-fpermissive
-- Performing Test C_COMPILER_SUPPORTS__-fpermissive - Failed
-- Performing Test CXX_COMPILER_SUPPORTS__-fpermissive
-- Performing Test CXX_COMPILER_SUPPORTS__-fpermissive - Success
-- Performing Test C_COMPILER_SUPPORTS__-x
-- Performing Test C_COMPILER_SUPPORTS__-x - Failed
-- Performing Test CXX_COMPILER_SUPPORTS__-x
-- Performing Test CXX_COMPILER_SUPPORTS__-x - Failed
-- Performing Test C_COMPILER_SUPPORTS__c++
-- Performing Test C_COMPILER_SUPPORTS__c++ - Failed
-- Performing Test CXX_COMPILER_SUPPORTS__c++
-- Performing Test CXX_COMPILER_SUPPORTS__c++ - Failed
-- Performing Test C_COMPILER_SUPPORTS__-Wno-unused-but-set-variable
-- Performing Test C_COMPILER_SUPPORTS__-Wno-unused-but-set-variable - Success
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-unused-but-set-variable
-- Performing Test CXX_COMPILER_SUPPORTS__-Wno-unused-but-set-variable - Success
-- TCL library: /usr/lib/x86_64-linux-gnu/libtcl.so
-- TCL header: /usr/include/tcl/tcl.h
-- TCL readline library: /usr/lib/x86_64-linux-gnu/libtclreadline.so
-- TCL readline header: /usr/include/x86_64-linux-gnu
-- Found SWIG: /usr/bin/swig4.0 (found suitable version "4.0.1", minimum required is "3.0")
-- Found Boost: /usr/local/lib/cmake/Boost-1.80.0/BoostConfig.cmake (found version "1.80.0")
-- boost: 1.80.0
-- Found Python3: /usr/include/python3.9 (found version "3.9.5") found components: Development Development.Module Development.Embed
-- Found ZLIB: /usr/lib/x86_64-linux-gnu/libz.so (found version "1.2.11")
-- spdlog: 1.10.0
-- Found BISON: /usr/bin/bison (found version "3.5.1")
-- Found Doxygen: /usr/bin/doxygen (found version "1.8.17") found components: doxygen dot
-- STA version: 2.4.0
-- STA git sha: 882681a674e7089e5f02de4ba2050c6be32b6cd1
-- System name: Linux
-- Compiler: GNU 9.4.0
-- Build type: RELEASE
-- Build CXX_FLAGS: -O3 -DNDEBUG
-- Install prefix: /usr/local
-- Found FLEX: /usr/bin/flex (found version "2.6.4")
-- TCL library: /usr/lib/x86_64-linux-gnu/libtcl.so
-- TCL header: /usr/include/tcl/tcl.h
-- Check if compiler accepts -pthread
-- Check if compiler accepts -pthread - yes
-- SSTA: 0
-- STA executable: /tools/OpenROAD/src/sta/app/sta
-- GPU is not enabled
-- Found re2: /opt/or-tools/lib/cmake/re2/re2Config.cmake (found version "9.0.0")
-- Found Clp: /opt/or-tools/lib/cmake/Clp/ClpConfig.cmake (found version "1.17.7")
-- Found Cbc: /opt/or-tools/lib/cmake/Cbc/CbcConfig.cmake (found version "2.10.7")
-- Found Eigen3: /usr/local/share/eigen3/cmake/Eigen3Config.cmake (found version "3.4.0")
-- Found SCIP: /opt/or-tools/lib/cmake/scip/scip-config.cmake (found version "8.0.1")
-- GUI is enabled
-- Found Boost: /usr/local/lib/cmake/Boost-1.80.0/BoostConfig.cmake (found version "1.80.0") found components: serialization
-- Found OpenMP_CXX: -fopenmp (found version "4.5")
-- Found OpenMP: TRUE (found version "4.5")
-- Could NOT find VTune (missing: VTune_LIBRARIES VTune_INCLUDE_DIRS)
-- Found Boost: /usr/local/lib/cmake/Boost-1.80.0/BoostConfig.cmake (found suitable version "1.80.0", minimum required is "1.78")
-- Found Boost: /usr/local/lib/cmake/Boost-1.80.0/BoostConfig.cmake (found version "1.80.0") found components: serialization system thread
-- TCL readline enabled
-- Tcl Extended disabled
-- Python3 enabled
-- Configuring done
-- Generating done
-- Build files have been written to: /tmp/tmp.qQqyGyCxIs
Execution of run.sh executes readback of the design database and loading of the verilog netlist and SPEF file to generate above warnings and redirect them to a log file. A provided perl script eliminates filename differences in the warning messages to simplify the analysis of the logfile diff. The diff is then executed and printed to STDOUT. When run successfully the resulting diff should match that posted to this issue thread.
Describe the bug
For the special case where synthesis netlists preserve hierarchy and OpenROAD flattens them, the resulting naming convention in the netlist and that of the SPEF file do not appear to align. This results in SPEF parasitic annotation failures.
As an example, we use a particular hierarchical name from an open source design implemented with hierarchy preserved during synthesis. The netlist name for a particular instance is:
sky130_fd_sc_hd__xor2_2 \soc/gpio/gen_filter[14].filter/_14_ (.A(ea_din[0]),
The corresponding instance name mapping in the SPEF file is:
*27610 soc/gpio/gen_filter\[14\]\.filter/_14_
For the example above, the expected behavior is that the slight differences in name syntax used between the two files are resolved internally to OpenROAD and that annotation succeeds without causing warnings. Instead, the following warning is generated:
[WARNING STA-0172] ./asic_core.minimum.spef line 263475, instance soc/gpio/gen_filter\[14\].filter/_14_ not found.
Note that thousands of similar examples are present in the open source design used, and that they result in delay modeling errors posted in Issue #3211.
To investigate, the above example was modified in the netlist AND SPEF file with matching names that lack special characters that are treated as corner cases by many EDA software products when managing ASIC netlist names (notably '\', '[', ']', and '.'). The diff of the netlists is as follows:
28564c28564
< sky130_fd_sc_hd__xor2_2 \soc/gpio/gen_filter[14].filter/_14_ (.A(ea_din[0]),
---
> sky130_fd_sc_hd__xor2_2 soc_gpio_gen_filter_14_filter_14_ (.A(ea_din[0]),
Similarly, the SPEF file is modified to produce a matching name:
< *27610 soc_gpio_gen_filter_14_filter_14_
---
> *27610 soc/gpio/gen_filter\[14\]\.filter/_14_
Expected Behavior
The expected outcome of this experiment is elimination of the warning noted above. The intended outcome is obtained, along with some additional side effects, yielding the following overall diff in warning messages from readback of the netlist and SPEF:
Right facing diffs (">") indicate warnings present in the unmodified netlist and not in the modified netlist. Left facing diffs ("<") indicate warnings in the modified netlist that didn't line up with warnings found in the unmodified netlist. Inspection via tkdiff suggests that these new warnings in the modified netlist arise because the warning count limit is being reached, and eliminating the three warnings via modification allows previously unprinted warnings to appear in the log file.
Environment
To Reproduce
Download this tarball:
Example netlist modification to eliminate SPEF annotation warnings
cd testcase
./run.sh
Execution of run.sh executes readback of the design database and loading of the verilog netlist and SPEF file to generate above warnings and redirect them to a log file. A provided perl script eliminates filename differences in the warning messages to simplify the analysis of the logfile diff. The diff is then executed and printed to STDOUT. When run successfully the resulting diff should match that posted to this issue thread.
Relevant log output
No response
Screenshots
No response
Additional Context
No response