使用alti px在CPU上运行静态时序分析和FDTD2D

查询PX操作,使用项目输入运行静态时序分析,保存并重新打开结果,并在CPU上运行FDTD2D测试夹具。

在Linux上使用Altifigence CLI 0.1.9,对项目inputs/文件夹中的文件运行PX操作。先运行能力查询,再运行单时钟静态时序分析,将结果保存在项目的产物存储中,最后使用CPU后端运行内置FDTD2D测试夹具。

查询PX操作

请读取已安装的PX能力文档。这些命令都是查询:它们输出一个JSON文档,不运行任何作业。alti px fdtd2d readiness报告已安装的FDTD2D就绪状态,不占用CPU租约。

alti px capabilities
alti px fdtd2d capabilities
alti px fdtd2d readiness

请确认每条命令的退出状态都为0。

运行静态时序分析

请使用本地项目的绝对路径,并以普通用户身份运行命令。PX从项目的inputs/文件夹读取输入文件。请传入相对于inputs/的文件名。

set -euo pipefail
PROJECT="$(cd "$HOME/alti-projects/demo-project" && pwd -P)"
WORK="$(mktemp -d)"
mkdir -p "$PROJECT/inputs"
cat > "$PROJECT/inputs/timing.json" <<'JSON'
{
  "schema": "altifigence.px.static-timing-request.v1",
  "version": 1,
  "delayModel": "explicit_arc_min_max",
  "cornerModel": "single_caller_resolved",
  "libraryModel": "none",
  "graph": {
    "nodeIds": ["in", "mid", "out"],
    "sourceNodeId": "in",
    "sourceMinArrivalNs": 0.0,
    "sourceMaxArrivalNs": 0.0,
    "arcs": [
      {"id": "a1", "fromNodeId": "in", "toNodeId": "mid", "minDelayNs": 0.1, "maxDelayNs": 0.2},
      {"id": "a2", "fromNodeId": "mid", "toNodeId": "out", "minDelayNs": 0.3, "maxDelayNs": 0.4}
    ]
  },
  "constraints": {
    "clockPeriodNs": 1.0,
    "setupTimeNs": 0.05,
    "holdTimeNs": 0.02,
    "setupMarginNs": 0.0,
    "holdMarginNs": 0.0
  }
}
JSON

请求为每条时序弧明确给出以纳秒为单位的最小和最大延迟,并包含一个源节点和一个带建立和保持约束的理想时钟。请保持节点ID和弧ID唯一,并让每条弧指向已列出的节点。一个请求最多包含65536个节点和131072条弧,且不超过4194304字节。

alti px static-timing --project "$PROJECT" timing.json > "$WORK/timing.json"
jq '{schema, operationId}' "$WORK/timing.json"

请确认退出状态为0。选定的字段如下:

{
  "schema": "altifigence.px.operation-result.v1",
  "operationId": "altifigence.px.static-timing.v1"
}

结果包含一份altifigence.px.static-timing-report.v1报告,其authority为non_signoff,并包含每个节点的到达时间和时序裕量,以及产物、输入和请求的摘要。

保存并重新打开结果

将静态时序分析结果存入项目的PX产物存储,然后列出已存储的条目,并按ID重新打开该条目。

alti px artifact store --project "$PROJECT" "$WORK/timing.json" > "$WORK/entry.json"
jq '{schema, entryId}' "$WORK/entry.json"
ENTRY="$(jq -r .entryId "$WORK/entry.json")"
alti px artifact list --project "$PROJECT" | jq -r '.[].entryId'
alti px artifact show --project "$PROJECT" "$ENTRY" > "$WORK/shown.json"
jq '{schema, operationId}' "$WORK/shown.json"

请确认每条命令的退出状态都为0。存储会写入一份模式为altifigence.px.artifact-manifest.v1的清单。其entryId是64个字符的小写SHA-256,条目保存在项目的.altifigence/artifacts/px下。alti px artifact show会重新验证已存储的结果,并以模式altifigence.px.operation-result.v1再次输出。

