统计电路仿真的方法和系统
本申请要求2012年4月2日提交美国专利局、申请号为13/437,815,发明名称为“Statistical Circuit Simulation(统计电路仿真)”的美国专利申请的优先权,其全部内容通过引用结合在本申请中。
技术领域
本发明涉及的领域是电子设计自动化,具体而言,本发明涉及进行统计电路仿真的方法和系统。
背景技术
集成电路是由例如电阻、电容、电感器、互感器、传输线、二极管、双极结型晶体管(BJT)、结型场效应晶体管(JFET)、金属氧化物半导体场效应晶体管(MOSFET)、金属T半导体场效应晶体管(MESFET)、薄膜晶体管(TFT)等电路元件构成的网络。
随着技术的发展,集成电路越来越复杂,需要使用强大的数值模拟程序。例如,电路仿真是集成电路的设计流程中必不可少的环节,它能帮助电路设计人员无需通过昂贵的制造工艺验证其设计的功能和性能。随着半导体加工技术发展到纳米级,新的仿真方法需要解决纳米级电路设计所固有的新问题。现代集成电路在新工艺的发展中不断挑战着电路仿真的算法和实现。半导体行业需要EDA软件有能力来分析与动态电流相关的纳米效应,比如耦合噪声(coupling noise)、接地反弹(ground bounce)、传输线波传播(transmissionline wave propagation)、动态漏电流(dynamic leakage current)、电源电压降(supplyvoltage drop)、非线性元器件和电路的行为等。因此,精准的电路模拟和晶体管级仿真已经成为勘察和解决纳米设计所面临问题的最有效的途径之一。
电子电路仿真器包括美国加州大学伯克利分校(UC Berkeley)开发的面向集成电路的仿真程序——SPICE(Simulation Program with Integrated Circuit Emphasis)以及各种增强或衍生版本的SPICE仿真程序。SPICE及其增强、衍生版本将在本文被简称为SPICE电路仿真器或SPICE。SPICE方法认为电路是一个不可分割的整体。
SPICE仿真可以提供对电路行为相当准确的预测。这种预测不局限于个别的子电路,它涵盖整个系统(例如,整个集成电路),因而可以发现、处理全系统范围关于噪声之类的问题。一般的SPICE仿真处理流程,仿真中的模拟集成电路通常被表示为一个网表描述的形式。网表是一种由SPICE语言编写的用于仿真的对模拟电路的电路描述。SPICE网表是包含仿真控制语句的纯结构性语言。其他语言如Verilog-ATM,还具有行为构建的能力。根据特定的电路建模方法,SPICE的结构性网表和模拟集成电路的预定义电路元件可以被表示为矩阵形式。非齐次线性微分方程解的维度范围从1到n。相应数量的输入向量由线性方程进行处理。线性方程组的输入向量被表示为{I1,I2,..In}。由输入向量,可以求得线性矩阵的解向量{V1,V2,..Vn}。重复以上计算,直到解向量收敛。一系列的解向量可以在计算机的屏幕上显示为波形、测量值或者核查结果,这样工程师就可以通过计算机屏幕检查仿真的结果。
然而,随着集成电路行业的发展,器件尺寸不断减小、互联效应日益增加,SPICE全系统仿真变得越来越困难。一个例子是晶体管沟道长度微米尺寸变化为深亚微米尺寸。由于更小的器件尺寸,电路设计者在集成电路(IC)中能够运用电路元件(例如,晶体管、二极管、电容)数量呈指数级增长,对应于SPICE矩阵的维数也量级增长,巨大的计算复杂度使得计算不能在有效时间内完成。
一个电路可以表示为瞬间电流分析的大规模离散非线性矩阵。矩阵维数和电路中节点的同阶。对于瞬态分析,这个巨大的非线性系统需要求解几十万次,这限制了SPICE方法的容量和性能。一般的SPICE方法可以模拟不超过约50,000个节点的电路。因此,对于全芯片设计,SPICE方法不可行。SPICE在实际应用中被广泛应用于单元设计、库生成和准确性验证。
相对于传统SPICE,在20世纪90年代初开发的快速SPICE方法(Fast SPICE)在一定精度损失的情况下,有两个数量级以上的容量和速度提升。性能上的提升主要由于使用简化模型、电路划分技术、事件驱动的算法以及对电路延迟的利用。
SPICE将电路模型化为节点、元件集,也就是说一个电路被视为通过节点相连接的各种电路元件的集合。SPICE的核心是所谓的节点分析,通过节点方程(或者电路方程)以矩阵形式表示电路并求解节点方程。电路元件被表示为器件模型,产生电路方程的矩阵元素。
电路元件模型化为器件模型,比如加州大学伯克利分校开发MOSFET器件SPICE模型,通常以模型方程和模型参数表示在变化偏置电压下的电路元件特性。例如,具有n个端子的电路元件,可以由下述的电流-电压关系建模:
Ii=fi(V1,...,Vn,t),其中i=1,…,n,
Ii表示流入第i个端口的电流,Vj(j=1,…,n)表示电压或者端口j相对于参考端口(例如地)的偏置电压,t表示时间。由基尔霍夫电流定律,流入端口n的电流为电路元件的电导矩阵为:
为了模型化电路元件在变化电流的行为,器件模型需要考虑节点电荷及端口偏压之间的关系:
Qi=qi(V1,...,Vn,t),其中i=1,…,n.
Qi表示端口i的节点电荷。n端口电路元件的电容矩阵为:
对于纳米级设计,矩阵规模巨大,求解非常耗时,对于n维矩阵求解,计算复杂度约为n3。电路仿真总时间T近似等于:
其中,Timestepi是每一个时间步长,Timei solve是第i个时间步(time step)的求解时间。一般来说,时间步长越小仿真越精确。但是,不必要的小时间步长会降低仿真速度,而过大时间步长则可能导致更多的迭代因而收敛速度变慢。在实践中,时间步长需要优化选取,以在准确性和仿真时间之间取得平衡。当电路仿真用于统计分析,总时间是种子数和每个种子仿真时间的乘积。一个典型的蒙特卡洛(Monte-Carlo)分析,通常需要上千次仿真(种子)达到收敛。
为了提高电路仿真的性能,常规系统采用多台计算机协同工作,每台计算机处理仿真的某些环节。这样的系统,也称为服务器群,可以分布在不同的地理位置,通过计算机网络连接。服务器群的问题是计算机之间的同步和网络数据通信会很大程度上抵消由多任务并行处理所带来的好处。此外,由于要配置多台计算机常规系统是非常昂贵的。
发明内容
因此,需要新的方法和系统来解决常规系统所面临的问题。具体而言,是解决统计电路仿真的方法和系统。
本发明是统计电路仿真的方法和系统。一个实施例中,计算机实现的统计电路仿真的方法包括提供被仿真电路的描述,即电路统计参数的变化、根据电路统计参数的变化将电路划分为多组网表,使用复数个处理器并行仿真多组网表产生复数个输出数据文件,将所述复数个输出数据文件存储于存储器中。将电路划分为多组网表的方法包括,在单指令多数据环境下形成多组被仿真的网表、以及根据电路统计参数的变化的近似形成所述多组网表。电路的描述形式还包括电路网表和模型库。
电路划分的计算机实现方法包括在单指令多数据环境下形成被仿真的多组网表。电路划分的计算机实现的方法又包括根据电路统计参数的变化的近似形成多组网表。电路划分的计算机实现的方法还包括确定一个有代表性的参数来表示一组统计参数,这组统计参数的具有与代表参数基本相同的值,而且这组统计参数基本不变。电路统计参数的变化的近似包括在晶体管亚阈值区域阈值电压的变化、晶体管线性区域阈值电压的变化以及晶体管饱和区域阈值电压的变化。
仿真多组网表的使用复数个并行处理器的计算机实现方法,包括维护多组网表以及它们在一个共享的存储器中的统计参数,使用复数个图形处理单元(GPU)执行模型计算(model evaluations),使用复数个中央处理器(CPU)执行矩阵求解、检查仿真收敛性以及预测下一时间步。共享存储器包括一模型计算队列,该模型计算队列存储一个或多个由复数个图形处理单元(GPU)所处理的任务,还包括一任务队列,该任务队列存储一个或多个由复数个中央处理单元(CPU)所处理的任务。所述计算机实现的方法,进一步包括执行负载平衡,即从模型计算队列中指定一个或多个任务由复数个中央处理器(CPU)处理,以及从任务队列中指定一个或多个任务由复数个图形处理器(GPU)处理。
在另一实施例中,用于进行统计电路仿真的系统包括复数个处理器和一被所述复数个处理器所使用的共享存储器,一工作于复数个处理器的仿真器模块,和一存储复数个输出数据文件的存储器。仿真器模块包括提供用于所仿真电路描述信息的逻辑,其中描述信息包括电路统计参数的变化、按照电路统计参数的变化将电路划分为多组网表的逻辑、以及使用复数个并行处理器仿真多组网表生成复数个输出数据文件的逻辑,其中,复数个处理器包括复数个图形处理单元(GPU)和复数个中央处理单元(CPU)。
在另一实施例中,一个计算机程序产品包括非易失性介质,用于存储由一个或多个计算机系统执行的计算机程序,该计算机程序产品还包括提供被仿真电路描述信息的代码,其中描述信息包括电路统计参数的变化,包括根据电路统计信息的变化划分电路为多组网表的代码,包括使用复数个并行处理器仿真多组网表生成复数个输出数据文件的代码,所述复数个处理器包括复数个图形处理单元(GPU)和复数个中央处理单元(CPU),包括存储所述复数个输出数据文件与存储器的代码。
附图说明
结合以下附图阅读对实施例的详细描述,本发明的上述特征和优点,以及额外的特征和优点,将会更加清楚。
图1所示为根据本发明实施例的一个实现统计电路仿真方法的系统;
图2所示为根据本发明实施例的进行统计电路仿真方法的总览;
图3所示为根据本发明实施例的进行统计电路仿真方法的框图示例;
图4所示为根据本发明实施例的仿真环境的框图示例;
图5a-5c所示为根据本发明实施例的统计电路仿真方法;
图6所示为根据本发明实施例的将电路划分为多组网表的方法;
图7a-图7d所示为根据本发明实施例的使用复数个并行处理器仿真多组网表的方法;
图8所示为根据本发明实施例的进行并行统计电路仿真的系统。
具体实施方式
本发明提供了进行重复性的电路仿真的方法和系统。下面的描述可以使任何本领域技术人员利用本发明。具体实施例和应用中所提供的描述信息仅为示例。这里所描述的实施例的各种延伸和组合对于本领域的技术人员是显而易见的,在不脱离本发明的实质和范围的情况下,本发明定义的一般原则可以应用到其他实施例和应用中。因此,本发明不只限于所示的实施例,本发明涵盖与本文所示原理和特征相一致的最大范围。
下面的详细说明以流程图、逻辑模块和其他的符号操作表达的形式给出,可以在计算机系统上执行。一个程序、计算机执行步、逻辑块,过程等,在这里被设想为得到所希望的结果的一个或多个步骤或指令的自洽序列。这些步骤是对物理量的物理操作。这些物理量包括电、磁或者无线电信号,它们在计算机系统中被存储、传输、组合、比较以及其他操作。这些信号可是比特、数值、元素、符号、字符、条件、数字等。每个步骤都可以通过硬件、软件、固件或它们的组合执行。
图1给出了根据本发明的一个实施例一个用于实现统计电路仿真方法的系统。在一个实施例中,可以使用计算机系统实现统计电路仿真的方法和系统。该计算机系统可以包括一个或多个图形处理单元(GPU)和/或中央处理单元(CPU)100、至少一个用于显示计算结果和波形的用户接口102、存储器装置104、系统总线106以及一个或多个将GPU/CPU、用户界面、存储器装置与系统总线相连接的总线接口。所述计算机系统还包括至少一个用于与其他设备105在计算机网络上通信的网络接口103。在替代方案中,系统和方法的某些功能可以在一个或多个专用集成电路(ASIC)或现场可编程门阵列(FPGA)中实现,从而减轻GPU/CPU的作用。
存储装置104可以包括高速随机访问存储器,还可以包括非易失性存储器,比如一个或多个磁盘存储设备。存储装置还包括与所述GPU/CPU远距离的海量存储器。存储设备优选的存储:
操作系统108,用于处理各种基本的系统服务和硬件相关的任务。
应用程序110,用于执行用户定义的应用和任务,诸如电路仿真和模型计算。
数据库112,用于存储集成电路的信息,包括数据结构、器件模型以及矩阵。
数据库、应用程序、和用于实现电路仿真并行求解器的程序包括可执行程序、子模块、表和其他数据结构。在其它实施例中,可能会用到额外的或者不同的模块和数据结构,并且上述列出的一些模块和/或数据结构可能不会被用到。
图2所示为根据本发明实施例的关于图形处理单元(GPU)的示例性架构。如图2中所示,每个GPU包括N个多重处理器。每个多重处理器204进一步包括:M个处理器206和一个指令单元207。每个处理器都有自己的寄存器208。在一个多重处理器204中所有的处理器206共享一块共享存储器210。所有的处理器共享相同的一组常量缓存212和纹理缓存214的存储。处理器还可以访问设备/全局存储器216中的数据,该设备存储器也被称为全局存储器。
在这个例子中,每个多重处理器204具有一块共享内存。从共享存储器210中访问数据相比于从设备(全局)存储器216访问数据,要快很多。出于这个原因,提高计算效率的一个方法是将数据从设备/全局存储器216加载到共享存储器210,使用共享存储器210进行大量计算/操作,然后将结果从共享存储器210写回到全局内存216。
图3所示为根据本发明实施例的GPU线程的示例性组织。这个例子中,线程被组织在一个网格302中,它们被分成多个线程块,例如block(0,0)304,block(0,1)306,block(1,0)308,block(1,1)310,block(2,0)312和block(2,2)314。每一个线程块(例如,block(1,1)310),被分配给一个多重处理器和一块内的多个线程,例如thread(0,0)316,可以通过如图2所述的共享存储器相互通信。
在统计电路仿真中,有数以百计的代码分支以仿真电路中发生的不同的情形。例如,一个晶体管模型因为仿真所选统计参数组合的不同而工作在亚阈值区、线性区域或是饱和区。每个代码分支包含对于一个区域统计参数变化的仿真的指令。在实践中,可能仿真数百个不同的模型。为在单指令多数据(SIMD)仿真环境中实现高效率,在图3中,本发明的实施例被设计为多重处理器能够并行处理的最大数。以下图4至图7就这一点将做进一步说明。
图4所示为根据本发明实施例的仿真环境的示例性框图。如图4所示,仿真环境包括一个仿真器402,以电路网表404、模型库406和统计信息408作为输入。基于输入,仿真器将电路划分形成多组网表,如网表1(410a)到网表L(410b)。每组网表包含多个子网,如网表1(410a)中的子网1到子网n,和网表L(410b)中的子网1到子网m。通过并行仿真多个组,仿真器会生成多个输出文件,即.out1(412a)、.out2(412b)、.out3(412c)、.outN(412d)等。使用多组网表,令多组处理器有更高的概率停留在同一个代码分支,因而有更高的概率在SIMD环境中并行的进行统计电路仿真。
根据本发明实施例,电路统计参数的变化也称为统计变化,统计变化可能产生于制造过程的变化,包括全局变化和局部变化。对于局部变化,图中的每个点,如图5b所示,表示被仿真网表的一个子电路(比如一个晶体管)。对于全局变化,图中的每个点,如图5c所示,表示相对中值的变化,对每个点都会构造一个网表进行仿真。
图5a-5c所示为根据本发明实施例的统计电路仿真的方法。如图5a所示,为了简化说明,只有阈值电压(Vt)和晶体管沟道长度(L)在本例中作为变化的统计参数。横轴表示阈值电压(Vt)的变化,纵轴表示沟道长度(L)的变化。在该图中,区分彼此的不同统计参数变化被示为散点,如502a和502b。根据本发明的实施例,该方法识别统计参数的集群,例如504、506和508。在某些实现中,每个集群都包括一统计参数组,组内的变化不会改变仿真的结果。在某些其它实现方式中,每一个集群都包括一统计参数组,组内的变化只在预定范围内影响仿真的结果,例如Vout(图中未示出)上下浮动0.01V。例如,集群504可以代表在亚阈值区的晶体管模型,集群506可表示线性区域的晶体管模型,集群508可表示饱和区域的晶体管模型。在这种情况下,一个代表参数可以被用于表示该组,例如代表参数505、507和509分别对应于集群504、506和508。可以使用代表参数仿真一个集群的统计参数。其结果是,计算量和用于存储参数的内存量将会减少。
图5b所示为由于制造过程中的变化引起的局部变化的统计电路仿真的例子。如图5b所示,编号512表示具有局部变化的示例性电路1,编号514表示具有局部变化的示例性电路2,编号516表示具有局部变化的示例性电路N。请注意,图5b中的每个点代表在图4中一个网表中的一个晶体管。图5c所示为由于制造过程中的变化引起的局部和全局变化组合的统计电路仿真的例子。在图5c的例子中,编号522表示示例性电路1局部变化和第一个全局变化组合的情况,编号524表示示例性电路1局部变化和第二全局变化组合的情况。注意,图5c中各个点代表相对于中值的差异。在一个实现中,对于图5c中每个相应的点都会构造一个网表进行仿真。
图6所示为根据本发明实施例的将电路划分为多组网表的方法。在图6中,为了简化说明,本例中只有三个统计参数,即晶体管的阈值电压(Vt)、沟道长度(L)和沟道宽度(W)。第一轴表示在阈值电压(Vt)的变化,第二轴表示沟道长度(L)中的变化,第三轴表示沟道宽度(W)的变化。区分彼此的不同统计参数变化被示为散点,如602a和602b。类似于在图5中所示的方法,该方法定义统计参数的集群,例如604、606和608。在某些实现中,每个集群都包括一统计参数组,组内的变化不会改变仿真的结果。在某些其它实现方式中,每一个集群都包括一统计参数组,组内的变化只在预定范围内影响仿真的结果,例如Vout(图中未示出)上下浮动0.01V。例如,集群604可以代表在亚阈值区的晶体管模型,集群606可表示线性区域的晶体管模型,集群608可表示饱和区域的晶体管模型。在这种情况下,一个代表参数可以用于表示该组,例如代表参数605、607和609分别对应于集群604、606和608。可以使用代表参数仿真一个集群的统计参数。其结果是,计算量和用于存储参数的内存量将会减少。
图7a-7d提供了有根据统计参数的变化子网分组进行统计电路仿真和没有分组仿真的比较。为描述简单起见,本例使用三个处理器,即处理0、处理器1和处理器2,如表所示。根据本发明的实施例,可以有更多的处理器,比如8、16或更多,被用于对一个真实电路的数百个统计模型变化并行仿真。
图7a表示不做子网分组的传统方法进行统计电路仿真。图7a中在没有电路子网分组的情况下,所选仿真点可能位于模型的每一个的亚阈区、线性区和饱和区。在这种情况下,当被仿真的晶体管在亚阈值区时,处理器0被占用并且工作,而处理器1和处理器2被占用但不工作,因为缓存被亚阈值区的模型和库所占用。在线性区中,处理器1被占用并且工作,而处理器0和处理器2被占用但不工作。在饱和区,处理器2被占用和工作,同时处理器0和处理器1被占用但不工作。在每一个实例中,当一个处理器被占用但不工作的时候,效率已丧失,因而增加了仿真的时间和成本。在实践中,可能有数百个分支数百个模型被仿真。在每一个分支,如果多个处理器不同时运行,仿真效率就会受到不利影响。
图7b所示为根据本发明实施例的使用多个处理器并行仿真多组网表的方法。当根据统计参数变化电路子网被分组时,计算点可以被选择为有相似的行为且在仿真中停留在相同的代码分支上。如图7b的例子,当被仿真的晶体管在亚阈值区,所有三个处理器,即处理器0、处理器1和处理器2都被占用和工作。同样,在线性区域和饱和区,处理器0、处理器1和处理器2都被占用和工作。以这种方式,被占用和工作的处理器的概率更高,因而降低了仿真的时间和成本。在一般情况下,多个处理器一起工作的频率越高,仿真效率越高。
图7c所示为根据本发明实施例的使用多个处理器并行仿真多组网表的方法的另一种情况。图7c与图7b相似,所有三个处理器,处理器0、处理器1和处理器2都被占用且并行工作,因为它们在亚阈值区执行同一个分支指令(使用共享资源)。在执行完亚阈值区的指令后,三个处理器空闲(处于待机模式)并准备接受其他任务。当处理器接受一个新的任务,例如图7d所示的同时处理线性区,电路仿真统计的高效率得以保持。请注意,上述的处理器可以是一个图形处理器、一个多重处理器或一个矢量处理器。
图8所示为根据本发明实施例的进行统计电路并行仿真的一个系统。在图8所示,该系统包括一个任务队列802,一组中央处理单元CPU(未示出)和相应的CPU工作线程804,模型计算队列806,GPU池810中,和CPU辅助线程812。任务队列802被配置为存储多个仿真任务,例如,从任务1到任务L。CPU的工作线程804可以包括多个CPU线程,例如从CPU1thread到CPU M thread。模型计算队列806被配置为存储多个模型计算任务,例如从Model Eval.1任务到Model Eval.P任务。CPU辅助线程812被配置为在模型计算队列806中分组模型计算任务,以被GPU池810中的GPU所执行。例如,数字814表示包含Model Eval.1和Model Eval.2的组;数字816代表了另一组,包含Model Eval.3到Model Eval.5;数字818代表另一组包含Model Eval.P。每个模型计算组的任务由对应的GPU池810中的GPU所执行。
根据本发明的实施例,执行统计电路仿真的任务可以被分配并共享于一组CPU和一组GPU中。每个仿真任务可以包括但不限于模型计算、矩阵求解、收敛性检查和预测下一时间步。GPU在模型计算上面更有效率,CPU在矩阵求解、收敛性检查和预测下一时间步上更有效率。因此,每个仿真任务可以被划分为两个阶段:CPU可以有效处理的阶段和GPU可以有效处理的阶段。在每一个时间步处理仿真任务的时候,系统可以被配置为在任务队列802和模型计算队列806之间来回移动,以管理仿真任务的分配和执行负载平衡,以确保最佳的系统性能。
请注意,为求效率,应该优选配置的GPU来执行大量的任务。这个系统对包含数百万个器件的大型电路的统计仿真运作良好。对于小一些的电路统计仿真,为提高GPU效率,可以将一些模型计算任务事先组合在一起被GPU处理。例如,多个模型计算任务可以被组合在一起进行处理,如图8所示的组814、816和818。在一些统计仿真应用中,许多更小的电路被创建,然而需要数万次的独立仿真来完成一个3-σ统计仿真。GPU可用于提高这样的统计仿真的效率,因为GPU可以被配置为并行处理大量的模型计算。在这种方式中,要收集到足够的任务,以保持GPU的占用,从而提高仿真效率。
根据本发明的实施例,系统可以被配置为在包含于模型计算队列806的任务和包含于任务队列802的任务之间执行负载平衡。在GPU操作慢于CPU操作的情况下,CPU和CPU工作线程804可以被配置为从等待GPU的模型计算队列806中接受一个或多个任务。这种方式,系统卸载部分的GPU负载给CPU,令CPU保持忙碌。同样的,在CPU操作慢于GPU操作的情况下,GPU和CPU辅助线程812可以被配置为从等待CPU的CPU任务队列802接受一个或多个任务。这种方式,系统卸载部分的CPU负载给GPU,令GPU保持忙碌。
上文描述的本发明的实施例,参考了不同的功能单元和处理器。然而,显而易见的是,在无损本发明的情况下,可以使用不同功能单元或处理器之间的任何合适的功能组合。例如,一个在多处理器或控制器执行的功能可能在单个的处理器或控制器上执行。因此,特定功能单元的引用应当被视为用于提供所述功能的合适手段,而不是专指于某种特定的逻辑、物理结构或组织结构。
本发明可以以任何适当的形式实现,包括硬件、软件、固件或它们的任意组合。本发明可以根据情况有选择的部分实现,比如计算机软件执行于一个或多个数据处理器以及数字信号处理器。本文的每个实施例的元素和组件可以在物理上、功能上、逻辑上以任何适当的方式实现。事实上,一个功能可以在独立单元中、在一组单元中、或作为其他功能单元的一部分来实现。因此,该系统和方法既可以在独立单元中实现,也可以在物理上和功能上分布于不同的单元和处理器之间。
在相关领域中的技术人员将会认识到,本发明的实施例有许多可能的修改和组合,虽然形式略有不同,仍采用相同的基本机制和方法。为了解释的目的,前述描述参考了几个特定的实施例。然而,上述的说明性讨论不旨在穷举或限制本文所发明的精确形式。前文所示,许多修改和变化是可能的。所选和所描述的实施例,用以解释本发明的原理及其实际应用,用以使本领域技术人员能够最好地利用本发明和各个实施例的针对特定应用的修改、变形。