view Examples/multiply/multi @ 0:cfb7c6b24319

Initial revision
author kono
date Thu, 30 Aug 2007 14:57:44 +0900
parents
children
line wrap: on
line source


/* multipiler by Ben Moszkowski */

mux(Switch,In1,In2,Out) :- 
	if Switch = 0
		then Out = In2
		else Out = In1.

reg(In,Out) :- @Out = In.
flipflop(In,Out) :- @Out = In.

dec(In,Out) :- 
	if In = 0 
		then Out = 0
		else Out = In-1.

adder(In1,In2,Out) :- Out = In1+In2.

zero_test(In,Out) :- 
	if In = 0 
		then Out = 1
		else Out = 0.

or_gate(In1,In2,Out) :- 
	Out1 is In1 \/ In2,
	Out = Out1.

mult_imp(In1,In2,M,N,Done) :- 
% exists,(B1,B2,B3,B4,L1,L2,L3,L4,L5,L6,L7,L8,L9,L10)
	#zero_test(In1,B4),
	#(L10 = 0),
	#mux(B4,L10,In2,L9),
	#zero_test(In2,B2),
	#dec(In1,L6),
	#adder(L9,M,L8),
	#dec(N,L3),
	#mux(Done,L9,L8,L7),
	#reg(L7,M),
	#mux(Done,In1,L3,L1),
	#reg(L1,N),
	#dec(L3,L4),
	#mux(Done,L6,L4,L5),
	#zero_test(L5,B1),
	#or_gate(B1,B2,B3),
	#flipflop(B3,Done).

main :- 
	read((In1,In2)),
	Done = 1,
	M = 39,
	N = 83,
	In1 <-- In1,In2 <-- In2,
	mult_imp(In1,In2,M,N,Done),
	@(halt(Done=1)),
	#write((Done,M,N)).