使用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 引擎指令