sta_internal_bidirect_instance_paths_enabled use load->driver edges
Signed-off-by: James Cherry <cherry@CerezoBook.local>
This commit is contained in:
parent
376d86bbce
commit
0fe167a80d
|
|
@ -107,8 +107,7 @@ DcalcPred::searchThru(Edge *edge,
|
||||||
|| edge->isDisabledLoop()
|
|| edge->isDisabledLoop()
|
||||||
|| sdc->isDisabledConstraint(edge)
|
|| sdc->isDisabledConstraint(edge)
|
||||||
|| sdc->isDisabledCondDefault(edge)
|
|| sdc->isDisabledCondDefault(edge)
|
||||||
|| (edge->isBidirectInstPath()
|
|| sta_->isDisabledBidirectInstPath(edge));
|
||||||
&& !variables->bidirectInstPathsEnabled()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -1011,13 +1010,13 @@ GraphDelayCalc::findDriverEdgeDelays(Vertex *drvr_vertex,
|
||||||
if (search_pred_->searchFrom(from_vertex, mode)
|
if (search_pred_->searchFrom(from_vertex, mode)
|
||||||
&& search_pred_->searchThru(edge, mode)) {
|
&& search_pred_->searchThru(edge, mode)) {
|
||||||
for (const MinMax *min_max : MinMax::range()) {
|
for (const MinMax *min_max : MinMax::range()) {
|
||||||
for (const TimingArc *arc : arc_set->arcs()) {
|
for (const TimingArc *arc : arc_set->arcs()) {
|
||||||
delay_changed |= findDriverArcDelays(drvr_vertex, multi_drvr, edge, arc,
|
delay_changed |= findDriverArcDelays(drvr_vertex, multi_drvr, edge, arc,
|
||||||
scene, min_max, arc_delay_calc,
|
scene, min_max, arc_delay_calc,
|
||||||
load_pin_index_map);
|
load_pin_index_map);
|
||||||
delay_exists[arc->toEdge()->asRiseFall()->index()] = true;
|
delay_exists[arc->toEdge()->asRiseFall()->index()] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (delay_changed && observer_) {
|
if (delay_changed && observer_) {
|
||||||
|
|
|
||||||
|
|
@ -250,6 +250,13 @@ Graph::makeInstDrvrWireEdges(const Instance *inst,
|
||||||
if (network_->isDriver(pin)
|
if (network_->isDriver(pin)
|
||||||
&& !visited_drvrs.contains(pin))
|
&& !visited_drvrs.contains(pin))
|
||||||
makeWireEdgesFromPin(pin, visited_drvrs);
|
makeWireEdgesFromPin(pin, visited_drvrs);
|
||||||
|
if (network_->isTopInstance(inst)
|
||||||
|
&& network_->direction(pin)->isBidirect()) {
|
||||||
|
Vertex *bidir_load, *bidir_drvr;
|
||||||
|
pinVertices(pin, bidir_load, bidir_drvr);
|
||||||
|
Edge *edge = makeEdge(bidir_load, bidir_drvr, TimingArcSet::wireTimingArcSet());
|
||||||
|
edge->setIsBidirectPortPath(true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
delete pin_iter;
|
delete pin_iter;
|
||||||
}
|
}
|
||||||
|
|
@ -1211,6 +1218,7 @@ Edge::init(VertexId from,
|
||||||
vertex_out_prev_ = edge_id_null;
|
vertex_out_prev_ = edge_id_null;
|
||||||
is_bidirect_inst_path_ = false;
|
is_bidirect_inst_path_ = false;
|
||||||
is_bidirect_net_path_ = false;
|
is_bidirect_net_path_ = false;
|
||||||
|
is_bidirect_port_path_ = false;
|
||||||
|
|
||||||
arc_delays_ = nullptr;
|
arc_delays_ = nullptr;
|
||||||
arc_delay_annotated_is_bits_ = true;
|
arc_delay_annotated_is_bits_ = true;
|
||||||
|
|
@ -1368,6 +1376,12 @@ Edge::setIsBidirectNetPath(bool is_bidir)
|
||||||
is_bidirect_net_path_ = is_bidir;
|
is_bidirect_net_path_ = is_bidir;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Edge::setIsBidirectPortPath(bool is_bidir)
|
||||||
|
{
|
||||||
|
is_bidirect_port_path_ = is_bidir;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Edge::setHasSimSense(bool has_sense)
|
Edge::setHasSimSense(bool has_sense)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,7 @@ remove_delay_slew_annotations()
|
||||||
Pin *pin() { return self->pin(); }
|
Pin *pin() { return self->pin(); }
|
||||||
bool is_bidirect_driver() { return self->isBidirectDriver(); }
|
bool is_bidirect_driver() { return self->isBidirectDriver(); }
|
||||||
int level() { return Sta::sta()->vertexLevel(self); }
|
int level() { return Sta::sta()->vertexLevel(self); }
|
||||||
|
bool is_root() { return self->isRoot(); }
|
||||||
int tag_group_index() { return self->tagGroupIndex(); }
|
int tag_group_index() { return self->tagGroupIndex(); }
|
||||||
|
|
||||||
float
|
float
|
||||||
|
|
|
||||||
|
|
@ -364,6 +364,9 @@ public:
|
||||||
void setIsBidirectInstPath(bool is_bidir);
|
void setIsBidirectInstPath(bool is_bidir);
|
||||||
bool isBidirectNetPath() const { return is_bidirect_net_path_; }
|
bool isBidirectNetPath() const { return is_bidirect_net_path_; }
|
||||||
void setIsBidirectNetPath(bool is_bidir);
|
void setIsBidirectNetPath(bool is_bidir);
|
||||||
|
bool isBidirectPortPath() const { return is_bidirect_port_path_; }
|
||||||
|
void setIsBidirectPortPath(bool is_bidir);
|
||||||
|
|
||||||
void removeDelayAnnotated();
|
void removeDelayAnnotated();
|
||||||
[[nodiscard]] bool hasSimSense() const { return has_sim_sense_; }
|
[[nodiscard]] bool hasSimSense() const { return has_sim_sense_; }
|
||||||
void setHasSimSense(bool has_sense);
|
void setHasSimSense(bool has_sense);
|
||||||
|
|
@ -403,6 +406,8 @@ protected:
|
||||||
bool delay_annotation_is_incremental_:1;
|
bool delay_annotation_is_incremental_:1;
|
||||||
bool is_bidirect_inst_path_:1;
|
bool is_bidirect_inst_path_:1;
|
||||||
bool is_bidirect_net_path_:1;
|
bool is_bidirect_net_path_:1;
|
||||||
|
// Bidirect load -> driver edge.
|
||||||
|
bool is_bidirect_port_path_:1;
|
||||||
bool is_disabled_loop_:1;
|
bool is_disabled_loop_:1;
|
||||||
bool has_sim_sense_:1;
|
bool has_sim_sense_:1;
|
||||||
bool has_disabled_cond_:1;
|
bool has_disabled_cond_:1;
|
||||||
|
|
|
||||||
|
|
@ -567,8 +567,6 @@ public:
|
||||||
const Sdc *sdc);
|
const Sdc *sdc);
|
||||||
// Edge is disabled to break combinational loops.
|
// Edge is disabled to break combinational loops.
|
||||||
[[nodiscard]] bool isDisabledLoop(Edge *edge) const;
|
[[nodiscard]] bool isDisabledLoop(Edge *edge) const;
|
||||||
// Edge is disabled internal bidirect output path.
|
|
||||||
[[nodiscard]] bool isDisabledBidirectInstPath(Edge *edge) const;
|
|
||||||
// Edge is disabled bidirect net path.
|
// Edge is disabled bidirect net path.
|
||||||
[[nodiscard]] bool isDisabledBidirectNetPath(Edge *edge) const;
|
[[nodiscard]] bool isDisabledBidirectNetPath(Edge *edge) const;
|
||||||
[[nodiscard]] bool isDisabledPresetClr(Edge *edge) const;
|
[[nodiscard]] bool isDisabledPresetClr(Edge *edge) const;
|
||||||
|
|
|
||||||
|
|
@ -106,6 +106,8 @@ public:
|
||||||
const Variables *variables() const { return variables_; }
|
const Variables *variables() const { return variables_; }
|
||||||
// Edge is default cond disabled by timing_disable_cond_default_arcs var.
|
// Edge is default cond disabled by timing_disable_cond_default_arcs var.
|
||||||
[[nodiscard]] bool isDisabledCondDefault(const Edge *edge) const;
|
[[nodiscard]] bool isDisabledCondDefault(const Edge *edge) const;
|
||||||
|
// Edge is disabled internal bidirect output path.
|
||||||
|
[[nodiscard]] bool isDisabledBidirectInstPath(Edge *edge) const;
|
||||||
|
|
||||||
const SceneSeq &scenes() { return scenes_; }
|
const SceneSeq &scenes() { return scenes_; }
|
||||||
const SceneSeq &scenes() const { return scenes_; }
|
const SceneSeq &scenes() const { return scenes_; }
|
||||||
|
|
|
||||||
|
|
@ -196,11 +196,13 @@ bool
|
||||||
Levelize::searchThru(Edge *edge)
|
Levelize::searchThru(Edge *edge)
|
||||||
{
|
{
|
||||||
const TimingRole *role = edge->role();
|
const TimingRole *role = edge->role();
|
||||||
return !role->isTimingCheck() && role != TimingRole::latchDtoQ()
|
return !(role->isTimingCheck()
|
||||||
&& !edge->isDisabledLoop()
|
|| role == TimingRole::latchDtoQ()
|
||||||
// Register/latch preset/clr edges are disabled by default.
|
|| edge->isDisabledLoop()
|
||||||
&& !(role == TimingRole::regSetClr() && !variables_->presetClrArcsEnabled())
|
// Register/latch preset/clr edges are disabled by default.
|
||||||
&& !(edge->isBidirectInstPath() && !variables_->bidirectInstPathsEnabled());
|
|| (role == TimingRole::regSetClr()
|
||||||
|
&& !variables_->presetClrArcsEnabled())
|
||||||
|
|| isDisabledBidirectInstPath(edge));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
|
||||||
|
|
@ -184,13 +184,14 @@ SearchAdj::searchThru(Edge *edge,
|
||||||
{
|
{
|
||||||
const TimingRole *role = edge->role();
|
const TimingRole *role = edge->role();
|
||||||
const Variables *variables = sta_->variables();
|
const Variables *variables = sta_->variables();
|
||||||
return !role->isTimingCheck()
|
return !(role->isTimingCheck()
|
||||||
&& !role->isLatchDtoQ()
|
|| role->isLatchDtoQ()
|
||||||
// Register/latch preset/clr edges are disabled by default.
|
// Register/latch preset/clr edges are disabled by default.
|
||||||
&& !(role == TimingRole::regSetClr() && !variables->presetClrArcsEnabled())
|
|| (role == TimingRole::regSetClr()
|
||||||
&& !(edge->isBidirectInstPath() && !variables->bidirectInstPathsEnabled())
|
&& !variables->presetClrArcsEnabled())
|
||||||
&& (!edge->isDisabledLoop()
|
|| sta_->isDisabledBidirectInstPath(edge)
|
||||||
|| (variables->dynamicLoopBreaking() && hasPendingLoopPaths(edge)));
|
|| (edge->isDisabledLoop()
|
||||||
|
&& !(variables->dynamicLoopBreaking() && hasPendingLoopPaths(edge))));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -3228,8 +3229,10 @@ Search::isEndpoint(Vertex *vertex,
|
||||||
const Pin *pin = vertex->pin();
|
const Pin *pin = vertex->pin();
|
||||||
const Sdc *sdc = mode->sdc();
|
const Sdc *sdc = mode->sdc();
|
||||||
return hasFanin(vertex, pred, graph_, mode)
|
return hasFanin(vertex, pred, graph_, mode)
|
||||||
&& ((vertex->hasChecks() && hasEnabledChecks(vertex, mode))
|
&& ((vertex->hasChecks()
|
||||||
|| sdc->isConstrainedEnd(pin) || !hasFanout(vertex, pred, graph_, mode)
|
&& hasEnabledChecks(vertex, mode))
|
||||||
|
|| sdc->isConstrainedEnd(pin)
|
||||||
|
|| !hasFanout(vertex, pred, graph_, mode)
|
||||||
|| sdc->isPathDelayInternalTo(pin)
|
|| sdc->isPathDelayInternalTo(pin)
|
||||||
// Unconstrained paths at register clk pins.
|
// Unconstrained paths at register clk pins.
|
||||||
|| (unconstrained_paths_ && vertex->isRegClk())
|
|| (unconstrained_paths_ && vertex->isRegClk())
|
||||||
|
|
|
||||||
|
|
@ -184,6 +184,7 @@ ClkTreeSearchPred::searchThru(Edge *edge,
|
||||||
|| sdc->isDisabledConstraint(edge)
|
|| sdc->isDisabledConstraint(edge)
|
||||||
|| sdc->isDisabledCondDefault(edge)
|
|| sdc->isDisabledCondDefault(edge)
|
||||||
|| edge->isBidirectInstPath()
|
|| edge->isBidirectInstPath()
|
||||||
|
|| edge->isBidirectPortPath()
|
||||||
|| edge->isDisabledLoop());
|
|| edge->isDisabledLoop());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1702,8 +1702,10 @@ Sta::disabledEdges(const Mode *mode)
|
||||||
VertexOutEdgeIterator edge_iter(vertex, graph_);
|
VertexOutEdgeIterator edge_iter(vertex, graph_);
|
||||||
while (edge_iter.hasNext()) {
|
while (edge_iter.hasNext()) {
|
||||||
Edge *edge = edge_iter.next();
|
Edge *edge = edge_iter.next();
|
||||||
if (isDisabledConstant(edge, mode) || isDisabledCondDefault(edge)
|
if (isDisabledConstant(edge, mode)
|
||||||
|| isDisabledConstraint(edge, sdc) || edge->isDisabledLoop()
|
|| isDisabledCondDefault(edge)
|
||||||
|
|| isDisabledConstraint(edge, sdc)
|
||||||
|
|| edge->isDisabledLoop()
|
||||||
|| isDisabledPresetClr(edge))
|
|| isDisabledPresetClr(edge))
|
||||||
disabled_edges.push_back(edge);
|
disabled_edges.push_back(edge);
|
||||||
}
|
}
|
||||||
|
|
@ -1841,12 +1843,6 @@ Sta::exprConstantPins(FuncExpr *expr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
Sta::isDisabledBidirectInstPath(Edge *edge) const
|
|
||||||
{
|
|
||||||
return !variables_->bidirectInstPathsEnabled() && edge->isBidirectInstPath();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
Sta::isDisabledPresetClr(Edge *edge) const
|
Sta::isDisabledPresetClr(Edge *edge) const
|
||||||
{
|
{
|
||||||
|
|
@ -5217,8 +5213,10 @@ FanInOutSrchPred::searchThru(Edge *edge,
|
||||||
const Sim *sim = mode->sim();
|
const Sim *sim = mode->sim();
|
||||||
return searchThruRole(edge)
|
return searchThruRole(edge)
|
||||||
&& (thru_disabled_
|
&& (thru_disabled_
|
||||||
|| !(sdc->isDisabledConstraint(edge) || sim->isDisabledCond(edge)
|
|| !(sdc->isDisabledConstraint(edge)
|
||||||
|| sta_->isDisabledCondDefault(edge)))
|
|| sim->isDisabledCond(edge)
|
||||||
|
|| sta_->isDisabledCondDefault(edge)
|
||||||
|
|| sta_->isDisabledBidirectInstPath(edge)))
|
||||||
&& (thru_constants_ || sim->simTimingSense(edge) != TimingSense::none);
|
&& (thru_constants_ || sim->simTimingSense(edge) != TimingSense::none);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -31,6 +31,7 @@
|
||||||
#include "Graph.hh"
|
#include "Graph.hh"
|
||||||
#include "Mode.hh"
|
#include "Mode.hh"
|
||||||
#include "Network.hh"
|
#include "Network.hh"
|
||||||
|
#include "PortDirection.hh"
|
||||||
#include "Scene.hh"
|
#include "Scene.hh"
|
||||||
#include "Sdc.hh"
|
#include "Sdc.hh"
|
||||||
#include "TimingArc.hh"
|
#include "TimingArc.hh"
|
||||||
|
|
@ -124,6 +125,14 @@ StaState::isDisabledCondDefault(const Edge *edge) const
|
||||||
&& edge->timingArcSet()->isCondDefault();
|
&& edge->timingArcSet()->isCondDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
StaState::isDisabledBidirectInstPath(Edge *edge) const
|
||||||
|
{
|
||||||
|
return (edge->isBidirectInstPath()
|
||||||
|
|| edge->isBidirectPortPath())
|
||||||
|
&& !variables_->bidirectInstPathsEnabled();
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue