|
Архитектрура системы команд 8-разрядного МК, Оценка/Анализ/Архитектура 8-32 разрядного МК |
|
|
|
Jan 16 2009, 11:15
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 3-01-09
Пользователь №: 42 896

|
Передо мной поставлена задача (сам напросился) - дать предложения по архитектуре системы команд 8-разрядного процессорного ядра для управления работой аппаратуры SOC, совместимой с ЯВУ, удобной для программирования на ассемблере, простой в реализации и обеспечивающей компактный программный код и малое число тактов на его выполнение. Я, как учили в институте, сперва посмотрел, что делают другие, провел оценку того, что у них получилось по затратам кода и тактов на его выполнение для типовых задач управления. Потом, как учили в аспирантуре, провел анализ влияния особенностей системы команд процессора на его эффективность rating.pdf http://moko.ru/mc/ Затем поступил не так, как учили, и вместо того, чтобы взять за основу архитектуру известного МК, предложил концепт "простого" 8-разрядного процессорного ядра на базе стековой архитектуры, который позволяет обрабатывать данные до 32-разрядов и не только на стеке, но и в памяти, задавать в байтовой команде сколь угодно длинные поля констант и адресов, и еще некоторые рюшечки и фишечки (там же M8.zip) плюс заявка на патент ......2008. Концепт получился приемлемый, если сравнивать с 8051, PIC, AVR и даже ARM Thumb, но не идеальный: 1. Есть сомнения в правильности методики оценки эффективности процессора, и, соответственно, принятых решений. Возможно есть другие, которые приведут к другим решениям. 2. Из него (концепта) торчат уши PICа - страничная организация памяти, что не позволяет обеспечить линейный доступ к данным, AVRровские регистры косвенной адресации, а не механизм адресации данных по ссылкам и пр. Переходить на 32-разрядный формат команды не позволяет постановка задачи, а решить эти проблемы, оставаясь в рамках 8-разрядной системы команд у меня пока не получается. Люди добрые, посмотрите хотя бы по диагонали moko.ru/mc и помогите "бедному" разработчику, кто чем может по делу, без ля-ля-ля, смайликов и спама, - советом, предложением, позитивной критикой и замечаниями. Не дайте загинуть концепту.
Сообщение отредактировал vitja - Jan 16 2009, 12:07
|
|
|
|
|
 |
Ответов
|
Jan 19 2009, 12:07
|
Местный
  
Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240

|
ага, мусье vitja перебрался сюда с хобота, где его "изыскания" также "неоценили"  на зачем тут повторять бред из PC Week предварительно не обдумав цифры? вы там так и не придумали - где оставшиеся 70% рынка? Примеры ? Ваш и мой ?пень? вырос из 8086-го (1980 год), была даже его 8-разрядная версия (это ближе к теме).вы знаете, мне очень хочется узнать, что за такая "8-разрядная версия" была у 8086 ? или это вы в порыве графоманства не закусили? Итого имеем 2.0*0.73*1.0*1.15 = 1.7. Во столько раз с точностью достаточной для практического применения МК430 уступает 8051.ооох! ну и забористая трава! эк вы, Маэстро, быстро и точно оценили MSP430. а ничего, что http://mcu.caxapa.ru/benchmarks/ получается с точностью до наоборот? ну неиначе - во всём виноваты компиляторы!  да, MSP430 иногда выполняет команду длительностью аж (о боже!) целых 6 (шесть) тактов. но вы так и не удосужились понять, что за этим стоит, для какого случая это получается крайне эффективно, и сколько команд 8051 ядра нужно выполнить, чтобы произвести такое же действие. но вы просто решили, что MSP430 - это такое неэффективное ядро. аж в 1.7 раза хуже чем 8051, а мысли о том, что все ваши наукообразные рассуждения и вычисления эффективности с точностью до сотых - бред, не приходило? Насчет одновременной выборки я подумаю/ещё на хоботе я давал и название этой "технологии" и фирму. но почитать вы так и не удосужились. а это, между прочим, описано даже в переводной литературе. ну так что, будем учится, или убежим на следующий форум? где, может быть, "оценят"
|
|
|
|
|
Jan 19 2009, 12:31
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 3-01-09
Пользователь №: 42 896

|
Цитата(Mahagam @ Jan 19 2009, 15:07)  1///ага, мусье vitja
2/// мне очень хочется узнать, что за такая "8-разрядная версия" была у 8086 ? или это вы в порыве графоманства не закусили?
3///да, MSP430 иногда выполняет команду длительностью аж (о боже!) целых 6 (шесть) тактов.
будем учится 1 Здравствуй дорогой/ Рад снова встретится/хоть и с детства не люблю ябед/ однако на iXBT уже все закончилось 2 Intel 8088 3 AVR с ARMом в придачу выполняет команду за один такт/ Счет 6/1 в чью пользу? Просьба сохранять толерантность в общении/ задавать вопросы или ответы на них/ от смайликов Вы уже отучились/ Молодец
|
|
|
|
|
Jan 19 2009, 12:48
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(vitja @ Jan 19 2009, 18:31)  3 AVR с ARMом в придачу выполняет команду за один такт/ Счет 6/1 в чью пользу? Теоретик ARM выполняет команду группового сохранения регистров во внутренней раме за 17 тактов максимум, а ту же команду во внешней раме до 100 тактов (а то и более), в зависимости от настроек внешней шины. 8088 - 16 битный проц с внешней 8р шиной. Система команд и архитектура 16-битные.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 19 2009, 13:12
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 3-01-09
Пользователь №: 42 896

|
Цитата(GetSmart @ Jan 19 2009, 15:48)  Теоретик ARM выполняет команду группового сохранения регистров во внутренней раме за 17 тактов максимум, а ту же команду во внешней раме до 100 тактов (а то и более), в зависимости от настроек внешней шины. 8088 - 16 битный проц с внешней 8р шиной. Система команд и архитектура 16-битные. Кто бы спорил/ Особенно по последнему/ Это приведено как пример того что даже ХХ86 не гнушался 8-разрядности и 8-разрядные МК рановато списывать в утиль А про команду группового сохранения - это верно - сохранить 16 регистров во внутренней памяти быстрее не получается/плюс такт на команду Вопрос вот в чем - а нужна ли эта команда? Для переключения контекста/ Как часто это присутствует в программе простого 8-разрядного МК/ При прерываниях/ Мультизадачность - для МК это экзотика/ Далее задаем долю операций переключения контекста/ 1% мало - берем 2/ В результате мы сэкономили на этой команде в объеме кода 0.32% В тактах не выиграли ничего/ Зато усложнили аппаратуру/ Ради чего Вами поднят гораздо более глубокий вопрос - касающийся состава команд и его влияния на объем программного кода и тактов на его выполнение../Брр Если уж вводить сложные команды, то какие - мне кажется это не команды групповой пересылки регистров. Большую долю операторов ЯВУ составляют условные операторы (16%) и циклы - 18% (более всего счетные). Проценты в разумных пределах можно поправить. Из этого следует, что надо объединить в одной команде операцию тестирования операндов и перехода по условию, надо объединить модификацию счетчика с переходом по условию в начало цикла. Здесь экономия памяти и тактов посущественнее будет. Однако в каком МК вы это видели. Скажите.
Сообщение отредактировал vitja - Jan 19 2009, 13:42
|
|
|
|
|
Jan 19 2009, 13:49
|
Местный
  
Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240

|
Цитата(vitja @ Jan 19 2009, 17:12)  Это приведено как пример того что даже ХХ86 не гнушался 8-разрядности и 8-разрядные МК рановато списывать в утиль ну и бред. 8-разрядная внешняя шина позволяла в те годы зверски уменьшить цену конечного изделия на этом процессоре, оставаясь в рамках 16-ти разрядной вычислительной мощности. откуда взялась связь с МК - неясно. Цитата(vitja @ Jan 19 2009, 17:12)  А про команду группового сохранения - это верно - сохранить 16 регистров во внутренней памяти быстрее не получается/плюс такт на команду Вопрос вот в чем - а нужна ли эта команда? не. разработчики ядра её так просто по приколу вставили. ага.  Цитата(vitja @ Jan 19 2009, 17:12)  Мультизадачность - для МК это экзотика/ да-да! и всякие табуны uCOS, eCOS, FreeFTOS, CTL и прочих многозадачных примочек - это всё из области экзотики и фантазии. конечно, раз этого не было в книжках двадцатилетней давности, то этого просто не может быть сейчас. Цитата(vitja @ Jan 19 2009, 17:12)  Далее задаем долю операций переключения контекста/ 1% мало - берем 2/ В результате мы сэкономили на этой команде в объеме кода 0.32% В тактах не выиграли ничего/ Зато усложнили аппаратуру/ Ради чего ой жжошь! "1% мало - берём 2" а почему не 5 ? почему не 10? а в военное время и до 80 может подскочить! а подумать, в какий процессорах есть команды такого типа, а в каких нет? и что даёт эта команда? а зачем такую команду ввели 80286 проц? а что она давала там?
|
|
|
|
|
Jan 19 2009, 14:38
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 3-01-09
Пользователь №: 42 896

|
Цитата(Mahagam @ Jan 19 2009, 16:49)  ну и бред. откуда взялась связь с МК - неясно.
разработчики AТMEL так просто по приколу вставили команду группового сохранения регистров/
жжошь! а зачем такую команду ввели 80286 проц? а что она давала там? Только как пример того/ что 16-разрядный процессор 8086 работал на 8-разрядной шине как и современные 8-разрядные МК/ Они приколись по полной - ввели команду группового восстановления регистров/ в 80286 эти команды ввели без приколов/ а по причине необходимости поддержки мультизадачности Типовой МК работает с таймером (1 обработчик прерывания) плюс интерфейсы (еще 1 или более обработчиков) В каждом из них сохраняют контекст одной или большим числом команд/ Доля этих команд в общем объеме кода программы минимальна и даже в военное время не превышает 2%/ Как сделать больше я не знаю / Научите
Сообщение отредактировал vitja - Jan 19 2009, 14:46
|
|
|
|
|
Jan 19 2009, 15:00
|
Местный
  
Группа: Свой
Сообщений: 322
Регистрация: 2-07-04
Из: Minsk
Пользователь №: 240

|
Цитата(vitja @ Jan 19 2009, 18:38)  Только как пример того/ что 16-разрядный процессор 8086 работал на 8-разрядной шине как и современные 8-разрядные МК/ да вы просто из страны эльфов! откуда вам знать какой разрядности и сколько шин внутрях у МК? это внешняя шина имеет ограничения по разрядности. что там внутрях - известно только производителям. внутрях кристалла к ядру может подходить а) 8-ти разрядная шина команд б) 8-и разрядная шина данных из памяти в) 8-и разрядная шина данных для записи в память. в итоге за 1 такт мы а) читаем команду б) получаем данные из памяти в) пишем результат предыдущих вычислений в память. МК остаётся 8-и разрядным. но эти его 8 разрядов ничего общего с внешними 8-ю разрядами 8086 не имеют. ибо по внешней шине за 1 такт происходит только одна транзакция. Цитата(vitja @ Jan 19 2009, 18:38)  Они возможно по приколу/ а в 80286 по причине необходимости поддержки мультизадачности это вы высосали из пальца. что бы вы не сосали что-нибудь ещё, приведу пример. пример прост: имеем понятное ограничение - одно обращение к памяти за такт (память - внешняя). имеем задачу - сохранить в стеке 10 регистров вариант а) 10 раз мы читаем команду PUSH, 10 раз пишем в стек. итого 10 байт кода, 20 обращений к памяти вариант б) 1 раз прочитали PUSHALL, 10 раз записали в стек. итого - 1 байт кода, 11 обращений к памяти. эффективно? безусловно. но эта команда становится эффективной по скорости только в случае если данные и команды лежат в одной физической памяти. в случае с МК это уже не так критично. Цитата(vitja @ Jan 19 2009, 18:38)  Типовой МК работает с таймером (1 обработчик прерывания) плюс интерфейсы (еще 1 или более обработчиков) В каждом из них сохраняют контекст одной или большим числом команд/ Доля этих команд в общем объеме кода программы минимальна и даже в военное время не превышает 2%/ Как сделать больше я не знаю / Научите а если на процессор валятся 20000 прерываний в секунду? если он из одного прерывания еле успевает переползать в обработчик следущего? есть ли смысл оптимизировать ядро для быстрого сохранения/восстановления контекста? ARM7 умеет сохранять в стек одной командой произвольные регистры, что не только полезно в обработчике прерываний, но и просто при вызове функций.
|
|
|
|
|
Jan 19 2009, 18:02
|
Участник

Группа: Новичок
Сообщений: 61
Регистрация: 3-01-09
Пользователь №: 42 896

|
Цитата(Mahagam @ Jan 19 2009, 18:00)  1 пример прост: а) 10 раз мы читаем команду PUSH, 10 раз пишем в стек. итого 10 байт кода, 20 обращений к памяти вариант б) 1 раз прочитали PUSHALL, 10 раз записали в стек. итого - 1 байт кода, 11 обращений к памяти.
2 ARM7 умеет сохранять в стек одной командой произвольные регистры, что полезно ... при вызове функций. 1. Я тоже иногда ошибаюсь и передергиваю понятия. Однако при разделенных шинах команд и данных (в МК, как правило, это так) Мы будем иметь 10 команд PUSH и только 10 тактов на их выполнение, а Вас почему то 11. Неувязочка получилась. Опа!!! 2. Я так ждал, что кто нибудь это скажет. Вы первый. Поздравляю. Именно. Я всегда считал, что одной из проблем регистровой архитектуры, несмотря на их шустрость (обработка 2 операндов за такт), являются накладные расходы на загрузку и выгрузку регистров при вызове процедуры. Я для расчетов брал цифру 2 (1 - входной операнд и 1 - результат). По Вашему мнению какая цифра этих затрат будет ближе к действительности. Однако на этот вопрос ответил заранее GetSmart - поэтому не напрягайтесь, от 3 до 10, ++++ (в среднем можно принять 5 туда и 5 обратно при каждом вызове процедуры доля которых в среднем составляет 18%) Срочно делаю перерасчет числа тактов для AVR.
Сообщение отредактировал vitja - Jan 19 2009, 18:03
|
|
|
|
Сообщений в этой теме
vitja Архитектрура системы команд 8-разрядного МК Jan 16 2009, 11:15 mikesm Позитивная критика. Во первых верный адрес файла h... Jan 16 2009, 12:00 vitja Цитата(mikesm @ Jan 16 2009, 15:00) Ссылк... Jan 16 2009, 12:54 vitja Цитата(mikesm @ Jan 16 2009, 15:00) ...не... Jan 16 2009, 22:49 vetal ЦитатаМое мнение, что во все этом большую роль игр... Jan 17 2009, 00:27 vitja Цитата(vetal @ Jan 17 2009, 03:27) 1 Сист... Jan 17 2009, 05:16 @Ark Цитата(vitja @ Jan 17 2009, 01:49) Что сч... Jan 17 2009, 01:58 vitja Цитата(@Ark @ Jan 17 2009, 04:58) Наверно... Jan 17 2009, 06:26 @Ark Цитата(vitja @ Jan 17 2009, 09:26) ... Jan 17 2009, 11:39 vitja Цитата(@Ark @ Jan 17 2009, 14:39) " ... Jan 17 2009, 12:09  mikesm Цитата(vitja @ Jan 17 2009, 15:09) 1. Не ... Jan 17 2009, 13:31   vitja Цитата(mikesm @ Jan 17 2009, 16:31) Профе... Jan 17 2009, 14:30    mikesm Цитата(vitja @ Jan 17 2009, 17:30) По п.А... Jan 17 2009, 15:06 @Ark Цитата(vitja @ Jan 17 2009, 17:30) Робята... Jan 17 2009, 16:16 vitja Цитата(@Ark @ Jan 17 2009, 19:16) 1. по м... Jan 17 2009, 22:09 vitja Цитата(vitja @ Jan 16 2009, 14:15) Передо... Jan 18 2009, 06:06 vvvv Второй день, тем более выходной это не так много. ... Jan 18 2009, 08:16 zltigo Цитата(vvvv @ Jan 18 2009, 10:16) а у Вас... Jan 18 2009, 09:20  vitja Цитата(zltigo @ Jan 18 2009, 12:20) Как с... Jan 18 2009, 11:35   zltigo Цитата(vitja @ Jan 18 2009, 12:59) Мне хо... Jan 18 2009, 11:41    vitja Цитата(zltigo @ Jan 18 2009, 14:41) Ведет... Jan 18 2009, 13:40     zltigo Цитата(vitja @ Jan 18 2009, 15:40) Посмот... Jan 18 2009, 18:02      vitja Цитата(zltigo @ Jan 18 2009, 21:02) ........ Jan 18 2009, 18:54       zltigo Цитата(vitja @ Jan 18 2009, 20:54) Про So... Jan 18 2009, 19:34        vitja Цитата(zltigo @ Jan 18 2009, 22:34) ...Ва... Jan 19 2009, 07:41         zltigo Цитата(vitja @ Jan 19 2009, 09:41) 1. Все... Jan 19 2009, 08:05         MrYuran Цитата(vitja @ Jan 19 2009, 10:41) - Крут... Jan 19 2009, 08:34          zltigo Цитата(MrYuran @ Jan 19 2009, 10:34) Вот ... Jan 19 2009, 09:01          vitja Цитата(MrYuran @ Jan 19 2009, 11:34) MSP4... Jan 19 2009, 09:53           MrYuran Цитата(vitja @ Jan 19 2009, 12:53) - орга... Jan 19 2009, 10:09            vitja Цитата(MrYuran @ Jan 19 2009, 13:09) Межд... Jan 19 2009, 10:41            vitja Цитата(MrYuran @ Jan 19 2009, 13:09) о ве... Jan 20 2009, 02:37             Mahagam Цитата(vitja @ Jan 20 2009, 06:37) В оцен... Jan 20 2009, 09:57              vitja Цитата(Mahagam @ Jan 20 2009, 12:57) 1///... Jan 20 2009, 16:43               GetSmart Цитата(vitja @ Jan 20 2009, 22:43) Обеспе... Jan 20 2009, 17:05                vitja Цитата(GetSmart @ Jan 20 2009, 20:05) рос... Jan 21 2009, 13:14                 Mahagam Цитата(vitja @ Jan 21 2009, 16:14) Ваши у... Jan 21 2009, 14:04                  zltigo Цитата(Mahagam @ Jan 21 2009, 16:04) осно... Jan 21 2009, 14:36                 GetSmart Цитата(vitja @ Jan 21 2009, 19:14) Продол... Jan 21 2009, 14:28               Mahagam Цитата(vitja @ Jan 20 2009, 20:43) Как чи... Jan 20 2009, 17:25           GetSmart Цитата(vitja @ Jan 19 2009, 15:53) 5/ В о... Jan 19 2009, 10:43            vitja Цитата(GetSmart @ Jan 19 2009, 13:43) 430... Jan 19 2009, 11:13             GetSmart Цитата(vitja @ Jan 19 2009, 17:13) Мне ка... Jan 19 2009, 11:21          vitja Цитата(MrYuran @ Jan 19 2009, 11:34) M430... Jan 19 2009, 11:33         _3m Цитата(vitja @ Jan 19 2009, 10:41) Просил... Jan 19 2009, 11:36          vitja Цитата(_3m @ Jan 19 2009, 14:36) ////Ниче... Jan 19 2009, 12:11          Mahagam Цитата(_3m @ Jan 19 2009, 15:36) Ваши утв... Jan 19 2009, 12:47 GetSmart RISC - отстой Грядёт эпоха сверхдлинных CISC по п... Jan 18 2009, 09:35 MrYuran Цитата(GetSmart @ Jan 18 2009, 12:35) RIS... Jan 18 2009, 10:30 vvvv Ну все верно, Вы говорите, что рынок занимают, что... Jan 18 2009, 14:25 vitja Цитата(vvvv @ Jan 18 2009, 17:25) ... Ну ... Jan 18 2009, 17:39  GetSmart Цитата(vitja @ Jan 18 2009, 23:39) Из PC ... Jan 18 2009, 18:22   vitja Цитата(GetSmart @ Jan 18 2009, 21:22) 1) ... Jan 18 2009, 19:42 vetal ЦитатаЕсли Вам не нравятся 8-разрядные МК, то ....... Jan 18 2009, 14:36 vetal Цитатасовершенно непонятные (неадекватные) цифры в... Jan 18 2009, 19:01 vitja Цитата(vetal @ Jan 18 2009, 22:01) Создай... Jan 19 2009, 08:12 lepert По поводу симулятора, этим уже занимался Кнут, все... Jan 18 2009, 19:39 vitja Цитата(lepert @ Jan 18 2009, 22:39) По по... Jan 20 2009, 13:44 vetal Цитата... выбору способа обработки – регистры, пам... Jan 19 2009, 08:30 vitja Цитата(vetal @ Jan 19 2009, 11:30) ////си... Jan 19 2009, 10:55 vetal Цитатакак не система команд
В первую очередь систе... Jan 19 2009, 11:06 _Pasha Цитата(vetal @ Jan 19 2009, 15:06) регист... Jan 19 2009, 11:23 vitja Цитата(vetal @ Jan 19 2009, 14:06) 1 В пе... Jan 19 2009, 11:43  _Pasha Цитата(vitja @ Jan 19 2009, 15:43) 2 см M... Jan 19 2009, 12:11   vitja Цитата(_Pasha @ Jan 19 2009, 15:11) Лично... Jan 20 2009, 08:29    _Pasha Цитата(vitja @ Jan 20 2009, 11:29) Выбор ... Jan 20 2009, 09:50     vitja Цитата(_Pasha @ Jan 20 2009, 12:50) можно... Jan 21 2009, 17:43 Rst7 ЦитатаТолько дополнение по поводу клонирования
...... Jan 19 2009, 11:45    _Pasha Цитата(vitja @ Jan 19 2009, 17:12) Мульти... Jan 19 2009, 13:16      GetSmart Цитата(vitja @ Jan 19 2009, 20:38) В кажд... Jan 19 2009, 14:54        Mahagam Цитата(vitja @ Jan 19 2009, 22:02) 1. Я т... Jan 19 2009, 18:30         GetSmart Цитата(Mahagam @ Jan 20 2009, 00:30) ника... Jan 19 2009, 18:56         vitja Цитата(Mahagam @ Jan 19 2009, 21:30) в МК... Jan 19 2009, 19:22         vitja Цитата(Mahagam @ Jan 19 2009, 21:30) нужн... Jan 20 2009, 06:27  Mahagam Цитата(vitja @ Jan 19 2009, 16:31) 2 Inte... Jan 19 2009, 12:57  MrYuran Цитата(vitja @ Jan 19 2009, 15:31) AVR с ... Jan 19 2009, 13:14   vitja Цитата(MrYuran @ Jan 19 2009, 16:14) Шуле... Jan 19 2009, 13:54    Mahagam Цитата(vitja @ Jan 19 2009, 17:54) Не AVR... Jan 19 2009, 14:25     vitja Цитата(Mahagam @ Jan 19 2009, 17:25) 1 //... Jan 19 2009, 15:15 Mahagam vitja
давайте вы не будете словоблудить когда по с... Jan 19 2009, 15:58 vitja Цитата(Mahagam @ Jan 19 2009, 18:58) vitj... Jan 19 2009, 18:54  Mahagam Цитата(vitja @ Jan 19 2009, 22:54) 1. Как... Jan 19 2009, 22:34 Leka Это смотрели? http://www.ultratechnology.com/chips... Jan 20 2009, 09:39 vitja Цитата(Leka @ Jan 20 2009, 12:39) Это смо... Jan 20 2009, 11:19 Leka Зачем ходить по чужим граблям? Пример(Кнут): MIX -... Jan 20 2009, 17:31 en1gma не уж то тоже присоединиться
на хоботе не вышло, т... Jan 20 2009, 18:22 Leka Кнут: "Тем не менее, нужно признать, что в на... Jan 20 2009, 18:29 vitja Цитата(Leka @ Jan 20 2009, 21:29) Эльбрус... Jan 21 2009, 07:58
2 страниц
1 2 >
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|