# Anlogic Place Route

> 安路 FPGA 布局布线 flow skill。Use when: 需要执行、排查或审阅 TD 物理实现阶段的 opt_place、opt_route，确认从 gate.db 到 pr.db 的边界、输入、交付物和放行条件，判断问题属于 place、route、hold 修复、时钟/拥塞/DRC，避免把综合问题或 bitgen 交付误塞进物理实现阶段。

- Skill: `folsie/anlogic-place-route` (Agent Skill, multi-file: 11 files)
- Install (CLI): `npx skillmds@latest add folsie/anlogic-place-route`
- Raw SKILL.md: https://api.skillmd.com/api/skills/folsie/anlogic-place-route/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: folsie (https://skillmd.com/u/folsie)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/folsie/anlogic-place-route

---


# Anlogic FPGA Place and Route Flow Skill

把综合交付的 `*_gate.db` 推进到物理实现交付物 `*_pr.db`，并只对 `opt_place -> opt_route` 两个阶段负责。

依据 TD `6.2.1` 官方脚本：

- `DefaultFlow.tcl` 的后半段是 `opt_place -> opt_route -> bitgen`
- `PRFlow.tcl` 也把 place-route 与 bitgen 分开
- `MultiSeed.tcl` 只覆盖 `opt_place -> opt_route -> bitgen`，并且 place-route 直接消费上游 `*_gate.db`

因此，本 skill 的边界固定为：

- 上游输入是已放行的 `*_gate.db` 及其相关约束和 run 上下文
- 本阶段交付是已验证的 `*_place.db`、`*_pr.db`、物理时序/异常报告与放行结论
- 本阶段不负责综合重判，不负责 bit 文件生成、下载和板级 bring-up

## 核心边界

### 本 skill 负责

- 确认 `opt_place`、`opt_route` 是否真正闭环
- 判断失败点属于入口数据库、place、route、hold 修复、时钟结构、拥塞或 DRC
- 输出是否生成了本轮有效的 `*_pr.db`
- 输出 `route_flow.status`、时序报告、异常报告与 marker 的一致性结论
- 判断是否允许把结果交给 `anlogic-create-bitstream`

### 本 skill 不负责

- 不负责重新证明综合阶段 `gate.db` 本身是否正确，除非入口数据库明显失配
- 不负责等待 `.bitgen.end.f`、`.bit`、`.bitgen_param.f`
- 不负责 BitWriter、ChipLinker、SVF、AJE、Flash/SRAM 下载
- 不负责把“route 完成”误写成“bitstream 已可交付”

### 默认停止线

满足下面任一条件，就应停在线路实现阶段给出结论，而不是继续无效等待：

- 当前阶段日志或 `.error.f` 已表明 place/route 失败
- `route_flow.status` 或关键时序/异常报告已表明结果不可放行
- `*_pr.db` 未生成或不是本轮有效产物
- 问题已经越界到 bitgen、下载或板级调试

## 上游输入与下游交付

### 上游最小输入

- 来自 `anlogic-synthesis` 的有效 `*_gate.db`
- 工程入口：`.prj` 或 `phy_1` run 目录
- 器件上下文：`device_name`、`package_name`、可选 `speed`
- 当前 run 的日志、marker、数据库和状态文件
- 仍参与物理阶段的约束、ADC、debugger/probe 相关输入

### 本阶段最小交付

- `*_place.db`
- `*_pr.db`
- `*_place.ts`
- `*_place.timing`
- `*_phy.ts`
- `*_pr.timing`
- `*_exception.timing`
- `route_flow.status`
- 必要时 `place_flow.status`、`route.qor`、`route_clock_utilization.txt`
- 阶段级结论：卡在 place、route、post-route 检查还是入口数据问题

### 下游如何消费

- `anlogic-create-bitstream` 只应从已放行的 `*_pr.db` 开始
- `DefaultFlow.tcl` 的 `bitgen_fun` 明确在 `opt_route` 之后才运行
- `PRFlow.tcl` 里 `bitgen` 也在 `export_db ${prj_name}_pr.db` 之后才进入

这意味着：

- 只要目标是 `.bit`、`.bid`、`.bitgen_param.f`，就不能继续停在 place-route skill
- 只要 `*_pr.db` 或 route 结论还不可信，就不能把问题推给 bitstream

