GlobalRouting - FastRoute代码框架和功能(三)

文章目录

  • 一、 顶层代码框架和功能
    • (一)、总结
    • (二)、各文件代码的概述:
      • 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库中使用的一些数据类型、函数和类。包含了以下内容:

  1. 定义了3个结构体,分别为PIN, ROUTE和NET,用于表示引脚、路线和网络等。
  2. 定义了一个名为allNets的std::map变量,用于存储所有的网络以及它们所包含的引脚。
  3. 定义了一个名为maxNetDegree的整型变量,用于表示最大网络度数。
  4. 定义了FT类,包含了一系列用于设置和运行FastRoute的函数,如设置网格和层数、添加垂直/水平容量、添加最小宽度/间距、添加Via间距、初始化边缘等,以及运行FastRoute算法的run函数和获取结果的getResults函数等。
  5. 定义了一系列函数用于设置和获取网络、边缘等具体信息,如添加网络的addNet函数、添加边缘的addAdjustment函数、获取边缘容量的getEdgeCapacity函数等。
  6. 定义了一个命名空间FastRoute,包含了所有的函数、类、变量和结构体等。
  7. 定义了宏__FASTROUTE_API__,用于防止头文件被重复引用。

~~~~     该文件为FastRoute库提供了一些基本的数据类型和函数,方便用户使用FastRoute算法,是使用FastRoute库时必要的一部分。

2. third_party\fastroute\src\DataProc.h

~~~~     这是一个头文件,文件名为DataProc.h。该文件包含了一些全局变量、宏定义和函数的声明,它们被用于FastRoute的数据处理。其中包括整型、浮点型、布尔型等不同类型的变量、数组以及结构体的定义。该头文件被C++相关代码引用,以便使用其中的变量和函数。

3. third_party\fastroute\src\DataType.h

该程序定义了一些数据类型和常量。具体包括:

  1. 定义了一个Bool类型,值为char类型;

  2. 定义了Segment类型,表示两个端点之间的路径;

  3. 定义了Net类型,表示一个连接了多个迷宫点的网络;

  4. 定义了Edge类型,表示两个相邻的迷宫点之间的路由轨道;

  5. 定义了一个TreeEdge类型,表示两个树节点之间的路径;

  6. 定义了StTree类型,表示一棵生成树;

  7. 定义了一些常量,包括MAXDEMAND、MAXLAYER等;

  8. 定义了一些枚举类型,包括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,其中包含了两个函数edgeShiftedgeShiftNew,这两个函数的参数均为一个指向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: 对拥塞历史进行更新和初始化,以及对拥塞历史进行降低处理。

  • InitLastUsageInitEstUsage: 针对不同的上图类型对最终使用和估计使用进行初始化。

~~~~     该头文件还定义了路由实现所需的数据结构 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.hFLUTE库的头文件,定义了一些常量、数据结构和函数
flute.cFLUTE库的核心文件,实现了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调试函数,打印树的形状和边权值
plottree3D绘图函数,其中的三个参数分别是xyz坐标轴的描点数目,以及要绘制的树的根节点指针。绘图需搭载OpenGL
flute最小生成树算法的主函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/826172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

deepinV23 Beta3安装cuda

文章目录 下载CUDA安装,以cuda11.6为例运行.run文件安装选项配置环境变量查看cuda版本重启计算机 卸载cuda deepinV23 Beta3对应的debian版本是12&#xff1a; bookworm指的是debian12&#xff0c; sid代表不稳定版。 下载CUDA 官网&#xff1a;https://developer.nvidia.com…

中华环保联合会获得国家“绿色制造体系” 第三方评价机构资格

近日&#xff0c;中华环保联合会成功获得工业和信息化部“绿色制造体系”第三方评价机构资格&#xff0c;可为企业、园区及相关机构提供全面的绿色制造体系评价服务&#xff0c;包括绿色工厂、绿色园区、绿色供应链等方面。 “绿色制造体系建设”是由工业和信息化部负责统筹推进…

redis异常:OOM command not allowed when used memory > ‘maxmemory‘

redis存储数据太多,内存溢出,导致异常 1.查看redis内存使用情况 登录redis后 info memory2.查看分配给redis的最大内存 config get maxmemory3.处理方式:拓展redis的最大内存 打开redis.conf文件,修改maxmemory 4.删掉键值重启redis后,发现删掉的数据又恢复了? redis根目录…

Midjourney是什么?Midjourney怎么用?怎么注册Midjourney账号?国内怎么使用Midjourney?多人合租Midjourney拼车

Midjourney是什么 OpenAI发布的ChatGPT4引领了聊天机器人的竞争浪潮&#xff0c;随后谷歌推出了自己的AI聊天机器人Bard&#xff0c;紧接着微软推出了Bing Chat&#xff0c;百度也推出了文心一言&#xff0c;这些聊天机器人的推出&#xff0c;标志着对话式AI技术已经达到了一个…

月球地形数据介绍(LOLA)

