Demos & examples

公开可跑的 Demo 详解

examples_klink/public 是公开 gallery——无 NDA、无私有 PDK、无提交的私有 GDS。8 个示例 demo:2 个完全离线,6 个需要 live KLayout(仍不需要外部 GDS),其中 1 个(gdsfactory 接管)还需要同解释器里的 gdsfactory。所有器件与工艺相关的量都在 demo 自己里,klink 不带任何工艺常量——复制一个 demo、改数字,就是你自己的工艺,流程不变。

怎么跑取决于你怎么装的

8 个 demo 全部是随 wheel 打包的 starter,按 nanodevice/photonics/passives/digital/ 四类分组:klink init <proj> 会把它们脚手架进 <proj>/example_template/<类>/,pip 安装的用户直接 python example_template/<类>/<name>.py 跑——nanodevice/ 下的 ebl_wraparound、hallbar、neural_electrodephotonics/ 下的 gf_mzi_modulepassives/ 下的 idc_capacitor、spiral_inductor、saw_idt_filter、baw_fbar_planviewdigital/ 下的 fit_device_pnr_lvs、chat_to_netlist_pnr、multilayer_pnr_lvs、padframe_pnr_lvs(下文对应卡片直接给这个命令)。digital/ 家族这 4 个额外需要一个运行中的 KLayout 会话(它们做 live P&R+LVS);仓库克隆里也可以用 python -m examples_klink.public.demos.digital.<name> 形式跑,下文卡片一并给出。

运行 demo 不需要 MCP。每个 demo 都是普通 python -m … 脚本,直接通过插件端口和 KLayout 对话。MCP 是让你的 agent 把 klink 当常驻工具调用的那一层,比反复跑脚本更顺。两条路都用同一个 pip install klayout-klink
“KLayout port 就是一个 session——任何端口都行,没有特殊角色。用空的或测试专用的 session,别用你手工的工作 tab。”

8 个 demo 一览

Demo类别依赖实测摘要
EBL wraparound纳米器件完全离线40 电极 · 12 patch · 0 violations · 0 overlaps
Hall bar纳米器件离线(--live 可写入)semantic bundle + routed result
Neural electrode纳米器件live KLayout48 ports · 24 nets · overlap 0 · hit 0
Fit device → P&R → LVS数字 P&Rlive KLayoutrouted 94/94 · LVS match=True · 173 器件
Netlist → lint → P&R数字 P&Rlive KLayoutlint 0 err · routed 3/3 · LVS match=True
Multilayer P&R 规模数字 P&Rlive KLayoutrouted 405/405 · LVS match=True · 766 器件 · ~17s
Probe-card padframe数字 P&Rlive KLayoutrouted 94/94 · LVS match=True · 16 pad connected
gdsfactory MZI 接管硅光live KLayout + gdsfactory6 光学 net · reroute 12 routes · 0 crossings

1 · EBL 纳米器件 wraparound 完全离线

一个参数化的电子束光刻(EBL)wraparound 生成器。离线运行会打印生成的 bundle;--live 写入 KLayout session。这是无需任何外部几何就能看到第一条结果的最快路径。

python example_template/nanodevice/ebl_wraparound.py          # [--live] [--keep]
# 仓库克隆里也可以: python -m examples_klink.public.demos.nanodevice.ebl_wraparound
40电极
12patch
16 / 11 / 20writefield fields/windows/crossings
0violations
0overlaps

复用核心: klink.domains.nanodevice.devices.wraparound.build_wraparound_demo。改成你自己的工艺:复制这个 demo,改电极数 / pitch / writefield 参数即可,流程不变。

📖 分步图文讲解 →

2 · Hall bar 纳米器件 离线(可 --live)

参数化 Hall-bar 生成器。离线打印 semantic bundle + routed result;--live 写入一个一次性 KLayout cell(除非 --keep 否则用完删除)。它演示 nanodevice.hallbar 背后“器件生成器 + 交给通用 router 布线”的流程。

python example_template/nanodevice/hallbar.py                 # [--live] [--keep]
# 仓库克隆里也可以: python -m examples_klink.public.demos.nanodevice.hallbar

复用核心: tapered-hybrid router + port.mark / anchor.mark。从 HallBarSpec(bar 长宽、contact 数、pad 尺寸、pitch、gap)算出整个器件几何,再把 contact→pad 的布线委托给通用路由。

📖 分步图文讲解 →

3 · Neural-electrode harness live KLayout

自包含的探针生成器:定义 pad/via 几何与 Port/Anchor 资源,然后调 tapered-hybrid router。无 GDS,只有 live Port/Anchor PCell。用一个空的或测试专用 session。

