412 lines
9.4 KiB
Python
412 lines
9.4 KiB
Python
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright (c) 2025, The OpenROAD Authors
|
|
|
|
load("@rules_cc//cc:cc_binary.bzl", "cc_binary")
|
|
load("@rules_cc//cc:cc_library.bzl", "cc_library")
|
|
load("@rules_hdl//dependency_support/com_github_westes_flex:flex.bzl", "genlex")
|
|
load("@rules_hdl//dependency_support/org_gnu_bison:bison.bzl", "genyacc")
|
|
load("//bazel:tcl_encode_sta.bzl", "tcl_encode_sta")
|
|
load("//bazel:tcl_wrap_cc.bzl", "tcl_wrap_cc")
|
|
|
|
package(
|
|
default_visibility = ["//:__subpackages__"],
|
|
# features = ["layering_check"],
|
|
)
|
|
|
|
genlex(
|
|
name = "LibExprLex",
|
|
src = "liberty/LibExprLex.ll",
|
|
out = "liberty/LibExprLex.cc",
|
|
prefix = "LibExprLex_",
|
|
)
|
|
|
|
genyacc(
|
|
name = "LibExprParse",
|
|
src = "liberty/LibExprParse.yy",
|
|
header_out = "liberty/LibExprParse.hh",
|
|
prefix = "LibExprParse_",
|
|
source_out = "liberty/LibExprParse.cc",
|
|
)
|
|
|
|
# Liberty Parser
|
|
genlex(
|
|
name = "LibertyLex",
|
|
src = "liberty/LibertyLex.ll",
|
|
out = "liberty/LibertyLex.cc",
|
|
prefix = "LibertyLex_",
|
|
)
|
|
|
|
genyacc(
|
|
name = "LibertyParser",
|
|
src = "liberty/LibertyParse.yy",
|
|
extra_outs = ["liberty/LibertyLocation.hh"],
|
|
header_out = "liberty/LibertyParse.hh",
|
|
prefix = "LibertyParse_",
|
|
source_out = "liberty/LibertyParse.cc",
|
|
)
|
|
|
|
# Spef scan/parse.
|
|
genlex(
|
|
name = "SpefLex",
|
|
src = "parasitics/SpefLex.ll",
|
|
out = "parasitics/SpefLex.cc",
|
|
prefix = "SpefLex_",
|
|
)
|
|
|
|
genyacc(
|
|
name = "SpefParser",
|
|
src = "parasitics/SpefParse.yy",
|
|
extra_outs = ["parasitics/SpefLocation.hh"],
|
|
header_out = "parasitics/SpefParse.hh",
|
|
prefix = "SpefParse_",
|
|
source_out = "parasitics/SpefParse.cc",
|
|
)
|
|
|
|
# Verilog scan/parse.
|
|
genlex(
|
|
name = "VerilogLex",
|
|
src = "verilog/VerilogLex.ll",
|
|
out = "verilog/VerilogLex.cc",
|
|
prefix = "VerilogLex_",
|
|
)
|
|
|
|
genyacc(
|
|
name = "VerilogParser",
|
|
src = "verilog/VerilogParse.yy",
|
|
extra_outs = ["verilog/VerilogLocation.hh"],
|
|
header_out = "verilog/VerilogParse.hh",
|
|
prefix = "VerilogParse_",
|
|
source_out = "verilog/VerilogParse.cc",
|
|
)
|
|
|
|
# sdf scan/parse.
|
|
genlex(
|
|
name = "SdfLex",
|
|
src = "sdf/SdfLex.ll",
|
|
out = "sdf/SdfLex.cc",
|
|
prefix = "SdfLex_",
|
|
)
|
|
|
|
genyacc(
|
|
name = "SdfParser",
|
|
src = "sdf/SdfParse.yy",
|
|
extra_outs = ["sdf/SdfLocation.hh"],
|
|
header_out = "sdf/SdfParse.hh",
|
|
prefix = "SdfParse_",
|
|
source_out = "sdf/SdfParse.cc",
|
|
)
|
|
|
|
genlex(
|
|
name = "SaifLex",
|
|
src = "power/SaifLex.ll",
|
|
out = "power/SaifLex.cc",
|
|
prefix = "SaifLex_",
|
|
)
|
|
|
|
genyacc(
|
|
name = "SaifParser",
|
|
src = "power/SaifParse.yy",
|
|
extra_outs = ["power/SaifLocation.hh"],
|
|
header_out = "power/SaifParse.hh",
|
|
prefix = "SaifParse_",
|
|
source_out = "power/SaifParse.cc",
|
|
)
|
|
|
|
# The order here is very important as the script to encode these relies on it
|
|
tcl_srcs = [
|
|
"tcl/Util.tcl",
|
|
"tcl/CmdUtil.tcl",
|
|
"tcl/Init.tcl",
|
|
"tcl/CmdArgs.tcl",
|
|
"tcl/Property.tcl",
|
|
"tcl/Sta.tcl",
|
|
"tcl/Variables.tcl",
|
|
"tcl/Splash.tcl",
|
|
"graph/Graph.tcl",
|
|
"liberty/Liberty.tcl",
|
|
"network/Link.tcl",
|
|
"network/Network.tcl",
|
|
"network/NetworkEdit.tcl",
|
|
"search/Search.tcl",
|
|
"dcalc/DelayCalc.tcl",
|
|
"parasitics/Parasitics.tcl",
|
|
"power/Power.tcl",
|
|
"sdc/Sdc.tcl",
|
|
"sdf/Sdf.tcl",
|
|
"verilog/Verilog.tcl",
|
|
]
|
|
|
|
exports_files([
|
|
"etc/TclEncode.tcl",
|
|
])
|
|
|
|
exported_tcl = [
|
|
"tcl/Util.tcl",
|
|
"tcl/CmdUtil.tcl",
|
|
"tcl/CmdArgs.tcl",
|
|
"tcl/Property.tcl",
|
|
"tcl/Splash.tcl",
|
|
"tcl/Sta.tcl",
|
|
"tcl/Variables.tcl",
|
|
"sdc/Sdc.tcl",
|
|
"sdf/Sdf.tcl",
|
|
"search/Search.tcl",
|
|
"dcalc/DelayCalc.tcl",
|
|
"graph/Graph.tcl",
|
|
"liberty/Liberty.tcl",
|
|
"network/Network.tcl",
|
|
"network/NetworkEdit.tcl",
|
|
"parasitics/Parasitics.tcl",
|
|
"power/Power.tcl",
|
|
]
|
|
|
|
filegroup(
|
|
name = "tcl_scripts",
|
|
srcs = exported_tcl,
|
|
visibility = [
|
|
"//:__subpackages__",
|
|
],
|
|
)
|
|
|
|
tcl_encode_sta(
|
|
name = "StaTclInitVar",
|
|
srcs = tcl_srcs,
|
|
char_array_name = "tcl_inits",
|
|
)
|
|
|
|
genrule(
|
|
name = "StaConfig",
|
|
srcs = [],
|
|
outs = ["util/StaConfig.hh"],
|
|
cmd = """echo -e '
|
|
#define STA_VERSION "2.7.0"
|
|
#define STA_GIT_SHA1 "f21d4a3878e2531e3af4930818d9b5968aad9416"
|
|
#define SSTA 0
|
|
#define ZLIB_FOUND' > \"$@\"
|
|
""",
|
|
visibility = ["//:__subpackages__"],
|
|
)
|
|
|
|
filegroup(
|
|
name = "sta_swig_files",
|
|
srcs = [
|
|
"app/StaApp.i",
|
|
"dcalc/DelayCalc.i",
|
|
"graph/Graph.i",
|
|
"liberty/Liberty.i",
|
|
"network/Network.i",
|
|
"network/NetworkEdit.i",
|
|
"parasitics/Parasitics.i",
|
|
"power/Power.i",
|
|
"sdc/Sdc.i",
|
|
"sdf/Sdf.i",
|
|
"search/Property.i",
|
|
"search/Search.i",
|
|
"spice/WriteSpice.i",
|
|
"tcl/Exception.i",
|
|
"tcl/StaTclTypes.i",
|
|
"util/Util.i",
|
|
"verilog/Verilog.i",
|
|
],
|
|
visibility = ["//:__subpackages__"],
|
|
)
|
|
|
|
tcl_wrap_cc(
|
|
name = "StaApp",
|
|
srcs = [
|
|
":sta_swig_files",
|
|
],
|
|
namespace_prefix = "sta",
|
|
root_swig_src = "app/StaApp.i",
|
|
swig_includes = [
|
|
".",
|
|
],
|
|
)
|
|
|
|
parser_cc = [
|
|
# Liberty Expression Parser
|
|
":liberty/LibExprParse.cc",
|
|
":liberty/LibExprLex.cc",
|
|
# Liberty Parser
|
|
":liberty/LibertyLex.cc",
|
|
":liberty/LibertyParse.cc",
|
|
# Spef scan/parse.
|
|
":parasitics/SpefLex.cc",
|
|
":parasitics/SpefParse.cc",
|
|
# Verilog scan/parse.
|
|
":verilog/VerilogLex.cc",
|
|
":verilog/VerilogParse.cc",
|
|
# sdf scan/parse.
|
|
":sdf/SdfLex.cc",
|
|
":sdf/SdfParse.cc",
|
|
# Saif scan/parse.
|
|
":power/SaifLex.cc",
|
|
":power/SaifParse.cc",
|
|
]
|
|
|
|
parser_headers = [
|
|
# Liberty Expression Parser
|
|
":liberty/LibExprParse.hh",
|
|
# Liberty Parser
|
|
":liberty/LibertyParse.hh",
|
|
":liberty/LibertyLocation.hh",
|
|
# Spef scan/parse.
|
|
":parasitics/SpefParse.hh",
|
|
":parasitics/SpefLocation.hh",
|
|
# Verilog scan/parse.
|
|
":verilog/VerilogParse.hh",
|
|
":verilog/VerilogLocation.hh",
|
|
# sdf scan/parse.
|
|
":sdf/SdfParse.hh",
|
|
":sdf/SdfLocation.hh",
|
|
# Saif scan/parse.
|
|
":power/SaifParse.hh",
|
|
":power/SaifLocation.hh",
|
|
]
|
|
|
|
cc_binary(
|
|
name = "opensta",
|
|
srcs = [
|
|
"app/Main.cc",
|
|
":StaApp",
|
|
":StaTclInitVar",
|
|
"//bazel:runfiles",
|
|
],
|
|
copts = [
|
|
"-Wno-error",
|
|
"-Wall",
|
|
"-Wextra",
|
|
"-pedantic",
|
|
"-Wno-cast-qual", # typically from TCL swigging
|
|
"-Wno-missing-braces", # typically from TCL swigging
|
|
"-Wredundant-decls",
|
|
"-Wformat-security",
|
|
"-Wno-unused-parameter",
|
|
"-Wno-sign-compare",
|
|
],
|
|
features = ["-use_header_modules"],
|
|
includes = [
|
|
"",
|
|
"dcalc",
|
|
"include/sta",
|
|
"util",
|
|
],
|
|
malloc = "@tcmalloc//tcmalloc",
|
|
visibility = ["//visibility:public"],
|
|
deps = [
|
|
":opensta_lib",
|
|
"@rules_cc//cc/runfiles",
|
|
"@tk_tcl//:tcl",
|
|
],
|
|
)
|
|
|
|
cc_library(
|
|
name = "opensta_lib",
|
|
srcs = parser_cc +
|
|
parser_headers + glob(
|
|
include = [
|
|
"dcalc/*.cc",
|
|
"dcalc/*.hh",
|
|
"graph/*.cc",
|
|
"liberty/*.cc",
|
|
"liberty/*.hh",
|
|
"network/*.cc",
|
|
"parasitics/*.cc",
|
|
"parasitics/*.hh",
|
|
"power/*.cc",
|
|
"power/*.hh",
|
|
"sdc/*.cc",
|
|
"sdc/*.hh",
|
|
"sdf/*.cc",
|
|
"sdf/*.hh",
|
|
"search/*.cc",
|
|
"search/*.hh",
|
|
"spice/*.cc",
|
|
"spice/*.hh",
|
|
"tcl/*.cc",
|
|
"util/*.cc",
|
|
"util/*.hh",
|
|
"verilog/*.cc",
|
|
"verilog/*.hh",
|
|
],
|
|
exclude = [
|
|
"graph/Delay.cc",
|
|
"liberty/LibertyExt.cc",
|
|
"util/Machine*.cc",
|
|
],
|
|
) + [
|
|
"app/StaMain.cc",
|
|
"util/Machine.cc",
|
|
":StaConfig",
|
|
],
|
|
#+ select({
|
|
# "@bazel_tools//src/conditions:windows": ["util/MachineWin32.cc"],
|
|
# "@bazel_tools//src/conditions:darwin": ["util/MachineApple.cc"],
|
|
# "@bazel_tools//src/conditions:linux": ["util/MachineLinux.cc"],
|
|
# "//conditions:default": ["util/MachineUnknown.cc"],
|
|
# })
|
|
hdrs = glob(
|
|
include = ["include/sta/*.hh"],
|
|
) + [
|
|
# Required for swig
|
|
"search/Tag.hh",
|
|
"dcalc/ArcDcalcWaveforms.hh",
|
|
"power/Power.hh",
|
|
"power/VcdReader.hh",
|
|
"power/SaifReader.hh",
|
|
"sdf/SdfReader.hh",
|
|
"sdf/ReportAnnotation.hh",
|
|
"sdf/SdfWriter.hh",
|
|
"search/Levelize.hh",
|
|
"search/ReportPath.hh",
|
|
"spice/WritePathSpice.hh",
|
|
"dcalc/PrimaDelayCalc.hh",
|
|
],
|
|
copts = [
|
|
"-Wno-error",
|
|
"-Wall",
|
|
"-Wextra",
|
|
"-pedantic",
|
|
"-Wno-cast-qual", # typically from TCL swigging
|
|
"-Wno-missing-braces", # typically from TCL swigging
|
|
"-Wredundant-decls",
|
|
"-Wformat-security",
|
|
"-Wno-unused-parameter",
|
|
"-Wno-sign-compare",
|
|
"-fopenmp",
|
|
],
|
|
features = [
|
|
"-use_header_modules",
|
|
],
|
|
includes = [
|
|
".",
|
|
"dcalc",
|
|
"include",
|
|
"include/sta",
|
|
"liberty",
|
|
"parasitics",
|
|
"power",
|
|
"sdf",
|
|
"util",
|
|
"verilog",
|
|
],
|
|
textual_hdrs = ["util/MachineLinux.cc"],
|
|
visibility = ["//:__subpackages__"],
|
|
deps = [
|
|
"@cudd",
|
|
"@eigen",
|
|
"@openmp",
|
|
"@rules_flex//flex:current_flex_toolchain",
|
|
"@tk_tcl//:tcl",
|
|
"@zlib",
|
|
],
|
|
)
|
|
|
|
filegroup(
|
|
name = "tcl_util",
|
|
srcs = [
|
|
"tcl/Util.tcl",
|
|
],
|
|
visibility = ["//visibility:public"],
|
|
)
|