liangrj2014 / ISPD24_contest

20 stars 0 forks source link

On non-stacking vias #17

Open RecursionSheep opened 10 months ago

RecursionSheep commented 10 months ago

I read the latest version of the contest introduction, and it says that "we exclude the consideration of routing demand overhead attributed to stacking vias." In the current version of the evaluator, it seems that it does not check whether a via is stacking or non-stacking (lines 521-524). Could you please check if this is correct? Also, in NVR_DB::update_nonstack_via_counter (lines 614-647), it seems that a non-stacking via connecting layer z and z+1 only contributes to the demand of layer z. As far as I am concerned, a via will impede the utilization of routing resources on both layers. Could you please confirm if this is correct? Thanks for your help!

liangrj2014 commented 10 months ago

Thanks for the questions! I

Q1: In the current version of the evaluator, it seems that it does not check whether a via is stacking or non-stacking (lines 521-524). Could you please check if this is correct?

In line 620, we will first check whether flag[pp.z()][pp.x()][pp.y()] !=net_idx. For stacking vias , it would be NO, since the flag has been updated in line 533-549. For non-stacking vias, it would be YES.

Q2: Also, in NVR_DB::update_nonstack_via_counter (lines 614-647), it seems that a non-stacking via connecting layer z and z+1 only contributes to the demand of layer z. As far as I am concerned, a via will impede the utilization of routing resources on both layers. Could you please confirm if this is correct?

If vias connect a wire metal at layer z to a wire metal at layer z+h, our evaluator will account for additional routing demand overhead from layer z+1 to layer z+h-1.

RecursionSheep commented 10 months ago

I get it. Thanks for your reply!

akrishnaams commented 10 months ago
void NVR_DB::update_nonstack_via_counter(unsigned net_idx,
  const std::vector<NVR_Point3D> &via_loc,
  std::vector< std::vector< std::vector<int> > > &flag,
  std::vector< std::vector< std::vector<int> > > &nonstack_via_counter) const
{
  for(const NVR_Point3D &pp : via_loc) {
    if(flag[pp.z()][pp.x()][pp.y()] != net_idx) {
      flag[pp.z()][pp.x()][pp.y()] = net_idx;

      int direction = layer_directions[pp.z()];
      if(direction == 0) {
        if ((pp.x() > 0) && (pp.x() < m_graph.num_gridx() - 1)) {
          nonstack_via_counter[pp.z()][pp.x()-1][pp.y()]++;
          nonstack_via_counter[pp.z()][pp.x()][pp.y()]++;
        } else if (pp.x() > 0 ) {
          nonstack_via_counter[pp.z()][pp.x()-1][pp.y()] += 2;
        } else if (pp.x() < m_graph.num_gridx() - 1) {
          nonstack_via_counter[pp.z()][pp.x()][pp.y()] += 2;
        }
      } else if (direction == 1) {
        if ((pp.y() > 0) && (pp.y() < m_graph.num_gridy() - 1)) {
          nonstack_via_counter[pp.z()][pp.x()][pp.y()-1]++;
          nonstack_via_counter[pp.z()][pp.x()][pp.y()]++;
        } else if (pp.y() > 0 ) {
          nonstack_via_counter[pp.z()][pp.x()][pp.y()-1] += 2;
        } else if (pp.y() < m_graph.num_gridy() - 1) {
          nonstack_via_counter[pp.z()][pp.x()][pp.y()] += 2;
        }
      }
      //nonstack_via_counter[pp.z()][pp.x()][pp.y()]++;
    }

  }
}

Why are non-stack vias considered on adjacent GCells as well? Like

          nonstack_via_counter[pp.z()][pp.x()-1][pp.y()]++;
          nonstack_via_counter[pp.z()][pp.x()][pp.y()]++;

Sorry if I am missing out on something