python example_template/nanodevice/neural_electrode.py --port <session-port> --elec-rows 4
# 仓库克隆里也可以: python -m examples_klink.public.demos.nanodevice.neural_electrode --port <session-port> --elec-rows 4
48ports
24nets routed(12×1/0 + 12×3/0
0sibling-overlap
0obstacle-hit
📖 分步图文讲解 →

4 · 拟合器件 → 数字 place & route → LVS live KLayout

完整、自包含、无 IP 的数字流:从合成 exemplar 几何拟合一个参数化器件 PCell,放置它,跑 detailed routing,再用 live LVS 验证。把你自己 harvest 的 exemplar 盒子换进去,就能拟合并布线你真实的器件——流程不变。

python example_template/digital/fit_device_pnr_lvs.py --port <session-port>   # [--draw-only]
# 仓库克隆里也可以: python -m examples_klink.public.demos.digital.fit_device_pnr_lvs --port <session-port>   # [--draw-only]
94/94routed
match=Truelive LVS
173器件

复用核心: map_logic_to_devices(...) → place → FlexDR → live LVS。

📖 分步图文讲解 →

5 · 手写网表 → lint → place & route → LVS live KLayout

“在对话里描述,得到一个已验证版图”的流:一个 3 级环形振荡器网表手写而成(想象对话里的每个需求映射成几行显式网表),由 lint_netlist 校验(在任何几何存在之前每个结构错误都给 fix-it 提示),然后 place、route、LVS 验证,每个 stage 节点作为裸标注 trace 引到周边。网表是纯数据——agent(或你)可以为任意拓扑写一个,不需要逻辑综合器。

python example_template/digital/chat_to_netlist_pnr.py --port <session-port>
# 仓库克隆里也可以: python -m examples_klink.public.demos.digital.chat_to_netlist_pnr --port <session-port>
0lint 错误
3/3routed
match=TrueLVS
6器件
3/3tap 抽取验证 CONNECTED

6 · 规模化多层 place & route live KLayout

规模 demo:一个内置的 766 器件合成网表(玩具 4-bit ALU,268 门,用开源逻辑综合器网表化,重映射到本 gallery 的合成拟合器件)先 lint,然后用内置的层数顾问在两套示例工艺栈上对比——fit-a-device demo 的 3 层公开工艺,和 demo 里自定义的第二套 7 层栈(器件端子上 2 竖 + 2 横干净信号层)。顾问打印每套的 core-area 成本,让你看清这种规模的设计为什么需要额外层,而前面的小 demo 在 3 层上很舒服。然后放置、标出设计全部 20 个主端口(西边 13 进,东边 7 出),用多层路由引擎布线。

python example_template/digital/multilayer_pnr_lvs.py --port <session-port>
# 仓库克隆里也可以: python -m examples_klink.public.demos.digital.multilayer_pnr_lvs --port <session-port>
405/405nets routed
match=TrueLVS
766器件
20/20port 抽取验证 CONNECTED
~17s端到端

复制这个文件、改 PUBLIC_MULTILAYER 就是你自己的层栈——流程不变。

7 · Probe-card 优先的 place & route live KLayout

反序的硬件流:探针卡 / pad ring 先存在(位置很久前就冻结了),电路必须去迁就它——哪怕卡内部装不下整个 block。用和 fit-a-device 相同的合成 4-bit 加法器与拟合器件,先 lint,然后造一个替身 20-pad 探针卡并用 pads_from_gds harvest 回来(真实场景里你跳过 fabricate、直接 harvest 自己的卡文件)。一张 net→pad 表分配全部 14 主端口 + VDD + GND(4 个冗余 pad 保持未用);因为卡内部只装得下一半行,place_grid(forbid_y_bands=…) 把 block 拆成一半在卡内 / 一半在卡下pdn_split_bands 每区一张电网、用一条 spine strap 桥接。

python example_template/digital/padframe_pnr_lvs.py --port <session-port>   # [--no-card]
# 仓库克隆里也可以: python -m examples_klink.public.demos.digital.padframe_pnr_lvs --port <session-port>   # [--no-card]
94/94routed
match=TrueLVS
173器件
85 / 80卡内 / 卡下
16 + 4pad connected + 冗余隔离

--no-card 去掉卡:每个端口作为裸标注线端引到周边(输入西、输出东,吸附到路由通道中心),电源在自动标注的 PDN tie rail 上——routed 94/94,LVS match=True,14 stub 全 CONNECTED。复制这个文件、改 pad 表就是你自己的卡。

📖 分步图文讲解 →

8 · gdsfactory 接管 → 可编辑光子模块 live KLayout + gdsfactory

一个完整的热光 MZI——倾斜 fiber GC → 1×2 MMI 分束 → 两条热相移臂(下臂镜像)→ 2×2 MMI 合束 → 偏移输出 GC,加热器 pad 行和 fiber loopback 对——写成一个普通 gdsfactory 脚本,然后被一次 import_gf_component 接管。一张持久 net 表随后容纳每一种 net:脚本自己的光学(由 klink 重画)、重排成 sbend 的偏移输出、Manhattan router 够不到的倾斜 GC(all_angle)、loopback 对(dubins 圆弧)、以及金属层上的 heater→pad 电学 net。一次 photonics.reroute 把它们全部重画——所以你在 KLayout GUI 里拖动任意组件后,一次 reroute 同时重路由光学和金属

python example_template/photonics/gf_mzi_module.py --port <session-port>
# …在 KLayout 里拖动一个组件…
python example_template/photonics/gf_mzi_module.py --port <session-port> --reroute
# 仓库克隆里也可以: python -m examples_klink.public.demos.photonics.gf_mzi_module --port <session-port> [--reroute]
6光学 net
13 / 5instances / device cells
12reroute routes
0 / 0crossings / device-hits
拖动 → reroute 循环是重点。 --reroute 从拖动后的位置重路由而不重建,保住你的编辑。不带 flag 重跑脚本会从 gdsfactory 源重建、把每个组件吸回原位、撤销你的拖动——这是常见的初次惊吓,所以 flag 就是解药。(有 MCP 工具的 agent 直接调 photonics.reroute。)

依赖: 需要运行它的同一个解释器里有 gdsfactory(它在客户端构建模块再推给 KLayout)。demo 钉在测试过的版本线上——pip install "klayout-klink[photonics]" 装到一个已知可用的 gdsfactory。如果 gdsfactory 已在另一个 venv,把 klink 装进那个 venv 并从那里跑,不要 sys.path-hack 仓库进外部解释器(那条路通向版本不匹配和 1000× 偏差的几何)。

📖 分步图文讲解 →

无源器件几何模板 离线(可 --live)

四个参数化无源器件几何模板,passives/ 类的starterklink initpython example_template/passives/<名>.py 可跑。默认离线,各自往 test_outputs/ 写一个 GDS 并打印结构化自检 summary;--live [--port <会话端口>] 则往 KLayout 会话推一个用完即弃的 cell。每族都在电学端子上打 klink Port(999/99),路由后端开箱即用。每个都是几何模板,不是验证过的电学/声学设计——把数字改成你自己的工艺,用你自己的模型验证(SAW/BAW 不做任何频率或材料声明)。

  • IDC 叉指电容 —— python example_template/passives/idc_capacitor.py(默认 10 指:合并区域 2、无短路、2 端口)
  • 方形螺旋电感 —— python example_template/passives/spiral_inductor.py(默认 3 圈:每层金属 1 个合并区域、下穿走线跨 4 段、2 端口)
  • SAW IDT 滤波器 —— python example_template/passives/saw_idt_filter.py(默认 12 对指:每 IDT 2 个合并区域、每反射光栅 1 个、4 端口)
  • BAW / FBAR 俯视图 —— python example_template/passives/baw_fbar_planview.py(默认目标面积 2000 µm²:任意两边不平行、面积误差 <1%、2 端口)

每条命令都支持 [--live --port <会话端口>]

📖 分步图文讲解 →

Feature 示例

examples_klink/public/features 展示单项能力,适合学 API 并复制到你自己项目:

  • gdsfactory:route to KLayout(23)、route ports(24)、net examples(25)、component marker(26)、width mismatch + auto taper(29)、routing zoo(30)——用开源 gf.gpdk,同解释器规则同上。
  • Port/Anchor walkthrough(anchor_port_5_example 及其 _pya 版)。
  • 路由压力测试:tapered、tapered segments、steiner、damped、以及 future/missing-algorithm 展示。
  • measurement import、harness/probe 生成器。

另有 examples_klink/public/smoke 里的能力 smoke demo(draw、PCell zoo、cells & shapes、delete/undo、exec、route run)——不是完整教程,但适合确认某项底层能力可用。

公开边界

公开 gallery 的合同是 open + open-box runnable

  • 不含 NDA / 专有 PDK 内容。
  • 不提交私有 GDS。
  • 不 import dev-only PDK module。
  • 第三方依赖按普通 pip install 处理。
如果一个流程需要用户自己的私有器件 GDS,它只能在用户项目运行时读取该路径,不能把 GDS/PDK 文件提交到公开仓库或网站示例里。模板 .gitignore 默认拦 *.gds/*.oas