mirror of
				https://github.com/YosysHQ/sby.git
				synced 2025-11-03 22:29:12 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			44 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
			
		
		
	
	
			44 lines
		
	
	
	
		
			1 KiB
		
	
	
	
		
			Systemverilog
		
	
	
	
	
	
// You are given an 8 litre bucket of water, and two empty buckets which can
 | 
						|
// contain 5 and 3 litre respectively. You are required to divide the water into
 | 
						|
// two by pouring water between buckets (that is, to end up with 4 litre in the 8
 | 
						|
// litre bucket, and 4 litre in the 5 litre bucket).
 | 
						|
//
 | 
						|
// Inspired by:
 | 
						|
// https://github.com/DennisYurichev/random_notes/blob/master/Z3/pour.py
 | 
						|
 | 
						|
module pour_853_to_4 (
 | 
						|
	input clk,
 | 
						|
	input [1:0] src, dst
 | 
						|
);
 | 
						|
	reg [3:0] state [0:2];
 | 
						|
	reg [3:0] max_amount [0:2];
 | 
						|
	reg [3:0] xfer_amount;
 | 
						|
 | 
						|
	initial begin
 | 
						|
		state[0] = 8;
 | 
						|
		state[1] = 0;
 | 
						|
		state[2] = 0;
 | 
						|
 | 
						|
		max_amount[0] = 8;
 | 
						|
		max_amount[1] = 5;
 | 
						|
		max_amount[2] = 3;
 | 
						|
	end
 | 
						|
 | 
						|
	always @* begin
 | 
						|
		assume (src < 3);
 | 
						|
		assume (dst < 3);
 | 
						|
		assume (src != dst);
 | 
						|
 | 
						|
		if (state[src] > (max_amount[dst] - state[dst]))
 | 
						|
			xfer_amount = max_amount[dst] - state[dst];
 | 
						|
		else
 | 
						|
			xfer_amount = state[src];
 | 
						|
 | 
						|
		cover (state[0] == 4 && state[1] == 4);
 | 
						|
	end
 | 
						|
 | 
						|
	always @(posedge clk) begin
 | 
						|
		state[src] <= state[src] - xfer_amount;
 | 
						|
		state[dst] <= state[dst] + xfer_amount;
 | 
						|
	end
 | 
						|
endmodule
 |