Case Study · DRC
对话实战:让 klink 跑 DRC 查违例再修好
三句话,三次真实工具调用:画一条踩线的版图、用 klink 跑 DRC 抓违例、按结果修好再确认干净。
这是一段真实对话记录。每句用户请求都是真实用户会说的话;针对每句,klink 的 AI agent 真的调用了列出的 klink 工具,在实时运行的 KLayout 里画出版图、跑了真实的 DRC——每步后的截图和违例数就是 KLayout 当时的真实结果。
用户
画两条平行的金属走线,故意让它们只隔 0.1µm——我想看 DRC 能不能抓到间距违例。
klink agent
开一个一次性 tab,在 20/0 层画两条 20µm 长的金属线:一条 y=[0,2],另一条 y=[2.1,4.1]——间距正好 0.1µm。
view.new_tab(cell_name="DRC_CHAT_DEMO")
layer.ensure(layer=20, datatype=0)
shape.insert_boxes(cell, layer_index=2, boxes_um=[[0,0,20,2],[0,2.1,20,4.1]])
→ inserted=2, bbox_dbu=[0,0,20000,4100]
用户
用最小间距 0.5µm 的规则跑一下 DRC。
klink agent
写一个最小的 DRC deck,对 20/0 层做 space(0.5.um) 检查,通过 drc.run 跑在 KLayout 的原生 DRC 引擎上:
drc.run(code = '''
report("chat_drc_space", $output_rdb)
m = input(20, 0)
m.space(0.5.um).output("M_SPACE", "metal-to-metal space < 0.5 um")
''', output_rdb=..., result_mode="full")
→ rdb_summary.total_items = 1
→ categories: [{name: "M_SPACE", count: 1}]
→ exception = null
抓到了——真实结果:1 处间距违例(类别 M_SPACE)。为了让违例位置在截图里也看得见,我在标记层 66/0 上画了一个覆盖那道 0.1µm 缝隙的高亮框(蓝色斜线区域,坐标来自我们自己画的这道缝——不是伪造,是真实几何位置):
layer.ensure(layer=66, datatype=0)
shape.insert_boxes(cell, layer_index=..., boxes_um=[[-1,1.9,21,2.2]])
用户
把其中一条往外挪到间距 1µm,再跑一遍 DRC 确认干净了。
klink agent
删掉违例高亮和旧的上方走线,把它重画到 y=[3.0,5.0]——这样间距就是 3.0−2.0 = 1.0µm。然后用同一份 deck 重跑 DRC:
shape.delete(cell, layer_index=..., bbox_um=[-1,1.9,21,2.2]) # 清掉违例标记
shape.delete(cell, layer_index=2, bbox_um=[0,2.1,20,4.1]) # 清掉旧走线
shape.insert_boxes(cell, layer_index=2, boxes_um=[[0,3.0,20,5.0]])
drc.run(code=<同一份 0.5µm space deck>, result_mode="full")
→ rdb_summary.total_items = 0
→ categories: [{name: "M_SPACE", count: 0}]
→ exception = null
确认干净:0 处违例。1µm 间距满足 0.5µm 的最小间距规则。
DRC/LVS 的完整能力 → 指南 · DRC·LVS。
如实复述:本页三轮对话的几何、层号(20/0 走线、66/0 违例标记)、DRC deck 全部是为演示合成的,不含任何真实工艺或客户数据;三次
drc.run/shape.* 调用和其返回的违例计数(1 → 0)均对 live KLayout(专用会话,端口 8766)真实执行,截图为该次运行的真实渲染结果。工作用的一次性 tab 已在收尾时关闭,原有 tab 已恢复为当前视图。