Запуск статического временного анализа и FDTD2D на CPU с помощью alti px

Запрашивайте операции PX, запускайте статический временной анализ для входного файла проекта, сохраняйте и повторно открывайте результат и запускайте встроенный тестовый пример FDTD2D на CPU.

Используйте Altifigence CLI 0.1.9 в Linux, чтобы запускать операции PX для файлов в папке inputs/ вашего проекта. Начните с запросов возможностей, запустите статический временной анализ с одним тактовым сигналом, сохраните результат в хранилище артефактов проекта и запустите встроенный тестовый пример FDTD2D с бэкендом CPU.

Запрос операций 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

Запрос задаёт для каждой дуги явные минимальную и максимальную задержки в наносекундах, один исходный узел и один идеальный тактовый сигнал с ограничениями установки и удержания. Идентификаторы узлов и дуг должны быть уникальными, а каждая дуга должна указывать на перечисленные узлы. Запрос может содержать до 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 проекта, затем выведите список сохранённых записей и повторно откройте запись по её идентификатору.

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 — это SHA-256 из 64 символов в нижнем регистре, а запись хранится в проекте в каталоге .altifigence/artifacts/px. alti px artifact show повторно проверяет сохранённый результат и снова выводит его со схемой altifigence.px.operation-result.v1.

Запуск тестового примера FDTD2D на CPU

Сохраните запрос встроенного тестового примера 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 прочитайте строку ошибки JSON в stderr. Она имеет схему 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. Сводка сообщает об извлечённых резисторах и конденсаторах. Сохраните конфигурацию как inputs/spef-config.json, чтобы вычислить задержку Элмора и статическое падение напряжения 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 равным идентификатору запуска этого анализа. 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/. Исправьте проект или идентификатор запуска и прочитайте его ещё раз.

Команды движков CLI