Skip to content

Commit 28177e9

Browse files
authored
Merge branch 'parallaxsw:master' into libarcs_smallfix
2 parents 9c7cfb4 + 86460db commit 28177e9

File tree

16 files changed

+195
-97
lines changed

16 files changed

+195
-97
lines changed

doc/OpenSTA.odt

105 Bytes
Binary file not shown.

doc/OpenSTA.pdf

1.65 KB
Binary file not shown.

include/sta/Liberty.hh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,8 @@ public:
541541
// for all the defined corners.
542542
static void checkLibertyCorners();
543543
void ensureVoltageWaveforms(const DcalcAnalysisPtSeq &dcalc_aps);
544+
const char *footprint() const;
545+
void setFootprint(const char *footprint);
544546

545547
protected:
546548
void addPort(ConcretePort *port);
@@ -631,6 +633,7 @@ protected:
631633
bool has_internal_ports_;
632634
bool have_voltage_waveforms_;
633635
std::mutex waveform_lock_;
636+
const char *footprint_;
634637

635638
private:
636639
friend class LibertyLibrary;

include/sta/Parasitics.hh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@ public:
154154
bool includes_pin_caps,
155155
const ParasiticAnalysisPt *ap) = 0;
156156
virtual ParasiticNodeSeq nodes(const Parasitic *parasitic) const = 0;
157+
virtual void report(const Parasitic *parasitic) const;
158+
virtual const Net *net(const Parasitic *parasitic) const = 0;
157159
virtual ParasiticResistorSeq resistors(const Parasitic *parasitic) const = 0;
158160
virtual ParasiticCapacitorSeq capacitors(const Parasitic *parasitic) const = 0;
159161
// Delete parasitic network if it exists.

liberty/Liberty.cc

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -768,8 +768,8 @@ LibertyLibrary::makeCornerMap(LibertyCell *cell1,
768768
cell2->name());
769769
}
770770

