
Предметно-ориентированный язык для написания быстрых функциональных моделей устройств для виртуальных платформ. Компилирует DML в C с вызовами API, адаптированными для симулятора Intel Simics, что позволяет проводить симуляцию аппаратного обеспечения и тестирование безопасности.
Язык моделирования устройств (DML) — это предметно-ориентированный язык для написания быстрых функциональных моделей или моделей на уровне транзакций для виртуальных платформ. DML предоставляет высокоуровневые абстракции, подходящие для функциональных моделей устройств, включая такие конструкции, как банки регистров, регистры, битовые поля, отправка событий, интерфейсы между моделями и журналирование. Код DML компилируется компилятором DML (DMLC), который генерирует код на C с вызовами API, адаптированными для конкретного симулятора.
В настоящее время компилятор поддерживает создание моделей для симулятора Intel® Simics®, но в будущем могут быть добавлены другие бэкенды.
Для сборки DMLC необходима установка симулятора Simics и настроенный проект Simics.
Если у вас еще нет установки симулятора Simics или доступа к симулятору Simics через коммерческие каналы, установите публичный релиз симулятора Intel Simics и создайте проект Simics (автоматически в стандартном процессе установки).
В вашем проекте Simics выполните checkout репозитория DML в каталог modules/dmlc.
В корне проекта выполните make dmlc
(или bin\make dmlc в Windows).
Чтобы запустить модульные тесты, поставляемые с DMLC, выполните make test-dmlc или
bin/test-runner --suite modules/dmlc/test из корня
проекта.
Следующие переменные окружения полезны при разработке DMLC. Если вы регулярно
работаете с локально собранным DMLC, рассмотрите возможность установки переменных
DMLC_DIR, T126_JOBS, DMLC_PATHSUBST и PY_SYMLINKS в вашем
.bashrc. Остальные переменные лучше включать только при необходимости.
После сборки DMLC вам необходимо установить DMLC_DIR в <your-project>/<hosttype>/bin
при последующих вызовах make, чтобы собирать устройства с помощью локально
собранного компилятора. <hosttype> — это либо linux64, либо win64 в зависимости
от типа вашей хост-системы.
При установке указанное количество тестов выполняется параллельно.
При сборке DMLC несколько файлов библиотеки DML, например dml-builtins.dml,
копируются в <hosttype>/bin. При возникновении ошибки компиляции сообщения
об ошибках обычно указывают на эту копию, а не на исходный файл. Установив
DMLC_PATHSUBST в <hosttype>/bin/dml=modules/dmlc/lib, сообщения об ошибках
будут переписаны так, чтобы указывать на исходный файл. <hosttype> — это либо
linux64, либо win64 в зависимости от типа вашей хост-системы.
При установке в 1, make dmlc будет создавать симлинки на файлы Python вместо
их копирования. Это дает два эффекта: трассировка стека Python будет указывать
на исходный файл в репозитории, и вам не нужно повторно запускать make после
редактирования файлов Python.
При установке в 1 непредвиденные исключения в компиляторе выводятся в
stderr. По умолчанию трассировка скрывается в файле dmlc-error.log.
Переопределяет компилятор по умолчанию в модульных тестах.
При установке DMLC выполняет самопрофилирование и записывает профиль в файл .prof.
При установке DMLC создает архив .tar.bz2, содержащий все исходные файлы DML,
упакованные в виде, который можно скомпилировать отдельно. Это полезно, когда
проблема DML возникает в сложной среде сборки и требуется воспроизвести проблему
изолированно. В созданном архиве все файлы DML находятся в одном каталоге (либо
на верхнем уровне, либо в серии подкаталогов с именами _), а относительные
импорты обрабатываются путем включения симлинков в архив. В Windows DMLC иногда
не может правильно разрешить эти симлинки; по этой причине рекомендуется
извлекать и компилировать архив только в Linux.
При установке DMLC выводит файл с окончанием -size-stats.json, который содержит
статистику генерации кода, полезную для уменьшения размера генерируемого кода
и увеличения скорости компиляции. Файл показывает, сколько кода на C генерируется
для каждого метода DML. Вывод представляет собой список троек [tot_size, location, num],
где tot_size — общее количество байт кода на C, сгенерированного из одного
объявления метода, num — сколько раз код на C был сгенерирован из этого
объявления (потому что он был развернут шаблоном), а location — исходное
местоположение объявления.
Запись с большим tot_size и большим num может быть уменьшена путем объявления
метода как shared; это должно примерно разделить размер на num. Запись
с большим tot_size и num, равным 1, обычно означает, что метод доминируется
такой конструкцией, как #foreach или #select, и может быть уменьшен путем
выноса тела цикла в отдельный метод или переработки цикла в другую конструкцию,
например foreach.
Обратите внимание, что статистика включает только код, напрямую сгенерированный из объявлений методов; общий размер кода включает гораздо больше. Один мегабайт кода из объявлений методов обычно приводит к нескольким секундам времени компиляции.