Magic源码阅读(一)——综述
Magic是什么
magic是一个集成电路的布局系统。它将有关设计规则和连通性的专业知识直接整合到布局系统中,这是为了支持以下的powerful new operation:持续的规则检查器(能够实时的后台检测当前的违反规则的地方),plowing操作来避免交互式的拉伸和压缩(interactive stretching and compaction),布线工具能够在当前通道已经存在的连接下进行工作。
为了实现这些新型op,magic设计了一种新的数据结构,叫做角勾链(corner stitching)。
Magic中的设计是使用抽象层而不是实际的mask层指定的。抽象层表示电路结构,例如contact和晶体管,其形式类似于sticks,不同之处在于可以看到对象的实际大小和位置。抽象层不会造成密度损失,但是它们简化了设计人员对系统的看法,并提供了有关电路结构的更明确的信息。
下面我们就来看一看所谓的corner stitch-ing是什么。
corner stitching
在magic中,布局都是由cell组成的。每个cell包括两种类型的内容,其一是几何形状,其二是他的subcell。magic使用corner stitching来表示一个cell。角勾链是一种表示曼哈顿形状的几何数据结构。它提供了使大多数magic高级功能成为可能的基本机制。
角勾链是一种简单的,提供了多种高效搜索操作的,并且允许数据能被快速修改的数据结构。
角勾链的基本的元素是plane和tile。每个cell都包含多个角勾链plane来表示cell的几何形状和subcell,每个plane都有多个不同类型的正方形tile组成。角勾链plane有三个重要特征:
coverage 在x-y plane的每个点都被一个tile准确的包含。空的区域表示被材料覆盖的区域。
strips 相同类型的材料用水平长条来表示,条形结构为数据库提供了规范的形式,并防止其分裂成大量的小图块。
stitches tile在他们的corner处被连接到一起,每个tile包含四个链接,叫做stitches。
stitches这种数据结构保证了各种搜索操作都能够被高效的执行,包括:找到包含特定点的tile,找到某个区域的所有tile,找到给定tile的所有邻居,遍历一个tile的连接区域,等等。
coverage属性使响应编辑的数据库更新变得容易,而strip属性使数据库的表示形式保持较小。 据我们所知,角勾链在提供这些有效的二维搜索功能以及允许快速更新交互式工具所需类型方面具有独特的能力。 与功能较弱的数据结构相比,角勾链的唯一缺点是,它需要更多的存储空间(约为基于矩形链接列表的结构的三倍)。 即使这样,对于可能在未来几年中设计的芯片,存储需求似乎也不是问题。
/*
* A tile is the basic unit used for representing both space and
* solid area in a plane. It has the following structure:
*
* RT
* ^
* |
* -------------------------
* | | ---> TR
* | |
* | |
* | (lower left) |
* BL <--- -------------------------
* |
* v
* LB
*
* The (x, y) coordinates of the lower left corner of the tile are stored,
* along with four "corner stitches": RT, TR, BL, LB.
*
* Space tiles are distinguished at a higher level by having a distinguished
* tile body.
*/
typedef struct tile
{
ClientData ti_body; /* Body of tile */
struct tile *ti_lb; /* Left bottom corner stitch */
struct tile *ti_bl; /* Bottom left corner stitch */
struct tile *ti_tr; /* Top right corner stitch */
struct tile *ti_rt; /* Right top corner stitch */
Point ti_ll; /* Lower left coordinate */
ClientData ti_client; /* This space for hire. Warning: the default
* value for this field, to which all users
* should return it when done, is CLNTDEFAULT
* instead of NULL.
*/
} Tile;
/* ----------------------- Tile planes -------------------------------- */
/*
* A plane of tiles consists of the four special tiles needed to
* surround all internal tiles on all sides. Logically, these
* tiles appear as below, except for the fact that all are located
* off at infinity.
*
* --------------------------------------
* |\ /|
* | \ / |
* | \ TOP / |
* | \ / |
* | \ / |
* | -------------------------- |
* | | | |
* |LEFT | |RIGHT|
* | | | |
* | -------------------------- |
* | / \ |
* | / \ |
* | / BOTTOM \ |
* | / \ |
* |/ \|
* --------------------------------------
*/
typedef struct
{
Tile *pl_left; /* Left pseudo-tile */
Tile *pl_top; /* Top pseudo-tile */
Tile *pl_right; /* Right pseudo-tile */
Tile *pl_bottom; /* Bottom pseudo-tile */
Tile *pl_hint; /* Pointer to a "hint" at which to
* begin searching.
*/
} Plane;
Abstract Layer
有几种方法可以使用角勾链平面来表示单元中mask几何形状。
一种可选方法是为每个mask层使用单独的plane。每个plane都包含空间tile和一种特定mask类型的tile。这种方法的缺点是许多操作,例如设计规则检查和电路提取,都需要有关层相互作用的信息(例如,多晶硅穿过扩散而形成晶体管,或者注入来改变晶体管的类型)。由于每个掩模层都有单独的plane,因此这些操作将花费大量时间交叉利用不同平面上的信息。
另一种选择是将所有mask层放置在单个角勾链平面中。由于在给定plane中的给定点上只能有一个tile,因此必须对mask层的每个可能重叠使用不同的tile类型。这消除了配准问题,但是导致大量的小图块,其中多个maks层重叠。即使许多层重叠并不重要(例如金属和植入物),也必须使用单独的图块类型来表示它们。结果,数据库碎片成大量的切片,所有操作的开销都增加了。
我们为Magic选择的解决方案介于这两个极端之间。我们决定使用少量平面,其中每个平面包含一组具有设计规则相互作用的图层。如果图层没有直接的设计规则交互作用(例如,poly和金属),则可以将它们放置在不同的平面中。某些层(例如contact)可能会出现在两个或多个平面中。
在我们的单金属nMOS工艺中,有两个平面:一个平面用于多晶硅,扩散,晶体管,和埋藏的contact;一种用于金属(请参阅表I)。
我们还决定不明确表示每个蒙版层。magic基于抽象层,而不是处理实际的遮罩层。抽象层不包括植入物,孔,埋入式接触窗或接触通孔。取而代之的是,抽象层为每种可能的晶体管和contact包括单独的贴图类型。 Magic创建用于制造的Cff文件时会生成缺少的蒙版层。表I给出了Magic中使用的平面和抽象层,图4说明了如何在示例单元格中使用抽象层。抽象层改变了电路在屏幕上的显示方式,但不会造成任何密度损失。
Magic设计风格类似于stick和符号系统,例如Mulga [131和[10]],但其几何形状是完全充实的。设计人员绘制了主要的互连层以及contact和晶体管的简化形式。magic填充了结构细节。像在stick中一样,可以通过简单的操作来拉伸和压缩cell。 Magic的抽象层方法的优势在于,设计人员可以在编辑单元时看到其确切的尺寸和形状,并且仅使用电路的单个表示即可。当使用stick时,设计人员在棍子和蒙版表示之间来回移动;在将电池压实并充实之前,很难确定电池的最终尺寸。以下各节将展示抽象层如何简化设计规则检查,耕作和电路提取。除了用于保留蒙版几何图形的平面之外,每个单元还包含另一个平面以保留有关其子单元的信息。子单元可以在Magic中重叠;每个不同的子单元区域或子单元之间的重叠在子单元平面中用不同的图块表示。每个图块都包含指向覆盖图块区域的所有子单元格的指针。通过以这种方式使用转角勾链合,可以轻松地找到子单元交互,并确定哪些(如果有的话)子单元覆盖特定区域。