z[i]=xor(or(g,and(p,c)),xor(x[i],y[i]))
ist, wobei
g,p
die Generate- und Propagate-Bits des Blocks
x[0,i-1]
+y[0,i-1]
sind. Letztere sollen
aber nach wie vor in logarithmischer Komplexität berechnet
werden. CondSum_Add
, die kein incoming carry annimmt
(d.h. einfach Addition zweier Zahlen x+y). Da in
CondSum_AddMux
jedoch ein Aufruf von
CondSum_Add
mit carry=1 stattfindet, muss man auch eine
Variante programmieren, die x+y+1 berechnet. (p,z[0,n]) =
RCS_Add<n> (x[0,n-1], y[0,n-1], c)
,
die die CarrySkip-Addition rekursiv durchführt. Wenn
n>1
, dann müssen folgende Schritte durchgeführt
werden: (1) Rekursiver Aufruf für untere Hälfte [0,m-1] (liefert
p0
). (2) Berechnung von cout nach der
CarrySkip-Formel aus cin, z[m] und p0. (3) Rekursiver
Aufruf für obere Hälfte [m,n-1]. (4) p
aus
p0
und p1
. Wenn n=1
,
p
und z[0,1]
berechnen wie üblich. z[0,2]=Count7(x[0,6])
) allein mit
Hilfe von (3,2)-Zählern (also Aufrufen von FullAdd
).
z[0,n]=TriAdd<n>(x[0,n*(n+1)/2-1])
, die mit Hilfe von
CS_Add_Gen
n Wörter der Länge 1, 2, 3, ...,
n zusammenzählt. Also zB
TriAdd<3>('1','01','101')
sollte 0111 ergeben. z[0,n+m-1]=RMul<n,m>(x[0,n-1],y[0,m-1])
, die
z=x*y berechnet, indem sie rekursiv für k=m/2
zuerst RMul<n,k>(x[0,n-1],y[0,k-1])
und dann
RMul<n,m-k>(x[0,n-1],y[k,m-1])
aufruft und dann
die Ergebnisse richtig zusammenzählt (d.h. das zweite Ergebnis um
k
Stellen nach links verschoben). Falls
m=1
ist (Rekursionsabbruch), soll das Ergebnis
natürlich z[0,n-1]=And<n>(x[0,n-1],y[0])
sein. MulSigned
so, dass
nur das Argument x[0,n-1]
vorzeichenbehaftet (2-er
Komplement) ist, nicht aber y[0,n-1]
. MulRadix8
, die eine Multiplikation zur Basis 8
realisiert. (q[0,n-1], r[0,2]) = NR_Div3<n>
(x[0,n+1])
. Hinweis: Am Anfang muss r[0,n+1] =
x[0,n+1]; r[n+2] = r[n+1];
gesetzt werden. xd
ist dann '011'
, wenn q[i]=0
, und
'100'
, wenn q[i]=1
. s[0,3] =
r[i+n-2,i+n+1] + rc[i+n-2,i+n+1]
unter Verwendung von
(g1,p1)=GP(r[i+n-1],rc[i+n-1])
,
(g2,p2)=GP(r[i+n],rc[i+n])
, und
(g,p)=GP_Op(g1,p1,g2,p2)
durch. Add
durch
RCLA_Add
. Führe die Umwandlung von q1
und q0
in q
mittels einer (rekursiven)
Funktion
(g,p,q[0,n-1])=S2U<n>(q1[0,n-1],q0[0,n-1],c)
durch. Diese Funktion ist analog zu RCLA_Add
zu
implementieren. Unterschied: im Fall n=1
ist
q[0]=xor(q0[0],c)
, g=and(q0[0],q1[0])
und p=and(not(q0[0]),not(q1[0]))
. Warum? M_Div
durch die
Beschränkung des Zählers auf n+2 Bit entsteht, zu maximieren.
Variiere auch die Präzision des Zählers. Notiere ausgewählte
Beispiele. Erkläre den Grund für den Fehler. Sqrt<n>
so, dass sie auch für ungerade
n
funktioniert. Expsf
in
eine Funktion Pow2
um, die statt e-hoch-x 2-hoch-x
berechnet. Dazu sind die Werte der Tabelle lntab
durch 2-er-Logarithmen zu ersetzen.