На прошлой неделе готовил лекцию о языке SystemC и наткнулся на статью Stephen A. Edwards, «The Challenges of Synthesizing Hardware from C-Like Languages», о различных С-подобных языках, применяющихся для описания аппаратуры. Среди различных языков и инструментов была ссылка на американский патент № 6 226 776 о синтезе С в железо, который сейчас якобы принадлежит фирме Synopsys. Автор статьи описывает патент, как «претендующий на широкую поддержку языка ANSI C»: упоминается поддержка указателей, рекурсии, динамического распределения памяти.
Я заинтересовался этим патентом. Около 85 страниц из всех 108-и — это примеры на С и соответствующие им результаты синтеза на Верилоге. Ещё 14 страниц — это словесное описание всех примеров. И последние четыре страницы посвящены описанию формулы изобретения. Модели в основном представлены в виде цифровых автоматов, намного реже — data-flow модели. Как такового метода преобразования С в цифровой автомат там не было. Я обратил внимание на один пример, в котором из одной функции вызывались две другие.
int sum1 (int n)
{
int i, sum = 0;
for (i = 0; i < n; i++)
sum += i;
return sum;
}
int sum2 (int array[], int size)
{
int i, sum = 0;
for (i = 0; i < size; i++)
sum += array[i];
return sum;
}
int f1()
{
int i;
int array[10];
int size = sizeof(array)/sizeof(*array);
for (i = 0; i < size; i++)
array[i] = i * 2;
return sum1(size) + sum2(array, size);
}
* This source code was highlighted with Source Code Highlighter.
Перед тем, как читать дальше, подумайте: сколько состояний автомата нужно, чтобы выполнить этот алгоритм? Мне тоже сначала показалось, что должно быть немного. Но в предложенном варианте синтеза для выполнения этого алгоритма нужно 16 состояний автомата. Так как мой компилятор С++ в VHDL ещё не способен откомпилировать такой код, то решил нарисовать граф-схему алгоритма вручную.
Все функции уже встроены, и предполагается, что инициализация переменных происходит по сигналу reset. Таким образом, в этом автомате получается всего лишь семь состояний (см. Баранов С. И. Синтез цифровых автоматов).
Вот не могу понять: у них там в 2001 году не знали то, что у нас было известно ещё в 1974?
Баранов как то у нас на лекции говорил, что в США ещё многого не знают, из того чем он сам занимался лет 20 назад :) Интересно, что на такие вещи вообще патенты заводятся..
ОтветитьУдалитьВ нашем ауле не то, что Баранова, его книг не все инженеры видели. :)
ОтветитьУдалитьНэ знаю, щто там в ващэм ауле, но в нащэм отличные бараны! Вах!
ОтветитьУдалитьХм, а о каком автомате вообще шла речь? Думаю, что для данного примера можно сделать автомат только с одним состоянием. Все что более - будет избыточно.
ОтветитьУдалитьРечь идёт о композиции управляющего и операционного автомата. Ваше мнение об автомате с одним состоянием очень интересно, и хотелось бы узнать, как он работает.
ОтветитьУдалитьВладимир, всё дело в том, что Аффтар жжот прямо при постановке задачи, написав классный, но не оптимизированный алгоритм. Ведь если еще немного подумать, или даже еще порисовать - то даже тот алгоритм, который нарисовали Вы, можно склеить не только вдвое по горизонтали, но и вчетверо по вертикали.
ОтветитьУдалитьИ если при этом инициализировать две необходимые для его работы переменные по сбросу - то можно оставить на ГСА всего один операционный "прямоугольничек". Если очень нравится - то оставим и одну условную вершину для того, чтоб определить конец выполнения алгоритма.
Что касается памяти, то для реализации такого алгоритма в железе, по сути - требуется один 4-битный счетчик (наверно именно его "держал в уме" Аффтар, когда говорил о 16 состояниях) и 8-битный регистр, в котором будет накапливаться результат. Для 10 итераций 8 бит результата должно хватить.
Спасибо за пояснения. Я согласен с вами.
ОтветитьУдалить... кстати, а если еще немного подумать - то вся эта штука (результат выполнения функции) вообще в результате является константой. Можно, наверно, и вообще без автомата обойтись ;)
ОтветитьУдалитьЯ вот ещё подумал, что на исходный пример на Си++ можно натравить разные высокоуровневые трансформации, вроде вычисления констант, развертки циклов и прочее. В результате окажется, что значение никаких вычислений нет вообще, потому что результат всегда константный. :)
ОтветитьУдалитьПочти одинаково мыслим, коллега! :)
ОтветитьУдалить... кстати, про интересные оптимизационные задачи, так сказать, "с ухмылкой":
- Необходимо нарисовать схему "черного ящика" с тремя входами и тремя выходами, функционал которого можно описать ТРЕМЯ независимыми инверторами, с использованием ТОЛЬКО ДВУХ инверторов и неограниченного количества элементов И и ИЛИ.
Ох, слышал я о такой задаче, лет пять назад. Но не садился. :)
ОтветитьУдалить