Files
OpenSTA/util/RiseFallMinMax.cc
James Cherry 902a1bff86 parasitics api update
commit 5eb41d9304fe43d22dcf32b5346a6c9705c0d0b3
Author: James Cherry <cherry@parallaxsw.com>
Date:   Thu Feb 8 11:49:16 2024 -0700

    tcl endpoint_count

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit ffb0e0a083edbbdc3753b829641ba26730d3d882
Author: James Cherry <cherry@parallaxsw.com>
Date:   Thu Feb 8 10:51:36 2024 -0700

    ArcDelayCalc::reduceParasitic

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit ed167b218ed026b0b7427301ace67c3d22cc969a
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Feb 7 22:46:40 2024 -0700

    parasitics makeResistor/capacitor rm network arg

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 41244abfcfdee20ddc9aa8ac80cac2e3e7f68146
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Feb 7 17:08:04 2024 -0700

    arnoldi coupling caps

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit a14d6880be0dc22bf008cae63ec93880c8347ccf
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Feb 7 07:28:31 2024 -0700

    parasiticLoad

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 1cacbd7da71c7f8c5ac311caabd03bb74b66e675
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Feb 7 07:21:49 2024 -0700

    parasitic resistor/capacitor index -> id

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 6c749158cc94e5a91376721a8ccb71a8a4d020d5
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 21:42:03 2024 -0700

    arnoldi

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 4ffa6002224d76321287f64448929e5ef0ec6edd
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 18:27:33 2024 -0700

    arnoldi parasitic leak

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit a9666dd7c44126b262c7bd1170db69fafa5ef327
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 17:05:24 2024 -0700

    arnoldi parasitic leak

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit eca0e8b5ea3b4dbb22a1a2ed11018e6e40229b3f
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 14:40:38 2024 -0700

    comment

    Signed-Off-by: James Cherry <cherry@parallaxsw.com>

