
KLayout这个开源版图工具我在上一篇教程里带大家把主界面、图层面板和单元导航的基本操作过了一遍。这一篇是系列教程的第二篇专门把“编辑不同的形状”这件事讲透。你要在KLayout里画版图无论是画一条金属连线、抠一个焊盘开窗还是标注一个端口名落到底层全部是形状对象的创建与修改。很多新手在这里卡住往往不是不会用鼠标而是没搞明白KLayout里的形状其实分好几种类型每种类型的编辑方式都不一样什么时候该拖动顶点、什么时候该用属性面板、什么时候该上布尔运算这些套路一旦理顺画图的效率会完全不一样。这篇内容适合刚接触KLayout的版图设计新手也适合已经把DRC、LVS跑起来但基本绘图还很生疏的同学。文章不碰脚本编程只讲编辑器本身。你跟着操作一遍后再回去画自己项目里的结构应该会比之前顺手很多。因为不同版本的KLayout在菜单措辞和图标排布上会有细微差别我会把名称尽量描述成“我平时用的版本里最常见的样子”你如果发现自己界面上的叫法不完全一致按照功能去找就行。1. KLayout形状体系入门编辑操作的大前提1.1 形状和图层是绑在一起的KLayout里的任何形状都一定属于某个图层。图层由“层号/数据类型”这对参数标识比如Layer 1、Data Type 0通常写成1/0。你在画图之前如果没有选中一个目标层KLayout会不知道把新形状放到哪里。这也是很多新手第一次打开软件后随手一画结果发现图层面板里什么都没有的常见原因。所以任何编辑动作的第一原则是先确认当前激活层是哪一层再开始画。层与层的形状可以叠在一起显示但它们在数据上是分区管理的。后面你要做布尔运算、做特定层的筛选和导出全都依赖这个层归属关系。画的时候不讲究后期整理的时候会非常痛苦。1.2 理解Box、Polygon、Path、Text四种主要形状KLayout的形状类型可以大致分成几类Box矩形、Polygon多边形、Path路径、Text文本另外还有更细化的SimplePolygon、Container等类型。实际版图编辑中你用到最多的就是前四种把它们的特性和差异吃透绝大多数绘图任务都能应付。Box是最简单的轴对齐矩形数据库里只存左下和右上两个角坐标。它的优点是紧凑、处理快只要你的图形是水平竖直的矩形尽量用Box而不要用Polygon去画。缺点是Box不能表达斜边也不带旋转角度。如果你想要任意四边形或者平行四边形那它就不是Box而是Polygon。Polygon是多边形存储的是围成图形的顶点坐标列表。它可以有很多个顶点可以凹也可以凸几乎能表达任意平面图形。它和Box的关键区别在于Polygon记录了每个顶点的独立位置编辑自由度最高但同样的图形它的存储开销比Box大。能画Box的地方就没必要硬画成Polygon。Path是一条有宽度的轨迹数据库里存的是中心线的折点、线宽、端点延伸量和拐角方式。它非常适合画连线、引脚、金属走线这一类长条形对象。Path的杀手锏是它把“宽度”作为独立参数保存你画完一条线之后想从5微米改成8微米直接改Width属性就行形状会自动加宽完全不用手工去移动两条边。这是Polygon做不到的编辑体验。Text是文本标注用于标单元名、端口名或一些特殊说明。它默认不是掩膜上的实体图案更多是给人读的。虽然也能参与输出但如果你需要的是实打实的物理几何那就得用Polygon画出来而不是放一段Text。1.3 形状类型决定了后续的编辑自由度为什么我在开始操作之前花这么大力气讲形状类型因为后面你会遇到一个很典型的问题为什么别人的多边形可以任意拖顶点我的矩形拖不动答案就是类型不同。Box只能拖动四个角等效于调整两个对角点坐标它没有多余的顶点给你拖。Path则根本不能通过拖顶点来加宽你拖折点只会改变中心线的走向宽度还是要改属性。反过来如果你把一个Box转成Polygon它就获得了任意变形能力。KLayout里这种“类型转换”是可行的在形状属性面板里可以调整但转换之后数据类型就变了。我的建议是一开始画图时就想清楚这个形状将来需不需要做非常规变形需要就画Polygon不需要就保持Box或Path保持数据库尽量紧凑。形状类型数据存储方式典型用途编辑特点Box两个对角坐标焊盘、方块、简单区域拖动四角调整大小类型最紧凑Polygon顶点坐标列表任意多边形、L型拐角、复杂图形可自由增删拖动顶点灵活但占空间Path中心线折点宽度连线、走线、引脚改宽度只需改参数适合长条形Text字符串坐标标注、单元名、端口说明编辑以文本属性为主这段对比建议收藏之后你在编辑形状时纠结“为什么这个顶点拖不了”的时候回头一看就明白了。2. 创建形状把想法落到画布上的主要方式2.1 建层和切到编辑模式是画图的前置步骤打开KLayout后如果你直接尝试在画布上画图形多半是画不出来的因为此时软件还处于查看模式。必须先做两件事建一个目标层然后把界面切到编辑模式。建层的方式是在左侧图层面板上右键选择Add Layer接着会弹出层属性窗口把Layer Number和Data Type设置成你需要的内容。设置好之后点击OK图层面板里就会出现这一层默认带一个颜色标记。我习惯在一开始就把可能用到的层全部建好并设置明显的颜色避免画到一半临时切来切去。切编辑模式的位置在主工具栏附近有一个View/Edit切换按钮。点成Edit模式后画布左侧会出现一组绘制工具图标里面有我们在第1章提到的Box、Polygon、Path、Text还有圆形等工具。此时再回到画布上就可以开始画图了。2.2 画Box和Polygon从最基础的两个操作开始画Box很简单。在编辑模式下选中Box工具回到画布上单击确定第一个角按住鼠标左键拖到对角位置松开后就得到矩形。如果你需要精确尺寸不要在拖动时依赖眼睛直接双击刚画出来的Box在弹出的形状属性面板里把左下角和右上角的坐标改成你需要的值。这套“先框一个大概再改准确坐标”的做法是我画所有基础图形的标准流程。画Polygon的操作会稍微多一点。选中Polygon工具后在画布上逐个单击定义顶点软件会把相邻顶点依次连起来最后在最后一个顶点处双击或者按Enter结束多边形会自动闭合。过程中如果点错了按Backspace可以撤销上一个顶点不需要重新开始。这个细节很重要我第一次用不知道画一个五边形点错一个点硬是全部重画了一遍。这里有一个很多人没意识到的好处Polygon工具画出来的图形后期可以随意加顶点、删顶点。所以即便你要画的是一个矩形区域如果它后续要和其他图形拼接、切角直接画成Polygon反而更省事。Box好在紧凑失在灵活性差具体选哪个就看你的用途。2.3 画Path、Text和圆形Path工具我一直认为是KLayout里最被低估的绘图工具。选中Path工具后依次单击路径的中心折点软件会沿折点生成一条有宽度的带状图形。结束方式和Polygon类似双击或按Enter完成。画完后如果觉得宽度不对双击线体进入形状属性在Width栏里改掉数值整条线会同步加宽或变窄。我在画金属连线的时候几乎都是用Path拉中心骨架最后再统一设置宽度。Text工具的用法最简单选中后在画布上单击放置文本然后在属性面板里输入要显示的内容、字号和字体即可。这里提醒一句Text的内容建议用英文或数字避免中文字符在某些版本的字体渲染下出现对不齐的问题。圆形工具画出来其实是个多边形近似的圆属性里通常可以设置分段数。分段越多圆越平滑但数据量也越大。如果这个圆只是用来做机械标注分段数低一点完全够用如果它是真实器件的有源区或开窗那就要根据工艺要求确认是否需要把圆形转成近似的多边形。实际流片时很多工具会要求你把圆形手动切分成带角度的多边形这一点往往要和工艺规则对齐。2.4 画图阶段就要想清楚的三件事第一次画图的新手最容易陷入“对着屏幕盲目拉动鼠标”的状态画完一看全乱了。我建议你在每个绘图动作前想清楚三件事。第一画到哪一层当前激活层是否已经切换正确。第二形状类型选对没有是画Box、Polygon还是Path想清楚再点工具。第三坐标精确性是否达标先开启后面会讲的网格吸附或者画完立刻进属性面板修正坐标千万不要抱着“差不多就行”的心态。版图这东西差之毫厘谬以千里后面跑DRC的时候报出一堆违例十有八九都是手绘阶段埋的雷。3. 编辑已画好的形状拖动、变换与属性修正3.1 选择一个或多个形状的正确姿势编辑形状的第一步是选中它。在编辑模式下左侧工具条的Select工具就是干这个的。单击某个形状它会高亮显示表示已选中。如果要在已有选择状态上追加其他形状按住Shift再逐个单击即可。拖动鼠标拉出一个矩形框可以一次框选多个形状但要注意是“完全包含”还是“碰到就算选中”这两种行为在KLayout的选区设置里可以切换具体看版本里的选择模式选项。选中之后的操作逻辑取决于你点在形状的哪个部位。以Box为例把鼠标移动到边或角的控制点上拖动会拉伸矩形把鼠标移到形状内部光标变成四向箭头此时拖动才是整体移动。很多新手一上来就在角点上拖以为自己在移动结果把形状拉变形了还一脸茫然。这个区别必须形成肌肉记忆。3.2 顶点拖不动先检查这几种原因画完一个Polygon选中它之后顶点会以小方块的形式显示出来。正常情况下把鼠标移动到顶点附近就能拖动它。如果你发现某个顶点怎么拖都没反应多半是以下几种情况导致。第一种最常见你根本不在编辑模式下只是用查看模式选中了对象。查看模式下很多编辑交互是禁用状态需要回到Edit模式再操作。第二种这个形状可能不是普通Polygon而是一个Box或Path。Box没有独立灵活的顶点Path的宽度也不能靠拖顶点实现改这些对象的几何属性要走属性面板。第三种你可能选中的是一个实例而不是一组静态形状这尤其容易发生在从单元库里拖出来的器件身上。实例的编辑方式完全不同后面我会单独说。3.3 移动、旋转、镜像与精确坐标输入移动形状可以用鼠标直接拖着走但想要精确移动就得换个思路。我强烈建议你养成双击打开属性面板把坐标值直接输入进去的习惯。比如你想把某个矩形向右平移5微米可以先看看当前左边界坐标新的左边界等于原值加上5右边界同样加上5在属性面板里改完形状就精准地到达了新位置。旋转和镜像这类变换操作在菜单里通常以Transform或“变换”为关键词出现。选中形状后在右键菜单里找Transform相关选项一般会有旋转90度、镜像X轴、镜像Y轴等常规变换。如果需要自定义旋转角度可以在属性面板或变换参数里输入角度值。这些命令平时用得不算多但画引脚、镜像对称结构时非常方便。3.4 属性面板是形状修改的万能入口双击任意形状KLayout会弹出它的属性编辑器。对Box来说你可以改左下角坐标和右上角坐标对Polygon来说你可以看到完整的顶点列表逐点修改坐标对Path来说你可以改折点坐标以及线宽、端点延伸量对Text来说你可以修改字符串内容。这个面板同时还能改形状的层属性。有一个高频场景能体现属性面板的威力你画了一堆图形画完之后发现全画错了层。这时候不需要删掉重画只要在属性面板里把Shape Layer改成正确的层索引形状就会转移到目标层。批量处理时可以先选中所有要改层的形状再统一修改层属性。3.5 编辑PCell实例时与传统形状的差异如果你从PDK库里放置了一个参数化单元实例比如一个电阻、一个MOS管你会发现双击它弹出的不是顶点编辑面板而是参数列表。因为它是PCell实例尺寸由参数控制并不是可以直接拖拽的静态形状。想把这类实例当普通形状自由编辑就得先在属性面板或右键菜单里找到“Convert to Static”之类的方法把它转成静态几何。转换之后PCell参数就失效了以后不能再通过改参数来改变尺寸。所以我的建议是如果真的需要转静态来编辑先复制一份原实例放到旁边把其中一个转静态做实验确认无误之后再决定是否替换。4. 用布尔运算组合与拆分形状让复杂图形变得可管理4.1 布尔运算解决什么问题布尔运算是KLayout里处理复杂图形最强大的手段。它的核心思想就是把简单形状通过逻辑运算组合成复杂形状常见的运算包括AND交、OR并、SUB差和XOR异或。如果你手动去描一条带切角、开槽、多个弧形结合的图形会非常痛苦而且容易出错但通过几个Box、Polygon做布尔运算几乎可以拼出任何二维几何。很多新手不知道这个功能的存在遇到复杂图形就老老实实用Polygon工具狂点顶点最后做出来的图形不但费时间而且顶点数多到难以维护。正确的思路是“先画几个基础形状再用布尔运算拼出想要的图案”。这是版图编辑从入门到熟练的一个关键思维转变。4.2 从矩形合并出一个十字形我用一个最经典的例子说明整个操作流程用两个矩形合成一个十字形。先在编辑模式下画一个横向的长条矩形A再画一个纵向的矩形B让它们在画面上重叠成十字。用选择工具同时框选A和B然后进入布尔运算对话框选择OR运算。运算完成之后两个重叠的矩形会合并成一个整体重叠区不会出现内部边界。这个结果通常会自动转成Polygon因为十字形无法用单个Box表示。合并后的图形只有一个形状后续可以作为一个整体继续做其他操作。这是一个最小但完整的布尔运算案例建议每个人都亲手做一遍。布尔运算的入口可以从Edit菜单或者右键菜单里找关键词通常是Boolean Operation部分版本里会直接显示成AND/OR/SUB等选项。4.3 用SUB差集开槽和切角差集运算用于“减法”从第一个形状中挖去第二个形状覆盖的区域。典型场景是给一块大金属画开槽或者从焊盘上抠掉一块禁区。方法是重叠放置两个形状先选中被挖的主体再选中要挖掉的部分执行SUB运算。结果主体会多出一个开口或凹槽形状变得不规则但完全可控。做SUB运算前最好先确认两个形状的位置关系是不是精准重叠了。如果只是肉眼大概对齐运算出来的边界会很随机这时候应当利用网格吸附或直接输入坐标确保相对位置精确。我自己的经验是先画好基本形状再用属性面板把它们的坐标关系算清楚最后才做布尔运算很少让两个形状“凭感觉”重叠。4.4 合并重叠形状和拆散粘连图形很多时候同一层里画了几个相邻的矩形转换工具要求它们是单个闭合多边形。这时候可以先选中同层形状然后执行Merge或“合并选中”操作把多个相互接触或重叠的图形合并成一个整体软件会自动清理掉内部共享边界。这在处理DRC前的大面积铺地、合并金属碎块时很管用。拆散粘连图形相对少见但偶尔会遇到一个不小心合并出来的大Polygon需要拆开成几个小图形。KLayout没有一键“切开Polygon”的类似编辑器的工具但你可以用SUB运算来做切割画一条细长的矩形或线条横穿要切割的位置用减掉它的方式把大图形分成两部分。这是比较实用的处理思路。4.5 关于输出层和版本差异的提醒KLayout的布尔运算对话框里通常可以选择输出到当前层还是新层。我强烈建议你第一次做运算时输出到一个新建的临时层确认结果正确后再把形状复制回目标层。不要直接覆盖原始层尤其是原图形还可能需要微调的时候。我在这上面吃过亏直接在原层做结果覆盖后来觉得切割边界不对想回退却只能靠键盘Undo步骤一多就容易乱。不同版本的KLayout布尔运算是可以在菜单里打开的也可以对整层做运算而不只是对当前选区。整层运算适合把某一层所有图形一次性合并但它会处理层上的全部对象运行前务必确认当前层就是你要处理的层否则结果会非常壮观地出乎意料。5. 编辑形状时的高频坑点与我的习惯解法5.1 画完了一堆图形图层面板里找不到这是我在教程交流群里看到最频繁的问题。用户的画布上明明有图形图层面板对应层旁边却不显示数量。排到最后几乎都是同一个原因画的时候根本没有激活目标层图形被放到了别的层。你可以全选画布内容打开属性面板统一查看它们的层号然后把它们批量转移到目标层。另一种情况是图层被隐藏或锁定。画完图形后如果不小心把图层面板里的眼睛图标关掉了图形不会消失只是不显示。这个问题虽然简单但当你同时操作多个层时很容易弄混。养成随时通过图层面板确认各层显示状态的习惯能少浪费很多无谓的排查时间。5.2 网格吸附没开画出来的坐标全是小数版图设计对整齐度的要求远高于一般绘图。比如两条连线应该严格对齐到同一个坐标值但如果你没开网格吸附鼠标点的位置可能带着0.000123微米这样的小数画出来的图形之后每次对齐都有微小偏差甚至引发DRC的间距违例。正确做法是在开始画图前检查Snap是否打开并把网格大小设置成工艺规则允许的最小精度。如果已经有图形带小数坐标也不用完全推倒重来。可以通过属性的方式把相关点的坐标手工归整或者在编辑模式里全选后执行“选区对齐/吸附”类的工具把坐标修正到网格。是否所有版本都内置一键吸附功能我不完全确定但至少可以手工通过属性面板逐点处理。整体网格规划做在前面总比事后返工省力得多。5.3 复制形状时层归属错乱KLayout里复制粘贴形状时默认会保持原形状的层信息。如果从A层复制一个形状到画布上它的层还是A层不会自动变成当前激活层。这本来是合理设计但新手很容易误以为“当前选中的层就是粘贴后的层”。结果是图形出现在画布上却没有落到自己以为的层里后面做层运算时怎么都算不对。我现在的习惯是跨层复制之后立刻全选新粘贴的形状去属性面板里确认并修改形状层。批量跨层迁移时直接在属性面板里统一改层比逐个删除重画高效得多。5.4 Undo很强大但复杂布尔运算前务必留备份KLayout提供了多步撤销常见的误操作基本都能用CtrlZ救回来。但布尔运算本身会改变多个形状的结构运算之后即便撤销也可能因为后续操作而变得不可控。我对待大型布尔运算的态度是先另存一个版本号副本或者把原始形状复制到旁边一个临时单元里再做运算。等到运算结束、结果确认无误再删除临时保存的副本。这个方法听上去很基础但确实能救急。有一次我做一层金属的合并和开槽连续几个布尔操作之后发现最初某个参数给错了如果没有备份几乎只能从头重画。那次之后我再也没有“裸奔”运行布尔运算的习惯。整体上KLayout的编辑能力是围绕形状类型和布尔运算这两条主线展开的。我直到现在画版图也坚持几个基础习惯任何复杂图形都不直接手工勾到最后而是先画几个基础形状再组合顶点和坐标优先用属性面板做精确控制而不是凭眼睛拖每次大操作前留备份运算结果先输出到临时层。这几条帮我减少了大量返工。这篇先把编辑形状的基本操作铺开下一篇我们接着聊图层与单元管理把整个版图的组织逻辑串起来。你在实际练习中遇到其他奇怪的问题也欢迎带着现象来讨论很多“反直觉”的报错恰恰是最能加深理解的地方。