Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/drt/src/pa/FlexPA.h
Original file line number Diff line number Diff line change
Expand Up @@ -721,6 +721,7 @@ class FlexPA
*
* @param unique_inst unique inst
*/
bool instPrefersHorizontal(frInst* unique_inst);
void prepPatternInst(frInst* unique_inst);

/**
Expand Down
32 changes: 30 additions & 2 deletions src/drt/src/pa/FlexPA_acc_pattern.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,42 @@ void FlexPA::addToInstsSet(frInst* inst)
insts_set_.insert(inst);
}

bool FlexPA::instPrefersHorizontal(frInst* unique_inst)
{
const int pin_access_idx = unique_inst->getPinAccessIdx();
// Positive if most access points are on Horizontal layers, Negative if on
// Vertical Layers
if (pin_access_idx < 0) {
return true;
}
int layer_direction_bias = 0;
const auto tech = getDesign()->getTech();
for (auto& inst_term : unique_inst->getInstTerms()) {
if (isSkipInstTerm(inst_term.get())) {
continue;
}
for (auto& pin : inst_term->getTerm()->getPins()) {
for (auto& ap : pin->getPinAccess(pin_access_idx)->getAccessPoints()) {
if (tech->getLayer(ap->getLayerNum())->isHorizontal()) {
layer_direction_bias++;
} else {
layer_direction_bias--;
}
}
}
}
return layer_direction_bias >= 0;
}
Comment on lines +85 to +110

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

high

To prevent potential crashes or undefined behavior, add defensive checks to ensure pin_access_idx is valid (non-negative) and that the retrieved pin_access pointer is not null before dereferencing it. Since pin_access_idx defaults to -1 when uninitialized, accessing it directly can lead to out-of-bounds memory access or null pointer dereferences.

bool FlexPA::instPrefersHorizontal(frInst* unique_inst)
{
  const int pin_access_idx = unique_inst->getPinAccessIdx();
  if (pin_access_idx < 0) {
    return true;
  }
  // Positive if most access points are on Horizontal layers, Negative if on
  // Vertical Layers
  int layer_direction_bias = 0;
  const auto tech = getDesign()->getTech();
  for (auto& inst_term : unique_inst->getInstTerms()) {
    if (isSkipInstTerm(inst_term.get())) {
      continue;
    }
    for (auto& pin : inst_term->getTerm()->getPins()) {
      auto pin_access = pin->getPinAccess(pin_access_idx);
      if (!pin_access) {
        continue;
      }
      for (auto& ap : pin_access->getAccessPoints()) {
        if (tech->getLayer(ap->getLayerNum())->isHorizontal()) {
          layer_direction_bias++;
        } else {
          layer_direction_bias--;
        }
      }
    }
  }
  return layer_direction_bias >= 0;
}


void FlexPA::prepPatternInst(frInst* unique_inst)
{
int num_valid_pattern = prepPatternInstHelper(unique_inst, true);
const bool prefer_x = !instPrefersHorizontal(unique_inst);
int num_valid_pattern = prepPatternInstHelper(unique_inst, prefer_x);

if (num_valid_pattern > 0) {
return;
}
num_valid_pattern = prepPatternInstHelper(unique_inst, false);
num_valid_pattern = prepPatternInstHelper(unique_inst, !prefer_x);

if (num_valid_pattern == 0) {
logger_->warn(DRT,
Expand Down
Loading