Merge pull request #169 from openroadie/master
Update to latest OpenSTA
This commit is contained in:
commit
2609cc89ee
16
README.md
16
README.md
|
|
@ -63,7 +63,7 @@ open source projects are. The copyright and develpment are exclusive to Parallax
|
||||||
Software. OpenSTA does not accept external code contributions.
|
Software. OpenSTA does not accept external code contributions.
|
||||||
|
|
||||||
The official git repository is located at
|
The official git repository is located at
|
||||||
https://github.com/jjcherry56/OpenSTA.git. Any forks from this code
|
https://github.com/parallaxsw/OpenSTA.git. Any forks from this code
|
||||||
base have not passed extensive regression testing which is not
|
base have not passed extensive regression testing which is not
|
||||||
publicly available.
|
publicly available.
|
||||||
|
|
||||||
|
|
@ -78,14 +78,14 @@ work, but these are the versions used for development.
|
||||||
|
|
||||||
```
|
```
|
||||||
from Ubuntu Xcode
|
from Ubuntu Xcode
|
||||||
18.04.1 11.3
|
22.04.2 11.3
|
||||||
cmake 3.10.2 3.10.2 3.16.2
|
cmake 3.10.2 3.24.2 3.16.2
|
||||||
clang 9.1.0 11.0.0
|
clang 9.1.0 14.0.3
|
||||||
gcc 3.3.2 7.3.0
|
gcc 3.3.2 11.3.0
|
||||||
tcl 8.4 8.6 8.6.6
|
tcl 8.4 8.6 8.6.6
|
||||||
swig 1.3.28 3.0.12 4.0.1
|
swig 1.3.28 4.1.0 4.0.1
|
||||||
bison 1.35 3.0.4 3.5
|
bison 1.35 3.0.2 3.8.2
|
||||||
flex 2.5.4 2.6.4 2.5.35
|
flex 2.5.4 2.6.4 2.6.4
|
||||||
```
|
```
|
||||||
|
|
||||||
Note that flex versions before 2.6.4 contain 'register' declarations that
|
Note that flex versions before 2.6.4 contain 'register' declarations that
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
#include "StaMain.hh"
|
#include "StaMain.hh"
|
||||||
|
|
||||||
#include <tcl.h>
|
#include <tcl.h>
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
|
||||||
#include "Machine.hh"
|
#include "Machine.hh"
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#include "ArnoldiDelayCalc.hh"
|
#include "ArnoldiDelayCalc.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <cmath> // abs
|
#include <cmath> // abs
|
||||||
|
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
|
|
|
||||||
|
|
@ -20,11 +20,6 @@
|
||||||
|
|
||||||
#include "ArnoldiReduce.hh"
|
#include "ArnoldiReduce.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <math.h>
|
|
||||||
|
|
||||||
#include "Debug.hh"
|
#include "Debug.hh"
|
||||||
#include "MinMax.hh"
|
#include "MinMax.hh"
|
||||||
#include "Sdc.hh"
|
#include "Sdc.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#include "LumpedCapDelayCalc.hh"
|
#include "LumpedCapDelayCalc.hh"
|
||||||
|
|
||||||
|
#include <cmath> // isnan
|
||||||
|
|
||||||
#include "Debug.hh"
|
#include "Debug.hh"
|
||||||
#include "Units.hh"
|
#include "Units.hh"
|
||||||
#include "TimingArc.hh"
|
#include "TimingArc.hh"
|
||||||
|
|
@ -29,6 +31,8 @@
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
using std::isnan;
|
||||||
|
|
||||||
ArcDelayCalc *
|
ArcDelayCalc *
|
||||||
makeLumpedCapDelayCalc(StaState *sta)
|
makeLumpedCapDelayCalc(StaState *sta)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "MinMax.hh"
|
#include "MinMax.hh"
|
||||||
#include "LibertyClass.hh"
|
#include "LibertyClass.hh"
|
||||||
#include "NetworkClass.hh"
|
#include "NetworkClass.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string.h> // memcpy
|
#include <cstring> // memcpy
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "ObjectId.hh"
|
#include "ObjectId.hh"
|
||||||
|
|
|
||||||
|
|
@ -82,8 +82,6 @@ public:
|
||||||
const char *filename(const Cell *cell) override;
|
const char *filename(const Cell *cell) override;
|
||||||
Port *findPort(const Cell *cell,
|
Port *findPort(const Cell *cell,
|
||||||
const char *name) const override;
|
const char *name) const override;
|
||||||
PortSeq findPortsMatching(const Cell *cell,
|
|
||||||
const PatternMatch *pattern) const override;
|
|
||||||
bool isLeaf(const Cell *cell) const override;
|
bool isLeaf(const Cell *cell) const override;
|
||||||
CellPortIterator *portIterator(const Cell *cell) const override;
|
CellPortIterator *portIterator(const Cell *cell) const override;
|
||||||
CellPortBitIterator *portBitIterator(const Cell *cell) const override;
|
CellPortBitIterator *portBitIterator(const Cell *cell) const override;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <cstdarg>
|
||||||
|
|
||||||
#include "Map.hh"
|
#include "Map.hh"
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -61,7 +61,8 @@ public:
|
||||||
ExceptionThruSeq *thrus() const { return thrus_; }
|
ExceptionThruSeq *thrus() const { return thrus_; }
|
||||||
ExceptionTo *to() const { return to_; }
|
ExceptionTo *to() const { return to_; }
|
||||||
ExceptionPt *firstPt();
|
ExceptionPt *firstPt();
|
||||||
bool intersectsPts(ExceptionPath *exception) const;
|
bool intersectsPts(ExceptionPath *exception,
|
||||||
|
const Network *network) const;
|
||||||
const MinMaxAll *minMax() const { return min_max_; }
|
const MinMaxAll *minMax() const { return min_max_; }
|
||||||
virtual bool matches(const MinMax *min_max,
|
virtual bool matches(const MinMax *min_max,
|
||||||
bool exact) const;
|
bool exact) const;
|
||||||
|
|
@ -71,7 +72,8 @@ public:
|
||||||
virtual bool resetMatch(ExceptionFrom *from,
|
virtual bool resetMatch(ExceptionFrom *from,
|
||||||
ExceptionThruSeq *thrus,
|
ExceptionThruSeq *thrus,
|
||||||
ExceptionTo *to,
|
ExceptionTo *to,
|
||||||
const MinMaxAll *min_max);
|
const MinMaxAll *min_max,
|
||||||
|
const Network *network);
|
||||||
// The priority remains the same even though pin/clock/net/inst objects
|
// The priority remains the same even though pin/clock/net/inst objects
|
||||||
// are added to the exceptions points during exception merging because
|
// are added to the exceptions points during exception merging because
|
||||||
// only exceptions with the same priority are merged.
|
// only exceptions with the same priority are merged.
|
||||||
|
|
@ -262,7 +264,8 @@ public:
|
||||||
virtual bool resetMatch(ExceptionFrom *from,
|
virtual bool resetMatch(ExceptionFrom *from,
|
||||||
ExceptionThruSeq *thrus,
|
ExceptionThruSeq *thrus,
|
||||||
ExceptionTo *to,
|
ExceptionTo *to,
|
||||||
const MinMaxAll *min_max);
|
const MinMaxAll *min_max,
|
||||||
|
const Network *network);
|
||||||
virtual int typePriority() const;
|
virtual int typePriority() const;
|
||||||
virtual bool tighterThan(ExceptionPath *exception) const;
|
virtual bool tighterThan(ExceptionPath *exception) const;
|
||||||
};
|
};
|
||||||
|
|
@ -424,7 +427,8 @@ public:
|
||||||
const Network *network);
|
const Network *network);
|
||||||
ExceptionFrom *clone(const Network *network);
|
ExceptionFrom *clone(const Network *network);
|
||||||
virtual bool isFrom() const { return true; }
|
virtual bool isFrom() const { return true; }
|
||||||
bool intersectsPts(ExceptionFrom *from) const;
|
bool intersectsPts(ExceptionFrom *from,
|
||||||
|
const Network *network) const;
|
||||||
virtual int typePriority() const { return 0; }
|
virtual int typePriority() const { return 0; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -448,7 +452,8 @@ public:
|
||||||
virtual bool isTo() const { return true; }
|
virtual bool isTo() const { return true; }
|
||||||
const char *asString(const Network *network) const;
|
const char *asString(const Network *network) const;
|
||||||
const RiseFallBoth *endTransition() { return end_rf_; }
|
const RiseFallBoth *endTransition() { return end_rf_; }
|
||||||
bool intersectsPts(ExceptionTo *to) const;
|
bool intersectsPts(ExceptionTo *to,
|
||||||
|
const Network *network) const;
|
||||||
virtual int typePriority() const { return 1; }
|
virtual int typePriority() const { return 1; }
|
||||||
bool matches(const Pin *pin,
|
bool matches(const Pin *pin,
|
||||||
const ClockEdge *clk_edge,
|
const ClockEdge *clk_edge,
|
||||||
|
|
@ -511,7 +516,8 @@ public:
|
||||||
const Network *network) const;
|
const Network *network) const;
|
||||||
virtual void mergeInto(ExceptionPt *pt,
|
virtual void mergeInto(ExceptionPt *pt,
|
||||||
const Network *network);
|
const Network *network);
|
||||||
bool intersectsPts(ExceptionThru *thru) const;
|
bool intersectsPts(ExceptionThru *thru,
|
||||||
|
const Network *network) const;
|
||||||
virtual int typePriority() const { return 2; }
|
virtual int typePriority() const { return 2; }
|
||||||
virtual size_t objectCount() const;
|
virtual size_t objectCount() const;
|
||||||
virtual void connectPinAfter(PinSet *drvrs,
|
virtual void connectPinAfter(PinSet *drvrs,
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#include "ObjectId.hh"
|
#include "ObjectId.hh"
|
||||||
#include "Set.hh"
|
#include "Set.hh"
|
||||||
#include "Vector.hh"
|
#include "Vector.hh"
|
||||||
|
|
@ -45,6 +47,8 @@ typedef int DcalcAPIndex;
|
||||||
typedef int TagGroupIndex;
|
typedef int TagGroupIndex;
|
||||||
typedef Vector<GraphLoop*> GraphLoopSeq;
|
typedef Vector<GraphLoop*> GraphLoopSeq;
|
||||||
|
|
||||||
|
static constexpr int level_max = std::numeric_limits<Level>::max();
|
||||||
|
|
||||||
// 16,777,215 tags
|
// 16,777,215 tags
|
||||||
static const int tag_group_index_bits = 24;
|
static const int tag_group_index_bits = 24;
|
||||||
static const TagGroupIndex tag_group_index_max = (1<<tag_group_index_bits)-1;
|
static const TagGroupIndex tag_group_index_max = (1<<tag_group_index_bits)-1;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "GraphClass.hh"
|
#include "GraphClass.hh"
|
||||||
#include "DcalcAnalysisPt.hh"
|
#include "DcalcAnalysisPt.hh"
|
||||||
#include "StaState.hh"
|
#include "StaState.hh"
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@
|
||||||
#define vsnprint vsnprintf
|
#define vsnprint vsnprintf
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <stddef.h> // size_t
|
#include <cstddef> // size_t
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,7 @@ public:
|
||||||
virtual Port *findPort(const Cell *cell,
|
virtual Port *findPort(const Cell *cell,
|
||||||
const char *name) const = 0;
|
const char *name) const = 0;
|
||||||
virtual PortSeq findPortsMatching(const Cell *cell,
|
virtual PortSeq findPortsMatching(const Cell *cell,
|
||||||
const PatternMatch *pattern) const = 0;
|
const PatternMatch *pattern) const;
|
||||||
virtual bool isLeaf(const Cell *cell) const = 0;
|
virtual bool isLeaf(const Cell *cell) const = 0;
|
||||||
virtual CellPortIterator *portIterator(const Cell *cell) const = 0;
|
virtual CellPortIterator *portIterator(const Cell *cell) const = 0;
|
||||||
// Iterate over port bits (expanded buses).
|
// Iterate over port bits (expanded buses).
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
|
||||||
#include "Set.hh"
|
#include "Set.hh"
|
||||||
#include "Vector.hh"
|
#include "Vector.hh"
|
||||||
#include "Iterator.hh"
|
#include "Iterator.hh"
|
||||||
|
|
@ -145,6 +146,9 @@ public:
|
||||||
static int compare(const InstanceSet *set1,
|
static int compare(const InstanceSet *set1,
|
||||||
const InstanceSet *set2,
|
const InstanceSet *set2,
|
||||||
const Network *network);
|
const Network *network);
|
||||||
|
static bool intersects(const InstanceSet *set1,
|
||||||
|
const InstanceSet *set2,
|
||||||
|
const Network *network);
|
||||||
};
|
};
|
||||||
|
|
||||||
class PinSet : public Set<const Pin*, PinIdLess>
|
class PinSet : public Set<const Pin*, PinIdLess>
|
||||||
|
|
@ -155,6 +159,9 @@ public:
|
||||||
static int compare(const PinSet *set1,
|
static int compare(const PinSet *set1,
|
||||||
const PinSet *set2,
|
const PinSet *set2,
|
||||||
const Network *network);
|
const Network *network);
|
||||||
|
static bool intersects(const PinSet *set1,
|
||||||
|
const PinSet *set2,
|
||||||
|
const Network *network);
|
||||||
};
|
};
|
||||||
|
|
||||||
class NetSet : public Set<const Net*, NetIdLess>
|
class NetSet : public Set<const Net*, NetIdLess>
|
||||||
|
|
@ -165,6 +172,9 @@ public:
|
||||||
static int compare(const NetSet *set1,
|
static int compare(const NetSet *set1,
|
||||||
const NetSet *set2,
|
const NetSet *set2,
|
||||||
const Network *network);
|
const Network *network);
|
||||||
|
static bool intersects(const NetSet *set1,
|
||||||
|
const NetSet *set2,
|
||||||
|
const Network *network);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <complex>
|
#include <complex>
|
||||||
|
|
||||||
#include "StaState.hh"
|
#include "StaState.hh"
|
||||||
#include "LibertyClass.hh"
|
#include "LibertyClass.hh"
|
||||||
#include "NetworkClass.hh"
|
#include "NetworkClass.hh"
|
||||||
|
|
|
||||||
|
|
@ -60,27 +60,32 @@ parseBusName(const char *name,
|
||||||
// bus_name is set to null if name is not a range.
|
// bus_name is set to null if name is not a range.
|
||||||
// Caller must delete returned bus_name string.
|
// Caller must delete returned bus_name string.
|
||||||
void
|
void
|
||||||
parseBusRange(const char *name,
|
parseBusName(const char *name,
|
||||||
const char brkt_left,
|
const char brkt_left,
|
||||||
const char brkt_right,
|
const char brkt_right,
|
||||||
char escape,
|
char escape,
|
||||||
// Return values.
|
// Return values.
|
||||||
bool &is_bus,
|
bool &is_bus,
|
||||||
string &bus_name,
|
bool &is_range,
|
||||||
int &from,
|
string &bus_name,
|
||||||
int &to);
|
int &from,
|
||||||
|
int &to,
|
||||||
|
bool &subscript_wild);
|
||||||
|
|
||||||
// brkt_lefts and brkt_rights are corresponding strings of legal
|
// brkt_lefts and brkt_rights are corresponding strings of legal
|
||||||
// bus brackets such as "[(<" and "])>".
|
// bus brackets such as "[(<" and "])>".
|
||||||
void
|
void
|
||||||
parseBusRange(const char *name,
|
parseBusName(const char *name,
|
||||||
const char *brkts_left,
|
const char *brkts_left,
|
||||||
const char *brkts_right,
|
const char *brkts_right,
|
||||||
const char escape,
|
const char escape,
|
||||||
// Return values.
|
// Return values.
|
||||||
bool &is_bus,
|
bool &is_bus,
|
||||||
string &bus_name,
|
bool &is_range,
|
||||||
int &from,
|
string &bus_name,
|
||||||
int &to);
|
int &from,
|
||||||
|
int &to,
|
||||||
|
bool &subscript_wild);
|
||||||
|
|
||||||
// Insert escapes before ch1 and ch2 in token.
|
// Insert escapes before ch1 and ch2 in token.
|
||||||
string
|
string
|
||||||
|
|
|
||||||
|
|
@ -66,10 +66,8 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
VertexId vertex_id_;
|
VertexId vertex_id_;
|
||||||
unsigned int tag_index_:tag_index_bits;
|
TagIndex tag_index_;
|
||||||
bool is_enum_:1;
|
bool is_enum_:1;
|
||||||
|
|
||||||
private:
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "Error.hh"
|
#include "Error.hh"
|
||||||
|
|
||||||
// Don't require all of tcl.h.
|
// Don't require all of tcl.h.
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <cstdarg>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
|
||||||
#include "Machine.hh" // __attribute__
|
#include "Machine.hh" // __attribute__
|
||||||
|
|
||||||
struct Tcl_Interp;
|
struct Tcl_Interp;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <tcl.h>
|
#include <tcl.h>
|
||||||
|
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,8 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
#include "Vector.hh"
|
#include "Vector.hh"
|
||||||
#include "Set.hh"
|
#include "Set.hh"
|
||||||
#include "Map.hh"
|
#include "Map.hh"
|
||||||
|
|
@ -97,7 +99,7 @@ protected:
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef int PathAPIndex;
|
typedef int PathAPIndex;
|
||||||
typedef unsigned TagIndex;
|
typedef uint32_t TagIndex;
|
||||||
typedef Vector<Tag*> TagSeq;
|
typedef Vector<Tag*> TagSeq;
|
||||||
typedef Vector<MinPulseWidthCheck*> MinPulseWidthCheckSeq;
|
typedef Vector<MinPulseWidthCheck*> MinPulseWidthCheckSeq;
|
||||||
typedef Vector<MinPeriodCheck*> MinPeriodCheckSeq;
|
typedef Vector<MinPeriodCheck*> MinPeriodCheckSeq;
|
||||||
|
|
@ -122,9 +124,10 @@ enum class ReportPathFormat { full,
|
||||||
json
|
json
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int tag_index_bits = 24;
|
static const TagIndex tag_index_max = std::numeric_limits<uint32_t>::max();
|
||||||
static const TagIndex tag_index_max = (1 << tag_index_bits) - 1;
|
|
||||||
static const TagIndex tag_index_null = tag_index_max;
|
static const TagIndex tag_index_null = tag_index_max;
|
||||||
static const int path_ap_index_bit_count = 4;
|
static const int path_ap_index_bit_count = 8;
|
||||||
|
// One path analysis point per corner min/max.
|
||||||
|
static const int corner_count_max = (1 << path_ap_index_bit_count) / 2;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,6 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
#include <math.h>
|
|
||||||
#include <algorithm>
|
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
@ -70,12 +68,10 @@ public:
|
||||||
this->clear();
|
this->clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
|
||||||
intersects(const std::set<KEY, CMP> &set1,
|
|
||||||
const std::set<KEY, CMP> &set2);
|
|
||||||
static bool
|
static bool
|
||||||
intersects(const std::set<KEY, CMP> *set1,
|
intersects(const std::set<KEY, CMP> *set1,
|
||||||
const std::set<KEY, CMP> *set2);
|
const std::set<KEY, CMP> *set2,
|
||||||
|
CMP key_less);
|
||||||
|
|
||||||
// Java style container itererator
|
// Java style container itererator
|
||||||
// Set::Iterator<Key*> iter(set);
|
// Set::Iterator<Key*> iter(set);
|
||||||
|
|
@ -172,47 +168,24 @@ Set<KEY, CMP>::isSubset(const std::set<KEY, CMP> *set2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class KEY, class CMP>
|
|
||||||
bool
|
|
||||||
Set<KEY, CMP>::intersects(const std::set<KEY, CMP> &set1,
|
|
||||||
const std::set<KEY, CMP> &set2)
|
|
||||||
{
|
|
||||||
return intersects(&set1, &set2);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class KEY, class CMP>
|
template <class KEY, class CMP>
|
||||||
bool
|
bool
|
||||||
Set<KEY, CMP>::intersects(const std::set<KEY, CMP> *set1,
|
Set<KEY, CMP>::intersects(const std::set<KEY, CMP> *set1,
|
||||||
const std::set<KEY, CMP> *set2)
|
const std::set<KEY, CMP> *set2,
|
||||||
|
CMP key_less)
|
||||||
{
|
{
|
||||||
if (set1 && !set1->empty()
|
if (set1 && set2) {
|
||||||
&& set2 && !set2->empty()) {
|
auto iter1 = set1->begin();
|
||||||
const std::set<KEY, CMP> *small = set1;
|
auto end1 = set1->end();
|
||||||
const std::set<KEY, CMP> *big = set2;
|
auto iter2 = set2->begin();
|
||||||
if (small->size() > big->size()) {
|
auto end2 = set2->end();
|
||||||
small = set2;
|
while (iter1 != end1 && iter2 != end2) {
|
||||||
big = set1;
|
if (key_less(*iter1, *iter2))
|
||||||
}
|
iter1++;
|
||||||
auto iter1 = big->begin();
|
else if (key_less(*iter2, *iter1))
|
||||||
auto last1 = big->end();
|
iter2++;
|
||||||
auto iter2 = small->begin();
|
else
|
||||||
auto last2 = small->end();
|
return true;
|
||||||
if (static_cast<float>(small->size() + big->size()) < (small->size() * log(static_cast<float>(big->size())))) {
|
|
||||||
while (iter1 != last1 && iter2 != last2) {
|
|
||||||
if (*iter1 < *iter2)
|
|
||||||
++iter1;
|
|
||||||
else if (*iter2 < *iter1)
|
|
||||||
++iter2;
|
|
||||||
else
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
for (/* empty */; iter2 != last2; ++iter2) {
|
|
||||||
const KEY key2 = *iter2;
|
|
||||||
if (big->find(key2) != last1)
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stddef.h> // size_t
|
#include <cstddef> // size_t
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,10 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <cstdarg>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "Machine.hh" // __attribute__
|
#include "Machine.hh" // __attribute__
|
||||||
#include "Vector.hh"
|
#include "Vector.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -362,6 +362,7 @@ public:
|
||||||
bool &extrapolated) const;
|
bool &extrapolated) const;
|
||||||
float findValue(float axis_value1) const;
|
float findValue(float axis_value1) const;
|
||||||
float findValueClip(float axis_value1) const;
|
float findValueClip(float axis_value1) const;
|
||||||
|
float findValueClipZero(float axis_value1) const;
|
||||||
FloatSeq *values() const { return values_; }
|
FloatSeq *values() const { return values_; }
|
||||||
using Table::findValue;
|
using Table::findValue;
|
||||||
|
|
||||||
|
|
@ -506,8 +507,8 @@ public:
|
||||||
Table1 *ref_times);
|
Table1 *ref_times);
|
||||||
~OutputWaveforms();
|
~OutputWaveforms();
|
||||||
const RiseFall *rf() const { return rf_; }
|
const RiseFall *rf() const { return rf_; }
|
||||||
bool inBounds(float in_slew,
|
TableAxisPtr slewAxis() const { return slew_axis_; }
|
||||||
float load_cap) const;
|
TableAxisPtr capAxis() const { return cap_axis_; }
|
||||||
Table1 voltageWaveform(float in_slew,
|
Table1 voltageWaveform(float in_slew,
|
||||||
float load_cap);
|
float load_cap);
|
||||||
float voltageTime(float in_slew,
|
float voltageTime(float in_slew,
|
||||||
|
|
@ -515,6 +516,12 @@ public:
|
||||||
float voltage);
|
float voltage);
|
||||||
const Table1 *currentWaveform(float slew,
|
const Table1 *currentWaveform(float slew,
|
||||||
float cap);
|
float cap);
|
||||||
|
float timeCurrent(float slew,
|
||||||
|
float cap,
|
||||||
|
float time);
|
||||||
|
float voltageCurrent(float slew,
|
||||||
|
float cap,
|
||||||
|
float volt);
|
||||||
float referenceTime(float slew);
|
float referenceTime(float slew);
|
||||||
void setVdd(float vdd);
|
void setVdd(float vdd);
|
||||||
static bool checkAxes(TableTemplate *tbl_template);
|
static bool checkAxes(TableTemplate *tbl_template);
|
||||||
|
|
@ -525,6 +532,10 @@ private:
|
||||||
float cap);
|
float cap);
|
||||||
FloatSeq *voltageTimes(size_t wave_index,
|
FloatSeq *voltageTimes(size_t wave_index,
|
||||||
float cap);
|
float cap);
|
||||||
|
void findVoltages(size_t wave_index,
|
||||||
|
float cap);
|
||||||
|
const Table1 *voltageCurrents(size_t wave_index,
|
||||||
|
float cap);
|
||||||
|
|
||||||
// Row.
|
// Row.
|
||||||
TableAxisPtr slew_axis_;
|
TableAxisPtr slew_axis_;
|
||||||
|
|
@ -532,6 +543,7 @@ private:
|
||||||
TableAxisPtr cap_axis_;
|
TableAxisPtr cap_axis_;
|
||||||
const RiseFall *rf_;
|
const RiseFall *rf_;
|
||||||
Table1Seq current_waveforms_;
|
Table1Seq current_waveforms_;
|
||||||
|
Table1Seq voltage_currents_;
|
||||||
FloatTable voltage_times_;
|
FloatTable voltage_times_;
|
||||||
Table1 *ref_times_;
|
Table1 *ref_times_;
|
||||||
float vdd_;
|
float vdd_;
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "Delay.hh"
|
#include "Delay.hh"
|
||||||
#include "LibertyClass.hh"
|
#include "LibertyClass.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "Iterator.hh"
|
#include "Iterator.hh"
|
||||||
#include "Map.hh"
|
#include "Map.hh"
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
|
|
|
||||||
|
|
@ -27,7 +27,7 @@
|
||||||
|
|
||||||
#else // ZLIB_FOUND
|
#else // ZLIB_FOUND
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
|
|
||||||
#define gzFile FILE*
|
#define gzFile FILE*
|
||||||
#define gzopen fopen
|
#define gzopen fopen
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
#include "liberty/LibertyParser.hh"
|
#include "liberty/LibertyParser.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "LibertyParser.hh"
|
#include "LibertyParser.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
#include "Error.hh"
|
#include "Error.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "LibertyReader.hh"
|
#include "LibertyReader.hh"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
#include "Debug.hh"
|
#include "Debug.hh"
|
||||||
|
|
@ -5637,13 +5637,13 @@ PortNameBitIterator::init(const char *port_name)
|
||||||
else {
|
else {
|
||||||
// Check for bus range.
|
// Check for bus range.
|
||||||
LibertyLibrary *library = visitor_->library();
|
LibertyLibrary *library = visitor_->library();
|
||||||
bool is_bus;
|
bool is_bus, is_range, subscript_wild;
|
||||||
string bus_name;
|
string bus_name;
|
||||||
int from, to;
|
int from, to;
|
||||||
parseBusRange(port_name, library->busBrktLeft(),
|
parseBusName(port_name, library->busBrktLeft(),
|
||||||
library->busBrktRight(), '\\',
|
library->busBrktRight(), '\\',
|
||||||
is_bus, bus_name, from, to);
|
is_bus, is_range, bus_name, from, to, subscript_wild);
|
||||||
if (is_bus) {
|
if (is_range) {
|
||||||
port = visitor_->findPort(port_name);
|
port = visitor_->findPort(port_name);
|
||||||
if (port) {
|
if (port) {
|
||||||
if (port->isBus()) {
|
if (port->isBus()) {
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "LibertyWriter.hh"
|
#include "LibertyWriter.hh"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "Units.hh"
|
#include "Units.hh"
|
||||||
|
|
|
||||||
|
|
@ -908,6 +908,27 @@ Table1::findValueClip(float axis_value1) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
Table1::findValueClipZero(float axis_value1) const
|
||||||
|
{
|
||||||
|
if (axis1_->size() == 1)
|
||||||
|
return this->value(axis_value1);
|
||||||
|
else {
|
||||||
|
size_t axis_index1 = axis1_->findAxisIndex(axis_value1);
|
||||||
|
float x1 = axis_value1;
|
||||||
|
float x1l = axis1_->axisValue(axis_index1);
|
||||||
|
float x1u = axis1_->axisValue(axis_index1 + 1);
|
||||||
|
if (x1 < x1l || x1 > x1u)
|
||||||
|
return 0.0;
|
||||||
|
else {
|
||||||
|
float y1 = this->value(axis_index1);
|
||||||
|
float y2 = this->value(axis_index1 + 1);
|
||||||
|
float dx1 = (x1 - x1l) / (x1u - x1l);
|
||||||
|
return (1 - dx1) * y1 + dx1 * y2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
string
|
string
|
||||||
Table1::reportValue(const char *result_name, const
|
Table1::reportValue(const char *result_name, const
|
||||||
LibertyLibrary *library,
|
LibertyLibrary *library,
|
||||||
|
|
@ -1592,6 +1613,7 @@ OutputWaveforms::OutputWaveforms(TableAxisPtr slew_axis,
|
||||||
cap_axis_(cap_axis),
|
cap_axis_(cap_axis),
|
||||||
rf_(rf),
|
rf_(rf),
|
||||||
current_waveforms_(current_waveforms),
|
current_waveforms_(current_waveforms),
|
||||||
|
voltage_currents_(current_waveforms.size()),
|
||||||
voltage_times_(current_waveforms.size()),
|
voltage_times_(current_waveforms.size()),
|
||||||
ref_times_(ref_times),
|
ref_times_(ref_times),
|
||||||
vdd_(0.0)
|
vdd_(0.0)
|
||||||
|
|
@ -1601,6 +1623,7 @@ OutputWaveforms::OutputWaveforms(TableAxisPtr slew_axis,
|
||||||
OutputWaveforms::~OutputWaveforms()
|
OutputWaveforms::~OutputWaveforms()
|
||||||
{
|
{
|
||||||
current_waveforms_.deleteContents();
|
current_waveforms_.deleteContents();
|
||||||
|
voltage_currents_.deleteContents();
|
||||||
voltage_times_.deleteContents();
|
voltage_times_.deleteContents();
|
||||||
delete ref_times_;
|
delete ref_times_;
|
||||||
}
|
}
|
||||||
|
|
@ -1622,14 +1645,6 @@ OutputWaveforms::checkAxes(TableTemplate *tbl_template)
|
||||||
&& axis3->variable() == TableAxisVariable::time);
|
&& axis3->variable() == TableAxisVariable::time);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
|
||||||
OutputWaveforms::inBounds(float in_slew,
|
|
||||||
float load_cap) const
|
|
||||||
{
|
|
||||||
return slew_axis_->inBounds(in_slew)
|
|
||||||
&& cap_axis_->inBounds(load_cap);
|
|
||||||
}
|
|
||||||
|
|
||||||
const Table1 *
|
const Table1 *
|
||||||
OutputWaveforms::currentWaveform(float slew,
|
OutputWaveforms::currentWaveform(float slew,
|
||||||
float cap)
|
float cap)
|
||||||
|
|
@ -1640,6 +1655,48 @@ OutputWaveforms::currentWaveform(float slew,
|
||||||
return current_waveforms_[wave_index];
|
return current_waveforms_[wave_index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
OutputWaveforms::timeCurrent(float slew,
|
||||||
|
float cap,
|
||||||
|
float time)
|
||||||
|
{
|
||||||
|
size_t slew_index = slew_axis_->findAxisIndex(slew);
|
||||||
|
size_t cap_index = cap_axis_->findAxisIndex(cap);
|
||||||
|
size_t slew_count = slew_axis_->size();
|
||||||
|
size_t wave_index00 = slew_index * slew_count + cap_index;
|
||||||
|
size_t wave_index01 = slew_index * slew_count + (cap_index + 1);
|
||||||
|
size_t wave_index10 = (slew_index + 1) * slew_count + cap_index;
|
||||||
|
size_t wave_index11 = (slew_index + 1) * slew_count + (cap_index + 1);
|
||||||
|
|
||||||
|
const Table1 *waveform00 = current_waveforms_[wave_index00];
|
||||||
|
const Table1 *waveform01 = current_waveforms_[wave_index01];
|
||||||
|
const Table1 *waveform10 = current_waveforms_[wave_index10];
|
||||||
|
const Table1 *waveform11 = current_waveforms_[wave_index11];
|
||||||
|
|
||||||
|
// Interpolate waveform samples at voltage steps.
|
||||||
|
size_t index1 = slew_index;
|
||||||
|
size_t index2 = cap_index;
|
||||||
|
float x1 = slew;
|
||||||
|
float x2 = cap;
|
||||||
|
float x1l = slew_axis_->axisValue(index1);
|
||||||
|
float x1u = slew_axis_->axisValue(index1 + 1);
|
||||||
|
float dx1 = (x1 - x1l) / (x1u - x1l);
|
||||||
|
float x2l = cap_axis_->axisValue(index2);
|
||||||
|
float x2u = cap_axis_->axisValue(index2 + 1);
|
||||||
|
float dx2 = (x2 - x2l) / (x2u - x2l);
|
||||||
|
|
||||||
|
float y00 = waveform00->findValueClipZero(time);
|
||||||
|
float y01 = waveform01->findValueClipZero(time);
|
||||||
|
float y10 = waveform10->findValueClipZero(time);
|
||||||
|
float y11 = waveform11->findValueClipZero(time);
|
||||||
|
float current
|
||||||
|
= (1 - dx1) * (1 - dx2) * y00
|
||||||
|
+ dx1 * (1 - dx2) * y10
|
||||||
|
+ dx1 * dx2 * y11
|
||||||
|
+ (1 - dx1) * dx2 * y01;
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
OutputWaveforms::referenceTime(float slew)
|
OutputWaveforms::referenceTime(float slew)
|
||||||
{
|
{
|
||||||
|
|
@ -1652,6 +1709,23 @@ OutputWaveforms::setVdd(float vdd)
|
||||||
vdd_ = vdd;
|
vdd_ = vdd;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Table1
|
||||||
|
OutputWaveforms::voltageWaveform(float slew,
|
||||||
|
float cap)
|
||||||
|
{
|
||||||
|
float volt_step = vdd_ / voltage_waveform_step_count_;
|
||||||
|
FloatSeq *times = new FloatSeq;
|
||||||
|
FloatSeq *volts = new FloatSeq;
|
||||||
|
for (size_t v = 0; v <= voltage_waveform_step_count_; v++) {
|
||||||
|
float volt = v * volt_step;
|
||||||
|
float time = voltageTime(slew, cap, volt);
|
||||||
|
times->push_back(time);
|
||||||
|
volts->push_back(volt);
|
||||||
|
}
|
||||||
|
TableAxisPtr time_axis = make_shared<TableAxis>(TableAxisVariable::time, times);
|
||||||
|
return Table1(volts, time_axis);
|
||||||
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
OutputWaveforms::voltageTime(float slew,
|
OutputWaveforms::voltageTime(float slew,
|
||||||
float cap,
|
float cap,
|
||||||
|
|
@ -1691,23 +1765,6 @@ OutputWaveforms::voltageTime(float slew,
|
||||||
return time;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
Table1
|
|
||||||
OutputWaveforms::voltageWaveform(float slew,
|
|
||||||
float cap)
|
|
||||||
{
|
|
||||||
float volt_step = vdd_ / voltage_waveform_step_count_;
|
|
||||||
FloatSeq *times = new FloatSeq;
|
|
||||||
FloatSeq *volts = new FloatSeq;
|
|
||||||
for (size_t v = 0; v <= voltage_waveform_step_count_; v++) {
|
|
||||||
float volt = v * volt_step;
|
|
||||||
float time = voltageTime(slew, cap, volt);
|
|
||||||
times->push_back(time);
|
|
||||||
volts->push_back(volt);
|
|
||||||
}
|
|
||||||
TableAxisPtr time_axis = make_shared<TableAxis>(TableAxisVariable::time, times);
|
|
||||||
return Table1(volts, time_axis);
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
float
|
||||||
OutputWaveforms::voltageTime1(float voltage,
|
OutputWaveforms::voltageTime1(float voltage,
|
||||||
size_t wave_index,
|
size_t wave_index,
|
||||||
|
|
@ -1728,57 +1785,128 @@ OutputWaveforms::voltageTimes(size_t wave_index,
|
||||||
{
|
{
|
||||||
FloatSeq *voltage_times = voltage_times_[wave_index];
|
FloatSeq *voltage_times = voltage_times_[wave_index];
|
||||||
if (voltage_times == nullptr) {
|
if (voltage_times == nullptr) {
|
||||||
// Integrate current waveform to find voltage waveform.
|
findVoltages(wave_index, cap);
|
||||||
// i = C dv/dt
|
voltage_times = voltage_times_[wave_index];
|
||||||
FloatSeq volts;
|
|
||||||
Table1 *currents = current_waveforms_[wave_index];
|
|
||||||
TableAxisPtr time_axis = currents->axis1();
|
|
||||||
float prev_time = time_axis->axisValue(0);
|
|
||||||
float prev_current = currents->value(0);
|
|
||||||
float voltage = 0.0;
|
|
||||||
volts.push_back(voltage);
|
|
||||||
bool always_rise = true;
|
|
||||||
bool invert = (always_rise && rf_ == RiseFall::fall());
|
|
||||||
for (size_t i = 1; i < time_axis->size(); i++) {
|
|
||||||
float time = time_axis->axisValue(i);
|
|
||||||
float current = currents->value(i);
|
|
||||||
float dv = (current + prev_current) / 2.0 * (time - prev_time) / cap;
|
|
||||||
voltage += invert ? -dv : dv;
|
|
||||||
volts.push_back(voltage);
|
|
||||||
prev_time = time;
|
|
||||||
prev_current = current;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sample the voltage waveform at uniform intervals to speed up
|
|
||||||
// voltage time lookup.
|
|
||||||
voltage_times = new FloatSeq;
|
|
||||||
float volt_step = vdd_ / voltage_waveform_step_count_;
|
|
||||||
size_t i = 0;
|
|
||||||
float time0 = time_axis->axisValue(i);
|
|
||||||
float volt0 = volts[i];
|
|
||||||
i = 1;
|
|
||||||
float time1 = time_axis->axisValue(i);
|
|
||||||
float volt1 = volts[i];
|
|
||||||
for (size_t v = 0; v <= voltage_waveform_step_count_; v++) {
|
|
||||||
float volt3 = v * volt_step;
|
|
||||||
while (volt3 > volt1 && i < volts.size() - 1) {
|
|
||||||
time0 = time1;
|
|
||||||
volt0 = volt1;
|
|
||||||
i++;
|
|
||||||
time1 = time_axis->axisValue(i);
|
|
||||||
volt1 = volts[i];
|
|
||||||
}
|
|
||||||
float time3 = time0 + (time1 - time0) * (volt3 - volt0) / (volt1 - volt0);
|
|
||||||
if (time3 < 0.0)
|
|
||||||
printf("luse\n");
|
|
||||||
//printf("%.2f %.2e\n", volt3, time3);
|
|
||||||
voltage_times->push_back(time3);
|
|
||||||
}
|
|
||||||
voltage_times_[wave_index] = voltage_times;
|
|
||||||
}
|
}
|
||||||
return voltage_times;
|
return voltage_times;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
OutputWaveforms::findVoltages(size_t wave_index,
|
||||||
|
float cap)
|
||||||
|
{
|
||||||
|
if (vdd_ == 0.0)
|
||||||
|
criticalError(239, "output waveform vdd = 0.0");
|
||||||
|
// Integrate current waveform to find voltage waveform.
|
||||||
|
// i = C dv/dt
|
||||||
|
FloatSeq volts;
|
||||||
|
Table1 *currents = current_waveforms_[wave_index];
|
||||||
|
TableAxisPtr time_axis = currents->axis1();
|
||||||
|
float prev_time = time_axis->axisValue(0);
|
||||||
|
float prev_current = currents->value(0);
|
||||||
|
float voltage = 0.0;
|
||||||
|
volts.push_back(voltage);
|
||||||
|
bool always_rise = true;
|
||||||
|
bool invert = (always_rise && rf_ == RiseFall::fall());
|
||||||
|
for (size_t i = 1; i < time_axis->size(); i++) {
|
||||||
|
float time = time_axis->axisValue(i);
|
||||||
|
float current = currents->value(i);
|
||||||
|
float dv = (current + prev_current) / 2.0 * (time - prev_time) / cap;
|
||||||
|
voltage += invert ? -dv : dv;
|
||||||
|
volts.push_back(voltage);
|
||||||
|
prev_time = time;
|
||||||
|
prev_current = current;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Make voltage -> current table.
|
||||||
|
FloatSeq *axis_volts = new FloatSeq(volts);
|
||||||
|
TableAxisPtr volt_axis =
|
||||||
|
make_shared<TableAxis>(TableAxisVariable::input_voltage, axis_volts);
|
||||||
|
FloatSeq *currents1 = new FloatSeq(*currents->values());
|
||||||
|
Table1 *volt_currents = new Table1(currents1, volt_axis);
|
||||||
|
voltage_currents_[wave_index] = volt_currents;
|
||||||
|
|
||||||
|
// Sample the voltage waveform at uniform intervals to speed up
|
||||||
|
// voltage time lookup.
|
||||||
|
FloatSeq *voltage_times = new FloatSeq;
|
||||||
|
float volt_step = vdd_ / voltage_waveform_step_count_;
|
||||||
|
size_t i = 0;
|
||||||
|
float time0 = time_axis->axisValue(i);
|
||||||
|
float volt0 = volts[i];
|
||||||
|
i = 1;
|
||||||
|
float time1 = time_axis->axisValue(i);
|
||||||
|
float volt1 = volts[i];
|
||||||
|
for (size_t v = 0; v <= voltage_waveform_step_count_; v++) {
|
||||||
|
float volt3 = v * volt_step;
|
||||||
|
while (volt3 > volt1 && i < volts.size() - 1) {
|
||||||
|
time0 = time1;
|
||||||
|
volt0 = volt1;
|
||||||
|
i++;
|
||||||
|
time1 = time_axis->axisValue(i);
|
||||||
|
volt1 = volts[i];
|
||||||
|
}
|
||||||
|
float time3 = time0 + (time1 - time0) * (volt3 - volt0) / (volt1 - volt0);
|
||||||
|
voltage_times->push_back(time3);
|
||||||
|
}
|
||||||
|
voltage_times_[wave_index] = voltage_times;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
OutputWaveforms::voltageCurrent(float slew,
|
||||||
|
float cap,
|
||||||
|
float volt)
|
||||||
|
{
|
||||||
|
size_t slew_index = slew_axis_->findAxisIndex(slew);
|
||||||
|
size_t cap_index = cap_axis_->findAxisIndex(cap);
|
||||||
|
size_t slew_count = slew_axis_->size();
|
||||||
|
size_t wave_index00 = slew_index * slew_count + cap_index;
|
||||||
|
size_t wave_index01 = slew_index * slew_count + (cap_index + 1);
|
||||||
|
size_t wave_index10 = (slew_index + 1) * slew_count + cap_index;
|
||||||
|
size_t wave_index11 = (slew_index + 1) * slew_count + (cap_index + 1);
|
||||||
|
float cap0 = cap_axis_->axisValue(cap_index);
|
||||||
|
float cap1 = cap_axis_->axisValue(cap_index + 1);
|
||||||
|
|
||||||
|
// Interpolate waveform samples at voltage steps.
|
||||||
|
size_t index1 = slew_index;
|
||||||
|
size_t index2 = cap_index;
|
||||||
|
float x1 = slew;
|
||||||
|
float x2 = cap;
|
||||||
|
float x1l = slew_axis_->axisValue(index1);
|
||||||
|
float x1u = slew_axis_->axisValue(index1 + 1);
|
||||||
|
float dx1 = (x1 - x1l) / (x1u - x1l);
|
||||||
|
float x2l = cap_axis_->axisValue(index2);
|
||||||
|
float x2u = cap_axis_->axisValue(index2 + 1);
|
||||||
|
float dx2 = (x2 - x2l) / (x2u - x2l);
|
||||||
|
|
||||||
|
const Table1 *waveform00 = voltageCurrents(wave_index00, cap0);
|
||||||
|
const Table1 *waveform01 = voltageCurrents(wave_index01, cap1);
|
||||||
|
const Table1 *waveform10 = voltageCurrents(wave_index10, cap0);
|
||||||
|
const Table1 *waveform11 = voltageCurrents(wave_index11, cap1);
|
||||||
|
|
||||||
|
float y00 = waveform00->findValueClipZero(volt);
|
||||||
|
float y01 = waveform01->findValueClipZero(volt);
|
||||||
|
float y10 = waveform10->findValueClipZero(volt);
|
||||||
|
float y11 = waveform11->findValueClipZero(volt);
|
||||||
|
float current
|
||||||
|
= (1 - dx1) * (1 - dx2) * y00
|
||||||
|
+ dx1 * (1 - dx2) * y10
|
||||||
|
+ dx1 * dx2 * y11
|
||||||
|
+ (1 - dx1) * dx2 * y01;
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
const Table1 *
|
||||||
|
OutputWaveforms::voltageCurrents(size_t wave_index,
|
||||||
|
float cap)
|
||||||
|
{
|
||||||
|
const Table1 *waveform = voltage_currents_[wave_index];
|
||||||
|
if (waveform == nullptr) {
|
||||||
|
findVoltages(wave_index, cap);
|
||||||
|
waveform = voltage_currents_[wave_index];
|
||||||
|
}
|
||||||
|
return waveform;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
DriverWaveform::DriverWaveform(const char *name,
|
DriverWaveform::DriverWaveform(const char *name,
|
||||||
|
|
|
||||||
395
messages.txt
395
messages.txt
|
|
@ -1,180 +1,180 @@
|
||||||
0001 DmpCeff.cc:1597 cell %s delay model not supported on SPF parasitics by DMP delay calculator
|
0001 DmpCeff.cc:1597 cell %s delay model not supported on SPF parasitics by DMP delay calculator
|
||||||
0002 Liberty.cc:750 cell %s/%s port %s not found in cell %s/%s.
|
0002 Liberty.cc:770 cell %s/%s port %s not found in cell %s/%s.
|
||||||
0003 Liberty.cc:776 cell %s/%s %s -> %s timing group %s not found in cell %s/%s.
|
0003 Liberty.cc:796 cell %s/%s %s -> %s timing group %s not found in cell %s/%s.
|
||||||
0004 Liberty.cc:1728 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check.
|
0004 Liberty.cc:1746 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with %s -> %s setup_%s check.
|
||||||
0005 Liberty.cc:1742 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.
|
0005 Liberty.cc:1760 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function positive sense.
|
||||||
0006 Liberty.cc:1750 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.
|
0006 Liberty.cc:1768 cell %s/%s %s -> %s latch enable %s_edge is inconsistent with latch group enable function negative sense.
|
||||||
0007 LibertyExpr.cc:82 %s references unknown port %s.
|
0007 LibertyExpr.cc:82 %s references unknown port %s.
|
||||||
0008 ConcreteNetwork.cc:1917 cell type %s can not be linked.
|
0008 ConcreteNetwork.cc:1917 cell type %s can not be linked.
|
||||||
0009 CycleAccting.cc:87 No common period was found between clocks %s and %s.
|
0009 CycleAccting.cc:87 No common period was found between clocks %s and %s.
|
||||||
0010 Genclks.cc:274 no master clock found for generated clock %s.
|
0010 Genclks.cc:274 no master clock found for generated clock %s.
|
||||||
0013 Genclks.cc:938 generated clock %s source pin %s missing paths from master clock %s.
|
0013 Genclks.cc:938 generated clock %s source pin %s missing paths from master clock %s.
|
||||||
0015 Sim.cc:865 propagated logic value %c differs from constraint value of %c on pin %s.
|
0015 Sim.cc:865 propagated logic value %c differs from constraint value of %c on pin %s.
|
||||||
0016 LibertyReader.cc:1049 default_max_fanout is 0.0.
|
0016 LibertyReader.cc:1037 default_max_fanout is 0.0.
|
||||||
0017 Sta.cc:2093 '%s' is not a valid endpoint.
|
0017 Sta.cc:2093 '%s' is not a valid endpoint.
|
||||||
0018 Sta.cc:2017 '%s' is not a valid start point.
|
0018 Sta.cc:2017 '%s' is not a valid start point.
|
||||||
0021 SpefParse.yy:805 %d is not positive.
|
0021 SpefParse.yy:805 %d is not positive.
|
||||||
0022 SpefParse.yy:814 %.4f is not positive.
|
0022 SpefParse.yy:814 %.4f is not positive.
|
||||||
0023 SpefParse.yy:820 %.4f is not positive.
|
0023 SpefParse.yy:820 %.4f is not positive.
|
||||||
0024 WritePathSpice.cc:458 pg_pin %s/%s voltage %s not found,
|
0024 WritePathSpice.cc:508 pg_pin %s/%s voltage %s not found,
|
||||||
0025 WritePathSpice.cc:465 Liberty pg_port %s/%s missing voltage_name attribute,
|
0025 WritePathSpice.cc:515 Liberty pg_port %s/%s missing voltage_name attribute,
|
||||||
0026 WritePathSpice.cc:1037 %s pg_port %s not found,
|
0026 WritePathSpice.cc:1094 %s pg_port %s not found,
|
||||||
0027 WritePathSpice.cc:1092 no register/latch found for path from %s to %s,
|
0027 WritePathSpice.cc:1149 no register/latch found for path from %s to %s,
|
||||||
0028 WritePathSpice.cc:1464 The subkct file %s is missing definitions for %s
|
0028 WritePathSpice.cc:1615 The subkct file %s is missing definitions for %s
|
||||||
0029 WritePathSpice.cc:1562 subckt %s port %s has no corresponding liberty port, pg_port and is not power or ground.
|
0029 WritePathSpice.cc:1713 subckt %s port %s has no corresponding liberty port, pg_port and is not power or ground.
|
||||||
0030 LibertyReader.cc:628 library missing name.
|
0030 LibertyReader.cc:631 library missing name.
|
||||||
0031 LibertyReader.cc:660 default_wire_load %s not found.
|
0031 LibertyReader.cc:657 default_wire_load %s not found.
|
||||||
0032 LibertyReader.cc:671 default_wire_selection %s not found.
|
0032 LibertyReader.cc:668 default_wire_selection %s not found.
|
||||||
0033 LibertyReader.cc:693 input_threshold_pct_%s not found.
|
0033 LibertyReader.cc:690 input_threshold_pct_%s not found.
|
||||||
0034 LibertyReader.cc:697 output_threshold_pct_%s not found.
|
0034 LibertyReader.cc:694 output_threshold_pct_%s not found.
|
||||||
0035 LibertyReader.cc:701 slew_lower_threshold_pct_%s not found.
|
0035 LibertyReader.cc:698 slew_lower_threshold_pct_%s not found.
|
||||||
0036 LibertyReader.cc:705 slew_upper_threshold_pct_%s not found.
|
0036 LibertyReader.cc:702 slew_upper_threshold_pct_%s not found.
|
||||||
0037 LibertyReader.cc:710 Library %s is missing one or more thresholds.
|
0037 LibertyReader.cc:707 Library %s is missing one or more thresholds.
|
||||||
0038 LibertyReader.cc:800 unknown unit multiplier %s.
|
0038 LibertyReader.cc:786 unknown unit multiplier %s.
|
||||||
0039 LibertyReader.cc:819 unknown unit scale %c.
|
0039 LibertyReader.cc:807 unknown unit scale %c.
|
||||||
0040 LibertyReader.cc:822 unknown unit suffix %s.
|
0040 LibertyReader.cc:810 unknown unit suffix %s.
|
||||||
0041 LibertyReader.cc:848 capacitive_load_units are not ff or pf.
|
0041 LibertyReader.cc:836 capacitive_load_units are not ff or pf.
|
||||||
0042 LibertyReader.cc:851 capacitive_load_units are not a string.
|
0042 LibertyReader.cc:839 capacitive_load_units are not a string.
|
||||||
0043 LibertyReader.cc:854 capacitive_load_units missing suffix.
|
0043 LibertyReader.cc:842 capacitive_load_units missing suffix.
|
||||||
0044 LibertyReader.cc:857 capacitive_load_units scale is not a float.
|
0044 LibertyReader.cc:845 capacitive_load_units scale is not a float.
|
||||||
0045 LibertyReader.cc:860 capacitive_load_units missing scale and suffix.
|
0045 LibertyReader.cc:848 capacitive_load_units missing scale and suffix.
|
||||||
0046 LibertyReader.cc:863 capacitive_load_unit missing values suffix.
|
0046 LibertyReader.cc:851 capacitive_load_unit missing values suffix.
|
||||||
0047 LibertyReader.cc:881 delay_model %s not supported.
|
0047 LibertyReader.cc:869 delay_model %s not supported.
|
||||||
0048 LibertyReader.cc:885 delay_model %s not supported.
|
0048 LibertyReader.cc:873 delay_model %s not supported.
|
||||||
0049 LibertyReader.cc:889 delay_model %s not supported.
|
0049 LibertyReader.cc:877 delay_model %s not supported.
|
||||||
0050 LibertyReader.cc:894 delay_model %s not supported.
|
0050 LibertyReader.cc:882 delay_model %s not supported.
|
||||||
.
|
.
|
||||||
0051 LibertyReader.cc:897 unknown delay_model %s
|
0051 LibertyReader.cc:885 unknown delay_model %s
|
||||||
.
|
.
|
||||||
0052 LibertyReader.cc:916 unknown bus_naming_style format.
|
0052 LibertyReader.cc:904 unknown bus_naming_style format.
|
||||||
0053 LibertyReader.cc:594 library %s already exists.
|
0053 LibertyReader.cc:597 library %s already exists.
|
||||||
0054 LibertyReader.cc:937 voltage_map voltage is not a float.
|
0054 LibertyReader.cc:925 voltage_map voltage is not a float.
|
||||||
0055 LibertyReader.cc:940 voltage_map missing voltage.
|
0055 LibertyReader.cc:928 voltage_map missing voltage.
|
||||||
0056 LibertyReader.cc:943 voltage_map supply name is not a string.
|
0056 LibertyReader.cc:931 voltage_map supply name is not a string.
|
||||||
0057 LibertyReader.cc:946 voltage_map missing supply name and voltage.
|
0057 LibertyReader.cc:934 voltage_map missing supply name and voltage.
|
||||||
0058 LibertyReader.cc:949 voltage_map missing values suffix.
|
0058 LibertyReader.cc:937 voltage_map missing values suffix.
|
||||||
0059 LibertyReader.cc:1167 default_wire_load_mode %s not found.
|
0059 LibertyReader.cc:1155 default_wire_load_mode %s not found.
|
||||||
0060 LibertyReader.cc:683 default_operating_condition %s not found.
|
0060 LibertyReader.cc:680 default_operating_condition %s not found.
|
||||||
0061 LibertyReader.cc:1338 table template missing name.
|
0061 LibertyReader.cc:1326 table template missing name.
|
||||||
0062 LibertyReader.cc:1383 missing variable_%d attribute.
|
0062 LibertyReader.cc:1371 missing variable_%d attribute.
|
||||||
0063 LibertyReader.cc:1426 axis type %s not supported.
|
0063 LibertyReader.cc:1414 axis type %s not supported.
|
||||||
0064 LibertyReader.cc:1486 bus type %s missing bit_from.
|
0064 LibertyReader.cc:1474 bus type %s missing bit_from.
|
||||||
0065 LibertyReader.cc:1488 bus type %s missing bit_to.
|
0065 LibertyReader.cc:1476 bus type %s missing bit_to.
|
||||||
0066 LibertyReader.cc:1492 type missing name.
|
0066 LibertyReader.cc:1480 type missing name.
|
||||||
0067 LibertyReader.cc:1519 scaling_factors do not have a name.
|
0067 LibertyReader.cc:1507 scaling_factors do not have a name.
|
||||||
0068 LibertyReader.cc:1687 operating_conditions missing name.
|
0068 LibertyReader.cc:1675 operating_conditions missing name.
|
||||||
0069 LibertyReader.cc:1757 wire_load missing name.
|
0069 LibertyReader.cc:1745 wire_load missing name.
|
||||||
0070 LibertyReader.cc:1800 fanout_length is missing length and fanout.
|
0070 LibertyReader.cc:1788 fanout_length is missing length and fanout.
|
||||||
0071 LibertyReader.cc:1815 wire_load_selection missing name.
|
0071 LibertyReader.cc:1803 wire_load_selection missing name.
|
||||||
0072 LibertyReader.cc:1846 wireload %s not found.
|
0072 LibertyReader.cc:1834 wireload %s not found.
|
||||||
0074 LibertyReader.cc:1853 wire_load_from_area min not a float.
|
0074 LibertyReader.cc:1841 wire_load_from_area min not a float.
|
||||||
0075 LibertyReader.cc:1856 wire_load_from_area max not a float.
|
0075 LibertyReader.cc:1844 wire_load_from_area max not a float.
|
||||||
0076 LibertyReader.cc:1859 wire_load_from_area missing parameters.
|
0076 LibertyReader.cc:1847 wire_load_from_area missing parameters.
|
||||||
0077 LibertyReader.cc:1862 wire_load_from_area missing parameters.
|
0077 LibertyReader.cc:1850 wire_load_from_area missing parameters.
|
||||||
0078 LibertyReader.cc:1879 cell missing name.
|
0078 LibertyReader.cc:1867 cell missing name.
|
||||||
0079 LibertyReader.cc:1902 cell %s ocv_derate_group %s not found.
|
0079 LibertyReader.cc:1890 cell %s ocv_derate_group %s not found.
|
||||||
0080 LibertyReader.cc:1938 port %s function size does not match port size.
|
0080 LibertyReader.cc:1926 port %s function size does not match port size.
|
||||||
0081 LibertyReader.cc:2006 %s %s bus width mismatch.
|
0081 LibertyReader.cc:1994 %s %s bus width mismatch.
|
||||||
0082 LibertyReader.cc:2017 %s %s bus width mismatch.
|
0082 LibertyReader.cc:2005 %s %s bus width mismatch.
|
||||||
0083 LibertyReader.cc:2027 clear
|
0083 LibertyReader.cc:2015 clear
|
||||||
0084 LibertyReader.cc:2037 preset
|
0084 LibertyReader.cc:2025 preset
|
||||||
0085 LibertyReader.cc:2073 latch enable function is non-unate for port %s.
|
0085 LibertyReader.cc:2061 latch enable function is non-unate for port %s.
|
||||||
0086 LibertyReader.cc:2078 latch enable function is unknown for port %s.
|
0086 LibertyReader.cc:2066 latch enable function is unknown for port %s.
|
||||||
0087 LibertyReader.cc:2154 operating conditions %s not found.
|
0087 LibertyReader.cc:2142 operating conditions %s not found.
|
||||||
0088 LibertyReader.cc:2157 scaled_cell missing operating condition.
|
0088 LibertyReader.cc:2145 scaled_cell missing operating condition.
|
||||||
0089 LibertyReader.cc:2160 scaled_cell cell %s has not been defined.
|
0089 LibertyReader.cc:2148 scaled_cell cell %s has not been defined.
|
||||||
0090 LibertyReader.cc:2163 scaled_cell missing name.
|
0090 LibertyReader.cc:2151 scaled_cell missing name.
|
||||||
0091 LibertyReader.cc:2189 scaled_cell %s, %s port functions do not match cell port functions.
|
0091 LibertyReader.cc:2177 scaled_cell %s, %s port functions do not match cell port functions.
|
||||||
0092 LibertyReader.cc:2194 scaled_cell ports do not match cell ports.
|
0092 LibertyReader.cc:2182 scaled_cell ports do not match cell ports.
|
||||||
0093 LibertyReader.cc:2196 scaled_cell %s, %s timing does not match cell timing.
|
0093 LibertyReader.cc:2184 scaled_cell %s, %s timing does not match cell timing.
|
||||||
0094 LibertyReader.cc:2215 combinational timing to an input port.
|
0094 LibertyReader.cc:2203 combinational timing to an input port.
|
||||||
0095 LibertyReader.cc:2306 missing %s_transition.
|
0095 LibertyReader.cc:2294 missing %s_transition.
|
||||||
0096 LibertyReader.cc:2308 missing cell_%s.
|
0096 LibertyReader.cc:2296 missing cell_%s.
|
||||||
0099 LibertyReader.cc:2900 scaling_factors %s not found.
|
0099 LibertyReader.cc:2894 scaling_factors %s not found.
|
||||||
0100 LibertyReader.cc:2943 pin name is not a string.
|
0100 LibertyReader.cc:2937 pin name is not a string.
|
||||||
0101 LibertyReader.cc:2962 pin name is not a string.
|
0101 LibertyReader.cc:2956 pin name is not a string.
|
||||||
0102 LibertyReader.cc:2978 pin name is not a string.
|
0102 LibertyReader.cc:2972 pin name is not a string.
|
||||||
0103 LibertyReader.cc:3056 bus %s bus_type not found.
|
0103 LibertyReader.cc:3050 bus %s bus_type not found.
|
||||||
0104 LibertyReader.cc:3112 bus_type %s not found.
|
0104 LibertyReader.cc:3106 bus_type %s not found.
|
||||||
0105 LibertyReader.cc:3115 bus_type is not a string.
|
0105 LibertyReader.cc:3109 bus_type is not a string.
|
||||||
0106 LibertyReader.cc:3133 bundle %s member not found.
|
0106 LibertyReader.cc:3127 bundle %s member not found.
|
||||||
0107 LibertyReader.cc:3160 member is not a string.
|
0107 LibertyReader.cc:3154 member is not a string.
|
||||||
0108 LibertyReader.cc:3167 members attribute is missing values.
|
0108 LibertyReader.cc:3161 members attribute is missing values.
|
||||||
0109 LibertyReader.cc:3218 unknown port direction.
|
0109 LibertyReader.cc:3212 unknown port direction.
|
||||||
0110 LibertyReader.cc:3586 pulse_latch unknown pulse type.
|
0110 LibertyReader.cc:3580 pulse_latch unknown pulse type.
|
||||||
0111 LibertyReader.cc:3964 unknown timing_type %s.
|
0111 LibertyReader.cc:3958 unknown timing_type %s.
|
||||||
0112 LibertyReader.cc:3984 unknown timing_sense %s.
|
0112 LibertyReader.cc:3978 unknown timing_sense %s.
|
||||||
0113 LibertyReader.cc:4024 mode value is not a string.
|
0113 LibertyReader.cc:4018 mode value is not a string.
|
||||||
0114 LibertyReader.cc:4027 missing mode value.
|
0114 LibertyReader.cc:4021 missing mode value.
|
||||||
0115 LibertyReader.cc:4030 mode name is not a string.
|
0115 LibertyReader.cc:4024 mode name is not a string.
|
||||||
0116 LibertyReader.cc:4033 mode missing values.
|
0116 LibertyReader.cc:4027 mode missing values.
|
||||||
0117 LibertyReader.cc:4036 mode missing mode name and value.
|
0117 LibertyReader.cc:4030 mode missing mode name and value.
|
||||||
0118 LibertyReader.cc:2547 unsupported model axis.
|
0118 LibertyReader.cc:2541 unsupported model axis.
|
||||||
0119 LibertyReader.cc:4139 unsupported model axis.
|
0119 LibertyReader.cc:4133 unsupported model axis.
|
||||||
0120 LibertyReader.cc:4168 unsupported model axis.
|
0120 LibertyReader.cc:4162 unsupported model axis.
|
||||||
0121 LibertyReader.cc:4203 unsupported model axis.
|
0121 LibertyReader.cc:4197 unsupported model axis.
|
||||||
0122 LibertyReader.cc:4258 table template %s not found.
|
0122 LibertyReader.cc:4252 table template %s not found.
|
||||||
0123 LibertyReader.cc:4337 %s is missing values.
|
0123 LibertyReader.cc:4331 %s is missing values.
|
||||||
0124 LibertyReader.cc:4362 %s is not a list of floats.
|
0124 LibertyReader.cc:4356 %s is not a list of floats.
|
||||||
0125 LibertyReader.cc:4364 table row has %u columns but axis has %d.
|
0125 LibertyReader.cc:4358 table row has %u columns but axis has %d.
|
||||||
0126 LibertyReader.cc:4374 table has %u rows but axis has %d.
|
0126 LibertyReader.cc:4368 table has %u rows but axis has %d.
|
||||||
0127 LibertyReader.cc:4427 lut output is not a string.
|
0127 LibertyReader.cc:4421 lut output is not a string.
|
||||||
0128 LibertyReader.cc:4469 mode definition missing name.
|
0128 LibertyReader.cc:4463 mode definition missing name.
|
||||||
0129 LibertyReader.cc:4486 mode value missing name.
|
0129 LibertyReader.cc:4480 mode value missing name.
|
||||||
0130 LibertyReader.cc:4500 when attribute inside table model.
|
0130 LibertyReader.cc:4494 when attribute inside table model.
|
||||||
0131 LibertyReader.cc:4549 %s attribute is not a string.
|
0131 LibertyReader.cc:4543 %s attribute is not a string.
|
||||||
0132 LibertyReader.cc:4552 %s is not a simple attribute.
|
0132 LibertyReader.cc:4546 %s is not a simple attribute.
|
||||||
0133 LibertyReader.cc:4575 %s is not a simple attribute.
|
0133 LibertyReader.cc:4569 %s is not a simple attribute.
|
||||||
0134 LibertyReader.cc:4588 %s is not a simple attribute.
|
0134 LibertyReader.cc:4582 %s is not a simple attribute.
|
||||||
0135 LibertyReader.cc:4612 %s value %s is not a float.
|
0135 LibertyReader.cc:4606 %s value %s is not a float.
|
||||||
0136 LibertyReader.cc:4641 %s missing values.
|
0136 LibertyReader.cc:4635 %s missing values.
|
||||||
0137 LibertyReader.cc:4645 %s missing values.
|
0137 LibertyReader.cc:4639 %s missing values.
|
||||||
0138 LibertyReader.cc:4648 %s is not a complex attribute.
|
0138 LibertyReader.cc:4642 %s is not a complex attribute.
|
||||||
0139 LibertyReader.cc:4674 %s is not a float.
|
0139 LibertyReader.cc:4668 %s is not a float.
|
||||||
0140 LibertyReader.cc:4697 %s is missing values.
|
0140 LibertyReader.cc:4691 %s is missing values.
|
||||||
0141 LibertyReader.cc:4700 %s has more than one string.
|
0141 LibertyReader.cc:4694 %s has more than one string.
|
||||||
0142 LibertyReader.cc:4709 %s is missing values.
|
0142 LibertyReader.cc:4703 %s is missing values.
|
||||||
0143 LibertyReader.cc:4734 %s attribute is not boolean.
|
0143 LibertyReader.cc:4728 %s attribute is not boolean.
|
||||||
0144 LibertyReader.cc:4737 %s attribute is not boolean.
|
0144 LibertyReader.cc:4731 %s attribute is not boolean.
|
||||||
0145 LibertyReader.cc:4740 %s is not a simple attribute.
|
0145 LibertyReader.cc:4734 %s is not a simple attribute.
|
||||||
0146 LibertyReader.cc:4756 attribute %s value %s not recognized.
|
0146 LibertyReader.cc:4750 attribute %s value %s not recognized.
|
||||||
0147 LibertyReader.cc:4786 unknown early/late value.
|
0147 LibertyReader.cc:4781 unknown early/late value.
|
||||||
0148 LibertyReader.cc:5012 OCV derate group named %s not found.
|
0148 LibertyReader.cc:5007 OCV derate group named %s not found.
|
||||||
0149 LibertyReader.cc:5028 ocv_derate missing name.
|
0149 LibertyReader.cc:5023 ocv_derate missing name.
|
||||||
0150 LibertyReader.cc:5081 unknown rise/fall.
|
0150 LibertyReader.cc:5076 unknown rise/fall.
|
||||||
0151 LibertyReader.cc:5101 unknown derate type.
|
0151 LibertyReader.cc:5096 unknown derate type.
|
||||||
0152 LibertyReader.cc:5133 unsupported model axis.
|
0152 LibertyReader.cc:5128 unsupported model axis.
|
||||||
0153 LibertyReader.cc:5165 unsupported model axis.
|
0153 LibertyReader.cc:5160 unsupported model axis.
|
||||||
0154 LibertyReader.cc:5197 unsupported model axis.
|
0154 LibertyReader.cc:5192 unsupported model axis.
|
||||||
0155 LibertyReader.cc:5268 unknown pg_type.
|
0155 LibertyReader.cc:5263 unknown pg_type.
|
||||||
0156 LibertyReader.cc:5663 port %s subscript out of range.
|
0156 LibertyReader.cc:5658 port %s subscript out of range.
|
||||||
0157 LibertyReader.cc:5667 port range %s of non-bus port %s.
|
0157 LibertyReader.cc:5662 port range %s of non-bus port %s.
|
||||||
0158 LibertyReader.cc:5681 port %s not found.
|
0158 LibertyReader.cc:5676 port %s not found.
|
||||||
0159 LibertyReader.cc:5751 port %s not found.
|
0159 LibertyReader.cc:5746 port %s not found.
|
||||||
0160 LibertyReader.cc:1034 default_max_transition is 0.0.
|
0160 LibertyReader.cc:1022 default_max_transition is 0.0.
|
||||||
0161 LibertyReader.cc:3474 max_transition is 0.0.
|
0161 LibertyReader.cc:3468 max_transition is 0.0.
|
||||||
0162 LibertyReader.cc:4572 %s attribute is not an integer.
|
0162 LibertyReader.cc:4566 %s attribute is not an integer.
|
||||||
0163 LibertyReader.cc:1139 default_fanout_load is 0.0.
|
0163 LibertyReader.cc:1127 default_fanout_load is 0.0.
|
||||||
0164 LibertyReader.cc:2328 timing group from output port.
|
0164 LibertyReader.cc:2316 timing group from output port.
|
||||||
0165 LibertyReader.cc:2338 timing group from output port.
|
0165 LibertyReader.cc:2326 timing group from output port.
|
||||||
0166 LibertyReader.cc:2348 timing group from output port.
|
0166 LibertyReader.cc:2336 timing group from output port.
|
||||||
0167 LibertyReader.cc:2366 timing group from output port.
|
0167 LibertyReader.cc:2354 timing group from output port.
|
||||||
0168 LibertyReader.cc:2381 timing group from output port.
|
0168 LibertyReader.cc:2369 timing group from output port.
|
||||||
0169 LibertyReader.cc:4444 cell %s test_cell redefinition.
|
0169 LibertyReader.cc:4438 cell %s test_cell redefinition.
|
||||||
0170 LibertyReader.cc:3883 timing group missing related_pin/related_bus_pin.
|
0170 LibertyReader.cc:3877 timing group missing related_pin/related_bus_pin.
|
||||||
0179 SpefReader.cc:734 %s.
|
0179 SpefReader.cc:734 %s.
|
||||||
0190 VerilogReader.cc:1756 %s is not a verilog module.
|
0190 VerilogReader.cc:1782 %s is not a verilog module.
|
||||||
0191 VerilogReader.cc:1761 %s is not a verilog module.
|
0191 VerilogReader.cc:1787 %s is not a verilog module.
|
||||||
0201 StaTcl.i:118 no network has been linked.
|
0201 StaTcl.i:118 no network has been linked.
|
||||||
0202 StaTcl.i:132 network does not support edits.
|
0202 StaTcl.i:132 network does not support edits.
|
||||||
0204 StaTcl.i:4072 POCV support requires compilation with SSTA=1.
|
0204 StaTcl.i:4123 POCV support requires compilation with SSTA=1.
|
||||||
0206 LibertyExpr.cc:175 %s %s.
|
0206 LibertyExpr.cc:175 %s %s.
|
||||||
0207 GraphDelayCalc1.cc:738 port not found in cell
|
0207 GraphDelayCalc1.cc:738 port not found in cell
|
||||||
0208 Graph.cc:793 arc_delay_annotated array bounds exceeded
|
0208 Graph.cc:793 arc_delay_annotated array bounds exceeded
|
||||||
0209 Graph.cc:808 arc_delay_annotated array bounds exceeded
|
0209 Graph.cc:808 arc_delay_annotated array bounds exceeded
|
||||||
0210 Graph.cc:820 arc_delay_annotated array bounds exceeded
|
0210 Graph.cc:820 arc_delay_annotated array bounds exceeded
|
||||||
0211 SdcNetwork.cc:1077 inst path string lenth estimate busted
|
0211 SdcNetwork.cc:1095 inst path string lenth estimate busted
|
||||||
0212 SdcNetwork.cc:1149 inst path string lenth estimate exceeded
|
0212 SdcNetwork.cc:1167 inst path string lenth estimate exceeded
|
||||||
0213 Sdc.cc:4021 group path name and is_default are mutually exclusive.
|
0213 Sdc.cc:4021 group path name and is_default are mutually exclusive.
|
||||||
0214 WriteSdc.cc:1254 unknown exception type
|
0214 WriteSdc.cc:1254 unknown exception type
|
||||||
0215 WriteSdc.cc:1795 illegal set_logic value
|
0215 WriteSdc.cc:1795 illegal set_logic value
|
||||||
|
|
@ -188,16 +188,16 @@
|
||||||
0256 ReportPath.cc:308 unsupported path type
|
0256 ReportPath.cc:308 unsupported path type
|
||||||
0257 ReportPath.cc:347 unsupported path type
|
0257 ReportPath.cc:347 unsupported path type
|
||||||
0259 ReportPath.cc:2376 unsupported path type
|
0259 ReportPath.cc:2376 unsupported path type
|
||||||
0260 Search.cc:2628 max tag group index exceeded
|
0260 Search.cc:2655 max tag group index exceeded
|
||||||
0261 Search.cc:2860 max tag index exceeded
|
0261 Search.cc:2891 max tag index exceeded
|
||||||
0262 Search.cc:3551 unexpected filter path
|
0262 Search.cc:3618 unexpected filter path
|
||||||
0263 Search.cc:3719 tns incr existing vertex
|
0263 Search.cc:3786 tns incr existing vertex
|
||||||
0264 Sta.cc:4180 corresponding timing arc set not found in equiv cells
|
0264 Sta.cc:4190 corresponding timing arc set not found in equiv cells
|
||||||
0265 TagGroup.cc:297 tag group missing tag
|
0265 TagGroup.cc:297 tag group missing tag
|
||||||
0266 Sta.cc:2090 '%s' is not a valid endpoint.
|
0266 Sta.cc:2090 '%s' is not a valid endpoint.
|
||||||
0267 Sta.cc:2014 '%s' is not a valid start point.
|
0267 Sta.cc:2014 '%s' is not a valid start point.
|
||||||
0272 StaTcl.i:4058 unknown common clk pessimism mode.
|
0272 StaTcl.i:4109 unknown common clk pessimism mode.
|
||||||
0273 StaTcl.i:5003 unknown clock sense
|
0273 StaTcl.i:5055 unknown clock sense
|
||||||
0299 Power.tcl:241 activity cannot be set on clock ports.
|
0299 Power.tcl:241 activity cannot be set on clock ports.
|
||||||
0300 CmdUtil.tcl:44 no commands match '$pattern'.
|
0300 CmdUtil.tcl:44 no commands match '$pattern'.
|
||||||
0301 Power.tcl:218 activity should be 0.0 to 1.0 or 2.0
|
0301 Power.tcl:218 activity should be 0.0 to 1.0 or 2.0
|
||||||
|
|
@ -209,7 +209,7 @@
|
||||||
0314 CmdArgs.tcl:857 $arg_name must be a single net.
|
0314 CmdArgs.tcl:857 $arg_name must be a single net.
|
||||||
0315 CmdArgs.tcl:863 $arg_name '$object_type' is not a net.
|
0315 CmdArgs.tcl:863 $arg_name '$object_type' is not a net.
|
||||||
0316 CmdArgs.tcl:868 $arg_name '$arg' not found.
|
0316 CmdArgs.tcl:868 $arg_name '$arg' not found.
|
||||||
0318 Search.tcl:1067 unknown path group '$name'.
|
0318 Search.tcl:1057 unknown path group '$name'.
|
||||||
0319 Sdc.tcl:288 $unit scale [format %.0e $scale] does not match library scale [format %.0e $unit_scale].
|
0319 Sdc.tcl:288 $unit scale [format %.0e $scale] does not match library scale [format %.0e $unit_scale].
|
||||||
0320 Sdc.tcl:437 current_design for other than top cell not supported.
|
0320 Sdc.tcl:437 current_design for other than top cell not supported.
|
||||||
0321 Sdc.tcl:474 patterns argument not supported with -of_objects.
|
0321 Sdc.tcl:474 patterns argument not supported with -of_objects.
|
||||||
|
|
@ -264,6 +264,7 @@
|
||||||
0371 Sdc.tcl:3497 set_wire_load_min_block_size not supported.
|
0371 Sdc.tcl:3497 set_wire_load_min_block_size not supported.
|
||||||
0372 NetworkEdit.tcl:129 connect_pins is deprecated. Use connect_pin.
|
0372 NetworkEdit.tcl:129 connect_pins is deprecated. Use connect_pin.
|
||||||
0373 Sdc.tcl:3647 define_corners must be called before read_liberty.
|
0373 Sdc.tcl:3647 define_corners must be called before read_liberty.
|
||||||
|
0374 Sta.cc:2416 maximum corner count exceeded
|
||||||
0400 Util.tcl:44 $cmd $key missing value.
|
0400 Util.tcl:44 $cmd $key missing value.
|
||||||
0401 Util.tcl:61 $cmd $key missing value.
|
0401 Util.tcl:61 $cmd $key missing value.
|
||||||
0402 Util.tcl:71 $cmd $arg is not a known keyword or flag.
|
0402 Util.tcl:71 $cmd $arg is not a known keyword or flag.
|
||||||
|
|
@ -283,15 +284,15 @@
|
||||||
0416 Util.tcl:305 $cmd_arg '$arg' is not a positive integer.
|
0416 Util.tcl:305 $cmd_arg '$arg' is not a positive integer.
|
||||||
0417 Util.tcl:311 $cmd_arg '$arg' is not an integer greater than or equal to one.
|
0417 Util.tcl:311 $cmd_arg '$arg' is not an integer greater than or equal to one.
|
||||||
0418 Util.tcl:317 $cmd_arg '$arg' is not between 0 and 100.
|
0418 Util.tcl:317 $cmd_arg '$arg' is not between 0 and 100.
|
||||||
0419 Search.tcl:336 report_clock_skew -setup and -hold are mutually exclusive options.
|
0419 Search.tcl:326 report_clock_skew -setup and -hold are mutually exclusive options.
|
||||||
0420 Search.tcl:136 $cmd -path_delay must be min, min_rise, min_fall, max, max_rise, max_fall or min_max.
|
0420 Search.tcl:136 $cmd -path_delay must be min, min_rise, min_fall, max, max_rise, max_fall or min_max.
|
||||||
0421 Search.tcl:146 $cmd command failed.
|
0421 Search.tcl:146 $cmd command failed.
|
||||||
0422 Search.tcl:165 -endpoint_count must be a positive integer.
|
0422 Search.tcl:165 -endpoint_count must be a positive integer.
|
||||||
0423 Search.tcl:174 -group_count must be >= 1.
|
0423 Search.tcl:174 -group_count must be >= 1.
|
||||||
0424 Search.tcl:205 '$arg' is not a known keyword or flag.
|
0424 Search.tcl:205 '$arg' is not a known keyword or flag.
|
||||||
0425 Search.tcl:207 positional arguments not supported.
|
0425 Search.tcl:207 positional arguments not supported.
|
||||||
0426 Search.tcl:520 analysis type single is not consistent with doing both setup/max and hold/min checks.
|
0426 Search.tcl:510 analysis type single is not consistent with doing both setup/max and hold/min checks.
|
||||||
0427 Search.tcl:525 positional arguments not supported.
|
0427 Search.tcl:515 positional arguments not supported.
|
||||||
0428 DelayCalc.tcl:350 set_assigned_transition transition is not a float.
|
0428 DelayCalc.tcl:350 set_assigned_transition transition is not a float.
|
||||||
0430 Sdf.tcl:46 -cond_use min_max cannot be used with analysis type single.
|
0430 Sdf.tcl:46 -cond_use min_max cannot be used with analysis type single.
|
||||||
0432 Sdf.tcl:157 SDF -divider must be / or .
|
0432 Sdf.tcl:157 SDF -divider must be / or .
|
||||||
|
|
@ -370,9 +371,9 @@
|
||||||
0505 WritePathSpice.tcl:74 No -ground specified.
|
0505 WritePathSpice.tcl:74 No -ground specified.
|
||||||
0506 WritePathSpice.tcl:78 No -path_args specified.
|
0506 WritePathSpice.tcl:78 No -path_args specified.
|
||||||
0507 WritePathSpice.tcl:83 No paths found for -path_args $path_args.
|
0507 WritePathSpice.tcl:83 No paths found for -path_args $path_args.
|
||||||
0508 Search.tcl:788 -min and -max cannot both be specified.
|
0508 Search.tcl:778 -min and -max cannot both be specified.
|
||||||
0509 Search.tcl:808 pin '$pin_arg' is hierarchical.
|
0509 Search.tcl:798 pin '$pin_arg' is hierarchical.
|
||||||
0510 Search.tcl:874 -format $format not recognized.
|
0510 Search.tcl:864 -format $format not recognized.
|
||||||
0511 Sdc.tcl:73 cannot open '$filename'.
|
0511 Sdc.tcl:73 cannot open '$filename'.
|
||||||
0512 Sdc.tcl:128 incomplete command at end of file.
|
0512 Sdc.tcl:128 incomplete command at end of file.
|
||||||
0513 Sdc.tcl:212 hierarchy separator must be one of '$sdc_dividers'.
|
0513 Sdc.tcl:212 hierarchy separator must be one of '$sdc_dividers'.
|
||||||
|
|
@ -461,13 +462,13 @@
|
||||||
0604 Sdc.tcl:281 unknown $unit prefix '$prefix'.
|
0604 Sdc.tcl:281 unknown $unit prefix '$prefix'.
|
||||||
0605 Sdc.tcl:3547 wire load model '$model_name' not found.
|
0605 Sdc.tcl:3547 wire load model '$model_name' not found.
|
||||||
0606 Property.tcl:77 get_property unsupported object type $object_type.
|
0606 Property.tcl:77 get_property unsupported object type $object_type.
|
||||||
0607 StaTcl.i:4308 unknown report path field %s
|
0607 StaTcl.i:4359 unknown report path field %s
|
||||||
0608 StaTcl.i:4320 unknown report path field %s
|
0608 StaTcl.i:4371 unknown report path field %s
|
||||||
0609 Search.tcl:421 -all_violators is deprecated. Use -violators
|
0609 Search.tcl:411 -all_violators is deprecated. Use -violators
|
||||||
0610 Search.tcl:501 -max_transition deprecated. Use -max_slew.
|
0610 Search.tcl:491 -max_transition deprecated. Use -max_slew.
|
||||||
0611 Search.tcl:506 -min_transition deprecated. Use -min_slew.
|
0611 Search.tcl:496 -min_transition deprecated. Use -min_slew.
|
||||||
0612 Sdf.tcl:41 -cond_use must be min, max or min_max.
|
0612 Sdf.tcl:41 -cond_use must be min, max or min_max.
|
||||||
0616 Search.tcl:1018 specify one of -setup and -hold.
|
0616 Search.tcl:1008 specify one of -setup and -hold.
|
||||||
0617 Sdf.tcl:50 -analysis_type is deprecated. Use set_operating_conditions -analysis_type.
|
0617 Sdf.tcl:50 -analysis_type is deprecated. Use set_operating_conditions -analysis_type.
|
||||||
0618 DmpCeff.cc:1581 parasitic Pi model has NaNs.
|
0618 DmpCeff.cc:1581 parasitic Pi model has NaNs.
|
||||||
0619 PathEnum.cc:474 path diversion missing edge.
|
0619 PathEnum.cc:474 path diversion missing edge.
|
||||||
|
|
@ -476,30 +477,30 @@
|
||||||
0622 PathVertex.cc:279 missing requireds.
|
0622 PathVertex.cc:279 missing requireds.
|
||||||
0623 PathVertexRep.cc:153 missing arrivals.
|
0623 PathVertexRep.cc:153 missing arrivals.
|
||||||
0624 PathVertexRep.cc:150 missing arrivals
|
0624 PathVertexRep.cc:150 missing arrivals
|
||||||
0701 LibertyWriter.cc:416 %s/%s/%s timing model not supported.
|
0701 LibertyWriter.cc:411 %s/%s/%s timing model not supported.
|
||||||
0702 LibertyWriter.cc:436 3 axis table models not supported.
|
0702 LibertyWriter.cc:431 3 axis table models not supported.
|
||||||
0703 LibertyWriter.cc:576 %s/%s/%s timing arc type %s not supported.
|
0703 LibertyWriter.cc:571 %s/%s/%s timing arc type %s not supported.
|
||||||
0704 LibertyWriter.cc:289 %s/%s bundled ports not supported.
|
0704 LibertyWriter.cc:284 %s/%s bundled ports not supported.
|
||||||
0705 Liberty.cc:795 Liberty cell %s/%s for corner %s/%s not found.
|
0705 Liberty.cc:815 Liberty cell %s/%s for corner %s/%s not found.
|
||||||
0706 Parasitics.tcl:70 read_spef -increment is deprecated.
|
0706 Parasitics.tcl:70 read_spef -increment is deprecated.
|
||||||
0710 LumpedCapDelayCalc.cc:169 gate delay input variable is NaN
|
0710 LumpedCapDelayCalc.cc:169 gate delay input variable is NaN
|
||||||
0800 VcdReader.cc:109 unhandled vcd command.
|
0800 VcdReader.cc:110 unhandled vcd command.
|
||||||
0801 VcdReader.cc:145 timescale syntax error.
|
0801 VcdReader.cc:146 timescale syntax error.
|
||||||
0802 VcdReader.cc:159 Unknown timescale unit.
|
0802 VcdReader.cc:160 Unknown timescale unit.
|
||||||
0804 VcdReader.cc:200 Variable syntax error.
|
0804 VcdReader.cc:212 Variable syntax error.
|
||||||
0805 Vcd.cc:172 Unknown variable %s ID %s
|
0805 Vcd.cc:172 Unknown variable %s ID %s
|
||||||
0806 ReadVcdActivities.cc:247 clock %s vcd period %s differs from SDC clock period %s
|
0806 ReadVcdActivities.cc:247 clock %s vcd period %s differs from SDC clock period %s
|
||||||
0807 Sdc.tcl:394 only one of -cells, -data_pins, -clock_pins, -async_pins, -output_pins are suppported.
|
0807 Sdc.tcl:394 only one of -cells, -data_pins, -clock_pins, -async_pins, -output_pins are suppported.
|
||||||
0810 MakeTimingModel.cc:189 clock %s pin %s is inside model block.
|
0810 MakeTimingModel.cc:202 clock %s pin %s is inside model block.
|
||||||
0900 LibertyReader.cc:2840 level_shifter_type must be HL, LH, or HL_LH
|
0900 LibertyReader.cc:2834 level_shifter_type must be HL, LH, or HL_LH
|
||||||
0901 LibertyReader.cc:2876 switch_cell_type must be coarse_grain or fine_grain
|
0901 LibertyReader.cc:2870 switch_cell_type must be coarse_grain or fine_grain
|
||||||
0902 LibertyReader.cc:2464 unsupported model axis.
|
0902 LibertyReader.cc:2452 unsupported model axis.
|
||||||
0903 LibertyReader.cc:4219 %s group not in timing group.
|
0903 LibertyReader.cc:4213 %s group not in timing group.
|
||||||
0904 LibertyReader.cc:2447 receiver_capacitance group not in timing or pin group.
|
0904 LibertyReader.cc:2435 receiver_capacitance group not in timing or pin group.
|
||||||
0906 LibertyReader.cc:4112 unsupported model axis.
|
0906 LibertyReader.cc:4106 unsupported model axis.
|
||||||
0907 LibertyReader.cc:2492 output_current_%s group not in timing group.
|
0907 LibertyReader.cc:2480 output_current_%s group not in timing group.
|
||||||
0908 LibertyReader.cc:2591 vector reference_time not found.
|
0908 LibertyReader.cc:2585 vector reference_time not found.
|
||||||
0912 LibertyReader.cc:2589 vector index_1 and index_2 must have exactly one value.
|
0912 LibertyReader.cc:2583 vector index_1 and index_2 must have exactly one value.
|
||||||
0913 LibertyReader.cc:2531 output current waveform %.2e %.2e not found.
|
0913 LibertyReader.cc:2521 output current waveform %.2e %.2e not found.
|
||||||
0914 LibertyReader.cc:2624 normalized_driver_waveform variable_2 must be normalized_voltage
|
0914 LibertyReader.cc:2618 normalized_driver_waveform variable_2 must be normalized_voltage
|
||||||
0915 LibertyReader.cc:2627 normalized_driver_waveform variable_1 must be input_net_transition
|
0915 LibertyReader.cc:2621 normalized_driver_waveform variable_1 must be input_net_transition
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "ConcreteLibrary.hh"
|
#include "ConcreteLibrary.hh"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "PatternMatch.hh"
|
#include "PatternMatch.hh"
|
||||||
#include "PortDirection.hh"
|
#include "PortDirection.hh"
|
||||||
|
|
@ -275,32 +275,6 @@ ConcreteCell::portCount() const
|
||||||
return ports_.size();
|
return ports_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
PortSeq
|
|
||||||
ConcreteCell::findPortsMatching(const PatternMatch *pattern) const
|
|
||||||
{
|
|
||||||
PortSeq matches;
|
|
||||||
char bus_brkt_right = library_->busBrktRight();
|
|
||||||
const char *pattern1 = pattern->pattern();
|
|
||||||
bool bus_pattern = (pattern1[strlen(pattern1) - 1] == bus_brkt_right);
|
|
||||||
ConcreteCellPortIterator *port_iter = portIterator();
|
|
||||||
while (port_iter->hasNext()) {
|
|
||||||
ConcretePort *port = port_iter->next();
|
|
||||||
if (port->isBus() && bus_pattern) {
|
|
||||||
ConcretePortMemberIterator *member_iter = port->memberIterator();
|
|
||||||
while (member_iter->hasNext()) {
|
|
||||||
ConcretePort *port_bit = member_iter->next();
|
|
||||||
if (pattern->match(port_bit->name()))
|
|
||||||
matches.push_back(reinterpret_cast<Port*>(port_bit));
|
|
||||||
}
|
|
||||||
delete member_iter;
|
|
||||||
}
|
|
||||||
else if (pattern->match(port->name()))
|
|
||||||
matches.push_back(reinterpret_cast<Port*>(port));
|
|
||||||
}
|
|
||||||
delete port_iter;
|
|
||||||
return matches;
|
|
||||||
}
|
|
||||||
|
|
||||||
ConcreteCellPortIterator *
|
ConcreteCellPortIterator *
|
||||||
ConcreteCell::portIterator() const
|
ConcreteCell::portIterator() const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -605,14 +605,6 @@ ConcreteNetwork::findPort(const Cell *cell,
|
||||||
return reinterpret_cast<Port*>(ccell->findPort(name));
|
return reinterpret_cast<Port*>(ccell->findPort(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
PortSeq
|
|
||||||
ConcreteNetwork::findPortsMatching(const Cell *cell,
|
|
||||||
const PatternMatch *pattern) const
|
|
||||||
{
|
|
||||||
const ConcreteCell *ccell = reinterpret_cast<const ConcreteCell*>(cell);
|
|
||||||
return ccell->findPortsMatching(pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ConcreteNetwork::isLeaf(const Cell *cell) const
|
ConcreteNetwork::isLeaf(const Cell *cell) const
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "HpinDrvrLoad.hh"
|
#include "HpinDrvrLoad.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "Network.hh"
|
#include "Network.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@
|
||||||
#include "Liberty.hh"
|
#include "Liberty.hh"
|
||||||
#include "PortDirection.hh"
|
#include "PortDirection.hh"
|
||||||
#include "Corner.hh"
|
#include "Corner.hh"
|
||||||
|
#include "ParseBus.hh"
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
@ -56,6 +57,63 @@ Network::libertyLibrary(const Cell *cell) const
|
||||||
return libertyCell(cell)->libertyLibrary();
|
return libertyCell(cell)->libertyLibrary();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PortSeq
|
||||||
|
Network::findPortsMatching(const Cell *cell,
|
||||||
|
const PatternMatch *pattern) const
|
||||||
|
{
|
||||||
|
PortSeq matches;
|
||||||
|
bool is_bus, is_range, subscript_wild;
|
||||||
|
string bus_name;
|
||||||
|
int from, to;
|
||||||
|
parseBusName(pattern->pattern(), '[', ']', '\\',
|
||||||
|
is_bus, is_range, bus_name, from, to, subscript_wild);
|
||||||
|
if (is_bus) {
|
||||||
|
PatternMatch bus_pattern(bus_name.c_str(), pattern);
|
||||||
|
CellPortIterator *port_iter = portIterator(cell);
|
||||||
|
while (port_iter->hasNext()) {
|
||||||
|
Port *port = port_iter->next();
|
||||||
|
if (isBus(port)
|
||||||
|
&& bus_pattern.match(name(port))) {
|
||||||
|
if (is_range) {
|
||||||
|
// bus[8:0]
|
||||||
|
if (from > to)
|
||||||
|
std::swap(from, to);
|
||||||
|
for (int bit = from; bit <= to; bit++) {
|
||||||
|
Port *port_bit = findBusBit(port, bit);
|
||||||
|
matches.push_back(port_bit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (subscript_wild) {
|
||||||
|
PortMemberIterator *member_iter = memberIterator(port);
|
||||||
|
while (member_iter->hasNext()) {
|
||||||
|
Port *port_bit = member_iter->next();
|
||||||
|
matches.push_back(port_bit);
|
||||||
|
}
|
||||||
|
delete member_iter;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// bus[0]
|
||||||
|
Port *port_bit = findBusBit(port, from);
|
||||||
|
matches.push_back(port_bit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete port_iter;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
CellPortIterator *port_iter = portIterator(cell);
|
||||||
|
while (port_iter->hasNext()) {
|
||||||
|
Port *port = port_iter->next();
|
||||||
|
if (pattern->match(name(port)))
|
||||||
|
matches.push_back(port);
|
||||||
|
}
|
||||||
|
delete port_iter;
|
||||||
|
}
|
||||||
|
return matches;
|
||||||
|
}
|
||||||
|
|
||||||
LibertyLibrary *
|
LibertyLibrary *
|
||||||
Network::libertyLibrary(const Instance *instance) const
|
Network::libertyLibrary(const Instance *instance) const
|
||||||
{
|
{
|
||||||
|
|
@ -2035,6 +2093,16 @@ InstanceSet::compare(const InstanceSet *set1,
|
||||||
return (size1 > size2) ? 1 : -1;
|
return (size1 > size2) ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
InstanceSet::intersects(const InstanceSet *set1,
|
||||||
|
const InstanceSet *set2,
|
||||||
|
const Network *network)
|
||||||
|
{
|
||||||
|
return Set<const Instance*, InstanceIdLess>::intersects(set1, set2, InstanceIdLess(network));
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
PinSet::PinSet() :
|
PinSet::PinSet() :
|
||||||
Set<const Pin*, PinIdLess>(PinIdLess(nullptr))
|
Set<const Pin*, PinIdLess>(PinIdLess(nullptr))
|
||||||
{
|
{
|
||||||
|
|
@ -2072,6 +2140,16 @@ PinSet::compare(const PinSet *set1,
|
||||||
return (size1 > size2) ? 1 : -1;
|
return (size1 > size2) ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
PinSet::intersects(const PinSet *set1,
|
||||||
|
const PinSet *set2,
|
||||||
|
const Network *network)
|
||||||
|
{
|
||||||
|
return Set<const Pin*, PinIdLess>::intersects(set1, set2, PinIdLess(network));
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
NetSet::NetSet() :
|
NetSet::NetSet() :
|
||||||
Set<const Net*, NetIdLess>(NetIdLess(nullptr))
|
Set<const Net*, NetIdLess>(NetIdLess(nullptr))
|
||||||
{
|
{
|
||||||
|
|
@ -2109,4 +2187,12 @@ NetSet::compare(const NetSet *set1,
|
||||||
return (size1 > size2) ? 1 : -1;
|
return (size1 > size2) ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
NetSet::intersects(const NetSet *set1,
|
||||||
|
const NetSet *set2,
|
||||||
|
const Network *network)
|
||||||
|
{
|
||||||
|
return Set<const Net*, NetIdLess>::intersects(set1, set2, NetIdLess(network));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "ParseBus.hh"
|
#include "ParseBus.hh"
|
||||||
|
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
|
|
@ -95,37 +95,43 @@ parseBusName(const char *name,
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
parseBusRange(const char *name,
|
parseBusName(const char *name,
|
||||||
const char brkt_left,
|
const char brkt_left,
|
||||||
const char brkt_right,
|
const char brkt_right,
|
||||||
char escape,
|
char escape,
|
||||||
// Return values.
|
// Return values.
|
||||||
bool &is_bus,
|
bool &is_bus,
|
||||||
string &bus_name,
|
bool &is_range,
|
||||||
int &from,
|
string &bus_name,
|
||||||
int &to)
|
int &from,
|
||||||
|
int &to,
|
||||||
|
bool &subscript_wild)
|
||||||
{
|
{
|
||||||
const char brkts_left[2] = {brkt_left, '\0'};
|
const char brkts_left[2] = {brkt_left, '\0'};
|
||||||
const char brkts_right[2] = {brkt_right, '\0'};
|
const char brkts_right[2] = {brkt_right, '\0'};
|
||||||
parseBusRange(name, brkts_left, brkts_right, escape,
|
parseBusName(name, brkts_left, brkts_right, escape,
|
||||||
is_bus, bus_name, from, to);
|
is_bus, is_range, bus_name, from, to, subscript_wild);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
parseBusRange(const char *name,
|
parseBusName(const char *name,
|
||||||
const char *brkts_left,
|
const char *brkts_left,
|
||||||
const char *brkts_right,
|
const char *brkts_right,
|
||||||
char escape,
|
char escape,
|
||||||
// Return values.
|
// Return values.
|
||||||
bool &is_bus,
|
bool &is_bus,
|
||||||
string &bus_name,
|
bool &is_range,
|
||||||
int &from,
|
string &bus_name,
|
||||||
int &to)
|
int &from,
|
||||||
|
int &to,
|
||||||
|
bool &subscript_wild)
|
||||||
{
|
{
|
||||||
is_bus = false;
|
is_bus = false;
|
||||||
|
is_range = false;
|
||||||
|
subscript_wild = false;
|
||||||
size_t len = strlen(name);
|
size_t len = strlen(name);
|
||||||
// Shortest bus range is a[1:0].
|
// Shortest bus is a[0].
|
||||||
if (len >= 6
|
if (len >= 4
|
||||||
// Escaped bus brackets are not buses.
|
// Escaped bus brackets are not buses.
|
||||||
&& name[len - 2] != escape) {
|
&& name[len - 2] != escape) {
|
||||||
char last_ch = name[len - 1];
|
char last_ch = name[len - 1];
|
||||||
|
|
@ -135,17 +141,25 @@ parseBusRange(const char *name,
|
||||||
char brkt_left = brkts_left[brkt_index];
|
char brkt_left = brkts_left[brkt_index];
|
||||||
const char *left = strrchr(name, brkt_left);
|
const char *left = strrchr(name, brkt_left);
|
||||||
if (left) {
|
if (left) {
|
||||||
|
is_bus = true;
|
||||||
// Check for bus range.
|
// Check for bus range.
|
||||||
const char range_sep = ':';
|
const char range_sep = ':';
|
||||||
const char *range = strchr(name, range_sep);
|
const char *range = strchr(name, range_sep);
|
||||||
if (range) {
|
if (range) {
|
||||||
is_bus = true;
|
is_range = true;
|
||||||
bus_name.append(name, left - name);
|
bus_name.append(name, left - name);
|
||||||
// No need to terminate bus subscript because atoi stops
|
// No need to terminate bus subscript because atoi stops
|
||||||
// scanning at first non-digit character.
|
// scanning at first non-digit character.
|
||||||
from = atoi(left + 1);
|
from = atoi(left + 1);
|
||||||
to = atoi(range + 1);
|
to = atoi(range + 1);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
bus_name.append(name, left - name);
|
||||||
|
if (left[1] == '*')
|
||||||
|
subscript_wild = true;
|
||||||
|
else
|
||||||
|
from = to = atoi(left + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "VerilogNamespace.hh"
|
#include "VerilogNamespace.hh"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
|
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
#include "ParseBus.hh"
|
#include "ParseBus.hh"
|
||||||
|
|
|
||||||
|
|
@ -144,44 +144,6 @@ ConcreteParasitic::nodeIterator()
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
ConcreteElmore::ConcreteElmore() :
|
|
||||||
loads_(nullptr)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
ConcreteElmore::~ConcreteElmore()
|
|
||||||
{
|
|
||||||
delete loads_;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ConcreteElmore::findElmore(const Pin *load_pin,
|
|
||||||
float &elmore,
|
|
||||||
bool &exists) const
|
|
||||||
{
|
|
||||||
if (loads_)
|
|
||||||
loads_->findKey(load_pin, elmore, exists);
|
|
||||||
else
|
|
||||||
exists = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ConcreteElmore::deleteLoad(const Pin *load_pin)
|
|
||||||
{
|
|
||||||
loads_->erase(load_pin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
ConcreteElmore::setElmore(const Pin *load_pin,
|
|
||||||
float elmore)
|
|
||||||
{
|
|
||||||
if (loads_ == nullptr)
|
|
||||||
loads_ = new ConcreteElmoreLoadMap;
|
|
||||||
(*loads_)[load_pin] = elmore;
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
ConcretePi::ConcretePi(float c2,
|
ConcretePi::ConcretePi(float c2,
|
||||||
float rpi,
|
float rpi,
|
||||||
float c1) :
|
float c1) :
|
||||||
|
|
@ -230,10 +192,15 @@ ConcretePiElmore::ConcretePiElmore(float c2,
|
||||||
float rpi,
|
float rpi,
|
||||||
float c1) :
|
float c1) :
|
||||||
ConcretePi(c2, rpi, c1),
|
ConcretePi(c2, rpi, c1),
|
||||||
ConcreteElmore()
|
loads_(nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ConcretePiElmore::~ConcretePiElmore()
|
||||||
|
{
|
||||||
|
delete loads_;
|
||||||
|
}
|
||||||
|
|
||||||
float
|
float
|
||||||
ConcretePiElmore::capacitance() const
|
ConcretePiElmore::capacitance() const
|
||||||
{
|
{
|
||||||
|
|
@ -273,14 +240,25 @@ ConcretePiElmore::findElmore(const Pin *load_pin,
|
||||||
float &elmore,
|
float &elmore,
|
||||||
bool &exists) const
|
bool &exists) const
|
||||||
{
|
{
|
||||||
ConcreteElmore::findElmore(load_pin, elmore, exists);
|
if (loads_)
|
||||||
|
loads_->findKey(load_pin, elmore, exists);
|
||||||
|
else
|
||||||
|
exists = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ConcretePiElmore::setElmore(const Pin *load_pin,
|
ConcretePiElmore::setElmore(const Pin *load_pin,
|
||||||
float elmore)
|
float elmore)
|
||||||
{
|
{
|
||||||
ConcreteElmore::setElmore(load_pin, elmore);
|
if (loads_ == nullptr)
|
||||||
|
loads_ = new ConcreteElmoreLoadMap;
|
||||||
|
(*loads_)[load_pin] = elmore;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ConcretePiElmore::deleteLoad(const Pin *load_pin)
|
||||||
|
{
|
||||||
|
loads_->erase(load_pin);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
|
|
@ -82,24 +82,6 @@ public:
|
||||||
virtual ParasiticNodeIterator *nodeIterator();
|
virtual ParasiticNodeIterator *nodeIterator();
|
||||||
};
|
};
|
||||||
|
|
||||||
class ConcreteElmore
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void findElmore(const Pin *load_pin,
|
|
||||||
float &elmore,
|
|
||||||
bool &exists) const;
|
|
||||||
void deleteLoad(const Pin *load_pin);
|
|
||||||
void setElmore(const Pin *load_pin,
|
|
||||||
float elmore);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
ConcreteElmore();
|
|
||||||
virtual ~ConcreteElmore();
|
|
||||||
|
|
||||||
private:
|
|
||||||
ConcreteElmoreLoadMap *loads_;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Pi model for a driver pin.
|
// Pi model for a driver pin.
|
||||||
class ConcretePi
|
class ConcretePi
|
||||||
{
|
{
|
||||||
|
|
@ -126,13 +108,13 @@ protected:
|
||||||
|
|
||||||
// Pi model for a driver pin and the elmore delay to each load.
|
// Pi model for a driver pin and the elmore delay to each load.
|
||||||
class ConcretePiElmore : public ConcretePi,
|
class ConcretePiElmore : public ConcretePi,
|
||||||
public ConcreteElmore,
|
|
||||||
public ConcreteParasitic
|
public ConcreteParasitic
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
ConcretePiElmore(float c2,
|
ConcretePiElmore(float c2,
|
||||||
float rpi,
|
float rpi,
|
||||||
float c1);
|
float c1);
|
||||||
|
virtual ~ConcretePiElmore();
|
||||||
virtual bool isPiElmore() const { return true; }
|
virtual bool isPiElmore() const { return true; }
|
||||||
virtual bool isPiModel() const { return true; }
|
virtual bool isPiModel() const { return true; }
|
||||||
virtual float capacitance() const;
|
virtual float capacitance() const;
|
||||||
|
|
@ -143,6 +125,10 @@ public:
|
||||||
virtual void findElmore(const Pin *load_pin, float &elmore,
|
virtual void findElmore(const Pin *load_pin, float &elmore,
|
||||||
bool &exists) const;
|
bool &exists) const;
|
||||||
virtual void setElmore(const Pin *load_pin, float elmore);
|
virtual void setElmore(const Pin *load_pin, float elmore);
|
||||||
|
void deleteLoad(const Pin *load_pin);
|
||||||
|
|
||||||
|
private:
|
||||||
|
ConcreteElmoreLoadMap *loads_;
|
||||||
};
|
};
|
||||||
|
|
||||||
// PiElmore from wireload model estimate.
|
// PiElmore from wireload model estimate.
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "SpefNamespace.hh"
|
#include "SpefNamespace.hh"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
#include "StringSeq.hh"
|
#include "StringSeq.hh"
|
||||||
|
|
|
||||||
|
|
@ -135,11 +135,11 @@ ReadVcdActivities::setVarActivity(VcdVar *var,
|
||||||
if (var->width() == 1)
|
if (var->width() == 1)
|
||||||
setVarActivity(sta_name.c_str(), var_values, 0);
|
setVarActivity(sta_name.c_str(), var_values, 0);
|
||||||
else {
|
else {
|
||||||
bool is_bus;
|
bool is_bus, is_range, subscript_wild;
|
||||||
string bus_name;
|
string bus_name;
|
||||||
int from, to;
|
int from, to;
|
||||||
parseBusRange(sta_name.c_str(), '[', ']', '\\',
|
parseBusName(sta_name.c_str(), '[', ']', '\\',
|
||||||
is_bus, bus_name, from, to);
|
is_bus, is_range, bus_name, from, to, subscript_wild);
|
||||||
int value_bit = 0;
|
int value_bit = 0;
|
||||||
if (to < from) {
|
if (to < from) {
|
||||||
for (int bus_bit = to; bus_bit <= from; bus_bit++) {
|
for (int bus_bit = to; bus_bit <= from; bus_bit++) {
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,8 @@ namespace sta {
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
thrusIntersectPts(ExceptionThruSeq *thrus1,
|
thrusIntersectPts(ExceptionThruSeq *thrus1,
|
||||||
ExceptionThruSeq *thrus2);
|
ExceptionThruSeq *thrus2,
|
||||||
|
const Network *network);
|
||||||
static void
|
static void
|
||||||
insertPinPairsThruHierPin(const Pin *hpin,
|
insertPinPairsThruHierPin(const Pin *hpin,
|
||||||
const Network *network,
|
const Network *network,
|
||||||
|
|
@ -273,23 +274,24 @@ ExceptionPath::mergeablePts(ExceptionPath *exception2,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ExceptionPath::intersectsPts(ExceptionPath *exception) const
|
ExceptionPath::intersectsPts(ExceptionPath *exception,
|
||||||
|
const Network *network) const
|
||||||
{
|
{
|
||||||
ExceptionFrom *from2 = exception->from();
|
ExceptionFrom *from2 = exception->from();
|
||||||
ExceptionThruSeq *thrus2 = exception->thrus();
|
ExceptionThruSeq *thrus2 = exception->thrus();
|
||||||
ExceptionTo *to2 = exception->to();
|
ExceptionTo *to2 = exception->to();
|
||||||
if (((from_ == nullptr && from2 == nullptr)
|
if (((from_ == nullptr && from2 == nullptr)
|
||||||
|| (from_ && from2 && from_->intersectsPts(from2)))
|
|| (from_ && from2 && from_->intersectsPts(from2, network)))
|
||||||
&& ((thrus_ == nullptr && thrus2 == nullptr)
|
&& ((thrus_ == nullptr && thrus2 == nullptr)
|
||||||
|| (thrus_ && thrus2 && thrus_->size() == thrus2->size()))
|
|| (thrus_ && thrus2 && thrus_->size() == thrus2->size()))
|
||||||
&& ((to_ == nullptr && to2 == nullptr)
|
&& ((to_ == nullptr && to2 == nullptr)
|
||||||
|| (to_ && to2 && to_->intersectsPts(to2)))) {
|
|| (to_ && to2 && to_->intersectsPts(to2, network)))) {
|
||||||
ExceptionThruSeq::Iterator thrus_iter1(thrus_);
|
ExceptionThruSeq::Iterator thrus_iter1(thrus_);
|
||||||
ExceptionThruSeq::Iterator thrus_iter2(thrus2);
|
ExceptionThruSeq::Iterator thrus_iter2(thrus2);
|
||||||
while (thrus_iter1.hasNext() && thrus_iter2.hasNext()) {
|
while (thrus_iter1.hasNext() && thrus_iter2.hasNext()) {
|
||||||
ExceptionThru *thru1 = thrus_iter1.next();
|
ExceptionThru *thru1 = thrus_iter1.next();
|
||||||
ExceptionThru *thru2 = thrus_iter2.next();
|
ExceptionThru *thru2 = thrus_iter2.next();
|
||||||
if (!thru1->intersectsPts(thru2))
|
if (!thru1->intersectsPts(thru2, network))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -373,7 +375,8 @@ bool
|
||||||
ExceptionPath::resetMatch(ExceptionFrom *from,
|
ExceptionPath::resetMatch(ExceptionFrom *from,
|
||||||
ExceptionThruSeq *thrus,
|
ExceptionThruSeq *thrus,
|
||||||
ExceptionTo *to,
|
ExceptionTo *to,
|
||||||
const MinMaxAll *min_max)
|
const MinMaxAll *min_max,
|
||||||
|
const Network *network)
|
||||||
{
|
{
|
||||||
// Only the reset expception points need to match.
|
// Only the reset expception points need to match.
|
||||||
// For example, if the reset is -from, it matches any
|
// For example, if the reset is -from, it matches any
|
||||||
|
|
@ -382,56 +385,57 @@ ExceptionPath::resetMatch(ExceptionFrom *from,
|
||||||
return ((from && from_
|
return ((from && from_
|
||||||
&& thrus == nullptr
|
&& thrus == nullptr
|
||||||
&& to == nullptr
|
&& to == nullptr
|
||||||
&& from_->intersectsPts(from))
|
&& from_->intersectsPts(from, network))
|
||||||
// -thru
|
// -thru
|
||||||
|| (from == nullptr
|
|| (from == nullptr
|
||||||
&& thrus && thrus_
|
&& thrus && thrus_
|
||||||
&& to == nullptr
|
&& to == nullptr
|
||||||
&& thrusIntersectPts(thrus_, thrus))
|
&& thrusIntersectPts(thrus_, thrus, network))
|
||||||
// -to
|
// -to
|
||||||
|| (from == nullptr
|
|| (from == nullptr
|
||||||
&& thrus == nullptr
|
&& thrus == nullptr
|
||||||
&& to && to_
|
&& to && to_
|
||||||
&& to_->intersectsPts(to))
|
&& to_->intersectsPts(to, network))
|
||||||
// -from -thru
|
// -from -thru
|
||||||
|| (from && from_
|
|| (from && from_
|
||||||
&& thrus && thrus_
|
&& thrus && thrus_
|
||||||
&& to == nullptr
|
&& to == nullptr
|
||||||
&& from_->intersectsPts(from)
|
&& from_->intersectsPts(from, network)
|
||||||
&& thrusIntersectPts(thrus_, thrus))
|
&& thrusIntersectPts(thrus_, thrus, network))
|
||||||
// -from -to
|
// -from -to
|
||||||
|| (from && from_
|
|| (from && from_
|
||||||
&& thrus == nullptr
|
&& thrus == nullptr
|
||||||
&& to && to_
|
&& to && to_
|
||||||
&& from_->intersectsPts(from)
|
&& from_->intersectsPts(from, network)
|
||||||
&& to_->intersectsPts(to))
|
&& to_->intersectsPts(to, network))
|
||||||
// -thru -to
|
// -thru -to
|
||||||
|| (from == nullptr
|
|| (from == nullptr
|
||||||
&& thrus && thrus_
|
&& thrus && thrus_
|
||||||
&& to && to_
|
&& to && to_
|
||||||
&& thrusIntersectPts(thrus_, thrus)
|
&& thrusIntersectPts(thrus_, thrus, network)
|
||||||
&& to_->intersectsPts(to))
|
&& to_->intersectsPts(to, network))
|
||||||
// -from -thru -to
|
// -from -thru -to
|
||||||
|| (from && from_
|
|| (from && from_
|
||||||
&& thrus && thrus_
|
&& thrus && thrus_
|
||||||
&& to && to_
|
&& to && to_
|
||||||
&& from_->intersectsPts(from)
|
&& from_->intersectsPts(from, network)
|
||||||
&& thrusIntersectPts(thrus_, thrus)
|
&& thrusIntersectPts(thrus_, thrus, network)
|
||||||
&& to_->intersectsPts(to)))
|
&& to_->intersectsPts(to, network)))
|
||||||
&& (min_max == MinMaxAll::all()
|
&& (min_max == MinMaxAll::all()
|
||||||
|| min_max_ == min_max);
|
|| min_max_ == min_max);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
thrusIntersectPts(ExceptionThruSeq *thrus1,
|
thrusIntersectPts(ExceptionThruSeq *thrus1,
|
||||||
ExceptionThruSeq *thrus2)
|
ExceptionThruSeq *thrus2,
|
||||||
|
const Network *network)
|
||||||
{
|
{
|
||||||
ExceptionThruSeq::Iterator thrus_iter1(thrus1);
|
ExceptionThruSeq::Iterator thrus_iter1(thrus1);
|
||||||
ExceptionThruSeq::Iterator thrus_iter2(thrus2);
|
ExceptionThruSeq::Iterator thrus_iter2(thrus2);
|
||||||
while (thrus_iter1.hasNext() && thrus_iter2.hasNext()) {
|
while (thrus_iter1.hasNext() && thrus_iter2.hasNext()) {
|
||||||
ExceptionThru *thru1 = thrus_iter1.next();
|
ExceptionThru *thru1 = thrus_iter1.next();
|
||||||
ExceptionThru *thru2 = thrus_iter2.next();
|
ExceptionThru *thru2 = thrus_iter2.next();
|
||||||
if (!thru1->intersectsPts(thru2))
|
if (!thru1->intersectsPts(thru2, network))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
@ -774,7 +778,8 @@ bool
|
||||||
FilterPath::resetMatch(ExceptionFrom *,
|
FilterPath::resetMatch(ExceptionFrom *,
|
||||||
ExceptionThruSeq *,
|
ExceptionThruSeq *,
|
||||||
ExceptionTo *,
|
ExceptionTo *,
|
||||||
const MinMaxAll *)
|
const MinMaxAll *,
|
||||||
|
const Network *)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -1220,12 +1225,13 @@ ExceptionFrom::clone(const Network *network)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ExceptionFrom::intersectsPts(ExceptionFrom *from) const
|
ExceptionFrom::intersectsPts(ExceptionFrom *from,
|
||||||
|
const Network *network) const
|
||||||
{
|
{
|
||||||
return from->transition() == rf_
|
return from->transition() == rf_
|
||||||
&& ((pins_ && PinSet::intersects(pins_, from->pins()))
|
&& ((pins_ && PinSet::intersects(pins_, from->pins(), network))
|
||||||
|| (clks_ && ClockSet::intersects(clks_, from->clks()))
|
|| (clks_ && ClockSet::intersects(clks_, from->clks(), ClockIndexLess()))
|
||||||
|| (insts_ && InstanceSet::intersects(insts_, from->instances())));
|
|| (insts_ && InstanceSet::intersects(insts_, from->instances(), network)));
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
|
|
@ -1284,13 +1290,14 @@ ExceptionTo::asString(const Network *network) const
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ExceptionTo::intersectsPts(ExceptionTo *to) const
|
ExceptionTo::intersectsPts(ExceptionTo *to,
|
||||||
|
const Network *network) const
|
||||||
{
|
{
|
||||||
return to->transition() == rf_
|
return to->transition() == rf_
|
||||||
&& to->endTransition() == end_rf_
|
&& to->endTransition() == end_rf_
|
||||||
&& ((pins_ && PinSet::intersects(pins_, to->pins()))
|
&& ((pins_ && PinSet::intersects(pins_, to->pins(), network))
|
||||||
|| (clks_ && ClockSet::intersects(clks_, to->clks()))
|
|| (clks_ && ClockSet::intersects(clks_, to->clks(), ClockIndexLess()))
|
||||||
|| (insts_ && InstanceSet::intersects(insts_, to->instances())));
|
|| (insts_ && InstanceSet::intersects(insts_, to->instances(), network)));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
|
@ -1926,12 +1933,13 @@ ExceptionThru::deleteObjects(ExceptionThru *pt,
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ExceptionThru::intersectsPts(ExceptionThru *thru) const
|
ExceptionThru::intersectsPts(ExceptionThru *thru,
|
||||||
|
const Network *network) const
|
||||||
{
|
{
|
||||||
return thru->transition() == rf_
|
return thru->transition() == rf_
|
||||||
&& ((pins_ && PinSet::intersects(pins_, thru->pins()))
|
&& ((pins_ && PinSet::intersects(pins_, thru->pins(), network))
|
||||||
|| (nets_ && NetSet::intersects(nets_, thru->nets()))
|
|| (nets_ && NetSet::intersects(nets_, thru->nets(), network))
|
||||||
|| (insts_ && InstanceSet::intersects(insts_, thru->instances())));
|
|| (insts_ && InstanceSet::intersects(insts_, thru->instances(), network)));
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
|
|
@ -1973,7 +1981,7 @@ ExceptionThru::connectPinAfter(PinSet *drvrs,
|
||||||
for (const Pin *thru_pin : *pins_) {
|
for (const Pin *thru_pin : *pins_) {
|
||||||
if (network->isHierarchical(thru_pin)) {
|
if (network->isHierarchical(thru_pin)) {
|
||||||
PinSet *thru_pin_drvrs = network->drivers(thru_pin);
|
PinSet *thru_pin_drvrs = network->drivers(thru_pin);
|
||||||
if (PinSet::intersects(drvrs, thru_pin_drvrs))
|
if (PinSet::intersects(drvrs, thru_pin_drvrs, network))
|
||||||
makePinEdges(thru_pin, network);
|
makePinEdges(thru_pin, network);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1985,7 +1993,7 @@ ExceptionThru::connectPinAfter(PinSet *drvrs,
|
||||||
while (inst_pin_iter->hasNext()) {
|
while (inst_pin_iter->hasNext()) {
|
||||||
Pin *inst_pin = inst_pin_iter->next();
|
Pin *inst_pin = inst_pin_iter->next();
|
||||||
PinSet *inst_pin_drvrs = network->drivers(inst_pin);
|
PinSet *inst_pin_drvrs = network->drivers(inst_pin);
|
||||||
if (PinSet::intersects(drvrs, inst_pin_drvrs))
|
if (PinSet::intersects(drvrs, inst_pin_drvrs, network))
|
||||||
makePinEdges(inst_pin, network);
|
makePinEdges(inst_pin, network);
|
||||||
}
|
}
|
||||||
delete inst_pin_iter;
|
delete inst_pin_iter;
|
||||||
|
|
@ -1995,7 +2003,7 @@ ExceptionThru::connectPinAfter(PinSet *drvrs,
|
||||||
if (nets_) {
|
if (nets_) {
|
||||||
for (const Net *net : *nets_) {
|
for (const Net *net : *nets_) {
|
||||||
PinSet *net_drvrs = network->drivers(net);
|
PinSet *net_drvrs = network->drivers(net);
|
||||||
if (PinSet::intersects(drvrs, net_drvrs))
|
if (PinSet::intersects(drvrs, net_drvrs, network))
|
||||||
makeNetEdges(net, network);
|
makeNetEdges(net, network);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -4355,7 +4355,7 @@ Sdc::findMatchingExceptionsFirstThru(ExceptionPath *exception,
|
||||||
ExceptionThru *match_thru = (*match->thrus())[0];
|
ExceptionThru *match_thru = (*match->thrus())[0];
|
||||||
if (match_thru->nets()->hasKey(net)
|
if (match_thru->nets()->hasKey(net)
|
||||||
&& match->overrides(exception)
|
&& match->overrides(exception)
|
||||||
&& match->intersectsPts(exception))
|
&& match->intersectsPts(exception, network_))
|
||||||
matches.insert(match);
|
matches.insert(match);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -4427,7 +4427,7 @@ Sdc::findMatchingExceptions(ExceptionPath *exception,
|
||||||
if (potential_matches) {
|
if (potential_matches) {
|
||||||
for (ExceptionPath *match : *potential_matches) {
|
for (ExceptionPath *match : *potential_matches) {
|
||||||
if (match->overrides(exception)
|
if (match->overrides(exception)
|
||||||
&& match->intersectsPts(exception))
|
&& match->intersectsPts(exception, network_))
|
||||||
matches.insert(match);
|
matches.insert(match);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5072,7 +5072,7 @@ Sdc::resetPath(ExceptionFrom *from,
|
||||||
ExceptionPathSet::Iterator except_iter(exceptions_);
|
ExceptionPathSet::Iterator except_iter(exceptions_);
|
||||||
while (except_iter.hasNext()) {
|
while (except_iter.hasNext()) {
|
||||||
ExceptionPath *match = except_iter.next();
|
ExceptionPath *match = except_iter.next();
|
||||||
if (match->resetMatch(from, thrus, to, min_max)) {
|
if (match->resetMatch(from, thrus, to, min_max, network_)) {
|
||||||
debugPrint(debug_, "exception_match", 3, "reset match %s",
|
debugPrint(debug_, "exception_match", 3, "reset match %s",
|
||||||
match->asString(network_));
|
match->asString(network_));
|
||||||
ExceptionPathSet expansions;
|
ExceptionPathSet expansions;
|
||||||
|
|
@ -5081,7 +5081,7 @@ Sdc::resetPath(ExceptionFrom *from,
|
||||||
ExceptionPathSet::Iterator expand_iter(expansions);
|
ExceptionPathSet::Iterator expand_iter(expansions);
|
||||||
while (expand_iter.hasNext()) {
|
while (expand_iter.hasNext()) {
|
||||||
ExceptionPath *expand = expand_iter.next();
|
ExceptionPath *expand = expand_iter.next();
|
||||||
if (expand->resetMatch(from, thrus, to, min_max)) {
|
if (expand->resetMatch(from, thrus, to, min_max, network_)) {
|
||||||
unrecordPathDelayInternalStartpoints(expand->from());
|
unrecordPathDelayInternalStartpoints(expand->from());
|
||||||
unrecordPathDelayInternalEndpoints(expand);
|
unrecordPathDelayInternalEndpoints(expand);
|
||||||
delete expand;
|
delete expand;
|
||||||
|
|
|
||||||
|
|
@ -16,9 +16,9 @@
|
||||||
|
|
||||||
#include "WriteSdc.hh"
|
#include "WriteSdc.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <time.h>
|
#include <ctime>
|
||||||
|
|
||||||
#include "Zlib.hh"
|
#include "Zlib.hh"
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
|
|
||||||
#include "sdf/SdfReaderPvt.hh"
|
#include "sdf/SdfReaderPvt.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "sdf/SdfReader.hh"
|
#include "sdf/SdfReader.hh"
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <cstdarg>
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
|
|
||||||
#include "Error.hh"
|
#include "Error.hh"
|
||||||
#include "Debug.hh"
|
#include "Debug.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "sdf/SdfWriter.hh"
|
#include "sdf/SdfWriter.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <time.h>
|
#include <ctime>
|
||||||
|
|
||||||
#include "Zlib.hh"
|
#include "Zlib.hh"
|
||||||
#include "StaConfig.hh" // STA_VERSION
|
#include "StaConfig.hh" // STA_VERSION
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,6 @@
|
||||||
|
|
||||||
#include "Bfs.hh"
|
#include "Bfs.hh"
|
||||||
|
|
||||||
#include <limits.h>
|
|
||||||
|
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
#include "Debug.hh"
|
#include "Debug.hh"
|
||||||
#include "Mutex.hh"
|
#include "Mutex.hh"
|
||||||
|
|
@ -323,7 +321,7 @@ BfsIterator::remove(Vertex *vertex)
|
||||||
BfsFwdIterator::BfsFwdIterator(BfsIndex bfs_index,
|
BfsFwdIterator::BfsFwdIterator(BfsIndex bfs_index,
|
||||||
SearchPred *search_pred,
|
SearchPred *search_pred,
|
||||||
StaState *sta) :
|
StaState *sta) :
|
||||||
BfsIterator(bfs_index, 0, INT_MAX, search_pred, sta)
|
BfsIterator(bfs_index, 0, level_max, search_pred, sta)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -377,7 +375,7 @@ BfsFwdIterator::enqueueAdjacentVertices(Vertex *vertex,
|
||||||
BfsBkwdIterator::BfsBkwdIterator(BfsIndex bfs_index,
|
BfsBkwdIterator::BfsBkwdIterator(BfsIndex bfs_index,
|
||||||
SearchPred *search_pred,
|
SearchPred *search_pred,
|
||||||
StaState *sta) :
|
StaState *sta) :
|
||||||
BfsIterator(bfs_index, INT_MAX, 0, search_pred, sta)
|
BfsIterator(bfs_index, level_max, 0, search_pred, sta)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -402,7 +402,7 @@ CheckCrpr::crprPossible(const Clock *clk1,
|
||||||
|| clk1->isGenerated()
|
|| clk1->isGenerated()
|
||||||
|| clk2->isGenerated()
|
|| clk2->isGenerated()
|
||||||
// Different non-generated clocks with the same source pins (using -add).
|
// Different non-generated clocks with the same source pins (using -add).
|
||||||
|| PinSet::intersects(clk1->pins(), clk2->pins()));
|
|| PinSet::intersects(&clk1->pins(), &clk2->pins(), network_));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,7 @@ PathEnumed::transition(const StaState *sta) const
|
||||||
int
|
int
|
||||||
PathEnumed::trIndex(const StaState *sta) const
|
PathEnumed::trIndex(const StaState *sta) const
|
||||||
{
|
{
|
||||||
return tag(sta)->trIndex();
|
return tag(sta)->rfIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
PathAnalysisPt *
|
PathAnalysisPt *
|
||||||
|
|
|
||||||
|
|
@ -64,7 +64,7 @@ protected:
|
||||||
TimingArc *prev_arc_;
|
TimingArc *prev_arc_;
|
||||||
Arrival arrival_;
|
Arrival arrival_;
|
||||||
VertexId vertex_id_;
|
VertexId vertex_id_;
|
||||||
unsigned int tag_index_:tag_index_bits;
|
TagIndex tag_index_;
|
||||||
};
|
};
|
||||||
|
|
||||||
void deletePathEnumed(PathEnumed *path);
|
void deletePathEnumed(PathEnumed *path);
|
||||||
|
|
|
||||||
|
|
@ -193,7 +193,7 @@ PathVertex::transition(const StaState *) const
|
||||||
int
|
int
|
||||||
PathVertex::rfIndex(const StaState *) const
|
PathVertex::rfIndex(const StaState *) const
|
||||||
{
|
{
|
||||||
return tag_->trIndex();
|
return tag_->rfIndex();
|
||||||
}
|
}
|
||||||
|
|
||||||
PathAnalysisPt *
|
PathAnalysisPt *
|
||||||
|
|
@ -567,7 +567,7 @@ VertexPathIterator::findNext()
|
||||||
int arrival_index;
|
int arrival_index;
|
||||||
arrival_iter_.next(tag, arrival_index);
|
arrival_iter_.next(tag, arrival_index);
|
||||||
if ((rf_ == nullptr
|
if ((rf_ == nullptr
|
||||||
|| tag->trIndex() == rf_->index())
|
|| tag->rfIndex() == rf_->index())
|
||||||
&& (path_ap_ == nullptr
|
&& (path_ap_ == nullptr
|
||||||
|| tag->pathAPIndex() == path_ap_->index())
|
|| tag->pathAPIndex() == path_ap_->index())
|
||||||
&& (min_max_ == nullptr
|
&& (min_max_ == nullptr
|
||||||
|
|
|
||||||
|
|
@ -2887,7 +2887,7 @@ Search::findTag(const RiseFall *rf,
|
||||||
tag_capacity_ = new_capacity;
|
tag_capacity_ = new_capacity;
|
||||||
tag_set_->reserve(new_capacity);
|
tag_set_->reserve(new_capacity);
|
||||||
}
|
}
|
||||||
if (tag_next_ > tag_index_max)
|
if (tag_next_ == tag_index_max)
|
||||||
report_->critical(261, "max tag index exceeded");
|
report_->critical(261, "max tag index exceeded");
|
||||||
}
|
}
|
||||||
if (own_states)
|
if (own_states)
|
||||||
|
|
|
||||||
|
|
@ -2412,6 +2412,8 @@ Sta::makeCorners()
|
||||||
void
|
void
|
||||||
Sta::makeCorners(StringSet *corner_names)
|
Sta::makeCorners(StringSet *corner_names)
|
||||||
{
|
{
|
||||||
|
if (corner_names->size() > corner_count_max)
|
||||||
|
report_->error(374, "maximum corner count exceeded");
|
||||||
sdc_->makeCornersBefore();
|
sdc_->makeCornersBefore();
|
||||||
parasitics_->deleteParasitics();
|
parasitics_->deleteParasitics();
|
||||||
corners_->makeCorners(corner_names);
|
corners_->makeCorners(corner_names);
|
||||||
|
|
|
||||||
|
|
@ -41,7 +41,7 @@ tagStateEqualCrpr(const Tag *tag1,
|
||||||
const Tag *tag2);
|
const Tag *tag2);
|
||||||
|
|
||||||
Tag::Tag(TagIndex index,
|
Tag::Tag(TagIndex index,
|
||||||
int tr_index,
|
int rf_index,
|
||||||
PathAPIndex path_ap_index,
|
PathAPIndex path_ap_index,
|
||||||
ClkInfo *clk_info,
|
ClkInfo *clk_info,
|
||||||
bool is_clk,
|
bool is_clk,
|
||||||
|
|
@ -53,13 +53,13 @@ Tag::Tag(TagIndex index,
|
||||||
clk_info_(clk_info),
|
clk_info_(clk_info),
|
||||||
input_delay_(input_delay),
|
input_delay_(input_delay),
|
||||||
states_(states),
|
states_(states),
|
||||||
|
index_(index),
|
||||||
is_clk_(is_clk),
|
is_clk_(is_clk),
|
||||||
is_filter_(false),
|
is_filter_(false),
|
||||||
is_loop_(false),
|
is_loop_(false),
|
||||||
is_segment_start_(is_segment_start),
|
is_segment_start_(is_segment_start),
|
||||||
own_states_(own_states),
|
own_states_(own_states),
|
||||||
index_(index),
|
rf_index_(rf_index),
|
||||||
tr_index_(tr_index),
|
|
||||||
path_ap_index_(path_ap_index)
|
path_ap_index_(path_ap_index)
|
||||||
{
|
{
|
||||||
findHash();
|
findHash();
|
||||||
|
|
@ -177,7 +177,7 @@ Tag::asString(bool report_index,
|
||||||
const RiseFall *
|
const RiseFall *
|
||||||
Tag::transition() const
|
Tag::transition() const
|
||||||
{
|
{
|
||||||
return RiseFall::find(tr_index_);
|
return RiseFall::find(rf_index_);
|
||||||
}
|
}
|
||||||
|
|
||||||
PathAnalysisPt *
|
PathAnalysisPt *
|
||||||
|
|
@ -247,7 +247,7 @@ Tag::findHash()
|
||||||
{
|
{
|
||||||
// Common to hash_ and match_hash_.
|
// Common to hash_ and match_hash_.
|
||||||
hash_ = hash_init_value;
|
hash_ = hash_init_value;
|
||||||
hashIncr(hash_, tr_index_);
|
hashIncr(hash_, rf_index_);
|
||||||
hashIncr(hash_, path_ap_index_);
|
hashIncr(hash_, path_ap_index_);
|
||||||
hashIncr(hash_, is_clk_);
|
hashIncr(hash_, is_clk_);
|
||||||
hashIncr(hash_, is_segment_start_);
|
hashIncr(hash_, is_segment_start_);
|
||||||
|
|
@ -297,11 +297,11 @@ tagCmp(const Tag *tag1,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (cmp_rf) {
|
if (cmp_rf) {
|
||||||
int tr_index1 = tag1->trIndex();
|
int rf_index1 = tag1->rfIndex();
|
||||||
int tr_index2 = tag2->trIndex();
|
int rf_index2 = tag2->rfIndex();
|
||||||
if (tr_index1 < tr_index2)
|
if (rf_index1 < rf_index2)
|
||||||
return -1;
|
return -1;
|
||||||
if (tr_index1 > tr_index2)
|
if (rf_index1 > rf_index2)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -350,7 +350,7 @@ tagEqual(const Tag *tag1,
|
||||||
const Tag *tag2)
|
const Tag *tag2)
|
||||||
{
|
{
|
||||||
return tag1 == tag2
|
return tag1 == tag2
|
||||||
|| (tag1->trIndex() == tag2->trIndex()
|
|| (tag1->rfIndex() == tag2->rfIndex()
|
||||||
&& tag1->pathAPIndex() == tag2->pathAPIndex()
|
&& tag1->pathAPIndex() == tag2->pathAPIndex()
|
||||||
&& tag1->clkInfo() == tag2->clkInfo()
|
&& tag1->clkInfo() == tag2->clkInfo()
|
||||||
&& tag1->isClock() == tag2->isClock()
|
&& tag1->isClock() == tag2->isClock()
|
||||||
|
|
@ -404,7 +404,7 @@ tagMatch(const Tag *tag1,
|
||||||
const ClkInfo *clk_info2 = tag2->clkInfo();
|
const ClkInfo *clk_info2 = tag2->clkInfo();
|
||||||
return tag1 == tag2
|
return tag1 == tag2
|
||||||
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
||||||
&& tag1->trIndex() == tag2->trIndex()
|
&& tag1->rfIndex() == tag2->rfIndex()
|
||||||
&& tag1->pathAPIndex() == tag2->pathAPIndex()
|
&& tag1->pathAPIndex() == tag2->pathAPIndex()
|
||||||
&& tag1->isClock() == tag2->isClock()
|
&& tag1->isClock() == tag2->isClock()
|
||||||
&& tag1->isSegmentStart() == tag2->isSegmentStart()
|
&& tag1->isSegmentStart() == tag2->isSegmentStart()
|
||||||
|
|
@ -424,11 +424,11 @@ tagMatchCmp(const Tag *tag1,
|
||||||
if (tag1 == tag2)
|
if (tag1 == tag2)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
int tr_index1 = tag1->trIndex();
|
int rf_index1 = tag1->rfIndex();
|
||||||
int tr_index2 = tag2->trIndex();
|
int rf_index2 = tag2->rfIndex();
|
||||||
if (tr_index1 < tr_index2)
|
if (rf_index1 < rf_index2)
|
||||||
return -1;
|
return -1;
|
||||||
if (tr_index1 > tr_index2)
|
if (rf_index1 > rf_index2)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
PathAPIndex path_ap_index1 = tag1->pathAPIndex();
|
PathAPIndex path_ap_index1 = tag1->pathAPIndex();
|
||||||
|
|
@ -491,7 +491,7 @@ tagMatchNoCrpr(const Tag *tag1,
|
||||||
const ClkInfo *clk_info2 = tag2->clkInfo();
|
const ClkInfo *clk_info2 = tag2->clkInfo();
|
||||||
return tag1 == tag2
|
return tag1 == tag2
|
||||||
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
||||||
&& tag1->trIndex() == tag2->trIndex()
|
&& tag1->rfIndex() == tag2->rfIndex()
|
||||||
&& tag1->pathAPIndex() == tag2->pathAPIndex()
|
&& tag1->pathAPIndex() == tag2->pathAPIndex()
|
||||||
&& tag1->isClock() == tag2->isClock()
|
&& tag1->isClock() == tag2->isClock()
|
||||||
&& clk_info1->isGenClkSrcPath() == clk_info2->isGenClkSrcPath()
|
&& clk_info1->isGenClkSrcPath() == clk_info2->isGenClkSrcPath()
|
||||||
|
|
@ -506,7 +506,7 @@ tagMatchNoPathAp(const Tag *tag1,
|
||||||
const ClkInfo *clk_info2 = tag2->clkInfo();
|
const ClkInfo *clk_info2 = tag2->clkInfo();
|
||||||
return tag1 == tag2
|
return tag1 == tag2
|
||||||
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
||||||
&& tag1->trIndex() == tag2->trIndex()
|
&& tag1->rfIndex() == tag2->rfIndex()
|
||||||
&& tag1->isClock() == tag2->isClock()
|
&& tag1->isClock() == tag2->isClock()
|
||||||
&& tag1->isSegmentStart() == tag2->isSegmentStart()
|
&& tag1->isSegmentStart() == tag2->isSegmentStart()
|
||||||
&& clk_info1->isGenClkSrcPath() == clk_info2->isGenClkSrcPath()
|
&& clk_info1->isGenClkSrcPath() == clk_info2->isGenClkSrcPath()
|
||||||
|
|
@ -521,7 +521,7 @@ tagMatchCrpr(const Tag *tag1,
|
||||||
const ClkInfo *clk_info2 = tag2->clkInfo();
|
const ClkInfo *clk_info2 = tag2->clkInfo();
|
||||||
return tag1 == tag2
|
return tag1 == tag2
|
||||||
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
|| (clk_info1->clkEdge() == clk_info2->clkEdge()
|
||||||
&& tag1->trIndex() == tag2->trIndex()
|
&& tag1->rfIndex() == tag2->rfIndex()
|
||||||
&& tag1->isClock() == tag2->isClock()
|
&& tag1->isClock() == tag2->isClock()
|
||||||
&& tag1->isSegmentStart() == tag2->isSegmentStart()
|
&& tag1->isSegmentStart() == tag2->isSegmentStart()
|
||||||
&& clk_info1->isGenClkSrcPath() == clk_info2->isGenClkSrcPath()
|
&& clk_info1->isGenClkSrcPath() == clk_info2->isGenClkSrcPath()
|
||||||
|
|
|
||||||
|
|
@ -44,7 +44,7 @@ class Tag
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Tag(TagIndex index,
|
Tag(TagIndex index,
|
||||||
int tr_index,
|
int rf_index,
|
||||||
PathAPIndex path_ap_index,
|
PathAPIndex path_ap_index,
|
||||||
ClkInfo *clk_info,
|
ClkInfo *clk_info,
|
||||||
bool is_clk,
|
bool is_clk,
|
||||||
|
|
@ -63,7 +63,7 @@ public:
|
||||||
const ClockEdge *clkEdge() const;
|
const ClockEdge *clkEdge() const;
|
||||||
const Clock *clock() const;
|
const Clock *clock() const;
|
||||||
const Pin *clkSrc() const;
|
const Pin *clkSrc() const;
|
||||||
int trIndex() const { return tr_index_; }
|
int rfIndex() const { return rf_index_; }
|
||||||
const RiseFall *transition() const;
|
const RiseFall *transition() const;
|
||||||
PathAnalysisPt *pathAnalysisPt(const StaState *sta) const;
|
PathAnalysisPt *pathAnalysisPt(const StaState *sta) const;
|
||||||
PathAPIndex pathAPIndex() const { return path_ap_index_; }
|
PathAPIndex pathAPIndex() const { return path_ap_index_; }
|
||||||
|
|
@ -89,14 +89,14 @@ private:
|
||||||
ExceptionStateSet *states_;
|
ExceptionStateSet *states_;
|
||||||
size_t hash_;
|
size_t hash_;
|
||||||
size_t match_hash_;
|
size_t match_hash_;
|
||||||
|
TagIndex index_;
|
||||||
bool is_clk_:1;
|
bool is_clk_:1;
|
||||||
bool is_filter_:1;
|
bool is_filter_:1;
|
||||||
bool is_loop_:1;
|
bool is_loop_:1;
|
||||||
bool is_segment_start_:1;
|
bool is_segment_start_:1;
|
||||||
// Indicates that states_ is owned by the tag.
|
// Indicates that states_ is owned by the tag.
|
||||||
bool own_states_:1;
|
bool own_states_:1;
|
||||||
TagIndex index_:tag_index_bits;
|
unsigned int rf_index_:RiseFall::index_bit_count;
|
||||||
unsigned int tr_index_:RiseFall::index_bit_count;
|
|
||||||
unsigned int path_ap_index_:path_ap_index_bit_count;
|
unsigned int path_ap_index_:path_ap_index_bit_count;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
18
tcl/StaTcl.i
18
tcl/StaTcl.i
|
|
@ -4909,6 +4909,7 @@ write_path_spice_cmd(PathRef *path,
|
||||||
writePathSpice(path, spice_filename, subckt_filename,
|
writePathSpice(path, spice_filename, subckt_filename,
|
||||||
lib_subckt_filename, model_filename, off_path_pins,
|
lib_subckt_filename, model_filename, off_path_pins,
|
||||||
power_name, gnd_name, sta);
|
power_name, gnd_name, sta);
|
||||||
|
delete off_path_pins;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -5725,6 +5726,23 @@ current_waveform(float in_slew,
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
voltage_current(float in_slew,
|
||||||
|
float load_cap,
|
||||||
|
float voltage)
|
||||||
|
{
|
||||||
|
GateTableModel *gate_model = dynamic_cast<GateTableModel*>(self->model());
|
||||||
|
if (gate_model) {
|
||||||
|
OutputWaveforms *waveforms = gate_model->outputWaveforms();
|
||||||
|
if (waveforms) {
|
||||||
|
waveforms->setVdd(.7);
|
||||||
|
float current = waveforms->voltageCurrent(in_slew, load_cap, voltage);
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
} // TimingArc methods
|
} // TimingArc methods
|
||||||
|
|
||||||
%extend Instance {
|
%extend Instance {
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "Error.hh"
|
#include "Error.hh"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "Hash.hh"
|
#include "Hash.hh"
|
||||||
|
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include "PatternMatch.hh"
|
#include "PatternMatch.hh"
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
#include <tcl.h>
|
#include <tcl.h>
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "ReportStd.hh"
|
#include "ReportStd.hh"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "ReportTcl.hh"
|
#include "ReportTcl.hh"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,8 +17,8 @@
|
||||||
#include "StringUtil.hh"
|
#include "StringUtil.hh"
|
||||||
|
|
||||||
#include <limits>
|
#include <limits>
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
#include <stdio.h>
|
#include <cstdio>
|
||||||
|
|
||||||
#include "Machine.hh"
|
#include "Machine.hh"
|
||||||
#include "Mutex.hh"
|
#include "Mutex.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@
|
||||||
|
|
||||||
#include "TokenParser.hh"
|
#include "TokenParser.hh"
|
||||||
|
|
||||||
#include <ctype.h>
|
#include <cctype>
|
||||||
#include <string.h>
|
#include <cstring>
|
||||||
|
|
||||||
namespace sta {
|
namespace sta {
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "PortDirection.hh"
|
#include "PortDirection.hh"
|
||||||
#include "verilog/VerilogReaderPvt.hh"
|
#include "verilog/VerilogReaderPvt.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "VerilogReader.hh"
|
#include "VerilogReader.hh"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "Debug.hh"
|
#include "Debug.hh"
|
||||||
#include "Report.hh"
|
#include "Report.hh"
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
#include "VerilogWriter.hh"
|
#include "VerilogWriter.hh"
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <cstdlib>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
#include "Error.hh"
|
#include "Error.hh"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue