Научная статья на тему 'Применение методов минимизации булевых функций для оптимизации цифровых устройств'

Применение методов минимизации булевых функций для оптимизации цифровых устройств Текст научной статьи по специальности «Математика»

CC BY
1298
156
i Надоели баннеры? Вы всегда можете отключить рекламу.
Ключевые слова
АЛГОРИТМЫ МИНИМИЗАЦИИ / БУЛЕВЫ ФУНКЦИИ / ЦИФРОВЫЕ УСТРОЙСТВА / LOGIC MINIMIZATION ALGORITHMS / BOOLEAN FUNCTIONS / DIGITAL DEVICES

Аннотация научной статьи по математике, автор научной работы — Смагин А. А., Шиготаров А. В.

В статье рассмотрены вопросы применения алгоритмов минимизации булевых функций для оптимизации цифровых устройств. Предлагаются точный и приближенный методы минимизации, основанные на использовании двоичных диаграмм решения и хешировании общих префиксов термов, соответственно. Результаты компьютерных экспериментов показывают преимущество предложенных алгоритмов (в смысле скорости работы), по сравнению с методами, приводимыми в литературе.

i Надоели баннеры? Вы всегда можете отключить рекламу.

Похожие темы научных работ по математике , автор научной работы — Смагин А. А., Шиготаров А. В.

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.

LOGIC MINIMIZATION BASED APPROACH FOR OPTIMIZATION OF DIGITAL DEVICES

This article deals with the using of logic minimization algorithms for optimization of digital devices. We propose exact and approximate minimization algorithms, based on the using of binary decision diagrams and hashing of common prefixes of the terms, respectively. Experimental results show that our methods outperform well-known methods appeared in literature in terms of runtime.

Текст научной работы на тему «Применение методов минимизации булевых функций для оптимизации цифровых устройств»

УДК621.382.82+ 621.391

ПРИМЕНЕНИЕ МЕТОДОВ МИНИМИЗАЦИИ БУЛЕВЫХ ФУНКЦИЙ ДЛЯ ОПТИМИЗАЦИИ ЦИФРОВЫХ УСТРОЙСТВ

© 2009 А. А. Смагин, А. В. Шиготаров

Ульяновский государственный университет

Поступила в редакцию 18.09.2009

В статье рассмотрены вопросы применения алгоритмов минимизации булевых функций для оптимизации цифровых устройств. Предлагаются точный и приближенный методы минимизации, основанные на использовании двоичных диаграмм решения и хешировании общих префиксов термов, соответственно. Результаты компьютерных экспериментов показывают преимущество предложенных алгоритмов (в смысле скорости работы), по сравнению с методами, приводимыми в литературе. Ключевые слова: алгоритмы минимизации, булевы функции, цифровые устройства,

Булевы функции традиционно используются в качестве математических моделей цифровых устройств. Процедура минимизации булевых функций, как правило, применяется на этапе логического синтеза для получения экономичного представления проектируемого устройства. Так, например, площадь кристалла, занимаемого программируемой логической матрицей (ПЛМ), напрямую зависит от количества конъюнкций в ДНФ реализуемой булевой функции. Данной проблеме посвящено большое количество исследований, однако тенденция к автоматизированному проектированию цифровых устройств, а также постоянный рост степени интеграции обусловливают потребность в разработке новых, более эффективных схем минимизации.

В рамках данной работы были разработаны две схемы минимизации булевых функций в классе дизъюнктивных нормальных форм. Предлагаемые методы могут быть использованы в системах автоматизированного проектирования интегральных схем, а также для сжатия таблиц маршрутизации (ТМ). Последнее направление является особенно актуальным, вследствие постоянного увеличения размера ТМ. При этом, разработка эффективных схем хранения и поиска записей в таблицах маршрутизации является важнейшим моментом при построении быстродействующих сетей. Базовым методом Интернет-маршрутизации является сопоставление по наиболее длинному префиксу. Каждая запись таблицы маршрутизации содержит префикс узла назначения и соответствующий ему узел, на который необходимо отправлять трафик. Одному адресу назначения может соответствовать

Смагин Алексей Аркадьевич, доктор технических наук, профессор, зав. кафедрой "Телекоммуникационные технологии и сети". E-mail: smagin@sv.ulsu.ru. Шиготаров Андрей Владимирович, аспирант. E-mail: andreyshig@yandex.ru.

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

В настоящее время существует ряд программных и аппаратных методик повышения скорости поиска в таблицах маршрутизации. Общим недостатком алгоритмических подходов является то, что они требуют нескольких обращений к памяти. Требования к производительности современных сетей являются очень высокими, в то время как время отклика современных архитектур памяти ограничивают возможное количество обращений к памяти. Среди аппаратных средств можно выделить два основных решения - это специализированные интегральные схемы (ASIC) и контентно-адре-суемая память (CAM)[6]. При этом наибольшее распространение получила именно CAM.

Главной особенностью CAM является то, что адресация осуществляется на основе содержания данных, поиск нужной записи, при этом, может быть осуществлен за одно обращение к памяти. В каждой позиции CAM может быть только 0 или 1. CAM поддерживают только сравнения образцов с фиксированной длиной и, следовательно, в явном виде не подходят для поиска префиксов. Для построения таблиц маршрутизации, как правило, используется тернарная кон-тентно-адресуемая память (TCAM). Помимо индекса, TCAM хранят также отдельную маску для каждой записи. Маска определяет, какие из битов индекса являются активными. Основным недостатком TCAM является высокая стоимость и большое энергопотребление. При этом потребляемая мощность пропорциональна количеству записей, хранимых в ТМ.

Сжатие таблиц маршрутизации позволяет повысить скорость поиска нужной записи, а также использовать память меньшего размера. Ме-

Таблица 1. Таблица префиксов в ТСАМ

За -пись Префикс Маска Следующий узел

1 10100000 11110000 1

2 10110000 11110000 1

3 11011000 11111000 2

4 10001000 11111000 3

5 10111000 11111000 2

тод уменьшения размера таблиц маршрутизации, рассматриваемый в данной работе основан на агрегации записей [4,7]. Так, например, записи 1 и 2 из табл. 1 отличаются только четвертым битом и могут быть скомбинированы (10100000, 11100000). Такой подход естественным образом сводится к задаче минимизации ДНФ - префиксам из таблицы маршрутизации мы сопоставляем элементарные конъюнкции, а каждому множеству записей, имеющих одинаковые длины префиксов к и следующий узел и, ставится в соответствие отдельная булева функция. Так, например, записям из таблицы 1, имеющим следующий узел 1 будет соответствовать функция /41 = х1х2х3х4 V х1х2х3х4. Операции же объединения записей осуществляются посредством запуска процедуры минимизации ДНФ (относительно количества конъюнкций) для каждой функции /к,и. Такое преобразование, очевидно, не влияет на процесс маршрутизации, то есть выбор узла, на который необходимо отправлять трафик.