在CPU上运行FDTD2D测试夹具

请将内置FDTD2D测试夹具请求保存到inputs/下,并使用CPU后端运行。

cat > "$PROJECT/inputs/fdtd2d.json" <<'JSON'
{
  "schema": "altifigence.px.fdtd2d-execute-request.v1",
  "fixtureId": "px.fdtd2d.owned-pattern-19x13-96.v1"
}
JSON
alti px fdtd2d execute --backend cpu --project "$PROJECT" \
  fdtd2d.json > "$WORK/fdtd2d.json"
jq -r .schema "$WORK/fdtd2d.json"

请确认退出状态为0。回执的模式为altifigence.px.fdtd2d-execute-receipt.v1。请求请保持在4096字节以内。CPU运行是确定性的:再次运行同一请求会输出相同的回执。

处理PX错误

发生static-timing引擎失败时,请读取stderr上的JSON错误行。它包含模式altifigence.localRunner.error.v1、类别和消息。

如果stderr报告下面这一行,则表示无法在inputs/下的给定路径读取输入文件:

{"schema":"altifigence.localRunner.error.v1","category":"input_io","message":"failed to read job input"}

请将文件保存到$PROJECT/inputs/中,并传入其相对于inputs/的路径,例如timing.json。

如果stderr报告下面这一行,则表示请求与其模式不匹配:

{"schema":"altifigence.localRunner.error.v1","category":"invalid_job","message":"job input is not an admitted PX operation"}

对于静态时序分析,请使用上方时序请求中的字段、版本1、模式和图规则,然后重新运行命令。对于FDTD2D,请使用测试夹具请求中的模式和fixtureId。

如果alti px fdtd2d execute输出下面这个错误,则表示输入路径不是inputs/下的普通路径:

PX numerical input must be a file below workspace inputs/

请传入相对于inputs/的路径,使用/分隔符,且不含空段、.段或..段,例如fdtd2d.json。

编译工艺配方

将一个氧化步骤保存为inputs/recipe.json。运行process-recipe以验证配方,并编译按声明顺序排列的计划。使用与时序分析相同的产物存储命令保存其操作结果。

cat > "$PROJECT/inputs/recipe.json" <<'JSON'
{"schema":"px-recipe-1","name":"oxide","wafer":{"substrate_doping_cm3":1000000000000000,"depth_um":0.25,"mesh_nodes":51},"steps":[{"kind":"oxidation","label":"oxide","params":{"ambient":"dry","temp_c":1000,"time_s":10,"pressure_atm":1,"initial_oxide_nm":0}}]}
JSON
alti px process-recipe --project "$PROJECT" recipe.json > "$WORK/recipe-result.json"
jq '{operationId, steps: .artifact.payload.stepCount}' "$WORK/recipe-result.json"
{"operationId":"altifigence.px.process-recipe.v1","steps":1}

对于invalid_job,请将文件与示例进行比较:使用模式px-recipe-1、小写的oxidation以及列出的晶圆和步骤字段。修正文件,然后重新运行process-recipe。

汇总和分析SPEF

请将下面的SPEF保存为inputs/synthetic.spef。Summary报告提取出的电阻和电容。请将配置保存为inputs/spef-config.json,以计算所选网络和工艺角的Elmore延迟及静态IR压降。