## 官方脚本对应的真实边界

### `DefaultFlow.tcl`

物理实现阶段真实命令顺序是：

1. `prepare`
   - `import_device`
   - `open_project` / `open_project ... -noanalyze`
   - `import_db`
2. `opt_place_fun`
   - `commit_param -step place`
   - `insert_debugger`
   - 可选 `read_adc`
   - `place`
   - `update_timing -mode manhattan`
   - `report_timing_status`
   - `report_timing_summary`
   - `report_area -io_info`
   - `flow_status -file place_flow.status`
   - `report_clock_utilization`
   - 可选 `flow_continue_check -step place`
   - `export_db ${prj_name}_place.db`
3. `opt_route_fun`
   - `commit_param -step route`
   - 条件式 `set_param route fix_hold off`
   - `route`
   - 条件式 `flow_continue_check -step route`
   - 条件式 `fix_hold`
   - 恢复 `set_param route fix_hold on`
   - `report_qor`
   - `report_area -io_info`
   - `update_timing -mode final`
   - `report_timing_status`
   - `report_timing_summary`
   - `report_timing_exception`
   - `check_timing -verbose`
   - `flow_status -file route_flow.status`
   - `report_clock_utilization`
   - `export_db ${prj_name}_pr.db`

关键结论：

- `place_flow.status` 与 `route_flow.status` 是本阶段内部证据
- `export_db ${prj_name}_pr.db` 是 place-route 的正式交付
- `bitgen` 之后的任何产物都不属于本 skill 的交付

### `PRFlow.tcl`

它证明 PR 模式下 place-route 仍是独立阶段：

- `opt_place` 前会 `import_db -link -mode ooc -inst ... _gate.db`
- `opt_route` 后会导出 `*_pr.db` 与 `static_pr.db`
- `bitgen` 仍然在 place-route 闭环之后

关键结论：

- PR 场景下，如果问题出在 `import_db -link`、`place -eco`、`route -eco` 之后，仍属于 place-route
- 如果 `static_pr.db` 还没生成，就不能把问题推进到 bitgen

### `MultiSeed.tcl`

它证明 multi-seed 是 place-route 的变体，不是 bitstream 的一部分：

- `prepare` 直接 `import_db $parent/${prj_name}_gate.db`
- `opt_place`、`opt_route` 完成后才 `bitgen`

关键结论：

- seed、congestion、`fix_hold`、`route.qor` 都属于 place-route 域
- multi-seed 里也不能因为想看 bit 文件而延长 route 分析

## 工作流程

### 1. 先确认是不是物理实现问题

只有当问题仍落在下面两段之一时，才留在本 skill：

- `opt_place`
- `opt_route`

如果用户已经在问：

- `bitgen`
- `setup_debugger`
- `export_bitgen_param`
- `.bit`
- 下载、SVF、AJE、Flash

那已经越过本 skill 边界，应切到 `anlogic-create-bitstream` 或 `anlogic-download`。

### 2. 找到真实 phy run 入口

- 优先读取 `phy_1` 目录里的 Tcl、bat、日志、marker、数据库和状态文件
- 优先相信 run 目录中的实际执行脚本，而不是 GUI 名称
- 若存在多个 run，先用时间戳和日志增量锁定当前 run

### 3. 先判入口，再判阶段，再判交付

固定检查顺序：

1. 入口是否正确
   - `*_gate.db` 是否来自本轮综合、器件配置是否一致
2. 阶段是否闭环
   - `opt_place`
   - `opt_route`
3. 交付是否成立
   - `place_flow.status`
   - `route_flow.status`
   - `*_pr.db`
   - `*_pr.timing`
   - `*_exception.timing`

### 4. 给出放行或停线决定

最终结论必须显式二选一：

- `允许放行到 anlogic-create-bitstream`
- `停留在 anlogic-place-route 修复`

不要给模糊说法，例如“route 看着差不多”。

## 阶段判断规则

### `opt_place`

重点确认：

- `place`
- `update_timing -mode manhattan`
- `report_timing_status`
- `report_timing_summary`
- `report_area -io_info`
- `flow_status -file place_flow.status`
- 可选 `flow_continue_check -step place`

常见失败归因：

