ПРОГРАММНЫЕ И АППАРАТНЫЕ СРЕДСТВА /
УДК 681.3
КМОП-РЕАЛИЗАЦИЯ ОБУЧАЕМОГО ПОРОГОВОГО ЛОГИЧЕСКОГО ЭЛЕМЕНТА
Часть 2: Результаты моделирования и реализуемость
В. Б. Мараховскийа, доктор техн. наук, профессор
аСанкт-Петербургский государственный политехнический университет, Санкт-Петербург, РФ
Цель: показать возможность реализации в КМОП-технологии, использующей современные проектные нормы, аналого-цифрового порогового логического элемента, обучаемого сложным пороговым логическим функциям, и определить границы реализуемости. Методы: SPICE-моделирование процессов обучения порогового элемента сложным пороговым функциям и процессов поддержания его элементов аналоговой памяти в обученном состоянии. Результаты: показано, что для экспериментов по обучению порогового элемента в наибольшей степени подходят пороговые функции, представимые в виде схемы Горнера, так как они при высокой сложности обладают наиболее короткими проверочными последовательностями. Пороговый элемент, изготовленный в КМОП-технологии 0,18 мкм, в пределе может быть обучен любой пороговой функции с порогом, не превышающим 144. К таким функциям относятся все пороговые функции 11 переменных и множество функций большего числа переменных. Практическая значимость: существенно расширены функциональные возможности обучаемого порогового элемента, который может быть использован в системах логического распознавания образов, а также при создании нового поколения нейрочипов.
Ключевые слова — искусственный нейрон, синапс, обучаемый пороговый логический элемент, алгоритм обучения, шаг обучения, КМОП-технология, пороговая логическая функция.
Введение
В первой части статьи [1] приведен проект аналого-цифрового обучаемого логического порогового элемента TTE для исполнения в КМОП-технологии 0,18 мкм. Элемент TTE может быть обучен реализации сложных пороговых функций большого числа переменных. Он содержит множество синапсов с элементами аналоговой памяти в виде конденсаторов, на которых накапливаются веса двоичных входных переменных; высокочувствительный р-компаратор, сравнивающий проводимости двух своих частей из пи ^-канальных транзисторов; три выходных усилителя c разными порогами срабатывания, два из которых с выходами и Flow используются в процессе обучения, а с выхода Fmid третьего усилителя снимается значение реализуемой функции.
Обучение такого TTE осуществляется путем накопления напряжений на конденсаторах синапсов, соответствующих весам входных двоичных переменных обучающей пороговой функции. Предложена [1] также структурная схема обучения TTE и поддержания его аналоговых элементов памяти в обученном состоянии (обновление требуемых значений напряжений на конденсаторах синапсов). Она содержит, кроме самого ТТE, генератор последовательностей наборов значений переменных обучающей функции и последовательности Y значений самой функции, соответствующих этим наборам; компаратор, сравнивающий значения и Flow со значениями Y функции (при обучении) или со значениями Fmid (при обновлении) и вырабатывающий
сигналы 1псг (инкремент) или Вест (декремент); переключатель режима обучения на режим обновления.
Выбор функций для обучения ТТЕ
В экспериментах с обучением TTE существует актуальная проблема, связанная с выбором функций для обучения, так как от этого выбора в немалой степени зависит время моделирования. Длительность экспериментов очень важна, поскольку часто может измеряться часами и даже днями. К функциям, выбранным для обучения, естественно предъявить следующие требования:
— они должны иметь короткую последовательность наборов значений переменных, проверяющих все возможные переключения значений функции;
— они должны обладать широким диапазоном весов переменных (иметь по возможности большое значение суммы весов переменных);
— функции заданного числа переменных должны иметь высокое значение порога.
Проблема выбора функций для экспериментов была рассмотрена в работе [2]. Было показано, что пороговые функции, которые могут быть представлены в виде схемы Горнера, удовлетворяют этим требованиям. Для таких функций последовательность целочисленных значений весов переменных и порога, обладающая минимальным значением их суммы, образует последовательность чисел Фибоначчи, а длина проверяющей последовательности функции, зависящей от п переменных, равна п + 1.
Существует два вида пороговых функций, представимых в виде схемы Горнера:
н (П) — Хп (хп —1 ^ Хп—2 (хп—3
v Хп—4 (•••)));
н (п) — Хп v Хп —1 (хп—2 v хп—3 (хп—4 v •••))•
Назовем их функциями Горнера первого и второго вида соответственно. Заметим, что если в функции второго вида инвертировать все переменные, то, используя правила де Моргана, нетрудно показать, что эта функция будет являться инверсией функции Горнера первого вида.
Результаты ЯРЮЕ-моделирования обучения ТТЕ
Ниже представлены результаты по обучению ТТЕ пороговой функции, зависящей от 10 переменных и представимой в виде схемы Горнера. Минимальные дизъюнктивные нормальные формы этой функции и ее инверсии имеют следующий вид:
у10 — х10 (хд v х8 (х7 v хд (х5 v х4 (х3 v х2х1 )))) —
- /V* \ / \ / \ /
— х10 хд v х10 Х8 х7 v хю Х8 хд х5 v
v х10 х§ хд х4 х3 v хю х§ хд х4 х2 х1;
у10 — хю v хд (х8 v х7 (хд v х5 (х4 v х3 (х2 v Х 1)))) — — х10 v хд х8 v хд х7 хд v хд х7 х5 х4 v
v хдх7х5х3х2 v хдх7х5х3х1 • (1)
В работе [2] показано, что функция У10, представленная в форме МакКаллока — Питтса [см. (1) в работе [1]], имеет вид
Ую — sign(хl + х2 + 2х3 + 3х4 + 5х5 + 8хд + + 13х + 21х8 + 34хд + 55х10 — 8Э),
(2)
в котором веса переменных и порог являются последовательностью чисел Фибоначчи. Таким образом, порог представляется одиннадцатым числом Фибоначчи. Именно по этой причине выбрано значение порога, равное 89 (см. рис. 8 в работе [1]).
Проверочная последовательность для этой функции должна содержать не меньше 11 наборов значений переменных, которые определяются термами минимальной дизъюнктивной нормальной формы функций У10 и Ую в (1). В проверочной последовательности значений функции различные значения чередуются. Для того чтобы сделать эту последовательность повторяемой, необходимо иметь в ней четное число значений, т. е. проверочная последовательность должна содержать четное число наборов значений переменных. С этой целью можно добавить любой набор, на котором функция принимает значение «лог.1». Известно, что любая пороговая функция являет-
ся звездой. Вершина звезды является наиболее удобным кандидатом для ее включения в проверочную последовательность, поскольку ее добавление должно ускорить время обучения. Таким образом, проверочная последовательность для функции (1) имеет вид
Хю Х9 #8 Х7 Х5 Х4 Х3 Х2 Х
1 ^10
0 1 1 1 1 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1
1 1 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 1 1 1
1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 1 1 1 1
В соответствии с ней генератор входных сигналов вырабатывает обучающую последовательность наборов значений сигналов, которая представляет собой периодически повторяемую проверочную последовательность (рис. 1). Последний график этого рисунка представляет стробирую-щий сигнал г, который участвует в формировании сигналов 1пст и Веет.
Каждый набор значений входных сигналов х1 и У10 фиксируется в течение 200 нс. После установки набора через 100 нс вырабатывается стро-бирующий сигнал, длительность которого тоже равна 100 нс. Выбор такого большого интервала времени до появления сигнала стробирова-ния объясняется тем, что перед стробированием должны завершиться все переходные процессы, вызванные установкой входного набора, и в районе рабочей точки эти процессы могут протекать очень медленно.
Х10 Х9 Х8 Х7 Х6 Х5 Х4 Х3 Х2 Х1 ^10 г
п
П. П.
Л
0 0,2 0,4 0,6 0,8 1,0 1,2 1,4 1,6 1,8 2,0 2,2 2,4
Время, мкс
■ Рис. 1. Проверочная последовательность наборов значений сигналов
Большая длительность сигнала стробирова-ния дает возможность при приближении к рабочей точке автоматически изменять в широких пределах величину шага обучения (вплоть до долей милливольта).
Перед обучением TTE функции Y10 необходимо установить пороги срабатываний выходных усилителей. Вернемся к рис. 8 [1]. При 89 минимальных токах синапсов максимальный скачок напряжения minAFout = 428 мВ, и середина этого скачка находится на уровне 1,75 В. Именно на этот порог и должен быть настроен усилитель с выходом Fmid. Очевидно, что разность порогов срабатываний двух других усилителей не должна превышать 428 мВ, так как эта величина определяется параметрами р-канальной части ß-компаратора и минимальным значением порога Tmin логической функции: max(minAFout) = = f(I = I /T ), где I — ток ß-ком-
^ max min comp mm" H comp г
паратора в пороговой зоне, а Imax min — максимальный ток синапса с наименьшим весом. Выберем эти пороги равными 1,95 и 1,55 В. Порог срабатывания усилителя устанавливается подбором ширины р-канального транзистора его первого каскада. Статические характеристики усилителей приведены на рис. 2.
При приближении слева выходного напряжения ß-компаратора к рабочей области для обучения TTE используется выходной сигнал Fhigh усилителя с высоким порогом срабатывания, а при приближении справа — выходной сигнал Flow усилителя с низким порогом срабатывания (указано стрелками на рис. 2). Это ведет к растягиванию минимального скачка minAFout выходного напряжения ß-компаратора и автоматическому позиционированию порога срабатывания усилителя с выходом Fmid в середину этого скачка.
Процесс формирования напряжений на конденсаторах синапсов при обучении TTE функции Y10 показан на рис. 3, а на рис. 4 представлены сигналы Incr и Decr, вырабатываемые при формировании этих напряжений и поддержании сформированных значений.
^dd, В
к Flow Fmid Fhigh
1,0 1,2 1,4 1,6 1,8 2,0 2,2 Vout, В
■ Рис. 2. Статические характеристики выходных усилителей TTE
U, В
1,8 1,6 1,4 1,2 1,0 0,8 0,6 0,4 0,2 0
0 50 100 150 200 250 300
Время, мкс
■ Рис. 3. Формирование напряжений на конденсаторах синапсов при обучении
В
0 50 100 150 200 250 300
Время, мкс
■ Рис. 4. Генерация сигналов 1псг и Бвсг в процессах обучения и обновления
На этих рисунках хорошо видна динамика обучения. До тех пор, пока р-компаратор ТТЕ находится вне рабочей области (приблизительно до 35 мкс), сигналы Бвсг не вырабатываются и конденсаторы синапсов заряжаются сигналами 1псг. Несмотря на то, что их заряд осуществляется с разной скоростью, шаг изменения напряжения на конденсаторах один и тот же и равен максимальному шагу обучения »20 мВ при длительности сигнала 1псг, равной 100 нс.
Затем появляются сигналы Бвсг, растягивающие в рабочей области минимальный скачок напряжения на выходе р-компаратора, при этом шаг обучения уменьшается за счет сокращения длительности сигналов 1псг и Бвсг.
После достижения требуемой величины минимального скачка напряжения (тах(ттД^Ои1_)), определяемой разностью порогов срабатывания усилителей Fhigh и Flow, исчезают сигналы 1псг и Бвсг (приблизительно через 175 мкс после начала обучения), что является признаком окончания
процесса обучения ТТЕ заданной пороговой функции. Заметим, что при этом порог срабатывания усилителя с выходом РтШ оказывается в центре этого скачка. При 200 мкс осуществляется переключение режима обучения ТТЕ на режим обновления, или поддержания, сформированных значений напряжения на конденсаторах синапсов. Коррекция этих напряжений осуществляется достаточно редкими сигналами 1пст и Вест. Несмотря на то, что на рис. 4 сигналы Вест отсутствуют до конца эксперимента, они могут появиться при его продолжении.
Использование обученного ТТЕ для решения задач, для которых он обучался, допускается только путем временного прерывания режима обновления. Если этот режим не будет вовремя возобновлен, возможна потеря обученного состояния из-за утечек зарядов конденсаторов синапсов, что приведет к необходимости повторного обучения.
Пределы реализуемости TTE
Для определения функциональных возможностей ТТЕ было проведено множество экспериментов с использованием ЯРГС-моделирования по обучению ТТЕ пороговым функциям Горнера, зависящим от 7 до 11 переменных. В отличие от технологии 0,8 мкм, в которой возможно построение ТТЕ, реализующей функции 12 переменных, в технологии 0,18 мкм удалось построить ТТЕ, который может быть обучен функции Горнера 11 переменных. При этом пришлось уменьшить амплитуду тока сигналов 1пст и Вест до 0,06 мкА, что привело к резкому увеличению времени обучения (до 810 мкс). При обучении ТТЕ функциям меньшего числа переменных амплитуда тока этих сигналов была равна 0,2 мкА. Минимальное значение порога для функции Горнера 11 переменных равно 144 (двенадцатое число Фибоначчи). Это означает, что р-компаратор ТТЕ должен чувствовать изменение его тока в рабочей области на 1/144. Обучить ТТЕ функции Горнера 12 переменных не удалось.
Использование в синапсах ТТЕ конденсаторов в качестве элементов аналоговой памяти имеет как положительные, так и отрицательные стороны. К положительным может быть отнесена простота реализации, а к отрицательным — неспособность конденсаторов длительное время сохранять заряд из-за утечек через паразитные сопротивления. По этой причине приходится организовывать процесс обновления состояний конденсаторов, который по своей сути аналогичен процессу обучения, за исключением того, что его можно кратковременно прерывать. Если процесс обучения делает ТТЕ нечувствительным к разбросу технологических параметров, то процесс обновления может отслеживать во времени
медленные изменения эксплуатационных параметров (например, питающего напряжения или температуры).
Возникает вопрос, можно ли обойтись без процесса обновления аналоговой памяти? Ответ на этот вопрос неоднозначен. По-видимому, можно, но для этого нужно использовать элементы долговременной аналоговой памяти, например память на под-затворных емкостях (ЕЕРИОМ), однако при этом возникает множество других проблем, требующих своего решения. Тем не менее интересен вопрос об устойчивости обученного состояния ТТЕ к достаточно быстрым изменениям питающего напряжения, когда процесс обновления не может их отслеживать или когда он не нужен (в случае использования элементов аналоговой памяти без утечек).
Для ответа на этот вопрос была проведена следующая серия экспериментов. ТТЕ обучался функциям Горнера 7, 8, 9, 10 и 11 переменных и определялись напряжения на конденсаторах синапсов в обученном состоянии. Этим функциям соответствуют минимальные пороги, равные 21, 34, 55, 89 и 144. Перед обучением с помощью ЯРЮЕ-моделирования определялась для каждой из функций величина минимального скачка напряжения ттДУои1_ на выходе р-компаратора (типа рис. 8 [1]) и устанавливались соответствующие ей пороги срабатывания усилителей. После обучения конденсаторы заменялись источниками напряжения, на которых устанавливались с точностью до милливольта напряжения, снятые с конденсаторов. Затем в режиме обновления на входы ТТЕ подавалась обучающая последовательность наборов значений входных сигналов и определялась область допустимого изменения питающего напряжения, в которой на выходе РтЫ генерировались правильные значения реализуемой функции.
Результаты экспериментов приведены в таблице. Во втором столбце указаны значения минимальных порогов соответствующих функций Горнера, в четвертом — допустимые изменения напряжения источника питания для случая, когда управляющие напряжения синапсов являются стабильными, т. е. в предположении, что напряжения на конденсаторах не изменяются.
■ Результаты ЯРЮЕ-моделирования
Тип функции Т ттД^ои4 Д^м> %
Рц 144 250 мВ +0,12
Р10 89 430 мВ +0,24
Р 9 55 650 мВ +0,31
Р8 34 870 мВ +0,51
Р7 21 1 В +0,64
Из таблицы видно, что реализуемость ТТЕ определяется величиной скачка ттД7ои1.. Чем больше скачок, тем меньшие требования предъявляются к источнику питания. Согласно этой таблице, ТТЕ, обучаемый функциям, зависящим от 11 переменных, находится около границы реализуемости из-за относительно малой величины ттДРОи1., принимая во внимание, что обучить ТТЕ функции Горнера 12 переменных не удалось.
В действительности напряжения на конденсаторах изменяются из-за паразитных токов утечки. Поэтому необходим режим обновления управляющих напряжений синапсов. Фактически в этом режиме продолжается процесс обучения, который в значительной степени парирует нестабильность эксплуатационных параметров, в том числе изменения напряжения источника питания. Так, эксперимент показывает, что при обучении ТТЕ функции Горнера 10 переменных и обновлении обученного состояния допустимо синусоидальное изменение напряжения источника питания на +1,33 % с частотой 1кГц.
На основании проведенных экспериментов можно сделать вывод, что предложенный ТТЕ вполне работоспособен при обучении пороговым функциям с порогом около 100. При этом, конечно, предъявляются достаточно жесткие, но абсолютно реальные требования к стабильности напряжения источника питания. Впрочем, любая аналого-цифровая схема, например АЦП и ЦАП, предъявляют к источнику питания аналогичные требования.
TTE, обучаемый произвольным пороговым функциям
Очевидно, что ТТЕ может быть обучен реализации только пороговых логических функций. Согласно теории переключательных функций все пороговые функции являются монотонными. Минимальное представление монотонных функций совпадает с их сокращенной формой. Если сокращенная форма пороговой функции содержит только переменные без инверсий, она называется изотонной функцией (подкласс монотонных функций). ТТЕ с простейшими синапсами, каждый из которых содержит только один конденсатор в качестве элемента памяти, может быть обучен только изотонными пороговыми функциями.
С другой стороны, все представители классов всех пороговых функций некоторого числа переменных могут быть выбраны среди изотонных пороговых функций. (Напомним, что МРМ-класс включает в себя все функции, полученные одна из другой путем инвертирования переменных, их перестановок и инвертирования функций.) Отсюда следует, что с помощью только инвертирования переменных для любой пороговой функции можно найти ее изотонного представителя.
Действительно, пусть ? юухИ — неко-
торая изотонная пороговая функция п переменных. Инвертируем некоторые из этих переменных х1 6 Y, а другие переменные ху 6 Z, I ^ у, Z и Y = X оставим без изменения. Тогда
F = sign
Е
XeZ
WjXj
- Е wixi- t
X: eY
= Sign
Е
WjXj
= sign
Е w
X eZ
= Rt
■ Е Wi (1-X)-T
X: eY
T - Е wi
X; eY
jXj Е W;X;-
X; eY
[Е aiXi- Е
XjeZ X; eY
1- Е ю;
X: eY
где Юу = ю/Т. Из этого выражения видно, что использование отрицательных весов в представлениях пороговых функций в виде (1) и (2) из работы [1] сводится к инвертированию переменных (и наоборот). При этом веса переменных в Д£-формуле должны быть дополнительно нормализованы на величину 1 — х еу *
Отсюда следует, что для обучения ТТЕ произвольной логической функции достаточно инвертировать на входе те переменные, которые имеют отрицательные веса, и обучение вести с помощью проверочной последовательности изотонного представителя этой функции.
При использовании более сложных цепей синапса, например, с двумя элементами памяти для сохранения положительных и отрицательных весов, можно построить ТТЕ, обучаемый произвольным пороговым функциям заданного числа переменных [2], однако возникают сомнения в целесообразности проектирования таких ТТЕ из-за очень высокой сложности схемы синапса и увеличения в значительной степени времени обучения.
Заключение
Рассмотренный в статье ТТЕ имеет много привлекательных свойств.
Его схема очень проста и может быть реализована в КМОП-технологии 0,18 мкм. По-видимому, далее уменьшать длину канала транзисторов нецелесообразно, поскольку это связано с уменьшением напряжения питания, ухудшением характеристик транзисторов и увеличением паразитных токов утечек, что приводит к значительному ухудшению характеристики р-компаратора ТТЕ и его способности к обучению.
Реализуемость ТТЕ определяется только величиной минимального порога обучающей функции и не зависит от суммы весов входов ее переменных и их числа. Как было показано, ТТЕ может быть обучен сложным пороговым функциям (любой пороговой функции до 11 переменных). В действительности он может быть обучен функциям с гораздо большим числом переменных, чем 11, т. е. всем функциям, порог которых не превосходит некоторой величины, на которую рассчитан его р-компаратор. Например, если максимальный порог равен 100, то ТТЕ с таким порогом может быть обучен функциям «И» на 100 входов, при этом гарантированно он может реализовать любую пороговую функцию 10 переменных.
Важным фактором реализуемости ТТЕ является то, что процесс обучения компенсирует разбросы всех технологических параметров элементов, из которых он построен, а процесс обновления зарядов конденсаторов синапсов в значительной степени компенсирует разбросы эксплуатационных параметров (питающего напряжения и температуры).
К недостаткам ТТЕ данного типа можно отнести жесткие требования к стабильности напряжения источника питания, а также необходимость обновления зарядов конденсаторов синапсов в обученном состоянии. Тем не менее хочется верить, что рассмотренный ТТЕ и процедура его обучения могут оказаться полезными во многих применени-
Литература
1. Мараховский В. Б. КМОП-реализация обучаемого порогового логического элемента. Часть 1: Проектирование и схема обучения // Информационно-управляющие системы. 2014. № 3. С. 47-56.
ях, в том числе в области аппаратной реализации искусственных нейронов и нейронных сетей.
На основе ТТЕ может быть построен искусственный нейрон, например, заменой бинарных входов аналоговыми переменными. Однако такой подход ведет к слишком сильным искажениям входных переменных из-за пороговых напряжений на затворах транзисторов и нелинейностей их характеристик.
Другим подходом к построению искусственного нейрона может быть использование АЦП для преобразования непрерывных входных сигналов в двоичные наборы, которые в свою очередь подаются на входы ТТЕ, причем наборы, соответствующие тормозящим входам, подаются на входы ТТЕ через инверторы. Допустимость такого подхода не вызывает сомнений, например, если АЦП преобразует аналоговый сигнал в 8-разрядный двоичный код, то 3 или 4 аналоговых входа потребуют 24 или 32 двоичных входа ТТЕ, что вполне возможно, так как вряд ли потребуется реализация сложных логических функций. Однако при таком подходе возникают проблемы, связанные с обучением нейрона. Абсолютно не понятно, как строить обучающие последовательности, так как покоординатное обучение в этом случае неприемлемо и есть опасность, что ТТЕ обучаться не будет. Вопрос же о реализации нейронных сетей вообще пока что не стоит.
2. Varshavsky V., Marakhovsky V., Saito H. CMOS Implementation of an Artificial Neuron Training on Logical Threshold Functions// WSEAS Transaction on Circuits and Systems. Apr. 2009. Iss. 4. Vol. 8. P. 370-391.
UDC 681.3
CMOS Implementation of a Trained Threshold Logical Element. Part II. Simulation Results and Implementability
Marakhovsky V. B.a, Dr. Sc., Tech., Professor, [email protected]
aSaint-Petersburg State Politechnical University, 29, Polytechnicheskaia St., 195251, Saint-Petersburg, Russian Federation
Purpose: Showing the possibility of modern CMOS implementation of an analog-digital logical threshold element which can be trained to complex logical threshold functions, and finding the limits of its implementability. Methods: SPICE simulation of training the threshold element to complex threshold logical functions and of supporting its analog memory elements in the trained state. Results: It is shown that for threshold element training experiments, the most suitable threshold functions are those which can be represented like Horner scheme, as with their high complexity they have the shortest checking sequences. A threshold element manufactured in CMOS 0.18 micron technology can be trained to an arbitrary threshold function with a threshold not exceeding 144. All threshold logical functions of 11 variables satisfy this restriction, and many functions of a larger number of variables. Practical relevance: The designed trained threshold element has considerably extended functional possibilities. It can be used in logical pattern recognition systems and in new generations of neurochips.
Keywords — Artificial Neuron, Synapse, Trained Threshold Logical Element, Training Algorithm, Step of Trainee, CMOS Technology, Threshold Logical Function.
References
1. Marakhovsky V. B. CMOS Implementation of the Trainee's Threshold Logical Element. Part 1. Design and Training Diagram. Informatsionno-upravliaiuschie sistemy, 2014, no. 3, pp. 47-56 (In Russian).
2. Varshavsky V., Marakhovsky V., Saito H. CMOS Implementation of an Artificial Neuron Training on Logical Threshold Functions. WSEAS Transaction on Circuits and Systems, April 2009, issue 4, vol. 8, pp. 370-391.