commit 0263245b5e2412ebefbedc67babf23e1ac047c7b
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 14:24:51 2024 -0700

    CouplingCap -> Capacitor

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit f9da059814fb09c44cc3529a9a787c3c2192a4e9
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 09:31:00 2024 -0700

    rm parasitic network array if empty

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 28c2728e5f2859839818ef228aac51fd0100ae65
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Feb 6 08:13:03 2024 -0700

    parasitic resistor name -> id

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 045fd7efa3ae8b1cf07c5aa421f3119022e3895a
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 21:09:39 2024 -0700

    Map -> map

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 8f7d18eed14a8173d91fd98a4e345a16d168b0ee
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 21:04:35 2024 -0700

    ParasiticResistor, ParasiticCapacitor

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit e2df87a10febc573c77b51a22e82d2d1f6f52af9
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 17:06:34 2024 -0700

    rm ParasticNode::devices

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 07133b72b73d204d16f964472c38907c18f9758d
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 16:52:43 2024 -0700

    Parsitic network nodes instead of nodeIterator

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 48c08673b11d0c328ed7d70606b6c7a979d9d0b8
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 16:34:31 2024 -0700

    mv otherNode to Parasitics

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 99fccc76937c25c68454d8db667306bff2a142ae
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 16:29:23 2024 -0700

    ParasiticNetwork resistor/capacitor array

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 9de49992ad403d7bc3468c53201d50825d7b961c
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 09:42:01 2024 -0700

    SpefNameMap

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit f296850201debeb2cfe1fd0b9c61c3c196f00d65
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 09:11:17 2024 -0700

    comments

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 86ca29b9bdeb732c1a596c196e0c4bf91de3ee37
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Feb 5 08:29:53 2024 -0700

    rm Parasitics::reduceTo

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 880bf458d473004ee5d3dc33baa62c9e643ddaec
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Feb 4 20:15:05 2024 -0700

    loadCap

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 67322e686f4703a2a5d9cdd1dd66534814662fe4
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Feb 4 09:39:21 2024 -0700

    report_parasitic_annotation

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 8ef4e9841bca62a5879e74da83cacee70fa50b2f
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sat Feb 3 19:13:27 2024 -0700

    ParasiticAnalysisPt use string

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 109a85ab37b5a869a72738ac6a6cd84e4a1d1ac4
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sat Feb 3 18:59:02 2024 -0700

    rm ParasiticAnalysisPt::min_max_

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit bb7874537d20a1fe905779fe46d783dba14e2db6
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sat Feb 3 12:21:28 2024 -0700

    parasitics rm pole_residue pointer

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 9e1e2c484e5cd088a08afc278f25b9fcf2cc5dd9
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sat Feb 3 11:54:22 2024 -0700

    parasitics rm loads pointer

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit cb4a7f870b2371a2ac6b3ce1d340bb5d3c24791a
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sat Feb 3 08:05:55 2024 -0700

    parasitics use override

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 8e0f84c4fec0411ad3626c836710545531ef219d
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sat Feb 3 07:53:59 2024 -0700

    Parasitics::unannotatedLoads

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 6b45e369e7be158616219258e6e9a675e87fd8ca
Author: James Cherry <cherry@parallaxsw.com>
Date:   Fri Feb 2 12:27:23 2024 -0700

    format

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 27e820b36caf7867d20307c7045e86486819db6b
Author: James Cherry <cherry@parallaxsw.com>
Date:   Thu Feb 1 18:01:51 2024 -0700

    rm op_cond args

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 351ed53925c7cc9815f75c34a0320b0dc50445d4
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Jan 31 17:35:15 2024 -0700

    rm GraphDelayCalc::loadPins()

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 3341c7caff595dab0b7519ab5103958aadfe1510
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Jan 31 17:31:56 2024 -0700

    read_spef arg check

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 7d0c1e78b42e33d5298efefa87a982f28f51bc57
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Jan 31 10:53:35 2024 -0700

    arnoldi use parasitics api

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 86b39ac10e5c6556a9b0b5b7bce016884cd935ee
Author: James Cherry <cherry@parallaxsw.com>
Date:   Wed Jan 31 10:30:47 2024 -0700

    range iter

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 469fad36af69cc8b76e4dfc88a085962795d7c46
Author: James Cherry <cherry@parallaxsw.com>
Date:   Tue Jan 30 16:43:46 2024 -0700

    read_spef -reduce

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 2b88aa471f083ae895f6277c2c844e308451fff9
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Jan 29 20:31:47 2024 -0700

    Paraasitics::connectionPin() -> pin()

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 7b9ff7e228b215b3121b7e7189d9c0c18ced3ef3
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Jan 29 17:12:32 2024 -0700

    ParasiticNode::isExternal()

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 889c27af846ed1cdf76295da5262836378ab9162
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Jan 29 11:17:59 2024 -0700

    rm redundant op_cond arg

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 7d7ce5e7809bc80f36dd81cb05615a87433ed315
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Jan 29 11:03:42 2024 -0700

    mv estimatePiElmore to Parasitics

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 04e1757b3c8b4e9f5cffbe3b03214fc065fb1c2c
Author: James Cherry <cherry@parallaxsw.com>
Date:   Mon Jan 29 09:09:28 2024 -0700

    ParasiticNode un-virtual

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 016ce50f82cbb68f9536d3ed5fd511b2f82f4439
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 17:26:04 2024 -0700

    parasitics coupling cap api

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 1748629fb462b24b43002ecd3fe1679d367752f4
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 11:12:46 2024 -0700

    Parasitics::value rm ap arg

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 1272cb86bcae5960c9af7d589f99f1488aa0b322
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 11:10:57 2024 -0700

    read_spef rm -quiet arg

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 3d86a9d86115dde5f20eb4bb8ca15f0c85de5810
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 11:01:24 2024 -0700

    reduce min_max arg

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit f7abfd5e72e0f74b9ffabf6306bbf809b62d4e98
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 10:59:29 2024 -0700

    rm spef_reader

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit e3550523b1964b2137419240f748a0b44c3322b6
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 10:58:24 2024 -0700

    reducers rm op_cond arg

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit cec793accb3db5c41cdb51f85c8530ffc1e085db
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 10:08:45 2024 -0700

    rm NullParastics

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

