exception -from/-to [all_regs] speedup

Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
James Cherry 2024-07-25 08:18:36 -07:00
parent 287623b23f
commit 710d5be4ed
8 changed files with 24 additions and 19 deletions

View File

@ -49,6 +49,8 @@ public:
int priority,
const char *comment);
virtual ~ExceptionPath();
size_t id() const { return id_; }
void setId(size_t id);
virtual bool isFalse() const { return false; }
virtual bool isLoop() const { return false; }
virtual bool isMultiCycle() const { return false; }
@ -128,6 +130,7 @@ protected:
const MinMaxAll *min_max_;
bool own_pts_;
int priority_;
size_t id_; // Unique ID assigned by Sdc.
ExceptionState *states_;
};

View File

@ -1369,6 +1369,7 @@ protected:
InstanceSet disabled_clk_gating_checks_inst_;
PinSet disabled_clk_gating_checks_pin_;
ExceptionPathSet exceptions_;
size_t exception_id_; // Unique ID for exceptions.
bool have_thru_hpin_exceptions_;
// First pin/clock/instance/net/edge exception point to exception set map.

View File

@ -107,12 +107,8 @@ class ExceptionState;
class ExceptionStateLess
{
public:
ExceptionStateLess(const Network *network);
bool operator()(const ExceptionState *state1,
const ExceptionState *state2) const;
private:
const Network *network_;
};
class ExceptionPath;

View File

@ -90,7 +90,8 @@ ExceptionPath::ExceptionPath(ExceptionFrom *from,
to_(to),
min_max_(min_max),
own_pts_(own_pts),
priority_(priority)
priority_(priority),
id_(0)
{
makeStates();
}
@ -125,6 +126,12 @@ ExceptionPath::asString(const Network *network) const
return result;
}
void
ExceptionPath::setId(size_t id)
{
id_ = id;
}
ExceptionPt *
ExceptionPath::firstPt()
{
@ -2247,19 +2254,14 @@ ExceptionState::hash() const
return hashSum(exception_->hash(), index_);
}
ExceptionStateLess::ExceptionStateLess(const Network *network) :
network_(network)
{
}
bool
ExceptionStateLess::operator()(const ExceptionState *state1,
const ExceptionState *state2) const
{
const ExceptionPath *except1 = state1->exception();
const ExceptionPath *except2 = state2->exception();
ExceptionPathLess except_less(network_);
return except_less(except1, except2)
return except1->id() < except2->id()
//return except1 < except2
|| (except1 == except2
&& state1->index() < state2->index());
}

View File

@ -110,6 +110,7 @@ Sdc::Sdc(StaState *sta) :
disabled_wire_edges_(network_),
disabled_clk_gating_checks_inst_(network_),
disabled_clk_gating_checks_pin_(network_),
exception_id_(0),
have_thru_hpin_exceptions_(false),
first_thru_edge_exceptions_(0, PinPairHash(network_), PinPairEqual()),
path_delay_internal_startpoints_(network_),
@ -4552,6 +4553,7 @@ void
Sdc::recordException(ExceptionPath *exception)
{
exceptions_.insert(exception);
exception->setId(++exception_id_);
recordMergeHashes(exception);
recordExceptionFirstPts(exception);
checkForThruHpins(exception);
@ -4813,6 +4815,7 @@ void
Sdc::deleteExceptions()
{
exceptions_.deleteContentsClear();
exception_id_ = 0;
first_from_pin_exceptions_.deleteContentsClear();
first_from_clk_exceptions_.deleteContentsClear();
@ -5203,7 +5206,7 @@ Sdc::exceptionFromStates(const ExceptionPathSet *exceptions,
// but flush all other exception states because they are lower
// priority.
if (states == nullptr)
states = new ExceptionStateSet(network_);
states = new ExceptionStateSet();
states->clear();
states->insert(state);
// No need to examine other exceptions from this
@ -5211,7 +5214,7 @@ Sdc::exceptionFromStates(const ExceptionPathSet *exceptions,
return false;
}
if (states == nullptr)
states = new ExceptionStateSet(network_);
states = new ExceptionStateSet();
states->insert(state);
}
}
@ -5258,7 +5261,7 @@ Sdc::filterRegQStates(const Pin *to_pin,
&& exception->matchesFirstPt(to_rf, min_max)) {
ExceptionState *state = exception->firstState();
if (states == nullptr)
states = new ExceptionStateSet(network_);
states = new ExceptionStateSet();
states->insert(state);
}
}
@ -5302,7 +5305,7 @@ Sdc::exceptionThruStates(const ExceptionPathSet *exceptions,
if (exception->matchesFirstPt(to_rf, min_max)) {
ExceptionState *state = exception->firstState();
if (states == nullptr)
states = new ExceptionStateSet(network_);
states = new ExceptionStateSet();
states->insert(state);
}
}

View File

@ -703,7 +703,7 @@ Genclks::makeTag(const Clock *gclk,
// from the get go.
if (master_pin == gclk->srcPin())
state = state->nextState();
ExceptionStateSet *states = new ExceptionStateSet(network_);
ExceptionStateSet *states = new ExceptionStateSet();
states->insert(state);
ClkInfo *clk_info = search_->findClkInfo(master_clk->edge(master_rf),
master_pin, true, nullptr, true,

View File

@ -428,7 +428,7 @@ PrevPathVisitor::unfilteredTag(const Tag *tag) const
ExceptionPath *except = state->exception();
if (!except->isFilter()) {
if (unfiltered_states == nullptr)
unfiltered_states = new ExceptionStateSet(network_);
unfiltered_states = new ExceptionStateSet();
unfiltered_states->insert(state);
}
}

View File

@ -2563,7 +2563,7 @@ Search::mutateTag(Tag *from_tag,
// Second pass to apply state changes and add updated existing
// states to new states.
if (new_states == nullptr)
new_states = new ExceptionStateSet(network_);
new_states = new ExceptionStateSet();
for (auto state : *from_states) {
ExceptionPath *exception = state->exception();
// One edge may traverse multiple hierarchical thru pins.