diff Examples/multiply/mul_chop @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Examples/multiply/mul_chop	Thu Aug 30 14:57:44 2007 +0900
@@ -0,0 +1,81 @@
+mul2(X1,X0,Y1,Y0,M3,M2,M1,M0) :-
+	cell(0,  0,  X0,Y0,M0,C00),
+	cell(0,  0,  X1,Y0,S10,C10)
+	&&
+	cell(S10,C00,X0,Y1,M1, C01),
+	cell(0  ,C10,X1,Y1,S11,C11)
+	&&
+	cell(S11,C01,0, 0,M2 , M3),
+	cell(0,  C11,0, 0, _, _  ).
+
+
+cell(Sin,Cin,X,Y,Sout,Cout) :-
+	and(X,Y,L1),S1 <- Sin,C1<- Cin
+	&&
+	full_adder(S1,C1,L1,Sout,Cout).
+
+full_adder(S1,C1,L1,Sout,Cout) :-
+	half_adder(S1,C1,S2,C2),L2 <- L1
+	&&
+	half_adder(S2,L2,S3,C3),
+	C4 <- C2
+	&&
+	or(C3,C4,Cout),
+	Sout <- S3.
+
+half_adder(A,B,S,C) :-
+	length(1),
+	A = 0, B = 0,
+	@S = 0, @C = 0.
+half_adder(A,B,S,C) :-
+	length(1),
+	A = 0, B = 1,
+	@S = 1, @C = 0.
+half_adder(A,B,S,C) :-
+	length(1),
+	A = 1, B = 0,
+	@S = 1, @C = 0.
+half_adder(A,B,S,C) :-
+	length(1),
+	A = 1, B = 1,
+	@S = 0, @C = 1.
+
+or(A,B,C) :-
+	length(1),
+	A = 0, B = 0,
+	@C = 0.
+or(A,B,C) :-
+	length(1),
+	A = 0, B = 1,
+	@C = 1.
+or(A,B,C) :-
+	length(1),
+	A = 1, B = 0,
+	@C = 1.
+or(A,B,C) :-
+	length(1),
+	A = 1, B = 1,
+	@C = 1.
+
+and(A,B,C) :-
+	length(1),
+	A = 0, B = 0,
+	@C = 0.
+and(A,B,C) :-
+	length(1),
+	A = 0, B = 1,
+	@C = 0.
+and(A,B,C) :-
+	length(1),
+	A = 1, B = 0,
+	@C = 0.
+and(A,B,C) :-
+	length(1),
+	A = 1, B = 1,
+	@C = 1.
+
+test1 :-
+	mul2(1,1,1,1,M3,M2,M1,M0),
+
+ 	fin(write((M3,M2,M1,M0))),
+ 	keep(write((M3,M2,M1,M0))).