cat > "$PROJECT/inputs/synthetic.spef" <<'SPEF'
*SPEF "IEEE 1481 subset"
*DESIGN "synthetic"
*C_UNIT 1 FF
*R_UNIT 1 OHM
*NAME_MAP
*1 VDD
*2 VDD:src
*3 VDD:n1
*4 VDD:n2
*5 SIG:agg
*PORTS
*2 I
*D_NET *1 10.0
*CONN
*P *2 I
*I *3 B
*I *4 B
*CAP
1 *2 1.0
2 *3 2.0
3 *4 3.0
4 *4 *5 4.0
*RES
1 *2 *3 100.0
2 *3 *4 50.0
*END
SPEF
cat > "$PROJECT/inputs/spef-config.json" <<'JSON'
{"schema":"altifigence.px.spef-configured-analysis-config.v1","version":1,"spefArtifactId":"synthetic-spef","corner":{"model":"single_caller_resolved","name":"nominal"},"units":{"capacitance":"farad","resistance":"ohm","current":"ampere","time":"second","voltage":"volt"},"assumptions":{"couplingCapacitance":"reported_not_folded_into_elmore_load","elmoreTopology":"connected_resistor_tree","irDrop":"static_linear_resistor_network"},"elmore":{"net":"VDD","root":"VDD:src","target":"VDD:n2"},"irDrop":{"net":"VDD","ground":"VDD:src","currents":[{"node":"VDD:n2","currentA":0.001}]}}
JSON
alti px spef-summary --project "$PROJECT" synthetic.spef > "$WORK/spef-summary.json"
alti px spef-analyze --project "$PROJECT" synthetic.spef spef-config.json > "$WORK/spef-analysis.json"
jq -r .operationId "$WORK/spef-summary.json" "$WORK/spef-analysis.json"
altifigence.px.spef-summary.v1
altifigence.px.spef-configured-analysis.v1

对于invalid_job,请检查配置的网络、根节点、目标节点和电流源节点是否与SPEF名称匹配。使用上面所示的单位和假设,然后重新运行分析。

执行本地作业

要将时序请求作为有界本地作业执行,请计算其SHA-256,并通过stdin发送作业文档。请确认退出状态为0,且结果状态为succeeded。保留返回的产物URI,以供访问已保存的报告。

DIGEST="$(sha256sum "$PROJECT/inputs/timing.json" | cut -d ' ' -f 1)"
cat > "$WORK/timing-job.template.json" <<'JSON'
{"schema":"altifigence.engine.job.v1","job_id":"timing-job-1","operation":{"engine_id":"px","operation_id":"static-timing","contract_id":"px.static-timing.v1"},"execution_placement":"local","device_preference":{"selection":{"mode":"class","value":"cpu"},"fallback":"deny"},"resources":{"cpu_slots":1,"memory_bytes":268435456,"device_slots":0,"device_memory_bytes":0,"max_wall_time_ms":60000},"inputs":[{"artifact_id":"timing-request","role":"static_timing_request","artifact_schema":"altifigence.px.static-timing-request.v1","uri":"workspace://inputs/timing.json","sha256":"REPLACE_WITH_DIGEST"}],"cancellation":{"cancellation_id":"cancel-timing-job-1"}}
JSON
jq --arg digest "$DIGEST" '.inputs[0].sha256 = $digest' "$WORK/timing-job.template.json" > "$WORK/timing-job.json"
alti px execute --project "$PROJECT" < "$WORK/timing-job.json" > "$WORK/job-result.json"
jq '{schema, status}' "$WORK/job-result.json"
{"schema":"altifigence.engine.result.v1","status":"succeeded"}

如果结果报告px.local_runner.workspace_input,请将请求保存到inputs/下,并重新计算其SHA-256。对于px.local_runner.output_exists,请使用新的job_id和cancellation_id,重新生成作业,然后再次执行。

通过本地兼容命令查询

本地兼容命令接受位于--之后的capabilities和execute。要读取已安装的能力,请运行:

alti px analyze --runner local --project "$PROJECT" -- capabilities

如果兼容命令要求提供本地引擎操作,请将capabilities或execute放在--之后。

读取已提交的分析

对于已包含已提交逻辑拓扑分析的项目,请将RUN_ID设置为该分析的运行ID。Readback会加载其已保存的分析封套和报告,验证网表及报告,并输出带有来源信息的已验证操作。

alti px readback --project "$PROJECT" "$RUN_ID" > "$WORK/readback.json"
jq -r .schema "$WORK/readback.json"
altifigence.px.committed-logic-topology-readback.v1

对于input_io,请检查项目目录及analyze/下所选的已提交运行。修正项目或运行ID,然后再次读取。

CLI 引擎命令