
Linguagem de domínio específico para escrever modelos de dispositivos funcionais rápidos para plataformas virtuais. Compila DML para C com chamadas de API adaptadas para o simulador Intel Simics, permitindo simulação de hardware e testes de segurança.
A Linguagem de Modelagem de Dispositivos (DML) é uma linguagem de domínio específico para escrever modelos de dispositivos funcionais ou de nível de transação rápidos para plataformas virtuais. DML fornece abstrações de alto nível adequadas para modelos de dispositivos funcionais, incluindo construções como bancos de registradores, registradores, campos de bits, postagem de eventos, interfaces entre modelos e registro de log. O código DML é compilado pelo Compilador DML (DMLC), produzindo código C com chamadas de API adaptadas para um simulador específico.
Atualmente, o compilador suporta a construção de modelos para o simulador Intel® Simics®, mas outros back-ends podem ser adicionados no futuro.
Para construir o DMLC, você precisa ter uma instalação do simulador Simics e um projeto Simics configurado.
Se você ainda não possui uma instalação do simulador Simics ou acesso ao simulador Simics através de canais comerciais, instale a Versão Pública do Simulador Intel Simics e crie um projeto Simics (automático no fluxo de instalação padrão).
No seu projeto Simics, faça checkout do repositório DML no diretório modules/dmlc. No nível superior do projeto, execute make dmlc (ou bin\make dmlc no Windows).
Para executar os testes unitários fornecidos com o DMLC, execute make test-dmlc ou bin/test-runner --suite modules/dmlc/test a partir do nível superior do projeto.
As seguintes variáveis de ambiente são úteis ao desenvolver o DMLC. Se você trabalha regularmente com um DMLC construído localmente, considere definir as variáveis DMLC_DIR, T126_JOBS, DMLC_PATHSUBST e PY_SYMLINKS no seu .bashrc. As variáveis restantes são melhores apenas quando necessário.
Após construir o DMLC, você precisa definir DMLC_DIR como <seu-projeto>/<tipo-de-host>/bin em invocações subsequentes do make para construir dispositivos com o compilador construído localmente. <tipo-de-host> é linux64 ou win64 dependendo do seu tipo de host.
Quando definida, o número dado de testes é executado em paralelo.
A construção do DMLC copia alguns arquivos de biblioteca DML, por exemplo dml-builtins.dml, para <tipo-de-host>/bin. Quando ocorre um erro de compilação, as mensagens de erro normalmente apontarão para esta cópia em vez da fonte. Ao definir DMLC_PATHSUBST como <tipo-de-host>/bin/dml=modules/dmlc/lib, as mensagens de erro serão reescritas para apontar para o arquivo fonte. <tipo-de-host> é linux64 ou win64 dependendo do seu tipo de host.
Quando definida como 1, make dmlc criará links simbólicos para arquivos Python em vez de copiá-los. Isso tem dois efeitos: os rastreamentos Python levarão ao arquivo fonte no repositório, e você não precisa executar make novamente após editar arquivos Python.
Quando definida como 1, exceções inesperadas no compilador são ecoadas para stderr. O padrão é ocultar rastreamentos em um arquivo dmlc-error.log.
Substitui o compilador padrão nos testes unitários.
Quando definida, o DMLC faz auto-profiling e escreve o perfil em um arquivo .prof.
Quando definida, o DMLC emite um arquivo .tar.bz2 contendo todos os arquivos fonte DML, empacotados em uma forma que pode ser compilada de forma independente. Isso é útil quando um problema DML aparece dentro de um ambiente de construção complexo, e você deseja reproduzir o problema isoladamente. No arquivo criado, todos os arquivos DML estão localizados no mesmo diretório (no nível superior ou sob uma série de subdiretórios chamados _), e as importações relativas são tratadas incluindo também links simbólicos no arquivo. No Windows, o DMLC às vezes não consegue resolver esses links simbólicos corretamente; por esta razão, recomenda-se que o arquivo seja extraído e compilado apenas no Linux.
Quando definida, o DMLC gera um arquivo terminado em -size-stats.json, que mostra estatísticas de geração de código úteis para reduzir o tamanho do código gerado e aumentar a velocidade de compilação. O arquivo lista quanto código C é gerado para cada método DML. A saída é uma lista de triplas [tot_size, location, num], onde tot_size é o número total de bytes de código C gerado a partir de uma declaração de método, num é quantas vezes o código C foi gerado a partir desta declaração (porque foi expandido por um template), e location é a localização fonte da declaração.
Uma entrada com um tot_size grande e um num grande pode ser reduzida declarando o método como shared; isso deve aproximadamente dividir o tamanho por num. Uma entrada com tot_size grande e num igual a 1 geralmente significa que o método é dominado por uma construção como #foreach ou #select, e pode ser reduzida extraindo o corpo do loop para um método separado, ou reformulando-o em alguma outra construção como foreach.
Observe que as estatísticas incluem apenas código gerado diretamente de declarações de método; o tamanho total do código inclui muito mais. Um megabyte de tamanho de código de declarações de método geralmente contribui com alguns segundos de tempo de compilação.