怎么跑取决于你怎么装的
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_electrode,photonics/ 下的 gf_mzi_module,passives/ 下的 idc_capacitor、spiral_inductor、saw_idt_filter、baw_fbar_planview,digital/ 下的 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> 形式跑,下文卡片一并给出。
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 KLayout | 48 ports · 24 nets · overlap 0 · hit 0 |
| Fit device → P&R → LVS | 数字 P&R | live KLayout | routed 94/94 · LVS match=True · 173 器件 |
| Netlist → lint → P&R | 数字 P&R | live KLayout | lint 0 err · routed 3/3 · LVS match=True |
| Multilayer P&R 规模 | 数字 P&R | live KLayout | routed 405/405 · LVS match=True · 766 器件 · ~17s |
| Probe-card padframe | 数字 P&R | live KLayout | routed 94/94 · LVS match=True · 16 pad connected |
| gdsfactory MZI 接管 | 硅光 | live KLayout + gdsfactory | 6 光学 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
复用核心: 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
1/0 + 12×3/0)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]
复用核心: 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>
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>
复制这个文件、改 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]
--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]
--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/ 类的starter:klink init 后 python 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处理。
.gitignore 默认拦 *.gds/*.oas。