771-
for (auto arc_set1 : cell1->timing_arc_sets_) {
772-
auto arc_set2 = cell2->findTimingArcSet(arc_set1);
771+
for (TimingArcSet *arc_set1 : cell1->timing_arc_sets_) {
772+
TimingArcSet *arc_set2 = cell2->findTimingArcSet(arc_set1);
773773
if (arc_set2) {
774774
if (link) {
775775
const TimingArcSeq &arcs1 = arc_set1->arcs();
@@ -789,7 +789,7 @@ LibertyLibrary::makeCornerMap(LibertyCell *cell1,
789789
report->warn(1111, "cell %s/%s %s -> %s timing group %s not found in cell %s/%s.",
790790
cell1->library()->name(),
791791
cell1->name(),
792-
arc_set1->from()->name(),
792+
arc_set1->from() ? arc_set1->from()->name() : "",
793793
arc_set1->to()->name(),
794794
arc_set1->role()->asString(),
795795
cell2->library()->name(),
@@ -940,7 +940,8 @@ LibertyCell::LibertyCell(LibertyLibrary *library,
940940
leakage_power_(0.0),
941941
leakage_power_exists_(false),
942942
has_internal_ports_(false),
943-
have_voltage_waveforms_(false)
943+
have_voltage_waveforms_(false),
944+
footprint_(nullptr)
944945
{
945946
liberty_cell_ = this;
946947
}
@@ -968,6 +969,8 @@ LibertyCell::~LibertyCell()
968969
ocv_derate_map_.deleteContents();
969970

970971
pg_port_map_.deleteContents();
972+
973+
stringDelete(footprint_);
971974
}
972975

973976
LibertyPort *
@@ -1989,6 +1992,18 @@ LibertyCell::ensureVoltageWaveforms(const DcalcAnalysisPtSeq &dcalc_aps)
19891992
}
19901993
}
19911994

1995+
void
1996+
LibertyCell::setFootprint(const char *footprint)
1997+
{
1998+
footprint_ = stringCopy(footprint);
1999+
}
2000+
2001+
const char*
2002+
LibertyCell::footprint() const
2003+
{
2004+
return footprint_;
2005+
}
2006+
19922007
////////////////////////////////////////////////////////////////
19932008

19942009
LibertyCellPortIterator::LibertyCellPortIterator(const LibertyCell *cell) :

liberty/LibertyReader.cc

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,7 @@ LibertyReader::defineVisitors()
310310
defineAttrVisitor("switch_cell_type", &LibertyReader::visitSwitchCellType);
311311
defineAttrVisitor("interface_timing", &LibertyReader::visitInterfaceTiming);
312312
defineAttrVisitor("scaling_factors", &LibertyReader::visitScalingFactors);
313+
defineAttrVisitor("cell_footprint", &LibertyReader::visitCellFootprint);
313314

314315
// Pins
315316
defineGroupVisitor("pin", &LibertyReader::beginPin,&LibertyReader::endPin);
@@ -3065,6 +3066,16 @@ LibertyReader::visitClockGatingIntegratedCell(LibertyAttr *attr)
30653066
}
30663067
}
30673068

3069+
void
3070+
LibertyReader::visitCellFootprint(LibertyAttr *attr)
3071+
{
3072+
if (cell_) {
3073+
const char *footprint = getAttrString(attr);
3074+
if (footprint)
3075+
cell_->setFootprint(stringCopy(footprint));
3076+
}
3077+
}
3078+
30683079
////////////////////////////////////////////////////////////////
30693080

30703081
void

liberty/LibertyReaderPvt.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ public:
205205
virtual void visitInterfaceTiming(LibertyAttr *attr);
206206
virtual void visitScalingFactors(LibertyAttr *attr);
207207
virtual void visitCellLeakagePower(LibertyAttr *attr);
208+
virtual void visitCellFootprint(LibertyAttr *attr);
208209

209210
virtual void beginPin(LibertyGroup *group);
210211
virtual void endPin(LibertyGroup *group);

parasitics/ConcreteParasitics.cc

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -596,13 +596,14 @@ ConcreteParasiticNetwork::findParasiticNode(const Pin *pin) const
596596
ConcreteParasiticNode *
597597
ConcreteParasiticNetwork::ensureParasiticNode(const Net *net,
598598
int id,
599-
const Network *)
599+
const Network *network)
600600
{
601601
ConcreteParasiticNode *node;
602602
NetIdPair net_id(net, id);
603603
auto id_node = sub_nodes_.find(net_id);
604604
if (id_node == sub_nodes_.end()) {
605-
node = new ConcreteParasiticNode(net, id, net != net_);
605+
Net *net1 = network->highestNetAbove(const_cast<Net*>(net));
606+
node = new ConcreteParasiticNode(net, id, network->highestNetAbove(net1) != net_);
606607
sub_nodes_[net_id] = node;
607608
if (net == net_)
608609
max_node_id_ = max((int) max_node_id_, id);
@@ -1287,6 +1288,17 @@ ConcreteParasitics::deleteParasiticNetworks(const Net *net)
12871288
}
12881289
}
12891290

1291+
const Net *
1292+
ConcreteParasitics::net(const Parasitic *parasitic) const
1293+
{
1294+
const ConcreteParasiticNetwork *cparasitic =
1295+
static_cast<const ConcreteParasiticNetwork*>(parasitic);
1296+
if (cparasitic->isParasiticNetwork())
1297+
return cparasitic->net();
1298+
else
1299+
return nullptr;
1300+
}
1301+
12901302
bool
12911303
ConcreteParasitics::includesPinCaps(const Parasitic *parasitic) const
12921304
{

parasitics/ConcreteParasitics.hh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ public:
112112
void deleteParasiticNetwork(const Net *net,
113113
const ParasiticAnalysisPt *ap) override;
114114
void deleteParasiticNetworks(const Net *net) override;
115+
const Net *net(const Parasitic *parasitic) const override;
115116
bool includesPinCaps(const Parasitic *parasitic) const override;
116117
ParasiticNode *findParasiticNode(Parasitic *parasitic,
117118
const Net *net,

parasitics/ConcreteParasiticsPvt.hh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public:
207207
const Network *network);
208208
virtual ~ConcreteParasiticNetwork();
209209
virtual bool isParasiticNetwork() const { return true; }
210-
const Net *net() { return net_; }
210+
const Net *net() const { return net_; }
211211
bool includesPinCaps() const { return includes_pin_caps_; }
212212
ConcreteParasiticNode *findParasiticNode(const Net *net,
213213
int id,

0 commit comments

Comments
 (0)