月球地形数据介绍 LOLA介绍LOLA数据的处理与发布数据类型和格式投影坐标系SIMPLE CYLINDRICALPOLAR STEREOGRAPHIC 数据下载与浏览 LOLA介绍 目前最新的月球地形高程数据来源于美国2009年发射的LRO探测器。 “月球勘测轨道器”(Lunar Reconnaissance Orbiter&#xff0c;LRO)…

7.2 跳跃表(skiplist)

文章目录 前言一、跳跃表——查找操作二、跳跃表——插入操作三、代码演示3.1 输出结果3.2 代码细节 四、总结&#xff1a;参考文献&#xff1a; 前言 本章内容参考海贼宝藏胡船长的数据结构与算法中的第七章——查找算法&#xff0c;侵权删。 查找的时间复杂度能从原来链表的…

线上真实案例之执行一段逻辑后报错Communications link failure

1.问题发现 在开发某个项目的一个定时任务计算经销商返利的功能时&#xff0c;有一个返利监测的调度&#xff0c;如果某一天返利计算调度失败了&#xff0c;需要重新计算&#xff0c;这个监测的调度就会重新计算某天的数据。 在UAT测试通过&#xff0c;发布生产后&#xff0c…

CSS动画(css、js动画库:各种动画效果)

第一种方法&#xff1a;文字从上到下显示动画&#xff1b; <div class"text-container"><div class"text">文字从上到下显示</div></div><style scoped> /*确保 keyframes 规则在引用它的任何选择器之前定义&#xff0c;以避…

Android开发:应用百度智能云中的身份证识别OCR实现获取个人信息的功能

百度智能云&#xff1a; 百度智能云是百度提供的公有云平台&#xff0c;于2015年正式开放运营。该平台秉承“用科技力量推动社会创新”的愿景&#xff0c;致力于将百度在云计算、大数据、人工智能的技术能力向社会输出。 百度智能云为金融、城市、医疗、客服与营销、能源、制造…

C语言数据结构之顺序表

目录 1.线性表2.顺序表2.1顺序表相关概念及结构2.2增删查改等接口的实现 3.数组相关例题 1.线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性&#xff08;数据类型相同&#xff09;的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff…

2024年阿里云服务器明细报价整理总结

2024年阿里云服务器租用费用&#xff0c;云服务器ECS经济型e实例2核2G、3M固定带宽99元一年&#xff0c;轻量应用服务器2核2G3M带宽轻量服务器一年61元&#xff0c;ECS u1服务器2核4G5M固定带宽199元一年&#xff0c;2核4G4M带宽轻量服务器一年165元12个月&#xff0c;2核4G服务…

Zynq 7000 SoC器件的复位系统

Zynq7000 SoC器件中的复位系统包括由硬件、看门狗定时器、JTAG控制器和软件生成的复位。每个模块和系统都包括一个由复位系统驱动的复位。硬件复位由上电复位信号&#xff08;PS_POR_B&#xff09;和系统复位信号&#xff08;PS_SRST_B&#xff09;驱动。 在PS中&#xff0c;有…

JAVA基础面试题(第九篇)中! 集合与数据结构

JAVA集合和数据结构也是面试常考的点&#xff0c;内容也是比较多。 在看之前希望各位如果方便可以点赞收藏&#xff0c;给我点个关注&#xff0c;创作不易&#xff01; JAVA集合 11. HashMap 中 key 的存储索引是怎么计算的&#xff1f; 首先根据key的值计算出hashcode的值…

隧道代理的优势与劣势分析

“随着互联网的快速发展&#xff0c;网络安全已经成为一个重要的议题。为了保护个人和组织的数据&#xff0c;隧道代理技术逐渐成为网络安全的重要工具。隧道代理通过在客户端和服务器之间建立安全通道&#xff0c;加密和保护数据的传输&#xff0c;有效地防止黑客入侵和信息泄…

15-partition table (分区表)

ESP32-S3的分区表 什么是分区表&#xff1f;&#x1f914; ESP32-S3的分区表是用来确定在ESP32-S3的闪存中数据和应用程序的布局。每个ESP32-S3的闪存可以包含多个应用程序&#xff0c;以及多种不同类型的数据&#xff08;例如校准数据、文件系统数据、参数存储数据等&#x…

Scala 第一篇 基础篇

Scala 第一篇 基础篇 一、变量与常量 1、变量2、常量 二、数据类型 1、数据基本类型概览2、元组的声明与使用3、Range介绍和使用4、Option 类型的使用和设计5、类型别名 三、运算符四、程序逻辑 1、一切都是表达式2、分支语句3、循环语句 五、集合 1、List2、Set3、Map4、Arra…

MySQL高级(索引-性能分析-explain执行计划)

explain 或者 desc 命令获取 MySQL 如何执行 select 语句的信息&#xff0c;包括在 select 语句执行过程中表如何连接和连接的顺序。 -- 直接在 select 语句之前加上关键字 explain / desc explain select 字段列表 from 表名 where 条件 &#xff1b; explain select * …

电机控制专题(一)——最大转矩电流比MTPA控制

文章目录 电机控制专题(一)——最大转矩电流比MTPA控制前言理论推导仿真验证轻载1Nm重载30Nm 总结 电机控制专题(一)——最大转矩电流比MTPA控制 前言 MTPA全称为Max Torque Per Ampere&#xff0c;从字面意思就可以知道MTPA算法的目的是一个寻优最值问题&#xff0c;可以从以…

SQL Server 2022 安装及使用

SQL Server 2022 前言一、安装SQL Server 2022下载SQL Server 2022安装SQL Server 2022配置SQL Server 2022 二、安装SQL Server Management Studio下载SQL Server Management Studio安装SSMS-Setup-CHS 三、使用SQL Server 2022四、解决连接到服务器报错问题 前言 SQL Serve…