使用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
SPEFcat > "$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,然后再次读取。