Code: Select all
NNN=NO
NNO=NP
NNP=ON
NON=NP
NOO=ON
NOP=OO
NPN=ON
NPO=OO
NPP=OP
ONN=NP
ONO=ON
ONP=OO
OON=ON
OOO=OO
OOP=OP
OPN=OO
OPO=OP
OPP=PN
PNN=ON
PNO=OO
PNP=OP
PON=OO
POO=OP
POP=PN
PPN=OP
PPO=PN
PPP=PO
Code: Select all
/* Generated by DDTc v0.4
See www.ternary.info */
#include "ddt.h"
int ddt_sum(int f, DDT i1, DDT i2, DDT i3, DDT* o1, DDT* o2)
{
DDT r1,r2,r3,r4,r5,r6,r7,r8,r9,r10,r11,r12,r13,r14;
int f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14;
f1 = ddt_rou(f,i1,&r1);
if(f1 < 0) return f1;
f2 = ddt_rod(f,i1,&r2);
if(f2 < 0) return f2;
f3 = ddt_mux(f,i2,r1,r2,i1,&r3);
if(f3 < 0) return f3;
f4 = ddt_mux(f,i2,r2,i1,r1,&r4);
if(f4 < 0) return f4;
f5 = ddt_mux(f,i2,i1,r1,r2,&r5);
if(f5 < 0) return f5;
f6 = ddt_mux(f,i3,r3,r4,r5,&r6);
if(f6 < 0) return f6;
f7 = ddt_shd(f,i1,&r7);
if(f7 < 0) return f7;
f8 = ddt_blp(f,i1,&r8);
if(f8 < 0) return f8;
f9 = ddt_bln(f,i1,&r9);
if(f9 < 0) return f9;
f10 = ddt_shu(f,i1,&r10);
if(f10 < 0) return f10;
f11 = ddt_mux(f,i2,r7,r8,O,&r11);
if(f11 < 0) return f11;
f12 = ddt_mux(f,i2,r8,O,r9,&r12);
if(f12 < 0) return f12;
f13 = ddt_mux(f,i2,O,r9,r10,&r13);
if(f13 < 0) return f13;
f14 = ddt_mux(f,i3,r11,r12,r13,&r14);
if(f14 < 0) return f14;
if(o1) *o1 = r6;
if(o2) *o2 = r14;
return f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13+f14;
}
Code: Select all
Number of MUX in FUN is 10
Number of E12 in FUN is 12
Number of E21 in FUN is 12
NNN|NO
NNO|NP
NNP|ON
NON|NP
NOO|ON
NOP|OO
NPN|ON
NPO|OO
NPP|OP
ONN|NP
ONO|ON
ONP|OO
OON|ON
OOO|OO
OOP|OP
OPN|OO
OPO|OP
OPP|PN
PNN|ON
PNO|OO
PNP|OP
PON|OO
POO|OP
POP|PN
PPN|OP
PPO|PN
PPP|PO
dt=24
P.S. Интересно, что моя автоматическая реализация троичного сумматора получилась один в один как вот в этой статье 1996 года:
http://www.hindawi.com/journals/vlsi/1996/094696.abs.html
Разве что я получил небольшую оптимизацию путём замены некоторых полных троичных мультиплексоров на упрощённые - E21 и E12 (странно что индийские авторы сами до этого не додумались - у них для этого уже всё было - а именно сигналы PTI и NTI)