Open RecursionSheep opened 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.
I get it. Thanks for your reply!
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
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!