From 9e5aac37f4c9e83edc10e2258e07ed8c413dacfc Mon Sep 17 00:00:00 2001 From: James Cherry Date: Thu, 3 Jan 2019 16:14:15 -0800 Subject: [PATCH] cmake, write_path_spice --- CMakeLists.txt | 132 +++-- INSTALL | 76 +-- app/StaMain.cc | 3 + doc/BugLog | 3 +- doc/OpenSTA.odt | Bin 72183 -> 74250 bytes doc/OpenSTA.pdf | Bin 148099 -> 153463 bytes liberty/Liberty.cc | 13 +- liberty/Liberty.hh | 3 +- liberty/LibertyExprLex.ll | 2 - liberty/LibertyLex.ll | 4 +- liberty/LibertyParse.yy | 1 - liberty/Makefile.am | 6 + parasitics/Makefile.am | 6 + parasitics/NullParasitics.cc | 8 + parasitics/NullParasitics.hh | 4 + parasitics/SpefLex.ll | 2 - parasitics/SpfLex.ll | 2 - sdf/Makefile.am | 3 + sdf/SdfLex.ll | 2 - search/Makefile.am | 4 +- search/WritePathSpice.cc | 1075 ++++++++++++++++++++++++++++++++++ search/WritePathSpice.hh | 39 ++ tcl/Cmds.tcl | 85 +++ tcl/StaTcl.i | 28 +- tcl/Util.tcl | 175 +----- verilog/Makefile.am | 3 + verilog/VerilogLex.ll | 2 - 27 files changed, 1384 insertions(+), 297 deletions(-) create mode 100644 search/WritePathSpice.cc create mode 100644 search/WritePathSpice.hh diff --git a/CMakeLists.txt b/CMakeLists.txt index 312c1edc..5206d5c3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -176,7 +176,7 @@ set(STA_SOURCE search/VisitPathEnds.cc search/VisitPathGroupVertices.cc search/WorstSlack.cc - search/WriteSpice.cc + search/WritePathSpice.cc util/Condition.cc util/Debug.cc @@ -346,7 +346,7 @@ set(STA_HEADERS search/VisitPathEnds.hh search/VisitPathGroupVertices.hh search/WorstSlack.hh - search/WriteSpice.hh + search/WritePathSpice.hh util/Condition.hh util/Debug.hh @@ -514,91 +514,88 @@ get_filename_component(TCL_HEADER_DIR "${TCL_HEADER}" PATH) ################################################################ -# TCL files included as part of the executable are shoved into TclInitVar.cc. -# These files are encoded and shipped as part of the executable -# so that they do not have to be installed on the client host. -add_custom_command(OUTPUT ${STA_HOME}/app/TclInitVar.cc - COMMAND etc/TclEncode.tcl app/TclInitVar.cc tcl_inits ${STA_TCL_FILES} - WORKING_DIRECTORY ${STA_HOME} - DEPENDS ${STA_TCL_FILES} etc/TclEncode.tcl - ) - find_package(FLEX) find_package(BISON) -# Verilog scan/parse. -bison_target(VerilogParser verilog/VerilogParse.yy ${STA_HOME}/verilog/VerilogParse.cc - DEFINES_FILE ${STA_HOME}/verilog/VerilogParse.hh - COMPILE_FLAGS --name-prefix=VerilogParse_ - ) +# LibertyExpr scan/parse. +bison_target(LibertyExprParser liberty/LibertyExprParse.yy ${STA_HOME}/liberty/LibertyExprParse.cc + DEFINES_FILE ${STA_HOME}/liberty/LibertyExprParse.hh + COMPILE_FLAGS --name-prefix=LibertyExprParse_ + ) -# flex seems to ignore -o -add_custom_command(OUTPUT ${STA_HOME}/verilog/VerilogLex.cc ${STA_HOME}/verilog/VerilogLex.hh - COMMAND ${FLEX_EXECUTABLE} --prefix=VerilogLex_ --header-file=${STA_HOME}/verilog/VerilogLex.hh ${STA_HOME}/verilog/VerilogLex.ll - COMMAND mv lex.yy.c ${STA_HOME}/verilog/VerilogLex.cc +flex_target(LibertyExprLex liberty/LibertyExprLex.ll ${STA_HOME}/liberty/LibertyExprLex.cc + DEFINES_FILE ${STA_HOME}/liberty/LibertyExprLex.hh + COMPILE_FLAGS --prefix=LibertyExprLex_ ) +add_flex_bison_dependency(LibertyExprLex LibertyExprParser) + # Liberty scan/parse. bison_target(LibertyParser liberty/LibertyParse.yy ${STA_HOME}/liberty/LibertyParse.cc DEFINES_FILE ${STA_HOME}/liberty/LibertyParse.hh COMPILE_FLAGS --name-prefix=LibertyParse_ ) -# flex seems to ignore -o -add_custom_command(OUTPUT ${STA_HOME}/liberty/LibertyLex.cc ${STA_HOME}/liberty/LibertyLex.hh - COMMAND ${FLEX_EXECUTABLE} --prefix=LibertyLex_ --header-file=${STA_HOME}/liberty/LibertyLex.hh ${STA_HOME}/liberty/LibertyLex.ll - COMMAND mv lex.yy.c ${STA_HOME}/liberty/LibertyLex.cc - ) +flex_target(LibertyLex liberty/LibertyLex.ll ${STA_HOME}/liberty/LibertyLex.cc + DEFINES_FILE ${STA_HOME}/liberty/LibertyLex.hh + COMPILE_FLAGS --prefix=LibertyLex_ + ) -# LibertyExpr scan/parse. -bison_target(LibertyExprParser liberty/LibertyExprParse.yy ${STA_HOME}/liberty/LibertyExprParse.cc - DEFINES_FILE ${STA_HOME}/liberty/LibertyExprParse.hh - COMPILE_FLAGS --name-prefix=LibertyExprParse_ - ) - -# flex seems to ignore -o -add_custom_command(OUTPUT ${STA_HOME}/liberty/LibertyExprLex.cc ${STA_HOME}/liberty/LibertyExprLex.hh - COMMAND ${FLEX_EXECUTABLE} --prefix=LibertyExprLex_ --header-file=${STA_HOME}/liberty/LibertyExprLex.hh ${STA_HOME}/liberty/LibertyExprLex.ll - COMMAND mv lex.yy.c ${STA_HOME}/liberty/LibertyExprLex.cc - ) - -# Sdf scan/parse. -bison_target(SdfParser sdf/SdfParse.yy ${STA_HOME}/sdf/SdfParse.cc - DEFINES_FILE ${STA_HOME}/sdf/SdfParse.hh - COMPILE_FLAGS --name-prefix=SdfParse_ - ) - -# flex seems to ignore -o -add_custom_command(OUTPUT ${STA_HOME}/sdf/SdfLex.cc ${STA_HOME}/sdf/SdfLex.hh - COMMAND ${FLEX_EXECUTABLE} --prefix=SdfLex_ --header-file=${STA_HOME}/sdf/SdfLex.hh ${STA_HOME}/sdf/SdfLex.ll - COMMAND mv lex.yy.c ${STA_HOME}/sdf/SdfLex.cc - ) +add_flex_bison_dependency(LibertyLex LibertyParser) # Spef scan/parse. bison_target(SpefParser parasitics/SpefParse.yy ${STA_HOME}/parasitics/SpefParse.cc - DEFINES_FILE ${STA_HOME}/parasitics/SpefParse.hh - COMPILE_FLAGS --name-prefix=SpefParse_ - ) + DEFINES_FILE ${STA_HOME}/parasitics/SpefParse.hh + COMPILE_FLAGS --name-prefix=SpefParse_ + ) -# flex seems to ignore -o -add_custom_command(OUTPUT ${STA_HOME}/parasitics/SpefLex.cc ${STA_HOME}/parasitics/SpefLex.hh - COMMAND ${FLEX_EXECUTABLE} --prefix=SpefLex_ --header-file=${STA_HOME}/parasitics/SpefLex.hh ${STA_HOME}/parasitics/SpefLex.ll - COMMAND mv lex.yy.c ${STA_HOME}/parasitics/SpefLex.cc - ) +flex_target(SpefLex parasitics/SpefLex.ll ${STA_HOME}/parasitics/SpefLex.cc + DEFINES_FILE ${STA_HOME}/parasitics/SpefLex.hh + COMPILE_FLAGS --prefix=SpefLex_ + ) +add_flex_bison_dependency(SpefLex SpefParser) # Spf scan/parse. bison_target(SpfParser parasitics/SpfParse.yy ${STA_HOME}/parasitics/SpfParse.cc - DEFINES_FILE ${STA_HOME}/parasitics/SpfParse.hh - COMPILE_FLAGS --name-prefix=SpfParse_ + DEFINES_FILE ${STA_HOME}/parasitics/SpfParse.hh + COMPILE_FLAGS --name-prefix=SpfParse_ + ) + +flex_target(SpfLex parasitics/SpfLex.ll ${STA_HOME}/parasitics/SpfLex.cc + DEFINES_FILE ${STA_HOME}/parasitics/SpfLex.hh + COMPILE_FLAGS --prefix=SpfLex_ + ) + +add_flex_bison_dependency(SpfLex SpfParser) + +# Verilog scan/parse. +bison_target(VerilogParser verilog/VerilogParse.yy ${STA_HOME}/verilog/VerilogParse.cc + DEFINES_FILE ${STA_HOME}/verilog/VerilogParse.hh + COMPILE_FLAGS --name-prefix=VerilogParse_ ) -# flex seems to ignore -o -add_custom_command(OUTPUT ${STA_HOME}/parasitics/SpfLex.cc ${STA_HOME}/parasitics/SpfLex.hh - COMMAND ${FLEX_EXECUTABLE} --prefix=SpfLex_ --header-file=${STA_HOME}/parasitics/SpfLex.hh ${STA_HOME}/parasitics/SpfLex.ll - COMMAND mv lex.yy.c ${STA_HOME}/parasitics/SpfLex.cc +flex_target(VerilogLex verilog/VerilogLex.ll ${STA_HOME}/verilog/VerilogLex.cc + DEFINES_FILE ${STA_HOME}/verilog/VerilogLex.hh + COMPILE_FLAGS --prefix=VerilogLex_ + ) + +add_flex_bison_dependency(VerilogLex VerilogParser) + +# Sdf scan/parse. +bison_target(SdfParser sdf/SdfParse.yy ${STA_HOME}/sdf/SdfParse.cc + DEFINES_FILE ${STA_HOME}/sdf/SdfParse.hh + COMPILE_FLAGS --name-prefix=SdfParse_ + ) + +flex_target(SdfLex sdf/SdfLex.ll ${STA_HOME}/sdf/SdfLex.cc + DEFINES_FILE ${STA_HOME}/sdf/SdfLex.hh + COMPILE_FLAGS --prefix=SdfLex_ ) +add_flex_bison_dependency(SdfLex SdfParser) + + ################################################################ include(FindSWIG) @@ -612,6 +609,17 @@ add_custom_command(OUTPUT ${STA_HOME}/app/StaApp_wrap.cc ################################################################ +# TCL files included as part of the executable are shoved into TclInitVar.cc. +# These files are encoded and shipped as part of the executable +# so that they do not have to be installed on the client host. +add_custom_command(OUTPUT ${STA_HOME}/app/TclInitVar.cc + COMMAND etc/TclEncode.tcl app/TclInitVar.cc tcl_inits ${STA_TCL_FILES} + WORKING_DIRECTORY ${STA_HOME} + DEPENDS ${STA_TCL_FILES} etc/TclEncode.tcl + ) + +################################################################ + set(STA_INCLUDE_DIRS app dcalc diff --git a/INSTALL b/INSTALL index 9b778bd6..8e77671a 100644 --- a/INSTALL +++ b/INSTALL @@ -19,6 +19,10 @@ Building from a dist tarfile does not require the GNU Autotools, Bison or Flex to be installed and is the recommended method unless you are a developer. +Builds are also supported with cmake described later in this file. +Autotools based builds are currently supported for compatibility but +are deprecated. + Building from a tarfile ----------------------- @@ -65,6 +69,10 @@ handling. It is available here: https://www.davidkebo.com/source/cudd_versions/cudd-3.0.0.tar.gz https://sourceforge.net/projects/cudd-mirror/ +Note that the file hierarchy of the CUDD installation changed with +version 3.0. This build only supports the 3.0 layout but only small +changes to configure.ac are required to support older versions. + The Zlib library is an optional. If the configure script finds libz, OpenSTA can read Verilog, SDF, SPF, and SPEF files compressed with gzip. @@ -108,6 +116,41 @@ it. ./configure [options...] make +Building with Cmake +------------------- + +Building with cmake requires bison and flex. + + git clone https://xp-dev.com/git/opensta + cd opensta + mkdir build + cd build + cmake ../ + make + +The resulting executable is app/sta for compatibility with configure. +The library without main is app/libSTA.a. + +Optional cmake variables passed as -D= arguments to cmake. + + MAKE_BUILD_TYPE DEBUG|RELEASE + TCL_LIB - path to tcl library + TCL_HEADER - path to tcl.h + TCL_INIT - path to init.tcl + CMAKE_INSTALL_PREFIX + +If TCL_LIB is specified the cmake script will attempt to locate +the header and init files from its path. + +Default install directory is /usr/local. +To install in a different directory with cmake use: + + cmake .. -DCMAKE_INSTALL_PREFIX= + +or use the DESTDIR variable with make. + + make DESTDIR= install + Building on Windoz ------------------ The Win32 API does not natively support the pthreads API. The @@ -148,36 +191,3 @@ form: All commands in one .tcl file (usually run.tcl) for small cases No calls to "exit" No shell scripts to envoke the sta. - ----------------------------------------------------------------- -Building with Cmake - - git clone https://xp-dev.com/git/opensta - cd opensta - mkdir build - cd build - cmake ../ - make - -The resulting executable is app/sta for compatibility with configure. -The library without main is app/libSTA.a. - -Optional cmake variables passed as -D= arguments to cmake. - - MAKE_BUILD_TYPE DEBUG|RELEASE - TCL_LIB - path to tcl library - TCL_HEADER - path to tcl.h - TCL_INIT - path to init.tcl - CMAKE_INSTALL_PREFIX - -If TCL_LIB is specified the cmake script will attempt to locate -the header and init files from its path. - -Default install directory is /usr/local. -To install in a different directory with cmake use: - - cmake .. -DCMAKE_INSTALL_PREFIX= - -or use the DESTDIR variable with make. - - make DESTDIR= install diff --git a/app/StaMain.cc b/app/StaMain.cc index 6f025d5f..17c738c7 100644 --- a/app/StaMain.cc +++ b/app/StaMain.cc @@ -121,6 +121,9 @@ staTclAppInit(Tcl_Interp *interp) int argc = sta_argc; char **argv = sta_argv; + // source init.tcl + Tcl_Init(interp); + // Define swig commands. sta_swig_init(interp); diff --git a/doc/BugLog b/doc/BugLog index 37d62f82..4868b3e1 100644 --- a/doc/BugLog +++ b/doc/BugLog @@ -5,4 +5,5 @@ Release 2.0 Patches 2018/11/08 corners > 2 causes internal error 2018/11/09 Verilog ignore attributes (* blah *) 2018/12/24 all_fanout from input port -2018/12/25 liberty pg_types \ No newline at end of file +2018/12/25 liberty pg_types +2019/01/03 liberty 2D bus names diff --git a/doc/OpenSTA.odt b/doc/OpenSTA.odt index 411c8025a1c4ebb0558ac2626ee1023e34e229a1..43d96c59605232ce9c43d11e83d3ec1722593ab8 100644 GIT binary patch delta 45114 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 V`|dA2%(wS<7yv+#+X!Cbo^kAsJPXf92g}yYa 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 Yu>%(fJ0=AZz|O!xEMx)vr)2~D58T{qIsgCw diff --git a/doc/OpenSTA.pdf b/doc/OpenSTA.pdf index 98f5b22afa4f56689ac765f55ee74dc33f217e69..a17ffb94c7af5ccf3297c8c75a049b27843262ed 100644 GIT binary patch delta 32039 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 FLOAT %token STRING KEYWORD diff --git a/liberty/Makefile.am b/liberty/Makefile.am index 9c7882d2..5c0ff658 100644 --- a/liberty/Makefile.am +++ b/liberty/Makefile.am @@ -64,6 +64,12 @@ libliberty_la_SOURCES = \ LibertyExprLex.ll: LibertyExprParse.hh +LibertyExprLex.cc: LibertyExprLex.ll + $(LEX) $(LFLAGS) -o LibertyExprLex.cc --prefix=LibertyExprLex_ --header-file=LibertyExprLex.hh LibertyExprLex.ll + +LibertyLex.cc: LibertyLex.ll + $(LEX) $(LFLAGS) -o LibertyLex.cc --prefix=LibertyLex_ --header-file=LibertyLex.hh LibertyLex.ll + LibertyLex.ll: LibertyParse.hh # Rules to support automake pre 1.12 that name header .h instead of .hh diff --git a/parasitics/Makefile.am b/parasitics/Makefile.am index 92460c40..c6903c8b 100644 --- a/parasitics/Makefile.am +++ b/parasitics/Makefile.am @@ -51,8 +51,14 @@ libparasitics_la_SOURCES = \ SpfLex.ll: SpfParse.hh +SpfLex.cc: SpfLex.ll + $(LEX) $(LFLAGS) -o SpfLex.cc --prefix=SpfLex_ --header-file=SpfLex.hh SpfLex.ll + SpefLex.ll: SpefParse.hh +SpefLex.cc: SpefLex.ll + $(LEX) $(LFLAGS) -o SpefLex.cc --prefix=SpefLex_ --header-file=SpefLex.hh SpefLex.ll + # Rules to support automake pre 1.12 that name header .h instead of .hh SpfParse.hh: SpfParse.cc if test -f SpfParse.h; then \ diff --git a/parasitics/NullParasitics.cc b/parasitics/NullParasitics.cc index 53bb918d..f3c77061 100644 --- a/parasitics/NullParasitics.cc +++ b/parasitics/NullParasitics.cc @@ -424,6 +424,14 @@ NullParasitics::value(const ParasiticDevice *, return 0.0; } +void +NullParasitics::resistorNodes(const ParasiticDevice *, + // Return values. + ParasiticNode *&, + ParasiticNode *&) const +{ +} + ParasiticNode * NullParasitics::otherNode(const ParasiticDevice *, ParasiticNode *) const diff --git a/parasitics/NullParasitics.hh b/parasitics/NullParasitics.hh index 2a42e708..b1767f61 100644 --- a/parasitics/NullParasitics.hh +++ b/parasitics/NullParasitics.hh @@ -164,6 +164,10 @@ public: virtual const char *name(const ParasiticDevice *device) const; virtual float value(const ParasiticDevice *device, const ParasiticAnalysisPt *ap) const; + virtual void resistorNodes(const ParasiticDevice *device, + // Return values. + ParasiticNode *&node1, + ParasiticNode *&node2) const; virtual ParasiticNode *otherNode(const ParasiticDevice *device, ParasiticNode *node) const; // Reduce parasitic network to reduce_to model. diff --git a/parasitics/SpefLex.ll b/parasitics/SpefLex.ll index 601890a3..bca213fb 100644 --- a/parasitics/SpefLex.ll +++ b/parasitics/SpefLex.ll @@ -43,8 +43,6 @@ spefResetScanner() %} /* %option debug */ -%option prefix="SpefLex_" -%option outfile="lex.yy.c" %option noyywrap %option nounput %option never-interactive diff --git a/parasitics/SpfLex.ll b/parasitics/SpfLex.ll index 845e96d3..ec78ac3c 100644 --- a/parasitics/SpfLex.ll +++ b/parasitics/SpfLex.ll @@ -47,8 +47,6 @@ spfResetScanner() %} /* %option debug */ -%option prefix="SpfLex_" -%option outfile="lex.yy.c" %option noyywrap %option nounput %option never-interactive diff --git a/sdf/Makefile.am b/sdf/Makefile.am index ed3d8a7a..af3a3948 100644 --- a/sdf/Makefile.am +++ b/sdf/Makefile.am @@ -31,6 +31,9 @@ libsdf_la_SOURCES = \ SdfLex.ll: SdfParse.hh +SdfLex.cc: SdfLex.ll + $(LEX) $(LFLAGS) -o SdfLex.cc --prefix=SdfLex_ --header-file=SdfLex.hh SdfLex.ll + # Rules to support automake pre 1.12 that name header .h instead of .hh SdfParse.hh: SdfParse.cc if test -f SdfParse.h; then \ diff --git a/sdf/SdfLex.ll b/sdf/SdfLex.ll index a5ab4faa..a2ab2817 100644 --- a/sdf/SdfLex.ll +++ b/sdf/SdfLex.ll @@ -33,8 +33,6 @@ sdfFlushBuffer() %} /* %option debug */ -%option prefix="SdfLex_" -%option outfile="lex.yy.c" %option noyywrap %option nounput %option never-interactive diff --git a/search/Makefile.am b/search/Makefile.am index 1d35c7ab..8dc33222 100644 --- a/search/Makefile.am +++ b/search/Makefile.am @@ -57,7 +57,7 @@ include_HEADERS = \ VisitPathEnds.hh \ VisitPathGroupVertices.hh \ WorstSlack.hh \ - WriteSpice.hh + WritePathSpice.hh libsearch_la_SOURCES = \ Bfs.cc \ @@ -99,7 +99,7 @@ libsearch_la_SOURCES = \ VisitPathEnds.cc \ VisitPathGroupVertices.cc \ WorstSlack.cc \ - WriteSpice.cc + WritePathSpice.cc libs: $(lib_LTLIBRARIES) diff --git a/search/WritePathSpice.cc b/search/WritePathSpice.cc new file mode 100644 index 00000000..66684400 --- /dev/null +++ b/search/WritePathSpice.cc @@ -0,0 +1,1075 @@ +// OpenSTA, Static Timing Analyzer +// Copyright (c) 2019, Parallax Software, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#include +#include +#include +#include +#include "Machine.hh" +#include "Debug.hh" +#include "Error.hh" +#include "Report.hh" +#include "StringUtil.hh" +#include "FuncExpr.hh" +#include "Units.hh" +#include "Liberty.hh" +#include "TimingArc.hh" +#include "Network.hh" +#include "Graph.hh" +#include "Sdc.hh" +#include "DcalcAnalysisPt.hh" +#include "Parasitics.hh" +#include "PathAnalysisPt.hh" +#include "Path.hh" +#include "PathRef.hh" +#include "PathExpanded.hh" +#include "StaState.hh" +#include "WritePathSpice.hh" + +namespace sta { + +using std::string; +using std::ofstream; +using std::ifstream; + +typedef Vector StringVector; +typedef Map CellSpicePortNames; +typedef int Stage; +typedef Map ParasiticNodeMap; + +void +split(const string &text, + const string &delims, + // Return values. + StringVector &tokens); +void +streamPrint(ofstream &stream, + const char *fmt, + ...) __attribute__((format (printf, 2, 3))); +void +stringPrint(string &str, + const char *fmt, + ...) __attribute__((format (printf, 2, 3))); + +//////////////////////////////////////////////////////////////// + +class WritePathSpice : public StaState +{ +public: + WritePathSpice(Path *path, + const char *spice_filename, + const char *subckt_filename, + const char *lib_subckt_filename, + const char *model_filename, + const char *power_name, + const char *gnd_name, + const StaState *sta); + ~WritePathSpice(); + void writeSpice();; + +private: + void writeHeader(); + void writeStageInstances(); + void writeInputSource(); + void writeStageSubckts(); + void writeInputStage(Stage stage); + void writeMeasureStmts(); + void writeMeasureStmt(const Pin *pin); + void writeGateStage(Stage stage); + void writeStageVoltageSources(LibertyCell *cell, + StringVector *spice_port_names, + const char *inst_name, + LibertyPort *from_port, + LibertyPort *drvr_port); + void writeStageParasitics(Stage stage); + void writeSubckts(); + void findPathCellnames(// Return values. + StringSet &path_cell_names); + void recordSpicePortNames(const char *cell_name, + StringVector &tokens); + float pgPortVoltage(const char *pg_port_name, + LibertyCell *cell); + float pgPortVoltage(LibertyPgPort *pg_port); + float maxTime(); + const char *nodeName(ParasiticNode *node); + void initNodeMap(const char *net_name); + const char *spiceTrans(const TransRiseFall *tr); + void writeMeasureDelayStmt(Stage stage, + Path *input_path); + void writeMeasureSlewStmt(Stage stage, + Path *path); + + // Stage "accessors". + // Internally a stage index from stageFirst() to stageLast() + // is turned into an index into path_expanded_. + // A path from an input port has no GateInputPath. + Stage stageFirst(); + Stage stageLast(); + string stageName(Stage stage); + int stageGateInputPathIndex(Stage stage); + int stageDrvrPathIndex(Stage stage); + int stageLoadPathIndex(Stage stage); + PathRef *stageGateInputPath(Stage stage); + PathRef *stageDrvrPath(Stage stage); + PathRef *stageLoadPath(Stage stage); + TimingArc *stageGateArc(Stage stage); + TimingArc *stageWireArc(Stage stage); + Edge *stageGateEdge(Stage stage); + Edge *stageWireEdge(Stage stage); + Pin *stageInputPin(Stage stage); + Pin *stageDrvrPin(Stage stage); + Pin *stageLoadPin(Stage stage); + const char *stageGateInputPinName(Stage stage); + const char *stageDrvrPinName(Stage stage); + const char *stageLoadPinName(Stage stage); + + Path *path_; + const char *spice_filename_; + const char *subckt_filename_; + const char *lib_subckt_filename_; + const char *model_filename_; + const char *power_name_; + const char *gnd_name_; + + ofstream spice_stream_; + PathExpanded path_expanded_; + CellSpicePortNames cell_spice_port_names_; + ParasiticNodeMap node_map_; + int next_node_index_; + const char *net_name_; + float power_voltage_; + float gnd_voltage_; + + // Resistance to use to simulate a short circuit between spice nodes. + static const float short_ckt_resistance_; +}; + +//////////////////////////////////////////////////////////////// + +class SubcktEndsMissing : public StaException +{ +public: + SubcktEndsMissing(const char *cell_name, + const char *subckt_filename);; + const char *what() const throw(); + +protected: + string what_; +}; + +SubcktEndsMissing::SubcktEndsMissing(const char *cell_name, + const char *subckt_filename) +{ + what_ = "Error: spice subckt for cell "; + what_ += cell_name; + what_ += " missing .ends in "; + what_ += subckt_filename; +} + +const char * +SubcktEndsMissing::what() const throw() +{ + return what_.c_str(); +} + +//////////////////////////////////////////////////////////////// + +void +writePathSpice(Path *path, + const char *spice_filename, + const char *subckt_filename, + const char *lib_subckt_filename, + const char *model_filename, + const char *power_name, + const char *gnd_name, + StaState *sta) +{ + WritePathSpice writer(path, spice_filename, subckt_filename, + lib_subckt_filename, model_filename, + power_name, gnd_name, sta); + writer.writeSpice(); +} + +const float WritePathSpice::short_ckt_resistance_ = .0001; + +WritePathSpice::WritePathSpice(Path *path, + const char *spice_filename, + const char *subckt_filename, + const char *lib_subckt_filename, + const char *model_filename, + const char *power_name, + const char *gnd_name, + const StaState *sta) : + StaState(sta), + path_(path), + spice_filename_(spice_filename), + subckt_filename_(subckt_filename), + lib_subckt_filename_(lib_subckt_filename), + model_filename_(model_filename), + power_name_(power_name), + gnd_name_(gnd_name), + path_expanded_(sta), + net_name_(NULL) +{ + auto lib = network_->defaultLibertyLibrary(); + power_voltage_ = lib->supplyVoltage(power_name_); + gnd_voltage_ = lib->supplyVoltage(gnd_name_); +} + +WritePathSpice::~WritePathSpice() +{ + cell_spice_port_names_.deleteContents(); +} + +void +WritePathSpice::writeSpice() +{ + spice_stream_.open(spice_filename_); + if (spice_stream_.is_open()) { + path_expanded_.expand(path_, true); + // Find subckt port names as a side-effect of writeSubckts. + writeSubckts(); + writeHeader(); + writeStageInstances(); + writeMeasureStmts(); + writeInputSource(); + writeStageSubckts(); + streamPrint(spice_stream_, ".end\n"); + spice_stream_.close(); + } + else + throw FileNotWritable(spice_filename_); +} + +void +WritePathSpice::writeHeader() +{ + const MinMax *min_max = path_->minMax(this); + const Pvt *pvt = sdc_->operatingConditions(min_max); + if (pvt == NULL) + pvt = network_->defaultLibertyLibrary()->defaultOperatingConditions(); + float temp = pvt->temperature(); + streamPrint(spice_stream_, ".temp %.1f\n", temp); + streamPrint(spice_stream_, ".include \"%s\"\n", model_filename_); + streamPrint(spice_stream_, ".include \"%s\"\n", subckt_filename_); + + float max_time = maxTime(); + float time_step = max_time / 1e+3; + streamPrint(spice_stream_, ".tran %.3g %.3g\n\n", + time_step, max_time); +} + +float +WritePathSpice::maxTime() +{ + Stage input_stage = stageFirst(); + Path *input_path = stageDrvrPath(input_stage); + auto input_slew = input_path->slew(this); + auto end_slew = path_->slew(this); + auto max_time = (input_slew + path_->arrival(this) + end_slew * 2) * 1.5; + return max_time; +} + +void +WritePathSpice::writeStageInstances() +{ + streamPrint(spice_stream_, "*****************\n"); + streamPrint(spice_stream_, "* Stage instances\n"); + streamPrint(spice_stream_, "*****************\n\n"); + + for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { + const char *stage_name = stageName(stage).c_str(); + if (stage == stageFirst()) + streamPrint(spice_stream_, "x%s %s %s %s\n", + stage_name, + stageDrvrPinName(stage), + stageLoadPinName(stage), + stage_name); + else + streamPrint(spice_stream_, "x%s %s %s %s %s\n", + stage_name, + stageGateInputPinName(stage), + stageDrvrPinName(stage), + stageLoadPinName(stage), + stage_name); + } + streamPrint(spice_stream_, "\n"); +} + +float +WritePathSpice::pgPortVoltage(const char *pg_port_name, + LibertyCell *cell) +{ + auto pg_port = cell->findPgPort(pg_port_name); + return pgPortVoltage(pg_port); +} + +float +WritePathSpice::pgPortVoltage(LibertyPgPort *pg_port) +{ + auto cell = pg_port->cell(); + auto voltage_name = pg_port->voltageName(); + auto lib = cell->libertyLibrary(); + float voltage = lib->supplyVoltage(voltage_name); + return voltage; +} + +void +WritePathSpice::writeInputSource() +{ + streamPrint(spice_stream_, "**************\n"); + streamPrint(spice_stream_, "* Input source\n"); + streamPrint(spice_stream_, "**************\n\n"); + + Stage input_stage = stageFirst(); + streamPrint(spice_stream_, "v1 %s 0 pwl(\n", + stageDrvrPinName(input_stage)); + auto wire_arc = stageWireArc(input_stage); + float volt0, volt1; + if (wire_arc->fromTrans()->asRiseFall() == TransRiseFall::rise()) { + volt0 = gnd_voltage_; + volt1 = power_voltage_; + } + else { + volt0 = power_voltage_; + volt1 = gnd_voltage_; + } + Path *input_path = stageDrvrPath(input_stage); + auto input_slew = input_path->slew(this); + if (input_slew == 0.0) + input_slew = maxTime() / 1e+3; + // Arbitrary offset. + float time0 = input_slew; + float time1 = time0 + input_slew; + streamPrint(spice_stream_, "+%.3e %.3e\n", 0.0, volt0); + streamPrint(spice_stream_, "+%.3e %.3e\n", time0, volt0); + streamPrint(spice_stream_, "+%.3e %.3e\n", time1, volt1); + streamPrint(spice_stream_, "+%.3e %.3e\n", maxTime(), volt1); + streamPrint(spice_stream_, "+)\n\n"); +} + +void +WritePathSpice::writeMeasureStmts() +{ + streamPrint(spice_stream_, "********************\n"); + streamPrint(spice_stream_, "* Measure statements\n"); + streamPrint(spice_stream_, "********************\n\n"); + + for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { + auto input_path = (stage == stageFirst()) + ? stageDrvrPath(stage) + : stageGateInputPath(stage); + writeMeasureDelayStmt(stage, input_path); + writeMeasureSlewStmt(stage, input_path); + if (stage == stageLast()) + writeMeasureSlewStmt(stage, stageLoadPath(stage)); + } + streamPrint(spice_stream_, "\n"); +} + +void +WritePathSpice::writeMeasureDelayStmt(Stage stage, + Path *input_path) +{ + auto lib = network_->defaultLibertyLibrary(); + auto input_pin_name = network_->pathName(input_path->pin(this)); + auto input_tr = input_path->transition(this); + auto input_threshold = power_voltage_ * lib->inputThreshold(input_tr); + + auto load_path = stageLoadPath(stage); + auto load_pin_name = stageLoadPinName(stage); + auto load_tr = load_path->transition(this); + auto load_threshold = power_voltage_ * lib->inputThreshold(load_tr); + streamPrint(spice_stream_, + ".measure tran %s_%s_delay_%s trig v(%s) val=%.3f %s=last targ v(%s) val=%.3f %s=last\n", + stageName(stage).c_str(), + input_pin_name, + load_pin_name, + input_pin_name, + input_threshold, + spiceTrans(input_tr), + load_pin_name, + load_threshold, + spiceTrans(load_tr)); +} + +void +WritePathSpice::writeMeasureSlewStmt(Stage stage, + Path *path) +{ + auto lib = network_->defaultLibertyLibrary(); + auto pin_name = network_->pathName(path->pin(this)); + auto tr = path->transition(this); + auto spice_tr = spiceTrans(tr); + auto lower = power_voltage_ * lib->slewLowerThreshold(tr); + auto upper = power_voltage_ * lib->slewUpperThreshold(tr); + float threshold1, threshold2; + if (tr == TransRiseFall::rise()) { + threshold1 = lower; + threshold2 = upper; + } + else { + threshold1 = upper; + threshold2 = lower; + } + streamPrint(spice_stream_, + ".measure tran %s_%s_slew trig v(%s) val=%.3f %s=last targ v(%s) val=%.3f %s=last\n", + stageName(stage).c_str(), + pin_name, + pin_name, + threshold1, + spice_tr, + pin_name, + threshold2, + spice_tr); +} + +const char * +WritePathSpice::spiceTrans(const TransRiseFall *tr) +{ + if (tr == TransRiseFall::rise()) + return "RISE"; + else + return "FALL"; +} + +void +WritePathSpice::writeStageSubckts() +{ + streamPrint(spice_stream_, "***************\n"); + streamPrint(spice_stream_, "* Stage subckts\n"); + streamPrint(spice_stream_, "***************\n\n"); + + for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { + if (stage == stageFirst()) + writeInputStage(stage); + else + writeGateStage(stage); + } +} + +// Input port to first gate input. +void +WritePathSpice::writeInputStage(Stage stage) +{ + // Input arc. + // External driver not handled. + auto drvr_pin_name = stageDrvrPinName(stage); + auto load_pin_name = stageLoadPinName(stage); + streamPrint(spice_stream_, ".subckt %s %s %s\n", + stageName(stage).c_str(), + drvr_pin_name, + load_pin_name); + writeStageParasitics(stage); + streamPrint(spice_stream_, ".ends\n\n"); +} + +// Gate and load parasitics. +void +WritePathSpice::writeGateStage(Stage stage) +{ + auto input_pin = stageInputPin(stage); + auto input_pin_name = stageGateInputPinName(stage); + auto drvr_pin = stageDrvrPin(stage); + auto drvr_pin_name = stageDrvrPinName(stage); + auto load_pin_name = stageLoadPinName(stage); + streamPrint(spice_stream_, ".subckt stage%d %s %s %s\n", + stage, + input_pin_name, + drvr_pin_name, + load_pin_name); + Instance *inst = network_->instance(input_pin); + const char *inst_name = network_->pathName(inst); + LibertyCell *cell = network_->libertyCell(inst); + const char *cell_name = cell->name(); + auto spice_port_names = cell_spice_port_names_[cell_name]; + + // Instance subckt call. + streamPrint(spice_stream_, "x%s", inst_name); + StringVector::Iterator port_iter(spice_port_names); + while (port_iter.hasNext()) { + const char *subckt_port_name = port_iter.next().c_str(); + auto pin = network_->findPin(inst, subckt_port_name); + auto pg_port = cell->findPgPort(subckt_port_name); + const char *pin_name; + if (pin) { + pin_name = network_->pathName(pin); + streamPrint(spice_stream_, " %s", pin_name); + } + else if (pg_port) + streamPrint(spice_stream_, " %s/%s", inst_name, subckt_port_name); + } + streamPrint(spice_stream_, " %s\n", cell_name); + + writeStageVoltageSources(cell, spice_port_names, + inst_name, + network_->libertyPort(input_pin), + network_->libertyPort(drvr_pin)); + writeStageParasitics(stage); + streamPrint(spice_stream_, ".ends\n\n"); +} + +typedef Map LibertyPortLogicValues; + +// Find the logic values for expression inputs to enable paths from_port. +void +sensitizationValues(FuncExpr *expr, + LibertyPort *from_port, + // Return values. + LibertyPortLogicValues &port_values) +{ + switch (expr->op()) { + case FuncExpr::op_port: { + break; + } + case FuncExpr::op_not: { + sensitizationValues(expr->left(), from_port, port_values); + break; + } + case FuncExpr::op_or: { + FuncExpr *left = expr->left(); + FuncExpr *right = expr->right(); + if (left->port() == from_port + && right->op() == FuncExpr::op_port) + port_values[right->port()] = logic_zero; + else if (right->port() == from_port + && left->op() == FuncExpr::op_port) + port_values[left->port()] = logic_zero; + break; + } + case FuncExpr::op_and: { + FuncExpr *left = expr->left(); + FuncExpr *right = expr->right(); + if (left->port() == from_port + && right->op() == FuncExpr::op_port) + port_values[right->port()] = logic_one; + else if (right->port() == from_port + && left->op() == FuncExpr::op_port) + port_values[left->port()] = logic_one; + break; + } + case FuncExpr::op_xor: { + // Need to know timing arc sense to get this right. + FuncExpr *left = expr->left(); + FuncExpr *right = expr->right(); + if (left->port() == from_port + && right->op() == FuncExpr::op_port) + port_values[right->port()] = logic_zero; + else if (right->port() == from_port + && left->op() == FuncExpr::op_port) + port_values[left->port()] = logic_zero; + break; + } + case FuncExpr::op_one: + case FuncExpr::op_zero: + break; + } +} + +// Power/ground and input voltage sources. +void +WritePathSpice::writeStageVoltageSources(LibertyCell *cell, + StringVector *spice_port_names, + const char *inst_name, + LibertyPort *from_port, + LibertyPort *drvr_port) +{ + auto from_port_name = from_port->name(); + auto drvr_port_name = drvr_port->name(); + LibertyLibrary *lib = cell->libertyLibrary(); + LibertyPortLogicValues port_values; + sensitizationValues(drvr_port->function(), from_port, port_values); + int volt_source = 1; + debugPrint1(debug_, "write_spice", 2, "subckt %s\n", cell->name()); + StringVector::Iterator port_iter(spice_port_names); + while (port_iter.hasNext()) { + auto subckt_port_name = port_iter.next().c_str(); + auto pg_port = cell->findPgPort(subckt_port_name); + debugPrint2(debug_, "write_spice", 2, " port %s%s\n", + subckt_port_name, + pg_port ? " pwr/gnd" : ""); + if (pg_port) { + auto voltage = pgPortVoltage(pg_port); + streamPrint(spice_stream_, "v%d %s/%s 0 %.3f\n", + volt_source, + inst_name, subckt_port_name, + voltage); + volt_source++; + } else if (!(stringEq(subckt_port_name, from_port_name) + || stringEq(subckt_port_name, drvr_port_name))) { + // Input voltage to sensitize path from gate input to output. + LibertyPort *port = cell->findLibertyPort(subckt_port_name); + if (port) { + const char *pg_port_name = NULL; + bool port_has_value; + LogicValue port_value; + port_values.findKey(port, port_value, port_has_value); + if (port_has_value) { + switch (port_value) { + case logic_zero: + pg_port_name = port->relatedGroundPin(); + break; + case logic_one: + pg_port_name = port->relatedPowerPin(); + break; + default: + break; + } + if (pg_port_name) { + auto pg_port = cell->findPgPort(pg_port_name); + if (pg_port) { + auto voltage_name = pg_port->voltageName(); + if (voltage_name) { + float voltage = lib->supplyVoltage(voltage_name); + streamPrint(spice_stream_, "v%d %s/%s 0 %.3f\n", + volt_source, + inst_name, subckt_port_name, + voltage); + volt_source++; + } + else + report_->error("port %s %s voltage %s not found,\n", + subckt_port_name, + pg_port_name, + voltage_name); + } + else + report_->error("port %s %s not found,\n", + subckt_port_name, + pg_port_name); + } + } + } + } + } +} + +class ParasiticNodeNameLess +{ +public: + ParasiticNodeNameLess(Parasitics *parasitics); + bool operator()(const ParasiticNode *node1, + const ParasiticNode *node2) const; + +private: + Parasitics *parasitics_; +}; + +ParasiticNodeNameLess::ParasiticNodeNameLess(Parasitics *parasitics) : + parasitics_(parasitics) +{ +} + +bool +ParasiticNodeNameLess::operator()(const ParasiticNode *node1, + const ParasiticNode *node2) const +{ + return stringLess(parasitics_->name(node1), + parasitics_->name(node2)); +} + +typedef Set ParasiticDeviceSet; +// Use node names rather than pointers for less for stable results. +typedef Set ParasiticNodeSet; + +void +findParasiticDevicesNodes(ParasiticNode *node, + Parasitics *parasitics, + // Return values. + ParasiticNodeSet &nodes, + ParasiticDeviceSet &devices) +{ + nodes.insert(node); + auto device_iter = parasitics->deviceIterator(node); + while (device_iter->hasNext()) { + auto device = device_iter->next(); + if (!devices.hasKey(device)) { + devices.insert(device); + auto other_node = parasitics->otherNode(device, node); + findParasiticDevicesNodes(other_node, parasitics, nodes, devices); + } + } + delete device_iter; +} + +void +WritePathSpice::writeStageParasitics(Stage stage) +{ + auto drvr_path = stageDrvrPath(stage); + auto drvr_pin = stageDrvrPin(stage); + auto load_pin = stageLoadPin(stage); + auto dcalc_ap = drvr_path->dcalcAnalysisPt(this); + auto parasitic_ap = dcalc_ap->parasiticAnalysisPt(); + auto parasitic = parasitics_->findParasiticNetwork(drvr_pin, parasitic_ap); + int resistor_index = 1; + int cap_index = 1; + if (parasitic) { + Net *net = network_->net(drvr_pin); + auto net_name = + net ? network_->pathName(net) : network_->pathName(drvr_pin); + initNodeMap(net_name); + streamPrint(spice_stream_, "* Net %s\n", net_name); + auto node = parasitics_->findNode(parasitic, drvr_pin); + ParasiticNodeNameLess name_less(parasitics_); + ParasiticNodeSet nodes(name_less); + ParasiticDeviceSet devices; + findParasiticDevicesNodes(node, parasitics_, nodes, devices); + ParasiticDeviceSet::Iterator device_iter(devices); + while (device_iter.hasNext()) { + auto device = device_iter.next(); + auto resistance = parasitics_->value(device, parasitic_ap); + if (parasitics_->isResistor(device)) { + ParasiticNode *node1, *node2; + parasitics_->resistorNodes(device, node1, node2); + streamPrint(spice_stream_, "R%d %s %s %.3e\n", + resistor_index, + nodeName(node1), + nodeName(node2), + resistance); + resistor_index++; + } + else if (parasitics_->isCouplingCap(device)) { + } + } + ParasiticNodeSet::Iterator node_iter(nodes); + while (node_iter.hasNext()) { + auto node = node_iter.next(); + auto cap = parasitics_->nodeGndCap(node, parasitic_ap); + streamPrint(spice_stream_, "C%d %s 0 %.3e\n", + cap_index, + nodeName(node), + cap); + cap_index++; + } + } + else + streamPrint(spice_stream_, "R1 %s %s %.3e\n", + network_->pathName(drvr_pin), + network_->pathName(load_pin), + short_ckt_resistance_); +} + +void +WritePathSpice::initNodeMap(const char *net_name) +{ + stringDelete(net_name_); + node_map_.clear(); + next_node_index_ = 1; + net_name_ = stringCopy(net_name); +} + +const char * +WritePathSpice::nodeName(ParasiticNode *node) +{ + auto pin = parasitics_->connectionPin(node); + if (pin) + return parasitics_->name(node); + else { + int node_index; + bool node_index_exists; + node_map_.findKey(node, node_index, node_index_exists); + if (!node_index_exists) { + node_index = next_node_index_++; + node_map_[node] = node_index; + } + return stringPrintTmp(strlen(net_name_) + 10, "%s/%d", + net_name_, node_index); + } +} + +//////////////////////////////////////////////////////////////// + +// Copy the subckt definition from lib_subckt_filename for +// each cell in path to path_subckt_filename. +void +WritePathSpice::writeSubckts() +{ + StringSet path_cell_names; + findPathCellnames(path_cell_names); + + ifstream lib_subckts_stream(lib_subckt_filename_); + if (lib_subckts_stream.is_open()) { + ofstream subckts_stream(subckt_filename_); + if (subckts_stream.is_open()) { + string line; + while (getline(lib_subckts_stream, line)) { + // .subckt [args..] + StringVector tokens; + split(line, " \t", tokens); + if (tokens.size() >= 2 + && stringEqual(tokens[0].c_str(), ".subckt")) { + const char *cell_name = tokens[1].c_str(); + if (path_cell_names.hasKey(cell_name)) { + subckts_stream << line << "\n"; + bool found_ends = false; + while (getline(lib_subckts_stream, line)) { + subckts_stream << line << "\n"; + if (stringEqual(line.c_str(), ".ends")) { + subckts_stream << "\n"; + found_ends = true; + break; + } + } + if (!found_ends) + throw SubcktEndsMissing(cell_name, lib_subckt_filename_); + path_cell_names.eraseKey(cell_name); + } + recordSpicePortNames(cell_name, tokens); + } + } + subckts_stream.close(); + lib_subckts_stream.close(); + + if (!path_cell_names.empty()) { + StringSet::Iterator cell_iter(path_cell_names); + report_->error("The following subkcts are missing from %s\n", + lib_subckt_filename_); + while (cell_iter.hasNext()) { + const char *cell_name = cell_iter.next(); + report_->printError(" %s\n", cell_name); + } + } + } + else { + lib_subckts_stream.close(); + throw FileNotWritable(subckt_filename_); + } + } + else + throw FileNotReadable(lib_subckt_filename_); +} + +void +WritePathSpice::findPathCellnames(// Return values. + StringSet &path_cell_names) +{ + for (Stage stage = stageFirst(); stage <= stageLast(); stage++) { + auto arc = stageGateArc(stage); + if (arc) { + LibertyCell *cell = arc->set()->libertyCell(); + if (cell) { + debugPrint1(debug_, "write_spice", 2, "cell %s\n", cell->name()); + path_cell_names.insert(cell->name()); + } + } + } +} + +void +WritePathSpice::recordSpicePortNames(const char *cell_name, + StringVector &tokens) +{ + auto cell = network_->findLibertyCell(cell_name); + auto spice_port_names = new StringVector; + for (int i = 2; i < tokens.size(); i++) { + const char *port_name = tokens[i].c_str(); + auto port = cell->findLibertyPort(port_name); + auto pg_port = cell->findPgPort(port_name); + if (port == NULL && pg_port == NULL) + report_->error("subckt %s port %s has no corresponding liberty port or pg_port.\n", + cell_name, port_name); + spice_port_names->push_back(port_name); + } + cell_spice_port_names_[cell_name] = spice_port_names; +} + +//////////////////////////////////////////////////////////////// + +Stage +WritePathSpice::stageFirst() +{ + return 1; +} + +Stage +WritePathSpice::stageLast() +{ + return (path_expanded_.size() + 1) / 2; +} + +string +WritePathSpice::stageName(Stage stage) +{ + string name; + stringPrint(name, "stage%d", stage); + return name; +} + +int +WritePathSpice::stageGateInputPathIndex(Stage stage) +{ + return stage * 2 - 3; +} + +int +WritePathSpice::stageDrvrPathIndex(Stage stage) +{ + return stage * 2 - 2; +} + +int +WritePathSpice::stageLoadPathIndex(Stage stage) +{ + return stage * 2 - 1; +} + +PathRef * +WritePathSpice::stageGateInputPath(Stage stage) +{ + int path_index = stageGateInputPathIndex(stage); + return path_expanded_.path(path_index); +} + +PathRef * +WritePathSpice::stageDrvrPath(Stage stage) +{ + int path_index = stageDrvrPathIndex(stage); + return path_expanded_.path(path_index); +} + +PathRef * +WritePathSpice::stageLoadPath(Stage stage) +{ + int path_index = stageLoadPathIndex(stage); + return path_expanded_.path(path_index); +} + +TimingArc * +WritePathSpice::stageGateArc(Stage stage) +{ + int path_index = stageDrvrPathIndex(stage); + if (path_index >= 0) + return path_expanded_.prevArc(path_index); + else + return NULL; +} + +TimingArc * +WritePathSpice::stageWireArc(Stage stage) +{ + int path_index = stageLoadPathIndex(stage); + return path_expanded_.prevArc(path_index); +} + +Edge * +WritePathSpice::stageGateEdge(Stage stage) +{ + PathRef *path = stageGateInputPath(stage); + TimingArc *arc = stageGateArc(stage); + return path->prevEdge(arc, this); +} + +Edge * +WritePathSpice::stageWireEdge(Stage stage) +{ + PathRef *path = stageLoadPath(stage); + TimingArc *arc = stageWireArc(stage); + return path->prevEdge(arc, this); +} + +Pin * +WritePathSpice::stageInputPin(Stage stage) +{ + PathRef *path = stageGateInputPath(stage); + return path->pin(this); +} + +Pin * +WritePathSpice::stageDrvrPin(Stage stage) +{ + PathRef *path = stageDrvrPath(stage); + return path->pin(this); +} + +Pin * +WritePathSpice::stageLoadPin(Stage stage) +{ + PathRef *path = stageLoadPath(stage); + return path->pin(this); +} + +const char * +WritePathSpice::stageGateInputPinName(Stage stage) +{ + const Pin *pin = stageInputPin(stage); + return network_->pathName(pin); +} + +const char * +WritePathSpice::stageDrvrPinName(Stage stage) +{ + Pin *pin = stageDrvrPin(stage); + return network_->pathName(pin); +} + +const char * +WritePathSpice::stageLoadPinName(Stage stage) +{ + const Pin *pin = stageLoadPin(stage); + return network_->pathName(pin); +} + +//////////////////////////////////////////////////////////////// + +void +split(const string &text, + const string &delims, + // Return values. + StringVector &tokens) +{ + auto start = text.find_first_not_of(delims); + auto end = text.find_first_of(delims, start); + while (end != string::npos) { + tokens.push_back(text.substr(start, end - start)); + start = text.find_first_not_of(delims, end); + end = text.find_first_of(delims, start); + } + if (start != string::npos) + tokens.push_back(text.substr(start)); +} + +// fprintf for c++ streams. +// Yes, I hate formatted output to ostream THAT much. +void +streamPrint(ofstream &stream, + const char *fmt, + ...) +{ + va_list args; + va_start(args, fmt); + char *result; + vasprintf(&result, fmt, args); + stream << result; + free(result); + va_end(args); +} + +// print for c++ strings. +void +stringPrint(string &str, + const char *fmt, + ...) +{ + va_list args; + va_start(args, fmt); + char *result; + vasprintf(&result, fmt, args); + str = result; + free(result); + va_end(args); +} + +} // namespace diff --git a/search/WritePathSpice.hh b/search/WritePathSpice.hh new file mode 100644 index 00000000..e49cdcbd --- /dev/null +++ b/search/WritePathSpice.hh @@ -0,0 +1,39 @@ +// OpenSTA, Static Timing Analyzer +// Copyright (c) 2019, Parallax Software, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see . + +#ifndef STA_WRITE_PATH_SPICE_H +#define STA_WRITE_PATH_SPICE_H + +namespace sta { + +// Write a spice deck for path. +// Throws FileNotReadable, FileNotWritable, SubcktEndsMissing +void +writePathSpice(Path *path, + // Spice file written for path. + const char *spice_filename, + // Subckts used by path included in spice file. + const char *subckt_filename, + // File of all cell spice subckt definitions. + const char *lib_subckt_filename, + // Device model file included in spice file. + const char *model_filename, + const char *power_name, + const char *gnd_name, + StaState *sta); + +} // namespace +#endif diff --git a/tcl/Cmds.tcl b/tcl/Cmds.tcl index b4d738f1..bfa885e3 100644 --- a/tcl/Cmds.tcl +++ b/tcl/Cmds.tcl @@ -1860,5 +1860,90 @@ proc object_name_cmp { obj1 obj2 } { return [string compare [$obj1 object_name] [$obj2 object_name]] } +################################################################ + +define_cmd_args "write_path_spice" { -path_args path_args\ + -spice_file spice_file\ + -subckt_file subckt_file\ + -lib_subckt_file lib_subckts_file\ + -model_file model_file\ + -power power\ + -ground ground} + +proc write_path_spice { args } { + parse_key_args "write_spice" args \ + keys {-spice_file -subckt_file -lib_subckt_file \ + -model_file -power -ground -path_args} \ + flags {} + + if { [info exists keys(-spice_file)] } { + set spice_file $keys(-spice_file) + if { [file exists $spice_file] && ![file writable $spice_file] } { + sta_error "-spice_file $spice_file is not writable.\n" + } + } else { + sta_error "No -spice_file specified.\n" + } + + if { [info exists keys(-subckt_file)] } { + set subckt_file $keys(-subckt_file) + if { [file exists $subckt_file] && ![file writable $subckt_file] } { + sta_error "-subckt_file $subckt_file is not writable.\n" + } + } else { + sta_error "No -subckt_file specified.\n" + } + + if { [info exists keys(-lib_subckt_file)] } { + set lib_subckt_file $keys(-lib_subckt_file) + if { ![file readable $lib_subckt_file] } { + sta_error "-lib_subckt_file $lib_subckt_file is not readable.\n" + } + } else { + sta_error "No -lib_subckt_file specified.\n" + } + + if { [info exists keys(-lib_subckt_file)] } { + set model_file $keys(-model_file) + if { ![file readable $model_file] } { + sta_error "-model_file $model_file is not readable.\n" + } + } else { + sta_error "No -model_file specified.\n" + } + + if { [info exists keys(-power)] } { + set power $keys(-power) + if { ![liberty_supply_exists $power] } { + sta_error "liberty $power not found.\n" + } + } else { + sta_error "No -power specified.\n" + } + + if { [info exists keys(-ground)] } { + set ground $keys(-ground) + if { ![liberty_supply_exists $ground] } { + sta_error "liberty $ground not found.\n" + } + } else { + sta_error "No -ground specified.\n" + } + + if { ![info exists keys(-path_args)] } { + sta_error "No -path_args specified.\n" + } + set path_args $keys(-path_args) + set path_ends [eval [concat get_timing_paths $path_args]] + if { $path_ends == {} } { + sta_error "No paths found for -path_args $path_args.\n" + } + set path_end [lindex $path_ends 0] + set path [$path_end path] + + write_path_spice_cmd $path $spice_file $subckt_file \ + $lib_subckt_file $model_file $power $ground +} + # sta namespace end. } diff --git a/tcl/StaTcl.i b/tcl/StaTcl.i index 2d01b484..f9a9b43f 100644 --- a/tcl/StaTcl.i +++ b/tcl/StaTcl.i @@ -78,7 +78,7 @@ #include "ReportPath.hh" #include "Power.hh" #include "Property.hh" -#include "WriteSpice.hh" +#include "WritePathSpice.hh" #include "Sta.hh" namespace sta { @@ -4587,16 +4587,26 @@ write_sdc_cmd(const char *filename, } void -write_spice(PathRef *path, - const char *spice_filename, - const char *subckts_filename, - const char *lib_subckts_filename, - const char *models_filename) +write_path_spice_cmd(PathRef *path, + const char *spice_filename, + const char *subckt_filename, + const char *lib_subckt_filename, + const char *model_filename, + const char *power_name, + const char *gnd_name) { - cmdLinkedNetwork(); Sta *sta = Sta::sta(); - writeSpice(path, spice_filename, subckts_filename, - lib_subckts_filename, models_filename, sta); + writePathSpice(path, spice_filename, subckt_filename, + lib_subckt_filename, model_filename, + power_name, gnd_name, sta); +} + +bool +liberty_supply_exists(const char *supply_name) +{ + auto network = Sta::sta()->network(); + auto lib = network->defaultLibertyLibrary(); + return lib->supplyExists(supply_name); } void diff --git a/tcl/Util.tcl b/tcl/Util.tcl index 2dedc0d5..699a5e36 100644 --- a/tcl/Util.tcl +++ b/tcl/Util.tcl @@ -394,6 +394,7 @@ proc check_percent { cmd_arg arg } { # This rename provices a mechanism to refer to the original TCL # command. rename source builtin_source +rename unknown builtin_unknown # Numeric expressions eval to themselves so braces aren't required # around bus names like foo[2] or foo[*]. @@ -433,178 +434,4 @@ proc sta_unknown { args } { } } -# Copied from init.tcl -proc builtin_unknown args { - variable ::tcl::UnknownPending - global auto_noexec auto_noload env tcl_interactive - - - if {[info exists ::errorInfo]} { - set savedErrorInfo $::errorInfo - } - if {[info exists ::errorCode]} { - set savedErrorCode $::errorCode - } - - set name [lindex $args 0] - if {![info exists auto_noload]} { - # - # Make sure we're not trying to load the same proc twice. - # - if {[info exists UnknownPending($name)]} { - return -code error "self-referential recursion\ - in \"unknown\" for command \"$name\"" - } - set UnknownPending($name) pending - set ret [catch { - auto_load $name [uplevel 1 {::namespace current}] - } msg opts] - unset UnknownPending($name) - if {$ret != 0} { - dict append opts -errorinfo "\n (autoloading \"$name\")" - return -options $opts $msg - } - if {![array size UnknownPending]} { - unset UnknownPending - } - if {$msg} { - if {[info exists savedErrorCode]} { - set ::errorCode $savedErrorCode - } else { - unset -nocomplain ::errorCode - } - if {[info exists savedErrorInfo]} { - set ::errorInfo $savedErrorInfo - } else { - unset -nocomplain ::errorInfo - } - set code [catch {uplevel 1 $args} msg opts] - if {$code == 1} { - # - # Compute stack trace contribution from the [uplevel]. - # Note the dependence on how Tcl_AddErrorInfo, etc. - # construct the stack trace. - # - set errorInfo [dict get $opts -errorinfo] - set errorCode [dict get $opts -errorcode] - set cinfo $args - if {[string bytelength $cinfo] > 150} { - set cinfo [string range $cinfo 0 150] - while {[string bytelength $cinfo] > 150} { - set cinfo [string range $cinfo 0 end-1] - } - append cinfo ... - } - append cinfo "\"\n (\"uplevel\" body line 1)" - append cinfo "\n invoked from within" - append cinfo "\n\"uplevel 1 \$args\"" - # - # Try each possible form of the stack trace - # and trim the extra contribution from the matching case - # - set expect "$msg\n while executing\n\"$cinfo" - if {$errorInfo eq $expect} { - # - # The stack has only the eval from the expanded command - # Do not generate any stack trace here. - # - dict unset opts -errorinfo - dict incr opts -level - return -options $opts $msg - } - # - # Stack trace is nested, trim off just the contribution - # from the extra "eval" of $args due to the "catch" above. - # - set expect "\n invoked from within\n\"$cinfo" - set exlen [string length $expect] - set eilen [string length $errorInfo] - set i [expr {$eilen - $exlen - 1}] - set einfo [string range $errorInfo 0 $i] - # - # For now verify that $errorInfo consists of what we are about - # to return plus what we expected to trim off. - # - if {$errorInfo ne "$einfo$expect"} { - error "Tcl bug: unexpected stack trace in \"unknown\"" {} \ - [list CORE UNKNOWN BADTRACE $einfo $expect $errorInfo] - } - return -code error -errorcode $errorCode \ - -errorinfo $einfo $msg - } else { - dict incr opts -level - return -options $opts $msg - } - } - } - - if {([info level] == 1) && ([info script] eq "") \ - && [info exists tcl_interactive] && $tcl_interactive} { - if {![info exists auto_noexec]} { - set new [auto_execok $name] - if {$new ne ""} { - set redir "" - if {[namespace which -command console] eq ""} { - set redir ">&@stdout <@stdin" - } - uplevel 1 [list ::catch \ - [concat exec $redir $new [lrange $args 1 end]] \ - ::tcl::UnknownResult ::tcl::UnknownOptions] - dict incr ::tcl::UnknownOptions -level - return -options $::tcl::UnknownOptions $::tcl::UnknownResult - } - } - if {$name eq "!!"} { - set newcmd [history event] - } elseif {[regexp {^!(.+)$} $name -> event]} { - set newcmd [history event $event] - } elseif {[regexp {^\^([^^]*)\^([^^]*)\^?$} $name -> old new]} { - set newcmd [history event -1] - catch {regsub -all -- $old $newcmd $new newcmd} - } - if {[info exists newcmd]} { - tclLog $newcmd - history change $newcmd 0 - uplevel 1 [list ::catch $newcmd \ - ::tcl::UnknownResult ::tcl::UnknownOptions] - dict incr ::tcl::UnknownOptions -level - return -options $::tcl::UnknownOptions $::tcl::UnknownResult - } - - set ret [catch {set candidates [info commands $name*]} msg] - if {$name eq "::"} { - set name "" - } - if {$ret != 0} { - dict append opts -errorinfo \ - "\n (expanding command prefix \"$name\" in unknown)" - return -options $opts $msg - } - # Filter out bogus matches when $name contained - # a glob-special char [Bug 946952] - if {$name eq ""} { - # Handle empty $name separately due to strangeness - # in [string first] (See RFE 1243354) - set cmds $candidates - } else { - set cmds [list] - foreach x $candidates { - if {[string first $name $x] == 0} { - lappend cmds $x - } - } - } - if {[llength $cmds] == 1} { - uplevel 1 [list ::catch [lreplace $args 0 0 [lindex $cmds 0]] \ - ::tcl::UnknownResult ::tcl::UnknownOptions] - dict incr ::tcl::UnknownOptions -level - return -options $::tcl::UnknownOptions $::tcl::UnknownResult - } - if {[llength $cmds]} { - return -code error "ambiguous command name \"$name\": [lsort $cmds]" - } - } - return -code error "invalid command name \"$name\"" -} - namespace unknown sta_unknown diff --git a/verilog/Makefile.am b/verilog/Makefile.am index 8948848a..0c028045 100644 --- a/verilog/Makefile.am +++ b/verilog/Makefile.am @@ -27,6 +27,9 @@ libverilog_la_SOURCES = \ VerilogLex.ll: VerilogParse.hh +VerilogLex.cc: VerilogLex.ll + $(LEX) $(LFLAGS) -o VerilogLex.cc --prefix=VerilogLex_ --header-file=VerilogLex.hh VerilogLex.ll + # Rules to support automake pre 1.12 that name header .h instead of .hh VerilogParse.hh: VerilogParse.cc if test -f VerilogParse.h; then \ diff --git a/verilog/VerilogLex.ll b/verilog/VerilogLex.ll index 12c49733..4ab6881c 100644 --- a/verilog/VerilogLex.ll +++ b/verilog/VerilogLex.ll @@ -36,8 +36,6 @@ verilogFlushBuffer() %} /* %option debug */ -%option prefix="VerilogLex_" -%option outfile="lex.yy.c" %option noyywrap %option nounput %option never-interactive