/* -*- tab-width: 4 -*-
*
* Electric(tm) VLSI Design System
*
* File: GlobalRouterAnalysis.java
* Written by: Alexander Herzog (Team 4)
*
* Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* Electric(tm) is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Electric(tm); see the file COPYING. If not, write to
* the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
* Boston, Mass 02111-1307, USA.
*/
package com.sun.electric.tool.routing.experimentalLeeMoore2;
import java.util.List;
import com.sun.electric.tool.routing.experimentalLeeMoore2.GlobalRouterV3.RegionToRoute;
import com.sun.electric.tool.routing.experimentalLeeMoore2.GlobalRouterV3.RouteToStitch;
import com.sun.electric.tool.routing.experimentalLeeMoore2.RoutingFrameLeeMoore.ManhattenAlignment;
public class GlobalRouterAnalysis {
class AnalysisRegionResult{
int num_segments;
double wire_length;
}
AnalysisRegionResult[][] regionResult;
class AnalysisRouteResult{
int num_corners;
double route_length;
}
AnalysisRouteResult[] routeResult;
public GlobalRouterAnalysis(int num_hor, int num_vert, int num_segments){
regionResult = new AnalysisRegionResult[num_hor][num_vert];
for(int x = 0; x < regionResult.length; ++x){
for(int y = 0; y < regionResult[x].length; ++y){
regionResult[x][y] = new AnalysisRegionResult();
}
}
routeResult = new AnalysisRouteResult[num_segments];
for(int i = 0; i < routeResult.length; ++i){
routeResult[i] = new AnalysisRouteResult();
}
}
public void analyseGRresult(RegionToRoute[] regions, List<RouteToStitch> routes){
/** segment patches and congestion per region */
for(int i = 0; i < regions.length; ++i){
int x = i % regionResult.length;
int y = (int)Math.floor(i / regionResult.length);
regionResult[x][y].num_segments = regions[y * regionResult.length
+ x].segments_to_route.size();
for(SegPart sp : regions[y * regionResult.length + x].segments_to_route){
double dx = Math.abs(sp.segment_part.get(sp.segment_part.size() - 1).x
- sp.segment_part.get(0).x);
double dy = Math.abs(sp.segment_part.get(sp.segment_part.size() - 1).y
- sp.segment_part.get(0).y);
regionResult[x][y].wire_length += dx + dy;
}
}
/** length and corners of routes */
for(RouteToStitch rts : routes){
routeResult[rts.id].num_corners = 0;
int part_size = rts.coarse_route.get(0).segment_part.size();
ManhattenAlignment last_dir = rts.coarse_route.get(0).segment_part.get(part_size - 1).alignment;
for(int i = 1; i < rts.coarse_route.size() - 1; ++i){
part_size = rts.coarse_route.get(i).segment_part.size();
ManhattenAlignment cur_dir = rts.coarse_route.get(i).segment_part.get(part_size - 1).alignment;
if(cur_dir != last_dir){
++routeResult[rts.id].num_corners;
}
last_dir = cur_dir;
}
for(SegPart sp : rts.coarse_route){
double dx = Math.abs(sp.segment_part.get(sp.segment_part.size() - 1).x
- sp.segment_part.get(0).x);
double dy = Math.abs(sp.segment_part.get(sp.segment_part.size() - 1).y
- sp.segment_part.get(0).y);
routeResult[rts.id].route_length += dx + dy;
}
}
}
}