Введем далее ряд основных определений, используемых в работе. Пусть задан алфавит {х1,_,хп|. Элементарной конъюнкцией называется логическое произведение вида К = х((1 &... & х(г (¡у * 1и при

*1 гг " У •

Уг е {0,1}, х0 = х, х1 = х ). Символ х13, называется буквой или простым сомножителем К. Под булевой функцией будем понимать функцию / (х1з х2,..., хп) с областью определения {0,1}п и областью значений {0,1,*}, где * соответствует безразличному состоянию функции. Дизъюнктивной нормальной формой (ДНФ) называется дизъюнкция элементарных конъюнкций В = К1 V К2 V... V Кт , в которой все К3 являются различными. Любая булева функция может быть представлена в виде ДНФ. Импли-кантой булевой функции /(х1,х2,...,хп) называется элементарная конъюнкция К = х(1 & ...& хУ(Г, такая, что на любом наборе значений переменных {х1,_,хп|, на котором К принимает значение 1, функция ( равна 1 или *. Импликанта называется простой, если при удалении из нее любого символа она перестает быть импликантой. В геометрической интерпретации набору значений переменных соответствует вершина п-мерного единичного куба Е, а импликан-

те функции ( - грань Е такая, что на любой ее точке ( принимает значение 1 или *.

Под проблемой минимизации булевых функций понимается задача построения для произвольной булевой функции ее минимальной, относительно заданного критерия, ДНФ. В качестве такого критерия наиболее часто используют количество конъюнкций, либо букв переменных в ДНФ. В контексте данной работы, нас, прежде всего, будет интересовать построение кратчайших ДНФ - т. е. ДНФ с наименьшим числом конъюнкций.

Проблеме минимизации булевых функций в классе ДНФ было посвящено множество исследований. Тем не менее не были найдены, а возможно и не существуют (в предположении, что р * NР ) полиномиальные алгоритмы ее решения.

Основными факторами, затрудняющими построение минимальной ДНФ функции, являются большие размерности задачи - количество точек, в которых функция принимает значение 1 и количество всех простых импликант; первое, очевидно, не превосходит 2п. Можно также показать, что верхняя граница количества простых импликант функции равна 3п/п [1].

В зависимости от способа представления булевых функций и покрытий, существующие алгоритмы можно разбить на две группы - явные и неявные методы. Первые обрабатывают дискретные объекты последовательно, храня каждый из них в отдельной области памяти. При этом количество таких объектов может достигать значительных величин, что ограничивает сферу применения таких алгоритмов задачами небольшой размерности. Неявные же алгоритмы используют разделяемое представление для дискретных объектов, размер которого не зависит линейно от их количества. Традиционно в качестве такого представления используются двоичные диаграммы решения (BDD). В данной работе были использованы две разновидности BDD - упорядоченные двоичные диаграммы решения (OBDD) и диаграммы с отбрасыванием незначащих нулей (ZDD) - первые применяются для представления булевых функций, вторые - для представления покрытий.

Двоичные диаграммы решения сочетают в себе два полезных качества - приемлемый расход памяти и, как правило, быстрое выполнение операций над реализуемыми функциями. Упорядоченная двоичная диаграмма решений (OBDD) для заданных функции / (х1,...хп) и отношения порядка п: V ^ {0,1,...,п} , где V = {х1,..., хп} - это направленный ацикличный граф, состоящий из нетерминальных вершин, отмеченных переменными из V и терминальными вершинами, отмеченными булевыми констан-

тами 1 и 0. Каждая нетерминальная вершина имеет два исходящих ребра - 1-ребро и 0-ребро. Начальный узел OBDD называется корнем. Для вычисления значения функции на заданном наборе значений переменных мы формируем путь от корня к терминальной вершине следующим образом: если переменная соответствующая текущей вершине принимает значение 1, то выбирается 1-ребро, в противном случае - 0-ребро. В сформированном пути мы можем встретить каждую переменную не более одного раза. На пути от корня к терминальной вершине, переменные встречаются в соответствии с заданным отношением порядка п.

За исключением таблиц истинности, OBDD-представление булевых функций является единственной структурой данных, которая имеет полиномиальные алгоритмы для всех базовых операций^]. В связи с тем, что таблицы истинности всегда имеют экспоненциальный размер от количества переменных, на практике они применимы лишь для небольшого количества переменных. OBDD же может быть экспоненциально меньше таблицы истинности для реализуемой функции.

Любую булеву функцию можно представить в виде OBDD, однако такое представление, в общем случае, не является уникальным и это сильно усложняет такие алгоритмы, как, например, проверка эквивалентности. Однако с помощью очень простого механизма упрощения, произвольное OBDD-представление функции можно привести к стандартной, или канонической форме. Очевидно, что OBDD-представление функции после применения следующих двух правил упрощения по-прежнему реализует исходную функцию:

1. Если 1- и 0-ребра вершины V указывают на одну и ту же вершину и, тогда удаляем V и перенаправляем все входящие ребра V к и.

2. Все терминальные вершины с заданным значением объединяются в одну вершину, входящие ребра перенаправляются к этой вершине. Если две нетерминальные вершины и и V, отмечены одной и той же переменной и их 0- и 1-реб-ра указывают на одни и те же вершины соответственно, то удаляем одну из них и перенаправляем входящие ребра к оставшейся вершине.

OBDD называется упрощенной, если ни одно из перечисленных правил упрощения к ней неприменимо. Следующее основополагающее свойство каноничности [5], определяет важнейшие алгоритмические свойства упрощенных OBDD: для заданных булевой функции ( и порядка переменных п, существует единственная упрощенная OBDD. Таким образом, не имеет значения, каким образом мы изначально сконструировали OBDD, так как с помощью простого

повторения применения правил упрощения мы можем привести ее к канонической форме (относительно заданного порядка переменных).

Кроме универсальности и каноничности, упрощенная OBDD имеет еще одно фундаментальное свойство, которое делает ее удачным решением при выборе структуры данных для представления булевых функций - речь идет о высокой эффективности алгоритмов работы с OBDD. Тем не менее, опыт использования BDD показывает, что их применение не является оптимальным решением для многих задач дискретной оптимизации. В некоторых случаях число узлов в BDD-представлении становится слишком большим для эффективного выполнения требующихся операций. В частности, такая ситуация может иметь место для задач, оперирующих с разреженными множествами, представленными характеристическими функциями. В 1992 была предложена новая разновидность двоичных диаграмм решения, позволяющая эффективно работать с такими множествами - двоичные диаграммы решения с отбрасыванием незначащих нулей (ZDD).

В случае двоичных диаграмм с отбрасыванием незначащих нулей (ZDD), второе из описанных правил упрощения сохраняется, а вместо удаления вершин, исходящие ветви которых указывают на один и тот же узел, удаляются узлы с единичным выходом, указывающим на 0. Такая модификация правила упрощения позволяет существенно повысить эффективность работы с разреженными множествами [5].

В рамках данной работы были синтезированы два алгоритма минимизации ДНФ - точный и приближенный. Точный алгоритм минимизации использует классическую схему работы, состоящую из двух этапов:

1. Генерация всех простых импликант функции.

2. Поиск минимального покрытия множества точек, в которых функция принимает значение 1, множеством простых импликант.

Генерация простых импликант, а также удаление доминируемых строк и столбцов осуществляются с помощью методов, предложенных в [2].

Далее задача построения минимальной ДНФ рассматривается как задача о покрытии. Пусть М обозначает множество всех точек {т1,т2,...,т1}, на которых заданная функция ( принимает значение 1, а Р = {р1,р2,...,рк} - множество всех простых импликант {. Матрицей покрытия будем называть бинарную матрицу А размерности I х к такую, что А..=1 (при этом будем говорить, что ^й столбец покрывает 1-ю строку), 1 < / < 1, 1 < у < к , если т1 е ру, в противном случае А..=0. Требуется найти минимальное количество столбцов, покрывающих все строки матрицы А.

Для нахождения минимального покрытия применяется алгоритм ветвей и границ, основанный на выборе столбца матрицы покрытия и разбиении множества решений задачи на два непересекающихся подмножества - одно из которых, содержит данный столбец, а другое нет. Затем данная процедура рекурсивно запускается для двух сгенерированных подзадач. Такое ветвление применяется до тех пор, пока мы не достигнем терминальной вершины, либо не определим, что данная ветвь не содержит оптимальное решение. С каждой вершиной дерева связывается нижняя граница стоимости покрытия, представленного данной вершиной. Если нижняя граница, соответствующая текущей вершине, равна М > т, где т - стоимость лучшего найденного покрытия, то мы можем прекратить ветвление. За счет отсечения ветвей, которые не содержат оптимального решения, в основном, и достигается экономия в вычислениях. Основными факторами, влияющими на эффективность метода ветвей и границ, являются: выбор столбца для ветвления, способ получения нижних и верхних границ.

В предлагаемом алгоритме для ветвления используется столбец [3]

у = arg max

1

^^ К У е Г \ х е у}\-

Большинство методов минимизации ДНФ (в том числе все неявные алгоритмы) используют для вычисления нижней границы подход, основанный на поиске максимального множества строк L таких, что ни один столбец не покрывает больше, чем одну строку из L. Матрице покрытия можно сопоставить граф, в котором вершины соответствуют строкам, причем две вершины соединены дугой тогда и, только тогда, когда существует столбец, покрывающий обе эти строки. Множеству L при этом соответствует максимальное независимое множество вершин. Пусть задана матрица покрытия, обозначим через X множество всех строк, через X' , X' ^ X - независимое множество строк. Для того, чтобы покрыть X мы должны покрыть X', следовательно, нижняя граница С может быть определена, как С =| X' |.

Задача построения максимального независимого множества является NP-сложной, поэтому на практике используются эвристические алгоритмы построения независимого множества, близкого к оптимальному.

Для вычисления нижних границ мы рассматриваем задачу построения минимального покрытия, как задачу целочисленного линейного программирования:

min V c ,x, .

¿—i i i •

j=i

m

Za..x. >= 1,i = 1..n . (1)

У j

j=1

Xj e{0,1}.

При этом очевидно, что решение релаксиро-ванной задачи

min{cx | Ax >= b} (2),

где b - единичный вектор, дает нижнюю границу для (1).

Для решения релаксированной задачи был использован двойственный симплекс-метод. При этом, необходимо заметить, что в процессе работы алгоритма ветвей и границ, нам не нужно решать (2) для каждой новой вершины заново. Вместо этого можно добавить к симплекс-таблице, соответствующей родительскому узлу ограничение x.=1, либо x.=0 и применить к ней двойственный симплекс-метод снова.

Схема разработанного приближенного алгоритма заключается в следующем. Обозначим X - множество всех точек, в которых минимизируемая функция f принимает значение 1. На первом шаге выбирается некоторая точка, и генерируются все простые импликанты, содержащие ее. Затем из них выбирается импликанта p, которая покрывает максимальное количество еще не покрытых точек. все точки, покрываемые p удаляются из X. Данный процесс продолжается до тех пор, пока в X не останется ни одного элемента. Для хранения точек, в которых f принимает значение 1 была использована двухуровневая структура данных, основанная на выделении у термов префиксов и последующей группировке по ним. Для реализации быстрого поиска термов применялось хеширование. Данный алгоритм минимизации ориентирован на применение к задаче сжатия таблиц маршрутизации и наиболее эффективен для функций с большим количеством конъюнкций в исходном ДНФ представлении.

Программная реализация рассмотренных алгоритмов была выполнена на языке С++, проект был скомпилирован с помощью gcc 3.2. При разработке использовались пакеты CUDD[14], extra[11] и lp_solve[12]. Предлагаемый точный алгоритм (MINDNF_E) сравнивался с двумя известными программами минимизации ДНФ -Espresso[8] и Rondo[15]. Эксперименты проводились на компьютере с процессором Intel Pentium 2.6 Ггц, и оперативной памятью 1 Гб. В качестве входных данных использовались набор MCNC Benchmarks и данные, сгенерированные на основе таблиц маршрутизации, полученных в рамках проекта [13].

Таблица 2. Сравнение алгоритмов минимизации ДНФ на наборе MCNC Benchmarks

Name I O P Rondo MINDNF_E

TCC TCP TCC TCP2

ex5* 8 63 2532 6.3 T 9.3 90.94

ibm 48 17 1047948792 0.53 0 0.72 0

jbp 36 57 2496809 3 0.08 2.17 0.06

mainpla 27 54 87692 83.9 0 176.41 0

max1024* 10 6 1278 0.7 T 0.84 400.2

misg 56 23 6499491840 0.27 0 0.34 0

misj 35 14 139103 0.145 0 0.17 0

pdc 16 40 28231 4.15 2.1 4.14 2.58

prom2* 9 21 2635 14.5 T 17.72 54

shift 19 16 165133 1.54 0 0.53 0

signet 39 8 78735 6.48 0 6.41 0

soar* 83 94 330477287437440 30.8 T 15.2 58.73

ti 47 72 836287 3.2 0.4 3.83 0.33

ts10 22 16 524281 0.5 0 0.58 0

x7dn 66 15 566698632 19.2 2.3 8.55 4.63

xparc 41 73 15039 5.3 0.01 4.2 0.09

I - число входных переменных; O - число выходных переменных; P - количество простых импликант; TCC - время построения упрощенной матрицы (сек); TCP - время поиска минимального покрытия (сек)

Результаты экспериментов для задач из набора MCNC Benchmarks приведены в таблице 2. При этом для систем булевых функций использовалось представление в виде характеристической булевой функции. При этом было установлено ограничение на время работы - 1 час. С помощью espresso за данное время не удалось найти решение ни для одной из задач. Программа Rondo не нашла решения для 4 задач, отмеченных *. С помощью MINDNF удалось найти решения для всех приведенных задач.

На рис. 1 показаны результаты сравнения времени работы предлагаемых методов MINDNF_E(точный), MINDNF_A (приближенный) и метода espresso-exact, использовавшегося для оптимизации таблиц маршрутизации в [4]. При этом, суммарное время минимизации при использовании MINDNF_A вменьше в 4.35 раз меньше, по сравнению с MINDNF_E, и в 91.2 - по сравнению с espresso-exact. Стоимость решений, получаемых с помощью MINDNF_A на 3-5% больше стоимости оптимальных решений (рис. 2).

ЗАКЛЮЧЕНИЕ

В данной работе рассмотрены методы оптимизации цифровых устройств, на основе применения алгоритмов минимизации булевых функций. Разработанные алгоритмы могут быть использованы в системах автоматизаированного проектирования интегральных схем, а также для сжатия таблиц маршрутизации большой размерности, реализованных на основе тернарной кон-тентно-адресуемой памяти. Экспериментальные результаты показывают, что время работы предлагаемого приближенного метода минимизации значительно меньше, чем у алгоритмов, приводимых в литературе. Качество получаемых решений, при этом, отличается на 3-5% от точных решений. Точный алгоритм минимизации может быть использован для оценки качества решений, получаемых с помощью приближенных методов.

СПИСОК ЛИТЕРАТУРЫ

1. Chandra A.K., Markowsky G. On the number of prime implicants.- Discrete Mathematics 24(1978), pp 7-11.

2. Coudert O., Madre J.C. Implicit and incre-mental

350

qj m

О 1OOOQ 20000 30000 40000 50000 60000 70000

Количество префиксов

аоооо

ESPRESSO-EXACT

MIIMDNF E

--- IJIINDNF A

iНе можете найти то, что вам нужно? Попробуйте сервис подбора литературы.

Рис. 1. Зависимость времени минимизации от количества префиксов

Рис. 2. Зависимость размера сжатой таблицы маршрутизации от размера исходной

computation of primes and essential primes of Boolean functions / / Proc. of the Design Automation Conf. (Anaheim, CA, 1992), pp 36-39. 7.

3. Coudert O., Madre J.C. New ideas for solv-ing covering problems // Proc. of the Design Automation Conference, 1995, pp 641-645.

4. Liu H. Routing Table Compaction in Ter-nary-CAM // 8. IEEE Micro, Jan/Feb 2002, pp. 58-64.

5. Meinel C., Theobald T. Algorithms and data structures 9. in VLSI design, Springer-Verlag NY, 1998. - 267 p.

6. McAuley A., Francis P. Fast Routing Table Lookup Using

CAMs // Proc. IEEE Infocom, vol. 3, IEEE CS Press, Los Alamitos, Calif., 1993, pp. 1382-1391. Ravikumar V.C., Bhuyan L.N., Mahapatra R.N., EaseCAM: An Energy and Storage Efficient TCAM-Based Router Architecture for IP Lookup // IEEE Transactions on Computers, vol. 54, 2005, 521-533. Rudell R. Multiple-valued minimization for PLA synthesis. UCB technical report M86/65, 1986. Stergiou S., Jain J. Optimizing Routing Tables on Systems-on-Chip with Content-Addressable Memories //Proc. IEEE International System-on-Chip Symposium,

2008, pp 1-6. 12.

10. Umans C., Villa T. Sangiovanni-Vincentelli A. Complexity 13. of two-level logic minimization. IEEE Transactions on 14. Computer-Aided design, 2006, pp 1230-1246. 15.

11. http://www.ee.pdx.edu/~alanmi/research/ex-tra.htm.

lpsolve.sourceforge.net. http://www.routeviews.org/. vlsi.colorado.edu/~fabio/.

http://web.cecs.pdx.edu/~alanmi/research/min/ rondo.exe.

LOGIC MINIMIZATION BASED APPROACH FOR OPTIMIZATION OF DIGITAL DEVICES

© 2009 A.A. Smagin, A.V. Shigotarov

Ulyanovsk State University

This article deals with the using of logic minimization algorithms for optimization of digital devices. We propose exact and approximate minimization algorithms, based on the using of binary decision diagrams and hashing of common prefixes of the terms, respectively. Experimental results show that our methods outperform well-known methods appeared in literature in terms of runtime. Key words: logic minimization algorithms, Boolean functions, digital devices.

Alex Smagin, Doctor of Technics, Professor, Head at the Telecommunication Technologies and Networks Department. E-mail: smagin@sv.ulsu.ru. Andrew Shigotarov, Graduate Student. E-mail: andreyshig@yandex.ru.

i Надоели баннеры? Вы всегда можете отключить рекламу.