Merge remote-tracking branch 'parallax/master'
This commit is contained in:
commit
39fd453a69
|
|
@ -39,6 +39,7 @@ project(STA VERSION 2.7.0
|
||||||
option(CUDD_DIR "CUDD BDD package directory")
|
option(CUDD_DIR "CUDD BDD package directory")
|
||||||
option(USE_TCL_READLINE "Use TCL readline package" ON)
|
option(USE_TCL_READLINE "Use TCL readline package" ON)
|
||||||
option(ENABLE_TSAN "Compile with thread santizer enabled" OFF)
|
option(ENABLE_TSAN "Compile with thread santizer enabled" OFF)
|
||||||
|
option(ENABLE_ASAN "Compile with address santizer enabled" OFF)
|
||||||
|
|
||||||
# Turn on to debug compiler args.
|
# Turn on to debug compiler args.
|
||||||
set(CMAKE_VERBOSE_MAKEFILE OFF)
|
set(CMAKE_VERBOSE_MAKEFILE OFF)
|
||||||
|
|
@ -541,6 +542,12 @@ if(ENABLE_TSAN)
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "-fsanitize=thread")
|
set(CMAKE_EXE_LINKER_FLAGS "-fsanitize=thread")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(ENABLE_ASAN)
|
||||||
|
message(STATUS "Address sanitizer: ${ENABLE_ASAN}")
|
||||||
|
set(CXX_FLAGS "${CXX_FLAGS};-fsanitize=address")
|
||||||
|
set(CMAKE_EXE_LINKER_FLAGS "-fsanitize=address")
|
||||||
|
endif()
|
||||||
|
|
||||||
target_compile_options(OpenSTA
|
target_compile_options(OpenSTA
|
||||||
PRIVATE
|
PRIVATE
|
||||||
$<$<CXX_COMPILER_ID:GNU>:${CXX_FLAGS}>
|
$<$<CXX_COMPILER_ID:GNU>:${CXX_FLAGS}>
|
||||||
|
|
|
||||||
|
|
@ -1012,7 +1012,7 @@ GraphDelayCalc::makeArcDcalcArgs(Vertex *drvr_vertex,
|
||||||
arc1 = arc;
|
arc1 = arc;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
findParallelEdge(drvr_vertex1, edge, arc, edge1, arc1);
|
findParallelEdge(drvr_vertex1, arc, edge1, arc1);
|
||||||
// Shockingly one fpga vendor connects outputs with no timing arcs together.
|
// Shockingly one fpga vendor connects outputs with no timing arcs together.
|
||||||
if (edge1) {
|
if (edge1) {
|
||||||
Vertex *from_vertex = edge1->from(graph_);
|
Vertex *from_vertex = edge1->from(graph_);
|
||||||
|
|
@ -1036,7 +1036,6 @@ GraphDelayCalc::makeArcDcalcArgs(Vertex *drvr_vertex,
|
||||||
// primary driver drvr_edge/drvr_arc.
|
// primary driver drvr_edge/drvr_arc.
|
||||||
void
|
void
|
||||||
GraphDelayCalc::findParallelEdge(Vertex *vertex,
|
GraphDelayCalc::findParallelEdge(Vertex *vertex,
|
||||||
Edge *drvr_edge,
|
|
||||||
const TimingArc *drvr_arc,
|
const TimingArc *drvr_arc,
|
||||||
// Return values.
|
// Return values.
|
||||||
Edge *&edge,
|
Edge *&edge,
|
||||||
|
|
@ -1047,11 +1046,10 @@ GraphDelayCalc::findParallelEdge(Vertex *vertex,
|
||||||
if (vertex_cell == drvr_cell) {
|
if (vertex_cell == drvr_cell) {
|
||||||
// Homogeneous drivers.
|
// Homogeneous drivers.
|
||||||
arc = drvr_arc;
|
arc = drvr_arc;
|
||||||
LibertyPort *from_port = network_->libertyPort(drvr_edge->from(graph_)->pin());
|
|
||||||
VertexInEdgeIterator edge_iter(vertex, graph_);
|
VertexInEdgeIterator edge_iter(vertex, graph_);
|
||||||
while (edge_iter.hasNext()) {
|
while (edge_iter.hasNext()) {
|
||||||
edge = edge_iter.next();
|
edge = edge_iter.next();
|
||||||
if (network_->libertyPort(edge->from(graph_)->pin()) == from_port)
|
if (edge->timingArcSet() == arc->set())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,7 @@
|
||||||
#include "PortDirection.hh"
|
#include "PortDirection.hh"
|
||||||
#include "Network.hh"
|
#include "Network.hh"
|
||||||
#include "DcalcAnalysisPt.hh"
|
#include "DcalcAnalysisPt.hh"
|
||||||
|
#include "FuncExpr.hh"
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
@ -1293,6 +1294,11 @@ Edge::to_string(const StaState *sta) const
|
||||||
string str = from(graph)->to_string(sta);
|
string str = from(graph)->to_string(sta);
|
||||||
str += " -> ";
|
str += " -> ";
|
||||||
str += to(graph)->to_string(sta);
|
str += to(graph)->to_string(sta);
|
||||||
|
FuncExpr *when = arc_set_->cond();
|
||||||
|
if (when) {
|
||||||
|
str += " ";
|
||||||
|
str += when->to_string();
|
||||||
|
}
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -632,7 +632,7 @@ private:
|
||||||
void expandFrom();
|
void expandFrom();
|
||||||
void expandThrus(ExceptionFrom *expanded_from);
|
void expandThrus(ExceptionFrom *expanded_from);
|
||||||
void expandThru(ExceptionFrom *expanded_from,
|
void expandThru(ExceptionFrom *expanded_from,
|
||||||
ExceptionThruSeq::Iterator &thru_iter,
|
size_t next_thru_idx,
|
||||||
ExceptionThruSeq *expanded_thrus);
|
ExceptionThruSeq *expanded_thrus);
|
||||||
void expandTo(ExceptionFrom *expanded_from,
|
void expandTo(ExceptionFrom *expanded_from,
|
||||||
ExceptionThruSeq *expanded_thrus);
|
ExceptionThruSeq *expanded_thrus);
|
||||||
|
|
|
||||||
|
|
@ -204,7 +204,6 @@ protected:
|
||||||
const DcalcAnalysisPt *dcalc_ap,
|
const DcalcAnalysisPt *dcalc_ap,
|
||||||
ArcDelayCalc *arc_delay_calc);
|
ArcDelayCalc *arc_delay_calc);
|
||||||
void findParallelEdge(Vertex *vertex,
|
void findParallelEdge(Vertex *vertex,
|
||||||
Edge *drvr_edge,
|
|
||||||
const TimingArc *drvr_arc,
|
const TimingArc *drvr_arc,
|
||||||
// Return values.
|
// Return values.
|
||||||
Edge *&edge,
|
Edge *&edge,
|
||||||
|
|
|
||||||
|
|
@ -366,9 +366,6 @@ public:
|
||||||
Vertex *vertex,
|
Vertex *vertex,
|
||||||
TagGroupBldr *tag_bldr);
|
TagGroupBldr *tag_bldr);
|
||||||
void ensureDownstreamClkPins();
|
void ensureDownstreamClkPins();
|
||||||
// Check paths from inputs from the default arrival clock
|
|
||||||
// (missing set_input_delay).
|
|
||||||
virtual bool checkDefaultArrivalPaths() { return true; }
|
|
||||||
bool matchesFilter(Path *path,
|
bool matchesFilter(Path *path,
|
||||||
const ClockEdge *to_clk_edge);
|
const ClockEdge *to_clk_edge);
|
||||||
CheckCrpr *checkCrpr() { return check_crpr_; }
|
CheckCrpr *checkCrpr() { return check_crpr_; }
|
||||||
|
|
|
||||||
|
|
@ -2146,9 +2146,8 @@ ExpandedExceptionVisitor::expandThrus(ExceptionFrom *expanded_from)
|
||||||
ExceptionThruSeq *thrus = exception_->thrus();
|
ExceptionThruSeq *thrus = exception_->thrus();
|
||||||
if (thrus) {
|
if (thrus) {
|
||||||
// Use tail recursion to expand the exception points in the thrus.
|
// Use tail recursion to expand the exception points in the thrus.
|
||||||
ExceptionThruSeq::Iterator thru_iter(thrus);
|
|
||||||
ExceptionThruSeq expanded_thrus;
|
ExceptionThruSeq expanded_thrus;
|
||||||
expandThru(expanded_from, thru_iter, &expanded_thrus);
|
expandThru(expanded_from, 0, &expanded_thrus);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
expandTo(expanded_from, nullptr);
|
expandTo(expanded_from, nullptr);
|
||||||
|
|
@ -2156,40 +2155,41 @@ ExpandedExceptionVisitor::expandThrus(ExceptionFrom *expanded_from)
|
||||||
|
|
||||||
void
|
void
|
||||||
ExpandedExceptionVisitor::expandThru(ExceptionFrom *expanded_from,
|
ExpandedExceptionVisitor::expandThru(ExceptionFrom *expanded_from,
|
||||||
ExceptionThruSeq::Iterator &thru_iter,
|
size_t next_thru_idx,
|
||||||
ExceptionThruSeq *expanded_thrus)
|
ExceptionThruSeq *expanded_thrus)
|
||||||
{
|
{
|
||||||
if (thru_iter.hasNext()) {
|
ExceptionThruSeq *thrus = exception_->thrus();
|
||||||
ExceptionThru *thru = thru_iter.next();
|
if (next_thru_idx < thrus->size()) {
|
||||||
|
ExceptionThru *thru = (*thrus)[next_thru_idx];
|
||||||
const RiseFallBoth *rf = thru->transition();
|
const RiseFallBoth *rf = thru->transition();
|
||||||
if (thru->pins()) {
|
if (thru->pins()) {
|
||||||
for (const Pin *pin : *thru->pins()) {
|
for (const Pin *pin : *thru->pins()) {
|
||||||
PinSet pins(network_);
|
PinSet pins(network_);
|
||||||
pins.insert(pin);
|
pins.insert(pin);
|
||||||
ExceptionThru expanded_thru(&pins, nullptr, nullptr, rf, false, network_);
|
ExceptionThru expanded_thru(&pins, nullptr, nullptr, rf, false, network_);
|
||||||
expanded_thrus->push_back(&expanded_thru);
|
expanded_thrus->push_back(&expanded_thru);
|
||||||
expandThru(expanded_from, thru_iter, expanded_thrus);
|
expandThru(expanded_from, next_thru_idx + 1, expanded_thrus);
|
||||||
expanded_thrus->pop_back();
|
expanded_thrus->pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (thru->nets()) {
|
if (thru->nets()) {
|
||||||
for (const Net *net : *thru->nets()) {
|
for (const Net *net : *thru->nets()) {
|
||||||
NetSet nets(network_);
|
NetSet nets(network_);
|
||||||
nets.insert(net);
|
nets.insert(net);
|
||||||
ExceptionThru expanded_thru(nullptr, &nets, nullptr, rf, false, network_);
|
ExceptionThru expanded_thru(nullptr, &nets, nullptr, rf, false, network_);
|
||||||
expanded_thrus->push_back(&expanded_thru);
|
expanded_thrus->push_back(&expanded_thru);
|
||||||
expandThru(expanded_from, thru_iter, expanded_thrus);
|
expandThru(expanded_from, next_thru_idx + 1, expanded_thrus);
|
||||||
expanded_thrus->pop_back();
|
expanded_thrus->pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (thru->instances()) {
|
if (thru->instances()) {
|
||||||
for (const Instance *inst : *thru->instances()) {
|
for (const Instance *inst : *thru->instances()) {
|
||||||
InstanceSet insts(network_);
|
InstanceSet insts(network_);
|
||||||
insts.insert(inst);
|
insts.insert(inst);
|
||||||
ExceptionThru expanded_thru(nullptr, nullptr, &insts, rf, false, network_);
|
ExceptionThru expanded_thru(nullptr, nullptr, &insts, rf, false, network_);
|
||||||
expanded_thrus->push_back(&expanded_thru);
|
expanded_thrus->push_back(&expanded_thru);
|
||||||
expandThru(expanded_from, thru_iter, expanded_thrus);
|
expandThru(expanded_from, next_thru_idx + 1, expanded_thrus);
|
||||||
expanded_thrus->pop_back();
|
expanded_thrus->pop_back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5115,8 +5115,10 @@ ExpandException::visit(ExceptionFrom *from,
|
||||||
ExceptionThruSeq *thrus_clone = nullptr;
|
ExceptionThruSeq *thrus_clone = nullptr;
|
||||||
if (thrus) {
|
if (thrus) {
|
||||||
thrus_clone = new ExceptionThruSeq;
|
thrus_clone = new ExceptionThruSeq;
|
||||||
for (ExceptionThru *thru : *thrus)
|
for (ExceptionThru *thru : *thrus) {
|
||||||
thrus_clone->push_back(thru->clone(network_));
|
ExceptionThru *thru_clone = thru->clone(network_);
|
||||||
|
thrus_clone->push_back(thru_clone);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ExceptionTo *to_clone = nullptr;
|
ExceptionTo *to_clone = nullptr;
|
||||||
if (to)
|
if (to)
|
||||||
|
|
|
||||||
|
|
@ -2227,7 +2227,8 @@ PathVisitor::visitFromPath(const Pin *from_pin,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (edge->role() == TimingRole::latchDtoQ()) {
|
else if (edge->role() == TimingRole::latchDtoQ()) {
|
||||||
if (min_max == MinMax::max()) {
|
if (min_max == MinMax::max()
|
||||||
|
&& clk) {
|
||||||
arc_delay = search_->deratedDelay(from_vertex, arc, edge, false, path_ap);
|
arc_delay = search_->deratedDelay(from_vertex, arc, edge, false, path_ap);
|
||||||
latches_->latchOutArrival(from_path, arc, edge, path_ap,
|
latches_->latchOutArrival(from_path, arc, edge, path_ap,
|
||||||
to_tag, arc_delay, to_arrival);
|
to_tag, arc_delay, to_arrival);
|
||||||
|
|
|
||||||
|
|
@ -978,7 +978,7 @@ proc report_slack { pin } {
|
||||||
proc report_tag_arrivals { pin } {
|
proc report_tag_arrivals { pin } {
|
||||||
set pin [get_port_pin_error "pin" $pin]
|
set pin [get_port_pin_error "pin" $pin]
|
||||||
foreach vertex [$pin vertices] {
|
foreach vertex [$pin vertices] {
|
||||||
report_tag_arrivals_cmd $vertex
|
report_tag_arrivals_cmd $vertex 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -178,9 +178,6 @@ VisitPathEnds::visitCheckEnd(const Pin *pin,
|
||||||
&& tgt_clk != sdc_->defaultArrivalClock()
|
&& tgt_clk != sdc_->defaultArrivalClock()
|
||||||
&& sdc_->sameClockGroup(src_clk, tgt_clk)
|
&& sdc_->sameClockGroup(src_clk, tgt_clk)
|
||||||
&& !sdc_->clkStopPropagation(tgt_pin, tgt_clk)
|
&& !sdc_->clkStopPropagation(tgt_pin, tgt_clk)
|
||||||
&& (search_->checkDefaultArrivalPaths()
|
|
||||||
|| src_clk_edge
|
|
||||||
!= sdc_->defaultArrivalClockEdge())
|
|
||||||
// False paths and path delays override
|
// False paths and path delays override
|
||||||
// paths.
|
// paths.
|
||||||
&& (exception == nullptr
|
&& (exception == nullptr
|
||||||
|
|
@ -360,9 +357,6 @@ VisitPathEnds::visitOutputDelayEnd1(OutputDelay *output_delay,
|
||||||
is_constrained = true;
|
is_constrained = true;
|
||||||
}
|
}
|
||||||
else if (src_clk_edge
|
else if (src_clk_edge
|
||||||
&& (search_->checkDefaultArrivalPaths()
|
|
||||||
|| src_clk_edge
|
|
||||||
!= sdc_->defaultArrivalClockEdge())
|
|
||||||
&& tgt_clk_edge
|
&& tgt_clk_edge
|
||||||
&& sdc_->sameClockGroup(path->clock(this), tgt_clk_edge->clock())
|
&& sdc_->sameClockGroup(path->clock(this), tgt_clk_edge->clock())
|
||||||
// False paths and path delays override.
|
// False paths and path delays override.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue