Хотя... я тоже люблю анекдот "про цИганку".
Давайте думать над железкой (TRIADOR)
Moderator: haqreu
-
Lavr
- Supreme God
- Posts: 16786
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Давайте думать над железкой (TRIADOR)
Но с шуткой про математика ты так или иначе тут явно перегнул...
Хотя... я тоже люблю анекдот "про цИганку".
Хотя... я тоже люблю анекдот "про цИганку".
iLavr
-
Shaos
- Admin
- Posts: 24397
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
Ну почему перегнул? Тут тоже самое - чтобы получить вычитание предлагается сначала выполнить инструкцию "инверсия", что сведёт изначально поставленную задачу "реализовать вычитание" к уже известной задаче "реализовать сложение"
А на самом деле надо подходить к решению комплексно и делать ОДНУ инструкцию, которая выполняет только одну операцию - вычитание...
А на самом деле надо подходить к решению комплексно и делать ОДНУ инструкцию, которая выполняет только одну операцию - вычитание...
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Ух ты, годами тишина, отвернулся на минуту, а вы уже десяток сообщений накидали
В этой системе сдвиги и умножение/деление - не одно и то же. Пример: 11/3 = 3, а сдвиг PPN вправо даёт PP, что есть 4.Shaos wrote:Умножение на 3, деление на 3, ну и до кучи всякие алгоритмы где надо кольцом крутить тритами...
-
Lavr
- Supreme God
- Posts: 16786
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Давайте думать над железкой (TRIADOR)
Это какое-то "масло маслянное" со словом "комплексное"...
Ну что за комплексный подход? Вот смотри - это сумматор в пределах ОДНОГО трита:

Тут и так всего дофига! А твой "комплексный подход" - подсыпать сюда еще 2 корпуса!
Ну что за комплексный подход? Вот смотри - это сумматор в пределах ОДНОГО трита:

Тут и так всего дофига! А твой "комплексный подход" - подсыпать сюда еще 2 корпуса!
iLavr
-
Lavr
- Supreme God
- Posts: 16786
- Joined: 21 Oct 2009 08:08
- Location: Россия
Re: Давайте думать над железкой (TRIADOR)
А ты чаще форум читай и меньше справляй дни рождения неадекватных дедушек...haqreu wrote:Ух ты, годами тишина, отвернулся на минуту, а вы уже десяток сообщений накидали![]()
iLavr
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Не с точки зрения задержек, но с точки зрения сложности железа соглашусь, я не хочу вычитание делать, если сложения и инверсии хватит. Моя самая длинная программа на сегодня имеет несколько сотен инструкций, и честное пионерское, отсутствие вычитания (а я там вынужден вычитать в том числе) тормозит программу в лучшем случае на один процент.Lavr wrote:Тут и так всего дофига! А твой "комплексный подход" - подсыпать сюда еще 2 корпуса!
Кроме того, использовать одну из 27 всех возможных команд расширения - это ж дорого!
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
кстати, я изменю чуть-чуть порядок команд пропуска, сделаю вот так:
Таким образом, инвертируя аргумент, мы получаем инверсию логической операции. Мне кажется, что это проще запомнить.
Code: Select all
SK -13: skip if R4 <= 0
SK -12: skip if R4 != 0
SK -11: skip if R4 >= 0
SK -10: skip if R3 <= 0
SK -9: skip if R3 != 0
SK -8: skip if R3 >= 0
SK -7: skip if R2 <= 0
SK -6: skip if R2 != 0
SK -5: skip if R2 >= 0
SK -4: skip if R1 <= 0
SK -3: skip if R1 != 0
SK -2: skip if R1 >= 0
SK -1: skip if C == N
SK 0: skip if C == O
SK 1: skip if C == P
SK 2: skip if R1 < 0
SK 3: skip if R1 == 0
SK 4: skip if R1 > 0
SK 5: skip if R2 < 0
SK 6: skip if R2 == 0
SK 7: skip if R2 > 0
SK 8: skip if R3 < 0
SK 9: skip if R3 == 0
SK 10: skip if R3 > 0
SK 11: skip if R4 < 0
SK 12: skip if R4 == 0
SK 13: skip if R4 > 0
-
Shaos
- Admin
- Posts: 24397
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
11/3 = 3.666(6), что округляется до 4haqreu wrote:Ух ты, годами тишина, отвернулся на минуту, а вы уже десяток сообщений накидали
В этой системе сдвиги и умножение/деление - не одно и то же. Пример: 11/3 = 3, а сдвиг PPN вправо даёт PP, что есть 4.Shaos wrote:Умножение на 3, деление на 3, ну и до кучи всякие алгоритмы где надо кольцом крутить тритами...
Я в своё время думал сделать так или эдак - вспомнил, что существующий вариант скипов вроде бы получился проще в железе:haqreu wrote:кстати, я изменю чуть-чуть порядок команд пропуска, сделаю вот так:
...
Таким образом, инвертируя аргумент, мы получаем инверсию логической операции. Мне кажется, что это проще запомнить.
http://www.nedopc.org/forum/viewtopic.php?p=141103#p141103
UPDATE: попробовал большой вариант DDT-задания для skip-блока (старый skip-big.ddt и новый skip-big2.ddt), где отсутствуют только мультиплексоры вычисления знака регистра, с которыми всё понятно (+8 троичных мультиплексоров), а всё остальное включено (как и в реальной схеме полный декод команды отсутствует - приходит только enable-ne и 3 младших трита кода операции):
Расширенные варианты получили похожие результаты - 20 functions (18 x DG403):
Code: Select all
$ diff ddt_skip-big_.c ddt_skip-big2_.c
7c7
< int ddt_skip-big_(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT i5, DDT i6, DDT i7, DDT i8, DDT i9, DDT* o1)
---
> int ddt_skip-big2_(int f, DDT i1, DDT i2, DDT i3, DDT i4, DDT i5, DDT i6, DDT i7, DDT i8, DDT i9, DDT* o1)
13c13
< f2 = ddt_e12(f,i2,O,r1,&r2);
---
> f2 = ddt_e21(f,i2,r1,O,&r2);
17c17
< f4 = ddt_e21(f,i2,r1,O,&r4);
---
> f4 = ddt_e12(f,i2,O,r1,&r4);
P.S. Запомнить на самом деле проще так, как было т.к. там во всех тройках сначала идёт меньше, потом равно, потом больше и в верхней части есть not - вобщем смотри сам, только тебе картинки придётся перерисовывать и описание менять во многих местах интернета
-
Shaos
- Admin
- Posts: 24397
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
Возвращаясь к идеям EX - чего у нас там остаётся в сухом остатке, чтобы осчастливить пользователя?haqreu wrote:Мне сейчас начинает не хватать обычного сложения, так что ADD это пять.Shaos wrote:Два года уж как скоро будет - подходит такое решение то?
применения ADDC не очень вижу, а тем более SUB.
SUB это просто две операции
OP NOP
ADD
Аналогично и ADDC можно в несколько команд всего разбить.
RRC - а какой смысл в потритовых сдвигах вообще?
Какой самый частый сценарий для OPB? Для OPA, наверное, смена знака (OP NOP).
NNNNN - EX -13 -> ADD (hardwired C,R1=R1+R2) <<<<< единственный железобетонный ADD
NNNNO - EX -12 -> ADD-12 (programmable by PEX)
NNNNP - EX -11 -> ADD-11 (programmable by PEX)
NNNON - EX -10 -> ADD-10 (programmable by PEX)
NNNOO - EX -9 -> ADD-9 (programmable by PEX)
NNNOP - EX -8 -> ADD-8 (programmable by PEX)
NNNPN - EX -7 -> ADD-7 (programmable by PEX)
NNNPO - EX -6 -> ADD-6 (programmable by PEX)
NNNPP - EX -5 -> ADD-5 (programmable by PEX)
NNONN - EX -4 -> RMH (read higher triad from memory [27*R4+R3] to R1)
NNONO - EX -3 -> WMM (write R2,R1 to memory [27*R4+R3])
NNONP - EX -2 -> RML (read lower triad from memory [27*R4+R3] to R1)
NNOON - EX -1 -> JPI (store current PC+1 to R4,R3 and jump to R13,R2) <<<<< нужно для реализации CALL и RET
NNOOO - EX 0 -> PEX (program OPB instances below and ADD instances above)
NNOOP - EX +1 -> OPB №1 (R1=R1 o R2) - programmable by PEX or hardwired MSK?
NNOPN - EX +2 -> OPB №2 (R1=R1 o R2) - programmable by PEX or hardwired MAX?
NNOPO - EX +3 -> OPB №3 (R1=R1 o R2) - programmable by PEX or hardwired MIN?
NNOPP - EX +4 -> OPB №4 (R1=R1 o R2) - programmable by PEX or hardwired something?
NNPNN - EX +5 -> OPB №5 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPNO - EX +6 -> OPB №6 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPNP - EX +7 -> OPB №7 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPON - EX +8 -> OPB №8 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPOO - EX +9 -> OPB №9 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPOP - EX +10 -> OPB №10 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPPN - EX +11 -> OPB №11 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPPO - EX +12 -> OPB №12 (R1=R1 o R2 where o is programmable by PEX or manually)
NNPPP - EX +13 -> HLT ( halt and catch fire ; )
Возможно из бинарных операций надо сразу же предоставить пользователю MIN, MAX, а также MSK (ибо маскирование в сбалансированной троичной системе не равна MIN как в двоичной системе):
MAX=NOPOOPPPP
MIN=NNNNOONOP
MSK=PONOOONOP (такое маскирование включает негативное маскирование, когда при N сигнал инвертируется, при O - обнуляется, а при P - повторяется - в таком случае таблица истинности полностью симметрична - на самом деле у людей это называется MUL)
Чего там ещё у нас есть из полезных бинарных операций с симметричной таблицей истинности? Троичный XOR?
Хм, по Дугласу Джонсу (см. http://homepage.divms.uiowa.edu/~jones/ternary/logic.shtml) получается, что троичный XOR это инверсия моего маскирования MSK
XOR=NOPOOOPON
в таком случае оно вряд ли нужно как отдельная инструкция т.к. мы можем просто сделать MSK и затем инвертировать потритно OP PON,
а вот потритовое сложение SUM от Дугласа Джонса может пригодиться (и оно не равно XOR, как в двоичной системе):
SUM=PNONOPOPN
Ещё из интересного у него есть Consensus и Comparison, но это наверное слишком специфично и достаточно будет иметь это в программируемых инструкциях, не железобетонных
В итоге имеем 8 программируемых инструкций в положительной части (с кодами от EX +5 до EX +12 которые реализуют OPB) и 8 программируемых инструкций в отрицательной части (с кодам от EX -5 до EX -12 которые реализуют разнообразные комбинации сложений, вычитаний и сдвигов) - опять же упрощённые реализации триадора могут программируемость и не предоставлять либо предоставлять частично т.к. программируемость требует дополнительного ОЗУ, если программировать программно (с помощью PEX), либо дополнительного ПЗУ, если программировать вручную т.е. переключателями (это кстати вариант для самодельного триадора минимизирующий количества дополнительного железа).
А вот если сделать Comparison как в сях - если трит из первого аргумента равен триту из второго, то результат O, если меньше, то N и если больше, то P:
CMP=OPPNOPNNO (таблица истинности тут НЕ симметричная, т.е. последовательность аргументов имеет значение!)
тогда сравнивая таким образом две триады и они равны, то мы получим на выходе OOO (0), если получилось отрицательное число (самый старший ненулевой трит это N), то первая триада меньше второй, если положительное (самый старший ненулевой трит это P), то больше - выходит мы сравнили две триады БЕЗ вычитания
P.S. Если внешняя память триадная (3 трита на ячейку), а не трайтовая (6 тритов на ячейку, как указано выше), то 3 инструкции обращения к памяти превращаются в 2:
NNONO - EX -3 -> WM (write R1 to memory [27*R4+R3])
NNONP - EX -2 -> RM (read triad from memory [27*R4+R3] to R1)
что есть суть тоже самое - мы просто игнорируем старшую триаду, которой физически может не быть в железе...
P.P.S. А вот интересно насколько оказалась бы полезной в триадоре команада Permutation, которая перемешивала бы триты в R1 любом порядке? Имея три трита в результате нам надо задать источник каждого трита, которые могут быть младшим тритом, средним тритом или старшим тритом регистра R1 - одного трита достаточно, чтобы это указать - получается одной триадой мы можем задать такой Permutation для целевой триады - тогда имеет смысл программировать это на лету допустим содержимым регистра R2 и команду такую назвать PRM, поставив её скажем на место EX -5. Такая команда легко покроет все возможные вращения в кольце, не задевающие флаг C (например записав в R2 триаду OPN мы сообщаем PRM, что хотели бы сдвинуть R1 на 1 трит влево по кольцу).
P.P.P.S. Если добавить источников - в дополнение к 3 тритам R1 добавим один трит флаг C плюс три константы N,O,P, то получаем 7 вариантов, программируемых двумя тритами (и ещё запас на 2 трита-источника остаётся - скажем на будущие теневые флаги?) на каждый трит результата - если выходной флаг C также будет результатом (для реализации вращений через флаг C), то нам надо 4*2=8 тритов, чтобы такую сложную пермутацию запрограммировать. Для круглоты ещё один трит можно задействовать скажем для указания того, что мы используем один из двух теневых флагов вместо основного флага C - вот это ваще будет гибкость неописуемая...
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
По поводу команд расширения - прежде чем их добавлять, я бы хотел понять про каждую, что она даёт. ADD совершенно чётко даёт экономию в один сегмент памяти програм (или даже больше, если им пользоваться часто) + прирост производительности.
Для чего нужны остальные команды? Я даже для OPA пока не вижу других применений, кроме как инверсии числа...
halt and catch fire, конечно же нужна!
Для чего нужны остальные команды? Я даже для OPA пока не вижу других применений, кроме как инверсии числа...
halt and catch fire, конечно же нужна!
-
Shaos
- Admin
- Posts: 24397
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
Для того чтобы превратить триадора в универсальный компьютер нужна память данных - команды RML,RMH и WMM
Чтобы делать полноценные подпрограммы - нужны CALL и RET, которые реализуемы через JPI
Остальное - особенно программируемое - надо смотреть на конкретные алгоритмы
Кстати добавь виртуальный метод в класс Triador, чтобы внешние обработчики EX можно было цеплять - вот и попробуем
Типа
P.S. Я могу сам добавить и тебе заслать пул-реквест 
P.P.S. Да и OP надо бы к общему знаменателю привести viewtopic.php?p=154508#p154508
Чтобы делать полноценные подпрограммы - нужны CALL и RET, которые реализуемы через JPI
Остальное - особенно программируемое - надо смотреть на конкретные алгоритмы
Кстати добавь виртуальный метод в класс Triador, чтобы внешние обработчики EX можно было цеплять - вот и попробуем
Типа
Code: Select all
virtual bool doEX(int arg)
{
return false; // not handled - halt
}
P.P.S. Да и OP надо бы к общему знаменателю привести viewtopic.php?p=154508#p154508
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
А что такое универсальный компьютер? И что делают эти три команды? Sub и ret великолепно эмулируются на базовой системе команд...
Я думаю, что основная проблема триадора - не бедный набор инструкций (даже без add я прекрасно могу жить), а очень маленькая память. Поэтому я бы думал скорее про инструкции, которые бы позволили расширить память.
Я думаю, что основная проблема триадора - не бедный набор инструкций (даже без add я прекрасно могу жить), а очень маленькая память. Поэтому я бы думал скорее про инструкции, которые бы позволили расширить память.
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Кстати, просто шутки ради. Триадор в его базовой версии позволяет запрограммировать pong (нужно пять или шесть сегментов памяти команд), прикладываю результат эмуляции. Нижняя полоска - это очки (трёхтритное число). Не вижу ни одной проблемы воплотить в железе, раз уж в эмуляции работает.
Память использована полностью вся:
r13 - выбранный сегмент
r11,r12 - x и y координаты мячика
r9, r10 - скорость мячика
r7, r8 - положение двух ракеток
r6 - очки
r5 - эмуляция адреса возврата из сабрутины add
r1-r4 необходимы для текущих вычислений, в основном для сложения (но не только).
Память использована полностью вся:
r13 - выбранный сегмент
r11,r12 - x и y координаты мячика
r9, r10 - скорость мячика
r7, r8 - положение двух ракеток
r6 - очки
r5 - эмуляция адреса возврата из сабрутины add
r1-r4 необходимы для текущих вычислений, в основном для сложения (но не только).
You do not have the required permissions to view the files attached to this post.
-
Shaos
- Admin
- Posts: 24397
- Joined: 08 Jan 2003 23:22
- Location: Silicon Valley
Re: Давайте думать над железкой (TRIADOR)
А у тебя подпрограмма может вызывать другую подпрограмму? А самою себя, выполняя рекурсию?haqreu wrote:А что такое универсальный компьютер? И что делают эти три команды? Sub и ret великолепно эмулируются на базовой системе команд...
Так вот это те самые инструкции и естьhaqreu wrote:Я думаю, что основная проблема триадора - не бедный набор инструкций (даже без add я прекрасно могу жить), а очень маленькая память. Поэтому я бы думал скорее про инструкции, которые бы позволили расширить память.
NNONN - EX -4 -> RMH (read higher triad from memory [27*R4+R3] to R1)
NNONO - EX -3 -> WMM (write R2,R1 to memory [27*R4+R3])
NNONP - EX -2 -> RML (read lower triad from memory [27*R4+R3] to R1)
Про то как расширять память я писал ещё в ноябре 2017 года:
т.е. я предполагал, что ПЗУ будет двоичным с тупым отображением троичного адреса в двоичный диапазон адресов 2К, а вот ОЗУ может быть троичным и к нему можно будет получать доступ программно, записывая и читая данные, а также загружая туда подпрограммы извне, а потом можно пойти ещё дальше и сделать банки памяти, листая это самое ОЗУ (да и двоичное ПЗУ тоже можно листать). Вот тогда у нас и будет универсальный компьютер, который будет способен подгружать с внешних носителей и исполнять программы, написанные пользователем на этом же самом компьютере...Shaos wrote:Далее - для калькулятора нужна память для временного хранения чисел (т.к. большинство регистров задействованы под отображение). Идея следующая - наше 2К ПЗУ программ покрывает области Oxxxxx и Pxxxxx, а в область Nxxxxx мы втыкаем статическое ОЗУ! В EX вставляем пару команд - записать в память и прочитать из памяти (адрес будет браться из регистров, скажем из R3 и R4). Можно будет записывать как триады, так и слова - чтобы потом на ОЗУ можно было передать управление и запустить введённую юзером программу!
P.S. По идее доп.память может и не быть связана с памятью программ, которая может оставаться в ПЗУ - например можно добавить несколько ячеек статической памяти на тримуксах "сбоку" и обращаться к ним через 2 из вышеописанных трёх команд, используя только триады:
если ячеек "сбоку" меньше 27, то R4 можно игнорировать, адресуя это доп.память только через R3...Shaos wrote: NNONO - EX -3 -> WM (write R1 to memory [27*R4+R3])
NNONP - EX -2 -> RM (read triad from memory [27*R4+R3] to R1)
-
haqreu
- Maniac
- Posts: 318
- Joined: 10 Mar 2017 05:30
Re: Давайте думать над железкой (TRIADOR)
Ой. у меня нынче голова вообще не варит. Давай вернёмся к вопросу расширения после того, как я закончу базовый вариант. Расширение памяти согласен, нужно. Не очень уверен только в необходимости писать/читать аж целое слово. JPI... оно ж сразу два регистра отжирает, причём важных. Ну да не суть, особенно если будет расширена память, нехай подпрограммы сами себе память расчищают. Хардверное сложение да, обязательно, причём по совершенно тупой причине: софтверное сложение требует большего количества тримуксов, нежели хардверное, а мне лень паять 
Можешь привести сценарий использования OPB?
Итого, пока что я полностью согласен с необходимостью
WM (write R1 to memory [27*R4+R3])
RM (read triad from memory [27*R4+R3] to R1)
ADD (C,R1=R1+R2)
JPI (store current PC+1 to R4,R3 and jump to R13,R2)
HCF
Можешь привести сценарий использования OPB?
Итого, пока что я полностью согласен с необходимостью
WM (write R1 to memory [27*R4+R3])
RM (read triad from memory [27*R4+R3] to R1)
ADD (C,R1=R1+R2)
JPI (store current PC+1 to R4,R3 and jump to R13,R2)
HCF
