ROD(Relative Object Design)概念
1、介 绍
Virtuoso® Relative Object Design(ROD)是一种用于定义从简单到复杂的布局对象及其相互关系,而无需使用低级的 Cadence® SKILL 语言函数。ROD 使得能够在高抽象层次上创建对象并定义其关系,从而使您可以专注于设计目标。ROD 自动处理遍历设计层次结构的复杂性,并简化了创建和对齐几何图形所需的计算。
单个 ROD 函数调用可以完成一个任务,这个任务通常需要多个低级 SKILL 函数调用来完成。例如,创建一个引脚需要一系列的低级 SKILL 函数调用,但使用 ROD,只需一个函数就可以创建一个形状并将其指定为引脚。可以使用一个函数调用来创建护环(guard rings)、接触阵列和晶体管等实体。您还可以通过指定新对象的大小,从现有对象创建一个对象。
ROD 函数允许:
- 创建层次化参数化单元
- 命名矩形、多边形、路径、线条、点、标签和文本显示对象
- 通过所有层次级别按名称访问对象
- 通过所有层次级别访问对象上存储的点和其他信息
- 将 ROD 对象对齐到彼此或特定的坐标
- 为 Pcell 参数分配句柄以进行交互式拉伸
- 创建多部分矩形和多部分路径
- 从其他对象创建对象
有关 ROD 函数的完整描述,请参阅“Using Relative Obeject Design Functions”。
2、使用ROD函数与数据库函数
本章详细描述了使用 ROD 函数创建和操作对象的诸多优点。那么,为什么不把所有对象都变成 ROD 对象呢?有时,用 dbCreate 函数创建对象比用 rodCreate 函数更好,因为 ROD 对象的附加功能会带来一些额外的内存占用。
通常,仅在以下情况下使用 ROD 函数:
- 指定对象之间的持续关系
- 创建复杂的多部分对象,例如护环
- 从不同的层次级别访问对象
- 拉伸参数化单元上的句柄以更改参数值
- 从现有对象创建新对象
当您想创建一个简单形状(例如矩形或简单的单一路径),并且不打算将该形状与另一个对象“关联”时,请使用 dbCreate 函数。dbCreate 函数不需要存储 ROD 对象所需的附加信息,因此运行速度稍快且占用更少的内存。
对于其他 ROD 函数(如 rodAlign 与 dbAlign),也是如此。仅在需要对齐关系持续存在时使用 rodAlign。
3、使用ROD函数创建PCell
使用 ROD 函数创建参数化单元(Pcells)的几何形状可以提高生产力,因为它减少了编写代码的难度和复杂性。使用 ROD 之外的 SKILL 创建 Pcells 时,必须使用低级的 SKILL 数据库访问函数来构建和操作几何形状。这需要花费大量时间和精力来计算和跟踪几何坐标。而当您使用 ROD 函数创建几何形状时,创建和维护复杂的 SKILL Pcells 变得更加容易。您可以创建高级构建块并使它们相互对齐,而不是编写代码来计算跨层次级别的点坐标。
历史上,使用程序创建大规模宏单元和全芯片组件需要 SKILL 开发人员投入巨大努力,专门编写 Pcell 代码。ROD 提供了高级设计捕捉支持,使得即使是编程经验有限的设计师也能够创建复杂的 Pcells,而那些具有高级编程能力的人员则可以生成复杂的单元和模块。
在您以参数化代码形式捕捉设计后,可以使用不同的参数值和不同的技术规则生成各种单元模块。此外,创建一个能捕捉您设计意图的单一设计,减少了独立操作低级布局对象所带来的错误。
使用 ROD 创建 Pcells 的主要优点包括:
- 您可以基于工艺文件中的规则设定 Pcell 参数,使得 Pcells 能够适应工艺变化
- 您可以为 Pcell 参数分配点句柄,从而在 Virtuoso 布局编辑器中通过拉伸 Pcell 交互式更新参数
在 Pcells 中使用 ROD 函数之前,请参阅Virtuoso Parameterized Cell Reference中的“Creating SKILL Parameterized Cells”以了解安全规则。
有关 Pcells 的示例,请参阅“Sample Parameterized Cells Installation and Reference”。
4、命名对象
您可以为零级对象(如矩形或多边形等普通数据库形状)分配一个名称,可以使用 rodNameShape 函数命名现有对象,也可以使用 RODcreate 函数创建一个对象。您还可以在使用 Virtuoso 布局编辑器创建形状时命名该形状。通过层次结构,您可以访问有关命名对象(如实例和命名形状)的信息。
-
层次名称
要通过层次结构访问有关命名形状或实例的信息,请使用其层次名称和顶级单元视图 ID。层次名称由到达目标命名形状或实例所需的实例名称组成。下图展示了包含命名形状 polyRect 的布局单元视图中的层次结构。其层次名称为 INV1/ptr1/polyRect。
当您使用 ROD 命名函数为现有数据库形状命名时,该函数会创建与形状关联的 ROD 信息。该信息存储在一个 ROD 对象中,并由唯一的 ROD 对象 ID 标识。ROD 对象中包含的信息包括其名称和数据库 ID。当您使用 ROD 创建函数创建新形状时,该函数会创建一个命名的数据库形状和一个 ROD 对象。
5、ROD对象的句柄(Handles)
句柄是 ROD 对象的一个属性或信息项,例如对象周围边界框上的某个点的坐标、对象边界框的宽度或对象的电阻。您可以通过所有层次级别访问句柄。
句柄分为两类:系统定义句柄和用户定义句柄。当您创建 ROD 对象时,系统会自动为该对象定义多个句柄。系统定义句柄的值不是存储在内存中,而是在引用这些句柄时按需计算。用户定义句柄的值则存储在内存中。
系统定义点句柄的值是对象或其边界框上的某个点相对于顶层布局单元视图坐标系的坐标。有关系统如何通过层次结构计算坐标的详细描述,请参阅"ROD Objects in Hierarchy"。
使用 rodAlign 函数,您可以使用句柄将一个对象对齐到另一个对象,存储信息,或访问设计层次中较低级别对象的信息。
1)系统定义句柄
系统会自动为大多数 ROD 对象定义以下类型的句柄:
- 边界框点句柄
- 边界框宽度和长度句柄
- 段点句柄
- 段长度句柄
ROD 点、标签和文本显示对象由单个点定义,因此它们的所有点句柄都认为是其原点,其长度和宽度句柄认为是零。
注意:对于多部分路径(multipart paths),系统还提供了句柄 mppBBox,该句柄包含整个多部分路径的边界框的左下角和右上角坐标列表。下表总结了句柄类型及其适用的 ROD 对象:
句柄类型 | 适用于 |
边界框点句柄 | 除了dot、labels和text对象外的所有ROD对象 |
边界框宽度和长度句柄 | 除了dot、labels和text对象外的所有ROD对象 |
mppBBox | ROD multipart paths |
线段点句柄 | ROD rectangles,polygons 和 paths |
线段长度句柄 | ROD rectangles,polygons 和 paths |
【1】边界框点句柄
每个ROD对象周围的边界框都有9个系统定义的点句柄:
- 每个角各有一个
- 每条边的中心各有一个
- 边界框的中心有一个
系统会自动为边界框点句柄命名并计算其值。名称指示句柄的位置,如下图所示:
图1-1 多边形的边界框点句柄
可以将边界框点句柄名称缩写如下:
upperLeft 或 uL lowerLeft 或 lL
upperCenter 或 uC lowerCenter 或 lC
upperRight 或 uR lowerRight 或 lR
centerLeft 或 cL centerCenter 或 cC
centerRight 或 cR
这些缩写使得在引用边界框点句柄时更加简洁和方便。
【2】边界框宽度和长度句柄
系统为命名对象的边界框提供了名为 width
和 length
的浮点句柄,其中 width
是水平测量值,length
是垂直测量值。需要注意的是,对于矩形,其边界框的宽度和长度与其形状的宽度和长度相同。
对于多边形,系统会计算与边界框关联的 width
和 length
句柄的值,如下图所示:
图1-2 多边形的边界框宽度和长度句柄
对于单个路径(single-part path),系统会计算与边界框关联的 width
和 length
句柄的值。具体如下:
图1-3 单个路径的边界框宽度和长度句柄
对于多部分路径(multipart path),当系统计算 width
和 length
句柄的值时,它始终使用主路径(master path)周围边界框的宽度和长度。
图1-4 多部分路径的边界框宽度和长度句柄
对于多部分路径(multipart paths),还有一个附加的句柄:mppBBox
。mppBBox
句柄包含一个列表,该列表描述了整个多部分路径外边界框的左下角和右上角坐标。
图1-5 整个多部分路径的边界框mppBBox句柄
【3】关于矩形、多边形和路径的线段
对于矩形、多边形和路径等ROD(Relative Object Design)对象,系统会为对象的每个线段分配多个点句柄。可以使用这些线段点句柄名称来引用对象边界上的点。
在ROD中,矩形或多边形的线段定义为对象边界上的一条边,即两个点之间的有限线段。例如,一个六边形有六个线段(即六条边)。每个线段都可以通过其起点和终点的点句柄进行引用和操作。
这些点句柄让你能够更方便地访问和操作对象的边界点,从而在设计和修改几何形状时提供更多的灵活性。总之,不论是矩形、多边形,还是路径,它们的每一条边(segments)都可以通过特定的点句柄来标识和引用。
图 1-6 多边形的边线段
在路径(path)的情况下,线段(segments)不仅包括路径的宽度,还包括路径的两条边。例如,下面的路径有4个segments。
图1-7 路径的段(segments)
系统为对象的每个线段分配一个名称,使用前缀 segment 加上一个数字:segmentn,其中 n 从零开始,是线段编号。对于 ROD 矩形,线段总是按顺时针方向编号,从左下角开始。
图1-8 对矩形的边(segments)编号
对于ROD多边形,系统按照创建多边形的方向对边进行编号,从定义的第一个点开始。下面的六边形是按顺时针方向创建的。
图1-9 对多边形的边(segments)编号
注意:如果您使用 Virtuoso 布局编辑器创建一个多边形,然后使用 rodNameShape 函数为其分配名称,系统将从您创建多边形时定义的第一个点开始编号。
下面路径的线段是按顺时针方向创建的。
图1-10 对路径的边(segments)编号
【4】多边形和矩形的线段点句柄
对于矩形和多边形,系统计算以下点句柄:
- 对于每个线段,三个点句柄:一个在线段的起点、中点和终点。它们的名称分别是:startn、midn 和 endn,其中 n 是线段编号。一个线段的 endn 句柄和下一线段的 startn 句柄共享同一个点。
- 对于最后一个线段,除了上述三个句柄,还有另外三个句柄:startLast、midLast 和 endLast。
下图中的六边形是从最高线段的左上角开始创建的,线段按顺时针方向定义。
图1-11 多边形的线段点句柄
第一段的起点也是第六段的终点,所以 start0 点句柄的值与 end5 点句柄的值相同。系统为多边形的最后一段(在本例中为第六段)计算三个额外的点句柄值。图显示了同一个点的三个系统定义的线段点句柄——start0、end5 和 endLast。
对于矩形,系统总是使用左下角作为起点,并按顺时针方向定义线段。
图1-12 矩形的线段点句柄
对于矩形,系统总是使用左下角作为起点,并按顺时针方向定义线段。因此,当你旋转一个矩形时,这些句柄的值会随之改变。
【5】路径的线段点句柄
在为路径的线段点句柄命名时,系统考虑到了路径的方向。与路径方向相关的左侧句柄名称包含单词“Left”,右侧句柄名称包含单词“Right”。
例如,如果下面的单段是道路,并且你按照所示方向驾驶,那么线段顶部边缘的句柄被命名为左侧线段句柄,线段底部边缘的句柄被命名为右侧线段句柄。
图1-13 单段路径的线段点句柄
多段路径的点句柄名称如下所示:
图 1-14 多段路径的线段点句柄
对于路径,系统计算两个额外的点句柄的值:startCenter0 和 endCenterLast。
对于端点类型为齐平的路径,startCenter0 和 endCenterLast 句柄的值与 start0 和 endLast 句柄的值相同。然而,对于层延伸超出中心线的路径,其端点类型为可变、偏移或八边形,startCenter0 和 endCenterLast 句柄的值与 start0 和 endLast 句柄的值不同,如下图所示。
图1-15 扩展类型路径的点句柄
对于端点类型为齐平、偏移或可变的路径,路径段的点句柄位于路径边界或路径中心线。然而,对于端点类型为八边形的路径,一些位于路径端部和路径段连接处的段点句柄位于路径边界之外。
例如,对于下图所示的路径,startLeft0、startRight0、endRight0、startRight1、endLeft1、endLeftLast、endRight1 和 endRightLast 段点句柄位于路径本身之外。
图1-16 具有八边形端点的路径的段点句柄
【6】段长度句柄
系统为具有段的对象的每个段提供一个段长度句柄。对于路径,系统为每段的中心线提供一个长度句柄,不包括任何延伸部分(如果有)。
注意:对于多部分路径,系统仅基于主路径的点定义句柄,mppBBox句柄除外。
系统将长度句柄命名为lengthn,其中n是段号。第一个段的长度句柄为length0。系统按照对象创建的方向,每增加一个段,n加1(矩形始终以顺时针方向创建,从左下角开始)。系统还为最后一个段提供句柄lengthLast。
图1-17 矩形的边长度句柄
对于矩形,左下角始终是其起点,因此当你旋转矩形时,句柄的值会改变。
下图中的六边形是从最高段的左上角开始创建的,段是按顺时针方向定义的。
图1-18 多边形的边长度句柄
注意:如果你使用Virtuoso布局编辑器创建一个多边形,然后使用rodNameShape函数为其指定名称,系统会从你创建多边形时定义的第一个点开始编号段。
对于路径,系统沿路径中心线计算段长度句柄的值。下图显示了一个四段路径的段长度句柄的名称。
图1-19 多段路径的边长度句柄
【7】访问路径宽度
系统不会自动计算ROD路径的宽度值。(宽度句柄测量的是路径周围边界框的宽度。)然而,你可以使用ROD对象ID和对象的数据库ID(dbId)的ROD属性,通过数据库访问操作符(~>)来访问路径宽度。
例如,对于一个多部分路径,以下语句返回主路径的宽度:
rodId~>dbId~>width
为什么同一个点有多个句柄?
在某些情况下,系统会为同一个点提供多个句柄。尽管同一个点的多个句柄看起来似乎是多余的,但它们为你提供了灵活性。例如,如果你不知道一个对象有多少段,可以使用包含单词Last的点句柄名称来引用最后一段的点。
例如,对于一个从右上角开始顺时针创建的八边形,段号为0到7。
图1-20 多句柄名称指向同一个点
2)用户定义句柄
你可以定义自己的句柄来存储点、计算结果和其他信息。定义新句柄时,你需要指定名称(或让其使用默认名称)并分配一个值。用户定义的句柄的值存储在数据库中。存储的信息可以是以下任何数据类型:
- 点(point)
- 整数(integer)
- 布尔值(Boolean)
- 浮点数(floating-point number)
- 字符串(string)
- SKILL表达式(SKILL expression)
如果让新句柄的名称使用默认值,系统会在该cellview中分配一个唯一的名称,如下所示:handle0、handle1、handle2等。
例如,如果一个布局cellview包含两个ROD对象,并且你为每个对象都创建一个用户定义的句柄而未指定句柄名,系统会将句柄名分别分配为handle0(第一个对象)和handle1(第二个对象)。
如果创建句柄时未指定名称,可以查询系统为新句柄分配的名称。关于如何实现这一点的代码示例,请参见“Problem 3-6 Querying a System-Assigned Handle Name”。