commit 6596d35f6da51cbacb2c21588715773d3b5edb64
Author: James Cherry <cherry@parallaxsw.com>
Date:   Sun Jan 28 10:03:29 2024 -0700

    ArcDelayCalc::reduceParasitic

    Signed-off-by: James Cherry <cherry@parallaxsw.com>

Signed-off-by: James Cherry <cherry@parallaxsw.com>
2024-02-08 13:54:52 -07:00

312 lines
7.7 KiB
C++

// OpenSTA, Static Timing Analyzer
// Copyright (c) 2024, 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 <https://www.gnu.org/licenses/>.
#include "RiseFallMinMax.hh"
namespace sta {
RiseFallMinMax::RiseFallMinMax()
{
clear();
}
void
RiseFallMinMax::clear()
{
for (int rf_index = 0; rf_index<RiseFall::index_count; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
exists_[rf_index][mm_index] = false;
}
}
}
RiseFallMinMax::RiseFallMinMax(float init_value)
{
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
values_[rf_index][mm_index] = init_value;
exists_[rf_index][mm_index] = true;
}
}
}
RiseFallMinMax::RiseFallMinMax(const RiseFallMinMax *rfmm)
{
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
values_[rf_index][mm_index] = rfmm->values_[rf_index][mm_index];
exists_[rf_index][mm_index] = rfmm->exists_[rf_index][mm_index];
}
}
}
void
RiseFallMinMax::setValue(float value)
{
setValue(RiseFallBoth::riseFall(), MinMaxAll::all(), value);
}
void
RiseFallMinMax::setValue(const RiseFallBoth *rf,
const MinMaxAll *min_max,
float value)
{
for (auto rf_index : rf->rangeIndex()) {
for (auto mm_index : min_max->rangeIndex()) {
values_[rf_index][mm_index] = value;
exists_[rf_index][mm_index] = true;
}
}
}
void
RiseFallMinMax::removeValue(const RiseFallBoth *rf,
const MinMax *min_max)
{
int mm_index = min_max->index();
for (auto rf_index : rf->rangeIndex())
exists_[rf_index][mm_index] = false;
}
void
RiseFallMinMax::removeValue(const RiseFallBoth *rf,
const MinMaxAll *min_max)
{
for (auto mm : min_max->range())
removeValue(rf, mm);
}
void
RiseFallMinMax::mergeValue(const RiseFallBoth *rf,
const MinMaxAll *min_max,
float value)
{
for (auto rf_index : rf->rangeIndex()) {
for (auto mm : min_max->range()) {
int mm_index = mm->index();
if (!exists_[rf_index][mm_index]
|| mm->compare(value, values_[rf_index][mm_index])) {
values_[rf_index][mm_index] = value;
exists_[rf_index][mm_index] = true;
}
}
}
}
void
RiseFallMinMax::mergeValue(const RiseFall *rf,
const MinMax *min_max,
float value)
{
int rf_index = rf->index();
int mm_index = min_max->index();
if (!exists_[rf_index][mm_index]
|| min_max->compare(value, values_[rf_index][mm_index])) {
values_[rf_index][mm_index] = value;
exists_[rf_index][mm_index] = true;
}
}
void
RiseFallMinMax::setValue(const RiseFallBoth *rf,
const MinMax *min_max,
float value)
{
int mm_index = min_max->index();
for (auto rf_index : rf->rangeIndex()) {
values_[rf_index][mm_index] = value;
exists_[rf_index][mm_index] = true;
}
}
void
RiseFallMinMax::setValue(const RiseFall *rf,
const MinMax *min_max,
float value)
{
int rf_index = rf->index();
int mm_index = min_max->index();
values_[rf_index][mm_index] = value;
exists_[rf_index][mm_index] = true;
}
void
RiseFallMinMax::setValues(RiseFallMinMax *values)
{
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
values_[rf_index][mm_index] = values->values_[rf_index][mm_index];
exists_[rf_index][mm_index] = values->exists_[rf_index][mm_index];
}
}
}
void
RiseFallMinMax::value(const RiseFall *rf,
const MinMax *min_max,
// Return values.
float &value,
bool &exists) const
{
exists = exists_[rf->index()][min_max->index()];
if (exists)
value = values_[rf->index()][min_max->index()];
}
float
RiseFallMinMax::value(const MinMax *min_max) const
{
int mm_index = min_max->index();
float rise = values_[RiseFall::riseIndex()][mm_index];
float fall = values_[RiseFall::fallIndex()][mm_index];
if (min_max->compare(rise, fall))
return rise;
else
return fall;
}
float
RiseFallMinMax::value(const RiseFall *rf,
const MinMax *min_max) const
{
return values_[rf->index()][min_max->index()];
}
bool
RiseFallMinMax::hasValue() const
{
return !empty();
}
void
RiseFallMinMax::maxValue(// Return values
float &max_value,
bool &exists) const
{
max_value = MinMax::max()->initValue();
exists = false;
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
if (exists_[rf_index][mm_index]) {
max_value = std::max(max_value, values_[rf_index][mm_index]);
exists = true;
}
}
}
}
bool
RiseFallMinMax::empty() const
{
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
if (exists_[rf_index][mm_index])
return false;
}
}
return true;
}
bool
RiseFallMinMax::hasValue(const RiseFall *rf, const MinMax *min_max) const
{
return exists_[rf->index()][min_max->index()];
}
void
RiseFallMinMax::mergeWith(RiseFallMinMax *rfmm)
{
for (MinMax *min_max : MinMax::range()) {
int mm_index = min_max->index();
for (int rf_index : RiseFall::rangeIndex()) {
bool exists1 = exists_[rf_index][mm_index];
bool exists2 = rfmm->exists_[rf_index][mm_index];
if (exists1 && exists2) {
float rfmm_value = rfmm->values_[rf_index][mm_index];
if (min_max->compare(rfmm_value, values_[rf_index][mm_index]))
values_[rf_index][mm_index] = rfmm_value;
}
else if (!exists1 && exists2) {
values_[rf_index][mm_index] = rfmm->values_[rf_index][mm_index];
exists_[rf_index][mm_index] = true;
}
}
}
}
bool
RiseFallMinMax::equal(const RiseFallMinMax *values) const
{
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index = 0; mm_index < MinMax::index_count; mm_index++) {
bool exists1 = exists_[rf_index][mm_index];
bool exists2 = values->exists_[rf_index][mm_index];
if (exists1 != exists2)
return false;
if (exists1 && exists2
&& values_[rf_index][mm_index] != values->values_[rf_index][mm_index])
return false;
}
}
return true;
}
bool
RiseFallMinMax::isOneValue() const
{
float value;
return isOneValue(value);
}
bool
RiseFallMinMax::isOneValue(float &value) const
{
if (exists_[0][0]) {
value = values_[0][0];
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
for (int mm_index=0; mm_index<MinMax::index_count;mm_index++) {
if (!exists_[rf_index][mm_index]
|| values_[rf_index][mm_index] != value)
return false;
}
}
return true;
}
else
return false;
}
bool
RiseFallMinMax::isOneValue(const MinMax *min_max,
// Return values.
float &value) const
{
int mm_index = min_max->index();
if (exists_[0][mm_index]) {
value = values_[0][mm_index];
for (int rf_index = 0 ; rf_index < RiseFall::index_count ; rf_index++) {
if (!exists_[rf_index][mm_index]
|| values_[rf_index][mm_index] != value)
return false;
}
return true;
}
else
return false;
}
} // namespace