Skip to content

Commit 8271b4d

Browse files
authored
Merge pull request #10029 from QuantamHD/lef_parsing_jetski
ant: Supports LEF58_ANTENNAGATEPLUSDIFF rule in ant and odb
2 parents b59f633 + 89a3837 commit 8271b4d

13 files changed

Lines changed: 245 additions & 53 deletions

src/ant/src/AntennaChecker.cc

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct AntennaModel
5656

5757
double minus_diff_factor;
5858
double plus_diff_factor;
59+
std::vector<double> gate_plus_diff_idx;
60+
std::vector<double> gate_plus_diff_ratios;
5961
double diff_metal_reduce_factor;
6062
};
6163

@@ -138,6 +140,8 @@ void AntennaChecker::Impl::initAntennaRules()
138140

139141
double minus_diff_factor = 0.0;
140142
double plus_diff_factor = 0.0;
143+
std::vector<double> gate_plus_diff_idx;
144+
std::vector<double> gate_plus_diff_ratios;
141145
double diff_metal_reduce_factor = 1.0;
142146

143147
if (tech_layer->hasDefaultAntennaRule()) {
@@ -164,6 +168,9 @@ void AntennaChecker::Impl::initAntennaRules()
164168

165169
minus_diff_factor = antenna_rule->getAreaMinusDiffFactor();
166170
plus_diff_factor = antenna_rule->getGatePlusDiffFactor();
171+
auto pwl = antenna_rule->getGatePlusDiffPWL();
172+
gate_plus_diff_idx = pwl.indices;
173+
gate_plus_diff_ratios = pwl.ratios;
167174

168175
const double PSR_ratio = antenna_rule->getPSR();
169176
const odb::dbTechLayerAntennaRule::pwl_pair diffPSR
@@ -195,6 +202,8 @@ void AntennaChecker::Impl::initAntennaRules()
195202
diff_side_metal_factor,
196203
minus_diff_factor,
197204
plus_diff_factor,
205+
gate_plus_diff_idx,
206+
gate_plus_diff_ratios,
198207
diff_metal_reduce_factor};
199208
layer_info_[tech_layer] = layer_antenna;
200209
}
@@ -405,15 +414,22 @@ void AntennaChecker::Impl::calculateWirePar(odb::dbTechLayer* tech_layer,
405414
info.PAR = (diff_metal_factor * info.area) / info.iterm_gate_area;
406415
info.PSR = (diff_side_metal_factor * info.side_area) / info.iterm_gate_area;
407416

417+
double plus_diff_protect = plus_diff_factor * info.iterm_diff_area;
418+
if (!layer_info_[tech_layer].gate_plus_diff_idx.empty()) {
419+
odb::dbTechLayerAntennaRule::pwl_pair pwl
420+
= {.indices = layer_info_[tech_layer].gate_plus_diff_idx,
421+
.ratios = layer_info_[tech_layer].gate_plus_diff_ratios};
422+
plus_diff_protect = getPwlFactor(pwl, info.iterm_diff_area, 0.0);
423+
}
424+
408425
// Calculate PSR
409-
info.diff_PAR
410-
= (diff_metal_factor * info.area * diff_metal_reduce_factor
411-
- minus_diff_factor * info.iterm_diff_area)
412-
/ (info.iterm_gate_area + plus_diff_factor * info.iterm_diff_area);
426+
info.diff_PAR = (diff_metal_factor * info.area * diff_metal_reduce_factor
427+
- minus_diff_factor * info.iterm_diff_area)
428+
/ (info.iterm_gate_area + plus_diff_protect);
413429
info.diff_PSR
414430
= (diff_side_metal_factor * info.side_area * diff_metal_reduce_factor
415431
- minus_diff_factor * info.iterm_diff_area)
416-
/ (info.iterm_gate_area + plus_diff_factor * info.iterm_diff_area);
432+
/ (info.iterm_gate_area + plus_diff_protect);
417433
} else {
418434
// Calculate PAR
419435
info.PAR = (metal_factor * info.area) / info.iterm_gate_area;
@@ -448,11 +464,19 @@ void AntennaChecker::Impl::calculateViaPar(odb::dbTechLayer* tech_layer,
448464
if (info.iterm_diff_area != 0) {
449465
// Calculate PAR
450466
info.PAR = (diff_cut_factor * info.area) / info.iterm_gate_area;
467+
468+
double plus_diff_protect = plus_diff_factor * info.iterm_diff_area;
469+
if (!layer_info_[tech_layer].gate_plus_diff_idx.empty()) {
470+
odb::dbTechLayerAntennaRule::pwl_pair pwl
471+
= {.indices = layer_info_[tech_layer].gate_plus_diff_idx,
472+
.ratios = layer_info_[tech_layer].gate_plus_diff_ratios};
473+
plus_diff_protect = getPwlFactor(pwl, info.iterm_diff_area, 0.0);
474+
}
475+
451476
// Calculate diff_PAR
452-
info.diff_PAR
453-
= (diff_cut_factor * info.area * diff_metal_reduce_factor
454-
- minus_diff_factor * info.iterm_diff_area)
455-
/ (info.iterm_gate_area + plus_diff_factor * info.iterm_diff_area);
477+
info.diff_PAR = (diff_cut_factor * info.area * diff_metal_reduce_factor
478+
- minus_diff_factor * info.iterm_diff_area)
479+
/ (info.iterm_gate_area + plus_diff_protect);
456480
} else {
457481
// Calculate PAR
458482
info.PAR = (cut_factor * info.area) / info.iterm_gate_area;

src/odb/include/odb/db.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6670,6 +6670,7 @@ class dbTechLayerAntennaRule : public dbObject
66706670
pwl_pair getDiffPSR() const;
66716671
pwl_pair getDiffCSR() const;
66726672
pwl_pair getAreaDiffReduce() const;
6673+
pwl_pair getGatePlusDiffPWL() const;
66736674

66746675
// PWL
66756676
void setDiffPAR(const std::vector<double>& diff_idx,
@@ -6680,6 +6681,8 @@ class dbTechLayerAntennaRule : public dbObject
66806681
const std::vector<double>& ratios);
66816682
void setDiffCSR(const std::vector<double>& diff_idx,
66826683
const std::vector<double>& ratios);
6684+
void setGatePlusDiffPWL(const std::vector<double>& diff_idx,
6685+
const std::vector<double>& ratios);
66836686

66846687
// Single value
66856688
void setDiffPAR(double ratio);
@@ -9343,6 +9346,7 @@ class dbTechLayer : public dbObject
93439346
///
93449347
dbTechLayerAntennaRule* createDefaultAntennaRule();
93459348
dbTechLayerAntennaRule* createOxide2AntennaRule();
9349+
dbTechLayerAntennaRule* getOrCreateAntennaModel(int oxide_idx);
93469350

93479351
///
93489352
/// Access and write antenna rule models -- get functions will return nullptr

src/odb/src/db/dbDatabase.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,11 @@ namespace odb {
5050
inline constexpr uint32_t kSchemaMajor = 0; // Not used...
5151
inline constexpr uint32_t kSchemaInitial = 57;
5252

53-
inline constexpr uint32_t kSchemaMinor = 128; // Current revision number
53+
inline constexpr uint32_t kSchemaMinor = 129; // Current revision number
54+
55+
// Revision where _dbTechLayerAntennaRule was modified to use ARuleRatio for
56+
// gate_plus_diff
57+
inline constexpr uint32_t kSchemaLef58AntennaGatePlusDiff = 129;
5458

5559
// Revision where dbChipPath was added to dbChip
5660
inline constexpr uint32_t kSchemaChipPath = 128;

src/odb/src/db/dbTechLayer.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,6 +1215,21 @@ bool dbTechLayer::isRectOnlyExceptNonCorePins() const
12151215

12161216
// User Code Begin dbTechLayerPublicMethods
12171217

1218+
dbTechLayerAntennaRule* dbTechLayer::getOrCreateAntennaModel(int oxide_idx)
1219+
{
1220+
if (oxide_idx == 2) {
1221+
auto rule = getOxide2AntennaRule();
1222+
return rule ? rule : createOxide2AntennaRule();
1223+
}
1224+
if (oxide_idx == 1) {
1225+
auto rule = getDefaultAntennaRule();
1226+
return rule ? rule : createDefaultAntennaRule();
1227+
}
1228+
getImpl()->getLogger()->warn(
1229+
utl::ODB, 1118, "Unsupported oxide index: {}", oxide_idx);
1230+
return nullptr;
1231+
}
1232+
12181233
void dbTechLayer::setLef58Type(LEF58_TYPE type)
12191234
{
12201235
_dbTechLayer* layer = (_dbTechLayer*) this;

src/odb/src/db/dbTechLayerAntennaRule.cpp

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ bool _dbTechLayerAntennaRule::operator==(
9595
return false;
9696
}
9797

98-
if (gate_plus_diff_factor_ != rhs.gate_plus_diff_factor_) {
98+
if (gate_plus_diff_val_ != rhs.gate_plus_diff_val_) {
9999
return false;
100100
}
101101

@@ -239,7 +239,7 @@ dbOStream& operator<<(dbOStream& stream, const _dbTechLayerAntennaRule& inrule)
239239
stream << inrule.par_sidearea_val_;
240240
stream << inrule.cum_sidearea_val_;
241241
stream << inrule.area_diff_reduce_val_;
242-
stream << inrule.gate_plus_diff_factor_;
242+
stream << inrule.gate_plus_diff_val_;
243243
stream << inrule.area_minus_diff_factor_;
244244
stream << inrule.has_antenna_cumroutingpluscut_;
245245
return stream;
@@ -255,7 +255,13 @@ dbIStream& operator>>(dbIStream& stream, _dbTechLayerAntennaRule& inrule)
255255
stream >> inrule.par_sidearea_val_;
256256
stream >> inrule.cum_sidearea_val_;
257257
stream >> inrule.area_diff_reduce_val_;
258-
stream >> inrule.gate_plus_diff_factor_;
258+
if (inrule.getDatabase()->isSchema(kSchemaLef58AntennaGatePlusDiff)) {
259+
stream >> inrule.gate_plus_diff_val_;
260+
} else {
261+
double factor;
262+
stream >> factor;
263+
inrule.gate_plus_diff_val_.ratio_ = factor;
264+
}
259265
stream >> inrule.area_minus_diff_factor_;
260266
stream >> inrule.has_antenna_cumroutingpluscut_;
261267
return stream;
@@ -292,10 +298,22 @@ void dbTechLayerAntennaRule::writeLef(lefout& writer) const
292298
fmt::print(writer.out(), " ANTENNACUMROUTINGPLUSCUT ;\n");
293299
}
294300

295-
if (ant_rule->gate_plus_diff_factor_ > 0.0) {
301+
if (ant_rule->gate_plus_diff_val_.diff_ratio_.size() > 1) {
302+
fmt::print(writer.out(), " ANTENNAGATEPLUSDIFF PWL ( ");
303+
dbVector<double>::const_iterator diffdx_itr;
304+
dbVector<double>::const_iterator ratio_itr;
305+
for (diffdx_itr = ant_rule->gate_plus_diff_val_.diff_idx_.begin(),
306+
ratio_itr = ant_rule->gate_plus_diff_val_.diff_ratio_.begin();
307+
diffdx_itr != ant_rule->gate_plus_diff_val_.diff_idx_.end()
308+
&& ratio_itr != ant_rule->gate_plus_diff_val_.diff_ratio_.end();
309+
diffdx_itr++, ratio_itr++) {
310+
fmt::print(writer.out(), "( {:g} {:g} ) ", *diffdx_itr, *ratio_itr);
311+
}
312+
fmt::print(writer.out(), ") ;\n");
313+
} else if (ant_rule->gate_plus_diff_val_.ratio_ > 0.0) {
296314
fmt::print(writer.out(),
297315
" ANTENNAGATEPLUSDIFF {:g} ;\n",
298-
ant_rule->gate_plus_diff_factor_);
316+
ant_rule->gate_plus_diff_val_.ratio_);
299317
}
300318

301319
if (ant_rule->area_minus_diff_factor_ > 0.0) {
@@ -639,13 +657,29 @@ void dbTechLayerAntennaRule::setAntennaCumRoutingPlusCut(bool value)
639657
double dbTechLayerAntennaRule::getGatePlusDiffFactor() const
640658
{
641659
_dbTechLayerAntennaRule* ant_rule = (_dbTechLayerAntennaRule*) this;
642-
return ant_rule->gate_plus_diff_factor_;
660+
return ant_rule->gate_plus_diff_val_.ratio_;
643661
}
644662

645663
void dbTechLayerAntennaRule::setGatePlusDiffFactor(double factor)
646664
{
647665
_dbTechLayerAntennaRule* ant_rule = (_dbTechLayerAntennaRule*) this;
648-
ant_rule->gate_plus_diff_factor_ = factor;
666+
ant_rule->gate_plus_diff_val_.ratio_ = factor;
667+
}
668+
669+
dbTechLayerAntennaRule::pwl_pair dbTechLayerAntennaRule::getGatePlusDiffPWL()
670+
const
671+
{
672+
_dbTechLayerAntennaRule* ant_rule = (_dbTechLayerAntennaRule*) this;
673+
auto& rule = ant_rule->gate_plus_diff_val_;
674+
return {.indices = rule.diff_idx_, .ratios = rule.diff_ratio_};
675+
}
676+
677+
void dbTechLayerAntennaRule::setGatePlusDiffPWL(
678+
const std::vector<double>& diff_idx,
679+
const std::vector<double>& ratios)
680+
{
681+
_dbTechLayerAntennaRule* ant_rule = (_dbTechLayerAntennaRule*) this;
682+
ant_rule->gate_plus_diff_val_.setDiff(diff_idx, ratios);
649683
}
650684

651685
double dbTechLayerAntennaRule::getAreaMinusDiffFactor() const

src/odb/src/db/dbTechLayerAntennaRule.h

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ class _dbTechLayerAntennaRule : public _dbObject
8282
{
8383
public:
8484
_dbTechLayerAntennaRule(_dbDatabase*)
85-
: gate_plus_diff_factor_(0),
86-
area_minus_diff_factor_(0),
87-
has_antenna_cumroutingpluscut_(false)
85+
: area_minus_diff_factor_(0), has_antenna_cumroutingpluscut_(false)
8886
{
8987
}
9088
_dbTechLayerAntennaRule(_dbDatabase*, const _dbTechLayerAntennaRule& r)
@@ -96,7 +94,7 @@ class _dbTechLayerAntennaRule : public _dbObject
9694
par_sidearea_val_(r.par_sidearea_val_),
9795
cum_sidearea_val_(r.cum_sidearea_val_),
9896
area_diff_reduce_val_(r.area_diff_reduce_val_),
99-
gate_plus_diff_factor_(r.gate_plus_diff_factor_),
97+
gate_plus_diff_val_(r.gate_plus_diff_val_),
10098
area_minus_diff_factor_(r.area_minus_diff_factor_)
10199
{
102100
}
@@ -116,7 +114,7 @@ class _dbTechLayerAntennaRule : public _dbObject
116114
ARuleRatio par_sidearea_val_;
117115
ARuleRatio cum_sidearea_val_;
118116
ARuleRatio area_diff_reduce_val_;
119-
double gate_plus_diff_factor_;
117+
ARuleRatio gate_plus_diff_val_;
120118
double area_minus_diff_factor_;
121119
bool has_antenna_cumroutingpluscut_;
122120
};

0 commit comments

Comments
 (0)