- 旧 `*_gate.db` 被错误导入
- 资源装箱、原语落地、约束或区域限制冲突
- place 阶段拥塞或 WNS 已严重到不应继续 route

交付要求：

- `*_place.db` 生成
- `.opt_place.end.f` 存在
- 若启用了 `flow_continue_check`，结论未被其拦截

### `opt_route`

重点确认：

- `route`
- 条件式 `fix_hold`
- `report_qor`
- `report_timing_status`
- `report_timing_summary`
- `report_timing_exception`
- `check_timing -verbose`
- `flow_status -file route_flow.status`
- `export_db ${prj_name}_pr.db`

常见失败归因：

- `route` 未完成或 route 状态明确失败
- hold 修复顺序错误
- route 后时序、异常路径或时钟资源仍不可接受
- `*_pr.db` 没有得到本轮有效更新

交付要求：

- `route_flow.status` 存在且可解释
- `*_pr.db` 为本轮有效产物
- `*_pr.timing`、`*_exception.timing` 存在
- `.opt_route.end.f` 存在

## Marker、错误与等待规则

关注这些文件：

- `.opt_place.begin.f`
- `.opt_place.end.f`
- `.opt_place.error.f`
- `.opt_route.begin.f`
- `.opt_route.end.f`
- `.opt_route.error.f`

等待规则：

- 若出现 `.error.f`，直接按当前阶段失败处理
- 若日志出现 `ERROR`、`FATAL`、`failed`、`cannot`、`unable to`、`minidump`，且 `.end.f` 未生成，不继续等
- 若只有 `.begin.f` 没有 `.end.f`，并且日志、状态文件、`*_pr.db`、`*_pr.timing` 连续两轮都无变化，按卡住或异常中断处理
- 不因为“后面还要 bitgen”而延长 place-route 阶段等待

## 明确禁止的无效动作

- 因为 `.bit` 没出来就继续停在 place-route skill
- 因为 `bitgen` 失败就回头否定已经放行的 route，除非 route 交付本身缺失
- 只看 `*_pr.db` 存在就宣告 route 成功
- 在已进入 bitgen 后继续拿 place/route marker 解释全部问题
- 把 `fix_hold` 当成 route 前默认常开参数
- 忽略 `flow_continue_check` 的拦截信号

## 输出要求

完成任务时至少给出：

- 当前问题属于 `opt_place`、`opt_route` 还是已经越界到 bitstream
- `*_pr.db` 是否已生成且是否为本轮有效交付
- `*_place.timing`、`*_pr.timing`、`*_exception.timing`、`route_flow.status` 分别在哪里
- marker 是否闭环，是否存在 `.error.f`
- 是否允许放行到 `anlogic-create-bitstream`
- 若不允许，最小修复动作是什么

## 与其他 skills 的联动

- 上游通常来自 `anlogic-synthesis`
- 若问题回溯到时钟/IO/约束策略，联动 `anlogic-timing-constraints`
- 若问题其实暴露的是旧 `gate.db` 或综合入口不一致，回切 `anlogic-synthesis`
- place-route 成功后，下一步进入 `anlogic-create-bitstream`
- 若后续是下载、SVF、AJE、Flash/SRAM，切到 `anlogic-download`
- 若确认了稳定的物理实现修复路径，联动 `anlogic-learnings`

## 需要时再读取的 references

- 读取 [references/td-place-route-flow.md](./references/td-place-route-flow.md)
  - 当需要查看官方脚本里的命令顺序、阶段交付、状态文件和停线规则时
- 读取 [references/td-place-route-warning-playbook.md](./references/td-place-route-warning-playbook.md)
  - 当日志出现 `PHY-*`、时钟资源、IOCLK、拥塞、hold 等高频告警时
- 读取 [references/chip-viewer-eco-flow.md](./references/chip-viewer-eco-flow.md)
  - 当需要图形化复查 placement、route、region 约束或 ECO 时

## 约束

- 不要把 bitgen、下载动作写进 place-route 结论
- 不要把“route 还在跑”直接等同于“结果健康可放行”
- 不要只报现象，必须给阶段、证据、交付状态和最小修复动作
- 对时钟资源、PLL、PCIe/SerDes、IOCLK、region 约束要显式标注，不要笼统当普通拥塞处理

