文章目录
- 一、 顶层代码框架和功能
- (一)、总结
- (二)、各文件代码的概述:
- 1. FastRoute\\src\\Box.h
- 2. FastRoute\\src\\Coordinate.h
- 3. FastRoute\\src\\DBWrapper.h
- 4. FastRoute\\src\\FastRouteKernel.h
- 5. FastRoute\\src\\Grid.h
- 成员变量
- 成员函数
- 6. FastRoute\\src\\Net.h
- 7. FastRoute\\src\\Netlist.h
- 8. FastRoute\\src\\Pin.h
- 9. FastRoute\\src\\RoutingLayer.h
- 10. FastRoute\\src\\RoutingTracks.h
- 11. FastRoute\\src\\TclInterface.h
- 二、FastRoute算法主体
- (一)、整体功能和构架:
- (二)、各文件代码的概述
- 1. third_party\\fastroute\\include\\FastRoute.h
- 2. third_party\\fastroute\\src\\DataProc.h
- 3. third_party\\fastroute\\src\\DataType.h
- 4. third_party\\fastroute\\src\\dist.h
- 5. third_party\\fastroute\\src\\dl.h
- 6. third_party\\fastroute\\src\\EdgeShift.h
- 7. third_party\\fastroute\\src\\global.h
- 8. third_party\\fastroute\\src\\heap.h
- 9. third_party\\fastroute\\src\\maze.h
- 10. third_party\fastroute\src\maze3D.h
- 11. third_party\\fastroute\\src\\mst2.h
- 12. third_party\\fastroute\\src\\neighbors.h
- 13. third_party\\fastroute\\src\\RipUp.h
- 14. third_party\\fastroute\\src\\route.h
- 15. third_party\\fastroute\\src\\RSMT.h
- 16. third_party\\fastroute\\src\\utility.h
- 三、thirdParty
- (一)、flute3
- 1. 总览
- 2. 各文件分析
- 1. flute3\\flute.h
- 3. 方法分析
一、 顶层代码框架和功能
(一)、总结
根据分析,FastRoute程序的整体功能为实现针对电路设计的布局引擎,从而辅助设计人员快速布线电路。
程序架构包括多个文件,其中主要文件及其功能如下:
文件名 | 功能 |
---|---|
Box.h | 定义代表矩形框的Box类 |
Coordinate.h | 定义代表坐标的Coordinate类 |
DBWrapper.h | 包装整个数据库的类文件 |
FastRouteKernel.h | 实现FastRoute的主要算法、配置选项、容量调整和容量约束等 |
Grid.h | 定义一个代表电路布局的网格模型Grid类 |
Net.h | 定义代表网络的Net类 |
Netlist.h | 定义代表整个网表的Netlist类 |
Pin.h | 定义代表引脚的Pin类 |
RoutingLayer.h | 定义代表路由层的RoutingLayer类 |
RoutingTracks.h | 定义代表路由轨迹的RoutingTracks类 |
TclInterface.h | 与Tcl语言交互实现FastRoute的功能 |
这些文件共同构成了FastRoute程序的功能和实现。
(二)、各文件代码的概述:
1. FastRoute\src\Box.h
~~~~ 该文件名是Box.h,是FastRoute项目的一个头文件,包含了一个Box类的定义。
~~~~ Box类用于描述一个矩形框,其中包括了矩形框的左下角、右上角两个坐标点以及该矩形框所处的层号。该类实现了几个函数,如获取矩形框的左下角、右上角两个坐标点、该矩形框所处的层号,获取矩形框的半周长和中心点,判断一个矩形框是否与另一个矩形框重叠等。
~~~~ 该头文件还包含了Coordinate.h头文件,使用了Coordinate类。还包含了<algorithm>和<limits>
库。
2. FastRoute\src\Coordinate.h
~~~~ 该文件是一个C++头文件,定义了一个命名空间FastRoute,其中包括了一个名为Coordinate的类。Coordinate类有两个私有成员 _x
和_y
, 表示坐标的横向和纵向分量。该类提供了默认构造函数和一个构造函数,接受两个long long int类型的参数,分别为坐标的横向和纵向分量。此外,该类还有一个init函数,用来初始化坐标。该类支持==
运算符重载,用于比较两个坐标是否相等。类还定义了setX、setY、getX、getY四个成员函数,用于设置和获取横向和纵向分量的值。最后,定义了一个名为dst的成员函数,该函数接受一个坐标作为参数,用来计算两个坐标之间的欧几里得距离。该头文件还定义了一个类型别名DBU,用于表示坐标分量的类型。
3. FastRoute\src\DBWrapper.h
~~~~ 这个程序文件是一个包装整个数据库的类文件,文件名为DBWrapper.h。它通过 OpenDB 库提供的函数解析 LEF 和 DEF 格式的文件,用于电路布局。该类控制API和进行转换以将LEF和DEF格式的设计加载进网格以用作FastRoute布线的输入。此文件使用Netlist、Grid、RoutingTracks和RoutingLayers类。其中包括了各种成员函数对对数据库进行初始化和更新等操作。该文件对其他文件的代码保持独立性。
4. FastRoute\src\FastRouteKernel.h
~~~~ 该程序文件为FastRoute的主要实现代码,包括对LEF/DEF文件的解析、网格的初始化、层的初始化、轨道的初始化、网络的初始化、容量和间距的设置、调整网格容量、调整轨道容量、调整全局容量、调整层容量、调整区域容量、调整障碍容量、检查引脚摆放情况等函数实现。
~~~~ 程序提供了多种配置选项,通过调用不同的函数可以实现不同的容量调整和容量约束,对于每个net也保存了其对应的网络度信息。该程序的主要输出为output.guide文件,也提供了打印网格的函数printGrid()和执行流程的run()函数。
5. FastRoute\src\Grid.h
~~~~ 本文件为FastRoute中Grid类的头文件,主要定义了一个网格图形的数学模型,表示一个具有yGrids行、xGrids列的网格floorplane,包括每一层floorplane的布线层数、每个grid在horitontal或vertical方向上的布线容量、每个grid包含的track数量以及每一层所包含的物理obstacle。其中包括如下主要成员变量与成员函数:
成员变量
- _lowerLeftX,_lowerLeftY,_upperRightX,_upperRightY:分别表示网格区域的左下角和右上角坐标位置。
- _tileWidth, _tileHeight:表示每个网格瓦片(tile)的宽度和高度
- _xGrids, _yGrids:分别表示网格的列数和行数。
- _perfectRegularX,_perfectRegularY:一个布尔值,表示网格是否在X方向和Y方向上完全匹配。
- _numLayers:表示floorplane的布线层数。
- _pitchesInTile:表示每个网格tile中包含track的个数。
- _spacings,_minWidths:表示每个层内的金属shape的最小间距和最小宽度。
- _horizontalEdgesCapacities,_verticalEdgesCapacities:分别表示每个水平边缘最大容量和垂直边缘最大容量。
- _obstacles:表示每一层所包含的obstacle物理。
成员函数
-
构造函数:用于初始化上述成员变量。
-
getPositionOnGrid():返回传入位置的最接近网格顶点。
-
getBlockedTiles():根据障碍物box的具体情况,返回障碍物占据的所有tile瓦片。
-
computeTileReduce():计算tile被障碍物占据后的情况,并返回被reduce的track数。
总体来说,这个类提供了网格数学模型建模的方法以便于后端Router模块对于设计网格的实际布线和预测和修改。
6. FastRoute\src\Net.h
~~~~ 该文件定义了一个Net类,用于存储电路图的网。Net类包括了一个名称、信号类型和一个包含多个引脚的Pin向量。
~~~~ 类的内部实现使用了std命名空间,包括了std::string, std::vector, std::function和std::numeric_limits。这些命名空间的功能分别为字符串、向量、函数和数值极限。
~~~~ Net类包含了默认构造函数和一个带参构造函数。名称、信号类型和引脚向量都可以通过构造函数进行初始化。同时,Net类还提供了四个公有的成员函数,分别为获取名称、获取信号类型、获取引脚向量和获取引脚数量。
~~~~ 该程序文件的注释表明了该程序是根据BSD 3-Clause许可证发布的,并且版权归Federal University of Rio Grande do Sul (UFRGS)所有。该许可证声明了用户可以复制、分发和修改程序,只要用户保留原版权声明。此外,该程序还包含了作者和指导者的信息。
7. FastRoute\src\Netlist.h
~~~~ 该程序文件是一个C++头文件,名为Netlist.h,定义了一个Netlist类和与Netlist相关的三个辅助类(Coordinate,Box,Pin)和一个Net类。其中Netlist类用于存储和操作电路图的所有信息,包括Net类的实例(代表电路图中的每个网络)和Pin类的实例(代表电路图中的每个管脚)。Netlist类提供了一些函数来操作Net和Pin实例,比如添加新的网络、根据网络名称查找网络、获取网络数等。此外,还提供了一些辅助函数,比如获取电路图中具有最大入度的网络的入度数目、获取所有端口(即输入/输出管脚)的列表等。Netlist.h同样包含了各种实用程序,包括字符串处理、容器类等。
8. FastRoute\src\Pin.h
~~~~ 该程序文件名为Pin.h,其中定义了一个名为Pin的类。该类表示一个引脚,包含引脚名称、位置、所在层、边界框、所属网络名称和是否为端口的信息。引脚类具有以下成员函数:
-
getName():返回引脚名称。
-
getPosition():返回引脚位置。
-
getLayers():返回引脚所在层。
-
getNumLayers():返回引脚所在层数量。
-
getTopLayer():返回引脚所在的最高层。
-
getBoxes():返回引脚在各层中的边界框。
-
getNetName():返回引脚所属的网络名称。
-
isPort():返回引脚是否为端口。
此外,还有一些私有成员函数和变量,用于为公共成员函数提供支持。
9. FastRoute\src\RoutingLayer.h
~~~~ 该文件定义了一个名为RoutingLayer的类,表示FastRoute中的一个路由层。该类包含了路由层的索引、名称和首选方向等属性,并提供了相应的访问方法。同时,类中还定义了一些用于表示首选方向的常量。
10. FastRoute\src\RoutingTracks.h
~~~~ 本程序文件是一个C++语言编写的头文件,命名为RoutingTracks.h。该文件定义了一个类RoutingTracks,用于存储路由轨迹的信息。该类有五个私有成员变量,包括层索引、轨迹间距、轨迹位置、轨迹数量和方向。其中,层索引是一个整数,轨迹间距、位置和数量都是由数据库单位(DBU)表示的数值,方向是一个布尔值,用于指示路由轨迹的方向(水平或垂直)。类中定义了一些成员函数,包括获取私有成员变量的函数。该文件采用BSD 3-Clause License协议。
11. FastRoute\src\TclInterface.h
~~~~ 该程序文件名为TclInterface.h,是一个头文件。该头文件中定义了一些函数和变量,旨在与Tcl语言交互实现FastRoute引擎的功能。
~~~~ 其中函数包括:
- 帮助命令(help)
- LEF/DEF/Guides接口(fr_import_lef、fr_import_def、set_output_file)
- 参数接口(set_pitches_in_tile、set_capacity_adjustment、set_layer_adjustment、set_region_adjustment、set_min_layer、set_max_layer、set_unidirectional_routing、set_clock_net_routing)、运行命令(start_fastroute、run_fastroute、run、write_guides)。
~~~~ 这些函数用于设定FastRoute引擎中的参数、读入需处理的文件、运行FastRoute引擎以执行任务、输出结果文件。
二、FastRoute算法主体
(一)、整体功能和构架:
~~~~ FastRoute是一个开源的全局路由器,其主要功能是生成布线网路线,并通过一个合适的路由网完成PCB布线。该程序的基本流程包括读取原始网表、产生全局路由器、进行布线引导、对布线结果进行路径管理等。
~~~~ FastRoute目前支持pad-to-pad以及finned-pad结构。整个程序的构架可以分为以下几部分:
-
数据预处理: 对原始的网表数据进行一些预处理以便后续操作。
-
路由器:根据提供的原始网表生成导航器。
-
导航引导:在导航器的基础上进行导航引导得到初始布线解。
-
路径管理:对初始布线解进行路径管理,得到最终的布线结果。
对每个文件的功能进行整理:
文件名 | 功能 |
---|---|
include\FastRoute.h | 定义了必需的数据类型和函数,是FastRoute库使用时必要的头文件 |
src\DataProc.h | 定义了一些数据处理函数 |
src\DataType.h | 定义了一些数据类型,如枚举类型和全局变量 |
src\dist.h | 定义了一些计算测距和坐标处理的函数 |
src\dl.h | 包含数据类型,如TraceSeg,以及用于进行通用功能的函数 |
src\EdgeShift.h | 定义了与边缘相关的操作的函数 |
src\global.h | 包含有关库主体的所有全局定义 |
src\heap.h | 为堆数据结构提供了实现 |
src\maze.h | 定义了用于处理迷宫路径的类和函数 |
src\maze3D.h | 定义了和处理三维迷宫路径的类和函数 |
src\mst2.h | 实现两种最小生成树算法的函数 |
src\neighbors.h | 定义用于查找网格邻居的函数 |
src\RipUp.h | 执行rip-up-and-retry操作的函数 |
src\route.h | 定义路由器类及路由算法的函数 |
src\RSMT.h | 生成RSMT的函数 |
src\utility.h | 包含一些各种类型的实用函数的实现 |
(二)、各文件代码的概述
1. third_party\fastroute\include\FastRoute.h
~~~~ 该文件是FastRoute库中的头文件,定义了FastRoute库中使用的一些数据类型、函数和类。包含了以下内容:
- 定义了3个结构体,分别为PIN, ROUTE和NET,用于表示引脚、路线和网络等。
- 定义了一个名为allNets的std::map变量,用于存储所有的网络以及它们所包含的引脚。
- 定义了一个名为maxNetDegree的整型变量,用于表示最大网络度数。
- 定义了FT类,包含了一系列用于设置和运行FastRoute的函数,如设置网格和层数、添加垂直/水平容量、添加最小宽度/间距、添加Via间距、初始化边缘等,以及运行FastRoute算法的run函数和获取结果的getResults函数等。
- 定义了一系列函数用于设置和获取网络、边缘等具体信息,如添加网络的addNet函数、添加边缘的addAdjustment函数、获取边缘容量的getEdgeCapacity函数等。
- 定义了一个命名空间FastRoute,包含了所有的函数、类、变量和结构体等。
- 定义了宏__FASTROUTE_API__,用于防止头文件被重复引用。
~~~~ 该文件为FastRoute库提供了一些基本的数据类型和函数,方便用户使用FastRoute算法,是使用FastRoute库时必要的一部分。
2. third_party\fastroute\src\DataProc.h
~~~~ 这是一个头文件,文件名为DataProc.h。该文件包含了一些全局变量、宏定义和函数的声明,它们被用于FastRoute的数据处理。其中包括整型、浮点型、布尔型等不同类型的变量、数组以及结构体的定义。该头文件被C++相关代码引用,以便使用其中的变量和函数。
3. third_party\fastroute\src\DataType.h
该程序定义了一些数据类型和常量。具体包括:
-
定义了一个Bool类型,值为char类型;
-
定义了Segment类型,表示两个端点之间的路径;
-
定义了Net类型,表示一个连接了多个迷宫点的网络;
-
定义了Edge类型,表示两个相邻的迷宫点之间的路由轨道;
-
定义了一个TreeEdge类型,表示两个树节点之间的路径;
-
定义了StTree类型,表示一棵生成树;
-
定义了一些常量,包括MAXDEMAND、MAXLAYER等;
-
定义了一些枚举类型,包括dirctionT和viaST。
4. third_party\fastroute\src\dist.h
~~~~ 这个程序文件名为src\dist.h,是一个头文件。它的主要功能是提供对两个点之间的距离进行计算的函数。 该文件还引入了全局头文件“global.h”,以便使用其中的数据结构和定义。该文件还包括了一个命名空间“FastRoute”以实现代码的模块化和可读性。
5. third_party\fastroute\src\dl.h
~~~~ 该程序文件是FastRoute项目中的一个头文件,定义了一个双向链表的数据结构以及相关的操作函数。其中包括链表的初始化、清空、删除、连接、排序,以及在链表中查找和遍历元素等功能。同时还定义了一些宏来简化操作,如获取链表长度、判断链表是否为空、插入、添加、删除节点等。这些功能可以用于FastRoute路由器模块的实现。
6. third_party\fastroute\src\EdgeShift.h
~~~~ 该程序文件是一个头文件,命名为EdgeShift.h
,主要定义了一个命名空间FastRoute
,其中包含了两个函数edgeShift
和edgeShiftNew
,这两个函数的参数均为一个指向Flute::Tree
类型的指针t
和一个整形变量net
。同时,该文件中还定义了一个宏__EDGESHIFT_H__
,用于避免该头文件被重复引用。整个程序文件主要是为了实现Flute树的边缘偏移操作。同时,在程序文件的开头还有授权声明和许可条款,该程序文件遵循BSD 3-Clause License。
7. third_party\fastroute\src\global.h
~~~~ 该文件是FastRoute的全局头文件,包含了一些常量定义,数据类型定义以及结构体定义。在该文件中,定义了一个命名空间FastRoute,并且使用了C++的结构体和typedef来定义了一些数据类型。同时,该文件还包含了BSD 3-Clause License的版权声明。
8. third_party\fastroute\src\heap.h
~~~~ 该文件名为heap.h,包含了一个C++命名空间FastRoute,该命名空间中定义了一个结构体heap_info和一个类型别名Heap。该头文件中定义了一些常量和函数声明,并提供了一些宏定义用于操作堆结构,堆被用作FastRoute库的数据结构之一。该堆结构用于实现Dijkstra最短路径算法的优先队列。文件中包含了一些基本的操作函数,如allocate_heap、deallocate_heap、heap_init、heap_insert、heap_decrease_key和heap_delete_min等。该堆的实现采用了二项堆(Binomial Heap)作为其基础结构,将关键字和物品分别分配给结构体heap_info的key和elt字段,并使用idx字段作为堆数组的指针。该程序被许可证明为BSD 3-Clause License的开源许可。
9. third_party\fastroute\src\maze.h
~~~~ 该程序文件为FastRoute的maze路由实现的头文件,其中定义了不同的路由方式函数和参数,如:
-
mazeRouteMSMD
: 不同顺序的网格图迭代路由算法,参数包括:迭代次数,网格大小,拐点修复阈值,迭代阈值,拐点修复阈值,是否使用排序和成本类型。 -
convertToMazeroute
: 将节点转换为迷宫路由数据结构。 -
getOverflow2D
,getOverflow2Dmaze
, 和getOverflow3D
: 获取2D或3D地图中的拥塞情况。 -
updateCongestionHistory
,initialCongestionHistory
, 和reduceCongestionHistory
: 对拥塞历史进行更新和初始化,以及对拥塞历史进行降低处理。 -
InitLastUsage
和InitEstUsage
: 针对不同的上图类型对最终使用和估计使用进行初始化。
~~~~ 该头文件还定义了路由实现所需的数据结构 Pos
,命名空间 FastRoute
,以及许可证信息。
10. third_party\fastroute\src\maze3D.h
~~~~ 该程序文件是一个C++头文件,名称为“maze3D.h”,定义了一个命名空间“FastRoute”以及一个“Pos3D”结构体和一个函数“mazeRouteMSMDOrder3D()”。
~~~~ 其中“Pos3D”结构体有三个成员变量分别是“x”、“y”和“l”,表示三维空间中的点坐标及层号。
~~~~ 函数“mazeRouteMSMDOrder3D()”使用了两个整形参数“expand”和“ripupTHlb”,以及一个整形参数“ripupTHub”,并且没有返回值。在该函数中,可能会对三维空间中的某个点处的路径进行修改,其路径修改可能会达到“ripupTHlb”次;如果在“ripupTHlb”次路径修改之内没有找到可行路径,那么会将路径扩展并重新执行路径修改,直到路径修改达到了“ripupTHub”次为止。
11. third_party\fastroute\src\mst2.h
~~~~ 本程序文件是一个头文件,文件名为src\mst2.h。该文件中定义了一个命名空间FastRoute,其中包含了三个函数:mst2_package_init、mst2_package_done、mst2。这三个函数用于计算点集pt的最小生成树。在该文件中还定义了一个long类型的变量parent,用于保存pt的最小生成树的父节点。该文件还包括了一个BSD 3-Clause License许可证,许可证明确说明该程序文件是开源的。
12. third_party\fastroute\src\neighbors.h
~~~~ 该文件是一个头文件,文件名是"neighbors.h"。主要包含了一个命名空间"FastRoute",并提供了两个函数"allocate_nn_arrays"和"deallocate_nn_arrays",以及两个函数"brute_force_nearest_neighbors"和"dq_nearest_neighbors",这两个函数的功能是计算最近邻居。同时,还包含了一些BSD 3-Clause许可证的信息,该许可证允许用户在一些特定的条件下使用和分发该文件。
13. third_party\fastroute\src\RipUp.h
~~~~ 这个程序文件名是 RipUp.h,包含了一组用于路由布线的函数声明。这些函数用于处理路由网格的破碎,新的布线以及路由类型。其中,函数 newRipupNet 用于处理整个网络的布线。此外,文件还包含了 BSD 开源协议的许可证声明。
14. third_party\fastroute\src\route.h
~~~~ 本程序文件名为src\route.h,是一个头文件。主要包含了一些函数和常量的声明。函数用于在导航树数据结构上进行路由,而常量则用于指示路由过程中生成的路线的方向。
~~~~ 其中,常量SAMEX和SAMEY用于指示线段的方向,表示在该方向上下一条线段应该与当前线段共线。函数routeSegL和routeLAll用于在基于线段列表的数据结构上进行路由;函数newrouteL、newrouteZ、newrouteZ_edge、newrouteLAll、newrouteZAll、routeMonotonicAll、routeMonotonic、routeLVAll、spiralRouteAll和newrouteLInMaze则用于在导航树上进行路由操作。所有这些操作都需要具有指定的网络和路由类型。
~~~~ 此外,该头文件还包含了BSD 3-Clause License的许可证声明,明确了使用此程序的限制和免责声明。
15. third_party\fastroute\src\RSMT.h
~~~~ 该文件定义了名为“RSMT”的命名空间,其中包含了一系列与Routing Steiner Minimal Tree(RSMT)相关的函数和变量。在其中包括了以下函数和变量:
-
int **V_table:二维整数数组
-
int **H_table:二维整数数组
-
void copyStTree(int ind, Flute::Tree rsmt):复制一颗Steiner Tree
-
void gen_brk_RSMT(Bool congestionDriven, Bool reRoute, Bool genTree, Bool newType, Bool noADJ):生成RSMT
-
void fluteNormal(int netID, int d, Flute::DTYPE x[], Flute::DTYPE y[], int acc, float coeffV, Flute::Tree *t):使用Flute库生成RSMT
-
void fluteCongest(int netID, int d, Flute::DTYPE x[], Flute::DTYPE y[], int acc, float coeffV, Flute::Tree *t):使用Flute库生成RSMT,考虑到拥堵参数
~~~~ 同时,在文件中还定义了一个头文件保护,只在该头文件没有被包含时才把命名空间和变量和函数声明引入到文件中。
16. third_party\fastroute\src\utility.h
该程序文件为头文件,其中包含了 FastRoute 程序的部分函数原型。具体来说,它定义了 FastRoute 的命名空间,包括以下函数:
-
getlen(): 获取走线长度
-
printEdge(int netID, int edgeID): 打印边信息
-
plotTree(int netID): 绘制树形结构
-
fillVIA(): 填充VIAs
-
threeDVIA(): 3D VIAs
-
netpinOrderInc(): 增加节点顺序
-
writeRoute3D(char routingfile3D[]): 写出 3D 路径文件
-
checkRoute3D(): 检查 3D 路径
-
write3D(): 写出 3D 文件
-
StNetOrder(): 稳定网络顺序
-
checkRoute3DEdgeType2(int netID, int edgeID): 检查 3D 路径的边类型2
-
checkRoute2DTree(int netID): 检查 2D 树形结构
-
printTree3D(int netID): 打印 3D 树形结构
-
recoverEdge(int netID, int edgeID): 恢复边
-
checkUsage(): 检查使用率
-
netedgeOrderDec(int netID): 去除网络边缘
-
printTree2D(int netID): 打印 2D 树形结构
-
finalSumCheck(): 最终结果检查
-
ACE(): ACE
-
newLA(): 新LA
-
iniBDE(): 初始化BDE
-
copyBR(void): 复制BR
-
copyRS(void): 复制RS
-
freeRR(void): 释放RR
三、thirdParty
(一)、flute3
1. 总览
整体功能:
~~~~ 该程序是一个使用FLUTE库来求解迭代式Steiner树算法的应用程序,可用于计算电路布线的总线长。它为用户提供了一个快速而高效的布线解决方案,可以实现自动跟踪、预判、优化和适应性调整等功能,从而大大提高电路设计的效率和精确度。
程序构架:
~~~~ 整个程序主要由FLUTE库和应用程序两部分构成。FLUTE库由flute.h头文件和flute.c文件组成,提供了一系列函数和数据类型,可以用于通过构建Steiner树计算电路布线的总线长。
~~~~ 应用程序包含了定义main()函数的appmain.c文件、读取输入文件的readfile.c文件、将输出结果保存到文件的bookshelf_io.c文件,以及一些辅助性函数getresource.c、gp.c、headers.c等。应用程序通过调用FLUTE库中的函数,实现了自动化的迭代式Steiner树算法,并将最终的结果输出到要求的文件中。
以下是各个文件的功能:
文件名 | 功能 |
---|---|
flute.h | FLUTE库的头文件,定义了一些常量、数据结构和函数 |
flute.c | FLUTE库的核心文件,实现了Steiner树算法的构建和搜索 |
appmain.c | 应用程序的主函数,提供参数解析、输入输出和流程管理等功能 |
readfile.c | 读取输入文件的函数 |
bookshelf_io.c | 处理输出结果并保存到文件的函数 |
getresource.c | 加载数据和资源的函数 |
gp.c | 导出结果到Gnuplot的函数 |
headers.c | 定义程序头文件和输出头文件的函数 |
dmer.c | 狄杰斯特拉最短路径算法的实现 |
lsort.c | 数组排序算法的实现 |
minmax.c | 数组中最小最大值查找的实现 |
pl.c | 对齐板型的实现 |
readlut.c | 读取查找表的函数 |
readnets.c | 读取电路网列表的函数 |
reedSol.c | 里德-所罗门编码的实现 |
sort.c | 数组排序算法的实现 |
tree2d.c | 双向贪心构建Steiner树的实现 |
wlen.c | 电路布线总长的计算函数 |
wst.c | 序列化Steiner树的实现 |
注:本表格只列出了主要代码文件,并未列出库文件及其它不重要的文件。 |
2. 各文件分析
1. flute3\flute.h
~~~~ 该文件为FLUTE库的头文件,提供了一系列函数和数据类型,可以用于通过构建Steiner树计算电路布线的总线长。
~~~~ 其中,一些重要的数据类型包括Branch和Tree,代表了树中的支路和树本身。
~~~~ 一些重要的函数包括读入查找表函数readLUT()、计算电路布线总线长函数flute_wl()、构建Steiner树函数flute()、打印树形结构函数printtree()、将树形结构导出为TXT文件函数plottree()等。
~~~~ 此外,头文件中还包含一些宏定义和内联函数,提供了常用的工具函数和针对不同问题的解决方案。用户可以根据需求选择适当的函数进行调用。
3. 方法分析
~~~~ 该程序文件为Flute模块的源代码文件,主要实现了最小生成树算法,用于电路布线问题中的树形绘制。
函数名 | 函数功能 |
---|---|
readLUT | 读取预处理得到的查找表 |
flute_wl | 给定坐标点,以最小权值生成树的形式绘制树,返回树的周长 |
updatetree | 将两棵树合并为一棵,同时更新边权值 |
dmergetree | 在竖直方向合并两棵树 |
hmergetree | 在水平方向合并两棵树 |
vmergetree | 在垂直方向合并两棵树 |
bswap | 交换两个元素的值 |
MergeLUT | 将两个查找表合并 |
Merge2SubTree | 合并两个子树,并返回新的子树根节点指针 |
MergeTwoTrees | 合并两棵树,并返回新树的根节点指针 |
power | 返回幂次值 |
local_refinement | 局部优化,对每个节点进行剪枝操作 |
pruneLUT | 利用已经评估好的路径长度,Prune查找表的所有节点 |
printtree | 调试函数,打印树的形状和边权值 |
plottree | 3D绘图函数,其中的三个参数分别是xyz坐标轴的描点数目,以及要绘制的树的根节点指针。绘图需搭载OpenGL |
flute | 最小生成树算法的主函数 |