Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавление пользовательских функций кодогенерации #15

Open
Chert-Nik opened this issue Dec 8, 2019 · 2 comments

Comments

@Chert-Nik
Copy link

На данный момент QDT позволяет сгенерировать заготовки перефирийных устройств, при этом реализация поведенческого аспекта ложится на пользователя.

У меня возникла необходимость в автоматической генерации некоторых моделей периферийных устройств. При этом часть поведеньческой функциональности, в моем случае, может быть так же сгенерированна автоматически.

В настоящий момент я использую инструмент QDT для генерации заготовок периферийных устройств. Затем мне приходится парсить сгенерированные QDT .h и .c файлы и добавлять в них функциональность.

Было бы здорово, если бы QDT представлял возможность пользователю интегрироваться в процесс кодогенерации, для добавления в заготовки необходимой функциональности.

В частности, если в текущей версии QDT позволяет мне сгенерировать следующий .h файл:

/* uart2.h */
#ifndef INCLUDE_UART2_H
#define INCLUDE_UART2_H
#include "chardev/char-fe.h"
#include "hw/sysbus.h"

//INSERT POS 1

#define TYPE_UART2 "uart2"
#define UART2(obj) OBJECT_CHECK(UART2State, (obj), TYPE_UART2)
#define UART2_CHR "chr"

//INSERT POS 2

typedef struct UART2State {
    SysBusDevice parent_obj;
    MemoryRegion mmio;
    CharBackend chr;

    //INSERT POS 3

} UART2State;

//INSERT POS 4

#endif /* INCLUDE_UART2_H */

То я бы хотел иметь возможность предоставить QDT набор функций (callback-ов), через которые бы был сгенерирован произвольный код на месте комментариев "INSERT POS".

По аналогии с .h файлом для .c файла хотелось бы иметь возможность генерировать произвольный код для добавления #include файлов, описания пользовательских функций, и предоставления осмысленной реализации функциям, генерируемым QDT.

В дальнейшем аналогичная функциональность понадобилась бы и для генерации платформ.

@laerreal
Copy link
Contributor

laerreal commented Dec 9, 2019

Сразу нужно сказать, что текущая реализация модели не позволяет вставлять
совсем уж произвольный код.
Во-первых, код не может быть просто строкой (вернее, может, но только в определённых
случаях).
Он должен быть построен с помощью API из модуля source.
Примеры использования этого API можно найти в qemu/sysbusdevice.py, qemu/pcie.py и других файлах, отвечающих за генерацию (в том же модуле).
Во-вторых, мы пока не поддерживаем весь синтаксис Си.
Собственно, примеры в обозначенных файлах содержат почти все
поддерживаемые случаи использования.
Возможности допиливаются по мере надобности.

Вклиниться в процесс генерации можно (теоретически) с помощью
наследования и перегрузки методов генерации.
В данном случае от qemu.sysbusdevice.SysBusDeviceType.
Проанализировав код методов, отвечающих за генерацию, можно заметить, что
они сохраняют созданные сущности в self под определёнными именами,
откуда их можно достать и изменить.

Я попробую придумать какой-нибудь пример.
Также м.б. получится сделать некоторые вещи удобнее.
Это будет PR, следите за обновлениями.

@laerreal
Copy link
Contributor

PR #17 добавляет пример вставки пользовательского кода в заготовку.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants